VRF(Verifiable Random Function)
- 可验证随机函数可以看作是一个随机预言机,即可以通过任意的一个输入,获得一个随机数输出:
- 输出的结果(Output)是一个随机数,其数值会均匀分布在值域范围内
- 对于相同的Input,输出的结果Output必须是一致的
- 可验证随机函数比随机预言机多了一个非交互的零知识证明,可以用零知识证明来验证该随机数输出的正确性,表明这个随机数的确是由特定的某个人生成的,而不是伪造的。
可验证随机函数组成
- VRF GEN:生成秘钥,生成一个公私秘钥对
- VRF VAL:生成随机数进行输出
- VRF PROVE:计算零知识证明
- VRF VER:验证随机数输出
生成随机数和其证明的过程在本机执行,输入是私钥和一个值。输出随机数以及它的零知识证明。其他节点收到我发出的随机数和证明之后,结合生成该随机数的节点的公钥,即可对该随机数处进行验证
简单的方法:通过VRF生成了这个随机数value之后,可以通过设置一个全网公认阈值来判断是否被抽中,比如都认同了一个值100为阈值,假设某轮我随机到101那么,我就被允许进行下一步的操作
然而这种简单的方法,没有办法防止女巫攻击,女巫攻击可以生成很多的账号,每个账号都进行随机,进行干扰。所以现在大部分的VRF抽签方案都采用基于权益来进行票数分配,也就是每个人都有投票的机会,但是因为个人的权益不同,每个人的票的权重也是不一样的,然后进行抽签算法的设计。这样的话,如果将一个权重很高的账户拆分成权重很低的很多个账户,每一个的账户的投票的权重很低,因此对于系统的进行投票的干扰性很小。
无交互抽签
最普遍的一种方案,通过二项分布来进行抽签结果的计算。
- 首先通过私钥生成了value,这个value实际上可以看作是大的正整数,假设是256bit的,那么它的取值范围应该处于0到2的256次方之间。相应的它与2的256次方相除,可以得到一个0到1之间的值。
- 将这个值放到二项分布的累积分布中进行比对,可以得到相应的值
- 如果这个值大于零,就相当于抽到了可以进行下一步的签。
二项分布
验证
- 将这个值和之前VRF生成的和一起,广播给其他人,其他任何收到的用户结合广播者的公钥以及全网都知道的值,则可以验证以下两个条件是否成立:
- 利用验证是否正确
- 利用通过二项分布函数得到j'是否与j相等
假设两个条件均成立,那么就证明这个抽签结果是正确的,是可信的。到此为止,从抽签生成到验证的过程就完成了。
优点
1、首先它的抽签过程不需要与其他通信,直接在本机就能够的到这个抽签结果,而且这个x输入是大家公认的,针对同一个x的输出value是固定的,因此无法通过多次尝试来改变抽签结果
2、某个节点收到其他节点的抽签信息之后,可以用附带的证明,来证明这个随机数的正确性,保证它的确是由私钥的拥有者计算出来的。因此这个抽签结果是无法被伪造的。
3、VRF主要用来的得出一个伪随机数,抽签的部分主要是由一个二项分布函数负责,而通过构建二项分布的参数,我们可以很方便的控制需要被得出的中签权益的个数,适配不同的需要抽签的场景。
参考链接
- 区块链中VRF的应用及原理解析