Algorand是权益证明(POS)的一个升级,彻底消除区块链分叉的可能性,可以在一小段时间内确认交易,Algorand的核心使用称为BA⋆的拜占庭协议,同时扩展到许多用户。即使一些用户是恶意的,网络被临时分区,Algorand也确保用户从未对已确认的交易有不同意见。在Algorand的BA⋆协议中,除了私钥之外,用户不会保留任何私有状态。
两种共识:
最终共识: BA⋆()将不会在这一轮的任何其他块达成共识。
暂定共识:其他用户可能已经在不同的块上达成了暂定共识(只要没有用户达成最终的共识)。
这个算法每一轮的总流程,分为两个大部分——块提议和BA⋆。块提议中首先在普通用户中通过加密抽签选择出这一轮的委员会成员(委员会成员会在每一轮通讯进行替换),然后在委员会成员中再次通过加密抽签选择出这一轮的提议者,每个提议者提议一个块。然后连同哈希和证明(一种随机号码,数字签名可以很容易对其进行验证)一起传播到网络上。之后,这一轮的所有委员会成员接到消息后,通过BA⋆协议对块达成共识(暂定或最终共识)。如果这一轮是暂定共识,则只有在当后续块(后几轮的块)有达成最终共识的情况下才能确认前几轮的暂定共识块。
加密抽签。用来创建和验证区块链(如若是在一个拥有数百万用户的系统中,那么参与者的数量可能达到数千人)。这种抽签的方法基于前一个区块,选择过程是自动并且完全随机的。用户被选中的概率基于他的权重。关键技术是使用可验证的随机函数(VRFs),以私人和非交互方式随机选择用户。允许用户私下检查是否被选择参与拜占庭协议。
每个用户在每一轮都要进行加密抽签。在输入字符串(种子+角色)上,VRFsk返回两个值:散列和证明。然后用为该角色选择的用户的预期数量τ除上所有用户的权重和,得到一个概率p。j参数表示此用户被选择了多少次。 被选择j次意味着用户以j个不同的“子用户”的身份参与。一开始j初始化为0,然后循环确定此用户的多少子用户被选择,抽签算法将区间[0,1)划分为连续区间的形式,如果hash / 2hashlen(其中hashlen是散列的比特长度)属于间隔,则用户恰好具有j个选定的子用户。
要进行加密抽签就要先获得本轮的种子seed。每一轮都会产生一个新的种子。假设现在为第r轮,在r轮的块提议期间,通过这个公式,为第r+1轮块提议计算种子seed r+1。这个种子(和相应的VRF证明π)被包含在每个提出的块中,所以一旦Algorand在r轮的块上达成一致,在r+1轮开始时,每个人都知道seed r+1。 如果块不包含有效的种子(例如,因为该块是由恶意用户提出的并且包括无效的交易),则用户将整个提出的块看作是空的,并且使用这个公式来计算第r轮的相关种子。引导种子选择的seed0的值可以在算法一开始时通过初始参与者(在声明他们的公钥之后)用分布式随机数随机选择生成。
由第一个公式可知,在选择第r+1轮的种子之前要选择每个用户的密钥sk u(r轮使用的)。块提议。抽签确保随机选择一小部分用户,并通过其权重为每个所选用户提供优先级,可以在用户之间进行比较。由于抽签是随机的,所以可能会有多个子用户选择提出块,用户通过比较子用户优先级,采用有最高优先级的子用户的那个块,子用户的最高优先级是块的优先级。 然后用户通过网络传播这个块,以及其优先级和证明。其他用户等待一定的时间来接收块。如果用户没有收到块提议,则会用空白块初始化BA⋆。
拜占庭协议BA⋆:确保区块链不会分叉。块提议不保证所有用户都收到相同的块。为了在一个单独的块上达成共识,Algorand使用BA⋆。每个用户使用他们接收的最高优先级块初始化BA⋆。
BA⋆的执行由两个阶段组成。第一阶段,将在任意一个块的散列上达成一致的问题转换为在两个值达成一致,这两个值是特定建议的块散列,或者是空块的散列。 程序里是用Reduction这个函数。在第二阶段,BA⋆就这些选择之一达成一致:要么同意一个建议的区块,要么同意一个空的区块。程序里是用BinaryBA⋆这个函数。
首先Reduction这个函数,主要分为两步,step1,每个委员会成员对由BA⋆ main函数传递给Reduction()的块的散列进行投票。Step2,委员会成员对第一步至少得到T·τ票的散列进行投票,或者如果没有散列得到足够的票数,则默认空块的散列。 Reduce()确保至多有一个非空块可以被Reduce()返回给所有诚实用户。
这里的投票是有两个主要函数——发送选票和计票。
发送选票函数,检查在给定的轮和步骤中用户是否被选择为委员会成员,这一步用之前的加密抽签函数实现。如果被选中,则用户就会传播一个包含值(要投给的块的哈希)的签名消息传递。
计票函数,从这个缓冲区中读取属于当前轮和步骤的消息。它通过调用每个消息的这个函数来处理投票, 这个函数是用来确保投票的有效性的,它不仅返回消息中包含的值,还返回与该值关联的投票数。在计票函数while循环里,只要一个值超过T·τ票,就会返回该值。如果在分配的λ时间窗口内没有收到足够的消息,则会产生超时并返回TIMEOUT。
第二阶段,BinaryBA⋆这个函数。前面说了,是二选一。每个委员会成员都为一个值投了一票,所有的用户都对票数进行统计。在BinaryBA⋆()的每个步骤中,如果一个用户看到了某个值超过了T·τ票,那么在下一步中将投票给相同的值。 然而,如果没有任何值获得足够的选票,BinaryBA⋆()选择下一个投票。
在一般情况下,当网络强同步且块提议者是诚实时,BinaryBA⋆()将为大多数用户启动相同的block_hash,并将在第一步达成共识,因为大多数委员会成员为相同 block_hash值投票。程序里有显示。
如果网络不是强同步的,BinaryBA⋆()可能在两个不同的块上返回共识。【例如,假设在BinaryBA⋆()的第一步中,所有的用户投票给block_hash,但是只有一个诚实的用户A接收这些投票。 在这种情况下,A将在block_hash上返回共识,但所有其他用户将转到下一步。 现在,其他用户再次给block_hash投票,因为CountVotes()返回TIMEOUT。 但是,让我们假设网络将所有这些投票放弃。 最后,用户在第三步给投票empty_hash,网络表现良好,所有投票都被传递。 因此,用户将继续投票给empty_hash,直到下一个迭代循环,此时他们在empty_hash上达成共识。】通过引入最终和暂定共识的概念来解决这个问题。BA⋆算法main函数最后是判断建立的是最终共识还是暂定共识。
联系客服