智能合約中的隨機數生成演算法
來自專欄拉普達記11 人贊了文章
周末花了點時間又複習了一下 eos 上的智能合約開發,和 @NecoKeine 一起開發了一個 EOS 上的老虎機小遊戲。目測目前看起來是 EOS 上第一個同類型的作品。
- 遊戲官網:happyeosslot.com
- 合約地址:MyEOSKit - EOS Tracker & Tools
- 合約代碼:https://github.com/Andoromeda-Foundation/dapp-examples/blob/master/Contracts/EOS/slot_machine/slot_machine.cpp
- 前端代碼:Andoromeda-Foundation/Project-Eolt 。
命令行小工具:
查詢玩家餘額cleos -u https://api.eosnewyork.io:443 get table happyeosslot happyeosslot player查詢當前玩家的投注 cleos -u https://api.eosnewyork.io:443 get table happyeosslot happyeosslot offer
隨機數生成器是遊戲製作過程中的一個重要工具。一般來說,智能合約中生成隨機數的方法有以下三種:
- 根據一些鏈上信息,取隨機數,例如 blockhash、區塊高度、etc。
- 使用第三方的 Oracle,例如 etheroll。
- 使用 DAORNG。
其中第三種方法一般也是以太坊官方推薦的,最符合區塊鏈精神的方法。不過在 EOS 上目前還沒有這樣的 DAO 合約。所以還有一種方案三的簡化版本,就是讓遊戲雙方分別給出一個 seed,並利用 hash 進行加密,最後再統一揭示。例如 以太坊官方教程中的的盲拍 以及 EOS 官方合約中的擲骰子。
合約中有三張 table,
- global 記錄全局信息,如遊戲當前 seed。
- player 記錄玩家的信息,每個玩家的籌碼。
- order 記錄每個玩家下注的隊列。
每當後台檢測到有玩家下注,我們就調用一次 reveal 方法,清空當前 order 隊列,並順便設置下一局遊戲的 seed。
最後說一下這個遊戲的風險,理論上,遊戲官方作為最後一步揭示 seed 的參與者,是可以提前預測到 roll 出的結果的,因此可以拒絕開獎或者大量作弊套現離場。另一種可能是雖然玩家 roll 到 100 倍的 BTC 是小概率事件(我們自己測試的時候第一把就 roll 到了 btc,我們還一度以為是合約的 bug。。。),但是一旦發生可能會造成短時間內產生大量擠兌,導致合約入不敷出。
推薦閱讀:
※最近應該是踩狗翔了 2018.08.14
※2018EOS、ETH的最強挑戰者——梵塔網路PNT
※幣圈一年賺9倍的操作方法,原來如此簡單!
※每日復盤 | 下跌目標精確到位,EOS「給足面子」翻開新篇章
※fcoin驚現賬戶被盜!這是要涼?