可验证随机函数(Verifiable Random Function, VRF)

Posted 真·skysys

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了可验证随机函数(Verifiable Random Function, VRF)相关的知识,希望对你有一定的参考价值。

论文中的描述


但在这里没有明白为什么在 V R F V E R VRF_VER VRFVER环节需要x,y, π \\pi π信息。以及message x是什么,如何选取才能取到伪随机性。

VRF介绍

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 是否存在唯一的对应关系。

为什么VRF验证需要proof证明?

如果没有 π \\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)的证明)

VRF应用于区块链共识打包区块权的选择

区块打包节点选择方式:让各个节点自己抽签,抽中之后,大家可以很容易地验证这个结果确实是你生成的。

具体过程有可能是这样的:假设现在是 round 10(第 10 轮),节点们会轮流抽签,以节点自己的私钥 + 一个全网都知道的随机数(比如是这轮的轮次 10)作为输入,生成了一个随机数(假设在0-100);设置一个条件:100 个节点轮流抽签,谁先抽出来的随机数大于 10,就是这一轮的打包者。假设 5 号节点抽到了 11,可是只有 5 号知道其他人不知道,因此他在广播这个随机的同时还需要广播一个零知识证明。通过零知识证明,全网只需要通过 5 号的公钥就可以验证,接受 5 号为这轮打包者。

可验证随机函数一共包含四个函数:1、生成密钥,生成一个公钥私钥对;2、生成随机数输出;3、计算零知识证明;4、验证随机数输出。

VRF 的目的就是要生成一个真正随机而且无法被预测的值。在区块链选出块节点的过程中,为了保证安全,随机是一个基本要求。不过,区块链选节点不单纯是随机就 OK 的,还要考虑到攻击成本等,所以共识机制往往加入算力和持币权益等影响因素,以增加攻击者的攻击成本。如果单纯使用随机算法,就很容易受到女巫攻击,攻击者可以廉价找大量的傀儡机(肉鸡)来增加自己抽中的概率。

Reference

1.某目前尚未见刊的论文
2.密码学小知识(8):可验证随机函数(Verifiable Random Function, VRF)
3.可验证随机函数VRF
4.可验证随机函数(VRF)应用于区块链共识的原理和方法
5.区块链知识之 VRF: 可验证随机函数

python 随机生成验证码,应用random和chr函数

四位的随机验证码,chr函数的用法

b=[]
for i in range(4):
    import  random
    c=random.randint(97,122)#仅小写的ascll码范围
    b.append(chr(c))
    d=‘‘.join(b)
print(d)

四位随机验证码,包含大小写和数字

codelist=[]
import random
for i in range(48,58):#ascll码的数字范围,也可以直接用数字1-10
    codelist.append(str(chr(i)))#如果直接用数字,就用str直接转换数字为字符串添加
for i in range(65,91):#大写
    codelist.append(str(chr(i)))
for i in range(97,123):#小写
    codelist.append(str(chr(i)))
c=random.sample(codelist,4)#随机从列表中取四个值
b=‘‘.join(c)#将列表转为字符串
print(b)

随机验证码做成函数

def cod():
    codelist=[]
    import random
    for i in range(48,58):#ascll码的数字范围,也可以直接用数字1-10
        codelist.append(str(chr(i)))#如果直接用数字,就用str直接转换数字为字符串添加
    for i in range(65,91):#大写
        codelist.append(str(chr(i)))
    for i in range(97,123):#小写
        codelist.append(str(chr(i)))
    c=random.sample(codelist,4)#随机从列表中取四个值
    b=‘‘.join(c)#将列表转为字符串
    return b
a=cod()
print(a)

 

以上是关于可验证随机函数(Verifiable Random Function, VRF)的主要内容,如果未能解决你的问题,请参考以下文章

vChain: Enabling Verifiable Boolean Range Queries over Blockchain Databases(sigmod‘2019)

python随机验证码函数

Python随机数random模块学习,并实现生成6位验证码

python中随机函数

使用js Math.random()函数生成n到m间的随机数字

随机验证码图片验证码和邮箱发送用户验证码