
Plug-and-Play-Token-Erweiterungen
Einführung
Token-Erweiterungen erleichtern die Erstellung programmierbarer Token auf Solana. Entwickler können mit dem neuen Token Extensions Program mehr als ein Dutzend Mint- und Kontoerweiterungen kombinieren. In diesem Tutorial erstellst du fungible und nicht fungible Token, verzinsliche Token, eingefrorene Token und Token, über die du uneingeschränkte Kontrolle hast. Dazu gehört auch, sie aus Konten zu verschieben, die dir nicht gehören. Außerdem schließt du Mint-Konten, um Guthaben zurückzuerhalten.
Plug-and-Play-Token-Erweiterungen ist ein Tutorial mit interaktiven Beispielen in Solana Playground. Du lernst, mit TypeScript und Token-Erweiterungen die folgenden Token zu erstellen:
Der Code für dieses Tutorial basiert auf dem Solana Developer Guide. Skripte zum Erstellen von Token-Erweiterungen findest du im Abschnitt Weitere Ressourcen.
Konto für Token-Erweiterungen
Token-Erweiterungen ergänzen das Token Program um neue Anweisungen. Konten, die mit beiden Programmen erstellt wurden, sind bis zu einer bestimmten Anfangslänge identisch. Danach enden die Anweisungen des Token Program und die Anweisungen der Token-Erweiterungen beginnen. Wenn du mit Kontodaten noch nicht vertraut bist, findest du in einer Einführung in Anchor weitere Informationen zum Kontospeicher. Kurz gesagt: Beim Erstellen eines Kontos auf Solana musst du ausdrücklich Speicherplatz für die On-Chain-Daten reservieren. Anhand dieses Speicherplatzes können wir berechnen, wie viele Lamports nötig sind, damit das Konto von der Miete befreit ist.
So erstellst du ein Mint-Konto mit Erweiterungen. Verwende die Funktion getMintLen, um die Größe des Mint-Kontos einschließlich der Token-Erweiterungen zu ermitteln und den benötigten Speicherplatz zu reservieren. Im Beispiel NonFungibleToken.ts wird die Mint-Länge für die Erweiterungstypen MetadataPointer und MintCloseAuthority ermittelt.
NonFungibleToken.ts Zeile 54:
// Size of Mint Account with extension
const mintLen = getMintLen([
ExtensionType.MetadataPointer,
ExtensionType.MintCloseAuthority,
]);Mit den Erweiterungen Metadata und Metadata Pointer kannst du Metadaten speichern und darauf verweisen, ohne auf Protokolle von Drittanbietern angewiesen zu sein. TokenMetadata ist eine Schnittstelle aus @solana/spl-token-metadata mit Feldern wie updateAuthority, mint, name, symbol, uri und additionalMetadata. Die Länge der Metadaten wird ermittelt, indem die Funktion pack auf das Metadatenobjekt angewendet wird.
NonFungibleToken.ts Zeile 60:
// Metadata to store in Mint Account
const metaData: TokenMetadata = {
updateAuthority: updateAuthority,
mint: mint,
name: "Solana Soldier",
symbol: "SOLD",
uri: "https://shdw-drive.genesysgo.net/G1Tzt42SDqCV3x9vPY5X826foA8fEk8BR4bB5wARh75d/OIG2.jpg",
additionalMetadata: [["armor", null]],
};
// Size of metadata
const metadataLen = pack(metaData).length;
// Size of MetadataExtension 2 bytes for type, 2 bytes for length
const metadataExtension = TYPE_SIZE + LENGTH_SIZE;Addiere die Mint-Länge, die Metadatenerweiterung und die Metadatenlänge, um die Mindestanzahl an Lamports für das Mint-Konto zu ermitteln.
NonFungibleToken.ts Zeile 75:
// Minimum lamports required for Mint Account
const lamports = await connection.getMinimumBalanceForRentExemption(
mintLen + metadataExtension + metadataLen
);Anweisungen für Token-Erweiterungen
Solana-Bibliotheken wie @solana/spl-token und @solana/spl-token-metadata ergänzen das Token Extensions Program um TypeScript-Unterstützung. Erstelle zunächst mit SystemProgram aus @solana/web3.js ein Konto mit ausreichend Speicherplatz und genügend Lamports für die Mietbefreiung.
NonFungibleToken.ts Zeile 80:
// Instruction to invoke System Program to create new account
const createAccountInstruction = SystemProgram.createAccount({
fromPubkey: payer.publicKey, // Account that will transfer lamports to created account
newAccountPubkey: mint, // Address of the account to create
space: mintLen, // Amount of bytes to allocate to the created account
lamports, // Amount of lamports transferred to created account
programId: TOKEN_2022_PROGRAM_ID, // Program assigned as owner of created account
});Als Nächstes erstellen wir Anweisungen, um die Mint zu definieren. Die folgenden Anweisungen müssen ausgeführt werden, bevor initializeMint aufgerufen wird. Plug and Play verwendet vor der Mint-Erstellung diese Anweisungen:
- Metadata Pointer initialisieren: createInitializeMetadataPointerInstruction
- Mint Close Authority initialisieren: createInitializeMintCloseAuthorityInstruction
- Nicht übertragbare Mint initialisieren: createInitializeNonTransferableMintInstruction
- Permanent Delegate initialisieren: createInitializePermanentDelegateInstruction
- Mint für verzinsliche Token initialisieren: createInitializeInterestBearingMintInstruction
Metadatenkonten können unabhängig von initializeMint initialisiert und aktualisiert werden. Der Metadata Pointer muss jedoch vor der Mint initialisiert werden. Die Reihenfolge der Anweisungen in der Transaktion bestimmt ihre Ausführungsreihenfolge. Erstelle ein Mint-Konto und initialisiere den Metadata Pointer sowie anschließend die Mint Close Authority mit dem öffentlichen Schlüssel der Mint. Initialisiere danach die Mint- und Metadatenkonten und aktualisiere die zusätzlichen Metadaten.
NonFungibleToken.ts Zeile 135:
transaction = new Transaction().add(
createAccountInstruction,
initializeMetadataPointerInstruction,
initializeMintCloseAuthorityInstruction,
initializeMintInstruction,
initializeMetadataInstruction,
updateFieldInstruction
);Die Dateien nonFungibleToken.ts, soulboundToken.ts, interestBearingToken.ts und delegateToken.ts verwenden dieselbe Struktur zum Erstellen von Token. Sie unterscheiden sich lediglich bei den verwendeten Erweiterungen und Anweisungen.
Importiere zunächst alle benötigten Funktionen aus den erforderlichen Solana-Bibliotheken, definiere einen Zahler und generiere eine Mint-Adresse. Ermittle dann den benötigten Speicherplatz und die Anzahl der Lamports für die Mint-Adresse mit den gewünschten Token-Erweiterungen. Erstelle mit den Bibliotheken @solana/spl-token und @solana/spl-token-metadata die Anweisungen und füge sie einer Transaktion hinzu. Sende die Transaktion an das Netzwerk und prüfe die Ergebnisse.
Token-Vorgänge wie Übertragen und Verbrennen lassen sich mit verschiedenen Token-Erweiterungen verwenden. Token mit der Metadata Extension können Metadaten mit den Anweisungen createUpdateFieldInstruction beziehungsweise createRemoveKeyInstruction aktualisieren oder entfernen.
Plug and Play
In Solana Playground enthält der Client die benötigten Funktionen für die Interaktion mit Token-Erweiterungen. Der Soulbound-Token nutzt beispielsweise die Erweiterungen Non-Transferable und Metadata, um ein Soulbound-NFT zu erstellen. Funktionen zum Erstellen der Token und zur Interaktion mit ihnen sind in derselben Datei verfügbar und können importiert werden. In Solana Playground musst du den Code jedoch kopieren und einfügen, statt ihn zu importieren.
Mit der Datei quest.ts kannst du Solana Soldier spielen. Alternativ kannst du jede Datei mit Token-Erweiterungen ausführen, um ihre jeweilige Funktion zu sehen. Die Playground Wallet benötigt Devnet SOL, um die Quest auszuführen. Über unseren Solana Devnet Faucet kannst du dir ebenfalls Devnet SOL per Airdrop holen.
Die Quest beginnt mit der Erstellung eines Solana Soldier. Dabei handelt es sich um ein NFT, bei dem der Zahler (pg.wallet.keypair) die Mint Close Authority erhält. Dadurch kann der Zahler das Mint-Konto schließen und dessen SOL zurückfordern. Anwendungen können mit diesem Mechanismus SOL aus nicht mehr aktiven Konten zurückholen.
Nachdem du einen Solana Soldier erstellt hast, kannst du seine Mint-Adresse verwenden, um die Metadaten des NFT zu aktualisieren. Setzen wir die Rüstung des Soldaten auf iron. Die Funktionen getMetadata, updateMetadata und removeMetadata findest du ab Zeile 167 in der Datei NonFungibleToken.ts. Du kannst die Funktionen für Mint-Konten aufrufen, die die Metadata Extension verwenden. Der Einfachheit halber sind die Metadatenfunktionen nur in der Datei NonFungibleToken.ts enthalten.
Jetzt ist es Zeit für den Levelaufstieg. Ein verzinslicher Token stellt das Level des Solana Soldier dar. Importiere createInterestBearingToken aus InterestBearingToken.ts und erstelle mit dieser Anweisung den Token. Die Zinsen auf dem Konto steigen gemäß dem Zinssatz, der in Zeile 43 von InterestBearingToken.ts festgelegt ist. Mit der Funktion amountToUiAmount kannst du die Token-Menge einschließlich der aufgelaufenen Zinsen ermitteln. Die Zinsen sammeln sich im Laufe der Zeit an. Rufe amountToUiAmount auf, um das Level des Solana Soldier zu prüfen.
Sobald der Soldat im Level aufsteigt, braucht er eine Mission. Ein Soulbound-Token stellt diese Mission dar. Der Soldat kann ihn nicht übertragen. Versuche, den Fehler durch Aufrufen der Übertragungsfunktion abzufangen. Die Mission lässt sich nur durch Verbrennen des Tokens entfernen. Statt die Mission aufzugeben, sehen wir sie uns an. Tipp: Prüfe die Metadaten!
Nachdem du die Mission gelesen hast, stationiert das Plug-and-Play-Tutorial eine Armee an einer Token-Adresse. Der Solana Soldier muss die Armee nach der Stationierung der Token zurück zum Zahler rufen können. Token-Erweiterungen ermöglichen dies durch die Delegate Authority. Sie kann Token unabhängig von deren Eigentümer übertragen und verbrennen. Lege ein Schlüsselpaar, auf das du Zugriff hast, als Permanent Delegate fest. Dieses Schlüsselpaar muss das Verbrennen und Übertragen der Token signieren.
Delegate-Token stellen die Solana-Armee dar. Erstelle mit createDelegateTokens aus Zeile 33 von DelegateToken.ts Delegate-Token für das Token-Konto des Gegners. Sobald die Token gemintet wurden, treten die Solana-Armee und der Gegner in einer hypothetischen Schlacht gegeneinander an. Rufe die Soldaten nach der Schlacht mit der Funktion transferDelegateTokens aus Zeile 176 von DelegateTokens.ts vom Konto des Gegners zurück.
Beachte, dass nicht alle Soldaten von der Adresse des Gegners zurückgerufen wurden. Nehmen wir an, sie sind gefallen. Verwende die Funktion burn aus @solana/spl-token, um die verbleibenden Token im Token-Konto des Gegners (sourceTokenAccount) zu verbrennen.
Mit dem Sieg in der Schlacht endet die Quest des Solana Soldier. Die Funktion closeAccount aus @solana/spl-token wurde verwendet, um das Konto zu schließen und die Miete zurückzugeben. Zu den Token-Erweiterungen, die dieser Artikel nicht behandelt, gehören vertrauliche Übertragungen, Übertragungsgebühren und Transfer Hooks. Mit wenigen Ausnahmen lassen sich fast alle Token-Erweiterungen frei kombinieren. Zu diesen Ausnahmen gehören etwa Transfer Hooks und nicht übertragbare Token. Die Referenzprojekte in Solana Playground für die in diesem Tutorial behandelten Token-Erweiterungen sind unter Weitere Ressourcen verlinkt.
Fazit
Inspiriert von CryptoZombies behandelt dieses Plug-and-Play-Tutorial die Grundlagen zum Erstellen beliebter Token-Erweiterungen durch die Kombination mehrerer Erweiterungen. Das Tutorial veranschaulicht die Kombinierbarkeit von Token-Erweiterungen in einem praktischen Spielerlebnis. Du kannst die Beispiele direkt als Plug and Play verwenden oder als Leitfaden für die Entwicklung eigener Token nutzen. Von der Bestimmung der Kontogröße bis zur Reihenfolge der Anweisungen bieten die Beispiele einen optimierten Prozess zum Erstellen von Konten mit Token-Erweiterungen. Wenn dir das spielerische Lernerlebnis geholfen hat, teile dein Feedback in unserem Discord oder markiere @helius auf X.
Weitere Ressourcen
- Erste Schritte mit Token-Erweiterungen
- Solana Soldier auf Solana Playground
- Mint Close Authority | Solana Playground
- Nicht übertragbare Token | Solana Playground
- Verzinsliche Token | Solana Playground
- Permanent Delegate | Solana Playground
- Metadaten | Solana Playground
- Token Extensions auf GitHub
- Token Program auf GitHub
- SPL auf GitHub
Ähnliche Artikel
Helius abonnieren
Bleib bei der Solana-Entwicklung auf dem Laufenden und erhalte Updates, wenn wir neue Beiträge veröffentlichen


