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

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.mzph.cn/news/782006.shtml

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

相关文章

Android 自定义EditText

文章目录 Android 自定义EditText概述源码可清空内容的EditText可显示密码的EditText 使用源码下载 Android 自定义EditText 概述 定义一款可清空内容的 ClearEditText 和可显示密码的 PasswordEditText,支持修改提示图标和大小、背景图片等。 源码 基类&#xf…

WebViz可视化

WebViz可视化 Webviz是一个基于Web的可视化工具,意味着您可以通过浏览器/APP访问它,而不需要安装额外的软件。这对于远程访问和团队协作非常方便。 Foxglove是一个开源的工具包,包括线上和线下版。旨在简化机器人系统的开发和调试。它提供了…

Gitea 的详细介绍

什么是 Gitea? Gitea 是一个开源、轻量级的自托管 Git 服务,它允许用户搭建类似于 GitHub 或 GitLab 的代码托管平台。由于采用 Go 语言开发,Gitea 具有高效的性能和跨平台特性,适合个人开发者或小团队使用。 Gitea 的特点 轻量…

蓝桥杯第十三届电子类单片机组程序设计

目录 前言 单片机资源数据包_2023 一、第十三届比赛省赛 1.比赛题目 2.赛题解读 二、部分功能实现 1.继电器的开启与关闭 2.长按切换显示状态功能的实现 3.对于温度传感器小数部分的处理 4.其他处理 1)关于数码管显示小数的处理 2)关于5s后继…

SpringBoot + LiteFlow(二):LiteFlow特性和环境支持

项目特性 组件定义统一: 所有的逻辑都是组件,为所有的逻辑提供统一化的组件实现方式,小身材,大能量。规则轻量: 基于规则文件来编排流程,学习规则入门只需要5分钟,一看即懂。规则多样化: 规则支持xml、json、yml三种规则文件写法方式,喜欢哪种用哪个。任意编排: 再复…

简易TCP服务器通信、IO多路复用(select、poll、epoll)以及reactor模式。

网络编程学习 简单TCP服务器通信三次握手和四次挥手状态转换总结client和server通信写法server端client端 怎么应对多用户连接?缺点 IO多路复用select优缺点 pollpoll写法和改进点 epoll(使用最多,重中之重)epoll写法和改进点LT模…

结构体类型,结构体变量的创建和初始化 以及结构中存在的内存对齐

一般结构体类型的声明 struct 结构体类型名 { member-list; //成员表列 }variable-list; //变量表列 例如描述⼀个学⽣: struct Stu { char name[20]; //名字 int age; //年龄 char sex[5]; //性别 }; //结构体变量的初始化 int main() { S…

牛客NC30 缺失的第一个正整数【simple map Java,Go,PHP】

题目 题目链接: https://www.nowcoder.com/practice/50ec6a5b0e4e45348544348278cdcee5 核心 Map参考答案Java import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可…

Modelsim手动仿真实例

目录 1. 软件链接 2. 为什么要使用Modelsim 3. Modelsim仿真工程由几部分组成? 4. 上手实例 4.1. 新建文件夹 4.2. 指定目录 4.3. 新建工程 4.4. 新建设计文件(Design Files) 4.5. 新建测试平台文件(Testbench Files&…

企业数据被新型.rmallox勒索病毒加密,应该如何还原?

.rmallox勒索病毒为什么难以解密? .rmallox勒索病毒难以解密的主要原因在于其采用了高强度的加密算法,并且这些算法被有效地实施在了病毒程序中。具体来说,.rmallox勒索病毒使用了RSA和AES这两种非常成熟的加密算法。RSA是一种非对称加密算法…

08、Lua 函数

Lua 函数 Lua 函数Lua函数主要有两种用途函数定义解析:optional_function_scopefunction_nameargument1, argument2, argument3..., argumentnfunction_bodyresult_params_comma_separated 范例 : 定义一个函数 max()Lua 中函数可以作为参数传递给函数多返回值Lua函…

Laravel 数据库:判断数据表是否存在

检测某个表是否存在: if (Schema::hasTable(table_name)) { // } 在某个表不存在的情况下再执行创建操作: if ( ! Schema::hasTable(table_name)) { // 创建数据库表的代码 } 如果你想安全的 drop 掉一个数据表,使用以下&#xf…

蓝桥杯刷题记录之蓝桥王国

只是记录 这题用迪杰斯特拉来就行&#xff0c;我写的是堆优化版本 import java.util.*;public class Main{static Scanner s new Scanner(System.in);static int n,m,startPoint1;static List<Edge>[] table;//邻接表,因为是稀疏图static long[] dist;static boolean[] …

Day25 代码随想录(1刷) 回溯

39. 组合总和 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制重复…

3D汽车模型线上三维互动展示提供视觉盛宴

VR全景虚拟看车软件正在引领汽车展览行业迈向一个全新的时代&#xff0c;它不仅颠覆了传统展览的局限&#xff0c;还为参展者提供了前所未有的高效、便捷和互动体验。借助于尖端的vr虚拟现实技术、逼真的web3d开发、先进的云计算能力以及强大的大数据处理&#xff0c;这一在线展…

瑞吉外卖实战学习--6、通过try和catch进行异常处理

try和catch进行异常处理 效果图前言1、公共拦截器进行异常处理1.1、创建公共报错处理的方法1.2、@ControllerAdvice中设置要拦截的类1.3、@ExceptionHandler中写处理的异常类2、完善错误拦截器2.1、效果效果图 前言 当用户名重复数据库会报错,此时就需要捕获异常操作 1、公共…

Spring: 在SpringBoot项目中解决前端跨域问题

这里写目录标题 一、什么是跨域问题二、浏览器的同源策略三、SpringBoot项目中解决跨域问题的5种方式&#xff1a;使用CORS1、自定 web filter 实现跨域(全局跨域)2、重写 WebMvcConfigurer(全局跨域)3、 CorsFilter(全局跨域)4、使用CrossOrigin注解 (局部跨域) 一、什么是跨域…

社交网络的未来:Facebook如何塑造数字社交的下一章

引言 社交网络已成为我们生活中不可或缺的一部分&#xff0c;而Facebook作为其领军者&#xff0c;一直在塑造着数字社交的未来。本文将深入探讨Facebook在未来如何塑造数字社交的下一章&#xff0c;并对社交网络的发展趋势进行展望和分析。 1. 引领虚拟社交的潮流 Facebook将…

Lombok之@SneakyThrows

1前言&#xff1a; 这里记录一个SneakyThrows的用法&#xff0c;关于他的用法&#xff0c;在官网上可以知道的很清楚 官网介绍&#xff1a;http://projectlombok.org/features/SneakyThrows.html 2代码示例 个人理解&#xff1a;在代码中&#xff0c;使用 try&#xff0c;cat…

C++vector和C语言数组的区别

vector 是 C 标准模板库&#xff08;STL&#xff09;中的一个类模板&#xff0c;它提供了一个动态数组的功能&#xff0c;能够根据需要自动增长或缩小。而 C 语言数组则是 C 语言提供的一种固定大小的序列容器。下面是 vector 和 C 语言数组之间的一些主要区别&#xff1a; 动…