Go to file
lzx e0f77b4b91 update 2025-07-02 17:01:00 +08:00
src update 2025-07-02 17:01:00 +08:00
Cargo.toml update 2025-07-02 17:01:00 +08:00
README.md update 2025-07-02 17:01:00 +08:00
config.toml no output_smt_size param gbt 2025-06-25 20:34:00 +08:00

README.md

Tari GBT (Get Block Template) Client

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

功能特性

  • 通过gRPC从BaseNode获取区块模板
  • 自动生成coinbase交易
  • 支持SHA3X挖矿算法
  • ZMQ推送标准JSON格式的挖矿任务
  • 每秒获取一次模板高度变立即推送否则每5秒推送一次最新模板

数据结构

BlockHeader区块头

pub struct BlockHeader {
    pub hash: String,
    pub version: u32,
    pub height: u64,
    pub prev_hash: String,
    pub timestamp: u64,
    pub output_mr: String,
    pub block_output_mr: String,
    pub kernel_mr: String,
    pub input_mr: String,
    pub total_kernel_offset: String,
    pub nonce: u64,
    pub pow: ProofOfWork,
    pub kernel_mmr_size: u64,
    pub output_mmr_size: u64,
    pub total_script_offset: String,
    pub validator_node_mr: String,
    pub validator_node_size: u64,
    pub output_smt_size: u64,
}

ProofOfWork

pub struct ProofOfWork {
    pub pow_algo: u64,
    pub pow_data: String,
}

BlockBody区块体

pub struct BlockBody {
    pub inputs: Vec<TransactionInput>,
    pub outputs: Vec<TransactionOutput>,
    pub kernels: Vec<TransactionKernel>,
}

MiningTask挖矿任务

pub struct MiningTask {
    pub block_header: BlockHeader,
    pub block_body: BlockBody,
    pub output_smt_size: u64,
    pub coinbase_hash: String,
    pub target: u64,
    pub created_at: u64,
}

MiningMsg挖矿消息

pub struct MiningMsg {
    pub height: u64,
    pub mining_hash: String,
    pub target: u64,
    pub block_header: BlockHeader,
    pub block_body: BlockBody,
}

SubmitRequest提交请求

pub struct SubmitRequest {
    pub job_id: String,
    pub nonce: u64,
    pub solution: String,
}

SubmitResult提交结果

pub struct SubmitResult {
    pub job_id: String,
    pub result: u8, // 1表示成功0表示失败
}

工作流程

  1. 每秒从BaseNode获取一次区块模板。
  2. 若区块高度变化立即推送新任务否则每5秒推送一次最新模板。
  3. 通过ZMQ发布标准JSON格式的MiningMsg消息block_body为JSON对象。
  4. 任务缓存、job_id、submit相关逻辑已移除代码结构更简洁。

配置参数

参数 默认值 说明
--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 31000 ZMQ发布端口
--zmq-sub-port 31001 ZMQ订阅端口
--tls 关闭 启用TLS
--tls-domain TLS域名
--tls-ca-cert TLS CA证书文件
--config-dir . 配置目录

构建和运行

构建

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 31000 \
  --zmq-sub-port 31001

ZMQ消息格式

挖矿任务消息

Topic: "mining_msg"
Data: JSON格式的MiningMsgblock_body为标准JSON对象

提交请求消息

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

提交结果消息

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

依赖项

  • reqwest: HTTP客户端
  • zmq: ZMQ通信
  • serde: 序列化/反序列化
  • tokio: 异步运行时
  • tonic: gRPC客户端
  • 其它Tari相关依赖

注意事项

  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状态

开发

如需扩展功能,请直接修改src/main.rs,结构清晰,易于维护。