HotStuff:基于高效 BFT-SMR 共识的区块链

news2024/11/30 6:53:04

参考资料:

  1. Yin M, Malkhi D, Reiter M K, et al. HotStuff: BFT consensus in the lens of blockchain[J]. arXiv preprint arXiv:1803.05069, 2018.
  2. Michael J. Fischer, Nancy A. Lynch, and Mike Paterson. Impossibility of distributed consensus with one faulty process. J. ACM, 32(2):374–382, 1985.
  3. 实用拜占庭协议(PBFT 99)
  4. HotStuff共识算法详解
  5. 25种区块链共识算法全面详解
  6. 深入理解异步拜占庭共识

文章目录

  • 分布式系统
  • Basic HotStuff
    • 思路
    • 伪代码
    • Safety, Liveness, and Complexity
  • Chained HotStuff
    • 思路
    • 伪代码
  • Event-driven HotStuff

分布式系统

在分布式系统里,并发指令(不是并行)的顺序需要被各个处理器所共识。否则,并发指令顺序错乱会导致处理器状态不一致。区块链是一种分布式系统,最根本的就是共识机制,而挖矿功能一点儿也不重要。

分布式系统的共识机制要满足如下两条要求:

  1. 安全性Safety),所有正确的进程都认同同一个值。
  2. 活性Liveness),分布式系统最终会认同某一个值。

区块链的共识机制有很多,著名的有:工作量证明(PoW,竞争计算 Hash 碰撞)、权益证明(PoS,持币量和持币时长)、委任权益证明(DPoS,持币人选举 leader 投票)、拜占庭容错(例如 PBFT)、分布式一致性协议(例如 Raft,无法容忍随机错误)、容量证明(PoC,竞争解决 Memory Hard Function)、烧钱证明(PoBurn,烧毁其他币种)。

HotStuff 是一种使用 BFT SMR(拜占庭容错的状态机复制)共识机制的区块链,它利用区块链的链式特性改进了 PBFT,使得 leader failure 的通信复杂度从 O ( n 3 ) O(n^3) O(n3) 降低到了 O ( n ) O(n) O(n) 的线性复杂度。

不可能定理(FLP 1985):reaching consensus in full asynchrony with a single process crashing is impossible with a deterministic protocol,从理论上证明了在纯异步环境下不可能存在一种确定性的共识协议。为了绕过这个定理以达成共识,要么加强对网络的假设,要么引入随机源。

通信模型(communication model):

  1. synchronous:网络中发出的消息可以在已知的时间 Δ \Delta Δ 内抵达。
  2. partially synchronous:在未知的 global stabilization time (GST) 发生后,消息可以在已知的时间 Δ \Delta Δ 内抵达。
  3. Asynchronous:网络仅保证消息最终能抵达,不对到达时间做限制。

通信网络是点对点(point-to-point)、可认证(authenticated)、可靠的(reliable): one correct replica receives a message from another correct replica if and only if the latter sent that message to the former.

我们说的广播(broadcast):it involves the broadcaster, if correct, sending the same point-to-point messages to all replicas, including itself.

PBFT 是工作在 partially synchronous 网络上的 BFT SMR,要求 n ≥ 3 f + 1 n \ge 3f+1 n3f+1,这里 n n n 是状态机数量, f f f 是拜占庭错误状态机的数量上界。核心任务是对不断增长的客户指令请求的是否执行以及执行的顺序在所有 correct replica 上达成共识。

Basic HotStuff

思路

HotStuff 的工作环境和目标与 PBFT 一样,但 HotStuff 让状态机维护一颗(而不是 log 日志):

  1. 视图序号(viewNumber)不断递增,每个 view 上有唯一确定的 leader,任意 replica 都根据 L E A D E R ( v i e w N u m b e r ) LEADER(viewNumber) LEADER(viewNumber) 计算当前 leader
  2. 每个 replica 都在本地维护一棵树(a tree of pending commands),每个 node 都恰好对应一个 viewNumber,由对应的 leader 提交
  3. 节点 node 包含:客户的(一批)指令、共识协议的元数据(matedata)、父指针(parent link)
  4. 分支 branch 是指,从一个节点 node 根据 parent link 一直返回到 root 的路径
  5. 分支 branch 单调增长,并在协议中经过 prepare、pre-commit、commit 三个阶段后被提交
  6. 在每个阶段里,leader 需要收集 a quorum of n − f n-f nf replicas 的投票,来形成 quorum certificate(QC)
  7. HotStuff 使用 ( k ,   n ) (k,\, n) (k,n) threshold signature scheme(门限签名),仅当收集到了 ∣ I ∣ = k = 2 f + 1 |I| = k=2f+1 I=k=2f+1partial signature ρ i ← t s i g n i ( m ) \rho_i \leftarrow tsign_i(m) ρitsigni(m),才可以组合出合法签名 σ ← t c o m b i n e ( m , { ρ i } i ∈ I ) \sigma \leftarrow tcombine(m,\{\rho_i\}_{i \in I}) σtcombine(m,{ρi}iI),使得它满足 t v e r i f y ( m , σ ) = 1 tverify(m,\sigma)=1 tverify(m,σ)=1

在这里插入图片描述

与 PBFT 不同的是,HotStuff 每次结束三阶段,都会切换视图。它的 three phase 如下:

  1. prepare phase:新的 leader 收集 n − f n-f nf 个 NEW-VIEW 消息,找出其中有最高视图的 p r e p a r e Q C prepareQC prepareQC,作为自己的 h i g h Q C highQC highQC,然后在对应的区块 node 上延长分支 c r e a t e L E A F createLEAF createLEAF(叶子上包含客户指令),广播 prepare 消息(包括 leader 自己)以发布提案(Proposal)。各个 replica(包括 leader 自己)根据 s a f e N o d e safeNode safeNode 谓词,判断是否对此提案投赞同票(仅发消息给 leader)。
  2. pre-commit phase:若 leader 收集到了 n − f n-f nf 个 prepare votes,那么可以形成 p r e p a r e Q C prepareQC prepareQC 证书,广播 pre-commit 消息。各个 replica 接收到后(此时可确认大多数 correct replica 赞同延长分支),设置本地状态 p r e p a r e Q C prepareQC prepareQC,然后投票。
  3. commit phase:若 leader 收集到了 n − f n-f nf 个 pre-commit votes,那么可以形成 p r e c o m m i t Q C precommitQC precommitQC 证书,广播 commit 消息。各个 replica 接收到后(此时可确认大多数 correct replica 都已知道“大多数 correct replica 赞同延长分支”这件事),设置本地状态 l o c k e d Q C lockedQC lockedQC,然后投票(同意提交提案)。
  4. decide phase:若 leader 收集到了 n − f n-f nf 个 commit votes,那么可以形成 c o m m i t Q C commitQC commitQC 证书,广播 decide 消息。各个 replica 接收到后(此时确认大多数 correct replica 都同意提交这个提案,这个分支成为 committed branch),执行叶子上的客户指令。然后,各个 replica 执行视图切换。
  5. nextView interrupt:如果等待超时,那么会执行视图切换中断(interrupt),直接切换视图。向下一视图的 leader 发送 new-view 消息,携带本地的 prepaeQC 以辅助 new leader 识别出当前最高视图的 prepare 区块。

在这里插入图片描述

为了达成共识,HotStuff 设置的 safeNode predicate 如下​:

  1. Safety rule: the branch of m . n o d e m.node m.node extends from the currently locked node l o c k e d Q C . n o d e lockedQC.node lockedQC.node(正确的 replica 仅认可在 本地的已锁定节点的所在分支 的链增长,敌手无法使系统共识另一条冲突的链)
  2. Liveness rule: the replica will accept m m m if m . j u s t i f y m.justify m.justify has a higher view than the current l o c k e d Q C lockedQC lockedQC(正确的 replica 仅接受 比本地的已锁定节点的视图更高 的证书,敌手无法使系统共识更短的链)

伪代码

一些基本的功能:
在这里插入图片描述在这里插入图片描述

三阶段的共识协议:
在这里插入图片描述在这里插入图片描述在这里插入图片描述

每当 timer 超时,就会执行 new-view 中断,此时将等待时间翻倍。由于通信系统是部分同步的,因此总会使得等待时间足够长,足以接收到其他 replica 发出的消息。 L e a d e r ( ⋅ ) Leader(\cdot) Leader() 是任意的确定性算法,只要保证全部的 replica 都可以轮转成为 next leader。

Safety, Liveness, and Complexity

我们说两个 branch 是冲突的conflicting),如果两者都不是对方的扩展(neither one is an extension of the other)。我们说两个 node 是冲突的,如果它们引导的 branch 是冲突的。

分布式系统中的 n n n 个 replica 各自维护本地的树,其中的 n − f = 2 f + 1 n-f=2f+1 nf=2f+1 个 correct replica 维护着基本相同(除了最后的若干格区块)的树。在三阶段协议中,correct replica 仅对 存在于本地树上的拥有最高视图序号的 p r e p a r e Q C prepareQC prepareQC 证书的节点的后继分支上的安全的叶子 投赞同票。

  • Safety
    • 对于任意有效的 q c 1 ,   q c 2 qc_1,\, qc_2 qc1,qc2,其中 q c 1 . t y p e = q c 2 . t y p e qc_1.type = qc_2.type qc1.type=qc2.type,并且 q c 1 . m o d e qc_1.mode qc1.mode q c 2 . n o d e qc_2.node qc2.node 冲突,那么必然有 q c 1 . v i e w N u m b e r ≠ q c 2 . v i e w N u m b e r qc_1.viewNumber \neq qc_2.viewNumber qc1.viewNumber=qc2.viewNumber
    • 如果 w ,   b w,\, b w,b 是冲突的节点,那么在任何的 correct replica 上,它们不会被同时 commit
  • Liveness
    • 如果一个 correct replica 锁定在了 l o c k e d Q C = p r e c o m m i t Q C lockedQC = precommitQC lockedQC=precommitQC 上,那么至少有 f + 1 f+1 f+1 个 correct replica 对匹配 l o c k e d Q C lockedQC lockedQC 的一些 p r e p a r e Q C prepareQC prepareQC 投了赞同票
    • 在 GST 后,存在一个有界时间段(bounded time period T f T_f Tf,使得:如果所有的 correct replica 在时间段 T f T_f Tf 中,都同时停留在视图 v v v 里,并且视图 v v v 的 leader 是正确的,那么将会达成 decision
    • The protocol is Optimistically Responsive(最优响应性)
  • Complexity
    • 在 HotStuff 协议中,身份认证是最耗时的,replica 在每次投票时都需要附加上自己的签名。在每个阶段,需要 O ( n ) O(n) O(n) 次签名。
    • 协议一共有常数阶段,因此总的复杂度为 O ( n ) O(n) O(n)

Chained HotStuff

思路

观察到 Basic HotStuff 中各个阶段的消息都十分相似。作者提出了链式的协议,在每个 prepare phase 都切换视图,从而每个提案都对应唯一属于自己的视图。这减少了消息类型,同时可以流水化作业。

在 Chained HotStuff 中,使用 g e n e r i c Q C genericQC genericQC 取代所有的其他证书,各个阶段度被 generic-phase 取代。因此,只需要两种类型的消息:new-view 消息、generic 消息。

在视图 v v v 上的 generic-phase,它对应于 Basic Hotstuff 里的:

  1. 视图 v v v 上提案的 prepare 阶段, g e n e r i c Q C genericQC genericQC 是其 h i g h Q C highQC highQC
  2. 视图 v − 1 v-1 v1 上提案的 pre-commit 阶段, g e n e r i c Q C genericQC genericQC 是其 p r e p a r e Q C prepareQC prepareQC
  3. 视图 v − 2 v-2 v2 上提案的 c o m m i t commit commit 阶段, g e n e r i c Q C genericQC genericQC 是其 l o c k e d Q C lockedQC lockedQC
  4. 视图 v − 3 v-3 v3 上提案的 decide 阶段, g e n e r i c Q C genericQC genericQC 是其 c o m m i t Q C commitQC commitQC

在这里插入图片描述

在 Chained HotStuff 中,节点 b b b 的高度被设置为对应提案的视图序号 v v v,它的 parent 是视图 v − 1 v-1 v1 的节点。如果视图 v v v 上的 leader 没能收集出 g e n e r i c Q C genericQC genericQC(提交的提案不安全、leader 崩溃、通信延迟),那么这个节点就成为了哑结点Dummy nodes),使得 b . j u s t i f y . n o d e ≠ b . p a r e n t b.justify.node \neq b.parent b.justify.node=b.parent,也就是 p r e p a r e Q C prepareQC prepareQC 并不指向它的 parent 节点。

上图中, b ∗ . j u s t i f y . n o d e = b ∗ . p a r e n t = b ′ ′ b^*.justify.node = b^*.parent = b'' b.justify.node=b.parent=b′′,我们说 b ∗ b^* b 形成了 One-Chain,此时要更新本地状态 g e n e r i c Q C ← b ∗ . j u s t i f y genericQC \leftarrow b^*.justify genericQCb.justify(因为 b ∗ . j u s t i f y b^*.justify b.justify 是节点 b ′ ′ b'' b′′ 的提案的 p r e p a r e Q C prepareQC prepareQC

同时, b ′ ′ . j u s t i f y . n o d e = b ′ ′ . p a r e n t = b ′ b''.justify.node = b''.parent = b' b′′.justify.node=b′′.parent=b,我们说 b ∗ b^* b 形成了 Two-Chain,此时要更新本地状态 l o c k e d Q C ← b ′ ′ . j u s t i f y lockedQC \leftarrow b''.justify lockedQCb′′.justify(因为 b ′ ′ . j u s t i f y b''.justify b′′.justify 是节点 b ′ b' b 的提案的 p r e c o m m i t Q C precommitQC precommitQC

而且, b ′ . j u s t i f y . n o d e = b ′ . p a r e n t = b b'.justify.node = b'.parent = b b.justify.node=b.parent=b,我们说 b ∗ b^* b 形成了 Three-Chain,此时要执行客户指令 b . c m d b.cmd b.cmd(因为 b ′ . j u s t i f y b'.justify b.justify 是节点 b b b 的提案的 c o m m i t Q C commitQC commitQC

伪代码

在这里插入图片描述在这里插入图片描述

Event-driven HotStuff

文章中还将 Chained HotStuff 转化为了 event-driven-style(事件驱动风格)。就是添加了一个起搏器(Pacemaker),代替 next leader 在 generic phase 的最后等待和收集 g e n r i c Q C genricQC genricQC

我没细看,但它不会单点失败么?比如起搏器 crash fault 了(非拜占庭错误),或者成为 corrupt 节点(随机错误)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/3145.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为什么网络安全缺口很大,而招聘却很少?

2020年我国网络空间安全人才数量缺口超过了140万,就业人数却只有10多万,缺口高达了93%。这里就有人会问了: 1、网络安全行业为什么这么缺人? 2、明明人才那么稀缺,为什么招聘时招安全的人员却没有那么多呢&#xff1…

Spring-security流程讲解01:basic模式

1&#xff1a;有basic模式认证&#xff1a; 1.0Maven依赖&#xff1a; <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.1.RELEASE</version> </parent…

UGUI DrawCall的优化 工作记录

优化前&#xff1a; UGUI DrawCall调用256次 优化原则&#xff1a; 不追求极致&#xff0c;差不多就行了主要优化 静态不动的节点&#xff0c;避免改变脚本 优化思路&#xff1a; 3. 对现有的图集进行微调 4. 处理图文混排 打断合批的问题&#xff0c;微调节点的父子关系和节…

图解LeetCode——754. 到达终点数字(难度:中等)

一、题目 在一根无限长的数轴上&#xff0c;你站在 0 的位置。终点在 target 的位置。 你可以做一些数量的移动 numMoves : 每次你可以选择向左或向右移动。第 i 次移动&#xff08;从 i 1 开始&#xff0c;到 i numMoves &#xff09;&#xff0c;在选择的方向上走 i 步。…

vue11Vuex解说+子父传参详细使用

目录 1. vue组件间通讯 1.1 父子组件 1.2 消息总线 1.3 vuex 2. vuex使用 2.1 简介 2.2 安装 2.3 创建store模块 2.4 创建vuex的store实例并注册上面引入的各大模块 2.5 在main.js中导入vuex 3. 将折叠和展开效果使用vuex实现 3.1 在state.js中声明全局参数 3.2 设…

10 月更新 | Visual Studio Code Python

我们很高兴地宣布&#xff0c;2022 年 10 月发布的适用于 Visual Studio Code Python 和 Jupyter 扩展现已推出&#xff01; 此版本包括以下改进&#xff1a; 使用新的创建环境命令简化项目设置 现在可以为 Pylance 提供包含、排除和忽略路径设置 预发布的 autopep8 扩展 P…

【Linux】yum和vim的使用

文章目录一、Linux软件包管理器-yum1. 概念2. 安装软件3. 卸载软件4. 查看软件包5. 更新软件包二、Linux编辑器-vim1. 基本概念2. 基本操作3. 正常模式命令集4. 末行模式命令集三、总结一、Linux软件包管理器-yum 1. 概念 什么是软件包&#xff1f; 在Linux下安装软件, 一个常…

es实操笔记

Elasticsearch提供了一个非常全面和强大的REST API&#xff0c;可以使用它与集群进行交互。咱们来玩一下。 环境搭建 搭建好es和kinaba&#xff0c;可以访问通过ip:9200查看es的信息&#xff0c;ip:5601打开kinaba。 集群相关 健康检查 curl localhost:9200/_cat/health?v…

Linux 网络之netlink 简介

文章目录前言一、Netlink用户态应用的使用1.1 Netlink socket1.2 Netlink宏操作二、Netlink对应数据结构2.1 struct sockaddr_nl2.2 struct nlmsghdr2.3 struct msghdr三、用户层实例参考资料前言 The Netlink socket family 是一个 Linux 内核接口&#xff0c;用于内核和用户…

网课查题接口

网课查题接口 本平台优点&#xff1a;免费查题接口搭建 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a;题库后台http://daili.jueguangzhe.cn/ 题库后台&am…

[前端基础] CSS3 篇

CSS3 使用了层叠样式表技术&#xff0c;可以对网页布局、字体、颜色、背景灯效果做出控制。CSS3 作为 CSS 的进阶版&#xff0c;拆分和增加了盒子模型、列表模块、语言模块 、背景边框 、文字特效 、多栏布局等等。CSS3 的改变有很多&#xff0c;增加了文字特效&#xff0c;丰富…

C#基础知识

文章目录简介隐式显式转换ifswitch循环随机数方法do whilestatic递归数组foreachvar推断类型,父类二维数组&#xff0c;交错数组当方法参数类型确定&#xff0c;个数不确定时数据类型类型分类快捷方式函数参数&#xff1a;引用、输出参数装箱&#xff0c;拆箱string储存地址枚举…

Netty入门——组件(Channel)二

目录一、channel的主要作用二、EventLoop处理io任务代码示例2.1、服务端代码示例2.2、客户端代码示例2.3、服务端和客户端查看控制台输出结果三、CloseFuture关闭问题代码示例3.1、服务端代码示例3.2、客户端代码示例3.3、服务端和客户端查看控制台输出结果3.4、CloseFuture关闭…

【C++ STL】-- deque与vector相比的优势与劣势

目录 deque容器 与stack相比deque的优缺点&#xff1a; deque的迭代器 deque的成员函数 deque容器 deque的相关文档 deque与vector十分的相识。vector是单向开口的连续线性空间&#xff08;单向扩容&#xff09;&#xff0c;deque则是一种双向开口的连续线性空间&#xff…

GIC/ITS代码分析(9)中断应用实例之IPI中断

PPI中断为外设私有中断&#xff0c;在ARM64上arch_timer为PPI中断。这里以arch_timer为例&#xff08;代码位置drivers/clocksource/arm_arch_timer.c&#xff09;&#xff0c;作应用实例讲解。 先对ARM64通用定时器作简要介绍。通用定时器为Arm core提供标准定时器。通用定时器…

VSCode下载安装与使用教程

目录1. 打开官网进行下载安装2. 下载3. 安装4. 使用4.1 python extensions4.2 建立 python 工作区4.3 运行python代码的 3 种方法方法一&#xff1a;点击按钮方法二&#xff1a;右键菜单方法三&#xff1a;交互式解释器5. debug参考资料VSCode是一款免费开源的现代化轻量级代码…

【C++修炼之路】8. string类详解

每一个不曾起舞的日子都是对生命的辜负 C之string类本节目标1. string类概览1.1 string的由来1.2 string函数列表2.string常用接口1. 初始化2. string::npos3. c_str()4. 获取长度&#xff08;length、size)5. 容量&#xff08;size、capacity)6. 插入&#xff08;insert)7. 替…

牛客网-《刷C语言百题》第三期

✅作者简介&#xff1a;嵌入式入坑者&#xff0c;与大家一起加油&#xff0c;希望文章能够帮助各位&#xff01;&#xff01;&#xff01;&#xff01; &#x1f4c3;个人主页&#xff1a;rivencode的个人主页 &#x1f525;系列专栏&#xff1a;《C语言入门必刷百题》 &#x…

【HTML5期末大作业】制作一个简单HTML我的班级网页(HTML+CSS+JS)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

微信小程序 |从零实现酷炫纸质翻页效果

&#x1f4cc;个人主页&#xff1a;个人主页 ​&#x1f9c0; 推荐专栏&#xff1a;小程序开发成神之路 --【这是一个为想要入门和进阶小程序开发专门开启的精品专栏&#xff01;从个人到商业的全套开发教程&#xff0c;实打实的干货分享&#xff0c;确定不来看看&#xff1f; …