比特币 - 模拟 OP_RAND

  • BTCStudy
  • 发布于 2025-03-04 22:49
  • 阅读 10

本文提出了一种在比特币上模拟 OP_RAND 操作码的方法,通过交易对手方之间一种免信任的交互式游戏实现。该协议允许双方以概率性方式进行交互,且任何一方都不能欺诈或影响胜率。协议对外部参与者不可分辨,并且不需要比特币协议和脚本的升级。文章还以 Thimbles 游戏为例,展示了该协议的工作原理。

作者: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 相结合
  6. C 给 A 发送这组三级承诺,并提供证据 πa
  7. A 验证证据 πa,然后选择其中一个三级承诺 Hy 跟自己的 PA 组装在一起。然后,A 发送该值 RA=PA+Hy 和哈希值 hash(RA)
  8. A 创建一个证据 πr,证明其中一个三级证据会跟 PA 相结合,然后发送给 C。此外,该证据也表明了对 PA 的离散对数的知识。
  9. C 验证证据 πr,如果该证据有效,就发布 RC
  10. A 计算 Ax=RC−PC
  11. 如果 hash(Ax)⋅G=Hy,A 就胜出。否则 A 输。

Thimbles 游戏作为一个例子

(略)

  • 原文链接: btcstudy.org/2025/03/03/...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

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