386 lines
7.9 KiB
Markdown
386 lines
7.9 KiB
Markdown
# ACC-721 唯一资产证书协议使用指南
|
||
|
||
## 概述
|
||
|
||
ACC-721是NAC原生的唯一资产证书协议,用于表示不可分割的唯一资产(如房地产、艺术品、收藏品等)。与ERC-721不同,ACC-721深度集成了NAC的核心特性,为RWA(Real World Assets)提供完整的链上管理能力。
|
||
|
||
## 核心特性
|
||
|
||
### NAC原生特性
|
||
|
||
1. **资产DNA** - 每个唯一资产都有独特的DNA,包含:
|
||
- DNA哈希(Blake3)
|
||
- 物理指纹(高精度扫描数据的哈希)
|
||
- 法律文件哈希
|
||
- 生成时间戳
|
||
|
||
2. **GNACS编码** - 48位全球原生资产链统一分类标准
|
||
- 资产类别编码
|
||
- 地理位置编码
|
||
- 合规级别编码
|
||
|
||
3. **主权类型** - 支持7种资产权利类型:
|
||
- A0: 完全所有权
|
||
- B1: 使用权
|
||
- C2: 收益权
|
||
- D2: 处置权
|
||
- E3: 担保权
|
||
- F4: 优先权
|
||
- G5: 其他权利
|
||
|
||
4. **托管系统** - 内置托管方信息:
|
||
- 托管方地址
|
||
- 托管开始时间
|
||
- 托管状态
|
||
- 托管证明哈希
|
||
|
||
5. **保险系统** - 内置保险信息:
|
||
- 保险方地址
|
||
- 保险金额(XTZH)
|
||
- 保险期限
|
||
- 保险单号
|
||
|
||
6. **估值系统** - 支持AI估值:
|
||
- 估值金额(XTZH)
|
||
- 估值提供者
|
||
- 估值时间
|
||
- 有效期
|
||
|
||
7. **碎片化** - NAC独有功能:
|
||
- 将唯一资产碎片化为可替代代币(ACC-20)
|
||
- 支持重组回唯一资产
|
||
- 碎片价格和数量可配置
|
||
|
||
8. **宪法收据** - 所有操作都生成宪法收据:
|
||
- 记录操作类型
|
||
- 记录参与方
|
||
- 记录时间戳
|
||
- 链上可验证
|
||
|
||
## 快速开始
|
||
|
||
### 1. 安装依赖
|
||
|
||
在 `Cargo.toml` 中添加:
|
||
|
||
```toml
|
||
[dependencies]
|
||
nac-sdk = "2.0.0"
|
||
nac-udm = "1.0.0"
|
||
tokio = { version = "1.0", features = ["full"] }
|
||
```
|
||
|
||
### 2. 创建客户端
|
||
|
||
```rust
|
||
use nac_sdk::client::NRPC3Client;
|
||
use nac_sdk::protocols::ACC721;
|
||
|
||
let client = NRPC3Client::new("https://rpc.newassetchain.io");
|
||
let acc721 = ACC721::new(client);
|
||
```
|
||
|
||
### 3. 铸造唯一资产
|
||
|
||
```rust
|
||
use nac_udm::primitives::{Address, Hash, Timestamp};
|
||
|
||
let asset_dna = acc721.mint_asset(
|
||
&certificate_address,
|
||
&owner_address,
|
||
asset_id,
|
||
"ipfs://QmMetadata123".to_string(),
|
||
physical_fingerprint,
|
||
legal_document_hash,
|
||
custodian_address,
|
||
insurer_address,
|
||
insurance_coverage,
|
||
insurance_expiry,
|
||
).await?;
|
||
|
||
println!("Asset DNA: {}", asset_dna.dna_hash.to_hex());
|
||
```
|
||
|
||
### 4. 转移资产
|
||
|
||
```rust
|
||
let receipt_hash = acc721.transfer_asset(
|
||
&certificate_address,
|
||
&from_address,
|
||
&to_address,
|
||
asset_id,
|
||
).await?;
|
||
|
||
println!("Constitutional Receipt: {}", receipt_hash.to_hex());
|
||
```
|
||
|
||
### 5. 碎片化资产
|
||
|
||
```rust
|
||
let pool = acc721.fragmentize_asset(
|
||
&certificate_address,
|
||
&owner_address,
|
||
asset_id,
|
||
1000, // 碎片数量
|
||
5_000_000_000_000_000u128, // 每个碎片价格(0.005 XTZH)
|
||
).await?;
|
||
|
||
println!("Fragment Token Address: {}", pool.fragment_token_address);
|
||
```
|
||
|
||
## API参考
|
||
|
||
### 核心方法
|
||
|
||
#### mint_asset()
|
||
|
||
铸造唯一资产。
|
||
|
||
**参数**:
|
||
- `certificate_address` - 证书地址
|
||
- `to` - 接收者地址
|
||
- `asset_id` - 资产ID
|
||
- `metadata_uri` - 资产元数据URI
|
||
- `physical_fingerprint` - 物理指纹哈希
|
||
- `legal_document_hash` - 法律文件哈希
|
||
- `custodian` - 托管方地址
|
||
- `insurer` - 保险方地址
|
||
- `insurance_coverage` - 保险金额(XTZH)
|
||
- `insurance_expiry` - 保险到期时间
|
||
|
||
**返回**:`AssetDNA`
|
||
|
||
#### transfer_asset()
|
||
|
||
转移资产。
|
||
|
||
**参数**:
|
||
- `certificate_address` - 证书地址
|
||
- `from` - 发送者地址
|
||
- `to` - 接收者地址
|
||
- `asset_id` - 资产ID
|
||
|
||
**返回**:宪法收据哈希
|
||
|
||
#### fragmentize_asset()
|
||
|
||
碎片化资产(将ACC-721转换为ACC-20)。
|
||
|
||
**参数**:
|
||
- `certificate_address` - 证书地址
|
||
- `owner` - 资产持有者地址
|
||
- `asset_id` - 资产ID
|
||
- `fragment_count` - 碎片总数
|
||
- `fragment_price` - 碎片价格(XTZH)
|
||
|
||
**返回**:`FragmentationPool`
|
||
|
||
### 查询方法
|
||
|
||
#### get_asset_holder()
|
||
|
||
获取资产持有者。
|
||
|
||
**参数**:
|
||
- `certificate_address` - 证书地址
|
||
- `asset_id` - 资产ID
|
||
|
||
**返回**:持有者地址
|
||
|
||
#### get_asset_dna()
|
||
|
||
获取资产DNA。
|
||
|
||
**参数**:
|
||
- `certificate_address` - 证书地址
|
||
- `asset_id` - 资产ID
|
||
|
||
**返回**:`AssetDNA`
|
||
|
||
#### get_asset_metadata()
|
||
|
||
获取资产元数据URI。
|
||
|
||
**参数**:
|
||
- `certificate_address` - 证书地址
|
||
- `asset_id` - 资产ID
|
||
|
||
**返回**:元数据URI字符串
|
||
|
||
#### get_custody_info()
|
||
|
||
获取托管信息。
|
||
|
||
**参数**:
|
||
- `certificate_address` - 证书地址
|
||
- `asset_id` - 资产ID
|
||
|
||
**返回**:`CustodyInfo`
|
||
|
||
#### get_insurance_info()
|
||
|
||
获取保险信息。
|
||
|
||
**参数**:
|
||
- `certificate_address` - 证书地址
|
||
- `asset_id` - 资产ID
|
||
|
||
**返回**:`InsuranceInfo`
|
||
|
||
#### get_asset_valuation()
|
||
|
||
获取资产估值。
|
||
|
||
**参数**:
|
||
- `certificate_address` - 证书地址
|
||
- `asset_id` - 资产ID
|
||
|
||
**返回**:`AssetValuation`
|
||
|
||
### 管理方法
|
||
|
||
#### approve_asset()
|
||
|
||
授权资产。
|
||
|
||
**参数**:
|
||
- `certificate_address` - 证书地址
|
||
- `owner` - 资产持有者地址
|
||
- `approved` - 被授权者地址
|
||
- `asset_id` - 资产ID
|
||
|
||
#### burn_asset()
|
||
|
||
销毁资产。
|
||
|
||
**参数**:
|
||
- `certificate_address` - 证书地址
|
||
- `owner` - 资产持有者地址
|
||
- `asset_id` - 资产ID
|
||
|
||
#### update_valuation()
|
||
|
||
更新资产估值。
|
||
|
||
**参数**:
|
||
- `certificate_address` - 证书地址
|
||
- `asset_id` - 资产ID
|
||
- `valuation` - 新的资产估值
|
||
|
||
## 完整示例
|
||
|
||
查看 `examples/acc721_example.rs` 获取完整的使用示例。
|
||
|
||
运行示例:
|
||
|
||
```bash
|
||
cargo run --example acc721_example
|
||
```
|
||
|
||
## 测试
|
||
|
||
运行单元测试:
|
||
|
||
```bash
|
||
cargo test --test acc721_integration_test
|
||
```
|
||
|
||
运行集成测试(需要NAC节点):
|
||
|
||
```bash
|
||
cargo test --test acc721_integration_test -- --ignored
|
||
```
|
||
|
||
## 与ERC-721的区别
|
||
|
||
| 特性 | ERC-721 | ACC-721 |
|
||
|------|---------|---------|
|
||
| 基础功能 | ✅ | ✅ |
|
||
| 资产DNA | ❌ | ✅ |
|
||
| GNACS编码 | ❌ | ✅ |
|
||
| 主权类型 | ❌ | ✅ |
|
||
| 托管系统 | ❌ | ✅ |
|
||
| 保险系统 | ❌ | ✅ |
|
||
| AI估值 | ❌ | ✅ |
|
||
| 碎片化 | ❌ | ✅ |
|
||
| 宪法收据 | ❌ | ✅ |
|
||
| RPC协议 | JSON-RPC | NRPC3.0 |
|
||
| 哈希算法 | Keccak256 | Blake3 |
|
||
|
||
## 最佳实践
|
||
|
||
### 1. 资产DNA生成
|
||
|
||
```rust
|
||
// 使用高精度扫描数据生成物理指纹
|
||
let scan_data = load_3d_scan_data("asset.obj");
|
||
let physical_fingerprint = Hash::sha3_384(&scan_data);
|
||
|
||
// 使用法律文件生成文件哈希
|
||
let legal_doc = load_legal_document("deed.pdf");
|
||
let legal_document_hash = Hash::sha3_384(&legal_doc);
|
||
```
|
||
|
||
### 2. 保险金额计算
|
||
|
||
```rust
|
||
// 保险金额应该以XTZH的最小单位(wei)表示
|
||
// 1 XTZH = 10^18 wei
|
||
let insurance_coverage_xtzh = 5.0; // 5 XTZH
|
||
let insurance_coverage = (insurance_coverage_xtzh * 1e18) as u128;
|
||
```
|
||
|
||
### 3. 碎片化策略
|
||
|
||
```rust
|
||
// 碎片数量应该根据资产价值和目标投资者确定
|
||
let asset_value_xtzh = 1_000_000u128; // 100万 XTZH
|
||
let target_fragment_price_xtzh = 1000u128; // 1000 XTZH per fragment
|
||
let fragment_count = (asset_value_xtzh / target_fragment_price_xtzh) as u64;
|
||
```
|
||
|
||
### 4. 估值更新频率
|
||
|
||
```rust
|
||
// 根据资产类型设置合理的估值有效期
|
||
let validity_period = match asset_type {
|
||
AssetType::RealEstate => 90 * 24 * 3600, // 90天
|
||
AssetType::Art => 180 * 24 * 3600, // 180天
|
||
AssetType::Commodity => 7 * 24 * 3600, // 7天
|
||
_ => 30 * 24 * 3600, // 默认30天
|
||
};
|
||
```
|
||
|
||
## 错误处理
|
||
|
||
```rust
|
||
use nac_sdk::error::{NACError, Result};
|
||
|
||
match acc721.mint_asset(...).await {
|
||
Ok(asset_dna) => {
|
||
println!("Asset minted: {}", asset_dna.dna_hash.to_hex());
|
||
}
|
||
Err(NACError::InvalidAddress(msg)) => {
|
||
eprintln!("Invalid address: {}", msg);
|
||
}
|
||
Err(NACError::ComplianceError(msg)) => {
|
||
eprintln!("Compliance check failed: {}", msg);
|
||
}
|
||
Err(e) => {
|
||
eprintln!("Error: {}", e);
|
||
}
|
||
}
|
||
```
|
||
|
||
## 相关资源
|
||
|
||
- [NAC SDK文档](../README.md)
|
||
- [ACC-20协议指南](./ACC20_GUIDE.md)
|
||
- [NRPC3.0协议规范](./NRPC3_SPEC.md)
|
||
- [GNACS编码标准](./GNACS_STANDARD.md)
|
||
- [NAC技术白皮书](https://newassetchain.io/whitepaper)
|
||
|
||
## 许可证
|
||
|
||
MIT License
|