可驗證隨機函式
可驗證隨機函式(VRFs)
最近區塊鏈領域流行了一種“怪病”,許多區塊鏈專案或者設計方案都加入了一個叫做VRFs 的演算法。
(1) 那什麼是VRFs?
(2) 使用VRFs又是為了什麼?
本文旨在介紹VRFs的原理以及在區塊鏈中的用途,不涉及複雜的VRFs的詳細設計實現以及安全性證明。
(一)什麼是VRFs?
VRFs全稱Verifiable Random Functions,也就是可驗證隨機函式。從名字上可以看出VRFs有三個重要的特點:
- 可驗證
- 隨機性
- 函式組
實際上,VRFs是hash函式構造的公鑰密碼方案,因此VRFs又包含了hash函式和公鑰密碼演算法(hash函式和公鑰密碼參考wiki,這裡不在贅述),功能上簡單來講,hash函式一般用來保證資訊完整性,公鑰密碼用來進行資料鑑權。
VRFs介紹內容:
- 關鍵術語介紹
- VRFs之函式組
- VRFs之隨機性
- VRFs之可驗證
- VRFs之確定性
關鍵術語
VRFs涉及的一些關鍵術語:
- SK, PK: VRF中使用的公私鑰對,SK為私鑰,PK為公鑰。PK預設為公開引數(比如說已經記錄在區塊鏈上)
- M: 輸入資料
- R:VRF雜湊輸出
- P:VRF證明
- Prover:證明者,擁有VRF公私鑰PK和SK的一方
- Verifier:驗證著,擁有VRF中的公鑰PK
VRFs之函式組
VRFs中涉及到四個重要的函式
uploading-image-30552.png
這四個函式可以分為兩類,
- 生成函式:
R=VRF_Hash(SK,M) P=VRF_Proof(SK,M)
- 驗證函式:
R=VRF_P2H(P) VRF_Verify(PK,M,P)
應用上,(1)首先生成一對公私鑰;(2)然後使用生成函式 分別生成雜湊值R 和雜湊值的證明P ;(3)使用驗證函式分別驗證R 和P
VRFs之隨機性
像每個密碼演算法一樣,首先VRF需要一個金鑰生成演算法,用來生成公私鑰對(SK,PK)
。這裡的SK的產生需要複雜的隨機數產生函式(高階一點的需要特製的硬體隨機數發生源)來保證金鑰的隨機性。
當然,VRFs之隨機性實際上並不是指的上述隨機性,VRFs的隨機性指的是,在不給定證明P
的情況下,VRF_Hash
的輸出R
與隨機數兩者之間是敵手不可區分的,這是比較正式或者說學術上的說法,可以認為VRF_Hash輸出的R
就是個隨機數。
VRFs之可驗證
VRF的可驗證性,有兩層意思:
一是P 對R 的驗證;
二是PK 對P 的驗證。
前者是VRF證明對VRF雜湊的驗證,後者是公鑰對VRF證明的驗證。有點類似驗證鏈:擁有公鑰PK
可以通過VRF_Verify(PK,M,P)
驗證證明P
的合法性;擁有P
可以通過R=VRF_P2H(P)
來驗證R
的合法性。
VRFs之確定性
VRFs的確定性比較簡單,就是對相同的SK
和M
,多次計算R=VRF_Hash(SK,M)
,得到的R
是相同的。
(二)VRFs在區塊鏈中的作用
區塊鏈技術包含了密碼學、P2P協議以及共識演算法等,是多種技術的巧妙組合,同時加入了經濟激勵機制。其中,共識演算法可謂是區塊鏈技術的靈魂。區塊鏈技術從2009年至今發展了接近十年的時間,共識演算法也一直圍繞著安全性、去中心化以及高效低能者三個要求不斷探索,從中本聰共識(POW類),到POS和DPOS共識,再到各種BFT共識等。
在區塊鏈世界中,礦工的工作是區塊鏈安全執行的基礎,而他們的工作就是挖礦⚒️,礦工挖到礦(區塊)會獲得一筆獎勵金和一部分交易手續費。同一時間會有許多礦工進行挖礦,但最終只會有一個區塊進入到主鏈上。
Hash(Hash(block, nonce)) < D
礦工挖礦的過程就是為了找到一個以上條件的nonce,誰先算出來誰就是本輪的獲勝者。根據Hash演算法的特點,其他礦工可以很容易驗證上面不等式的有效性。眾所周知這類演算法:實現簡單,易於理解,但低效高能。
為了解決POW共識低效高能的缺點,出現了POS類共識,而這類共識首先要解決的問題就是 誰來出塊 的問題,VRFs最初被引入區塊鏈就是為了解決這個問題。
VRFs如何決定出塊者
像選美大賽一樣,評委和觀眾會有一個評選標準,比如說身材、相貌或者多才多藝。用VRF選擇出塊者也需要一個標準,跟POW挖礦演算法中的難度D 一樣,VRFs也需要類似的D 。
VRFs挖礦演算法:R = VRF_Hash(SK,block) < D
為了統一暫且也叫做挖礦演算法。給定自己的私鑰SK和block資訊,可以很快的驗證自己是否成為下一輪的出塊者,不需要進行大量的Hash計算。
這類演算法特點:離線驗證,高效低能,但實現複雜
#### 十萬個為什麼Q&A
- 不過聰明的人可能一下就能看出其中的問題:SK 是礦工私鑰不會公開,其他礦工如何證明R 不是隨便選取的小於D 的數。
因此需要有個對於R
有效性的證明,也就是上文中的P
:P=VRF_Proof(SK,M)
,然後通過R'=VRF_P2H(P)
,從P
中恢復出一個R'
,只要R == R'
,就可以證明R
的有效性。然後用公鑰PK
通過VRF_Verify(PK,M,P)
來對P
進行公開驗證。
-
當然聰明的你可能又問了:看了半天,我感覺直接用簽名演算法不就可以了,幹嘛整的這麼複雜,比如說礦工直接對block簽名,如果
Sign(SK, block) < D
,那麼礦工就有出塊的權利。
在密碼學簽名演算法中,大都會引入隨機性,也就是對相同資訊的多次簽名會得到不同的簽名值,因此礦工可以不斷對相同的輸入SK 和block ,計算簽名,以滿足結果小於D 。那麼理論上任何人都會成為出塊者,只要計算足夠多次的簽名。
- 老師,還有個問題:RSA簽名方案,每次得到的簽名不就都是確定值麼!
對。其實不管使用確定性簽名還是隨機性簽名,都存在個安全隱患。就是一旦將自己的出塊憑證公佈,任何人都可以公開驗證,包括攻擊者。那麼攻擊者可以對出塊節點進行攻擊,使其不能出塊。
使用VRFs的方式,礦工只需要公佈自己的R 表明自己的出塊權,當出完塊的時候再公佈P ,那麼攻擊者就無法在出塊之前知道誰具有出塊權,因此也就無法實施針對性的攻擊。
當然對於R 作假,還有個比較有名的問題:" Nothing At Risk ",翻譯過來叫無利害關係。對於這類攻擊的解決方法,一般都會使用 " 繳納保證金 " 的方式。
(三)個人思考
- 共識不是一個簡單的演算法問題,更像一個社會治理問題。
- 共識演算法的設計需要關注效能和安全性,以達到效能和安全性的平衡。
- 區塊鏈技術”不可能三角問題 “中的去中心化,個人認為應該叫做公平性,因為去中心化不是區塊鏈的目的,優秀的區塊鏈應該是高效能,高安全性,參與者相對平等。而去中心化只是實現上的效果。公平性不單指的是公平的出塊權,未來也可能代表公平的獲取資訊的權利(當然可能只是藉助了區塊鏈技術的創新專案)。
- VRFs可以用來選出塊者,也可以用來分組,通過分組,提高交易並行處理效能。