docs: documentar watch-only y etiquetas BIP-329 (v1.8.0), guía HTTPS en SETUP
This commit is contained in:
@@ -12,6 +12,52 @@ y el versionado sigue [Versionado Semántico](https://semver.org/lang/es/):
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## [1.8.0] — 2026-06-04
|
||||||
|
|
||||||
|
### Añadido
|
||||||
|
|
||||||
|
- Importación de etiquetas BIP-329. Permite cargar el archivo `.jsonl` que
|
||||||
|
exporta Sparrow (File → Export → Export Labels) para ver tus propias etiquetas
|
||||||
|
junto al análisis. El archivo se lee en memoria del navegador y no sale del
|
||||||
|
nodo. La etiqueta de la transacción analizada aparece de forma destacada bajo
|
||||||
|
el txid, y el modal lista todas las etiquetas cargadas (referencia + etiqueta)
|
||||||
|
para verificar lo que tienes importado.
|
||||||
|
- Watch-only por clave pública extendida (xpub/zpub). Pegando el Master Public
|
||||||
|
Key de Sparrow, Txoko deriva tus direcciones de recepción y cambio en local y
|
||||||
|
marca automáticamente, en cada transacción analizada, qué outputs son tuyos:
|
||||||
|
recepción (verde) o cambio (ámbar), con su valor y etiqueta. Es lo que ningún
|
||||||
|
explorador público puede decirte, porque no conoce tus direcciones. Toda la
|
||||||
|
derivación (BIP32 + bech32) está implementada desde cero con las primitivas
|
||||||
|
del navegador (Web Crypto API), sin librerías externas, fiel a la filosofía de
|
||||||
|
código auditable. El xpub nunca sale del navegador.
|
||||||
|
- Selector del número de direcciones a derivar (20 / 50 / 100 por rama). Más
|
||||||
|
direcciones dan más cobertura para wallets muy usados, a cambio de unos
|
||||||
|
segundos más de cálculo. Se muestran las tres primeras direcciones derivadas
|
||||||
|
para que el usuario verifique, comparándolas con Sparrow, que ha cargado el
|
||||||
|
wallet correcto.
|
||||||
|
- Estado "Dirección sin usar" en el análisis de direcciones. Una dirección sin
|
||||||
|
historial on-chain ya no se muestra como "privacidad aceptable" (que sugería
|
||||||
|
erróneamente que era buena), sino como dirección nueva sin nada que analizar.
|
||||||
|
|
||||||
|
### Cambiado
|
||||||
|
|
||||||
|
- El informe de privacidad usa el sustantivo correcto ("dirección" o
|
||||||
|
"transacción") según lo que se esté analizando, en lugar de decir siempre
|
||||||
|
"transacción".
|
||||||
|
|
||||||
|
### Corregido
|
||||||
|
|
||||||
|
- Corregida la aritmética de curva secp256k1 usada en la derivación watch-only.
|
||||||
|
El inverso modular por el algoritmo de Euclides extendido fallaba en ciertos
|
||||||
|
casos con enteros grandes, y la suma de puntos no manejaba el caso punto más
|
||||||
|
su inverso. Las operaciones pequeñas (2G, 3G) salían bien pero la derivación
|
||||||
|
de direcciones reales producía resultados incorrectos. Resuelto usando el
|
||||||
|
inverso por el pequeño teorema de Fermat y completando los casos de la suma de
|
||||||
|
puntos. Verificado contra los vectores de prueba estándar de RIPEMD-160,
|
||||||
|
bech32 (BIP173) y secp256k1, y contra la identidad de grupo.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## [1.7.0] — 2026-06-04
|
## [1.7.0] — 2026-06-04
|
||||||
|
|
||||||
### Añadido
|
### Añadido
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ Lo esencial: **ninguna consulta sale de tu red**. Todo el análisis ocurre en tu
|
|||||||
Tan importante como saber qué hace es saber qué no hace:
|
Tan importante como saber qué hace es saber qué no hace:
|
||||||
|
|
||||||
- **No envía datos a ningún servidor externo** — ni analíticas, ni telemetría, ni consultas a APIs de terceros
|
- **No envía datos a ningún servidor externo** — ni analíticas, ni telemetría, ni consultas a APIs de terceros
|
||||||
|
- **No toca claves privadas** — el watch-only usa solo tu clave pública (xpub); no puede gastar fondos ni conoce tu semilla
|
||||||
- **No identifica a otras personas** — es una herramienta de auto-auditoría, no de vigilancia
|
- **No identifica a otras personas** — es una herramienta de auto-auditoría, no de vigilancia
|
||||||
- **No da consejos de inversión** — analiza privacidad on-chain, nada más
|
- **No da consejos de inversión** — analiza privacidad on-chain, nada más
|
||||||
- **No afirma más de lo que sabe** — distingue siempre entre CERTEZA, PROBABLE e POSIBLE
|
- **No afirma más de lo que sabe** — distingue siempre entre CERTEZA, PROBABLE e POSIBLE
|
||||||
@@ -59,6 +60,10 @@ Las únicas dependencias externas son las librerías del frontend (React, Babel)
|
|||||||
- Bandas de privacidad con distinción explícita CERTEZA / PROBABLE / POSIBLE
|
- Bandas de privacidad con distinción explícita CERTEZA / PROBABLE / POSIBLE
|
||||||
- Exportación del informe en JSON y Markdown
|
- Exportación del informe en JSON y Markdown
|
||||||
|
|
||||||
|
**Integración con Sparrow**
|
||||||
|
- Importación de etiquetas BIP-329: carga el `.jsonl` que exporta Sparrow y muestra tus propias etiquetas junto al análisis. Se lee en memoria, no sale del navegador
|
||||||
|
- Watch-only por xpub/zpub: pega tu Master Public Key y Txoko deriva tus direcciones en local para marcar, en cada transacción, qué outputs son tuyos (recepción o cambio). La derivación BIP32 está implementada sin librerías externas; el xpub nunca sale del navegador. Requiere HTTPS (ver nota más abajo)
|
||||||
|
|
||||||
**Exploración on-chain**
|
**Exploración on-chain**
|
||||||
- UTXO Map con score de privacidad por moneda, exportable a CSV
|
- UTXO Map con score de privacidad por moneda, exportable a CSV
|
||||||
- Explorador de bloques y búsqueda on-chain
|
- Explorador de bloques y búsqueda on-chain
|
||||||
@@ -182,6 +187,8 @@ El frontend es un único archivo HTML autocontenido. Sin bundler, sin npm, sin p
|
|||||||
|
|
||||||
## Limitaciones conocidas
|
## Limitaciones conocidas
|
||||||
|
|
||||||
|
- **Watch-only requiere HTTPS** — la derivación de direcciones desde el xpub usa la Web Crypto API del navegador, que solo está disponible en contextos seguros (HTTPS). Si sirves el dashboard por HTTP, esta función no estará disponible (el resto sí). Ver SETUP.md para configurar un certificado autofirmado. Las etiquetas BIP-329 funcionan por HTTP sin problema
|
||||||
|
- **Watch-only solo Native SegWit (BIP84)** — la derivación cubre wallets `wpkh` (direcciones bc1q), que son la mayoría. Taproot (BIP86, bc1p) aún no está soportado
|
||||||
- **Análisis de transacción aislada** — sin seguir el grafo completo, algunas heurísticas tienen techo. El rastro de procedencia amplía el contexto pero es bajo demanda y no exhaustivo
|
- **Análisis de transacción aislada** — sin seguir el grafo completo, algunas heurísticas tienen techo. El rastro de procedencia amplía el contexto pero es bajo demanda y no exhaustivo
|
||||||
- **Base de datos de entidades parcial** — ~745 direcciones de exchanges, OFAC y minería. Cubre los casos más comunes; no es completa
|
- **Base de datos de entidades parcial** — ~745 direcciones de exchanges, OFAC y minería. Cubre los casos más comunes; no es completa
|
||||||
- **Fingerprinting conservador** — requiere varias señales coincidentes; prefiere no detectar antes que detectar mal
|
- **Fingerprinting conservador** — requiere varias señales coincidentes; prefiere no detectar antes que detectar mal
|
||||||
|
|||||||
@@ -156,3 +156,78 @@ scp dashboard.html armg@100.116.19.86:/home/armg/txoko/
|
|||||||
```
|
```
|
||||||
|
|
||||||
Cuatro comandos después de la descarga. Siempre los mismos.
|
Cuatro comandos después de la descarga. Siempre los mismos.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## HTTPS para watch-only (opcional)
|
||||||
|
|
||||||
|
La función watch-only (derivar tus direcciones desde el xpub) usa la Web Crypto
|
||||||
|
API del navegador, que **solo funciona sobre HTTPS**. Si sirves el dashboard por
|
||||||
|
HTTP, watch-only no estará disponible — el resto de la app funciona igual. Las
|
||||||
|
etiquetas BIP-329 no necesitan HTTPS.
|
||||||
|
|
||||||
|
Si quieres usar watch-only y tu nodo va por HTTP (por ejemplo, acceso por
|
||||||
|
Tailscale sin certificado), puedes generar un certificado autofirmado. Es lo que
|
||||||
|
sigue. Todo se hace en el nodo.
|
||||||
|
|
||||||
|
### 1. Generar el certificado autofirmado
|
||||||
|
|
||||||
|
Sustituye la IP por la de tu nodo (Tailscale, local, etc.):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
|
||||||
|
-keyout /etc/ssl/private/txoko.key \
|
||||||
|
-out /etc/ssl/certs/txoko.crt \
|
||||||
|
-subj "/CN=100.116.19.86" \
|
||||||
|
-addext "subjectAltName=IP:100.116.19.86"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Configurar nginx para servir HTTPS
|
||||||
|
|
||||||
|
Añade un bloque `server` que escuche en un puerto con SSL (por ejemplo 4081),
|
||||||
|
apuntando al certificado recién creado e incluyendo la misma configuración que
|
||||||
|
tu servidor HTTP:
|
||||||
|
|
||||||
|
```nginx
|
||||||
|
server {
|
||||||
|
listen 4081 ssl;
|
||||||
|
listen [::]:4081 ssl;
|
||||||
|
server_name _;
|
||||||
|
ssl_certificate /etc/ssl/certs/txoko.crt;
|
||||||
|
ssl_certificate_key /etc/ssl/private/txoko.key;
|
||||||
|
ssl_session_timeout 4h;
|
||||||
|
ssl_protocols TLSv1.3;
|
||||||
|
ssl_prefer_server_ciphers on;
|
||||||
|
|
||||||
|
# Incluye aquí tu misma config (location /dashboard, /api/, etc.)
|
||||||
|
# Si ya tienes esos location en un snippet, basta con incluirlo:
|
||||||
|
# include /etc/nginx/snippets/tu-config.conf;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Si el bloque `location /dashboard` ya viene de un snippet que incluyes, **no lo
|
||||||
|
dupliques** dentro del server SSL: nginx dará error `duplicate location`.
|
||||||
|
|
||||||
|
Comprueba y recarga:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo nginx -t && sudo systemctl reload nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Confiar el certificado la primera vez
|
||||||
|
|
||||||
|
Abre `https://TU-IP:4081/dashboard/` en el navegador. Como el certificado es
|
||||||
|
autofirmado, el navegador avisará de que la conexión no es privada. Es esperado
|
||||||
|
—lo creaste tú— y es seguro en tu propia red:
|
||||||
|
|
||||||
|
- **Safari:** clic en "visitar este sitio web" (abajo del aviso) y confirma
|
||||||
|
- **Chrome/Brave:** "Configuración avanzada" → "Acceder a TU-IP (no seguro)"
|
||||||
|
|
||||||
|
A partir de ahí el navegador recuerda la excepción y la Web Crypto API queda
|
||||||
|
disponible, así que watch-only funcionará.
|
||||||
|
|
||||||
|
> Nota: un certificado autofirmado es perfectamente válido para uso personal en
|
||||||
|
> tu propia red. El aviso del navegador existe porque no hay una autoridad
|
||||||
|
> certificadora de por medio, no porque la conexión sea insegura — el tráfico va
|
||||||
|
> cifrado igual.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user