ERC-1155 Token-Standard
Letzte Änderung: @Coram_Deo(opens in a new tab), 15. August 2023
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. halb-fungible Token) enthalten.
Was versteht man unter Multi-Token-Standard?
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 kontrollieren kann. Auf diese Weise kann der ERC-1155-Token die gleichen Funktionen erfüllen wie ein ERC-20- und ERC-721-Token, und sogar beide gleichzeitig. Und das Beste ist, dass die Funktionalität beider Standards verbessert wurde und somit effizienter ist, sowie offensichtliche Implementierungsfehler bei den Standards ERC-20 und ERC-721 korrigiert werden.
Der ERC-1155-Token wird in EIP-1155(opens in a new tab) ausführlich beschrieben.
Voraussetzungen
Um diese Seite besser zu verstehen, empfehlen wir Ihnen, zuerst etwas über Token-Standards, ERC-20 und ERC-721 zu lesen.
ERC-1155 Funktionen und Merkmale:
- Batch-Transfer: Übertragen Sie mehrere Assets in einem einzigen Schritt.
- Batch-Balance: Abrufen der Salden mehrerer Anlagen in einem einzigen Schritt.
- Batch-Genehmigung: Genehmige alle Token für eine Adresse.
- Haken: Haken für den Empfang von Token.
- NFT-Support: Wenn das Angebot nur 1 ist, wird es als NFT behandelt.
- Sichere Übertragungsregeln: Regelwerk für die sichere Übertragung.
Batch-Übertragungen
Die Batch-Übertragung funktioniert sehr ähnlich wie die regulären ERC-20-Übertragungen. Schaue Sie sich die reguläre ERC-20 Übertragung-von-Funktion an:
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;Alles anzeigenKopieren
Der einzige Unterschied bei ERC-1155 besteht darin, dass wir die Werte als Array übergeben und auch ein Array mit Id's übergeben. Wenn beispielsweise ids=[3, 6, 13]
und values=[100, 200, 5]
gegeben sind, werden die resultierenden Übertragungen wie folgt sein:
- Übertragung von 100 Token mit Id 3 von
_from
nach_to
. - Übertragung von 200 Token mit Id 6 von
_from
nach_to
. - Übertragung von 5 Token mit Id 13 von
_from
nach_to
.
In ERC-1155 haben wir nur Übertragung von
, keine Übertragung
. Um sie wie eine normale Übertragung
zu benutzen, setzen Sie einfach die Absenderadresse auf die Adresse, welche die Funktion aufruft.
Batch-Balance
Der entsprechende ERC-20 Balance-von
-Schritt hat ebenfalls eine Partnerfunktion mit Batch-Unterstützung. Zur Erinnerung: Dies ist die ERC-20-Version:
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);Kopieren
Bei der Abfrage des Saldos ist es sogar noch einfacher, denn wir können mehrere Salden in einem einzigen Schritt abrufen. Wir übergeben das Array der Besitzer, gefolgt von dem Array der Token-Ids.
Zum Beispiel wird bei _ids=[3, 6, 13]
und _owners=[0xbeef..., 0x1337..., 0x1111...]
, der Rückgabewert sein
1[2 balanceOf(0xbeef...),3 balanceOf(0x1337...),4 balanceOf(0x1111...)5]Kopieren
Batch-Genehmigung
1// ERC-11552function setApprovalForAll(3 address _operator,4 bool _approved5) external;67function isApprovedForAll(8 address _owner,9 address _operator10) external view returns (bool);Alles anzeigenKopieren
Die Genehmigungen unterscheiden sich geringfügig von denen des ERC-20. Anstatt bestimmte Beträge zu genehmigen, setzen Sie einen Operator über setApprovalForAll
auf genehmigt oder nicht genehmigt.
Der aktuelle Status kann über isApprovedForAll
ausgelesen werden. Wie Sie sehen, geht es um alles oder nichts. Sie können nicht festlegen, wie viele Token genehmigt werden und auch nicht, welche Token-Klasse.
Dies wurde absichtlich so einfach wie möglich gestaltet. Sie können alles nur für eine Adresse genehmigen.
Haken erhalten
1function onERC1155BatchReceived(2 address _operator,3 address _from,4 uint256[] calldata _ids,5 uint256[] calldata _values,6 bytes calldata _data7) external returns(bytes4);Kopieren
Angesichts der EIP-165(opens in a new tab)-Unterstützung unterstützt ERC-1155 nur Haken erhalten für Smart Contracts. Die Haken-Funktion muss einen magischen vordefinierten Bytes4-Wert zurückgeben, der wie folgt angegeben wird:
1bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))Kopieren
Wenn der empfangende Vertrag diesen Wert zurückgibt, wird davon ausgegangen, dass der Vertrag die Übertragung akzeptiert und weiß, wie er mit den ERC-1155-Token umgehen soll. Großartig, keine feststeckenden Token mehr in einem Vertrag!
NFT-Unterstützung
Wenn es nur eine Angebotsmenge gibt, ist der Token im Wesentlichen ein nicht-fungibler Token (NFT). Und wie bei ERC-721 üblich, können Sie eine Metadaten-URL definieren. Die URL kann von Clients gelesen und geändert werden, siehe hier(opens in a new tab).
Regel zur sicheren Übertragung
In den vorangegangenen Erläuterungen haben wir bereits einige Regeln für die sichere Übertragung angesprochen. Aber schauen wir uns die wichtigsten Regeln an:
- Dem Abfrager muss die Genehmigung erteilt werden, die Token für die
from
-Adresse auszugeben, oder der Abfrager muss gleichfrom
sein. - Der Übertragungsruf muss zurückgehen, wenn
_to
Adresse ist 0.- die Länge von
_ids
entspricht nicht der Länge von_Values
. - irgendein Guthaben des/der Token-Inhaber(s) in
_ids
ist niedriger als die entsprechenden Beträge in_Values
, die an den Empfänger gesendet werden. - Ein anderer Fehler tritt auf.
Hinweis: Alle Batch-Funktionen einschließlich des Hakens gibt es auch als Versionen ohne Batch. Dies geschieht aus Gründen der Gaseffizienz, da die Übertragung nur eines Vermögenswerts wahrscheinlich immer noch der am häufigsten genutzte Weg sein wird. Wir haben sie der Einfachheit halber in den Erläuterungen weggelassen, einschließlich der Regeln für die sichere Übertragung. Die Namen sind identisch, Sie müssen nur das „Batch" entfernen.