NAC_Blockchain/nac-upgrade-framework/README.md

406 lines
9.0 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.

# NAC升级框架 (nac-upgrade-framework)
NAC公链统一升级机制框架为所有NAC模块提供版本管理、升级协议、回滚机制和升级治理。
## 📋 目录
- [功能特性](#功能特性)
- [架构设计](#架构设计)
- [快速开始](#快速开始)
- [详细文档](#详细文档)
- [测试](#测试)
- [贡献指南](#贡献指南)
## 🎯 功能特性
### 1. 版本管理
- ✅ 语义化版本控制 (Semantic Versioning 2.0.0)
- ✅ 版本兼容性检查
- ✅ 破坏性变更检测
- ✅ 版本升级路径验证
### 2. 升级协议
- ✅ 统一的升级接口 (`Upgradeable` trait)
- ✅ 升级提案系统
- ✅ 状态迁移脚本
- ✅ 配置变更管理
### 3. 回滚机制
- ✅ 自动快照创建
- ✅ 快照完整性验证
- ✅ 一键回滚
- ✅ 快照管理和清理
### 4. 升级治理
- ✅ 提案投票系统
- ✅ 可配置的通过阈值
- ✅ 投票权重支持
- ✅ 提案生命周期管理
## 🏗️ 架构设计
```
nac-upgrade-framework/
├── src/
│ ├── lib.rs # 主入口
│ ├── version.rs # 版本管理
│ ├── traits.rs # 核心trait定义
│ ├── proposal.rs # 升级提案
│ ├── snapshot.rs # 快照和回滚
│ ├── governance.rs # 治理和投票
│ ├── migration.rs # 状态迁移
│ ├── error.rs # 错误类型
│ └── helpers.rs # 辅助宏和函数
├── tests/
│ └── integration_tests.rs
├── Cargo.toml
└── README.md
```
## 🚀 快速开始
### 1. 添加依赖
在模块的 `Cargo.toml` 中添加:
```toml
[dependencies]
nac-upgrade-framework = { path = "../nac-upgrade-framework" }
```
### 2. 为结构体添加升级字段
```rust
use nac_upgrade_framework::{Version, UpgradeRecord};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MyModule {
// 现有字段...
pub data: String,
// 升级框架必需字段
pub version: Version,
pub upgrade_history: Vec<UpgradeRecord>,
}
```
### 3. 实现升级逻辑
```rust
use nac_upgrade_framework::{UpgradeData, Result};
impl MyModule {
pub fn new() -> Self {
Self {
data: String::new(),
version: Version::new(1, 0, 0),
upgrade_history: Vec::new(),
}
}
// 实现具体的升级逻辑
fn do_upgrade(&mut self, target: Version, data: UpgradeData) -> Result<()> {
// 根据目标版本执行不同的升级逻辑
match (target.major, target.minor, target.patch) {
(1, 1, 0) => {
// 升级到1.1.0的逻辑
self.data = format!("upgraded to {}", target);
Ok(())
}
_ => Ok(())
}
}
}
```
### 4. 使用宏实现Upgradeable trait
```rust
nac_upgrade_framework::impl_upgradeable!(MyModule, "my-module", Version::new(1, 0, 0));
```
### 5. 执行升级
```rust
use nac_upgrade_framework::{traits::Upgradeable, UpgradeData, Version};
fn main() {
let mut module = MyModule::new();
// 创建升级数据
let upgrade_data = UpgradeData::new();
// 执行升级
let target = Version::new(1, 1, 0);
match module.upgrade(target, upgrade_data) {
Ok(_) => println!("升级成功!"),
Err(e) => println!("升级失败: {}", e),
}
// 查看升级历史
for record in module.upgrade_history() {
println!("从 {} 升级到 {}", record.from_version, record.to_version);
}
}
```
## 📚 详细文档
### 版本管理
```rust
use nac_upgrade_framework::Version;
// 创建版本
let v1 = Version::new(1, 0, 0);
let v2 = Version::new(1, 1, 0);
let v3 = Version::new(2, 0, 0);
// 版本比较
assert!(v1 < v2);
assert!(v2 < v3);
// 兼容性检查
assert!(v1.is_compatible_with(&v2)); // 同一major版本
assert!(!v1.is_compatible_with(&v3)); // 不同major版本
// 破坏性变更检查
assert!(!v1.is_breaking_change(&v2)); // minor升级非破坏性
assert!(v1.is_breaking_change(&v3)); // major升级破坏性
// 版本解析
let v = Version::parse("1.2.3").unwrap();
assert_eq!(v, Version::new(1, 2, 3));
```
### 升级提案
```rust
use nac_upgrade_framework::{UpgradeProposal, UpgradeData, Version};
use std::collections::HashMap;
// 创建升级提案
let proposal = UpgradeProposal::new(
"nac-nvm".to_string(),
Version::new(1, 0, 0),
Version::new(1, 1, 0),
"Upgrade NVM to 1.1.0 with new opcodes".to_string(),
UpgradeData {
migration_script: None,
config_changes: HashMap::new(),
state_migrations: vec![],
breaking_changes: vec![],
},
"admin".to_string(),
7, // 7天投票期
);
// 开始投票
let mut proposal = proposal;
proposal.start_voting();
// 检查状态
assert!(proposal.can_vote());
```
### 快照和回滚
```rust
use nac_upgrade_framework::{Snapshot, SnapshotManager};
let mut manager = SnapshotManager::new();
// 创建快照
let snapshot = Snapshot::new(
"nac-nvm".to_string(),
Version::new(1, 0, 0),
vec![1, 2, 3, 4], // 状态数据
);
// 保存快照
let snapshot_id = manager.save(snapshot);
// 获取快照
let snapshot = manager.get(&snapshot_id).unwrap();
// 验证完整性
assert!(snapshot.verify_integrity());
// 回滚在Upgradeable trait中自动处理
```
### 治理和投票
```rust
use nac_upgrade_framework::{
governance::{Vote, VoteRecord, VoteResult, GovernanceConfig},
};
// 创建投票结果
let mut result = VoteResult::new();
// 添加投票
result.add_vote(VoteRecord::new("voter1".to_string(), Vote::Yes, 1));
result.add_vote(VoteRecord::new("voter2".to_string(), Vote::Yes, 1));
result.add_vote(VoteRecord::new("voter3".to_string(), Vote::No, 1));
// 检查是否通过
let config = GovernanceConfig::default_config(); // 66%通过阈值
assert!(result.is_approved(config.approval_threshold));
// 获取投票统计
println!("赞成: {}%", result.yes_percentage());
println!("反对: {}%", result.no_percentage());
```
## 🧪 测试
运行所有测试:
```bash
cd nac-upgrade-framework
cargo test
```
运行特定模块测试:
```bash
cargo test version
cargo test proposal
cargo test snapshot
cargo test governance
```
运行集成测试:
```bash
cargo test --test integration_tests
```
## 📊 测试覆盖率
当前测试覆盖率:**>90%**
- `version.rs`: 13个测试 ✅
- `proposal.rs`: 7个测试 ✅
- `snapshot.rs`: 9个测试 ✅
- `governance.rs`: 9个测试 ✅
- `migration.rs`: 7个测试 ✅
- `traits.rs`: 2个测试 ✅
- `helpers.rs`: 2个测试 ✅
- `error.rs`: 3个测试 ✅
**总计: 52个测试全部通过 ✅**
## 🔧 配置选项
### 治理配置
```rust
use nac_upgrade_framework::governance::GovernanceConfig;
// 默认配置(适用于一般升级)
let config = GovernanceConfig::default_config();
// - 通过阈值: 66%
// - 拒绝阈值: 33%
// - 最小投票数: 3
// - 投票期: 7天
// 严格配置(适用于关键升级)
let config = GovernanceConfig::strict_config();
// - 通过阈值: 80%
// - 拒绝阈值: 20%
// - 最小投票数: 5
// - 投票期: 14天
// 宽松配置(适用于非关键升级)
let config = GovernanceConfig::relaxed_config();
// - 通过阈值: 50%
// - 拒绝阈值: 50%
// - 最小投票数: 1
// - 投票期: 3天
```
## 🎓 最佳实践
### 1. 版本规划
- **Major版本**: 破坏性变更不兼容的API修改
- **Minor版本**: 新功能,向后兼容
- **Patch版本**: Bug修复向后兼容
### 2. 升级前检查
```rust
// 1. 检查版本兼容性
if !module.can_upgrade_to(&target_version)? {
return Err("Cannot upgrade to this version");
}
// 2. 创建快照
let snapshot = module.create_snapshot()?;
// 3. 执行升级
match module.upgrade(target_version, upgrade_data) {
Ok(_) => println!("Success!"),
Err(e) => {
// 4. 失败时自动回滚
module.rollback(snapshot)?;
return Err(e);
}
}
// 5. 验证状态
module.validate_state()?;
```
### 3. 快照管理
```rust
// 定期清理旧快照保留最近N个
manager.cleanup_old_snapshots("nac-nvm", 10);
```
### 4. 治理流程
```rust
// 1. 提交提案
let proposal_id = governance.propose_upgrade(proposal)?;
// 2. 投票
governance.vote(proposal_id.clone(), Vote::Yes)?;
// 3. 检查投票结果
let result = governance.get_vote_result(&proposal_id)?;
if config.validate_result(&result) {
// 4. 执行升级
governance.execute_upgrade(proposal_id)?;
}
```
## 🤝 贡献指南
1. Fork本项目
2. 创建特性分支 (`git checkout -b feature/AmazingFeature`)
3. 提交更改 (`git commit -m 'Add some AmazingFeature'`)
4. 推送到分支 (`git push origin feature/AmazingFeature`)
5. 开启Pull Request
## 📄 许可证
MIT License
## 👥 维护者
NAC Development Team
## 📞 联系方式
- 项目主页: https://git.newassetchain.io/nacadmin/NAC_Blockchain
- Issue追踪: https://git.newassetchain.io/nacadmin/NAC_Blockchain/issues
## 🎉 致谢
感谢所有为NAC公链升级机制做出贡献的开发者