Write code. Generate proofs.
A zero-knowledge DSL with dual execution — run your code in a full VM or compile it to arithmetic circuits. Same syntax, two targets.
Why Achronyme
Other ZK tools force you to choose between expressiveness and efficiency. Achronyme gives you both.
Dual Execution
One language, two targets. Write closures, recursion, and GC-managed collections in VM mode. The same syntax compiles to R1CS or Plonkish circuits. No separate circuit language needed.
First-Class Proofs
prove {} blocks return real proof objects. Chain them, extract components with proof_json(), verify with verify_proof(). Proofs are values, not CLI artifacts.
Native Provers
Groth16 and PlonK run in-process — a single Rust binary, zero external dependencies. No Node.js, no snarkjs ceremony dance, no 5-step CLI workflow.
Compile-Time Safety
Under-constrained circuits are catastrophic ZK bugs. Achronyme's taint analysis detects unproven witness variables before a single proof is generated.
On-Chain Verification
Export .r1cs and .wtns files for snarkjs. Generate Solidity verifier contracts with --solidity and verify proofs directly on Ethereum.
Optimized Circuits
Boolean propagation tracks proven-boolean variables and skips redundant constraints. Constant folding and dead code elimination shrink circuits automatically.
The difference
Proving a Poseidon commitment: Circom + snarkjs vs Achronyme.
// 1. Write the circuit (Circom DSL)
template Commitment() {
signal input secret;
signal input blinding;
signal output cm;
component h = Poseidon(2);
h.inputs[0] <== secret;
h.inputs[1] <== blinding;
cm <== h.out;
}
// 2. Compile to R1CS
$ circom commitment.circom --r1cs --wasm
// 3. Write witness generator (JavaScript)
const input = { secret: "12345", blinding: "98765" };
const w = await circuit.calculateWitness(input);
// 4. Download Powers of Tau
$ wget ptau.hermez.io/powersOfTau28_12.ptau
// 5. Trusted setup ceremony
$ snarkjs groth16 setup commitment.r1cs pot.ptau key.zkey
$ snarkjs zkey contribute key.zkey final.zkey
// 6. Generate proof
$ snarkjs groth16 prove final.zkey witness.wtns proof.json
// 7. Verify
$ snarkjs groth16 verify vkey.json public.json proof.json let secret = 0p12345
let blinding = 0p98765
prove {
witness secret
witness blinding
public commitment
let cm = poseidon(secret, blinding)
assert_eq(cm, commitment)
}
// ✓ Proof generated + verified (Groth16) See it in action
From simple programs to zero-knowledge proofs — all in one language.
// Secret voting — eligibility + privacy + anti-double-vote
public merkle_root
public nullifier
public vote
public election_id
witness secret
witness path[2]
witness indices[2]: Bool
// 1. Voter commitment (hidden)
let commitment = poseidon(secret, 0)
// 2. Prove voter is in the registry
merkle_verify(merkle_root, commitment, path, indices)
// 3. Nullifier prevents double-voting
let expected = poseidon(secret, election_id)
assert_eq(expected, nullifier)
// 4. Vote must be 0 or 1
range_check(vote, 1)
// ~2,179 constraints — ready for on-chain verification