波卡运行原理系列(四)BABE共识简述
BABE是目前Kusama、Edgeware等网络使用的共识之一,用于确定出块顺序。
概念定义
Slot,槽,区块生成时间
Epoch,时期,固定长度的Slot的集合
VRF,可验证随机函数,私钥相关,任何人可以通过公钥来证明
解决问题
引入随机性,尽可能让下一个出块验证者不可预测,从而满足出块的去中心化
步骤
验证人使用自己的私钥生成VRF(随机数 + Proof)
验证人计算 SlotNo + Epoch No + 随机数 得到一个值,如果该值小于一个特定值,则获得出块机会
如果一个 Slot 方式如下情况:
1 Slot 没有人的VRF满足要求
2 Slot 多个验证者满足要求
则按照Aura顺序指定验证人出块,被称为次级Aura区块,优先级低
每个Epoch,将根据最新的Staking情况,重新选择验证者集合
重新选择验证者集合的随机数来自上一个Slot的随机值混合
BABE通过这个过程确定了出块验证者的顺序
确定出块(敲定)则需要通过GRANDPA完成,具体可以看波卡运行原理系列(三)
http://blog.boka.network/2020/02/29/bo-ka-yun-xing-yuan-li-xi-lie-san-zu-jian-zi-dian/
区块结构
区块由摘要 Digest 和 封章 Seal 组成
Digest包含:
Pre-digest:VRF输出和证明
运行时处理的 transactions 记录集合
Post-digest:Epoch 切换时才有,输出混合随机值用于重新选择验证者集合
封章即节点的签名
BABE的问题
在很小范围和概率情况下,节点可以影响随机值:
1 节点可以选择不出块,从而随机值不到下个 Epoch,因此能够实现小概率的验证人顺序预测。
2 一个Slot可能存在没有BABE验证者,或有多个验证者的情况
所以在此基础上诞生改良的 Sassafras 共识,具体可以看TangWei的视频,本文不展开讨论
https://www.bilibili.com/video/BV1bz411z73k