区块链知识之 VRF: 可验证随机函数
Posted 飘飘白云
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了区块链知识之 VRF: 可验证随机函数相关的知识,希望对你有一定的参考价值。
区块链知识之 VRF: 可验证随机函数
介绍
可验证随机函数(Verifiable Random Function
,简写 VRF
)是一种将输入映射为可验证的伪随机输出的加密方案。该方案是由 Micali
(Algorand
的创建者)、Rabin
以及 Vadhan
于1999年提出的。Sharon Goldberg
,Moni Naor
,Dimitris Papadopoulos
,Leonid Reyzin
和 Jan Včelák
维护了一份 VRF
规范标准化文档,目前最新版本为 draft-irtf-cfrg-vrf-version03。至今 VRF
已广泛应用于各种加密场景、协议和系统中。如区块链项目 Algorand、Google
开源项目keytransparency、雅虎的开源项目coname、本体的 VBFT算法。
在区块链共识算法中,VRF
常用于加密抽签以选举 Leader
或委员会。
Algorand 的 VRF是基于 draft-irtf-cfrg-vrf-version03规范实现的,用于抽签选择委员会。本体的 VBFT
实现中使用了 Google
的开源 VRF
实现,在 VBFT
中 VRF
用于抽签选举提案节点、验证节点以及确认节点。
算法
VRF
算法由一组三个加密函数组成:Keygen
、Evaluate
以及 Verify
。
Keygen(r)
→(VK, SK)
:对任意随机输入,Keygen 产生一对非对称密钥对:验证密钥 VK(公钥) 和私钥 SK。Evaluate(SK, X)
→(Y, ⍴)
:求值函数 Evaluate 输入私钥 SK、消息 X,输出伪随机字符串 Y 和证明 ⍴。Verify(VK, X, Y, ⍴)
→0/1
: 验证函数 Verify 输入验证密钥 VK、消息 X 以及求值函数中的输出:伪随机字符串 Y 和证明 ⍴。输出结果0/1
:只有该函数验证了证明 ⍴ 是根据 X 生成的,且根据证明 ⍴ 可以推导出 Y,才会输出 1,也就是说该函数验证 X 与 Y 是否存在唯一的对应关系。
对于相同的密钥对以及消息 X
输入,VRF
只会产生唯一的伪随机字符串 Y
和证明 ⍴
。因此:
- 输出
Y
是唯一的,因此具有不可伪造或抵赖性,因为不可能通过给定的密钥对(VK, SK)
和消息X
产生不同的输出Y
和证明⍴
。 - 输出
Y
是伪随机的,因此对于不知道证明⍴
的第三方来说它看起来就是随机的、不可预测的。如果同时给出证明⍴
,就很容易通过调用验证函数Verify
来验证Y
。 - 即使在用户随意选择密钥对的情况下上述两个特性也会保持。因此,验证者可以在用户不公开私钥的情况下证明用户确实持有该私钥,也就是“零知识证明”。
零知识证明
零知识证明(Zero—Knowledge Proof),是由S.Goldwasser
、S.Micali
及 C.Rackoff
在20世纪80年代初提出的。它指的是证明者能够在不向验证者提供任何有用的信息的情况下,使验证者相信某个论断是正确的。零知识证明实质上是一种涉及两方或更多方的协议,即两方或更多方完成一项任务所需采取的一系列步骤。证明者向验证者证明并使其相信自己知道或拥有某一消息,但证明过程不能向验证者泄漏任何关于被证明消息的信息。
示例一
有一个缺口环形的长廊,出口和入口距离非常近(在目距之内),但走廊中间某处有一道只能用钥匙打开的门,A要向 B 证明自己拥有该门的钥匙。采用零知识证明,则 B 看着 A 从入口进入走廊,然后又从出口走出走廊,这时 B 没有得到任何关于这个钥匙的信息,但是完全可以证明 A 拥有钥匙。
示例二
A 拥有 B 的公钥,A 没有见过 B,而 B 见过 A 的照片,偶然一天两个人见面了,B 认出了 A,但 A 不能确定面前的人是否是 B,这时 B 要向 A 证明自己是 B,有两种方案。
- B 把自己的私钥给 A,A 用公钥对某个数据加密,然后用 B 的私钥解密,如果正确,则证明对方确实是B。
- A 给出一个随机值,并使用B的公钥对其加密,然后将加密后的数据交给 B,B用自己的私钥解密并展示给 A,如果与 A 给出的随机值相同,则证明对方是 B。
第二种方案就是零知识证明,A 不必知道私钥信息就可以证明 B 持有相应的私钥。
VRF 的实现
- Algorand 的 libsodium 是基于 draft-irtf-cfrg-vrf-version03 规范实现的。
- Google 开源项目 keytransparency。
- 雅虎的开源项目 coname。
VRF 在区块链中的应用
VRF
在区块链中的应用通常是利用其求值函数产生的伪随机字符串输出 Y
。因为该输出 Y 是伪随机的,不可预测的且是可验证的,因此非常适合当做随机数源来随机地选择,且抽签结果其他节点可以很方便进行验证。通常也会用追寻中本聪算法(FTS)来结合权益(Stake
)比重做随机选择。
Algorand 的共识算法
Algorand 的共识算法是一种快速拜占庭一致协议,该共识不需要网络上的所有用户参与来达成一致,每一轮只需要一个数量小得多的随机选择的委员会达成一致即可。
每一个 Algorand 用户持有私钥 SK
,并公开其验证公钥 VK
。如果一个用户想知道他是否被选中在参与出块 r 的委员会中,他将行动如下:
- 调用
Evaluate(SK, Qr)
→(Y, ⍴)
,Qr
是对系统中所有人公开的一个种子。 - 检查
Y
是否在值域[0, P]
范围内,该值域的范围取决于用户拥有的权益比重。
如果上面的检查通过,那么用户就拥有了出块 r
的委员会成员资格,且该资格可被他人通过的一组值(Qr,VK,Y,⍴)
来进行验证:Y
是唯一可被推导的,且在值域 [0, P]
范围内。也就是说用户被选择参与出块 r
,该选择过程是可被他人验证的,且是随机不可预测的。
Ontology 的 VBFT 算法
Ontology
的 VBFT
算法是基于参与的共识节点进行的,共识节点是经过认证的拥有一定数量本体币的节点,类似于EOS
的超级节点,不是网络中的所有节点都能够参与共识。
- 计算
VrfValue
:每一个节点用当前块的信息当做输入X
计算一组可验证的值VrfValue
:(Y, ⍴)
。 - 每个共识节点根据新的
Y
,以及所有共识节点的Pos
表,无需网络通信,就可以算出一致的产生下一块的提案节点、验证节点以及确认节点,其中Pos
表存放了所有共识节点的代币 权重。 - 从
VRF
得到的多个提案节点,将独立提出备选区块。提案节点产生的块头会包含一个可验证的随机值:VrfValue
,如果当前提案节点产生的块被选中作为最终块,则当前提案节点产生的VrfValue
会用于生成下次共识节点列表。 - 从
VRF
得到的多个验证节点,将从网络中收集备选的区块,进行验证,然后对最高优先级的备选区块进行投票。验证节点会对提案节点产生的VrfValue
进行验证,确认其合法性。 - 从
VRF
得到的多个确认节点,对上述验证节点的投票结果进行统计验证,并确定出最终的共识结果。 - 所有节点都将接收确认节点的共识结果,并在一轮共识确认后开启新的共识。
引用
- algorand-releases-first-open-source-code-of-verifiable-random-function
- 零知识证明(Zero—Knowledge Proof)
- 追寻中本聪算法(FTS)
以上是关于区块链知识之 VRF: 可验证随机函数的主要内容,如果未能解决你的问题,请参考以下文章