Cryptocurrency

乙太坊 BLS 簽名驗證如何工作?

  • October 25, 2022

我正在對智能合約實施 BLS 簽名驗證,我對乙太坊驗證簽名的方式有疑問。回想一下,bls 簽名的作用是

  • $ e(P_2,H(m)_1)_T=e(G_2, S_1)_T $ 在哪裡 $ _2 $ 和 $ _1 $ 表示點 $ G_1 $ 和 $ G_1 $ , 和 $ _T $ 為了 $ G_T $ .
  • 鏈下,你拿走你的秘密 $ x $ , 並做 $ x,G_2\to P_2 $ (你的公鑰)。
  • 然後你提供你的公鑰 $ P_2 $ 到鏈上合約。
  • 然後你生成你的簽名, $ x,H(m)_1\to S_1 $ .
  • 您為鏈上合約提供簽名。
  • 它驗證 $ e(P_2,H(m)_1)_T=e(G_2, S_1)_T $ .

然而,乙太坊驗證相等性的方式與最後一行略有不同。具體來說,他們檢查是否:

$$ e(A_2,B_1)*e(C_2,D_1)==1_T $$

完成這一切的虛擬碼可以寫成

from py_ecc.bn128 import *
p = curve_order
x = randint(1, p-1) # out secret key
H_m = multiply(G1, randint(1, p-1)) # lets pretend it's HashToPoint
P = multiply(G2, x) # our public key in G2
S = multiply(H_m, x) # our signature in G1
a = pairing(P, H_m)
b = pairing(G2, S)
assert a == b # Verify signature

要使用等效的ECPAIRING,您將執行以下操作:

c = pairing(G2, neg(S))
assert a * c == FQ12.one()

我不明白的是如何 $ e(A_2,B_1)*e(C_2,D_1)==1_T $ . 據我所知neg,否定操作的代表。這ECPAIRING是他們命名的操作碼。有人可以幫我看看我錯過了什麼嗎?

版主注:此問題中的一些與該文章相符

這一切都歸結為配對操作的屬性(通常表示為 $ e $ pairing,在程式碼中呼叫)。

$ e $ 是一個將兩個橢圓曲線點作為輸入的函式,並生成一個乘法和取冪有意義的值(實際上,它是“擴展域”中的一個元素,但是您不必擔心這意味著什麼)

一處房產 $ e $ 有這個身份:

$$ e(aG, bH) = e(G,H)^{ab} $$

這個恆等式對任何整數都是正確的 $ a, b $ , 和任意兩點 $ G, H $ .

BLS 簽名驗證邏輯依賴於:如果公鑰是 $ P_2 = xG_2 $ (和 $ G_2 $ 也被驗證者知道),並且消息被映射到一個點 $ H(m)_1 $ ,簽名為 $ S_1 = xH(m)_1 $ ,然後標準 BLS 驗證(假設簽名有效)計算兩個配對:

$$ e(P_2, H(m)_1) = e(xG_2, H(m)_1) = e(G_2, H(m)_1)^x $$

$$ e(G_2, S_1) = e(G_2, xH(m)_1) = e(G_2, H(m)_1)^x $$

如果簽名無效,則第二個等式計算為其他值。

如果 $ S_1 $ 實際上是 $ xH(m)_1 $ (即如果簽名有效,則這兩個值相同。

現在,乙太坊 BLS 驗證邏輯是等效的,但工作方式略有不同:它改為計算(同樣,如果簽名有效):

$$ e(G_2, -S_1) = e(G_2, -xH(m)_1) = e(G_2, H(m)_1)^{-x} $$

請記住,否定一個點與將其乘以 -1 相同。

同樣,如果簽名無效,它會評估為其他內容。

因此,如果簽名有效,則驗證者剛剛計算了這兩個值 $ e(G_2, H(m)_1)^x $ 和 $ e(G_2, H(m)_1)^{-x} $ ; 它們是彼此的乘法逆元,因此將它們相乘在一起的結果為 1。

引用自:https://crypto.stackexchange.com/questions/102394