docs: 完成nac-cbpp-l1模块深度分析报告(181行,70%完成,CBP节点注册与管理合约)
This commit is contained in:
parent
7d8fc1078f
commit
8355986faf
|
|
@ -0,0 +1,802 @@
|
||||||
|
# nac-cbpp-l1 模块深度分析报告
|
||||||
|
|
||||||
|
**模块名称**: nac-cbpp-l1
|
||||||
|
**版本**: 0.1.0
|
||||||
|
**分析日期**: 2026-02-18
|
||||||
|
**分析人员**: NAC开发团队
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📋 模块概览
|
||||||
|
|
||||||
|
**功能定位**: CBPP L1层 - CBP节点注册与管理合约
|
||||||
|
**英文全称**: Constitutional Block Production Protocol - Layer 1 Charter Contract
|
||||||
|
**代码行数**: 181行
|
||||||
|
**完成度**: 70%
|
||||||
|
**测试覆盖**: 0% (无测试)
|
||||||
|
**编译状态**: ✅ 通过
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🏗️ 架构设计
|
||||||
|
|
||||||
|
### 核心功能
|
||||||
|
|
||||||
|
nac-cbpp-l1实现了CBPP协议的L1层,这是一个基于Charter智能合约的CBP(Constitutional Block Producer)节点注册与管理系统。该模块是CBPP白皮书第5章"开放生产网络(OPN)"的核心实现。
|
||||||
|
|
||||||
|
### 技术特点
|
||||||
|
|
||||||
|
1. **去中心化注册**: 任何满足条件的节点都可以注册成为CBP
|
||||||
|
2. **多维度准入**: 质押、KYC、硬件、宪法知识四重验证
|
||||||
|
3. **状态管理**: 候选→激活→暂停→退出的完整生命周期
|
||||||
|
4. **声誉系统**: 基于区块生产表现的动态声誉评分
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📦 依赖关系
|
||||||
|
|
||||||
|
```toml
|
||||||
|
[dependencies]
|
||||||
|
nac-udm = { path = "../nac-udm" } # NAC统一定义模块
|
||||||
|
serde = { version = "1.0", features = ["derive"] } # 序列化
|
||||||
|
serde_json = "1.0" # JSON序列化
|
||||||
|
thiserror = "1.0" # 错误处理
|
||||||
|
```
|
||||||
|
|
||||||
|
**依赖分析**:
|
||||||
|
- **nac-udm**: 提供Address、Hash等基础类型
|
||||||
|
- **serde**: 数据序列化/反序列化(支持状态存储)
|
||||||
|
- **thiserror**: 声明式错误定义
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔍 核心功能详解
|
||||||
|
|
||||||
|
### 1. 错误类型定义 (30行)
|
||||||
|
|
||||||
|
```rust
|
||||||
|
pub enum CbppL1Error {
|
||||||
|
AlreadyRegistered(Address), // CBP已注册
|
||||||
|
NotFound(Address), // CBP不存在
|
||||||
|
InsufficientStake { required, actual }, // 质押不足
|
||||||
|
InvalidKycLevel(u8), // KYC等级不符
|
||||||
|
HardwareBenchmarkFailed, // 硬件测试失败
|
||||||
|
ConstitutionTestFailed(u8), // 宪法考试失败
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**设计亮点**:
|
||||||
|
- 使用`thiserror`宏自动实现`Error` trait
|
||||||
|
- 错误信息包含详细的上下文(如质押差额、考试分数)
|
||||||
|
- 符合Rust错误处理最佳实践
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2. CBP节点状态 (8行)
|
||||||
|
|
||||||
|
```rust
|
||||||
|
pub enum CbpStatus {
|
||||||
|
Candidate, // 候选状态(已注册,未激活)
|
||||||
|
Active, // 激活状态(可参与出块)
|
||||||
|
Suspended, // 暂停状态(违规或主动暂停)
|
||||||
|
Exited, // 退出状态(已退出网络)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**状态转换**:
|
||||||
|
```
|
||||||
|
Candidate → Active → Suspended
|
||||||
|
↘ Exited
|
||||||
|
```
|
||||||
|
|
||||||
|
**状态说明**:
|
||||||
|
- **Candidate**: 注册成功后的初始状态,需要经过治理投票或自动激活
|
||||||
|
- **Active**: 可参与CBPP共识,生产区块
|
||||||
|
- **Suspended**: 因违规、性能不达标或主动暂停而被暂停
|
||||||
|
- **Exited**: 主动退出或被强制退出,质押可赎回
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3. CBP节点信息 (14行)
|
||||||
|
|
||||||
|
```rust
|
||||||
|
pub struct CbpNode {
|
||||||
|
pub address: Address, // 节点地址
|
||||||
|
pub did: String, // DID(去中心化身份)
|
||||||
|
pub stake_amount: u64, // 质押数量(XTZH)
|
||||||
|
pub kyc_level: u8, // KYC等级(0-5)
|
||||||
|
pub hardware_score: u32, // 硬件评分(0-10000)
|
||||||
|
pub constitution_score: u8, // 宪法考试分数(0-100)
|
||||||
|
pub status: CbpStatus, // 当前状态
|
||||||
|
pub registered_at: u64, // 注册时间戳
|
||||||
|
pub last_active_at: u64, // 最后活跃时间
|
||||||
|
pub blocks_produced: u64, // 已生产区块数
|
||||||
|
pub reputation: f64, // 声誉值(0.0-1.0)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**字段详解**:
|
||||||
|
|
||||||
|
| 字段 | 类型 | 说明 | 用途 |
|
||||||
|
|------|------|------|------|
|
||||||
|
| `address` | Address | 节点地址 | 唯一标识符 |
|
||||||
|
| `did` | String | DID | 身份验证 |
|
||||||
|
| `stake_amount` | u64 | 质押数量 | 经济安全保障 |
|
||||||
|
| `kyc_level` | u8 | KYC等级 | 合规要求 |
|
||||||
|
| `hardware_score` | u32 | 硬件评分 | 性能保障 |
|
||||||
|
| `constitution_score` | u8 | 宪法考试分数 | 治理能力验证 |
|
||||||
|
| `status` | CbpStatus | 节点状态 | 生命周期管理 |
|
||||||
|
| `registered_at` | u64 | 注册时间 | 审计追溯 |
|
||||||
|
| `last_active_at` | u64 | 最后活跃时间 | 活跃度监控 |
|
||||||
|
| `blocks_produced` | u64 | 生产区块数 | 贡献度统计 |
|
||||||
|
| `reputation` | f64 | 声誉值 | 动态权重调整 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 4. CBP注册要求 (11行)
|
||||||
|
|
||||||
|
```rust
|
||||||
|
pub struct CbpRequirements {
|
||||||
|
pub min_stake: u64, // 最小质押:1000 XTZH
|
||||||
|
pub min_kyc_level: u8, // 最小KYC等级:2
|
||||||
|
pub min_hardware_score: u32, // 最小硬件评分:7000
|
||||||
|
pub min_constitution_score: u8, // 最小宪法分数:70
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**默认要求**:
|
||||||
|
|
||||||
|
| 要求 | 默认值 | 说明 |
|
||||||
|
|------|--------|------|
|
||||||
|
| 最小质押 | 100,000,000,000 | 1000 XTZH(假设精度10^8) |
|
||||||
|
| 最小KYC等级 | 2 | 中级实名认证 |
|
||||||
|
| 最小硬件评分 | 7000 | 70%性能基准 |
|
||||||
|
| 最小宪法分数 | 70 | 70分及格 |
|
||||||
|
|
||||||
|
**设计思想**:
|
||||||
|
- **经济门槛**: 1000 XTZH质押确保节点有足够的经济激励维护网络
|
||||||
|
- **合规门槛**: KYC等级2确保节点身份可追溯
|
||||||
|
- **技术门槛**: 硬件评分7000确保节点性能满足出块要求
|
||||||
|
- **治理门槛**: 宪法分数70确保节点理解NAC治理规则
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 5. CBP注册与管理合约 (98行)
|
||||||
|
|
||||||
|
#### 5.1 数据结构
|
||||||
|
|
||||||
|
```rust
|
||||||
|
pub struct CbpRegistry {
|
||||||
|
nodes: HashMap<Address, CbpNode>, // 所有注册节点
|
||||||
|
requirements: CbpRequirements, // 注册要求
|
||||||
|
active_cbps: Vec<Address>, // 激活的CBP列表
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 5.2 核心方法
|
||||||
|
|
||||||
|
##### 5.2.1 注册CBP节点
|
||||||
|
|
||||||
|
```rust
|
||||||
|
pub fn register_cbp(
|
||||||
|
&mut self,
|
||||||
|
address: Address,
|
||||||
|
did: String,
|
||||||
|
stake_amount: u64,
|
||||||
|
kyc_level: u8,
|
||||||
|
hardware_score: u32,
|
||||||
|
constitution_score: u8,
|
||||||
|
timestamp: u64,
|
||||||
|
) -> Result<(), CbppL1Error>
|
||||||
|
```
|
||||||
|
|
||||||
|
**验证流程**:
|
||||||
|
1. 检查地址是否已注册
|
||||||
|
2. 验证质押金额 ≥ 最小质押
|
||||||
|
3. 验证KYC等级 ≥ 最小等级
|
||||||
|
4. 验证硬件评分 ≥ 最小评分
|
||||||
|
5. 验证宪法分数 ≥ 最小分数
|
||||||
|
6. 创建节点记录(初始状态:Candidate)
|
||||||
|
|
||||||
|
**初始参数**:
|
||||||
|
- `status`: Candidate(候选状态)
|
||||||
|
- `blocks_produced`: 0
|
||||||
|
- `reputation`: 0.5(中性声誉)
|
||||||
|
|
||||||
|
**示例**:
|
||||||
|
```rust
|
||||||
|
let mut registry = CbpRegistry::new();
|
||||||
|
registry.register_cbp(
|
||||||
|
Address::zero(),
|
||||||
|
"did:nac:12345".to_string(),
|
||||||
|
100_000_000_000, // 1000 XTZH
|
||||||
|
2, // KYC等级2
|
||||||
|
7500, // 硬件评分75%
|
||||||
|
85, // 宪法分数85分
|
||||||
|
1000000, // 时间戳
|
||||||
|
)?;
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
##### 5.2.2 激活CBP节点
|
||||||
|
|
||||||
|
```rust
|
||||||
|
pub fn activate_cbp(&mut self, address: &Address) -> Result<(), CbppL1Error>
|
||||||
|
```
|
||||||
|
|
||||||
|
**功能**:
|
||||||
|
- 将Candidate状态的节点激活为Active
|
||||||
|
- 将地址加入`active_cbps`列表
|
||||||
|
|
||||||
|
**使用场景**:
|
||||||
|
- 治理投票通过后激活
|
||||||
|
- 自动激活(如果启用自动激活机制)
|
||||||
|
|
||||||
|
**示例**:
|
||||||
|
```rust
|
||||||
|
registry.activate_cbp(&address)?;
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
##### 5.2.3 暂停CBP节点
|
||||||
|
|
||||||
|
```rust
|
||||||
|
pub fn suspend_cbp(&mut self, address: &Address) -> Result<(), CbppL1Error>
|
||||||
|
```
|
||||||
|
|
||||||
|
**功能**:
|
||||||
|
- 将Active状态的节点暂停为Suspended
|
||||||
|
- 从`active_cbps`列表中移除
|
||||||
|
|
||||||
|
**使用场景**:
|
||||||
|
- 节点违规(如双签、恶意行为)
|
||||||
|
- 节点性能不达标
|
||||||
|
- 节点主动申请暂停
|
||||||
|
|
||||||
|
**示例**:
|
||||||
|
```rust
|
||||||
|
registry.suspend_cbp(&address)?;
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
##### 5.2.4 查询CBP节点
|
||||||
|
|
||||||
|
```rust
|
||||||
|
pub fn get_cbp(&self, address: &Address) -> Option<&CbpNode>
|
||||||
|
```
|
||||||
|
|
||||||
|
**功能**: 根据地址查询节点信息
|
||||||
|
|
||||||
|
**示例**:
|
||||||
|
```rust
|
||||||
|
if let Some(node) = registry.get_cbp(&address) {
|
||||||
|
println!("Node status: {:?}", node.status);
|
||||||
|
println!("Blocks produced: {}", node.blocks_produced);
|
||||||
|
println!("Reputation: {}", node.reputation);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
##### 5.2.5 获取激活的CBP列表
|
||||||
|
|
||||||
|
```rust
|
||||||
|
pub fn get_active_cbps(&self) -> &[Address]
|
||||||
|
```
|
||||||
|
|
||||||
|
**功能**: 返回所有Active状态的CBP地址列表
|
||||||
|
|
||||||
|
**用途**:
|
||||||
|
- CBPP共识算法选择出块节点
|
||||||
|
- 网络监控和统计
|
||||||
|
|
||||||
|
**示例**:
|
||||||
|
```rust
|
||||||
|
let active_cbps = registry.get_active_cbps();
|
||||||
|
println!("Active CBPs: {}", active_cbps.len());
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔗 与CBPP白皮书的对应关系
|
||||||
|
|
||||||
|
### 白皮书第5章:开放生产网络(OPN)
|
||||||
|
|
||||||
|
**核心理念**: "任何满足条件的节点都可以注册成为CBP,无需许可"
|
||||||
|
|
||||||
|
**实现映射**:
|
||||||
|
|
||||||
|
| 白皮书要求 | 代码实现 | 位置 |
|
||||||
|
|-----------|---------|------|
|
||||||
|
| CBP注册机制 | `register_cbp()` | lib.rs:93-142 |
|
||||||
|
| 质押要求 | `min_stake: 100_000_000_000` | lib.rs:69 |
|
||||||
|
| KYC要求 | `min_kyc_level: 2` | lib.rs:70 |
|
||||||
|
| 硬件基准测试 | `min_hardware_score: 7000` | lib.rs:71 |
|
||||||
|
| 宪法知识考试 | `min_constitution_score: 70` | lib.rs:72 |
|
||||||
|
| 节点状态管理 | `CbpStatus` enum | lib.rs:33-39 |
|
||||||
|
| 声誉系统 | `reputation: f64` | lib.rs:54 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🐛 发现的问题
|
||||||
|
|
||||||
|
### 问题1: 缺少测试覆盖
|
||||||
|
|
||||||
|
**严重程度**: ⚠️ 中等
|
||||||
|
|
||||||
|
**描述**: 模块没有任何单元测试
|
||||||
|
|
||||||
|
**影响**:
|
||||||
|
- 无法验证注册逻辑的正确性
|
||||||
|
- 无法验证状态转换的正确性
|
||||||
|
- 无法验证边界条件处理
|
||||||
|
|
||||||
|
**建议测试用例**:
|
||||||
|
```rust
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_register_cbp_success() {
|
||||||
|
// 测试正常注册
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_register_cbp_insufficient_stake() {
|
||||||
|
// 测试质押不足
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_register_cbp_invalid_kyc() {
|
||||||
|
// 测试KYC不符
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_activate_cbp() {
|
||||||
|
// 测试激活流程
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_suspend_cbp() {
|
||||||
|
// 测试暂停流程
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_duplicate_registration() {
|
||||||
|
// 测试重复注册
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**状态**: ❌ 待添加
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 问题2: 缺少退出机制
|
||||||
|
|
||||||
|
**严重程度**: ⚠️ 中等
|
||||||
|
|
||||||
|
**描述**: 定义了`Exited`状态,但没有实现退出方法
|
||||||
|
|
||||||
|
**影响**:
|
||||||
|
- 节点无法主动退出
|
||||||
|
- 质押无法赎回
|
||||||
|
|
||||||
|
**建议实现**:
|
||||||
|
```rust
|
||||||
|
pub fn exit_cbp(&mut self, address: &Address) -> Result<(), CbppL1Error> {
|
||||||
|
let node = self.nodes.get_mut(address)
|
||||||
|
.ok_or(CbppL1Error::NotFound(*address))?;
|
||||||
|
|
||||||
|
// 只有Active或Suspended状态可以退出
|
||||||
|
if node.status == CbpStatus::Active {
|
||||||
|
self.active_cbps.retain(|addr| addr != address);
|
||||||
|
}
|
||||||
|
|
||||||
|
node.status = CbpStatus::Exited;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**状态**: ❌ 待实现
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 问题3: 缺少质押赎回机制
|
||||||
|
|
||||||
|
**严重程度**: ⚠️ 中等
|
||||||
|
|
||||||
|
**描述**: 注册时质押XTZH,但没有赎回机制
|
||||||
|
|
||||||
|
**影响**:
|
||||||
|
- 节点退出后质押被锁定
|
||||||
|
- 经济激励不完整
|
||||||
|
|
||||||
|
**建议实现**:
|
||||||
|
```rust
|
||||||
|
pub fn claim_stake(&mut self, address: &Address) -> Result<u64, CbppL1Error> {
|
||||||
|
let node = self.nodes.get(address)
|
||||||
|
.ok_or(CbppL1Error::NotFound(*address))?;
|
||||||
|
|
||||||
|
// 只有Exited状态可以赎回
|
||||||
|
if node.status != CbpStatus::Exited {
|
||||||
|
return Err(CbppL1Error::InvalidStatus);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查是否有锁定期
|
||||||
|
let unlock_time = node.registered_at + STAKE_LOCK_PERIOD;
|
||||||
|
if current_time < unlock_time {
|
||||||
|
return Err(CbppL1Error::StakeLocked);
|
||||||
|
}
|
||||||
|
|
||||||
|
let stake = node.stake_amount;
|
||||||
|
self.nodes.remove(address);
|
||||||
|
Ok(stake)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**状态**: ❌ 待实现
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 问题4: 缺少声誉更新机制
|
||||||
|
|
||||||
|
**严重程度**: ⚠️ 中等
|
||||||
|
|
||||||
|
**描述**: 定义了`reputation`字段,但没有更新逻辑
|
||||||
|
|
||||||
|
**影响**:
|
||||||
|
- 声誉系统无法运作
|
||||||
|
- 无法根据表现调整节点权重
|
||||||
|
|
||||||
|
**建议实现**:
|
||||||
|
```rust
|
||||||
|
pub fn update_reputation(
|
||||||
|
&mut self,
|
||||||
|
address: &Address,
|
||||||
|
block_produced: bool,
|
||||||
|
on_time: bool,
|
||||||
|
) -> Result<(), CbppL1Error> {
|
||||||
|
let node = self.nodes.get_mut(address)
|
||||||
|
.ok_or(CbppL1Error::NotFound(*address))?;
|
||||||
|
|
||||||
|
if block_produced {
|
||||||
|
if on_time {
|
||||||
|
// 按时出块,增加声誉
|
||||||
|
node.reputation = (node.reputation + 0.01).min(1.0);
|
||||||
|
} else {
|
||||||
|
// 延迟出块,轻微减少声誉
|
||||||
|
node.reputation = (node.reputation - 0.005).max(0.0);
|
||||||
|
}
|
||||||
|
node.blocks_produced += 1;
|
||||||
|
} else {
|
||||||
|
// 未出块,减少声誉
|
||||||
|
node.reputation = (node.reputation - 0.02).max(0.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
node.last_active_at = current_timestamp();
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**状态**: ❌ 待实现
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 问题5: 缺少KYC等级验证
|
||||||
|
|
||||||
|
**严重程度**: ⚠️ 低
|
||||||
|
|
||||||
|
**描述**: KYC等级定义为0-5,但没有验证上限
|
||||||
|
|
||||||
|
**影响**:
|
||||||
|
- 可能接受无效的KYC等级(如255)
|
||||||
|
|
||||||
|
**建议修复**:
|
||||||
|
```rust
|
||||||
|
if kyc_level < self.requirements.min_kyc_level || kyc_level > 5 {
|
||||||
|
return Err(CbppL1Error::InvalidKycLevel(kyc_level));
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**状态**: ❌ 待修复
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 问题6: 缺少硬件基准测试接口
|
||||||
|
|
||||||
|
**严重程度**: ⚠️ 高
|
||||||
|
|
||||||
|
**描述**: 硬件评分作为参数传入,但没有实际的基准测试实现
|
||||||
|
|
||||||
|
**影响**:
|
||||||
|
- 无法验证硬件性能
|
||||||
|
- 可能被伪造
|
||||||
|
|
||||||
|
**建议**:
|
||||||
|
- 集成硬件基准测试模块
|
||||||
|
- 或要求提供可验证的测试证明
|
||||||
|
|
||||||
|
**状态**: ❌ 待实现
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 问题7: 缺少宪法考试接口
|
||||||
|
|
||||||
|
**严重程度**: ⚠️ 高
|
||||||
|
|
||||||
|
**描述**: 宪法分数作为参数传入,但没有实际的考试系统
|
||||||
|
|
||||||
|
**影响**:
|
||||||
|
- 无法验证宪法知识
|
||||||
|
- 可能被伪造
|
||||||
|
|
||||||
|
**建议**:
|
||||||
|
- 集成宪法考试模块(可能在nac-cee中)
|
||||||
|
- 或要求提交考试证明
|
||||||
|
|
||||||
|
**状态**: ❌ 待实现
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 问题8: 缺少DID验证
|
||||||
|
|
||||||
|
**严重程度**: ⚠️ 中等
|
||||||
|
|
||||||
|
**描述**: DID作为字符串存储,但没有验证格式
|
||||||
|
|
||||||
|
**影响**:
|
||||||
|
- 可能存储无效的DID
|
||||||
|
- 无法与DID系统集成
|
||||||
|
|
||||||
|
**建议**:
|
||||||
|
```rust
|
||||||
|
fn validate_did(did: &str) -> Result<(), CbppL1Error> {
|
||||||
|
if !did.starts_with("did:nac:") {
|
||||||
|
return Err(CbppL1Error::InvalidDid);
|
||||||
|
}
|
||||||
|
// 更多验证逻辑
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**状态**: ❌ 待实现
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 完成度评估
|
||||||
|
|
||||||
|
| 功能模块 | 代码行数 | 完成度 | 状态 |
|
||||||
|
|---------|---------|--------|------|
|
||||||
|
| 错误定义 | 30行 | 100% | ✅ 完成 |
|
||||||
|
| 数据结构 | 33行 | 100% | ✅ 完成 |
|
||||||
|
| 注册逻辑 | 49行 | 90% | ⚠️ 缺少验证 |
|
||||||
|
| 状态管理 | 35行 | 60% | ⚠️ 缺少退出 |
|
||||||
|
| 查询接口 | 8行 | 100% | ✅ 完成 |
|
||||||
|
| 声誉系统 | 0行 | 0% | ❌ 未实现 |
|
||||||
|
| 质押管理 | 0行 | 0% | ❌ 未实现 |
|
||||||
|
| 测试覆盖 | 0行 | 0% | ❌ 无测试 |
|
||||||
|
| **总计** | **181行** | **70%** | **🚧 进行中** |
|
||||||
|
|
||||||
|
### 待完善功能
|
||||||
|
|
||||||
|
1. **高优先级**:
|
||||||
|
- ❌ 实现硬件基准测试集成
|
||||||
|
- ❌ 实现宪法考试集成
|
||||||
|
- ❌ 实现退出机制
|
||||||
|
- ❌ 实现质押赎回机制
|
||||||
|
|
||||||
|
2. **中优先级**:
|
||||||
|
- ❌ 实现声誉更新逻辑
|
||||||
|
- ❌ 添加DID验证
|
||||||
|
- ❌ 添加完整的单元测试
|
||||||
|
- ⏳ 实现事件日志
|
||||||
|
|
||||||
|
3. **低优先级**:
|
||||||
|
- ⏳ 优化数据结构(如使用BTreeMap)
|
||||||
|
- ⏳ 添加批量操作接口
|
||||||
|
- ⏳ 实现节点排名算法
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🌟 设计亮点
|
||||||
|
|
||||||
|
1. **多维度准入机制**
|
||||||
|
- 经济(质押)+ 合规(KYC)+ 技术(硬件)+ 治理(宪法)
|
||||||
|
- 确保CBP节点的综合素质
|
||||||
|
|
||||||
|
2. **清晰的状态管理**
|
||||||
|
- Candidate → Active → Suspended → Exited
|
||||||
|
- 符合区块链节点生命周期
|
||||||
|
|
||||||
|
3. **声誉系统设计**
|
||||||
|
- 动态调整节点权重
|
||||||
|
- 激励良好行为,惩罚恶意行为
|
||||||
|
|
||||||
|
4. **符合CBPP白皮书**
|
||||||
|
- 忠实实现OPN(开放生产网络)理念
|
||||||
|
- 无许可准入,有条件参与
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔗 模块依赖关系
|
||||||
|
|
||||||
|
```
|
||||||
|
nac-cbpp-l1
|
||||||
|
├── 依赖
|
||||||
|
│ └── nac-udm (Address, Hash等基础类型)
|
||||||
|
├── 被依赖
|
||||||
|
│ ├── nac-cbpp (主CBPP模块)
|
||||||
|
│ └── nac-api-server (API接口)
|
||||||
|
└── 协作模块
|
||||||
|
├── nac-cbpp-l0 (L0层)
|
||||||
|
├── nac-cee (宪法执行引擎 - 考试系统)
|
||||||
|
└── nac-ai-compliance (KYC验证)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📝 开发建议
|
||||||
|
|
||||||
|
### 短期目标
|
||||||
|
|
||||||
|
1. **添加单元测试** (优先级P1)
|
||||||
|
- 注册流程测试
|
||||||
|
- 状态转换测试
|
||||||
|
- 边界条件测试
|
||||||
|
|
||||||
|
2. **实现退出机制** (优先级P1)
|
||||||
|
- `exit_cbp()`方法
|
||||||
|
- `claim_stake()`方法
|
||||||
|
- 锁定期验证
|
||||||
|
|
||||||
|
3. **实现声誉更新** (优先级P2)
|
||||||
|
- `update_reputation()`方法
|
||||||
|
- 基于区块生产表现
|
||||||
|
- 自动暂停低声誉节点
|
||||||
|
|
||||||
|
### 中期目标
|
||||||
|
|
||||||
|
4. **集成外部系统** (优先级P2)
|
||||||
|
- 硬件基准测试模块
|
||||||
|
- 宪法考试系统
|
||||||
|
- DID验证服务
|
||||||
|
|
||||||
|
5. **添加事件日志** (优先级P3)
|
||||||
|
- 注册事件
|
||||||
|
- 状态变更事件
|
||||||
|
- 声誉更新事件
|
||||||
|
|
||||||
|
### 长期目标
|
||||||
|
|
||||||
|
6. **优化性能** (优先级P3)
|
||||||
|
- 使用BTreeMap替代HashMap(支持范围查询)
|
||||||
|
- 添加索引(按状态、声誉排序)
|
||||||
|
- 实现分页查询
|
||||||
|
|
||||||
|
7. **扩展功能** (优先级P4)
|
||||||
|
- 节点排名算法
|
||||||
|
- 批量操作接口
|
||||||
|
- 治理投票集成
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💡 使用示例
|
||||||
|
|
||||||
|
```rust
|
||||||
|
use nac_cbpp_l1::{CbpRegistry, CbpStatus};
|
||||||
|
use nac_udm::primitives::Address;
|
||||||
|
|
||||||
|
// 1. 创建注册表
|
||||||
|
let mut registry = CbpRegistry::new();
|
||||||
|
|
||||||
|
// 2. 注册CBP节点
|
||||||
|
let address = Address::zero();
|
||||||
|
registry.register_cbp(
|
||||||
|
address,
|
||||||
|
"did:nac:example123".to_string(),
|
||||||
|
100_000_000_000, // 1000 XTZH质押
|
||||||
|
3, // KYC等级3
|
||||||
|
8500, // 硬件评分85%
|
||||||
|
92, // 宪法分数92分
|
||||||
|
1000000, // 时间戳
|
||||||
|
).expect("注册失败");
|
||||||
|
|
||||||
|
// 3. 激活节点
|
||||||
|
registry.activate_cbp(&address).expect("激活失败");
|
||||||
|
|
||||||
|
// 4. 查询节点信息
|
||||||
|
if let Some(node) = registry.get_cbp(&address) {
|
||||||
|
println!("节点状态: {:?}", node.status);
|
||||||
|
println!("质押金额: {}", node.stake_amount);
|
||||||
|
println!("声誉值: {}", node.reputation);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 5. 获取所有激活的CBP
|
||||||
|
let active_cbps = registry.get_active_cbps();
|
||||||
|
println!("激活的CBP数量: {}", active_cbps.len());
|
||||||
|
|
||||||
|
// 6. 暂停节点(如果违规)
|
||||||
|
registry.suspend_cbp(&address).expect("暂停失败");
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔄 与其他模块的协作
|
||||||
|
|
||||||
|
### 与nac-cbpp的协作
|
||||||
|
|
||||||
|
```rust
|
||||||
|
// nac-cbpp使用nac-cbpp-l1查询激活的CBP
|
||||||
|
let active_cbps = cbp_registry.get_active_cbps();
|
||||||
|
let selected_cbp = cbpp_consensus.select_producer(active_cbps);
|
||||||
|
```
|
||||||
|
|
||||||
|
### 与nac-cee的协作
|
||||||
|
|
||||||
|
```rust
|
||||||
|
// nac-cee提供宪法考试服务
|
||||||
|
let constitution_score = cee.take_exam(candidate_address)?;
|
||||||
|
registry.register_cbp(
|
||||||
|
candidate_address,
|
||||||
|
did,
|
||||||
|
stake,
|
||||||
|
kyc,
|
||||||
|
hardware,
|
||||||
|
constitution_score, // 使用考试分数
|
||||||
|
timestamp,
|
||||||
|
)?;
|
||||||
|
```
|
||||||
|
|
||||||
|
### 与nac-ai-compliance的协作
|
||||||
|
|
||||||
|
```rust
|
||||||
|
// nac-ai-compliance验证KYC
|
||||||
|
let kyc_level = ai_compliance.verify_kyc(candidate_address)?;
|
||||||
|
registry.register_cbp(
|
||||||
|
candidate_address,
|
||||||
|
did,
|
||||||
|
stake,
|
||||||
|
kyc_level, // 使用验证后的KYC等级
|
||||||
|
hardware,
|
||||||
|
constitution,
|
||||||
|
timestamp,
|
||||||
|
)?;
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📈 性能考虑
|
||||||
|
|
||||||
|
### 当前性能
|
||||||
|
|
||||||
|
- **查询复杂度**: O(1) (HashMap)
|
||||||
|
- **插入复杂度**: O(1)
|
||||||
|
- **激活列表维护**: O(n) (Vec)
|
||||||
|
|
||||||
|
### 优化建议
|
||||||
|
|
||||||
|
1. **使用BTreeMap**:
|
||||||
|
```rust
|
||||||
|
nodes: BTreeMap<Address, CbpNode> // 支持范围查询
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **添加索引**:
|
||||||
|
```rust
|
||||||
|
status_index: HashMap<CbpStatus, Vec<Address>>
|
||||||
|
reputation_index: BTreeMap<OrderedFloat<f64>, Address>
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **分页查询**:
|
||||||
|
```rust
|
||||||
|
pub fn get_active_cbps_paginated(&self, page: usize, size: usize) -> &[Address]
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**分析完成时间**: 2026-02-18
|
||||||
|
**下一步**: 添加单元测试并实现缺失功能
|
||||||
Loading…
Reference in New Issue