6.2 KiB
6.2 KiB
m2pool-mining-core
一个基于 Go 的轻量化挖矿池服务内核,包含 Job 生成/分发与 Stratum 矿工端接入两大模块:
- gbt:区块模板生成与同步(GetBlockTemplate/Job Producer),通过 ZMQ 向服务端发布新任务
- server:Stratum 挖矿服务(矿工接入、难度调整、提交校验、统计与缓存)
当前代码启用了 sha3x
币种实现(其他如 nexa
、monero
的代码结构已准备但默认关闭/注释)。
功能特性
- Stratum 协议接入,支持
mining.subscribe
、mining.authorize
/login
、mining.submit
、mining.ping/pong
- 可配置的难度策略(含卡尔曼滤波驱动的 VarDiff 逻辑,按提交间隔动态调整)
- 任务分发与同步:gbt 通过 ZMQ 发布,server 订阅并向在线矿工广播
- 连接数/同 IP 限流、存活监测、超时与心跳处理
- Redis 用于在线状态与速率缓存,DB 持久化矿工/用户/池端统计
- 日志:zap + 日志轮转
- 内置 pprof 端口(从配置读取)
目录结构
cmd/
gbt/gbt.go # 区块模板生成/任务发布入口
server/server.go # 挖矿池服务入口(Stratum 服务)
internal/
server/ # 矿工接入、会话、难度、任务处理
gbt/ # GBT/任务管线,各币种对接
db/ # 数据库上下文与表结构
cache/ # Redis 缓存读写
stratum/ # Stratum 协议与消息结构
utility/ # 工具、日志、ZMQ 初始化等
config/
nexa/
server/server.conf # server 示例配置(按需拷贝/修改)
gbt/gbt.conf # gbt 示例配置(按需拷贝/修改)
db/db.conf # DB 配置(MySQL/SQLite)
环境依赖
- Go 1.23+(go.mod 声明
toolchain go1.23.1
) - Redis(作为状态/速率缓存)
- 数据库:MySQL 或 SQLite(按
config/<coin>/db/db.conf
配置) - ZMQ(用于 gbt → server 的 Job 发布/订阅)
- 可选本地 C 库:目录
internal/server/lib/
下包含部分.so
/.a
,用于特定算法;sha3x
默认主要为 Go 实现。建议在 Linux 环境下构建、运行;Windows 可能需要适配或禁用相关 C 扩展。
快速开始
- 准备配置文件(以
sha3x
为例)
- 将以下文件拷贝到运行目录(项目根或二进制同目录):
config/nexa/server/server.conf
→server.conf
config/nexa/gbt/gbt.conf
→gbt.conf
config/nexa/db/db.conf
→db.conf
- 打开并修改以上配置以匹配你的 Redis、DB、ZMQ 与监听地址。例如:
server.conf
中的 Stratum 监听端口、pprof 端口,gbt.conf
中的上游节点与发布地址。
- 构建
# 在项目根目录执行
go build -o bin/server ./cmd/server
go build -o bin/gbt ./cmd/gbt
- 运行
# 先启动 gbt(负责产生并发布 Job)
./bin/gbt
# 再启动 server(负责矿工接入与提交校验)
./bin/server
- 两个进程均会在工作目录读取同名配置:
gbt
读取gbt.conf
,server
读取server.conf
。 server
会根据配置启动一个 pprof HTTP 端口,便于性能分析。
- 矿工连接
- 在矿工端配置你的 Stratum 地址,即
server.conf
中的Host.Listen
(例如:stratum+tcp://<ip>:<port>
)。 - 账户名与 Miner 名按池的约定填写,对应鉴权在
internal/stratum
与internal/server/coin/*
中处理。
配置说明(概览)
- server.conf(读取于工作目录)
- Host.Listen:Stratum 监听地址,形如
0.0.0.0:端口
- Redis:
Addr/Password/DB
- ZMQ:
Pub
(向外发布)、Sub
(订阅 gbt 发布的 Job) - Diff:难度相关参数(起始、最小/最大、调整间隔、滤波模式等)
- Zaplog/Logrotate:日志级别、输出与轮转策略
- pprof 端口:由
cmd/server
中utility.GetCoin("server.conf")
返回的第二个值决定
- Host.Listen:Stratum 监听地址,形如
- gbt.conf(读取于工作目录)
- 上游节点/RPC 或 gRPC/GRPC/Tari/Monero 等对接参数
- ZMQ:对外发布 Job 的地址(需与 server 的
Zmq.Sub
对应)
- db.conf
- MySQL 或 SQLite 连接信息(
internal/db
负责加载与建表)
- MySQL 或 SQLite 连接信息(
注意:项目内示例配置位于 config/nexa/...
,请根据目标币种复制调整;sha3x
仅需要确保 ZMQ/Redis/DB 与监听端口正常。
运行时行为要点
- gbt → server:通过 ZMQ 发布/订阅通道传递新 Job,
server
收到后同步标志并向矿工广播 - 存活与心跳:
server
为连接设置超时、心跳(ping/pong),并清理无效连接 - 动态难度:根据提交间隔、方差与配置策略更新矿工难度
- 速率与统计:接受/拒绝、哈希率、区块、孤块等统计通过内存与 Redis/DB 维护
- 退出流程:
Stop()
会清理连接、关闭 ZMQ、Redis、日志并回收内存结构
常见问题
- 端口不通:确认
server.conf
中监听端口开放(防火墙/安全组),ZMQ 地址能互通 - 配置找不到:
server
与gbt
均在工作目录读取*.conf
,请确保以正确的工作目录启动或将配置拷贝到同一目录 - 构建失败(Windows):如遇
.so/.a
相关链接问题,建议在 Linux 构建或禁用/移除对应 C 扩展;sha3x
模块通常不依赖这些库 - Redis/DB 未就绪:请先启动并配置正确连接串;否则启动会失败或无法持久化统计
开发与调试
- 使用 pprof:根据
server.conf
暴露的地址访问http://<ip>:<pprof_port>/debug/pprof/
- 日志:默认使用 zap,按
Zaplog
与Logrotate
配置输出与轮转 - 关键位置:
internal/server/server.go
:连接处理、心跳、难度调整、Job 处理主流程internal/gbt/*
:各币种 GBT 接入与 Job 生成internal/stratum/*
:协议与消息体
构建与运行示例(Windows PowerShell)
# 构建
$env:CGO_ENABLED=0
go build -o bin/server.exe ./cmd/server
go build -o bin/gbt.exe ./cmd/gbt
# 运行前将 *.conf 复制到当前目录
./bin/gbt.exe
./bin/server.exe
注:如需使用依赖本地 C 库的算法实现,建议在 Linux 环境构建并确保工具链与库依赖可用。
许可证
本项目未在仓库根目录明确声明许可证。如需开源发布,请在根目录新增 LICENSE 并注明授权条款。