feat: rastro de procedencia recursivo + arreglo falso positivo CoinJoin
This commit is contained in:
+18
-8
@@ -16,14 +16,24 @@ y el versionado sigue [Versionado Semántico](https://semver.org/lang/es/):
|
|||||||
|
|
||||||
### Añadido
|
### Añadido
|
||||||
|
|
||||||
- Rastro de procedencia (primera versión). En la pestaña Auditoría, debajo
|
- Rastro de procedencia. En la pestaña Auditoría, debajo del informe de
|
||||||
del informe de privacidad, cada input de la transacción tiene un botón
|
privacidad, cada input de la transacción tiene un botón "seguir rastro" que
|
||||||
"seguir rastro" que trae la transacción de origen de ese input y muestra un
|
trae su transacción de origen y muestra un eslabón con: el txid de origen
|
||||||
eslabón con: el txid de origen (enlace a tu propio Mempool), cuánto fluyó,
|
(enlace a tu propio Mempool), cuánto fluyó, la fecha, la banda de privacidad
|
||||||
la fecha y la banda de privacidad de esa transacción. Funciona bajo demanda
|
de esa transacción y marcas relevantes (CoinJoin, OFAC, minería, coinbase).
|
||||||
—cada consulta la pide el usuario, para no sobrecargar el nodo— y cachea en
|
- El rastro es recursivo: desde cada eslabón se puede seguir bajando por sus
|
||||||
memoria las transacciones ya consultadas para no repetirlas. Incluye botón
|
propios inputs, encadenando saltos hacia atrás nivel a nivel. Funciona bajo
|
||||||
para limpiar el rastro y la caché de la sesión.
|
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).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
+5
-1
@@ -2401,7 +2401,11 @@
|
|||||||
if(hit?.cat==="mining") mining=true;
|
if(hit?.cat==="mining") mining=true;
|
||||||
}
|
}
|
||||||
const esCoinbase=(txData.vin||[]).some(v=>v.is_coinbase||v.coinbase)||(txData.vin||[]).length===0;
|
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(ofac) marcas.push({txt:"⚠️ OFAC",color:C.red});
|
||||||
if(mining) marcas.push({txt:"⛏️ minería",color:C.green});
|
if(mining) marcas.push({txt:"⛏️ minería",color:C.green});
|
||||||
if(esCoinbase) marcas.push({txt:"⛏️ coinbase (origen)",color:C.green});
|
if(esCoinbase) marcas.push({txt:"⛏️ coinbase (origen)",color:C.green});
|
||||||
|
|||||||
Reference in New Issue
Block a user