# Tari GBT (Get Block Template) Client 这是一个Tari区块链的GetBlockTemplate客户端,支持ZMQ通信协议,用于挖矿池和矿工之间的通信。 ## 功能特性 - 通过gRPC从BaseNode获取区块模板 - 自动生成coinbase交易 - 支持SHA3X挖矿算法 - ZMQ推送标准JSON格式的挖矿任务 - 每秒获取一次模板,高度变立即推送,否则每5秒推送一次最新模板 ## 数据结构 ### BlockHeader(区块头) ```rust 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 ```rust pub struct ProofOfWork { pub pow_algo: u64, pub pow_data: String, } ``` ### BlockBody(区块体) ```rust pub struct BlockBody { pub inputs: Vec, pub outputs: Vec, pub kernels: Vec, } ``` ### MiningTask(挖矿任务) ```rust 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(挖矿消息) ```rust pub struct MiningMsg { pub height: u64, pub mining_hash: String, pub target: u64, pub block_header: BlockHeader, pub block_body: BlockBody, } ``` ### SubmitRequest(提交请求) ```rust pub struct SubmitRequest { pub job_id: String, pub nonce: u64, pub solution: String, } ``` ### SubmitResult(提交结果) ```rust 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` | `.` | 配置目录 | ## 构建和运行 ### 构建 ```bash cargo build --release ``` ### 运行 ```bash # 基本运行 ./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格式的MiningMsg,block_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`,结构清晰,易于维护。