VRF 和單一秘密領導者選舉

本文為機器翻譯
展示原文

引言

在為我自己的區塊鏈專案進行研究時,我發現以太坊基金會一直在調查用於單一秘密領導者選舉(SSLE)的具有DDH構造的可驗證隨機函式(VRF)。

在我參與這個論壇的期間,我發現人們普遍缺乏對DDH構造的認識和理解,這是很遺憾的,因為人們傾向於使用不必要複雜的涉及zk-S{N,T}ARK的設定。不要誤解我,我是zk-S{N,T}ARK的忠實粉絲,但它們確實非常複雜,與橢圓曲線上的幾個點的加法和乘法相比,顯得過於複雜。

所以我想開始一個執行緒,為感興趣的人提供一個快速介紹。這個入門指南基於RFC-9381中描述的構造,也是我個人專案的筆記。

像往常一樣,如果有什麼不對,請告訴我。未來的讀者可能會對此做出關鍵的安全依賴。

常見問題解答

1. 什麼是VRF?

可驗證隨機函式本質上是一個帶有零知識正確性證明的雜湊。

2. 你是指帶有zk-SNARK的雜湊嗎?

不完全是。具有DDH構造的VRF的零知識證明比完整的zk-SNARK更輕量,基於更簡單的數學原理。它與Schnorr簽名大致相似。

[翻譯已省略剩餘部分,但遵循了相同的翻譯原則]

簽名演算法

  • 雜湊到曲線:
H = 雜湊到曲線(插槽編號 || 紀元隨機數)
H=HashToCurve(slot_number||epoch_randomness)
  • 計算輸出點:
\Gamma = x \cdot H
Γ=xH
  • 生成證明點:
U = n \cdot G \\V = n \cdot H
U=nGV=nH
  • 計算挑戰標量:
c = 雜湊到標量(P, H, U, V)
c=HashToScalar(P,H,U,V)
  • 計算Schnorr類簽名標量:
s = n + c \cdot x \mod p
s=n+cxmodp

\pi = (c, s)π=(c,s)。輸出 (\Gamma, \pi)(Γ,π)

驗證演算法

  • 雜湊到曲線:
H = 雜湊到曲線(插槽編號 || 紀元隨機數)
H=HashToCurve(slot_number||epoch_randomness)
  • 恢復證明點:
U' = s \cdot G - c \cdot P \\V' = s \cdot H - c \cdot \Gamma
U=sGcPV=sHcΓ
  • 恢復挑戰雜湊:
c' = 雜湊到標量(P, H, U, V)
c=HashToScalar(P,H,U,V)

當且僅當 c' = cc=c時,證明有效。

在去中心化應用中的使用

如果我們將可驗證隨機函式(VRF)暴露給以太坊虛擬機器(EVM),它是否可以替代像 ChainLink VRF 這樣的外部預言機? 這個可驗證隨機函式可以使用去中心化應用提供的任意訊息作為種子,並由區塊構建者的私鑰證明,但證明必須由所有區塊驗證者驗證

Solidity簽名示例:

/// 返回使用提供的種子生成的均勻分佈的256位字。/// 透過使用區塊驗證的可驗證隨機函式安全地實現。function get_randomness(bytes seed) public view returns uint256;

無論我們為去中心化應用選擇什麼樣的隨機性系統,它都需要抵抗:

  • 預測 - 顯而易見;
  • 偏差 - 顯而易見;
  • 操縱 - 區塊構建者不能透過多次嘗試來獲得去中心化應用中的有利結果;
  • 審查 - 隨機結果不能不斷變化,從某個區塊開始必須保持恆定,否則網路節點可能會審查隨機性解析交易直到獲得有利結果。

現在讓我們比較以下方法:

  1. 使用前一個區塊的雜湊作為隨機性來源 – 在所有方面都失敗:區塊構建者可以審查傳送到去中心化應用的所有交易,直到出現有利的區塊雜湊,他們可以透過重新排序交易來調整區塊雜湊,然後在下一個區塊向去中心化應用提交交易等。
  2. 使用當前區塊的雜湊 – 去中心化應用承諾一個區塊並將在未來的交易中獲取其雜湊。仍然以多種方式失敗,例如區塊構建者可以在下一個區塊中提交承諾交易和解決交易,但如果這兩個區塊沒有產生有利的結果,他們可以嘗試使用不同的分叉。
  3. 使用下一個區塊的雜湊 – 與上面相同的問題,只是需要額外的區塊(可能仍在分叉上)。
  4. 使用區塊N+10的雜湊 – 去中心化應用承諾區塊N,隨機性將是區塊N+10的雜湊,當區塊N是規範的。由於區塊構建者可以透過重新排序區塊N+10的交易進行多次嘗試,因此在調整方面失敗。
  5. 使用10個區塊前的雜湊作為種子的DDH基礎可驗證隨機函式 – 仍然容易受到審查,因為"10個區塊前的雜湊"不斷變化。
  6. 承諾區塊N,然後在區塊N+11使用上面定義的 get_random 函式,以區塊N+10的雜湊作為種子 – 最後兩個區塊(N+10和N+11)可能仍在分叉上,因此區塊構建者可以透過重新排序區塊N+10的交易進行多次嘗試。
  7. 承諾區塊N,然後在區塊N+20使用 get_random 並以區塊N+10的雜湊作為種子 – 似乎通過了所有測試,並且與Chainlink的做法非常接近。可能有點慢,但它假設需要10個插槽才能使區塊成為規範的,所以透過設定較低的閾值,我們可能有改進的空間。

來源
免責聲明:以上內容僅為作者觀點,不代表Followin的任何立場,不構成與Followin相關的任何投資建議。
喜歡
1
收藏
評論