BTC
ETH
HTX
SOL
BNB
查看行情
简中
繁中
English
日本語
한국어
ภาษาไทย
Tiếng Việt

EKT多鏈技術是如何解決智能合約數據的存儲與設計問題的

EKT多链技术
特邀专栏作者
本文約1711字,閱讀全文需要約3分鐘
是如何解決智能合約數據的存儲與設計問題的
AI總結
展開
是如何解決智能合約數據的存儲與設計問題的

自從去年以太坊上的遊戲CtyptoKitties(加密貓)流行起來以後,很多人發現了智能合約的新玩法——做遊戲!在手機遊戲市場中,棋牌類的遊戲佔領了很大的市場,比如斗地主、德州撲克等。這類遊戲有一個共同的特點:在每輪遊戲開始前,需要通過生成隨機數來洗牌,來保證每一局牌面的隨機性。通過智能合約來實現這類棋牌遊戲遇到的一個問題就是:因為智能合約包括區塊鏈上的數據都是開源的,一旦本輪洗牌使用的隨機數在本輪遊戲結束前記錄到區塊鏈上,那玩家就可以根據這個隨機數計算出所有其他玩家的牌面,那這個洗牌也就失去原本的意義,遊戲也就無法進行下去了。這種情況在區塊鏈上如何解決呢?本文我們就一起來探討下智能合約的數據存儲問題。

一、棋牌遊戲的洗牌算法

大家可能都玩過斗地主或者德州撲克一類的棋牌遊戲。在這些遊戲裡,每一局開始時,玩家手裡的牌面都是不一樣的,這個是怎麼實現的呢?這個問題在計算機領域被稱為“洗牌算法”,抽象來講,它描述的問題是如何對一個有限集合生成一個隨機排列的算法(數組隨機排序)。這個算法生成的隨機排列是等概率的,同時這個算法又需要非常高效。我們來看一下比較流行的Fisher–Yates shuffle洗牌算法的解決方案:

1-N張牌存儲在原始列表list1中

隨機洗好的牌存儲在新列表list2中

隨機生成一個數字i(1到剩下的數字(包括這個數字))

從低位開始,得到第i 個數字(這個數字還沒有被取出),取出,並存在list2中

重複第三步,重新生成i,直到所有數字都被取出

取出的這個列表,就是原始列表的隨機排序列表,完成算法

上述算法用偽代碼表示如下:

在這個算法裡,隨機數i是非常重要的一個角色,直接決定了最後各個玩家手裡的牌面。如果這個數字暴露,那就可以很容易的推測出最後的洗牌結果。

二、智能合約的隨機數問題

區塊鏈由於自身的公開透明以及不可篡改特性,沒有給莊家留下作弊的空間。因此基於區塊鏈的智能合約來實現一個棋牌遊戲能夠非常好的保證玩家的利益,也是一個非常有前景的應用。問題是如何通過智能合約生成及保存隨機數,才能保證遊戲的公平性以及玩家的利益?我們首先對目前以太坊上游戲合約的情況進行一個分析,然後提出了我們的思考。

1. 不安全的隨機數生成方式

基於區塊內的某些變量

區塊中記錄了很多關於區塊的元信息,比如block.coinbase, block.difficulty, block.gaslimit, block.number, block.timestamp等。很多人覺得可以基於這些元信息來生成隨機數,但其實這個不安全的。首先如果這個隨機數可以產生足夠的利益,那麼維持區塊鏈運轉的礦工就有修改這些數據的動機。其次如果攻擊者想要進行攻擊,也可以基於這些信息可以同時生成這個隨機數。

基於某些已生成區塊的blockhash

每一個區塊都有自己的blockhash,EVM也通過block.blockhash()提供了獲取blockhash的接口。在目前很多的智能合約裡,上一個區塊的blockhash,也就是block.blockhash(block.number - 1)經常被用來生成隨機數。這種方案的缺點也是非常明顯的:如果攻擊者想要進行攻擊,他完全可以同樣基於上一個區塊的blockhash生成具有同樣隨機數的智能合約。

2. 如何更安全的生成和保存隨機數

我們在之前的文章裡解釋過預言機的問題,預言機是連接區塊鏈世界和真實世界信息的一個橋樑。我們既可以自己實現一個隨機數生成器,然後通過預言機導入智能合約,也快成直接調用類似Random.org之類的網站獲取真正的隨機數。關於這個方面,隨著EKT的不斷完善,我們也會提供一個良好的機制解決這個問題。

回到我們一開始提到的棋牌遊戲的例子,即使隨機數生成的問題解決了,那什麼時間把這個隨機數寫入到區塊鏈上呢?我們可以把每一局遊戲看成一個“會話”。每一輪會話的開始都是基於隨機數的生成,但是這個隨機數生成以後,並不是馬上就寫入到區塊鏈上。這個信息會首先記入自己“私有”的持久化空間。在每一輪遊戲結束之後,這個數據才會從自己的私有空間寫入到區塊鏈上,進而既保證了遊戲的公平,又不會提前洩露牌局的信息。


安全
歡迎加入Odaily官方社群