N° 05Mini Miner
Un mineur Bitcoin dans un onglet
Mini Miner hache de vrais en-têtes de blocs Bitcoin en WebAssembly. Ce qui mérite d’être raconté, c’est ce que le navigateur vérifie avant de hacher quoi que ce soit.
Alex Colls Outumuro
Cofondateur et CTO · · 3 min de lecture
Mini Miner mine du Bitcoin en solo, sur le réseau réel, depuis un onglet de navigateur. Personne ne s’attend à ce qu’un portable trouve un bloc, et il n’en a pas besoin pour que l’ingénierie vaille d’être racontée. Miner honnêtement depuis un navigateur a demandé trois pièces : une boucle de hachage rapide, un relais, et une vérification que la récompense est bien à vous.
La boucle de hachage
Un en-tête de bloc Bitcoin fait 80 octets. Miner, c’est le hacher deux fois en SHA-256, encore et encore, en changeant le nonce de ses quatre derniers octets jusqu’à ce que le résultat passe sous une cible. Dans Mini Miner, chaque essai ne réécrit que ces quatre octets, à la position 76, et hache l’en-tête avec le SHA-256 en WebAssembly de la bibliothèque hash-wasm.
Le travail tourne dans des Web Workers, dont le nombre dépend de l’effort que vous choisissez : ×1, ×2, ×4, ou Max. Max se mesure, il ne se devine pas. Il ajoute un worker à la fois, le laisse chauffer, mesure pendant une seconde, et s’arrête quand un worker de plus apporte moins de 5 %. Chaque worker part de son propre extranonce et avance du nombre de workers une fois qu’il a essayé les 2³² nonces : deux workers ne hachent jamais le même en-tête.
Le relais
Un navigateur ne peut pas ouvrir de socket TCP, et les pools de minage parlent Stratum sur TCP. Le navigateur parle donc JSON sur un WebSocket à notre relais, et le relais parle Stratum v1 à une pool solo, avec une connexion par adresse minée. Le relais transmet les tâches. Il ne détient ni clé ni fonds, et ne choisit pas les transactions du bloc : c’est la pool qui le fait.
Le relais ne croit pas non plus le navigateur sur parole. Il reconstruit chaque en-tête que le navigateur soumet, le hache à nouveau, et ne transmet qu’un hash vraiment sous la cible.
Vérifier la coinbase avant de hacher
C’est la partie qui me tient le plus à cœur. Une tâche Stratum ne vous donne pas un bloc. Elle vous donne les deux moitiés de la transaction coinbase, celle qui paie la récompense, et vous glissez vos extranonces entre les deux. Une pool pourrait y mettre n’importe quelle adresse, et un mineur qui hache sans regarder travaillerait pour quelqu’un d’autre.
Avant le premier hash, le navigateur assemble donc la coinbase et l’analyse. Il exige exactement une entrée, lit chaque sortie et refuse les octets en trop. Puis il transforme votre adresse en script qu’il s’attend à trouver : Base58Check pour P2PKH et P2SH, Bech32 pour la version de témoin 0, Bech32m pour la version 1 et au-delà, ce qui couvre P2WPKH, P2WSH et Taproot. Il compare ce script octet par octet avec chaque sortie et additionne ce qui vous est versé.
Pas de correspondance, pas de minage. La vérification est refaite à chaque nouvelle tâche, et un onglet ne peut pas devenir le mineur avant qu’elle passe :
const canPlay = bound && payout !== null;Dans nos tests, une vraie tâche de la pool paie 98 % de la récompense à l’adresse du mineur.
Le relais vérifie les hashs du navigateur. Le navigateur vérifie la coinbase du relais.
Ce qu’on a laissé de côté
Aucun wallet n’est jamais créé. Mini Miner demande une adresse de réception et rien d’autre : ni clé, ni signature. Et c’est une app web, pas une extension de navigateur, parce que le Chrome Web Store refuse les extensions de minage depuis 2018.
Alex

