天天看點

Chainlink VRF 可驗證随機函數詳解

Chainlink VRF 可驗證随機函數詳解

Chainlink可驗證随機函數(下文稱Chainlink VRF)的測試版本在不久前釋出,開發者可以用這個工具生成随機數,并在鍊上進行驗證。Chainlink VRF将為衆多優秀的智能合約項目帶來巨大價值,尤其能證明智能合約使用的随機數不可被篡改和操控。

我們想要感謝與我們緊密合作的學術界專家和開發者社群,不斷向我們回報他們對Chainlink VRF的想法和建議。與此同時,我們還要感謝為初步實作VRF功能付出了精力和汗水的團隊成員!

Chainlink VRF有助于加速區塊鍊遊戲、安全和layer2協定等衆多領域的智能合約開發程序。開發者可以輕松內建Chainlink VRF,參考我們近期釋出的開發者文檔,在智能合約中使用可驗證的随機數。

可驗證随機數具有哪些價值

要開發安全的智能合約,并規避合約資金被盜風險,開發者必須在安全方面下大功夫。如果随機數是智能合約依賴的關鍵資料,那麼開發者就自然會期望合約所有相關方都擁有同等的不确定性,并降低因某一方成功預測結果而鑽空子的風險。

Chainlink VRF可以為智能合約提供随機數以及加密證明,在鍊上驗證随機數具有不可預測性,因而可以滿足上述兩個要求。由于Chainlink VRF的随機數可以在鍊上進行驗證,是以問題節點隻能選擇不對請求做響應,在Chainlink即将上線的staking機制下,這樣的行為會遭到罰款,之後還可能會被移除出随機數生成者名單,是以會遭受經濟損失。

開發者可以使用Chainlink VRF開發出基于随機數的可靠智能合約應用:

● 為遊戲提供随機數,資料可在鍊上驗證,提升遊戲的可信度,并向對安全比較敏感的使用者提供額外的保障。

● 為遊戲帶來更多挑戰性和不确定性,比如随機向玩家提供獎勵(如:loot drops)。

● 随機配置設定任務和資源,并保障可驗證性,如:向案子随機配置設定法官,或向公司随機配置設定審計人員。

● 選擇觀察員代表投票決議智能合約提案,并達成共識(調查是實作額外抗女巫攻擊能力的有效方法)

現有方法存在的安全隐患

Chainlink VRF的可驗證随機數可以将現有随機數生成法存在的諸多限制一一攻克。使用區塊哈希值等鍊上資料或将鍊下生成的随機數傳輸至鍊上,這兩種方法都存在一定自身缺陷。

開發者應該盡量避免過度依賴基于區塊哈希值産生随機數。假設一個智能合約基于某一高度的區塊哈希值最後一位數的奇偶性判定結果。這樣看似好像機率是50/50,但假設有一名礦工(或礦工聯盟)産量占區塊總量的三分之一,現在這名礦工決定把區塊哈希值最後一位數是1的優勝區塊全部扔掉,并放棄大約2-3個以太币的區塊獎勵。這樣一來,這名礦工就能夠将結果是0的機率從50%提升至2/3,導緻所有依賴這個方法生成随機數的智能合約使用者都會遭受損失。如果這樣做可以為這名礦工帶來12-18個以太币的額外收益,那麼他的選擇在經濟上是合理的。是以,這個機制下的合約價值會有一定上限。

為了避免這樣的問題,開發者已經轉向鍊下解決方案,在鍊下生成随機數并傳回至鍊上。然而,如果無法通過加密手段驗證鍊下随機數,資料将有可能在鍊下生成和傳輸過程中被篡改。同樣地,使用者隻能閉着眼睛相信鍊下生成的随機數是公正可靠的,并相信這些資料在傳輸的過程中沒有被篡改過。

區塊鍊開發者在為智能合約提供随機數的過程中還需規避以下關鍵痛點和安全風險:

● 智能合約無法通路或無法相容

● 中心化的随機數生成者操縱資料

● 區塊鍊上的礦工作為使用者進行操縱以謀取私利

● 終端使用者需要盲目相信應用的安全可靠性

為了解決上述問題以及其他安全風險,Chainlink VRF使随機數生成過程變得安全透明,并通過加密技術證明了每個結果的公正和公平性。

Chainlink VRF的工作原理

Chainlink VRF 可驗證随機函數詳解

簡而言之,智能合約會向Chainlink或Chainlink預言機網絡提供一個seed來請求随機數。這個seed是預言機無法預測的,會被用來生成一個随機數。每個預言機都會使用自己專屬的密鑰生成随機數。當結果和證明在鍊上釋出後,可以使用預言機的公鑰和智能合約的seed進行驗證。這個方法利用了區塊鍊著名的簽名驗證功能,合約隻能使用在同一區塊鍊環境中被驗證通過的随機數。

使用Chainlink VRF工具最大的好處就是随機數是可以驗證的。即使某一節點被攻陷,該節點也無法操控或影響最終結果,因為它無法通過鍊上的加密驗證。最糟糕的情況無非是淪陷的節點不對請求做出任何響應,而這将立刻被區塊鍊記錄下來,并且會被永遠儲存在鍊上。使用者可以參考有效的證明,不再使用有過無法響應或無法提供有效簽名記錄的節點。即使節點被操控,最終生成的随機數也不會受影響。淪陷的節點隻能選擇不響應請求,而在Chainlink即将上線的staking機制下,這種行為将被罰款,而且問題節點之後會從随機數生成者名單中被移除。是以,低品質或違規的節點将遭受巨大的短期和長期經濟損失。簡而言之,Chainlink VRF隻要正确接入,就絕對無法被操控,唯一可能發生的就是問題節點下線或不響應,之後被徹底移除出去。這個機制為智能合約開發者和使用者提供了極大的安全保障。

Chainlink VRF還有一個優勢,那就是随着使用人數不斷增加,使用者支付給節點操作者的費用也會相應上漲,是以節點會更有動力提供盡可能多的安全保障。之後,使用者可能會要求通過staking的方式進行加密安全保障,付更多費用獲得額外的安全性。這樣一來,使用者付費就會形成一個全球共享資源池,本來需要花錢自主開發RNG(注:随機數生成器)解決方案的使用者會将這筆錢用于提升整個區塊鍊生态圈共享資源的安全水準。Chainlink現已接入Polkadot、Tezos等多條區塊鍊,這意味着Chainlink生态圈使用者将形成網絡效應,持續擴大,使用者數量和加密安全水準也将形成一個相輔相成的良性循環。

內建案例詳解:PoolTogether

PoolTogether

是以太坊上的一個保本型儲蓄彩票遊戲,我們認為這是一個非常新穎有趣的概念。PoolTogether團隊在開展了廣泛技術調研後,決定

使用Chainlink VRF為其應用提供可驗證的随機數

Chainlink VRF 可驗證随機函數詳解

PoolTogether是一個保本型儲蓄遊戲,将使用者存款集中在一起,每天或每周進行一次抽獎,将存款利息當作獎金發放給中獎者。這個遊戲通過彩票機制激勵使用者的儲蓄行為。

PoolTogether使用Chainlink VRF生成可驗證的随機數,可向其使用者證明每期中獎者是由完全随機的數字選出來的。這樣做除了為了保障自身安全以外,還可以向使用者證明其關鍵環節的安全性是有迹可循的,且随機數生成過程是可以驗證的。這樣一來,使用者就更有信心參與到智能合約中,相信他們享受着同樣的中獎機率。

技術詳解

Chainlink VRF是Goldberg可驗證随機函數(VRF)的實作,具體細節請參考

這篇論文

。“可驗證随機函數”中的“随機”指“任何沒有seed或密鑰的人都完全無法預測(即機率均勻分布)”。

VRF密鑰是預言機以加密的方式在均勻分布的{0, …, #secp256k1-1} 中挑選出的一個數字(注:secp256k1是以太坊加密算法中的橢圓曲線)。與該密鑰相對的有一個公鑰,這個公鑰對應着一個預言機。預言機将公鑰與鍊上VRF和Chainlink任務ID綁定。

當智能合約請求随機數時,它會提供一個seed。為了確定VRF結果無法被預測,需要在seed中植入無法被預測且難以被篡改的值,比如最近一次的區塊哈希值,或者是經過加密驗證的鍊下資料,比如某項資産最近更新的價格。你可以将這些資料轉換成bytes32,使用keccak256算法生成seed。鍊上VRF将智能合約seed與其他資料混合在一起,以避免重播攻擊,為合約提供一些基本的保護,但除此之外,提供一些專門的保護也是至關重要的。

一旦鍊上VRF确定了seed,就會在以太坊log中進行廣播,向智能合約要求的預言機請求相應VRF結果。預言機看到這條log後會做出如下操作:

首先,它将seed和預言機公鑰作為資料輸入, “對輸入取哈希值作為曲線方程輸入”,從secp256k1獲得安全加密的随機樣本。方法是使用keccak256算法,用遞歸法對資料取哈希值,直到輸出小于secp256k1算法的basefield(即secp2561算法中描述的p值),并且是secp256k1曲線上某一點(x,y)的x坐标(basefield中 y2=x3+7 )。是以(x,y)是對輸入取哈希得出的結果。

接着,将

secp256k1曲線 的(x,y)坐标乘以

密鑰,得出Ɣ點。用keccak256算法取Ɣ哈希值,以uint256格式作為VRF的輸出結果。它會生成一個證明,證明Ɣ除以(x,y)的倍數等于預言機公鑰除以secp256k1生成器的倍數。這個證明方式與

Schnorr簽名

很接近:首先,他從{0, …, #secp256k1-1}中随機安全地取出一個nonce,這與私鑰生成的方式很像。然後,計算公式u=n×g,其中g為secp256k1生成器,u為以太坊位址。然後計算公式v=n×(x,y)。接着,

将(x,y)、VRF公鑰、Ɣ、u的位址以及v合并取哈希

, 并将哈希取模運算#secp256k1的餘數稱為c。最後,計算

s = n-c × k 取模運算 #secp256k1

,k為VRF密鑰。是以證明包含公鑰、Ɣ、c、s以及seed。然後将結果發回至鍊上VRF,驗證證明,如果驗證通過,則将資料傳回至智能合約。

為了驗證證明,合約應做到以下幾點:

  • 檢查公鑰和Ɣ是否是secp256k1曲線上有效的點
  • 驗證 c×pk + s×g 點的位址是否與u的位址一緻(注:其中pk指代預言機公鑰)
  • 用公鑰和seed取哈希作為曲線方程的輸入,檢查 c×Ɣ+s×(x,y)的keccak256哈希值是否等于c。

若有興趣直覺了解此方案的加密安全邏輯,請參考Jimmy Song的《

Programming Bitcoin

》一書中第三章“簽名和驗證”中關于“箭頭”的類比。我們在此希望實作的特殊“目标”是c。若想完整了解此方案的安全證明機制,請參考Making NSEC5 Practical for DNSSEC的附件B。

然而,用secp256k1做純量乘法(比如c×Ɣ),在以太坊虛拟機上直接運算的成本極其高昂。是以為了提高效率,我們借鑒了

Vitalik的方法

将一個證人傳入證明,驗證證人的c×Ɣ運算結果是否與實際相等

。這樣一來,我們就能把c×Ɣ的運算工作轉移到鍊下,隻需驗證鍊下運算結果是否與實際相等即可,這樣就可以大幅降低運算成本。

是以,除了上述資料輸入和步驟之外,鍊上驗證還包括c×Ɣ以及s×(x,y)的證人。需要檢查這些證人是否是secp256k1曲線上有效的點,并且用Vitalik的方法驗證這些證人的運算結果是否與實際比對。另外,以太坊上的位址用u表示,同樣也用Vitalik的方法驗證u是否與c×pk+s×g點比對。

Chainlink VRF發展計劃

Chainlink預言機網絡中包含一千多個優質節點,使用門限簽名技術,網絡具有高度擴充性,并以高成本效益的方式實作去中心化。這将為Chainlink VRF帶來極高的去中心化水準和可用性。我們将兩者合二為一,既利用Chainlink VRF的獨特優勢為鍊上提供可驗證随機數,又利用Chainlink網絡中幾千個節點實作高成本效益和高可用性。

Chainlink VRF 可驗證随機函數詳解

Chainlink豐富的生态系統一旦加入Chainlink VRF,我們就能建立遍布全球的分布式節點網絡,在經濟激勵的驅動下在鍊上生成并廣播可驗證的随機數。Chainlink門限簽名技術與高度去中心化的節點網絡相結合,将有效規避使用者資金被盜風險。不僅Chainlink VRF端回報的資料能在鍊上得到驗證,還能保證極高的可用性。目前Chainlink已接入多條可能需要可驗證随機數的區塊鍊,再加上虛拟貨币經濟的激勵機制,Chainlink VRF很有可能成為智能合約使用随機數的新标準。

除了上述優勢之外,我們目前正在完善Chainlink VRF的功能,研發去中心化的随機數生成技術,并積極與其他RNG(注:随機數生成器)系統開展合作。根據我們的初步研究,我們相信Chainlink VRF能與VDF以及其他随機數生成法在鍊上和鍊下結合使用。我們很高興能夠跟區塊鍊圈和學術圈通力合作,共同推動智能合約可驗證随機數生成技術向前發展。

歡迎試用Chainlink VRF并給出你的寶貴意見

如果你是一名智能合約開發者,并希望了解如何使用Chainlink VRF的初始版本,請通路開發者文檔,在測試網上開始使用,并加入我們的技術社群讨論。

我們目前處于Chainlink VRF安全評估的最後階段,并希望與開發者社群和學術界的使用者交流回報。如果你對VRF及其完善方案有任何意見或建議,歡迎發郵件至

[email protected]

告訴我們。

如果你熱衷于開發安全可靠的智能合約并解決現實世界的問題,歡迎現在就加入我們的核心團隊!詳情請關注我們官網的招聘頁面。

如果想要了解更多關于Chainlink的資訊,請通路Chainlink官網,或在微網誌或微信上關注我們。

歡迎加入Chainlink開發者社群

Chainlink VRF 可驗證随機函數詳解

(添加時請備注開發者或其他資訊哦)

繼續閱讀