Vai al contenuto principale

Aiuta ad aggiornare questa pagina

🌏

C'è una nuova versione di questa pagina, ma al momento è solo in inglese. Aiutaci a tradurre l'ultima versione.

Traduci la pagina
Visualizza in inglese

Nessun bug qui!🐛

Questa pagina non è stata tradotta. Per il momento, è stata intenzionalmente lasciata in inglese.

Standard Multi-Token ERC-1155

Ultima modifica: , Invalid DateTime
Modifica la pagina

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 gli smart contract in grado di 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. E soprattutto, migliorare la funzionalità di entrambi gli standard, rendendola più efficiente, e correggendo evidenti errori di implementazione sugli standard ERC-20 e ERC-721.

Il token ERC-1155 è descritto nella sua interezza in EIP-1155.

Prerequisiti

Per comprendere meglio questa pagina, consigliamo innanzi tutto di leggere token standards, ERC-20, and ERC-721.

ERC-1155 Funzioni e caratteristiche:

Trasferimenti in batch

Il trasferimento in batch funziona in modo molto simile ai normali trasferimenti ERC-20. Diamo un'occhiata alla normale funzione transferFrom di ERC-20:

1// ERC-20
2function transferFrom(address from, address to, uint256 value) external returns (bool);
3
4// ERC-1155
5function safeBatchTransferFrom(
6 address _from,
7 address _to,
8 uint256[] calldata _ids,
9 uint256[] calldata _values,
10 bytes calldata _data
11) external;
12
Mostra tutto
📋 Copia

L'unica differenza in ERC-1155 è che passiamo i valori come un array e passiamo anche un array di id. Per esempio, dati ids=[3, 6, 13] e values=[100, 200, 5], i trasferimenti risultanti saranno

  1. Trasferisci 100 token con id 3 da _from a _to.
  2. Trasferisci 200 token con id 6 da _from a _to.
  3. 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-20
2function balanceOf(address owner) external view returns (uint256);
3
4// ERC-1155
5function balanceOfBatch(
6 address[] calldata _owners,
7 uint256[] calldata _ids
8) external view returns (uint256[] memory);
9
📋 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]
6
📋 Copia

Approvazione del batch

1// ERC-1155
2function setApprovalForAll(
3 address _operator,
4 bool _approved
5) external;
6
7function isApprovedForAll(
8 address _owner,
9 address _operator
10) external view returns (bool);
11
Mostra tutto
📋 Copia

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 potete vedere, è vale il principio del "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 _data
7) external returns(bytes4);
8
📋 Copia

Dato il supporto a EIP-165, i supporti di ERC-1155 ricevono hook solo per gli smart contract. La funzione di hook deve restituire un valore bytes4 magico predefinito dato come:

1bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))
2
📋 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.

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:

  1. il chiamante dev'esser approvato per spendere i token per l'indirizzo _from o il chiamante dev'esser pari a _from.
  2. la chiamata di trasferimento deve ripristinarsi se
    1. l'indirizzo _to è 0.
    2. la lunghezza di _ids non è pari alla lunghezza di _values.
    3. uno qualsiasi dei saldi dei titolari per i token in _ids è inferiore ai rispettivi importi in _values inviati al destinatario.
    4. si verifica qualsiasi altro errore.

Nota: tutte le funzioni batch compreso l'hook esistono anche come versioni senza batch. Questo è fatto per ragioni di efficienza nell’uso del carburante, considerando che il trasferimento di un solo bene sarà probabilmente ancora la modalità più comunemente utilizzato. Li abbiamo esclusi per semplicità nelle spiegazioni, lo stesso vale per le regole di trasferimento sicure. I nomi sono identici, basta rimuovere 'Batch'.

Letture consigliate

Questo articolo è stato utile?

👈

Indietro

ERC-777

Avanti

ERC-4626
👉