Files
txoko-dashboard/FIXTURES.md
T

6.2 KiB
Raw Blame History

Fixtures de validación — Txoko Node Dashboard

Conjunto de transacciones y direcciones reales conocidas para validar que el motor de análisis dice lo correcto en cada tipo de caso. Es la red de seguridad contra falsos positivos: antes de publicar un cambio en el motor, se pasan estos casos y se confirma que el resultado sigue siendo el esperado.

Cómo usarlo: analiza cada txid/dirección en la app (apuntando a tu propio nodo) y compara el resultado con la columna "Resultado esperado". Si algo no coincide, ahí hay un fallo (o el fixture estaba mal etiquetado: verifícalo en tu nodo y corrige la fila).

Nota: estos txids vienen del documento de diseño y conviene reverificarlos contra tu nodo la primera vez. Marca en la columna "Verificado" cuándo confirmaste cada uno. Un fixture con un txid equivocado es peor que no tenerlo.


Transacciones

# Tipo txid Resultado esperado Verificado
1 Whirlpool CoinJoin 323df21f0b0756f98336437aa3d2fb87e02b59f1946b714a7b09df04d429dec2 CoinJoin detectado, banda ALTA, fingerprint "Samourai/Sparrow" inferido
2 WabiSabi CoinJoin fb596c9f675471019c60e984b569f9020dac3b2822b16396042b50c890b45e5e CoinJoin grande, banda ALTA, "Wasabi" inferido
3 JoinMarket CoinJoin 4f112abd2eefe3484a7bbf7c1731f784cba19de677468835145e9c448fb18b7d CoinJoin con outputs iguales, verificar mínimo ~10k sats
4 Batch payment 144 outputs (F2Pool, 2022-02-15) ef5d100a70eea9b7349a40fdfd51064fc5cebf5e3b4240f92591569836896949 1→144 outputs, NO CoinJoin, banda MEDIA, check "Pago por lotes" penaliza (45) 2026-06-03
5 Dust attack 555 sats 655c533bf059721cec9d3d70b3171a07997991a02fedfa1c9b593abc645e1cc5 Dust detectado con tipo correcto, no falso positivo, banda BAJA
6 Taproot + OP_RETURN 0bf67b1f05326afbd613e11631a2b86466ac7e255499f6286e31b9d7d889cee7 OP_RETURN detectado (presencia/tamaño), banda BAJA
7 Legacy P2PKH simple 0b6461de422c46a221db99608fcbe0326e4f2325ebf2a47c9faf660ed61ee6a4 Tipo legacy, fingerprint conservador, banda MEDIA/BAJA
8 Taproot script-path 37777defed8717c581b4c0509329550e344bdc14ac38f71fc050096887e535c8 Taproot reconocido
9 Bare multisig 60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1 Multisig reconocido
10 OP_RETURN con datos ASCII 8bae12b5f4c088d940733dcd1455efc6a3a69cf9340e17a981286d3778615684 OP_RETURN detectado (solo presencia/tamaño, no mostrar contenido)

Direcciones

# Tipo address Resultado esperado Verificado
A Máxima reutilización (Satoshi genesis) 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa Reutilización crítica, banda BAJA extrema

Orden de privacidad esperado (coherencia global)

El motor debería ordenar la privacidad de forma coherente, de más a menos:

Whirlpool / WabiSabi  >  Taproot simple  >  Legacy simple  >  Batch  >  Dust / Satoshi

Si un batch sale con mejor banda que un Whirlpool, hay una incoherencia.


Matices de honestidad (no basta con que la banda sea correcta)

Un motor honesto no es un animador. Estos matices distinguen una herramienta seria de una que da palmaditas. Revisar que los textos los respetan:

Whirlpool / CoinJoin

  • Premia la mezcla (banda ALTA) pero sin vender humo: es alta privacidad en ESTA transacción, no anonimato permanente. Si luego se gastan mal las monedas (juntándolas, mandándolas a exchange KYC), se tira la mezcla.
  • El tamaño del anonymity set importa: no dar el mismo "ALTA" a una mezcla floja (pocos participantes) que a una buena.
  • Honestidad sobre lo que NO ve: en una sola tx no se sabe si eres quien entra o sale, ni qué pasó antes/después. El motor juzga la foto, no la historia (eso lo completa el rastro de procedencia).
  • No penalizar lo normal de un CoinJoin (outputs iguales, wallet identificado): es el objetivo, no un fallo.

Batch payment (de exchange)

  • Detectar que es un BATCH y no confundirlo con CoinJoin. Un CoinJoin mezcla para ocultar; un batch solo agrupa pagos. Si dice "CoinJoin" cuando es batch, el motor miente.
  • Banda MEDIA/BAJA.
  • Texto neutro: informar sin juzgar ni consolar.
    • Nada de "no es culpa tuya" (paternalista; un noderunner quiere el dato).
    • Sí dejar claro que los pagos vienen de un exchange/servicio (implica KYC, custodia de terceros).
    • Explicar el riesgo seco: se comparte origen con los otros destinatarios del lote, un observador puede agruparlos.

Dust attack

  • Detectar que es polvo enviado a propósito (cantidad mínima inesperada), marcar esa moneda, banda BAJA.
  • Explicar qué es y su consecuencia: gastarlo junto a otras monedas vincularía esa marca con el resto del wallet.
  • Tono neutro: informar la consecuencia, no aconsejar qué hacer. (La trampa del dust es que el usuario asustado lo gasta "para quitárselo" y se autovincula; el tono neutro informa sin dirigir y confía en que el usuario decide.)

Regla general

Txoko informa, no aconseja. Da el dato y la consecuencia; el usuario decide.


Registro de hallazgos (lo que han cazado los fixtures)

2026-06-03 — Fixture #4 (batch payment)

Al validar un batch real de 144 outputs (F2Pool) se encontraron tres fallos, todos corregidos:

  1. La banda daba ALTA a un batch (no penalizaba). Ahora el batch penaliza (peso 45) y un batch claro cae a MEDIA.
  2. El texto del check de batch decía "esto no es un fallo tuyo" (paternalista, contra la regla de diseño). Reescrito en tono neutro, explicando el riesgo real (compartir origen con los otros destinatarios del lote).
  3. La descripción de la banda decía "buenas propiedades de privacidad" aun cuando la banda era MEDIA (umbrales del texto descuadrados respecto a la banda). Alineados a 75/45.

También se observó (anotado, no bloqueante): el badge de certeza junto al título de cada check (CERTEZA/PROBABLE/POSIBLE) puede confundir cuando el check da resultado negativo —por ejemplo "Estructura CoinJoin / mezcla — PROBABLE" cuando en realidad NO hay CoinJoin (el resultado real está en el detalle, no en el badge). Pendiente de mejorar la claridad de la presentación.