前言:
將來基於Dapp的遊戲可能會多起來吧, 尤爲是博彩類遊戲, 因爲區塊鏈匿名特性, 加之數字貨幣不受國家監控, 幾乎成了一個法外之地. 大量遊戲團隊都往之涌入.
今天講講當前Dapp的一種遊戲模式--pvp, 結合一個github上的開源項目magic-maze-2d來解讀.git
簡介:
代碼是從github上搜索到的, 它是基於波場(公鏈)來發布合約的.
具體的github地址magic-maze-2d, 我這邊權當搬運工了, 我以爲代碼寫的很好, 很是地敬佩做者.
github
設計思想:
pvp模式, 轉變了以前人和平臺博弈的局面, 轉爲人和人之間的博弈, 平臺只做爲組織者而存在. 這樣遊戲服務商能夠承包大部分的業務邏輯, 而涉及數字貨幣的交易則由智能合約來管理. 公開透明, 玩家都能接受.
繼續借用做者的流程圖:
其合約的核心代碼以下所示:後端
contract MagicMaze { // 用於建立房間(帶着遊戲房間信息的hash), 設定獎勵規則 function create(uint256 id, string memory name, string memory mazeHash) public payable { require(msg.value >= SERVICE_FEE); require(mazes[id].bonus == 0); bytes32 hash = stringToBytes32(mazeHash); mazes[id] = Maze(id, name, hash, msg.value, msg.sender, address(0), address(0)); emit mazeCreated(id); } // 新玩家進行挑戰註冊 function challenge(uint256 id) public payable { require(mazes[id].bonus != 0); require(mazes[id].challenger == address(0)); require(mazes[id].bonus == msg.value); mazes[id].challenger = msg.sender; mazes[id].bonus += msg.value; } // 勝利者獲取獎勵(帶着房間信息, 可生成hash, 用於驗證) function takeBonus(uint256 id, string memory mazeInfo) public payable { require(mazes[id].bonus != 0); require(mazes[id].winner == address(0)); require(mazes[id].creator == msg.sender || mazes[id].challenger == msg.sender); require(msg.value >= SERVICE_FEE); bytes32 mazeHash = sha256(abi.encodePacked(mazeInfo)); if (mazeHash == mazes[id].mazeHash) { mazes[id].winner = msg.sender; msg.sender.transfer(mazes[id].bonus); emit winner(id, msg.sender); } else { emit falseClaim(id, msg.sender); } serviceCharge += msg.value; } }
簡單來講, 能夠概括以下:
1. 玩家調用服務端建立房間, 後端根據房間信息+祕鑰(MazeInfo), 生成hash, 返回給玩家.
2. 玩家帶着房間信息 + hash, 去智能合約建立房間(create).
3. 有另一個玩家來挑戰, 先在智能合約中註冊爲該房間的挑戰者(challenge), 而後和服務端交互確認, 若是勝利, 服務端下發房間信息和祕鑰(MazeInfo)
4. 贏家能夠根據這個MazeInfo去合約中獲取獎金(takeBonus).
在整個流程中, 服務端都沒有參與合約裏獎池創建和提取, 而服務端至關於公平的裁判者.app
總結:
這種pvp的模式, 平臺不參與博弈, 只收取服務費. 並且挑戰雙方, 不須要同時在線, 可玩性極強, 感受會流行一波, 不過PVP模式的遊戲, 也是一個潛在的缺點, 就是有些不良平臺會搞託(機器人), 這樣即作裁判員, 又作運動員, 輕鬆贏得獎池.
我仍是相信大浪淘沙後, 最終會留下幾款體驗超好, 又值得信賴的精品.區塊鏈