Bitcoin-mining uitvoeren op een ESP32-microcontroller
Mining van de eerste cryptocurrency is allang veranderd in een gesloten club van industriële datacenters met enorme hangars vol zoemende ASIC's. Voor een gewone ontwikkelaar is het bouwen van een thuismining-rig tegenwoordig zinloos en duur. Maar het Bitaxe-project en de ESP-Miner-repository brengen het gevoel van garage-DIY terug. De jongens hebben een volwaardige open-source firmware gemaakt voor een bord gebaseerd op de ESP32-chip die een standalone ASIC-chip aanstuurt (bijvoorbeeld BM1397 of BM1366 uit gedemonteerde Antminers) en Bitcoin rechtstreeks via thuis-Wi-Fi mined.
In wezen is dit een open-source micro-miner ter grootte van een handpalm die een paar tientallen watt verbruikt, rustig op een bureau staat en een eerlijke hashrate levert. Laten we uitzoeken hoe dit systeem intern werkt en wat de repository interessant maakt voor programmeurs.
Wat er in het project zit
ESP-Miner is geschreven in pure C onder Espressif's ESP-IDF-framework. De firmware regelt al het zware werk: initialiseert de ASIC, configureert kernspanning en -frequentie, maakt verbinding met Wi-Fi en onderhoudt communicatie met de mining-pool via het Stratum-protocol.
Het systeem bevat AxeOS. Dit is een ingebouwde webinterface en HTTP-server die metrieken serveert, het wisselen van pools mogelijk maakt en de ventilator aanstuurt. Voorheen werd de webinterface apart gecompileerd en geflasht naar een aparte SPIFFS-partitie, maar in recente versies hebben de auteurs de frontend rechtstreeks in de hoofdapplicatiebinary gebundeld (esp-miner.bin), gecomprimeerd met gzip. Als je een aangepast thema of je eigen UI wilt toepassen, kun je een aparte partitie www.bin inschakelen in de instellingen.
Het bord werkt niet met zomaar elke module. De firmware vereist kritiek een ESP32-S3-WROOM-1-module revisie N16R8, die 16 MB flashgeheugen en 8 MB octal PSRAM op het bord gesoldeerd heeft. Zonder dit RAM zal de firmware simpelweg niet opstarten, gegeven de buffergroottes en ingebouwde netwerkservices.
Besturing via REST API en WebSockets
Het prettigste voor ontwikkelaars is dat het apparaat niet probeert een "gesloten doos" te zijn. AxeOS biedt een volledige OpenAPI-interface waarmee je elke actie kunt automatiseren.
Zo ziet een typische poll van de ASIC-status eruit via curl:
curl http://bitaxe.local/api/system/asic
De reactie levert een JSON met huidige frequentie, spanning, temperatuur en hashrate. Als je de ventilatorsnelheid wilt omschakelen, stuur je een PATCH-verzoek:
curl -X PATCH http://bitaxe.local/api/system \
-H "Content-Type: application/json" \
-d '{"fanspeed": "80"}'
Beide generaties van het Stratum-protocol worden ondersteund: klassiek V1 en modern V2 met versleutelde kanalen en verminderd verkeer. Je kunt de pool rechtstreeks vanaf de terminal configureren:
curl -X PUT http://bitaxe.local/api/system/pools/0 \
-H "Content-Type: application/json" \
-d '{
"stratumProtocol": "SV1",
"stratumURL": "solo.ckpool.org",
"stratumPort": 3333,
"stratumUser": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa.worker1",
"stratumPassword": "x",
"stratumSuggestedDifficulty": 0,
"stratumExtranonceSubscribe": true,
"stratumTLS": 0,
"stratumDecodeCoinbase": true
}'
Voor streaming-monitoring zijn er twee WebSockets beschikbaar. Op adres /api/ws stromen tekstuele systeemlogboeken in realtime, en /api/ws/live zendt een JSON-stream uit met systeemstatuswijzigingen. Met het hulpprogramma websocat kun je deze stream onmiddellijk omleiden naar een lokaal dashboard of metriekverzamelingsscript:
websocat ws://bitaxe.local/api/ws/live
Autodetectie in het netwerk via mDNS
Als je niet alleen één Bitaxe aansluit maar een hele batch (een zogenaamde zwerm), wordt het vervelend om elk IP-adres via de router te zoeken. De ontwikkelaars hebben multicast DNS (mDNS) ondersteuning ingebouwd met servicedistributie via DNS-SD.
Het apparaat registreert zichzelf met het subtype _axeos._sub._http._tcp. In TXT-records verstrekt het onmiddellijk de bordversie, ASIC-chipmodel, het aantal en de firmwareversie. Op Linux kun je alle actieve miners op het lokale netwerk vinden met één commando:
avahi-browse _axeos._sub._http._tcp
Als er twee apparaten met dezelfde naam bitaxe op het netwerk verschijnen, wordt het conflict automatisch opgelost. De firmware neemt het MAC-adres-achtervoegsel en hernoemt zichzelf, bijvoorbeeld naar bitaxe-12ab.
Bouwen en flashen
Voor het flashen van vooraf gebouwde releases en het bewerken van NVS-instellingen heeft het team hun eigen Python CLI-hulpprogramma gemaakt — bitaxetool. Let op de afhankelijkheidsversies: het hulpprogramma is gekoppeld aan een oude versie van esptool 4.9.0 en werkt momenteel niet met de vijfde branch.
Installatie en het flashen van de fabrieksimage ziet er zo uit:
pip install bitaxetool==0.6.1
bitaxetool --config ./config-401.cvs --firmware ./esp-miner-factory-401-v2.4.2.bin
Als je in de broncode wilt duiken en het project lokaal wilt bouwen, hoef je niet eens de hele ESP-IDF-stack op je host te installeren. De repository heeft een kant-en-klare .devcontainer. Je kunt de build uitvoeren in een geïsoleerde Docker-container:
git clone --recursive https://github.com/bitaxeorg/ESP-MINER.git
cd ESP-MINER
docker build -t espminer-build .devcontainer
docker run --rm -it -v $PWD:/workspace espminer-build /bin/bash
Binnen de container voeren we het standaard idf.py build-commando uit. Vervolgens starten we het helper-script merge_bin.sh, dat de bootloader, partitietabel en firmware-image samenvoegt tot één flashbaar bestand.
Welke eigenaardigheden je kunt tegenkomen
Er zijn een paar nuances waar de makers eerlijk voor waarschuwen in de documentatie.
Ten eerste, thuisrouters. Sommige ASUS- en TP-Link-modellen met ingebouwde verkeersfiltersystemen (zoals AiProtection of IoT Shield) blokkeren het Stratum-protocol stilzwijgend, waarbij ze de miner-pakketten aanzien voor kwaadaardige softwareactiviteit. Als gevolg daarvan houdt het bord succesvol Wi-Fi in stand, maar blijft de hashrate koppig op nul. Je moet deze instellingen uitschakelen in het adminpaneel van de router.
Ten tweede, overklokken. Standaard zijn de velden voor frequentie- en kernspanningsaanpassing vergrendeld in de webinterface voor de veiligheid. Om toegang te krijgen tot fijnafstelling moet je de parameter ?oc toevoegen aan de browseradresbalk op het tabblad instellingen. Zonder een goede koelplaat en ventilator is dit duidelijk niet de moeite waard.
Ten derde, fysieke verbinding. Sommige revisies van Bitaxe-borden zijn kieskeurig over directe Type-C naar Type-C-kabelverbindingen vanwege CC-lijnweerstandroutering. Een adapter naar USB-A lost het probleem onmiddellijk op.
Waarom ontwikkelaars naar dit project zouden moeten kijken
ESP-Miner is interessant niet zozeer vanwege de mogelijkheid om satoshi's te verdienen (op dit vermogensniveau is het meer alsof je meedoet aan een solo-mining-loterij), maar vanwege de architectuur. Het is een geweldige referentie voor hoe je complexe apparaten kunt bouwen op basis van ESP32:
- Hoe je een volledige REST API en WebSockets op een microcontroller organiseert zonder bevriezing.
- Hoe je een webinterface en low-level C-code combineert in één gecomprimeerd binair bestand.
- Hoe je apparaat-autodetectie via mDNS implementeert zonder centrale server.
- Hoe je werkt met externe cryptografische bibliotheken zoals
libsecp256k1op embedded chips.
Als je een ESP32-S3 met PSRAM ongebruikt hebt liggen of al lang wilt begrijpen hoe het Stratum-protocol in de praktijk werkt, is het zeker de moeite waard om in de repository te duiken.
Gerelateerde projecten