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
| repositorio | qué contiene | lenguaje |
|---|---|---|
randprotocol/fullnode | Nodo 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.org | Explorador 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/bridge | Puente 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-circuits | Recorridos 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/clients | Los 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.
| capa | qué se ejecuta |
|---|---|
| Consenso | HotStuff BFT encadenado, quórums ponderados por stake, confirmación de tres cadenas |
| Red | libp2p: TCP, Noise, Yamux, gossipsub, Kademlia, mDNS en redes locales |
| Libro mayor | Pool 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 |
| Tokens | RPL: 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 |
| Staking | Registro 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 confidencial | zkVM 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ía | Dilithium2 · ML-KEM-768 · Poseidon2 · BLAKE3 · ChaCha20-Poly1305 |
| Almacenamiento | Una 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 |
| Puente | Bloqueos 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 |
| Lenguaje | Rust 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.
| tabla | tipo | función |
|---|---|---|
program | testigo | Palabras de instrucción en bruto decodificadas en el circuito desde M3.4, digeridas por la cpu en hc |
cpu | testigo | Una fila por ciclo, más filas de digest que absorben el programa en hc y las entradas con sal en H_IN |
memory | testigo | Registros y RAM en una sola tabla, ordenada por (space, addr, ts); acceso por subpalabra desde M2.5 |
alu | testigo | Aritmética en extremidades de byte, desplazamientos, comparaciones; multiplicación y división RV32M desde M2.6 |
range | preprocesada · 256 filas | Comprobaciones de rango y la consulta de potencias de dos |
nibble | preprocesada · 256 filas | AND, OR, XOR de 4 bits; un acierto es en sí una comprobación de rango sobre ambos operandos |
poseidon2 | testigo | Una fila por ronda de permutación en bloques de 32 filas; sirve al bus POSEIDON2 y a ambos digests |
input | testigo · desde M4.1 | Una fila por palabra de entrada privada; sirve a INPUT_DIGEST e INPUT_READ, de modo que una lectura no puede escapar al compromiso |
keccak | testigo · opcional | Keccak-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
| FRI | 80 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 |
| Llamada | private_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 |
| Transferencia | El 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ón | Unos 16 ms con una clave caliente; la primera verificación con una nueva clave (nivel, alturas) toma unos 230 ms |
| Bloque | Presupuesto 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.
| destino | ruta | coprocesadores |
|---|---|---|
| RISC-V | Nativo. 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 |
| Solidity | solc --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 / SVM | un 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.
| id | alcance | criterio de salida | estado |
|---|---|---|---|
| M1 | Cinco tablas, ISA base RV32I, HALT/WRITE_OUTPUT/READ_INPUT, ZK activado, relleno por tiers, ensamblador, emulador | fib, memcpy, bubble_sort, alu_mix y balance_check se prueban y verifican; todas las pruebas de trampa se rechazan | hecho. 44 pruebas; una revisión posterior cerró cinco brechas de solidez en una sola oleada |
| M1.5 | Viewing 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 simulado | Una 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 gastar | hecho. No incorporado al nodo |
| M2 | Caché 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 RV32M | Entregado con un alcance menor al previsto: el loader de binario plano y un enlace más firme de READ_INPUT se trasladaron a M4.1 | hecho. 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 |
| M3 | Chip 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 circuito | La relación de transferencia se prueba bajo R_exec con pertenencia dentro del circuito, y verify(hc, proof) nunca ve una palabra del programa | hecho. 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 |
| CUDA | Backend 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 --cuda | Cada guest se prueba y verifica mediante el gemelo de referencia en Rust puro y el driver simulado; el verifier de CPU no distingue los backends | hecho; 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.1 | El 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 comprometido | Un 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_IN | hecho. Incorporado el 2026-09-11 como constraint set 4: 26 valores públicos, ocho tablas, un hard fork |
| M4.2 | Una 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-12 | keccak256 se prueba como guest compilado, y una prueba sin la tabla tiene exactamente la misma forma que una de M4.1 | hecho. 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.4 | Inté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_exec | construido; 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 |
| M5 | La 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 7 | Cada 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_v2 | Las correcciones de las revisiones de zkVM del 2026-09-27 y 28 que modifican una clave del verifier, aplicadas en un solo corte | hecho. Fullnode v0.6.1, chain 16 (2026-09-28), un hard fork |
| set 8 | El 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 privado | Una llamada paga por el límite que declara, y cada prueba de bundle declara el mismo límite fijado | hecho. 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.
| id | alcance | criterio de salida | estado |
|---|---|---|---|
| S1 | El 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 redactado | Una 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úster | hecho. En vivo en la flota pública desde la cadena 6 (2026-09-12) |
| S3 | El 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 designado | Un 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_IN | hecho. 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 |
| S2 | Staking 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 pool | Un 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úster | hecho. 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 |
| RPL | El 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_getTokenSupply | Un token se registra, se acuña, se envía con rand send --asset y se quema como notas en el mismo pool | en 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-2 | Estado 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_getProgramVault | El 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 probar | en 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 oculto | Cada 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 desaparecen | Una transferencia de RAND y una transferencia de cualquier token RPL publican la forma idéntica, de modo que el activo que se movió queda oculto | en 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ón | Cada 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úblicas | Una prueba copiada y sin modificar que se reenvía con un destino, un validador o un memo cambiados es rechazada | en 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–B4 | Endurecimiento 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 cadena | zUSD, 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 9 | en 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 v3 | Las 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 repositorio | Una 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 repositorio | en 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ón | qué aportó | chain |
|---|---|---|
| v0.5 a v0.5.8 | Tokens RPL, zUSD y el puente reforzado (arriba); las correcciones de la auditoría; poda del historial; refuerzo del consenso y de la sincronización | 14, 15 |
| v0.5.9 | Correcciones del reescaneo: el faucet solo emite desde validadores de génesis, retroceso exponencial en la sincronización, verificaciones previas del gossip | 15 |
| v0.5.10 | Compartir direcciones: huellas digitales, enlaces randpay: y códigos QR; el memo cifrado, activado por primera vez en la chain 18 | 15 |
| v0.5.11 | Vesting de génesis con bloqueo temporal para las asignaciones del equipo, de inversores y de socios. Condicionado al génesis y activo en ninguna chain | ninguna |
| v0.6 | Las correcciones de zkVM, rVM y agregación derivadas de las revisiones de septiembre | 15 |
| v0.6.1 | Conjunto 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 v2 | 16 |
| v0.6.2 | Prueba delegada, fase 1: el binario rand-prover y el --prover de la wallet. Un prover de fase 1 recibe la clave de gasto | 16 |
| v0.6.3, v0.6.4 | Prueba 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-3 | 17 |
| v0.6.6, v0.6.7-rc1 | Gas: 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 etiquetada | 18 |
| v0.6.7 | Correcciones 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 workspace | 18, 19 |
| v0.6.8 | RPL-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 20 | 20 |
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.
hces 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
randactual conserva su propia copia del árbol y nunca los pide; el nodo sigue sirviendorand_getWitnesspara 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_v6lo 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_v6no 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-proveremparejado 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/.
| ruta | qué 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.
| componente | estado |
|---|---|
| bridge · guardian | Los 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ón | Agregació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 · vesting | Asignaciones 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 · slashing | El 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.4 | Una 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.