Ultrain首席密碼學家:隨機數的原理與應用

買賣虛擬貨幣
眾所周知,區塊鏈技術的核心特點,就是任何資料儲存到區塊鏈網路後,這些資料,以及對資料的操作過程,都是不可篡改,不可刪除,不可銷燬的,同時對所有人都是透明可查閱的,所以可以信任該資料的真實性,可靠性。透過這個技術特點,區塊鏈技術可以幫助商業社會解決問題之一,就是公平性的問題。公平性,就是指所有人都被公平地對待,即請求都被同等概率地選中、執行;在多人競爭一個利益時,在統一的規則下,人人都有同樣地機會參與競爭,並被同等對待。在現實世界中,存在無數的核心是“公平性”的商業行為,比如車牌的搖號、買房的搖號、彩票的搖獎,卡牌遊戲中的抽牌,德州撲克等牌類遊戲的發牌等等。在傳統的技術手段下,往往由於技術的限制,導致過程的不透明,從而讓參與的各方產生非常大的爭議和詬病。比如針對常見的抽卡類遊戲(Gacha),遊戲的機制之一就是透過花費法幣抽卡牌,卡牌根據珍稀程度不同(也就是抽中的概率不同)從而能力不同,越稀有的卡牌能力越強,而玩家就會經常抱怨某種珍惜卡牌抽到的概率太低。針對這個問題,2016年中國文化部特意釋出了《關於規範網路遊戲運營加強事中事後監管工作的通知》,該通知中首次表示:2017年5月1日起,網路遊戲運營企業應當及時在該遊戲的官方網站或者隨機抽取頁面公示可能抽取或者合成的所有虛擬道具和增值服務的名稱、效能、內容、數量及抽取或者合成概率。但這個規定是否嚴格執行,由於所有的程式都是執行在遊戲廠商的伺服器上,所以只能靠遊戲廠商的自覺來保證執行,玩家只能信任或依賴廠家。我們採用區塊鏈技術透過實現兩點改變,就可以完美的解決這個問題:1.將遊戲的抽卡業務邏輯完整的基於智慧合約實現,落地到公鏈上;2.將抽卡邏輯中的隨機數生成邏輯基於區塊鏈技術實現,落地到公鏈上;
透過這兩點,抽卡的邏輯在編寫完成後,將不可篡改,不可銷燬,可以供網路上所有人進行檢查和校驗,同時所有的執行結果也將被記錄,遊戲廠商完全無法對執行結果進行干預和操縱。為了實現公平性,首先,抽卡業務的智慧合約應該執行在一個完全的去中心化的區塊鏈公鏈之上,避免類似中心化或半中心化技術中存在的人為因素的干擾,其次,該隨機數生成機制也必須是不存在漏洞和公平的。其中保證第一點的實現,就是選擇一條真正去中心化架構的公鏈即可,而第二點是我們今天想重點討論的,如何在區塊鏈上實現一個公平和無漏洞的隨機數生成服務。在區塊鏈上實現隨機數生成服務,我們可能可以有三種技術方案:1.引入外部真隨機數源:CPU裡通常會有真隨機數生成器(Ture Random Number Generator,簡稱TRNG)。真隨機數生成器通常是透過放大電路的熱噪聲來產生隨機數。我們知道溫度高於絕對零度的原子都存在熱運動,在積體電路里這些原子的熱運動會在電路里產生噪聲,噪聲會使得電路中的電壓存在微小的起伏,TRNG就是透過放大這些微小的起伏來產生隨機數。但是,這種隨機數的生成方式是一種中心化的方式,在區塊鏈上並不適用,因為除了隨機數的生產者外,其他人無法證明該隨機數的生成是否是可信的,還是被杜撰的;無法在眾多節點中對該隨機數的真偽達成共識;
2.透過區塊鏈系統中的公開種子生成:區塊鏈輸入有兩個,交易和礦工引入的nonce。對於PoW,nonce是為了幫助PoW能產生符合本輪要求的hash值,礦工本身需要的計算強度很高,假如想對nonce操縱的話,相當於加上額外的約束進行挖礦,挖礦難度會極大的增加。而假如採用塊頭作為隨機源,因為礦工每次生成塊頭的成本很高,所以很難多次嘗試。但是在算力比較少的PoW公鏈上,生成塊頭的成本比較低,隨機數的安全性就會大大下降。而且PoW有分叉的可能,所以最後生成的隨機數需要足夠長的確認時間,導致隨機數的實時性不夠。而在pos的鏈上,用塊頭的安全性,已經不存在了,因為該nonce可以只是簡單的塊高,生成塊頭的成本幾乎為0.因而節點可透過不斷修改交易組合,嘗試生成不同的隨機數。因而類似EOS塊頭為基礎生成的隨機數,都是容易被操縱,非常危險的。

其中最常見的就是EOS在隨機數方面存在的漏洞。如下是常見的鏈上偽隨機數演算法:

以及廣泛被引用的github程式碼:

https://github.com/generEOS/eosio.random/blob/master/random.cpp
以上案例,都有一個共同的特點,就是採用了 tapos_block_prefix, tapos_block_num 做為隨機數種子。

但是這兩個值,其實是依賴於過去的區塊經過確定性邏輯生成隨機數,因而區塊生成者就可以透過不斷嘗試打包的交易內容,甚至偽造虛假的交易,操縱最終生成的隨機數。

比如針對使用了以上這些存在隨機數漏洞的勝率類的遊戲,攻擊者完全可以提前計算好結果,贏的時候投注,輸的時候不投注,從而保證百分百勝率。

總的來說,所有以使用者輸入作為隨機源的隨機數,都是有漏洞的。因為輸入是可以被修改的,輸入的數量和組合是可以被節點控制的,所以節點完全有動機和能力將隨機數改為適合自己的組合。

3.整合多使用者的主觀隨機源生成:

還有一種隨機數的生成方案,就是嘗試整合不同使用者的主觀隨機源作為隨機數種子。典型的就是讓多個使用者各自提交自己的隨機數,然後節點將所有提交的隨機陣列合生成最終的隨機數。考慮到多個隨機源的相互獨立性,理想情況下最終結果依然是隨機的。

這種方案從設計角度來說可靠性很高,但是在實現過程中依然存在如下問題:

- 多個使用者可能相互觀察,判斷是否提交隨機數,導致先提交的人有暴露風險。此問題目前透過懲罰機制解決。
- 節點可能故意打包某些對最終結果有利的隨機數。這涉及到共識的公平性問題,任何基於dpos共識的區塊鏈系統都無法保證,因為參與共識的節點數少,所以節點可能合夥作惡即串謀,而且最壞情況是,所有提交的隨機數生成交易都是由壞的共識節點自身控制的客戶端,導致隨機數結果完全被控制,而且這種作惡情況完全無法被觀察到。Tendermint或者聯盟鏈有同樣的問題。

對此,Ultrain結合自身RPOS共識演算法的特點,設計了自己的隨機數生成演算法,避免了上述問題,下面概述Ultrain隨機數生成的過程:

l建立隨機數生成委員會,該委員會是一個開放的結構,其成員可隨時加入和隨時退出,所有想參與隨機數生成的成員,都透過註冊制註冊為該委員會成員,同時將公鑰註冊到隨機數生成智慧合約裡。

l每輪共識時間內(Ultrain為10秒),委員會成員提交本輪自己生成的隨機數,該隨機數要求必須透過VRF(可驗證隨機函式)結合該成員的私鑰生成,從而避免隨機數被控制。

l智慧合約透過整合各成員提交的隨機數形成一個隨機種子,基於該種子生成隨機數。

l對於註冊參加的節點,不提交將受到懲罰。

該隨機數生成的過程具有如下的優勢:

1.足夠隨機:因為VRF的結果是足夠隨機的,使用者的私鑰是相互保密的,所以最終結果是隨機的。
2.生成速度快:相比較基於塊頭的生成方式,Ultrain每輪隨機數生成時間為10秒,不需要等待確認時間,只有其他公鏈的生成時間的十分之一。 類似Dfinity的方法,則需要組內成員相互通訊和驗證,通訊複雜度、等待時間和防串謀的難度更高。
3.足夠安全:因為委員會成員是開放的,參與人員也是完全不固定的,極大的降低了隨機數結果被串謀的可能性。對於參與人員,VRF限制了可以提交的隨機數的可能,防止被操縱。


作者:Ultrain首席密碼學家 Husen王虎森
更多區塊鏈資訊:www.qukuaiwang.com.cn/news

免責聲明:

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

推荐阅读

;