VRF(Verifiable Random Function)
- 可驗證隨機函數可以看作是一個隨機預言機,即可以通過任意的一個輸入,獲得一個隨機數輸出:
- 輸出的結果(Output)是一個隨機數,其數值會均勻分布在值域范圍內
- 對于相同的Input,輸出的結果Output必須是一致的
- 可驗證隨機函數比隨機預言機多了一個非交互的零知識證明,可以用零知識證明來驗證該隨機數輸出的正確性,表明這個隨機數的確是由特定的某個人生成的,而不是偽造的。
可驗證隨機函數組成
- VRF GEN:生成秘鑰,生成一個公私秘鑰對
- VRF VAL:生成隨機數進行輸出
- VRF PROVE:計算零知識證明
- VRF VER:驗證隨機數輸出
生成隨機數和其證明的過程在本機執行,輸入是私鑰和一個值。輸出隨機數以及它的零知識證明。其他節點收到我發出的隨機數和證明之后,結合生成該隨機數的節點的公鑰,即可對該隨機數處進行驗證
簡單的方法:通過VRF生成了這個隨機數value之后,可以通過設置一個全網公認閾值來判斷是否被抽中,比如都認同了一個值100為閾值,假設某輪我隨機到101那么,我就被允許進行下一步的操作
然而這種簡單的方法,沒有辦法防止女巫攻擊,女巫攻擊可以生成很多的賬號,每個賬號都進行隨機,進行干擾。所以現在大部分的VRF抽簽方案都采用基于權益來進行票數分配,也就是每個人都有投票的機會,但是因為個人的權益不同,每個人的票的權重也是不一樣的,然后進行抽簽算法的設計。這樣的話,如果將一個權重很高的賬戶拆分成權重很低的很多個賬戶,每一個的賬戶的投票的權重很低,因此對于系統的進行投票的干擾性很小。
?
無交互抽簽
?
最普遍的一種方案,通過二項分布來進行抽簽結果的計算。
- 首先通過私鑰生成了value,這個value實際上可以看作是大的正整數,假設是256bit的,那么它的取值范圍應該處于0到2的256次方之間。相應的它與2的256次方相除,可以得到一個0到1之間的值。
- 將這個值放到二項分布的累積分布中進行比對,可以得到相應的值
- 如果這個值大于零,就相當于抽到了可以進行下一步的簽。
二項分布
驗證
- 將這個值和之前VRF生成的和一起,廣播給其他人,其他任何收到的用戶結合廣播者的公鑰以及全網都知道的值,則可以驗證以下兩個條件是否成立:
- 利用驗證是否正確
- 利用通過二項分布函數得到j'是否與j相等
假設兩個條件均成立,那么就證明這個抽簽結果是正確的,是可信的。到此為止,從抽簽生成到驗證的過程就完成了。
優點
1、首先它的抽簽過程不需要與其他通信,直接在本機就能夠的到這個抽簽結果,而且這個x輸入是大家公認的,針對同一個x的輸出value是固定的,因此無法通過多次嘗試來改變抽簽結果
2、某個節點收到其他節點的抽簽信息之后,可以用附帶的證明,來證明這個隨機數的正確性,保證它的確是由私鑰的擁有者計算出來的。因此這個抽簽結果是無法被偽造的。
3、VRF主要用來的得出一個偽隨機數,抽簽的部分主要是由一個二項分布函數負責,而通過構建二項分布的參數,我們可以很方便的控制需要被得出的中簽權益的個數,適配不同的需要抽簽的場景。
參考鏈接
- 區塊鏈中VRF的應用及原理解析