Go to file
lzx e95771709c update hex16 and get output_smt_size 2025-06-27 18:22:48 +08:00
src update hex16 and get output_smt_size 2025-06-27 18:22:48 +08:00
Cargo.toml update hex16 and get output_smt_size 2025-06-27 18:22:48 +08:00
IMPLEMENTATION_SUMMARY.md update hex16 and get output_smt_size 2025-06-27 18:22:48 +08:00
README.md update hex16 and get output_smt_size 2025-06-27 18:22:48 +08:00
build.bat update hex16 and get output_smt_size 2025-06-27 18:22:48 +08:00
build.sh update hex16 and get output_smt_size 2025-06-27 18:22:48 +08:00
config.toml no output_smt_size param gbt 2025-06-25 20:34:00 +08:00
gbt_process no output_smt_size param gbt 2025-06-25 20:34:00 +08:00
test_gbt.py update hex16 and get output_smt_size 2025-06-27 18:22:48 +08:00

README.md

Tari GBT (Get Block Template) Client

这是一个Tari区块链的GetBlockTemplate客户端支持ZMQ通信协议用于挖矿池和矿工之间的通信。

功能特性

1. 区块模板获取

  • 通过gRPC从BaseNode获取区块模板
  • 自动生成coinbase交易
  • 支持多种挖矿算法SHA3X、RandomXM、RandomXT

2. HTTP API集成

  • 通过HTTP请求获取上一个区块的output_smt_size
  • 缓存机制避免重复请求
  • 自动计算当前区块的output_smt_size

3. 任务管理

  • 生成16位16进制任务ID
  • 任务缓存管理最多保存3个区块
  • 支持任务状态跟踪

4. ZMQ通信

  • 发布挖矿任务消息
  • 接收矿工提交结果
  • 支持多种消息类型

数据结构

MiningTask挖矿任务

pub struct MiningTask {
    pub job_id: String,           // 16位16进制任务ID
    pub block_header: BlockHeader, // 区块头信息
    pub block_body: BlockBody,     // 区块体信息
    pub output_smt_size: u64,      // 当前output_smt_size
    pub coinbase_hash: String,     // coinbase哈希
    pub target: u64,               // 目标难度
}

MiningMsg挖矿消息

pub struct MiningMsg {
    pub job_id: String,           // 任务ID
    pub block_header: BlockHeader, // 区块头
    pub output_smt_size: u64,      // output_smt_size
    pub coinbase_hash: String,     // coinbase哈希
    pub target: u64,               // 目标难度
}

SubmitRequest提交请求

pub struct SubmitRequest {
    pub job_id: String,  // 任务ID
    pub nonce: u64,      // 挖矿nonce
    pub solution: String, // 挖矿解
}

工作流程

1. 获取区块模板

  1. 通过gRPC获取区块模板
  2. 生成coinbase交易
  3. 通过HTTP获取上一个区块的output_smt_size
  4. 计算当前output_smt_size = 上一个output_smt_size + outputs长度 - inputs长度
  5. 生成任务ID
  6. 构造MiningTask实例

2. 发送挖矿任务

  1. 构造MiningMsg实例
  2. 通过ZMQ发布消息
  3. 缓存任务信息

3. 接收提交结果

  1. 监听ZMQ提交消息
  2. 验证任务ID
  3. 构造完整区块
  4. 提交到BaseNode
  5. 返回提交结果

配置参数

参数 默认值 说明
--base-node 127.0.0.1:18102 BaseNode gRPC地址
--base-node-http 127.0.0.1:9000 BaseNode HTTP地址
--network mainnet 网络类型
--wallet-address 默认地址 钱包地址
--coinbase-extra m2pool.com Coinbase额外数据
--zmq-pub-port 5555 ZMQ发布端口
--zmq-sub-port 5556 ZMQ订阅端口

构建和运行

构建

cargo build --release

运行

# 基本运行
./target/release/gbt

# 自定义配置
./target/release/gbt \
  --base-node 127.0.0.1:18102 \
  --base-node-http 127.0.0.1:9000 \
  --network mainnet \
  --wallet-address YOUR_WALLET_ADDRESS \
  --coinbase-extra "your_pool_name" \
  --zmq-pub-port 5555 \
  --zmq-sub-port 5556

ZMQ消息格式

挖矿任务消息

Topic: "mining_msg"
Data: JSON格式的MiningMsg

提交请求消息

Topic: "submit"
Data: JSON格式的SubmitRequest

提交结果消息

Topic: "submit_result"
Data: JSON格式的SubmitResult

依赖项

  • reqwest: HTTP客户端
  • uuid: 任务ID生成
  • zmq: ZMQ通信
  • serde: 序列化/反序列化
  • tokio: 异步运行时
  • tonic: gRPC客户端

注意事项

  1. 确保BaseNode的gRPC和HTTP服务正在运行
  2. 确保ZMQ端口未被占用
  3. 钱包地址必须是有效的Tari地址
  4. 网络配置必须与BaseNode一致
  5. 建议在生产环境中启用TLS

故障排除

常见问题

  1. 连接BaseNode失败

    • 检查BaseNode是否运行
    • 验证gRPC地址和端口
    • 检查网络配置
  2. HTTP请求失败

    • 检查BaseNode HTTP服务
    • 验证HTTP地址和端口
    • 检查网络连接
  3. ZMQ通信失败

    • 检查ZMQ端口是否被占用
    • 验证防火墙设置
    • 检查ZMQ库安装
  4. 任务提交失败

    • 检查任务ID是否有效
    • 验证nonce和solution格式
    • 检查BaseNode状态

开发

添加新功能

  1. 修改src/main.rs