本
文
摘
要
论文地址:HotStuff: BFT Consensus in the Lens of Blockchain
HotStuff的主要特点:
通过在投票过程中引入门限签名实现了 O(n)O(n) 的消息验证复杂度。使用了流水线共识加快了共识效率。具有乐观响应性(Optimistic Responsiveness)安全性(Safety)与活性(Liveness)解耦使用限签名实现了 O(n) 的消息复杂度,在 (k−n)(k-n) 门限签名的场景下,HotStuff 的阈值 kk 取 2f+12f+1 。(节点数量 n=3f+1n=3f+1 )。使用门限签名带来的一个缺点:门限签名在生成私钥的过程是中心化的,而且集群节点数量变化的时候也需要重新生成和分配私钥。
使用门限签名实现线性复杂度这里解释一下为什么众多 BFT(Byzantine Fault Tolerance)算法的投票通过的阈值都是 2f+12f+1 :我们假设在 n=3f+1n=3f+1 的情况下,将投票通过的阈值设为 2f2f ,假设现在网络有两个提议 A 和 B ,其中有 ff 个好人只对提议 A 投票,另外 ff 个好人只对提议 B 投票,然后 ff 个坏人对两边都投票,那么提议 A 和 B 都会被通过,此时网络出现了不一致,造成了分区。所以投票通过的阈值必须设为 2f+12f+1 就能保证每次投票都至少有 f+1f+1 个好人,那么根据抽屉原理每两次投票至少有会有 11 个好人在两次都投了票,好人不会给两个冲突的提议投票,这就能保证冲突的提议永远不会通过,从而保证系统的安全性。
HotStuff在共识通信过程使用流水线共识加快共识效率,这也并非HotStuff,这在实践中很常用。原理很简单,看起来是和CPU指令流水线类似。即在 cmd1cmd_1 的 PRE-COMMIT 阶段和 cmd2cmd_2 的 PREPARE 阶段并行,cmd1cmd_1 的 COMMIT 阶段、 cmd2cmd_2 的 PRE-COMMIT 和 cmd3cmd_3 的 PREPARE 阶段并行……
三阶段的 HotStuff 具有乐观响应性,我个人对响应性的理解就是不会被阻塞,客户端发来的cmd 能够立马被处理。论文4.4有解释这个东西。
安全性(Safety)与活性(Liveness)解耦。
投票规则,当收到的新快 bnewb_{new}同时满足以下条件时replica会给primary投票,否则不投票 vheight">bnew.height>vheightb_{new}.height > vheight b_{lock}.height) ">(bnewisonthesamebrancha *** lock)or(bnew.justify.node.height>block.height)(b_{new}\ is\ on\ the\ same\ branch\ as\ b_{lock} )\ or\ (b_{new}.justify .node.height > b_{lock}.height) 执行规则,满足以下条件时会递归执行条件见标红的伪代码按照上面的规则来投票和执行就能保证系统的安全性,并且是可证明的。在实践过程中,将安全性通过如上的规则来决定,活性通过一个独立的模块起搏器(pacemaker)来保证。
工程实现
GitHub开源地址:https://github.com/hot-stuff/libhotstuff
. ├── CMakeFiles ├── doc ├── examples # 例子,里面有实现的 hotstuff,以及客户端 ├── include # HotStuff . *** 件 ├── libsecp256k1-prefix ├── salticidae # 最小异步网络通信库,也是由作者实现的 ├── scripts # 测试、部署相关脚本 ├── secp256k1 # 椭圆曲线库 ├── src # HotStuff .cpp 文件 └── testinclude 和 src 实现了事件驱动的 HotStuff 框架,依赖通信库salticidae和加密库secp256k1。 examples 包含了 hotstuff_app.cpp (共识节点)和 hotstuff_client.cpp (客户端),该部分为 HotStuff 框架的运行提供了"事件"。
hotstuff_app.cpp 主要有三个event-loop 线程/进程,req_ec、resp_ec、ec,分别负责请求的event-loop进程 、回复的event-loop进程、主event-loop进程(统计数据打点、发起pacemaker)
工程实现HotStuff 的实现基于事件驱动,多处使用了libuv库。这样做的目的是为了提升性能。 libuv库是多平台C库,提供对基于事件循环的异步I/O的支持