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ón | Parámetros | Retorna | Descripción |
|---|---|---|---|
balance_of | owner, id | u128 | Saldo de un token específico para un propietario |
balance_of_batch | owners[], ids[] | u128[] | Consulta de saldo por lote |
safe_transfer_from | from, to, id, amount, data | Result | Transferir tokens |
safe_batch_transfer_from | from, to, ids[], amounts[], data | Result | Transferencia por lote |
set_approval_for_all | operator, approved | Result | Aprobar operador para todos los tokens |
is_approved_for_all | owner, operator | bool | Verificar 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
| Evento | Campos | Descripción |
|---|---|---|
TransferSingle | operator, from, to, id, amount | Transferencia de token individual |
TransferBatch | operator, from, to, ids[], amounts[] | Transferencia por lote |
ApprovalForAll | owner, operator, approved | Aprobación de operador modificada |
Casos de Uso
| Escenario | Tipo de Token | Ejemplo |
|---|---|---|
| Moneda en juego | Fungible (id=1) | 1000 monedas de oro |
| Objetos únicos | No fungible (amount=1) | Espada legendaria #42 |
| Semi-fungible | Suministro limitado | 50 copias de una carta rara |
| Recompensas | Fungible | Tokens de recompensa PoU |
| Certificados | No fungible | Certificación de validador |
Optimización por Lotes
La implementación de SAVITRI-1155 optimiza las operaciones por lote mediante:
- Pre-cálculo de todas las ranuras antes de leer el almacenamiento
- Aprovechamiento del caché de ContractStorage para evitar lecturas repetidas de la BD
- Cálculo independiente de ranuras que permite futuras lecturas paralelas
- Minimización de decodificación de direcciones reutilizando direcciones decodificadas entre operaciones