我們可以在位元幣網路上基于位元承諾方法實作一個公平且不需要第三方的擲硬幣游戲,

假設 Alice 和 Bob 決定擲硬幣,但他們沒有實物硬幣,或者他們想通過互聯網進行,通過遵循下面這個位元幣協議,他們可以實作公平的拋硬幣,
- Alice 和 Bob 各自將 x 個位元幣鎖定在如下所示的智能合約中(注意:此時他們并沒有透露自己的秘密數字);
- 在新交易里同時提交他們各自的秘密數字,然后對這兩個秘密數字進行異或操作,以確定硬幣是正面還是反面,如果是正面則 Alice 贏,否則 Bob 贏,獲勝者將獲得所有 2x 個位元幣,
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));
}
}
實踐考慮
如果當事一方在發現自己失敗的情況下拒絕透露其秘密數字,可能還需要采取其他措施改進,例如,可以讓失敗者拿回其投入的一半位元幣,而不是讓獲勝者全部拿走,這樣也可以激勵失敗者提交其秘密數字,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/265463.html
標籤:區塊鏈
