区块链火爆的同时也促进了BFT共识算法的研究,近年来诞生了形形色色的BFT共识算法。
共识算法要解决的问题很简单:所有诚实节点都要维护一个一致的账本,每个节点都有一批等待上链的交易,但是同一时间只能有部分交易能够被打包成区块写入账本中,其他交易只能再次等待机会。共识算法就是要解决谁有这一轮次的记账权,哪些交易能够被打包上链。
目前有两大类主流的BFT共识算法:
- Proof of XXX类,通过证明自己付出了一定代价来获得记账权,同时引入经济因素来激励系统维持运转,引入博弈论来减少节点作恶的可能。
- 为首的就是POW,POW特点是进行hash计算直到满足难度要求,篡改账本需要难以想象的计算资源和代价(slow but safe)。篡改账本行为会导致用户抛售,币值下降,反过来抑制攻击行为。
- 其次是POS,DPOS等模型,更像是代码化的政治机制。
- filecoin的Proof of Storage,通过提供存储服务来获得收益,同时维持系统运转。
- 基于Quorum的BFT共识, 每个proposal需要2/3节点的投票:
- PBFT, 第一个可以实用的BFT共识,但通信复杂度仍然较高,系统扩展性受限。实现较为复杂。
笔者之前只了解过Raft等CFT共识算法,对BFT共识算法的了解只局限于POW。笔者偶然了解到Libra,发现Libra的共识机制基于HotStuff。又阅读了maxdeath大佬的文章, 里面有个观点很有意思:hotstuff是中本聪共识和BFT的一座桥梁,未来许多新共识算法将以HotStuff作为基石。
既然被称为未来的基石,那么当然值得一看。
·笔者粗略阅读论文,同时参考他人文章,总结出hotstuff的特点:
- Safety和Liveness解耦并模块化。Liveness相关功能被集成到称为pacemaker的模块中,在恰当时候pacemaker会通知safety模块。safety模块的实现简洁优雅,开发者更是可以自行决定如何选主、计时、如何进行view change,这使得HotStuff可能成为一种通用的拜占庭共识框架。
- HotStuff基于quorum,也就是由一个较为固定的节点集合进行投票,一节点一票。
- 通过三个阶段来提交proposal,用更大的latency换来了更简洁的view change。
- 日志之间用hash指针连接,构成防篡改日志结构,这种结构有一个优点:对区块k的确定,同时也是对区块k-1的确认,可以实现累积确认。
- 具有responsivenes,也就是出块时间与实际的网络情况相关,网络通常出块就快,网络堵塞出块就慢。相对,如BTC,以太坊等系统,采用了固定出块时间的设计;PBFT等通过两阶段提交的算法,在某些极端情况下会陷入活锁状态,必须在某个阶段等待超时才可以避免活锁,因此也丧失了responsiveness。
- 采用门限签名降低通信复杂度。无故障情况下每一个区块的提交需要O(n)的通信复杂度,达到理论最优。
- 可以通过流水线化来提高吞吐。3次通信的行为和数据结构高度相似,可以压缩为一轮通信。因此一轮通信不仅会带来新proposal,也是对前面三个节点的确认。
这么看,hotstuff果真是个尤物!
笔者同时认为hotstuff可能有一些不足:
- 门限签名需要一个可信的分布式密钥分发系统,也就是说Hotstuff的安全性一定程度依赖于某个外部系统。
- 如果Hotstuff要支持成员变更,可能需要门限签名也支持动态调整阈值,即要求所谓动态门限签名。如一个由n=3f+1的系统,其门限为2f; 增加了2n个节点后,系统总共有3n=9f+3, 如果门限仍然为2f会有安全问题,因为此时系统中可能有3f个恶意节点。
论文简洁,算法的框架描述比较清楚,无需重复说明。因此本栏将重点关注论文少有提及的方面:
- hotstuff相比它的前辈PBFT,Tendermint做了什么改进?
- hotstuff如何容错?
- libraBFT与hotstuff的差异?
- 门限签名对hotstuff的影响?
- 怎么实现一个hotstuff原型?
- hotstuff如何实现类似raft的成员变更?
