因科研任务的需要,日常在文献阅读时做一些学习笔记,索性将自己看过的一些学术论文做点翻译梳理工作,略去不必要的细节,把核心内容展示出来,方便讨论交流和巩固记忆。
0 论文摘要
这篇论文介绍了一种称为DAG-Rider的区块链共识方案,它设计了一个异步拜占庭原子广播协议,具有后量子安全,能保证所有提案的值最终都能传递到网络参与者中。该方案构建了两层协议:在第一层中,参与者可靠地进行消息广播,并将通信内容构建结构化的有向无环图;在第二层中,参与者观察本地存储的有向无环图,在无需额外通信的前提下对所有提案进行全局排序。
1 背景介绍
这篇论文的作者们在引言上没有什么多余的废话。首先,拜占庭状态机副本(State Machine Replication, SMR)是一个有大量研究的问题,其实就是在指定参与者集合中实现能容忍拜占庭错误的共识协议。然后,最近几年的研究抓住了区块链系统的需求,因为区块链技术需要构建在共识协议的基础之上。所以这篇论文尤其关注经典的拜占庭原子广播(Byzantine Atomic Broadcast, BAB)问题,它面临在拜占庭错误下将任一消息正确地传递到所有参与者。
对于拜占庭共识问题的异步协议,作者们认为最近的一些工作过于复杂和消耗过多,不适用于在真实环境下作为状态机副本的解决方案。其中,提到了VABA和Dumbo两种方案,在可靠性、通信复杂度和时间复杂度上都做了很好的优化。顺着这条研究思路,这篇论文提出了DAG-Rider方案,方案分为通信层和排序层。在通信层中,参与者可靠地广播他们的提案消息构建一个有向无环图(Directed Acyclic Graph, DAG),每一轮消息广播的通信复杂度为O(n)。在排序层,参与者观察本地的图结构,利用一些随机化的方法对所有传递的消息进行排序。
论文中介绍了所提方案与其他方案的结合可以在通信复杂度和时间复杂度上实现何种不同的优化,但我更关心这篇论文究竟是怎样构造DAG和决定共识的,所以我略过这部分直接看方案设计。
2 系统模型
系统包含由 n n n个参与者组成的集合 Π = { p 1 , . . . , p n } \Pi = \{p_1,...,p_n\} Π={p1,...,pn}构成,有最多 f < n / 3 f < n/3 f<n/3个参与者可以执行任意动作,即拜占庭节点,为了简化模型考虑 n = 3 f + 1 n=3f+1 n=3f+1。假设任意两个参与者之间的连接是可靠的,也就是说当一个忠诚的参与者发送消息给另一个忠诚的参与者时,消息最终都能传递到并且接收者能验证发送者的身份。
系统依靠可靠广播协议和全局完美掷币两个模块构建,形式化描述如下:
2.1 可靠广播协议
可靠广播实现了一种在异步网络模型下的通信协议,已知的算法例如Bracha广播。形式化地,参与者 p k p_k pk 通过调用函数 r _ b c a s t k ( m , r ) r\_bcast_k(m,r) r_bcastk(m,r)发送消息,其中 m m m是消息内容, r r r是当前轮数, p k p_k pk是对应的调用 r _ b c a s t k ( m , r ) r\_bcast_k(m,r) r_bcastk(m,r)的参与者。可靠广播协议应包含以下属性:
- 一致性:如果一个忠诚的参与者 p i p_i pi输出 r _ d e l i v e r i ( m , r , p k ) r\_deliver_i(m,r,p_k) r_deliveri(m,r,pk),那么其他忠诚的参与者 p j p_j pj最终输出 r _ d e l i v e r j ( m , r , p k ) r\_deliver_j(m,r,p_k) r_deliverj(m,r,pk)的概率为 1 1 1。
- 完整性:对于每一轮 r ∈ N r \in \mathbb{N} r∈N和参与者 p k ∈ Π p_k \in \Pi pk∈Π,一个忠诚的参与者 p i p_i pi,无论消息内容 m m m,最多输出一次 r _ d e l i v e r i ( m , r , p k ) r\_deliver_i(m,r,p_k) r_deliveri(m,r,pk)。
- 有效性:如果一个忠诚的参与者 p k p_k pk调用函数 r _ b c a s t k ( m , r ) r\_bcast_k(m,r) r_bcastk(m,r) ,那么每个忠诚的参与者 p j p_j pj最终输出 r _ d e l i v e r j ( m , r , p k ) r\_deliver_j(m,r,p_k) r_deliverj(m,r,pk)的概率为 1 1 1。
2.2 全局完美掷币
全局完美掷币能让敌手无法预测结果,令一个实例 w ∈ N w \in \mathbb{N} w∈N(可以理解为某一次掷币的代号,对应到论文方案中是由某几轮组成的波),掷币过程由参与者 p i ∈ Π p_i \in \Pi pi∈Π调用函数 c h o o s e _ l e a d e r i ( w ) choose\_leader_i(w) choose_leaderi(w)得到某个参与者 p j ∈ Π p_j \in \Pi pj∈Π,该过程包含以下属性:
- 一致性:如果两个忠诚的参与者调用分别调用函数 c h o o s e _ l e a d e r i ( w ) choose\_leader_i(w) choose_leaderi(w)和 c h o o s e _ l e a d e r j ( w ) choose\_leader_j(w) choose_leaderj(w),且分别返回了 p 1 p_1 p1和 p 2 p_2 p2,那么有 p 1 = p 2 p_1=p_2 p1=p2。
- 停止性:如果有至少 f + 1 f+1 f+1个参与者调用函数 c h o o s e _ l e a d e r ( w ) choose\_leader(w) choose_leader(w),那么最终都会得到返回值。
- 不可预测性:只要少于 f + 1 f+1 f+1个参与者调用函数 c h o o s e _ l e a d e r ( w ) choose\_leader(w) choose_leader(w),则其返回值与一个随机数在可忽略的概率下不可区分。
- 公平性:该掷币过程是公平的,即 ∀ w ∈ N , ∀ p j ∈ Π : P r [ X w = p j ] = 1 / n \forall w \in \mathbb{N}, \forall p_j \in \Pi: Pr[X_w=p_j]=1/n ∀w∈N,∀pj∈Π:Pr[Xw=pj]=1/n。
3 DAG-Rider方案
论文要解决的问题是拜占庭原子广播,即允许参与者对一组消息序列达成一致。根据FLP不可能定理的结论,BAB问题无法在异步环境下得到确定性的解决,因此需要引入全局完美掷币来保证系统活性。论文对BAB问题给出了形式化定义如下:
定义(拜占庭原子广播):每个忠诚的参与者 p i ∈ Π p_i \in \Pi pi∈Π调用 a _ b c a s t i ( m , r ) a\_bcast_i(m,r) a_bcasti(m,r)并且输出 a _ d e l i v e r i ( m , r , k ) a\_deliver_i(m,r,k) a_deliveri(m,r,k),其中 p k ∈ Π p_k \in \Pi pk∈Π。拜占庭原子广播协议满足可靠广播协议一致性、完整性和有效性的同时,还需要满足:
- 全排序:如果一个忠诚的参与者 p i p_i pi在输出 a _ d e l i v e r i ( m ′ , r ′ , k ′ ) a\_deliver_i(m',r',k') a_deliveri(m′,r′,k′)之前输出 a _ d e l i v e r i ( m , r , k ) a\_deliver_i(m,r,k) a_deliveri(m,r,k),那么不会有忠诚的参与者 p j p_j pj在输出 a _ d e l i v e r j ( m ′ , r ′ , k ′ ) a\_deliver_j(m',r',k') a_deliverj(m′,r′,k′)时没有先输出 a _ d e l i v e r j ( m , r , k ) a\_deliver_j(m,r,k) a_deliverj(m,r,k)。
3.1 DAG构建
对于每个参与者 p i p_i pi,将它对于DAG的本地视图表示为 D A G i DAG_i DAGi,并存储为一个数组 D A G i [ ] DAG_i[] DAGi[]。对于给定的某一轮 r r r, D A G i [ r ] DAG_i[r] DAGi[r]表示为参与者 p i p_i pi在轮 r ∈ N r \in \mathbb{N} r∈N的所有区块的集合。任意区块 v v v有两个出度边集合,一个是至少 2 f + 1 2f+1 2f+1条强边的集合,另一个是至多 f f f条弱边的集合。其中,强边指向第 r − 1 r-1 r−1轮的区块,弱边指向 r ′ < r − 1 r' < r-1 r′<r−1轮的那些区块 v v v无法抵达的区块。
系统关键数据结构包括区块v
,图结构DAG[]
,区块提案队列blocksToPropose
:
struct vertex v:
v.round // 区块所在的轮数
v.source // 区块的发送者
v.block // 区块内容
v.strongEdges // 强边指向的区块集合
v.weakEdges // 弱边指向的区块集合
DAG[] // 区块集合构成的有向无环图
DAG_i[0] <- 硬编码产生的创世区块
DAG_i[j] <- {}
blocksToPropose // 一个空队列,交易打包成区块写入到该队列中
相应地,定义了两个检测路径的函数: p a t h ( v , u ) path(v,u) path(v,u),检查DAG中是否有一条由强边和弱边组成的路径可以从区块 v v v回溯到区块 u u u。 s t r o n g _ p a t h ( v , u ) strong\_path(v,u) strong_path(v,u),检查DAG中是否有一条只由强边组成的路径可以从区块 v v v回溯到区块 u u u。在此基础上,DAG构建算法在论文的算法2中给出了伪代码描述。
参与者在等待本轮有至少 2 f + 1 2f+1 2f+1个区块后(见第10行)进入下一轮,创建一个新区块并广播,继续等待其他参与者广播的区块。其中,每4轮将被划分为一个波(wave),每个波的第1轮将通过全局完美掷币选出一个领导区块,用于最终的全局排序。
3.2 异步BAB协议
参与者 p i p_i pi将本地的图 D A G i DAG_i DAGi划分为波,每个波由4个连续的轮组成,例如参与者 p i p_i pi的第一个波由 D A G i [ 1 ] DAG_i[1] DAGi[1], D A G i [ 2 ] DAG_i[2] DAGi[2], D A G i [ 3 ] DAG_i[3] DAGi[3]和 D A G i [ 4 ] DAG_i[4] DAGi[4],轮的区块集合组成,波 w w w的第 k k k轮可以定义为 r o u n d ( w , k ) = 4 ( w − 1 ) + k round(w,k)=4(w-1)+k round(w,k)=4(w−1)+k。参与者 p i p_i pi在产生的每个波 w w w中寻找第1轮里的领导区块 v v v,如果该领导区块满足在当前波 w w w的第4轮里有至少 2 f + 1 2f+1 2f+1个区块可以通过强路径回溯到它,则提交该领导区块。判断条件形式化如下:
∣ { v ′ ∈ D A G i [ r o u n d ( w , 4 ) ] : s t r o n g _ p a t h ( v ′ , v ) } ∣ ≥ 2 f + 1 |\{v' \in DAG_i[round(w,4)]:strong\_path(v',v)\}| \geq 2f+1 ∣{v′∈DAGi[round(w,4)]:strong_path(v′,v)}∣≥2f+1
如果上述条件没有在当前波中完成,则参与者继续向前生成的新的波,直到新的波中有第1轮里的领导区块被提交,则之前的能通过强路径回溯到的所有领导区块,可以按创建的先后顺序依次提交。下图展示了区块 v 2 v_2 v2作为波2的领导区块,在波3的领导区块 v 3 v_3 v3被提交时才完成提交。
异步BAB协议的算法伪代码描述如下,注意到函数 w a v e _ r e a d y ( w ) wave\_ready(w) wave_ready(w)是在新的波前进到第4轮时会被调用,来判断当前波中选取的第1轮领导区块是否获得了第4轮超过 2 f + 1 2f+1 2f+1个区块的强路径回溯,产生共识结果。如果当前波未能满足共识条件,则直接跳过该波不做处理(见第37行);如果当前波满足条件,则将当前波的领导区块(见第38行)以及未完成共识的之前波的可通过强路径回溯的领导区块(见第42行)一起加入到栈变量中,通过调用排序函数(见第51行)产生共识结果。
4 正确性分析
论文主要通过两个关键的引理来阐述DAG-Rider方案的正确性。
- 引理1:如果某个参与者 p i p_i pi提交了波 w w w的领导区块 v v v,那么对于任意波 w ′ > w w' > w w′>w的领导区块 u u u和任意参与者 p j p_j pj,其中 u ∈ D A G j [ r o u n d ( w ′ , 1 ) ] u \in DAG_j[round(w',1)] u∈DAGj[round(w′,1)],区块 u u u能通过强路径回溯到区块 v v v,即 s t r o n g _ p a t h ( u , v ) = 1 strong\_path(u,v)=1 strong_path(u,v)=1。
该引理主要由算法第36行的条件判断所满足,在第4轮有至少 2 f + 1 2f+1 2f+1个区块可以通过强路径回溯到区块 v v v,下一个波的第1轮的任意区块都引用了至少 2 f + 1 2f+1 2f+1个上一个波的第4轮的区块,除去拜占庭错误的 f f f个恶意区块和最多 f f f个不可回溯到区块 v v v的忠诚区块,下一波的第1轮的任意区块都至少有一条强路径可回溯到区块 v v v,因此引理满足。
- 引理2:令某个忠诚参与者 p i p_i pi完成了波 w w w,第1轮存在区块集合 V ⊆ D A G i [ r o u n d ( w , 1 ) ] V \subseteq DAG_i[round(w,1)] V⊆DAGi[round(w,1)],第4轮存在区块集合 U ⊆ D A G i [ r o u n d ( w , 4 ) ] U \subseteq DAG_i[round(w,4)] U⊆DAGi[round(w,4)],满足 ∣ V ∣ ≥ 2 f + 1 |V| \geq 2f+1 ∣V∣≥2f+1, ∣ U ∣ ≥ 2 f + 1 |U| \geq 2f+1 ∣U∣≥2f+1,有集合 U U U中的任意区块都能通过强路径回溯到集合 V V V中的任意区块,即 ∀ v ∈ V , ∀ u ∈ U : s t r o n g _ p a t h ( u , v ) \forall v \in V, \forall u \in U: strong\_path(u,v) ∀v∈V,∀u∈U:strong_path(u,v)。
该引理利用common-core abstraction技术实现,即在三轮所有对所有的广播和收集过程之后,在积累的消息集合中,所有忠诚的参与者都有至少 2 f + 1 2f+1 2f+1个公共的消息值,并且由这些消息组成的集合就是common-core,本方案正好可以将协议过程映射为这种技术,构造的第1轮和第4轮中存在两个集合可以通过强路径回溯,因此引理满足。
5 学习笔记
这篇论文应用了很多已有的研究结论和抽象构造,例如基于可靠广播协议延申出原子广播协议,抽象全局完美掷币实现领导区块选举,依靠公共核心抽象证明方案正确性。方案的关键创新在于有向无环图的设计并结合了拜占庭容错原理构建的共识协议,简单实用值得学习。
笔记中提到的相关文献在论文中有给出引用,感兴趣的可以去阅读原文,这里不再多余占用篇幅。最后,附上文献引用和DOI链接:
Idit Keidar, Eleftherios Kokoris-Kogias, Oded Naor, and Alexander Spiegelman. All You Need is DAG. In Proceedings of the 2021 ACM Symposium on Principles of Distributed Computing. 2021: 165–175.