#elliptic-curve #halo2 #ecosystem #element #field #traits


Elliptic curve implementations and wrappers for halo2 library

5 releases (3 breaking)

0.6.1 Feb 8, 2024
0.6.0 Jan 10, 2024
0.5.0 Dec 18, 2023
0.4.0 Aug 11, 2023
0.1.0 Jul 4, 2023

#63 in Cryptography

Download history 3957/week @ 2024-02-21 2606/week @ 2024-02-28 2015/week @ 2024-03-06 2125/week @ 2024-03-13 2261/week @ 2024-03-20 2616/week @ 2024-03-27 2425/week @ 2024-04-03 1503/week @ 2024-04-10 1767/week @ 2024-04-17 2031/week @ 2024-04-24 1520/week @ 2024-05-01 2678/week @ 2024-05-08 2776/week @ 2024-05-15 2160/week @ 2024-05-22 2767/week @ 2024-05-29 3146/week @ 2024-06-05

11,291 downloads per month
Used in 8 crates (5 directly)


13K SLoC

A collection of Elliptic Curves for ZkCrypto traits

crates.io version docs.rs availability Build status

This library provides efficient and flexible implementations of various halo2-friendly elliptic curves, originally implementing the BN256 curve with traits from the zkcrypto ecosystem,

The implementations were originally ported from matterlabs/pairing and zkcrypto/bls12-381, but have been extended and optimized to cover a broader set of curves and use cases. Since its initial release, the library has expanded to include additional curves, along with the following features:

  • secp256k1, secp256r1, pluto, eris and grumpkin curves, enhancing its usability across a range of cryptographic protocols.
  • Assembly optimizations leading to significantly improved performance.
  • Various features related to serialization and deserialization of curve points and field elements.
  • Curve-specific optimizations and benchmarking capabilities.

Controlling parallelism

halo2curves currently uses rayon for parallel computation.

The RAYON_NUM_THREADS environment variable can be used to set the number of threads.

When compiling to WASM-targets, notice that since version 1.7, rayon will fallback automatically (with no need to handle features) to require getrandom in order to be able to work. For more info related to WASM-compilation.

See: Rayon: Usage with WebAssembly for more info.


Benchmarking is supported through the use of Rust's built-in test framework. Benchmarks can be run without assembly optimizations:

$ cargo test --profile bench test_field -- --nocapture

or with assembly optimizations:

$ cargo test --profile bench test_field --features asm -- --nocapture

Additional Features

  1. Derivation of Serialize/Deserialize: The library supports Serde's Serialize and Deserialize traits for field and group elements, making it easier to integrate curve operations into serialization-dependent workflows.

  2. Hash to Curve: For the bn256::G1 and grumpkin::G1 curves, hash_to_curve is implemented, enabling more efficient hash-and-sign signature schemes.

  3. Lookup Table: A pre-computed lookup table is available for bn256::Fr, accelerating conversion from u16 to montgomery representation.


The library's top-level directories are organized as follows:

  • benches: Contains benchmarking tests.
  • script: Contains utility scripts.
  • src: Contains the source code of the library, further subdivided into modules for each supported curve (bn256, grumpkin, secp256k1, secp256r1, secq256k1, pasta, pluto, eris) and additional functionalities (derive, tests).


~58K SLoC