可验证随机函数(VRF)
文章目录
- 一、背景以及场景
- 共识发展
- 第一代 POW “以力取胜”
- 第二代 POS/DPOS “民主投票”
- 第三代 VRF “运气抽签”
- 二、可验证随机函数(VRF)快速开始
- 1. VRF是什么?
- 2. MD5 hash函数和VRF(Verifiable Random Function)区别
- 3. VRF-可验证随机函数
- vrf常用库(持续积累更新中)
- 参考
一、背景以及场景
在区块链场景中,有的框架会用算法随机产生出块节点与验证节点(如Algorand),甚至解决分叉。按传统的随机算法,按一定的哈希规则随机轮询,选出一个节点来记账/验证。如果这个随机轮询的规则是谁都可以复现的,那么可以推测出将来的某个记账/验证节点,集中攻击它。
为了解决这个问题,就引入了VRF,只有自己能够完成这个哈希过程,而别人只能在他声明之后验证这个过程,防止有人可以提前推测出将来的记账节点。
VRF的目的就是要生成随机值,且无法被预测,同时还要可验证,可重放。
共识发展
区块链新一代共识算法:VRF分布式可验证随机函数
参考URL: https://blog.csdn.net/wxid2798226/article/details/84316219
假设一个小岛,没有法币,由101个对等的没有隶属关系的记账人来记录小岛的经济活动(也就是所谓去中心化记账)。这样的设计,冗余性应该非常好,某个记账人出问题了不影响整个系统,最大的麻烦是这么多人同记一本账,而且没有中心化的统一指挥,会不会出现不同人记的不一致?以谁为准?那么不同人分布式各自记账的前提下,怎么用规则保证各自记的账相互核对是一致的?这个就是所谓共识问题
第一代 POW “以力取胜”
真实世界中,比特币和以太坊用的就是POW,以力量取胜(即芯片算力),目前已经发展了好几代专用芯片,消耗了巨额的设备购置资金,POW挖矿过程中也消耗了很多能源。另外,POW的性能也不好,比特币和以太坊的tps(每秒处理的事务)都不高。POW最大的优点是久经考验,比特币运行到现在十年了,POW算法证明是行之有效;以太坊POW运行到现在也好几年了,想换成其他算法一直没换成。可见POW现阶段是有其存在的道理的。
第二代 POS/DPOS “民主投票”
真实世界中,以太坊准备从POW换成POS,EOS的共识算法是DPOS(DPOS和POS的差别可以认为是间接民主和直接民主的区别,POS是一币一票直接投票;DPOS是一币一票先选举出人大代表,再由人大代表对具体议题投票)。实践中效果很一般:
- POS虽然不浪费能源,但是别忘了人类社会永恒的不均衡性,很多时候,巨额财富只掌握在小部分人手里。以太坊大部分都只掌握在少数“巨鲸”手里,改成POS,小散没什么话语权,也不会取关心投票,建设生态,和去中心化的理念相违背
- DPOS在EOS的实践也有待考验,目前看普通使用者也没有什么动力去投票,一是对被选举者不了解,二是投票也花费时间,更何况普通人的票也起不了太大作用,因为抵不上“巨鲸”手里一个零头。
第三代 VRF “运气抽签”
除了投票外,人类社会还有一个解决办法是抽签,不过不是排队轮流从一个筒子里面抽签(那样太中心化了,中心的那个抽签筒容易动手脚),而是每个人一个抽签桶,各自抽完了再亮相出来比大小,最小的为准;两人抽中同一个签,可以这两人再抽一轮。
那么怎么防止作弊呢?比如每个人都挑最小的签,然后宣称自己是抽中呢。这样的分布式抽签永远没有结果了。现实世界针对这样的问题,**采取一种叫做“零知识证明”的数学机制,没做实际抽签动作,是凑不出实际的结果的,也通不过大家的校验。**在区块链小岛上,你可以想象成,每个人边抽签边用手机录下抽签过程和轮次标志,如果大家有疑问可以回放录像。
总之,这个解决方案我感觉很接近于中本聪原来设想的那个区块链世界。不再有矿场和矿机浪费能源,损害去中心化;效率也很高;而且保证了尾部参与者也能有机会参与记账,有一定的公平性。下一代的共识算法已来。
POW靠蛮力取胜,中本聪设想的“一cpu一票”的乌托邦并没有到来,他忘记了人类社会的不均衡性,POW形成了一个个中心化的大矿场,利益的集中化导致普罗大众并不关心区块链;矿场主本身也是逐利而来,并不关心生态;资源和利益集中在少部分大矿场和大交易所手里,普罗大众只求炒币分一杯羹,结果被“割韭菜”。
DPOS也存在同样的问题,投票制度最早是希腊雅典在面对波斯人入侵时被发明出来决定是战是降的生死存亡问题(参见民主的起源);DPOS现在投票率很低,票又集中在少数人手中,那些炒作eos的普通人有几个真正关心生态并花时间认真行使投票权?
**解决这个问题,需要长时间探索。也许抽签制的VRF是个解决方法。**至少这个制度下,尾部的参与者也是有可能获得利益的,利益分配没有像过去那么集中。
二、可验证随机函数(VRF)快速开始
1. VRF是什么?
VRF 这个概念最早由 Micali,Rabin 和 Vadhan 三个人所提出。
一句话描述: 以sk和随机种子作为输入,输出伪随机数r和对应的证明proof
任何人可以通过sk对应的公钥vk加上证明proof来验证伪随机数r是否有sk持有者生成。
VRF是可验证随机函数(verifiable random function),一方面具有伪随机性,另一方面它还具有可验证性(输出包括一个非交互零知识证明)
eg. 假设现在是round 10(第10 轮),节点们可能会轮流抽签,以节点自己的私钥+ 一个全网都知道的随机数(比如是这轮的轮次10)作为输入,生成了一个随机数(0-100);设置一个条件:100 个节点轮流抽签,谁先抽出来的随机数大于10,就是这一轮的打包者。假设5 号节点抽到了11,可是只有5 号知道其他人不知道,因此他在广播这个随机的同时还需要广播一个零知识证明。通过零知识证明,全网只需要通过5 号的公钥就可以验证,接受5 号为这轮打包者。



关于第三步:验证
验证函数 Verify 输入验证密钥 vk、消息 x 以及伪随机y和证明π \piπ。输出结果0/1:只有该函数验证了证明 π \piπ 是根据 x 生成的,且根据证明π \piπ可以推导出 Y,才会输出 1,也就是说该函数验证 X 与 Y 是否存在唯一的对应关系。
所谓VRF就是指给定一个消息和一个私钥,可以计算出一个唯一确定的值,这个值唯一确定且不可预测,且可以验证。
传统的签名算法不具有唯一确定的特性,私钥持有者可以计算出多个合法解。
VRF 和伪随机函数功能类似,通过任意一个输入,可以获得一个随机数输出:
- 对于不同的输入,输出是随机的,并且均匀分布在值域范围内.
- 对于相同的输入,得到的输出是相同的
但相比于伪随机函数,VRF 多了一个非交互的零知识证明,使用私钥和输入生成proof,其他人可以使用公钥和输入来验证随机数输出的正确性.

input 为合法输入,sk 是用户的私钥,output 是输出的随机数,proof 可以证明输出的数据合法.

2. MD5 hash函数和VRF(Verifiable Random Function)区别
MD5 hash函数和VRF(Verifiable Random Function)确实有相似之处,他们都会对相同的输入产生相同的输出。但是,他们之间的主要区别在于VRF具有可验证性。
具体来说,VRF生成的输出不仅与输入有关,还与特定的私钥有关。并且,VRF在生成输出的同时,还会生成一个证明。这个证明可以被任何人使用对应的公钥来验证,以确保输出是由特定的私钥和输入生成的。这就是所谓的"可验证性",它是MD5等普通hash函数不具备的。
另外,VRF的输出具有随机性,即它的输出在所有可能的输出空间中是均匀分布的。这使得VRF的输出可以被用作随机数。而MD5等普通hash函数虽然能够生成固定长度的输出,但是这些输出并不一定具有良好的随机性。
因此,尽管MD5 hash函数和VRF在某些方面有相似之处,但是VRF由于具有可验证性和输出的随机性,使其在很多应用中更具优势。
3. VRF-可验证随机函数
VRF-可验证随机函数
参考URL: https://blog.csdn.net/yhc166188/article/details/100188559
可验证随机函数VRF
参考URL: https://blog.csdn.net/shangsongwww/article/details/88813116
VRF(Verifiable Random Function):可验证随机函数用于区块链中的意义很好理解——用以完成出块节点的随机选择。
VRF算法作为一种基于密码学的新型共识模型,最大的优势是快速共识、抗攻击能力、极低算力需求,已有的解决方案有Algorand算法和Dfinity中基于BLS的算法等。
VRF算法作为一种基于密码学的新型共识模型,最大的优势是快速共识、抗攻击能力、极低算力需求,已有的解决方案有Algorand算法和Dfinity中基于BLS的算法等。
result = SHA256(secret,info)
上面的函数,要想得到结果result,需要secret和info,要验证result,也需要secret和info,也就是说需要知道secret才能验证info和result是否对应匹配。
有没有可能在不出示secret的情况下,验证result和info是否对应匹配。这就是可验证随机函数VRF可以做到的。
result = VRF_HASH(SK,info)
其中SK表示secret key,是私钥,不对外公开的,自己秘密保存即可。与SK配对的PK表示public key,是公钥,需要公开给验证着的。有了上面这些基本的元素,具体的VRF操作流程就非常简单清晰了:
1.证明者生成一对秘钥,PK和SK;
2.证明者计算result = VRF_HASH(SK,info);
3.证明者计算proof = VRF_Proof(SK,info);
4.证明者把result和proof递交给验证者;
5.验证者计算result = VRF_P2H(proof)是否成立,若成立,继续,否则中止;
6.证明者把PK,info递交给验证者;
7.验证者计算True/False = VRF_Verify(PK,info,proof),True表示验证通过,False表示验证未通过。
验证通过,指proof是否是通过info生成的,通过proof是否可以计算出result,从而推导出info和result是对应匹配的。从上面可以看出,验证者并没有获得证明者的私钥SK,验证者同样可以推导出info和result是否对应匹配,这就是VRF的妙用。
对哈希函数的不断演化,可以简单用如下的路径来表示:
原始的哈希函数: info -> result 带秘钥的哈希函数: info,secret -> result公钥版本的VRF: info,SK -> proof,PK -> result
vrf常用库(持续积累更新中)
Schnorrkel 是Web3基金会的一个加密签名库:https://github.com/w3f/schnorrkel
Schnorrkel 实现了一个Ed25519的衍生版本,叫做sr25519,也称为Schnorrkel/Ristretto x25519,解决了使用Ed25519实现复杂协议的安全问题,并将其用于Substrate。这个库还支持其他的协议,例如分层确定性密钥派生(Hierarchical Deterministic Key Derivation,HDKD), 多签(multi-signatures,MuSig), **VRF (verifiable random function,可验证随机函数)**等。
参考
VRF介绍
参考URL: https://blog.csdn.net/shangsongwww/article/details/88797403
Chainlink 预言机教程(原理讲解 & 代码演示)
参考URL: https://www.bilibili.com/video/BV1ed4y1N7Uv/
Chainlink 预言机的原理解析
参考URL: https://learnblockchain.cn/article/4766
相关文章:
可验证随机函数(VRF)
文章目录 一、背景以及场景共识发展第一代 POW “以力取胜”第二代 POS/DPOS “民主投票”第三代 VRF “运气抽签” 二、可验证随机函数(VRF)快速开始1. VRF是什么?2. MD5 hash函数和VRF(Verifiable Random Function)区别3. VRF-…...
Node.js与npm的准备与操作
1.下载 Node.js官网:Node.jsNode.js is a JavaScript runtime built on Chromes V8 JavaScript engine.https://nodejs.org/en 打开后的界面如下: LTS(Long Term Support):长期支持版,稳定版 Current&am…...
ui设计师简历自我评价的范文(合集)
ui设计师简历自我评价的范文篇一 本人毕业于艺术设计专业,具有较高的艺术素养,平时注重设计理论知识的积累,并将理论应用到作品中。了解当下设计的流行趋势,设计注重细节、重视用户体验,对色彩搭配有着浓厚的兴趣&…...
sqli-labs靶场详解(less32-less37)
宽字节注入 原理在下方 目录 less-32 less-33 less-34 less-35 less-36 less-37 less-32 正常页面 ?id1 下面有提示 获取到了Hint: The Query String you input is escaped as : 1\ ?id1 看来是把参数中的非法字符就加上了转义 从而在数据库中只能把单引号当成普通的字…...
如何保证缓存和数据库的双写一致性?
一、什么是数据库和缓存双写一致性? 在分布式系统中,数据库和缓存会搭配一起使用,以此来保证程序的整体查询性能。也就说,分布式系统为了缓解数据库查询的压力,会将查出来的数据保存在缓存中,下次再查询时…...
Rosbag 制作 TUM数据集
Rosbag 制作 TUM数据集 一、创建rgb和depth文件夹和txt文件 mkdir rgb mkdir depth touch rgb.txt touch depth.txt 二、替换 bag 路径 和 topic tum.py: import os import cv2 import numpy as np import rosbag from sensor_msgs.msg import Image from cv_b…...
本地websocket服务端暴露至公网访问【cpolar内网穿透】
本地websocket服务端暴露至公网访问【cpolar内网穿透】 文章目录 本地websocket服务端暴露至公网访问【cpolar内网穿透】1. Java 服务端demo环境2. 在pom文件引入第三包封装的netty框架maven坐标3. 创建服务端,以接口模式调用,方便外部调用4. 启动服务,出现以下信息表示启动成功…...
男UI设计师主要是做什么的优漫教育
1、根据各种相关软件的用户群,提出构思新颖、有高度吸引力的创意设计; 2、对页面进行优化,使用户操作更趋于人性化; 3、维护现有的应用产品; 4、收集和分析用户对于GUI的需求。 二、需要学什么…...
超实用!Spring Boot 常用注解详解与应用场景
目录 一、Web MVC 开发时,对于三层的类注解 1.1 Controller 1.2 Service 1.3 Repository 1.4 Component 二、依赖注入的注解 2.1 Autowired 2.2 Resource 2.3 Resource 与 Autowired 的区别 2.3.1 实例讲解 2.4 Value 2.5 Data 三、Web 常用的注解 3.1…...
【古月居《ros入门21讲》学习笔记】11_客户端Client的编程实现
目录 说明: 1. 服务模型 2. 实现过程(C) 创建功能包 创建客户端代码(C) 配置客户端代码编译规则 编译 运行 3. 实现过程(Python) 创建客户端代码(Python) 运行…...
小程序和Vue写法的区别主要有什么不同
1.语法不同:小程序使用的是WXML、WXSS和JS,而Vue使用的是HTML、CSS和JSX。 2.数据绑定方式不同:小程序使用的是双向数据绑定,而Vue使用的是单向数据流。 1)在小程序中需要使用e.currentTarget.dataset.*的方式获取&…...
Flutter之MQTT使用
1.添加依赖: 首先,需要在Flutter项目的pubspec.yaml文件中添加mqtt_client依赖。 dependencies:#https://pub.dev/packages/mqtt_clientmqtt_client: ^10.0.02.创建MQTT客户端并连接到MQTT服务器:2.创建一个MQTT客户端实例来进行连接和通信 Fu…...
vr红色教育虚拟展馆全景制作提升单位品牌形象
720全景展馆编辑平台以其独特的优势,为展览行业带来了革命性的变革。这种创新的技术应用为参展商提供了更高效、更便捷、更全面的展示解决方案,进一步提升了展览行业的水平和影响力。 一、提升展示效果,增强品牌形象 720全景展馆编辑平台通过…...
【Spring】Spring是什么?
文章目录 前言什么是Spring什么是容器什么是 IoC传统程序开发控制反转式程序开发理解Spring IoCDI Spring帮助网站 前言 前面我们学习了 servlet 的相关知识,但是呢?使用 servlet 进行网站的开发步骤还是比较麻烦的,而我们本身程序员就属于是…...
事件循环机制及常见面试题
借鉴: 《Javascript 忍者秘籍》第二版,事件循环篇 面试 | JS 事件循环 event loop 经典面试题含答案 - 知乎 (zhihu.com) 概念 主栈队列就是一个宏任务,每一个宏任务执行完就会执行宏任务中的微任务,直到微任务全部都执行完&a…...
智能监控平台/视频共享融合系统EasyCVR接入RTSP协议视频流无法播放原因是什么?
视频集中存储/云存储/视频监控管理平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,实现视频资源的鉴权管理、按需调阅、全网分发、智能分析等。AI智能/大数据视频分析EasyCVR平台已经广泛应用在工地、工厂、园区、楼…...
c# statusStrip 显示电脑主机名、IP地址、MAC地址
控件: ToolStripStatusLabel 主机名: Dns.GetHostName() IP地址: Dns.GetHostAddresses(Dns.GetHostName())[0].ToString() 当前程序的版本: Assembly.GetExecutingAssembly().GetName().Version.ToString() 获取系统版本 …...
Cesium.CustomShader颜色值显示错误
官方示例: Cesium Sandcastle 测试过程: 1、修改示例,把customshader中的fragmentShaderText替换为如下代码 void fragmentMain(FragmentInput fsInput, inout czm_modelMaterial material) {//注意:下述颜色的b值是0.1&#x…...
XSLVGL2.0 User Manual 页面管理器(v2.0)
XSLVGL2.0 开发手册 XSLVGL2.0 User Manual 页面管理器 1、概述2、特性3、APIs3.1、xs_page_init3.2、xs_page_wait_inited3.3、xs_page_exit3.4、xs_page_acquire3.5、xs_page_release3.6、xs_page_set_bootlogo3.7、xs_page_setup_clear_finish3.8、xs_page_setup_is_finish…...
论文学习-Attention Is All You Need
Attention Is All You Need 目前暂时不会用到,大概了解一下即可。 Recurrent model 序列化的计算方式,难以并行,随着序列的增长,以前的记忆会逐渐丢失。而Attention机制可以观察到句子中所有的信息,不受距离影响&…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
