跳到主要内容

SAVITRI-1155:多资产代币标准

SAVITRI-1155(SMA -- Savitri Multi Asset)是 Savitri Network 的多资产代币标准,等同于以太坊的 ERC-1155。它在单个合约中同时支持同质化和非同质化代币,并提供高效的批量操作。

接口

函数参数返回值描述
balance_ofowner, idu128某所有者的特定代币余额
balance_of_batchowners[], ids[]u128[]批量余额查询
safe_transfer_fromfrom, to, id, amount, dataResult转移代币
safe_batch_transfer_fromfrom, to, ids[], amounts[], dataResult批量转移
set_approval_for_alloperator, approvedResult为所有代币授权操作者
is_approved_for_allowner, operatorbool检查操作者授权状态

存储布局

余额存储(槽 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,
)?;

事件

事件字段描述
TransferSingleoperator, from, to, id, amount单次代币转移
TransferBatchoperator, from, to, ids[], amounts[]批量转移
ApprovalForAllowner, operator, approved操作者授权已变更

使用场景

场景代币类型示例
游戏货币同质化(id=1)1000 金币
唯一物品非同质化(amount=1)传奇之剑 #42
半同质化限量供应50 张稀有卡牌
奖励同质化PoU 奖励代币
证书非同质化验证者认证

批量优化

SAVITRI-1155 实现通过以下方式优化批量操作:

  1. 预先计算所有槽,然后再读取存储
  2. 利用 ContractStorage 缓存,避免重复数据库读取
  3. 独立槽计算,支持未来的并行读取
  4. 最小化地址解码,在操作之间复用已解码的地址