AIgorand区块链中VRF随机函数的应用

VRF(Verifiable Random Function)

  • 可验证随机函数可以看作是一个随机预言机,即可以通过任意的一个输入,获得一个随机数输出:
  • 输出的结果(Output)是一个随机数,其数值会均匀分布在值域范围内
  • 对于相同的Input,输出的结果Output必须是一致的
  • 可验证随机函数比随机预言机多了一个非交互的零知识证明,可以用零知识证明来验证该随机数输出的正确性,表明这个随机数的确是由特定的某个人生成的,而不是伪造的。

可验证随机函数组成

  • VRF GEN:生成秘钥,生成一个公私秘钥对
  • VRF VAL:生成随机数进行输出
  • VRF PROVE:计算零知识证明
  • VRF VER:验证随机数输出

生成随机数和其证明的过程在本机执行,输入是私钥和一个值。输出随机数以及它的零知识证明。其他节点收到我发出的随机数和证明之后,结合生成该随机数的节点的公钥,即可对该随机数处进行验证

简单的方法:通过VRF生成了这个随机数value之后,可以通过设置一个全网公认阈值来判断是否被抽中,比如都认同了一个值100为阈值,假设某轮我随机到101那么,我就被允许进行下一步的操作

然而这种简单的方法,没有办法防止女巫攻击,女巫攻击可以生成很多的账号,每个账号都进行随机,进行干扰。所以现在大部分的VRF抽签方案都采用基于权益来进行票数分配,也就是每个人都有投票的机会,但是因为个人的权益不同,每个人的票的权重也是不一样的,然后进行抽签算法的设计。这样的话,如果将一个权重很高的账户拆分成权重很低的很多个账户,每一个的账户的投票的权重很低,因此对于系统的进行投票的干扰性很小。

 

无交互抽签

 

最普遍的一种方案,通过二项分布来进行抽签结果的计算。

  • 首先通过私钥生成了value,这个value实际上可以看作是大的正整数,假设是256bit的,那么它的取值范围应该处于0到2的256次方之间。相应的它与2的256次方相除,可以得到一个0到1之间的值。
  • 将这个值放到二项分布的累积分布中进行比对,可以得到相应的值
  • 如果这个值大于零,就相当于抽到了可以进行下一步的签。

二项分布

验证

  • 将这个值和之前VRF生成的和一起,广播给其他人,其他任何收到的用户结合广播者的公钥以及全网都知道的值,则可以验证以下两个条件是否成立:
  • 利用验证是否正确
  • 利用通过二项分布函数得到j'是否与j相等

假设两个条件均成立,那么就证明这个抽签结果是正确的,是可信的。到此为止,从抽签生成到验证的过程就完成了。

优点

1、首先它的抽签过程不需要与其他通信,直接在本机就能够的到这个抽签结果,而且这个x输入是大家公认的,针对同一个x的输出value是固定的,因此无法通过多次尝试来改变抽签结果

2、某个节点收到其他节点的抽签信息之后,可以用附带的证明,来证明这个随机数的正确性,保证它的确是由私钥的拥有者计算出来的。因此这个抽签结果是无法被伪造的。

3、VRF主要用来的得出一个伪随机数,抽签的部分主要是由一个二项分布函数负责,而通过构建二项分布的参数,我们可以很方便的控制需要被得出的中签权益的个数,适配不同的需要抽签的场景。

参考链接

  • 区块链中VRF的应用及原理解析

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/447115.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AIgorand的相关学习参考链接

相关具体的开发者与SDK链接如下: GoSDKJavaScript SDK 网页链接 测试网申请链接Github存储库链接开发者网址AIgorand官网Telegram电报群综合白皮书MediumNaver Blog领英Linkedin区块链浏览器INC公示钱包地址基金会公示钱包地址Telegram电报群官方 Github地址 相关…

操作系统 内核栈

视频哈工大李治军老师:https://www.bilibili.com/video/BV1d4411v7u7?p12 参考文档:https://blog.csdn.net/SakuraA6/article/details/108810916 学长在我大一推荐我看,p12和p13的内容真的有那么难吗,现在已经是我看的第三遍了还…

区块链技术指南 序章理解感悟

序二 误区一: 区块链是一种颠覆性的新技术。区块链不是一个新的技术,而是一个新的技术的组合。其关键的技术,包括P2P动态组网、基于密码学的共享账本、共识机制(拜占庭将军问题,分布式场景下的一致性问题&#xff09…

面经:红黑树 B树 B+树 哈希表

1.对于插入,删除,查找 以及 输出有序序列 这几个操作,红黑树也可以完成,时间复杂度 与 用跳表实现是相同的。 但是,对于按照区间查找数据这个操作(比如 [20,300]),红黑树的效率没有跳表高&#…

回溯法和dfs的区别

值得注意,回溯法以深度优先搜索的方式搜索解空间,并且在搜索过程中用剪枝函数避免无效搜索。那为何 回溯算法 深度优先搜索 剪枝函数这一说法没有错? 因为树是特殊的图。简单来说,树是广义的图。再简单来说,树是图。…

C++学习笔记 简单部分

C 数据类型 使用变量来存储各种信息,变量保留的是它所存储的值的内存位置。这意味着,当创建一个变量时,就会在内存中保留一些空间。这段内存空间可以用于存储各种数据类型(比如字符型、宽字符型、整型、浮点型、双浮点型、布尔型…

Redis kqeue相关源码

mask 或delmask :添加或者删除的事件类型,AE_NONE表示没有任何事件;AE_READABLE表示可读事件;AE_WRITABLE表示可写事件; 如aeCreateFileEvent(loop,e->fd,AE_READABLE,redisAeReadEvent,e); static int aeApiAddEv…

C++学习笔记章节中 面向对象详解

C 类&对象 C类定义 本质上是一个数据类型的蓝图,定义了类的对象包含的信息,以及可以在这个类对象上执行哪些操作。类的定义是以class开头,后面接类的名称。类的主体是包含在一个花括号中,类的定义之后,必须跟着一…

Mac 破解软件打不开没有权限

Mac 破解软件打不开没有权限 sudo codesign -fs - /Applications/CleanMyMac\ X.app文件损坏 xxx sudo xattr -r -d /Applications/MarginNote\ 3.app sudo xattr -r -d com.apple.quarantine xxxx sudo codesign --force --deep --sign - /Applications/MarginNote\ 3\…

条件变量之虚假唤醒

当线程从等待已发出信号的条件变量中醒来,却发现它等待的条件不满足时,就会发生虚假唤醒。之所以称为虚假,是因为该线程似乎无缘无故地被唤醒了。但是虚假唤醒不会无缘无故发生:它们通常是因为在发出条件变量信号和等待线程最终运…

拷贝构造函数和拷贝赋节省代码最好用一个私有的函数

令 copy assignment操作符调用copy构造函数是不合理的,因为这就像试图构造一个已经存在的对象。这件事如此荒涔,乃至于根本没有相关语法。是有一些看似如你所愿的语法,但其实不是;也的确有些语法背后真正做了它,但它们…

解决Dr.com上不了网的问题

如果软件安装之后上不了网,会显示出错的信息,可以针对所显示的问题,去定向搜索。 如果是软件自身的问题,进入终端页面,可以使用一下这条命令 netsh winsock reset 然后需要重启电脑

terminate called after throwing an instance of ‘std::logic_error‘ what(): basic_string::_M_constr

terminate called after throwing an instance of ‘std::logic_error’ what(): basic_string::_M_construct null not valid 用0初始化字符串 编译不报错

密钥协商(密钥交换)机制的讲解

国标文件涉及密钥协商算法的函数 生成密钥协商参数并输出计算会话密钥产生协商数据并且计算会话密钥 密钥协商(交换)算法及其原理 密钥交换/协商目的 “密钥协商机制”是:(在身份认证的前提下)规避【偷窥】的风险。…

基于ECC算法的秘钥协商

基于ECC算法的衍生算法 ECDH(ECCDH)RSAECDHE(ECCDHE) ECDH密钥协商(ECCDH) 椭圆曲线密码学是属于非对称密码学的,其私钥的计算公式如下: 私钥是一个随机数d,取值范围在1……n-1,其中n是子群的阶公钥是点HdG&#xff…

C++11 多线程相关知识的学习

C多线程类Thread(C11) C11中std命名空间将Boost库中的Thread加入,Boost的多线程从准标准变为标准,这里将其用法整理复习,以demo的形式复习,还是喜欢看我自己写的东西,符合我的个人逻辑头文件为…

vscode vim 插件自定义配置

{"workbench.colorTheme": "Material Theme","files.defaultLanguage": "markdown", //新建文档格式为markdown格式"vim.easymotion": true,"vim.leader": " ", // leader键"vim.useSystemClipbo…

C++11 explicit关键字的作用

explicit 在C中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换。因为无参构造函数和多参构造函数本身就是显示调用的。再加上explicit关键字也没有什么意义…

c++ 指针的强制类型转换

#include <iostream> using namespace std; class A { public:int i;int j;A(int n):i(n),j(n) { } }; int F2 (int,char *){return 1; }; int F1 (int){return 2; }; int main() {A a(100);int &r reinterpret_cast<int&>(a); //强行让 r 引用 ar 200; …

C++11学习 virtual(虚函数)的用法

Virtual虚函数 在面向对象的C语言中&#xff0c;虚函数&#xff08;virtual function&#xff09;是一个非常重要的概念。因为它充分体现了面向对象思想中的继承和多态性这两大特性&#xff0c;在C语言里应用极广。多态性&#xff1a;其含义就是多种形式&#xff1b;将具有继承…