NAC_Blockchain/docs/modules/nac-cli分析报告.md

980 lines
20 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.

# nac-cli 模块深度分析报告
**模块名称**: nac-cli
**版本**: 2.0.0
**分析日期**: 2026-02-18
**分析人员**: NAC开发团队
---
## 📋 模块概览
**功能定位**: NAC Developer Toolbox v2.0 - 完美中心化框架下的去中心化开发工具
**英文全称**: NAC Command Line Interface
**代码行数**: 1,570行
**完成度**: 30%
**测试覆盖**: 10% (2个测试)
**编译状态**: ✅ 通过
---
## 🏗️ 架构设计
### 核心功能
nac-cli是NAC公链的命令行工具提供以下功能
1. **账户管理**: 创建、导入、导出、查询账户
2. **交易管理**: 发送、查询、签名、广播交易
3. **合约管理**: 部署、调用、查询合约
4. **宪法查询**: 查看宪法条款和参数
5. **节点管理**: 查看节点信息和状态
6. **区块查询**: 查看区块信息
7. **配置管理**: 管理CLI配置
8. **工具功能**: 密钥生成、哈希计算、GNACS编码
9. **开发工具箱v2.0**: 项目创建、编译、测试、沙箱
### 技术栈
| 组件 | 技术 | 版本 | 说明 |
|------|------|------|------|
| CLI框架 | clap | 4.5 | 命令行解析 |
| 异步运行时 | tokio | 1.0 | 异步执行 |
| HTTP客户端 | reqwest | 0.12 | RPC调用 |
| 密码学 | secp256k1 | 0.29 | 签名验证 |
| 序列化 | serde | 1.0 | 数据序列化 |
| 日志 | env_logger | 0.11 | 日志记录 |
### 目录结构
```
nac-cli/
├── src/
│ ├── main.rs (144行) - 程序入口
│ ├── cli.rs (419行) - 命令定义
│ ├── config.rs - 配置管理
│ ├── error.rs - 错误定义
│ ├── commands/ (164行) - 命令实现
│ │ ├── account.rs - 账户命令
│ │ ├── transaction.rs - 交易命令
│ │ ├── contract.rs - 合约命令
│ │ ├── constitution.rs - 宪法命令
│ │ ├── node.rs - 节点命令
│ │ ├── block.rs - 区块命令
│ │ ├── config.rs - 配置命令
│ │ └── utils.rs - 工具命令
│ ├── client/ (80行) - RPC客户端
│ │ ├── mod.rs - 客户端模块
│ │ └── nrpc.rs - NRPC客户端
│ ├── toolbox/ (317行) - 开发工具箱v2.0
│ │ ├── templates.rs - 项目模板
│ │ ├── sandbox.rs - 宪法沙箱
│ │ ├── lsp.rs - LSP服务器
│ │ ├── version.rs - 版本管理
│ │ └── audit.rs - 审计工具
│ └── utils/ (110行) - 工具函数
│ ├── crypto.rs - 密码学工具
│ ├── format.rs - 格式化工具
│ └── gnacs.rs - GNACS编码
└── Cargo.toml
```
---
## 🔍 核心功能详解
### 1. 命令定义 (cli.rs - 419行)
#### 1.1 主命令
```rust
pub struct Cli {
#[command(subcommand)]
pub command: Commands,
/// 输出格式 (json, yaml, table)
#[arg(long, short = 'o', default_value = "table", global = true)]
pub output: String,
/// 详细输出
#[arg(long, short = 'v', global = true)]
pub verbose: bool,
/// RPC节点地址
#[arg(long, global = true)]
pub rpc_url: Option<String>,
}
```
**全局参数**:
- `--output, -o`: 输出格式json/yaml/table
- `--verbose, -v`: 详细输出
- `--rpc-url`: RPC节点地址
---
#### 1.2 子命令列表
| 命令 | 说明 | 实现状态 |
|------|------|---------|
| account | 账户管理 | ⚠️ 部分实现 |
| transaction | 交易管理 | ⚠️ 部分实现 |
| contract | 合约管理 | ⚠️ 部分实现 |
| constitution | 宪法查询 | ⚠️ 部分实现 |
| node | 节点管理 | ⚠️ 部分实现 |
| block | 区块查询 | ⚠️ 部分实现 |
| config | 配置管理 | ✅ 已实现 |
| utils | 工具功能 | ⚠️ 部分实现 |
| new | 创建新项目 | ⚠️ 框架实现 |
| init | 初始化项目 | ⚠️ 框架实现 |
| build | 编译项目 | ❌ 仅占位 |
| check | 宪法检查 | ❌ 仅占位 |
| test | 运行测试 | ❌ 仅占位 |
| sandbox | 宪法沙箱 | ⚠️ 框架实现 |
| tool | 工具链管理 | ⚠️ 框架实现 |
| lsp | LSP服务器 | ⚠️ 框架实现 |
| completions | Shell补全 | ❌ 仅占位 |
| docs | 打开文档 | ❌ 仅占位 |
| show-version | 显示版本 | ✅ 已实现 |
---
### 2. 账户管理 (account.rs)
#### 2.1 账户命令
```rust
pub enum AccountCommands {
/// 创建新账户
Create { password: Option<String> },
/// 列出所有账户
List,
/// 查看账户详情
Show { address: String },
/// 导入账户
Import { private_key: String, password: Option<String> },
/// 导出账户私钥
Export { address: String, password: Option<String> },
/// 查询账户余额
Balance { address: String },
}
```
**使用示例**:
```bash
# 创建账户
nac account create --password mypassword
# 列出账户
nac account list
# 查询余额
nac account balance nac1...
# 导入账户
nac account import --private-key 0x... --password mypassword
# 导出私钥
nac account export nac1... --password mypassword
```
---
### 3. 交易管理 (transaction.rs)
#### 3.1 交易命令
```rust
pub enum TransactionCommands {
/// 发送交易
Send {
from: String,
to: String,
amount: String,
gas_limit: Option<u64>,
gas_price: Option<u64>,
},
/// 查看交易详情
Show { tx_hash: String },
/// 列出交易历史
List { address: String, limit: usize },
/// 签名交易
Sign { tx_file: String, private_key: String },
/// 广播已签名交易
Broadcast { signed_tx: String },
}
```
**使用示例**:
```bash
# 发送交易
nac tx send nac1... nac2... 100 --gas-limit 21000
# 查看交易
nac tx show 0x...
# 交易历史
nac tx list nac1... --limit 20
# 签名交易
nac tx sign tx.json --private-key 0x...
# 广播交易
nac tx broadcast 0x...
```
---
### 4. 合约管理 (contract.rs)
#### 4.1 合约命令
```rust
pub enum ContractCommands {
/// 部署合约
Deploy {
wasm_file: String,
from: String,
init_args: Option<String>,
},
/// 调用合约方法
Call {
address: String,
method: String,
args: Option<String>,
from: String,
},
/// 查询合约状态
Query {
address: String,
method: String,
args: Option<String>,
},
/// 查看合约代码
Code { address: String },
}
```
**使用示例**:
```bash
# 部署合约
nac contract deploy contract.wasm --from nac1... --init-args '{"name":"MyToken"}'
# 调用合约
nac contract call nac1... transfer --args '["nac2...", 100]' --from nac1...
# 查询合约
nac contract query nac1... balanceOf --args '["nac2..."]'
# 查看代码
nac contract code nac1...
```
---
### 5. 宪法查询 (constitution.rs)
#### 5.1 宪法命令
```rust
pub enum ConstitutionCommands {
/// 列出所有宪法条款
List,
/// 查看条款详情
Show { clause_id: String },
/// 验证条款状态
Verify { clause_id: String },
/// 查看条款参数
Params { clause_id: String },
}
```
**使用示例**:
```bash
# 列出条款
nac constitution list
# 查看条款
nac constitution show XTZH_GOLD_COVERAGE
# 验证条款
nac constitution verify XTZH_GOLD_COVERAGE
# 查看参数
nac constitution params XTZH_GOLD_COVERAGE
```
---
### 6. 开发工具箱v2.0 (toolbox/)
#### 6.1 项目创建
```rust
Commands::New { name, r#type } => {
let project_type = match r#type {
ProjectType::Constitution => "constitution",
ProjectType::Contract => "contract",
ProjectType::NodePlugin => "node-plugin",
};
toolbox::templates::create_project(name, project_type)?;
Ok(())
}
```
**使用示例**:
```bash
# 创建合约项目
nac new my-contract --type contract
# 创建宪法项目
nac new my-constitution --type constitution
# 创建节点插件
nac new my-plugin --type node-plugin
```
---
#### 6.2 编译和测试
```rust
Commands::Build { release } => {
println!("🔨 编译项目...");
if *release {
println!(" 模式: Release");
} else {
println!(" 模式: Debug");
}
println!(" ✓ 编译成功");
Ok(())
}
Commands::Test { contract } => {
println!("🧪 运行测试...");
if *contract {
println!(" 类型: 合约测试");
} else {
println!(" 类型: 全部测试");
}
println!(" ✓ 测试通过");
Ok(())
}
```
**问题**: 只是占位实现,没有实际功能
---
#### 6.3 宪法沙箱
```rust
Commands::Sandbox { duration, constitution } => {
toolbox::sandbox::run_sandbox(duration, constitution.clone())?;
Ok(())
}
```
**功能**: 模拟宪法变更影响
**使用示例**:
```bash
nac sandbox --duration 30d --constitution new_constitution.toml
```
---
#### 6.4 工具链管理
```rust
pub enum ToolAction {
/// 安装指定版本工具链
Install { version: String },
/// 切换默认版本
Use { version: String },
/// 列出已安装版本
List,
/// 同步项目锁定版本
Sync,
/// 验证工具箱完整性
Verify,
}
```
**使用示例**:
```bash
# 安装工具链
nac tool install 2.0.0
# 切换版本
nac tool use 2.0.0
# 列出版本
nac tool list
# 同步版本
nac tool sync
# 验证完整性
nac tool verify
```
---
#### 6.5 LSP服务器
```rust
Commands::Lsp { stdio } => {
toolbox::lsp::start_lsp_server(*stdio)?;
Ok(())
}
```
**功能**: 为IDE提供语言服务器协议支持
**使用示例**:
```bash
nac lsp --stdio
```
---
### 7. 工具函数 (utils/)
#### 7.1 密钥生成
```rust
Commands::Utils(UtilsCommands::Keygen) => {
// 生成密钥对
}
```
---
#### 7.2 哈希计算
```rust
Commands::Utils(UtilsCommands::Hash { data }) => {
// 计算哈希
}
```
---
#### 7.3 GNACS编码
```rust
Commands::Utils(UtilsCommands::Encode { data }) => {
// GNACS编码
}
Commands::Utils(UtilsCommands::Decode { gnacs }) => {
// GNACS解码
}
```
---
## 🐛 发现的问题
### 问题1: 大部分命令只有框架
**严重程度**: ⚠️ 极高
**描述**: commands/目录下的大部分文件只有框架,没有实际实现
**影响**: CLI无法使用
**建议**: 实现所有命令
```rust
// commands/account.rs
pub async fn execute(cmd: &AccountCommands, cli: &Cli) -> Result<()> {
let client = NrpcClient::new(cli.rpc_url.as_deref())?;
match cmd {
AccountCommands::Create { password } => {
let (address, private_key) = crypto::generate_keypair();
// 保存到keystore
println!("地址: {}", address);
Ok(())
},
AccountCommands::Balance { address } => {
let balance = client.get_balance(address).await?;
println!("余额: {}", balance);
Ok(())
},
// ...
}
}
```
**状态**: ❌ 待实现
---
### 问题2: RPC客户端未实现
**严重程度**: ⚠️ 极高
**描述**: client/nrpc.rs只有框架没有实际RPC调用
**建议**: 实现NRPC客户端
```rust
// client/nrpc.rs
pub struct NrpcClient {
url: String,
client: reqwest::Client,
}
impl NrpcClient {
pub async fn get_balance(&self, address: &str) -> Result<u64> {
let response: serde_json::Value = self.client
.post(&self.url)
.json(&json!({
"jsonrpc": "2.0",
"method": "nac_getBalance",
"params": [address],
"id": 1
}))
.send()
.await?
.json()
.await?;
Ok(response["result"].as_u64().unwrap_or(0))
}
}
```
**状态**: ❌ 待实现
---
### 问题3: 工具箱功能未实现
**严重程度**: ⚠️ 高
**描述**: toolbox/目录下的功能大部分未实现
**建议**: 实现工具箱功能
```rust
// toolbox/templates.rs
pub fn create_project(name: &str, project_type: &str) -> Result<()> {
let template = match project_type {
"contract" => include_str!("../../templates/contract/Cargo.toml"),
"constitution" => include_str!("../../templates/constitution/Cargo.toml"),
"node-plugin" => include_str!("../../templates/node-plugin/Cargo.toml"),
_ => return Err(anyhow!("未知项目类型")),
};
// 创建项目目录
std::fs::create_dir_all(name)?;
// 写入模板文件
std::fs::write(format!("{}/Cargo.toml", name), template)?;
println!("✓ 项目创建成功: {}", name);
Ok(())
}
```
**状态**: ❌ 待实现
---
### 问题4: 缺少Keystore管理
**严重程度**: ⚠️ 高
**描述**: 没有Keystore管理功能
**建议**: 添加Keystore
```rust
// utils/keystore.rs
pub struct Keystore {
path: PathBuf,
}
impl Keystore {
pub fn save_account(&self, address: &str, private_key: &str, password: &str) -> Result<()> {
// 加密私钥
let encrypted = encrypt_private_key(private_key, password)?;
// 保存到文件
let filename = format!("{}.json", address);
std::fs::write(self.path.join(filename), encrypted)?;
Ok(())
}
pub fn load_account(&self, address: &str, password: &str) -> Result<String> {
// 从文件加载
let filename = format!("{}.json", address);
let encrypted = std::fs::read_to_string(self.path.join(filename))?;
// 解密私钥
decrypt_private_key(&encrypted, password)
}
}
```
**状态**: ❌ 待实现
---
### 问题5: 缺少配置文件支持
**严重程度**: ⚠️ 中等
**描述**: 虽然有config.rs但功能不完整
**建议**: 完善配置管理
```rust
// config.rs
#[derive(Serialize, Deserialize)]
pub struct Config {
pub rpc_url: String,
pub keystore_path: PathBuf,
pub default_account: Option<String>,
pub output_format: String,
}
impl Config {
pub fn load() -> Result<Self> {
let config_path = dirs::config_dir()
.ok_or(anyhow!("无法获取配置目录"))?
.join("nac/config.toml");
if !config_path.exists() {
return Ok(Self::default());
}
let content = std::fs::read_to_string(config_path)?;
Ok(toml::from_str(&content)?)
}
pub fn save(&self) -> Result<()> {
let config_path = dirs::config_dir()
.ok_or(anyhow!("无法获取配置目录"))?
.join("nac/config.toml");
std::fs::create_dir_all(config_path.parent().unwrap())?;
std::fs::write(config_path, toml::to_string(self)?)?;
Ok(())
}
}
```
**状态**: ⚠️ 部分实现
---
### 问题6: 缺少测试
**严重程度**: ⚠️ 中等
**描述**: 只有2个配置测试没有命令测试
**建议**: 添加集成测试
```rust
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn test_account_create() {
let cli = Cli {
command: Commands::Account(AccountCommands::Create {
password: Some("test".to_string()),
}),
output: "json".to_string(),
verbose: false,
rpc_url: None,
};
assert!(execute_command(&cli).await.is_ok());
}
}
```
**状态**: ❌ 待添加
---
### 问题7: 缺少错误处理
**严重程度**: ⚠️ 中等
**描述**: 错误处理不够细致
**建议**: 定义详细的错误类型
```rust
// error.rs
#[derive(thiserror::Error, Debug)]
pub enum CliError {
#[error("RPC错误: {0}")]
RpcError(String),
#[error("账户不存在: {0}")]
AccountNotFound(String),
#[error("密码错误")]
InvalidPassword,
#[error("配置错误: {0}")]
ConfigError(String),
#[error("IO错误: {0}")]
IoError(#[from] std::io::Error),
}
```
**状态**: ⚠️ 部分实现
---
### 问题8: 缺少Shell补全
**严重程度**: ⚠️ 低
**描述**: completions命令只是占位
**建议**: 生成Shell补全脚本
```rust
Commands::Completions { shell } => {
use clap_complete::{generate, shells};
let shell = match shell.as_str() {
"bash" => shells::Bash,
"zsh" => shells::Zsh,
"fish" => shells::Fish,
_ => return Err(anyhow!("不支持的shell: {}", shell)),
};
generate(shell, &mut Cli::command(), "nac", &mut std::io::stdout());
Ok(())
}
```
**状态**: ❌ 待实现
---
## 📊 完成度评估
| 功能模块 | 代码行数 | 完成度 | 状态 |
|---------|---------|--------|------|
| 命令定义 | 419行 | 100% | ✅ 完成 |
| 账户管理 | ~20行 | 10% | ❌ 仅框架 |
| 交易管理 | ~20行 | 10% | ❌ 仅框架 |
| 合约管理 | ~20行 | 10% | ❌ 仅框架 |
| 宪法查询 | ~20行 | 10% | ❌ 仅框架 |
| 节点管理 | ~20行 | 10% | ❌ 仅框架 |
| 区块查询 | ~20行 | 10% | ❌ 仅框架 |
| 配置管理 | ~20行 | 60% | ⚠️ 部分实现 |
| 工具功能 | ~20行 | 20% | ⚠️ 部分实现 |
| RPC客户端 | 80行 | 10% | ❌ 仅框架 |
| 开发工具箱 | 317行 | 20% | ⚠️ 部分实现 |
| 工具函数 | 110行 | 30% | ⚠️ 部分实现 |
| 测试覆盖 | ~20行 | 10% | ❌ 不足 |
| **总计** | **1,570行** | **30%** | **🚧 进行中** |
### 待完善功能
1. **高优先级**:
- ❌ 实现所有命令
- ❌ 实现RPC客户端
- ❌ 实现Keystore管理
- ❌ 完善配置管理
2. **中优先级**:
- ❌ 实现工具箱功能
- ❌ 添加集成测试
- ⏳ 完善错误处理
3. **低优先级**:
- ⏳ 实现Shell补全
- ⏳ 添加文档
- ⏳ 优化用户体验
---
## 🌟 设计亮点
1. **完整的命令结构**
- 8个主命令
- 40+个子命令
- 清晰的层次结构
2. **开发工具箱v2.0**
- 项目创建
- 宪法沙箱
- LSP服务器
- 工具链管理
3. **灵活的输出格式**
- JSON
- YAML
- Table
4. **全局参数**
- RPC地址
- 输出格式
- 详细模式
---
## 🔗 模块依赖关系
```
nac-cli
├── 依赖
│ ├── clap (CLI框架)
│ ├── tokio (异步运行时)
│ ├── reqwest (HTTP客户端)
│ ├── secp256k1 (密码学)
│ └── serde (序列化)
├── 应该依赖(未实现)
│ ├── nac-sdk (区块链SDK)
│ ├── nac-wallet-core (钱包核心)
│ └── nac-nrpc (RPC协议)
└── 被依赖
└── 开发者使用
```
---
## 📝 开发建议
### 短期目标 (1周)
1. **实现RPC客户端** (优先级P1)
- NRPC协议实现
- 所有RPC方法
- 错误处理
2. **实现账户管理** (优先级P1)
- Keystore管理
- 账户创建/导入/导出
- 余额查询
3. **实现交易管理** (优先级P1)
- 交易发送
- 交易签名
- 交易查询
### 中期目标 (2周)
4. **实现合约管理** (优先级P2)
- 合约部署
- 合约调用
- 合约查询
5. **实现工具箱功能** (优先级P2)
- 项目模板
- 编译功能
- 测试功能
6. **添加集成测试** (优先级P2)
- 命令测试
- RPC测试
- E2E测试
### 长期目标 (1个月)
7. **实现宪法功能** (优先级P3)
- 宪法查询
- 宪法沙箱
- 宪法验证
8. **实现LSP服务器** (优先级P3)
- 语法高亮
- 自动补全
- 错误检查
9. **优化用户体验** (优先级P4)
- Shell补全
- 进度条
- 友好的错误信息
---
## 💡 使用示例
### 基础操作
```bash
# 初始化配置
nac config init
# 创建账户
nac account create --password mypassword
# 查询余额
nac account balance nac1...
# 发送交易
nac tx send nac1... nac2... 100
# 查看交易
nac tx show 0x...
```
### 合约操作
```bash
# 部署合约
nac contract deploy contract.wasm --from nac1...
# 调用合约
nac contract call nac1... transfer --args '["nac2...", 100]' --from nac1...
# 查询合约
nac contract query nac1... balanceOf --args '["nac2..."]'
```
### 开发工具箱
```bash
# 创建项目
nac new my-contract --type contract
# 编译项目
nac build --release
# 运行测试
nac test
# 宪法沙箱
nac sandbox --duration 30d --constitution new.toml
# 工具链管理
nac tool install 2.0.0
nac tool use 2.0.0
```
---
**分析完成时间**: 2026-02-18
**下一步**: 实现RPC客户端和核心命令功能