SAVITRI-1155:多资产代币标准
SAVITRI-1155(SMA -- Savitri Multi Asset)是 Savitri Network 的多资产代币标准,等同于以太坊的 ERC-1155。它在单个合约中同时支持同质化和非同质化代币,并提供高效的批量操作。
接口
| 函数 | 参数 | 返回值 | 描述 |
|---|---|---|---|
balance_of | owner, id | u128 | 某所有者的特定代币余额 |
balance_of_batch | owners[], ids[] | u128[] | 批量余额查询 |
safe_transfer_from | from, to, id, amount, data | Result | 转移代币 |
safe_batch_transfer_from | from, to, ids[], amounts[], data | Result | 批量转移 |
set_approval_for_all | operator, approved | Result | 为所有代币授权操作者 |
is_approved_for_all | owner, operator | bool | 检查操作者授权状态 |
存储布局
余额存储(槽 100+)
嵌套映射:balances[owner][id]
hash1 = keccak256(owner || 100)
hash2 = keccak256(id || hash1)
slot = first 8 bytes of hash2 as u64
操作者授权存储(槽 200+)
嵌套映射:operator_approvals[owner][operator]
hash1 = keccak256(owner || 200)
hash2 = keccak256(operator || hash1)
slot = first 8 bytes of hash2 as u64
该布局提供:
- 均匀分布:Keccak256 确保均匀的槽分布
- 无冲突:冲突概率可忽略不计
- 高效批量查询:每个槽独立计算
- 缓存友好:ContractStorage 缓存读取
使用方法
单次转移
use savitri_contracts::contracts::standards::savitri1155::SAVITRI1155;
SAVITRI1155::safe_transfer_from(
&mut contract_storage,
&storage,
&from, // [u8; 32]
&to, // [u8; 32]
1, // token id
100, // amount
&[], // data
&mut event_system,
Some(&mut gas_meter),
)?;
批量转移
SAVITRI1155::safe_batch_transfer_from(
&mut contract_storage,
&storage,
&from,
&to,
&[1, 2, 3], // token ids
&[100, 50, 1], // amounts
&[], // data
&mut event_system,
Some(&mut gas_meter),
)?;
批量余额查询
let balances = SAVITRI1155::balance_of_batch(
&contract_storage,
&storage,
&[owner1, owner2, owner3],
&[token_id_1, token_id_2, token_id_3],
)?;
操作者授权
// Approve an operator for all tokens
SAVITRI1155::set_approval_for_all(
&mut contract_storage,
&storage,
&owner,
&operator,
true, // approved
&mut event_system,
Some(&mut gas_meter),
)?;
// Check approval
let approved = SAVITRI1155::is_approved_for_all(
&contract_storage,
&storage,
&owner,
&operator,
)?;
事件
| 事件 | 字段 | 描述 |
|---|---|---|
TransferSingle | operator, from, to, id, amount | 单次代币转移 |
TransferBatch | operator, from, to, ids[], amounts[] | 批量转移 |
ApprovalForAll | owner, operator, approved | 操作者授权已变更 |
使用场景
| 场景 | 代币类型 | 示例 |
|---|---|---|
| 游戏货币 | 同质化(id=1) | 1000 金币 |
| 唯一物品 | 非同质化(amount=1) | 传奇之剑 #42 |
| 半同质化 | 限量供应 | 50 张稀有卡牌 |
| 奖励 | 同质化 | PoU 奖励代币 |
| 证书 | 非同质化 | 验证者认证 |
批量优化
SAVITRI-1155 实现通过以下方式优化批量操作:
- 预先计算所有槽,然后再读取存储
- 利用 ContractStorage 缓存,避免重复数据库读取
- 独立槽计算,支持未来的并行读取
- 最小化地址解码,在操作之间复用已解码的地址