PoP共识算法¶
概述¶
区块链上采用不同的共识算法会对系统的共识效率、去中心化程度产生不同影响。ChainSQL采用的PoP(Proof of Peers)共识算法参考PBFT共识机制对原有共识算法(RPCA)做了优化, 在提高了交易共识效率的同时兼顾了安全性。主要优化有:
- 通过增加交易池,增加交易的吞吐率;
- 通过梳理交易验证流程,适当简化接收交易的验证过程来提高交易接收速度;
- 通过使用leader提案的方式进行交易集共识提高交易集共识效率;
- 交易执行次数由原来的 2-3次减少到只执行一次。
目前新版本已实现的目标如下:
- 性能提升(普通8核16G环境,固态硬盘)
- 发送tps 700 提升到 4000
- 共识tps 700 提升到 4000
- 入库tps 500 提升到 1800
PoP共识算法介绍¶
交互示意图:
总体说明¶
原始的RPCA共识也是一个两轮2/3的共识过程,与PBFT类似,不同在于, PBFT是leader提案机制,RPCA是各节点平等,各自提案机制,从这个角度来说, RPCA相对更加去中心化一点。
RPCA共识流程¶
- 各节点收集交易。
- 各节点判断达到了closeLedger条件,开始提案自己的交易集
TMProposeSet
,由open
进入establish
阶段。 - 各节点协商交易集分歧,交换交易交易集达成共识,进入
accepted
阶段。 - 各节点根据交易集生成区块,并广播区块
TMValidation
,同时进入到下一区块的open
阶段。 - 各节点收集到quorum个Validation,区块达成共识。
"close" "accept"
open ------- > establish ---------> accepted
^ | |
|---------------| |
^ "startRound" |
|------------------------------------|
PoP共识流程¶
目前PoP共识算法修改了RPCA共识的2、3两步,流程如下:
- 各节点收集交易
- leader点从交易池中不断提取交易
- leader节点判断达到了closeLedger条件,开始提案自己的交易集
TMProposeSet
。 - 普通节点收到leader节点广播的交易集后,先向leader节点要交易集的头部信息,然后可以判断自已没有哪些交易,并向leader要自己缺少的交易。
- 各节点收集到完整的交易集后,向其它所有节点广播自己的投票,也就是
TMProposeSet
消息。 - 各节点收集其它节点的交易集投票,达到quorum条件,进入到
accepted
阶段。 - 各节点根据交易集生成区块,并广播区块
TMValidation
,同时进入到下一区块的open
阶段。 - 各节点收集到quorum个Validation,区块达成共识
//leader计算公式: leader_idx = (view + block_number) % node_num
另一方面,因为是leader提案的机制,必须有对应的容错机制,这里与PBFT一样加入了与交易集共识过程并行的view_change机制:
- 初始view为0。
- 每个timer判断是交易集共识超时,超时时间默认为3秒,可配置。
- 超时未达成交易集共识,则节点广播view_change消息。
- 节点收集view_change消息达到quorum,则view++,并改变当前区块leader。
- 新的leader重新开始交易集共识。
注解
如果采用不生成空区块的配置,当leader节点提案空交易集时,各节点收到空交易集提案后,都会触发view_change。
优化点¶
- 增加交易池,增加ChainSQL对交易数量上的处理能力。
- 交易提交时sequence的验证不使用OpenLedger,而是使用自定义类StateManager。
- 交易集的确认使用leader提案机制,替掉节点各自提案,然后沟通分歧的机制。
- 线程池中对于任务优先级的调整。
- 交易只验证一次(之前正常是2-3次)。
- 出块时间变短。
- 所有遍历区块中交易的地方,都使用同一个缓存。
- 同步入库一个区块使用一个事务,之前是一个交易一个事务。