但在这里没有明白为什么在
V
R
F
V
E
R
VRF_{VER}
VRFVER环节需要x,y,
π
\pi
π信息。以及message x是什么,如何选取才能取到伪随机性。
VRF 这个概念最早由 Micali,Rabin 和 Vadhan 三个人所提出。
一句话描述: 以sk和随机种子作为输入,输出伪随机数r和对应的证明proof
任何人可以通过sk对应的公钥vk加上证明proof来验证伪随机数r是否有sk持有者生成。
特点:
1)可验证性:任何人可以通过vk和proof验证随机数r是sk和x对应的输出;
2)唯一性:sk和x不变的情况下,输出的伪随机数r是唯一的;
3)随机性:不给定证明proof的情况下,VRF的输出的伪随机数r与其他伪随机数r’对于敌手来说是不可区分的。
关于第三步:验证
验证函数 Verify 输入验证密钥 vk、消息 x 以及伪随机y和证明
π
\pi
π。输出结果0/1:只有该函数验证了证明
π
\pi
π 是根据 x 生成的,且根据证明
π
\pi
π可以推导出 Y,才会输出 1,也就是说该函数验证 X 与 Y 是否存在唯一的对应关系。
如果没有
π
\pi
π,就类似数字签名,这里只能通过vk证明sk对消息x进行了签名验证,但是如果对消息x用了一种算法进行处理后的信息不能验证,即不能验证f(x)。
而ZKP零知识证明正好是可以做到在不透露秘密sk的条件下,验证基于sk提出的承诺statement。(与数字签名的区别是,数字签名是不提供sk的情况下证明原本的消息x,而ZKP可以做到不提供sk的条件下对x的推论
f
s
k
(
x
)
f_{sk}(x)
fsk(x)的证明)
区块打包节点选择方式:让各个节点自己抽签,抽中之后,大家可以很容易地验证这个结果确实是你生成的。
具体过程有可能是这样的:假设现在是 round 10(第 10 轮),节点们会轮流抽签,以节点自己的私钥 + 一个全网都知道的随机数(比如是这轮的轮次 10)作为输入,生成了一个随机数(假设在0-100);设置一个条件:100 个节点轮流抽签,谁先抽出来的随机数大于 10,就是这一轮的打包者。假设 5 号节点抽到了 11,可是只有 5 号知道其他人不知道,因此他在广播这个随机的同时还需要广播一个零知识证明。通过零知识证明,全网只需要通过 5 号的公钥就可以验证,接受 5 号为这轮打包者。
可验证随机函数一共包含四个函数:1、生成密钥,生成一个公钥私钥对;2、生成随机数输出;3、计算零知识证明;4、验证随机数输出。
VRF 的目的就是要生成一个真正随机而且无法被预测的值。在区块链选出块节点的过程中,为了保证安全,随机是一个基本要求。不过,区块链选节点不单纯是随机就 OK 的,还要考虑到攻击成本等,所以共识机制往往加入算力和持币权益等影响因素,以增加攻击者的攻击成本。如果单纯使用随机算法,就很容易受到女巫攻击,攻击者可以廉价找大量的傀儡机(肉鸡)来增加自己抽中的概率。
1.某目前尚未见刊的论文
2.密码学小知识(8):可验证随机函数(Verifiable Random Function, VRF)
3.可验证随机函数VRF
4.可验证随机函数(VRF)应用于区块链共识的原理和方法
5.区块链知识之 VRF: 可验证随机函数