Skip to main content

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 calculation
  • sha256.rs: SHA-256 hashing
  • poseidon_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 hashing
  • poseidon2_bytes_batch.rs: Batch Poseidon2
  • eddsa_verify_no_args.rs: EdDSA signature verification
  • eddsa_batch_verify_no_args.rs: Batch EdDSA verification