Introducción
Todos hablan de comprar o vender criptomonedas, de hacer trading o buscar ganancias rápidas. Pero pocos muestran el otro lado de las cripto: el de participar activamente en la red, en la infraestructura que la hace posible. Hay quienes la vivimos de otra forma, corriendo nodos, asegurando la red, explorando la privacidad y soberanía que estas tecnologías ofrecen. Este informe documenta precisamente eso: cómo desplegar un nodo Zebra, sincronizarlo con la blockchain y conectar un servicio Lightwalletd, para experimentar la cripto desde dentro, más allá de las wallets y los exchanges.
Nodo Zebra (Zcash)
Zebra es un nodo completo de Zcash, desarrollado por la Zcash Foundation. Su objetivo es permitir que cualquier persona participe en la red de forma soberana, segura y descentralizada, sin depender de fundaciones o CEOs. Este informe detalla instalación, configuración, ejecución y análisis de logs, destacando la arquitectura y funcionamiento de Zebrad.
Instalación y compilación
Requisitos previos
- Rust (última versión estable)
- Cargo
- Dependencias opcionales: clang, libclang, g++, SQLite (para Tor)
Compilación desde GitHub:
git clone https://github.com/ZcashFoundation/zebra.gitcd zebragit checkout v2.5.0cargo build --release --bin zebradtarget/release/zebrad start
git clone → descarga el código fuente.
git checkout → asegura que uses la versión estable deseada.
cargo build --release → compila Zebra optimizado para producción.
target/release/zebrad start inicia el nodo usando la versión compilada.
Instalación directa con Cargo:
cargo install \ --git https://github.com/ZcashFoundation/zebra \ --tag v2.5.0 \ zebrad
Este método compila y instala zebrad directamente, evitando pasos manuales de build.
Ideal para mantenerlo actualizado con cargo install --force.
Configuración inicial
mkdir -p ~/.config/zebracat > ~/.config/zebra/zebrad.toml << 'EOF'
# Initial Setup - zebrad.toml [consensus]checkpoint_sync = true [mempool]eviction_memory_time = "1h"tx_cost_limit = 80000000 [metrics]# Si querés monitoreo Prometheus podés activarlo acá# listen_addr = "0.0.0.0:9999" [mining]internal_miner = false [network]cache_dir = truecrawl_new_peer_interval = "1m 1s"initial_mainnet_peers = [ "dnsseed.z.cash:8233", "dnsseed.str4d.xyz:8233", "mainnet.seeder.zfnd.org:8233", "mainnet.is.yolo.money:8233",]initial_testnet_peers = [ "dnsseed.testnet.z.cash:18233", "testnet.seeder.zfnd.org:18233", "testnet.is.yolo.money:18233",]listen_addr = "[::1]:8233"max_connections_per_ip = 1network = "Mainnet"peerset_initial_target_size = 25 [rpc]listen_addr = "127.0.0.1:8232"cookie_dir = "/home/your_username/.cache/zebra"debug_force_finished_sync = falseenable_cookie_auth = falseparallel_cpu_threads = 0 [state]cache_dir = "/home/your_username/.cache/zebra"delete_old_database = trueephemeral = false [sync]checkpoint_verify_concurrency_limit = 1000download_concurrency_limit = 50full_verify_concurrency_limit = 20parallel_cpu_threads = 0 [tracing]buffer_limit = 128000force_use_color = falseuse_color = trueuse_journald = false
Genera un archivo de configuración predeterminado (zebrad.toml) en tu directorio de preferencias.
Contiene secciones para: [consensus], [network], [mempool], [rpc], [state], [sync], [tracing].
Cada opción puede personalizarse: número de hilos de CPU, peers iniciales, habilitar cookie auth, directorios de cache, límites de concurrencia.
checkpoint_sync = true → permite sincronizar de manera más rápida usando checkpoints.
initial_mainnet_peers → lista nodos semilla para iniciar la conexión con la red.
Dentro de la opcion [state] la opcion ephemeral=[true|false] define si el nodo funciona en modo pruned o full. Con ephemeral=true, el nodo es podado: guarda solo el estado actual y los bloques recientes, reduciendo drásticamente el uso de disco y recursos, ideal para operar wallets y participar en la red sin cargar con todo el historial. En cambio, con ephemeral=false, el nodo conserva la blockchain completa desde el génesis, lo que permite auditorías y consultas históricas, a costa de mayor almacenamiento y tiempo de sincronización.
Ejecución del nodo
zebrad start
Inicia Zebra mostrando logs en la terminal.
Útil para debugging y pruebas rápidas.
nohup zebrad start \ > ~/zebrad_logs/zebrad_live.log 2>&1 & \ echo $! > ~/zebrad_logs/zebrad.pid tail -f ~/zebrad_logs/zebrad_live.log
y si lo queres ver con color violeta como lo veo yo:
tail -f ~/zebrad_logs/zebrad_live.log | awk '{ line = $0 gsub(/INFO/, "\033[35m&\033[0m", line) gsub(/WARN/, "\033[33m&\033[0m", line) gsub(/ERROR/, "\033[31m&\033[0m", line) print line}'

nohup → permite que el proceso siga corriendo aunque cierres la terminal.
> ~/zebrad_logs/zebrad_live.log → guarda todos los logs.
echo $! > ... → guarda el PID del proceso para detenerlo o reiniciarlo después.
Zebra puede funcionar como:
- Nodo completo: valida bloques, transacciones y mantiene la blockchain.
- Backend para lightwalletd: soporta wallets ligeros.
- Nodo de minería: opcional, con dirección de minado configurada.
- Escáner de transacciones Sapling: para analizar transacciones blindadas.
Análisis de Logs de Zebra (Zcash)
Cuando ejecutas un nodo completo de Zcash usando Zebra, vas a ver en tiempo real información detallada sobre la sincronización de la blockchain, el estado del mempool, la comunicación con peers y la verificación de bloques. Estos logs son esenciales para entender el funcionamiento interno del nodo y su participación en la red.
Cada línea de log contiene:
- Timestamp: momento exacto de la acción.
- Nivel de log: INFO, WARN, ERROR.
- Componente: módulo del software que genera el mensaje.
- Mensaje: descripción de la acción, con parámetros técnicos.

1. Sincronización inicial
2025-09-26T18:14:22.126249Z INFO {zebrad="d1a3c74" net="Main"}: zebrad::components::sync::progress: finished initial sync to chain tip, using gossiped blocks sync_percent=100.000% current_height=Height(3078662) network_upgrade=Nu6 remaining_sync_blocks=0 time_since_last_state_block=0s
finished initial sync to chain tip→ Zebra completó la sincronización inicial con la blockchain.using gossiped blocks→ sincronizó bloques recibidos de peers (“gossip protocol”), en lugar de descargarlos directamente de un nodo central.sync_percent=100.000%→ la sincronización está completa.current_height=Height(3078662)→ indica la altura del último bloque sincronizado.network_upgrade=Nu6→ versión del protocolo de la red (Zcash Network Upgrade 6).remaining_sync_blocks=0→ no quedan bloques pendientes.time_since_last_state_block=0s→ cero segundos desde el último bloque procesado.
2. Comunicación con el mempool
2025-09-26T18:14:48.217764Z INFO {zebrad="d1a3c74" net="Main"}: zebrad::components::mempool::gossip: sending mempool transaction broadcast request=AdvertiseTransactionIds(1) changes=1
mempool::gossip→ Zebra comparte la información de transacciones pendientes con otros nodos.AdvertiseTransactionIds(1)→ indica que se está publicando una transacción nueva.changes=1→ se modificó el mempool, agregando una nueva transacción.
3. Búsqueda y conexión con nuevos peers
2025-09-26T18:15:06.986250Z INFO {zebrad="d1a3c74" net="Main"}:crawl_and_dial{new_peer_interval=61s}:crawl{should_always_dial=false}: zebra_network::peer_set::candidate_set: timeout waiting for peer service readiness or peer responses
Zebra intenta conectarse a nuevos peers para mantenerse sincronizado.
timeout waiting for peer service readiness→ ningún peer respondió a tiempo, lo cual es normal y se reintenta periódicamente.new_peer_interval=61s→ el próximo intento se realizará en 61 segundos.
4. Inicio de sincronización de nuevos bloques
2025-09-26T18:15:15.570304Z INFO {zebrad="d1a3c74" net="Main"}:sync:try_to_sync: zebrad::components::sync: starting sync, obtaining new tips state_tip=Some(Height(3078662))
Zebra detecta un nuevo bloque o actualización de la cadena y comienza a sincronizarlo.
state_tip=Some(Height(3078662))→ nodo actualmente en la punta de la cadena antes de obtener el bloque nuevo.
5. Descarga y verificación de bloque gossiped
2025-09-26T18:15:20.308405Z INFO {zebrad="d1a3c74" net="Main"}:{peer=Out("v4redacted:8233")}:msg_as_req{msg="inv"}:inbound:download_and_verify{hash=0000000001000e9e82b5870f7c98dc96cbecb97db0a60dfde600b8defeb31bcf}: zebrad::components::inbound::downloads: downloaded and verified gossiped block height=Height(3078663)
Zebra recibió un bloque de otro nodo y lo descargó.
hash=00000...→ hash único del bloque, garantiza integridad.downloaded and verified→ Zebra verificó la validez del bloque antes de agregarlo a la cadena.height=3078663→ altura del nuevo bloque.
Esto demuestra que Zebra valida de manera independiente cada bloque, manteniendo la soberanía del nodo.
6. Exhausted prospective tip set
2025-09-26T18:15:21.572123Z INFO {zebrad="d1a3c74" net="Main"}:sync:try_to_sync: zebrad::components::sync: exhausted prospective tip set
- Zebra revisó todos los bloques candidatos y no hay más bloques nuevos por descargar de los peers actuales.
- Se prepara para esperar nuevas actualizaciones.
7. Espera antes de reiniciar sincronización
2025-09-26T18:15:21.572147Z INFO {zebrad="d1a3c74" net="Main"}:sync: zebrad::components::sync: waiting to restart sync timeout=67s state_tip=Some(Height(3078663))
- Zebra entra en modo de espera (timeout=67s) antes de intentar sincronizar nuevos bloques.
- Esto evita saturar la red con solicitudes innecesarias.
8. Sincronización completa confirmada
2025-09-26T18:15:22.140148Z INFO {zebrad="d1a3c74" net="Main"}: zebrad::components::sync::progress: finished initial sync to chain tip, using gossiped blocks sync_percent=100.000% current_height=Height(3078663) network_upgrade=Nu6 remaining_sync_blocks=0 time_since_last_state_block=0s
- Confirmación final de que el nodo está completamente sincronizado.
- Puede empezar a participar activamente en la red, transmitir transacciones y validar bloques futuros.
Conclusión técnica
- Zebra ejecuta sincronización completa usando PoW, validando cada bloque independientemente.
- Los logs muestran la interacción constante con peers, manejo del mempool y verificación de bloques gossiped.
- Cada acción tiene control de errores, reintentos y tiempos de espera, garantizando resiliencia y soberanía.
- Observar los logs en tiempo real permite monitorear la salud del nodo, identificar problemas de conexión y asegurar que la red funciona correctamente.
Integración de Zebra con Lightwalletd
Qué es Lightwalletd
Lightwalletd es un servicio backend que permite a clientes ligeros de Zcash (light wallets) interactuar con la blockchain sin necesidad de ejecutar un nodo completo. Funciona como un intermediario:
- Recibe peticiones RPC de clientes ligeros (wallets).
- Consulta y valida información usando un nodo completo Zebra (zebrad).
- Entrega datos de bloques, transacciones y balances de manera eficiente.
Esto permite que wallets como ZecWallet, Nighthawk o CLI Wallet operen con seguridad, manteniendo privacidad y verificabilidad, sin descargar toda la blockchain localmente.
Instalación y configuración de Lightwalletd
1. Instalar Go
Lightwalletd requiere Go para compilar. Descarga e instala la versión estable desde golang.org
2. Clonar el repositorio y compilar:
git clone https://github.com/zcash/lightwalletdcd lightwalletdmakemake install
Esto genera el binario lightwalletd en ~/go/bin/.
3. Configurar directorios y archivo zcash.conf:
Por defecto, lightwalletd usa la configuración de Zebra (127.0.0.1:8232).
El archivo zcash.conf puede estar vacío si usamos los valores por defecto.
4. Dominio y certificados para producción
- Para un despliegue seguro de Lightwalletd accesible por wallets remotos:
- Registrar un dominio público que apunte al servidor donde corre Lightwalletd.
- Obtener certificados TLS válidos (Let’s Encrypt o comerciales).
Configurar Lightwalletd para usar los certificados:
lightwalletd \ --cert ./cert.pem \ --key ./key.pem \ --zcash-conf-path ~/.config/zcash.conf \ --data-dir ~/.cache/lightwalletd \ --log-file /dev/stdout
Esto permite conexiones HTTPS seguras desde clientes remotos.
Para pruebas locales se puede usar --no-tls-very-insecure, pero no recomendado en producción.
5. Iniciar sincronización de Lightwalletd:
lightwalletd \ --zcash-conf-path ~/.config/zcash.conf \ --data-dir ~/.cache/lightwalletd \ --log-file /dev/stdout
El servicio escuchará en 127.0.0.1:9067 para conexiones de wallets.
Durante la sincronización verás mensajes como:
{"app":"lightwalletd","level":"info","msg":"Ingestor adding block to cache: 748000","time":"2022-05-28T19:25:49-03:00"}
Cuando los logs de ingestión desaparezcan, lightwalletd estará completamente sincronizado.
6. Conectar una wallet a Lightwalletd
Instalar CLI Wallet compatible:
cargo install --locked --git https://github.com/adityapk00/zecwallet-light-cli
El binario se encuentra en ~/.cargo/bin/zecwallet-cli.
Conectarse al backend Lightwalletd:
zecwallet-cli --server 127.0.0.1:9067
Mensajes de confirmación:
Lightclient connecting to http://127.0.0.1:9067/{ "result": "success", "latest_block": 1683911, "total_blocks_synced": 49476}Ready!(main) Block:1683911 (type 'help') >>`
Indica que la wallet ligera está sincronizado y listo para enviar y recibir transacciones de manera segura.
Resumen
Zebra provee la infraestructura de blockchain completa y segura.
Lightwalletd habilita a los clientes ligeros a interactuar con la red sin descargar todos los bloques.
La combinación permite wallets ligeros confiables y privados, manteniendo la soberanía de la red Zcash.
Aca unas imagenes de wallets conectadas al nodo:
Zingo (escritorio)

Ywallet (movil)

ZKool (movil)

Zashi (movil)

ZKool (escritorio)



