另一个公平掷硬币 sCrypt 合约

上篇文章中,我们使用 XOR 在比特币网络上进行了公平的抛硬币。今天我们来介绍另一种使用 Blum 原始协议 [^1] 来实现这个游戏的方法。

它包括以下步骤:

  1. Alice 选择质数 pq。 他告诉 Bob 二者乘积 N = p * q。Alice 可以选择很大的 pq ,这样 Bob 就无法进行从 N 进行反推;
  2. Bob 在 0 到 N 之间选择 x [^2],并计算 b =x² mod N。他告诉Alice 数值 b。 此步骤类似于在掷硬币之前就选择一个结果并作出承诺;
  3. Alice 计算 b 取模 N 的四个方根,分别是 xyN-xN-y。 她选择 {x,N-x}{y,N-y} 对中的一个并告诉 Bob。 该步骤对应于硬币的物理翻转;
  4. 如果 Alice 选择 {x,N-x},则 Bob 获胜,并且他可以通过告诉 Alice x 轻松证明这一点。除非 Bob 在第2步中选择了 x,否则他无法计算出这个数,因为他不知道 pq
  5. 如果 Alice 选择 {y,N-y},则她获胜。 因为 Bob 无法计算出 y,所以他不能通过告诉 Alice 这个数来作弊。

合约示例代码如下:

// fair coin toss using Blum's protocol
// Coin Flipping by Telephone. by Manuel Blum CRYPTO 1981
contract CoinToss {PubKey alice;PubKey bob;// commitmentsSha256 aliceHash;Sha256 bobHash;// N = p * qint N;public function toss(int aliceNonce, int bobNonce, Sig sig) {require(hash256(pack(aliceNonce)) == this.aliceHash);require(hash256(pack(bobNonce)) == this.bobHash);// Bob succeeds to guess Alice's tossbool head = aliceNonce == bobNonce || aliceNonce == this.N - bobNonce;// head -> Bob wins; tail -> Alice winsPubKey winner = head ? this.bob : this.alice;// winner takes allrequire(checkSig(sig, winner));}
}

[^1] Coin Flipping by Telephone: A Protocol for Solving Impossible Problems. Blum (CRYPTO 1981).
[^2] x 和 N 必须是互质的,以确保 4 个平方根


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部