模拟 OP_RAND

  • BTCStudy
  • 发布于 2025-03-03 17:39
  • 阅读 5

我们提出了一种方法,可通过交易对手方之间的一种免信任的交互式游戏,在比特币上模拟 OP_RAND 操作码。游戏的结果是概率性的,并且不允许任何一方欺诈,也不允许在任何一个步骤中影响自己的胜率。

<!--StartFragment-->

作者:olkurbatov

来源:<https://delvingbitcoin.org/t/emulating-op-rand/1409>

我们提出了一种方法,可通过交易对手方之间的一种免信任的交互式游戏,在比特币上模拟 OP_RAND 操作码。游戏的结果是概率性的,并且不允许任何一方欺诈,也不允许在任何一个步骤中影响自己的胜率。协议可以让外部参与者分辨不出,也不需要比特币协议和脚本的升级。我们将用一个简单的 Thimbles 游戏 来演示这套协议是怎么工作的,并提供关于可以使用上述方法的应用的初步思考。

引言

比特币脚本自身并不允许置入随机性,因此也不允许基于随机性来构造支付流。所以,在下列假设下,“Alice 和 Bob 各出 5 BTC,如果硬币是反面, Bob 就可以拿走所有钱 ” 这样的流程是无法实现的:

  1. 交易无法在确认的时刻从某处派生(或者说取得)随机性
  2. 比特币脚本不能检查区块,也不能读取过去和未来的交易
  3. 双方都可以在每一个操作码处理完成后得到相同的堆栈状态
  4. 无法控制 ECDSA 和 Schnorr 签名的确定性
  5. 比特币不支持 OP_RAND 操作码

上述所有限制,导致我们无法找到允许抓取随机性并用来操作比特币的免信任方法。我们提出了一种通过两方交互式协议来实现它的绑法,并展示了这些特性可以用在以比特币为赌注的 thimbles 游戏中。

预备知识

$G $是一个阶数为素数 $p$ 的循环群,$G∈G$ 是该群的生成元。

$a∈Fp$ 是一个标量值,而$ A∈G $是一个属于该群的元素。

$hashp(m)→h∈Fp$ 是密码学哈希函数,取任意的消息$ m$ 为输入,返回域元素$ h$ 。

$hash160(P)→addr∈A $是一个函数,对公钥作连续的 SHA-256 和 Ripemd160 运算,输出一个有效的比特币地址。

我们为如下关系定义证据 $π:R={(w;x)∈W×X:ϕ1(w,x),ϕ2(w,x),…,ϕm(w,x)}$,其中 w 是一个见证数据,而 x 是一个公开数据,而$ ϕ1(w,x),ϕ2(w,x),…,ϕm(w,x) $是一组必须同时证明的关系。

我们定义具有 n 个输入和 m 个输出的一笔比特币交易为 $TX{(id,i,proof)(n);(aBTC,cond)(m)}$,其中 id 是前序交易的哈希值,i 是输出的索引号,proof 是花费交易所需的一组数据;a 是输出中的资金数量,cond 是脚本公钥条件。例如,P2PKH 输入需要 proof←⟨PK,σ⟩ 和 cond←⟨ OP_DUP, OP_HASH160, addr, OP_EQUALVERIFY, OP_CHECKSIG ⟩ 。在使用 P2PKH 时,我们将简化上述条件记号为简单的 addr 。

椭圆曲线点限制条款

首先,我们来看看如何在两个对手方之间实现具备下列条件的交易:“仅在交易的第一个输出被花费之后,才能花费交易的第二个输出”。以往,人们认为这可以用一个哈希所合约来做到,然而,(1)这是可识别的;(2)它无法帮助我们实现最终的游戏。

算法 1:创建在另一个输出被花费之后才能花费的条件式输出。

条件:Alice 和 Bob 各自存入 1 BTC 。Bob 只有在 Alice 花掉自己的 1 BTC 之后,才能花费自己的 1 BTC。Bob 的公钥 Pb 是可以提前知道的。

流程

  1. Alice 生成:

$ska←Fb$

$Pa=skaG$

$addra=hash160(Pa)$

$C=hashp(Pa).G$

并为以下关系生成一个证据 πc:

$Rc={Pa;addra,C,G:hash160(Pa)→addra∧hashp(Pa).G→C}$

  1. Bob 收到证据 $πc $之后,取出 C 并计算:

$addrb=hash160(Pb+C)$

  1. Bob 创建一笔交易并发送给 Alice:

$TX1{(prevA,iA,−),(prevB,iB,σB(TX1));(1BTC,addra),(1BTC,addrb)}$

  1. Alice 也签名这笔交易,并广播到网络中:

$TX1(prevA,iA,σA(TX1)),(prevB,iB,σB(TX1));(1BTC,addra),(1BTC,addrb)$

如果 Alice 想要花费自己的输出,她就需要创建这样一笔交易,并公开一个公钥 Pa 及其签名:

$TX2{(TX1,1,⟨Pa,σPa(TX2)⟩);(1BTC,addra′)}$

在该交易公开的时候,Bob 可以抽取出 Pa 并复原 hashp(Pa) 的值。然后,第二个输出的私钥就可以计算出来:sk=hashp(Pa)+skb(只有 Bob 知道 skb),而且 Bob 可以构造出关联着公钥 Pb+C 及其地址的签名。

$TX3{(TX1,2,⟨Pb+C,σPb+C(TX3)⟩);(1BTC,addrb′)}$

(译者注:考察这里的上下文,Alice 给 Bob 的证据是一种 “零知识证据”,Bob 只知道 Alice 拥有这样一个值,但并不能从证据中知道这个值是什么。)

这样,我们就构造出了模拟随机性和我们的 thimbles 游戏的第一部分。我们要指出的是,在上述例子中,如果 Alice 不花费自己的输出、不公开 Pa,Bob 就无法复原出第二个输出的私钥,也就无法花费它。如果我们需要提供在一段时间后花费这些输出的能力(比如说,如果游戏一直没开始),我们可以像支付通道构造那样 —— 将资金锁定到多签名输出中,然后创建一笔可以在一段时间后花费它的交易。

OP_RAND 模拟协议

我们提出了一种在交易的两方之间通过交互式协议模拟 OP_RAND 操作码的方法。引入挑战者 C 和接受者 A 的角色,然后我们可以这样定义模拟 OP_RAND 的协议:

  1. C 和 A 各有自己的密钥对 $⟨skC,PC⟩ $和 $⟨skA,PA⟩ $。只有 PC 的值是公开的。
  2. C 生成一组随机数值 $a1,a2,…,an$,然后为它们创建一个一级承诺:$Ai=aiG,i∈[1,n]$
  3. C 选出其中一个承诺$ Ai$,将它跟自己的公钥组装起来:$RC=PC+Ax$,然后仅发布该值的哈希值:$hash(RC)$
  4. C 创建二级承诺 $hi=hash(Ai),i∈[1,n] $以及三级承诺$ Hi=hiG,i∈[1,n]$ 5.$ C$ 创建一个证据 $πa$ ,证明所有三级承诺都是正确推导的,然后其中一个一级承诺会跟 PC 相结合
  5. C 给 A 发送这组三级承诺,并提供证据 πa
  6. $A$ 验证证据$ πa$,然后选择其中一个三级承诺 Hy 跟自己的$ PA$ 组装在一起。然后,$A$ 发送该值$ RA=PA+Hy $和哈希值 $hash(RA)$
  7. A 创建一个证据$ πr$,证明其中一个三级证据会跟 PA 相结合,然后发送给 C。此外,该证据也表明了对 PA 的离散对数的知识。
  8. $C$ 验证证据$ πr$,如果该证据有效,就发布 $RC$
  9. $A$ 计算 $Ax=RC−PC$
  10. 如果$ hash(Ax)⋅G=Hy$,$A$ 就胜出。否则$ A $输。

Thimbles 游戏作为一个例子

(略)

<!--EndFragment-->

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
BTCStudy
BTCStudy
https://www.btcstudy.org/