Tokens sind digitale Vermögenswerte, die Eigentum an verschiedenen Kategorien von Vermögenswerten repräsentieren. Tokenisierung ermöglicht die Digitalisierung von Eigentumsrechten. Tokens auf Solana werden als SPL (Solana Program Library)-Tokens bezeichnet.
Dieser Abschnitt behandelt die grundlegenden Konzepte, wie Tokens auf Solana dargestellt werden. Siehe den Abschnitt SPL Token Basics für Codebeispiele.
Wichtige Punkte
-
Token Programs enthalten die gesamte Instruktionslogik für die Interaktion mit Tokens im Netzwerk (sowohl fungible als auch nicht-fungible).
-
Ein Mint Account repräsentiert einen bestimmten Token und speichert globale Metadaten über den Token, wie z. B. das Gesamtangebot und die Mint-Autorität (Adresse, die berechtigt ist, neue Einheiten eines Tokens zu erstellen).
-
Ein Token Account verfolgt das individuelle Eigentum an Tokens für einen bestimmten mint account für einen bestimmten Besitzer.
-
Ein Associated Token Account ist ein Token Account, der mit einer Adresse erstellt wurde, die von den Adressen des Besitzers und des mint accounts abgeleitet ist.
Token Programs
Das Solana-Ökosystem hat zwei Haupt-Token Programs. Quellcode für beide Programme unten.
Token Program (Original)
- Grundlegende Token-Funktionalität (mint, transfer, etc.)
- Unveränderlich und weit verbreitet
Token Extension Program (Token 2022)
- Enthält alle Funktionen des ursprünglichen Token Programs
- Fügt Funktionen durch "Extensions" hinzu
Token Programs enthalten die gesamte Instruktionslogik für die Interaktion mit Tokens im Netzwerk (sowohl fungible als auch nicht-fungible). Alle Tokens auf Solana sind effektiv Data Accounts, die einem Token Program gehören.
Token Program
Mint Account
Tokens auf Solana werden eindeutig durch die Adresse eines Mint Accounts identifiziert, der dem Token Program gehört. Dieses Konto fungiert als globaler Zähler für einen bestimmten Token und speichert Daten wie:
- Supply: Gesamtangebot des Tokens
- Decimals: Dezimale Genauigkeit des Tokens
- Mint authority: Das Konto, das berechtigt ist, neue Einheiten des Tokens zu erstellen und damit das Angebot zu erhöhen
- Freeze authority: Das Konto, das berechtigt ist, Tokens in einem token account einzufrieren und damit deren Übertragung oder Verbrennung zu verhindern
Mint Account
Die vollständigen Details, die auf jedem mint account gespeichert sind, umfassen Folgendes:
pub struct Mint {/// Optional authority used to mint new tokens. The mint authority may only/// be provided during mint creation. If no mint authority is present/// then the mint has a fixed supply and no further tokens may be/// minted.pub mint_authority: COption<Pubkey>,/// Total supply of tokens.pub supply: u64,/// Number of base 10 digits to the right of the decimal place.pub decimals: u8,/// Is `true` if this structure has been initializedpub is_initialized: bool,/// Optional authority to freeze token accounts.pub freeze_authority: COption<Pubkey>,}
Als Referenz findest du hier einen Solana Explorer Link zum USDC Mint Account.
Token account
Das Token Program erstellt Token accounts, um das individuelle Eigentum an jeder Token-Einheit zu verfolgen. Ein token account speichert Daten wie:
- Mint: Der Token, dessen Einheiten das token account hält
- Owner: Das Konto, das berechtigt ist, Tokens vom token account zu übertragen
- Amount: Anzahl der Tokens, die das token account derzeit hält
Token Account
Die vollständigen Details, die auf jedem token account gespeichert sind, umfassen Folgendes:
pub struct Account {/// The mint associated with this accountpub mint: Pubkey,/// The owner of this account.pub owner: Pubkey,/// The amount of tokens this account holds.pub amount: u64,/// If `delegate` is `Some` then `delegated_amount` represents/// the amount authorized by the delegatepub delegate: COption<Pubkey>,/// The account's statepub state: AccountState,/// If is_native.is_some, this is a native token, and the value logs the/// rent-exempt reserve. An Account is required to be rent-exempt, so/// the value is used by the Processor to ensure that wrapped SOL/// accounts do not drop below this threshold.pub is_native: COption<u64>,/// The amount delegatedpub delegated_amount: u64,/// Optional authority to close the account.pub close_authority: COption<Pubkey>,}
Eine Wallet benötigt ein token account für jeden Token (mint), den sie halten möchte, wobei die Wallet-Adresse als Eigentümer des token accounts festgelegt ist. Jede Wallet kann mehrere token accounts für denselben Token (mint) besitzen, aber ein token account kann nur einen Eigentümer haben und Einheiten eines Tokens (mint) halten.
Kontobeziehungen
Beachte, dass die Daten jedes token accounts ein owner-Feld enthalten, das
angibt, wer die Berechtigung über das token account hat. Dies unterscheidet sich
vom Programmeigentümer, der im
Basis-Konto-Typ angegeben ist, welcher für
alle token accounts das Token Program ist.
Associated token account
Associated Token Accounts vereinfachen den Prozess, die Adresse eines token account für einen bestimmten mint und Besitzer zu finden. Betrachten Sie den Associated Token Account als den "Standard"-token account für einen bestimmten mint und Besitzer.
Ein Associated Token Account wird mit einer Adresse erstellt, die aus der Adresse des Besitzers und der Adresse des mint account abgeleitet wird. Es ist wichtig zu verstehen, dass ein Associated Token Account lediglich ein token account mit einer bestimmten Adresse ist.
Dies führt zu einem Schlüsselkonzept in der Solana-Entwicklung ein: Program Derived Address (PDA). Eine PDA leitet eine Adresse deterministisch unter Verwendung vordefinierter Eingaben ab, was es einfach macht, die Adresse eines Konten zu finden.
Associated Token Account
Beachten Sie, dass jede Wallet ihren eigenen token account benötigt, um Token vom selben mint zu halten.
Accounts Relationship Expanded
Token CLI Beispiele
Die spl-token CLI hilft Ihnen, mit SPL-Token zu experimentieren. Die
folgenden Beispiele verwenden das
Solana Playground-Terminal, um CLI-Befehle direkt im
Browser ohne lokale Installation auszuführen.
Das Erstellen von Token und Konten erfordert SOL für rent-Einlagen und
Transaktionsgebühren. Für Solana Playground-Erstnutzer erstellen Sie eine
Playground-Wallet und führen den Befehl solana airdrop im
Playground-Terminal aus. Sie können auch devnet SOL vom öffentlichen
Web-Faucet erhalten.
$solana airdrop 2
Führen Sie spl-token --help aus, um alle verfügbaren Befehle anzuzeigen.
$spl-token --help
Um die spl-token CLI lokal zu installieren, führen Sie aus:
$cargo install spl-token-cli
Weitere Beispiele finden Sie in der spl-token
Dokumentation.
Die in Ihrer Terminal-Ausgabe angezeigten Kontenadressen unterscheiden sich von
den folgenden Beispielen. Verwenden Sie die Adressen aus Ihrem
Playground-Terminal, wenn Sie mitmachen. Beispielsweise gibt der Befehl
create-token eine mint account-Adresse mit Ihrer Playground-Wallet als
mint authority aus.
Einen neuen Token erstellen
Um einen neuen Token (mint account) zu erstellen, führen Sie aus:
$spl-token create-token
Die Ausgabe sieht folgendermaßen aus:
Creating token 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgAddress: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgDecimals: 9Signature: 44fvKfT1ezBUwdzrCys3fvCdFxbLMnNvBstds76QZyE6cXag5NupBprSXwxPTzzjrC3cA6nvUZaLFTvmcKyzxrm1
Ein neues mint account beginnt mit null Angebot. Überprüfen Sie das aktuelle Angebot mit:
$spl-token supply <TOKEN_ADDRESS>
Der supply Befehl für einen neuen Token gibt 0 zurück:
spl-token supply 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Das Erstellen eines neuen Mint Account erfordert eine Transaktion mit zwei Anweisungen. Hier ist ein Javascript-Beispiel auf Solana Playground.
-
Das System Program erstellt ein neues Konto mit Platz für die Mint Account Daten und überträgt die Eigentümerschaft an das Token Program.
-
Das Token Program initialisiert die Daten des neuen Konten als Mint Account
Token Account erstellen
Um Token eines bestimmten mint zu halten, erstellen Sie einen token account:
$spl-token create-account <TOKEN_ADDRESS>
Beispielbefehl:
spl-token create-account 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Ausgabe:
Creating account AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Signature: 2BtrynuCLX9CNofFiaw6Yzbx6hit66pup9Sk7aFjwU2NEbFz7NCHD9w9sWhrCfEd73XveAGK1DxFpJoQZPXU9tS1
Der create-account Befehl erstellt einen associated token account mit
Ihrer Wallet-Adresse als Eigentümer.
Um einen token account mit einem anderen Eigentümer zu erstellen:
$spl-token create-account --owner <OWNER_ADDRESS> <TOKEN_ADDRESS>
Hinweis: <TOKEN_ADDRESS> gibt das mint account für den token account an.
Beispielbefehl:
spl-token create-account --owner 2i3KvjDCZWxBsqcxBHpdEaZYQwQSYE6LXUMx5VjY5XrR 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Ausgabe:
Creating account Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 44vqKdfzspT592REDPY4goaRJH3uJ3Ce13G4BCuUHg35dVUbHuGTHvqn4ZjYF9BGe9QrjMfe9GmuLkQhSZCBQuEt
Das Erstellen eines Associated Token Account erfordert eine Anweisung, die das Associated Token Program aufruft. Hier ist ein Javascript-Beispiel auf Solana Playground.
Das Associated Token Program verwendet Cross Program Invocations, um:
- Das System Program aufzurufen, um ein neues Konto mit der bereitgestellten PDA als Adresse zu erstellen
- Das Token Program aufzurufen, um die Token Account Daten zu initialisieren
Um ein neues Token Account mit einem neuen Keypair anstelle einer Associated Token Account Adresse zu erstellen, senden Sie eine Transaktion mit zwei Anweisungen. Hier ist ein Javascript-Beispiel auf Solana Playground.
-
Das System Program erstellt ein neues Konto mit Platz für die Token Account Daten und überträgt die Eigentümerschaft an das Token Program.
-
Das Token Program initialisiert die Daten als Token Account
Tokens minten
Um neue Einheiten eines Tokens zu erstellen, minten Sie Tokens zu einem Token Account:
$spl-token mint [OPTIONS] <TOKEN_ADDRESS> <TOKEN_AMOUNT> [--] [RECIPIENT_TOKEN_ACCOUNT_ADDRESS]
Beispielbefehl:
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100
Ausgabe:
Minting 100 tokensToken: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgRecipient: AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Signature: 2NJ1m7qCraPSBAVxbr2ssmWZmBU9Jc8pDtJAnyZsZJRcaYCYMqq1oRY1gqA4ddQno3g3xcnny5fzr1dvsnFKMEqG
Um Tokens zu einem anderen Token Account zu minten:
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 -- Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Ausgabe:
Minting 100 tokensToken: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgRecipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 3SQvNM3o9DsTiLwcEkSPT1Edr14RgE2wC54TEjonEP2swyVCp2jPWYWdD6RwXUGpvDNUkKWzVBZVFShn5yntxVd7
Die MintTo Anweisung im Token Program erstellt neue Tokens. Die Mint
Authority muss die Transaktion signieren. Die Anweisung mintet Tokens zu einem
Token Account und erhöht den Gesamtvorrat im mint account. Hier ist ein
Javascript-Beispiel auf
Solana Playground.
Tokens übertragen
Um Tokens zwischen Token Accounts zu übertragen:
spl-token transfer [OPTIONS] <TOKEN_ADDRESS> <TOKEN_AMOUNT> <RECIPIENT_ADDRESS or RECIPIENT_TOKEN_ACCOUNT_ADDRESS>
Beispielbefehl:
spl-token transfer 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Ausgabe:
Transfer 100 tokensSender: AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Recipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 5y6HVwV8V2hHGLTVmTmdySRiEUCZnWmkasAvJ7J6m7JR46obbGKCBqUFgLpZu5zQGwM4Xy6GZ4M5LKd1h6Padx3o
Die Transfer Anweisung im Token Program verarbeitet Token-Transfers. Der
Eigentümer des Sender-Token-Kontos muss die Transaktion signieren. Die Anweisung
verschiebt Token zwischen Token-Konten. Hier ist ein Javascript-Beispiel auf
Solana Playground.
Sowohl Sender als auch Empfänger benötigen Token-Konten für den spezifischen Token (Mint). Der Sender kann Anweisungen zum Erstellen des Token-Kontos des Empfängers in derselben Transaktion einschließen.
Token-Metadaten erstellen
Das Token Extensions Program ermöglicht es Ihnen, Metadaten (Name, Symbol, Bild-Link) direkt auf dem Mint-Konto zu speichern.
Um einen Token mit Metadaten-Erweiterung zu erstellen:
spl-token create-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb --enable-metadata
Ausgabe:
Creating token BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP under program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEbTo initialize metadata inside the mint, please run `spl-token initialize-metadata BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP <YOUR_TOKEN_NAME> <YOUR_TOKEN_SYMBOL> <YOUR_TOKEN_URI>`, and sign with the mint authority.Address: BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczPDecimals: 9Signature: 5iQofFeXdYhMi9uTzZghcq8stAaa6CY6saUwcdnELST13eNSifiuLbvR5DnRt311frkCTUh5oecj8YEvZSB3wfai
Um die Metadaten zu initialisieren:
spl-token initialize-metadata <TOKEN_MINT_ADDRESS> <YOUR_TOKEN_NAME> <YOUR_TOKEN_SYMBOL> <YOUR_TOKEN_URI>
Die Token-URI verlinkt auf Off-Chain-Metadaten. Siehe ein Beispiel-JSON-Format hier.
Beispielbefehl:
spl-token initialize-metadata BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP "TokenName" "TokenSymbol" "https://raw.githubusercontent.com/solana-developers/opos-asset/main/assets/DeveloperPortal/metadata.json"
Sehen Sie sich die Metadaten im Solana Explorer an.
Erfahren Sie mehr im Metadata Extension Guide. Für Details zu Token Extensions siehe den Token Extensions Getting Started Guide und die SPL-Dokumentation.
Is this page helpful?