Перейти к основному содержимому

SAVITRI-1155: Стандарт мультиактивных токенов

SAVITRI-1155 (SMA — Savitri Multi Asset) — стандарт мультиактивных токенов для Savitri Network, аналог ERC-1155 в Ethereum. Он поддерживает как взаимозаменяемые, так и невзаимозаменяемые токены в рамках одного контракта с эффективными пакетными операциями.

Интерфейс

ФункцияПараметрыВозвращаетОписание
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. Минимизация декодирования адресов за счёт повторного использования декодированных адресов в операциях