m2pool-core/README.md

147 lines
6.2 KiB
Markdown
Raw Normal View History

2025-09-03 08:00:42 +00:00
# tari-server
一个基于 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 并注明授权条款。