• Algorand-proof


    Algorand 由图灵奖获得者 Micali 提出的,其共识机制被称为 BA* ,是PBFT 算法的改进。BA* 算法分为三阶段:区块生成、GC 和 BBA*。算法的停止时间是不确定的,但大概率保证在有限步内结束。

    协议里有两种角色:Leader 和 Verifier

    • Leader:在区块生成阶段创建区块;
    • Verifier:在之后的每一个阶段里,对区块进行共识。

    下面对 BA* 协议的细节做一个具体介绍。

    符号

    • (r,s):第 r 轮第 s步
    • ell^r:第 r 轮的 leader
    • SV^{r,s}(r,s)的 verifier 集合。如果 s=1,则为 potential leader 集合
    • HSV^{r,s}MSV^{r,s}(r, s)的诚实 Verifier 和恶意 Verifier 集合
    • B_i^r:第 r 轮里节点 i 生成的区块
    • B_epsilon:空区块。生成空区块的那一轮是不存在leader的。
    • sk_i^{r,s}:节点 i 在(r,s)签名消息所用的临时密钥。每个(r,s)都有对应的临时密钥。
    • sigma_i^{r,s}: i 的签名SIG_i(r,s,Q^{r-1}),用于证明iin SV^{r,s}
    • m_i^{r,s}:节点 i 在(r,s)广播的消息。根据s不同,消息格式也不一样
      • s=1m_i^{r,1}=(B_i^r, esig_i(H(B_i^r)),sigma_i^{r,1})
      • s=2,3m_i^{r,s}=(ESIG_i(v_i),sigma_i^{r,s})
      • sgeq 4m_i^{r,s}=(ESIG_i(b_i),ESIG_i(v_i),sigma_i^{r,s})
    • PK^r:在第 r 轮时已加入系统的所有节点的公钥集合

    基本概念

    种子

    Q^r是第 r 轮的种子,用于选举 Leader 和 Verifier。Q^r的计算方式如下:

    • 如果B^{r-1}是合法区块,则Q^r=H(SIG_{ell^r}(Q^{r-1}),r)
    • 如果B^{r-1}=B_epsilon,即空区块,则Q^r=H(Q^{r-1}, r)

    Leader 选举

    对于forall iin PK^{r-k},计算.H(SIG_i(r,1,Q^{r-1}))leq p如果满足,则 i 为 potential leader。

    其中H(sigma_i^{r,1})最小的节点为真正的 leader。

    Verifier 选举

    Verifier 选举的方式和 Leader 选举的方式一样:对于forall iin PK^{r-k},计算.H(SIG_i(r,s,Q^{r-1}))leq p'如果满足,则 i 为 Verifier

    区块结构

    区块结构不是协议重点,但还是提一下。

    • 如果B^r是合法区块,则B^r=(r,PAY^r,SIG_{ell^r}(Q^{r-1}),H(B^{r-1}))
    • 如果B^r=B_epsilon,即空区块,则B^r=(r,emptyset,Q^{r-1},H(B^{r-1}))

    BA*共识

    BA*由三个部分组成

    1. 生成区块(s=1,即第一步):所有节点检查自己是不是potential leader,如果是,则生成区块并广播
    2. GC协议(2≤s≤3):有点像PBFT的后两个阶段,verifier 会生成1个二进制值
    3. BBA(s≥4):BBA共识的修改版。每次 BBA都由3步组成,会不断地循环。什么时候结束是不确定的,依概率结束。

    BA*将 leader 所生成的区块映射成二进制值,分别表示区块合法与否。

    • 合法:共识结束后生成一个正常区块
    • 不合法:共识结束后生成空区块(B_epsilon

    约定

    假设

    1. 每一步中,都有|HSV^{r,s}|>2{MSV^{r,s}}|,即诚实Verifier比例大于Verifier集合的2/3。(P31.Parameters第1点)
    2. 对于jin HSV^{r,s'}发的消息,最多经过lambda时间能被诚实节点收到。(P45第6行)

    执行前提

    s=1:节点 i 根据「Leader选举规则」检查自己是不是 potential leader。如果不是,结束该 step,否则执行相应规则。

    sgeq 2:节点 i 根据「Verifier选举规则」检查自己是不是 vefier。如果不是,结束该 step,否则执行相应规则。

    下文协议细节描述里,默认有这些检查

    签名

    esig_iESG_i都表示用当前(r,s)的临时密钥来签名消息。

    Step 的开始和结束

    开始时间:一个节点在达成共识B^{r-1}后,会同时进入每个Step(论文 P44.Lemma 5.5(a))。但并不是所有节点同时开始。

    • 设第一个诚实节点达成共识B^{r-1}的时间是T^r,则在[T^r, T^r+lambda]时间内,所有的诚实节点都会达成共识B^{r-1}
    • 为什么是[T^r, T^r+lambda],见分析的 2.1.a 和 2.1.b(论文 p50-52)

    结束时间:Step 结束的条件有两种

    • 达成 Ending Condition 条件
    • 耗尽等待时间:第s步的等待时间为t_s=2slambda-3+Lambdalambda表示m^{r,s}的广播时间上限,lambda表示B^r的广播时间上限。【但为什么是2lambda?】
      • s=1时没有等待时间,因为不需要接收消息。
      • 论文中默认等待t_s后,能收到所有诚实节点在小于s的step里发送的消息。

    Step 1 生成区块

    这一步生成区块并广播

    1. 生成区块B_i^r
    2. 生成m_i^{r,1}=(B_i^r, esig_i(H(B_i^r)),sigma_i^{r,1})。其中esig_i(H(B_i^r))表示用sk_i^{r,1}进行签名的,签名完后销毁sk_i^{r,1}
    3. 广播m_i^{r,1}B_i^r

    备注

    • 其他节点通过sigma_i^{r,s}验证是否有iin SV^{r,1},以检查 i 是否有资格进行该步。
    • 敌手收到所有的m_i^{r,1}后,就能知道谁是leader,并立即控制它广播新的m_i^{r,1},阻止它原来的m_i^{r,1}广播出去。这样敌手就可以控制每一轮的 leader。广播m_i^{r,1}后销毁sk_i^{r,1}就是为了避免这种情况发生,因为即使敌手控制了leader,也无法让他发送新的m_i^{r,1}

    GC

    Step 2:GC第一步

    1. 从收到的多个m_j^{r,1}里找到ell^r,即H(sigma_j^{r,1})最小的节点。
    2. 检查ell^{r}发来的区块B_{ell^r}^{r}的合法性:若合法,令v_i'=H(B_{ell^r}^{r});若不合法,令v_i'=perp
    3. 广播m_i^{r,2}=(ESIG_i(v_i'),sigma_i^{r,2})

    备注

    • v_i'GC协议要共识的值,在BBA协议中不会用到。
    • 整个协议里只有这一步检查 Leader 和区块的合法性

    Step 3:GC第二步

    1. 在收到的m_j^{r,2}中,如果有超过 2/3 的(ESIG_j(v'),sigma_j^{r,2})(他们的v_j'全部相同),则令m_i^{r,3}=(ESIG_i(v'),sigma_i^{r,3});否则,则令m_i^{r,i}=(ESIG_i(perp),sigma_i^{r,3})
    2. 广播m_i^{r,3}

    Step 4:GC输出

    1. 收到的m_j^{r,3}中,有 3 种可能出现的情况
      1. 如果有超过2/3(ESIG_j(v'),sigma_j^{r,3}),则令v_i=v', b_i=0
      2. 如果有超过1/3(ESIG_j(v'),sigma_j^{r,3}),且v'
eqperp,则令v_i=v', b_i=1。这里可以保证只有唯一的超过1/3的值。
      3. 否则令v_i=perp, b_i=1
    2. 广播m_i^{r,4}=(ESIG_i(b_i),ESIG_i(v_i),sigma_i^{r,4})

    备注:b_i=0表示区块合法,b_i=1表示区块不合法

    【思考】:在诚实节点中,似乎不会出现部分b_i=1,部分b_i=0的场景,而是会全部共识到合法区块B_r或空区块B_epsilon。恶意的ell^r和Verifier不能对下一步的诚实节点进行单播,因为他们不知道下一步的诚实节点是谁。

    BBA*

    在BBA*中,会不断对收到的历史m_j^{r,s'-1}进行检查,查看是否触发Ending Condition

    以下两个结束条件是互斥的

    【Ending Condition 0】

    • 条件:收到超过2n/3m_j^{r,s'-1}=(ESIG_j(0),ESIG_j(v),sigma_j^{r,s'-1}),且有s'-2equiv 0 	ext{mod} 3;同时vm_j^{r,1}中对应的区块是合法的(注意v是区块的哈希)
    • 满足条件则达成共识B^r=B_j^r,将相应的m_j^{r,s'-1}集合作为CERT^r,停止该轮。

    【Ending Condition 1】

    • 条件:收到超过2n/3m_j^{r,s'-1}=(ESIG_j(1),ESIG_j(v),sigma_j^{r,s'-1}),且有s'-2equiv 1 	ext{mod} 3
    • 满足条件则达成共识B^r=B_{epsilon}^r, 将相应的m_j^{r,s'-1}集合作为CERT^r,停止该轮。

    Step 5:Coin-Fixed-To-0

    5leq s leq m+2, s-2equiv 0 	ext{mod} 3时进行这一步时,如果触发Ending Condition 0 或 1,则停止。否则等待t_s

    • 在收到的m_j^{r,s-1}中,有超过2/3比例的m_j^{r,s-1}=(ESIG_j(1),ESIG_j(v_j),sigma_j^{r,s-1}),则令b_i=1,否则另b_i=0
    • 广播m_i^{r,s}=(ESIG_i(b_i),ESIG_i(v_i),sigma_i^{r,s})
    • 【为什么要令b_i=1和0】

    Step 6:Coin-Fixed-To-1

    和 Coin-Fixed-To-0 类似,当6leq s leq m+2, s-2equiv 1 	ext{mod} 3时进行这一步时,如果触发 Ending Condition 0 或 1,则停止。否则等待t_s

    • 在收到的m_j^{r,s-1}中,有超过2/3的m_j^{r,s-1}=(ESIG_j(0),ESIG_j(v_j),sigma_j^{r,s-1}),则令b_i=0,否则令b_i=1
    • 广播m_i^{r,s}=(ESIG_i(b_i),ESIG_i(v_i),sigma_i^{r,s})

    Step 7:Coin-Genuinely-Flipped

    7leq s leq m+2, s-2equiv 2 	ext{mod} 3时进行这一步,如果触发 Ending Condition 0 或 1,则停止。否则等待t_s

    • 可能出现三种互斥的情况:
      • 在收到的m_j^{r,s-1}中,有超过2/3的m_j^{r,s'-1}=(ESIG_j(1),ESIG_j(v_j),sigma_j^{r,s'-1}),则令b_i=1
      • 在收到的m_j^{r,s-1}中,有超过2/3的m_j^{r,s'-1}=(ESIG_j(0),ESIG_j(v_j),sigma_j^{r,s'-1}),则令b_i=0
      • 否则令b_i=	ext{lsb}(min_{jin SV_i^{r,s-1}}H(epsilon_j^{r,s-1})
    • 广播m_i^{r,s}=(ESIG_i(b_i),ESIG_i(v_i),sigma_i^{r,s})

    Step m+3:最后一步

    这一步比较特殊,不用检查自己是不是Verifier,所有节点都要参与。

    如果触发Ending Condition 0 或 1,则停止。否则等待t_s

    • out_i=1B^r=B_epsilon^r
    • 广播m_i^{r,m+3}=(ESIG_i(out_i),ESIG_i(H(B^r)), sigma_i^{r,m+3})

    达成共识B^r=B_{epsilon}^r,收集m_j^{r,m+3}集合作为CERT^r

    总结

    【达成共识的情况】:有三种,分别是 Ending Condition 0、Ending Condition 1 和 Step m+3。

    【Ending Condition】

    1. 若因为收到超过 2n/3 的m_j^{r,s'-1}而触发 Ending Condition,则在s< s'的 step 里,肯定是因为耗尽等待时间t_s而结束step。
    2. 触发 Ending Condition 0,则s'一定是 Coin-Fixed-To-0;如果触发 Ending Condition 1,则s'一定是 Coin-Fixed-To-1。
    3. Ending Condition 要求收到的m_j个数要超过确定值2n/3,而其他的都只要求收到的m_j中有2/3满足条件即可。

    拜占庭共识要保证参与共识的诚实节点大于2/3,但随机选出的集合不能保证该条件。于是

    1. 进行多次的随机选取(循环),只要有一次参与共识的诚实节点大于 2/3,就能达成共识。
    2. 如果不进行多次随机选取(循环),则恶意节点每次把合法区块变成空区块的概率就会大大增加。

    临时密钥

    在每一个(r,s)里,节点 i 所用的使用临时密钥sk_i^{r,s}签名消息。一旦消息广播出去,立即销毁签名所用的私钥。

    这么做的理由:节点 i 发送消息m_i^{r,s}的瞬间,敌手可以立即知道iin SV_i^{r,s},就可以collud它,用它的sk_i^{r,s}重新签名消息并广播。比如敌手可以这么攻击

    • s=1时:则每一轮敌手都可以控制 leader
    • s
eq 1时,敌手可以有策略地控制verifier,使得每一轮都共识成空区块B_epsilon

    节点 i 每次会生成100万轮*180步的临时密钥(在加入系统或临时密钥用完时生成)。下面简单介绍两种生成方案(论文 p32)

    第一种方案

    1. i 生成 PMK 和 SMK
    2. 广播 PMK
    3. 通过 SMK 和(r,i,s)计算出100万轮*180步的sk_i^{r,s}。计算完后销毁 SMK
    4. 任何人可以通过 PMK 和(r,i,s)计算出pk_i^{r,s}(这一步论文里没有写,是我猜的)

    第二种方案

    • i 生成100万轮*180步的公私钥对
    • 利用全部的私钥生成 Merkle Tree,广播 Root。
    • i 广播m_i^{r,s}时,附带公钥和 Merkle Tree的验证路径

    论文原文

  • 相关阅读:
    13_graphicals_view.md
    8_菜单栏、工具栏和状态栏.md
    2_按钮&对象数.md
    11_事件.md
    9_对话框.md
    序列化与反序列化 未知结构的数据 Any interface类型
    nil 接口不是 nil
    图片存储格式之一,由JPEG格式衍生而来,后缀为".jfif"。
    Why goroutines instead of threads? https://go.dev/doc/faq#atomic_maps
    源码 //go:nosplit
  • 原文地址:https://www.cnblogs.com/sigmod3/p/9384252.html
Copyright © 2020-2023  润新知