Examples
Ligetron includes several example applications in sdk/cpp/examples/ and sdk/rust/examples/.
API Usage in Examples
The examples demonstrate the convenient high-level APIs:
- C++ examples use
bn254fr_class- a C++ wrapper providing automatic memory management and operator overloading - Rust examples use
Bn254Fr- the Rust equivalent providing the same convenience
Both wrappers provide a more ergonomic interface compared to the low-level C API (bn254fr_t), while maintaining full functionality. See BN254 Field Arithmetic for details on the different API layers.
Example 1: Edit Distance
File: sdk/cpp/examples/edit_distance/edit_distance.cpp
Proves that the edit distance between two strings is below a threshold without revealing one of the strings.
int main(int argc, char *argv[]) {
int dist = minDistance(argv[1], argv[2],
*reinterpret_cast<const int*>(argv[3]),
*reinterpret_cast<const int*>(argv[4]));
assert_one(dist < 5); // Prove distance < 5
return 0;
}
Run:
# Build
cd sdk/cpp/build
make edit
# Prove
../../../build/webgpu_prover '{
"program": "examples/edit.wasm",
"private-indices": [1],
"args": [{"str":"secret"},{"str":"public"},{"i64":6},{"i64":6}]
}'
# Verify
../../../build/webgpu_verifier '{
"program": "examples/edit.wasm",
"private-indices": [1],
"args": [{"str":"xxxxxx"},{"str":"public"},{"i64":6},{"i64":6}]
}'
Example 2: SHA-256
File: sdk/cpp/examples/SHA256/sha256.cpp
Computes SHA-256 hash inside a ZK circuit.
#include <ligetron/sha2.h>
int main() {
unsigned char input[] = "Hello, world!";
unsigned char hash[32];
ligetron_sha2_256(hash, input, sizeof(input) - 1);
// Assert hash matches expected value...
return 0;
}
Run:
cd sdk/cpp/build
make sha256
../../../build/webgpu_prover '{
"program": "examples/sha256.wasm",
"args": []
}'
Example 3: Poseidon Hash
File: sdk/cpp/examples/Poseidon/poseidon_4to1.cpp
Demonstrates Poseidon hash function with 4 inputs.
#include <ligetron/poseidon.h>
int main() {
poseidon_context<poseidon_permx5_254bit_5> ctx;
poseidon_context<poseidon_permx5_254bit_5>::global_init();
ctx.reset();
bn254fr_class inputs[4];
// ... set inputs ...
for (int i = 0; i < 4; i++) {
ctx.digest_update(inputs[i]);
}
ctx.digest_final();
bn254fr_class hash = ctx.state[0];
return 0;
}
Run:
cd sdk/cpp/build
make poseidon_4to1
../../../build/webgpu_prover '{
"program": "examples/poseidon_4to1.wasm",
"args": []
}'
Example 4: EdDSA Signature Verification
File: sdk/cpp/examples/EdDSA/eddsa_verify_no_args.cpp
Verifies an EdDSA signature inside a ZK circuit.
#include <ligetron/eddsa.h>
int main() {
// Public key, message, signature...
bool valid = verify_eddsa(message, msg_len,
signature, public_key);
assert_one(valid);
return 0;
}
Run:
cd sdk/cpp/build
make eddsa
../../../build/webgpu_prover '{
"program": "examples/eddsa.wasm",
"args": []
}'
Example 5: Poseidon2 Hashing
File: sdk/cpp/examples/Poseidon2/poseidon2_bytes.cpp
Demonstrates Poseidon2 hash function for byte arrays.
#include <ligetron/poseidon2.h>
int main() {
// Hash a byte array using Poseidon2
std::vector<uint8_t> input = {0x01, 0x02, 0x03, 0x04};
// Poseidon2 hashing logic...
return 0;
}
Run:
cd sdk/cpp/build
make poseidon2
../../../build/webgpu_prover '{
"program": "examples/poseidon2.wasm",
"args": []
}'
Batch Operation Examples
The SDK includes optimized batch versions of cryptographic primitives for processing multiple inputs efficiently.
Poseidon Batch 2-to-1
File: sdk/cpp/examples/Poseidon/poseidon_batch_2to1.cpp
Batch Poseidon hashing with 2 inputs per hash operation.
cd sdk/cpp/build
make poseidon_batch_2to1
../../../build/webgpu_prover '{
"program": "examples/poseidon_batch_2to1.wasm",
"args": []
}'
Poseidon Batch 4-to-1
File: sdk/cpp/examples/Poseidon/poseidon_batch_4to1.cpp
Batch Poseidon hashing with 4 inputs per hash operation.
cd sdk/cpp/build
make poseidon_batch_4to1
../../../build/webgpu_prover '{
"program": "examples/poseidon_batch_4to1.wasm",
"args": []
}'
Poseidon2 Batch
File: sdk/cpp/examples/Poseidon2/poseidon2_bytes_batch.cpp
Batch hashing of multiple byte arrays using Poseidon2.
cd sdk/cpp/build
make poseidon2_batch
../../../build/webgpu_prover '{
"program": "examples/poseidon2_batch.wasm",
"args": []
}'
EdDSA Batch Verification
File: sdk/cpp/examples/EdDSA/eddsa_batch_verify_no_args.cpp
Verify multiple EdDSA signatures in a single proof.
cd sdk/cpp/build
make eddsa_batch
../../../build/webgpu_prover '{
"program": "examples/eddsa_batch.wasm",
"args": []
}'
Rust Examples
The Rust SDK provides equivalent examples in /sdk/rust/examples/. All Rust examples are built to the wasm32-wasip1 target.
Building All Rust Examples
cd sdk/rust
cargo build --examples --target wasm32-wasip1 --release
Running a Rust Example
# Example: Edit Distance
cd build
./webgpu_prover '{
"program": "../sdk/rust/target/wasm32-wasip1/release/examples/edit_distance.wasm",
"private-indices": [1],
"args": [{"str":"secret"},{"str":"public"},{"i64":6},{"i64":6}]
}'
Available Rust Examples
All C++ examples have Rust equivalents:
edit_distance.rs: Edit distance calculationsha256.rs: SHA-256 hashingposeidon_4to1.rs: Poseidon hash (4 inputs)poseidon_batch_2to1.rs: Batch Poseidon (2-to-1)poseidon_batch_4to1.rs: Batch Poseidon (4-to-1)poseidon2_bytes.rs: Poseidon2 byte hashingposeidon2_bytes_batch.rs: Batch Poseidon2eddsa_verify_no_args.rs: EdDSA signature verificationeddsa_batch_verify_no_args.rs: Batch EdDSA verification