← Tots els articles

Núm. 05Mini Miner

Un miner de Bitcoin en una pestanya

Mini Miner fa el hash de capçaleres reals de blocs de Bitcoin en WebAssembly. El que val la pena explicar és el que el navegador comprova abans de fer el hash de res.

Alex Colls Outumuro

Cofundador i CTO · · 3 min de lectura

Estampa 05, Ziga-zaga. Gotes i pintes sobre un bany, treta en construir el web.Passa-hi el punter per deixar caure tinta.

Mini Miner mina Bitcoin en solitari, a la xarxa real, des d’una pestanya del navegador. Ningú no espera que un portàtil trobi un bloc, i no cal perquè l’enginyeria valgui la pena d’explicar. Minar honestament des d’un navegador demanava tres peces: un bucle de hash ràpid, un relé, i una comprovació que la recompensa és teva.

El bucle de hash

Una capçalera de bloc de Bitcoin ocupa 80 bytes. Minar és fer-ne el hash dos cops amb SHA-256, una vegada i una altra, canviant el nonce dels seus últims quatre bytes fins que el resultat quedi per sota d’un objectiu. A Mini Miner cada intent només reescriu aquests quatre bytes, a la posició 76, i fa el hash de la capçalera amb el SHA-256 en WebAssembly de la biblioteca hash-wasm.

La feina s’executa en Web Workers, tants com l’esforç que tries: ×1, ×2, ×4, o Max. Max es mesura, no s’endevina. Afegeix un worker cada vegada, el deixa escalfar, mesura durant un segon, i s’atura quan un worker més aporta menys d’un 5 %. Cada worker parteix del seu propi extranonce i avança tants passos com workers hi ha quan ha provat els 2³² nonces, així que dos workers no fan mai el hash de la mateixa capçalera.

El relé

Un navegador no pot obrir un socket TCP, i els pools de mineria parlen Stratum sobre TCP. Així que el navegador parla JSON per un WebSocket amb el nostre relé, i el relé parla Stratum v1 amb un pool en solitari, amb una connexió per cada adreça que es mina. El relé reenvia les feines. No guarda claus ni fons, i no tria les transaccions del bloc: això ho fa el pool.

El relé tampoc no es fia del navegador. Reconstrueix cada capçalera que envia el navegador, en torna a fer el hash, i només reenvia un hash que de debò és per sota de l’objectiu.

Comprovar la coinbase abans de fer el hash

Aquesta és la part que més m’importa. Una feina de Stratum no et dona un bloc. Et dona les dues meitats de la transacció coinbase, la que paga la recompensa, i tu hi poses els teus extranonces al mig. Un pool podria omplir aquesta transacció amb qualsevol adreça, i un miner que fa el hash sense mirar estaria treballant per a un altre.

Així que abans del primer hash, el navegador munta la coinbase i l’analitza. Exigeix exactament una entrada, llegeix cada sortida i rebutja els bytes sobrants. Després converteix la teva adreça en l’script que espera trobar: Base58Check per a P2PKH i P2SH, Bech32 per a la versió de testimoni 0, Bech32m per a la versió 1 i següents, cosa que cobreix P2WPKH, P2WSH i Taproot. Compara aquest script byte a byte amb cada sortida i suma el que et paga a tu.

Sense coincidència, no hi ha mineria. La comprovació es repeteix amb cada feina nova, i una pestanya no pot esdevenir el miner fins que la passa:

const canPlay = bound && payout !== null;

Als nostres tests, una feina real del pool paga el 98 % de la recompensa a l’adreça del miner.

El relé comprova els hashes del navegador. El navegador comprova la coinbase del relé.

El que vam deixar fora

No es crea mai cap wallet. Mini Miner demana una adreça de recepció i res més: ni clau, ni signatura. I és una app web, no una extensió de navegador, perquè la Chrome Web Store rebutja les extensions de mineria des del 2018.

Alex