cometbft改进协议
改进 CometBFT 共识协议
亮点
- 在牺牲少部分中心化的情况下大大提高共识的速度
- 无痛替换当前 cosmos 链的 cometBFT 共识模块
- 开放更多的验证者参与共识过程
- 双引擎异步工作,提高共识效率
- 可以和当前的 cosmos 链进行跨链(如 gaia)
实现思路
使用双共识引擎交叉协同工作,子引擎负责交易打包和执行,主引擎负责 IBC 跨链块的组装和最终块的生成
实现方案
约定
- 指定质押最多的前 N 个节点作为子引擎的验证者(这里假设取 500 个)
- 指定质押最多的前 M 个节点作为主引擎的验证者(这里假设取 20 个)
- 两个引擎在一定程度上共享世界状态,但是区块有所不同
- 主引擎共识的结果区块称为“主块”,子引擎共识的结果区块称为“子块”
- “子块”是一种中间块,不会直接存储,而是间接存储到“主块”中,从“主块”中可以恢复出所有“子块”
子引擎工作流程
- 选取一部分有效的交易 Txn
- 获取主引擎当前区块高度 BH(同一个高度可以重复使用,避免等待主引擎出新块)
- 优先选择主引擎块指定的 11 个验证者(如果有),否则从 500 个验证者中使用随机算法抽取 11 个验证者
- 选择子引擎当前的世界状态 T,执行交易,分发奖励和惩罚,得到新的世界状态 T'
- 11 个验证者使用 cometBFT 共识出一个新的区块
- 这里产生的是中间块,供主引擎打包使用
- 子引擎区块内容包括正常 cometBFT 区块和主引擎区块高度
主引擎工作流程:
- 选择子引擎最新共识出来的区块列表(同一个高度可以重复使用,避免等待子引擎区块出新块),可以为空列表
- 选择自上个主引擎区块打包的子引擎区块后新的的区块头列表和交易列表(为了避免产生的区块太大、可以只选择 0 - 3 个)
- 20 个验证者使用 cometBFT 共识出一个新的区块
- 这里的世界状态等同于最新打包子引擎区块的世界状态
- 主引擎区块内容包括正常 cometBFT 区块和子引擎区块头列表,交易列表为打包的子引擎区块列表的交易列表之和
特性:
- 可以各自出自己的块,不必等待另一个共识引擎工作的结果,主引擎可以以恒定速度出块(空块)
- 子引擎相当于提前执行交易收集打包等工作流程,可以加快主引擎共识速度,同时也在一定程度上增加去中心化程度
- 子引擎共识出的块头完全打包进了主引擎共识出来的块,可以从主引擎共识的块中还原出来的
- 整个共识速度基本上取决于 20 个验证者,由于节点数量少,甚至可以达到 2 秒内
子引擎共识卡块的解决方案
- 随机的 11 个验证者可能出现故障导致不能出块,由主引擎重新随机新的 11 个验证者
- 在一定时间内子引擎如果没有出块,那么主引擎会选择新的验证者,并将其写到区块头中
- 子引擎将由新的 11 个验证者接管继续出块
- 比如说主引擎连续打包了 5 个块时,都没有新的子块产生,那么将在第 6 个区块将指定新的 11 个验证者
- 子引擎会识别主引擎的区块,并将最新主引擎的区块高度和哈希打包,此时可以识别新的验证者
- 主引擎会打包子引擎的区块,并将最新的子引擎区块头列表打包,同时验证其有效性
- 重要:不管子引擎怎么卡块和分叉,都由主引擎来修正和抉择、主引擎永不分叉