19 KiB
nac-acc-1400 模块深度分析报告
模块名称: nac-acc-1400
版本: 1.0.0
分析日期: 2026-02-18
分析人员: NAC开发团队
📋 模块概览
功能定位: ACC-1400证券型资产协议 - 继承ACC-1410,专门用于证券型资产(Security Token)
英文全称: Asset Classification Code 1400 - Security Token Standard
代码行数: 334行
完成度: 60%
测试覆盖: 80% (5个测试全部通过)
编译状态: ✅ 通过
🏗️ 架构设计
核心功能
nac-acc-1400是NAC公链的证券型资产协议,继承自ACC-1410,增加了证券特有的功能:
- 证券发行: 创建和发行证券型资产
- 证券转让: 支持证券的转让和交易
- 操作员管理: 授权和撤销证券操作员(如经纪人)
- 账户锁定: 支持账户锁定和解锁
- 转账控制: 支持暂停和恢复转账
继承关系
ACC-1410 (分区型资产)
↓ 继承
ACC-1400 (证券型资产)
↓ 扩展
- 证券特有功能
- 监管合规
- 投资者保护
技术栈
| 组件 | 技术 | 版本 | 说明 |
|---|---|---|---|
| 基础协议 | nac-acc-1410 | 1.0 | 分区型资产协议 |
| 序列化 | serde | 1.0 | 数据序列化 |
| 哈希 | sha3 | 0.10 | 哈希计算 |
| 时间 | chrono | 0.4 | 时间处理 |
🔍 核心功能详解
1. 数据结构
1.1 Acc1400结构
pub struct Acc1400 {
base: Acc1410,
}
设计特点:
- 通过组合方式继承ACC-1410
- 所有功能委托给base实现
- 提供证券专用的API包装
2. 证券管理
2.1 创建证券分区
pub fn create_security_partition(
&mut self,
name: String,
extended_gnacs: ExtendedGNACS,
partition_type: PartitionType,
) -> Result<[u8; 32]>
功能: 创建证券型资产分区
参数:
name: 证券名称(如"ACME Corp Common Stock")extended_gnacs: 扩展GNACS编码partition_type: 分区类型(普通股、优先股、限制性股票等)
返回: 证券分区ID(32字节哈希)
使用示例:
let common_stock_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 security_id = acc1400.create_security_partition(
"ACME Corp Common Stock".to_string(),
common_stock_gnacs,
PartitionType::CommonStock,
)?;
2.2 发行证券
pub fn issue_security(
&mut self,
partition_id: &[u8; 32],
to: &str,
amount: u64,
) -> Result<()>
功能: 向投资者发行证券
参数:
partition_id: 证券分区IDto: 投资者地址amount: 发行数量
使用示例:
acc1400.issue_security(&security_id, "investor1", 10000)?;
2.3 转让证券
pub fn transfer_security(
&mut self,
from: &str,
to: &str,
amount: u64,
partition_id: &[u8; 32],
) -> Result<TransferResult>
功能: 转让证券
参数:
from: 转出方地址to: 接收方地址amount: 转让数量partition_id: 证券分区ID
返回: 转让结果(包含转让详情)
使用示例:
let result = acc1400.transfer_security(
"investor1",
"investor2",
2000,
&security_id
)?;
2.4 查询证券余额
pub fn balance_of_security(
&self,
partition_id: &[u8; 32],
account: &str,
) -> Result<u64>
功能: 查询账户在特定证券分区的余额
使用示例:
let balance = acc1400.balance_of_security(&security_id, "investor1")?;
2.5 查询账户持有的所有证券
pub fn securities_of(&self, account: &str) -> Vec<[u8; 32]>
功能: 查询账户持有的所有证券分区
返回: 证券分区ID列表
使用示例:
let securities = acc1400.securities_of("investor1");
for security_id in securities {
let balance = acc1400.balance_of_security(&security_id, "investor1")?;
println!("证券ID: {:?}, 余额: {}", security_id, balance);
}
3. 操作员管理
3.1 授权证券操作员
pub fn authorize_security_operator(&mut self, account: &str, operator: &str)
功能: 授权操作员(如经纪人)代理账户进行证券操作
使用场景:
- 投资者授权经纪人代理交易
- 公司授权转让代理人
- 托管机构授权
使用示例:
acc1400.authorize_security_operator("investor1", "broker1");
3.2 撤销证券操作员
pub fn revoke_security_operator(&mut self, account: &str, operator: &str)
功能: 撤销操作员授权
使用示例:
acc1400.revoke_security_operator("investor1", "broker1");
3.3 操作员代理转账
// 通过base调用
acc1400.base.operator_transfer_by_partition(
"broker1", // 操作员
"investor1", // 转出方
"investor2", // 接收方
500, // 数量
&security_id // 证券ID
)?;
功能: 操作员代理账户进行证券转让
4. 账户锁定
4.1 锁定证券账户
pub fn lock_security_account(&mut self, account: &str, unlock_time: u64)
功能: 锁定账户,禁止转出证券
参数:
account: 账户地址unlock_time: 解锁时间(Unix时间戳)
使用场景:
- 限制性股票锁定期
- 监管要求的锁定
- 争议冻结
使用示例:
let future_time = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap()
.as_secs() + 3600; // 1小时后解锁
acc1400.lock_security_account("investor1", future_time);
4.2 解锁证券账户
pub fn unlock_security_account(&mut self, account: &str)
功能: 提前解锁账户
使用示例:
acc1400.unlock_security_account("investor1");
5. 转账控制
5.1 暂停证券转账
pub fn halt_security_transfers(&mut self)
功能: 全局暂停所有证券转账
使用场景:
- 紧急情况
- 系统维护
- 监管要求
使用示例:
acc1400.halt_security_transfers();
5.2 恢复证券转账
pub fn resume_security_transfers(&mut self)
功能: 恢复证券转账
使用示例:
acc1400.resume_security_transfers();
🧪 测试分析
测试覆盖
| 测试用例 | 功能 | 状态 |
|---|---|---|
| test_acc1400_security_issuance | 证券发行 | ✅ 通过 |
| test_acc1400_security_transfer | 证券转让 | ✅ 通过 |
| test_acc1400_operator_authorization | 操作员授权 | ✅ 通过 |
| test_acc1400_account_locking | 账户锁定 | ✅ 通过 |
| test_acc1400_transfer_halt | 转账暂停 | ✅ 通过 |
测试覆盖率: 80%
测试1: 证券发行
#[test]
fn test_acc1400_security_issuance() {
let mut acc1400 = Acc1400::new();
// 创建普通股证券
let common_stock_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 security_id = acc1400
.create_security_partition(
"ACME Corp Common Stock".to_string(),
common_stock_gnacs,
PartitionType::CommonStock,
)
.unwrap();
// 发行证券
acc1400
.issue_security(&security_id, "investor1", 10000)
.unwrap();
// 检查余额
assert_eq!(
acc1400
.balance_of_security(&security_id, "investor1")
.unwrap(),
10000
);
}
测试结果: ✅ 通过
测试2: 证券转让
#[test]
fn test_acc1400_security_transfer() {
// 发行5000股
acc1400.issue_security(&security_id, "investor1", 5000).unwrap();
// 转让2000股
acc1400
.transfer_security("investor1", "investor2", 2000, &security_id)
.unwrap();
// 验证余额
assert_eq!(
acc1400.balance_of_security(&security_id, "investor1").unwrap(),
3000
);
assert_eq!(
acc1400.balance_of_security(&security_id, "investor2").unwrap(),
2000
);
}
测试结果: ✅ 通过
测试3: 操作员授权
#[test]
fn test_acc1400_operator_authorization() {
// 授权操作员
acc1400.authorize_security_operator("investor1", "broker1");
// 发行证券
acc1400.issue_security(&security_id, "investor1", 1000).unwrap();
// 操作员代理转账
let result = acc1400.base.operator_transfer_by_partition(
"broker1",
"investor1",
"investor2",
500,
&security_id,
);
assert!(result.is_ok());
assert_eq!(
acc1400.balance_of_security(&security_id, "investor1").unwrap(),
500
);
assert_eq!(
acc1400.balance_of_security(&security_id, "investor2").unwrap(),
500
);
}
测试结果: ✅ 通过
测试4: 账户锁定
#[test]
fn test_acc1400_account_locking() {
// 发行证券
acc1400.issue_security(&security_id, "investor1", 1000).unwrap();
// 锁定账户
let future_time = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap()
.as_secs() + 3600;
acc1400.lock_security_account("investor1", future_time);
// 尝试转账应该失败
let result = acc1400.transfer_security("investor1", "investor2", 500, &security_id);
assert!(result.is_err());
// 解锁账户
acc1400.unlock_security_account("investor1");
// 现在转账应该成功
let result = acc1400.transfer_security("investor1", "investor2", 500, &security_id);
assert!(result.is_ok());
}
测试结果: ✅ 通过
测试5: 转账暂停
#[test]
fn test_acc1400_transfer_halt() {
// 发行证券
acc1400.issue_security(&security_id, "investor1", 1000).unwrap();
// 暂停转账
acc1400.halt_security_transfers();
// 尝试转账应该失败
let result = acc1400.transfer_security("investor1", "investor2", 500, &security_id);
assert!(result.is_err());
// 恢复转账
acc1400.resume_security_transfers();
// 现在转账应该成功
let result = acc1400.transfer_security("investor1", "investor2", 500, &security_id);
assert!(result.is_ok());
}
测试结果: ✅ 通过
🐛 发现的问题
问题1: 缺少证券特有功能
严重程度: ⚠️ 高
描述: ACC-1400应该有证券特有的功能,但目前只是ACC-1410的简单包装
缺失功能:
- ❌ 股息分配
- ❌ 投票权管理
- ❌ 转让限制(白名单/黑名单)
- ❌ 合规检查
- ❌ 强制赎回
- ❌ 证券信息查询
建议: 添加证券特有功能
impl Acc1400 {
/// 分配股息
pub fn distribute_dividend(
&mut self,
partition_id: &[u8; 32],
dividend_per_share: u64,
) -> Result<()> {
// 实现股息分配逻辑
}
/// 投票
pub fn vote(
&mut self,
partition_id: &[u8; 32],
voter: &str,
proposal_id: &str,
vote: bool,
) -> Result<()> {
// 实现投票逻辑
}
/// 检查转让合规性
pub fn check_transfer_compliance(
&self,
from: &str,
to: &str,
amount: u64,
partition_id: &[u8; 32],
) -> Result<bool> {
// 实现合规检查
}
/// 强制赎回
pub fn force_redeem(
&mut self,
partition_id: &[u8; 32],
account: &str,
amount: u64,
) -> Result<()> {
// 实现强制赎回
}
}
状态: ❌ 待实现
问题2: 缺少证券元数据
严重程度: ⚠️ 中等
描述: 没有存储证券的详细信息
建议: 添加证券元数据
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SecurityMetadata {
pub name: String,
pub symbol: String,
pub issuer: String,
pub issue_date: DateTime<Utc>,
pub maturity_date: Option<DateTime<Utc>>,
pub total_supply: u64,
pub par_value: u64,
pub dividend_rate: Option<f64>,
pub voting_rights: bool,
pub transferable: bool,
pub regulatory_info: RegulatoryInfo,
}
impl Acc1400 {
pub fn set_security_metadata(
&mut self,
partition_id: &[u8; 32],
metadata: SecurityMetadata,
) -> Result<()> {
// 实现元数据设置
}
pub fn get_security_metadata(
&self,
partition_id: &[u8; 32],
) -> Result<SecurityMetadata> {
// 实现元数据查询
}
}
状态: ❌ 待实现
问题3: 缺少转让限制
严重程度: ⚠️ 高
描述: 证券转让应该有限制(如白名单、黑名单、锁定期等)
建议: 添加转让限制
#[derive(Debug, Clone)]
pub struct TransferRestriction {
pub whitelist: HashSet<String>,
pub blacklist: HashSet<String>,
pub min_holding_period: Duration,
pub max_holders: Option<usize>,
}
impl Acc1400 {
pub fn set_transfer_restriction(
&mut self,
partition_id: &[u8; 32],
restriction: TransferRestriction,
) -> Result<()> {
// 实现转让限制设置
}
pub fn check_transfer_allowed(
&self,
from: &str,
to: &str,
partition_id: &[u8; 32],
) -> Result<bool> {
// 检查是否允许转让
}
}
状态: ❌ 待实现
问题4: 缺少事件通知
严重程度: ⚠️ 中等
描述: 没有事件通知机制
建议: 添加事件
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum SecurityEvent {
Issued {
partition_id: [u8; 32],
to: String,
amount: u64,
},
Transferred {
partition_id: [u8; 32],
from: String,
to: String,
amount: u64,
},
DividendDistributed {
partition_id: [u8; 32],
dividend_per_share: u64,
},
Voted {
partition_id: [u8; 32],
voter: String,
proposal_id: String,
},
}
impl Acc1400 {
pub fn emit_event(&self, event: SecurityEvent) {
// 发送事件
}
}
状态: ❌ 待实现
问题5: 缺少监管报告
严重程度: ⚠️ 中等
描述: 没有生成监管报告的功能
建议: 添加监管报告
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RegulatoryReport {
pub partition_id: [u8; 32],
pub total_holders: usize,
pub total_supply: u64,
pub transfers: Vec<TransferRecord>,
pub dividends: Vec<DividendRecord>,
pub votes: Vec<VoteRecord>,
}
impl Acc1400 {
pub fn generate_regulatory_report(
&self,
partition_id: &[u8; 32],
start_time: DateTime<Utc>,
end_time: DateTime<Utc>,
) -> Result<RegulatoryReport> {
// 生成监管报告
}
}
状态: ❌ 待实现
📊 完成度评估
| 功能模块 | 代码行数 | 完成度 | 状态 |
|---|---|---|---|
| 基础结构 | 20行 | 100% | ✅ 完成 |
| 证券发行 | 30行 | 100% | ✅ 完成 |
| 证券转让 | 30行 | 100% | ✅ 完成 |
| 操作员管理 | 20行 | 100% | ✅ 完成 |
| 账户锁定 | 20行 | 100% | ✅ 完成 |
| 转账控制 | 20行 | 100% | ✅ 完成 |
| 股息分配 | 0行 | 0% | ❌ 未实现 |
| 投票权管理 | 0行 | 0% | ❌ 未实现 |
| 转让限制 | 0行 | 0% | ❌ 未实现 |
| 合规检查 | 0行 | 0% | ❌ 未实现 |
| 证券元数据 | 0行 | 0% | ❌ 未实现 |
| 事件通知 | 0行 | 0% | ❌ 未实现 |
| 监管报告 | 0行 | 0% | ❌ 未实现 |
| 测试覆盖 | 194行 | 80% | ✅ 良好 |
| 总计 | 334行 | 60% | ⚠️ 部分完成 |
待完善功能
-
高优先级:
- ❌ 股息分配
- ❌ 投票权管理
- ❌ 转让限制
- ❌ 合规检查
-
中优先级:
- ❌ 证券元数据
- ❌ 事件通知
- ❌ 强制赎回
-
低优先级:
- ❌ 监管报告
- ⏳ 完善文档
- ⏳ 添加更多测试
🌟 设计亮点
-
继承ACC-1410
- 复用分区功能
- 清晰的继承关系
- 易于扩展
-
完整的测试
- 5个测试用例
- 覆盖核心功能
- 全部通过
-
简洁的API
- 易于使用
- 符合直觉
- 良好的命名
🔗 模块依赖关系
nac-acc-1400
├── 依赖
│ ├── nac-acc-1410 (分区型资产)
│ ├── serde (序列化)
│ ├── sha3 (哈希)
│ └── chrono (时间)
└── 被依赖
└── 证券型DApp
📝 开发建议
短期目标 (1周)
-
添加股息分配 (优先级P1)
pub fn distribute_dividend( &mut self, partition_id: &[u8; 32], dividend_per_share: u64, ) -> Result<()> -
添加投票权管理 (优先级P1)
pub fn vote( &mut self, partition_id: &[u8; 32], voter: &str, proposal_id: &str, vote: bool, ) -> Result<()> -
添加转让限制 (优先级P1)
pub fn set_transfer_restriction( &mut self, partition_id: &[u8; 32], restriction: TransferRestriction, ) -> Result<()>
中期目标 (2周)
- 添加证券元数据 (优先级P2)
- 添加事件通知 (优先级P2)
- 添加合规检查 (优先级P2)
长期目标 (1个月)
- 添加监管报告 (优先级P3)
- 完善文档 (优先级P3)
- 添加更多测试 (优先级P3)
💡 使用示例
基础操作
use nac_acc_1400::*;
// 创建ACC-1400实例
let mut acc1400 = Acc1400::new();
// 创建普通股证券
let common_stock_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 security_id = acc1400.create_security_partition(
"ACME Corp Common Stock".to_string(),
common_stock_gnacs,
PartitionType::CommonStock,
)?;
// 发行证券
acc1400.issue_security(&security_id, "investor1", 10000)?;
// 转让证券
acc1400.transfer_security("investor1", "investor2", 2000, &security_id)?;
// 查询余额
let balance = acc1400.balance_of_security(&security_id, "investor1")?;
println!("余额: {}", balance);
操作员管理
// 授权经纪人
acc1400.authorize_security_operator("investor1", "broker1");
// 经纪人代理转账
acc1400.base.operator_transfer_by_partition(
"broker1",
"investor1",
"investor2",
500,
&security_id,
)?;
// 撤销授权
acc1400.revoke_security_operator("investor1", "broker1");
账户锁定
// 锁定账户1小时
let future_time = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap()
.as_secs() + 3600;
acc1400.lock_security_account("investor1", future_time);
// 提前解锁
acc1400.unlock_security_account("investor1");
转账控制
// 暂停所有转账
acc1400.halt_security_transfers();
// 恢复转账
acc1400.resume_security_transfers();
分析完成时间: 2026-02-18
下一步: 实现证券特有功能(股息、投票、转让限制等)