EIP-2537,BLS12-381 橢圓曲線相關的基本功能會以 precompile contracts 的方式在 Pectra 上線,主要為了支援 BLS 數位簽名的驗證。

Point Encoding

首先需要注意的是 Point 的 encoding。BLS12-381 是一條 pairing-friendly 的橢圓曲線,其 Prime Field 有 381 bits,大於所有 EVM 原生型別的大小。

上的 Point 其 X 座標和 Y 座標皆屬於 BLS12-381 Prime Field,所以 EIP 中規定以 64 bytes 進行 Encoding,而這 64 bytes 最前面會有 16 bytes 為零,Layout 如下:

16 bytes48 bytes (384 bits)
0x00..00

為 extension field,其點座標被記作 ,裡面 皆屬於 ,所以一個 的 Point 以 128 bytes 以記錄兩個 元素,Layout 如下:

16 bytes48 bytes (384 bits)16 bytes48 bytes (384 bits)
0x00..000x00..00

BLS12_G1ADD(0x0b)

上的 point addition,數學式如下:

ABI

由於是以 contract interaction 的形式呼叫,所以 calldata 需要按照相應的格式排列好。BLS12_G1ADD 需要從 calldata 解析出兩個在 上的 Point,並按照 (x, y) 的順序排好:

Calldata Bytes RangeName
[0; 64] (64 bytes)x1
[64; 128]y1
[128; 192]x2
[192; 256]y2

BLS12_G1MSM(0x0c)

上的 Multi-Scalar Multiplication,數學式如下:

ABI

Multi-Scalar Multiplication 可以傳入多組 (Point, k) 做計算,單一組 (Point, k) 在 calldata 的 Layout 如下:

Calldata Bytes RangeName
[0; 64] (64 bytes)x1
[64; 128]y1
[128; 192]k1

BLS12_G2ADD(0x0d)

上的 point addition,數學式和 G1ADD 相同。

ABI

BLS12_G2ADD 需要從 calldata 解析出兩個在 上的 Point,並按照 (x, y) 的順序排好:

Calldata Bytes RangeName
[0; 64] (64 bytes)x1_c0
[64; 128]x1_c1
[128; 192]y1_c0
[192; 256]y1_c1
[256; 320]x2_c0
[320; 384]x2_c1
[384; 448]y2_c0
[448; 512]y2_c1

BLS12_G2MSM(0x0e)

上的 Multi-Scalar Multiplication,數學式和 G1MSM 相同。

ABI

Multi-Scalar Multiplication 可以傳入多組 (Point, k) 做計算,第一組 (Point, k) 在 calldata 的 Layout 如下:

Calldata Bytes RangeName
[0; 64] (64 bytes)x1_c0
[64; 128]x1_c1
[128; 192]y1_c0
[192; 256]y1_c1
[256; 320]k_1

BLS12_PAIRING_CHECK(0x0f)

BLS12-381 的 Pairing 計算,數學式如下:

ABI

bn254 一樣是 Batch Pairing 的運算:

第一組 Point 和 Point 在 calldata 的 Layout 如下:

Calldata Bytes RangeName
[0; 64] (64 bytes)x_P
[64; 128]y_P
[128; 192]x_Q_c0
[192; 256]x_Q_c1
[256; 320]y_Q_c0
[320; 384]y_Q_c1

BLS12_MAP_FP_TO_G1(0x10)

將一個 映射到

ABI

輸入為一個 元素,calldata 的 Layout 如下:

Calldata Bytes RangeName
[0; 64] (64 bytes)

BLS12_MAP_FP2_TO_G2(0x11)

將一個 映射到

ABI

輸入為一個 元素,calldata 的 Layout 如下:

Calldata Bytes RangeName
[0; 64] (64 bytes)C_0
[64; 128]C_1