中年技术简述 BFT 共识算法特性与优化方法( 二 )


本文插图
图 2 典型的两阶段共识方案
上图是典型的两阶段 BFT 共识方案 , 如 Tendermint[2] 和 Casper[3] 都是这种方案 。 在两阶段方案中 , 每个区块经过两轮投票后才能生产下一个区块 , 可保证区块的即时确认 , 但是在某些异常情况下存在 Liveness 问题 , 需要采取以下方案避免 。
增加锁定解锁机制 , 简化 View Change 复杂度 , 但是 View Change 需要等待固定的时间 (Δ) 收集足够的提交证明 , 因而损失 Responsiveness , Tendermint[2] 和 Casper[3] 是这种方案 。
View Change 时带上提交证明 , 具备 Responsiveness , 但是提高了 View Change 的复杂度 ,PBFT[4] 是这种方案 。
Pipeline 确认
中年技术简述 BFT 共识算法特性与优化方法
本文插图
图 3 三阶段 Pipeline 共识方案
Pipeline 方案可进一步降低复杂度 , 一个区块经过一轮投票达成后即可进入下一个区块的共识 ,但是一般需要经过后续多个区块投票达成后才能保证不可逆 , TTF (Time To Finality)相对稍长 。
通信机制优化
通信机制上可采用 Leader 和聚合签名进一步降低通信复杂度和通信量 。 下图为 Hotstuff[1] 的共识算法 。
中年技术简述 BFT 共识算法特性与优化方法
本文插图
图 4 基于 Leader 和聚合签名的 Hotstuff 共识算法
视图切换(View Change)优化
视图切换一般有两种优化方法降低复杂度:
将视图切换流程整合到正常流程 , 无需独立的视图切换流程
采用锁定解锁机制减少提交证明 , 上一个 View 的提交证明无需传递给下一个 View
并行 BFT (Concurrent BFT , 简称 CBFT)
典型的 BFT 算法要求交易按顺序执行 , 即使经过复杂度优化 , 吞吐量仍然还会受到较大的限制 。 因此 BFT 共识算法的并发优化也是非常重要的方向 。
CBFT 在学术上代表一类共识算法 , 也一直是共识算法的重点研究方向 , 之前已经有很多的研究成果 。 Kotla 和 Dahlin[5] 通过并行化执行独立的交易来提高吞吐量 , 他们设计了一些规则用以确定一个交易是否依赖于其他交易 。 Distler and Kapitza[6] 进一步扩展了 Kotla 和 Dahlin 的工作 ,引入了一种只在选定的副本子集上执行交易的方案 。 这个方案假设每个交易访问的状态变量是已知的 , 状态对象分布和对象访问是统一的 。 2012 年 , Honglei Zhang and Wenbing Zhao[7] 提出一种 CBFT 算法 , 使用软件事务性内存动态地检测并发操作的依赖性 。
大部分 BFT 类共识都可算作 PBFT 的变种 , 因此都可抽象为四个阶段:
Prepare:提议人生产区块并广播到整个区块链网络 。
Pre-Commit:进行第一轮投票 , 收到 N--f 个验证人的确认签名进入下一阶段 。
Commit:进行第二轮投票 , 收到 N-f 个验证人的确认签名进入下一阶段 。
Decide:最终提交区块 。
业界有些区块链系统在 Pre-Prapare 阶段根据交易的依赖性进行并行打包区块 , 有些在其他阶段进行并行处理 , PlatONE 云图联盟链的 CBFT 算法在 Prepare、Pre-Commit 和 Commit 阶段进行并行处理 。
中年技术简述 BFT 共识算法特性与优化方法
本文插图
图 5 PlatONE 云图联盟链的 CBFT 共识算法
PlatONE 云图联盟链的 CBFT 算法包含多个方面的优化 , 在降低复杂度的同时通过并行进一步提高吞吐量 。
三阶段 Pipeline 验证:一个区块经过一轮投票达成后即可进入下一个区块的共识 , 经过三个区块投票达成可最终确认 。
并行出块和验证:将出块与确认分离 , 在 Prepare、Pre-Commit 和 Commit 阶段进行并行处理 。


推荐阅读