BSV 网络上公平的掷硬币游戏

我们可以在 BSV 网络上基于比特承诺方法实现一个公平且不需要第三方的掷硬币游戏。
toss_bitcoin

假设 Alice 和 Bob 决定掷硬币,但他们没有实物硬币,或者他们想通过互联网进行。通过遵循下面这个 BSV 协议,他们可以实现公平的抛硬币。

  1. Alice 和 Bob 各自将 x 个 BSV 锁定在如下所示的智能合约中(注意:此时他们并没有透露自己的秘密数字);
  2. 在新交易里同时提交他们各自的秘密数字,然后对这两个秘密数字进行异或操作,以确定硬币是正面还是反面。如果是正面则 Alice 赢,否则 Bob 赢。获胜者将获得所有 2x 个 BSV 。
contract CoinToss {
    Ripemd160 alice;
    Ripemd160 bob;
    // commitments
    Sha256 aliceHash;
    Sha256 bobHash;

    public function toss(bytes aliceNonce, bytes bobNonce, int amount, SigHashPreimage txPreimage) {
        require(Tx.checkPreimage(txPreimage));

        require(hash256(aliceNonce) == this.aliceHash);
        require(hash256(bobNonce) == this.bobHash);
        
        // last bit of XOR
        bytes head = (aliceNonce ^ bobNonce) & b'0000000000000000000000000000000000000000000000000000000000000001';

        // head -> Alice wins; tail -> Bob wins
        Ripemd160 winner = head ? this.alice : this.bob;

        // winner takes all
        bytes winnerScript = Util.buildPublicKeyHashScript(winner);
        bytes winnerOutput = Util.buildOutput(winnerScript, amount);
        require(hash256(winnerOutput) == Util.hashOutputs(txPreimage));
    }
}

实践考虑

如果当事一方在发现自己失败的情况下拒绝透露其秘密数字,可能还需要采取其他措施改进。例如,可以让失败者拿回其投入的一半 BSV ,而不是让获胜者全部拿走,这样也可以激励失败者提交其秘密数字。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sCrypt Web3应用开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值