Algorand 论文解读

Algorand是图灵奖获得者Silvio Micali主导研发的一种加密货币方案。该方案通过密码学抽签算法实现了拜占庭共识算法的大规模扩展,从而适用于公链数字货币体系。同传统加密货币共识算法PoW、PoS等相比拥有更安全、几乎不分叉、更高效(每轮共识达成时间在1分钟以内)等特性。

关键概念

  1. Weighted users: 在Algorand中会对每个用户(用户特指Alogrand运行实例或者说节点)分配一个权重,该权重大小由相应用户所占有的资金数量决定(这点和PoS类似)。因此Alogrand算法需要系统中占有2/3(该比例由BFT算法特性决定) 资金以上的为诚信节点方可避免分叉双花
  2. Consensus by committee: 和传统BFT算法不同的是Algorand会随机选举一个小的节点子集运行BA算法从而实现BA扩展性。 选举会依据节点占有的资金量分配相应的选中概率。
  3. Cryptographic sortion: 为了防止针对committee的恶意攻击,Algorand在选举committee的时候采用了一种私密且非交互的方式。每个节点通过运行VRFs 以及自身私钥和来自区块链的公共信息(主要是随机种子)计算自己本轮是否是committee的成员。当节点发现自己是committee的成员之后会将VRFs返回的证明信息广播给其他用户,其他用户可依据该证明验证其身份。这样攻击者是无法提前知晓被选举的committee成员的。
  4. Participant replacement: 同传统BFT算法不同的是BA* 在共识的每个阶段都会选举新的committee, 每个阶段之间节点之间没有私有状态会参与到共识中去。也就是每个阶段被选举的BA* committee成员将本次的决策信息发送到网络中去之后就与接下来的共识过程无直接关系。

算法假设

  • 诚实节点运行的是bug-free的软件;
  • 诚实节点所占有的金钱数量超过总数量的2/3;
  • 大多数诚实节点(e.g,95%)发出的消息能够被大多数诚实节点(e.g,95%)在一定时间限制内接受到 -- 强同步, 如果该条件不能满足则系统依然安全但是性能会受很大影响;
  • 假设所有诚实节点的时钟是接近同步的(例如采用NTP)

执行流程概述

Algorand目前仅支持数字货币交易,每个交易包含了转出方的签名、转入方信息以及转账金额。一系列的交易组成一个区块,Algorand维护出块的顺序以及整个区块链状态。

Algorand按照轮次(rounds)的概念产生区块,每个round产生一个区块,Algorand通过BA* 算法保障整个网络在每个round产生的区块一致。

如下图所示交易以及其他信息在Algorand网络中通过gossip协议进行传播。

fig1

如下图所示,Alogrand算法通过加密抽签算法选举节点子集运行BA* 算法决定哪些pending transactions组成新的区块append到区块链上。BA*算法的每个step都会按照下图的方式进行,收钱进行抽签然后进行决策投票,最后通过gossip方式将本轮的决策广播出去。

fig2

Block提议

Block提议是BA*算法运行的前置阶段,Block提议是指每个被选中为区块提议成员的用户将一段时间内的pending transactions打包并发布出去的过程。具体流程如下:

  1. 所有用户运行cryptographic sortition算法判断自身是否为本次的出块成员。cryptographic sortition算法能够生成一个证明自己为共识节点的proof以及本节点的priority。其中优先级用于在众多共识节点中定本次该提议的block(即优先级高者优先)
  2. 被选中的出块节点向Algorand网络中广播 < proof,priority, block>;
  3. 其他节点在一定时间内等待接收来自出块节点的block,并丢弃低优先级的节点发送过来的区块;

BA* 共识

BA* 共识的目标是选择提议阶段产生的区块中最具优先级且被一直认可的区块确定下来添加到区块链上。

  1. 每个用户在round中初始化BA* 算法,并将其收到的具有最高优先级的区块作为参数输入到BA*;
  2. BA* 包含多次重复步骤,每次步骤如图2所示;
    • 2.1 每个节点运行密码学抽签算法检查自己是否为本step中的共识成员;
    • 2.2 共识成员向网络中广播证明 \pi 以及决议信息;
    • 2.1 ~ 2.2 的步骤一直重复至足够数量的共识成员达成了共识;

以上便是整个区块的产生到添加到区块链的过程。

核心算法

Algorand的核心算法包括两个:1.密码学抽签算法,该算法用于保障每次参与共识的共识委员会成员接近完全随机;2. BA* 算法,该算法由共识委员会成员运行用于产出本次应该打包的区块。

密码学抽签算法

密码学抽签算法保障每个用户(pk_{i}, sk_{i})被选中为共识委员会成员的概率同其拥有的货币的金额成比例。即:假设每个用户的权重记为w_{i}(货币数量), 那么总的权重为 W = \sum w_{i}(总货币量), 那么用户i被选为共识委员会成员的概率就同其权重占比相匹配 w_{i}/W,

算法流程

如下图Algorithm 1所示为抽签算法的流程伪代码,抽签函数的输入为:sk: 用户私钥,seed: 伪随机种子,t: 期望被选为该role的用户的数量,role: 角色,w: 用户权重,W: 总权重

algo1
  1. 算法首先使用VRFs函数进行计算 <hash, \pi> := VRF_{sk}(seed||role) 该函数返回一个哈希值和一个证明,其中哈希值由私钥和输入参数功能决定,他人不可伪造;证明\pi 可以让任何知晓该用户公钥的用户验证hash值确实由该输入推导出来,该hash值的随机范围在[0, 2^{hashlen} - 1]。
  2. 为了能够使用户被选中的概率和其所拥有的货币相对应,Algorand将用户User按照其拥有多少单位的货币分割成sub-users,也即:假设用户i拥有w_i的货币, 那么该用户就拥有w_i个sub-users.(i, j)其中 j \in \{1, ...., w_j \} 代表了i拥有的{j^{th}} 个货币,每一个单位货币被选中的概率p = \frac tW
  3. 用户的w个sub-users中被选中k个的概率遵循二项分布: B(k;w, p) = \binom{k}{w}p^k(1-p)^{w-k} 其中 \sum_{k=0}^wB(k;w,p) = 1 ;
  4. 为了确定用户w个sub-users中多少个sub-user被选中,抽签算法将[0,1) 区间分割成连续的区间:I^j = [\sum_{k=0}^jB(k;w,p), \sum_{k=0}^{j+1}B(k;w,p)) 其中j \in \{1, ..., w\}
  5. 如果hash/2^{hashlen} 落在区间I^j 上,那么该用户共有j个sub-users被选中,该数字j能够通过 \pi 被其他用户验证, j >0 就证明本节点在本轮次中被选中为共识委员会成员。

如Algorithm 2算法所示为其他用户验证的逻辑,该逻辑类似抽签算法,通过用户公钥以及hash, \pi,seed等可进行正确性验证。

algo2

伪随机种子选取

从上述的随机算法来看其中伪随机种子seed至关重要,每个轮次中各用户应该拥有同样的seed才能够保证整个算法执行的正确性以及验证的正确性。其伪随机种子的选择算法如下:

  1. 初始种子seed0 在创世区块产生时由当时的参与者使用distributed random number generation 产生;
  2. 在后续的某轮次r中,seed会随着区块的产生更新。负责区块提议的用户u同时提出对应区块下一阶段使用的seed值:<seed, \pi> \leftarrow VRF_{sk_{u}}(seed_{r-1}||r);
  3. 为了降低攻击者的攻击,抽签算法使用的seed会每R轮更新一次;

BA* 算法

算法前置条件

Algorithm 1中提到,抽签算法的输入中有一个期望角色数量t的设置,对于Algorand区块提议角色而言t的值应该大于1,为了安全性和效率而言 1 <= t_{PROPOSAR} <= 70, 取值在26左右比较合理。

每个节点等待提议的区块有一个超时时间,\lambda_{STEPVAR} + \lambda_{PROORITY} 前者是网络需要多长时间使得上一轮中的用户完成BA*的最后一步,后面一个时间是gosspi最高优先级区块hash及其证明所耗费的时间, 实验保守估计每个时间在5秒左右。

BA*

如Algorithm 3所示是BA* 算法的概要描述,用户在观察区块提议时间结束之后会将其观察的区块传入BA* 算法并开始执行BA*过程:

algo3
  1. Reduction: 全网将对所有共识成员观察到的区块进行共识的问题转换成对某个区块或者空块进行共识问题, 这里分为两个步骤(如Algorithm 7):

    • 1.1 CommiteeVote 如算法4描述该算法授权检查自己是否为共识成员,如果是则将自己观察到的区块hash广播到网络中去
    • 1.2 等待\lambda_{BLOCK} + \lambda_{STEP}的时间,收集大部分用户投票的区块 T*t
    • 1.3 如果步骤1.2超时则提议投票给空块,否则将1.2中获得的区块提交出去 (为啥还需要后续过程,因为本过程只能够保证当前节点已经知晓网络中大多数同意的区块,类似PBFT算法中的Prepare阶段之后还需Commit)


      algo7
  2. BinaryBA*:
    BinaryBA* 算法将会在一个最大步数限制的情况下进行多次投票,在网络状况良好的情况下函数会在step=1的时候停止。

    • 2.1 step = 1 时,用户判断自己是否投票委员会成员,如果是则将Reduction中得到的区块hash进行投票,并收集结果,如果此时已经达到共识,另外发送三次投票(为了其他用户共识时能够收集到足够数量的投票)并尝试将该区块状态标记为final;
    • 2.2 当2.1 返回为空或者超时的情况下将再次发起投票,并收集结果。如果确实为空则证明本轮共识为空块,此时将发起三次投票(同上);如果是超时说明2.1中的失败并非为空而是收集投票为到达规定阈值,继续进行投票;
    • 2.3 本次如果超时将, 那么会运行CommonCoin函数该函数将给足网络时间去同步投票信息。同时该函数会随机让系统用户选择下一轮投空还是投blockhash从而让攻击者只有1/2的命中率。
  3. CountVotes: 对标记为FINAL的区块进行计数,取得足够数量的FINAL标记将被持久化到区块链中。

    algo8

下面几个函数为BA*的辅助函数:

  • 投票函数,1.检查自己是否共识成员,2.是的情况下投出自己支持的区块


    algo4
  • 统计票数函数:一定时间内将或得超过阈值票数的区块选出


    algo5
  • 消息处理函数:接收外部投票消息,验证其共识成员身份并返回相应投票数


    algo6
  • CommonCoin


    alg09

总结

Algorand通过加密抽签的方式成功地将共识网络规模缩小且比较安全;
创新的BA*算法每个步骤之间没有共享状态使得BA算法的执行更轻量级;

但是Algorand算法仍然有很多值得商榷的地方:

  1. 包括区块提议在内多个阶段需要预估超时时间,这种方式很不精确且不适合耗时的业务(目前仅支持加密货币);
  2. 对网络的连通性有较高的需求,例如最差网络状况下达成共识需要11步之多;
  3. 算法安全性依赖VRFs函数的安全性;

参考文献

[1] Algorand: Scaling Byzantine Agreements for Cryptocurrencies
[2] S. Micali, M. O. Rabin, Verifiable random functions.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,311评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,339评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,671评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,252评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,253评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,031评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,340评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,973评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,466评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,937评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,039评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,701评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,254评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,259评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,497评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,786评论 2 345

推荐阅读更多精彩内容

  • 原文链接:https://mp.weixin.qq.com/s/FD_zkmNcLHv440Y2oqpoag Al...
    vdes阅读 7,406评论 2 16
  • 我是个旅客,看惯了的风景太多,我不知道我要去往何处,也不知要做些什么?我在等待着风景从我身旁经过,我想路途不会那么...
    不鸣二文铜阅读 224评论 0 0
  • 新世纪百货南充商都ANY一ALL
    ANY一ALL阅读 131评论 0 0
  • 【读书内容】《这样读书就够了》作者:赵周引言部分和第一章读书为什么这么难?从正文第1页到第28页; 【具体内容及思...
    婉雯W阅读 415评论 3 7