Saltar al contenido principal

SAVITRI-1155: Estándar de Token Multi-Activo

SAVITRI-1155 (SMA -- Savitri Multi Asset) es el estándar de token multi-activo para Savitri Network, equivalente al ERC-1155 de Ethereum. Soporta tanto tokens fungibles como no fungibles en un único contrato con operaciones por lote eficientes.

Interfaz

FunciónParámetrosRetornaDescripción
balance_ofowner, idu128Saldo de un token específico para un propietario
balance_of_batchowners[], ids[]u128[]Consulta de saldo por lote
safe_transfer_fromfrom, to, id, amount, dataResultTransferir tokens
safe_batch_transfer_fromfrom, to, ids[], amounts[], dataResultTransferencia por lote
set_approval_for_alloperator, approvedResultAprobar operador para todos los tokens
is_approved_for_allowner, operatorboolVerificar aprobación del operador

Disposición del Almacenamiento

Almacenamiento de Saldos (Ranura 100+)

Mapeo anidado: balances[owner][id]

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

Almacenamiento de Aprobación de Operadores (Ranura 200+)

Mapeo anidado: operator_approvals[owner][operator]

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

Esta disposición proporciona:

  • Distribución uniforme: Keccak256 garantiza distribución uniforme de ranuras
  • Sin colisiones: Probabilidad de colisión despreciable
  • Consultas por lote eficientes: Cada ranura se calcula de forma independiente
  • Caché eficiente: ContractStorage almacena lecturas en caché

Uso

Transferencia Individual

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

Transferencia por Lote

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

Consulta de Saldo por Lote

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

Aprobación de Operador

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

Eventos

EventoCamposDescripción
TransferSingleoperator, from, to, id, amountTransferencia de token individual
TransferBatchoperator, from, to, ids[], amounts[]Transferencia por lote
ApprovalForAllowner, operator, approvedAprobación de operador modificada

Casos de Uso

EscenarioTipo de TokenEjemplo
Moneda en juegoFungible (id=1)1000 monedas de oro
Objetos únicosNo fungible (amount=1)Espada legendaria #42
Semi-fungibleSuministro limitado50 copias de una carta rara
RecompensasFungibleTokens de recompensa PoU
CertificadosNo fungibleCertificación de validador

Optimización por Lotes

La implementación de SAVITRI-1155 optimiza las operaciones por lote mediante:

  1. Pre-cálculo de todas las ranuras antes de leer el almacenamiento
  2. Aprovechamiento del caché de ContractStorage para evitar lecturas repetidas de la BD
  3. Cálculo independiente de ranuras que permite futuras lecturas paralelas
  4. Minimización de decodificación de direcciones reutilizando direcciones decodificadas entre operaciones