12 KiB
nac-acc-1410 模块深度分析报告
模块名称: nac-acc-1410
版本: 1.0.0
分析日期: 2026-02-18
分析人员: NAC开发团队
📋 模块概览
功能定位: ACC-1410部分同质化资产协议 - 扩展ACC-20,增加分区(Partition)功能
英文全称: Asset Classification Code 1410 - Partially Fungible Token Standard
代码行数: 1,388行
完成度: 75%
测试覆盖: 85% (12个测试全部通过)
编译状态: ✅ 通过
🏗️ 架构设计
核心功能
nac-acc-1410是NAC公链的分区型资产协议,允许同一资产类别内的代币被分为不同的分区:
- 分区管理: 创建、关闭、查询分区
- 分区余额: 查询账户在特定分区的余额
- 分区转账: 在分区间转移代币
- 操作员授权: 授权第三方操作员代理转账
- GNACS扩展: 64位扩展编码(48位基础+16位扩展)
- 账户锁定: 支持账户锁定和解锁
- 转账控制: 支持暂停和恢复转账
模块结构
nac-acc-1410/
├── src/
│ ├── lib.rs (448行) - 主接口
│ ├── types.rs (274行) - 类型定义
│ ├── partition.rs (187行) - 分区管理
│ ├── transfer.rs (434行) - 转账管理
│ └── error.rs (45行) - 错误定义
└── Cargo.toml
技术栈
| 组件 | 技术 | 版本 | 说明 |
|---|---|---|---|
| 序列化 | serde | 1.0 | 数据序列化 |
| 哈希 | sha3 | 0.10 | 哈希计算 |
| 时间 | chrono | 0.4 | 时间处理 |
| 日志 | tracing | 0.1 | 日志记录 |
🔍 核心功能详解
1. 数据结构
1.1 分区类型
pub enum PartitionType {
CommonStock = 0x01, // 普通股
PreferredStock = 0x02, // 优先股
RestrictedStock = 0x03, // 限制性股票(锁定期)
EmployeeOption = 0x04, // 员工期权
IncomeRight = 0x05, // 收益权(无投票权)
VotingRight = 0x06, // 投票权(无收益权)
}
支持的分区类型:
- 普通股: 完整的所有权和投票权
- 优先股: 优先分红权
- 限制性股票: 有锁定期的股票
- 员工期权: 员工激励期权
- 收益权: 只有收益权,无投票权
- 投票权: 只有投票权,无收益权
1.2 GNACS扩展编码
pub struct GNACSExtension {
pub partition_type: u8, // 分区类型(4位)
pub vesting_years: u8, // 锁定期限(4位)
pub voting_multiplier: u8, // 投票权倍数(4位)
pub dividend_priority: u8, // 分红优先级(4位)
}
编码方案:
- 总共16位(2字节)
- 第1字节: 分区类型(4位) + 锁定期限(4位)
- 第2字节: 投票权倍数(4位) + 分红优先级(4位)
完整GNACS:
pub struct ExtendedGNACS {
pub base_gnacs: Vec<u8>, // 48位基础GNACS(6字节)
pub extension: GNACSExtension, // 16位扩展(2字节)
}
// 总共64位(8字节)
1.3 分区信息
pub struct PartitionInfo {
pub id: [u8; 32], // 分区ID(32字节哈希)
pub extended_gnacs: ExtendedGNACS, // 64位GNACS
pub name: String, // 分区名称
pub partition_type: PartitionType, // 分区类型
pub total_supply: u64, // 总供应量
pub is_active: bool, // 是否激活
pub created_at: i64, // 创建时间
}
1.4 分区结构
pub struct Partition {
pub info: PartitionInfo,
pub balances: HashMap<String, u64>, // 账户余额
pub operators: HashMap<String, Vec<String>>, // 操作员授权
pub locked_accounts: HashMap<String, u64>, // 锁定账户
}
2. 分区管理 (partition.rs - 187行)
2.1 创建分区
pub fn create_partition(
&mut self,
name: String,
extended_gnacs: ExtendedGNACS,
partition_type: PartitionType,
) -> Result<[u8; 32]>
功能: 创建新的资产分区
实现:
- 计算分区ID(SHA3哈希)
- 创建PartitionInfo
- 初始化Partition
- 存储到partitions映射
2.2 关闭分区
pub fn close_partition(&mut self, partition_id: &[u8; 32]) -> Result<()>
功能: 关闭分区,禁止新的操作
2.3 查询分区
pub fn get_partition_info(&self, partition_id: &[u8; 32]) -> Result<PartitionInfo>
pub fn get_all_partition_ids(&self) -> Vec<[u8; 32]>
3. 余额管理
3.1 查询余额
pub fn balance_of_by_partition(
&self,
partition_id: &[u8; 32],
account: &str,
) -> Result<u64>
功能: 查询账户在特定分区的余额
3.2 查询账户的所有分区
pub fn partitions_of(&self, account: &str) -> Vec<[u8; 32]>
功能: 返回账户持有代币的所有分区ID
4. 代币发行和销毁
4.1 发行代币
pub fn issue_to_partition(
&mut self,
partition_id: &[u8; 32],
to: &str,
amount: u64,
) -> Result<()>
功能: 向指定分区发行代币
4.2 销毁代币
pub fn burn_from_partition(
&mut self,
partition_id: &[u8; 32],
from: &str,
amount: u64,
) -> Result<()>
功能: 从指定分区销毁代币
5. 转账管理 (transfer.rs - 434行)
5.1 分区内转账
pub fn transfer_by_partition(
&mut self,
from: &str,
to: &str,
amount: u64,
partition_id: &[u8; 32],
) -> Result<TransferResult>
功能: 在同一分区内转账
验证:
- 检查分区是否存在
- 检查余额是否足够
- 检查账户是否锁定
- 检查转账是否暂停
- 执行转账
5.2 操作员代理转账
pub fn operator_transfer_by_partition(
&mut self,
operator: &str,
from: &str,
to: &str,
amount: u64,
partition_id: &[u8; 32],
) -> Result<TransferResult>
功能: 操作员代理账户进行转账
验证:
- 检查操作员授权
- 执行转账
6. 操作员管理
6.1 授权操作员
pub fn authorize_operator(&mut self, account: &str, operator: &str)
功能: 授权操作员代理账户操作
6.2 撤销操作员
pub fn revoke_operator(&mut self, account: &str, operator: &str)
功能: 撤销操作员授权
6.3 查询操作员
pub fn is_operator(&self, account: &str, operator: &str) -> bool
功能: 检查是否为授权操作员
7. 账户锁定
7.1 锁定账户
pub fn lock_account(&mut self, account: &str, unlock_time: u64)
功能: 锁定账户,禁止转出
7.2 解锁账户
pub fn unlock_account(&mut self, account: &str)
功能: 提前解锁账户
7.3 检查锁定状态
pub fn is_account_locked(&self, account: &str) -> bool
8. 转账控制
8.1 暂停转账
pub fn halt_transfers(&mut self)
功能: 全局暂停所有转账
8.2 恢复转账
pub fn resume_transfers(&mut self)
功能: 恢复转账
🧪 测试分析
测试覆盖
| 测试类别 | 测试数量 | 状态 |
|---|---|---|
| 分区管理 | 3个 | ✅ 通过 |
| 余额查询 | 2个 | ✅ 通过 |
| 转账功能 | 3个 | ✅ 通过 |
| 操作员管理 | 2个 | ✅ 通过 |
| 账户锁定 | 1个 | ✅ 通过 |
| 转账控制 | 1个 | ✅ 通过 |
| 总计 | 12个 | ✅ 全部通过 |
测试覆盖率: 85%
🐛 发现的问题
问题1: 缺少分区间转账
严重程度: ⚠️ 中等
描述: 只支持同一分区内转账,不支持跨分区转账
建议: 添加分区间转账
pub fn transfer_between_partitions(
&mut self,
from: &str,
to: &str,
amount: u64,
from_partition: &[u8; 32],
to_partition: &[u8; 32],
) -> Result<TransferResult>
状态: ❌ 待实现
问题2: 缺少批量操作
严重程度: ⚠️ 低
描述: 不支持批量转账
建议: 添加批量转账
pub fn batch_transfer_by_partition(
&mut self,
from: &str,
transfers: Vec<(String, u64)>,
partition_id: &[u8; 32],
) -> Result<Vec<TransferResult>>
状态: ❌ 待实现
问题3: 缺少事件通知
严重程度: ⚠️ 中等
描述: 没有事件通知机制
建议: 添加事件
pub enum Acc1410Event {
PartitionCreated { id: [u8; 32], name: String },
TokensIssued { partition_id: [u8; 32], to: String, amount: u64 },
TokensTransferred { partition_id: [u8; 32], from: String, to: String, amount: u64 },
}
状态: ❌ 待实现
问题4: 缺少分区合并和拆分
严重程度: ⚠️ 低
描述: 不支持分区合并和拆分
建议: 添加分区操作
pub fn merge_partitions(
&mut self,
partition1: &[u8; 32],
partition2: &[u8; 32],
) -> Result<[u8; 32]>
pub fn split_partition(
&mut self,
partition_id: &[u8; 32],
ratio: f64,
) -> Result<([u8; 32], [u8; 32])>
状态: ❌ 待实现
📊 完成度评估
| 功能模块 | 代码行数 | 完成度 | 状态 |
|---|---|---|---|
| 类型定义 | 274行 | 95% | ✅ 完成 |
| 分区管理 | 187行 | 90% | ✅ 完成 |
| 转账管理 | 434行 | 80% | ✅ 完成 |
| 操作员管理 | 包含在transfer.rs | 90% | ✅ 完成 |
| 账户锁定 | 包含在transfer.rs | 85% | ✅ 完成 |
| 错误处理 | 45行 | 100% | ✅ 完成 |
| 分区间转账 | 0行 | 0% | ❌ 未实现 |
| 批量操作 | 0行 | 0% | ❌ 未实现 |
| 事件通知 | 0行 | 0% | ❌ 未实现 |
| 分区合并拆分 | 0行 | 0% | ❌ 未实现 |
| 测试覆盖 | 包含在各文件 | 85% | ✅ 良好 |
| 总计 | 1,388行 | 75% | ✅ 大部分完成 |
🌟 设计亮点
-
清晰的模块划分
- types.rs: 类型定义
- partition.rs: 分区管理
- transfer.rs: 转账管理
- error.rs: 错误定义
-
完整的GNACS扩展
- 64位编码(48位基础+16位扩展)
- 支持分区类型、锁定期、投票权、分红优先级
-
丰富的分区类型
- 6种分区类型
- 支持不同的权益组合
-
完善的测试
- 12个测试用例
- 85%覆盖率
- 全部通过
-
灵活的操作员机制
- 支持授权和撤销
- 操作员代理转账
🔗 模块依赖关系
nac-acc-1410
├── 依赖
│ ├── serde (序列化)
│ ├── sha3 (哈希)
│ ├── chrono (时间)
│ └── tracing (日志)
└── 被依赖
├── nac-acc-1400 (证券型资产)
└── 其他ACC协议
📝 开发建议
短期目标 (1周)
- 添加分区间转账 (优先级P2)
- 添加事件通知 (优先级P2)
- 完善文档 (优先级P3)
中期目标 (2周)
- 添加批量操作 (优先级P3)
- 添加分区合并拆分 (优先级P3)
- 优化性能 (优先级P3)
💡 使用示例
基础操作
use nac_acc_1410::*;
// 创建ACC-1410实例
let mut acc1410 = Acc1410::new();
// 创建分区
let extended_gnacs = ExtendedGNACS {
base_gnacs: vec![0x94, 0x01, 0x00, 0x04, 0x02, 0x01],
extension: GNACSExtension {
partition_type: 0x01,
vesting_years: 0,
voting_multiplier: 1,
dividend_priority: 1,
},
};
let partition_id = acc1410.create_partition(
"Common Stock".to_string(),
extended_gnacs,
PartitionType::CommonStock,
)?;
// 发行代币
acc1410.issue_to_partition(&partition_id, "user1", 1000)?;
// 转账
acc1410.transfer_by_partition("user1", "user2", 300, &partition_id)?;
// 查询余额
let balance = acc1410.balance_of_by_partition(&partition_id, "user1")?;
println!("余额: {}", balance);
分析完成时间: 2026-02-18
下一步: 实现分区间转账和事件通知