ERC-1155 Multi-Token-Standard
Einführung
Eine Standardschnittstelle für Verträge, die mehrere Token-Typen verwalten. Ein einzelner bereitgestellter Vertrag kann eine beliebige Kombination aus fungiblen Token, nicht-fungiblen Token oder anderen Konfigurationen (z. B. semi-fungiblen Token) enthalten.
Was ist mit Multi-Token-Standard gemeint?
Die Idee ist einfach und zielt darauf ab, eine Smart-Contract-Schnittstelle zu schaffen, die eine beliebige Anzahl von fungiblen und nicht-fungiblen Token-Typen darstellen und steuern kann. Auf diese Weise kann der ERC-1155-Token dieselben Funktionen wie ein ERC-20- und ein ERC-721-Token ausführen, und sogar beides gleichzeitig. Er verbessert die Funktionalität sowohl des ERC-20- als auch des ERC-721-Standards, macht sie effizienter und korrigiert offensichtliche Implementierungsfehler.
Der ERC-1155-Token wird vollständig in EIP-1155 (opens in a new tab) beschrieben.
Voraussetzungen
Um diese Seite besser zu verstehen, empfehlen wir dir, zuerst über Token-Standards, ERC-20 und ERC-721 zu lesen.
ERC-1155 Funktionen und Merkmale:
- Batch-Transfer: Transfer mehrerer Vermögenswerte in einem einzigen Aufruf.
- Batch-Kontostand: Abrufen der Kontostände mehrerer Vermögenswerte in einem einzigen Aufruf.
- Batch-Genehmigung: Alle Token für eine Adresse genehmigen.
- Hooks: Hook für den Empfang von Token.
- NFT-Unterstützung: Wenn das Angebot nur 1 beträgt, wird es als NFT behandelt.
- Sichere Transferregeln: Regelwerk für einen sicheren Transfer.
Batch-Transfers
Der Batch-Transfer funktioniert sehr ähnlich wie reguläre ERC-20-Transfers. Schauen wir uns die reguläre ERC-20-Funktion transferFrom an:
// ERC-20
function transferFrom(address from, address to, uint256 value) external returns (bool);
// ERC-1155
function safeBatchTransferFrom(
address _from,
address _to,
uint256[] calldata _ids,
uint256[] calldata _values,
bytes calldata _data
) external;
Der einzige Unterschied bei ERC-1155 besteht darin, dass wir die Werte als Array übergeben und zusätzlich ein Array von IDs übergeben. Wenn beispielsweise ids=[3, 6, 13] und values=[100, 200, 5] gegeben sind, sehen die resultierenden Transfers wie folgt aus:
- Transfer von 100 Token mit der ID 3 von
_froman_to. - Transfer von 200 Token mit der ID 6 von
_froman_to. - Transfer von 5 Token mit der ID 13 von
_froman_to.
In ERC-1155 haben wir nur transferFrom, kein transfer. Um es wie ein reguläres transfer zu verwenden, setze einfach die Absenderadresse (from) auf die Adresse, die die Funktion aufruft.
Batch-Kontostand
Der entsprechende ERC-20-Aufruf balanceOf hat ebenfalls seine Partnerfunktion mit Batch-Unterstützung. Zur Erinnerung, dies ist die ERC-20-Version:
// ERC-20
function balanceOf(address owner) external view returns (uint256);
// ERC-1155
function balanceOfBatch(
address[] calldata _owners,
uint256[] calldata _ids
) external view returns (uint256[] memory);
Noch einfacher ist es beim Kontostandsaufruf: Wir können mehrere Kontostände in einem einzigen Aufruf abrufen. Wir übergeben das Array der Eigentümer, gefolgt vom Array der Token-IDs.
Wenn beispielsweise _ids=[3, 6, 13] und _owners=[0xbeef..., 0x1337..., 0x1111...] gegeben sind, lautet der Rückgabewert:
[
balanceOf(0xbeef...),
balanceOf(0x1337...),
balanceOf(0x1111...)
]
Batch-Genehmigung
// ERC-1155
function setApprovalForAll(
address _operator,
bool _approved
) external;
function isApprovedForAll(
address _owner,
address _operator
) external view returns (bool);
Die Genehmigungen unterscheiden sich geringfügig von ERC-20. Anstatt bestimmte Beträge zu genehmigen, setzt man einen Operator über setApprovalForAll auf genehmigt oder nicht genehmigt.
Das Auslesen des aktuellen Status kann über isApprovedForAll erfolgen. Wie du sehen kannst, handelt es sich um eine Alles-oder-Nichts-Operation. Du kannst nicht festlegen, wie viele Token oder gar welche Token-Klasse genehmigt werden sollen.
Dies ist absichtlich im Hinblick auf Einfachheit so konzipiert. Du kannst nur alles für eine Adresse genehmigen.
Empfangs-Hook
function onERC1155BatchReceived(
address _operator,
address _from,
uint256[] calldata _ids,
uint256[] calldata _values,
bytes calldata _data
) external returns(bytes4);
Aufgrund der Unterstützung von EIP-165 (opens in a new tab) unterstützt ERC-1155 Empfangs-Hooks nur für Smart Contracts. Die Hook-Funktion muss einen magischen, vordefinierten bytes4-Wert zurückgeben, der wie folgt lautet:
bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))
Wenn der empfangende Vertrag diesen Wert zurückgibt, wird davon ausgegangen, dass der Vertrag den Transfer akzeptiert und weiß, wie er mit den ERC-1155-Token umgehen muss. Großartig, keine in einem Vertrag feststeckenden Token mehr!
NFT-Unterstützung
Wenn das Angebot nur eins beträgt, ist der Token im Wesentlichen ein nicht-fungibler Token (NFT). Und wie bei ERC-721 üblich, kannst du eine Metadaten-URL definieren. Die URL kann von Clients gelesen und geändert werden, siehe hier (opens in a new tab).
Sichere Transferregel
Wir haben in den vorherigen Erklärungen bereits einige sichere Transferregeln angesprochen. Aber schauen wir uns die wichtigsten dieser Regeln an:
- Der Aufrufer muss genehmigt sein, die Token für die Adresse
_fromauszugeben, oder der Aufrufer muss gleich_fromsein. - Der Transfer-Aufruf muss rückgängig gemacht werden, wenn
- die Adresse
_to0 ist. - die Länge von
_idsnicht mit der Länge von_valuesübereinstimmt. - einer der Kontostände der Inhaber für Token in
_idsniedriger ist als die entsprechenden Beträge in_values, die an den Empfänger gesendet werden. - ein anderer Fehler auftritt.
- die Adresse
Hinweis: Alle Batch-Funktionen einschließlich des Hooks existieren auch als Versionen ohne Batch. Dies geschieht aus Gründen der Gas-Effizienz, da der Transfer von nur einem Vermögenswert wahrscheinlich immer noch die am häufigsten verwendete Methode sein wird. Wir haben sie der Einfachheit halber in den Erklärungen weggelassen, einschließlich der sicheren Transferregeln. Die Namen sind identisch, entferne einfach das „Batch“.