Signature
我們如何在 Solidity 中驗證 BGLS 聚合簽名?
EVXS
$$ 1 $$是 Boneh 等人的聚合簽名方案,它允許聚合來自 n 個不同簽名者的 n 個不同消息的簽名。我想要實現的是在智能合約中驗證此類簽名。 通過檢查相等性來驗證單個簽名(BLS 簽名)
e(g1, σ) == e(v, h)
,其中:
- e : G1 x G2 -> GT 是雙線性配對/映射
- g1 是 G1 的生成器
- σ 是簽名
- v 是簽名者的公鑰
- h 是簽名消息的雜湊值
使用拜占庭引入的新預編譯合約
bn256Pairing
(以及bn256Add
andbn256ScalarMul
),我們可以檢查相等性並驗證簽名。問題:
現在,為了驗證聚合簽名,我們需要計算:
e(g1, σ) == product of e(vi, hi) for all signers i
其中 vi 和 hi 是簽名者 i 的公鑰和散列消息。
這似乎更加困難,因為我們必須在檢查相等性之前實際計算配對並將它們相乘。但是,預編譯的合約只允許檢查相等性。另外,我在 GitHub 上找到了一個實現(Project-Arda/bgls-on-evm
$$ 2 $$),但它似乎只能驗證單個簽名。 問題:
有人對如何在 Solidity 中驗證此聚合簽名有任何建議嗎?
注意:BGLS 最初與乙太坊支持的類型 3 配對不兼容,但該方案可以按照 Chatterjee 等人的建議進行修改。
$$ 3 $$. 參考:
- $$ 1 $$: https://link.springer.com/chapter/10.1007%2F3-540-39200-9_26
- $$ 2 $$: https://github.com/Project-Arda/bgls-on-evm
- $$ 3 $$: https://link.springer.com/article/10.1007/s10623-009-9334-7
更新(2018 年 7 月 8 日):
我如何在 Solidity 中驗證 BLS 和 BGLS 簽名的範例位於https://gist.github.com/BjornvdLaan/ca6dd4e3993e1ef392f363ec27fe74c4
我認為這實際上只是一個符號問題。在原始論文中,組是乘法編寫的,而乙太坊文件中的組是加法編寫的。
尤其,
e(g1, σ) = e(g1, x1*h1+x2*h2+...) = x1*e(g1,h1) + x2*e(g1,h2)+...+xn*e(g1,hn)
然後您可以簡單地使用 n 元配對檢查來進行檢查
e(-g1, σ, v1, h1, v2, h2, ..., vn, hn)