docs: 完成nac-constitution-state模块深度分析报告(40行,30%完成,宪法版本管理状态机)
This commit is contained in:
parent
aac13b7818
commit
3325e087af
|
|
@ -0,0 +1,815 @@
|
||||||
|
# nac-constitution-state 模块深度分析报告
|
||||||
|
|
||||||
|
**模块名称**: nac-constitution-state
|
||||||
|
**版本**: 0.1.0
|
||||||
|
**分析日期**: 2026-02-18
|
||||||
|
**分析人员**: NAC开发团队
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📋 模块概览
|
||||||
|
|
||||||
|
**功能定位**: NAC宪法状态机 - 管理宪法版本和升级
|
||||||
|
**英文全称**: NAC Constitution State Machine
|
||||||
|
**代码行数**: 40行
|
||||||
|
**完成度**: 30%
|
||||||
|
**测试覆盖**: 0% (无测试)
|
||||||
|
**编译状态**: ✅ 通过
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🏗️ 架构设计
|
||||||
|
|
||||||
|
### 核心功能
|
||||||
|
|
||||||
|
nac-constitution-state实现了NAC公链的宪法版本管理系统,负责:
|
||||||
|
|
||||||
|
1. **版本追踪**: 记录宪法的所有历史版本
|
||||||
|
2. **版本升级**: 管理宪法升级流程
|
||||||
|
3. **版本查询**: 提供当前版本和历史版本查询
|
||||||
|
|
||||||
|
### 技术特点
|
||||||
|
|
||||||
|
1. **不可变历史**: 所有历史版本永久保存
|
||||||
|
2. **哈希验证**: 每个版本都有唯一的宪法哈希
|
||||||
|
3. **时间戳**: 记录每个版本的生效时间
|
||||||
|
4. **简单状态机**: 单向升级(不支持回滚)
|
||||||
|
|
||||||
|
### 目录结构
|
||||||
|
|
||||||
|
```
|
||||||
|
nac-constitution-state/
|
||||||
|
├── Cargo.toml
|
||||||
|
└── src/
|
||||||
|
└── lib.rs (40行) - 完整实现
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📦 依赖关系
|
||||||
|
|
||||||
|
```toml
|
||||||
|
[dependencies]
|
||||||
|
nac-udm = { path = "../nac-udm" } # NAC统一定义模块(Hash类型)
|
||||||
|
serde = { version = "1.0", features = ["derive"] } # 序列化
|
||||||
|
```
|
||||||
|
|
||||||
|
**依赖分析**:
|
||||||
|
- **nac-udm**: 提供Hash类型(用于宪法哈希)
|
||||||
|
- **serde**: 支持序列化/反序列化(用于状态持久化)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔍 核心功能详解
|
||||||
|
|
||||||
|
### 1. 宪法版本 (ConstitutionVersion)
|
||||||
|
|
||||||
|
```rust
|
||||||
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||||
|
pub struct ConstitutionVersion {
|
||||||
|
pub version: u64, // 版本号
|
||||||
|
pub constitution_hash: Hash, // 宪法哈希
|
||||||
|
pub effective_from: u64, // 生效时间(Unix时间戳)
|
||||||
|
pub clause_count: u64, // 条款数量
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**字段说明**:
|
||||||
|
|
||||||
|
| 字段 | 类型 | 说明 | 示例 |
|
||||||
|
|------|------|------|------|
|
||||||
|
| `version` | u64 | 版本号(递增) | 1, 2, 3, ... |
|
||||||
|
| `constitution_hash` | Hash | 宪法文档的SHA3-384哈希 | 0x1234...5678 |
|
||||||
|
| `effective_from` | u64 | 生效时间戳 | 1708300800 |
|
||||||
|
| `clause_count` | u64 | 宪法条款总数 | 256 |
|
||||||
|
|
||||||
|
**设计说明**:
|
||||||
|
- `version`: 单调递增,确保版本唯一性
|
||||||
|
- `constitution_hash`: 用于验证宪法文档的完整性
|
||||||
|
- `effective_from`: 支持延迟生效(如"30天后生效")
|
||||||
|
- `clause_count`: 用于快速验证宪法完整性
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2. 宪法状态机 (ConstitutionStateMachine)
|
||||||
|
|
||||||
|
```rust
|
||||||
|
pub struct ConstitutionStateMachine {
|
||||||
|
current_version: ConstitutionVersion, // 当前版本
|
||||||
|
history: Vec<ConstitutionVersion>, // 历史版本列表
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**数据结构**:
|
||||||
|
- `current_version`: 当前生效的宪法版本
|
||||||
|
- `history`: 所有历史版本(包括当前版本)
|
||||||
|
|
||||||
|
**不变量**:
|
||||||
|
1. `history`非空(至少包含初始版本)
|
||||||
|
2. `current_version`等于`history`的最后一个元素
|
||||||
|
3. `history`中的版本号单调递增
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### 2.1 创建状态机
|
||||||
|
|
||||||
|
```rust
|
||||||
|
pub fn new(initial_version: ConstitutionVersion) -> Self {
|
||||||
|
Self {
|
||||||
|
current_version: initial_version.clone(),
|
||||||
|
history: vec![initial_version],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**功能**: 使用初始版本创建状态机
|
||||||
|
|
||||||
|
**示例**:
|
||||||
|
```rust
|
||||||
|
let initial = ConstitutionVersion {
|
||||||
|
version: 1,
|
||||||
|
constitution_hash: Hash::zero(),
|
||||||
|
effective_from: 1708300800,
|
||||||
|
clause_count: 256,
|
||||||
|
};
|
||||||
|
|
||||||
|
let state_machine = ConstitutionStateMachine::new(initial);
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### 2.2 升级宪法
|
||||||
|
|
||||||
|
```rust
|
||||||
|
pub fn upgrade(&mut self, new_version: ConstitutionVersion) {
|
||||||
|
self.history.push(self.current_version.clone());
|
||||||
|
self.current_version = new_version;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**功能**: 升级到新版本
|
||||||
|
|
||||||
|
**流程**:
|
||||||
|
1. 将当前版本加入历史记录
|
||||||
|
2. 更新当前版本为新版本
|
||||||
|
|
||||||
|
**问题**: 缺少验证逻辑:
|
||||||
|
- 没有检查新版本号是否大于当前版本号
|
||||||
|
- 没有检查生效时间是否合理
|
||||||
|
- 没有检查宪法哈希是否有效
|
||||||
|
|
||||||
|
**示例**:
|
||||||
|
```rust
|
||||||
|
let new_version = ConstitutionVersion {
|
||||||
|
version: 2,
|
||||||
|
constitution_hash: Hash::from_hex("abcd...").unwrap(),
|
||||||
|
effective_from: 1708387200, // 24小时后
|
||||||
|
clause_count: 260,
|
||||||
|
};
|
||||||
|
|
||||||
|
state_machine.upgrade(new_version);
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### 2.3 查询当前版本
|
||||||
|
|
||||||
|
```rust
|
||||||
|
pub fn get_current_version(&self) -> &ConstitutionVersion {
|
||||||
|
&self.current_version
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**功能**: 获取当前生效的宪法版本
|
||||||
|
|
||||||
|
**返回**: 当前版本的引用(零拷贝)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### 2.4 查询历史版本
|
||||||
|
|
||||||
|
```rust
|
||||||
|
pub fn get_history(&self) -> &[ConstitutionVersion] {
|
||||||
|
&self.history
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**功能**: 获取所有历史版本
|
||||||
|
|
||||||
|
**返回**: 历史版本切片(零拷贝)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🐛 发现的问题
|
||||||
|
|
||||||
|
### 问题1: 缺少测试覆盖
|
||||||
|
|
||||||
|
**严重程度**: ⚠️ 高
|
||||||
|
|
||||||
|
**描述**: 模块没有任何单元测试
|
||||||
|
|
||||||
|
**影响**:
|
||||||
|
- 无法验证升级逻辑的正确性
|
||||||
|
- 无法验证历史记录的完整性
|
||||||
|
- 无法验证边界条件
|
||||||
|
|
||||||
|
**建议测试用例**:
|
||||||
|
```rust
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_create_state_machine() {
|
||||||
|
let initial = ConstitutionVersion {
|
||||||
|
version: 1,
|
||||||
|
constitution_hash: Hash::zero(),
|
||||||
|
effective_from: 1000,
|
||||||
|
clause_count: 256,
|
||||||
|
};
|
||||||
|
|
||||||
|
let sm = ConstitutionStateMachine::new(initial.clone());
|
||||||
|
assert_eq!(sm.get_current_version().version, 1);
|
||||||
|
assert_eq!(sm.get_history().len(), 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_upgrade() {
|
||||||
|
let initial = ConstitutionVersion {
|
||||||
|
version: 1,
|
||||||
|
constitution_hash: Hash::zero(),
|
||||||
|
effective_from: 1000,
|
||||||
|
clause_count: 256,
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut sm = ConstitutionStateMachine::new(initial);
|
||||||
|
|
||||||
|
let new_version = ConstitutionVersion {
|
||||||
|
version: 2,
|
||||||
|
constitution_hash: Hash::zero(),
|
||||||
|
effective_from: 2000,
|
||||||
|
clause_count: 260,
|
||||||
|
};
|
||||||
|
|
||||||
|
sm.upgrade(new_version.clone());
|
||||||
|
|
||||||
|
assert_eq!(sm.get_current_version().version, 2);
|
||||||
|
assert_eq!(sm.get_history().len(), 2);
|
||||||
|
assert_eq!(sm.get_history()[0].version, 1);
|
||||||
|
assert_eq!(sm.get_history()[1].version, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_multiple_upgrades() {
|
||||||
|
let initial = ConstitutionVersion {
|
||||||
|
version: 1,
|
||||||
|
constitution_hash: Hash::zero(),
|
||||||
|
effective_from: 1000,
|
||||||
|
clause_count: 256,
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut sm = ConstitutionStateMachine::new(initial);
|
||||||
|
|
||||||
|
for i in 2..=5 {
|
||||||
|
let new_version = ConstitutionVersion {
|
||||||
|
version: i,
|
||||||
|
constitution_hash: Hash::zero(),
|
||||||
|
effective_from: 1000 * i,
|
||||||
|
clause_count: 256 + i,
|
||||||
|
};
|
||||||
|
sm.upgrade(new_version);
|
||||||
|
}
|
||||||
|
|
||||||
|
assert_eq!(sm.get_current_version().version, 5);
|
||||||
|
assert_eq!(sm.get_history().len(), 5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**状态**: ❌ 待添加
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 问题2: 缺少升级验证
|
||||||
|
|
||||||
|
**严重程度**: ⚠️ 高
|
||||||
|
|
||||||
|
**描述**: `upgrade`方法没有任何验证逻辑
|
||||||
|
|
||||||
|
**问题**:
|
||||||
|
1. 可以升级到更低的版本号
|
||||||
|
2. 可以使用无效的哈希
|
||||||
|
3. 可以使用过去的生效时间
|
||||||
|
4. 可以减少条款数量
|
||||||
|
|
||||||
|
**建议实现**:
|
||||||
|
```rust
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub enum UpgradeError {
|
||||||
|
InvalidVersion(u64, u64), // (current, new)
|
||||||
|
InvalidEffectiveTime(u64, u64), // (current_time, effective_time)
|
||||||
|
InvalidHash,
|
||||||
|
InvalidClauseCount(u64, u64), // (current, new)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn upgrade(&mut self, new_version: ConstitutionVersion, current_time: u64) -> Result<(), UpgradeError> {
|
||||||
|
// 1. 验证版本号递增
|
||||||
|
if new_version.version <= self.current_version.version {
|
||||||
|
return Err(UpgradeError::InvalidVersion(
|
||||||
|
self.current_version.version,
|
||||||
|
new_version.version
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 验证生效时间在未来
|
||||||
|
if new_version.effective_from < current_time {
|
||||||
|
return Err(UpgradeError::InvalidEffectiveTime(
|
||||||
|
current_time,
|
||||||
|
new_version.effective_from
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. 验证哈希非零
|
||||||
|
if new_version.constitution_hash == Hash::zero() {
|
||||||
|
return Err(UpgradeError::InvalidHash);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4. 验证条款数量不减少(可选)
|
||||||
|
if new_version.clause_count < self.current_version.clause_count {
|
||||||
|
return Err(UpgradeError::InvalidClauseCount(
|
||||||
|
self.current_version.clause_count,
|
||||||
|
new_version.clause_count
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 5. 执行升级
|
||||||
|
self.history.push(self.current_version.clone());
|
||||||
|
self.current_version = new_version;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**状态**: ❌ 待实现
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 问题3: 缺少版本查询功能
|
||||||
|
|
||||||
|
**严重程度**: ⚠️ 中等
|
||||||
|
|
||||||
|
**描述**: 只能查询当前版本和所有历史,无法查询特定版本
|
||||||
|
|
||||||
|
**建议添加**:
|
||||||
|
```rust
|
||||||
|
// 根据版本号查询
|
||||||
|
pub fn get_version(&self, version: u64) -> Option<&ConstitutionVersion> {
|
||||||
|
self.history.iter().find(|v| v.version == version)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 根据时间查询(查询某个时间点生效的版本)
|
||||||
|
pub fn get_version_at_time(&self, timestamp: u64) -> Option<&ConstitutionVersion> {
|
||||||
|
self.history
|
||||||
|
.iter()
|
||||||
|
.rev() // 从最新开始查找
|
||||||
|
.find(|v| v.effective_from <= timestamp)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 根据哈希查询
|
||||||
|
pub fn get_version_by_hash(&self, hash: &Hash) -> Option<&ConstitutionVersion> {
|
||||||
|
self.history.iter().find(|v| &v.constitution_hash == hash)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**状态**: ❌ 待实现
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 问题4: 缺少持久化支持
|
||||||
|
|
||||||
|
**严重程度**: ⚠️ 高
|
||||||
|
|
||||||
|
**描述**: 虽然实现了`Serialize`和`Deserialize`,但没有实际的持久化方法
|
||||||
|
|
||||||
|
**影响**: 重启后丢失所有历史记录
|
||||||
|
|
||||||
|
**建议实现**:
|
||||||
|
```rust
|
||||||
|
use std::fs::File;
|
||||||
|
use std::io::{Read, Write};
|
||||||
|
|
||||||
|
impl ConstitutionStateMachine {
|
||||||
|
// 保存到文件
|
||||||
|
pub fn save_to_file(&self, path: &str) -> Result<(), Box<dyn std::error::Error>> {
|
||||||
|
let json = serde_json::to_string_pretty(self)?;
|
||||||
|
let mut file = File::create(path)?;
|
||||||
|
file.write_all(json.as_bytes())?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
// 从文件加载
|
||||||
|
pub fn load_from_file(path: &str) -> Result<Self, Box<dyn std::error::Error>> {
|
||||||
|
let mut file = File::open(path)?;
|
||||||
|
let mut contents = String::new();
|
||||||
|
file.read_to_string(&mut contents)?;
|
||||||
|
let sm = serde_json::from_str(&contents)?;
|
||||||
|
Ok(sm)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**状态**: ❌ 待实现
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 问题5: 缺少升级提案机制
|
||||||
|
|
||||||
|
**严重程度**: ⚠️ 中等
|
||||||
|
|
||||||
|
**描述**: 直接升级,没有提案→投票→执行的流程
|
||||||
|
|
||||||
|
**建议**: 集成治理模块
|
||||||
|
```rust
|
||||||
|
pub enum UpgradeProposal {
|
||||||
|
Pending {
|
||||||
|
version: ConstitutionVersion,
|
||||||
|
proposed_at: u64,
|
||||||
|
votes_for: u64,
|
||||||
|
votes_against: u64,
|
||||||
|
},
|
||||||
|
Approved {
|
||||||
|
version: ConstitutionVersion,
|
||||||
|
approved_at: u64,
|
||||||
|
},
|
||||||
|
Rejected {
|
||||||
|
version: ConstitutionVersion,
|
||||||
|
rejected_at: u64,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct ConstitutionStateMachine {
|
||||||
|
current_version: ConstitutionVersion,
|
||||||
|
history: Vec<ConstitutionVersion>,
|
||||||
|
pending_proposal: Option<UpgradeProposal>, // 新增
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**状态**: ❌ 待实现
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 问题6: 历史记录重复
|
||||||
|
|
||||||
|
**严重程度**: ⚠️ 低
|
||||||
|
|
||||||
|
**描述**: `upgrade`方法将当前版本加入历史,但当前版本已经在历史中
|
||||||
|
|
||||||
|
**当前逻辑**:
|
||||||
|
```rust
|
||||||
|
pub fn upgrade(&mut self, new_version: ConstitutionVersion) {
|
||||||
|
self.history.push(self.current_version.clone()); // 重复!
|
||||||
|
self.current_version = new_version;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**问题**: 如果初始版本是v1,升级到v2后,历史中会有两个v1
|
||||||
|
|
||||||
|
**修复**:
|
||||||
|
```rust
|
||||||
|
pub fn upgrade(&mut self, new_version: ConstitutionVersion) {
|
||||||
|
// 不需要push,直接更新current_version
|
||||||
|
// 在下次升级时再将其加入历史
|
||||||
|
self.current_version = new_version.clone();
|
||||||
|
self.history.push(new_version);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**或者**:
|
||||||
|
```rust
|
||||||
|
pub fn new(initial_version: ConstitutionVersion) -> Self {
|
||||||
|
Self {
|
||||||
|
current_version: initial_version.clone(),
|
||||||
|
history: Vec::new(), // 初始为空
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn upgrade(&mut self, new_version: ConstitutionVersion) {
|
||||||
|
self.history.push(self.current_version.clone());
|
||||||
|
self.current_version = new_version;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**状态**: ❌ 待修复
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 问题7: 缺少事件日志
|
||||||
|
|
||||||
|
**严重程度**: ⚠️ 低
|
||||||
|
|
||||||
|
**描述**: 升级时没有记录事件日志
|
||||||
|
|
||||||
|
**建议**:
|
||||||
|
```rust
|
||||||
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||||
|
pub struct UpgradeEvent {
|
||||||
|
pub from_version: u64,
|
||||||
|
pub to_version: u64,
|
||||||
|
pub upgraded_at: u64,
|
||||||
|
pub upgraded_by: String, // 提案者或治理合约
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct ConstitutionStateMachine {
|
||||||
|
current_version: ConstitutionVersion,
|
||||||
|
history: Vec<ConstitutionVersion>,
|
||||||
|
events: Vec<UpgradeEvent>, // 新增
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**状态**: ❌ 待实现
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 完成度评估
|
||||||
|
|
||||||
|
| 功能模块 | 代码行数 | 完成度 | 状态 |
|
||||||
|
|---------|---------|--------|------|
|
||||||
|
| 数据结构 | 13行 | 100% | ✅ 完成 |
|
||||||
|
| 状态机创建 | 6行 | 100% | ✅ 完成 |
|
||||||
|
| 版本升级 | 4行 | 30% | ❌ 缺少验证 |
|
||||||
|
| 版本查询 | 6行 | 50% | ⚠️ 功能不足 |
|
||||||
|
| 持久化 | 0行 | 0% | ❌ 未实现 |
|
||||||
|
| 测试覆盖 | 0行 | 0% | ❌ 无测试 |
|
||||||
|
| **总计** | **40行** | **30%** | **🚧 进行中** |
|
||||||
|
|
||||||
|
### 待完善功能
|
||||||
|
|
||||||
|
1. **高优先级**:
|
||||||
|
- ❌ 添加升级验证逻辑
|
||||||
|
- ❌ 添加单元测试
|
||||||
|
- ❌ 实现持久化支持
|
||||||
|
- ❌ 修复历史记录重复问题
|
||||||
|
|
||||||
|
2. **中优先级**:
|
||||||
|
- ❌ 添加版本查询功能
|
||||||
|
- ❌ 实现升级提案机制
|
||||||
|
- ⏳ 添加事件日志
|
||||||
|
|
||||||
|
3. **低优先级**:
|
||||||
|
- ⏳ 优化内存使用
|
||||||
|
- ⏳ 添加性能监控
|
||||||
|
- ⏳ 添加文档注释
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🌟 设计亮点
|
||||||
|
|
||||||
|
1. **不可变历史**
|
||||||
|
- 所有历史版本永久保存
|
||||||
|
- 支持审计和追溯
|
||||||
|
|
||||||
|
2. **简洁的API**
|
||||||
|
- 只有4个公共方法
|
||||||
|
- 易于理解和使用
|
||||||
|
|
||||||
|
3. **零拷贝查询**
|
||||||
|
- 返回引用而非克隆
|
||||||
|
- 高效的内存使用
|
||||||
|
|
||||||
|
4. **序列化支持**
|
||||||
|
- 实现了`Serialize`和`Deserialize`
|
||||||
|
- 支持状态持久化
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔗 模块依赖关系
|
||||||
|
|
||||||
|
```
|
||||||
|
nac-constitution-state
|
||||||
|
├── 依赖
|
||||||
|
│ ├── nac-udm (Hash类型)
|
||||||
|
│ └── serde (序列化)
|
||||||
|
├── 被依赖
|
||||||
|
│ ├── nac-cee (宪法执行引擎)
|
||||||
|
│ ├── nac-cbpp-l0 (共识参数管理)
|
||||||
|
│ └── nac-api-server (API接口)
|
||||||
|
└── 协作模块
|
||||||
|
└── nac-constitution-clauses (宪法条款定义)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📝 开发建议
|
||||||
|
|
||||||
|
### 短期目标 (1周)
|
||||||
|
|
||||||
|
1. **添加单元测试** (优先级P1)
|
||||||
|
- 创建测试
|
||||||
|
- 升级测试
|
||||||
|
- 查询测试
|
||||||
|
|
||||||
|
2. **添加升级验证** (优先级P1)
|
||||||
|
- 版本号验证
|
||||||
|
- 时间验证
|
||||||
|
- 哈希验证
|
||||||
|
|
||||||
|
3. **修复历史记录重复** (优先级P1)
|
||||||
|
- 调整`new`和`upgrade`逻辑
|
||||||
|
- 确保历史记录唯一
|
||||||
|
|
||||||
|
### 中期目标 (2周)
|
||||||
|
|
||||||
|
4. **实现持久化** (优先级P2)
|
||||||
|
- 保存到文件
|
||||||
|
- 从文件加载
|
||||||
|
- 错误处理
|
||||||
|
|
||||||
|
5. **添加版本查询** (优先级P2)
|
||||||
|
- 按版本号查询
|
||||||
|
- 按时间查询
|
||||||
|
- 按哈希查询
|
||||||
|
|
||||||
|
6. **实现升级提案** (优先级P2)
|
||||||
|
- 提案创建
|
||||||
|
- 投票机制
|
||||||
|
- 提案执行
|
||||||
|
|
||||||
|
### 长期目标 (1个月)
|
||||||
|
|
||||||
|
7. **添加事件日志** (优先级P3)
|
||||||
|
- 升级事件
|
||||||
|
- 查询事件
|
||||||
|
- 事件导出
|
||||||
|
|
||||||
|
8. **性能优化** (优先级P3)
|
||||||
|
- 使用BTreeMap索引
|
||||||
|
- 优化历史查询
|
||||||
|
- 减少克隆
|
||||||
|
|
||||||
|
9. **集成治理** (优先级P4)
|
||||||
|
- 与治理模块集成
|
||||||
|
- 支持投票权重
|
||||||
|
- 支持多签
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💡 使用示例
|
||||||
|
|
||||||
|
```rust
|
||||||
|
use nac_constitution_state::{ConstitutionStateMachine, ConstitutionVersion};
|
||||||
|
use nac_udm::primitives::Hash;
|
||||||
|
|
||||||
|
// 1. 创建初始版本
|
||||||
|
let initial = ConstitutionVersion {
|
||||||
|
version: 1,
|
||||||
|
constitution_hash: Hash::from_hex("1234...").unwrap(),
|
||||||
|
effective_from: 1708300800,
|
||||||
|
clause_count: 256,
|
||||||
|
};
|
||||||
|
|
||||||
|
// 2. 创建状态机
|
||||||
|
let mut state_machine = ConstitutionStateMachine::new(initial);
|
||||||
|
|
||||||
|
// 3. 查询当前版本
|
||||||
|
let current = state_machine.get_current_version();
|
||||||
|
println!("当前版本: {}", current.version);
|
||||||
|
println!("条款数量: {}", current.clause_count);
|
||||||
|
|
||||||
|
// 4. 升级到新版本
|
||||||
|
let new_version = ConstitutionVersion {
|
||||||
|
version: 2,
|
||||||
|
constitution_hash: Hash::from_hex("5678...").unwrap(),
|
||||||
|
effective_from: 1708387200, // 24小时后
|
||||||
|
clause_count: 260,
|
||||||
|
};
|
||||||
|
|
||||||
|
state_machine.upgrade(new_version);
|
||||||
|
|
||||||
|
// 5. 查询历史
|
||||||
|
let history = state_machine.get_history();
|
||||||
|
println!("历史版本数: {}", history.len());
|
||||||
|
for version in history {
|
||||||
|
println!("版本 {}: {} 条款", version.version, version.clause_count);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔄 与其他模块的协作
|
||||||
|
|
||||||
|
### 与nac-cee的协作
|
||||||
|
|
||||||
|
```rust
|
||||||
|
// nac-cee使用宪法状态机获取当前宪法版本
|
||||||
|
use nac_cee::ConstitutionEngine;
|
||||||
|
use nac_constitution_state::ConstitutionStateMachine;
|
||||||
|
|
||||||
|
let state_machine = ConstitutionStateMachine::load_from_file("constitution.json")?;
|
||||||
|
let current_version = state_machine.get_current_version();
|
||||||
|
|
||||||
|
let cee = ConstitutionEngine::new(current_version.constitution_hash);
|
||||||
|
```
|
||||||
|
|
||||||
|
### 与nac-cbpp-l0的协作
|
||||||
|
|
||||||
|
```rust
|
||||||
|
// nac-cbpp-l0使用宪法状态机获取共识参数
|
||||||
|
use nac_cbpp_l0::ParamsManager;
|
||||||
|
use nac_constitution_state::ConstitutionStateMachine;
|
||||||
|
|
||||||
|
let state_machine = ConstitutionStateMachine::load_from_file("constitution.json")?;
|
||||||
|
let current_version = state_machine.get_current_version();
|
||||||
|
|
||||||
|
let params_mgr = ParamsManager::new();
|
||||||
|
params_mgr.start_new_epoch(1, current_version.constitution_hash);
|
||||||
|
```
|
||||||
|
|
||||||
|
### 与nac-api-server的协作
|
||||||
|
|
||||||
|
```rust
|
||||||
|
// nac-api-server提供宪法版本查询API
|
||||||
|
use nac_api_server::handlers;
|
||||||
|
use nac_constitution_state::ConstitutionStateMachine;
|
||||||
|
|
||||||
|
async fn get_constitution_version() -> Result<String, Error> {
|
||||||
|
let state_machine = ConstitutionStateMachine::load_from_file("constitution.json")?;
|
||||||
|
let current = state_machine.get_current_version();
|
||||||
|
Ok(serde_json::to_string(current)?)
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn get_constitution_history() -> Result<String, Error> {
|
||||||
|
let state_machine = ConstitutionStateMachine::load_from_file("constitution.json")?;
|
||||||
|
let history = state_machine.get_history();
|
||||||
|
Ok(serde_json::to_string(history)?)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📈 扩展建议
|
||||||
|
|
||||||
|
### 1. 支持宪法修正案
|
||||||
|
|
||||||
|
```rust
|
||||||
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||||
|
pub struct Amendment {
|
||||||
|
pub amendment_id: u64,
|
||||||
|
pub clause_id: String,
|
||||||
|
pub old_value: String,
|
||||||
|
pub new_value: String,
|
||||||
|
pub proposed_at: u64,
|
||||||
|
pub approved_at: u64,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct ConstitutionVersion {
|
||||||
|
pub version: u64,
|
||||||
|
pub constitution_hash: Hash,
|
||||||
|
pub effective_from: u64,
|
||||||
|
pub clause_count: u64,
|
||||||
|
pub amendments: Vec<Amendment>, // 新增
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 支持分支版本
|
||||||
|
|
||||||
|
```rust
|
||||||
|
pub enum VersionBranch {
|
||||||
|
Main,
|
||||||
|
Testnet,
|
||||||
|
Devnet,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct ConstitutionVersion {
|
||||||
|
pub version: u64,
|
||||||
|
pub branch: VersionBranch, // 新增
|
||||||
|
pub constitution_hash: Hash,
|
||||||
|
pub effective_from: u64,
|
||||||
|
pub clause_count: u64,
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. 支持回滚机制
|
||||||
|
|
||||||
|
```rust
|
||||||
|
impl ConstitutionStateMachine {
|
||||||
|
pub fn rollback_to(&mut self, version: u64) -> Result<(), RollbackError> {
|
||||||
|
// 查找目标版本
|
||||||
|
let target = self.history.iter()
|
||||||
|
.find(|v| v.version == version)
|
||||||
|
.ok_or(RollbackError::VersionNotFound(version))?;
|
||||||
|
|
||||||
|
// 回滚到目标版本
|
||||||
|
self.current_version = target.clone();
|
||||||
|
|
||||||
|
// 截断历史(可选)
|
||||||
|
self.history.retain(|v| v.version <= version);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**分析完成时间**: 2026-02-18
|
||||||
|
**下一步**: 添加升级验证逻辑和单元测试
|
||||||
Loading…
Reference in New Issue