你好,我是不羈,一名程序員,帶你玩轉EOS智能合約開發。如果你對EOS智能合約感興趣,歡迎關注我的專欄。
簡介:我是一個一直以來倡導智能合約開源的人,不過最近看到EOSBet竟然不開源,甚是驚嘆!竟然有那么多用戶在玩一個無法自證公平的游戲!所以本文就和大家探討一下項目方不開源的原因。
EOSBet是“誰”?
EOSBet是一個基于EOS做博彩類的團隊,目前只有一個dice
項目。
dice
就是擲骰子游戲,但可別小看這個項目,它每天參與游戲的資金達到100萬EOS
以上,給EOSBet團隊每天帶來2萬EOS
的利潤。真可謂日進斗金。
為什么博彩類游戲在EOS上會這么火呢?如果你問一個玩dice游戲
的人,“你為什么玩這個dice游戲?”,我相信他會這么回答你:
- 第一,每個人都有以小博大的僥幸心理
- 第二,它是基于區塊鏈的,透明公平,不像其他的賭博網站,站長可以幕后操縱結果
是的,人們認為區塊鏈是透明可信的,所以只要基于區塊鏈的游戲,就是透明公平的。
真的是這樣嗎?
答案是否定的。
每一個dapp都有一個與之交互的智能合約,我們在區塊鏈瀏覽器上可以看到和智能合約的所有交互過程,而智能合約內部是一個黑匣子。以EOSBet的dice游戲為例來看,我們所能看到的是,我們給eosbetdice11
合約轉賬,并在memo里填上2到96之間的任意一個數字,假設我們填的是50,過了一段時間,智能合約告訴我們說,隨機生成的數字是51,我們這局輸了。但我們是怎么輸的?“不知道,只能從他們的官網上看到,他們會進行一些隨機數的運算,但這些隨機數怎么運算的,我們也不知道”。
這就是問題所在了,因為智能合約是個黑匣子,也就給了項目方藏匿貓膩的空間:
- 他們可以在智能合約里,把我們的盈利概率減少
3-5
個百分點,而我們卻毫無察覺 - 即便我們統計一下歷史記錄,可以得出智能合約把玩家的盈利概率減少了
3-5
個點,官方也完全可以說“這是隨機樣本誤差本來就存在,3-5點的誤差很正常”; - 如果項目方在智能合約里,增加小賭注玩家盈利的概率,而減少大賭注玩家盈利的概率,那么采用統計學來判斷項目方有沒有在智能合約里藏有貓膩的方法,也失效了。
總之,如果智能合約沒有開源,我們根本無法判斷一個dapp項目是否公平。
其實,在一個月以前,我聽說EOSBet將要上線的時候,我想它一定會開源的,因為博彩類項目搬移到區塊鏈上,相對于傳統網上博彩游戲的優勢,就是項目方可以通過開源以及源碼驗證的方式向用戶自證清白,這樣,人們可以不用去拉斯維加斯和澳門,就能玩公平的博彩游戲。
所以,當我發現EOSBet竟然沒有開源,我幾乎驚呆了。
要知道,博彩類游戲的隨機性設計
對于玩家的利益來說至關重要,它應該被精心設計并且公開出來,如果這么重要的部分都沒有開源,玩家的利益還有何保障可言?與玩傳統的網上博彩類游戲又有何區別?
那么EOSBet為什么不開源呢?
不開源的原因
我想,項目方可能有如下三點考慮:
- 第零,很可能項目方本身就想藏貓膩。關于這點我們就不展開了,總之,只要不開源,這種可能性總是存在的。
- 第一,怕被人發現漏洞
- 第二,怕代碼公開了之后,別人抄襲
- 第三,存在不可公開的算法,怕開源之后,黑客利用該算法產生不利于項目方的結果
先說第一點,如果智能合約代碼開源了,黑客發現漏洞就更容易了。如果代碼真的存在漏洞,而黑客沒有告知項目方,而是偷偷了利用這個漏洞盈利,那么項目方就損失了。
其實我覺得這個情況,可以通過機制設計來解決。
- 首先,智能合約應該設計安全檢測能力,當發生異常情況時,應該自動鎖住合約,暫停游戲。
- 其次,應該在上線之前,對發現漏洞的同學給予懸賞,這樣,即便黑客在發現漏洞之后,就會有動力告知項目方,如果他想把漏洞隱瞞不報,那么其他的人報了,獎賞就會被其他人領走,所以各個“黑客以及白客”之間,就會產生一種良性的競爭關系。最終大家共同受益,黑客拿到了賞金,項目方提前修復了漏洞,避免了損失。
第二點顧慮,很可能是項目方最主要的顧慮,不過我覺得其實沒太大必要,有沒有源代碼,都可以一樣被“抄”,沒有代碼,可以抄界面,抄交互設計,只是抄的速度慢一點而已。就EOSBet而言,技術上沒有多少難點,形成不了門檻,真正形成門檻的是運營和社區認同。EOSbet的營銷做的很到位,但因為沒有開源,我預計社區認同會越來越弱。
再說項目方的第三點顧慮。你可能會驚訝,“還存在這種漏洞?”。是的,是存在的;當然解決方案不是沒有,只是項目方可能沒想到,或者擔心用戶使用起來太復雜。
要解釋這個顧慮,需要費一番功夫,我們一步步來看。
隨機數之“傷”
我們就以隨機數的生成為例吧。隨機數生成算法幾乎對于各類游戲來說,都是至關重要的。
好的隨機數,有兩個主要特點:
- 結果是零散的
- 結果是不可預測的
其實,準確來說,第二個特點包含著第一個特點。不可預測性是優良的隨機數的基本特征,這里的不可預測,不僅指任何人都無法對每次結果進行精準預測,還包括任何人都不能對每個結果的傾向性進行預測。就像仍硬幣,如果仍的人有個習慣性動作,這個動作能讓你在他仍硬幣之前,就能判斷出結果是正面的概率大于50%,那么此人仍硬幣的過程,就不是一個好的隨機過程。
你可能會說,“生成隨機數嗎?so easy,C++上面有一堆生成隨機數的庫,拿過來用就好了!”,
對不起,在EOS智能合約上用不了。智能合約中能夠使用的C++接口都是通過webassembly虛擬機提供的,暫時沒有random接口。另一方面,因為區塊鏈產生的每個區塊,都要求是可被其他的節點驗證的,也就是說,一個智能合約的執行結果,在不同的節點上執行,結果必須是相同的,這種確定性與隨機數的不可預測性存在一定的沖突。
一個隨機數的例子
我在stackoverflow上搜索到了這樣一個內容,是EOS knight
實現的一個隨機數生成器:
我去EOS knight
的github中搜索了一下,現在已經沒有這部分代碼了,也沒有任何其他的智能合約部分的源碼了。
這部分代碼很好懂,我就不解釋了。你可以看到,它生成的隨機數的確是零散的,但并不能滿足不可預測性。
為什么呢?
因為這個隨機過程的結果完全依賴于當前的時間和玩家的賬戶,那么我就可以在交易產生之前,提前預測某個時間,該隨機過程產生的隨機結果。你可能會說,“這個current_time()
返回的是毫秒級別的,你怎么可能把你的交易時間控制的那么準確?剛好就在你預測的時間完成交易呢?”。
實際上current_time()
是秒級別的,雖然文檔中說返回的毫秒,但后面都帶有3個0。
即便將來EOS可以精確返回毫秒級別的結果了,我也可以跟就上面算法,預測某一秒鐘內,所產生的結果的傾向性,或者說,可以預測產生的結果在什么范圍之內,這樣我就可以利用這個特點來盈利了。
再回到EOSBet的dice
游戲,如果它采用了上面的隨機數生成器,對于普通玩家來說,沒有任何問題,這個隨機過程挺好的,很零散。但黑客就可以根據時間提前預測骰子的點數的概率,從而穩定盈利了。這樣的話,項目方就虧損了。
EOS knight
最初應該也是把智能合約開源了的,后來又不開源了,想必也是這個原因吧。
的確,在智能合約上產生一個不可預測的隨機數是一個難題,不過不代表項目方必須把智能合約藏起來,其實可以通過在機制上解決隨機數的生成問題,早前在ETH上人們就想出了解決辦法,不過解決辦法不是很完美,但完全能應對dice
合約的需求了。至于如何做,我們明天再聊。
留一個問題給大家思考,學過C++的都知道,向系統請求開辟一塊內存時,該內存的地址是不確定的,那你覺得可以利用這個特點,在智能合約中生成隨機數嗎?
歡迎留言探討。