Contract-Design
在契約中洗牌的有效和安全的方法是什麼?
我們想用乙太坊寫一個紙牌遊戲。什麼是洗牌契約中的一副牌並將它們發給玩家的有效且安全的方法? 它需要以一種方式完成,這樣沒有人可以通過檢查開源合約程式碼和洗牌交易來確定彼此的牌和洗牌的牌組是什麼,這些都在公共乙太坊區塊鏈上。
如果這在契約中是不可能的,有哪些方法是可能的?
洗牌
交換加密:
愛麗絲和鮑勃想要洗一副牌,這樣他們都不知道對方的手上有什麼,但手是不相交的(即只有一個人可能有一張特定的牌)。
協議:
Alice 和 Bob 決定使用具有以下特性的加密協議
- E K (X)是用密鑰K加密的X
- D K [ E K (X) ] =所有K和X 的X
- E K [ E J (X) ] = E J [ E K (X) ]
- 即**E(X)**是可交換的
- 給定X和E K (X)在計算上不可能推導出K
- 給定X和Y、J和K使得**E J (X) = E K (Y)**無法找到
- 即**E(x)**是抗碰撞的
現在 Alice 和 Bob 有了一個加密方案:
- Bob 取出五十二張卡片(“2C”、“3C”、…、“AS”)並用密鑰B加密每張卡片
- Bob 以隨機順序將加密的卡片洗牌,並將牌組發送給 Alice
- 愛麗絲看不到牌,因為她不認識B
- 愛麗絲選擇了五張卡片,並將它們發回給鮑勃
- 這是鮑勃的手。Bob 可以看到這些卡片,因為他知道B
- Alice 又向 Bob 發送了五張卡片,但首先她使用密鑰A對它們進行加密
- 現在,每張卡都被加密為E A [ E B (X) ],這相當於**E B [ E A (X) ]**的屬性 #4。
- Bob 解密這些卡並將它們發回
- Bob 看不到牌,因為他不知道A。然而,愛麗絲可以看到它們,這些是她的手。
可以使用類似的程序繪製更多卡片。遊戲結束後,Alice 和 Bob 顯示A和B,以便他們可以驗證沒有玩家作弊。
具有所列屬性的加密方案確實存在,包括類似於 RSA 的方法。有關更多詳細資訊,請參閱我的來源。
在契約中使用:
合約可用於管理玩家之間的消息傳遞,並分配獎勵。除非玩家不同意結果,否則合約不需要執行任何邏輯。在出現分歧的情況下,挑戰者必須提供足夠的乙太幣來支付驗證遊戲的 gas 費用。然後其他玩家必須執行呼叫來驗證遊戲結果。Gas 被退還給誠實的玩家,並且該回合被作弊者取消或沒收。