购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

前面我们介绍了区块链的基础知识和发展历程,相信读者已经对区块链有了一个较为直观的认识,本节将更进一步,深入介绍区块链的系统架构和关键技术。

1.3.1 基础模型

图1.3所示是区块链的基本架构,该图的绘制参考了《区块链技术发展现状与展望》和工信部《中国区块链技术和应用发展白皮书(2016)》中的区块链架构图。区块链基本架构可以分为数据层、网络层、共识层、激励层、合约层和应用层:

在该架构中,基于时间戳的链式结构、分布式节点间的共识机制和可编程的智能合约是区块链技术最具代表性的创新点。一般可以在合约层编写智能合约或者进行脚本编程,来构建基于区块链的去中心化应用。下面将对本架构中每一层所涉及的技术展开具体介绍。

{%}

图1.3 区块链基本架构

1.3.2 数据层

数据层是区块链的核心部分,区块链本质上是一种数据库技术和分布式共享账本,是由包含交易信息的区块从后向前有序连接起来的一种数据结构。该层涉及的技术主要包括:区块结构、Merkle树、非对称加密、时间戳、数字签名和哈希函数。时间戳和哈希函数相对比较简单,这里重点介绍一下区块结构、Merkle树、非对称加密和数字签名。

  1. 区块结构

    每个区块一般都由区块头和区块体两部分组成。如图1.4所示,区块头部分包含了父区块哈希值、时间戳、Merkle根等信息,而区块体部分则包含了此区块中所有的交易信息。除此之外,每一个区块还对应着两个值来识别区块:区块头哈希值和区块高度。

    图1.4 区块结构

    每一个区块都会有一个区块头哈希值,这是一个通过SHA256算法对区块头进行二次哈希计算而得到的32字节的数字指纹。例如,比特币的第一个区块头哈希值为000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f。区块头哈希值可以唯一标识一个区块链上的区块,并且任何节点通过对区块头进行简单的哈希计算都可以得到该区块头的哈希值。区块头哈希值也包含在区块的整体数据结构中,但是区块头的数据和区块体的数据并不一定一起存储,为了检索效率起见,在实现中可以将二者分开存储。

    除了通过头哈希值来识别区块,还可以通过区块高度来对区块进行识别。例如高度为0和前面000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f所索引的区块都是第一个区块。但是与头哈希值不同的是,区块高度并不能唯一地标识一个区块。由于区块链存在着分叉情况,所以可能存在2个或2个以上区块的区块高度是一样的。

    谈完了头哈希值和区块高度,下面介绍区块头的构造。以比特币为例,区块头有80字节,其详细结构如表1.1所示。

    表1.1 区块头详细结构

    区块头由3组元数据组成,第一组是引用父区块的哈希值数据,用于同前一区块进行相连;第二组即难度值、时间戳和随机数,这些都与挖矿竞争相关;第三组是Merkle根,是区块体中Merkle树的根节点。

  2. Merkle树

    前面介绍了区块头哈希值、区块高度和区块头的结构,接下来看看区块体。区块体存储着交易信息,在区块中它们是以一棵Merkle树的数据结构进行存储的,而Merkle树是一种用来有效地总结区块中所有交易的数据结构。Merkle树是一棵哈希二叉树,树的每个叶子节点都是一笔交易的哈希值。同样以比特币为例,在比特币网络中,Merkle树被用来归纳一个区块中的所有交易,同时生成整个交易集合的数字指纹即Merkle树根,且提供了一种校验区块是否存在某交易的高效途径。生成一棵Merkle树需要递归地对每两个哈希节点进行哈希得到一个新的哈希值,并将新的哈希值存入Merkle树中,两两结合直到最终只有一个哈希值,这个哈希值就是这一区块所有交易的Merkle根,存储到上面介绍的区块头结构中。

    下面通过一个实例来对Merkle树进行进一步的介绍。图1.5是一棵只有4笔交易的Merkle树,即交易A、B、C和D。

    {%}

    图1.5 Merkle树

    第一步,使用两次SHA256算法对每笔交易数据进行哈希运算,得到每笔交易的哈希值,这里可以得到H A 、H B 、H C 、H D 这4个哈希值,也就是这棵Merkle树的叶子节点。例如,

    H A = SHA256(SHA256(交易A))

    第二步,对两个叶子节点H A 、H B 的哈希值同样使用两次SHA256进行组合哈希运算,将会得到一个新的哈希值H AB ,对H C 、H D 进行同样的操作将获得另一个哈希值H CD 。例如,

    H AB = SHA256(SHA256(H A +H B ))

    第三步,对现有的两个哈希值H AB 、H CD 进行第二步中的组合运算,最后将得到一个新的哈希值H ABCD

    H ABCD = SHA256(SHA256(H AB +H CD ))

    此时我们已经没有了其他同高度节点,所以最后的H ABCD 就是这一棵Merkle树的Merkle根。之后将这个节点的32字节哈希值写入区块头部Merkle根字段中。Merkle树的整个形成过程结束。

    因为Merkle树是一棵二叉树,所以它需要偶数个叶子节点,也就是偶数笔交易。但是在很多情况下,某个区块的交易数目会出现奇数笔。对于这种情况,Merkle树的解决方案是复制最后一笔交易,以此构造成偶数个叶子节点,这种偶数个叶子节点的二叉树也称为平衡树。

    图1.6展示的是一棵更大的Merkle树,由16个交易构成。通过图示,可以发现,不管一个区块中有一笔交易还是十万笔交易,最终都能归纳成一个32字节的哈希值作为Merkle树的根节点。

    {%}

    图1.6 多节点的Merkle树

    当需要证明交易列表中的某笔交易存在时,一个节点只需计算log 2 N 个32字节的哈希值,就可以形成一条从Merkle树根到特定交易的路径,Merkle树的效率如表1.2所示。

    表1.2 Merkle树的效率

  3. 非对称加密与数字签名

    非对称加密是区块链技术中用于安全性需求和所有权认证时采用的加密技术,常见的非对称加密算法有RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)和ECDSA(椭圆曲线数字签名算法),等等。与对称加密算法不同的是,非对称加密算法需要两个密钥:公开密钥(public key)和私有密钥(private key)。基于非对称加密算法可使通信双方在不安全的媒体上交换信息,安全地达成信息的一致。公开密钥是对外公开的,而私有密钥是保密的,其他人不能通过公钥推算出对应的私钥。每一个公开密钥都有对应的私有密钥,如果我们使用公开密钥对信息进行了加密,那么必须有对应的私有密钥才能对加密后的信息进行解密;而如果是用私有密钥加密信息,则只有对应的公开密钥才可以进行解密。在区块链中,非对称加密主要用于信息加密、数字签名等场景。

    在信息加密场景(如图1.7所示)中,信息发送者A需要发送一个信息给信息接收者B,需要先使用B的公钥对信息进行加密,B收到后,使用自己的私钥就可以对这一信息进行解密,而其他人没有私钥,是没办法对这个加密信息进行解密的。

    {%}

    图1.7 信息加密

    而在数字签名场景(如图1.8所示)中,发送者A先用哈希函数对原文生成一个摘要(digest),然后使用私钥对摘要进行加密,生成数字签名(signature),之后将数字签名与原文一起发送给接收者B;B收到信息后,使用A的公钥对数字签名进行解密得到摘要,由此确保信息是A发出的,然后再对收到的原文使用哈希函数产生摘要,并与解密得到的摘要进行对比,如果相同,则说明收到的信息在传输过程中没有被修改过。

    {%}

    图1.8 数字签名

1.3.3 网络层

网络层是区块链平台信息传输的基础,通过P2P的组网方式、特定的信息传播协议和数据验证机制,区块链网络中的每个节点都可以平等地参与共识与记账。下面将详细介绍区块链平台网络层中的P2P网络架构、信息传输机制和数据验证机制。

  1. P2P网络架构

    区块链网络架构一般采用的是基于互联网的P2P(peer-to-peer,点对点)架构,在P2P网络中,每台计算机的每个节点都是对等的,它们共同为全网提供服务。而且,没有任何中心化的服务端,每台主机都可以作为服务端响应请求,也可以作为客户端使用其他节点所提供的服务。P2P通信不需要从其他实体或CA获取地址验证,因此有效地消除了篡改和第三方欺骗的可能性。所以P2P网络是去中心化和开放的,这也正符合区块链技术的理念。

    在区块链网络中,所有的节点地位均等且以扁平式拓扑结构相互连通和交互,每个节点都需要承担网络路由、验证区块数据、传播区块数据等功能。在比特币网络中,存在着两类节点:一类是全节点,它保存着区块链上所有的完整数据信息,并需要实时地参与区块链数据的校验和记录来更新区块链主链;另一类是轻节点,它只保存着区块链中的部分信息,通过简易支付验证(SPV)方式向其他相邻的节点请求数据以便完成数据的验证。

  2. 传输机制

    在新的区块数据生成后,生成该数据的节点会将其广播到全网的其他节点以供验证。目前的区块链底层平台一般会根据自身的实际应用需求,在比特币传输机制的基础上重新设计或者改进出新的传输机制,如以太坊区块链集成了所谓的“幽灵协议”,以解决因区块数据确认速度快而导致的高区块作废率和随之而来的安全性风险。这里我们以中本聪设计的比特币系统为例,列出其传输协议的步骤。

    (1) 负责交易的节点将新的交易数据向全网所有节点广播,节点接收后会将数据存储到一个区块中;

    (2) 每个节点基于自身算力在区块中找到一个符合难度要求的工作量证明,之后便向全网所有节点广播此区块;

    (3) 如果区块中的所有交易有效且未曾出现,那么其他节点才会认同并接收该数据区块。节点在该区块的末尾制造新的区块以延长链,将被接收区块的随机哈希值视为新区块的前序区块哈希值。

    如果交易的相关节点是一个未与其他节点相连接的新节点,比特币系统通常会将一组长期稳定运行的“种子节点”推荐给新节点以建立连接,或者推荐至少一个节点连接新节点。此外,进行广播的交易数据不需要全部节点都接收到,只要有足够多的节点做出响应,交易数据便可整合到区块链账本中。而未接收到完整交易数据的节点可以向邻近节点请求下载缺失的交易数据。

  3. 验证机制

    在区块链网络中,所有的节点都会时刻监听网络中广播的交易数据和新产生的区块。在接收到相邻节点发来的数据后,会首先验证该数据的有效性:若数据有效则按接收顺序为新数据建立存储池来暂存这些数据,并且继续向邻近节点转发;若数据无效则立即废弃该数据,从而保证无效数据不会在区块链网络中继续传播。验证有效性的方法是根据预定义好的标准,从数据结构、语法规范性、输入输出和数字签名等各方面进行校验。对于新区块的校验同理,某节点产生新区块后,其他节点按照预定义的标准对新区块的工作量证明、时间戳等进行校验,若确认有效,则将该区块链接到主区块链上,并开始争取下一个区块的记账权。

1.3.4 共识层

Leslie Lamport于1982年提出著名的拜占庭将军问题,引发了无数研究者探索解决方案。如何在分布式系统中高效地达成共识是分布式计算领域的一个重要研究课题。区块链的共识层的作用就是在不同的应用场景下通过使用不同的共识算法,在决策权高度分散的去中心化系统中使各个节点高效地达成共识。

最初,比特币区块链选用了一种依赖节点算力的工作量证明共识机制来保证比特币网络分布式记账的一致性。之后随着区块链技术的改进,研究者陆续提出了一些不过度依赖算力就能达到全网一致的算法,比如权益证明共识机制、授权股份证明共识机制、实用拜占庭容错算法、Raft共识算法,等等。下面我们对这几种共识算法进行简单介绍。

  1. PoW(工作量证明)机制

    PoW机制诞生于1997年 Adam Back 设计的Hashcash系统,它最初被创造出来用于预防邮件系统中铺天盖地的垃圾邮件。2009年,中本聪将PoW机制运用于比特币区块链网络中,作为达成全网一致性的共识机制。从严格意义上讲,比特币中所采用的是一种可重复使用的Hashcash工作证明,使得生成工作证明量可以是一个概率意义上的随机过程。在该机制中,网络上的每一个节点都在使用SHA256哈希算法运算一个不断变化的区块头的哈希值。共识要求算出的值必须等于或者小于某个给定的值。在分布式网络中,所有的参与者都需要使用不同的随机数来持续计算该哈希值,直到达到目标为止。当一个节点得出了确切的值,其他所有的节点必须相互确认该值的正确性。之后,新区块中的交易将被验证以防欺诈。然后,用于计算的交易信息的集合会被确认为认证结果,用区块链中的新区块表示。在比特币中,运算哈希值的节点被称作“矿工”,而PoW的过程被称为“挖矿”。由于认证的计算是一个耗时的过程,所以也提出了相应的激励机制(例如向矿工授予一小部分比特币)。总的来说,工作量证明就是对于工作量的证明,每个区块加入到链上,必须得到网络参与者的同意验证,矿工对它完成了相对应的工作量。PoW的优点是完全的去中心化和分布式账簿。缺点也很明显,即消耗资源:挖矿行为造成了大量的资源浪费,同时PoW达成共识的周期也比较长,比特币网络会自动调整目标值来确保区块生成过程大约需要10分钟,因此它不是很适合商业运用。

  2. PoS(股权证明)机制

    PoS的想法源于尼克·萨博(Nick Szabo),是PoW的一种节能替代选择,它不需要用户在不受限制的空间中找到一个随机数,而是要求人们证明“货币”数量的所有权,因为其相信拥有“货币”数量多的人攻击网络的可能性更低。由于基于账户余额的选择是非常不公平的,单一最富有的人势必在网络中占主导地位,所以后来提出了许多解决方案,结合股权来决定谁来创建下一个块。其中,Blackcoin使用随机选择来预测下一个创建者,而Peercoin则倾向于基于币龄来选择。Peercoin首次开创性地实现了真正的股权证明,它采用工作量证明机制发行新币,采用股权证明机制维护网络安全,这也是“虚拟货币”历史上的一次创举。同比特币网络要求证明人执行一定量的工作不同,该机制只需要证明人提供一定数量“数字货币”的所有权即可。在股权证明机制中,每当创建一个区块时,矿工需要创建一个称为“币权”的交易,这个交易会按照一定的比例预先将一些币发给矿工。然后股权证明机制根据每个节点持有代币的比例和时间,依据算法等比例地降低节点的挖矿难度,以加快节点寻找随机数的速度,缩短达成共识所需的时间。与PoW相比,PoS可以节省更多的能源,更有效率。但是,由于挖矿成本接近于零,因此可能会遭受攻击。且PoS在本质上仍然需要网络中的节点进行挖矿运算,所以它同样难以应用于商业领域。

  3. DPoS(股份授权证明)机制

    DPoS由比特股(Bitshares)项目组发明。类似于现代企业中的董事会制度,在DPOS中将代币持有者称为股东,区块的股东们(拥有股份)通过民主选举的方式投票推举他们的代表,所推选出的代表将负责新区块的生成与数据验证工作。如果想要成为代表,获得相应的权利,持币者必须首先使用自己的区块链公钥进行注册,获得长度为32位的唯一ID标识符,股东们以交易的形式对持币者的标识符进行投票,得票数排名靠前的持币者将会被选为代表。代表们轮流进行区块的生产工作,并共享平分交易所得收益(即手续费)。假若有的代表为了自身利益在区块链上作恶,按照分布式账本的特性,很容易被其他股份与代表们发现并被剔除出区块链系统,所产生的空缺位置将由得票数排名靠后的持币者替代。DPoS大幅减少了参与区块生成验证与记账节点的数量,不需要节点耗费额外的工作量,节省了大量的算力资源与共识验收时间。DPoS实现了去中心化与中心化的设计,大幅加快了区块链上的交易速度。

  4. PBFT(实用拜占庭容错)算法

    这个算法最初出现在MIT的Miguel和Barbara Liskov的学术论文中,初衷是为一个低延迟存储系统所设计,降低算法的复杂度,该算法可以应用于吞吐量不大但需要处理大量事件的数字资产平台。它允许每个节点发布公钥,任何通过节点的消息都由节点签名,以验证其格式。验证过程分为3个阶段:预备、准备、落实。如果已经收到超过1/3不同节点的批准,服务操作将是有效的。使用PBFT,区块链网络 N 个节点中可以包含 f 个拜占庭恶意节点,其中 f = ( N -1)/3。换句话说,PBFT确保至少2 f +1个节点在将信息添加到分布式共享账簿之前达成共识。目前,Hyperledger联盟、中国ChinaLedger 联盟等诸多区块链联盟都在研究和验证这个算法的实际部署和应用。

  5. Raft(信道可信条件下)共识算法

    Raft是由Stanford提出的一种更易理解的一致性算法,在没有作恶节点但网络节点可能死机的前提条件下,达成所有节点的一致性共识。Raft节点一般分为3种角色:Follower、Candidate和Leader。一开始,所有的节点都是以Follower角色启动,想当Leader的节点将会成为Candidate节点,并向其他Follower发出选举投票请求,只要超过半数的节点选择自己,即可成为Leader节点,之后该Leader节点每隔一段时间就向Follower节点发送“心跳”保活,否则其余节点可再次竞争Leader节点。写入数据时,Leader先将数据暂时写入本地日志,并向Follower发送添加数据请求。当有超过半数的添加成功信息返回时,Leader便可以写入本地并向客户端发回成功结果,否则写入失败。

1.3.5 激励层

激励层作为将经济因素引入区块链技术的一个层次,其存在的必要性取决于建立在区块链技术上的具体应用需求。本节以比特币系统为例,对激励层进行介绍。

在比特币系统中,大量的节点算力资源通过共识过程得以汇聚,从而实现区块链账本的数据验证和记账工作,因而其本质上是一种共识节点间的任务众包过程。在去中心化系统中,共识节点本身是自利的,其参与数据验证和记账工作的根本目的是最大化自身收益。所以,必须设计合理的激励机制,使得共识节点最大化自身收益的个体行为与区块链系统的安全性和有效性相契合,从而使大规模的节点对区块链历史形成稳定的共识。

比特币采用PoW共识机制,在该共识中其经济激励由两部分组成:一是新发行的比特币;二是交易流通过程中的手续费。两者组合在一起,奖励给PoW共识过程中成功计算出符合要求的随机数并生成新区块的节点。因此,只有当各节点达成共识,共同合作来构建和维护区块链历史记录及其系统的有效性,当作奖励的比特币才会有价值。

  1. 发行机制

    在比特币系统中,新区块产生发行比特币的数量是随着时间阶梯型递减的。从创世区块起,每个新区块将发行50个比特币奖励给该区块的记账者,此后每隔约4年(21万个区块),每个新区块发行的比特币数量减少一半,以此类推,一直到比特币的数量稳定在上限2100万为止。前文提到过,给记账者的另一部分奖励是比特币交易过程中产生的手续费,目前默认的手续费是1/10 000个比特币。两部分费用会被封装在新区块的第一个交易(称为Coinbase交易)中。虽然现在每个新区块的总手续费与新发行的比特币相比要少得多,但未来比特币的发行数量会越来越少,甚至停止发行,到那时手续费便会成为共识节点记账的主要动力。此外,手续费还可以起到保障安全的作用,防止大量微额交易对比特币系统发起“粉尘攻击”。

  2. 分配机制

    随着比特币挖矿生态圈的成熟,“矿池”出现在人们的视野中。大量的小算力节点通过加入矿池而联合起来,通过合作汇集算力来提高获得记账权的概率,并共享生成新区块得到的新发行比特币和交易手续费奖励。据Bitcoinminning.com统计,目前已经存在13种不同的分配机制。现今主流矿池通常采用PPLNS(pay per last N shares)、PPS(pay per share)和PROP(PRO portionately)等机制。在矿池中,根据各个节点贡献的算力,按比例划分为不同的股份。PPLNS机制在产生新的区块后,各合作节点根据其在最后 N 个股份内贡献的实际股份比例来分配奖励;PPS则直接根据股份比例为各节点估算和支付一个固定的理论收益,采用此方式的矿池将会适度收取手续费来弥补其为各个节点承担的收益不确定性风险;PROP机制则根据节点贡献的股份按比例地分配奖励。

1.3.6 合约层

合约层作为在区块链系统中编程功能的实现,封装了各种智能合约、脚本算法等。作为全球账本的区块链系统,比特币本身就具备简单的脚本编程功能。而作为区块链2.0的代表,以太坊平台极大地强化了编程语言方面的功能,理论上可以使用特定的脚本语言来实现任何功能的应用(即DApp)。通过这些应用,以太坊可以被视为“全球计算机”,任何人都可以使用区块链系统中的共识性、一致性来上传和执行任意脚本程序,并通过共识机制来保证程序有效安全地运行,而不存在数据泄露以及恶意篡改等问题。如果说区块链数据、网络互联和共识机制这3个层级代表的是区块链底层结构的“虚拟机”(它们分别代表数据表示、数据分发和数据验证工作),那么合约层就是区块链能将复杂的商业逻辑、复杂算法等一系列高级应用作用于该虚拟机上的基础构件。虽然包括比特币在内的大多数“数字加密货币”采用的是非图灵完备的简单脚本代码,但这种简单雏形能简单地实现用户对交易过程的控制,是区块链系统实现数据控制以及图灵完备编程的基础。随着技术的演变与进化,以太坊等一系列图灵完备的平台系统的出现标志着区块链系统能够通过更加完备复杂的脚本语言参与到社会问题和金融监管之中。

1995年,学者尼克·萨博提出了智能合约的定义:“一个智能合约是一套以数字形式定义的承诺,包括合约参与方可以在上面执行这些承诺的协议。”该定义被视为智能合约的雏形,萨博希望能够将智能合约内嵌入物理机器实体来管理与创造安全可控的智能资产,为新兴物理机器产生相应的社会价值。由于当时时代的局限性以及技术水平的落后,智能合约的概念并未受到从业者的广泛关注。

2008年之后,比特币的兴起和区块链技术的成熟为智能合约赋予了新的定义。智能合约技术将作为区块链技术的一部分,在区块链系统中承担着运行模块化、智能化脚本文件的工作,让区块链系统具备数据集管理、执行商业逻辑、解决基本金融问题等一系列的功能。合约在被部署到区块链上后会被虚拟机编译为一系列的操作码,然后存储到特定的地址中。当区块链上的交易满足合约上的预定条件时,智能合约就会被触发,全网节点执行智能合约的操作码,并将最后执行结果写入新区块中。智能合约作为嵌入式程序协议,开发者可以将其部署至任意区块链数据、交易或资产中,以形成可编译控制的系统、市场监控系统或数字资产。智能合约不仅会为金融行业提供区块链的解决方案,还将在管理社会系统中的信息、资产、合同和监管运作等方面发挥越来越重要的作用。

智能合约可以应用于大量数据驱动的业务工作中,通过智能合约的应用,区块链减少了操作成本,提高了工作效率,并且能够避免部分恶意行为对区块链系统的干扰,提高了区块链的应用安全性。2013年年末,以太坊创始人Vitalik Buterin发布了以太坊“白皮书”《以太坊:下一代智能合约和去中心化应用平台》,启动了以太坊项目。Vitalik Buterin首先看到了区块链技术和智能合约相结合所带来的巨大进步,创建了内嵌图灵完备编程语言的公有区块链系统,使得任何赞同以太坊理念的开发者都能够创建合约和去中心化应用。

智能合约与区块链的结合极大地丰富了区块链的价值内涵,其特性有以下3点: 8tb3SN0N2U5nNwZlryn7tRiQDkoJgqq/QKmOBNghIPnrJWS+WHVAW02WfDH2jssO

点击中间区域
呼出菜单
上一章
目录
下一章
×