From d3971de3a8322f09ea7fbbb41f299a54fcd69cff Mon Sep 17 00:00:00 2001 From: Aitor Date: Tue, 2 Jun 2026 19:17:58 +0200 Subject: [PATCH] feat: rastro de procedencia recursivo + arreglo falso positivo CoinJoin --- CHANGELOG.md | 26 ++++++++++++++++++-------- dashboard.html | 6 +++++- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1dc0504..7fd1ec6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,14 +16,24 @@ y el versionado sigue [Versionado Semántico](https://semver.org/lang/es/): ### Añadido -- Rastro de procedencia (primera versión). En la pestaña Auditoría, debajo - del informe de privacidad, cada input de la transacción tiene un botón - "seguir rastro" que trae la transacción de origen de ese input y muestra un - eslabón con: el txid de origen (enlace a tu propio Mempool), cuánto fluyó, - la fecha y la banda de privacidad de esa transacción. Funciona bajo demanda - —cada consulta la pide el usuario, para no sobrecargar el nodo— y cachea en - memoria las transacciones ya consultadas para no repetirlas. Incluye botón - para limpiar el rastro y la caché de la sesión. +- Rastro de procedencia. En la pestaña Auditoría, debajo del informe de + privacidad, cada input de la transacción tiene un botón "seguir rastro" que + trae su transacción de origen y muestra un eslabón con: el txid de origen + (enlace a tu propio Mempool), cuánto fluyó, la fecha, la banda de privacidad + de esa transacción y marcas relevantes (CoinJoin, OFAC, minería, coinbase). +- El rastro es recursivo: desde cada eslabón se puede seguir bajando por sus + propios inputs, encadenando saltos hacia atrás nivel a nivel. Funciona bajo + demanda —cada consulta la pide el usuario, para no sobrecargar el nodo— y + comparte una caché en memoria para no repetir transacciones ya consultadas. + Incluye un límite de profundidad y un botón para limpiar el rastro. + +### Corregido + +- Detección de CoinJoin en el rastro: antes marcaba como CoinJoin cualquier + transacción cuyo análisis mencionara la palabra (lo que ocurría siempre, + porque existe un indicador con ese nombre aunque dé negativo), produciendo + falsos positivos. Ahora la marca solo aparece cuando el indicador de CoinJoin + da positivo de verdad (estructura de varios inputs y salidas de igual valor). --- diff --git a/dashboard.html b/dashboard.html index ae42f80..e84dcd1 100644 --- a/dashboard.html +++ b/dashboard.html @@ -2401,7 +2401,11 @@ if(hit?.cat==="mining") mining=true; } const esCoinbase=(txData.vin||[]).some(v=>v.is_coinbase||v.coinbase)||(txData.vin||[]).length===0; - if(ana?.band==="ALTA"&&/coinjoin|whirlpool|mezcla/i.test(JSON.stringify(ana.checks||[]))) marcas.push({txt:"🔀 CoinJoin",color:C.blue}); + // CoinJoin real: el check con id "coinjoin" dio pass:true (5+ in, 5+ out + // con valores iguales). NO buscar la palabra en el texto: el check existe + // siempre, incluso cuando dice que NO es CoinJoin -> daría falso positivo. + const esCoinJoin = (ana?.checks||[]).find(c=>c.id==="coinjoin")?.pass === true; + if(esCoinJoin) marcas.push({txt:"🔀 CoinJoin",color:C.blue}); if(ofac) marcas.push({txt:"⚠️ OFAC",color:C.red}); if(mining) marcas.push({txt:"⛏️ minería",color:C.green}); if(esCoinbase) marcas.push({txt:"⛏️ coinbase (origen)",color:C.green});