Despliegue integral local
Guía para levantar el sistema completo en local: nodo Anvil, contrato desplegado con Foundry, interfaz web e indexador de eventos. Cada fase indica qué hace, el comando, la salida esperada y su verificación. El desarrollo de la dApp se estudia en 07 · dApps.
Flujo local
flowchart LR
A["Anvil (nodo)"] --> B["forge script (deploy)"]
B --> C["Contrato en 31337"]
C --> D["dApp web"]
C --> E["Indexador"]
D -->|"firma tx"| C
E -->|"lee eventos"| C
Puertos y servicios
| Servicio | Puerto por defecto | Rol |
|---|---|---|
| Anvil (RPC) | 8545 | Nodo EVM local |
| dApp web (Vite) | 5173 | Interfaz de usuario |
| Indexador | — | Proceso de fondo, escribe estado en disco |
Fase 1 · Dependencias
Qué hace: prepara las herramientas necesarias.
Requisitos: Node.js LTS, pnpm y Foundry. Docker es necesario solo para Bitcoin regtest.
Verificación: node -v, pnpm -v y forge --version responden sin error.
Fase 2 · Nodo local (Terminal A)
Qué hace: arranca un nodo EVM local con chain ID 31337.
anvil --chain-id 31337
Salida esperada: una lista de cuentas de prueba con sus claves privadas y el RPC
escuchando en http://127.0.0.1:8545.
Verificación: la terminal muestra "Listening on 127.0.0.1:8545".
Fase 3 · Contrato (Terminal B)
Qué hace: instala dependencias, configura el entorno y despliega el contrato.
cd projects/community-funding
forge install foundry-rs/forge-std --no-commit
cp ../../.env.example .env
# Usa una clave de prueba mostrada por Anvil.
set -a; source .env; set +a
forge script script/Deploy.s.sol:DeployCommunityFunding \
--rpc-url "$RPC_URL" --broadcast
Salida esperada: forge reporta la transacción de despliegue y la dirección del contrato.
Verificación: registra la dirección desplegada, chain ID y bloque. No copies una clave fuera del entorno local.
Fase 4 · Interfaz
Qué hace: configura y sirve la dApp web apuntando al contrato recién desplegado.
cp apps/community-funding-web/.env.example apps/community-funding-web/.env
# Configura la dirección anterior.
pnpm --filter @blockchain-course/community-funding-web dev
Salida esperada: Vite sirve la interfaz en http://localhost:5173.
Verificación: conecta una wallet configurada para Anvil, crea una campaña mediante cast
o un script, y contribuye desde la interfaz.
Fase 5 · Indexador
Qué hace: lee los eventos del contrato y deriva un estado consultable.
cp apps/event-indexer/.env.example apps/event-indexer/.env
set -a; source apps/event-indexer/.env; set +a
pnpm --filter @blockchain-course/event-indexer start
Salida esperada: el proceso reporta bloques procesados y eventos capturados.
Verificación: inspecciona event-indexer-state.json, produce un evento nuevo y repite.
Para producción debes agregar reorg handling, base transaccional y observabilidad.
Fase 6 · Cierre
Qué hace: detiene los servicios y limpia secretos locales.
Detén servicios, elimina claves locales exportadas y conserva solo direcciones, txids locales y bitácora sin secretos.
Verificación: no queda ninguna clave privada en .env ni en el historial de la terminal.
Troubleshooting
| Síntoma | Causa probable | Solución |
|---|---|---|
connection refused en 8545 |
Anvil no está corriendo | Arranca la Fase 2 en otra terminal |
forge script falla al firmar |
RPC_URL/clave no cargadas |
Vuelve a set -a; source .env; set +a |
| La dApp no muestra estado | Dirección del contrato mal configurada | Corrige el .env de la interfaz |
| Wallet rechaza la red | Chain ID distinto de 31337 | Reconfigura la red de la wallet a 31337 |
| El indexador no ve eventos | Empezó después de emitirlos | Reinícialo desde el bloque de despliegue |
| Puerto 5173 ocupado | Otra instancia de Vite activa | Ciérrala o deja que Vite use otro puerto |