--- reference: https://wiki.polkadot.network/docs/learn-cryptography#vrf --- # 什麼是 Verifiable Random Function (VRF)? VRF 是一種數學運算,可以透過一些輸入來產生一個隨機數以及對應的真實性證明,其他人可以透過這個證明方式驗證這個隨機數是有效的。 > [name=yu2C]: > output > - 需要是 *deterministic*,只是非常難預測而已 > - pseudo random : output 應該要是隨機的 > - VRF 再被揭露之前只有 $sk$ 擁有者知道對應的 output。即使 output 被揭露了,也無法逆推回 $sk$ Polkadot 使用的 VRF 與 Ouroboros Praos 使用的 VRF 類似,但 Polkadot 的 VRF 不依賴一個中央時鐘 (議題:誰才是標準的時間?),因此 Polkadot 使用自己前一筆的結果來決定當前以及未來的結果,這使用了 slot number 來作為時鐘的模擬器,以進行時間的推估。(slot 是一個長度固定為 6 秒的時間區間) 驗證者選擇:VRF 產生的隨機數和其證明被用於確定哪些驗證者有權利生成下一個區塊。由於 VRF 的隨機性特質,系統可以公平且無偏地選擇驗證者,確保網絡不會被某一單一方或小部分驗證者所控制。 共識協議的安全性:通過 VRF,驗證者可以產生可證明的隨機數據,而其他節點可以通過公鑰來驗證這些數據的真實性和隨機性。這種機制不僅可以增強系統的隨機性,還可以防止篡改,保障網絡的安全性和去中心化特質。 ## 運作細節 Slot 是長度為 6 秒的時間單位,每個 slot 可以包含一個 block (可能是不只),epoch 是由 slot 所組成,在 polkadot 中,2400 的 slots 將組成一個 epoch,每個 epoch 也就是 4 個小時。 在每個 slot,每一位驗證者都會進行擲骰子的行為,他們將會輸入以下資訊去執行 VRF: - The "secret key", 專門提供給該次擲骰子事件的密鑰 (驗證者的私鑰) - An epoch randomness value, 該隨機數($r$)是由第 N-2 個 epoch 所有的 blocks 的 VRF 數值的 hash, 因此過去的隨機數會影響當前(N)的隨機數值。 - The slot number. > 產生出唯一的隨機數提供給每一個 slot ![VRF_babe-12768d3392ba939b5f4c4955556d12c2](https://hackmd.io/_uploads/S1uBkkhg1g.png) 輸出將會是兩個數值:`RESULT`(隨機數) 以及 `PROOF`(隨機數驗證方法) 這個 `RESULT` 將會與 `threshold` (定義於 Polkadot relay chain protocol) 進行比較,如果 `RESULT` 小於 `threshold`,那麼產生該隨機數的驗證者,就是該 slot 的區塊生產候選者。 有些 slots 可能沒有驗證者被選為區塊生產者,因為所有的驗證者所產生出來的 `RESULT` 都大於 `threshold`,這將會在 [consensus](https://wiki.polkadot.network/docs/learn-consensus) 章節中討論 (secondary slot 選出備用的區塊生產者) 額外參考: - [VRF 介紹1](https://chain.link/education-hub/verifiable-random-function-vrf) - [VRF 介紹2](https://www.youtube.com/watch?v=XAF5efMPlEA&ab_channel=UP) - [VRF Code](https://github.com/yoseplee/vrf)