tari-rust/README.md

182 lines
4.1 KiB
Markdown
Raw Permalink Normal View History

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
### 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, // 目标难度
}
```
2025-06-25 12:34:00 +00:00
2025-06-27 10:22:48 +00:00
### 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, // 目标难度
}
2025-06-25 12:34:00 +00:00
```
2025-06-27 10:22:48 +00:00
### SubmitRequest提交请求
```rust
pub struct SubmitRequest {
pub job_id: String, // 任务ID
pub nonce: u64, // 挖矿nonce
pub solution: String, // 挖矿解
}
```
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. 获取区块模板
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订阅端口 |
## 构建和运行
### 构建
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" \
--zmq-pub-port 5555 \
--zmq-sub-port 5556
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"
Data: JSON格式的MiningMsg
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客户端
- `uuid`: 任务ID生成
- `zmq`: ZMQ通信
- `serde`: 序列化/反序列化
- `tokio`: 异步运行时
- `tonic`: gRPC客户端
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
### 常见问题
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-06-27 10:22:48 +00:00
1. 修改`src/main.rs`