Algorand抽签算法详解

Algorand是图灵奖得主Micali教授提出的一种新的共识算法,论文地址:
https://people.csail.mit.edu/nickolai/papers/gilad-algorand.pdf

和目前流行的DPOS+BFT共识相比,最主要的创新是将proposer和validator的选举随机化:

  • proposer:根据随机数选出26个左右的proposer,从中挑选数值最小的节点出块
  • validator:按照持有token的比例,通过抽签决定

因此,algorand的核心其实是抽签算法,本文主要就是分析该算法。

目标

在保证公平性的情况下保持结果的随机性

  • 公平性:长期来看,节点被选中的概率应和它所持有的token比例保持一致
  • 随机性:单次选举结果随机且无法预测

换句话说,就是让小节点和散户也有机会参与到共识过程中。

在DPOS中,如果超级节点列表相对稳定,排在后面的小节点就永远没有机会入选(也就没有钱赚),久而久之就会失去竞选的动力,从而加剧系统的中心化风险。而Algorand则通过引入随机性,在保证公平的前提下,实现“人人都有钱赚”的理想。

原理

Alogrand通过VRF引入随机性,利用二项分布的线性叠加特性来保证公平性。

VRF (Verifiable Random Function)

VRF即可验证随机数:首先它是一个随机数,其次由于它包含生成者的私钥签名,验证者可以通过公钥确认该随机数的合法性。简单示意图如下:

这里写图片描述

最终的输出是2个:proof和随机数。粉色箭头是随机数生成流程,蓝色箭头是随机数验证流程。

当然具体实现包含更多细节,以RSA为例,具体流程参见下图:

这里写图片描述

更多细节参考下面的链接:https://tools.ietf.org/html/draft-goldbe-vrf-01.html
另外Google实现了一套基于p256椭圆曲线加密的VRF算法:https://github.com/google/keytransparency/tree/master/core/crypto/vrf

二项分布的线性叠加特性

二项分布即n重伯努利试验结果的概率分布,简单来说类似于抛n次硬币。概率分布曲线参参见下图:
这里写图片描述

那么什么是二项分布的线性叠加特性呢?
如果随机变量X服从B(n, p)分布,Y服从B(m, p)分布,且X和Y是独立随机变量,则Z=X+Y服从B(n+m, p)分布。参见维基百科上的证明:
这里写图片描述

抽签算法具体步骤

  1. 假设所有参选人持有token的总量为W
  2. 引入subuser概念,每个subuser需要持有的token数量为t,因此一共有n = W/t个subuser
  3. 假设参选人的持币量为w,则该参选人拥有w/t个subuser席位
  4. 假设需要选出s个subuser作为proposer或者validator,则相当于要以概率p进行n次独立重复试验,p = (t * s) / W,结果服从二项分布B(n, p)
  5. 由于每个参选人拥有多个subuser席位,就相当于把这n次试验划分成了多个分组,参见下图:
    这里写图片描述
    每个分组都服从同概率的二项分布:B(n1, p), B(n2, p), …, B(nm, p),其中n1+n2+…+nm = n。根据二项分布的叠加特性,最终的抽签结果仍然服从B(n, p)分布。
  6. 在每个分组中进行抽签,生成一个VRF随机数,判断落入二项分布累积分布曲线的哪个区间:
    这里写图片描述

落入区间j则表示抽签抽中了j次,即该参选人在本轮的proposer/validator集合中拥有j个席位。

抵抗女巫(Sybil)攻击

女巫攻击指的是:攻击者以极低的代价生成大量用户,提高选举成功的概率。
具体来说,攻击者可以把自己的资产拆分成很多份,作为多个参选人。但是如果基于以上的抽签算法,这种攻击毫无用处,因为中签率和资产所占比例相关,而与参选人个数无关,无论拆分还是合并,最终的中签率都是相同的。

更多文章欢迎关注“鑫鑫点灯”专栏:https://blog.csdn.net/turkeycock

猜你喜欢

转载自blog.csdn.net/TurkeyCock/article/details/81316249