N.º 05Mini Miner
Un minero de Bitcoin en una pestaña
Mini Miner hashea cabeceras reales de bloques de Bitcoin en WebAssembly. Lo que merece contarse es lo que el navegador comprueba antes de hashear nada.
Alex Colls Outumuro
Cofundador y CTO · · 3 min de lectura
Mini Miner mina Bitcoin en solitario, en la red real, desde una pestaña del navegador. Nadie espera que un portátil encuentre un bloque, y no hace falta para que la ingeniería merezca contarse. Minar con honestidad desde un navegador pedía tres piezas: un bucle de hash rápido, un relé, y una comprobación de que la recompensa es tuya.
El bucle de hash
Una cabecera de bloque de Bitcoin ocupa 80 bytes. Minar es hashearla dos veces con SHA-256, una y otra vez, cambiando el nonce de sus últimos cuatro bytes hasta que el resultado quede por debajo de un objetivo. En Mini Miner cada intento solo reescribe esos cuatro bytes, en la posición 76, y hashea la cabecera con el SHA-256 en WebAssembly de la biblioteca hash-wasm.
El trabajo corre en Web Workers, tantos como el esfuerzo que eliges: ×1, ×2, ×4, o Max. Max se mide, no se adivina. Añade un worker cada vez, lo deja calentar, mide durante un segundo, y se detiene cuando un worker más aporta menos de un 5 %. Cada worker parte de su propio extranonce y avanza tantos pasos como workers hay cuando ha probado los 2³² nonces, así que dos workers nunca hashean la misma cabecera.
El relé
Un navegador no puede abrir un socket TCP, y los pools de minería hablan Stratum sobre TCP. Así que el navegador habla JSON por un WebSocket con nuestro relé, y el relé habla Stratum v1 con un pool en solitario, con una conexión por cada dirección que se mina. El relé reenvía los trabajos. No guarda claves ni fondos, y no elige las transacciones del bloque: eso lo hace el pool.
El relé tampoco se fía del navegador. Reconstruye cada cabecera que envía el navegador, la vuelve a hashear, y solo reenvía un hash que de verdad está por debajo del objetivo.
Comprobar la coinbase antes de hashear
Esta es la parte que más me importa. Un trabajo de Stratum no te da un bloque. Te da las dos mitades de la transacción coinbase, la que paga la recompensa, y tú pones tus extranonces entre ellas. Un pool podría llenar esa transacción con cualquier dirección, y un minero que hashea sin mirar estaría trabajando para otro.
Así que antes del primer hash, el navegador monta la coinbase y la analiza. Exige exactamente una entrada, lee cada salida y rechaza los bytes sobrantes. Luego convierte tu dirección en el script que espera encontrar: Base58Check para P2PKH y P2SH, Bech32 para la versión de testigo 0, Bech32m para la versión 1 en adelante, lo que cubre P2WPKH, P2WSH y Taproot. Compara ese script byte a byte con cada salida y suma lo que te paga a ti.
Sin coincidencia, no hay minería. La comprobación se repite con cada trabajo nuevo, y una pestaña no puede convertirse en el minero hasta que la pasa:
const canPlay = bound && payout !== null;En nuestros tests, un trabajo real del pool paga el 98 % de la recompensa a la dirección del minero.
El relé comprueba los hashes del navegador. El navegador comprueba la coinbase del relé.
Lo que dejamos fuera
Nunca se crea un wallet. Mini Miner pide una dirección de recepción y nada más: ni clave, ni firma. Y es una app web, no una extensión de navegador, porque la Chrome Web Store rechaza las extensiones de minería desde 2018.
Alex

