Escribe codigo.
Genera pruebas.
Un lenguaje zero-knowledge. La misma sintaxis se ejecuta en una VM o compila a circuitos aritmeticos.
Modo VM
Un lenguaje de programacion real con closures, recursion, GC mark-sweep, 37 opcodes y 50 metodos de tipo. Construye desde busqueda binaria hasta protocolos criptograficos.
// Binary search — full VM mode
fn binary_search(arr, target) {
mut lo = 0
mut hi = len(arr) - 1
while lo <= hi {
let mid = (lo + hi) / 2
if arr[mid] == target { return mid }
if arr[mid] < target {
lo = mid + 1
} else {
hi = mid - 1
}
}
return -1
}
let sorted = [2, 5, 8, 12, 16, 23, 38]
assert(binary_search(sorted, 23) == 5) Modo Circuito
La misma sintaxis compila a restricciones R1CS o Plonkish. Propagacion booleana, constant folding y analisis de taint detectan bugs sub-restringidos antes de generar pruebas.
$ ach circuit vote.ach --inputs "..." --backend r1cs
Compiling vote.ach...
IR: 18 instructions
Optimized: 3 eliminated (constant folding + DCE)
Boolean propagation: 2 proven
R1CS generated:
Constraints: 2,179
Public inputs: 4
Private inputs: 5
Wrote vote.r1cs (932 bytes)
Wrote witness.wtns (236 bytes) — verified OK Verificacion On-Chain
Exporta .r1cs y .wtns para compatibilidad con snarkjs. Genera contratos verificadores en Solidity con --solidity. Despliega y verifica pruebas directamente en Ethereum.
$ ach run proof.ach --prove-backend r1cs
Proof generated (Groth16, 855 bytes)
Proof verified — 5 constraints
$ ach circuit proof.ach --solidity Verifier.sol
Wrote Verifier.sol (Solidity Groth16 verifier)
// Deploy and verify on-chain Pruebas First-Class
Los bloques prove {} retornan objetos de prueba reales. Encadenalos, extrae componentes con proof_json(), verifica inline con verify_proof(). Las pruebas son valores, no artefactos CLI.
let secret = 0p12345
let blinding = 0p98765
let commitment = poseidon(secret, blinding)
let proof = prove(commitment: Public) {
assert_eq(poseidon(secret, blinding), commitment)
}
// proof is a first-class value
let json = proof_json(proof)
assert(verify_proof(proof)) La diferencia
Probar un compromiso Poseidon: 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
$ circom commitment.circom --r1cs --wasm
// 3. Witness (JavaScript)
const input = { secret: "12345", blinding: "98765" };
const w = await circuit.calculateWitness(input);
// 4. Powers of Tau
$ wget ptau.hermez.io/powersOfTau28_12.ptau
// 5. Trusted setup
$ snarkjs groth16 setup commitment.r1cs pot.ptau key.zkey
$ snarkjs zkey contribute key.zkey final.zkey
// 6. Prove
$ 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
let commitment = poseidon(secret, blinding)
prove(commitment: Public) {
assert_eq(poseidon(secret, blinding), commitment)
}
// Proof generated + verified (Groth16) $ ach run commitment.ach
Proof generated (Groth16, 855 bytes)
Proof verified — 361 constraints