Neo智慧合約如何保證隨機數安全性?

買賣虛擬貨幣
在⼀個去中⼼化的分散式系統中,隨機數是⼀個⾮常重要的問題。除了金鑰生成等傳統安全場景,在共識機制、零知識證明等熱門場景中也發揮著重要的作用,保護著區塊鏈的安全。隨機數的不可預測,對於安全系統至關重要。安全隨機數在⼀箇中⼼化的系統中,⽐如我們的⼿機、電腦、平板、安全隨機數可以透過獲取系統內部的隨機引數或者讀取螢幕畫素來作為種⼦⽣成。但是在區塊鏈這樣⼀個公開公正公平的系統中,在⼀個相信系統安全但是不信任任何⼀個單獨節點的環境⾥,想要獲取⼀個安全的隨機數並不簡單。玩過智慧合約的⼈應該對競猜類的 dApp 不陌⽣,偶爾也會⻅到某某 dApp 被⿊客攻擊被盜XX幣的報道,比如 EOSDice。⽽這些報道⾥的⿊客攻擊,很⼤⼀部分都是因為競猜類 dApp ⾥的隨機數⽣成函式被⿊客破解並加以利⽤。⾸先區塊鏈是個極度開放(資料公開,任何⼈可參與),⼜極度封閉(鏈上智慧合約虛擬機器執⾏)的系統。你的智慧合約必須部署在區塊鏈上,指令碼肯定是要公開的,你的合約⼜必須在合約⾥執⾏,可調⽤接⼝能獲取到的資料是很有限的。你想⽤能獲取到的資料作為隨機數種⼦,選擇就那麼多(nonce,區塊⾼度,區塊雜湊,交易雜湊等等),那⿊客會在清楚你的選擇範圍後迅速在交易提交之前就計算出可能的結果。
為了解決這個問題,有些區塊鏈系統就直接給每個區塊直接⽣成隨機數種⼦,然後提供接⼝,這樣在新的區塊⽣成之前,⿊客就⽆法推斷隨機數,進⽽⽆法在 dApp 遊戲⾥獲取到⾮正常的優勢。不過這個隨機數的⽣成演算法本⾝也有安全隱患。問題就是,誰去⽣成這個隨機數?⽐特幣和以太坊⽤的是算⼒證明,⽣成區塊的節點雖然跟算⼒相關,但也具有⼀定的隨機性。但是我們能信任那個在算⼒證明中獲勝節點⽣成的隨機數嗎?萬⼀剛好那個節點就是⿊客呢?他豈不是剛好就可以⽣成⼀個最有利於⾃⼰的隨機數然後贏取 dApp 中的獎勵?Neo 智慧合約中的安全隨機數關於這個問題,針對不同的區塊鏈系統有許多的解決⽅案,感興趣的朋友可以去搜尋⼀下,關鍵字【區塊鏈中的隨機數演算法】。本⽂主要討論 Neo 智慧合約中的安全隨機數問題。Neo 現在使⽤的是 dBFT 共識演算法,每輪共識會有⼀個議⻓來⽣成新的區塊議案,⼀堆議員舉⼿表決,當有超過 2/3 的議員同意新區塊議案時,新區塊議案將被打包成區塊並⼴播分發給 Neo ⽹絡。我們依據這個共識演算法來思考可能的隨機數⽣成⽅案以及可能的結果。最簡單的隨機數⽣成當然是讓議⻓直接⽣成隨機數,在他⽣成新區塊議案的時候直接調⽤這個隨機數,然後在共識過程中把隨機數⼀並⼴播給議員以作驗證。這是最簡單⾼效的⽅案,對現有的共識協議⼏乎不會做什麼更改。但問題是,我們為什麼要信任議⻓?
必須要明確的是,在 Neo ⽹絡中,議⻓擁有的許可權已經很⼤了,⼤到我感覺需要新的⼿段來進⾏制約,⽐如議⻓可以選擇性打包交易;可以調整交易順序;可以在所有節點知道交易執⾏結果之前知道結果。如果我們再給議⻓⽣成隨機數的權⼒,那麼如果議⻓在⽣成議案的時候發現某個合約執⾏到最後⼀步並且可以獲取⾮常客觀的收益,那是不是議⻓就可以臨時⽣成⼀個最有利的交易來打包?這完全不違背 dBFT 共識演算法,但是卻有違公平。所以我們絕對不能讓議⻓單獨來⽣成隨機數。那是不是可以讓所有的議員都⽣成⼀個隨機數,然後同步給議⻓,讓議⻓也依據 2/3 多數原則來⽤議員的隨機數⽣成最終的隨機數呢?這個⽅式⽐直接讓議⻓⽣成隨機數要安全的多,但還是有那個問題,最終的隨機數還由議⻓來⽣成,他依然有最終決策權,⽐如他可以在已經計算了別的節點的隨機數之後再⽣成⾃⼰的隨機數,然後獲取最有利於⾃⼰的結果,或者在總多收到的隨機數的計算組合⾥選擇最有利於⾃⼰的結果。這樣議⻓依然可以在打包交易的時候獲得優勢,⽆⾮是多了些計算過程。 兩權分立機制 接下來就到了呼應題⽬的時候。不過我們⾸先來考慮兩權分⽴,就是把打包過程和⽣成隨機數過程分開,讓議⻓負責打包,讓另⼀個議員負責⽣成隨機數。這樣議⻓就沒辦法在打包交易的時候獲得優勢(不考慮議⻓可以選擇不打包某些交易)。但是問題⼜出現了,議員可以獲得不公平的優勢,雖然他不能確定最終哪些交易會被打包進新的區塊議案,但是他依然可以利⽤⾃⼰⼿上的資訊來⼴播對⾃⼰有利的交易,並利⽤已有的規則給⾃⼰創造最⼤的機會,⽐如⼿續費。 三權分立機制 於是現在就到了討論三權分⽴的時候。打包還是由議⻓負責,但是隨機數則由兩位議員分別負責。過程描述是這樣的:
● 在新⼀輪的共識週期⾥,所有的議員+議⻓⼴播⾃⼰⽣成的隨機數。● 兩位隨機數⽣成議員分別接收到超過 2/3 的隨機數後計算出⼀個雜湊結果,並把這個結果連同隨機數都⼴播給議⻓。● 議⻓在收到並驗證透過兩位議員的隨機數資料包之後,依據兩個資料包的雜湊結果來最終計算出隨機數種⼦。在這個過程中,⽆論是議員還是議⻓,都⽆法在最終隨機數種⼦⽣成之前知道隨機數種⼦的結果。即便議⻓知道了安全隨機數種⼦,也⽆法更改這個結果。當然,這個⽅案只是保證了這個隨機數的安全性,但還是沒有辦法避免議⻓在知道安全隨機數種⼦後去臨時⽣成新的交易。對於這個問題,我會在下一篇⽂章中進⾏分析。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;