最近 Facebook 因为公布加密货币项目 Libra 白皮书成为全球头部媒体的热议的对象,从 Libra 白皮书可以看到它的使命是建立一个简单易用的全球金融基础设施,将区块链概念带入了全世界三分之一人口,为其提供顺畅无缝、无国界的支付体验。

其采用的共识协议是 LibraBFT,这是一个新的拜占庭容错共识协议,这个共识协议是在另外一个共识协议 HotStuff 的基础上做一些细微的改动而来,由于技术的原因,目前 Libra 是以许可链方式进行 , 但是 Libra 的目标是做非许可链,Facebook 承诺将在五年内使 Libra 成为一个类似以太坊这样的非许可链。

HotStuff 共识算法由于 Libra 链的使用而一举成为大家关注的焦点。有趣的是,由于 Cypherium 首席执行官 Sky Guo 与 HotStuff 算法论文的第一作者尹茂帆(Ted Yin)是很好的朋友,他在 2018 年就向 Sky Guo 推荐 HotStuff,并解释了 Hotstuff 的工作原理。

Cyperium 团队在 HotStuff V2 版 发布的时候就开始关注并着手实现 , 直到现在的 V5 版,和 Facebook 不同的是,Cypherium 一开始的目标就是实现非许可型开放式 HotStuff 共识公链。

「许可型区块链」和「非许可型区块链」的区别是根据实体是否能作为验证者节点接入区块链平台来决定。

在「许可型区块链」中,实体通过权限授予方式运行验证者节点,因此在网络常常比较稳定,安全方面也不需要太多考虑 ; 在「非许可型区块链」中,符合技术要求的任何实体都可以运行验证者节点,类似以太坊这样的非许可链,任何矿工只要找到符合条件的 Nonce 值,都可以参与交易的打包而得到一定的固定奖励和交易手续费的奖励,这样有利于整个生态系统的广泛发展,但是设计整个链时必须对整个网络性能和安全给与更多的考虑。

非许可型区块链可以非常容易地变成许可型区块链,相反则比较困难。

Cypherium 用双链共识模式实现了 HotStuff 的非许可机制

HotStuff 共识原型的验证者是在一个固定的范围内的, LibraBFT 也是建立在 POS 机制上的,它在 Hotstuff 用于区块链时候加上了现实考量的机制,如引入了 epoch (代)的概念,允许共识节点替换,同时加上激励机制和惩罚机制,为了防止 Leader 被攻击引入不可预测 Leader 选举机制 (VRF) 等。

Cypherium 团队最初在考虑 HotStuff 实现方案时也是采用 POS 机制,但是后来发现由于 POS 机制的封闭性很强,生态系统不好发展,容易吸引黑客攻击等 , 只适合做许可型链,不能很好实现 Cypherium 非许可公链的目标,转而采用 POW+HotStuff 混合共识机制。

Cypherium CEO Sky Guo 在考虑应当使用何种共识算法进行底层公链设计的时候,他的朋友 HotStuff 算法论文的第一作者尹茂帆(Ted Yin)向其介绍了 HotStuff 协议。Sky Guo 在就 HotStuff 算法进行深入研究以后,就 Hotstuff 的设计和性能方面与尹茂帆 ( Ted Yin) 一起探讨。

最后,Sky Guo 与 Cypherium 团队敲定将会把它作为替换原来 PBFT 实现的算法,发现可以通过选举链+交易链的双链架构的模式来达到目的,即一个是 POW 机制的选举轮换链,一个基于当前验证节点形成的共识委员会交易打包链。

Cypherium 在第一个过程中选用了 PoW 机制,任何计算设备均可以通过挖矿的方式成为 Cypherium 的验证节点而不依赖于受信任的第三方。每当有矿工成功挖到 PoW 时,验证委员会当中参与次数最多的节点离开委员会,新的矿工成为验证委员,任何人无法预测选举结果,实现永久性的动态轮换。

委员会每次轮换会产生如下图所示,形成一个 Key 链。
无需许可 HotStuff 算法 CypherBFT,Cypherium 究竟如何实现 ?

由于计算难度值的动态调整使 PoW 得到验证值的时间具有不可预测性,我们将该 Key 链定义为慢链(平均 2 分钟才产生一个块),只记录共识委员会或 Leader 更换事件。

Key 区块得到确认后,在属于该 Key 区块的共识验证节点在 Leader 的带领下参与交易打包的共识处理 , 形成如下图所示的 V1、V2、V3、V4、V5 视图:无需许可 HotStuff 算法 CypherBFT,Cypherium 究竟如何实现 ?

这些视图连起来形成又一条链,我们定位为交易链,由于不再需要进行 Pow 计算,每个视图的确认只需要得到共识委员会的聚合签名验证即可,因此出块速度非常快,每秒最高处理可达 5000 个交易以上。

值得注意的是上面所说的 Key 链和交易链实际上是在 HotStuff 算法上的一条连续链,如下图示:
无需许可 HotStuff 算法 CypherBFT,Cypherium 究竟如何实现 ?

当普通节点 Pow 挖到矿后,广播给当前所有的验证节点,由当前视图中的第二个 Leader 发起 View Change,并且将 图 2 中的 Cmd 部分的 type =key, 表示需要提请验证节点的换届处理,当走完图 2 中的 DECIDE 后,产生新的 View,该 View 需要记录当前共识所有验证节点的身份信息(如 public key、IP 等),为节省存储空间和查找方便,将该信息独立保存为 Key 链,同时也记录在交易链上,交易链的所有 Cmd type=tx 以有别于换届处理。

验证者接收来自客户端的交易,并通过一个共享的 txpool 协议来彼此共享这些事务。在每轮交易打包中,都有一个验证者会扮演领导者(leader)的角色,并提出一个事务区块来扩展一个包含完整的以前事务历史的经认证的区块序列。

验证者接收提议的区块并检查其投票规则,以确定是否应投票支持,如果验证者打算为这个区块投票,它将执行该区块的事务,而不受外部影响。

然后这个验证者发送一个为这个区块和数据库验证人进行的投票给 leader,leader 收集到这些投票后,形成一个法定人数证书(quorum certificate (QC))。
无需许可 HotStuff 算法 CypherBFT,Cypherium 究竟如何实现 ?

这个 QC 为这个区块提供得到 2f +1 投票的证据,并将该 QC+区块数据广播给所有验证者。当满足连续的 Three-chain 提交规则时,区块就会被提交。如果在第 k 轮有 QC,并且在第 k + 1 轮和第 k + 2 轮有两个区块和 QC 确认,则区块被提交。

提交规则最终允许诚实的验证者提交一个区块。Cypherium 链保证所有诚实的验证者最终都将提交该区块。一旦提交了一个区块序列,执行事务所产生的状态就可以持续下去并形成一个复制的数据库。

每个验证节点都内置一个 PaceMaker,用来记录每个流程(prepare,pre-commit,commit,decide) 之间的时间差异,如果出现 timer out 则立即发 view change 给新 Leader, 如果新 Leader 没反应,就发给再下一个 Leader。

传统的 PBFT 的 view change 是 O(n^2) 消息复杂度,也就是说,所有的诚实节点在 View 换届之前会确认所有的诚实节点确实都进行到下一个 view。

Hotstuff 非常新意把传统 BFT 的两轮共识变成了三轮,然后借此把 view change 的 cost 变成了 O(n),view change 不需要等「我知道其他人也知道 view change 了」这件事就可以进行自我 Change,于是,消息复杂度就降到了 O(n),也就是说,只要诚实节点直接发 view change 给新的 leader 开始 view change。

view change 完成后,Cyperium 链会记录相应 QC 和换届的结果,形成一个新的 Key 区块,并在新的共识委员会下继续如上所述的重复处理。