, @, K/ [& f1 b3 m假设 Alice 和 Bob 想玩一个抛硬币游戏。两位玩家各自在奖池中放入 0.5 BTC。正面赢得 1 BTC。Alice 拿着硬币并将首先抛硬币。Bob 希望确保 Alice 不作弊。以下是他们如何使用 BitVM 玩这个游戏(为简单起见省略了许多细节):( ]- h. ]" I0 \1 M
* S9 Z! K# c+ v" q+ I
Alice 和 Bob 同意遵循 BitVM 协议。 , B c) w2 A# \+ W; N7 ?8 i" C% I. _6 G3 X- t6 r
假设正面由值 H0 表示,反面由值 H1 表示。Alice 通过选择两个其他值,比如 P0 和 P1,并对它们进行哈希,生成了 H0 和 H1。因此,Hash(P0) = H0 和 Hash(P1) = H1。P0 称为 H0 的“原像”,P1 称为 H1 的原像。% D$ A; @ a! K. G s, P
# H, }* W l3 |. eAlice 与 Bob 分享值 H0 和 H1(实际上,Alice 不可撤销地“承诺”这些哈希值,因此她不能后来声称有不同的值)。Bob 不知道原像 P0 和 P1(并且“猜测”这些值是非常困难的,因此我们可以安全地假设 Bob 不会神奇地发现这些值)。 2 I; k* ^- u: f3 U U7 `" b" ?* N9 B% s) [( B2 V
Alice 和 Bob 预先签署两笔交易:一笔用于挑战,另一笔用于响应。 ' m* { z6 X- s& V+ R2 e$ }7 ]8 r C7 `
在挑战交易中,Bob 将包含一个脚本,该脚本基本上检查提供的输入是否哈希为已知哈希值 H0 或 H1 之一——如果哈希为 H0,则 Bob 知道该值是正面;如果是 H1,则是反面。此外,脚本具有一个时间锁,如果在截止日期前未收到响应,则 Bob 获得奖池。 * H1 ^! g+ \( ~: W& o( O2 a$ Q & G; ~) ], O: {* M" j9 D" o; ~在响应交易中,Alice 可以通过包含相应的原像 P0 或 P1 来“揭示”抛硬币结果。如果 Alice 未包含任何值、包含两个值或包含除 P0 或 P1 之外的任何值,则 Bob 获得奖池。否则,如果值为 P0(正面),Alice 获得奖池。0 W9 F" f0 ]: C* \# u% u
; y6 d5 E p- D9 v1 o% I7 P现在我们准备开始游戏。Alice 抛硬币但尚未揭示结果。Bob 发出挑战交易,随后 Alice 广播响应交易。通过前面描述的脚本,在链上执行“欺诈检测”的逻辑。显然,这是一个琐碎且刻意设计的例子,但它展示了关键思想。对于一个稍微复杂的例子,考虑由一位名为 Super Testnet 的开发者设计的井字棋游戏。你可以在这里查看 GitHub 存储库[13] ,甚至今天可以玩“bit tac toe[14]”。Super Testnet 实际上向 Hiro 展示了这个游戏,你可以在下面观看:9 I6 ^: w7 ?, m; y5 Z Y, e
& V, f# L7 |: a1 p5 u- C' UBitvm Crash Course on Youtube [15]! B0 v* m+ V9 B @
; P, h; j. @8 y# P( `2 E
以下是游戏的高级组件:" ~9 X- K4 N" n. O0 L
{9 V/ ]: t- O) J7 k
井字棋是一个 9 宫格。第一位玩家 Alice 最多可以走 5 步,因此有 45 个预影像和哈希(每轮 9 个)。第二位玩家 Bob 最多可以走 4 步,因此有 36 个哈希。" w5 M( {8 ]. T" h% ~; F
& x8 H: I o. ~9 z: G井字棋有 3 种“作弊”方式:玩家可以在他们的回合放置多个 X / O;玩家可以覆盖他们先前使用过的方格;玩家可以覆盖对手先前使用过的方格。因此,挑战/响应协议围绕检测这些情况构建。( R; Z; @2 b9 K4 l
6 [% Q9 |" O: K/ I# q8 R4 V9 O
挑战交易将迫使另一位玩家“揭示”他们在哪个方格放置了 X 或 O。 ) @7 ]( O( y9 _0 @/ l7 P 1 z e7 l, l7 L9 A% U7 \6 _响应交易将具有一个脚本,该脚本将针对上述所有 3 种情况进行检查:如果未检测到欺诈,则游戏继续(或游戏结束,因为有人获胜)。如果检测到欺诈,则挑战者获胜,证明者失败。/ ^0 J" O* v2 `& d
( K& o. e6 V7 O! m+ R, x( }$ ]& y请注意,在这两种情况下,欺诈证明是手工制作的,并专门为该用例设计:井字棋的欺诈证明对于抛硬币或其他任何事情都不起作用。- H7 ~* ?" ]. B9 P. x4 y5 O4 _8 g
* b$ M$ W) M( B回到大局,BitVM 白皮书描述了一种通用方法:针对任何程序,它提供了构建该程序的有效性证明的一种方式。关键见解如下:! F* b# L9 ~4 Q. h( F5 o
+ g# H! L: y( ^( v$ I" @4 s
从抛硬币的例子中,我们看到了如何验证单个比特:让我们称之为“比特承诺”证明。 % z- b9 W ?" g: r9 X! f) ]" l- U( Z2 k
有了比特承诺,我们可以构建逻辑门承诺:考虑布尔 AND / OR 运算符 - 针对任何两个输入(每个取值为 0 或 1),该运算符定义一个单一输出。因此,使用 2 个比特承诺作为输入和 1 个比特承诺作为输出,我们可以为任何逻辑门创建有效性证明。BitVM 白皮书使用了一个 NAND 逻辑门。 ) X1 C# W. s6 k: ?- h4 s, \. A/ C4 r. G6 e! e4 g; a3 {
最后,任何任意计算都可以使用一系列逻辑门来表示。BitVM 白皮书将其称为“二进制电路”。这样的电路可以使用 Tapscript 有效地表示,每个 tap 树中的叶子代表一个单一的门承诺。9 c/ ?, c7 k' \
& ~' Y! }+ T+ n; E! ~1 V
然后,挑战/响应协议基本上涉及验证特定门承诺的输出。在最坏的情况下,你可能需要验证每个单个门的输出。: f% W: W! y- t+ y
! }; a S1 _8 B6 P$ G3 J查看这个存储库[16] ,了解将任意程序转换为 tapleaf 电路的一种方法。 7 H8 `0 D+ }6 Y4 F8 | + J* E" j: L# m/ t8 r$ T9 S KStacks 如何适应?. N8 z# }8 b3 }4 C) ~2 U
1 |* B3 W/ @" j+ e0 g4 i) T
BitVM 在 Stacks 生态系统中的两个明显且最相关的应用是:. m: @ l2 x& x# s* L3 x C0 r* `+ N
# ]0 y6 b( X0 j4 x4 f6 {+ P/ S
改善 sBTC 的信任假设 $ b& T3 h. z9 A1 b% b/ i2 I/ b5 M5 w+ X7 F2 y: [
为比特币上的 Stacks 块添加有效性证明 5 `: Q3 K& t v# D7 \# u 7 F3 p9 R: G6 n. U" G/ s: F6 w/ \/ {为什么选择这两个应用?当前的 sBTC 设计[17]已经是正在开发中的比特币最安全、最小化信任的双向锚定之一。尽管如此,在安全模型和信任假设[18]方面仍有改进的空间。与要求至少 30%诚实签名者或信任一组高声誉签名者不同,基于 BitVM 的方法理论上可以使 sBTC 只需一个诚实参与者即可运行。 + D# ?: f5 g4 `2 n" N R0 {) \# b% Q. K) T
同样,虽然每个 Stacks 块在比特币上结算,但当前设计仅允许你在拥有链状态的一份副本时独立验证 Stacks 数据。如果使用 BitVM,Stacks 块还包括有效性证明,那么你不仅可以检查完整性(给定 Stacks 块中的数据与存储在比特币上的哈希一致),还可以检查正确性(你可以通过查看存储在比特币上的证明验证给定 Stacks 块中的交易是否实际执行正确)。换句话说:这将使 Stacks 能够发展成为比特币上的乐观 Rollup。 , f1 {" Q; x i% G$ |0 P b2 ]# h, F c% ?6 B5 Y
如何利用 BitVM 实现这些应用的具体方法需要进行更多的研究和开发。但我们可以尝试在高层次上勾勒出一些想法。# @) p6 L6 W& i1 r/ H% Z6 K: H
! V* Y( |& X1 _) ?9 g- ?4 J4 ]9 M
BitVM 与 sBTC7 K$ T. J/ P( U5 G