m2pool-core/README.md

147 lines
6.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# m2pool-mining-core
一个基于 Go 的轻量化挖矿池服务内核,包含 Job 生成/分发与 Stratum 矿工端接入两大模块:
- gbt区块模板生成与同步GetBlockTemplate/Job Producer通过 ZMQ 向服务端发布新任务
- serverStratum 挖矿服务(矿工接入、难度调整、提交校验、统计与缓存)
当前代码启用了 `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 扩展。
---
## 快速开始
1) 准备配置文件(以 `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` 中的上游节点与发布地址。
2) 构建
```
# 在项目根目录执行
go build -o bin/server ./cmd/server
go build -o bin/gbt ./cmd/gbt
```
3) 运行
```
# 先启动 gbt负责产生并发布 Job
./bin/gbt
# 再启动 server负责矿工接入与提交校验
./bin/server
```
- 两个进程均会在工作目录读取同名配置:`gbt` 读取 `gbt.conf``server` 读取 `server.conf`
- `server` 会根据配置启动一个 pprof HTTP 端口,便于性能分析。
4) 矿工连接
- 在矿工端配置你的 Stratum 地址,即 `server.conf` 中的 `Host.Listen`(例如:`stratum+tcp://<ip>:<port>`)。
- 账户名与 Miner 名按池的约定填写,对应鉴权在 `internal/stratum``internal/server/coin/*` 中处理。
---
## 配置说明(概览)
- server.conf读取于工作目录
- Host.ListenStratum 监听地址,形如 `0.0.0.0:端口`
- Redis`Addr/Password/DB`
- ZMQ`Pub`(向外发布)、`Sub`(订阅 gbt 发布的 Job
- Diff难度相关参数起始、最小/最大、调整间隔、滤波模式等)
- Zaplog/Logrotate日志级别、输出与轮转策略
- pprof 端口:由 `cmd/server``utility.GetCoin("server.conf")` 返回的第二个值决定
- gbt.conf读取于工作目录
- 上游节点/RPC 或 gRPC/GRPC/Tari/Monero 等对接参数
- ZMQ对外发布 Job 的地址(需与 server 的 `Zmq.Sub` 对应)
- db.conf
- MySQL 或 SQLite 连接信息(`internal/db` 负责加载与建表)
注意:项目内示例配置位于 `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 并注明授权条款。