4.5 KiB
4.5 KiB
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表示失败
}
工作流程
- 每秒从BaseNode获取一次区块模板。
- 若区块高度变化,立即推送新任务;否则每5秒推送一次最新模板。
- 通过ZMQ发布标准JSON格式的MiningMsg消息,block_body为JSON对象。
- 任务缓存、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格式的MiningMsg,block_body为标准JSON对象
提交请求消息
Topic: "submit"
Data: JSON格式的SubmitRequest
提交结果消息
Topic: "submit_result"
Data: JSON格式的SubmitResult
依赖项
reqwest
: HTTP客户端zmq
: ZMQ通信serde
: 序列化/反序列化tokio
: 异步运行时tonic
: gRPC客户端- 其它Tari相关依赖
注意事项
- 确保BaseNode的gRPC和HTTP服务正在运行
- 确保ZMQ端口未被占用
- 钱包地址必须是有效的Tari地址
- 网络配置必须与BaseNode一致
- 建议在生产环境中启用TLS
故障排除
-
连接BaseNode失败
- 检查BaseNode是否运行
- 验证gRPC地址和端口
- 检查网络配置
-
HTTP请求失败
- 检查BaseNode HTTP服务
- 验证HTTP地址和端口
- 检查网络连接
-
ZMQ通信失败
- 检查ZMQ端口是否被占用
- 验证防火墙设置
- 检查ZMQ库安装
-
任务提交失败
- 检查任务ID是否有效
- 验证nonce和solution格式
- 检查BaseNode状态
开发
如需扩展功能,请直接修改src/main.rs
,结构清晰,易于维护。