模拟 OP_RAND

作者: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 游戏中。

预备知识

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

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

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

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

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

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

椭圆曲线点限制条款

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

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

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

流程

  1. Alice 生成:

ska←Fbska←Fb

Pa=skaGPa=skaG

addra=hash160(Pa)addra=hash160(Pa)

C=hashp(Pa).GC=hashp(Pa).G

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

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

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

addrb=hash160(Pb+C)addrb=hash160(Pb+C)

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

TX1{(prevA,iA,−),(prevB,iB,σB(TX1));(1BTC,addra),(1BTC,addrb)}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)TX1(prevA,iA,σA(TX1)),(prevB,iB,σB(TX1));(1BTC,addra),(1BTC,addrb)

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

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

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

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

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

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

OP_RAND 模拟协议

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

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

Thimbles 游戏作为一个例子

(略)

olkurbatov2025-03-03
https://www.btcstudy.org/2025/03/03/emulating-op-rand-by-olkurbatov/

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇