groth16-solana

Crates.iogroth16-solana
lib.rsgroth16-solana
version0.2.0
created_at2023-03-14 13:15:16.749286+00
updated_at2025-06-14 16:33:51.602253+00
descriptiongroth16 verification with solana alt_bn128 syscalls
homepage
repositoryhttps://github.com/Lightprotocol/groth16-solana
max_upload_size
id809850
size68,644
(ananas-block)

documentation

README

groth16-solana

Groth16 zero-knowledge proof verification with Solana altbn254 syscalls.

Verification takes less than 200,000 compute units.

The syscalls are contained in Solana releases 1.18.x onwards and are active on Solana Mainnet-beta.

Inputs need to be in u8 arrays in big endian.

See functional test as an example how to use this library.

This crate is compatible with Groth16 proofs of circom circuits.

The verifier file can be generated with the JavaScript script from a verifyingkey.json file generated by snarkjs.

Usage:

let mut public_inputs_vec = Vec::new();
for input in PUBLIC_INPUTS.chunks(32) {
    public_inputs_vec.push(input);
}
let proof_a: G1 =
    <G1 as FromBytes>::read(&*[&change_endianness(&PROOF[0..64])[..], &[0u8][..]].concat())
        .unwrap();
let mut proof_a_neg = [0u8; 65];
<G1 as ToBytes>::write(&proof_a.neg(), &mut proof_a_neg[..]).unwrap();
let proof_a = change_endianness(&proof_a_neg[..64]).try_into().unwrap();
let proof_b = PROOF[64..192].try_into().unwrap();
let proof_c = PROOF[192..256].try_into().unwrap();
let mut verifier = Groth16Verifier::new(
    &proof_a,
    &proof_b,
    &proof_c,
    public_inputs_vec.as_slice(),
    &VERIFYING_KEY,
)
.unwrap();
verifier.verify().unwrap();

See functional test for a running example how to use this library.

Create Verifyingkey from snarkjs verifyingKey.json

Use snarkjs to export the verifyingkey as json.

In this repo:

  • npm i
  • npm run parse-vk

Audit

The groth16_solana release 0.0.1 has been audited during the Light Protocol v3 audit. Check out the report here.

Note: This open-source crate is provided "as-is" without warranties. Use at your own risk.

License

Licensed under Apache License, Version 2.0.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Commit count: 29

cargo fmt