技术分享 | VRF抽签与投票的思考

2023-10-09 16:50

本文主要是介绍技术分享 | VRF抽签与投票的思考,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

VRF(可验证随机函数)在Algorand提出后,被越来越多的公链项目应用。VRF的特点在于其能够产生一个能够被验证的随机结果,通过该随机结果,在区块链中可以实现随机“选举”或“抽签”。与POS结合后能够减轻POS的“富者恒富”的现象。

然而我们知道,鱼和熊掌不可兼得,提高公平性(去中心化)的代价是牺牲性能或安全性。Algorand选择了牺牲一定的共识效率来换取公平性(去中心化)。以下是在分析Algorand、Ont等使用VRF的共识算法中,对VRF抽签的一些思考。

 

一. Algorand概括

Algorand作为第一个使用了VRF的共识算法,其共识流程可以大致总结为三个步骤:

1. 随机选举多个提案者,提案新区块。(提案者由VRF抽签)

2. 收集多个提案区块并选出权重最高者。

3. BA* 对多个区块提案中的一个提案达成共识。(每一步的投票者均需要VRF抽签)

二. POS+Random

VRF本质是随机函数,而在区块链系统的共识流程中不能用完全公平的随机,因为出块者需要有激励,同时每个节点的贡献值也并非一致。 所以通常都会在VRF抽签之前加一层POS,将“更优”的一批节点先选出来作为候选人。

对于POS+Random 的共识算法,一般有如下三种情况:

Case 1. 随机抽签出一个提案者,其他节点验证并接受该节点提案。

Case 2. 随机抽签出一个提案者与多个投票者,需要投票者对区块达成共识。(代表:Tendermint)

Case 3. 随机抽签出多个提案者与多个投票者,需要投票者从多个提案区块中选出一个并达成共识。(代表:Algorand)

下面我们来一一解析以上case:

Case 1即为很纯粹的POS,希望通过随机抽签抑制“富者恒富”的现象。但纯粹的POS有Nothing at stake的问题,提案者可以基于多个分叉链提出不同的区块,使得分叉进一步加剧。(以太坊Casper FFG依靠惩罚金来解决,但这无疑也增加了系统的复杂度)

Case 2很类似于自带viewchange的PBFT,一般容错率也为1/3。投票者的目的在于给于deterministic confirmation,且部分解决了Nothing at stake问题。为何说是“部分解决”,因为为了最大化提高区块通过的概率,提案者仍会给多个分叉链投票。但由于有投票者这一角色,可保证在网络不分区的情况下理论上不会产生分叉。同时,由于随机抽签采用公开的信息,提案者也能够被预测。

Case 3其实是Algorand的高度简化版,Case 2也可作为Case 3的一个特例。一方面,多个提案者之间相互竞争,促使提案者本身提出正确的区块;另一方面,对于抽取多个提案者的场景,可采用VRF作为随机函数:节点使用公开的信息和自己的密钥直接在本地运行选举函数判断自己是否被选中,其他节点能够验证但无法预测提案者。

这里值得注意的是,在分布式网络中,VRF无法完成固定数量的抽签任务,原因是VRF的一个Input是节点私钥,这使得每个节点产生的随机值均不相同,全网只能验证结果是否合法,但无法设计统一的标准使得某个随机结果唯一性地符合某个条件。

三. VRF抽签的优势

在VRF出现之前,为了满足选举信息的可验证,通常采用公开的信息作为Input,通过公开的随机函数得出随机结果,以随机结果作为依据进行抽签。 由于所有信息均为公开,故所有节点都可以在本地计算出抽签结果。但上述抽签方案有一个很大的问题:攻击者有一定的时间窗口能够预测出抽签结果,及时对被选举人实施攻击。

VRF很好地解决了这个问题:

1. 由于使用节点私钥作为Input,VRF的结果无法被预测。其他节点只有通过网络接收到随机结果后才能对其合法性进行验证,即攻击者在得知选举结果时,选举人已经做出行动了。

2. VRF的输出值除了随机值外,还包含一个proof,提供了随机值验证的零知识证明,即不必知道某人私钥即可证明该随机值是由某人产生的。

四. VRF抽签的弊端

VRF为随机抽签提供了隐私性和可验证,但也带来了一个很棘手的问题:丢失全局的抽签信息,降低投票共识的成功率

由于VRF需要私钥作为Input,其他节点只能通过网络通信获得相应proof后才能验证随机结果是否合法,所以任何节点都无法得知全网的真实选举情况的。这对投票类共识算法带来了巨大的挑战。投票类共识算法必须设置一个通过阈值(如2/3以上),只有通过该阈值才视为投票通过。而基于VRF的共识算法丢失了全局的选举信息后,只能以期望值的形式设置阈值,使得投票退化为概率型投票。

如何理解概率型投票?首先,我们需要明确确定型投票的定义——投票结果应遵循大部分提案者的意见(通过或不通过)。当投票结果不一定会遵循大部分提案者的意见,那么就属于概率型投票。对于由VRF选出的投票者的投票阶段,由于阈值的设置与实际选举情况是割裂的,则即使大部分投票者同意提案,提案仍有可能达不到阈值,从而显示“不同意”的结果,与大多数投票者的意志相背。我认为,之所以Algorand在BinaryBA*中要设计多轮投票,并且每一步均重新选举投票者,其目的是通过不断重选提高实际投票达到阈值的概率,通过多轮投票提高达成共识的概率。

640?wx_fmt=png


五. 总结

VRF算法最早由Silvio Micali(图灵奖得主,Algorand的创始人)在1999年提出,也是由他首次将其引入到区块链中,为区块链的共识算法提供了崭新的研究思路和解决方案。但我们在分析并使用VRF的时候,不仅需要分析VRF本身,也应该关注先驱者是如何思考和设计基于VRF的共识算法过程。一味地将VRF迁移至其他的共识算法,可能并不能达到预期的效果,甚至反而会有带来其他的不确定性风险。

推荐阅读

640?wx_fmt=png

这篇关于技术分享 | VRF抽签与投票的思考的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/174202

相关文章

Python虚拟环境与Conda使用指南分享

《Python虚拟环境与Conda使用指南分享》:本文主要介绍Python虚拟环境与Conda使用指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、python 虚拟环境概述1.1 什么是虚拟环境1.2 为什么需要虚拟环境二、Python 内置的虚拟环境工具

Java中的登录技术保姆级详细教程

《Java中的登录技术保姆级详细教程》:本文主要介绍Java中登录技术保姆级详细教程的相关资料,在Java中我们可以使用各种技术和框架来实现这些功能,文中通过代码介绍的非常详细,需要的朋友可以参考... 目录1.登录思路2.登录标记1.会话技术2.会话跟踪1.Cookie技术2.Session技术3.令牌技

Python处理大量Excel文件的十个技巧分享

《Python处理大量Excel文件的十个技巧分享》每天被大量Excel文件折磨的你看过来!这是一份Python程序员整理的实用技巧,不说废话,直接上干货,文章通过代码示例讲解的非常详细,需要的朋友可... 目录一、批量读取多个Excel文件二、选择性读取工作表和列三、自动调整格式和样式四、智能数据清洗五、

JDK9到JDK21中值得掌握的29个实用特性分享

《JDK9到JDK21中值得掌握的29个实用特性分享》Java的演进节奏从JDK9开始显著加快,每半年一个新版本的发布节奏为Java带来了大量的新特性,本文整理了29个JDK9到JDK21中值得掌握的... 目录JDK 9 模块化与API增强1. 集合工厂方法:一行代码创建不可变集合2. 私有接口方法:接口

电脑系统Hosts文件原理和应用分享

《电脑系统Hosts文件原理和应用分享》Hosts是一个没有扩展名的系统文件,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,一旦找到,系统会立即打开对应... Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应

Web技术与Nginx网站环境部署教程

《Web技术与Nginx网站环境部署教程》:本文主要介绍Web技术与Nginx网站环境部署教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Web基础1.域名系统DNS2.Hosts文件3.DNS4.域名注册二.网页与html1.网页概述2.HTML概述3.

Java使用WebView实现桌面程序的技术指南

《Java使用WebView实现桌面程序的技术指南》在现代软件开发中,许多应用需要在桌面程序中嵌入Web页面,例如,你可能需要在Java桌面应用中嵌入一部分Web前端,或者加载一个HTML5界面以增强... 目录1、简述2、WebView 特点3、搭建 WebView 示例3.1 添加 JavaFX 依赖3

SpringBoot请求参数接收控制指南分享

《SpringBoot请求参数接收控制指南分享》:本文主要介绍SpringBoot请求参数接收控制指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring Boot 请求参数接收控制指南1. 概述2. 有注解时参数接收方式对比3. 无注解时接收参数默认位置

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N