tari-rust/README.md

182 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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`