有沒有辦法解決鏈下游戲中的中斷問題?
假設我想用區塊鏈下棋賺錢。因此,我可以在區塊鏈上註冊與一定數量的乙太幣相關的智能合約(國際象棋遊戲)。如果有人想加入,他或她必須下注相同數量的乙太幣。誰贏了比賽,誰就得到了所有的乙太。
我們可以實現這個智能合約在鏈上執行。因此,對於移動的每一塊,玩家都必須在區塊鏈上登記他的決定。這種方法會很昂貴,因為玩家必須為他們做出的每一個決定支付交易費用。而且會很慢,因為遊戲速度會受限於區塊鏈本身的速度。
為了避免這些問題,我們可以實現這個智能合約以在鏈下執行。除了遊戲本身和乙太幣之外,合約還包含一個建立通信的地址(忘記安全問題)。
第一個下棋的人會用他的私鑰簽署他的決定(哪個棋子,以及它的新位置)並將其發送給其他玩家(而不是區塊鏈)。第二個玩家會用他的私鑰簽署一個包含他自己的決定和另一個決定以及另一個簽名的“塊”,然後將其發送給第一個玩家,依此類推……
這個過程會一直持續到遊戲結束。然後,任何玩家都可以在區塊鏈上註冊最終區塊(包含所有已簽署的決定)。合約本身可以驗證決策(在本例中為移動)的真實性和有效性,並將所有乙太幣轉移給獲勝者。
問題是:如何處理中斷?
如果一個不誠實的玩家做出了錯誤的舉動,他不會後悔(在將其發送給其他玩家之後),因為他的決定已經簽署,但他可以永遠“無所事事”。所以,他會忽略對方的下一個決定,所有的乙太幣都將永遠被兩個玩家封鎖。為了避免這種情況,我們可以實現超時。
如果合約超時,就會出現另一個問題:一個玩家(我們稱之為A)可以通過拒絕接受對方的決定來試圖“欺騙”區塊鏈,假裝對方放棄了。我們可以通過允許其他玩家(我們稱之為 B)自己直接在區塊鏈上註冊他的決定來解決這個問題,即使輪到他玩也不行。這樣,合約就可以知道玩家 B 是活躍的。
我相信,這樣一來,兩名球員都會有動機誠實地比賽。
如果玩家 A 不想(或不能)再玩,B 可以將不完整的遊戲發送到區塊鏈,並且在超時後,如果 A 沒有發布任何有效的決定,合約將假定 A 放棄並將所有的乙太幣轉移給 B。
如果玩家 A 認為他沒有獲勝的機會,他無論如何都必鬚髮送一個決定,否則玩家 B 將在區塊鏈上註冊不完整的遊戲,並且時間將開始計算,除非 A 發布一個有效的決定。
如您所見,我剛剛提出了一個解決方案。我這樣做是因為我什至不知道如何正確描述這個問題。
那麼,既然(我希望)問題很清楚,那麼這個解決方案是否有效?如果沒有,還有其他嗎?哪一個?
我以國際象棋為例,但它可以是圍棋、棋子、雜湊、撲克或任何其他決策遊戲。
您已經描述了狀態通道:什麼是狀態通道和案例/程式碼範例?
它們是一些區塊鏈遊戲和幾個第二層擴展解決方案(如 Raiden 或比特幣閃電網路)的基礎。
我寫了一些建構完整狀態通道解決方案的部落格文章:
具體來說,第二篇文章的“鏈上備份”部分與您關於超時的問題有關:
…如果玩家的對手停止移動,玩家需要通過呼叫來呼叫暫停
startTimeout()
…為了響應超時,輪到的玩家必須通過呼叫 來移動
move()
。這會重置計時器並讓遊戲繼續。然後玩家可以恢復交換簽名消息的典型工作流程,或者他們可以繼續在鏈上移動。我相信這正是您所描述的,所以是的,我相信您的解決方案應該有效。