Comprobaba el tamaño con 'stat -c%s'. macOS trae la versión BSD, que usa -f%z, así que el comando fallaba, caía en el '|| echo 0' y el script daba por fallida una descarga correcta: 'FALLÓ (HTTP 200, 0 bytes)'. El 200 decía que había ido bien; lo roto era la comprobación. Ahora usa wc -c, igual en los dos sistemas, y comprueba que el archivo exista. La cabecera ya no dice 'ejecutar en el nodo': si el dashboard puede vivir en una carpeta cualquiera, su instalador de fuentes también.
Txoko Node Dashboard
Suite de auditoría de privacidad Bitcoin para nodos propios.
your node, your rules — ninguna consulta sale de tu red.
Qué es
Txoko es una herramienta de auditoría de privacidad Bitcoin que corre sobre tu propio nodo. Analiza tus transacciones y te explica qué puede deducir un observador externo sobre tu actividad on-chain.
No es un explorador de bloques genérico. Es una herramienta para que el propietario de un nodo audite su propia privacidad con total control sobre sus datos.
Lo esencial: ninguna consulta sale de tu red. Todo el análisis ocurre en tu nodo y en tu navegador. No dependes de servicios externos ni expones qué transacciones o direcciones estás investigando.
Qué NO hace
Tan importante como saber qué hace es saber qué no hace:
- No envía datos a ningún servidor externo — ni analíticas, ni telemetría, ni consultas a APIs de terceros
- No toca claves privadas — el watch-only usa solo tu clave pública (xpub); no puede gastar fondos ni conoce tu semilla
- No llega nunca a una identidad — se detiene en "hot wallet de [servicio]" o "custodio no identificado", y lo dice explícitamente. Ver la sección siguiente
- No afirma más de lo que sabe — distingue siempre entre CERTEZA, PROBABLE e POSIBLE
- No tiene número de score exacto — muestra bandas (ALTA/MEDIA/BAJA); la precisión numérica sería falsa
- No muestra el contenido de OP_RETURN — solo informa de su presencia y tamaño
Sí, esto es chain analysis
Conviene decirlo claro, porque el código está a la vista y cualquiera puede comprobarlo: el peritaje forense aplica las mismas técnicas que las empresas de vigilancia de cadena. Rastreo hacia adelante salto a salto, clustering por CIOH, perfilado de direcciones, huella de software, un índice de direcciones de exchanges. Es el arsenal de Chainalysis, técnica por técnica.
Fingir lo contrario sería insultar tu inteligencia. Lo que cambia no es el método, es todo lo demás:
- Quién lo ejecuta. Corre en tu nodo, con tus datos, bajo tu control. No hay un tercero que acumule los resultados ni los venda a quien pague.
- Sobre quién. Tu propia actividad, o el rastro de unas monedas que te quitaron a ti. No es un servicio que perfile a desconocidos por encargo.
- Dónde se detiene. En un servicio, nunca en una persona. Y cuando una heurística no llega, el informe dice que no llega en vez de rellenar el hueco.
- Quién se queda el informe. Tú. No sale de tu red y decides qué hacer con él — incluido no hacer nada.
Y hay una razón más, la que de verdad justifica que esto exista:
La misma herramienta que sigue el rastro de un ladrón demuestra lo fácil que es seguir el tuyo.
No hay forma más honesta de entender qué puede deducir un observador de tus monedas que ejecutar sus heurísticas sobre ellas y leer el resultado. Un adversario con estas capacidades ya existe, tenga o no tú una herramienta para verlo. Conocer el arma no es adoptarla: es dejar de estar ciego ante ella.
Si esto te parece una línea demasiado fina, es una objeción razonable. El código está entero en un archivo para que puedas juzgarlo tú.
Cómo verificar que nada sale de tu red
Todo el código de análisis vive en un único archivo HTML, sin minificar y sin proceso de compilación. Puedes auditarlo tú mismo:
# Buscar cualquier llamada a dominios externos
grep -E "fetch\(|XMLHttpRequest|src=\"http|href=\"http" dashboard.html
El comando anterior no debe devolver ninguna URL externa. Todas las llamadas van a rutas relativas (/api/, /system/, /vendor/) que apuntan a tu propio nodo vía nginx.
Esto incluye las librerías del frontend (React y Babel): también se sirven desde tu nodo, no desde un CDN. Hasta la versión 1.10.1 se cargaban desde unpkg.com, y aunque un CDN nunca vio qué transacciones analizabas, sí recibía tu IP pública cada vez que abrías el dashboard — es decir, sabía que usabas Txoko, cuándo y desde dónde. Ese metadato es justo lo que esta herramienta enseña a proteger, así que se eliminó.
Consecuencia práctica: el dashboard funciona sin conexión a internet. Solo necesita tu nodo. Las librerías se descargan una vez durante la instalación y se verifican por hash — ver SETUP.md.
Funcionalidades
Auditoría de privacidad
- Análisis de transacción con más de 25 heurísticas ponderadas
- La nota mide solo lo que dependía de ti. Lo que te expone por decisión de un tercero (recibir de un lote, recibir polvo) se informa aparte, porque una nota que no puedes mejorar no evalúa nada
- Detección del output de cambio por señales combinadas, que se callan cuando no coinciden en lugar de señalar la salida equivocada
- Detección de CoinJoin: Whirlpool (denominaciones fijas), WabiSabi (estructura de mezcla), CoinJoin genérico
- Aviso cuando el polvo recibido se gasta junto a otras monedas: ahí el ataque de dusting deja de ser hipótesis
- Consolidación y vinculación CIOH: cuántas direcciones tuyas quedan atadas
- Detección de OP_RETURN: presencia y tamaño, sin mostrar contenido
- Detección de tipo legacy (P2PKH/P2SH) vs SegWit/Taproot
- Wallet fingerprinting: Bitcoin Core, Sparrow, BlueWallet, Taproot nativo y otros
- Detección de entidades: OFAC, pools de minería, exchanges conocidos (~745 direcciones)
- Rastro de procedencia: sigue cada input hacia atrás salto a salto, bajo demanda
- Distancia a entidad: a cuántos saltos está lo más cercano de cada tipo marcado
- Informe narrativo: qué puede deducir un analista, en prosa, sin jerga
- Bandas de privacidad con distinción explícita CERTEZA / PROBABLE / POSIBLE
- Exportación del informe en JSON y Markdown
Auditoría de PSBT — antes de firmar
La única función de la app que llega a tiempo: el resto te cuenta lo que ya pasó, esta te avisa cuando todavía puedes cambiar la transacción.
- Parser completo de BIP174 escrito desde cero, validado contra los cinco vectores inválidos del propio estándar
- Todo offline: una PSBT ya lleva dentro los importes y scripts de sus entradas, así que no se consulta el nodo. Funciona con el nodo sincronizando
- Avisa de las claves públicas maestras incrustadas: las PSBT suelen llevarlas dentro y están hechas para compartirse — quien reciba el archivo puede ver todas tus direcciones, tu saldo y tu historial. No puede gastar, pero lo ve todo
- Detecta cambio identificable por tipo de dirección, importes redondos que delatan cuál es el pago, envíos a tu propia cartera, carteras multifirma y PSBTs incompletas
- Acepta base64, hexadecimal o el archivo
.psbtque exporta Sparrow
Peritaje forense
- Rastreo de fondos robados o perdidos hacia adelante, salto a salto, desde una transacción de origen hasta un punto de parada natural (custodio identificado, dilución, CoinJoin, o fondos aún sin gastar)
- A demanda: tú decides cuándo se explora cada salto con el botón "Seguir el rastro" — nada corre sin que lo pidas, igual que el rastro de procedencia hacia atrás. Puedes generar el informe con lo explorado hasta ese momento, sin terminar el rastreo entero
- Tope de volumen de transacciones como cinturón de seguridad extra: una dirección con un historial enorme (típico de un hot wallet de exchange) detiene el rastro por precaución, para no intentar paginar decenas de miles de transacciones
- Reutiliza las heurísticas del analizador (CIOH, cambio, huella de wallet, entidades) y añade perfil de dirección (personal vs hot wallet), cambio conductual y comparación de huella entre saltos
- Confirma cadenas de peeling multi-salto, algo que el análisis de una sola transacción no puede hacer por sí solo
- Cada afirmación del informe se etiqueta como HECHO, INFERENCIA (con su propia certeza) o DECLARACIÓN — nunca se mezclan
- Informe exportable a JSON y Markdown con cronología, direcciones atribuidas, fondos sin gastar, conclusiones y metodología
- No identifica la identidad real de nadie; no envía nada a terceros — el informe es tuyo para decidir qué hacer con él
Integración con Sparrow
- Importación de etiquetas BIP-329: carga el
.jsonlque exporta Sparrow y muestra tus propias etiquetas junto al análisis. Se lee en memoria, no sale del navegador - Watch-only por xpub/zpub: pega tu Master Public Key y Txoko deriva tus direcciones en local para marcar, en cada transacción, qué outputs son tuyos (recepción o cambio). La derivación BIP32 está implementada sin librerías externas; el xpub nunca sale del navegador. Requiere HTTPS (ver nota más abajo)
Exploración on-chain
- UTXO Map con score de privacidad por moneda, exportable a CSV
- Explorador de bloques y búsqueda on-chain
- Mempool: stats, fees, fee intelligence, bloques proyectados
Monitor del nodo
- Estado de Bitcoin Core, sistema (CPU, RAM, disco) y logs en tiempo real
- Checklist de seguridad del nodo
Herramientas
- Conversor sat/BTC/fiat
- Validador de dirección
- Detector OP_RETURN
- Decodificador de transacción raw
Filosofía
- Sin dependencias externas de datos — todo viene de tu propio nodo
- Honestidad sobre la certeza — siempre distingue hechos de inferencias
- Informa, no aconseja — da el dato y la consecuencia; tú decides
- Calibrado al riesgo real — no alarma por lo normal; reserva la alerta para lo que importa
- Ligero por defecto — el rastro de procedencia es bajo demanda para no estresar el nodo
Requisitos
- Bitcoin Core con
txindex=1 - Mempool.space self-hosted (backend API)
- Fulcrum (índice Electrum, recomendado)
- nginx como proxy inverso
- Acceso via Tailscale, red local o similar
Probado sobre Ubuntu Server 24.04 con HP EliteDesk (i5, 32GB RAM, 2TB NVMe).
Instalación
La guía completa está en SETUP.md — paso a paso, con una comprobación después de cada uno para que sepas si vas bien sin tener que descubrirlo al final.
Resumen de lo que implica:
- Clonar el repositorio.
- Copiar
dashboard.htmla un directorio propio servido por nginx. - Descargar las librerías (React, Babel y las fuentes) a
vendor/, junto al dashboard, y verificarlas por hash. No están en el repo: son de terceros y ocupan ~3 MB. - Opcionalmente, instalar el monitor del sistema como servicio systemd.
- Configurar nginx: el dashboard, un proxy a la API de Mempool y otro al monitor.
Un aviso que ahorra disgustos: en nginx, el alias del dashboard debe apuntar
al directorio (con barra final), no al archivo dashboard.html. Si apunta
al archivo, el navegador no encuentra vendor/ y verás una página en blanco
sin ningún error visible. Es el fallo más común, y en SETUP.md hay una
comprobación concreta para descartarlo.
Cuando termines, abre http://TU-IP:4080/dashboard/ — con la barra final —,
pulsa CONFIG e introduce la URL de tu Mempool.
Estructura del repositorio
txoko-dashboard/
├── dashboard.html # La aplicación entera (HTML + CSS + JS en un archivo)
├── system-metrics.js # Monitor del nodo (Node.js) — opcional
├── txoko-metrics.service # Servicio systemd para el monitor
├── instalar-fuentes.sh # Descarga IBM Plex al nodo y genera su CSS
├── tests/ # Pruebas de la criptografía contra vectores oficiales
├── SETUP.md # Guía de instalación
├── FIXTURES.md # Transacciones reales para probar las heurísticas
├── CHANGELOG.md
├── README.md
└── LICENSE
Tras la instalación, junto al dashboard.html queda además un directorio
vendor/ con las librerías y las fuentes. No está en el repositorio: se
descarga y se verifica durante la instalación (ver SETUP.md).
El frontend es un único archivo HTML. Sin bundler, sin npm, sin proceso de build: Babel transpila el JSX en el navegador, así que lo que lees en el archivo es exactamente lo que se ejecuta — no hay una versión compilada que auditar por separado.
Las librerías (React, Babel, las fuentes) viven aparte, en vendor/, servidas desde tu propio nodo y verificadas por hash durante la instalación. Se dejan fuera del repo a propósito: son código de terceros, y mezclarlas con el tuyo haría más difícil auditar lo que de verdad importa.
Limitaciones conocidas
- Watch-only requiere HTTPS — la derivación de direcciones desde el xpub usa la Web Crypto API del navegador, que solo está disponible en contextos seguros (HTTPS). Si sirves el dashboard por HTTP, esta función no estará disponible (el resto sí). Ver SETUP.md para configurar un certificado autofirmado. Las etiquetas BIP-329 funcionan por HTTP sin problema
- Watch-only solo Native SegWit (BIP84) — la derivación cubre wallets
wpkh(direcciones bc1q), que son la mayoría. Taproot (BIP86, bc1p) aún no está soportado - Análisis de transacción aislada — sin seguir el grafo completo, algunas heurísticas tienen techo. El rastro de procedencia amplía el contexto pero es bajo demanda y no exhaustivo
- Base de datos de entidades parcial — ~745 direcciones de exchanges, OFAC y minería. Cubre los casos más comunes; no es completa
- Fingerprinting conservador — requiere varias señales coincidentes; prefiere no detectar antes que detectar mal
- Sin análisis de red — no cruza datos con otros nodos ni mempool distribuida
- Peritaje forense sin
/outspend— el backend Mempool self-hosted no expone ese endpoint (ni/utxo), así que cada salto se resuelve recorriendo el historial de la dirección receptora. Más peticiones que un/outspenddirecto, con throttling por lotes para no saturar el nodo - Ramas que no se pueden comprobar — algunas direcciones tienen un historial tan pesado que el backend no lo sirve dentro del tiempo de espera (8 s). Cuando pasa, esa rama se marca como no comprobada y queda fuera de "fondos localizados sin gastar": el informe dice que no se sabe, en vez de afirmar que los fondos siguen ahí. Es deliberado — cortar protege el nodo, que es la premisa de la herramienta, y una consulta fallida nunca debe leerse como una conclusión. Esas ramas hay que comprobarlas a mano
- El tope de volumen mide número de transacciones, no peso — el cinturón de seguridad (
LARGE_ADDR_TX_COUNT, 5000 tx) frena las direcciones con historiales enormes, pero una dirección con pocas transacciones muy grandes puede agotar el tiempo de espera igualmente (visto con una de 59 transacciones de ~15 KB cada una). No hay forma barata de conocer el peso de la respuesta por adelantado, así que el tope no cubre ese caso; lo cubre el manejo de errores descrito arriba
Historial de cambios
Los cambios de cada versión se documentan en CHANGELOG.md.
Contribuir
Proyecto en desarrollo activo. Issues y PRs bienvenidos.
Si encuentras un falso positivo en alguna heurística o tienes un caso de prueba interesante, abre un issue con el txid y lo que esperabas ver.
Licencia
MIT — ver LICENSE
₿ txoko · your node, your rules