关于第三步:验证 验证函数 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 的目的就是要生成一个真正随机而且无法被预测的值。在区块链选出块节点的过程中,为了保证安全,随机是一个基本要求。不过,区块链选节点不单纯是随机就 OK 的,还要考虑到攻击成本等,所以共识机制往往加入算力和持币权益等影响因素,以增加攻击者的攻击成本。如果单纯使用随机算法,就很容易受到女巫攻击,攻击者可以廉价找大量的傀儡机(肉鸡)来增加自己抽中的概率。
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)的主要内容,如果未能解决你的问题,请参考以下文章