algorand算法学习笔记

密码抽签

密码抽签算法用来决定谁来验证下一个block。

密码抽签按两条线索执行:

  • 选出“验证者”和“领导者”;
  • 是创建并不断完善“种子”参数。

1. 选出“验证者”和“领导者”

  1. 系统创建并不断更新一个独立参数,称为“种子”,记为Q ^{r-1} 。第r轮的种子的参数是256位长度的字符串,入参是第r-k轮结束后活跃用户的公钥集合,记为PK^{r-k}。k被称为回溯参数或安全参数,比如=1,表示上一轮结束后的用户集合。上面2个参数属于公共知识
  2. 基于当前 “种子”构建并公布一个随机算法,称为“可验证的随机函数(verifiable random functions)"。该随机算法中的一个关键参数是用户的私钥,这个私钥只有用户本人才知道。
  3. 每个用户使用自己的私钥对“种子”进行签名,用函数SIGi来表示,用它作为参数,运行系统公布的随机算法,用函数H()来表示,得到自己的凭证(credential)= H(SIGi(r,1,Q^{r-1}))(函数SIGi有多个输入参数时,表示将这些参数简单串联后再进行电子签名)。
    3.1. 凭证是一个近乎随机的、由0和1组成的长度为256的字符串,并且不同用户的凭证几乎不可能相同;
    3.2. 由凭证构建的2进制小数0.H(SIGi(r,1,Q^{r-1}))(也就是将凭证字符串写到小数点后)在0和1之间均匀分布。
  4. 凭证值满足一定条件的用户就是这一轮的“验证者”(verifiers)。
    4.1. 条件是:对0和1之间的一个数,0.H(SIGi(r,1,Q^{r-1}))≤p发生的概率为p,称所有满足此条件的用户为“验证者”。
    4.2. 有1-10^{-18}的概率保证在所有“验证者”中,至少有一个是诚实的。
  5. 验证者”组装一个新区块并连同自己的凭证一起对外发出。第r轮第s步(s>1)的“验证者”的产生程序与上文类似。其中,在第一个子步骤中凭证值最小(按字典方面排序)的那个“验证者”的地位比较特殊,称为“领导者”。
  6. 所有“验证者”基于“领导者”组装的新区块运行拜占庭协议BA。
  7. 在BA的每次循环中的每一个子步骤中,被选中的“验证者”都是不同的。这样能有效防止验证权力集中在某些用户手中,避免“敌对者”通过腐化这些用户来攻击区块链。

上述过程的特点是:

  1. “验证者”在秘密情况下获知自己被选中,但他们只有公布凭证才能证明自己的“验证者”资格。尽管“敌对者”可以瞬间腐化身份公开的“验证者”,但已不能篡改或撤回诚实验证着已经对外发出的消息。
  2. 所有“验证者”公布自己的凭证并进行比较后,才能确定谁是“领导者”,也就是“领导者”可以视为由公共选举产生。
  3. 随机算法的性质决定了事先很难判断谁将被选为“验证者”。因此,“验证者”的选择过程很难被操纵或预测。
  4. 尽管“敌对者”有可能事先安插一些交易来影响当前公共账本,但因为“种子”参数的存在,他仍然不可能通过影响“验证者”(特别是其中的“领导者”)的选择来攻击Algorand。

2. 种子的更新

用Br表示第轮结束后,拜占庭协议BA★输出的区块。

“种子”的更新过程是:
Q^r =H(SIGlr(Q^{r-1},r)), 如果B^r不是空区块
Q^r =H(Q^{r-1},r), 如果B^r是空区块

如果Algorand在第r轮受到了“敌对者”攻击,B^r可能是空的.

3. Algorand的拜占庭协议BA★

拜占庭协议BA★相当于一个两阶段的投票机制

  • 第一阶段,“验证者”对其收到的候选区块(为控制通讯成本,实际上用的是候选区块的哈希摘要)运行分级共识协议(graded consensus), 选出“验证者”共识最多的候选区块。
  • 第二阶段,“验证者”对第一阶段选出的候选区块,运行二元拜占庭协议(binary Byzantine Agreement),即要么接受它,要么接受空区块。需要强调的,在每一阶段中的每一个子步骤,Algorand可能使用完全不同的“验证者”。

以下为叙述方便,假设:

  • 系统处在第r轮;
  • 每一个子步骤都选出n名“验证者”,其中恶意“验证者”不超过t,并且n≥3t+1(也就是诚实“验证者”占比在2/3以上)。另外,引入计数函数 #si(v)表示在第s步“验证者”i 收到的消息v的次数(来自同一发送人的只能算1次)。

3.1 第一阶段:分级共识协议

  1. 运行密码抽签程序,选出“领导者”lr和这一步的“验证者”。用vi表示“验证者”i收到的并且他认识是来自“领导者”lr的候选区块。

vir不一定等于“领导者”lr构建的候选区块:

  • “验证者”i辨认“领导者”的方法是从他收到的所有“验证者”凭证中找出按字典排序最小者。但因为网络通讯原因,“领导者”lr发出的信息可能没有到达“验证者”i处。
  • “领导者”lr正好被“敌对者”腐化,对不同“验证者”发出不同的候选区块。
  • “验证者”i本身可能是恶意的。
  1. “验证者”i将收到的vi广播给其他用户。广播正确的vi代表他告诉其他验证者他同意该vi。
  2. 当且仅当“验证者”i在步骤2中收到消息x的次数超过了2t+1次(即 #2i(x)≥2t+1),他将消息x发给其他用户。“验证者”i按以下规则输出(vi,gi):

如果存在x使得#3i(x)≥2t+1,则vi=x,gi=2;//2轮都投票成功 如果x存在使得#3i(x)≥t+1,则vi=x,gi=1;//只有1轮投票成功 否则vi=Ø,gi=1,其中Ø代表空区块。

含义是:

  • 如果存在诚实“验证者”i,使得,gi=2,那么对任意其他“验证者”j,必有gj≥1,vj=vi。此时所有诚实“验证者”输出的候选区块是一样的。当然,如果一开始的“验证者”收到的候选区块都是v,那么最后一批“验证者”输出的也将都是v。
  • 对所有的诚实“验证者”i,gi≤1,并且他们输出的候选区块不一定相同。

第二阶段:二元拜占庭协议

基于分级共识协议的输出{(vi,gi):i=1,2,K……n}对每个诚实“验证者”赋值:

  • 如果gi=2,那么bi=0;
  • 其他情况,bi=1。

这些bi就是二元拜占庭协议的输入。

  1. 第一步“验证者”i发出bi。如果#1i(0)≥2t+1,那么“验证者”i设定bi=0,输出outi=0,并停止执行协议(也可以认为他以后将一直发出bi=0);如果#1i(1)≥2t+1,那么“验证者”i设定bi=1;否则,“验证者”i设定bi=0。
  2. 第二步“验证者”i发出bi。如果#2i(1)≥2t+1,那么“验证者”i设定bi=1,输出outi=1,并停止执行协议(也可以认为他以后将一直发出bi=1);如果#2i(0)≥2t+1,那么“验证者”i设定bi=0;否则,“验证者”i设定bi=1。
  3. 第三步“验证者”i发出bi和SIGi(Qr-1,rj)。如果#3i(0)≥2t+1,那么“验证者”i设定bi=0;如果#3i(1)≥2t+1,那么“验证者”i设定bi=1;否则,用Si表示所有给“验证者”i发送消息的其他“验证者”集合。

结论

  1. 每次随机选出n名验证者,由于是根据概率来决定谁是验证者,n的值只有在所有验证者广播他的凭证后,节点才能知道n的值是多少,并且≤真正的验证者数量,因为存在网络等问题。这样的话,这些交互的过程是一个同步交互的过程,肯定影响出块时间。
  2. 每一轮共识的交互次数太多了,每次交互意味着被动同步延时,对性能是个不小的影响。
  3. algorand的性能是比特币的125倍,按照论文中给出的数据,每小时可以共识的交易还是750M字节每小时,计算一下(按照每笔交易长度100字节计算):75010241024/60/60/100=2184.5 TPS,考虑到实际环境的运行,估计可以达到1000TPS左右。

参考文献:
https://people.csail.mit.edu/nickolai/papers/gilad-algorand-eprint.pdf
https://www.leiphone.com/news/201802/D835Yu95sY7ihrAp.html

你可能感兴趣的:(algorand算法学习笔记)