Page 319 - 《软件学报》2025年第9期
P. 319

4230                                                       软件学报  2025  年第  36  卷第  9  期



                 30.      v = JoinSegment(V) ▷    按照  i 的顺序将交易分片进行组合
                 31.    向  P sender  返回  Finish(v) := {Finish,v} 消息  ▷ Finish  消息用于判断广播是否结束
                 32.    return
                 33. 本地存储完成广播的交易集合         V = V ∪v
                                                                                              进行单独广播
                    a) 当节点作为广播发送方广播消息时, 先将交易信息切分成                  k 份, 并对其中的每一份      v i ← {v i } k
                                                                                           {s j } n , 通过纠删码
                 和消息应答. 为了降低通信复杂度, 发送方将交易信息切片                 v i  按照参与协议的节点数进行切分为
                 对数据进行压缩, 并将每一个         s j ← {s j } n  作为叶结点构建  Merkle 树  (哈希树). 对于发送方发送给节点  P j  的  VAL  消
                 息, 其中包含   Merkle 树的根哈希值     h、Merkle 树第   个分支的哈希值  、交易分片          s j  以及分片所在交易切片     v i
                                                          j
                                                                        b j
                 的索引值   i.
                    b) 当广播发送方完成发送后, 所有节点开始监听消息: 接收方若接收到来自广播发送方的                             VAL  消息, 则将
                 VAL  消息重新封装成     ECHO  消息, 并向协议方节点进行多播; 协议方若接收到来自其他协议方广播的                       ECHO  消
                 息, 将检查消息中的根哈希值         h、分支哈希值     b j  和交易分片  , 以判定消息内容是否被恶意篡改. 若通过检查, 则
                                                                s j
                 保存消息, 若未通过, 则抛弃消息.
                    c) 协议方若累计接收到对同一根哈希值            h 和交易切片索引值      i 的  n− f  个不同且有效的  ECHO  消息时, 则采样
                                             h
                                              ′
                 n−2 f  个消息, 并重新生成根哈希值  , 与原根哈希值          h 进行对比. 若两根哈希值一致, 且未广播过对于根哈希值                h
                 和交易切片索引值      i 的  READY  消息, 则将此消息进行广播; 否则中止广播.
                    d) 协议方若累计接收到       f +1 个对于同一根哈希值      h 和交易切片索引值   的   i  READY  消息, 且未广播过对于根
                 哈希值   h 和交易切片索引值   的  i  READY  消息, 则将此消息进行广播         (算法  1  第  26–28  行); 协议方若累计接收到
                 2 f +1 个对于同一根哈希值     h 和交易切片索引值   的  i   READY  消息, 则等待   n−2 f  个  ECHO  消息, 并从中恢复出交
                 易切片   v i , 并将切片和索引值进行保存. 若保存的不同交易切片数量达到                 k  个, 则按照索引值拼接出原交易信息,
                 保存在本地, 完成     k-RBC.

                 4.2.2    共识阶段随机置换优化: Opti-MVBA
                    MVBA (multi-value validated Byzantine agreement) 中引入随机置换, 这是防止敌手预先知道共识的顺序, 以通
                 过延迟提交, 完成对      ABA (asynchronous Byzantine agreement) 性能的攻击, 即使得   ABA  达成共识的轮数增
                 加  [39] . Dumbo2  中使用公共掷币生成随机种子, 再进行置换. 虽然根据公共掷币的不可预测性, 在未执行公共掷币

                 前, 敌手预测生成的随机数的概率          P 和生成随机数长度      n, 满足:

                                                            1
                                                        |P−  | ⩽ ε                                    (1)
                                                            2 n
                 其中,  ε 是一个可忽略值, 这样确保了敌手无法提前得知共识的顺序, 但使用普通的置换, 敌手依旧很难得知共识
                 的顺序. 所以可以将公共掷币换成更为简单的哈希函数, 虽然哈希函数可以使用预处理手段提高预测中随机种子
                                                                                           O(n), 小于公共掷
                 的概率, 但完全预测中随机种子依旧需要较高的时间代价, 并且由于哈希值的生成的时间复杂度
                              O(n ), 在性能上更具优势. 然而, 我们无从得知敌手的具体能力, 所以通过对                  ABA  共识轮数进行
                                 2
                 币的时间复杂度
                 计数, 在达到阈值后转换成随机置换完成共识.
                    优化后的共识阶段算法         Opti-MVBA  为: 各节点通过一致广播对提交的交易发起共识请求, 收到请求的节点通
                 过循环等待对提交的交易进行验证. 完成验证后, 对进行共识的交易顺序进行伪随机置换, 之后进入                                ABA  共识;
                 若  ABA  共识轮数超过阈值     τ, 则重新以公共掷币为种子进行随机置换, 再进入              ABA  共识.
                    Opti-MVBA  优化前后的流程示意图如图         4  所示, 具体的优化算法如算法       2  所示.
                                                     v 的  SEND  消息, 并等待其他协议方返回的        ECHO  消息. 当发送方
                    a) 广播发送方向其他协议方发送包含交易
                 接收到  2 f +1 个不同协议方的    ECHO  消息后, 向其他协议方广播        Finish  消息.
                    b) 当协议方收到来自发送方的          SEND  消息后, 返回   ECHO  消息. 当协议方收到来自发送方的          Finish  消息后,
                 若在  k-RBC  阶段存储的本地交易      V  中存在该交易    v, 则输出  v; 否则循环等待, 直到本地交易        V  加入交易   v, 再输
   314   315   316   317   318   319   320   321   322   323   324