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
| Funzione | Parametri | Ritorna | Descrizione |
|---|---|---|---|
balance_of | owner, id | u128 | Saldo di un token specifico per un proprietario |
balance_of_batch | owners[], ids[] | u128[] | Interrogazione saldo batch |
safe_transfer_from | from, to, id, amount, data | Result | Trasferisce token |
safe_batch_transfer_from | from, to, ids[], amounts[], data | Result | Trasferimento batch |
set_approval_for_all | operator, approved | Result | Approva l'operatore per tutti i token |
is_approved_for_all | owner, operator | bool | Verifica 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
| Evento | Campi | Descrizione |
|---|---|---|
TransferSingle | operator, from, to, id, amount | Trasferimento token singolo |
TransferBatch | operator, from, to, ids[], amounts[] | Trasferimento batch |
ApprovalForAll | owner, operator, approved | Approvazione operatore modificata |
Casi d'Uso
| Scenario | Tipo Token | Esempio |
|---|---|---|
| Valuta di gioco | Fungibile (id=1) | 1000 monete d'oro |
| Oggetti unici | Non fungibile (amount=1) | Spada leggendaria #42 |
| Semi-fungibile | Fornitura limitata | 50 copie di una carta rara |
| Ricompense | Fungibile | Token ricompensa PoU |
| Certificati | Non fungibile | Certificazione validatore |
Ottimizzazione Batch
L'implementazione SAVITRI-1155 ottimizza le operazioni batch tramite:
- Pre-calcolo di tutti gli slot prima della lettura dello storage
- Utilizzo della cache ContractStorage per evitare letture ripetute dal DB
- Calcolo indipendente degli slot che abilita future letture parallele
- Minimizzazione della decodifica degli indirizzi riutilizzando gli indirizzi decodificati tra le operazioni