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

2023-09-20 12:04:58

可验证延迟函数 (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 上找到。

更多推荐

xss渗透(跨站脚本攻击)

一、什么是XSS?XSS全称是CrossSiteScripting即跨站脚本,当目标网站目标用户浏览器渲染HTML文档的过程中,出现了不被预期的脚本指令并执行时,XSS就发生了。这里我们主要注意四点:1、目标网站目标用户;2、浏览器;3、不被预期;4、脚本。二、XSS有什么危害?当我们知道了什么是XSS后,也一定很想知

【Linux基础命令】nmtui命令使用实战

前言linux常用命令专栏已进入尾声,大约90个命令是日常工作中常用的,在拓展一些不常用的,也就100左右。是不是总结下来后,就感觉要学的内容没有那么多了。当然有些专属的基础命令不在本专栏内,比如LVM管理命令,RAID管理命令。后面还会继续添加一些shell中常用的命令。文章目录前言一.nmcui的介绍二.语法格式及

shared_ptr用法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、初步了解二、使用步骤1.引入库2.读入数据总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,

高精度PWM脉宽调制信号转模拟信号隔离变送器1Hz~10KHz转0-5V/0-10V/1-5V/0-10mA/0-20mA/4-20mA

主要特性:>>精度等级:0.1级。产品出厂前已检验校正,用户可以直接使用>>辅助电源:8-32V宽范围供电>>PWM脉宽调制信号输入:1Hz~10KHz>>输出标准信号:0-5V/0-10V/1-5V,0-10mA/0-20mA/4-20mA等,具有高负载能力>>全量程范围内极高的线性度(非线性度<0.2%)>>标准D

数据结构——图的应用

文章目录前言一、图的应用1.最小生成树普里姆(Prim)算法克鲁斯卡尔(Kruskal)算法2.最短路径Dijkstra算法求单源最短路径3.拓扑结构4.关键路径总结前言图的应用1.1最小生成树1.2最短路径1.3拓扑结构1.4关键路径一、图的应用1.最小生成树定义:从图中选取若干条边,将所有顶点连接起来,并且所选取的

LLM 09-新的模型架构

LLM09-新的模型架构回想一下第6章模型架构,神经语言模型的核心接口是一个将token序列映射到上下文嵌入的编码器:[the,mouse,ate,the,cheese]⇒ϕ[(10.1),(01),(11),(1−0.1),(0−1)].[\text{the},\text{mouse},\text{ate},\tex

51单片机光照强度检测自动路灯开关仿真( proteus仿真+程序+报告+讲解视频)

51单片机光照强度检测自动路灯开关仿真(proteus仿真+程序+报告+讲解视频)仿真图proteus7.8及以上程序编译器:keil4/keil5编程语言:C语言设计编号:S0052讲解视频基于51单片机的光照检测自动路灯控制仿真设计(proteus仿真+程序+报告+讲解视频)1.主要功能:基于51单片机的万年历时钟

web安全漏洞-SQL注入攻击实验

实验目的学习sql显注的漏洞判断原理掌握sqlmap工具的使用分析SQL注入漏洞的成因实验工具sqlmap是用python写的开源的测试框架,支持MySQL,Oracle,PostgreSQL,MicrosoftSQLServer,MicrosoftAccess,IBMDB2,SQLite,Firebird,Sybas

web系统安全设计原则

一、前言近日,针对西工大网络被攻击,国家计算机病毒应急处理中心和360公司对一款名为“二次约会”的间谍软件进行了技术分析。分析报告显示,该软件是美国国家安全局(NSA)开发的网络间谍武器。当下,我们发现对于我们发布到互联网的软件和系统的安全审查越来越严格。因为web系统天生的伴随着很多漏洞的产生,这是就给很多不法分子留

kubernetes核心概念 Service

kubernetes核心概念Service一、service作用使用kubernetes集群运行工作负载时,由于Pod经常处于用后即焚状态,Pod经常被重新生成,因此Pod对应的IP地址也会经常变化,导致无法直接访问Pod提供的服务,Kubernetes中使用了Service来解决这一问题,即在Pod前面使用Servi

B+树的定义以及查找

1.B+树的定义一棵m阶的B+树需满足下列条件:每个分支结点最多有m棵子树(孩子结点)。非叶根结点至少有两棵子树,其他每个分支结点至少有「m/2]棵子树。结点的子树个数与关键字个数相等。所有叶结点包含全部关键字及指向相应记录的指针,叶结点中将关键字按大小顺序排列,并且相邻叶结点按大小顺序相互链接起来(支持顺序查找)。所

热文推荐