Rand Protocol
Documentación
Desarrolladores

Desarrolladores

Los cinco repositorios, el stack, la zkVM de Rand y sus hitos, las fases del shielded pool, el trabajo de v0.5 y las versiones posteriores, hasta v0.6.8 en la chain 20, la estructura del código fuente del fullnode, lo que está especificado pero no entregado, y cómo compilar, probar y contribuir.

Rand es de código abierto. El nodo completo, el explorador, el puente, la investigación sobre pruebas y los clientes de wallet viven cada uno en su propio repositorio en GitHub. Lea el código, ejecute las pruebas, envíe parches. Esta página es el mapa: dónde vive cada componente, con qué está construido, hasta dónde ha llegado el sistema de pruebas y dónde se detiene hoy.

Repositorios

repositorioqué contienelenguaje
randprotocol/fullnodeNodo completo de referencia y wallet: HotStuff BFT encadenado, red libp2p, el pool blindado de notas RAND, el verificador de pruebas del zkVM, JSON-RPC, la CLI de wallet rand y el probador delegado rand-prover.Rust
randprotocol/randscan.orgExplorador de bloques detrás de randscan.org: un indexador axum con una API REST y WebSocket sobre PostgreSQL, y un frontend en Next.js.Rust · TypeScript
randprotocol/bridgePuente de guardianes para USDT y USDC desde Ethereum, Binance Smart Chain, Tron y Solana: los contratos de custodia, el formato de atestación compartido y sus vectores de prueba.Solidity · Rust
randprotocol/zkp-circuitsRecorridos de sistemas de pruebas (Groth16 frente a STARK, pool blindado, firmas de anillo, mezclador), research/, el zkVM de referencia de Rand, recursion/, la VM de recursión, la cadena de herramientas de invitados y los dos traductores, y los kernels CUDA. La compilación del nodo completo necesita este repositorio clonado a su lado como circuits/.Rust
randprotocol/clientsLos clientes de wallet: escritorio, web, iOS y Android.Rust · Swift · Java · JavaScript

La pila

Rust de extremo a extremo. Rand es su propia cadena: un nodo HotStuff BFT con una capa de difusión gossip libp2p, un pool de notas totalmente blindado como libro mayor, firmas y cifrado de notas poscuánticos, y el zkVM de Rand para la computación confidencial, todo en el repositorio fullnode. El sistema de pruebas en sí es la parte bajo investigación activa, más abajo.

capaqué se ejecuta
ConsensoHotStuff BFT encadenado, quórums ponderados por stake, confirmación de tres cadenas
Redlibp2p: TCP, Noise, Yamux, gossipsub, Kademlia, mDNS en redes locales
Libro mayorPool blindado de notas: árbol Poseidon2 de profundidad 32, conjunto de nullifiers, un paquete de activos ocultos de 4 entradas y 4 salidas por transacción (2 entradas y 2 salidas hasta la chain 13); desde la chain 17, una segunda prueba de autenticación de nivel 10 junto a la prueba del paquete (autorización dividida); desde la chain 18, sobres de nota de 1.860 bytes con un memo cifrado
TokensRPL: un token es una entrada del registro del libro mayor con un id rpl1…, no un contrato; se mueve como notas en el mismo pool
StakingRegistro público de validadores: fianza desde un paquete, desvinculación de dos épocas, épocas de 1.000 bloques; desde la chain 20, un nuevo validador es admitido por votación del conjunto
Computación confidencialzkVM de Rand: RV32IM bajo un STARK por lotes de Plonky3, FRI con ocultación ZK, conjunto de restricciones 8; desde la chain 18, una llamada declara un límite de gas que el circuito hace cumplir y paga por gas y por KiB; desde la chain 20, un programa conserva estado en celdas y mantiene valor en una bóveda (RPL-2)
CriptografíaDilithium2 · ML-KEM-768 · Poseidon2 · BLAKE3 · ChaCha20-Poly1305
AlmacenamientoUna RocksDB por nodo, confirmaciones con fsync, comprobación de integridad al arrancar; poda opcional del historial (--prune-history 24h), con nodos de archivo que lo conservan todo
PuenteBloqueos atestados por guardianes en cuatro cadenas, con un quórum de cofirmas Dilithium2 en cada acuñación; un activo puenteado es una nota en el mismo pool
LenguajeRust en todo el sistema; Solidity para el puente, TypeScript para el explorador

Una relación para todos los programas

La relación de ejecución universal R_exec del whitepaper existe como código: rand_zkvm, una máquina RV32IM probada bajo un único STARK por lotes sobre Plonky3 en el cuerpo Goldilocks. Demuestra que alguna traza ejecutó el programa hc hasta estas salidas públicas sobre entradas comprometidas mediante un H_IN con sal, y nada acerca del programa es jamás un parámetro del verificador. Publicar un programa confidencial significa registrar un hash, nunca generar un circuito a medida.

El sistema de pruebas es transparente, sin configuración de confianza (trusted setup) ni curva de emparejamiento, y su supuesto es una función hash resistente a colisiones. Se espera que todo otro componente que toque pruebas converja en este crate en lugar de desarrollar el suyo propio. El crate vive en zkp-circuits/research y está incorporado (vendored) en el nodo completo en el conjunto de restricciones 8 (circuits aeacf31, fullnode v0.6.7 y v0.6.8). Las tablas y mediciones siguientes describen el conjunto de restricciones 5 (hito M4.2) salvo que una línea nombre un conjunto posterior; están tomadas de docs/zkvm.md, docs/zkvm-milestones.md y docs/confidential.md del nodo completo a fecha de 2026-09-13, y las mediciones se citan tal como se midieron en un portátil Apple Silicon, no como objetivos.

Ocho tablas en buses con nombre, una novena bajo demanda

Un compromiso, una apertura FRI. Las tablas nunca se llaman entre sí; intercambian hechos a través de buses LogUp con nombre (PROGRAM, PROGRAM_WORD, MEMORY, ALU, POSEIDON2, INPUT_DIGEST, INPUT_READ, KECCAK y las consultas de rango y de nibble) y el verificador comprueba que cada bus se equilibra globalmente. El grado máximo de restricción de cada tabla está fijado por una prueba bajo el tope de 8 que permite el factor de expansión (blowup) de FRI.

tablatipofunción
programtestigoPalabras de instrucción en bruto decodificadas en el circuito desde M3.4, digeridas por la cpu en hc
cputestigoUna fila por ciclo, más filas de digest que absorben el programa en hc y las entradas con sal en H_IN
memorytestigoRegistros y RAM en una sola tabla, ordenada por (space, addr, ts); acceso por subpalabra desde M2.5
alutestigoAritmética en extremidades de byte, desplazamientos, comparaciones; multiplicación y división RV32M desde M2.6
rangepreprocesada · 256 filasComprobaciones de rango y la consulta de potencias de dos
nibblepreprocesada · 256 filasAND, OR, XOR de 4 bits; un acierto es en sí una comprobación de rango sobre ambos operandos
poseidon2testigoUna fila por ronda de permutación en bloques de 32 filas; sirve al bus POSEIDON2 y a ambos digests
inputtestigo · desde M4.1Una fila por palabra de entrada privada; sirve a INPUT_DIGEST e INPUT_READ, de modo que una lectura no puede escapar al compromiso
keccaktestigo · opcionalKeccak-f[1600] en bloques de 32 filas, presente solo en una prueba cuyo invitado llamó a KECCAK (M4.2)

Desde entonces han llegado tres conjuntos de restricciones. El conjunto 6 añadió una tabla public obligatoria para la entrada pública de un programa en el momento del despliegue, vinculada al digest sin sal H_PUB, y una tabla opcional sha256 junto a keccak. El conjunto 7 (chain 16) ciega cada terminal LogUp en un nuevo bus BLIND y fija un suelo de 2⁷ filas en cada tabla declarada, y añade la llamada al sistema POSEIDON2_LEN, acotada por longitud. El conjunto 8 (chain 18) añade una columna GAS a la tabla cpu y un valor público, el GAS_LIMIT declarado.

Qué revela una prueba

Público: el hash de código hc (ocho palabras de digest en el circuito), el compromiso de entrada con sal H_IN (ocho palabras), el nivel de gas y ocho palabras de salida. Desde el conjunto de restricciones 6 también H_PUB, el digest de la entrada pública, y desde el conjunto de restricciones 8 el límite de gas declarado. La cabecera de la prueba declara las alturas de las tablas Keccak y SHA-256, de modo que muestra si una llamada calculó hashes y, por encima del suelo de 2⁷, aproximadamente cuántos.

Oculto: las entradas privadas (H_IN lleva sal, por lo que es tan ocultante como vinculante); cada palabra de instrucción, porque el verificador comprueba hc y nunca el programa; cada valor de registro y de memoria; cada bifurcación tomada; el recuento exacto de ciclos y el gas exacto usado; y qué llamadas al sistema se ejecutaron, salvo lo que muestran las alturas de las dos tablas de hash.

El nivel es público en cada prueba porque el tamaño de un STARK ya revela la altura de su traza; ocultar el índice no aportaría nada. hc es vinculante, no ocultante: véase dónde se detiene hoy.

Medido, en el conjunto de restricciones 5

FRI80 consultas · 20 bits de PoW · blowup 8 · aridad 8 · ZK activado; 260 bits conjeturados, unos 86 demostrados. El reajuste a 27 consultas de M2 fue revertido por la auditoría del 2026-09-12
Llamadaprivate_payment en el nivel 10: unos 7 s de prueba, unos 1,2 MB de prueba con 80 consultas (435 KB con 27), frente a 21,6 s y 892 KB en M1
TransferenciaEl invitado de paquete 2 entradas y 2 salidas de las chains hasta la 13: 3.811 palabras, unos 9.160 ciclos, nivel 14; unos 100 s de prueba, unos 1,3 MB de prueba. El invitado de activos ocultos de 4 entradas y 4 salidas de la chain 14 está fijado al mismo nivel: unos 100 s, unos 1,42 MB
VerificaciónUnos 16 ms con una clave caliente; la primera verificación con una nueva clave (nivel, alturas) toma unos 230 ms
BloquePresupuesto de 4 MiB y tope de prueba de 2 MiB: unas tres transferencias blindadas por bloque con 80 consultas

Portátil Apple Silicon, compilación release. La división de tablas de bytes de M2.3 fue lo que redujo el tiempo de prueba; el perfil de 80 consultas fue lo que volvió a aumentar el tamaño de la prueba. La clave del verificador es independiente del contenido del programa, indexada por nivel y por las alturas de programa, entrada y keccak declaradas en la prueba, de modo que un nodo calienta una sola clave y la reutiliza.

Los conjuntos posteriores movieron los tamaños. Bajo el constraint set 7, una prueba de tier 10 ocupa 1.367.688 bytes en el perfil de producción, y una prueba de tier 10 que incluye Keccak ocupa 3.283.898 (medido el 2026-09-28). Desde la chain 17, una transferencia lleva dos pruebas: la prueba del bundle de tier 14, de aproximadamente 1,49 MB, y la prueba de autorización de tier 10, de aproximadamente 1,37 MB y unos 7 s de tiempo de prueba. El genesis de la chain 20 fija un bloque de 20 MiB y un límite de prueba de 4 MiB, y una llamada no puede superar el tier 14.

Tres destinos, un circuito

Solo RISC-V se ejecuta de forma nativa. Los programas de Solidity y de Solana se ejecutan en un guest intérprete dentro de la misma relación, con su bytecode como entrada, o bien se traducen fuera de la cadena a programas RISC-V cuyas salidas coinciden con las del intérprete palabra por palabra. Los opcodes costosos requieren tablas de coprocesador dedicadas en lugar de una simulación bit a bit.

destinorutacoprocesadores
RISC-VNativo. RV32IM, ya sea ensamblado a mano mediante asm.rs o compilado en Rust no_std para riscv32im-unknown-none-elf, cargado como binario plano desde M4.1, o construido desde Rust o C por rand-guest en el contenedor de imagen (Desplegar un programa en Rust)Poseidon2 (y POSEIDON2_LEN desde el set 7); Keccak-f[1600] desde M4.2; SHA-256 desde el set 6
Soliditysolc --bin-runtime a bytecode EVM, y luego el guest intérprete evm.bin (con el bytecode como entrada) o evm2rv, que traduce el bytecode a C que rand-guest compila en una imagen RV32IM con las mismas salidas (El transpilador de Ethereum)Keccak-256 (tabla incluida), aritmética modular de 256 bits, ECRECOVER, syscalls de testigos de Merkle para el almacenamiento
Solana / SVMun ELF de sBPF, ejecutado por el guest intérprete sbpf.bin o traducido por sbpf2rv a una imagen RV32IM con las mismas salidas (El transpilador de Solana)SHA-256, verificación Ed25519, multiplicación de 64 bits

Hitos

El hito 1 demostró la máquina de propósito general. El hito 3 la convirtió en un pool protegido: una transferencia con pertenencia dentro del circuito se prueba bajo R_exec, y el verifier comprueba hc sin ver nunca una palabra del programa. El hito 4 es la compatibilidad: su loader, el compromiso de entrada y la tabla de Keccak se publicaron como los constraint sets 4 y 5, y la tabla de SHA-256 con el set 6. Los guests intérpretes de EVM y sBPF, la toolchain rand-guest y los dos traductores están construidos. La transferencia ERC-20 se ha probado, en una máquina de 128 GB; la prueba de SPL Token, en el tier 20, no. El hito 5 es la VM de recursión que sustenta la agregación de bloques, que está construida y desactivada en todas las cadenas. Los constraint sets 7 y 8 siguieron a las revisiones de septiembre y al modelo de gas.

idalcancecriterio de salidaestado
M1Cinco tablas, ISA base RV32I, HALT/WRITE_OUTPUT/READ_INPUT, ZK activado, relleno por tiers, ensamblador, emuladorfib, memcpy, bubble_sort, alu_mix y balance_check se prueban y verifican; todas las pruebas de trampa se rechazanhecho. 44 pruebas; una revisión posterior cerró cinco brechas de solidez en una sola oleada
M1.5Viewing keys: un guest de transferencia protegida de una entrada y una salida, envolturas de notas bajo ML-KEM-768 y ChaCha20-Poly1305, divulgación con alcance por parte y por transacción, un libro mayor simuladoUna transferencia se prueba en el tier 12 y el libro mayor la acepta; cada alcance de divulgación abre exactamente sus propias filas; una viewing key no puede gastarhecho. No incorporado al nodo
M2Caché de claves del verifier, FRI reajustado a un objetivo conjeturado de 100 bits, la tabla de bytes dividida en rango y nibble, cargas y almacenamientos de sub-palabra, la extensión RV32MEntregado con un alcance menor al previsto: el loader de binario plano y un enlace más firme de READ_INPUT se trasladaron a M4.1hecho. fib en el tier 10: prueba de 892 KB a 268 KB, 21,6 s a 3,1 s de tiempo de prueba, 2,17 s a 16 ms en la primera verificación. Constraint set 3, un hard fork
M3Chip y syscall de Poseidon2; NOTE_COMMIT, NULLIFY y MERKLE_VERIFY como rutinas del guest sobre él; el compromiso gastado sacado de la salida pública; la tabla de programa como testigo con hc digerido dentro del circuitoLa relación de transferencia se prueba bajo R_exec con pertenencia dentro del circuito, y verify(hc, proof) nunca ve una palabra del programahecho. Guest de transferencia: 4.554 instrucciones, 4.903 ciclos, tier 14. El recorrido de Merkle es ahora un bucle contado, de modo que el tamaño del programa ya no escala con la profundidad del árbol
CUDABackend de prover en GPU: NTTs y compromisos de Merkle con Poseidon2 como kernels CUDA tras los traits Dft y Mmcs de Plonky3; rand send, call y deploy aceptan --cudaCada guest se prueba y verifica mediante el gemelo de referencia en Rust puro y el driver simulado; el verifier de CPU no distingue los backendshecho; primera ejecución en hardware el 2026-09-28. En una NVIDIA H100 los kernels se compilan a PTX para sm_80 y sm_90 y coinciden con la referencia de CPU y de Plonky3. Queda pendiente la nueva medición de producción en un nodo de GPU de la flota. Una llamada CUDA no puede sellar una envoltura de entrada, porque la sal nunca sale del prover
M4.1El loader de binario plano y los primeros guests compilados en Rust no_std para riscv32im-unknown-none-elf; el compromiso de entrada salado H_IN con su propia tabla de entrada, de modo que READ_INPUT es una búsqueda contra un vector comprometidoUn guest construido con la toolchain estándar se carga, se prueba y se verifica; dos lecturas de un mismo índice de entrada coinciden y las entradas quedan ligadas a H_INhecho. Incorporado el 2026-09-11 como constraint set 4: 26 valores públicos, ocho tablas, un hard fork
M4.2Una tabla de coprocesador Keccak-f[1600] escrita a mano y el syscall KECCAK, presentes en una prueba solo cuando el guest los usó; altura de memoria declarada en la prueba; una clave del verifier indexada por cuatro componentes; FRI de vuelta a 80 consultas tras la auditoría del 2026-09-12keccak256 se prueba como guest compilado, y una prueba sin la tabla tiene exactamente la misma forma que una de M4.1hecho. Incorporado el 2026-09-12 como constraint set 5, un hard fork. Una prueba con Keccak es unos 1,9 MB mayor, por encima del límite predeterminado de 2 MiB. Una cadena cuyo genesis eleve el límite admite una: la chain 13 (8 MiB) aceptó una llamada con Keccak de 3,41 MB el 2026-09-19, y el límite de la chain 20 es de 4 MiB
M4.3 · M4.4Intérpretes guest de EVM y sBPF compilados a RV32IM, con el bytecode ajeno como entrada; una tabla de coprocesador SHA-256 junto a Keccak; después la toolchain rand-guest y los traductores evm2rv y sbpf2rv (2026-09-18)Una transferencia ERC-20 y una Transfer de SPL se prueban cada una bajo R_execconstruido; una prueba de salida realizada. evm.bin (18.009 palabras) y sbpf.bin (8.317) ejecutan los vectores de ERC-20 y de SPL Token, y las imágenes traducidas coinciden con ellos palabra por palabra. El transfer de ERC-20 se probó en el tier 18 en un droplet de 128 GB el 2026-09-19 (pico de 85,0 GB, 53,8 min); la prueba de SPL Token, en el tier 20, se extrapola en unos 330 GB y no se ha realizado (memoria de pruebas). Ninguna es invocable en la cadena: una llamada está limitada al tier 14
M5La VM de recursión (rVM): una máquina de 24 instrucciones nativa de Goldilocks cuyos programas verifican pruebas de Rand zkVM, un programa de agregación genérico en N por cada forma de prueba interna, una separación de backends CPU y CUDA, y un auto-verifier (M5.1 a M5.4, del 2026-09-13 al 2026-09-16)50 pruebas reales de bundle de producción aceptadas y 50 manipuladas rechazadas en el paso indicado; una prueba rVM del programa verifier sobre una prueba de bundle real se verifica de forma nativa (perfil de prueba)construido; las pruebas de producción requieren una máquina grande. Incorporado como crates/randprotocol-rvm. La agregación en la cadena está integrada y desactivada en todas las cadenas (más abajo)
set 7Cada terminal de LogUp con blinding; cada tabla declarada con un mínimo de 2⁷ filas; comprobaciones de rango de 32 bits en las palabras de entrada, públicas y de sal; el syscall POSEIDON2_LEN; una corrección de JALR; claves del verifier saladas a partir de key_derivation_v2Las correcciones de las revisiones de zkVM del 2026-09-27 y 28 que modifican una clave del verifier, aplicadas en un solo cortehecho. Fullnode v0.6.1, chain 16 (2026-09-28), un hard fork
set 8El medidor de gas: una columna GAS en la tabla cpu y un GAS_LIMIT público, con GAS ≤ GAS_LIMIT probado dentro del circuito; el gas exacto de la ejecución permanece privadoUna llamada paga por el límite que declara, y cada prueba de bundle declara el mismo límite fijadohecho. Fullnode v0.6.7-rc1, chain 18 (2026-09-29), un hard fork. bundle_gas_limit es 20.479

Fases del pool protegido

El libro mayor del fullnode se incorporó en tres fases, cada una un hard fork (docs/shielded.md §7). S1 sustituyó el libro mayor de cuentas por un pool de notas; S3 devolvió el bridge como notas y se incorporó primero; S2 añadió el staking encima. Las tres están en main y en la cadena actual.

Cada fila bajo S2 es una bifurcación dura (hard fork) del trabajo v0.5. Se tomaron juntas como una única cadena nueva, la cadena 14, cortada el 2026-09-20 a partir de la compilación b3c594c y etiquetada v0.5 ese mismo día tras un viaje de ida y vuelta de zUSD en vivo a través de los endpoints de origen desplegados. La cadena 15, activa desde el 2026-09-26 con v0.5.8 y posteriores, incorporó todo ello, con las correcciones de las auditorías v4 y v5 sujetas al génesis activadas: un faucet con lista de permitidos y presupuesto por época, activación diferida de bonos, un tope al peso del stake, registros ligados al génesis, consensus_domain 1, las reglas de bridge v2 y el tope del registro de tokens, comisión de registro quemada y cota de 2⁶³ para las notas. La cadena 20, activa desde el 2026-10-01 06:17 UTC con v0.6.8 (c9c9bd3c), una bifurcación dura (hard fork) de la cadena 19, conserva todo ello y añade el trabajo de las versiones v0.6, enumerado a continuación.

idalcancecriterio de salidaestado
S1El pool en sí: notas, paquetes probados de 2 entradas y 2 salidas, un árbol de compromisos Poseidon2 de profundidad 32 y un conjunto de nullifiers, la wallet rand con un prover local, el RPC redactadoUna transferencia blindada entre wallets, una carrera de doble gasto entre dos validadores y un despliegue con llamada pagados mediante paquetes pasan en la suite del clústerhecho. En vivo en la flota pública desde la cadena 6 (2026-09-12)
S3El bridge como notas: un activo puenteado lleva el índice de activo del registro, una attestation deposita una nota que la cadena calcula por sí misma, BridgeBurn es la única transacción de dos paquetes; sobres sellados para las entradas de las llamadas, abribles por quien llama, con una clave por llamada o por un auditor designadoUn activo puenteado se acuña, se gasta y se quema como nota; quien llama puede revelar sobre qué se ejecutó un programa sin publicarlo, y rand open-call comprueba la apertura contra H_INhecho. Fue lo primero en aterrizar. Las cadenas 9 a 13 dejaron la sección del bridge fuera de su génesis; todas las cadenas desde la 14 la incluyen. Desde la cadena 14, una quema es un solo paquete, no dos
S2Staking en la cadena blindada: un registro público de validadores, Bond a partir de la quema de un paquete, Unbond a lo largo de dos épocas, Withdraw hacia una nota en una dirección de pago, épocas de 1,000 bloques que recalculan el conjunto, y una auditoría de suministro sobre el registro y el poolUn quinto validador se registra, hace bond y propone a partir de la siguiente época; otro hace unbond y sale del conjunto y retira hacia una nota que su wallet de pago gasta; ambos pasan en la suite del clústerhecho. El árbol de compromisos local de la wallet llegó el 2026-09-21: una wallet calcula sus propios testigos y ya no le dice a su nodo qué hoja gasta
RPLEl estándar de tokens (docs/tokens.md): un token es una entrada de registro en el libro mayor con un id bech32m rpl1… de 62 caracteres; la creación no requiere permisos a cambio de una comisión de registro en RAND; la autoridad de acuñación se fija en el registro como ninguna, una clave o el bridge; los símbolos no son únicos; rand token create, mint, set-authority, burn, info, list, y rand_getTokens, rand_getToken, rand_getTokenSupplyUn token se registra, se acuña, se envía con rand send --asset y se quema como notas en el mismo poolen funcionamiento desde la cadena 14 (v0.5). En la cadena 20 la comisión de registro es de 1 RAND, quemado, el registro contiene como máximo 4,096 tokens, y el génesis incluye zUSD en el índice 1
RPL-2Estado de los programas (docs/program-state.md): celdas por programa (una clave de 8 palabras que apunta a un valor de 8 palabras, dentro de la raíz de estado), una bóveda pública por activo, un token acuñado solo por su programa, y la acción Invoke (Action 33), una llamada que declara las celdas que lee y escribe y las notas que paga; rand program invoke, state, vault, y rand_getProgramCell, rand_getProgramCells, rand_getProgramVaultEl libro mayor aplica una transición solo si cada lectura declarada sigue vigente y la bóveda cubre cada pago; una lectura obsoleta se rechaza y se vuelve a probaren funcionamiento desde la cadena 20 (v0.6.8). cell_fee de 0.01 RAND por celda creada; como máximo 8 lecturas, 8 escrituras y 4 pagos por invoke. Véase Programas
paquete de activo ocultoCada transacción lleva exactamente un paquete de 4 entradas y 4 salidas en lugar del de 2 entradas y 2 salidas: las ranuras 0–1 contienen el activo privado (valores ficticios en una transferencia solo de RAND), las ranuras 2–3 son siempre RAND y pagan la comisión. La transferencia de tokens de dos paquetes y la quema de bridge de dos paquetes desaparecenUna transferencia de RAND y una transferencia de cualquier token RPL publican la forma idéntica, de modo que el activo que se movió queda ocultoen funcionamiento desde la cadena 14 (v0.5). Nivel 14, unos 100 s para probar, unos 1.42 MB de prueba en las cadenas 14 y 15; hc_bundle 83d3a370… allí. Las cadenas 18 a 20 fijan el guest de paquete v3, hc_bundle 60af094a…, unos 1.49 MB
vinculación de la transacciónCada prueba de paquete se hace sobre H("rand-tx-bind-1", chain_id ‖ tx with proofs blanked), y se verifica contra él, transportado en el segmento de entradas públicasUna prueba copiada y sin modificar que se reenvía con un destino, un validador o un memo cambiados es rechazadaen funcionamiento desde la cadena 14 (v0.5). Desde la cadena 20 (binding_domain 1) la preimagen es H("rand-tx-bind-2", genesis hash ‖ chain_id ‖ …), y cada mensaje de acción firmado lleva también el hash del génesis, de modo que nada probado o firmado para una cadena se verifica en otra
B1–B4Endurecimiento del bridge (docs/bridge.md §§14–20). B1: un tope diario de acuñación por respaldo, y una clave de pausa que solo puede pausar (reanudar requiere el quórum PQ). B2: una marca de tiempo de bloque más de 60 s posterior a la de su padre es inválida, y un validador no vota por un bloque más de 15 s adelantado respecto a su reloj, por lo que los validadores necesitan NTP. B3: un quórum de cofirmas Dilithium2 en cada acuñación. B4: listar un token puenteado o un respaldo después del génesis bajo el quórum de guardianes PQ, sin cortar la cadenazUSD, un token con siete respaldos (USDT y USDC en Ethereum, Binance Smart Chain, Tron y Solana), se registra por transacción, y total_supply == Σ backings.locked se cumple por construcción. La puerta local de nueve fases (zusd_e2e.rs: cuatro validadores, pruebas reales, faucet, registro, depósito, transferencia, quema y auditoría) pasó 9 de 9en funcionamiento desde la cadena 14 (v0.5). En la cadena 20: tope de acuñación de 100,000 zUSD al día por respaldo más un total global de 4,000 zUSD por cada 24 horas móviles (reglas de bridge v2), conjunto de guardianes 1 con ocho guardianes PQ, una comisión de 10 bps en zUSD por cada acuñación y cada quema (bridge.fees), y rotaciones de guardianes que exigen posesión y esperan 86,400 s (bridge.rotation). zUSD figura en el génesis de la cadena 20 con sus siete respaldos y los 99 zUSD bloqueados en el momento del corte
auditoría v3Las correcciones de la tercera ronda de auditoría interna, dirigida por un cofundador (2026-09-19; no se ha realizado ninguna auditoría independiente). POOL-1: un Mint del faucet lleva la apertura de su nota (pk, time, r), la admisión recalcula el compromiso, y quien acuña firma rand-mint-2; las notas de asignación del génesis también llevan una apertura. RPC-1: rand_getWitness(es) ejecuta como máximo dos reconstrucciones del árbol a la vez y responde -32000 busy tras 10 s. OPS-1: las dieciocho claves de validador rotadas, generadas fuera del repositorio, y ninguna clave rastreada en el repositorioUna acuñación cuyo compromiso se abre a más de su monto es rechazada; ninguna clave de la cadena 14 ha estado jamás en el repositorioen funcionamiento desde la cadena 14 (v0.5). PRIV-1, la solicitud de testigo que nombra la hoja, se cerró el 2026-09-21 con el árbol propio de la wallet

Versiones desde v0.5

Cada versión es una etiqueta de git con una entrada en el CHANGELOG.md del fullnode. Una versión que cambia el consenso, el formato de red o una clave del verificador se publica con una cadena nueva; las demás se despliegan sobre la cadena en vivo nodo por nodo.

versiónqué aportóchain
v0.5 a v0.5.8Tokens RPL, zUSD y el puente reforzado (arriba); las correcciones de la auditoría; poda del historial; refuerzo del consenso y de la sincronización14, 15
v0.5.9Correcciones del reescaneo: el faucet solo emite desde validadores de génesis, retroceso exponencial en la sincronización, verificaciones previas del gossip15
v0.5.10Compartir direcciones: huellas digitales, enlaces randpay: y códigos QR; el memo cifrado, activado por primera vez en la chain 1815
v0.5.11Vesting de génesis con bloqueo temporal para las asignaciones del equipo, de inversores y de socios. Condicionado al génesis y activo en ninguna chainninguna
v0.6Las correcciones de zkVM, rVM y agregación derivadas de las revisiones de septiembre15
v0.6.1Conjunto de restricciones 7: ocultación de LogUp, un mínimo de 2⁷ filas por tabla, comprobaciones de rango de 32 bits, POSEIDON2_LEN, la corrección de JALR. La chain 16 se creó con hardening_v6 y el guest de bundle v216
v0.6.2Prueba delegada, fase 1: el binario rand-prover y el --prover de la wallet. Un prover de fase 1 recibe la clave de gasto16
v0.6.3, v0.6.4Prueba delegada, fase 2: autorización dividida. La prueba del bundle ya no recibe la clave de gasto; la recibe una prueba de autorización de nivel 10, y el dominio del identificador de transacción pasa a ser rand-txid-317
v0.6.6, v0.6.7-rc1Gas: conjunto de restricciones 8, un límite de gas declarado por prueba, gas dinámico y precios por byte; el memo activado. v0.6.6 nunca se cortó como versión etiquetada18
v0.6.7Correcciones en la chain 18 que no cambian ninguna regla de consenso: poda de pruebas selladas (inactiva), la fijación del formato de envelope, higiene de las claves de visualización, el asignador de la rVM, el aliasing de los kernels de GPU, cobertura de pruebas de la ALU. Etiquetada antes de que terminara su suite completa del workspace18, 19
v0.6.8RPL-2: celdas de programa, bóvedas de programa y la acción Invoke. Comisiones del puente de zUSD, en ambos sentidos. Las últimas correcciones de audit-v6: sin liberación automática de bloqueos (CON-4) y un pacemaker con certificado de timeout (CH-1); un oyente --public-rpc, límites de lectura, pares validadores reservados, presupuestos de sincronización y de gossip, el límite de bytes del pool, una cota al grado declarado en la cabecera de una prueba (ZKV-4); y las reglas condicionadas al génesis que activa la chain 20: la vinculación al hash del génesis, testnet, una ventana de prueba de 1024 bloques, techos del precio del gas y la carga de bytes que se paga, admisión por voto, el límite de entrada de stake como fracción, posesión y un retardo para las rotaciones del puente. Las wallets necesitan esta compilación para enviar en la chain 2020

Dónde se detiene hoy

Desviaciones respecto del whitepaper, expuestas en lugar de suavizadas. Cada una se registra en la documentación propia del crate, junto con el hito que la cierra.

  • hc es vinculante pero no ocultante: no lleva sal, de modo que un programa adivinado puede confirmarse y dos despliegues del mismo programa son enlazables. Lo que M3.4 eliminó es que el verificador conserve el programa completo en claro.
  • Una wallet compilada antes del 2026-09-21 pide testigos a su nodo, y una solicitud de testigo nombra la hoja que está a punto de gastarse. Un rand actual conserva su propia copia del árbol y nunca los pide; el nodo sigue sirviendo rand_getWitness para las wallets más antiguas.
  • Los depósitos son públicos en la frontera: una emisión del faucet, una nota de génesis y un depósito del puente llevan su importe en claro (desde la chain 14, una emisión y una nota de génesis llevan además su apertura, de modo que la clave del propietario también es pública), la misma visibilidad de un salto que tiene en cualquier parte un depósito de transparente a blindado.
  • El conocimiento cero es estadístico, no perfecto. Esa es la propiedad que realmente ofrece el FRI ocultante de Plonky3 0.7, y el crate lo dice.
  • El hash de la transcripción es Poseidon2 con constantes de ronda de desarrollo, no el SHA3-384 / BLAKE3-384 de los papers. Un cambio de configuración, no una reescritura.
  • Con 80 consultas FRI, una prueba de bundle ocupaba unos 1,42 MB en las chains 14 y 15 (unos 1,3 MB hasta la chain 13). Desde la chain 17 una transferencia lleva unos 2,85 MB de prueba: la prueba del bundle, de unos 1,49 MB, y la prueba de autorización, de unos 1,37 MB. En una chain por defecto, con bloques de 4 MiB y un tope de prueba de 2 MiB, una prueba que contiene Keccak supera el tope de prueba sin remedio; el génesis de la chain 20 fija bloques de 20 MiB y un tope de prueba de 4 MiB (las chains 13 a 16 fijan 8 MiB).
  • La cabecera de una prueba de llamada no está oculta. Declara el nivel y las alturas de las tablas de Keccak y SHA-256, de modo que muestra si una llamada calculó un hash. Las llamadas confirmadas en la chain 15 antes del mínimo del prover de v0.6 exponían más: una tabla privada de menos de 2⁷ filas podía leerse a partir de la prueba. El mínimo del prover de v0.6 lo cerró para las llamadas nuevas, y el conjunto de restricciones 7 con hardening_v6 lo convirtió en regla de la chain desde la chain 16 en adelante.
  • Una llamada tiene un tope de nivel 14, con a lo sumo 2¹² filas de Keccak (128 permutaciones) y 2¹³ filas de SHA-256 (128 compresiones), y bajo hardening_v6 no puede desplegarse un programa de más de 8180 palabras. Los guests intérpretes de EVM y sBPF y las imágenes traducidas de ERC-20 y SPL Token superan todos ese límite.
  • Quien posee el testigo lo ve todo. ZK protege la vista del verificador, no la del prover. Desde la chain 17 una wallet puede entregar la prueba del bundle a un rand-prover emparejado sin entregar la clave de gasto, pero ese prover sigue teniendo la clave de visualización y ve las notas. El backend CUDA se ejecutó por primera vez en hardware el 2026-09-28 y aún no tiene ninguna medición en producción.

Estructura del repositorio

El workspace de Cargo del fullnode, tal como figura en su README y en su directorio crates/.

rutaqué contiene
crates/randprotocol-core/Lógica pura, sin E/S: criptografía, notas y el árbol de compromisos, reglas del ledger, gas, génesis, la máquina de estados de HotStuff
crates/randprotocol-zkvm/La zkVM de Rand, incorporada desde zkp-circuits/research en el conjunto de restricciones 8 (circuits aeacf31; resincronizada con deploy/sync-zkvm.sh), más el verificador de pruebas del lado de la chain y su caché de claves de verificación
crates/randprotocol-rvm/La VM de recursión, incorporada desde zkp-circuits/recursion: una máquina nativa del cuerpo cuyos programas verifican pruebas de la zkVM de Rand
crates/bridge-codec/El formato de transmisión y la regla de quórum del puente de guardianes, compartidos byte a byte con los contratos de Solidity y el programa de Solana
crates/randprotocol-node/Almacenamiento RocksDB, red libp2p, mempool, sincronización de bloques, el servidor JSON-RPC y el binario rand-node
crates/randprotocol-client/El binario de wallet rand y la biblioteca RpcClient, sin dependencia de RocksDB ni de libp2p
crates/randprotocol-prover/El binario rand-prover: un prover delegado que genera pruebas de bundles para las wallets emparejadas
deploy/Archivos de génesis de la testnet, nodes.env, scripts de ejecución, aprovisionamiento en la nube, scripts de traspaso y de reconstrucción. Desde la preparación de la chain 14 no se versiona ninguna clave aquí
docs/Documentación de referencia y la especificación de diseño
scripts/Testnet local de dos validadores

Especificado, aún no entregado

Estos componentes se describen en los papers o en la documentación del fullnode, pero no están en funcionamiento: o bien no figuran en los repositorios, o bien están construidos y activados en ninguna chain. Se enumeran para que la brecha entre la especificación y el código sea legible y no deba inferirse.

componenteestado
bridge · guardianLos daemons de guardián y de relayer que ejecutan el formato de attestation de extremo a extremo; los contratos, el codec y la mitad receptora del fullnode se entregan, los daemons no
fullnode · agregaciónAgregación de bloques con la VM de recursión: sellado, poda y sincronización en forma sellada. Construida y desactivada en todas las chains; rand-node rechaza un génesis con una sección aggregation. Aún necesita el ejercicio de extremo a extremo con un agregado falsificado, y elimina solo la prueba del bundle, no la prueba de autorización. Las pruebas de rVM de producción necesitan una máquina grande: bajo el conjunto de restricciones 7, un agregado de dos tomó 133 GB, uno de tres 221 GB, y la prueba de salida más de 256 GB (medido el 2026-09-28 y el 29; no se volvió a medir bajo el conjunto de restricciones 8)
fullnode · vestingAsignaciones de génesis con bloqueo temporal para el equipo, inversores y socios (v0.5.11, docs/vesting.md). Condicionado al génesis: sin una sección vesting las cuatro acciones de vesting se rechazan, y ninguna chain tiene una. La auditoría de suministro de la chain 20 informa todos los contadores de vesting en cero. Desde v0.6.8, una entrada revocable la revoca un umbral de sus revocadores, y solo hacia la tesorería que nombra su entrada de génesis
fullnode · slashingEl slashing y el encarcelamiento (jailing) por equivocación del líder están construidos en v0.6.8 tras staking.slashing y desactivados en la chain 20 (su génesis no tiene ninguno, mientras que las 26 claves de validador pertenecen a un solo operador). No están construidos las recompensas por bloque, el beacon de líder por sorteo de hash, un acumulador de nullifiers ni las llamadas entre programas. El estado persistente por programa se entregó como RPL-2 (arriba)
prover/Daemon de prueba en GPU: reclama lotes de la cola, compite en el envío. Los kernels CUDA viven en zkp-circuits y se ejecutaron por primera vez en una NVIDIA H100 el 2026-09-28; el daemon de mercado no existe. rand-prover, que sí se entrega, genera pruebas para las wallets emparejadas con él y no es un mercado
zkp-circuits · prueba de salida M4.4Una prueba de una transferencia de SPL Token (nivel 20), extrapolada en unos 330 GB. La transferencia ERC-20 (nivel 18) se probó en un droplet de 128 GB el 2026-09-19. Ninguna puede llamarse en la chain 20, que limita una llamada al nivel 14

Compilar y probar

Flujo de trabajo estándar de Rust en cada repositorio. El fullnode es un único workspace de Cargo con un toolchain fijado y una suite de pruebas de clúster que inicia nodos reales sobre TCP. Su compilación requiere que el repositorio circuits esté clonado junto a él, en un directorio llamado circuits, en el commit desde el que se sincronizaron los crates incluidos (aeacf31 para v0.6.7 y v0.6.8). El zkVM es un crate independiente en zkp-circuits con su propio toolchain fijado y una demostración que narra qué revela una llamada confidencial y qué no.

El fullnode:

git clone https://github.com/randprotocol/fullnode.git
git clone https://github.com/randprotocol/zkp-circuits.git circuits   # the sibling directory must be named circuits
git -C circuits checkout "$(sed -n 's/^circuits: //p' fullnode/crates/randprotocol-zkvm/guests-compiled/PROVENANCE.md)"
cd fullnode

# Rust 1.98.1 is pinned by rust-toolchain.toml; first build pulls RocksDB and Plonky3, 10 to 20 minutes
cargo build --release        # target/release/rand-node, target/release/rand, target/release/rand-prover

# All crates; release because STARK proving is slow in debug. One to two hours, mostly proving
cargo test --release

# One machine, two validators
scripts/local-testnet.sh
target/release/rand --rpc http://127.0.0.1:8545 status

El zkVM de investigación, en zkp-circuits/research:

# Toolchain is pinned by rust-toolchain.toml; the first build pulls Plonky3
cargo build --release

# Narrated demo: thirteen proofs, one at production FRI parameters (~6-7 min)
cargo run --release

# Emulator, per-table constraints, cheating provers, ZK, end-to-end, viewing keys, compiled guests (395 tests, ~17 min)
cargo test

La suite del fullnode, medida en v0.6.1 en una máquina de 16 vCPU: core 521 pruebas, node 373, client 117, la suite de prover tramposo 116, los engaños de paquetes ocultos 21 (75 min), el flujo de la wallet 6 (53 min), el clúster 26 (44 min) y la puerta de extremo a extremo de zUSD 2 (51 min). Las pruebas de producción de la VM de recursión quedan fuera y requieren la memoria indicada más arriba.

Running a node explica cómo unirse al testnet público con la compilación; el génesis del testnet, los pares de arranque y los scripts de ejecución se incluyen en el directorio deploy/ del fullnode, y la página de descarga tiene la versión corta.

Contribuir

El fullnode está licenciado bajo la GNU General Public License v3.0 (GPL-3.0-only); antes era Apache-2.0. Abra issues para errores y propuestas de diseño en el repositorio que toque el cambio. Los pull requests son bienvenidos: ejecute cargo fmt && cargo clippy antes de enviar y mantenga los cambios acotados. Los issues del fullnode son el lugar para empezar.

La arquitectura, el circuito de privacidad, la prueba del token de comisión y el compromiso de la seguridad poscuántica están documentados en el whitepaper de la página de papers. El directorio docs/ del propio repositorio del fullnode es la fuente contra la que se verifica cada página de esta documentación.

Verificado por última vez con el commit c0878c3f del fullnode (cadena 21) el 2026-10-12. Cuando el código y esta página no coinciden, el código tiene razón; avísenos.