乙太坊 BLS 簽名驗證如何工作?
我正在對智能合約實施 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。