Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
@@ -186,8 +186,8 @@ def analizar_transaccion(tx_id):
|
|
186 |
if es_mixer:
|
187 |
mensaje_mixer = (
|
188 |
"<p style='color: #FF5252;'><strong>Alerta de Mixer / CoinJoin:</strong> "
|
189 |
-
"La transacción presenta patrones compatibles con un servicio de mezcla (CoinJoin) "
|
190 |
-
"
|
191 |
)
|
192 |
else:
|
193 |
mensaje_mixer = (
|
@@ -226,29 +226,59 @@ def analizar_transaccion(tx_id):
|
|
226 |
except Exception as e:
|
227 |
return f"⚠️ Error durante el análisis: {str(e)}", None
|
228 |
|
|
|
229 |
with gr.Blocks(theme=gr.themes.Soft(), title="🔍 Detector de Mixers / CoinJoin en Transacciones Bitcoin") as demo:
|
230 |
gr.Markdown("# 🔍 Detector de Mixers / CoinJoin en Transacciones Bitcoin")
|
231 |
gr.Markdown("Desarrollado por José R. Leonett para la comunidad de Peritos Forenses Digitales de Guatemala [www.forensedigital.gt](http://www.forensedigital.gt)")
|
232 |
-
gr.Markdown("**Nota:** Este analizador funciona únicamente con transacciones de Bitcoin. "
|
233 |
-
"No se pueden analizar transacciones de Ethereum u otro tipo de criptomoneda.")
|
234 |
|
235 |
with gr.Row():
|
|
|
236 |
with gr.Column(scale=1):
|
237 |
-
|
238 |
-
|
|
|
|
|
|
|
|
|
|
|
239 |
btn = gr.Button("Analizar Transacción")
|
240 |
gr.Markdown("### Ejemplos de TXIDs válidos:")
|
241 |
gr.Examples(
|
242 |
examples=[
|
243 |
-
["
|
244 |
-
["
|
245 |
],
|
246 |
inputs=tx_input
|
247 |
)
|
248 |
-
|
|
|
|
|
249 |
reporte_html = gr.HTML()
|
250 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
251 |
|
|
|
252 |
btn.click(fn=analizar_transaccion, inputs=tx_input, outputs=[reporte_html, plot_output])
|
253 |
-
|
254 |
demo.launch()
|
|
|
186 |
if es_mixer:
|
187 |
mensaje_mixer = (
|
188 |
"<p style='color: #FF5252;'><strong>Alerta de Mixer / CoinJoin:</strong> "
|
189 |
+
"La transacción presenta patrones compatibles con un servicio de mezcla (CoinJoin) — "
|
190 |
+
"múltiples entradas/salidas y salidas con valores casi homogéneos. Se recomienda un análisis forense adicional.</p>"
|
191 |
)
|
192 |
else:
|
193 |
mensaje_mixer = (
|
|
|
226 |
except Exception as e:
|
227 |
return f"⚠️ Error durante el análisis: {str(e)}", None
|
228 |
|
229 |
+
# INTERFAZ GRÁFICA CON GRADIO
|
230 |
with gr.Blocks(theme=gr.themes.Soft(), title="🔍 Detector de Mixers / CoinJoin en Transacciones Bitcoin") as demo:
|
231 |
gr.Markdown("# 🔍 Detector de Mixers / CoinJoin en Transacciones Bitcoin")
|
232 |
gr.Markdown("Desarrollado por José R. Leonett para la comunidad de Peritos Forenses Digitales de Guatemala [www.forensedigital.gt](http://www.forensedigital.gt)")
|
233 |
+
gr.Markdown("**Nota:** Este analizador funciona únicamente con transacciones de Bitcoin. No se pueden analizar transacciones de Ethereum.")
|
|
|
234 |
|
235 |
with gr.Row():
|
236 |
+
# Columna Izquierda: Grafo y controles de entrada
|
237 |
with gr.Column(scale=1):
|
238 |
+
# Espacio para el grafo
|
239 |
+
plot_output = gr.Plot()
|
240 |
+
# Controles de entrada debajo del grafo
|
241 |
+
tx_input = gr.Textbox(
|
242 |
+
label="TXID de la Transacción",
|
243 |
+
placeholder="Ej: 9dd51e2d45f4f7bddcc3f0f7a05c3fd60543a11cfc9fbd0e1ca4434668cfa3e1"
|
244 |
+
)
|
245 |
btn = gr.Button("Analizar Transacción")
|
246 |
gr.Markdown("### Ejemplos de TXIDs válidos:")
|
247 |
gr.Examples(
|
248 |
examples=[
|
249 |
+
["a1075db55d416d3ca199f55b6084e2115b9345e16c5cf302fc80e9d5fbf5d48d"],
|
250 |
+
["a83926f2fba1e446c0d5731a6866e78730fc3e21e31207fc0a3ee56e752843e9"]
|
251 |
],
|
252 |
inputs=tx_input
|
253 |
)
|
254 |
+
|
255 |
+
# Columna Derecha: Resultados y explicación
|
256 |
+
with gr.Column(scale=1):
|
257 |
reporte_html = gr.HTML()
|
258 |
+
explanation_text = """
|
259 |
+
<div style="overflow-y: scroll; height: 200px; border: 1px solid #cccccc; padding: 10px;">
|
260 |
+
<h4>Explicación de los campos:</h4>
|
261 |
+
<ul>
|
262 |
+
<li><strong>TXID:</strong> Identificador único de la transacción.</li>
|
263 |
+
<li><strong>Fecha y Hora:</strong> Fecha y hora de la confirmación de la transacción.</li>
|
264 |
+
<li><strong>Versión:</strong> Versión del protocolo de la transacción.</li>
|
265 |
+
<li><strong>Tamaño:</strong> Tamaño en bytes de la transacción.</li>
|
266 |
+
<li><strong>Peso:</strong> Peso de la transacción en unidades de peso.</li>
|
267 |
+
<li><strong>Fee rate:</strong> Tarifa pagada por byte (sat/byte).</li>
|
268 |
+
<li><strong>Inputs:</strong> Número de entradas utilizadas en la transacción.</li>
|
269 |
+
<li><strong>Outputs:</strong> Número de salidas generadas.</li>
|
270 |
+
<li><strong>Montos únicos en outputs:</strong> Cantidad de valores únicos en las salidas (esto ayuda a detectar patrones de mezcla).</li>
|
271 |
+
<li><strong>Total Entradas:</strong> Suma total de los valores de entrada (en BTC y su equivalente en USD).</li>
|
272 |
+
<li><strong>Total Salidas:</strong> Suma total de los valores de salida (en BTC y su equivalente en USD).</li>
|
273 |
+
<li><strong>Fee:</strong> Diferencia entre entradas y salidas, representa la tarifa de la transacción (en BTC y USD).</li>
|
274 |
+
<li><strong>Estado de Confirmación:</strong> Indica si la transacción está confirmada o no.</li>
|
275 |
+
<li><strong>Alerta de Mixer / CoinJoin:</strong> Indica si se detectaron patrones compatibles con un servicio de mezcla.</li>
|
276 |
+
</ul>
|
277 |
+
</div>
|
278 |
+
"""
|
279 |
+
explanation_box = gr.HTML(value=explanation_text)
|
280 |
|
281 |
+
# Configuración de la acción del botón
|
282 |
btn.click(fn=analizar_transaccion, inputs=tx_input, outputs=[reporte_html, plot_output])
|
283 |
+
|
284 |
demo.launch()
|