有了 bls12-381 的 precompile 的支援,就可以實作 BLS Signature。
Hashing to the curve
BLS Signature 對於訊息雜湊有作略微的修改,將訊息的雜湊值直接對應到橢圓曲線上,以下借用 reference^[https://medium.com/cryptoadvance/bls-signatures-better-than-schnorr-5a7fe30ea716] 的圖示:
最簡單的方法是像往常一樣對訊息進行雜湊處理 (在 evm 以 keccak256 最為方便),並將結果視為點的 X 座標,代入橢圓曲線計算是否有對應的 Y 座標。由於並不是每個 X 都找得到 Y 座標出來,所以會在雜湊附加上額外的訊息,例如 counter 之類的計數器,找不到則增加 counter 再計算一次,直到找到為止。
Key Generation
公私鑰的產生方式和一般橢圓曲線密碼學差不多,私鑰為一個 scalar,公鑰為 上的點。數學式如下:
Sign
過程分兩個步驟,首先先計算出訊息的 Hash to curve:
再來將其和私鑰相成以做成簽名 :
Verify
驗證演算法需要三個 input:
- 公鑰
- 訊息
- 簽名
驗證主要透過 Pairing 進行:
Signature Aggregation
BLS12-381 可以支援 signature aggregation 功能,也就是將多個簽名聚合並一塊驗證。假設這邊有兩把私鑰,分別簽名了不同的訊息:
驗證如下: