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

Tipos y Valores

Sistema de tipos y representación de valores en Achronyme.

Achronyme es de tipado dinámico. Todos los valores se representan como palabras de 64 bits etiquetadas con una etiqueta de 4 bits y un payload de 60 bits.

Tipos

TipoEjemplosDescripción
Int42, -7Entero con signo de 60 bits (-2^59 a 2^59-1)
Booltrue, falseValores booleanos
String"hello"Cadenas UTF-8 (asignadas en el heap)
List[1, 2, 3]Colecciones ordenadas
Map{"a": 1, "b": 2}Mapas clave-valor
Field0p42, 0pxFF, 0pb1010Elemento del campo escalar BN254
BigInt2560i256xFF, 0i256d42Entero sin signo de 256 bits (solo VM)
BigInt5120i512xFF, 0i512d42Entero sin signo de 512 bits (solo VM)
Functionfn(x) { x + 1 }Funciones y closures de primera clase
Proofresultado de prove { }Objeto de prueba Groth16 o PlonK
NilnilAusencia de valor

Enteros

Los enteros son valores con signo de 60 bits almacenados en línea (sin asignación en heap). Rango: -576460752303423488 a 576460752303423487.

let x = 42
let y = -7
let big = 100000000000

Si una operación aritmética desborda el rango i60, se genera un error en tiempo de ejecución. Usa literales de campo 0p cuando necesites aritmética modular de campo (ej., 0p42).

Booleanos

let yes = true
let no = false

En circuitos, true se mapea al elemento de campo 1 y false al 0.

Cadenas

let greeting = "hello, world"
let empty = ""

Listas

let nums = [1, 2, 3]
let mixed = [1, "two", true]
let nested = [[1, 2], [3, 4]]

Mapas

let person = {"name": "Alice", "age": 30}

Elementos de Campo

Elementos del campo escalar BN254 para operaciones criptográficas. Internamente en forma Montgomery. Se crean usando el prefijo 0p, que funciona como 0x para hexadecimal:

let a = 0p42         // literal de campo decimal
let b = 0pxFF        // literal de campo hexadecimal
let c = 0pb1010      // literal de campo binario
let d = 0p21888242871839275222246405745257275088548364400416034343698204186575808495617  // decimal grande

let sum = a + b
let prod = a * b
let inv = 0p1 / a    // inverso modular

Int y Field no se pueden mezclar en operaciones aritméticas. 0p3 + 5 es un error en tiempo de ejecución — usa 0p3 + 0p5 en su lugar.

Los elementos de campo son esenciales para la programación de circuitos — todos los valores de circuito son elementos de campo internamente.

BigInt (solo VM)

Enteros sin signo de ancho fijo para operaciones criptográficas. Dos anchos: 256 bits (4 limbs) y 512 bits (8 limbs). Aritmética no modular con errores de desbordamiento.

Literales

Los literales BigInt usan el prefijo 0i, seguido del ancho y la base:

let a = 0i256xFF           // 256 bits hexadecimal
let b = 0i256d255          // 256 bits decimal
let c = 0i256b11111111     // 256 bits binario
let d = 0i512x1234         // 512 bits hexadecimal

Funciones constructoras

let a = bigint256(42)       // desde entero
let b = bigint256("0xFF")   // desde cadena hexadecimal
let c = bigint512(100)      // 512 bits desde entero

Aritmética

Los operadores estándar funcionan entre BigInts del mismo ancho:

let x = 0i256d10
let y = 0i256d20
let sum = x + y              // 30
let diff = y - x             // 10
let prod = x * y             // 200
let q = y / x                // 2
let r = 0i256d25 % 0i256d7   // 4
let p = 0i256d2 ^ 10         // 1024

Seguridad de tipos

BigInt no se puede mezclar con Int, Field, ni con un BigInt de diferente ancho:

// Todos estos son errores en tiempo de ejecución:
// bigint256(1) + 1           -- BigInt + Int
// bigint256(1) + 0p1         -- BigInt + Field
// bigint256(1) + bigint512(1) -- incompatibilidad de ancho

Operaciones a nivel de bits

bit_and(a, b)     // AND a nivel de bits
bit_or(a, b)      // OR a nivel de bits
bit_xor(a, b)     // XOR a nivel de bits
bit_not(a)        // NOT a nivel de bits
bit_shl(a, n)     // desplazamiento a la izquierda (error si los bits desbordan)
bit_shr(a, n)     // desplazamiento a la derecha

let bits = to_bits(a)          // lista de 0/1 (LSB primero)
let val = from_bits(bits, 256) // reconstruir desde bits

typeof

typeof() devuelve "BigInt256" o "BigInt512" para valores BigInt.

Nil

let nothing = nil

nil representa la ausencia de un valor. Las funciones sin una sentencia return devuelven nil.

Namespaces Estáticos

Usa la sintaxis Tipo::MIEMBRO para acceder a constantes a nivel de tipo:

// Límites de enteros
print(Int::MAX)      // 576460752303423487 (2^59 - 1)
print(Int::MIN)      // -576460752303423488 (-2^59)

// Constantes de campo
let zero = Field::ZERO
let one = Field::ONE
let order = Field::ORDER   // Módulo BN254 Fr como string

// Constructor BigInt
let val = BigInt::from_bits(bits, 256)

Consulta Métodos y Namespaces Estáticos para la referencia completa.

Vinculaciones de Variables

let x = 42          // vinculación inmutable
mut y = 0           // vinculación mutable
y = y + 1           // reasignación (solo para mut)

let crea una vinculación inmutable. mut crea una vinculación mutable que puede ser reasignada.

Anotaciones de Tipo

Achronyme soporta anotaciones de tipo opcionales en vinculaciones de variables y firmas de funciones. En modo circuito, las anotaciones habilitan verificación de tipos en tiempo de compilación y optimización de restricciones. En modo VM, las anotaciones se parsean y aceptan pero la ejecución sigue siendo dinámica.

let x: Field = 0p42
let flag: Bool = true
mut counter: Field = 0p0

Consulta Anotaciones de Tipo para la referencia completa en contexto de circuitos.

Navigation