一文拆解隨機數生成的演算法模型|Neo專欄

買賣虛擬貨幣

上⼀篇文章《Neo 智慧合約如何保證隨機數安全性?》,我們討論了隨機數生成的執行過程。簡單來說就是把打包交易的權利交給議⻓,把⽣成隨機數的權利分別賦予給兩位議員。

- 後⽂⽤ N1 和 N2 指⽣成隨機數的兩位議員;

- R1 和 R2 指兩位議員最終發給議⻓的包含隨機數的交易

負責⽣成隨機數的議員 N1 和 N2 ⽆法提前知道最終的隨機數,負責打包的議⻓⽆法更改隨機數的值,如此三⽅共同協作是為了在每⼀個區塊裡⽣成安全可信的隨機數。

隨機數⽣成的演算法模型

接下來我們對這個隨機數⽣成的演算法模型進⾏分析完善。

⾸先考慮到 N1 和 N2 發出的交易都是公開的,因此 如果 N1 是惡意的,那麼它可以故意等到接收到 N2 的隨機數 R1 之後再依據 R1 的值來推斷並⽣成對⾃⼰最有利的那個隨機數 R2。

這⾥稍微提⼀下為什麼 N2 依然可以對⽣成的隨機數進⾏選擇,因為我們考慮 2/3 多數的共識原則,因此 N2 是可能收到超過 2/3 來⾃別的議員的隨機數的,因此 N2 就可以在這些收到的隨機數⾥⾃由選擇。⽐如我們有 7 個議員,那 N2 如果只收到5個議員的隨機數,那當然就只有⼀種組合⽅案,但是如果 N2 收到了 6 個議員的隨機數,那麼它就可以在 6 個⾥⾯選出 5 個,於是就有了總共 6 種可能供 N2 選擇;同理,如果 N2 收到了所有 7 個議員的隨機數,那 N2 就有了 50 種選擇,在這麼多的選擇⾥,N2 完全可以選出⼀個對⾃⼰有利的最終⽅案。

要避免這種問題,我們需要保證在議⻓⽣成最終隨機數之前,兩位議員⽆法提前知道隨機數。這似乎是在繞圈⼦,但解決這個問題其實相對簡單,我們可以讓 N1 和 N2 ⽤議⻓的公鑰對 R1 和 R2 進⾏加密,如此就可以在議⻓⼴播新區快議案之前,只有議⻓可以同時知道 R1 和 R2 。

與此同時,為了讓議⻓⽣成的最終隨機數可驗證並且簡化流程,N1 和 N2 在加密 R1 和 R2 的時候還應該加上對 R1 和 R2 的簽名。如此,在議⻓公開解密後的 R1 和 R2 時,別的議員就可以在不與 N1 和 N2 做額外通訊的情況下來驗證 R1 和 R2 以及最終隨機數的真實性。

現在我們再討論假如 N1 是個傻⼦,它就想把 R1 的明⽂公佈出來,因此 N2 就可以提前獲取 R1 的值並加以利⽤以實現⾃⼰利益的最⼤化,這⾥我們分為兩種情況來討論:

 N2 是誠實節點 

它哪怕收到了 R1 也不會做任何的事情,所以即使 N1 是個傻⼦,對系統也不會造成任何影響,畢竟僅僅知道 R1 是無法推斷出最終隨機數的。此外我們還可以設定⿊名單,對故意提前洩漏隨機數的議員 N1 進⾏懲罰進⽽提⾼系統的魯棒性。

 N2 是惡意節點 

這個就⽐較⿇煩了,畢竟 Neo 的共識演算法是隻需要超過 2/3 的節點是正常的即可,所以議員⾥出現兩個反動派是正常的,但是對於隨機數⽣成來說就有點要命。索性我們假設選擇 N1 和 N2 的過程也是隨機的,那麼在⼀個不超過 1/3 的議員是惡意的情況下,對⼀個區塊來說,N1 和 N2 都是惡意的概率在 5% 左右,不過隨著議員數量的提升,這個概率會隨之增⼤,但是最⾼不超過 11%。

以上,雖然⽅案依然存在一定被攻擊的可能,但是相對於單純的讓單獨節點來⽣成隨機數還是更安全的⼀種解決⽅案。

透過兩篇關於安全隨機數的文章,希望大家可以更深入地瞭解為了保證系統環境的安全執行,研究員們對於整個執行機制、演算法模型所做的嘗試與驗證。

區塊鏈要走的路還很長,咱們一道見證。

作者:廖京輝,來源:Neo智慧經濟

免責聲明:

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

推荐阅读

;