2025-06-27 10:22:48 +00:00
|
|
|
|
# Tari GBT (Get Block Template) Client
|
2025-06-25 12:34:00 +00:00
|
|
|
|
|
2025-06-27 10:22:48 +00:00
|
|
|
|
这是一个Tari区块链的GetBlockTemplate客户端,支持ZMQ通信协议,用于挖矿池和矿工之间的通信。
|
2025-06-25 12:34:00 +00:00
|
|
|
|
|
|
|
|
|
## 功能特性
|
|
|
|
|
|
2025-06-27 10:22:48 +00:00
|
|
|
|
- 通过gRPC从BaseNode获取区块模板
|
|
|
|
|
- 自动生成coinbase交易
|
2025-07-02 09:01:00 +00:00
|
|
|
|
- 支持SHA3X挖矿算法
|
|
|
|
|
- ZMQ推送标准JSON格式的挖矿任务
|
|
|
|
|
- 每秒获取一次模板,高度变立即推送,否则每5秒推送一次最新模板
|
2025-06-27 10:22:48 +00:00
|
|
|
|
|
2025-07-02 09:01:00 +00:00
|
|
|
|
## 数据结构
|
2025-06-27 10:22:48 +00:00
|
|
|
|
|
2025-07-02 09:01:00 +00:00
|
|
|
|
### 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,
|
|
|
|
|
}
|
|
|
|
|
```
|
2025-06-27 10:22:48 +00:00
|
|
|
|
|
2025-07-02 09:01:00 +00:00
|
|
|
|
### ProofOfWork
|
|
|
|
|
```rust
|
|
|
|
|
pub struct ProofOfWork {
|
|
|
|
|
pub pow_algo: u64,
|
|
|
|
|
pub pow_data: String,
|
|
|
|
|
}
|
|
|
|
|
```
|
2025-06-27 10:22:48 +00:00
|
|
|
|
|
2025-07-02 09:01:00 +00:00
|
|
|
|
### BlockBody(区块体)
|
|
|
|
|
```rust
|
|
|
|
|
pub struct BlockBody {
|
|
|
|
|
pub inputs: Vec<TransactionInput>,
|
|
|
|
|
pub outputs: Vec<TransactionOutput>,
|
|
|
|
|
pub kernels: Vec<TransactionKernel>,
|
|
|
|
|
}
|
|
|
|
|
```
|
2025-06-27 10:22:48 +00:00
|
|
|
|
|
|
|
|
|
### MiningTask(挖矿任务)
|
|
|
|
|
```rust
|
|
|
|
|
pub struct MiningTask {
|
2025-07-02 09:01:00 +00:00
|
|
|
|
pub block_header: BlockHeader,
|
|
|
|
|
pub block_body: BlockBody,
|
|
|
|
|
pub output_smt_size: u64,
|
|
|
|
|
pub coinbase_hash: String,
|
|
|
|
|
pub target: u64,
|
|
|
|
|
pub created_at: u64,
|
2025-06-27 10:22:48 +00:00
|
|
|
|
}
|
|
|
|
|
```
|
2025-06-25 12:34:00 +00:00
|
|
|
|
|
2025-06-27 10:22:48 +00:00
|
|
|
|
### MiningMsg(挖矿消息)
|
|
|
|
|
```rust
|
|
|
|
|
pub struct MiningMsg {
|
2025-07-02 09:01:00 +00:00
|
|
|
|
pub height: u64,
|
|
|
|
|
pub mining_hash: String,
|
|
|
|
|
pub target: u64,
|
|
|
|
|
pub block_header: BlockHeader,
|
|
|
|
|
pub block_body: BlockBody,
|
2025-06-27 10:22:48 +00:00
|
|
|
|
}
|
2025-06-25 12:34:00 +00:00
|
|
|
|
```
|
|
|
|
|
|
2025-06-27 10:22:48 +00:00
|
|
|
|
### SubmitRequest(提交请求)
|
|
|
|
|
```rust
|
|
|
|
|
pub struct SubmitRequest {
|
2025-07-02 09:01:00 +00:00
|
|
|
|
pub job_id: String,
|
|
|
|
|
pub nonce: u64,
|
|
|
|
|
pub solution: String,
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### SubmitResult(提交结果)
|
|
|
|
|
```rust
|
|
|
|
|
pub struct SubmitResult {
|
|
|
|
|
pub job_id: String,
|
|
|
|
|
pub result: u8, // 1表示成功,0表示失败
|
2025-06-27 10:22:48 +00:00
|
|
|
|
}
|
|
|
|
|
```
|
2025-06-25 12:34:00 +00:00
|
|
|
|
|
2025-06-27 10:22:48 +00:00
|
|
|
|
## 工作流程
|
2025-06-25 12:34:00 +00:00
|
|
|
|
|
2025-07-02 09:01:00 +00:00
|
|
|
|
1. 每秒从BaseNode获取一次区块模板。
|
|
|
|
|
2. 若区块高度变化,立即推送新任务;否则每5秒推送一次最新模板。
|
|
|
|
|
3. 通过ZMQ发布标准JSON格式的MiningMsg消息,block_body为JSON对象。
|
|
|
|
|
4. 任务缓存、job_id、submit相关逻辑已移除,代码结构更简洁。
|
2025-06-27 10:22:48 +00:00
|
|
|
|
|
|
|
|
|
## 配置参数
|
|
|
|
|
|
|
|
|
|
| 参数 | 默认值 | 说明 |
|
|
|
|
|
|------|--------|------|
|
|
|
|
|
| `--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额外数据 |
|
2025-07-02 09:01:00 +00:00
|
|
|
|
| `--zmq-pub-port` | `31000` | ZMQ发布端口 |
|
|
|
|
|
| `--zmq-sub-port` | `31001` | ZMQ订阅端口 |
|
|
|
|
|
| `--tls` | 关闭 | 启用TLS |
|
|
|
|
|
| `--tls-domain` | 无 | TLS域名 |
|
|
|
|
|
| `--tls-ca-cert` | 无 | TLS CA证书文件 |
|
|
|
|
|
| `--config-dir` | `.` | 配置目录 |
|
2025-06-27 10:22:48 +00:00
|
|
|
|
|
|
|
|
|
## 构建和运行
|
|
|
|
|
|
|
|
|
|
### 构建
|
2025-06-25 12:34:00 +00:00
|
|
|
|
```bash
|
2025-06-27 10:22:48 +00:00
|
|
|
|
cargo build --release
|
2025-06-25 12:34:00 +00:00
|
|
|
|
```
|
|
|
|
|
|
2025-06-27 10:22:48 +00:00
|
|
|
|
### 运行
|
2025-06-25 12:34:00 +00:00
|
|
|
|
```bash
|
2025-06-27 10:22:48 +00:00
|
|
|
|
# 基本运行
|
|
|
|
|
./target/release/gbt
|
|
|
|
|
|
|
|
|
|
# 自定义配置
|
2025-06-25 12:34:00 +00:00
|
|
|
|
./target/release/gbt \
|
2025-06-27 10:22:48 +00:00
|
|
|
|
--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" \
|
2025-07-02 09:01:00 +00:00
|
|
|
|
--zmq-pub-port 31000 \
|
|
|
|
|
--zmq-sub-port 31001
|
2025-06-25 12:34:00 +00:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## ZMQ消息格式
|
|
|
|
|
|
2025-06-27 10:22:48 +00:00
|
|
|
|
### 挖矿任务消息
|
2025-06-25 12:34:00 +00:00
|
|
|
|
```
|
2025-06-27 10:22:48 +00:00
|
|
|
|
Topic: "mining_msg"
|
2025-07-02 09:01:00 +00:00
|
|
|
|
Data: JSON格式的MiningMsg,block_body为标准JSON对象
|
2025-06-25 12:34:00 +00:00
|
|
|
|
```
|
|
|
|
|
|
2025-06-27 10:22:48 +00:00
|
|
|
|
### 提交请求消息
|
|
|
|
|
```
|
|
|
|
|
Topic: "submit"
|
|
|
|
|
Data: JSON格式的SubmitRequest
|
|
|
|
|
```
|
2025-06-25 12:34:00 +00:00
|
|
|
|
|
2025-06-27 10:22:48 +00:00
|
|
|
|
### 提交结果消息
|
|
|
|
|
```
|
|
|
|
|
Topic: "submit_result"
|
|
|
|
|
Data: JSON格式的SubmitResult
|
|
|
|
|
```
|
2025-06-25 12:34:00 +00:00
|
|
|
|
|
2025-06-27 10:22:48 +00:00
|
|
|
|
## 依赖项
|
2025-06-25 12:34:00 +00:00
|
|
|
|
|
2025-06-27 10:22:48 +00:00
|
|
|
|
- `reqwest`: HTTP客户端
|
|
|
|
|
- `zmq`: ZMQ通信
|
|
|
|
|
- `serde`: 序列化/反序列化
|
|
|
|
|
- `tokio`: 异步运行时
|
|
|
|
|
- `tonic`: gRPC客户端
|
2025-07-02 09:01:00 +00:00
|
|
|
|
- 其它Tari相关依赖
|
2025-06-25 12:34:00 +00:00
|
|
|
|
|
2025-06-27 10:22:48 +00:00
|
|
|
|
## 注意事项
|
2025-06-25 12:34:00 +00:00
|
|
|
|
|
2025-06-27 10:22:48 +00:00
|
|
|
|
1. 确保BaseNode的gRPC和HTTP服务正在运行
|
|
|
|
|
2. 确保ZMQ端口未被占用
|
|
|
|
|
3. 钱包地址必须是有效的Tari地址
|
|
|
|
|
4. 网络配置必须与BaseNode一致
|
|
|
|
|
5. 建议在生产环境中启用TLS
|
2025-06-25 12:34:00 +00:00
|
|
|
|
|
2025-06-27 10:22:48 +00:00
|
|
|
|
## 故障排除
|
2025-06-25 12:34:00 +00:00
|
|
|
|
|
2025-06-27 10:22:48 +00:00
|
|
|
|
1. **连接BaseNode失败**
|
|
|
|
|
- 检查BaseNode是否运行
|
|
|
|
|
- 验证gRPC地址和端口
|
|
|
|
|
- 检查网络配置
|
2025-06-25 12:34:00 +00:00
|
|
|
|
|
2025-06-27 10:22:48 +00:00
|
|
|
|
2. **HTTP请求失败**
|
|
|
|
|
- 检查BaseNode HTTP服务
|
|
|
|
|
- 验证HTTP地址和端口
|
|
|
|
|
- 检查网络连接
|
2025-06-25 12:34:00 +00:00
|
|
|
|
|
2025-06-27 10:22:48 +00:00
|
|
|
|
3. **ZMQ通信失败**
|
|
|
|
|
- 检查ZMQ端口是否被占用
|
|
|
|
|
- 验证防火墙设置
|
|
|
|
|
- 检查ZMQ库安装
|
2025-06-25 12:34:00 +00:00
|
|
|
|
|
2025-06-27 10:22:48 +00:00
|
|
|
|
4. **任务提交失败**
|
|
|
|
|
- 检查任务ID是否有效
|
|
|
|
|
- 验证nonce和solution格式
|
|
|
|
|
- 检查BaseNode状态
|
2025-06-25 12:34:00 +00:00
|
|
|
|
|
|
|
|
|
## 开发
|
|
|
|
|
|
2025-07-02 09:01:00 +00:00
|
|
|
|
如需扩展功能,请直接修改`src/main.rs`,结构清晰,易于维护。
|