v0.4.7

ULTIMO
2026-06-02

El mining en pool en el Mac es ahora instantáneo, sin nodo que descargar y sin sincronización.

Lo principal es la velocidad. En modo pool, easyBTX ya no descarga ni ejecuta el nodo completo de BTX. El mining en pool nunca lo necesitó, y suponía una descarga de varios gigabytes, largas sincronizaciones de "poniéndose al día" y algún que otro cuelgue. Ahora abres la app, tu dirección de cobro ya está rellenada y tu Mac empieza a minar de inmediato. Si ya tenías easyBTX, tu dirección de cobro actual se conserva automáticamente, así que no hay nada que volver a configurar.

Cambiado

  • El mining en pool en el Mac funciona sin el nodo completo de BTX: arranca al instante, sin blockchain que descargar, sin nada que sincronizar y sin un nodo que se pueda colgar. El solo mining en el Mac queda en pausa por ahora mientras nos centramos en el mining en pool; volverá.
  • Tu dirección de cobro se rellena automáticamente desde tu configuración anterior, así que una actualización nunca deja el campo en blanco.
  • La velocidad de mining ahora se muestra en N/s, la misma unidad que usa el pool, para que el número en la app coincida con el panel de tu pool.
  • La app siempre se abre en su diseño alto, que cabe en cualquier pantalla.

Añadido

  • Un botón verde "Get the BTX Wallet" en Transactions y en los ajustes de cobro, que enlaza a la wallet independiente de BTX.
  • Una acción opcional para recuperar espacio en disco eliminando los datos antiguos del nodo que ya no necesitas en modo pool. Tus wallets nunca se tocan.

v0.4.6

2026-06-01

El mining en pool en el Mac vuelve a funcionar, además de un panel de estadísticas de GPU en vivo.

Lo principal es un arreglo. El mining en pool en el Mac, que se rompió en la 0.4.5, vuelve a funcionar. Un cambio hecho al llevar easyBTX a Windows apuntaba el Mac al ayudante de mining equivocado, así que el mining no arrancaba. Esto lo restaura. Si actualizaste a la 0.4.5 y no podías empezar a minar, esto lo corrige, y el Mac se comporta exactamente como en la 0.4.4.

Corregido

  • El mining en pool vuelve a funcionar en el Mac. Un cambio de la 0.4.5 para la versión de Windows apuntaba el motor de mining del Mac al ayudante equivocado, así que el mining no arrancaba. Restaurado a como funcionaba en la 0.4.4.

Añadido

  • Un panel de estadísticas de GPU en vivo en la pantalla About: uso, frecuencias, potencia, temperatura, memoria y ventilador, actualizado mientras el panel está abierto. El Mac muestra uso, potencia y temperatura; Windows muestra el conjunto completo leído de tu tarjeta NVIDIA.

vWindows 0.4.4

2026-05-31

easyBTX llega a Windows.

Esta es la primera versión para Windows. easyBTX ahora mina BTX en PCs con Windows que tengan una GPU NVIDIA RTX serie 30 o más nueva, con el mismo enfoque de una app, un clic y autocustodia que la versión para Mac. Pones una tarjeta NVIDIA, eliges una dirección de cobro y tu GPU se une al pool. La versión para Mac (Apple Silicon, Metal, solo o en pool) no cambia.

v0.4.4

2026-05-30

Enviar vuelve a funcionar, tus propias estadísticas de mining privadas, y ventanas más grandes y tranquilas.

Una versión de seguimiento centrada en la 0.4.3. Lo principal es un arreglo: enviar BTX desde la app vuelve a funcionar después de que una build reciente pudiera hacer fallar un envío con un mensaje engañoso. Junto a eso, la pantalla About ahora muestra tus propias estadísticas de mining, las ventanas emergentes se abren todas con la misma forma amplia, y copiar el enlace al explorador de una transacción se hace con un toque.

Añadido

  • Tu mining: un panel de estadísticas privado en About que muestra cuánto tiempo has minado en total, tu velocidad media, tus shares aceptados y el día en que empezaste. Vive solo en tu Mac y nunca se sube.
  • Un botón "Copy link" en cada transacción, para que copies su enlace al explorador de bloques y lo pegues donde quieras.

Cambiado

  • About, Ajustes, Transactions y los popups de información ahora se abren en una única ventana más grande y coherente, más fácil de leer.
  • Ajustes tiene un menú lateral más limpio. La sección Links ahora apunta al sitio oficial del protocolo BTX y, por separado, a un sitio de precio en vivo (un tercero; no es asesoramiento financiero, y easyBTX es independiente de él).

Corregido

  • Enviar BTX desde la app vuelve a funcionar. Una build reciente podía rechazar un envío con un mensaje engañoso de "comprueba la dirección" incluso cuando la dirección estaba bien; eso está corregido, y los mensajes de error ahora describen la causa real.

v0.4.3

2026-05-30

Pausa y reanuda, un reinicio más tranquilo, más privacidad y tu Mac en el panel del pool.

Esta versión se apoya en el rediseño de la 0.4.0 con un conjunto de mejoras de calidad de vida. Parar ahora mantiene el nodo caliente y ofrece un Resume verde, la larga espera de "preparándose" tras un reinicio se explica a sí misma en lugar de parecer atascada, y puedes ocultar tu saldo con un toque. Los miners en pool ahora pueden mostrar los datos de GPU en vivo de su Mac y el nombre elegido en el panel de minebtx.

Añadido

  • Pause y Resume. El control dice "Pause" mientras minas, y luego un "Resume" verde en lugar de un frío "Start". Tu nodo se mantiene caliente entre medias, así puedes retomarlo justo donde lo dejaste.
  • Un ojo de privacidad junto a tu saldo lo oculta tras puntos hasta que lo revelas, útil cuando compartes pantalla o estás en público. Se recuerda tu elección.
  • Decimales del saldo: muestra los 8 lugares completos, o 3 más cortos para un vistazo rápido. Esto cambia solo la visualización, nunca lo que tienes o envías.
  • Un estado en vivo claro mientras el nodo se prepara tras un reinicio. En lugar de un "Working..." congelado, explica que está reconstruyendo tu índice de saldo privado, muestra una estimación y el tiempo transcurrido, e indica que la blockchain ya está al día.
  • Comprobaciones de CPU, GPU y pool o solo en la pantalla de mining, para que de un vistazo veas que tu Mac mina en la GPU y está conectado como esperas.
  • Lecturas de GPU en vivo para el panel del pool de minebtx. easyBTX reporta el uso de GPU y la potencia de tu Mac al pool (sin necesidad de permisos de administrador), para que tu worker pueda mostrar datos reales en lugar de huecos en blanco, y el nombre que pongas en Ajustes identifica tu máquina.
  • Una limpieza silenciosa en segundo plano que borra restos antiguos de reparaciones en instalaciones que llevan mucho tiempo en marcha, para que no se acumulen en disco.

Cambiado

  • Ajustes ahora se abre con tu tema actual. Antes siempre se mostraba en Light; ahora coincide con la app, así que una app oscura mantiene Ajustes oscuro también.
  • Ajustes tiene un diseño de barra lateral más limpio, con fichas de tema y una opción de "diseño favorito al inicio".
  • Los popups de información ("How mining works" y los demás) ahora siguen el estilo de Ajustes: una ventana más amplia y tranquila que se lee con más facilidad.

Corregido

  • El panel de fuentes upstream en Ajustes ya no muestra "Latest unavailable" en cada fila. Vuelve a obtener las versiones más recientes reales.

v0.4.0

2026-05-29

Un diseño renovado, y el pool mining ahora paga a tu wallet externa.

easyBTX tiene un nuevo diseño. La vista por defecto es una ventana más ancha, tipo "sala de control", que distribuye todo en tres columnas tranquilas para que nada se corte en la parte inferior de la pantalla cuando el nodo se llena de información en vivo. Hay también un nuevo selector de tema: Dark sigue siendo el predeterminado, con Light si lo prefieres y una opción System que sigue tu Mac y cambia sola. Además, el pool mining ahora respeta tu dirección de pago externa, igual que ya hacía el solo mining, así puedes minar en un portátil que nunca tenga las claves de tus monedas.

Añadido

  • Un nuevo diseño ancho tipo "sala de control", ahora predeterminado: el panel de estado a la izquierda, la pantalla de mining, potencia y wallet en el centro, y los datos en vivo de red y pool a la derecha. Los diseños anteriores Tall, Compact y Mini siguen disponibles con un clic.
  • Temas Dark, Light y System. Dark sigue siendo el predeterminado; elige Light si lo prefieres, o System para seguir a tu Mac y cambiar automáticamente. Se recuerda la elección.
  • Un botón de acceso rápido en Ajustes para cada sección (Node, Mining, Appearance, Data location, Wallets, Payout, Backup, Updates, Maintenance, New account, Upstream, Links). Toca uno para ir directamente.

Cambiado

  • El pool mining ahora envía tus recompensas a tu dirección de pago externa si tienes una configurada. Antes, solo lo hacía el solo mining. De cualquier manera, las monedas nunca pasan por la wallet de este Mac, de modo que un portátil comprometido nunca tuvo las claves.
  • La tarifa de herramienta de easyBTX es ahora el 4,99% de las recompensas minadas (antes era el 3,5%). Sigue siendo por franja de tiempo y se declara de antemano, y la tarifa propia del pool (2,5%) no cambia, por lo que el mining en pool supone en total alrededor del 7,5%. Todo lo demás va a tu wallet.
  • Ajustes se presenta como fichas limpias que se muestran una al lado de la otra cuando hay espacio, y se lee bien tanto en Light como en Dark.
  • "Audit / Overview" pasa a llamarse simplemente "Transactions".
  • La lista de comprobación de configuración inicial es más clara. Cada paso se convierte en un check verde con una etiqueta sencilla de lo que ocurrió ("BTX node and chain downloaded", "Node synced to the latest blocks", "Mining"), en lugar de quedarse como una tarea pendiente en naranja.
  • El logotipo de easyBTX en la cabecera es un poco más grande, en una barra ligeramente más estrecha.

Corregido

  • "Heal disk space" ahora informa del espacio real liberado, incluyendo la gran instantánea puntual, en lugar de subestimarlo y liberar el resto en silencio al siguiente inicio.
  • El nodo ya no parece que se ha reiniciado a "bloque 0 de 0" tras recuperar espacio en disco o reiniciar. Recuerda en qué punto estaba y lo muestra mientras confirma, en lugar de parecer una sincronización desde cero.
  • Un nodo que ya estaba sincronizado ya no se queda en una larga espera de arranque tras una recuperación o reinicio.

v0.3.1

2026-05-29

Tu nodo nunca parece roto mientras se pone al día. Después de que easyBTX haya estado cerrado un tiempo, o se haya apagado de forma brusca (un cuelgue, un cierre forzado, o al reemplazar la app mientras estaba en marcha), el nodo necesita a veces unos minutos para ponerse al día la próxima vez que abres la app. Antes, easyBTX podía confundir ese tiempo de puesta al día con un problema real y mostrar un error. Ahora espera con calma, te dice lo que está pasando y mantiene tu wallet y tus monedas intactas. Nunca ofrecerá una reparación mientras el nodo simplemente se está poniendo al día. No tienes que hacer nada.

Corregido

  • easyBTX ya no muestra un error de arranque cuando el nodo solo se está poniendo al día. Ahora distingue entre un nodo que todavía está procesando sus datos y uno que realmente se ha detenido.
  • La acción destructiva "Fix the node" ya no se ofrece mientras el nodo se está poniendo al día. Aparece únicamente cuando hay una señal real de corrupción o el proceso del nodo ha salido de verdad.
  • Ya no aparece el paso fantasma "Download the BTX node and chain" mientras un nodo recuperado solo se está calentando con la cadena ya en disco, por lo que la lista de comprobación de configuración refleja la realidad.
  • Se ha eliminado el límite de tiempo fijo que podía interrumpir un nodo sano. Un nodo que avanza de forma real recibe ahora el tiempo que necesita para terminar.

Mejorado

  • Un mensaje más claro y tranquilo mientras el nodo se pone al día, para que una espera normal de unos minutos no parezca un fallo.
  • Tu wallet y tus monedas nunca se tocan durante el arranque o la recuperación. easyBTX restaura los datos de la cadena desde una instantánea guardada, nunca tus claves.

Por dentro

Cuando el nodo se reinicia tras haber estado desconectado un tiempo o tras un cierre no limpio, reconstruye parte de su estado interno antes de poder atender peticiones. Durante esa ventana, el nodo está vivo y trabajando, pero responde con un estado "todavía calentando" (código RPC -28, devuelto con un HTTP 500). La versión anterior lo trataba como un fallo definitivo y se rendía tras un límite fijo de 360 segundos, lo que enviaba a un nodo perfectamente sano a una pantalla de error con un botón de reparación destructiva colgando. La versión 0.3.1 clasifica cada sondeo de arranque en tres estados: ready, warming o unavailable. Un nodo en warming (estado -28, o un log del nodo que muestra una reconstrucción en curso) se trata como "seguir esperando" y recibe un margen generoso para terminar. Un nodo que no responde en absoluto sigue teniendo un límite razonable. La ruta de reparación destructiva permanece bloqueada detrás de la misma señal de corrupción confirmada de siempre, por lo que solo puede activarse cuando algo está genuinamente mal, nunca por un arranque lento. Todas las reglas de seguridad de recuperación permanecen sin cambios: la wallet siempre se preserva, los datos dañados se archivan en lugar de eliminarse, la recuperación se ejecuta como máximo una vez por inicio y se niega a funcionar si el disco está lleno.

Distribución

Entregado a las instalaciones 0.3.0 existentes automáticamente a través del actualizador integrado en la app. Compilado y publicado localmente; build indie sin firmar, la notarización de Apple está en el roadmap.

v0.3.0

2026-05-28

La versión de "cumplimiento con el pool y transparencia". El pool dexbtx de shib pasó a v5 el 2026-05-27 con una puerta de capacidad pre_hash_block_tier_v18 obligatoria y un nuevo dict de extensión mining.subscribe con session_id y una huella de hardware por rig. easyBTX v0.2.0 enviaba solo dos de los tres campos requeridos, lo que hacía que los workers de Mac se conectaran al pool pero nunca aparecieran en el panel de workers. La v0.3.0 incluye el handshake completo v0.3.x, añade el heartbeat worker.report_metrics que desbloquea las filas del panel en tiempo real por rig, y muestra el nombre canónico que el pool asigna a cada rig para que los usuarios puedan asociar su Mac con su fila en /stats. Además, la primera función de autocustodia opcional: las recompensas del solo mining ahora pueden enviarse a una dirección BTX externa que no tiene clave en este Mac, junto con mejoras de UX que la base de usuarios de v0.2.0 pidió en Telegram. cargo test: 195/195. tsc --noEmit: limpio. cargo build --release y npm run build: ambos en verde.

Correcciones críticas

  • El registro en el pool dexbtx se restaura para los workers de Mac. mining.subscribe ahora envía el dict de extensión v0.3.x completo: protocol_compliant: ["pre_hash_block_tier_v18"], la huella de hardware existente (ampliada con solver_env: {BTX_MATMUL_BACKEND: "metal"}), y un session_id por sesión (32 caracteres hexadecimales en minúsculas con la forma uuid.uuid4().hex del miner de referencia, construido a partir de SHA256("easybtx-session:" || nanos || pid || counter) para que sesiones consecutivas nunca colisionen). Sin session_id, el pool v5 excluía silenciosamente a los workers de Mac del panel y del /stats del bot de Telegram. mining.set_canonical_name ahora se gestiona y la asignación se persiste en ~/.easybtx/canonical_names.json para que la etiqueta asignada por el pool (por ejemplo, M2_PRO-BRAVO-1) sobreviva a las reconexiones. La línea "This machine's worker:" de la interfaz muestra esa etiqueta en cuanto llega.
  • Las actualizaciones del nodo ya no tardan 8 minutos. NodeController::stop sondea Child::try_wait hasta 90 segundos antes de recurrir a SIGKILL. Antes, el kill inmediato llegaba en mitad de un volcado sobre el LevelDB del estado blindado btx1z, dejando un marcador de mutación en vuelo que activaba EnsureShieldedStateInitialized: rebuilding full shielded state from chain en el siguiente inicio (medido en 7 m 57 s en la práctica). Una salida limpia no deja marcador y el inicio vuelve a tardar alrededor de un segundo.
  • Las cuarentenas de Repair Node ya no acumulan gigabytes indefinidamente. El nuevo prune_old_quarantines elimina los directorios _corrupt-* y _preserve-* con más de 7 días de antigüedad, conservando el más reciente de cada patrón como evidencia forense. Se ejecuta al iniciar la app (detecta cuarentenas antiguas de sesiones pasadas) y al final de cada repair_node (detecta cuarentenas antiguas de reparaciones previas). Una _corrupt-* obsoleta tenía 42 GB retenidos en la máquina del mantenedor. Incluye 6 nuevas pruebas unitarias para la lógica de retención.

Pago externo (autocustodia opcional)

  • Las recompensas del solo mining ahora pueden enviarse a una dirección BTX externa que no tiene clave en este Mac. Nueva sección en Ajustes: Mining payout: mantén el valor predeterminado (las recompensas van a la wallet local de este Mac) o dirígelas a una dirección que controles desde otro sitio, como una hardware wallet, una wallet en el móvil o una dirección en frío. La clave está en la custodia. La amenaza realista para una máquina de mining es la ejecución de código por el mismo usuario (un stealer tipo AMOS al que el usuario es engañado para ejecutar), y una máquina que mina 24/7, a menudo un portátil viejo reutilizado para exactamente eso, es un objetivo fácil. Dirigir las recompensas a una dirección externa significa que las monedas acumuladas nunca tuvieron una clave en la máquina de mining. Las direcciones pegadas se comprueban de formato en el límite IPC (bech32, acepta el prefijo post-cuántico btx1z...; detecta pegados de red incorrecta, espacios al inicio o final, y homóglifos como b/i/o) con un botón en vivo "Test format"; el RPC validateaddress del nodo hace la comprobación completa del checksum cuando está activo.
  • La tarifa de desarrollo declarada del 3,5% no cambia. El motor de pago se generalizó del antiguo FeeAccrual binario usuario/dev a un round-robin ponderado de N destinatarios (PayoutScheduler) con la tarifa de desarrollo como destinatario obligatorio. Una prueba unitaria demuestra que la participación real del dev sigue convergiendo al 3,5% en 1000 a 2000 bloques independientemente de la configuración del usuario, por lo que añadir un pago externo nunca cambia el reparto.
  • Solo en esta versión, y la app lo dice claramente. La v0.3.0 enruta el pago externo únicamente para el coinbase del solo mining: las recompensas del pool siguen yendo a la wallet local (el pago externo del pool llega en v0.3.2). Si hay un pago externo configurado y estás en modo Pool, un banner rojo en la vista principal lo explica, y el diálogo de cambio Solo a Pool repite la advertencia, para que un usuario con mentalidad de seguridad nunca pueda asumir en silencio que sus ganancias del pool salen de la máquina.
  • Elegir "Local wallet" revierte completamente. Seleccionar el radio predeterminado ahora borra el reparto persistido (clear_payout_split), no solo oculta el formulario, de modo que el mining vuelve a la wallet local de inmediato en lugar de seguir silenciosamente pagando a la dirección externa configurada anteriormente.

Pool y protocolo de mining

  • Heartbeats de worker.report_metrics cada 60 segundos. Una nueva rama tokio::time::interval en el bucle select de stratum envía {session_id, timestamp, cpu_util_pct, ram_gb_used, gpus: [{gpu_uuid, util_pct, power_w, temp_c}], solver_nps, shares_session_total} para que el panel del pool pueda mostrar contadores de CPU, RAM y shares por rig. El porcentaje de CPU y la RAM usada provienen de una llamada a top -l 1 -n 0 ejecutada en un subproceso asíncrono con un tokio::time::timeout real de 4 segundos, para que un top bloqueado nunca paralice el lector de stratum, la gestión del solver hijo ni los envíos al pool. La utilización, potencia y temperatura de la GPU se reportan como null en JSON en macOS porque powermetrics requiere root (según la nota de shib sobre métricas de macOS); la fila sigue apareciendo en el panel, los campos de instrumentación en vivo simplemente muestran un guion.
  • Un clic para "Open this machine in the pool dashboard." El botón del panel del pool existente ahora incluye ?worker=<canonical_name> en su URL en el momento en que el pool asigna un nombre canónico. El panel es actualmente una SPA, así que el parámetro de consulta es compatible con versiones futuras; si dexbtx añade enrutamiento por worker más adelante, funcionará sin una actualización de la app.
  • solver_env: {BTX_MATMUL_BACKEND: "metal"} en la huella de hardware para que el motor de recomendaciones de ajuste del pool sepa que no debe sugerir ajustes exclusivos de CUDA (BTX_MATMUL_GPU_INPUTS, BTX_MATMUL_SOLVE_BATCH_SIZE, etc.) a los rigs de Mac. Compatible con versiones futuras: el pool incluye en lista blanca las claves en el servidor, por lo que la declaración actual solo de Metal es segura.

Experiencia de usuario

  • Las actualizaciones ahora son imposibles de ignorar. Un banner naranja prominente en la parte superior del panel aparece en cuanto la comprobación de actualizaciones al inicio encuentra una versión más reciente, junto a la señal de esquina ya existente. Al hacer clic en Install aparece una pregunta única: "¿También instalar las futuras actualizaciones automáticamente al inicio?" Preguntar en el momento de mayor disposición funciona mucho mejor que la casilla de Ajustes a la que nadie va; un flag easybtx-autoupdate-asked garantiza que no se vuelve a preguntar si el usuario rechazó. La comprobación de actualizaciones al inicio ahora se ejecuta antes de first_run_setup, de modo que el banner puede mostrarse en unos 300 ms en lugar de hacerlo después de que comience el lento arranque del nodo.
  • easyBTX deja claro que incluye su propio nodo BTX. Un usuario de Telegram que veía "Sync progress 98.5%" todavía preguntó en el canal "how do I set up a node?" Tres pequeños puntos de contacto responden ahora a la pregunta antes de que se haga: el modal "How mining works" se abre con "easyBTX runs the full BTX node for you, no separate setup needed"; la lista de etapas de configuración ahora dice "Download the BTX node and chain" y "Sync the node to the latest blocks"; la sección Ajustes del nodo comienza con "these are the live readouts from that node, not a remote service."
  • Recordatorio suave para hacer copia de seguridad de la wallet. Un banner ámbar persistente sobre el saldo aparece en el momento en que has minado algo de BTX y todavía no has hecho la copia de seguridad. "Save now" abre Ajustes y se desplaza hasta "Save recovery file". "Later" lo cierra solo para el inicio actual (el recordatorio vuelve al siguiente inicio, porque perder una wallet por cerrar un aviso una sola vez no está bien). Es independiente de la comprobación inicial ya existente, que se activaba antes de que el usuario tuviera algo que perder.
  • El slider de potencia de mining en una sola fila. La etiqueta, el slider, el botón MAX y el valor en vivo pasaron de un diseño de dos filas a una sola fila flex. Ahorra unos 28 px de espacio vertical. Mismo acento naranja Bitcoin.
  • "Last share" se actualiza en vivo. Un setInterval de 1 segundo vuelve a renderizar el tiempo relativo en el contador de shares en lugar de congelarlo entre los sondeos de estado de 3 segundos. Se omite cuando document.hidden para que una app en segundo plano no consuma batería en actualizaciones invisibles.
  • Panel Ajustes: fuentes upstream. Lista los componentes de código abierto sobre los que se construye easyBTX (BTX node btxchain/btx fijado a v0.30.1, MineBTX dexbtx/minebtx, Tauri v2, el repositorio público EasyBTX-releases). Cada fila muestra la versión fijada frente a la última etiqueta obtenida en tiempo real desde la API de GitHub, más un indicador de Actual o Actualización disponible. Panel de mantenedor para seguir cuándo los proyectos upstream nos superan. Caché de 5 minutos; el botón Refresh omite la caché.
  • Señales de comunidad en el modal About. Fichas en vivo con las instalaciones de easyBTX (suma de descargas de assets en GitHub Releases), miners en línea en el pool ahora mismo, bloques encontrados en las últimas 24 h y velocidad de red. Se actualizan al abrir el modal, con caché de 60 s. Presentación honesta: la ficha de "miners online" está etiquetada como "incl. easyBTX + other clients" porque la API del pool todavía no desglosa los workers por miner_version.

Marca

  • easyBTX ahora es sistemáticamente en minúsculas en el texto. 17 reemplazos en README, CHANGELOG, NOTICE y la carpeta docs/. Las rutas de URL (MendeMatthias/EasyBTX-releases), el tipo Rust EasyBtxState y los nombres de artefactos del pipeline de versión (EasyBTX.dmg, EasyBTX.app) se preservan deliberadamente.

Mantenimiento

  • Banner de advertencia de disco bajo. Comprueba el espacio libre en disco cada 3 s en el mismo ciclo de actualización de estado que impulsa el resto de la interfaz. Por debajo de 1 GB muestra un aviso ámbar; por debajo de 500 MB, uno rojo con parpadeo más rápido. Ambos se muestran incluso cuando el RPC está caído, que es exactamente cuando la advertencia más importa (btxd acaba de colapsar por un Fatal LevelDB error: No space left on device, el RPC es inalcanzable y el usuario no sabe por qué).
  • Ajustes: Mantenimiento: Heal disk space. Recuperación de espacio con un clic que elimina los índices blockfilter y coinstats de btxd no utilizados, la instantánea assumeutxo post-carga y trunca debug.log si supera los 50 MB. Para cuando necesitas espacio pero no estás listo para mover el directorio de datos a un volumen externo.

Consolidación previa a la versión

  • La recolección de worker.report_metrics es asíncrona. Se reemplazó el std::process::Command::output() síncrono (sin timeout, bloquea el worker del runtime de tokio durante el tiempo que tarde top) por tokio::process::Command con un tokio::time::timeout real de 4 segundos. Un top bloqueado ya no paraliza el lector de stratum, la gestión del solver hijo ni los envíos al pool.
  • Lectura con un solo guard del estado del pool en el tick de métricas. Se consolidó en un único ámbito con guard un bloqueo y desbloqueo en dos pasos de status.lock().await, de modo que shares_accepted y hashps siempre se observan en la misma generación del tick de estado.

Documentación

  • docs/2026-05-28-btx-qid-self-custody.md. Investigación y plan de 4 fases para enraizar un "qID" post-cuántico y de autocustodia (passkey y división 2-de-3 Shamir/MPC) en una semilla BTX, de modo que la dirección de pago externa indicada antes pueda ser más adelante una que el usuario tenga en un móvil o passkey en lugar de otra hot wallet. Planificación orientada al futuro para la página bonuz HQ; ningún código de la app depende de ello.

v0.2.0

2026-05-28

La versión de pulido "mega auditoría". Una auditoría de seguridad /cso y una auditoría funcional con 3 agentes encontraron 4 problemas CRÍTICOS, 10 ALTOS, 13 MEDIOS y algunos BAJOS en v0.1.13. Esta versión los cierra todos en un solo pase. cargo test: 149/149. tsc --noEmit: limpio. No se eliminó ningún IPC público, pero send_btx ganó un parámetro explícito subtract_fee: bool (el botón Max del frontend lo pasa); EasyBtxState ganó tres campos #[serde(default)] (los archivos de estado anteriores siguen cargando).

Correcciones críticas (pérdida de datos, procesos huérfanos, resincronización forzada)

  • El borrado de múltiples wallets bloqueado en la reubicación del directorio de datos. relocate_datadir ahora enumera cada wallet bajo src (cualquier directorio que contenga wallet.dat) y falla de forma segura a menos que CADA una esté presente y no vacía en dest antes de ejecutar remove_dir_all(src). La comprobación previa del 97% del tamaño solo verificaba miner/wallet.dat, lo que habría tolerado la pérdida silenciosa de una wallet secundaria más pequeña.
  • El Pool y el solver Metal ahora se cierran correctamente al salir de la app. stop_node_blocking señaliza pool_stop, espera a pool_handle con un timeout de 3 segundos (abortando el JoinHandle si se supera) y limpia el estado del pool. El Command del solver ganó .kill_on_drop(true) para que un JoinHandle descartado libere el subproceso en lugar de dejarlo fijado al 100% de GPU después de cerrar.
  • Snapshot.dat ya no se elimina antes de que loadtxoutset tenga éxito. Un nuevo flag persistido EasyBtxState.snapshot_loaded se activa SOLO cuando loadtxoutset tiene éxito (o cuando getchainstates ya reporta un chainstate de instantánea). Todos los que llaman a disk::reclaim_disk ahora leen ese flag veraz en lugar de setup_complete (que cambia en el bind de RPC, antes de que se cargue la instantánea en segundo plano). Cerrar la app a mitad de la carga ya no borra la instantánea y fuerza una resincronización completa desde el génesis.
  • El guard de salida del solver previene el colapso del cursor de nonce. solve_next_nonce ahora solo avanza cuando tries_used > 0 y nonce64_end >= solve_next_nonce (monotónico). Un {"found":false} degenerado con nonce64_end ausente solía reiniciar el cursor a 1, causando envíos de shares duplicados (código 22).

Correcciones de alto impacto

  • repair_node ya no te cambia silenciosamente a la wallet "miner". Ahora lee state.active_wallet (siguiendo el patrón de reclaim_disk_now) antes de reconstruir wallet_rpc, la corrección H1 del PR #12 que todavía no se había aplicado aquí.
  • move_datadir_to rechaza volúmenes exFAT o FAT. La advertencia de list_external_volumes ahora se aplica en el límite de la operación de mover, no solo como tooltip.
  • apply_node_update ahora realmente cambia al nuevo binario de btxd. Antes era una operación vacía (la nueva instalación nunca se reutilizaba). Ahora persiste la nueva etiqueta (EasyBtxState.btx_release_tag), detiene el controlador en ejecución y lo reinicia con los nuevos binarios; check_node_update y get_node_status respetan la etiqueta persistida, por lo que el banner de actualización deja de quedarse fijo.
  • El cambio de ntime a mitad de solve reinicia el cursor de nonce. Cuando una notificación no limpia cambia ntime o merkleroot, el siguiente solve comienza desde el inicio de nuestra ventana de nonce (en lugar de avanzar más allá de los nonces bajos de la nueva cabecera).
  • clean_jobs=true ya no compite con un solver que acaba de salir para un envío obsoleto. La ruta de kill limpio drena la salida estándar del proceso hijo muerto y borra solving_job, de modo que un resultado del solver que llega un microsegundo tarde falla de forma segura en el gate de envío.
  • La colisión de archivos _corrupt-<ts> ya no puede eliminar definitivamente la cadena. Marcas de tiempo con resolución de submicrosegundo y un contador -N evitan la colisión; en caso de fallo al renombrar para archivar, ahora se devuelve Err y se deja src en su sitio (antes el fallback remove_dir_all(src) eliminaba permanentemente la cadena corrupta, rompiendo la promesa de "nunca eliminar definitivamente").
  • La contabilidad de la tarifa del pool sigue la misma disciplina que la del solo. Los límites de stop, kill limpio y deadline ya no acreditan el tiempo transcurrido en el kill como mined_secs del dev; el devengo ahora ocurre únicamente en la rama de espera del solver con salida parseable y tries_used > 0. La participación del dev del 3,5% ya no puede inflarse bajo una rotación constante de paradas.
  • La pérdida de un share por desconexión se muestra en la interfaz. Un error de escritura en mining.submit ahora establece last_event = "share lost (disconnect)..." e incrementa el contador de obsoletos antes de volver al bucle de reconexión.
  • Una red inestable ya no puede dejar "developer fee window..." atascado. Un límite de tiempo de intentos acumulados (300 s) fuerza la siguiente sesión al pago del usuario si una sola ventana de tarifa sigue fallando en conectarse.
  • El arranque recurre al directorio de datos predeterminado cuando el puntero de unidad externa no apunta a ningún sitio. Antes, una unidad desconectada entre la escritura del puntero y la eliminación de la fuente dejaba la app atascada en una ruta inexistente.

Corrección de mining y pool

  • Los fallos de suscripción y autorización ahora se registran y se muestran en last_event (antes se ignoraban silenciosamente, un cambio de esquema del lado del pool podía detener todo el pool mining sin ningún aviso en la interfaz).
  • submit_id se inicializa a partir de los microsegundos del epoch al conectar, para que los IDs no se repitan entre reconexiones.
  • Solo: tras un tick Paused, la siguiente iteración omite la ráfaga de tarifa y mina para el usuario (el déficit se recupera en el siguiente tick no pausado). Evita que un único bloque solo caiga en la dirección del dev durante una oscilación de pausa por sincronización.
  • La idempotencia de la instantánea ahora verifica con SHA cualquier snapshot.dat existente cuyo tamaño coincida (antes se aceptaba un archivo de contenido incorrecto con el tamaño exacto sin verificación).

Pulido de wallet, envío y auditoría

  • Dirección de recepción estable por wallet. EasyBtxState.wallet_addresses recuerda la dirección de cada wallet; do_switch_wallet la reutiliza mediante address_is_mine en lugar de generar una nueva en cada cambio.
  • Exportaciones de auditoría y CSV de hasta 10.000 transacciones. (El límite anterior de 1.000 descartaba silenciosamente las entradas más antiguas de los miners que llevaban mucho tiempo.)
  • Send "Max" ahora es un flag explícito, no una heurística de tolerancia de satoshis. El frontend registra el clic en Max; el backend en send_btx(.., subtract_fee) lo respeta. Enviar exactamente tu saldo a mano ya no lo reduce silenciosamente.
  • El send_btx del backend valida la cantidad y rechaza los sobregiros. Los valores no finitos, cero, negativos y amount > spendable se rechazan en el límite IPC (no solo en btxd).
  • backup_wallet_cmd rechaza rutas que no puede canonicalizar, y rechaza cualquier ruta con componentes ... Se ha cerrado el agujero anterior de "omitir al fallar la canonicalización".
  • Comas decimales europeas en Send. parseFloat va precedido de replace(/,/g, ".") en ambos puntos de llamada de Send: 1,5 BTX ahora se interpreta como 1.5, no como 1.
  • Comprobación del prefijo btx1 en el enlace al explorador. addrExplorerUrl ahora coincide con la expresión regular del input de Send (^btx1[a-z0-9]{20,90}$/i), para que las filas de auditoría no puedan enlazar a páginas del explorador inexistentes.
  • El pago del pool revalida la dirección en caché con address_is_mine antes de entregarla a stratum; genera una nueva si no coincide.
  • La tarea del pool se detiene correctamente durante repair_node y relocate_datadir (antes seguía enviando contra una cadena borrada o en movimiento).
  • persist_active_wallet está bloqueado. Un nuevo STATE_FILE_LOCK serializa la secuencia cargar, modificar y guardar para que un doble clic no pierda actualizaciones.

Seguridad (la auditoría /cso)

  • El log del pool se sacó de /tmp y se restringió. Los logs ahora viven en $HOME/.easybtx/pool.log (fallback a /tmp si HOME no está definido), abierto con mode(0o600) y O_NOFOLLOW. Se ha cerrado la superficie accesible por todos y suplantable mediante enlaces simbólicos.
  • El gpu_uuid que se envía al pool es ahora un SHA-256 con sal, no el IOPlatformUUID en bruto. El hash es estable por instalación (para que la correlación del worker del pool siga funcionando), pero el identificador de hardware en bruto ya no sale de la máquina.
  • RpcClient::for_wallet codifica el nombre de la wallet con porcentaje en la ruta. Actualmente seguro por convención (todos los que lo llaman validan); ahora se aplica en la función en lugar de depender de la disciplina del revisor.

Tareas internas

  • Versión: 0.1.13 a 0.2.0 (package.json, tauri.conf.json, Cargo.toml).
  • EasyBtxState ganó snapshot_loaded, btx_release_tag y wallet_addresses (todos con #[serde(default)]; los archivos de estado anteriores siguen cargando).
  • STATE_FILE_LOCK introducido en state.rs para serializar el patrón cargar, modificar y guardar; las escrituras de estado de reset_account, restore_wallet y first_run_setup ahora pasan por él.
  • Un TODO(H3-followup) de documentación conocido como obsoleto queda en apply_node_update apuntando al re-arm RPC en sesión sin interrupciones (la ruta de etiqueta persistida y reinicio está publicada; la espera de cookie en sesión es la tarea pendiente).

v0.1.13

2026-05-28

Añadido

  • Línea de saldo entrante. Un pago recibido que todavía no ha confirmado (untrusted_pending) ahora se muestra como una línea clara "Incoming ... confirming" en lugar de parecer perdido hasta que confirma. El saldo disponible solo incluye el saldo de confianza, por lo que Send nunca puede sobregirar.
  • Enlaces al explorador de bloques. Los IDs de transacción y las direcciones en Send, Receive y Audit/Overview se abren en explorer.minebtx.com (truncados, con copia y apertura). La pantalla de confirmación de Send muestra la dirección completa del destinatario para que puedas verificarla.
  • Send: botón "Max" y envío total seguro. Un botón Max rellena todo tu saldo disponible, y un envío del saldo completo ahora deduce la tarifa de red del importe en lugar de fallar con "fondos insuficientes". La dirección del destinatario también se verifica antes del paso de confirmación.
  • Recuperar espacio. Un botón en Ajustes: Storage (y un pase automático al iniciar) libera espacio en disco eliminando los índices blockfilterindex y coinstatsindex no utilizados, la instantánea assumeutxo post-carga y un debug.log demasiado grande. La blockchain y tu wallet nunca se tocan.

Pool

  • El popup de información sobre pagos del pool ahora muestra la política real (viernes semanales a las 18:00 UTC, mínimo de 0,0001 BTX, tarifa del pool del 2,5%) en lugar de un texto vago.
  • easyBTX ahora se identifica ante el pool como easybtx/<version> para que el pool pueda segmentar a los miners de eBTX en las estadísticas; la información de hardware da a tu worker un nombre canónico en el panel.

Corregido

  • pre_hash de block-tier en el pool. El solver de shares Metal ahora aplica la puerta pre_hash de block-tier (sigma <= block_target << epsilon) en lugar de omitirla para los shares, de modo que los shares de block-tier son bloques válidos y el submitblock del pool deja de fallar con "matmul phase2 proof of work failed". easyBTX declara la capacidad pre_hash_block_tier_v18 en mining.subscribe. (El cambio del solver está en btx-main; ver docs/patches/btx-prehash-block-tier.patch.)

Cambiado

  • La potencia de mining es ahora un slider en vivo en la parte superior de la tarjeta de estadísticas. Se calienta de verde a naranja-rojo al aumentarla (pasos del 5%, botón Max), y se mantiene sincronizada con el slider de Ajustes. Las antiguas filas de velocidad y potencia han desaparecido, por lo que la tarjeta es más corta. Una "i" en el slider explica las mejores prácticas (alrededor del 50% para el trabajo ligero mantiene el Mac fresco y silencioso; el 100% es el más rápido pero calienta y drena la batería).
  • La wallet activa ahora se obtiene únicamente del backend (fuente única de verdad); el frontend ya no vuelve a aplicar una wallet de localStorage, por lo que el chip de wallet y la dirección no pueden discrepar momentáneamente.
  • La tarjeta de ganancias del pool es más corta: el explicador de pagos pasó a un popup de "i" junto a "Accepted shares", y el worker ahora aparece junto al enlace "Open pool dashboard" para que se lean como un par.