| Crates.io | semaphore-rs |
| lib.rs | semaphore-rs |
| version | 0.5.0 |
| created_at | 2025-01-27 13:50:47.01059+00 |
| updated_at | 2025-06-02 23:31:17.651867+00 |
| description | Rust support library for Semaphore |
| homepage | https://github.com/worldcoin/semaphore-rs |
| repository | https://github.com/worldcoin/semaphore-rs |
| max_upload_size | |
| id | 1532457 |
| size | 931,522 |
Rust support library for using semaphore. It's mostly a Rust rewrite of zk-kit, but just focuses on semaphore (for now) and still covers a much smaller scope. It's using ark-circom under the hood for generating the groth16 proofs.
Add this line to your cargo.toml:
semaphore = { git = "https://github.com/worldcoin/semaphore-rs" }
git submodule update --init --recursivecd semaphore && npm installnpm exec ts-node ./scripts/compile-circuits.tszkey and wasm file in semaphore/build/snarkExample as in src/lib.rs, run with cargo test.
use semaphore_rs::{get_supported_depths, hash_to_field, Field, identity::Identity,
poseidon_tree::LazyPoseidonTree, protocol::*};
use num_bigint::BigInt;
// generate identity
let mut secret = *b"secret";
let id = Identity::from_secret(&mut secret, None);
// Get the first available tree depth. This is controlled by the crate features.
let depth = get_supported_depths()[0];
// generate merkle tree
let leaf = Field::from(0);
let mut tree = LazyPoseidonTree::new(depth, leaf).derived();
tree = tree.update(0, &id.commitment());
let merkle_proof = tree.proof(0);
let root = tree.root();
// change signal and external_nullifier here
let signal_hash = hash_to_field(b"xxx");
let external_nullifier_hash = hash_to_field(b"appId");
let nullifier_hash = generate_nullifier_hash(&id, external_nullifier_hash);
let proof = generate_proof(&id, &merkle_proof, external_nullifier_hash, signal_hash).unwrap();
let success = verify_proof(root, nullifier_hash, signal_hash, external_nullifier_hash, &proof, depth).unwrap();
assert!(success);