Presentamos Achronyme — un lenguaje para pruebas zero-knowledge. Lee el anuncio arrow_right_alt

beta.20 — Frontend de Circom

La release destacada: Achronyme compila archivos .circom de extremo a extremo con diagnosticos de soundness que circom mismo no provee.

Achronyme 0.1.0-beta.20 trae el frontend de Circom: los archivos .circom fluyen por la misma pipeline que los circuitos nativos .ach, con chequeos de soundness en tiempo de compilacion que el compilador oficial de circom no realiza. Esta pagina es la version de dos minutos — la entrada completa del changelog esta en el Changelog.

Junto al frontend de Circom, beta.20 reorganiza el codigo en 19 crates de workspace e introduce Lysis, una tercera VM de ejecucion que liftea cuerpos de funcion circom como trazas de VM. Eso es lo que destraba circuitos pesados como SHA-256(64) de extremo a extremo.

Resumen rapido

  • ach circom archivo.circom --prove compila y prueba un circuito circom de extremo a extremo.
  • El conteo de constraints iguala o supera al optimizador mas agresivo de circom (O2) en todo template de circomlib ejecutado (Num2Bits, LessThan, MiMCSponge, Poseidon, Pedersen, EscalarMulAny, y mas).
  • E100 + W101 detectan signals sin restringir en tiempo de compilacion — la fuente #1 de bugs ZK, que el compilador de circom no detecta.
  • Tres formas de alcanzar codigo Circom: absorcion completa (import circuit), templates selectivos (import { T } from), o libreria con namespace (import ... as P). Ver Resumen de Interop con Circom.
  • Seccion [circom] en achronyme.toml centraliza las rutas de busqueda de librerias — se acabo el -l en cada invocacion. Ver Configuracion del Proyecto.
  • Arquitectura de tres VMs — Akron (bytecode), Artik (witness exclusivo), Lysis (cuerpos circom liftados + loops uniformes). Ver Lysis VM y Pipeline.
  • SHA-256(64) end-to-end — el digest completo es bit-exacto vs sha2::Sha256::digest; el R1CS post-O1 cae dentro del 4 % del output O2 de referencia de circom.

Por que importa

La gran mayoria de aplicaciones ZK en produccion hoy dependen de circomlib — Poseidon, MiMC, EdDSA, BabyJubjub, Num2Bits, comparadores de bits. Hasta beta.20, usar cualquiera de estos desde Achronyme implicaba reescribirlos en .ach. Ahora importas el .circom original y la pipeline de Achronyme lo compila:

parse → analisis de constraints → lower a ProveIR → optimizar → R1CS / Plonkish → Groth16

La salida compilada es compatible con snarkjs (.r1cs + .wtns) y el generador de verificadores Solidity funciona para circuitos provenientes de circom exactamente como lo hace para Achronyme nativo.

Los chequeos de soundness destacados

El compilador oficial de circom no marca signals sin restringir. Achronyme si:

  • E100 — error duro cuando un signal asignado con <-- no tiene === en ningun lado. Este es el bug clasico detras de practicamente todo hallazgo de auditoria en circomlib: una hint de testigo sin constraint correspondiente permite a un prover malicioso escribir cualquier cosa.
  • W101 — advertencia cuando un signal input / signal output nunca participa en un constraint. Sutil y muy comun; muchas veces llega a mainnet.
  • W102 / W103 — advertencias en variantes mas debiles (signal asignado pero no verificado contra una expresion).

La lista completa, con ejemplos renderizados, esta en Diagnosticos.

Conteo de constraints vs circom O2

El benchmark es r1cs_optimization_benchmark en circom/tests/e2e.rs. El pase O1 de Achronyme (constant propagation + linear-combination folding + DEDUCE Gaussian elimination) iguala o supera la mejor configuracion de circom en cada template que testeamos E2E:

TemplateAchronyme O1circom O2Resultado
Num2Bits(8)917−8
LessThan(8)1020−10
MiMCSponge(2, 220, 1)13171320−3
IsZero()22empate
Poseidon(2)240240empate
Pedersen(8)1313empate
EscalarMulFix(253)1111empate
EscalarMulAny(254)23102310empate

La verificacion de prueba Groth16 de extremo a extremo se hizo on-chain para Num2Bits, IsZero, LessThan, Poseidon(2) y EscalarMulAny(254). La lista completa de compatibilidad esta en Limitaciones y Roadmap.

Lo que cambio por dentro

  • Descomposicion del workspace: 19 crates. circom/ es uno de ellos — parser Pratt hecho a mano, analizador de constraints, pipeline de lowering, evaluador de testigo, Groth16 E2E. El split mas amplio renombra vmakron, witnessartik, compilerakronc, y descompone el IR + compilador de constraints en ir-core / ir-forge / zkc. Ver Mapa de Crates.
  • Lysis (tercera VM). 36 opcodes, heap de spill con invariante single-static-store, splits intermedios cuando una sola iteracion excede el presupuesto del frame rolled. El fix cuadratico del do_split del walker baja el instantiate de SHA-256(64) de 7.85 s a 1.87 s. Output R1CS byte-identico antes/despues.
  • Pase iterativo del optimizador R1CS. DEDUCE sparse + Cluster-Gauss + primitivas in-place; 26.5 % mas rapido en el benchmark, con conteos de constraints que igualan o superan el baseline O2 de circom.
  • Nuevos codigos de diagnostico: E100-E102 (soundness de constraints), W101-W103 (advertencia sobre signals no verificados), E200-E211 (lowering), E300-E306 (parser, incluyendo la guarda de profundidad de stack surfaceada por el soak de libFuzzer).
  • Nuevos opcodes / infra: CallCircomTemplate (llamadas en modo VM), TAG_CIRCOM_HANDLE, trait CircomWitnessHandler, trait CircomLibraryHandle, dispatch CircomCallable.
  • Aritmetica en tiempo de compilacion migrada de i64 a BigVal (256-bit complemento a dos), asi que templates que computan 1 << 128 (como CompConstant) funcionan correctamente.
  • Bounds de loop dinamicos (for i in 0..n+1), arrays de componentes (component muls[n]), variables de array 2-D (var M[t][t]), evaluador en tiempo de compilacion con palabra clave function.
  • Inferencia de bit-width cableada via Capture(nBits) — el narrowing de ops de palabra de SHA-256 es exacto (10,473 / 10,473), sin sobre-descomposicion.
  • Suite de soundness adversarial — cada reduccion de constraints esta apareada con un test de falsificacion que confirma que la soundness sobrevive a la optimizacion.

Actualizando desde beta.19

Sin cambios rompedores para codigo .ach existente. Los bloques prove {} siguen funcionando. El bytecode .achb existente compilado bajo beta.19 requiere recompilacion (el formato de ProveIR subio a v5).

Si usabas ach circom en una rama pre-release, [circom].libs ahora vive en achronyme.toml en la raiz del proyecto y toma rutas relativas.

Adonde ir despues

Navigation