Passa al contenuto principale

SAVITRI-1155: Standard Token Multi-Asset

SAVITRI-1155 (SMA -- Savitri Multi Asset) è lo standard per token multi-asset della Savitri Network, equivalente all'ERC-1155 di Ethereum. Supporta sia token fungibili che non fungibili in un unico contract con efficienti operazioni batch.

Interfaccia

FunzioneParametriRitornaDescrizione
balance_ofowner, idu128Saldo di un token specifico per un proprietario
balance_of_batchowners[], ids[]u128[]Interrogazione saldo batch
safe_transfer_fromfrom, to, id, amount, dataResultTrasferisce token
safe_batch_transfer_fromfrom, to, ids[], amounts[], dataResultTrasferimento batch
set_approval_for_alloperator, approvedResultApprova l'operatore per tutti i token
is_approved_for_allowner, operatorboolVerifica l'approvazione dell'operatore

Layout dello Storage

Storage dei Saldi (Slot 100+)

Mapping annidato: balances[owner][id]

hash1 = keccak256(owner || 100)
hash2 = keccak256(id || hash1)
slot = first 8 bytes of hash2 as u64

Storage Approvazione Operatore (Slot 200+)

Mapping annidato: operator_approvals[owner][operator]

hash1 = keccak256(owner || 200)
hash2 = keccak256(operator || hash1)
slot = first 8 bytes of hash2 as u64

Questo layout offre:

  • Distribuzione uniforme: Keccak256 garantisce una distribuzione uniforme degli slot
  • Nessuna collisione: Probabilità di collisione trascurabile
  • Query batch efficienti: Ogni slot viene calcolato in modo indipendente
  • Cache-friendly: ContractStorage memorizza le letture nella cache

Utilizzo

Trasferimento Singolo

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),
)?;

Trasferimento Batch

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),
)?;

Interrogazione Saldo Batch

let balances = SAVITRI1155::balance_of_batch(
&contract_storage,
&storage,
&[owner1, owner2, owner3],
&[token_id_1, token_id_2, token_id_3],
)?;

Approvazione Operatore

// Approva un operatore per tutti i token
SAVITRI1155::set_approval_for_all(
&mut contract_storage,
&storage,
&owner,
&operator,
true, // approved
&mut event_system,
Some(&mut gas_meter),
)?;

// Verifica l'approvazione
let approved = SAVITRI1155::is_approved_for_all(
&contract_storage,
&storage,
&owner,
&operator,
)?;

Eventi

EventoCampiDescrizione
TransferSingleoperator, from, to, id, amountTrasferimento token singolo
TransferBatchoperator, from, to, ids[], amounts[]Trasferimento batch
ApprovalForAllowner, operator, approvedApprovazione operatore modificata

Casi d'Uso

ScenarioTipo TokenEsempio
Valuta di giocoFungibile (id=1)1000 monete d'oro
Oggetti uniciNon fungibile (amount=1)Spada leggendaria #42
Semi-fungibileFornitura limitata50 copie di una carta rara
RicompenseFungibileToken ricompensa PoU
CertificatiNon fungibileCertificazione validatore

Ottimizzazione Batch

L'implementazione SAVITRI-1155 ottimizza le operazioni batch tramite:

  1. Pre-calcolo di tutti gli slot prima della lettura dello storage
  2. Utilizzo della cache ContractStorage per evitare letture ripetute dal DB
  3. Calcolo indipendente degli slot che abilita future letture parallele
  4. Minimizzazione della decodifica degli indirizzi riutilizzando gli indirizzi decodificati tra le operazioni