BitVM2:比特币上的无需许可验证

news2025/1/16 18:58:37

1. 引言

前序博客有:

  • 基于BitVM的乐观 BTC bridge
  • BitVM:Bitcoin的链下合约
  • Bitcoin Bridge:治愈还是诅咒?

最初的 BitVM 设计仅限于两方设置。BitVM2结合了并行和冗余实例,以引入基于 1-of-n 诚实假设的多方配置。这些合约的主要限制是:

  • 所有Verifiers都必须在编译时定义。
  • 此外,设置成本随着Verifiers数量的增加而增加。

这意味着:

  • 要破坏合约,必须贿赂的当事人数量总是有限的。

BitVM2 是一种新颖的变体,任何人都可以充当Verifier:

  • 仍需要使用 1-of-n 诚实假设进行一次性设置,但在运行时任何人都可以挑战无效的断言,而不必成为初始 n个联盟成员之一。
    • 这克服了以前方案的局限性并改进了它们的信任假设。
    • 此外,简化了整体设计,并将trial的最大长度减少到两轮。

bridge还额外需:

  • 预定义的m个operator,且至少其中一个operator必须诚实行事。然而,即使所有operators都不诚实,他们也无法窃取任何存款,最坏的情况只是烧掉它们——即浪费资金,变得不可用。

BitVM针对的问题为:

  • 对于给定的程序 f f f,想要验证对于某输入 x x x和输出 y y y,断言 f ( x ) = y f(x) = y f(x)=y是否成立。如, f f f可以是某SNARK Verifier,如用于 Groth16 证明系统。然后:
    • x x x将是一个proof,且 y y y是 SNARK 证明其有效性的某种输出状态。

f f f是 SNARK Verifier,则程序太大,无法用单个比特币脚本来表示。实现 Groth16 Verifier可能会产生 20MB 的脚本。然而,最大脚本size是比特币区块大小 4MB。即使这样的size也可能大得不切实际。

2. 简单的解决方案

Lamport 签名提供了一种将程序拆分 f ( x ) = y f(x)=y f(x)=y为多个步骤的方法。如 n = 42 n=42 n=42步:
f 1 ( x ) = z 1 f 2 ( z 1 ) = z 2 f 3 ( z 2 ) = z 3 . . . f 42 ( z 41 ) = z 42 f 43 ( z 42 ) = y f_1(x) = z_1 \\ f_2(z_1) = z_2 \\ f_3(z_2) = z_3 \\ ... \\ f_{42}(z_{41}) = z_{42} \\ f_{43}(z_{42}) = y f1(x)=z1f2(z1)=z2f3(z2)=z3...f42(z41)=z42f43(z42)=y
这样 f f f的计算可分散在多个区块上执行的 43 笔交易序列上。每笔交易将前一笔交易的输出状态作为输入状态。若Prover对任何状态 z i z_i zi模棱两可,那么每个人都可以使用冲突的 Lamport 签名作为fraud proof欺诈证明。

这种方法提供了一种无需许可的方式来挑战Prover。然而,该解决方案的主要限制是:

  • 其沉重的链上足迹,因为它仍然需要Prover来执行整个计算。
  • 还引入了通过 Lamport 签名转换状态的开销。

3. Balanced解决方案

通过将Prover的一些繁重工作转移到Verifier的fraud proof欺诈证明上,可显著减少链上足迹。现在Prover只需同时承诺 x x x y y y和所有中间结果 z 1 , z 2 , . . . , z 42 z_1, z_2, ... , z_{42} z1,z2,...,z42

任何Verifier都可以反驳任何错误的断言。在设置过程中,定义了一个包含 43 个脚本的 Taptree,以反驳 f 1 , f 2 , f 3 , . . . , f 43 f_1, f_2, f_3, ..., f_{43} f1,f2,f3,...,f43的任何计算。若某断言 f i ( z i − 1 ) = = z i f_i( z_{i-1} ) == z_i fi(zi1)==zi不成立,则任何人都可从这些脚本中的任何一个中花费。这将最坏情况的总计算,减少到,由Verifier执行的单个步骤 f i f_i fi。该步骤可能仍然需要大量的脚本实现。理论上,只要它适合单个区块,或者更好的是 400kb(standardness size)。实际上,对于 f f f的某些具体实现,会尝试在:

  • Prover的commitment size
  • 和 Verifier的script size

之间找到最佳平衡。

实际上,这允许任何人,在Prover做出任何不正确的断言时,破坏Prover的output。否则,如果没有人反驳计算的任何部分,那么脚本就会超时并让诚实的Prover花费output。总共最多也就两轮。

该机制可以充当permissionless bridge verifier的基石。

4. BitVM2:Permissionless Optimistic解决方案

以下协议改进了上述设计的happy path(希望是common path),但代价是在最坏的情况下引入了两轮交互:

  • 1)Prover提交输出状态y
  • 2)若不正确,任何人都可以发起挑战
  • 3)Prover承诺中间结果 z 1 , z 2 , . . . , z 42 z_1, z_2, ... ,z_{42} z1,z2,...,z42
  • 4)若不正确,任何人都可反驳断言 f i f_i fi

为此:
在这里插入图片描述

以上设计的主要问题在于,Prover可窃取一些fees费用。在这种情况下,存款仍然是安全的,但Verifier失去了其抵押品。

攻击场景如下:

  • Prover是恶意的
  • Prover在没有有效 PegOut_Tx 的情况下执行其 KickOff_Tx
  • Prover等待Verifier执行Challenge_TX,支付Prover执行挑战
  • Prover不执行挑战,只是停止响应

以下修改解决了费用问题。但需要另外两个 n-of-n 预签名交易:
在这里插入图片描述

经改进后的设计,要求:

  • 至少有一个诚实的Operator

否则资金最终将变得不可用。实际上,活性失败可用于通过勒索攻击窃取资金。 (如,只有你向我支付 50% 的赎金,我才会解冻你的资金。)

参考资料

[1] 2024年3月 Robin Linus gist BitVM 2: Permissionless Verification on Bitcoin
[2] BitVM 2: Permissionless Verification on Bitcoin

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

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

相关文章

排序第五篇 归并排序

一 简介 归并排序(Merge Sort) 的基本思想是: 首先将待排序文件看成 n n n 个长度为1的有序子文件, 把这些子文件两两归并, 得到 n 2 \frac{n}{2} 2n​ 个长度为 2 的有序子文件; 然后再把这 n 2 \frac{n}{2} 2n​ 个有序的子…

【数据结构与算法篇】动态顺序表及相关OJ算法题

【数据结构与算法篇】动态顺序表及相关OJ算法题 🥕个人主页:开敲🍉 🔥所属专栏:数据结构与算法🍅 目录 【数据结构与算法篇】动态顺序表及相关OJ算法题 1. 动态顺序表的实现 1.1 SeqList.h 头文件声明 1.…

【C语言终章】预处理详解(上)

【C语言终章】预处理详解(上) 当你看到了这里时,首先要恭喜你!因为这里就是C语言的最后一站了,你的编程大能旅途也将从此站开始,为坚持不懈的你鼓个掌吧! 🥕个人主页:开敲…

【Effective Web】文件上传

文章目录 前言一、选择本地文件1.设计一个上传文件按钮2.FileReader读取文件内容 二、使用拖拽方式1.设计一个拖拽容器2.拖拽文件的相关事件回调 三、使用粘贴方式1.设计一个粘贴容器2.paste事件回调 四、总结 前言 前端无法像app一样直接操作本地文件,对本地文件的…

「Android高级工程师」BAT大厂面试基础题集合-下-Github标星6-5K

C、 com.android.provider.contact D、 com.android.provider.contacts 11.下面关于ContentProvider描述错误的是()。 A、 ContentProvider可以暴露数据 B、 ContentProvider用于实现跨程序共享数据 C、 ContentProvider不是四大组件 D、 ContentP…

【Java数据结构】关于栈的操作出栈,压栈,中缀表达式,后缀表达式,逆波兰表达式详解

🔥个人主页:努力学编程’ 🔥内容管理:java数据结构 上一篇文章我们讲过了java数据结构的链表,对于链表我们使用了它的一些基本操作,完成了扑克牌小游戏的操作,如果你感兴趣的话,点…

Optimizer神经网络中各种优化器介绍

1. SGD 1.1 batch-GD 每次更新使用全部的样本,注意会对所有的样本取均值,这样每次更新的速度慢。计算量大。 1.2 SGD 每次随机取一个样本。这样更新速度更快。SGD算法在于每次只去拟合一个训练样本,这使得在梯度下降过程中不需去用所有训…

SpringBoot 整合Redis第1篇

SpringBoot是一个开发框架,Redis是一个高性能的键值存储数据库, 常用于缓存、会话管理、消息队列等应用场景。 定义 Redis是什么? 它是一个存储层级, 在实际项目中,位于关系数据库之上, 类似Android分为5…

(C语言)fread与fwrite详解

1. fwrite函数详解 头文件&#xff1a;stdio.h 函数有4个参数&#xff0c;只适用于文件输出流 作用&#xff1b;将从ptr中拿count个大小为size字节的数据以二进制的方式写到文件流中。返回写入成功的数目。 演示 #include <stdio.h> int main() {FILE* pf fopen(&qu…

相册清理大师-手机重复照片整理、垃圾清理软件

相册清理大师是一款超级简单实用的照片视频整理工具。通过便捷的操作手势&#xff0c;帮助你极速整理相册中的照片和视频、释放手机存储空间。 【功能简介】 向上滑动&#xff1a;删除不要的照片 向左滑动&#xff1a;切换下一张照片 向右滑动&#xff1a;返回上一张照片 整理分…

【shell】select in实现终端交互场景

文章目录 序言1. select in语句及其语法2. select in和case语句相结合3. 执行界面示例 序言 shell脚本实现简单的终端交互功能&#xff0c;根据用户不同输入执行不同功能脚本 1. select in语句及其语法 select in是shell独有的一种循环&#xff0c;非常适合终端交互场景 该语…

链表的极致——带头双向循环链表

​ 文章目录 双向带头循环链表简介&#xff1a;双向&#xff1a;带头&#xff1a;特点&#xff1a;链表带头节点的好处&#xff1a; 循环&#xff1a;特点&#xff1a;循环的好处&#xff1a; 双向带头循环链表的接口函数实现准备工作&#xff1a; 初始化链表&#xff08;头结…

C++:数据类型—布尔(12)

布尔类型代表就是真和假&#xff08;bool&#xff09; 真就是1&#xff08;true&#xff09; 假就是0&#xff08;false&#xff09; 也可以任务非0即为真 bool 直占用1个字节大小 语法&#xff1a;bool 变量名 (true | false&#xff09; 提示&#xff1a;bool在后期判断也是…

深度学习pytorch——经典卷积网络之ResNet(持续更新)

错误率前五的神经网络&#xff08;图-1&#xff09;&#xff1a; 图-1 可以很直观的看到&#xff0c;随着层数的增加Error也在逐渐降低&#xff0c;因此深度是非常重要的&#xff0c;但是学习更好的网络模型和堆叠层数一样简单吗&#xff1f;通过实现表明&#xff08;图-2&…

《自动机理论、语言和计算导论》阅读笔记:p49-p67

《自动机理论、语言和计算导论》学习第4天&#xff0c;p49-p67总结&#xff0c;总计19页。 一、技术总结 1.Deterministic Finite Automata(DFA) vs Nondeterministic Finite Automata(NFA) (1)DFA定义 (2)NFA定义 A “nonedeterministic” finite automata has the power t…

python之绘制曲线

以同一种型号的钻头&#xff0c;钻21种类型的板材&#xff0c;每种板材使用3根钻头&#xff0c;分别在钻第一个孔、2001孔、4001孔和6001孔前测量钻头外径&#xff0c;收集数据。 1、测试方法 采用激光钻径分选机测量微钻钻径以评估微钻外径磨损&#xff0c;测量从钻尖起始间…

C语言-文件

目录 1.什么是文件&#xff1f;1.1 程序文件1.2 数据文件 2.二进制文件和文本文件&#xff1f;3.文件的打开和关闭4.文件的顺序读写5.文件的随机读写5.1 fseek5.2 ftell5.3 rewind 6.文件读取结束的判定7.文件缓冲区 1.什么是文件&#xff1f; 磁盘上的文件就是文件 一般包含两…

使用pytorch构建带梯度惩罚的Wasserstein GAN(WGAN-GP)网络模型

本文为此系列的第三篇WGAN-GP&#xff0c;上一篇为DCGAN。文中仍然不会过多详细的讲解之前写过的&#xff0c;只会写WGAN-GP相对于之前版本的改进点&#xff0c;若有不懂的可以重点看第一篇比较详细。 原理 具有梯度惩罚的 Wasserstein GAN (WGAN-GP)可以解决 GAN 的一些稳定性…

caffe源码编译安装

一、前置准备 (1)vs2015 目前不要想着2019这些工具了,成功率太低了,就老老实实用vs2015吧 解决“VS2015安装包丢失或损坏“问题_vs2015跳过包会影响使用吗-CSDN博客 注意在安装vs2015过程中老是出现这个问题,其实就是缺少两个证书,安装完后就可以正常安装vs2015了,注意…

大数据面试专题 -- kafka

1、什么是消息队列&#xff1f; 是一个用于存放数据的组件&#xff0c;用于系统之间或者是模块之间的消息传递。 2、消息队列的应用场景&#xff1f; 主要是用于模块之间的解耦合、异步处理、日志处理、流量削峰 3、什么是kafka&#xff1f; kafka是一种基于订阅发布模式的…