區塊鏈安全知識普及:用此方法,我們可以更好堵住EOS最大漏洞

區塊鏈安全知識普及:用此方法,我們可以更好堵住EOS最大漏洞


作者 | 複雜美區塊鏈

出品 | 區塊鏈大本營(blockchain_camp)

經過2018一整年的發展,區塊鏈的應用落地普遍增加,在公鏈領域中備受矚目的鏈上應用DAPP開發也隨著EOS主網的開源而白熱化。

根據DappReview平臺統計,EOS 2019年第一季度的DAPP交易額達$1.72B,活躍用戶達274.93K,交易筆數達282.99M。

可伴隨著這漂亮數據而來的卻是EOS Dapp智能合約漏洞問題,其中大部分成功攻擊的原因都和隨機數漏洞有關,那如何優化這個問題呢?



在複雜美開源的Chain33區塊鏈底層架構中,有一個共識模塊叫作SPOS(save pos),它通過Ticket實現POS的挖礦邏輯。

在這篇文章中,我將詳細講解SPOS模塊的實現原理,以及其解決隨機數漏洞的方式。

在Chain33的公鏈案例比特元中,用戶使用錢包賬戶中BTY餘額購票(挖礦權,目前10000個BTY可購買一票),一票對應一個唯一的TicketID,同時擁有一份挖礦權;一個區塊只能由一票挖出,實際的挖礦幾率各票均分(如全網有N張票,則一張票挖到礦的幾率為1/N)。

Ticket挖礦流程如下所示:

  • 錢包:定期檢查賬戶中的BTY餘額來購買票, 當滿足購票條件後構造一條買票交易發往區塊鏈。
  • 共識:它會一直嘗試使用本地持有的票去打包區塊,一旦打包成功,是表示對應的Ticket持有人挖礦成功,並獲得對應的區塊獎勵。
  • 智能合約:智能合約會把地址對應的票信息寫入到區塊鏈數據庫,每一張Ticket都對應有一個唯一的TicketID,也會有一條數據記錄在數據庫。

在區塊鏈上為了體現公平性(針對遊戲等應用場景),就需要一個不能被預測的隨機數。

目前的區塊鏈大體有如下實現方案:

1. 合約中調用外部中心化的隨機數發生器獲取隨機數;

2. 使用區塊hash中的某些值作為隨機數。

但是這兩種方案都有非常明顯的弊端,原因在於:

1. 區塊鏈多節點之間智能合約執行結果是要求強一致的,如果合約從外部讀取數據,是很有可能獲取到不同結果的(比如網絡原因導致有的節點讀取正常,有的返回錯誤)進而導致分叉。

2. 區塊的哈希可以被控制,導致隨機數被控制。比如EOS,沒有提供很好的隨機數算法,所以很多Dapp開發者會自己封裝自認為完美的隨機數算法導致隨機數被預知。

例如以下兩個例子:

  1. Eosbet第一次隨機數攻擊:這個遊戲在開獎時使用了EOS中一個名為ref_block_num的隨機數因子,但是在遊戲開獎時合約中還是讀取了老區塊中的值,導致隨機數被預知,進而被攻擊。
  2. Eosbet第二次隨機數攻擊:在修改了上一次的問題後,開發者再引入了一個新的參數:用戶餘額作為隨機數因子。然而攻擊者利用這一點,模擬完全一樣的DApp代碼,然後不停修改餘額去嘗試開獎邏輯,直到碰撞出開獎結果,進而又遭到攻擊。

還有其它很多EOS上的遊戲遭受了類似手段的攻擊,造成大量的損失。

下面,我們就來著重講講如何實現在隨機數上的優化。

首先,用戶使用錢包賬戶中的BTY購買票(Ticket),10000BTY對應一票。錢包同時生成一個randNum,哈希過後再結合錢包挖礦地址的私鑰,票對應的index(一次可以買多張票)等元素再做兩次哈希,得到一個公開哈希參數(pubHash):

pubHash =

hash(hash(privateKey:index:hash(randNum)))

然後,新購買的票中包含這個pubHash以及randNum並存入區塊鏈,這張票有12小時的成熟期,過了12小時才可以參與挖礦。

接著共識算法從區塊鏈中找到已經成熟的票(Ticket)開始打包,由於共識打包區塊操作只在節點本地執行,所以它可以讀取本地存儲的私鑰,算出一個私密哈希(privHash)並將這個參數放入到挖礦交易中:

privHash =

hash(privateKey:index:hash(randNum))

最後,智能合約收到挖礦交易,對比hash(privHash)pubHash的值,兩者一致挖礦交易成功,對應的節點獲得挖礦獎勵。否則挖礦交易執行失敗。

最後總結一下,SPOS共識的實現結合了隨機數,由於一般情況下是無法預測其它節點的共識信息,所以也無法獲取到它的共識隨機數。

並且系統設定私密哈希(privHash)不能提前洩露,就算有惡意礦工自己提前暴露,它對應的票也會被作廢,同時本金會被凍結較長時間(2天以上)。

再加上系統設定票需要經過12小時的成熟期後才可以參與挖礦。這些條件組合起來,系統的隨機數幾乎是無法被操控的

。這樣當開發者實現的DApp中需要保證公平隨機時,就可以直接使用系統提供的這個安全的隨機數了。

複雜美區塊鏈(www.33.cn)成立於2008年,累計申請200多項區塊鏈發明專利,全球排名前10。擁有自主研發的區塊鏈底層架構Chain33,從2018年11月開源至今,其首創的平行鏈架構被百度、阿里、360等機構認可與研究,並登錄微軟azure市場。

區塊鏈安全知識普及:用此方法,我們可以更好堵住EOS最大漏洞


分享到:


相關文章: