2017 年,MIT 计算机科学与人工智能实验室(CSAIL)的 Yossi Gilad 和 Silvio Micali 等人在论文《Algorand: Scaling Byzantine Agreements for Cryptocurrencies》中针对 PBFT 算法在很多节点情况下性能不佳的问题,提出 先选出少量记账节点,然后再利用可验证随机函数(Verifiable Random Function,VRF)来随机选取领导节点,避免全网直接做共识, 将拜占庭算法扩展到了支持较大规模的应用场景,同时保持较好的性能(1000+ tps)。
一、简介
根据网络中节点的行为表现,可以将节点分为3种类型:
- 诚实节点:遵守所有的规则;
- 恶意节点:随意背离规定。
- 对手(Adversary): 可以随意将任何节点变成恶意节点,但是存在限制:
- 不会拥有无限的计算力;
- 不能伪造诚实节点的数字签名;
- 无法干扰诚实节点间的消息传递;
而Algorand 可以抵抗强大的对手:
1. 对手能腐败任何节点
解决:系统2/3的钱属于诚实节点 (Honesty Majority of Money,HMM假设)
2. 对手能控制所有被腐败的节点和所有消息的传输
解决:保证诚实节点发送的每条消息m都能在固定的一个时间内到达95%的诚实节点 (消息广播假设)
除了能够对抗强大的对手,Algorand 还具有以下属性:
- 必需的计算量已经最小化:1/1500的节点最多需要几秒钟的计算
- 新区块产生的时间少于10分钟:测试环境验证一个区块的生成要低于40s
- Algorand是纯分布式系统,没有类似比特币中的miner角色
- 节点可以随意加入和退出
- 不可预测性,出块节点和验证节点在完成自己的工作之前,其他节点都无法提前预测到
简化后的协议流程描述:
- 节点从以前的区块获取到种子值,并通过加密抽签判断自己是否是本轮的Leader。若是,则算一个新的种子值,打包出块,并广播到全网。
- 所有节点都能收集到提案的区块,通过加密抽签判断自己是否是验证节点,若是,则选出优先级最高的区块哈希值广播到全网。
- 投票阶段包含了m个步骤,在每个步骤,节点都需要通过加密抽签判断自己是否是投票节点,若是,则综合收集到的信息,得出投票结果并广播。
- 经过n个投票步骤后,最终达成共识。
1.1 预备知识
数字签名
数字签名机制由3个快速算法组成:
-
生成概率key:生成一对公钥
、私钥
-
签名算法S:使用私钥对消息的哈希进行签名
-
验证算法V:使用公钥对签名后的数据进行验证
特性:
-
合法的签名永远是可以被验证的
-
数字签名很难伪造
- 公钥、私钥的唯一性
Algorand中使用数字签名的3种场景:
- 认证自己的支付;
- 生成凭证来证明自己的角色;
- 验证节点
在每个角色的过程中发送的消息。
可验证随机函数VRF
1.2 基础概念和符号
支付集合:
第 轮的支付集合:
第 轮所有
的集合:
二、协议
Algorand 协议是一种新的、加密的拜占庭共识协议,简称为。
简单来讲,分为两部分:分级共识协议
和二元拜占庭协议
- 分级共识协议
:
让每个节点收集提案区块的哈希值,并选出自己认可的leader。 - 二元拜占庭协议
:
通过三步循环让节点投票,挑选出一个leader达成共识。
2.1 分级共识协议
步骤2:每个节点 给所有节点发送
步骤3:当且仅当 时,每个节点
给所有节点发送字符串
每个节点 的输出对
的计算如下:
定理:若 ,则
是一个
分级的广播协议。
2.2 二元拜占庭协议
3步循环:节点间不停的交换b值
节点可以在任意时间退出该循环。如果节点
在退出前,在某步骤广播了一个值
,退出后,其它节点就假装从
那收到了
值
协议有一个计数器 ,标记 3步循环 执行的次数。
3步循环:
-
节点
发送
:
-
节点
发送
:
-
节点
发送
和
:
other情况下,,
为在第3步给节点
发送了合适消息的节点,
加1,返回步骤1。
2.3
协议
- 第一阶段:分级共识协议GC
步骤1和2:每个节点执行
,输入为
,计算一对
![]()
- 第二阶段:二元拜占庭协议 BBA*
步骤3:每个节点执行
,初始输入为0(若
,则为1),计算bit位
![]()
输出决定条件:每个节点 的输出为
,则
,否则为
。
定理:若 ,则
是一个
分级的、稳健为1的
协议。
2.4 实例1:
2.4.1 符号
通用符号:
:第几轮
:第几步
:第r轮生成的区块
:第r-1轮结束时第r轮开始时的公钥集合
:第r-1轮结束时第r轮开始时的状态
:
中包含的支付集合
:第r轮的领导者,它选择第r轮的支付集合
,并决定种子
:第r轮结束时生成的种子,被用来选择第r+1轮的验证者。独立于区块中的支付集合,且不能被
操纵。
:第r轮第s步选中的验证者集合
:第r轮选中的验证者集合,是所有步骤的验证者集合的并集,
:
中的恶意验证者集合和诚实验证者集合,
,
:在
和
中期望的potential leader数量,
:大于2/3的常量,系统的诚实比率。
:指定可允许错误率的参数
:在第r轮中,领导者是诚实节点的概率
:回望参数,第r轮的验证者从第r-k轮的节点中选择,
:在第r轮的第一步中,在第r-k轮中的节点被选中为验证者的概率
:在第r轮的s(s>1)步中,在第r-k轮中的节点被选中为验证者的概率
:区块
的签名。是在第r轮中来自合格验证者的签名
的集合
:被证明区块。
:节点i知道
的本地时间
:节点i在第r轮开始和结束步骤s的本地时间
:执行步骤1和其它步骤所需要的时间上限。
是广播一个1MB区块所需要的时间上限。假设
2.4.2 协议步骤
-
提案区块:
节点
只要知道了
,就开启了它的第r轮第1步
- 节点从
中计算出
,并且检测是否
- 若
,i停止
- 若
,即i是potential leader
- 收集广播给它的第r轮的支付,并且从中得出最大化支付集合
- 计算出它的候选区块
- 计算出消息
- 销毁临时私钥
,广播
- 收集广播给它的第r轮的支付,并且从中得出最大化支付集合
注:
消息是有选择的广播。节点i收到第一条
消息并验证成功后,正常广播;随后收到的、并验证成功的
消息,当且仅当它包含的凭证哈希比之前收到的
消息的凭证哈希都要小时才会被广播出去。也可以先让每个potential leader单独广播它们的凭证
,然后让含有较小凭证哈希值的节点广播它们的
消息
- 节点从
-
GC协议的第一步:
节点
只要知道了
,就开启了它的第r轮第2步
- 节点从
中计算出
,并且检测是否
- 若
,i停止
- 若
,等待时间
,i执行以下动作:
- 节点从收到的所有
消息中为所有的凭证
计算哈希值,找到领导者
- 若节点已经从l收到了有效的消息
,i设置
,否则设置
- i计算出消息
- 销毁临时私钥
,广播
- 节点从收到的所有
- 节点从
-
GC协议的第二步:
节点
只要知道了
,就开启了它的第r轮第3步
- 节点从
中计算出
,并且检测是否
- 若
,i停止
- 若
,等待时间
,i执行以下动作:
- 若存在一个值
(即节点收到的所有有效
消息中,多余2/3的消息格式为
),i计算出消息
;否则
- 销毁临时私钥
,广播
- 若存在一个值
- 节点从
-
跳出GC协议,BBA*的第一步:
节点
只要知道了
,就开启了它的第r轮第4步
- 节点从
中计算出
,并且检测是否
- 若
,i停止
- 若
,等待时间
,i执行以下动作:
- 节点按照以下方法计算GC的输出:
- 若存在一个值
(即节点收到的所有有效
消息中,多余2/3的消息格式为
),则
;
- 若不存在
(即节点收到的所有有效
消息中,多余1/3的消息格式为
),则
;
- 否则,
;
- 若存在一个值
- 节点计算
的输入:
- 节点计算消息
- 销毁临时私钥
,广播
- 节点按照以下方法计算GC的输出:
- 节点从
-
步骤s,
:
的Coin-Fixed-To-0步
节点
只要知道了
,就开启了它的第r轮第s步
- 节点从
中计算出
,并且检测是否
- 若
,i停止
- 若
,等待时间
,i执行以下动作:
- 以0结束:在等待时,若存在一个值
和步骤
,使得:
- (a)
,即
是Coin-Fixed-To-0步骤
- (b)i收到至少
个有效消息
,同时
- (c)i收到了一个有效消息
,i停止步骤s,设置
,将子步骤(b)中消息
的集合设置为它自己的
- (a)
- 以1结束:在等待时,若存在一个步骤
,使得:
- (a')
,即
是Coin-Fixed-To-1步骤
- (b')i收到至少
个有效消息
,同时
- (c')i停止步骤s,设置
,将子步骤(b')中消息
的集合设置为它自己的
- (a')
- 其它:在等待结束时,节点i执行以下动作:
- 在收到的
中,有超过2/3的
,则令
- 否则令
- 节点计算消息
- 销毁临时私钥
,广播
- 在收到的
- 以0结束:在等待时,若存在一个值
- 节点从
-
步骤s,
:
的Coin-Fixed-To-1步
节点
只要知道了
,就开启了它的第r轮第s步
- 节点从
中计算出
,并且检测是否
- 若
,i停止
- 若
,等待时间
,i执行以下动作:
- 以0结束:同 Coin-Fixed-To-0 步骤
- 以1结束:同 Coin-Fixed-To-0 步骤
- 其它:在等待结束时,节点i执行以下动作:
- 在收到的
中,有超过2/3的
,则令
- 否则令
- 节点计算消息
- 销毁临时私钥
,广播
- 在收到的
- 节点从
-
步骤s,
:
的Coin-Genuinely-Flipped步
节点
只要知道了
,就开启了它的第r轮第s步
- 节点从
中计算出
,并且检测是否
- 若
,i停止
- 若
,等待时间
,i执行以下动作:
- 以0结束:同 Coin-Fixed-To-0 步骤
- 以1结束:同 Coin-Fixed-To-0 步骤
- 其它:在等待结束时,节点i执行以下动作:
- 在收到的
中,有超过2/3的
,则令
- 在收到的
中,有超过2/3的
,则令
- 否则令
,
为收到的有效消息
中获得的
-验证者
- 节点计算消息
- 销毁临时私钥
,广播
- 在收到的
- 节点从
-
步骤
:
的最后一步
节点
只要知道了
,就开启了它的第r轮第
步
- 节点从
中计算出
,并且检测是否
- 若
,i停止
- 若
,等待时间
,i执行以下动作:
- 以0结束:同 Coin-Fixed-To-0 步骤
- 以1结束:同 Coin-Fixed-To-0 步骤
- 其它:在等待结束时,节点i执行以下动作:
- 在收到的
中,有超过2/3的
,则令
- 设置
- 节点计算消息
- 销毁临时私钥
,广播
来验证
- 在收到的
- 节点从
- 非验证者在第r轮的区块重构:节点
只要知道了
,就开启了它的第r轮,并且按以下方法等待区块信息
- 在等待期间,若存在
使得:
- (a)
- (b)i收到至少
个有效消息
- (c)i收到一个有效消息
- i停止它的r轮执行,令
,将子步骤(b)中消息
的集合设置为它自己的
- (a)
- 在等待期间,若存在
使得:
- (a')
- (b')i收到至少
个有效消息
- i停止它的r轮执行,令
,将子步骤(b')中消息
的集合设置为它自己的
- (a')
- 在等待期间,若i收到至少
个有效消息
- i停止它的r轮执行,令
,将1和
的消息
的集合设置为它自己的
- i停止它的r轮执行,令
- 在等待期间,若存在

网友评论