如何在 ESP32 微控制器上运行比特币挖矿
挖矿这种第一加密货币早已变成了工业数据中心的封闭俱乐部,巨大的机库里满是嗡嗡作响的 ASIC 矿机。对于普通开发者来说,如今为了好玩而搭建家庭矿机既无意义又昂贵。但 Bitaxe 项目和 ESP- Miner 仓库重新带来了车库 DIY 的感觉。这群人基于 ESP32 芯片的电路板打造了一套功能完整的开源固件,用于控制独立的 ASIC 芯片(例如从 Antminer 拆解的 BM1397 或 BM1366),可以直接通过家庭 Wi- Fi 进行比特币挖矿。
本质上,这是一个巴掌大小的开源微型矿机,功耗仅几十瓦,安静地放在桌面上,提供诚实的算力。让我们深入了解这个系统的工作原理,以及为什么这个仓库对程序员来说很有趣。
项目内部结构
ESP- Miner 使用纯 C 语言编写,基于 Espressif 的 ESP- IDF 框架。固件处理所有底层工作:初始化 ASIC、配置核心电压和频率、连接 Wi- Fi,以及通过 Stratum 协议与矿池保持通信。
系统包含 AxeOS。这是一个内置的 Web 界面和 HTTP 服务器,提供指标数据、允许切换矿池、控制风扇。之前 Web 界面是单独编译并刷入独立的 SPIFFS 分区,但在最新版本中作者将前端直接打包到主应用程序二进制文件中(esp-miner.bin),并使用 gzip 压缩。如果需要应用自定义主题或自己的 UI,可以在设置中启用独立分区 www.bin。
电路板不是随便什么模块都能用。固件严格要求 ESP32- S3-WROOM-1 模块,版本为 N16R8,即板载 16 MB Flash 存储器和 8 MB 八通道 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
}'
对于流式监控,有两个可用的 WebSocket。地址 /api/ws 实时传输文本格式的系统日志,地址 /api/ws/live 广播 JSON 格式的系统状态变化流。使用 websocat 工具,你可以立即将此流重定向到本地仪表板或指标收集脚本:
websocat ws://bitaxe.local/api/ws/live
通过 mDNS 实现网络自动发现
如果你连接的不只是一个 Bitaxe,而是一整批(所谓的集群),通过路由器逐个搜索 IP 地址就很繁琐了。开发者内置了多播 DNS(mDNS)支持,并通过 DNS- SD 进行服务广告。
设备注册时使用子类型 _axeos._sub._http._tcp。在 TXT 记录中,它直接提供电路板版本、ASIC 芯片型号、数量和固件版本。在 Linux 上,只需一条命令就能找到本地网络上所有活跃的矿机:
avahi-browse _axeos._sub._http._tcp
如果网络上出现两个同名设备 bitaxe,冲突会自动解决。固件会取 MAC 地址后缀并重命名自己,例如改为 bitaxe-12ab。
构建和刷写
为了刷写预构建版本和编辑 NVS 设置,团队制作了自己的 Python CLI 工具—— bitaxetool。注意依赖版本:该工具绑定到旧版本的 esptool 4.9.0,目前在第五分支上会出问题。
安装和刷写出厂镜像的步骤如下:
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,它会将引导加载器、分区表和固件镜像合并为单个可刷写的文件。
可能遇到的奇怪问题
创作者在文档中坦诚地提到了几个细节问题。
首先,家庭路由器。一些华硕和 TP- Link 型号内置流量过滤系统(如 AiProtection 或 IoT Shield),会静默阻止 Stratum 协议,将矿机的数据包误认为恶意软件活动。结果是电路板成功保持 Wi- Fi 连接,但算力始终为零。必须在路由器的管理面板中禁用这些设置。
其次,超频。默认情况下,出于安全考虑,Web 界面中频率和核心电压调整字段是锁定的。要解锁微调权限,需要在设置页面的浏览器地址栏中添加参数 ?oc。没有合适的散热片和良好的风扇,这样做显然不值得。
第三,物理连接。一些 Bitaxe 电路板版本对直连 Type- C 到 Type- C 线缆很挑剔,因为 CC 引脚的电阻布线问题。使用 USB- A 转接头立即就能解决问题。
为什么开发者应该关注这个项目
ESP- Miner 的有趣之处与其说是赚取聪的能力(在这个算力水平下,更像是参与 solo 挖矿彩票),不如说是其架构。它是构建基于 ESP32 的复杂设备的优秀参考:
- 如何在微控制器上组织完整的 REST API 和 WebSocket 而不卡死。
- 如何将 Web 界面和底层 C 代码组合到单个压缩二进制文件中。
- 如何在没有中央服务器的情况下通过 mDNS 实现设备自动发现。
- 如何在嵌入式芯片上使用第三方加密库,如
libsecp256k1。
如果你有闲置的带 PSRAM 的 ESP32- S3,或者一直想了解 Stratum 协议的实际应用,深入研究这个仓库绝对值得。
相关项目