Peers
在乙太坊中創建點對點硬幣翻轉合約有哪些挑戰?
我希望簽訂一份契約,允許兩個(最終可能更多)人使用乙太坊進行賭注。一個人不會“對合約賭博”,而是合約的另一個使用者。
考慮到區塊鏈數據是公開的,這可能嗎?雙方都應該提供隨機性,例如,他們都必須提供 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 可以拿回兩個賭注,並且可能輸了。