比特币上的可验证延迟函数

news2024/12/23 1:33:31

可验证延迟函数 (VDF) 是一种需要大量 顺序计算 来评估但可以快速验证的函数。我们首次在比特币上实现了它。VDF 作为密码学技术可用于构建大量新应用程序,例如公共随机信标、计算时间戳和数据复制证明。

VDF

场景

链上随机信标

在区块链中很难实现随机性,因为一切都是确定性和公开的。一个经典的例子是两方之间的投注智能合约,如果下一个区块哈希是偶数,则一方获胜,如果是奇数,则另一方获胜。矿工可以通过玩这个合约来作弊,同时忽略任何让他输掉赌注的新区块。

VDF 通过要求随机性不是来自块本身,而是来自它的 VDF 来缓解这个问题。通过将 VDF 调整为需要很长时间来计算,比如 1 小时,矿工就不会因为在下一小时找到的区块中放弃挖矿奖励而作弊,因为它大于赌注金额。

彩票

在一个类似的例子中,爱丽丝、鲍勃和查理想玩一轮彩票,这需要他们共同生成一个随机数来决定赢家。在一种简单的方法中,他们每个人都发布一个随机数。一旦所有参与者都这样做了,他们就会计算已发布数字总和的哈希值。

问题是最后一个提交他的号码可以控制结果。例如,如果 Alice 和 Bob 已经提交了他们的值,Charlie 可以尝试使用不同的数字来计算结果,直到他找到一个产生他希望的结果的数字。为了克服这个问题,我们使用 VDF 引入了延迟。假设参与者必须在 12:0012:10 之间提交他们的号码。在所有数字都提交后(或截止日期已过),它们再次被散列,并在生成的散列上评估 VDF,这需要比 10 分钟更长的时间来评估,比如说 1 小时。现在查理无法作弊,因为评估结果的时间比提交窗口长。

正式定义

有效的 VDF 函数 f(x) 必须具有以下属性:

顺序的: 任何人都可以在 t 个连续步骤中计算 f(x)。请注意,计算不能并行化是必要的。这确保了攻击者不能仅仅通过利用更多资源来显着加快计算速度。计算时间仅受单个执行线程的速度限制。
可高效验证: 给定输出 y,任何观察者都可以在短时间内验证 y = f(x),特别是 log(t)

VDF 是一种可证明减慢速度的方法。他们在输出中引入强制时间延迟,以便恶意行为者无法通过预测未来值来影响它。

VDF 与工作量证明

VDF 和 PoW 都难以计算,但易于验证。根本区别在于 PoW 可以并行化,而 VDF 不能。

实现

由于 VDF 是可有效验证的,我们可以在智能合约中验证它。我们已经为 Wesolowski 开发的流行 VDF 实现了一个验证器。

VDF 可以表示为以下函数:

y = [x^(2^T)] mod N

x 是输入值,T 是公知的延迟参数,决定了延迟的持续时间,y 是输出。

要计算 x^ 2 ^ T,我们必须按顺序计算 x^ 2 ^ i,其中 i0T。至关重要的是,重复的平方计算不可并行化。

为了使其有效地可验证,以便验证者不需要再次遵循完整的 T 步骤,运行以下交互协议。可以使用 Fiat–Shamir 启发式使该协议成为非交互式的。

Verifier: 
    Generates random L and sends to prover.

Prover:
    Computes: (q, r) = (2^T)/L
    Then: pi = x ^ q
    Send to prover (y, pi)

Verifier: 
    Computes: r = (2^T) mod L
    Check: y = pi^L * x^r

验证器在下面实现。

library VDFVerifierWeslowski {  
    
    static function verify(int g, int pi, int y, int q, int nonce, int delay) : bool {
        bool ret = true;

        ret = ret && nonce <= MAX_NONCE;
        ret = ret && g != 0 && g < RSA_MODULUS;
        ret = ret && pi != 0 && pi < RSA_MODULUS;
        ret = ret && y != 0 && y < RSA_MODULUS;
        ret = ret && q < RSA_MODULUS;

        int l = hashToPrime(g, y, nonce);
        ret = ret && millerRabinPrimalityTest(l);

        int r = modReduce(1 << delay, MAX_NONCE);
        int u1 = modexp(pi, l, RSA_MODULUS);
        int u2 = modexp(g, r, RSA_MODULUS);
        return ret && (mulmod(u1, u2, RSA_MODULUS) == y);
    }
    
    ...
    
}

完整的代码和测试可以在 GitHub 上找到。

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

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

相关文章

php生成二维码合成文字、背景图并保存本地图片

目录 1、实现效果&#xff0c;二维码二维码合成文字、背景图 2、下载并引入qrcode 3、创建static文件夹下载字体和背景图到这 4、创建test2.php&#xff0c;合成代码 1、实现效果&#xff0c;二维码二维码合成文字、背景图 2、下载并引入qrcode 1、到phpqrcpde官网下载类库…

UltraEdit 22 编辑器 for Mac

UltraEdit 是一款功能强大的文本编辑器和源代码编辑器。它具有多种功能&#xff0c;适用于程序员、网站开发人员和其他需要处理大量文本内容的用户。 UltraEdit 提供了正则表达式搜索和替换功能&#xff0c;可以快速查找和修改文本中的特定内容。它还支持多文件编辑和多窗口布局…

掌握文案新技能,拓世AI让你成为朋友圈文案达人

“人生如戏&#xff0c;戏如人生”&#xff0c;这是一句缥缈却真实的话&#xff0c;我们在生活中扮演着各种角色&#xff0c;经营自己的人生。如同美国社会学家戈夫曼提出的“拟剧论”&#xff1a;他将社会和人生比作一个大舞台&#xff0c;我们都在关心如何在众多观众面前打造…

Linux动态库

定义&#xff1a;动态函数库&#xff0c;是在程序执行时动态&#xff08;临时&#xff09;由目标程序去调用 优点&#xff1a; 调用时不复制&#xff0c;程序运行时动态加载到内存&#xff0c;供程序调用&#xff0c;系统只加载一次&#xff0c;多个程序可以共用&#xff0c;…

百亿、补贴这种低价怎么控

随着电商平台流量竞争的激烈演变&#xff0c;越来越多的促销形式进入人们的眼球&#xff0c;而店铺最简单的营销就是通过价格&#xff0c;所以低价销售成了各平台吸引消费者的方式&#xff0c;百亿补贴因为其独特的属性&#xff0c;与平台挂钩&#xff0c;通过“全网最低价”的…

VB在窗体中显示1000以内的完数

VB在窗体中显示1000以内的完数 在窗体中显示1000以内的完数&#xff08;如果一个整数的所有因子&#xff08;包括1&#xff0c;但不包括本身&#xff09;之和与该数相等&#xff0c;则称这个数字为完数。例如6123&#xff0c;所以6是一个完数&#xff09; Private Function Is…

【前端知识】Three 学习日志(五)—— 点光源辅助观察

Three 学习日志&#xff08;五&#xff09;—— 点光源辅助观察 一、引入点光源辅助观察 // 光源辅助观察 const pointLightHelper new THREE.PointLightHelper(pointLight, 10); scene.add(pointLightHelper);二、改变点光源位置 // 点光源位置 pointLight.position.set(2…

[补题记录] Atcoder Beginner Contest 308(C~E)

URL&#xff1a;https://atcoder.jp/contests/abc308 目录 C Problem/题意 Thought/思路 Code/代码 D Problem/题意 Thought/思路 Code/代码 E Problem/题意 Thought/思路 Code/代码 C Problem/题意 给出n个&#xff08;a&#xff0c;b&#xff09;数对&#xff…

短视频矩阵系统源代码开发搭建分享--代码开源SaaS

一、什么是短视频矩阵系统&#xff1f; 短视频矩阵系统是专门为企业号商家、普通号商家提供帐号运营从流量 到转化成交的一站式服务方案&#xff0c;具体包含&#xff1a;点赞关注评论主动私信 &#xff0c;评论区回复&#xff0c;自动潜客户挖掘&#xff0c;矩阵号营销&#x…

H3C ER G2系列路由器敏感信息泄露漏洞

声明 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 一、产品介绍 H3C ER2200G2是H3C推出的新一代高性能企业级路由器&#…

【Vue】模板语法,事件处理器及综合案例、自定义组件、组件通信

一、事件处理器 我们之前事件监听可以使用v-on 指令 1、事件修饰符 在Vue中我们通过由点(.)表示的指令后缀来调用修饰符&#xff0c;比如&#xff1a; .stop&#xff1a;阻止事件冒泡。当事件触发时&#xff0c;该修饰符将停止事件进一步冒泡到父元素。相当于调用了 event.stop…

CoreData 在新建或更新托管对象中途发生错误时如何恢复如初?

问题现象 在 CoreData 支持的 App 中,当我们新建或更新托管对象到一半突然出现错误时,应该禁止任何已发生的改变被写入内存或数据库中。不过,有时仍会出现始料未及的“意外”: 从上面的演示可以看到:即使在 Item 对象新建和更新途中出现错误后不执行后续的保存操作,但界…

决策树(中):数据挖掘十大算法之一

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

多通道振弦数据记录仪隧道中安全监测应用方案

多通道振弦数据记录仪隧道中安全监测应用方案 近年来&#xff0c;随着城市化进程的加速推进&#xff0c;隧道建设越来越普遍。然而&#xff0c;隧道建设也带来了一系列安全问题&#xff0c;如地质灾害、水文灾害、交通事故、火灾等。因此&#xff0c;对隧道的安全监测非常重要…

20230920研发面经整理

1.cpp中的虚函数和虚函数表 C中的虚函数的作用主要是实现了多态的机制。关于多态&#xff0c;简而言之就是用父类型别的指针指向其子类的实例&#xff0c;然后通过父类的指针调用实际子类的成员函数 虚函数表是指在每个包含虚函数的类中都存在着一个函数地址的数组。当我们用…

免费好用bpm平台,实现生产管理系统

1.什么是生产管理系统 生产制造管理系统主要是以生产制造管理为核心&#xff0c;其管理功能包括产品结构设置&#xff08;BOM&#xff09;生产计划、加工、领料、质检、库存、成本核算等。通过信息化解决行业管理问题&#xff0c;满足各企业科学管理的需求&#xff0c;并为制造…

Ubuntu上线一个JAVA环境微服务架构的系统

项目背景: 项目目的: 项目架构: 配置环境: 流程: 1、系统安装 更改root密码 sudo passwd root 设置root密码123 切换用户 su root 输入root密码123 2、开启root远程ssh 编辑配置文件 vi /etc/ssh/sshd_config 更改以下行 #PermitRootLogin prohibit-passwor…

【BeanTrimUtil】通过反射去除JavaBean中String类型数据的空格:一行代码搞定整个Bean的字符串去空!

【原文地址】 https://blog.csdn.net/qq_36170500/article/details/107250282 简化不必要的代码逻辑纯原生环境亦可运行 import java.lang.reflect.Field; import java.lang.reflect.Method;/*** author zhoudeshui v1.1* Desc 版权声明&#xff1a;本文为CSDN博主「一个人的编…

公众号迁移线上公证靠谱吗?

公众号账号迁移的作用是什么&#xff1f;只能变更主体吗&#xff1f;微信公众平台的帐号迁移功能可将原公众号的粉丝、文章素材、违规记录、留言功能、名称等迁移至新的公众号。通过迁移可以实现公众号的公司主体变更、粉丝转移、开通留言功能、服务号转为订阅号等作用。因此不…

电脑剪切板在哪?4个方法教你提高效率!

“我在电脑上复制了一些图像&#xff0c;电脑显示已经保存在了剪切板&#xff0c;但是我找了好久都不知道电脑的剪切板在哪。有朋友可以指点一下吗&#xff1f;” 电脑剪切板是计算机操作中一个常用且强大的工具&#xff0c;它允许你复制、剪切和粘贴文本、图像、文件等。无论是…