This project provides a Rust adapter for compiling and linking Circom circuit witness generator C++ sources into a native library for target platforms (e.g., mobile devices). It includes macros and functions to facilitate the integration of witness generation into Rust codebases.
Warning
It does not support Circom versions 2.2.0 and above.
- Linux:
sudo apt install build-essential cmake m4 nasm libstdc++6
- MacOS:
brew install nasm
cargo 1.81.0 (2dbb1af80 2024-08-20)
Include the crate in your Cargo.toml
:
[dependencies]
witnesscalc-adapter = "0.1"
anyhow = "1.0"
[build-dependencies]
witnesscalc-adapter = "0.1"
In build.rs
, add the following code to compile the witness generator C++ sources (<circuit name>.cpp
and <circuit name>.dat
) into a native library and link to it:
witnesscalc_adapter::build_and_link("../path to directory containing your C++ sources");
// e.g. witnesscalc_adapter::build_and_link("../testdata");
// The directory should contain the following files:
// - <circuit name>.cpp
// - <circuit name>.dat
In your main code, use the witness
macro to generate a witness for a given input:
witnesscalc_adapter::witness!(<circuit name>);
// e.g. witnesscalc_adapter::witness!(multiplier2);
Calculate the witness by using the <circuit name>_witness
function.
let wtns = <circuit name>_witness(inputs_json_string)
// e.g. let wtns = multiplier2_witness("{\"a\": [\"2\"], \"b\": [\"3\"]}")
It will generate a wtns
bytes array like the output of witnesscalc or snarkjs.
Convert the wtns
to bigints by using the parse_witness_to_bigints
function.
let witness = parse_witness_to_bigints(&wtns).unwrap();
- x86_64 linux
- arm64 linux
- aarch64-apple-darwin
- x86_64-apple-darwin
- aarch64-apple-ios
- aarch64-apple-ios-sim
- x86_64-apple-ios
- aarch64-linux-android
- x86_64-linux-android
- Website: zkmopro.com
- X account:
- Telegram group:
- Inspired by https://github.com/chancehudson/rust-witness. This adapter relies on the 0xPolygonID/witnesscalc library fork.
- The project is sponsored by PSE.