編者注:本文主要內容來自墨客區塊鏈CEO陳小虎。
在區塊鏈上,由于一切資訊都是透明公開的,提供一個安全實用的亂數是一個非常困難的問題。但是亂數是很多應用的基礎,比如游戲,博彩,流程控制等。因此,提供一個實用可靠的亂數是基于智能合約的應用的迫切需求。
1.傳統的鏈上亂數有幾種辦法
第一種是讓可信第三方為合約提供亂數,這種情況通常是中心化的解決方案,通過一個可信的oracle來提供獨立的亂數源。智能合約發送請求給獨立于區塊鏈系統之外的Oracle,當Oracle監聽到鏈上相關請求后,生成亂數并呼叫回呼函式將結果回傳區塊鏈。

這個方案的主要問題式是中心化的解決方案,與基于區塊鏈的分布式精神相悖,另外還有其他的弱點,比如資訊在p2p網路中傳遞程序中的延時問題,對于不同等級的應用需求沒法提供差異化的服務等。
第二種是互動式的commit 和reveal。參與程序的多方預先commit一個亂數,然后將hash遞交到區塊鏈上。所有參與方都遞交完畢后,各方reveal自己的亂數,通過將各自的亂數合并產生一個最終的亂數。這個程序能夠保證亂數不被預先知道。但是這個程序有幾個問題,第一是需要互動式的多次通訊,自動化實作起來非常困難。第二是如果某方在對自己結果不利的情況下,可以采用不reveal自己亂數來延遲亂數的流程。特別是在參與方比較多的情況下,正確處理好網路的延遲和故意的攻擊比較困難。

第三種是采用鏈上的公開資訊,比如使用區塊的哈希值/時間戳/難度系數等作為亂數源。一般情況下,應用需要使用將來的某個區塊的哈希值以保證在這個區塊出來之前,準備操作已經固定且無法修改。這種方式是在實際中被采用最多的方法,但在實作的程序中有很多陷阱。而且,即使實作的程序完美無瑕,還是有個無法克服的漏洞是,產生區塊的礦工,可以通過允許范圍內的操作,來改變區塊的哈希值,使得產生的亂數偏向礦工的選擇。最簡單的方式,是通過有選擇性地打包交易,使得哈希值對自己有利。
第四種是從共識層,通過閾值簽名的方式,使得每個共識節點遞交各自對某個資訊的簽名片段,在足夠多的簽名片段收集到之后,任何一個共識節點都可以將簽名片段合并成一個合法的可驗證的簽名。這個簽名可以作為亂數源。

這個做法的好處是礦工沒法對最終的簽名進行可操作的修改。對于同一個資訊message,不同的礦工簽名組合出來的結果都是一致的。一旦message確定,簽名也就確定了。Dfinity采用這個方式作為其共識協議的基礎,同時提供可驗證的亂數源。但是這里有個問題是在每一輪區塊產生的程序中,每個節點需要廣播自己的簽名片段,這樣使得每輪訊息的傳遞是O(n2),類似于PBFT。這個問題會導致共識的節點數量的限制,以及可支撐的應用效率等。
2.解決方案
墨客子鏈采用閾值簽名,提出一個O(n)資訊復雜度的亂數實作方法。
首先,墨客子鏈是基于墨客多層結構的layer2區塊鏈實作。子鏈的礦工是從海量的節點pool中隨機選擇的一部分來作為某個子鏈的共識節點。子鏈的出塊順序由子鏈的礦工通過Round Robin的方式依次出塊。同時,子鏈會周期性地將子鏈狀態的hash flush到主鏈上面,實作:1. 狀態的finality。2. 剔除已證明的惡意節點。3. 隨機retire一小部分節點,隨機增加一些新節點。4. 實作子鏈與母鏈的跨鏈操作。
在提供亂數的子鏈實作中,每個子鏈的礦工通過VSS初始化操作實作私鑰的可驗證分發。然后,每個礦工遞交一組閾值簽名的簽名片段,當足夠多的簽名收集到之后,即可完成閾值簽名的合并,礦工可以產生區塊,并以此簽名作為智能合約的亂數源,處理智能合約中的相關交易。
流程如下:

1. 初始化階段,前每個節點依次產生區塊,不需要包括合法的閾值簽名。但是每個節點需要在合法的區塊中包含當前節點對[ H(b), H(b+1), …, H(b+m-1)]的簽名片段,b是當前的區塊號。
2. 過了m個區塊后,正常出塊開始,當前節點應該能夠收到足夠的簽名片段(m個),并合成有效的閾值簽名,由此,該節點可以產生一個合法的區塊。這個區塊中包括收集到的m個簽名片段[H1(b), H2(b), …, Hj(b)],以及合成的閾值簽名Sig_thres,交易集{TX},區塊Sig_block,并公布自己的[ H(bi), H(bi+1), …, H(bi+m-1)]的簽名片段
3. 如果有Byzantine failure,當前節點沒有收到足夠的簽名片段,該節點不產生區塊,只廣播自己當前的簽名片段。
4. 第三步可以持續多次up to m次
5. 下一個節點如果收到足夠多的簽名片段,則可以產生區塊,回到步驟

這樣,能夠保證某個區塊的閾值簽名是對當前區塊號的集合簽名。這個簽名是可以驗證的,但是不能被預先知道,也不可以被礦工的操作修改。而且,這個出塊程序中的資訊量是O(n)。
另外,當子鏈的重繪周期到時,子鏈的節點數量將變化,惡意的節點被剔除,同時有一定幾率的新舊節點變化。新節點的VSS程序可以在重繪周期前完成。這樣可以保證重繪周期之后,新的一批節點可以馬上進入持續的出塊程序,使得整個流程不受中斷。
此外,墨客子鏈的實作使得在智能合約中可以直接呼叫這個閾值簽名作為亂數源,來處理應用的邏輯。而且,這個閾值簽名是和區塊號系結的,可以大大簡化智能合約對相應邏輯的處理。
墨客科技(MOAC BlockChain Tech)已經實作了這個亂數子鏈,命名為RandDrop (這個是暨ProcWind,FileStorm之后墨客的第三個子鏈實作)。目前在測驗網進行測驗。很快可以提供給各游戲和應用廠商進行測驗。
總結一下,墨客亂數子鏈RandDrop的優點:
1、解決了現有智能合約獲得可靠的亂數的困境,亂數由子鏈的共識節點通過閾值簽名的方式獲得,安全性高。亂數完全不受單個礦工的影響;
2、拜占庭節點的存在可以延遲某個區塊的產生,但是不會影響亂數的結果;
3、第一個線性訊息復雜度的亂數方案,能夠支持更多的共識節點,適用性更強;
4、簡化的流程設計,使得智能合約中能夠直接呼叫獲得當前區塊的亂數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/31834.html
標籤:區塊鏈技術
