|
|
@@ -1480,8 +1480,10 @@
|
|
|
|
input_reuse: 25, input_type_mixing: 14, output_type_mismatch: 8,
|
|
|
|
input_reuse: 25, input_type_mixing: 14, output_type_mismatch: 8,
|
|
|
|
round_numbers: 10, rbf: 5, peeling: 8,
|
|
|
|
round_numbers: 10, rbf: 5, peeling: 8,
|
|
|
|
unnecessary_input: 12, dust: 8, change_detection: 10,
|
|
|
|
unnecessary_input: 12, dust: 8, change_detection: 10,
|
|
|
|
wallet_fingerprint: 6, batch_payment: 45, entity_ofac: 20, op_return: 30, legacy_type: 15,
|
|
|
|
wallet_fingerprint: 6, batch_payment: 45, op_return: 30, legacy_type: 15,
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
// entity_ofac y rbf no aparecen aquí a propósito: ninguno de los dos
|
|
|
|
|
|
|
|
// reduce tu privacidad. Ver sus checks para el razonamiento.
|
|
|
|
let deductions = 0;
|
|
|
|
let deductions = 0;
|
|
|
|
|
|
|
|
|
|
|
|
const totalIn = tx.vin.reduce((s,v)=>s+(v.prevout?v.prevout.value:0),0);
|
|
|
|
const totalIn = tx.vin.reduce((s,v)=>s+(v.prevout?v.prevout.value:0),0);
|
|
|
@@ -1616,7 +1618,7 @@
|
|
|
|
id:"output_type_mismatch", label:"Tipo de output revela el cambio", certainty:"PROBABLE", pass:!hasOutputMismatch,
|
|
|
|
id:"output_type_mismatch", label:"Tipo de output revela el cambio", certainty:"PROBABLE", pass:!hasOutputMismatch,
|
|
|
|
actionability: "no_corregible",
|
|
|
|
actionability: "no_corregible",
|
|
|
|
detail: hasOutputMismatch ? mismatchDetail : "Los outputs son del mismo tipo que los inputs — no se puede distinguir cuál es el cambio por tipo de script.",
|
|
|
|
detail: hasOutputMismatch ? mismatchDetail : "Los outputs son del mismo tipo que los inputs — no se puede distinguir cuál es el cambio por tipo de script.",
|
|
|
|
didactic: "Cuando pagas a alguien que usa un tipo de script distinto al tuyo, tu output de cambio queda identificado porque es el único del mismo tipo que tus inputs. Un analista puede identificarlo sin ambigüedad.",
|
|
|
|
didactic: "Tu wallet devuelve el cambio a una dirección del mismo tipo que las que gasta. Así que si pagas a alguien con un formato distinto al tuyo, el cambio se delata solo: es la salida que coincide con tus entradas. La señal es fuerte, pero no infalible — si quien cobra usa tu mismo formato, o si te pagas a ti mismo, deja de distinguirse. Por eso es probable y no certeza.",
|
|
|
|
penalty: weights.output_type_mismatch,
|
|
|
|
penalty: weights.output_type_mismatch,
|
|
|
|
});
|
|
|
|
});
|
|
|
|
if (hasOutputMismatch) deductions += weights.output_type_mismatch;
|
|
|
|
if (hasOutputMismatch) deductions += weights.output_type_mismatch;
|
|
|
@@ -1642,25 +1644,28 @@
|
|
|
|
id:"round_numbers", label:"Output de valor redondo", certainty:"PROBABLE", pass:!hasRound,
|
|
|
|
id:"round_numbers", label:"Output de valor redondo", certainty:"PROBABLE", pass:!hasRound,
|
|
|
|
actionability: "evitable",
|
|
|
|
actionability: "evitable",
|
|
|
|
detail: hasRound
|
|
|
|
detail: hasRound
|
|
|
|
? `Output de ${(roundOutputs[0].value/1e8).toFixed(6)} BTC es valor redondo — con alta probabilidad ese es el pago y el otro output es el cambio.`
|
|
|
|
? `Hecho (certeza): uno de los dos outputs vale exactamente ${(roundOutputs[0].value/1e8).toFixed(6)} BTC, una cifra redonda. Interpretación (probable): las personas pagan cantidades redondas y el cambio sale de la resta, así que ese suele ser el pago y el otro el cambio. No siempre: una consolidación o un pago calculado al céntimo rompen la regla. Consecuencia: si acierta, queda señalada la dirección de cambio del emisor — y con ella, por dónde seguir sus gastos futuros.`
|
|
|
|
: "No se detectan outputs de valor redondo en una estructura de 2 outputs.",
|
|
|
|
: "No se detectan outputs de valor redondo en una estructura de 2 outputs.",
|
|
|
|
didactic: "Las personas pagan cantidades redondas (0.001, 0.01, 0.1 BTC). Con dos outputs, el redondo es el pago y el irregular es el cambio. Esto identifica la dirección de cambio del emisor y permite rastrear sus futuros gastos.",
|
|
|
|
didactic: "Las personas pagan cantidades redondas (0,001, 0,01, 0,1 BTC) y el cambio es lo que sobra, con todos sus decimales. De ahí la regla: en una transacción de dos salidas, la redonda suele ser el pago y la irregular el cambio. Suele, no siempre — hay consolidaciones y pagos calculados al céntimo que la desmienten. Cuando acierta, identifica la dirección de cambio del emisor, que es la puerta para seguir sus gastos posteriores.",
|
|
|
|
penalty: weights.round_numbers,
|
|
|
|
penalty: weights.round_numbers,
|
|
|
|
});
|
|
|
|
});
|
|
|
|
if (hasRound) deductions += weights.round_numbers;
|
|
|
|
if (hasRound) deductions += weights.round_numbers;
|
|
|
|
|
|
|
|
|
|
|
|
// ── 6. RBF ────────────────────────────────────────────────────────
|
|
|
|
// ── 6. RBF ────────────────────────────────────────────────────────
|
|
|
|
const rbfEnabled = tx.vin.some(v=>typeof v.sequence==="number" && v.sequence < 0xfffffffe);
|
|
|
|
const rbfEnabled = tx.vin.some(v=>typeof v.sequence==="number" && v.sequence < 0xfffffffe);
|
|
|
|
|
|
|
|
// Informativo, NO penaliza: RBF es buena práctica (te deja desatascar
|
|
|
|
|
|
|
|
// una transacción sin sobrepagar de entrada) y hoy es tan común que
|
|
|
|
|
|
|
|
// distingue poco. Restar puntos por usarlo empujaría al usuario hacia
|
|
|
|
|
|
|
|
// una decisión peor para ahorrar una señal débil — mal negocio.
|
|
|
|
checks.push({
|
|
|
|
checks.push({
|
|
|
|
id:"rbf", label:"RBF activado (Replace-by-Fee)", certainty:"CERTEZA", pass:!rbfEnabled,
|
|
|
|
id:"rbf", label:"RBF activado (Replace-by-Fee)", certainty:"CERTEZA", pass:true,
|
|
|
|
|
|
|
|
informational: true,
|
|
|
|
actionability: "wallet",
|
|
|
|
actionability: "wallet",
|
|
|
|
detail: rbfEnabled
|
|
|
|
detail: rbfEnabled
|
|
|
|
? "RBF opt-in activado (sequence < 0xFFFFFFFE). Revela software de wallet y permite correlacionar transacciones reemplazadas en la mempool."
|
|
|
|
? "Hecho (certeza): RBF opt-in activado (sequence < 0xFFFFFFFE). Interpretación (débil): es un rasgo del wallet que lo firmó, pero hoy lo activan por defecto la mayoría, así que distingue poco. Consecuencia: si llegaste a reemplazar la transacción, un observador con vista a la mempool pudo ver ambas versiones y relacionarlas."
|
|
|
|
: "RBF no activado.",
|
|
|
|
: "Hecho (certeza): RBF no activado — la transacción no era reemplazable.",
|
|
|
|
didactic: "Replace-by-Fee permite sustituir una transacción pendiente por otra con mayor fee. Bitcoin Core lo activa por defecto desde v0.12. Su presencia es una firma de wallet que los analistas usan para vincular transacciones relacionadas.",
|
|
|
|
didactic: "Replace-by-Fee permite sustituir una transacción pendiente por otra con más comisión. Bitcoin Core lo activa por defecto desde la v0.12. No resta privacidad y sí evita que te quedes atascado pagando de más «por si acaso», así que aquí es informativo y no penaliza: no tiene sentido empujarte a gastar peor para esconder una señal que casi todo el mundo emite igual.",
|
|
|
|
penalty: weights.rbf,
|
|
|
|
|
|
|
|
});
|
|
|
|
});
|
|
|
|
if (rbfEnabled) deductions += weights.rbf;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ── 7. Unnecessary input ─────────────────────────────────────────
|
|
|
|
// ── 7. Unnecessary input ─────────────────────────────────────────
|
|
|
|
let hasUnnecessaryInput = false;
|
|
|
|
let hasUnnecessaryInput = false;
|
|
|
@@ -1692,7 +1697,7 @@
|
|
|
|
detail: likelyCJ
|
|
|
|
detail: likelyCJ
|
|
|
|
? `En un CoinJoin todos los inputs son necesarios por diseño del protocolo — cada participante aporta los suyos. Esta heurística no aplica.`
|
|
|
|
? `En un CoinJoin todos los inputs son necesarios por diseño del protocolo — cada participante aporta los suyos. Esta heurística no aplica.`
|
|
|
|
: (hasUnnecessaryInput ? unnecessaryDetail : "No se detectan inputs claramente innecesarios para cubrir el pago."),
|
|
|
|
: (hasUnnecessaryInput ? unnecessaryDetail : "No se detectan inputs claramente innecesarios para cubrir el pago."),
|
|
|
|
didactic: "Si una transacción tiene más inputs de los necesarios para cubrir el pago, el emisor estaba consolidando UTXOs. Esto revela que esos UTXOs pertenecen al mismo propietario y es una de las heurísticas más usadas en chain analysis real.",
|
|
|
|
didactic: "Si una transacción aporta más entradas de las que hacían falta para cubrir el pago, lo habitual es que el emisor estuviera consolidando monedas sueltas. Gastarlas juntas es lo que las delata: cualquiera que mire asume que son del mismo dueño. Esa suposición —la heurística CIOH— es la más usada del análisis de cadena y acierta casi siempre, pero no es una ley: un CoinJoin o un pago colaborativo la desmienten por diseño. Por eso aquí se marca como probable y no como certeza.",
|
|
|
|
penalty: likelyCJ ? 0 : weights.unnecessary_input,
|
|
|
|
penalty: likelyCJ ? 0 : weights.unnecessary_input,
|
|
|
|
});
|
|
|
|
});
|
|
|
|
// En CoinJoin múltiples inputs son la estructura del protocolo — no penaliza.
|
|
|
|
// En CoinJoin múltiples inputs son la estructura del protocolo — no penaliza.
|
|
|
@@ -1905,13 +1910,13 @@
|
|
|
|
const zone = hour >= 6 && hour <= 10 ? "mañana temprana (Europa/África)" :
|
|
|
|
const zone = hour >= 6 && hour <= 10 ? "mañana temprana (Europa/África)" :
|
|
|
|
hour >= 14 && hour <= 18 ? "tarde europea / mañana americana" :
|
|
|
|
hour >= 14 && hour <= 18 ? "tarde europea / mañana americana" :
|
|
|
|
hour >= 22 || hour <= 2 ? "madrugada Europa / tarde América" : "horario sin patrón claro";
|
|
|
|
hour >= 22 || hour <= 2 ? "madrugada Europa / tarde América" : "horario sin patrón claro";
|
|
|
|
timingDetail = `Confirmada el ${dayNames[day]} a las ${hour}:00 UTC — ${zone}.${day===0||day===6?" · fin de semana":""}`;
|
|
|
|
timingDetail = `Hecho (certeza): el bloque que la confirmó se minó el ${dayNames[day]} a las ${hour}:00 UTC${day===0||day===6?" (fin de semana)":""}. Interpretación (posible): compatible con ${zone}, pero con una sola transacción no se puede afirmar nada — y el bloque se mina cuando se mina, no cuando se firmó la transacción, que pudo esperar minutos u horas en la mempool. Consecuencia: ninguna por sí sola; el horario solo sirve a quien acumula muchas de tus transacciones y busca un patrón.`;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
checks.push({
|
|
|
|
checks.push({
|
|
|
|
id:"timing", label:"Análisis temporal", certainty:"POSIBLE", pass:true,
|
|
|
|
id:"timing", label:"Análisis temporal", certainty:"POSIBLE", pass:true,
|
|
|
|
actionability: "evitable",
|
|
|
|
actionability: "evitable",
|
|
|
|
detail: timingDetail,
|
|
|
|
detail: timingDetail,
|
|
|
|
didactic: "El horario de las transacciones revela la zona horaria y rutinas del usuario. Transacciones consistentemente a las 8-10 UTC apuntan a Europa. Es una señal débil en aislamiento pero útil combinada con otras.",
|
|
|
|
didactic: "Acumulando muchas transacciones de la misma persona, el horario acaba dibujando su huso horario y sus rutinas: cuándo duerme, si opera en horario laboral, si descansa los fines de semana. Aquí solo ves una, así que no hay patrón que leer — este dato solo cobra sentido para quien ya ha reunido un historial tuyo. Ojo además con la hora que se muestra: es la del bloque, no la de tu firma. Entre una y otra puede haber esperado en la mempool.",
|
|
|
|
penalty: 0, informational: true,
|
|
|
|
penalty: 0, informational: true,
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
@@ -1952,18 +1957,31 @@
|
|
|
|
if (hit.cat === "exchange") exchHits.push({ ...hit, addr, side });
|
|
|
|
if (hit.cat === "exchange") exchHits.push({ ...hit, addr, side });
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// OFAC — crítico, penaliza
|
|
|
|
// OFAC — informativo, NO penaliza la banda de privacidad.
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// Es deliberado y conviene entender por qué: un hit de OFAC no revela
|
|
|
|
|
|
|
|
// absolutamente nada más sobre ti. Tu privacidad es idéntica antes y
|
|
|
|
|
|
|
|
// después de saberlo. Lo que cambia es otra cosa —la probabilidad de que
|
|
|
|
|
|
|
|
// un servicio regulado te bloquee un depósito—, y eso es un eje distinto:
|
|
|
|
|
|
|
|
// censurabilidad, no privacidad.
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// Restar puntos aquí sería, además, dar por buena la idea de "monedas
|
|
|
|
|
|
|
|
// contaminadas": que una moneda vale menos según por dónde ha pasado.
|
|
|
|
|
|
|
|
// Bitcoin es fungible por diseño; la contaminación no es una propiedad
|
|
|
|
|
|
|
|
// de las monedas, es una construcción de la industria de cumplimiento
|
|
|
|
|
|
|
|
// normativo. Una herramienta que audita privacidad no debería
|
|
|
|
|
|
|
|
// internalizar la lógica del adversario. Se informa del riesgo real —que
|
|
|
|
|
|
|
|
// existe— sin fingir que es un problema de privacidad.
|
|
|
|
if (ofacHits.length > 0) {
|
|
|
|
if (ofacHits.length > 0) {
|
|
|
|
const names = [...new Set(ofacHits.map(h => h.name))].join(", ");
|
|
|
|
const names = [...new Set(ofacHits.map(h => h.name))].join(", ");
|
|
|
|
const sides = [...new Set(ofacHits.map(h => h.side))];
|
|
|
|
const sides = [...new Set(ofacHits.map(h => h.side))];
|
|
|
|
checks.push({
|
|
|
|
checks.push({
|
|
|
|
id:"entity_ofac", label:"Dirección en lista de sanciones OFAC", certainty:"CERTEZA", pass:false,
|
|
|
|
id:"entity_ofac", label:"Dirección en lista de sanciones OFAC", certainty:"CERTEZA", pass:true,
|
|
|
|
|
|
|
|
informational: true,
|
|
|
|
actionability: "no_corregible",
|
|
|
|
actionability: "no_corregible",
|
|
|
|
detail: `Una o más direcciones de esta transacción (${sides.join(" y ")}) aparecen en la lista de sanciones OFAC: ${names}. Esto no implica que hayas actuado ilegalmente, pero tus fondos han estado en contacto con una entidad sancionada internacionalmente. Los exchanges con KYC pueden usar este dato para bloquear o congelar depósitos relacionados.`,
|
|
|
|
detail: `Hecho (certeza): una o más direcciones de esta transacción (${sides.join(" y ")}) figuran en la lista OFAC: ${names}. Interpretación: ninguna — la coincidencia no dice nada sobre tu conducta ni sobre la de nadie; solo que esa dirección está en una lista. Consecuencia: un servicio regulado que consulte esa lista puede bloquear o congelar depósitos que relacione con estas direcciones. No afecta a tu privacidad: nadie sabe más de ti por esto, y por eso no resta puntos a la banda.`,
|
|
|
|
didactic: "La OFAC (Office of Foreign Assets Control, EE.UU.) mantiene una lista de direcciones de entidades sancionadas: mixers como Blender.io o Sinbad, exchanges como Garantex o Suex, y grupos como Lazarus. La lista es de dominio público y la usan los servicios regulados. Una coincidencia es un hecho verificable, no una probabilidad.",
|
|
|
|
didactic: "La OFAC es la oficina de control de activos del Tesoro de EE.UU. Su lista es una decisión política de un gobierno concreto, no una determinación judicial de criminalidad: incluye mixers (Blender.io, Sinbad), exchanges (Garantex, Suex) y grupos como Lazarus, pero también ha incluido software libre — las sanciones a Tornado Cash fueron revertidas en parte por un tribunal federal tras ser recurridas. Si no estás bajo jurisdicción estadounidense, esa lista no te obliga a nada; el problema práctico llega por los intermediarios que sí la aplican. Aquí se informa como riesgo de censura, no como defecto de privacidad, porque son cosas distintas: tus monedas no valen menos por dónde hayan pasado. Esa es justamente la idea que la fungibilidad de Bitcoin niega.",
|
|
|
|
penalty: weights.entity_ofac,
|
|
|
|
|
|
|
|
});
|
|
|
|
});
|
|
|
|
deductions += weights.entity_ofac;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Mining pools — informativo, cierra el rastro
|
|
|
|
// Mining pools — informativo, cierra el rastro
|
|
|
@@ -4419,7 +4437,9 @@
|
|
|
|
const recommendations = [
|
|
|
|
const recommendations = [
|
|
|
|
{ text:"Si las claves del wallet de origen pudieron verse comprometidas, genera una semilla nueva y traslada cualquier fondo restante — no reutilices el material comprometido." },
|
|
|
|
{ text:"Si las claves del wallet de origen pudieron verse comprometidas, genera una semilla nueva y traslada cualquier fondo restante — no reutilices el material comprometido." },
|
|
|
|
{ text:"Revisa el dispositivo donde vivía el wallet (malware, acceso físico no autorizado, backups expuestos) antes de asumir que el vector de entrada está cerrado." },
|
|
|
|
{ text:"Revisa el dispositivo donde vivía el wallet (malware, acceso físico no autorizado, backups expuestos) antes de asumir que el vector de entrada está cerrado." },
|
|
|
|
{ text:"Para una denuncia: aporta este informe completo junto con los txids listados en el anexo de verificación. Cualquiera puede comprobarlos de forma independiente." },
|
|
|
|
{ text:"Si decides denunciar, este informe completo y los txids del anexo son lo que hace falta: cualquiera puede comprobarlos de forma independiente, sin depender de Txoko ni de ningún servicio." },
|
|
|
|
|
|
|
|
{ text:"Antes de denunciar, ten claro el precio. Entregar este informe vincula tu identidad legal con esas direcciones de forma permanente, ante una autoridad que puede compartir el expediente con empresas de análisis de cadena. Esa vinculación no se deshace y alcanza también a las direcciones que solo aparecen de refilón. Puede compensar — recuperar fondos, frenar a quien lo hizo — o puede no compensar. Es tu decisión, y para tomarla hace falta saber las dos caras." },
|
|
|
|
|
|
|
|
{ text:"Este informe contiene tus direcciones y tu declaración. Trátalo como material sensible: no lo subas a foros, chats de soporte, grupos ni servicios en la nube para pedir ayuda. Todo el cuidado de no filtrar nada a la red se pierde en el momento en que este archivo sale de tu equipo." },
|
|
|
|
];
|
|
|
|
];
|
|
|
|
if (declaracion) {
|
|
|
|
if (declaracion) {
|
|
|
|
recommendations.push({
|
|
|
|
recommendations.push({
|
|
|
@@ -5446,6 +5466,13 @@
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
{/* El análisis no sale de la red del usuario, pero el archivo
|
|
|
|
|
|
|
|
exportado sí puede salir — y lleva sus direcciones dentro.
|
|
|
|
|
|
|
|
Avisar aquí, junto a los botones, no en la letra pequeña. */}
|
|
|
|
|
|
|
|
<div style={{marginBottom:14,padding:"8px 12px",background:C.amberMuted,border:`1px solid ${C.amber}30`,borderRadius:6,fontSize:"0.62rem",color:C.amber,fontFamily:"monospace",lineHeight:1.6}}>
|
|
|
|
|
|
|
|
Lo que descargues lleva dentro tus direcciones y tu declaración. Nada de esto ha salido de tu red hasta ahora; a partir de aquí depende de ti. No lo subas a foros, chats de soporte ni servicios en la nube para pedir ayuda.
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
{trace&&!trace.done&&trace.hop>report.summary.hops&&(
|
|
|
|
{trace&&!trace.done&&trace.hop>report.summary.hops&&(
|
|
|
|
<div style={{marginBottom:14,padding:"8px 12px",background:C.amberMuted,border:`1px solid ${C.amber}30`,borderRadius:6,fontSize:"0.62rem",color:C.amber,fontFamily:"monospace"}}>
|
|
|
|
<div style={{marginBottom:14,padding:"8px 12px",background:C.amberMuted,border:`1px solid ${C.amber}30`,borderRadius:6,fontSize:"0.62rem",color:C.amber,fontFamily:"monospace"}}>
|
|
|
|
Este informe se generó en el salto {report.summary.hops} — el rastreo ya lleva {trace.hop}. Genera de nuevo para incluir lo explorado desde entonces.
|
|
|
|
Este informe se generó en el salto {report.summary.hops} — el rastreo ya lleva {trace.hop}. Genera de nuevo para incluir lo explorado desde entonces.
|
|
|
@@ -6172,12 +6199,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
{/* Intro */}
|
|
|
|
{/* Intro */}
|
|
|
|
<Section id="intro" title="¿Qué es Txoko Node Dashboard?" accent={C.green}>
|
|
|
|
<Section id="intro" title="¿Qué es Txoko Node Dashboard?" accent={C.green}>
|
|
|
|
<P>Txoko Node Dashboard es una herramienta de análisis Bitcoin diseñada para usuarios que gestionan su propio nodo completo. Permite explorar la blockchain, analizar la privacidad de transacciones y monitorizar el estado del nodo, todo desde tu propia infraestructura.</P>
|
|
|
|
<P>Txoko audita tu privacidad Bitcoin sobre tu propio nodo. Te dice qué puede deducir un observador externo de tus transacciones — y lo hace sin convertirse él mismo en ese observador.</P>
|
|
|
|
<P>A diferencia de exploradores públicos como Mempool.space o Blockchair, <strong style={{color:C.t1}}>ninguna consulta sale de tu red privada</strong>. Tu nodo responde directamente: nadie sabe qué direcciones o transacciones estás investigando.</P>
|
|
|
|
<P>Cuando consultas una dirección en un explorador público, ese explorador aprende qué te interesa. Aquí <strong style={{color:C.t1}}>ninguna consulta sale de tu red</strong>: responde tu nodo, y nadie —tampoco nosotros— sabe qué estás investigando.</P>
|
|
|
|
<H color={C.amber}>Principios de diseño</H>
|
|
|
|
<H color={C.amber}>Principios de diseño</H>
|
|
|
|
<Li><strong style={{color:C.t1}}>Privacidad total</strong> — todas las consultas van a tu nodo. Sin telemetría, sin logs externos, sin CDNs de terceros para datos sensibles.</Li>
|
|
|
|
<Li><strong style={{color:C.t1}}>Privacidad total</strong> — todas las consultas van a tu nodo. Sin telemetría, sin logs externos y sin CDNs: hasta las librerías y las fuentes se sirven desde tu propia máquina, así que ni siquiera se filtra <em>que</em> estás usando Txoko. El dashboard funciona sin conexión a internet.</Li>
|
|
|
|
<Li><strong style={{color:C.t1}}>Datos fiables</strong> — cada análisis indica explícitamente su nivel de certeza: CERTEZA, PROBABLE o POSIBLE. Nunca presentamos heurísticas como hechos.</Li>
|
|
|
|
<Li><strong style={{color:C.t1}}>Datos fiables</strong> — cada análisis indica explícitamente su nivel de certeza: CERTEZA, PROBABLE o POSIBLE. Nunca presentamos heurísticas como hechos.</Li>
|
|
|
|
<Li><strong style={{color:C.t1}}>Soberanía</strong> — el dashboard es un único archivo HTML estático. Sin dependencias de servidor, sin base de datos, sin cuentas.</Li>
|
|
|
|
<Li><strong style={{color:C.t1}}>Soberanía</strong> — todo el código de análisis cabe en un archivo HTML sin compilar: lo que lees es lo que se ejecuta. Sin base de datos, sin cuentas, sin servidor que dependa de nadie.</Li>
|
|
|
|
|
|
|
|
<Li><strong style={{color:C.t1}}>Sí, esto es chain analysis</strong> — el peritaje usa las mismas técnicas que las empresas de vigilancia de cadena. Lo que cambia es quién las ejecuta (tú), sobre qué (lo tuyo), dónde se detiene (en un servicio, nunca en una persona) y quién se queda el informe (tú). Y hay una razón de más peso: la misma herramienta que sigue el rastro de un ladrón demuestra lo fácil que es seguir el tuyo. Conocer el arma no es adoptarla.</Li>
|
|
|
|
<Callout color={C.green}>Este proyecto es software libre desarrollado por y para la comunidad Bitcoin Txoko. Contribuciones y mejoras son bienvenidas en nuestro Gitea.</Callout>
|
|
|
|
<Callout color={C.green}>Este proyecto es software libre desarrollado por y para la comunidad Bitcoin Txoko. Contribuciones y mejoras son bienvenidas en nuestro Gitea.</Callout>
|
|
|
|
</Section>
|
|
|
|
</Section>
|
|
|
|
|
|
|
|
|
|
|
|