ESP32マイコンでビットコインマイニングを実行する方法
最初の暗号通貨のマイニングは、長い間、巨大な hangar にASICがぎっしり並んだ産業データセンターの閉鎖的なクラブへと変貌してしまった。今日の普通の開発者にとって、遊びで家庭用マイニングリグを構築することは無意味で費用もかかる。しかし、BitaxeプロジェクトとESP-Minerリポジトリは、ガレージDIYの感覚を取り戻してくれる。有志たちは、ESP32チップベースのボード用のフル機能のオープンソースファームウェアを作成し、スタンドアロンのASICチップ(たとえば、分解したAntminerからのBM1397やBM1366など)を制御して дома Wi-Fi経由で直接ビットコインマイニングを行う。
本質的には、これは手のひらサイズのオープンソースマイクロマイナーで、数십ワット消費し、静かにデスクの上に置かれ、正直なハッシュレートを提供する。このシステムが内部でどのように動作し、プログラマーにとってこのリポジトリがなぜ興味深いのかを調べてみよう。
プロジェクトの中身
ESP-MinerはEspressifのESP-IDFフレームワークでピュアC言語書かれている。ファームウェアはASICの初期化、コア電圧と周波数の設定、Wi-Fi接続、Stratumプロトコルによるマイニングプールとの通信など、すべての重い処理を担当する。
システムにはAxeOSが含まれている。これは組み込みのWebインターフェースとHTTPサーバーで、メトリクスを提供し、プールの変更やファン制御を可能にする。以前はWebインターフェースは別途コンパイルされて別のSPIFFSパーティションにフラッシュされていたが、最近のバージョンではフロントエンドを直接メインアプリケーションのバイナリにバンドルし(esp-miner.bin)、gzipで圧縮している。カスタムテーマや独自のUIを適用したい場合は、設定で別パーティション(www.bin)を有効にできる。
このボードは任意のモジュールでは動作しない。ファームウェアはESP32-S3-WROOM-1モジュールリビジョンN16R8を必須としている。これは16MBのフラッシュメモリと8MBのオクタールPSRAMがボードに実装されている。このRAMがなければ、バッファサイズと組み込みのネットワークサービスを考慮すると、ファームウェアは単に起動しない。
REST APIとWebSocketによる制御
開発者にとって最も嬉しいのは、このデバイスが「クローズドボックス」になろうとはしないことだ。AxeOSは完全なOpenAPIインターフェースを提供し、あらゆるアクションの自動化が可能だ。
curlでASICステータスをポーリングする典型的な例は以下のとおり:
curl http://bitaxe.local/api/system/asic
レスポンスには現在の周波数、電圧、温度、ハッシュレートを含むJSONが返される。ファン速度を変更する必要がある場合は、PATCHリクエストを送信する:
curl -X PATCH http://bitaxe.local/api/system \
-H "Content-Type: application/json" \
-d '{"fanspeed": "80"}'
Stratumプロトコルの両世代がサポートされている:クラシックなV1と、暗号化されたチャンネルとトラフィックの削減を実現する最新のV2。ターミナルから直接プールを設定できる:
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
}'
ストリーミング監視には2つのWebSocketが利用可能だ。アドレス(/api/ws)ではテキストシステムログがリアルタイムで流れ、(/api/ws/live)ではシステム状態変更のJSONストリームがブロードキャストされる。ユーティリティ(websocat)を使用すると、このストリームをローカルダッシュボードやメトリクス収集スクリプトに即座にリダイレクトできる:
websocat ws://bitaxe.local/api/ws/live
mDNSによるネットワーク上の自動検出
Bitaxeを1台だけでなく、丸ごと一批(いわゆるswarm)を接続している場合、ルーター経由でそれぞれのIPアドレスを探すのは面倒だ。開発者はDNS-SDによるサービス広告と一緒にマルチキャストDNS(mDNS)サポートを組み込んでいる。
デバイスはサブタイプ(_axeos._sub._http._tcp)で自身を登録する。TXTレコードにはボードバージョン、ASICチップモデル、その数、ファームウェアバージョンがすぐに提供される。Linuxでは、ローカルネットワーク上のすべてのアクティブなマイナーを1つのコマンドで見つけられる:
avahi-browse _axeos._sub._http._tcp
同じ名前(bitaxe)のデバイスがネットワーク上に2つ出現した場合、競合は自動的に解決される。ファームウェアはMACアドレスのサフィックスを取り、たとえば(bitaxe-12ab)に自身りネームする。
ビルドとフラッシュ
プレビルドされたリリースのフラッシュとNVS設定の編集のために、チームは独自のPython CLIユーティリティ(bitaxetool)を作成した。依存関係のバージョンに注意が必要だ:このユーティリティは古いバージョン(esptool 4.9.0)に結びついており、現在は5番目のブランチで動作しない。
インストールとファクトリーイメージのフラッシュは次のとおり:
pip install bitaxetool==0.6.1
bitaxetool --config ./config-401.cvs --firmware ./esp-miner-factory-401-v2.4.2.bin
ソースコードを掘り下げてローカルでプロジェクトをビルドしたい場合は、ホストにESP-IDFスタック全体をインストールする必要すらない。リポジトリには готовый(.devcontainer)がある。ビルドを分離されたDockerコンテナ内で実行できる:
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
コンテナ内では、標準的な(idf.py build)コマンドを実行する。次にヘルパースクリプト(merge_bin.sh)を起動すると、ブートローダー、パーティションテーブル、ファームウェアイメージを単一のフラッシュ可能なファイルにマージする。
遭遇する可能性のある癖
ドキュメントで作成者が正直に警告しているニュアンスがいくつかある。
まず、家庭用路由器だ。一部のASUSやTP-Linkモデルには、トラフィックフィルタリングシステム(AiProtectionやIoT Shieldなど)が組み込まれているが、これがStratumプロトコルをサイレントにブロックし、マイナーのパケットを悪意のあるソフトウェア活動と誤解することがある。その結果、ボードはWi-Fi接続を維持するが、ハッシュレートは頑なにゼロのままになる。路由器の管理パネルでこれらの設定を無効にする必要がある。
次に、オーバークロックだ。デフォルトでは、安全のためにWebインターフェースで周波数とコア電圧調整フィールドはロックされている。微調整へのアクセスをアンロックするには、設定タブでブラウザのアドレスバーにパラメータ(?oc)を追加する必要がある。適切なヒートシンクと良いファンなしでは、これは明らかに不值得。
3番目に、物理的な接続だ。Bitaxeボードの一部のリビジョンは、CCライン抵抗ルーティングのため、直接Type-C to Type-Cケーブル接続に難がある。USB-Aへのアダプタがすぐに問題を解決する。
開発者がこのプロジェクトを見るべき理由
ESP-Minerはサトシを稼ぐ能力という点であまり興味深くない(この電力レベルでは、ソロマイニング宝くじに参加するようなものだ)が、アーキテクチャとして興味深い。ESP32ベースの複雑なデバイスを構築する方法の素晴らしいリファレンスだ:
- マイコン上でREST APIとWebSocketをフリーズさせずに組織する方法。
- Webインターフェースと低レベルのCコードを単一の圧縮バイナリに組み合わせる方法。
- 中央サーバーをわずにmDNSでデバイスの自動検出を実装する方法。
- 組込みチップで(
libsecp256k1)のようなサードパーティの暗号化ライブラリを操作する方法。
未使用のESP32-S3とPSRAMがに転がっている,或者はStratumプロトコルを実際に理解したい場合は、リポジトリを掘り下げる価値は十分にある。
関連プロジェクト