有了 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 功能,也就是將多個簽名聚合並一塊驗證。假設這邊有兩把私鑰,分別簽名了不同的訊息:

驗證如下: