Configuración del Proyecto
Referencia del manifiesto de proyecto achronyme.toml.
Cada proyecto de Achronyme puede tener un archivo achronyme.toml en su raíz. Este archivo configura valores por defecto para los comandos del CLI, eliminando la necesidad de pasar banderas repetidamente.
Inicio rápido
ach init mi-circuito
cd mi-circuito
ach run # lee entry desde achronyme.toml
Resolución de configuración
El CLI busca achronyme.toml caminando hacia arriba desde el directorio del archivo de entrada (o el directorio de trabajo actual si no se especifica un archivo). Usa la primera coincidencia.
Los valores se resuelven con esta precedencia:
Banderas CLI (explícitas) > achronyme.toml > valores por defecto
Usa --no-config para deshabilitar la carga de achronyme.toml por completo.
Esquema completo
[project] — Metadatos del proyecto
[project]
name = "mi-circuito" # Requerido. Debe coincidir con [a-zA-Z_][a-zA-Z0-9_-]*
version = "0.1.0" # Requerido. Versionado semántico (MAJOR.MINOR.PATCH)
description = "Un circuito ZK" # Opcional
license = "MIT" # Opcional. Identificador SPDX
authors = ["Alice <a@b.com>"] # Opcional
entry = "src/main.ach" # Opcional. Archivo de entrada por defecto para run/compile/circuit/disassemble
Cuando entry está configurado, puedes omitir la ruta del archivo en los comandos del CLI:
# En lugar de:
ach run src/main.ach
# Simplemente:
ach run
[build] — Configuración de compilación
[build]
backend = "r1cs" # "r1cs" (por defecto) o "plonkish"
optimize = true # Habilitar pases de optimización del IR (por defecto: true)
error_format = "human" # "human" (por defecto), "json", o "short"
| Campo | Equivalente CLI | Por defecto |
|---|---|---|
backend | --backend, --prove-backend | "r1cs" |
optimize | --no-optimize (invertido) | true |
error_format | --error-format | "human" |
[build.output] — Rutas de salida
[build.output]
r1cs = "build/circuit.r1cs" # Ruta por defecto para .r1cs
wtns = "build/witness.wtns" # Ruta por defecto para .wtns
binary = "build/{name}.achb" # Ruta por defecto para .achb ({name} = project.name)
solidity = "" # Si no vacío, genera el verificador Solidity
plonkish_json = "" # Si no vacío, exporta JSON Plonkish
La variable {name} se reemplaza con project.name.
[vm] — Configuración de la máquina virtual
[vm]
prove_backend = "r1cs"
max_heap = "256M"
stress_gc = false
gc_stats = false
# Las capacidades del host se deniegan salvo que se concedan explicitamente.
allow_read = ["datos"]
allow_write = ["salida"]
allow_connect = ["127.0.0.1:9000"]
allow_listen = []
# Limites de concurrencia estructurada y E/S acotada.
max_tasks = 64
max_resources = 32
max_task_scopes = 16
max_pending_native_requests = 32
max_retained_task_results = 64
max_channels = 32
max_channel_operations = 128
blocking_workers = 4
blocking_queue_capacity = 64
| Campo | Equivalente CLI | Por defecto |
|---|---|---|
prove_backend | --prove-backend | "r1cs" |
max_heap | --max-heap | ilimitado |
stress_gc | --stress-gc | false |
gc_stats | --gc-stats | false |
allow_read | --allow-read repetible | [] |
allow_write | --allow-write repetible | [] |
allow_connect | --allow-connect repetible | [] |
allow_listen | --allow-listen repetible | [] |
max_tasks | --max-tasks | 65535 |
max_resources | --max-resources | 65535 |
max_task_scopes | --max-task-scopes | 1024 |
max_pending_native_requests | --max-pending-native-requests | 4096 |
max_retained_task_results | --max-retained-task-results | 4096 |
max_channels | --max-channels | 4096 |
max_channel_operations | --max-channel-operations | 65535 |
blocking_workers | --blocking-workers | 4 |
blocking_queue_capacity | --blocking-queue-capacity | 64 |
Las rutas relativas de allow_read y allow_write se resuelven desde la raíz del proyecto. Si pasas al menos una bandera repetible de capacidad en el CLI, esa lista reemplaza la del manifiesto durante la invocación. Los permisos de red aceptan endpoints numéricos IP:PORT; no implican resolución de hostnames.
[proving] — Confianza de las claves de prueba
La generación de pruebas falla de forma cerrada por defecto. Elige exactamente una fuente de claves cuando un programa deba crear una prueba:
[proving]
# Produccion: carga artefactos derivados de una ceremonia desde este directorio.
trusted_key_dir = "ceremony/keys"
# Solo desarrollo; no combinar con trusted_key_dir.
# insecure_dev_setup = true
| Campo | Equivalente CLI | Por defecto |
|---|---|---|
trusted_key_dir | --trusted-key-dir <DIR> | no configurado |
insecure_dev_setup | --insecure-dev-setup | false |
trusted_key_dir e insecure_dev_setup = true son mutuamente excluyentes. Las banderas de confianza del CLI tienen precedencia sobre el manifiesto. Sin ninguna fuente configurada, la ejecución puede compilar circuitos y verificar artefactos separados, pero cualquier intento de generar una clave de prueba falla en vez de crear silenciosamente un setup local inseguro.
[circuit] — Configuración del circuito
[circuit]
prime = "bn254" # Campo primo: "bn254" (por defecto), "bls12-381", o "goldilocks"
El campo prime es el equivalente en el manifiesto de la bandera global --prime. Si --prime se pasa explícitamente en el CLI, sobrescribe este valor.
Las entradas públicas y testigo no se configuran aquí — provienen de las declaraciones public y witness en el código fuente (o de las banderas CLI --public / --witness). Esta sección se valida con deny_unknown_fields, por lo que cualquier otra clave (como public o witness) se rechaza con un error duro.
[circom] — Rutas de búsqueda de bibliotecas Circom
[circom]
libs = ["vendor/circomlib/circuits", "third_party/circuits"]
Las rutas se resuelven relativas a la raíz del proyecto (el directorio que contiene achronyme.toml). Cada subcomando que parsea fuentes .circom — ach circom, ach run, ach circuit — buscará en cada entrada de libs al resolver directivas include "file.circom";.
Las banderas CLI -l/--lib se suman a la lista TOML en lugar de reemplazarla, por lo que ach circom -l extra/ extiende libs para una invocación puntual sin editar el manifiesto.
# Con libs = ["vendor/circomlib/circuits"] en achronyme.toml:
ach circom circuit.circom # solo se busca en vendor/
ach circom circuit.circom -l extra/circuits # se busca en vendor/ y en extra/
Usa esta sección para versionar dónde viven tus dependencias de circom en lugar de dispersar banderas -l por scripts.
Ejemplo mínimo
[project]
name = "multiplicar"
version = "0.1.0"
[build]
backend = "r1cs"
Ejemplo completo
[project]
name = "merkle-prover"
version = "0.2.0"
description = "Circuito de prueba de membresía en árbol Merkle"
license = "MIT"
entry = "src/main.ach"
[build]
backend = "r1cs"
optimize = true
error_format = "human"
[build.output]
r1cs = "build/circuit.r1cs"
wtns = "build/witness.wtns"
solidity = "build/Verifier.sol"
[vm]
prove_backend = "r1cs"
max_heap = "512M"
allow_read = ["datos"]
allow_write = ["build"]
max_tasks = 64
max_resources = 32
max_channels = 16
max_channel_operations = 64
[proving]
trusted_key_dir = "ceremony/keys"
Validación
El CLI valida el archivo TOML al cargarlo:
project.namedebe coincidir con[a-zA-Z_][a-zA-Z0-9_-]*project.versiondebe ser semver válido (MAJOR.MINOR.PATCH)build.backenddebe ser"r1cs"o"plonkish"build.error_formatdebe ser"human","json", o"short"vm.prove_backenddebe ser"r1cs"o"plonkish"vm.max_heapdebe ser una cadena de tamaño válida si no está vacíaproving.insecure_dev_setupyproving.trusted_key_dirno pueden configurarse a la vezproving.trusted_key_dirno puede estar vacíocircuit.primedebe ser"bn254","bls12-381", o"goldilocks"project.entrydebe terminar en.acho.achb- Las entradas
circom.libsdeben existir (resueltas en tiempo de carga, relativas a la raíz del proyecto) - Los campos desconocidos son rechazados (compatibilidad futura vía secciones explícitas)