在区块链技术的演进过程中,共识机制扮演着至关重要的角色。自比特币引入工作量证明(PoW)机制以来,无数研究者致力于优化和改进现有的共识算法,旨在提升区块链的效率,并在此过程中寻求速度、安全性和去中心化之间的最佳平衡。
PoS(权益证明)机制并非新生事物,其核心理念是以持有货币的数量而非计算资源来分配用户在区块链中的权力,持有越多者,获得生成新区块的几率越高。然而,在实际实施过程中,诸如如何合理选举委员会成员或确定下一个区块生成者等问题,都面临着不小的挑战。知名的PoS模型包括NXT的白雪公主模型、Cardano的Ouroboros Praos模型以及Algorand等。今天,我们将重点介绍相对较新的Algorand算法。
Algorand:纯粹的PoS共识协议 Algorand算法由图灵奖得主Silvio Micali提出。正如他在网络上众多介绍Algorand的视频中强调的,相较于其他共识机制,Algorand的PoS设计实现了真正的公平性,因为它允许所有拥有货币余额的钱包直接参与共识过程,无需抵押或代理。这一设计不仅能够有效防止中心化,更在以下方面实现了创新突破:
可验证的随机函数(VRF) Algorand中最为关键的机制之一是可验证随机函数(VRF)。VRF能够生成一个可验证的伪随机数,并提供相应的证明。任何人都可以通过验证函数来确认这个随机数是否确实由公钥对应的私钥持有者按照特定规则生成。VRF的三个函数描述如下:
Keygen(r)→(VK,SK):在随机输入上,密钥生成算法生成验证密钥VK和秘密密钥SK对。 Evaluate(SK,X)→(Y,⍴):评估算法将密钥SK和消息X作为输入,并产生伪随机输出字符串Y和证明⍴。 Verify(VK,X,Y,⍴)→0/1:验证算法将验证密钥VK,消息X,输出Y和证明⍴作为输入。当且仅当它验证Y是评估算法在输入SK和X上产生的输出时,才输出1。
为什么需要这样的随机数生成器?因为在Algorand的拜占庭算法中,虽然每一轮都会有不同的区块生成者(Leader)和验证委员会(Committee),但并非通过公开选举,而是通过每个用户自行参与抽奖的方式决定。这一逻辑依赖于VRF的原理。
加密抽签 与其他共识机制不同,如EOS的dPoS BFT和Zilliqa的PoW加入委员会等,Algorand的抽签机制使得每个用户都有机会成为下一轮的Leader或委员会成员。这种机制减少了被攻击的风险,因为攻击者无法预先确定下一轮的共识参与者。
Sortition()函数,其中返回的π为证明,j为权重,即一个用户可能被称为重复(想象需要随机选出1000人的委员会,而一位用户拥有全网20%的货币,那么他当然应该被选入很多次,因此该用户在委员会中将拥有更高的权重)。
参与者替换 上述设计对安全性有着极大的帮助,因为没有人能预测下一轮共识的参与者。这导致恶意攻击者无法事先锁定目标进行攻击。当一个恶意攻击者知道某人是这一轮的Leader时,这意味着该信息已经传播到网络中,Leader即将广播的区块已经被网络中的其他节点所知晓,因此已经无法对其进行攻击。在共识过程的每个步骤中,每个成员在广播自己的决议时,就已经完成了自己作为委员会成员的义务,而下一轮中,又会形成新的委员会,持续进行共识过程。
总结VRF部分,Algorand在区块生成到共识的每个步骤中,都不是预先确定的,而是实时决定。在参与共识的同时,附上Proof进行广播,这与一些BFT模型在异步广播区块链后等待某些已知用户回复签名的方式不同。Algorand通过本地收集网络上的签名投票,在帮助gossiping的同时,自行运行共识算法。
BA-拜占庭协议BA* Algorand使用的BA算法分为两个阶段:还原和输出共识结果。在还原阶段,共识问题被简化为二选一的选择题:同意一个Block Hash或Empty Block Hash。在输出共识结果的阶段,可能是一个Block Hash代表大家同意该区块链,也可能是Empty Block。
表决 从简单的投票开始,每个用户都会使用Sortition()函数来检查自己是否有权(以及多少权重)参与共识投票。
点票 T和τ是两个参数,T代表该步骤需要多少比例的委员投票,τ则表示该步骤替换出的委员数量。所以T×τ就是某个值要在这个步骤达成共识所需的总投票数。一旦某个值获得票数超过T×τ,CountVotes就会回传该值。
减少 Reduction()是BA*的第一阶段,通过两个步骤将共识问题简化为二选一的选择题:选择hblock或empty_hash。
二进制BA 接下来是BA*的第二阶段,BinaryBA。这个函数会返回一个Consensus,即一个新区块的共识结果。由于上一步中Reduction()已经确保了最多只有一个没有empty_hash的著名区块哈希,因此只需要在这个最有名的block_hash与empty_hash之间进行选择。
强同步和弱同步 在弱同步的情况下,可能发生不同诚实节点获得不同共识的情况。例如,一个节点A在step1就收集了block_hash足够的投票,但其他所有诚实节点都没有收集到足够的票数,因此进行到下一个步骤并再次TIMEOUT,所以大家都改投empty_string,因此其他节点在比较后面的步骤中对empty_string实现了共识。
强同步和弱同步 在强同步的情况下,大部分用户会在step1就达成共识,投票给相同的block_hash,这时他们会进行标记为FINAL的委员会投票。其他节点如果在BA*的最后阶段收到足够多的最终投票,就会标记这次达成决议的区块链为FINAL,即可以保证其最终性。
这全部合起来就是Algorand的BA共识算法,对于每个区块链的共识,都会在网络中广播的同时进行。除了这个快速的共识算法外,Algorand还设计了从分区中恢复的机制,以便在网络分区发生时,可以直接进入恢复模式等待网络恢复,再一起重新同步。
委员会规模 在Algorand的设计中,每次投票过程都由不同的委员会负责。显然,委员会规模越大,代表越公平、安全,但也会增加通信的延迟。Algorand的实现在确保低于5×10^-9的事故率下,选择了2000个成员的委员会规模。
实施与评估 由于算法中不同步骤的安全性和效率不尽相同,因此Algorand对T和τ这两个参数在不同阶段(步骤)或FINAL阶段会有所不同。以下为Algorand实现自己的算法时所用的参数,都是相对保守的参数。
最后附上一些实验结果。此为一个VM上运行50个实例(运行100~1000个VM)进行Algorand共识的实验结果,可以发现几乎维持在Constant。
一轮Algorand的延迟,拥有5,000至50,000个用户。
另一个有趣的实验结果是不同比例的恶意用户对共识速度的影响。可以观察到,在预定的比例之下,其运行效果不太可能受到影响。
在总共50,000个用户中,带有一小部分恶意用户的一轮Algorand的延迟。
总结 尽管我对PoS机制的理论探讨较多,但对于其运作细节仍感到陌生。近期阅读DEXON时,再次看到了Algorand这个关键词,促使我决定深入探讨。个人认为Algorand最有趣的部分在于前半段的VRF与参与者替换,看到这些密码学应用的智慧确实令人启发。希望未来我也能有机会深入理解其他PoS共识机制,这真的是既酷又有趣,但又确实很难懂!
标签: 数字货币