tari-rust/README.md

203 lines
4.5 KiB
Markdown
Raw Permalink 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通信协议用于挖矿池和矿工之间的通信。
## 功能特性
- 通过gRPC从BaseNode获取区块模板
- 自动生成coinbase交易
- 支持SHA3X挖矿算法
- ZMQ推送标准JSON格式的挖矿任务
- 每秒获取一次模板高度变立即推送否则每5秒推送一次最新模板
## 数据结构
### 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,
}
```
### ProofOfWork
```rust
pub struct ProofOfWork {
pub pow_algo: u64,
pub pow_data: String,
}
```
### BlockBody区块体
```rust
pub struct BlockBody {
pub inputs: Vec<TransactionInput>,
pub outputs: Vec<TransactionOutput>,
pub kernels: Vec<TransactionKernel>,
}
```
### MiningTask挖矿任务
```rust
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挖矿消息
```rust
pub struct MiningMsg {
pub height: u64,
pub mining_hash: String,
pub target: u64,
pub block_header: BlockHeader,
pub block_body: BlockBody,
}
```
### SubmitRequest提交请求
```rust
pub struct SubmitRequest {
pub job_id: String,
pub nonce: u64,
pub solution: String,
}
```
### SubmitResult提交结果
```rust
pub struct SubmitResult {
pub job_id: String,
pub result: u8, // 1表示成功0表示失败
}
```
## 工作流程
1. 每秒从BaseNode获取一次区块模板。
2. 若区块高度变化立即推送新任务否则每5秒推送一次最新模板。
3. 通过ZMQ发布标准JSON格式的MiningMsg消息block_body为JSON对象。
4. 任务缓存、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` | `.` | 配置目录 |
## 构建和运行
### 构建
```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 31000 \
--zmq-sub-port 31001
```
## ZMQ消息格式
### 挖矿任务消息
```
Topic: "mining_msg"
Data: JSON格式的MiningMsgblock_body为标准JSON对象
```
### 提交请求消息
```
Topic: "submit"
Data: JSON格式的SubmitRequest
```
### 提交结果消息
```
Topic: "submit_result"
Data: JSON格式的SubmitResult
```
## 依赖项
- `reqwest`: HTTP客户端
- `zmq`: ZMQ通信
- `serde`: 序列化/反序列化
- `tokio`: 异步运行时
- `tonic`: gRPC客户端
- 其它Tari相关依赖
## 注意事项
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状态
## 开发
如需扩展功能,请直接修改`src/main.rs`,结构清晰,易于维护。