# 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(挖矿任务) ```rust 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(挖矿消息) ```rust 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(提交请求) ```rust 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订阅端口 | ## 构建和运行 ### 构建 ```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 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`