区块链知识之 VRF: 可验证随机函数

区块链知识之 VRF: 可验证随机函数

介绍

可验证随机函数(Verifiable Random Function,简写 VRF)是一种将输入映射为可验证的伪随机输出的加密方案。该方案是由 Micali(Algorand的创建者)、Rabin 以及 Vadhan 于1999年提出的。Sharon GoldbergMoni NaorDimitris PapadopoulosLeonid ReyzinJan 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 实现,在 VBFTVRF 用于抽签选举提案节点、验证节点以及确认节点。

算法

VRF算法由一组三个加密函数组成:KeygenEvaluate 以及 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.GoldwasserS.MicaliC.Rackoff 在20世纪80年代初提出的。它指的是证明者能够在不向验证者提供任何有用的信息的情况下,使验证者相信某个论断是正确的。零知识证明实质上是一种涉及两方或更多方的协议,即两方或更多方完成一项任务所需采取的一系列步骤。证明者向验证者证明并使其相信自己知道或拥有某一消息,但证明过程不能向验证者泄漏任何关于被证明消息的信息。

示例一

有一个缺口环形的长廊,出口和入口距离非常近(在目距之内),但走廊中间某处有一道只能用钥匙打开的门,A要向 B 证明自己拥有该门的钥匙。采用零知识证明,则 B 看着 A 从入口进入走廊,然后又从出口走出走廊,这时 B 没有得到任何关于这个钥匙的信息,但是完全可以证明 A 拥有钥匙。

示例二

A 拥有 B 的公钥,A 没有见过 B,而 B 见过 A 的照片,偶然一天两个人见面了,B 认出了 A,但 A 不能确定面前的人是否是 B,这时 B 要向 A 证明自己是 B,有两种方案。

  1. B 把自己的私钥给 A,A 用公钥对某个数据加密,然后用 B 的私钥解密,如果正确,则证明对方确实是B。
  2. A 给出一个随机值,并使用B的公钥对其加密,然后将加密后的数据交给 B,B用自己的私钥解密并展示给 A,如果与 A 给出的随机值相同,则证明对方是 B。

第二种方案就是零知识证明,A 不必知道私钥信息就可以证明 B 持有相应的私钥。

VRF 的实现

  1. Algorand 的 libsodium 是基于 draft-irtf-cfrg-vrf-version03 规范实现的。
  2. Google 开源项目 keytransparency。
  3. 雅虎的开源项目 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 算法

OntologyVBFT算法是基于参与的共识节点进行的,共识节点是经过认证的拥有一定数量本体币的节点,类似于EOS 的超级节点,不是网络中的所有节点都能够参与共识。

  1. 计算 VrfValue :每一个节点用当前块的信息当做输入 X 计算一组可验证的值 VrfValue(Y, ⍴)
  2. 每个共识节点根据新的 Y,以及所有共识节点的Pos表,无需网络通信,就可以算出一致的产生下一块的提案节点、验证节点以及确认节点,其中Pos表存放了所有共识节点的代币 权重。
  3. VRF 得到的多个提案节点,将独立提出备选区块。提案节点产生的块头会包含一个可验证的随机值:VrfValue,如果当前提案节点产生的块被选中作为最终块,则当前提案节点产生的VrfValue会用于生成下次共识节点列表。
  4. VRF得到的多个验证节点,将从网络中收集备选的区块,进行验证,然后对最高优先级的备选区块进行投票。验证节点会对提案节点产生的 VrfValue 进行验证,确认其合法性。
  5. VRF得到的多个确认节点,对上述验证节点的投票结果进行统计验证,并确定出最终的共识结果。
  6. 所有节点都将接收确认节点的共识结果,并在一轮共识确认后开启新的共识。

引用

  1. algorand-releases-first-open-source-code-of-verifiable-random-function
  2. 零知识证明(Zero—Knowledge Proof)
  3. 追寻中本聪算法(FTS)

你可能感兴趣的:(区块链)