Autor

James Bachini

Fecha de publicación

RISC Zero proporciona un entorno de ejecución donde podemos computar grandes cantidades de datos fuera de la cadena y luego verificar la salida en un contrato inteligente de Stellar. Esto tiene el potencial de expandir los límites de la computación descentralizada, así que abramos una ventana de consola y comencemos a verificar.

Necesitarás un entorno basado en Unix. Si estás en Windows, intenta Subsistema de Windows para Linux. También necesitarás Rust instalado y el stellar CLI.

Instalemos RISC Zero y configuremos un programa de ejemplo para verificar.
curl -L https://risczero.com/install | bash

rzup install

Una vez que lo tengamos funcionando, clonemos el repositorio en:

git clone https://github.com/jamesbachini/RiscZero-Experiments.git

Dentro de este repositorio hay una aplicación RISC Zero llamada greater_than que tiene dos partes:

  • El crate de invitado es el código que se ejecutará dentro de la zkVM
  • El crate de anfitrión es el código que orquesta la generación de pruebas en tu máquina

Echemos un vistazo a la función principal dentro del programa de invitado que se ejecuta en el anfitrión zkVM:

https://github.com/jamesbachini/RiscZero-Experiments/blob/main/greater_than/methods/guest/src/main.rs

fn main() {

let a: u32 = env::read();

let b: u32 = env::read();

if !(a > b) {

panic!("La condición falló: a no es mayor que b"); } env::commit(&1u32);

}

Aquí estamos leyendo dos variables numéricas u32 y luego verificando que a no sea mayor que b. Si lo es, entramos en pánico; si no, enviamos de vuelta un 1.

Luego tenemos la aplicación anfitriona para ejecutar esto, que se puede encontrar aquí: https://github.com/jamesbachini/RiscZero-Experiments/blob/main/greater_than/host/src/main.rs

Esto creará una prueba y producirá 3 valores al ejecutarse: println!("Sello (hex): {}", hex::encode(seal));println!("ID de Imagen (hex): {}", hex::encode(image_id.as_bytes()));println!("SHA-256 del Diario (hex): {}", hex::encode(journal_sha256.as_bytes()));

Son estos valores los que necesitamos para verificar la prueba dentro de un contrato inteligente de Stellar. Encendamos dockerd en segundo plano y luego ejecutemos el código.

sudo dockerd &

RISC0_DEV_MODE=0 cargo run --release

Después de un par de minutos, deberíamos obtener una salida algo así:

Ahora tenemos todo lo que necesitamos para verificar la prueba en un contrato inteligente de Stellar.

Procedamos y clonemos el contrato verificador de risc0 de Nethermind desde aquí:https://github.com/NethermindEth/stellar-risc0-verifier/

git clone https://github.com/NethermindEth/stellar-risc0-verifier.git

Ahora construyamos y despleguemos el contrato usando el CLI de Stellar. Estaremos desplegando en Futurenet ya que, en el momento de escribir esto, las funciones bn254 requeridas aún no se habían implementado en el Testnet o Mainnet de Stellar (lanzado el 22 de enero de 2026).

Nota que necesitarás algunos XLM para enviar las transacciones, los cuales puedes obtener para Futurenet/Testnet aquí: https://lab.stellar.org/account/fund?$=network$id=futurenet

stellar contract build

stellar contract deploy --wasm target/wasm32v1-none/release/groth16_verifier.wasm --source james --network futurenet

Una vez desplegado, se nos proporcionará un contractId que podemos usar para invocar llamadas a funciones. Llamaremos a la función selector, que devuelve un código hex de 4 bytes. Más tarde copiaremos y pegaremos este código hex de 4 bytes al frente del sello.

stellar contract invoke --network futurenet --id CBY3GOBGQXDGRR4K2KYJO2UOXDW5NRW6UKIQHUBNBNU2V3BXQBXGTVX7 --source-account james -- selector

"73c457ba"
Usemos esto en la función principal de verificación, pasando el hash sha256 del diario, el id de la imagen y el sello con el selector añadido al principio:
stellar contract invoke --network futurenet --id CBY3GOBGQXDGRR4K2KYJO2UOXDW5NRW6UKIQHUBNBNU2V3BXQBXGTVX7 --source-account james --send=yes -- verify --journal 67abdd721024f0ff4e0b3f4c2fc13bc5bad42d0b7851d456d88d203d15aaa450 --image_id 9dee6122483cff892f04913c0d37f8ef1732f438551e204e11e9db56e27d3cd1 --seal 73c457ba22a238521b08fa5d6a315d6920d67d2b198609c4cc9639d931907a6b955a5f3d11d56de7884be2795e6b8875a955feefba5db435fe816869a3ff8585c97e517013d77c28c6d869f4b72890a54c6131e6bede2a8ad561c8381e7de41754dce41a0322956d26857415fae0e4c222648f3a60e7c4084cfbe378ad30a25a1f412f50209c8374839611b4fd1b6fb317b6580c46d7d6705137fcf1fdb9c1089c7b9c790a6c19690a5709c7404ef3428d7952f0dcb63d826711c0c9c645ef57730a662d2da81dd30a84109f30d2265f3ec762ecf2eba231f4aa0c54374a865127163c2206d641ffc50de0f0e5a1eb7b00b355d87d83d7c27359c463da1eed6e410982b3
Si la prueba Groth16 verifica, obtendrás una respuesta nula y sin pánicos. Esta es la manera de Stellar CLI de imprimir () (unidad) ya que la función de verificación devuelve Result<(),VerifierError>

Este ejemplo básico debería ponerte en marcha. Lo bello de esto es que podrías probar en una sola transacción un cálculo complejo que involucre megabytes de datos, lo cual sería imposible de hacer directamente en la cadena.

Ese cálculo podría abrir nueva lógica dentro de un contrato inteligente descentralizado, creando nuevas posibilidades para los creadores que están creando la próxima generación de tecnología de conocimiento cero en Stellar.

Para más información, consulta los siguientes recursos: