Client

如何實現像 SatoshiDice 這樣的遊戲?

  • January 3, 2019

每個人都知道 SatoshiDice 是什麼。他們的核心機制是通過使用比特幣交易進行賭博,其支出與推動床的交易直接相關,以避免雙花攻擊。我的問題是,如何實現這樣的機制?它可以在標準客戶端中完成,還是需要一些額外的軟體來選擇交易的確切輸入?

創建類似 SatoshiDice 的遊戲相當容易。以下是製作此類游戲所涉及的高級步驟。

對於每筆傳入交易…

獲取客戶金額和付款地址

  1. 打電話bitcoind getrawtransaction [The incoming transaction ID] 1。末尾的 1 將以“詳細模式”返回數據,本質上是 JSON 格式的原始數據。
  2. 從原始交易細節中,從對像中獲取txidand 。通過此事務,再次呼叫.vout``vin``bitcoind getrawtransaction``txid
  3. 從這些原始事務詳細資訊中找到vout對象,由vout步驟 #2 中的索引引用。在這個vout對像中,應該有一個收款人地址列表。獲取並儲存第一個地址。

確定回合的贏/輸狀態並返回結果

  1. 散列交易的txid+vout索引。使用密鑰為您的雜湊函式播種。作為旁注,您需要定期提供您的密鑰。如果不更新和提供您的密鑰,您的玩家將無法驗證您的公平性。
  2. 比較雜湊的最後四個字節以確定贏/輸條件。

萬一虧損…

  1. 打電話bitcoind createrawtransaction。您必須傳入原始txidvout您的客戶付款。在客戶地址中,包含一個小的分數值以發送回客戶。這告訴他們他們已經輸掉了這一輪。此外,包括第二個付款地址,該地址將從發起付款的客戶那裡接收剩餘部分的比特幣。這應該是您錢包中的地址。
  2. 致電bitcoind signrawtransaction簽署交易。如果它返回一個值complete=true,你的交易是有效的。
  3. 呼叫bitcoind sendrawtransaction並包含上述構造的原始交易。

中獎的情況下

  1. 計算客戶中獎金額。
  2. 打電話bitcoind listunspent。這將返回您的錢包尚未花費的輸入交易列表。
  3. 創建要作為付款處理的交易列表。首先,包括客戶的付款來源txidvout索引。接下來,將向您的客戶支付獎金所需的任意數量的未使用交易(從步驟#1)附加到列表中。

請記住包含一個額外的付款地址,該地址將從最終未使用的交易中接收剩餘部分的比特幣,其中可能包含超過玩家獎金的超額部分。 4. 呼叫bitcoind createrawtransaction,傳入步驟 #3 中累積的所有事務。 5. 致電bitcoind signrawtransaction簽署交易。 6. 呼叫bitcoind sendrawtransaction並包含上述構造的原始交易。


而已!這是一個非常簡單的 SatoshiDice 處理器。您可能想要添加更多驗證、記憶體您的交易、監控孤立塊並集成一些其他管理常式。

值得一提的是,您始終在所有退貨交易中包含客戶原始付款的一部分。這是因為如果他們的付款是孤立的,或者被標記為無效,您希望確保您的交易也從區塊鏈中刪除。

使用這種方法,您實際上可以幾乎立即做出響應,並且無需確認。如果他們的交易格式錯誤並被網路拒絕,您的交易也將被網路丟棄,因為它是他們原始交易的子交易。

引用自:https://bitcoin.stackexchange.com/questions/7369