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, 再输

