【干货】区块链技术生态的设计|《白话区块链》作者蒋勇分享实录
1
区块链技术栈
本节内容主要是关于区块链本身的一个技术栈的介绍。现在关于区块链的文章话题、应用场景有很多,今天我想站在一个比较基础的、相对技术的角度,来介绍区块链的组成原理。
区块链系统
上图中列了一些区块链系统,可以看到在所有的系统里分成两种主要的类型:
第一类叫基础服务链,比特币也属于一种基础服务链,虽然它的功能是以币这么一个形态体现。以太坊是能提供自定义脚本合约的基础服务链,而侧链以及中继链是属于多链连接的基础服务。基础服务链本身不带有任何的应用方面的定制功能,它主要是像操作系统一样提供一个基础设施,拥有完整的区块链技术栈。
第二类是链上应用。包括基于以太坊的预测服务;基于以太坊的通信系统,类似微信;以及其他各种分布式应用。
今天重点分享的是基础服务链包括哪些组成部分。
基础链技术栈
就这一套基础的区块链系统来讲,它无论是哪些类型,比如比特币、莱特币、以太坊、或是其他的比特股等等,核心技术都主要由这六大模块组成:共识算法、密码算法、脚本系统、账户模型、区块链账本、网络服务。下文会分别介绍每个模块的工作原理。
区块链账本
从这六个模块,我们也可以发现,其实拆分成技术底层来看,它跟我们传统的技术开发也没什么两样,仍然是由这些最基础的技术来组成的。就拿区块链账本来说,如果去掉各种区块链的术语和一些带有神秘性的描述,它其实就是一种数据库系统,核心就是账本数据库。那么这个账本数据库里的账户怎么体现呢?是通过密码算法里的公开**算法来体现的。
举一些比特币或以太坊的例子,比如我们知道在比特币里有一个公钥和私钥的概念,地址就是通过公钥转化而来的,所以在这种账本数据库里,它的账户主要是通过这种公开**算法的形式来提供,跟我们通常的系统通过注册的方式来直接产生,存储在一个用户表中的方式是很不相同的。
密码算法在一个区块链系统里的应用是非常多的,除了账户地址以外,还有哈希。所谓的区块链是一个一个的区块链接,这些区块通过什么来链接呢?哈希,每一个区块的哈希。一个区块里还包括很多交易事务,比如比特币一个区块里包含了众多的一条一条的交易事务,每一个交易事务会被计算为一个哈希值,所有的哈希值会计算成一棵梅克尔树(梅克尔树是一个树状结构的哈希值聚集而成的哈希树),并且通过密码算法运行在脚本系统里。
什么叫脚本系统?这里简单阐述一下比特币的转账机制。
首先以银行为例,在银行里,如果我的账户要向另一个账户转账100元,通常是先从我的账户扣掉100元,然后在目标账户增加100元。但几乎所有的区块链系统都不是这么做的(当然并不完全绝对,某些系统会同时支持这种直接扣除和增加的转账数据操作),以比特币为例,所谓的我转100块钱,不是扣掉我100,而是寻找之前别人给我的转账,满足100这个金额,然后创建新的发出的事务。也就是说它不是扣除跟增加这么一个通常的动作,而是一个发出的动作程序,指定到目标地址。
什么叫目标地址呢?就是我指向的另外一个目标的比特币地址。因为这个数据会在全网广播所有的比特币节点都可以接收到。那如何保证目标地址的所有者能收到这笔金额呢?前面有说到,地址是由公钥转化而来的,要使用我转发的这一笔交易事务的话,对方只有通过自己的私钥才能跟他的公钥来进行匹配,匹配成功以后就意味着他能够花这笔金额。也就是说这个转账的过程在比特币内部其实是通过一个程序的方式来匹配的,这也是脚本系统的一个作用,类似于虎符的匹配。
共识算法对于一个分布式系统来讲,是指运行在互联网异步网络的环境之下,如何保证每个节点的数据一致的机制,是整个区块链系统的核心,没有一个有效的共识机制,区块链作为一个分布式的系统将不能成为一个统一的网络存在。
我们知道如果一套系统是运行在一个公司的内部机房里,或者是在一个联盟里,比如银行之间,要保持数据的一致性并不是很困难,因为网络环境是良好的,而且节点数和节点状态,包括各种许可等都是鉴权的。但在一个公开的互联网上这一切都是未知的。所以无论是以太坊还是比特币这种公链系统,它所能实现的节点一致性都叫最终一致性,也就是说它不存在一个数学上的证明是确定一致的。如果有人做过一些日常的转账操作体验的话,通常会看到要求确认多个区块,比如比特币会建议等待六个区块的确认,才能够确保转账是没有问题的。以太坊会建议等待至少15个区块的确认等。就是说它无法保证一个最终的完全一致性,只能从概率上来解决这个问题。
如果我转账的这一笔事务已经经过了很多个区块的确认,那就表示它被弃用的概率很低。这是公链区块链技术的一些特点。
账户模型
我们可以简单地把区块链系统里的账户看成是一个状态机。不同的区块链系统对于账户对象的实现方式是不一样的,比如比特币,它是一个纯粹的地址,私钥和公钥;而以太坊,它不但是具备这种私钥和公钥的地址的形式,也包含类似银行的账户对象。每一个区块链系统都有自己的一些特点,但无论是怎样的系统,我们都可以统一将账户对象看成是一个状态机。
如图所示,这个账户对象会经过一个初始状态,然后经过各种转账(当然也不一定是转账,区块链系统并不是只能用来转账,只是以此为例),总之就是经过一些操作,状态发生了各种变化,每一个状态发生变化之后再写入状态回执,回写一个状态的回执,形成一个闭环的验证过程。这就是区块链系统里的账户模型。
账户模型的本质
我这里举的是比特币的例子,在比特币里我们可以看到它就是不断地输入输出输入输出。也可以说就像库存一样,有入库的有出库的,每一个出库都要对应之前的入库,它是这么一个衔接关系。
密码算法
密码算法的应用,到目前为止所出现的区块链系统中,整个密码算法的应用都包含在如图所示的范围里。
1)区块哈希、交易哈希。哈希值的计算就不多赘述。
2)账户地址、交易签名。
3)脚本匹配。就是前文提到的公私钥的匹配。
4)隐私通道。一般是在联盟链里,所谓的联盟链就是它不是运行在一个公链系统的,比如我们想开发一个公司与公司之间的供应链系统,或者银行与银行之间的结算支付,它是在机构之间运行的系统,往往具有安全性的要求,比如希望数据是加密的,不能像公链系统那样将数据向全网广播,而是定向地向某些节点广播,这时需要通过一个通道的形式来进行管理,这个通道就是隐私通道。
5)身份鉴权、许可登记。
6)零知识证明。先简单介绍一下公链和联盟链的差别,通常我们将完全没有限制的、完全运行在互联网系统之上的,称之为公链;运行在机构之间,甚至公司内部的,称之为联盟链或私链。只有在联盟链或私链的场景下,身份鉴权等才会有意义,在公链上做身份鉴权是没什么意义的(当然,类似以太坊这种支持合约编程的公链,您也是可以部署一个支持身份鉴权的合约的,只是以太坊本身并不需要通过身份鉴权来使用)。
7)零知识证明主要用在公链上。零知识证明的一个主要作用是:在我的数据处于加密的状态之下,如何让其它节点依然能够验证我的数据是合法的。它所采用的仍然是属于密码学里的应用,比如同态加密、公私钥加解密技术的应用。
共识算法
共识的本质在于对并发差异执行串行。因为它没有一个中心服务器,所以没有一个实际的参照,以哪个数据为主,而且在互联网的公链这么一种异步网络模型之下,根据FLP理论,在异步网络中不存在一种能够完全确定的保持一致的算法。共识算法的目的就是在这样一个场景之下,来对每一个节点之间数据的并发差异进行串行。
在确定型网络中,比如我们在公司内部搞一个溯源系统,由于这时的网络是确定型的,所以通常使用的是基于投票的机制。
在异步网络中,比如比特币、以太坊,到目前为止最实用的做法就是基于某种难度的竞争机制,像比特币的挖矿。因为在异步网络中如果通过投票来实现一致性的话,效率太低,而且不太现实,当然这也不是绝对的,某些公链的共识算法会综合设计不同的算法思想。
如图,我大概列了一些目前主流的共识算法的种类。
1)工作量证明。比特币、以太坊都是用的这种。
2)权益证明。类似于公司的股票,谁拥有更多的币,一直没有发出去,等等这些参数使他拥有更多的股权,那么他就拥有打包权。
3)授权权益证明。这个方式认为如果大家都来证明的话效率太低,所以通过选择代表的形式。
4)Raft和PBFT,主要用于内部的区块链系统,一般不适用于公链系统,它们都是类似于投票的机制。
5)权威证明主要用在测试链,比如我们需要测试一些系统,那在测试的过程中,我们不希望每一次都打包区块去进行一次挖矿,而是希望确定某些节点,让他拥有打包权,这时这些节点我们认为是权威的,当然一开始也可以通过某种投票的机制来设定。
6)时间消逝证明。这是英特尔在超级账本项目之下所贡献出来的一种做法。这种思路比较局限,目前并没有广泛的使用。
总之,共识算法就是通过某种做法,选出一个有代表和权力打包的这么一个节点。
脚本系统
脚本系统首先是进行数据资产所有权的匹配执行。整个脚本系统做得比较完善的代表是以太坊,它能够做合约的开发。所谓的智能合约,其实就是脚本系统。比特币里的脚本系统功能相对比较弱,因为它的设计只是为了实现币这么一个东西,而以太坊扩展了脚本系统,它使得我们可以用图灵完备的语言来开发自己的一些业务逻辑,在这上面我们可以开发一个游戏,像之前流行的那个加密数字猫,也可以开发一个众筹合约,还可以开发自己的合约代币,或者放某一个商业应用,比如融资租赁或某个溯源管理等。
以太坊整个脚本系统其实就包含了数据跟业务逻辑,可以在被验证以后执行。注意这个执行是在所有的节点上都可以执行,而不是某个指定的或者特殊的节点。
网络服务
网络服务这一块也是非常核心的,如图列出了几个比较重要的点:
1)节点的发现。因为是分布式的系统,所以没有一个特有的服务器,一般对于公链来说,会设置一些种子节点,即部署在公开地址的初始节点,一般是由官方或一些志愿者社区来设定。如果是内部的链,这个一般就不太需要,因为内部的节点是明确的,是许可登记的。
2)节点同步。就是节点之间的一个数据账本的同步,只有通过所有同步之后的数据形成的网络,就叫主链网络。
3)远程功能服务。就是对节点的数据访问,比如我通过rpc的一个命令调用获得当前区块的信息,或某个交易事务的信息等。
2
区块链的应用价值
前面是从技术的范围对区块链技术栈进行简单介绍,那么区块链技术到底有什么特点,能解决什么实际问题呢?它的价值在哪里呢?本节将重点探讨区块链技术的价值。
通证设计
其价值主要在通证这一方面。通常我们在设计一个区块链系统的时候,我个人建议不能避免对经济模型的设计。如果把它纯粹看成一个数据库系统,我们是有更好的替代方案的,传统的集群设计数据库系统完全可以解决各种溯源、交易之类的问题,比如京东的电商,就是一个交易系统,没必要做成区块链。
区块链技术价值的体现在于对一个经济模型的设计。比如比特币,为什么大家会一直运行这个东西,先不说它的炒作,就从其机制来看,它首先通过一个挖矿的方式,实现了币的发行,通过奖励的形式使得社区中的矿工以及其他打包者能够得到收益。它通过这样一个经济模型,使得整个网络在没有一个实际的权威公司来进行服务的同时能够良好的运行。
这个也适用于其他的领域,我们在设计区块链系统的时候,一定要看它是不是拥有经济模型,如果它不拥有经济模型,那一般来说它就是可替代或者说不是必须使用区块链技术的。经济模型的意义在于它是一个公共运行的系统,是一个公链系统。
扩展技术
扩展技术是非区块链的一个核心技术栈,它是一个很重要的补充。
1)预言机。比如我们设置了一个系统,希望在区块链里捕获它的信息,或捕获电商的某些商品信息,这些商品信息进入到链内,就是所谓的上链。问题是链内的数据是通过种种共识协议,包括各种校验,是经过了信任处理的,但链外的数据对于链内来讲是不受信任的。预言机就是解决这个问题的。
2)预言机技术到目前为止还没有一个特别成熟的方案,所采取的做法也都是一些类似于投票的机制,就是有一些验证节点、投票节点,如果大多数节点认为取得的这个数据是可信的,那么就认为该数据可被信任,当然其中也会使用一些**证书之类的验证机制。
3)侧链和闪电网络主要是对主链性能的补充,侧链和闪电网络的概念都来源于比特币系统的扩展。当主链系统特别繁忙的时候,一个区块的确认要等待很长的时间,如何对这种平常的事务进行快速交易,有人就设计出单独另开一个链,这个链上的数据可以秒级地进行收发确认,然后在最后再用主链通过合约的形式进行一个信用担保或者结算,如果运行的侧链跟闪电网络中的数据,有人耍赖或者提供一些破坏的话,最终会被主链的惩罚合约以没收币的形式来进行监管。
4)零知识证明之前已经介绍过了,它也是属于一个非必须的扩展技术。
5)跨链协议。我个人认为跨链可能是未来的一个形态,在一条链上运行各种应用不太现实,未来更可能出现的是拥有各种不同的专门的定制化的链。但这些链不能是一个个的孤岛,它们彼此之间必须能够互相交换信任和数据,这就是跨链协议。虽然到目前为止仍然没有出现成熟的跨链的技术,还都是一些概念的验证,但这将会是未来的一个发展方向。
侧链和闪电网络
如图所示就是侧链/闪电网络跟主链的关系,它是跟主链配合,可以认为它相当于是集群的备份,负载均衡。
预言机
预言机就是外部信息如何进入到链内,以及链上数据如何到外部。Reality Keys、 Oraclize是两个目前比较典型的开源方案,我们可以在GitHub上看到它们的代码,这两个方案目前都没有经过严格而完整的实战验证。
零知识证明
零知识证明主要是对加密算法的使用,就是隐匿发送方与接收方的交易信息,但是在隐匿了之后别人怎么来验证你的数据是没有问题的、是合法的呢?在这种情况之下来进行这种技术应用。
Zk-SNARKS算法是目前比较主流的零知识证明算法框架,一般在开发零知识证明这一块的代码的时候,主要都是使用这一套方法,它是来源于zcash的一个发展。还有其他的一些零知识证明算法的应用,包括同态隐藏、盲评价多项式、知识系数测试和假设等。
在商业应用环境之下,零知识证明拥有比较重要的地位,因为它是对数据在加密情况之下的一个检测,在公链上一般不太适用于直接的商业化的使用,因为商业化应用对数据加密有更健壮的要求。
跨链协议
跨链协议是通过中继链提供多种链系统的数据交换。它的目的一方面是减缓单链的性能压力,另一方面是提供链之间的层次性。之前在以太坊我们发现,它的网络极其拥堵的时候(比如数字加密猫的出现,导致整个网络极其拥堵,几乎不可用),以太坊官方曾经提出过一个分片的做法,但这个做法其实是以降低安全性为代价的。它的一个基本理念是认为以前要全网广播这些数据最终一致性,现在认为比如说全网是一万个节点的话,有4000个节点已经同步就可以了。这种做法对于带有资产的链而言,其实是降低安全性的。
更好的做法其实是提供分层链,也就是每一条链依然是完整的,两个链或者说多个链之间进行同步的多点共识。目前以太坊官方也在全球招募技术开发者来做这一块的探讨和实践。
3
目前主流系统
公有链:比特币、以太坊、比特股、瑞波网络。
联盟链:Fabric,超级账本之下的一个子项目,它不是一个链,而是联盟链的一个开放框架,开源的,可以直接拿来用。
EEA叫企业级以太坊,以太坊本身是公链,但应用在企业场景之下时提出了EEA企业级以太坊的概念。企业级以太坊目前有一套已经提供源码的实现是Quorum,它是摩根提供的EEA实现,它的源码也在GitHub上,可以去看看。
公有链和联盟链之间在功能板块上的主要差别是联盟链支持更多鉴权、综合验证等,联盟链一般来说它本身不是一条链,更多的是一个技术开发框架,使用者可以自己来部署网络。
4
区块链生态
着眼于整个区块链的生态,上图表示我个人意见上的一个划分。
1)开发层面,目前有不少东西是缺乏的,比如开发环境,现在并没有专用的区块链的开发环境,也没有比较成熟的标准库,包括跨链协议,都是缺乏的,建议技术研发的同学可以往这些方向去做一些贡献。
2)安全,比如应用审查方面,代码的健壮性。我们要注意的是区块链系统上的数据往往是带有资产性质的。早期出现过一个事故:一个以太坊合约的代码漏洞导致数亿美元的资产丢失,其实导致这个事故发生的原因很简单,就是写合约代码的时候出现了一个漏洞,被黑客攻击,在安全上缺乏标准的测试环节。
3)监管。公司内部或机构之间其实没什么关系,但公链是需要国家监管的。监管包括对数据审计、沙盒监管等,到目前为止主要是靠人为管理,没有一个技术机制,所以很难保证链上运行数据的合法性。国家也一直在努力寻找解决方案。需要注意的是,这里说的监管并不是指由某一个部门或人来决定,而是一套法律机制。
4)运营。这里特意把版本管理列出来,通常一个软件的版本管理不至于放到运营的高度来,但对于区块链系统来讲,版本管理是一个非常重要的事件。我们知道它不是一个中心化的系统,那就意味着当开发团队发布新版本以后,如果这个新版本做了很大的改动,甚至包括底层协议都改了,它是无法保证所有的用户都会去升级的,比如比特币,如果有10万个用户的话,可能8万个用户升级了,还有2万个用户不想升级,那就会导致这个链的分叉。所以版本管理是运营的一个非常大的事情。异常管理主要是针对发生网络拥堵等问题的管理。
开发工具链
开发工具链是未来在这一块的开发,今年其实也出现了一些相关工具,包括:
1)针对区块链的领域特定IDE;
2)标准资产定义向导,标准资产定义向导,比如基于以太坊的代币,它本身不是一个标准,但因为用的多了很多人会在上面去定义这个东西,于是很多机构认为有必要对它进行一个接口的约定,当你写这份合约代码的时候,按照标准去实现它特意命名的这些函数接口,以使得其他人可以直接识别这个合约,这其实是一个标准化的例子;
3)关键算法库如共识算法、加解密算法库等,比如石墨烯就是一个工具库,比特股就是基于它开发的一个去中心化交易所。
测试沙盒
测试沙盒主要是对于智能合约的代码安全测试;节点模拟沙盒测试,模拟大规模的节点、模拟节点的时效、模拟恶意节点等;攻击测试;多版本分叉测试,每次分叉对于区块链都是一个重大的事件,因为通常意味着它原始的共识网络会被打断,就可能会带来一系列的安全问题。包括公司内部也一样,节点数量更多的时候,当你不能同步升级就会导致分叉。
5
当前问题
总的来看,当前的问题主要表现为:智能合约的安全性、系统可用性、多链互联协议缺乏标准和产品验证、互联网审计监管技术方案缺乏、以及专业特定的开发及测试工具缺乏。更多的问题主要在公链,联盟链在公司或机构之间,问题会少很多。
加入知识星球
和蒋勇老师交流
(本文内容为《白话区块链》作者蒋勇老师于京东大学区块链专题公开课的分享实录。
本文编辑:Cynthia)
以下是我们的社区介绍,欢迎各种合作、交流、学习:)