docs: 完成nac-cli模块深度分析报告(1570行,30%完成,NAC开发工具箱v2.0)
This commit is contained in:
parent
9d31b51627
commit
5338c2b785
|
|
@ -0,0 +1,979 @@
|
||||||
|
# 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客户端和核心命令功能
|
||||||
Loading…
Reference in New Issue