可验证随机函数(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 和伪随机函数功能类似,通过任意一个输入,可以获得一个随机数输出:

  1. 对于不同的输入,输出是随机的,并且均匀分布在值域范围内.
  2. 对于相同的输入,得到的输出是相同的
    但相比于伪随机函数,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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java核心知识点整理大全15-笔记

Java核心知识点整理大全-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全2-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全3-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全4-笔记-CSDN博客 Java核心知识点整理大全5-笔记-CSDN博客 Java核心知识点整理大全6…

h5小游戏--2048

2048 经典2048小游戏,基于JS、Html5改写版 效果预览 点我下载源代码 下载代码解压后,双击index.html即可开始本游戏。 Game Rule 游戏规则 以下为游戏默认规则,若需要修改规则请修改代码。 移动箭头键来移动方块,当两个相同数…

visual studio 下的git

我这个是看视频笔记 YouTube : https://www.youtube.com/watch?vgkDASVE_Hdg 主要内容是:建立git 库, 保存commit, 建立分支 create branch, 合并分支merge branch,比较 diff,Revert ,history,delete branch, rename branch, t…

OpenCV快速入门:相机标定——单目视觉和双目视觉

文章目录 前言一、相机标定的基本原理1.1 相机模型与坐标系1.1.1 相机模型1.1.2 坐标系 1.2 相机内参与外参1.2.1 内部参数1.2.2 外部参数 1.3 镜头畸变1.4 透视变换1.5 标定的重要性和应用场景 二、单目视觉2.1 单目视觉的原理2.1.1 单目视觉的原理2.1.2 单目视觉的公式2.1.3 …

【JMeter】不同场景下的接口请求

场景1: 上传文件接口即Content-Type=multipart/form-data 步骤: 1. 接口url,method以及path正常填写 2.文件上传content-type是multipart/form-data,所以可以勾选【use multipart/form-data】,如果还有其他请求头信息可以添加一个请求头元件 3.请求参…

(2023码蹄杯)省赛(初赛)第三场真题(原题)(题解+AC代码)

题目1&#xff1a;MC0227堆煤球 码题集OJ-堆煤球 (matiji.net) 思路&#xff1a; 1.i从l枚举到r,i是8的倍数就跳过&#xff0c;i不是8的倍数就用等差数列求和公式i(1i)/2,最后累加到答案中即可 AC_Code:C #include<bits/stdc.h> using namespace std;int main( ) {in…

pytorch分布式训练

1 基本概念 rank&#xff1a;进程号&#xff0c;在多进程上下文中&#xff0c;我们通常假定rank 0是第一个进程或者主进程&#xff0c;其它进程分别具有1&#xff0c;2&#xff0c;3不同rank号&#xff0c;这样总共具有4个进程 node&#xff1a;物理节点&#xff0c;可以是一个…

分布式篇---第七篇

系列文章目录 文章目录 系列文章目录前言一、如何将长链接转换成短链接,并发送短信?二、长链接和短链接如何互相转换?三、长链接和短链接的对应关系如何存储?四、如何提高系统的并发能力?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一…

Docker Swarm总结+CI/CD Devops、gitlab、sonarqube以及harbor的安装集成配置(3/4)

博主介绍&#xff1a;Java领域优质创作者,博客之星城市赛道TOP20、专注于前端流行技术框架、Java后端技术领域、项目实战运维以及GIS地理信息领域。 &#x1f345;文末获取源码下载地址&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb;…

Guitar Pro8.0.2吉他编曲软件 吉他打谱软件 吉他作曲软件

Guitar Pro8.0.2在音乐的大舞台上&#xff0c;谁不想成为一位吉他弹奏大师呢&#xff1f;但在现实中&#xff0c;学吉他并非一蹴而就&#xff0c;许多小伙伴都因为吉他的上手难度而被浇灭学习的热情。然而&#xff0c;这里有一款神奇的软件&#xff0c;叫做&#xff0c;它就像是…

bugku 渗透测试

场景1 查看源代码 场景2 用dirsearch扫描一下看看 ok看到登录的照应了第一个提示 进去看看 不出所料 随便试试admin/admin进去了 在基本设置里面看到falg 场景3 确实是没啥想法了 找到php在线运行 检查网络&#xff0c;我们发现这个php在线运行会写入文件 那我们是不是写…

【数据结构】树与二叉树(廿五):树搜索指定数据域的结点(算法FindTarget)

文章目录 5.3.1 树的存储结构5. 左儿子右兄弟链接结构 5.3.2 获取结点的算法1. 获取大儿子、大兄弟结点2. 搜索给定结点的父亲3. 搜索指定数据域的结点a. 算法FindTargetb. 算法解析c. 代码实现a. 使用指向指针的指针b. 直接返回找到的节点 4. 代码整合 5.3.1 树的存储结构 5.…

Visual Studio 使用MFC 单文档工程绘制单一颜色直线和绘制渐变颜色的直线(实例分析)

Visual Studio 使用MFC 单文档工程从创建到实现绘制单一颜色直线和绘制渐变颜色的直线 本文主要从零开始创建一个MFC单文档工程然后逐步实现添加按键&#xff08;事件响应函数&#xff09;&#xff0c;最后实现单一颜色直线的绘制与渐变色直线的绘制o(&#xffe3;▽&#xffe…

利用chart.js来完成动态网页显示拆线图的效果

<% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%><%! String list"[一月份, 二月份, 三月份,四月份, 五月份, 六月份, 七月]"; String label"我的一个折线图"; String data &qu…

RabbitMQ之MQ的可靠性

文章目录 前言一、数据持久化交换机持久化队列持久化消息持久化 二、LazyQueue控制台配置Lazy模式代码配置Lazy模式更新已有队列为lazy模式 总结 前言 消息到达MQ以后&#xff0c;如果MQ不能及时保存&#xff0c;也会导致消息丢失&#xff0c;所以MQ的可靠性也非常重要。 一、…

Scrapy爬虫异步框架(一篇文章齐全)

1、Scrapy框架初识 2、Scrapy框架持久化存储&#xff08;点击前往查阅&#xff09; 3、Scrapy框架内置管道&#xff08;点击前往查阅&#xff09; 4、Scrapy框架中间件&#xff08;点击前往查阅&#xff09; Scrapy 是一个开源的、基于Python的爬虫框架&#xff0c;它提供了…

SQL Server秘籍:数据分隔解密,数据库处理新境界!

点击上方蓝字关注我 在数据数据过程中经常会遇到数据按照一定字符进行拆分&#xff0c;而在不同版本的SQL SERVER数据库中由于包含的函数不同&#xff0c;处理的方式也不一样。本文将列举2个版本的数据库中不同的处理方法。 1. 使用 XML 方法 在SQL SERVER 2016版本之前&#x…

C#,数值计算——有理函数插值和外推(Rational_interp)的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// 有理函数插值和外推 /// Rational Function Interpolation and Extrapolation /// Given a value x, and using pointers to data xx and yy, this routine returns …

2.1 总线问题

同一时间只能有一个去控制总线,因此需要一个输出开关去确保总线不出错 一旦同时开启输出开关,下面的锁存器还会被上面的数据修改如果上下同时开启可写,且同时开启可输出, 则短路

从零开始的RISC-V模拟器开发(一)环境搭建

前言 博主这系列文章是跟随中科院吴伟老师的b站公开课&#xff1a;[完结]从零开始的RISC-V模拟器开发第一季2021春季_哔哩哔哩_bilibili 记录的笔记。仅供学习使用&#xff0c;侵删&#xff01; 苦逼的博主现在自己毕设也是要设计类似的东西。哎。我需要做的是给一个现成的 R…
最新文章