Implementation of pairing over BLS12-381 in Noir. This uses the new BigNum library.
This library uses BigNum library version v0.6.1.
[dependencies]
noir_bls12_381_pairing = { tag = "v0.2", git = "https://github.com/ewynx/noir_bls12_381_pairing" }To do a pairing define the 2 inputs of types G1Affine and G2Affine and apply the pairing. Example:
let g = G1Affine::generator();
let h = G2Affine::generator();
let first_pairing = pairing(g.neg(), h);
let second_pairing = pairing(g, h.neg());
assert(first_pairing.eq(second_pairing));This codebase uses the zkcrypto repository as a referece: https://github.com/zkcrypto/bls12_381. This has also been used for tests and test values. The Noir implementation passes pairing & bilinearity tests obtained from the zkcrypto repo.
The BLS12-381 Fq field parameters comes from BigNum library and the type BLS12_381Fq in Fp2 follows the definition in the BigCurve library:
pub type Fp = BigNum<4, BLS12_381_Fq_Params>;We define it here to not have to import the full BigCurve library.
Run all tests
nargo test
Note that a good amount of the tests are commented out because they take a fair amount of time (20-30 min) to run. For example test_pairings_1 and test_bilinearity in pairings.nr.
nargo 0.35.0 and BigNum 0.4.2:
One pairing:
- "acir_opcodes": 2.441.154
- "circuit_size": 3.210.964
nargo 1.0.0-beta.3 and BigNum 0.6.1:
One pairing:
- "acir_opcodes": 1.876.717
- "circuit_size": 5.403.322
For code snippet:
fn main(p: G1Affine, q: G2Affine) {
let res = pairing(p, q);
}- BLS12_381 Elliptic Curve Pairing and Signature Verification Library by @onurinanc: repo
- Noir BigCurve library: repo
This repo was forked and more curves are being added in this repo by @iAmMichaelConnor.