我们提出了一种方法,可通过交易对手方之间的一种免信任的交互式游戏,在比特币上模拟 OP_RAND 操作码。游戏的结果是概率性的,并且不允许任何一方欺诈,也不允许在任何一个步骤中影响自己的胜率。
<!--StartFragment-->
作者:olkurbatov
我们提出了一种方法,可通过交易对手方之间的一种免信任的交互式游戏,在比特币上模拟 OP_RAND 操作码。游戏的结果是概率性的,并且不允许任何一方欺诈,也不允许在任何一个步骤中影响自己的胜率。协议可以让外部参与者分辨不出,也不需要比特币协议和脚本的升级。我们将用一个简单的 Thimbles 游戏 来演示这套协议是怎么工作的,并提供关于可以使用上述方法的应用的初步思考。
比特币脚本自身并不允许置入随机性,因此也不允许基于随机性来构造支付流。所以,在下列假设下,“Alice 和 Bob 各出 5 BTC,如果硬币是反面, Bob 就可以拿走所有钱 ” 这样的流程是无法实现的:
上述所有限制,导致我们无法找到允许抓取随机性并用来操作比特币的免信任方法。我们提出了一种通过两方交互式协议来实现它的绑法,并展示了这些特性可以用在以比特币为赌注的 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 是可以提前知道的。
流程:
$ska←Fb$
$Pa=skaG$
$addra=hash160(Pa)$
$C=hashp(Pa).G$
并为以下关系生成一个证据 πc:
$Rc={Pa;addra,C,G:hash160(Pa)→addra∧hashp(Pa).G→C}$
$addrb=hash160(Pb+C)$
$TX1{(prevA,iA,−),(prevB,iB,σB(TX1));(1BTC,addra),(1BTC,addrb)}$
$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 操作码的方法。引入挑战者 C 和接受者 A 的角色,然后我们可以这样定义模拟 OP_RAND 的协议:
(略)
<!--EndFragment-->
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!