Page 286 - 《软件学报》2020年第9期
P. 286

张志威  等:区块链的数据管理技术综述                                                              2907


         节点通过工作量证明,确定下一个有权利将生成的区块添加到链中的节点.参与工作量证明的节点称为挖矿节
         点.例如:当一个区块的结构如图 1 所示,包括前一区块的哈希值、共识的验证字段以及区块内事务的哈希值时,
         挖矿节点利用这些哈希值计算出该区块的共识的验证字段,使得验证字段满足以下条件:
                                  hash(PrevBKhash|ConsProof|MerkleRoot)≤Z                     (1)
         其中,Z 这一参数控制工作量的大小.最先计算出相应验证字段的挖矿节点将其结果全网广播,其他的挖矿节点
         验证其收到的验证字段是否满足方程(1)的条件:若结果满足,则将区块添加到已有区块链的尾部,而最先计算出
         结果的节点则获得相应的奖励.工作量证明的共识协议可以很好地应用于公有链网络中,并且可以抵御女巫攻
         击 [46] .当恶意的算力达到全网算力的 10%时,在 6 个区块后确认的交易可以保证超过 99.9%的真实性                         [47] .同时,
         在工作量证明方程的结果广播的过程中,PoW 共识可利用中继节点,通过多轮传递方式来减少工作量证明共识
         机制的冗余网络开销        [48] .
             另一类型的共识协议则是基于通讯的共识协议,基于通讯的协议将投票权分配给网络中的节点,并利用多
         轮通讯达成共识.该协议的代表为实用拜占庭容错协议(PBFT)                   [27] .PBFT 共识协议需经过 3 个过程:pre-prepare
         阶段、prepare 阶段以及 commit 阶段.当用户提交请求时,一个主节点会在 pre-prepare 阶段广播其请求.在 prepare
         阶段,所有的节点收到请求后判断是否执行该操作:如同意执行,则将自己的签名添加在消息中,并广播给其他
         节点;若不同意执行,则不发送消息.当节点接收到其他节点发送的执行操作的消息达到一定数量时,则说明执
         行操作达成了共识.在 commit 阶段,节点执行相应的请求,并将执行结果回报给主节点.由于所有的节点都将全
                                                                                          2
         网发送并接受来自所有其他节点的消息,因而在网络中有 N 个节点的情况下,其网络开销复杂度为 O(N ).
             以上两种共识分别基于计算和通讯.同时,有其他共识协议改进 PoW 共识协议中的条件方程,或在两种共
         识协议中做一定的取舍.例如,Elastico        [49] ,RapidChain [50] ,Byzcoin [51] ,Tendermint [52] 等均利用采样的方式选取领导
         者节点,并在领导者节点中利用 PBFT、工作量证明或其他基于投票的算法达成共识,从而减少其共识阶段的开
         销.需要注意的是,基于计算的工作量证明共识并不能确定保证网络中的事务均合法.当恶意节点控制全网 33%
         的算力时,则恶意节点已有可能控制整个网络                [53,54] .与之不同,PBFT 共识则是确定性的.但是由于其网络开销为
            2
         O(N ),当增加网络节点个数时,网络产生的额外开销会超过增加算力所节省的时间,使得系统的性能随着算力
         增加而降低.因此,直接使用 PBFT 共识将会降低整个网络的可扩展性                     [55] ,并成为部分区块链系统的性能瓶颈         [22] .
         关于其他共识机制的综述可见文献[56,57].
         1.3   UTXO与Account模型
             在区块链系统中,典型的数据模式是比特币所基于的 Unspent Transactions  Outputs(UTXO)结构.以比特币
         为例,在 UTXO 模型中,不存在一个账户记录一个用户所持有的所有比特币.每个交易均是通过已有的 UTXO 生
         成新的 UTXO.换言之,交易只是代表 UTXO 集合的变更,而一个用户所拥有的全部比特币是其所拥有的 UTXO
         总和.例如,假定用户 A 分别在事务 1 和事务 2 中转账 2 个比特币到 B 用户.此时,B 用户有两个 UTXO:UTXO 1
         与 UTXO 2 ,且分别包含 2 个比特币.当用户 B 计划生成事务 3,并在事务 3 中转账 3 个比特币到用户 C 的账户时,
         事务 3 的输入需要包含的是 B 用户的 UTXO.本例中,事务 3 的输入可以为 UTXO 1 以及 UTXO 2 .之后,在事务执
         行过程中,事务将输入的 UTXO 标记为已花费的状态,并生成一个新的包含 3 个比特币的 UTXO,并将其转移到
         C 用户.同时,事务生成一个 UTXO 包含剩下的一个 1 个比特币,并将其转移到 B 用户.通过 UTXO 这一模型,所
         有交易均在已有的 UTXO 之上进行,大多数交易只需要判定是否存在双花(一个 UTXO 被多次交易)即可.因而,
         交易是否被执行可以很快地验证,并且具有很高的隐私性.但是由于其不存在账户的概念且交易需要基于
         UTXO,其编程复杂度较高.
             另一种数据模型是 Ethereum 所采用的 Account 模型,该模型下一个账户包含用户所有可用的电子货币.当
         一个交易被提交时,相应的事务首先判断账户内的电子货币是否足以完成该交易:如果可以,则该交易被执行;
         否则,交易被取消.与 UTXO 相比,Account 模型更容易理解,并节省了大量的存储空间.而 UTXO 则可以更好地保
         护用户隐私.
   281   282   283   284   285   286   287   288   289   290   291