Standard Multi-Token ERC-1155
Ultima modifica: @Herbie_23(opens in a new tab), 15 agosto 2023
Introduzione
Un'interfaccia standard per i contratti che gestiscono più tipi di token. Un singolo contratto distribuito può includere qualsiasi combinazione di token fungibili, token non fungibili o altre configurazioni (ad esempio token semi-fungibili).
Cosa si intende per Standard Multi-Token?
L'idea è semplice e cerca di creare un'interfaccia per i contratti intelligenti, che possa rappresentare e controllare qualsiasi numero di tipi di token fungibili e non fungibili. In questo modo, il token ERC-1155 può svolgere le stesse funzioni di un token ERC-20 e ERC-721, e anche entrambi contemporaneamente. Migliora la funzionalità degli standard ERC-20 ed ERC-721, rendendola più efficiente e correggendo ovvi errori d'implementazione.
Il token ERC-1155 è descritto nella sua interezza in EIP-1155(opens in a new tab).
Prerequisiti
Per comprendere meglio questa pagina, consigliamo innanzi tutto di leggere token standards, ERC-20, and ERC-721.
ERC-1155 Funzioni e caratteristiche:
- Batch Transfer: trasferire più risorse con una singola chiamata.
- Batch Balance: richiedere i saldi di più risorse con una singola chiamata.
- Batch Approval: approvare tutti i token ad un indirizzo.
- Hook: ricevere l'hook dei token.
- Supporto NFT: Se la quantità è solo 1, trattatala come NFT.
- Regole di trasferimento sicure: insieme di regole per il trasferimento sicuro.
Trasferimenti in batch
Il trasferimento in batch funziona in modo molto simile ai normali trasferimenti ERC-20. Diamo un'occhiata alla normale funzione transferFrom
dell'ERC-20:
1// ERC-202function transferFrom(address from, address to, uint256 value) external returns (bool);34// ERC-11555function safeBatchTransferFrom(6 address _from,7 address _to,8 uint256[] calldata _ids,9 uint256[] calldata _values,10 bytes calldata _data11) external;Mostra tuttoCopia
La sola differenza in ERC-1155 è che passiamo i valori come un array e inoltre passiamo un array di ID. Per esempio, dati ids=[3, 6, 13]
e values=[100, 200, 5]
, i trasferimenti risultanti saranno
- Trasferisci 100 token con id 3 da
_from
a_to
. - Trasferisci 200 token con id 6 da
_from
a_to
. - Trasferisci 5 token con id 13 da
_from
a_to
.
In ERC-1155 abbiamo solo transferFrom
, non transfer
. Per usarlo come un normale transfer
, basta impostare l'indirizzo di provenienza all'indirizzo che sta chiamando la funzione.
Saldo Batch
La rispettiva chiamata dell'ERC-20 balanceOf
, ha la propria funzione partner con supporto al batch. Come promemoria, questa è la versione dell'ERC-20:
1// ERC-202function balanceOf(address owner) external view returns (uint256);34// ERC-11555function balanceOfBatch(6 address[] calldata _owners,7 uint256[] calldata _ids8) external view returns (uint256[] memory);Copia
Ancora più semplice per la chiamata del saldo, possiamo recuperare più saldi in una sola chiamata. Passiamo l'array di proprietari, seguito dall'array di id del token.
Per esempio, dati _ids=[3, 6, 13]
e _owners=[0xbeef..., 0x1337..., 0x1111...]
, il valore restituito sarà
1[2 balanceOf(0xbeef...),3 balanceOf(0x1337...),4 balanceOf(0x1111...)5]Copia
Approvazione del batch
1// ERC-11552function setApprovalForAll(3 address _operator,4 bool _approved5) external;67function isApprovedForAll(8 address _owner,9 address _operator10) external view returns (bool);Mostra tuttoCopia
Le approvazioni sono leggermente diverse da quelle dell'ERC-20. Invece di approvare quantità specifiche, si imposta un operatore come approvato o non approvato tramite setApprovalForAll
.
È possibile leggere lo stato corrente tramite isApprovedForAll
. Come puoi vedere, si tratta di un'operazione "o tutto o niente". Non è possibile definire quanti token o quale classe di token approvare.
Questo è intenzionalmente progettato pensando alla semplicità. È possibile solo approvare tutto per un indirizzo.
Ricevere Hook
1function onERC1155BatchReceived(2 address _operator,3 address _from,4 uint256[] calldata _ids,5 uint256[] calldata _values,6 bytes calldata _data7) external returns(bytes4);Copia
Dato il supporto all'EIP-165(opens in a new tab), i supporti di ERC-1155 ricevono hook solo per i contratti intelligenti. La funzione di hook deve restituire un valore bytes4 magico predefinito dato come:
1bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))Copia
Quando il contratto ricevente restituisce questo valore, si presume che il contratto accetti il trasferimento e sappia come gestire i token ERC-1155. Fantastico, niente più token bloccati in un contratto!
Supporto NFT
Quando la quantità è solo una, il token è essenzialmente un token non fungibile (NFT). E, come nel caso dello standard per l'ERC-721, è possibile definire un URL di metadati. L'URL può essere letto e modificato dai client, vedi qui(opens in a new tab).
Regola di trasferimento sicuro
Abbiamo già accennato ad alcune regole di trasferimento sicure già nelle spiegazioni precedenti. Ma diamo un'occhiata alla regola più importante:
- il chiamante dev'esser approvato per spendere i token per l'indirizzo
_from
o il chiamante dev'esser pari a_from
. - la chiamata di trasferimento deve ripristinarsi se
- l'indirizzo
_to
è 0. - la lunghezza di
_ids
non è pari alla lunghezza di_values
. - uno qualsiasi dei saldi dei titolari per i token in
_ids
è inferiore ai rispettivi importi in_values
inviati al destinatario. - si verifica qualsiasi altro errore.
- l'indirizzo
Nota: tutte le funzioni batch compreso l'hook esistono anche come versioni senza batch. Ciò avviene per l'efficienza del gas, considerando che trasferire una singola risorsa sarebbe comunque il metodo più usato. Li abbiamo esclusi per semplicità nelle spiegazioni, lo stesso vale per le regole di trasferimento sicure. I nomi sono identici, basta rimuovere 'Batch'.