Peers

在乙太坊中創建點對點硬幣翻轉合約有哪些挑戰?

  • July 17, 2018

我希望簽訂一份契約,允許兩個(最終可能更多)人使用乙太坊進行賭注。一個人不會“對合約賭博”,而是合約的另一個使用者。

考慮到區塊鏈數據是公開的,這可能嗎?雙方都應該提供隨機性,例如,他們都必須提供 1 或 0,如果兩者相同,則 A 獲勝,否則 B 獲勝。是否有可能阻止惡意方看到第一方的輸入並自行提供有偏見的輸入?

是否會限制兩方送出作品的時間?歡迎任何 hacky 解決方案或沉思。

是的,通過使用散列函式的屬性。

  • step1 有 2 筆交易:A 和 B 各自送出一個雜湊(他們的賭注 + 一個隨機數)
  • step2 有 2 筆交易:A 和 B 公開他們的賭注和隨機數
  • 作為步驟 2 的第二筆交易的一部分:合約支付給獲勝者。

這裡有一些想法,而不是寫整個事情:

函式散列(bool bet,bytes32 nonce)純公共返回(bytes32 hashedBet){
// keccak256,重要位
return keccak256(abi.encodePacked(bet, nonce));
}

函式submitBet(uint betId,bytes32 hashedBet)應付公共{
// 一些控制,例如,如果 A 和 B 都不是,則恢復
// 如果沒有下注
賭注 [betId] [msg.sender] .hashedBet = hashedBet;
}

功能公開賭注(uint betId,bool bet,bytes32 nonce)公共{
// 一些控制,例如,如果 A 和 B 都不是則拋出
// 或者如果缺少賭注

// 檢查沒有說謊
要求(散列(賭注,隨機數)==賭注[betId][msg.sender].hashedBet);

bets[betId][msg.sender].disclosed = true;

// 然後一些邏輯看其他玩家是否洩露

// 然後是一些支付獲勝者的邏輯
}

當然,您還應該設置截止日期:

  • 如果 B 未送出任何賭注,則 A 收回其賭注。
  • 如果 B 沒有透露,A 可以拿回兩個賭注,並且可能輸了。

引用自:https://ethereum.stackexchange.com/questions/11625