Chainlink 可驗證隨機函數詳解

2021-01-20 金色財經區塊鏈

我們正式宣布上線Chainlink可驗證隨機函數(下文稱Chainlink VRF),開發者可以用這個工具生成隨機數,並在鏈上進行驗證。Chainlink 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為其應用提供可驗證的隨機數。

PoolTogether是如何使用Chainlink可驗證隨機數的

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

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

技術詳解

Chainlink VRF是Goldberg可驗證隨機函數(VRF)的實現,具體細節請參考這篇論文(https://eprint.iacr.org/2017/099.pdf)。「可驗證隨機函數」中的「隨機」指「任何沒有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中y=x+7)。因此(x,y)是對輸入取哈希得出的結果。

接著,將secp256k1曲線的(x,y)坐標乘以(https://github.com/smartcontractkit/chainlink/blob/vrf-docs-branch/core/services/vrf/vrf.go#L292)密鑰,得出點。用keccak256算法取哈希值,以uint256格式作為VRF的輸出結果。它會生成一個證明,證明除以(x,y)的倍數等於預言機公鑰除以secp256k1生成器的倍數。這個證明方式與Schnorr籤名(https://en.wikipedia.org/wiki/Schnorr_signature)很接近:首先,他從{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(https://github.com/smartcontractkit/chainlink/blob/vrf-docs-branch/core/services/vrf/vrf.go#L292),k為VRF密鑰。因此證明包含公鑰、、c、s以及seed。然後將結果發回至鏈上VRF,驗證證明,如果驗證通過,則將數據返回至智能合約。

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

檢查公鑰和是否是secp256k1曲線上有效的點驗證c×pk+s×g點的地址是否與u的地址一致(https://github.com/smartcontractkit/chainlink/blob/vrf-docs-branch/evm-contracts/src/v0.6/VRF.sol#L464)(註:其中pk指代預言機公鑰)用公鑰和seed取哈希作為曲線方程的輸入,檢查 c×+s×(x,y)的keccak256哈希值是否等於c。若有興趣直觀了解此方案的加密安全邏輯,請參考Jimmy Song的《Programming Bitcoin》(https://programmingbitcoin.com)一書中第三章「籤名和驗證」中關於「箭頭」的類比。我們在此希望實現的特殊「目標」是c。若想完整了解此方案的安全證明機制,請參考Making NSEC5 Practical for DNSSEC(https://eprint.iacr.org/2017/099.pdf)的附件B。

然而,用secp256k1做純量乘法(比如c×),在以太坊虛擬機上直接運算的成本極其高昂。因此為了提高效率,我們借鑑了Vitalik的方法(https://ethresear.ch/t/you-can-kinda-abuse-ecrecover-to-do-ecmul-in-secp256k1-today/2384),將一個證人傳入證明,驗證證人的c×運算結果是否與實際相等(https://github.com/smartcontractkit/chainlink/blob/vrf-docs-branch/evm-contracts/src/v0.6/VRF.sol#L245)。這樣一來,我們就能把c×的運算工作轉移到鏈下,只需驗證鏈下運算結果是否與實際相等即可,這樣就可以大幅降低運算成本。

因此,除了上述數據輸入和步驟之外,鏈上驗證還包括c×以及s×(x,y)的證人(https://github.com/smartcontractkit/chainlink/blob/vrf-docs-branch/core/services/vrf/solidity_proof.go#L22)。需要檢查這些證人是否是secp256k1曲線上有效的點,並且用Vitalik的方法驗證這些證人的運算結果是否與實際匹配。另外,以太坊上的地址用u表示,同樣也用Vitalik的方法驗證u是否與c×pk+s×g點匹配。

Chainlink VRF發展計劃

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

Chainlink以去中心化的方式實現可驗證隨機函數

Chainlink豐富的生態系統一旦加入Chainlink VRF,我們就能建立遍布全球的分布式節點網絡,在經濟激勵的驅動下在鏈上生成並廣播可驗證的隨機數。Chainlink門限籤名技術與高度去中心化的節點網絡相結合,將有效規避用戶資金被盜風險。不僅Chainlink VRF端反饋的數據能在鏈上得到驗證,還能保證極高的可用性。目前Chainlink已接入多條可能需要可驗證隨機數的區塊鏈,再加上虛擬貨幣經濟的激勵機制,ChainlinkChainlink VRF很有可能成為智能合約使用隨機數的新標準。

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

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

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

我們目前處於Chainlink VRF安全評估的最後階段,並希望與開發者社區和學術界的用戶交流反饋。如果你對VRF及其完善方案有任何意見或建議,歡迎發郵件至vrf@chain.link告訴我們。

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

如果想要了解更多關於Chainlink的資訊,請訪問Chainlink官網,或在Twitter或Reddit上關注我們。

本文來源: 金色財經 / 作者:Chainlink

相關焦點

  • 「Excel技巧」有了隨機函數rand和randbetween函數,想隨機就隨機
    今天要說的是Excel的兩個隨機函數RAND函數和RANDBETWEEN函數。別小看這兩個函數,它們雖是小函數,但有大能量。因為它們為我們隨機錄入批量數據提供了很大方便。一、Rand函數用途:用於生成0~1之間的隨機數。
  • python:pop函數詳解 - 二進位01
    pop函數詳解今天我為大家講解python中pop函數的使用。#python#簡介——pop()函數是python解釋器的內置方法,可作用於列表,字典。用法說明——在builtins.py中找到pop函數。列表:L.pop([index]) -> item -- remove and return item at index (default last).
  • 通過Chainlink預言機構建參數化保險智能合約
    pragma solidity 0.4.24;pragma experimental ABIEncoderV2;import "chainlink/contracts/ChainlinkClient.sol";import "chainlink/contracts/vendor/Ownable.sol";import
  • 隨機函數:RAND&RANDBETWEEN
    在EXCEL應用中,經常需要用到隨機生成的數值,使用Rand函數或Randbetween函數幫忙實現,舉兩個慄子:
  • excel隨機數函數是什麼?excel怎樣生成隨機數?
    本篇將介紹excel隨機數函數是什麼?excel怎樣生成隨機數?有興趣的朋友可以了解一下!一、前言excel是我們工作中很常用的一款表格製作工具,它不僅僅只是用來製作表格,它還能對表格中的數據進行處理(比如:運算、排序、篩選等)。excel為數據的處理提供了很多函數,今天小編要介紹的是excel隨機數函數,以及隨機數函數的用法,希望對大家有所幫助!
  • 「RAND」函數(隨機生成數值)和「求和」選項
    背景:在案例教學中經常會用到「RAND」函數,這個函數是指生成大於等於0小於1的均勻分布平均數。延伸的函數有「ROUND」函數、「INT」函數和「RANDBETWEEN」函數。「開始」菜單下的「求和」選項包含「求和、平均值、計數、最大值、最小值」等內容,我們在講解完隨機生成函數後,為大家簡單描述這幾項的使用方法。
  • python隨機模塊22個函數詳解(上)
    作者:小伍哥來源: AI入門學習今天給大家介紹下python中的隨機模塊,隨機數可以用於數學,遊戲,安全等領域中,還經常被嵌入到算法中,用以提高算法效率,並提高程序的安全性。平時數據分析各種分布的數據構造也會用到。
  • 函數的三要素之定義域詳解
    一般函數的定義域和抽象函數的定義域詳解函數的三要素:定義域,值域和表達式,都是非常重要的內容,出題人會經常在此處做文章,大家一定要將這三塊內容學紮實了哦。本次課程我們結合出題人的意圖和相關的高考考點為大家講解函數的定義域。
  • RAND()函數和TIME()函數,隨機事件的偶然發生及實現的可能過程
    隨機性(Randomness)是偶然性的一種形式。隨機事件的發生有偶然性,但從統計學角度上看也有必然性,如果限制了隨機事件的發生範圍,那麼這種隨機事件就帶有或多或少的必然性。我們還常常用到這種帶有某種的必然程度的隨機事件。今天我們將從函數的角度來講解這種隨機是如何控制範圍的。
  • SPSS中的常用函數
    在SPSS中計算新變量或選擇個案時,我們可能會用到內置函數。SPSS中有上百種內置函數,包括算術函數、統計函數、分布函數、邏輯函數、日期和時間運算與提取函數、缺失值函數、字符串函數、隨機函數,等等。那我們今天就一起來了解一下它們。
  • 大學生計算機二級考試C語言中的函數入門詳解
    C語言計算機二級考試必考考點之函數入門詳解一般來說理科生的大學生有一門必修課是編程,而想要從事軟體開發的人員,沒有C語言基礎是不行的。而C語言中比較重要的部分就是函數。函數是實現各種軟體開發功能的途徑,如果你對函數了如指掌,那麼軟體開發將是一件很簡單的事情了。
  • 單片機隨機數:rand(),srand()
    void srand(unsigned seed) 初始化隨機數發生器有討論如下:1.C的函數庫之所以沒有把使用系統時鐘初始化隨機種子這步重要的操作直接放進rand函數的實現中,我覺得至少有三個原因:(1)可以高效產生連續的隨機數,不用每次都初始化;(2)給程式設計師以更高的靈活性,因為可能在要求較高的場合,應該使用更好的的數據
  • python隨機函數random分配應用,隨機分配8名老師到3個教室中
    羽憶教程最近遇到一個問題,要隨機分配8名老師到3個辦公室中,這時小編想要了python中的隨機函數random來進行分配工作,感覺小編像個月老一樣。python隨機函數python隨機函數在python中,想要生成隨機數
  • Pandas>>sample()函數 隨機選取若干行
    Pandas>>sample()函數 隨機選取若干行功能說明有時候我們只需要數據集中的一部分,並不需要全部的數據。這個時候我們就要對數據集進行隨機的抽樣。pandas中自帶有抽樣的方法。功能相似:numpy.random.choice函數名:DataFrame.sample(n=None,frac=None,replace=False,weights=None,random_state=None,axis=None)import pandas as pdimport numpy as npdata_test= pd.DataFrame
  • 半個月學完概率論與數理統計(第三章02),多維隨機變量函數也不難
    我們接著前面的學習,前一部分我們學習了多維隨機變量及其聯合分布、邊際分布、隨機變量的獨立性,我們今天學習多維隨機變量函數的分布、多維隨機變量的特徵數、條件分布與條件期望 。(對應一維情況,是一樣的學習順序)。(一)多維隨機變量函數的分布照樣,我們分為多維連續隨機變量函數和多維離散隨機變量函數兩種情況來說。
  • C# 16進位轉換10進位相關函數詳解
    C# 16進位轉換10進位相關函數詳解 在C#中可以對整型運算對象按位進行邏輯運算,同時也可以實現C# 16進位轉換10進位,C#10進位轉換2進位等功能。
  • python入門基礎之lambda匿名函數詳解
    python入門基礎之lambda匿名函數詳解剛開始學習python的時候很多人可能對於lambda函數不了解,感覺和def很混亂,下面我來介紹一下lambda函數我從一下幾個方面來介紹lambda:語法如下:lambda [arg1[, arg2, ... argN]]: expression 參數是可選的,如果使用的參數話,參數通常也是表達式的一部分2、lambda匿名函數與def區別lambda 和def它兩個的基本用法差不多
  • 利用RANDBETWEEN、CHAR、IF函數,隨機產生數字與字母組合字符串
    之前的函數講解中,講到過RAND函數,這個函數可以產生從0到1的隨機數在我之前的文章《RAND()函數和TIME()函數,隨機事件的偶然發生及實現的可能過程》中也詳細的講解了這個函數的使用方法。有的好學的讀者提出問題:如何在EXCEL中隨機產生字母和數字組合的序列呢?今天我們就解答這個問題。在解答這個問題之前還是先複習一下RAND函數。
  • 詳解Python隨機數的生成
    ,比如密碼加鹽時會在原密碼上關聯一串隨機數,蒙特卡洛算法會通過隨機數採樣等等。注意的是返回的隨機數可能會是 0 但不可能為 1,即左閉右開的區間。如randint方法生成一定範圍內的隨機數,會先指定一個特定的seed,將seed通過特定的隨機數產生算法,得到一定範圍內隨機分布的隨機數。因此對於同一個seed值的輸入產生的隨機數會相同,省略參數則意味著使用當前系統時間秒數作為種子值,達到每次運行產生的隨機數都不一樣。
  • Excel函數公式:含金量超高的隨機數、不重複隨機數生成技巧解讀
    隨機數,在我們的日常中的應用也是非常廣泛的,那麼,如何生成隨機數,如何生成不重複的隨機數,你真的了解嗎?一、生成0-1之間的隨機數。方法:1、在目標單元格中輸入公式:=RAND()。2、如果要重新生成,按F9刷新即可。