zoukankan      html  css  js  c++  java
  • algorand:可扩展的拜占庭协议

    algorand:可扩展的拜占庭协议

    1、系统概述

    1)系统目标

    Algorand是MIT机械工程与计算机科学系SilvioMicali教授与合作者于2016年提出的一个区块链协议,主要是为了解决比特币区块链采用的pow共识协议存在的算力浪费,扩展性弱、易分叉、确认时间长等不足。因此SilvioMicali教授在algorand区块链协议中提出了一种新的共识协议BA*,其目标是:

      1.能耗低,不管系统中有多用户,大约每1500名用户中只有1名会被系统挑中执行长达几秒钟的计算。

      2.民主化,不会出现类似比特币区块链系统的“矿工”群体。

      3.出现分叉的概率低于一兆分之一(即10-18)。

      4.可拓展性好。

     2)假想环境

      1、在无需准入和需要准入环境下都能正常工作,当然在需要准入的环境下能表现得更好,如果一个公钥可以随意加入系统,一个用户可以拥有多个公钥,则这是一个无需准入的系统,否则便是一个需要准入的系统。

      2、敌手能力很强

        1) 可以立刻腐蚀(corrupt)任何他想要的用户(user),前提条件是:在无需准入的环境中,需要2/3以上的金额(money)属于诚实(honest)用户;而在需要准入且一人一票的环境中,需要2/3以上的诚实用户

        2) 完全控制和完美协调已腐蚀的用户

        3) 调度已腐蚀用户所发送的所有信息,前提条件是,诚实用户发送的消息需要在一定的时间内发送到95%以上的其他诚实用户,而其延迟只和消息大小有关

      3、敌手的局限性

      1)不可伪造交易

      2)不可干涉诚实节点的通讯

    3)主要特点 (Main Properties)

      1. 计算量为最优,不论系统中存在多少用户,每1500个用户的计算量之和最多仅为几秒钟

      2. 一个新的区块在10分钟内被生成,并且永远不会因分叉问题而被主链抛弃,事实上Algorand发生分叉的概率微乎其微

      3. 没有矿工,所有有投票权的用户都有机会参与新块的产生过程

      4. 没有激励机制

      5. 基于诚实用户掌握大于2/3货币假设

    2、技术介绍

      1. 一种新的拜占庭共识(BA: Byzantine Agreement)协议,即BA*,这也是后文将重点介绍的协议

      2. 采用密码学抽签:BA*协议中每一轮参与投票的用户都可以证明确实是随机选取的,验证过程用VRF函数

      3. 种子参数:选取完全无法预测的种子参数,从而保证不被敌手所影响,上一轮的种子参数会参与下一轮投票用户的生成

      4. 秘密抽签和秘密资格:所有参与共识投票的用户都是秘密地得知他们的身份,投票后他们的身份被暴露,虽然敌手可以马上腐蚀他们,但是他们发送的消息已经无法被撤回,另外在消息生成后,用于签名的一次性临时秘钥(后文会提到)会立刻被丢弃,使得敌手在该轮无法再次生成任何合法消息

      5. 用户可替换(player-replacable):在拜占庭协议中,每个参与共识者需要投票多轮以达成共识,而在BA*中这并不可行,因为一旦投票后自己就暴露了,会被敌手腐蚀。配合密码学秘密抽签,用户会秘密知道自己有且只有参与某特定时刻的投票的资格,只要在该时刻参与投票,因为接下来投票权会转移给别人,这就使敌手的腐蚀失去了意义

    另外,诚实的用户可以是懒惰的(Lazy Honesty)。一个用户不需要时刻在线,可以根据适当的条件适当在线并参与共识即可,用户需要申请成为委员会成员,很快可以得知结果,然后参与共识(整个过程在1min之内)

    3、创新性

    针对BA协议的共识速度慢,共识用户被目标攻击的问题,作出了如下改进:

    女巫攻击:用户加权
    可扩展性:委员会选举

    随机选择委员会成员、防止敌手假冒委员会成员:加密抽签(私人兑奖用VRF,共识每个区块都有一个公开的种子参数)

    目标攻击:每一轮共识选择不同成员

    4、协议分析

    0.  BA*概述

    BA* Procedure的pseudocode。Algorand所使用的BA演算法一共分为两个阶段,在第一个阶段称为Reduction,一共会经历两个步骤(steps),把共识问题简化为二选一选择题:同意一个建议的区块Block Hash或是空区块Empty Block Hash。第二个阶段则是输出共识的结果,可能是一个Block Hash代表大家同意该区块,也有可能是Empty Block。

    1.  分级共识协议(GC: Graded Consensus Protocol)

    其GC协议的定义如下:

    若协议P中的所有用户为公共常识,每个用户i各自都知道任意的初始值v’i

    我们称P是一个(n-t)分级共识协议,若n个用户的每次行动中,至多只有t个恶意用户,其中n ≥ 3t + 1每个诚实用户i停机输出一个(值-级)对(a value-gradepair)(vi, gi),其中gi ∈ {0, 1, 2},他们满足如下条件:

    • 对于所有的诚实用户i和j,|gi –gj| ≤ 1

    • 对于所有的诚实用户i和i,gi,gj> 0 ⇒ vi = vj

    • 若对某一v,所有的输入v’1= … = v’n = v,则对所有诚实用户i,都有vi = v以及gi = 2

    GC协议的二阶段对应于BA*的Step2和Step3,以及拜占庭协议的prepare和commit部分,而输出(vi, gi)可以理解为commit票。若存在用户i,使得gi = 2,则其必然收到了2t + 1个对特定v的prepare票,即使其中有t个恶意用户,也就是说其他诚实用户,是少收到了对这个特定v的t + 1张prepare票,因此条件1成立。另外,在出票时间内,如果发现上一轮的用户给出不一致的票,则该用户的所有投票都会被视为作废,如此以来,每个用户只能给出一次有效票,如果两个vi和vj都有gi,gj > 0,那在一定commit轮发出了t+1张vi和t + 1张vj的票,则commit用户中有t + 1个用户收到了2t + 1张v1的prepare票,另有t + 1个收到了2t + 1张v2的prepare票,因为最多存在t个恶意用户,这需要每个恶意用户投两张prepare票,而如前述,恶意用户不能这么做,否则自己所有的票都会被视为作废,所以2成立。3显然成立,事实上,这相当于出块者为诚实的情况,由拜占庭协议可以保证所有诚实节点对v达成共识,而诚实节点的额数量为2t + 1,则对于任何用户i,gi = 2。

    2.  二元拜占庭共识协议 (The Binary BA Protocol BBA*)

    所谓二元既是共识结果为{0,1},在BA*协议中,是用户i的证明消息的第一个参数ESIGi(bi)。当BBA*结束时,它是一个可靠的(n-t)-拜占庭共识协议,其中n ≥ 3t + 1。事实上应该理解为没有共识的情况下,协议会永远循环下去,虽然存在概率,但是要是永远不发生共识,在现实中是不可能发生的事情。

    而对应于BA*在共识过程,恶意节点会不断捣乱,阻止诚实节点在第s步达成共识(5 ≤ s ≤ m + 2),但是每次在s – 2 ≡ 2 mod 3阶段,会有一次机会通过抽签的方式有概率,让诚实用户i对bi达成共识。而在最后的m+3阶段,会选择强制出空块的方式结束此轮。

    3.  BA*

    BA*协议就是将出块流程,GC协议和BBA*协议串联在一起,最后完成出块流程。它是一个可靠的(n-t)-拜占庭共识协议,其中n ≥ 3t + 1。当每一轮结束时,都满足:

    • 一致性(Consisteny):所有诚实用户i都在同一个v上达成共识,即vi = v

    • 共识性(Agreement):所有诚实用户i要不都发生共识,要不都不发生共识

    4.  定理 (The Theorem)

    算法作者通过归纳法证明了如下结论:

    在任何轮次r > 0,如下属性必然成立:

    • 所有的诚实用户共识与同一个块Br

    • 出块者为诚实的,则Br包含了交易的最大集,其达成共识的时间上限为Tr+1 ≤ Tr + 8λ + Λ。

    • 出块者为恶意的,其对Br达成共识的时间上限为Tr+1 ≤ Tr + (6Lr + 10)λ + Λ

    • 对于Lr,ph = h2(1 + h – h2),出块者为诚实的概率至少为 ph

    事实上,绝大多数情况下,BA*协议都可以快速达成共识。敌手需要掌握恶意出块者,还要不断调整每一轮投票者的行为,最后需要不错的运气,才能使该轮以最长的时间结束出块。可以算得,其达到共识的期望时间为12.7λ + Λ。

    最终共识和暂定共识:

    在一般情况下,当网络强烈同步且优先级最高的块提议者是诚实的时,BA通过最后一步确认在同一轮中不存在任何其他相互认同的块,从而达成最终共识。 否则,如果由于可能的网络不同步而无法确认其他块的不存在,BA⋆可以宣布暂定共识。

    BA⋆步骤执行,通过相同的Gossip协议进行通信,并产生一个新的协商块。 BA⋆可以产生两种共识:最终共识,暂定共识。 如果一个用户达成最终的共识,这意味着在同一回合中达成最终共识或暂定共识的任何其他用户都同意相同的块值(不管是否保持强同步假设)。 这确保了Algorand的安全性,因为这意味着所有未来的交易将被链接到这个最终的块(并且过渡到其前辈)。 因此,Algorand在交易的块(或任何后续块)达成最终共识时确认一个交易。 另一方面,暂定共识意味着其他用户可能已经在不同的方面达成了暂定共识(只要没有用户达成最终的共识)。用户只有在当后续块达成最终共识的情况下才能从暂定块中确认交易。

    强同步假设和弱同步假设:

    在一般情况下,当网络强同步并且块提议者是诚实的,BinaryBA()将为大多数用户启动相同的block_hash,并将在第一步达成共识,因为大多数委员会成员为相同 block_hash值投票。

    强同步的安全性

    BinaryBA()的每个步骤中,如果一个用户看到了某个值超过了T·τ票,那么在下一步(如果选中)中将投票给相同的值。 然而,如果没有任何值获得足够的选票,BinaryBA()选择下一个投票,以确保在强同步网络中的共识。

    强同步如果有敌手存在:

    具体而言,用户A可以接收来自对手的投票,这将让A观察的票超过阈值,但是对手可能不向其他用户发送相同的投票(或者可能不及时发送)。 因此,A返回一个块的共识,但其他用户在该步骤超时。 算法8遵循以下规则:每一个return语句都与一个TIMEOUT检查相结合,将下一步投票设置为可能返回的相同值。

    如果有许多像A这样已经返回共识的用户,则BinaryBA⋆()可能没有足够的用户推动下一个步骤中的CountVotes()超过阈值。 为了避免这个问题,每当用户返回共识时,其他用户在接下来的三个步骤中以他们达成共识的值进行投票。

    弱同步的安全性(存在分区)

    如果网络不是强同步的(例如,有一个分区),BinaryBA⋆()可能在两个不同的块上返回共识。 例如,假设在BinaryBA⋆()的第一步中,所有的用户投票给block_hash,但是只有一个诚实的用户A接收这些投票。 在这种情况下,A将在block_hash上返回共识,但所有其他用户将转到下一步。 现在,其他用户再次给block_hash投票,因为CountVotes()返回TIMEOUT。 但是,让我们假设网络将所有这些投票放弃。 最后,用户在第三步给投票empty_hash,网络表现良好,所有投票都被传递。 此时他们在empty_hash上达成共识。 这是不可取的,因为BinaryBA⋆()在两个不同用户的不同哈希值上返回共识。

    BA⋆()通过引入最终和暂定共识的概念来解决这个问题。最终共识意味着BA()将不会在这一轮的任何其他块达成共识。 暂时共识意味着BA⋆()无法保证安全,无论是因为网络同步还是由于恶意块提议者。

    如果Binary BA⋆()恰好在第一步中达成了V的共识,并且如果有足够的用户观察到达成了这个共识,那么BA⋆()将V值的共识指定为“最终的”。 具体来说,BinaryBA()发出了一个特殊的FINAL步的投票,为了表明用户恰好在第一步达成了一些值的共识,BA⋆()收集这些投票,以确定是否达成最终共识。在一个诚实的块提议者的强同步网络中,BinaryBA⋆()将在第一步达成共识,大多数委员会成员将在BinaryBA()的特殊FINAL步投票达成共识块, 并且将会在BA⋆()中收到的超过阈值的这种选票,从而宣布该块为最终的。 FINAL步是类似于许多拜占庭弹性协议中实施的最终确认步骤。

    直观地说,这保证了安全性,因为用户的一个大阈值已经宣布了对V的共识,并且不会在同一回合投票给其它值。 在我们上面的例子中,当用户A在不同于所有其他用户的块上达成共识时,这两个块都不会被指定为最终的,因为只有一个用户(即A)在第一步观察到共识,永远不会有足够的选票将该块标记为最终。 附录C.1正式确认并证明了这一安全性。

    越来越不卡(Getting unstuck)。剩下的一个问题是,如果诚实的用户被分成两个组A和B,并且两个组中的用户投票给不同的值(例如,我们在步骤1中,A为empty_hash投票,B投票给block_hash),共识会卡住。 两组都不够大,无法自己收集足够的选票,但是和对手的选票合在一起,A组足够大。在这种情况下,对手可以决定每个用户在下一步的投票。为了让用户在下一步中对empty_hash投票,对手在超时到期之前将对手自己的票投给empty_hash,这与A的投票放在一起,超过阈值。为了让用户对block_hash投票,攻击者不会向该用户发送任何投票;因此,该用户的CountVotes()将返回TIMEOUT,并且根据BinaryBA⋆()算法,用户将为下一步的投票选择block_hash。这样,攻击者可以在下一步将用户分成两组,并且无限期地继续这个攻击。

    上面描述的攻击要求攻击者知道用户从CountVotes()接收到TIMEOUT后如何投票。BinaryBA⋆()的第三步是为了通过推动接受基于随机“普通硬币”的block_hash或empty_hash来避免这种攻击,,这意味着对于所有用户来说主要是相同的二元。 虽然这听起来可能是循环的,但用户无需就这个普通硬币达成正式的共识。 只要有足够的用户观察到相同的硬币位,并且该位在该步骤之前并未被攻击者知道,则BinaryBA⋆()将在概率1/2(即, 攻击者猜测错误的概率)的下一次迭代循环中达到共识。 通过重复这些步骤,共识的概率很快接近1。

    为了实现这个硬币,我们利用所有消息附带的基于VRF的委员会成员哈希。 每个用户将普通硬币设置为在此步骤中观察到的最低散列值的最低有效位,如算法9所示。如果用户得到多票(即选择了他们的几个子用户),则CommonCoin() 考虑来自该用户的多个散列,通过将该用户的抽签散列与子用户索引进行散列。 注意散列是随机的(因为它们是通过散列伪随机VRF输出产生的),所以它们的最低有效位也是随机的。只有在CountVotes()超时的情况下才使用普通硬币,为所有选票在网络中传播提供了足够的时间。 如果哈希值最低的委员会成员是诚实的,那么接收到他的消息的所有用户都观察到相同的硬币。

    如果一个恶意的委员会成员恰好拥有最低的哈希值,那么他可能只把它发送给一些用户。 这可能会导致用户观察到不同的硬币值,从而无助于达成共识。 然而,由于抽签散列是伪随机的,所以诚实用户具有最低散列的概率是h(诚实用户持有的钱的一小部分),因此至少有h>2/3的概率,最低抽签散列持有者将是诚实的,这导致在每个循环迭代中概率为1/2·h> 1/3的共识。 这使得附录C.3可以表明,在强同步的情况下,BA⋆不会以极大的概率超过MAXSTEPS

    5、结论

    Algorand基本解决了pow遇到的很多问题。根据论文给出的数据,其交易效率也很高,并且不会因为用户数的增加和区块的增大而增加共识时间,事实上,其最消耗时间的地方是在区块的传播上。

  • 相关阅读:
    [Vim].vimrc
    [笔试面试][code_by_hand]压缩字符串
    [笔试面试][code_by_hand]输出第二个字符串在第一个字符串中的连接次序
    [笔试面试]串s1="ABCDACDAE" s2="DAE" 找出s1中,包含s2的最小子串,要求该子串含有s2中的所有字符,串内字符无顺序关系
    [笔试面试][code_by_hand]从二元树中找出和为某一值的所有路径
    DEV 皮肤的使用
    Dev GridControl使用小结
    [转载]DEV控件:gridControl常用属性设置
    C#网页 自动登录 提交POST信息 方法
    比较字符串NSString
  • 原文地址:https://www.cnblogs.com/juanjuanduang/p/10975703.html
Copyright © 2011-2022 走看看