可验证随机函数 Verifiable Random Function(VRF)
在 substrate 的 BABE 中为了使出块不可预测,减少去中心化程度,使用了 VRF.
简单描述一下 BABE (POS)的出块流程
- 想要出块的 node 在一个 epoch 中抵押一定数量的 token,
- 下一个 epoch 来临后,这个抵押了代币的node 就成为了验证者具有了出块的权利
- 到下一个 slot 后,node 使用自己的私钥与一个输入 x (比如要打包的区块的 hash,具体x 是什么忘记了)经过 VRF 得到一个随机值 y 和正确生成 y 的证明 proof
- 当这个 y 小于自己抵押的 token 数量时,node 就可以向其他node 广播自己打包的块
- 其他 node 收到这个块后使用公钥和 proof 后就可以确定这个 y 是否是被正确计算出来的,从而网络达成共识
VRF 介绍
VRF 和伪随机函数功能类似,通过任意一个输入,可以获得一个随机数输出:
- 对于不同的输入,输出是随机的,并且均匀分布在值域范围内.
- 对于相同的输入,得到的输出是相同的
但相比于伪随机函数,VRF 多了一个非交互的零知识证明,使用私钥和输入生成proof,其他人可以使用公钥和输入来验证随机数输出的正确性.
VRF 定义为$$(output, proof) <- VRF(input, sk)$$
input 为合法输入,sk 是用户的私钥,output 是输出的随机数,proof 可以证明输出的数据合法.
VRF具体流程
- 生成公私钥(SK,PK),并给定一个输入 x
- 计算 y = Fsk(x) 和 proof = Psk(x)
- 使用 PK 和 proof,所有人都可以验证 y = Fsk(x) 是被正确计算出来的