YOUChain Research
YOUChain 研究团队,成员毕业于国内外顶级名校,有长期的工业界经验。我们持续跟踪的区块链学界和业界的前沿发展,致力于深入区块链本质,推动学术和技术发展。团队诚邀加密、算法、区块链、工程人才加入!
本文来自 yipast@YOUChainResarch
上一篇文章中我们讨论了Algorand共识算法的设计原理,它每一轮的共识流程可简短的描述如下:
-
随机选择一个leader来提议一个新区块;
-
随机选择节点组成委员会,对leader提议的新区块达成Byzantine共识;委员会成员对达成共识的区块进行数字签名。
Algorand的论文中详细描写了两个协议实例, A l g o r a n d 1 ′ Algorand_1' Algorand1′、 A l g o r a n d 2 ′ Algorand_2' Algorand2′ 。这两个实例在两方面拥有极大的区别:
-
对委员会中诚实用户数量的要求不同。
-
A l g o r a n d 1 ′ Algorand_1' Algorand1′ :委员会中至少 2/3 成员是诚实的。
-
A l g o r a n d 2 ′ Algorand_2' Algorand2′ :委员会中诚实成员数总是 ⩾ t H \geqslant t_H ⩾tH(一个固定的阈值),而至少 2/3 成员诚实的概率极大。
-
-
达成Byzantine共识所需要的步骤数不同。
-
A l g o r a n d 1 ′ Algorand_1' Algorand1′ :达成共识所需要的步骤很大概率下是固定的。
-
A l g o r a n d 2 ′ Algorand_2' Algorand2′ :达成共识所需要的步骤数可以是任意的,一般比 A l g o r a n d 1 ′ Algorand_1^\prime Algorand1′ 花费的时间短。
-
通过这两个基本的实例,可以演化出其他的变体。下面我们先说明这两个算法的详细内容,再进行分析。
一、 A l g o r a n d 1 ′ Algorand'_1 Algorand1′ 协议
为了保证安全,节点 i i i 使用它的长期公私钥对来生成它的凭证 σ i r , s \sigma_i^{r,s} σir,s,但使用临时公私钥对 ( p k i r , s , s k i r , s ) (pk_i^{r,s},sk_i^{r,s}) (pkir,s,skir,s) 来签名消息。
为了简单起见,使用 e s i g i ( x ) ≜ s i g p k i r , s ( x ) esig_i(x) \triangleq sig_{pk_i^{r,s}}(x) esigi(x)≜sigpkir,s(x) 来表示节点 i i i 在第 r r r 轮的 s s s 步用私钥对 x x x 签名,即 E S I G i ( x ) ≜ S I G p k i r , s ( x ) ≜ ( i , m , e s i g i ( m ) ) ESIG_i(x) \triangleq SIG_{pk_i^{r,s}}(x) \triangleq (i,m,esig_i(m)) ESIGi(x)≜SIGpkir,s(x)≜(i,m,esigi(m)) 。
Step 1: Block Proposal
节点 i ∈ P K r − k i \in PK^{r-k} i∈PKr−k 只要拥有 B r − 1 B^{r-1} Br−1,可以用来计算出 Q r − 1 Q^{r-1} Qr−1,就开始了它第 r r r 轮的Step 1。
-
节点 i i i 使用 Q r − 1 Q^{r-1} Qr−1 来检测是否 i ∈ S V r , 1 i \in SV^{r,1} i∈SVr,1
-
若 i ∉ S V r , 1 i \notin SV^{r,1} i∈/SVr,1, i i i 在Step 1不做任何处理
-
若 i ∈ S V r , 1 i \in SV^{r,1} i∈SVr,1,即 i i i 是potential leader,则它做如下处理:
-
收集广播给它的第 r r r 轮的支付,并且从中得出最大化的交易集合 P A Y i r PAY_i^r PAYir
-
然后 i i i 计算出它的候选区块 B i r = ( r , P A Y i r , S I G i ( Q r − 1 ) , H ( B r − 1 ) ) B_i^r = (r,PAY_i^r,SIG_i(Q^{r-1}),H(B^{r-1})) Bir=(r,PAYir,SIGi(Qr−1),H(Br−1))
-
最后计算出消息 m i r , 1 = ( B i r , e s i g i ( H ( B i r ) ) , σ i r , 1 ) m_i^{r,1} = (B_i^r,esig_i(H(B_i^r)), \sigma_i^{r,1}) mir,1=(Bir,esigi(H(Bir)),σir,1)
-
销毁临时私钥 s k i r , 1 sk_i^{r,1} skir,1,广播消息 m i r , 1 m_i^{r,1} mir,1
-
有选择的广播:为了缩短 Step 1的全局执行时间, ( r , 1 ) (r,1) (r,1) 消息是有选择的广播。即对每个节点 j j j,
-
节点收到第一条 ( r , 1 ) (r,1) (r,1) 消息并验证成功后,正常广播;
-
随后收到的、并验证成功的 ( r , 1 ) (r,1) (r,1) 消息,当且仅当它包含的凭证哈希比之前收到的 ( r , 1 ) (r,1) (r,1) 消息的凭证哈希都要小时才会被广播出去。
-
若节点收到了两条来自同一个节点 i i i、但不同形式的 m i r , 1 m_i^{r,1} mir,1 消息时,节点丢弃掉第二条消息。
为了减少通信量、缩短共识所需的时间,每个potential leader i i i 将它的凭证 σ i r , 1 \sigma_i^{r,1} σir,1 和 m i r , 1 m_i^{r,1} mir,1 分开广播,因为凭证消息包比较小,能快速的在整个网络上传播,有助于让拥有较大凭证哈希值的 m i r , 1 m_i^{r,1} mir,1 停止被广播。
Step 2: 分级共识协议GC的第一步
节点 i ∈ P K r − k i \in PK^{r-k} i∈PKr−k 只要拥有 B r − 1 B^{r-1} Br−1,就开始了它第 r r r 轮的Step 2。
-
节点 i i i 从 B r − 1 B^{r-1} Br−1 中计算出 Q r − 1 Q^{r-1} Qr−1,并且检测是否 i ∈ S V r , 2 i \in SV^{r,2} i∈SVr,2
-
若 i ∉ S V r , 2 i \notin SV^{r,2} i∈/SVr,2, i i i 在Step 2不做任何处理
-
若 i ∈ S V r , 2 i \in SV^{r,2} i∈SVr,2,节点等待时间 t 2 ≜ λ + Λ t_2 \triangleq \lambda + \Lambda t2≜λ+Λ ,在等待期间, i i i 执行以下动作。
-
节点从收到的所有 ( r , 1 ) (r,1) (r,1) 消息中为所有的凭证 σ j r , 1 \sigma_j^{r,1} σjr,1 计算哈希值,找到领导者 l : H ( σ l r , 1 ) ⩽ H ( σ j r , 1 ) l: \ H(\sigma_l^{r,1}) \leqslant H(\sigma_j^{r,1}) l: H(σlr,1)⩽H(σjr,1)
-
若节点已经从 l l l 收到了有效的消息 m l r , 1 = ( B l r , e s i g l ( H ( B l r ) ) , σ l r , 1 ) m_l^{r,1} = (B_l^r, esig_l(H(B_l^r)), \sigma_l^{r,1}) mlr,1=(Blr,esigl(H(Blr)),σlr,1), i i i 设置 v i ′ ≜ H ( B l r ) v_i^\prime \triangleq H(B_l^r) vi′≜H(Blr),否则设置 v i ′ ≜ ⊥ v_i^\prime \triangleq \perp vi′≜⊥
-
i计算出消息 m i r , 2 ≜ ( E S I G i ( v i ′ ) , σ i r , 2 ) m_i^{r,2} \triangleq (ESIG_i(v_i^\prime), \sigma_i^{r,2}) mir,2≜(ESIGi(vi′),σir,2);销毁临时私钥 s k i r , 2 sk_i^{r,2} skir,2,广播 m i r , 2 m_i^{r,2} mir,2
-
Step 3: GC的第二步
节点 i ∈ P K r − k i \in PK^{r-k} i∈PKr−k 只要拥有 B r − 1 B^{r-1} Br−1,就开始了它第 r r r 轮的Step 3。
-
节点 i i i 从 B r − 1 B^{r-1} Br−1 中计算出 Q r − 1 Q^{r-1} Qr−1,并且检测是否 i ∈ S V r , 3 i \in SV^{r,3} i∈SVr,3
-
若 i ∉ S V r , 3 i \notin SV^{r,3} i∈/SVr,3, i i i 在Step 3不做任何处理
-
若 i ∈ S V r , 3 i \in SV^{r,3} i∈SVr,3,节点等待时间 t 3 ≜ t 2 + 2 λ = 3 λ + Λ t_3 \triangleq t_2 + 2\lambda = 3\lambda + \Lambda t3≜t2+2λ=3λ+Λ ,在等待期间, i i i 执行以下动作。
-
若存在一个 v ′ ≠ ⊥ v^\prime \neq \perp v′̸=⊥,节点收到了至少 2 3 \frac{2}{3} 32 个有效而不同的消息 m j r , 2 ≜ ( E S I G j ( v ′ ) , σ j r , 2 ) m_j^{r,2} \triangleq (ESIG_j(v^\prime), \sigma_j^{r,2}) mjr,2≜(ESIGj(v′),σjr,2), i i i 计算出消息 m i r , 3 ≜ ( E S I G i ( v ′ ) , σ i r , 3 ) m_i^{r,3} \triangleq (ESIG_i(v^\prime), \sigma_i^{r,3}) mir,3≜(ESIGi(v′),σir,3);否则 m i r , 3 ≜ ( E S I G i ( ⊥ ) , σ i r , 3 ) m_i^{r,3} \triangleq (ESIG_i(\perp), \sigma_i^{r,3}) mir,3≜(ESIGi(⊥),σir,3)
-
销毁临时私钥 s k i r , 3 sk_i^{r,3} skir,3,广播 m i r , 3 m_i^{r,3} mir,3
-
Step 4:GC的输出及 B B A ∗ BBA^* BBA∗ 的第一步
节点 i ∈ P K r − k i \in PK^{r-k} i∈PKr−k 只要拥有 B r − 1 B^{r-1} Br−1,就开始了它第 r r r 轮的Step 4。
-
节点 i i i 从 B r − 1 B^{r-1} Br−1 中计算出 Q r − 1 Q^{r-1} Qr−1,并且检测是否 i ∈ S V r , 4 i \in SV^{r,4} i∈SVr,4
-
若 i ∉ S V r , 4 i \notin SV^{r,4} i∈/SVr,4, i i i 在Step 4不做任何处理
-
若 i ∈ S V r , 4 i \in SV^{r,4} i∈SVr,4,节点等待时间 t 4 ≜ t 3 + 2 λ = 5 λ + Λ t_4 \triangleq t_3 + 2\lambda = 5\lambda + \Lambda t4≜t3+2λ=5λ+Λ ,在等待期间, i i i 执行以下动作。
-
按照如下规则来计算GC的输出 v i , g i v_i, g_i vi,gi。
(a) 假设存在一个 v ′ ≠ ⊥ v' \neq \perp v′̸=⊥,节点 i i i 收到了至少 2 3 \frac{2}{3} 32 个有效而不同的消息 m j r , 3 ≜ ( E S I G j ( v ′ ) , σ j r , 3 ) m_j^{r,3} \triangleq (ESIG_j(v'), \sigma_j^{r,3}) mjr,3≜(ESIGj(v′),σjr,3),则节点设置 v i ≜ v ′ v_i \triangleq v' vi≜v′ 和 g i ≜ 2 g_i \triangleq 2 gi≜2。
(b) 否则,假设存在一个 v ′ ≠ ⊥ v' \neq \perp v′̸=⊥,节点 i i i 收到了至少 1 3 \frac{1}{3} 31 个有效的消息 m j r , 3 ≜ ( E S I G j ( ⊥ ) , σ j r , 3 ) m_j^{r,3} \triangleq (ESIG_j(\perp), \sigma_j^{r,3}) mjr,3≜(ESIGj(⊥),σjr,3),则节点设置 v i ≜ v ′ v_i \triangleq v' vi≜v′ 和 g i ≜ 1 g_i \triangleq 1 gi≜1。
© 否则,节点设置 v i ≜ H ( B ϵ r ) v_i \triangleq H(B_{\epsilon}^r) vi≜H(Bϵr) 和 g i ≜ 0 g_i \triangleq 0 gi≜0。
-
节点计算 B B A ∗ BBA^* BBA∗的输入: b i ≜ { 0 , g i = 2 1 , 其它 b_i \triangleq \begin{cases} 0, &g_i=2 \\ 1, &\text{其它}\end{cases} bi≜{0,1,gi=2其它
-
计算消息 m i r , 4 ≜ ( E S I G i ( b i ) , E S I G i ( v i ) , σ i r , 4 ) m_i^{r,4} \triangleq (ESIG_i(b_i),ESIG_i(v_i), \sigma_i^{r,4}) mir,4≜(ESIGi(bi),ESIGi(vi),σir,4),销毁临时私钥 s k i r , 4 sk_i^{r,4} skir,4,广播 m i r , 4 m_i^{r,4} mir,4。
-
Step s, 5 ≤ s ≤ m + 2 , s − 2 ≡ 0 m o d 3 5 \leq s \leq m+2, s-2 \equiv\ 0\ mod\ 3 5≤s≤m+2,s−2≡ 0 mod 3: B B A ∗ BBA^* BBA∗ 的 Coin-Fixed-To-0
节点 i ∈ P K r − k i \in PK^{r-k} i∈PKr−k 只要拥有 B r − 1 B^{r-1} Br−1,就开始了它第 r r r 轮的Step s s s。
-
节点 i i i 从 B r − 1 B^{r-1} Br−1 中计算出 Q r − 1 Q^{r-1} Qr−1,并且检测是否 i ∈ S V r , s i \in SV^{r,s} i∈SVr,s
-
若 i ∉ S V r , s i \notin SV^{r,s} i∈/SVr,s, i i i 在Step s s s 不做任何处理
-
若 i ∈ S V r , s i \in SV^{r,s} i∈SVr,s,节点 i i i 执行以下动作。
-
节点等待时间 t s ≜ t s + 2 λ = ( 2 s − 3 ) λ + Λ t_s \triangleq t_s + 2\lambda = (2s-3)\lambda + \Lambda ts≜ts+2λ=(2s−3)λ+Λ
-
以0结束:在等待时,若存在一个值 v ≠ ⊥ v \neq \perp v̸=⊥ 和步骤 s ′ s^\prime s′,使得:
(a) 5 ⩽ s ′ ⩽ s , s ′ − 2 ≡ 0 m o d 3 5 \leqslant s^\prime \leqslant s, s^\prime-2 \equiv 0 \ mod \ 3 5⩽s′⩽s,s′−2≡0 mod 3,即 s ′ s^\prime s′ 是Coin-Fixed-To-0步骤,
(b) i i i 收到至少 t H = 2 n 3 + 1 t_H = \frac{2n}{3} + 1 tH=32n+1 个有效消息 m j r , s ′ − 1 = ( E S I G j ( 0 ) , E S I G j ( v ) , σ j r , s ′ − 1 ) m_j^{r,s^\prime-1} = (ESIG_j(0), ESIG_j(v), \sigma_j^{r,s^\prime-1}) mjr,s′−1=(ESIGj(0),ESIGj(v),σjr,s′−1),同时,
(c) i i i 收到了一个有效消息 m j r , 1 = ( B j r , e s i g j ( H ( B j r ) ) , σ j r , 1 ) m_j^{r,1} = (B_j^r, esig_j(H(B_j^r)), \sigma_j^{r,1}) mjr,1=(Bjr,esigj(H(Bjr)),σjr,1), v = H ( B j r ) v = H(B_j^r) v=H(Bjr)
则 i i i 停止等待,并结束步骤s(实际上是结束了第 r r r 轮),设置 B r = B j r B^r = B_j^r Br=Bjr,将子步骤(b)中消息 m j r , s ′ − 1 m_j^{r,s^\prime-1} mjr,s′−1 的集合设置为它自己的 C E R T r CERT^r CERTr
-
以1结束:在等待时,若存在一个步骤 s ′ s^\prime s′,使得:
(a’) 6 ⩽ s ′ ⩽ s , s ′ − 2 ≡ 1 m o d 3 6 \leqslant s^\prime \leqslant s, s^\prime-2 \equiv 1 \ mod \ 3 6⩽s′⩽s,s′−2≡1 mod 3,即 s ′ s^\prime s′ 是Coin-Fixed-To-1步骤
(b’) i i i 收到至少 t H t_H tH 个有效消息 m j r , s ′ − 1 = ( E S I G j ( 1 ) , E S I G j ( v j ) , σ j r , s ′ − 1 ) m_j^{r,s^\prime-1} = (ESIG_j(1), ESIG_j(v_j), \sigma_j^{r,s^\prime-1}) mjr,s′−1=(ESIGj(1),ESIGj(vj),σjr,s′−1),
则 i i i 停止等待,并结束步骤s(实际上是结束了第 r r r 轮),设置 B r = B ϵ r B^r = B_\epsilon^r Br=Bϵr,将子步骤(b’)中消息 m j r , s ′ − 1 m_j^{r,s^\prime-1} mjr,s′−1 的集合设置为它自己的 C E R T r CERT^r CERTr。
-
否则,在等待的最后,节点 i i i 进行如下处理。
收到的所有有效 m j r , s − 1 m_j^{r,s-1} mjr,s−1 中, v j v_j vj 拥有大部分投票,则节点设置 v i = v j v_i=v_j vi=vj。按如下规则设置 b i b_i bi。
-
在收到的 m j r , s − 1 m_j^{r,s-1} mjr,s−1中,有超过2/3的 m j r , s − 1 = ( E S I G j ( 0 ) , E S I G j ( v j ) , σ j r , s − 1 ) m_j^{r,s-1}=(ESIG_j(0),ESIG_j(v_j),\sigma_j^{r,s-1}) mjr,s−1=(ESIGj(0),ESIGj(vj),σjr,s−1),则令 b i = 0 b_i=0 bi=0
-
否则,在收到的 m j r , s − 1 m_j^{r,s-1} mjr,s−1中,有超过2/3的 m j r , s − 1 = ( E S I G j ( 1 ) , E S I G j ( v j ) , σ j r , s − 1 ) m_j^{r,s-1}=(ESIG_j(1),ESIG_j(v_j),\sigma_j^{r,s-1}) mjr,s−1=(ESIGj(1),ESIGj(vj),σjr,s−1),则令 b i = 1 b_i=1 bi=1
-
否则, b i = 0 b_i=0 bi=0
节点计算消息 m i r , s ≜ ( E S I G i ( b i ) , E S I G i ( v i ) , σ i r , s ) m_i^{r,s} \triangleq (ESIG_i(b_i),ESIG_i(v_i), \sigma_i^{r,s}) mir,s≜(ESIGi(bi),ESIGi(vi),σir,s),销毁临时私钥 s k i r , s sk_i^{r,s} skir,s,广播 m i r , s m_i^{r,s} mir,s。
-
-
Step s, 6 ≤ s ≤ m + 2 , s − 2 ≡ 1 m o d 3 6 \leq s \leq m+2, s-2 \equiv\ 1\ mod\ 3 6≤s≤m+2,s−2≡ 1 mod 3: B B A ∗ BBA^* BBA∗ 的 Coin-Fixed-To-1
节点 i ∈ P K r − k i \in PK^{r-k} i∈PKr−k 只要拥有 B r − 1 B^{r-1} Br−1,就开始了它第 r r r 轮的Step s s s。
-
节点 i i i 从 B r − 1 B^{r-1} Br−1 中计算出 Q r − 1 Q^{r-1} Qr−1,并且检测是否 i ∈ S V r , s i \in SV^{r,s} i∈SVr,s
-
若 i ∉ S V r , s i \notin SV^{r,s} i∈/SVr,s, i i i 在Step s s s 不做任何处理
-
若 i ∈ S V r , s i \in SV^{r,s} i∈SVr,s,节点 i i i 执行以下动作。
-
节点等待时间 t s ≜ ( 2 s − 3 ) λ + Λ t_s \triangleq (2s-3)\lambda + \Lambda ts≜(2s−3)λ+Λ
-
以0结束:同 Coin-Fixed-To_0。
-
以1结束:同 Coin-Fixed-To_0。
-
否则,在等待的最后,节点 i i i 进行如下处理。
收到的所有有效 m j r , s − 1 m_j^{r,s-1} mjr,s−1 中, v j v_j vj 拥有大部分投票,则节点设置 v i = v j v_i=v_j vi=vj。按如下规则设置 b i b_i bi。
-
在收到的 m j r , s − 1 m_j^{r,s-1} mjr,s−1中,有超过2/3的 m j r , s − 1 = ( E S I G j ( 0 ) , E S I G j ( v j ) , σ j r , s − 1 ) m_j^{r,s-1}=(ESIG_j(0),ESIG_j(v_j),\sigma_j^{r,s-1}) mjr,s−1=(ESIGj(0),ESIGj(vj),σjr,s−1),则令 b i = 0 b_i=0 bi=0
-
否则,在收到的 m j r , s − 1 m_j^{r,s-1} mjr,s−1中,有超过2/3的 m j r , s − 1 = ( E S I G j ( 1 ) , E S I G j ( v j ) , σ j r , s − 1 ) m_j^{r,s-1}=(ESIG_j(1),ESIG_j(v_j),\sigma_j^{r,s-1}) mjr,s−1=(ESIGj(1),ESIGj(vj),σjr,s−1),则令 b i = 1 b_i=1 bi=1
-
否则, b i = 1 b_i=1 bi=1
节点计算消息 m i r , s ≜ ( E S I G i ( b i ) , E S I G i ( v i ) , σ i r , s ) m_i^{r,s} \triangleq (ESIG_i(b_i),ESIG_i(v_i), \sigma_i^{r,s}) mir,s≜(ESIGi(bi),ESIGi(vi),σir,s),销毁临时私钥 s k i r , s sk_i^{r,s} skir,s,广播 m i r , s m_i^{r,s} mir,s。
-
-
Step s, 7 ≤ s ≤ m + 2 , s − 2 ≡ 2 m o d 3 7 \leq s \leq m+2, s-2 \equiv\ 2\ mod\ 3 7≤s≤m+2,s−2≡ 2 mod 3: B B A ∗ BBA^* BBA∗ 的 Coin-Genuinely-Flipped
节点 i ∈ P K r − k i \in PK^{r-k} i∈PKr−k 只要拥有 B r − 1 B^{r-1} Br−1,就开始了它第 r r r 轮的Step s s s。
-
节点 i i i 从 B r − 1 B^{r-1} Br−1 中计算出 Q r − 1 Q^{r-1} Qr−1,并且检测是否 i ∈ S V r , s i \in SV^{r,s} i∈SVr,s
-
若 i ∉ S V r , s i \notin SV^{r,s} i∈/SVr,s, i i i 在Step s s s 不做任何处理
-
若 i ∈ S V r , s i \in SV^{r,s} i∈SVr,s,节点 i i i 执行以下动作。
-
节点等待时间 t s ≜ ( 2 s − 3 ) λ + Λ t_s \triangleq (2s-3)\lambda + \Lambda ts≜(2s−3)λ+Λ
-
以0结束:同 Coin-Fixed-To_0。
-
以1结束:同 Coin-Fixed-To_0。
-
否则,在等待的最后,节点 i i i 进行如下处理。
收到的所有有效 m j r , s − 1 m_j^{r,s-1} mjr,s−1 中, v j v_j vj 拥有大部分投票,则节点设置 v i = v j v_i=v_j vi=vj。按如下规则设置 b i b_i bi。
-
在收到的 m j r , s − 1 m_j^{r,s-1} mjr,s−1中,有超过2/3的 m j r , s − 1 = ( E S I G j ( 0 ) , E S I G j ( v j ) , σ j r , s − 1 ) m_j^{r,s-1}=(ESIG_j(0),ESIG_j(v_j),\sigma_j^{r,s-1}) mjr,s−1=(ESIGj(0),ESIGj(vj),σjr,s−1),则令 b i = 0 b_i=0 bi=0
-
否则,在收到的 m j r , s − 1 m_j^{r,s-1} mjr,s−1中,有超过2/3的 m j r , s − 1 = ( E S I G j ( 1 ) , E S I G j ( v j ) , σ j r , s − 1 ) m_j^{r,s-1}=(ESIG_j(1),ESIG_j(v_j),\sigma_j^{r,s-1}) mjr,s−1=(ESIGj(1),ESIGj(vj),σjr,s−1),则令 b i = 1 b_i=1 bi=1
-
否则,设置 b i ≜ l s b ( m i n j ∈ S V i r , s − 1 H ( σ J r , s − 1 ) ) b_i \triangleq lsb(min_{j \in SV_i^{r,s-1}} H(\sigma_J^{r,s-1})) bi≜lsb(minj∈SVir,s−1H(σJr,s−1)), S V i r , s − 1 SV_i^{r,s-1} SVir,s−1 为从收到的有效消息 m j r , s − 1 m_j^{r,s-1} mjr,s−1 中获得的 ( r , s − 1 ) (r,s-1) (r,s−1)-验证者。
节点计算消息 m i r , s ≜ ( E S I G i ( b i ) , E S I G i ( v i ) , σ i r , s ) m_i^{r,s} \triangleq (ESIG_i(b_i),ESIG_i(v_i), \sigma_i^{r,s}) mir,s≜(ESIGi(bi),ESIGi(vi),σir,s),销毁临时私钥 s k i r , s sk_i^{r,s} skir,s,广播 m i r , s m_i^{r,s} mir,s。
-
-
步骤 m + 3 m + 3 m+3: B B A ∗ BBA^* BBA∗的最后一步
节点 i ∈ P K r − k i \in PK^{r-k} i∈PKr−k 只要知道了 B r − 1 B^{r-1} Br−1,就开启了它的第r轮第 m + 3 m + 3 m+3 步
-
节点从 B r − 1 B^{r-1} Br−1 中计算出 Q r − 1 Q^{r-1} Qr−1,并且检测是否 i ∈ S V r , m + 3 i \in SV^{r,m+3} i∈SVr,m+3
-
若 i ∉ S V r , m + 3 i \notin SV^{r,m+3} i∈/SVr,m+3, i i i 在Step m + 3 m+3 m+3 不做任何处理
-
若 i ∈ S V r , m + 3 i \in SV^{r,m+3} i∈SVr,m+3,节点 i i i 执行以下动作。
-
等待时间 t m + 3 ≜ t m + 2 + 2 λ = ( 2 m + 3 ) λ + Λ t_{m+3} \triangleq t_{m+2} + 2\lambda = (2m+3)\lambda + \Lambda tm+3≜tm+2+2λ=(2m+3)λ+Λ。
-
以0结束:同 Coin-Fixed-To_0 步骤
-
以1结束:同 Coin-Fixed-To_0 步骤
-
否则,在等待结束时,节点 i i i 执行以下动作。
设置 o u t i ≜ 1 , B r ≜ B ϵ r out_i \triangleq 1, B^r \triangleq B_\epsilon^r outi≜1,Br≜Bϵr
节点计算消息 m i r , m + 3 = ( E S I G i ( o u t i ) , E S I G i ( H ( B r ) ) , σ i r , m + 3 ) m_i^{r,m+3}=(ESIG_i(out_i),ESIG_i(H(B^r)),\sigma_i^{r,m+3}) mir,m+3=(ESIGi(outi),ESIGi(H(Br)),σir,m+3)
销毁临时私钥 s k i r , m + 3 sk_i^{r,m+3} skir,m+3,广播 m i r , m + 3 m_i^{r,m+3} mir,m+3 来验证 B r B^r Br
-
非验证者在第 r r r 轮的区块重构
节点 i i i 只要知道了 B r − 1 B^{r-1} Br−1,就开启了它的第 r r r 轮,并且按以下方法等待区块信息。
-
在等待期间,若存在 v , s ′ v, s^\prime v,s′ 使得:
(a) 5 ⩽ s ′ ⩽ m + 3 , s ′ − 2 ≡ 0 m o d 3 5 \leqslant s^\prime \leqslant m+3,\ s^\prime-2 \equiv 0 \ mod \ 3 5⩽s′⩽m+3, s′−2≡0 mod 3
(b) i i i 收到至少 t H t_H tH 个有效消息 m j r , s ′ − 1 = ( E S I G j ( 0 ) , E S I G j ( v ) , σ j r , s ′ − 1 ) m_j^{r,s^\prime-1} = (ESIG_j(0), ESIG_j(v), \sigma_j^{r,s^\prime-1}) mjr,s′−1=(ESIGj(0),ESIGj(v),σjr,s′−1)
(c) i i i 收到一个有效消息 m j r , 1 = ( B j r , e s i g j ( H ( B j r ) ) , σ j r , 1 ) , v = H ( B j r ) m_j^{r,1} = (B_j^r, esig_j(H(B_j^r)), \sigma_j^{r,1}),\ v = H(B_j^r) mjr,1=(Bjr,esigj(H(Bjr)),σjr,1), v=H(Bjr)
i i i 停止它的 r r r 轮执行,令 B r = B j r B^r=B_j^r Br=Bjr,将子步骤(b)中消息 m j r , s ′ − 1 m_j^{r,s^\prime-1} mjr,s′−1 的集合设置为它自己的 C E R T r CERT^r CERTr
-
在等待期间,若存在 s ′ s^\prime s′ 使得:
(a’) 6 ⩽ s ′ ⩽ m + 3 , s ′ − 2 ≡ 1 m o d 3 6 \leqslant s^\prime \leqslant m+3, s^\prime-2 \equiv 1 \ mod \ 3 6⩽s′⩽m+3,s′−2≡1 mod 3
(b’) i i i 收到至少 t H t_H tH 个有效消息 m j r , s ′ − 1 = ( E S I G j ( 1 ) , E S I G j ( v j ) , σ j r , s ′ − 1 ) m_j^{r,s^\prime-1} = (ESIG_j(1), ESIG_j(v_j), \sigma_j^{r,s^\prime-1}) mjr,s′−1=(ESIGj(1),ESIGj(vj),σjr,s′−1)
i i i 停止它的 r r r 轮执行,令 B r = B ϵ r B^r=B_\epsilon^r Br=Bϵr,将子步骤(b’)中消息 m j r , s ′ − 1 m_j^{r,s^\prime-1} mjr,s′−1 的集合设置为它自己的 C E R T r CERT^r CERTr
-
在等待期间,若 i i i 收到至少 t H t_H tH 个有效消息 m j r , m + 3 = ( E S I G j ( 1 ) , E S I G j ( H ( B ϵ r ) ) , σ j r , m + 3 ) m_j^{r,m+3} = (ESIG_j(1), ESIG_j(H(B_\epsilon^r)), \sigma_j^{r,m+3}) mjr,m+3=(ESIGj(1),ESIGj(H(Bϵr)),σjr,m+3),则 i i i 停止它的 r r r 轮执行,令 B r = B ϵ r B^r=B_\epsilon^r Br=Bϵr,将1和 H ( B ϵ r ) H(B_\epsilon^r) H(Bϵr) 的消息 m j r , m + 3 m_j^{r,m+3} mjr,m+3 的集合设置为它自己的 C E R T r CERT^r CERTr。
以上就是整个共识算法的内容,但是文字描述并不直观,下面的这张图可以帮助大家更好的理解这个算法。
[外链图片转存失败(img-WYIDN8vM-1563245886580)(./arts/Algorand1.png)]
二、 A l g o r a n d 2 ′ Algorand'_2 Algorand2′ 协议
A l g o r a n d 2 ′ Algorand'_2 Algorand2′ 的流程与 A l g o r a n d 1 ′ Algorand'_1 Algorand1′ 的流程大体上是一致的,细节上有差异。
以下是 A l g o r a n d 2 ′ Algorand'_2 Algorand2′ 的具体流程。
Step 1: Block Proposal
节点 i ∈ P K r − k i \in PK^{r-k} i∈PKr−k 只要拥有 C E R T r − 1 CERT^{r-1} CERTr−1,可以用来计算出 H ( B r − 1 ) 、 Q r − 1 H(B^{r-1})、Q^{r-1} H(Br−1)、Qr−1,就开始了它第 r r r 轮的Step 1。
C E R T r CERT^r CERTr:由数字签名 H ( B r ) H(B^r) H(Br)的集合组成,包含了 S V r SV^r SVr中的大部分成员,且含有能证明每个成员属于 S V r SV^r SVr的证据。其作用是将区块 B r B^r Br转化成证明区块 B r ‾ \overline{B^r} Br,同时完成区块的验证。
-
节点 i i i 使用 Q r − 1 Q^{r-1} Qr−1 来检测是否 i ∈ S V r , 1 i \in SV^{r,1} i∈SVr,1
-
若 i ∉ S V r , 1 i \notin SV^{r,1} i∈/SVr,1, i i i 在Step 1不做任何处理
-
若 i ∈ S V r , 1 i \in SV^{r,1} i∈SVr,1,即 i i i 是potential leader,则它做如下处理:
-
假若 i i i 拥有 B 0 , … , B r − 1 B^0,…,B^{r-1} B0,…,Br−1,收集广播给它的第 r r r 轮的支付,并且从中得出最大化的交易集合 P A Y i r PAY_i^r PAYir
-
假若 i i i 不拥有 B 0 , … , B r − 1 B^0,…,B^{r-1} B0,…,Br−1,则设置 P A Y i r = ϕ PAY_i^r = \phi PAYir=ϕ
-
然后 i i i 计算出它的候选区块 B i r = ( r , P A Y i r , S I G i ( Q r − 1 ) , H ( B r − 1 ) ) B_i^r = (r,PAY_i^r,SIG_i(Q^{r-1}),H(B^{r-1})) Bir=(r,PAYir,SIGi(Qr−1),H(Br−1))
-
最后计算出消息 m i r , 1 = ( B i r , e s i g i ( H ( B i r ) ) , σ i r , 1 ) m_i^{r,1} = (B_i^r,esig_i(H(B_i^r)), \sigma_i^{r,1}) mir,1=(Bir,esigi(H(Bir)),σir,1)
-
销毁临时私钥 s k i r , 1 sk_i^{r,1} skir,1,分别广播消息 m i r , 1 m_i^{r,1} mir,1 和 ( S I G i ( Q r − 1 ) , σ i r , 1 ) (SIG_i(Q^{r-1}), \sigma_i^{r,1}) (SIGi(Qr−1),σir,1)
-
有选择的广播:为了缩短 Step 1的全局执行时间, ( r , 1 ) (r,1) (r,1) 消息是有选择的广播。即对每个节点 j j j,
-
节点收到第一条 ( r , 1 ) (r,1) (r,1) 消息并验证成功后,正常广播;
-
随后收到的、并验证成功的 ( r , 1 ) (r,1) (r,1) 消息,当且仅当它包含的凭证哈希比之前收到的 ( r , 1 ) (r,1) (r,1) 消息的凭证哈希都要小时才会被广播出去。
-
若节点收到了两条来自同一个节点 i i i、但不同形式的 m i r , 1 m_i^{r,1} mir,1 消息时,节点丢弃掉第二条消息。
为了减少通信量、缩短共识所需的时间,每个potential leader i i i 将它的凭证 σ i r , 1 \sigma_i^{r,1} σir,1 和 m i r , 1 m_i^{r,1} mir,1 分开广播,因为凭证消息包比较小,能快速的在整个网络上传播,有助于让拥有较大凭证哈希值的 m i r , 1 m_i^{r,1} mir,1 停止被广播。
Step 2: 分级共识协议GC的第一步
节点 i ∈ P K r − k i \in PK^{r-k} i∈PKr−k 只要拥有 C E R T r − 1 CERT^{r-1} CERTr−1,就开始了它第 r r r 轮的Step 2。
-
节点 i i i 等待时间 t 2 ≜ λ + Λ t_2 \triangleq \lambda + \Lambda t2≜λ+Λ ,在等待期间, i i i 执行以下动作。
-
等待 2 λ 2\lambda 2λ 时间后,节点从收到的所有 ( r , 1 ) (r,1) (r,1) 消息中为所有的凭证 σ j r , 1 \sigma_j^{r,1} σjr,1 计算哈希值,找到领导者 l : H ( σ l r , 1 ) ⩽ H ( σ j r , 1 ) l: \ H(\sigma_l^{r,1}) \leqslant H(\sigma_j^{r,1}) l: H(σlr,1)⩽H(σjr,1)
-
若节点有一个与 C E R T r − 1 CERT^{r-1} CERTr−1 中包含的哈希值 H ( B r − 1 ) H(B^{r-1}) H(Br−1) 相匹配的区块 $B^{r-1} $,并从 l l l 收到了有效的消息 m l r , 1 = ( B l r , e s i g l ( H ( B l r ) ) , σ l r , 1 ) m_l^{r,1} = (B_l^r, esig_l(H(B_l^r)), \sigma_l^{r,1}) mlr,1=(Blr,esigl(H(Blr)),σlr,1),则 i i i 停止等待,并设置 v i ′ ≜ ( H ( B l r ) , l ) v_i^\prime \triangleq (H(B_l^r), l) vi′≜(H(Blr),l)
-
否则等待时间 t 2 t_2 t2 结束, i i i 设置 v i ′ ≜ ⊥ v_i^\prime \triangleq \perp vi′≜⊥
-
v i ′ v_i^\prime vi′ 被设置后, i i i 从 C E R T r − 1 CERT^{r-1} CERTr−1 中计算 Q r − 1 Q^{r-1} Qr−1,检测是否 i ∈ S V r , 2 i \in SV^{r,2} i∈SVr,2
-
若 i ∈ S V r , 2 i \in SV^{r,2} i∈SVr,2, i i i 计算消息 m i r , 2 ≜ ( E S I G i ( v i ′ ) , σ i r , 2 ) m_i^{r,2} \triangleq (ESIG_i(v_i^\prime), \sigma_i^{r,2}) mir,2≜(ESIGi(vi′),σir,2),销毁临时私钥 s k i r , 2 sk_i^{r,2} skir,2,广播 m i r , 2 m_i^{r,2} mir,2。否则, i i i 停止,不广播任何消息。
-
Step 3: GC的第二步
节点 i ∈ P K r − k i \in PK^{r-k} i∈PKr−k 只要拥有 C E R T r − 1 CERT^{r-1} CERTr−1,就开始了它第 r r r 轮的Step 3。
-
节点 i i i 等待时间 t 3 ≜ t 2 + 2 λ = 3 λ + Λ t_3 \triangleq t_2 + 2\lambda = 3\lambda + \Lambda t3≜t2+2λ=3λ+Λ ,在等待期间, i i i 执行以下动作。
-
假设存在一个 v v v,节点 i i i 收到了至少 t H t_H tH 个有效而不同的消息 m j r , 2 ≜ ( E S I G j ( v ) , σ j r , 2 ) m_j^{r,2} \triangleq (ESIG_j(v), \sigma_j^{r,2}) mjr,2≜(ESIGj(v),σjr,2),则节点停止等待,并设置 v ′ = v v'=v v′=v
-
否则等待时间 t 3 t_3 t3 结束, i i i 设置 v i ′ ≜ ⊥ v_i^\prime \triangleq \perp vi′≜⊥
-
$v_i^\prime $ 被设置后, i i i 从 C E R T r − 1 CERT^{r-1} CERTr−1 中计算 Q r − 1 Q^{r-1} Qr−1,检测是否 i ∈ S V r , 3 i \in SV^{r,3} i∈SVr,3 若 i ∈ S V r , 3 i \in SV^{r,3} i∈SVr,3, i i i 计算消息 m i r , 2 ≜ ( E S I G i ( v i ′ ) , σ i r , 2 ) m_i^{r,2} \triangleq (ESIG_i(v_i^\prime), \sigma_i^{r,2}) mir,2≜(ESIGi(vi′),σir,2),销毁临时私钥 s k i r , 2 sk_i^{r,2} skir,2,广播 m i r , 2 m_i^{r,2} mir,2。否则, i i i 停止,不广播任何消息。
-
Step 4:GC的输出及 B B A ∗ BBA^* BBA∗ 的第一步
节点 i ∈ P K r − k i \in PK^{r-k} i∈PKr−k 只要结束了Step 3,就开始了它的Step 4。
-
节点 i i i 等待时间 $2\lambda $ ,在等待期间, i i i 执行以下动作。
-
按照如下规则来计算 v i , g i v_i, g_i vi,gi 和GC的输出。
-
假设存在一个 v ′ ≠ ⊥ v' \neq \perp v′̸=⊥,节点 i i i 收到了至少 t H t_H tH 个有效而不同的消息 m j r , 3 ≜ ( E S I G j ( v ′ ) , σ j r , 3 ) m_j^{r,3} \triangleq (ESIG_j(v'), \sigma_j^{r,3}) mjr,3≜(ESIGj(v′),σjr,3),则节点停止等待,并设置 v i ≜ v ′ v_i \triangleq v' vi≜v′ 和 g i ≜ 2 g_i \triangleq 2 gi≜2。
-
假若节点 i i i 收到了至少 t H t_H tH 个有效的消息 m j r , 3 ≜ ( E S I G j ( ⊥ ) , σ j r , 3 ) m_j^{r,3} \triangleq (ESIG_j(\perp), \sigma_j^{r,3}) mjr,3≜(ESIGj(⊥),σjr,3),则节点停止等待,并设置 v i ≜ ⊥ v_i \triangleq \perp vi≜⊥ 和 g i ≜ 0 g_i \triangleq 0 gi≜0。
-
否则,当时间 2 λ 2\lambda 2λ 已过,若节点 i i i 收到了至少 ⌈ t H 2 ⌉ \lceil \frac{t_H}{2} \rceil ⌈2tH⌉ 个有效的消息 m j r , 3 ≜ ( E S I G j ( v ′ ) , σ j r , 3 ) m_j^{r,3} \triangleq (ESIG_j(v'), \sigma_j^{r,3}) mjr,3≜(ESIGj(v′),σjr,3),则节点设置 v i ≜ v ′ v_i \triangleq v' vi≜v′ 和 g i ≜ 1 g_i \triangleq 1 gi≜1。
-
否则,当时间 2 λ 2\lambda 2λ 已过,设置 v i ≜ ⊥ v_i \triangleq \bot vi≜⊥ 和 g i ≜ 0 g_i \triangleq 0 gi≜0。
-
-
当 v i , g i v_i, g_i vi,gi 都被设置了,节点计算 B B A ∗ BBA^* BBA∗的输入: b i ≜ { 0 , g i = 2 1 , otherwise b_i \triangleq \begin{cases} 0, &g_i=2 \\ 1, &\text{otherwise}\end{cases} bi≜{0,1,gi=2otherwise
-
若 i ∈ S V r , 4 i \in SV^{r,4} i∈SVr,4,计算消息 m i r , 4 ≜ ( E S I G i ( b i ) , E S I G i ( v i ) , σ i r , 4 ) m_i^{r,4} \triangleq (ESIG_i(b_i),ESIG_i(v_i), \sigma_i^{r,4}) mir,4≜(ESIGi(bi),ESIGi(vi),σir,4),销毁临时私钥 s k i r , 4 sk_i^{r,4} skir,4,广播 m i r , 4 m_i^{r,4} mir,4。否则, i i i 停止,不广播任何消息。
-
Step s, 5 ≤ s ≤ m + 2 , s − 2 ≡ 0 m o d 3 5 \leq s \leq m+2, s-2 \equiv\ 0\ mod\ 3 5≤s≤m+2,s−2≡ 0 mod 3: B B A ∗ BBA^* BBA∗ 的 Coin-Fixed-To-0
节点 i ∈ P K r − k i \in PK^{r-k} i∈PKr−k 只要结束了Step s − 1 s-1 s−1,就开始了它的Step s s s。
-
节点 i i i 等待时间 $2\lambda $ ,在等待期间, i i i 执行以下动作。
-
以0结束:在等待时,若存在一个值 v ≠ ⊥ v \neq \perp v̸=⊥ 和步骤 s ′ s^\prime s′,使得:
(a) 5 ⩽ s ′ ⩽ s , s ′ − 2 ≡ 0 m o d 3 5 \leqslant s^\prime \leqslant s, s^\prime-2 \equiv 0 \ mod \ 3 5⩽s′⩽s,s′−2≡0 mod 3,即 s ′ s^\prime s′ 是Coin-Fixed-To-0步骤,
(b) i i i 收到至少 t H t_H tH 个有效消息 m j r , s ′ − 1 = ( E S I G j ( 0 ) , E S I G j ( v ) , σ j r , s ′ − 1 ) m_j^{r,s^\prime-1} = (ESIG_j(0), ESIG_j(v), \sigma_j^{r,s^\prime-1}) mjr,s′−1=(ESIGj(0),ESIGj(v),σjr,s′−1),同时,
(c) i i i 收到了一个有效消息 ( S I G j ( Q r − 1 ) , σ j r , 1 ) (SIG_j(Q^{r-1}), \sigma_j^{r,1}) (SIGj(Qr−1),σjr,1),
则 i i i 停止等待,并结束步骤s(实际上是结束了第 r r r 轮),将 H ( B r ) H(B^r) H(Br) 设为 v v v 的第一部分,将子步骤(b)中消息 m j r , s ′ − 1 m_j^{r,s^\prime-1} mjr,s′−1 的集合以及 ( S I G j ( Q r − 1 ) , σ j r , 1 ) (SIG_j(Q^{r-1}), \sigma_j^{r,1}) (SIGj(Qr−1),σjr,1) 设置为它自己的 C E R T r CERT^r CERTr。
-
以1结束:在等待时,若存在一个步骤 s ′ s^\prime s′,使得:
(a’) 6 ⩽ s ′ ⩽ s , s ′ − 2 ≡ 1 m o d 3 6 \leqslant s^\prime \leqslant s, s^\prime-2 \equiv 1 \ mod \ 3 6⩽s′⩽s,s′−2≡1 mod 3,即 s ′ s^\prime s′ 是Coin-Fixed-To-1步骤
(b’) i i i 收到至少 t H t_H tH 个有效消息 m j r , s ′ − 1 = ( E S I G j ( 1 ) , E S I G j ( v j ) , σ j r , s ′ − 1 ) m_j^{r,s^\prime-1} = (ESIG_j(1), ESIG_j(v_j), \sigma_j^{r,s^\prime-1}) mjr,s′−1=(ESIGj(1),ESIGj(vj),σjr,s′−1),
则 i i i 停止等待,并结束步骤s(实际上是结束了第 r r r 轮),设置 B r = B ϵ r B^r = B_\epsilon^r Br=Bϵr,将子步骤(b’)中消息 m j r , s ′ − 1 m_j^{r,s^\prime-1} mjr,s′−1 的集合设置为它自己的 C E R T r CERT^r CERTr。
-
若节点收到至少 t H t_H tH 个有效的 m j r , s − 1 = ( E S I G j ( 1 ) , E S I G j ( v j ) , σ j r , s − 1 ) m_j^{r,s-1} = (ESIG_j(1), ESIG_j(v_j), \sigma_j^{r,s-1}) mjr,s−1=(ESIGj(1),ESIGj(vj),σjr,s−1),则停止等待,并设置 b i ≜ 1 b_i \triangleq 1 bi≜1。
-
若节点收到至少 t H t_H tH 个有效的 m j r , s − 1 = ( E S I G j ( 0 ) , E S I G j ( v j ) , σ j r , s − 1 ) m_j^{r,s-1} = (ESIG_j(0), ESIG_j(v_j), \sigma_j^{r,s-1}) mjr,s−1=(ESIGj(0),ESIGj(vj),σjr,s−1),(节点并没有对同一个 v v v 达成共识),则停止等待,并设置 b i ≜ 0 b_i \triangleq 0 bi≜0。
-
否则,当时间 2 λ 2\lambda 2λ 已过,设置 b i ≜ 0 b_i \triangleq 0 bi≜0。
-
当 b i b_i bi 被设置,节点从 C E R T r − 1 CERT^{r-1} CERTr−1 中算出 Q r − 1 Q^{r-1} Qr−1,并验证是否 i ∈ S V r , s i \in SV^{r,s} i∈SVr,s。
-
若 i ∈ S V r , s i \in SV^{r,s} i∈SVr,s,计算消息 m i r , s ≜ ( E S I G i ( b i ) , E S I G i ( v i ) , σ i r , s ) m_i^{r,s} \triangleq (ESIG_i(b_i),ESIG_i(v_i), \sigma_i^{r,s}) mir,s≜(ESIGi(bi),ESIGi(vi),σir,s),销毁临时私钥 s k i r , s sk_i^{r,s} skir,s,广播 m i r , s m_i^{r,s} mir,s。否则, i i i 停止,不广播任何消息。
-
Step s, 6 ≤ s ≤ m + 2 , s − 2 ≡ 1 m o d 3 6 \leq s \leq m+2, s-2 \equiv\ 1\ mod\ 3 6≤s≤m+2,s−2≡ 1 mod 3: B B A ∗ BBA^* BBA∗ 的 Coin-Fixed-To-1
节点 i ∈ P K r − k i \in PK^{r-k} i∈PKr−k 只要结束了Step s − 1 s-1 s−1,就开始了它的Step s s s。
-
节点 i i i 等待时间 $2\lambda $ ,在等待期间, i i i 执行以下动作。
-
以0结束:同 Coin-Fixed-To_0。
-
以1结束:同 Coin-Fixed-To_0。
-
若节点收到至少 t H t_H tH 个有效的 m j r , s − 1 = ( E S I G j ( 0 ) , E S I G j ( v j ) , σ j r , s − 1 ) m_j^{r,s-1} = (ESIG_j(0), ESIG_j(v_j), \sigma_j^{r,s-1}) mjr,s−1=(ESIGj(0),ESIGj(vj),σjr,s−1),(节点并没有对同一个 v v v 达成共识),则停止等待,并设置 b i ≜ 0 b_i \triangleq 0 bi≜0。
-
否则,当时间 2 λ 2\lambda 2λ 已过,设置 b i ≜ 1 b_i \triangleq 1 bi≜1。
-
当 b i b_i bi 被设置,节点从 C E R T r − 1 CERT^{r-1} CERTr−1 中算出 Q r − 1 Q^{r-1} Qr−1,并验证是否 i ∈ S V r , s i \in SV^{r,s} i∈SVr,s。
-
若 i ∈ S V r , s i \in SV^{r,s} i∈SVr,s,计算消息 m i r , s ≜ ( E S I G i ( b i ) , E S I G i ( v i ) , σ i r , s ) m_i^{r,s} \triangleq (ESIG_i(b_i),ESIG_i(v_i), \sigma_i^{r,s}) mir,s≜(ESIGi(bi),ESIGi(vi),σir,s),销毁临时私钥 s k i r , s sk_i^{r,s} skir,s,广播 m i r , s m_i^{r,s} mir,s。否则, i i i 停止,不广播任何消息。
-
Step s, 7 ≤ s ≤ m + 2 , s − 2 ≡ 2 m o d 3 7 \leq s \leq m+2, s-2 \equiv\ 2\ mod\ 3 7≤s≤m+2,s−2≡ 2 mod 3: B B A ∗ BBA^* BBA∗ 的 Coin-Genuinely-Flipped
节点 i ∈ P K r − k i \in PK^{r-k} i∈PKr−k 只要结束了Step s − 1 s-1 s−1,就开始了它的Step s s s。
-
节点 i i i 等待时间 $2\lambda $ ,在等待期间, i i i 执行以下动作。
-
以0结束:同 Coin-Fixed-To_0。
-
以1结束:同 Coin-Fixed-To_0。
-
若节点收到至少 t H t_H tH 个有效的 m j r , s − 1 = ( E S I G j ( 0 ) , E S I G j ( v j ) , σ j r , s − 1 ) m_j^{r,s-1} = (ESIG_j(0), ESIG_j(v_j), \sigma_j^{r,s-1}) mjr,s−1=(ESIGj(0),ESIGj(vj),σjr,s−1),(节点并没有对同一个 v v v 达成共识),则停止等待,并设置 b i ≜ 0 b_i \triangleq 0 bi≜0。
-
若节点收到至少 t H t_H tH 个有效的 m j r , s − 1 = ( E S I G j ( 1 ) , E S I G j ( v j ) , σ j r , s − 1 ) m_j^{r,s-1} = (ESIG_j(1), ESIG_j(v_j), \sigma_j^{r,s-1}) mjr,s−1=(ESIGj(1),ESIGj(vj),σjr,s−1),则停止等待,并设置 b i ≜ 1 b_i \triangleq 1 bi≜1。
-
否则,当时间 2 λ 2\lambda 2λ 已过,设置 b i ≜ l s b ( m i n j ∈ S V i r , s − 1 H ( σ J r , s − 1 ) ) b_i \triangleq lsb(min_{j \in SV_i^{r,s-1}} H(\sigma_J^{r,s-1})) bi≜lsb(minj∈SVir,s−1H(σJr,s−1)), S V i r , s − 1 SV_i^{r,s-1} SVir,s−1 为从收到的有效消息 m j r , s − 1 m_j^{r,s-1} mjr,s−1 中获得的 ( r , s − 1 ) (r,s-1) (r,s−1)-验证者。
-
当 b i b_i bi 被设置,节点从 C E R T r − 1 CERT^{r-1} CERTr−1 中算出 Q r − 1 Q^{r-1} Qr−1,并验证是否 i ∈ S V r , s i \in SV^{r,s} i∈SVr,s。
-
若 i ∈ S V r , s i \in SV^{r,s} i∈SVr,s,计算消息 m i r , s ≜ ( E S I G i ( b i ) , E S I G i ( v i ) , σ i r , s ) m_i^{r,s} \triangleq (ESIG_i(b_i),ESIG_i(v_i), \sigma_i^{r,s}) mir,s≜(ESIGi(bi),ESIGi(vi),σir,s),销毁临时私钥 s k i r , s sk_i^{r,s} skir,s,广播 m i r , s m_i^{r,s} mir,s。否则, i i i 停止,不广播任何消息。
-
非验证者在第 r r r 轮的区块重构
节点 i i i 只要知道了 C E R T r − 1 CERT^{r-1} CERTr−1,就开启了它的第 r r r 轮。
-
节点 i i i 遵从协议每一步骤的指示,参与所有消息的广播,但是若某一步骤中,节点不是验证者,则不初始化任何广播。
-
节点在某些Step,一旦进入了 以0结束 或 以1结束,就用对应的 C E R T r CERT^r CERTr 结束当前的 r r r 轮。
-
自此之后,节点在等待接收子区块 B r B^r Br 之时开始它的第 r + 1 r+1 r+1 轮。
三、总结
以上是笔者根据论文内容进行的梳理,尽管 A l g o r a n d 1 ′ Algorand'_1 Algorand1′ 和 A l g o r a n d 2 ′ Algorand'_2 Algorand2′ 两者在内容表述上有所差异,但原理和总体流程相差无几。本文不对两者的优劣对比作任何评价,毕竟二者所适用的情况有所不同。
看完整篇论文之后,笔者很佩服Algorand共识算法逻辑的严谨以及证明的详尽。然而,笔者觉得,算法过于复杂,不适用于工业应用,尤其是对时间、通信复杂度要求颇高的区块链。
从上文可以看出,该共识算法达成共识最少需要五轮通信,而PBFT是两轮(prepare、commit)。在通信复杂度上,该算法至少是PBFT的两倍以上。YOUChain的测试结果表明,不管共识算法如何优化,通信环境越差,达成共识所需要的时间越长,最终的tps越低。
Algorand于18年4月份更新的共识算法大大简化了共识流程,可以说是基本上看不到之前协议的影子(后面我们会有文章对它进行详细的分析)。但这也充分说明了Algorand团队也意识到该算法在实际应用上的缺陷。不过不能否认,Algorand 2017年的论文是不可多得的佳作,里面的诸多概念和思考方式能给人极大地启发,值得深度研究。
交流群
受限于笔者的学识和能力,文章内容难免有纰漏之处。技术探讨,请添加加微信 kvdoth
备注「YOUChain 技术交流」,进群交流。
公众号
欢迎添加「有令」公众号,了解项目最新进展和技术分享。