Tokeny to cyfrowe aktywa reprezentujące własność różnych kategorii dóbr. Tokenizacja umożliwia cyfryzację praw własności. Tokeny na Solanie nazywane są tokenami SPL (Solana Program Library).
Ta sekcja omawia podstawowe pojęcia dotyczące reprezentacji tokenów na Solanie. Zobacz sekcję Podstawy tokenów SPL po przykłady kodu.
Kluczowe informacje
-
Token Programy zawierają całą logikę instrukcji do interakcji z tokenami w sieci (zarówno zamiennymi, jak i niezamiennymi).
-
Mint Account reprezentuje konkretny token i przechowuje globalne metadane o tokenie, takie jak całkowita podaż i autorytet mint (adres uprawniony do tworzenia nowych jednostek tokena).
-
Token Account śledzi indywidualną własność tokenów dla konkretnego mint account i właściciela.
-
Associated Token Account to Token Account utworzony z adresem pochodzącym od adresów właściciela i mint account.
Token Programy
Ekosystem Solany posiada dwa główne Token Programy. Poniżej znajduje się kod źródłowy obu programów.
Token Program (Oryginalny)
- Podstawowe możliwości tokenów (mint, transfer itd.)
- Niezmienny i szeroko używany
Token Extension Program (Token 2022)
- Zawiera wszystkie funkcje oryginalnego Token Programu
- Dodaje funkcje poprzez "rozszerzenia"
Token Programy zawierają całą logikę instrukcji do interakcji z tokenami w sieci (zarówno zamiennymi, jak i niezamiennymi). Wszystkie tokeny na Solanie to w praktyce konta danych należące do Token Programu.
Token Program
Mint Account
Tokeny na Solanie są jednoznacznie identyfikowane przez adres Mint Account należący do Token Programu. To konto działa jako globalny licznik dla danego tokena i przechowuje takie dane jak:
- Supply: Całkowita podaż tokena
- Decimals: Precyzja dziesiętna tokena
- Mint authority: Konto uprawnione do tworzenia nowych jednostek tokena, zwiększając podaż
- Freeze authority: Konto uprawnione do zamrażania tokenów na Token Account, uniemożliwiając ich transfer lub spalanie
Konto mint
Pełne dane przechowywane na każdym koncie mint obejmują następujące informacje:
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>,}
Dla odniesienia, oto link do Solana Explorer z USDC Mint Account.
Konto tokena
Token Program tworzy Token Accounts, aby śledzić indywidualną własność każdej jednostki tokena. Token Account przechowuje dane takie jak:
- Mint: Token, którego jednostki przechowuje Token Account
- Owner: Konto uprawnione do transferu tokenów z Token Account
- Amount: Liczba tokenów aktualnie przechowywanych na Token Account
Konto tokena
Pełne dane przechowywane na każdym koncie tokena obejmują następujące informacje:
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>,}
Portfel potrzebuje osobnego konta tokena dla każdego tokena (mint), który chce przechowywać, z adresem portfela ustawionym jako właściciel konta tokena. Każdy portfel może posiadać wiele kont tokena dla tego samego tokena (mint), ale konto tokena może mieć tylko jednego właściciela i przechowywać jednostki tylko jednego tokena (mint).
Relacja kont
Zwróć uwagę, że dane każdego Token Account zawierają pole owner
identyfikujące, kto ma uprawnienia do zarządzania Token Account. Różni się to od
właściciela programu określonego w podstawowym typie
Account, którym jest Token Program dla
wszystkich Token Accounts.
Powiązane konto tokena
Powiązane konta tokenowe upraszczają proces znajdowania adresu konta tokenowego dla konkretnego mintu i właściciela. Możesz traktować powiązane konto tokenowe jako „domyślne” konto tokenowe dla danego mintu i właściciela.
Powiązane konto tokenowe jest tworzone z adresem wyprowadzonym z adresu właściciela i adresu konta mint. Ważne jest, aby zrozumieć, że powiązane konto tokenowe to po prostu konto tokenowe o określonym adresie.
To wprowadza kluczowe pojęcie w programowaniu na Solanie: Program Derived Address (PDA). PDA wyprowadza adres deterministycznie na podstawie zdefiniowanych danych wejściowych, co ułatwia znalezienie adresu konta.
Powiązane konto tokenowe
Pamiętaj, że każdy portfel potrzebuje własnego konta tokenowego, aby przechowywać tokeny z tego samego mintu.
Rozszerzone relacje kont
Przykłady Token CLI
spl-token CLI pomaga eksperymentować z tokenami SPL. Przykłady poniżej
wykorzystują terminal Solana Playground do
uruchamiania poleceń CLI bezpośrednio w przeglądarce, bez lokalnej instalacji.
Tworzenie tokenów i kont wymaga SOL na depozyty rentowe kont oraz opłaty
transakcyjne. Jeśli korzystasz z Solana Playground po raz pierwszy, utwórz
portfel Playground i uruchom polecenie solana airdrop w terminalu
Playground. Możesz też uzyskać SOL z devnetu z publicznego
web faucet.
$solana airdrop 2
Uruchom spl-token --help, aby zobaczyć wszystkie dostępne polecenia.
$spl-token --help
Aby zainstalować spl-token CLI lokalnie, uruchom:
$cargo install spl-token-cli
Więcej przykładów znajdziesz w spl-token
dokumentacji.
Adresy kont wyświetlane w twoim terminalu będą się różnić od poniższych
przykładów. Podczas wykonywania poleceń korzystaj z adresów z terminala
Playground. Na przykład polecenie create-token zwraca adres konta mint z
twoim portfelem Playground jako autorytetem mint.
Utwórz nowy token
Aby utworzyć nowy token (mint account), uruchom:
$spl-token create-token
Wynik wygląda następująco:
Creating token 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgAddress: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgDecimals: 9Signature: 44fvKfT1ezBUwdzrCys3fvCdFxbLMnNvBstds76QZyE6cXag5NupBprSXwxPTzzjrC3cA6nvUZaLFTvmcKyzxrm1
Nowy mint account zaczyna z zerową podażą. Sprawdź aktualną podaż poleceniem:
$spl-token supply <TOKEN_ADDRESS>
Polecenie supply dla nowego tokena zwraca 0:
spl-token supply 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Utworzenie nowego mint account wymaga transakcji z dwoma instrukcjami. Oto przykład w JavaScript na Solana Playground.
-
System Program tworzy nowe konto z miejscem na dane mint account i przenosi własność na Token Program.
-
Token Program inicjalizuje dane nowego konta jako mint account.
Utwórz konto tokena
Aby przechowywać tokeny danego mint, utwórz token account:
$spl-token create-account <TOKEN_ADDRESS>
Przykładowe polecenie:
spl-token create-account 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Wynik:
Creating account AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Signature: 2BtrynuCLX9CNofFiaw6Yzbx6hit66pup9Sk7aFjwU2NEbFz7NCHD9w9sWhrCfEd73XveAGK1DxFpJoQZPXU9tS1
Polecenie create-account tworzy associated token account z adresem twojego
portfela jako właścicielem.
Aby utworzyć token account z innym właścicielem:
$spl-token create-account --owner <OWNER_ADDRESS> <TOKEN_ADDRESS>
Uwaga: <TOKEN_ADDRESS> określa mint account dla token account.
Przykładowe polecenie:
spl-token create-account --owner 2i3KvjDCZWxBsqcxBHpdEaZYQwQSYE6LXUMx5VjY5XrR 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Wynik:
Creating account Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 44vqKdfzspT592REDPY4goaRJH3uJ3Ce13G4BCuUHg35dVUbHuGTHvqn4ZjYF9BGe9QrjMfe9GmuLkQhSZCBQuEt
Utworzenie associated token account wymaga jednej instrukcji, która wywołuje Associated Token Program. Oto przykład w JavaScript na Solana Playground.
Associated Token Program używa Cross Program Invocations do:
- Wywołania System Program w celu utworzenia nowego konta z użyciem podanego PDA jako adresu
- Wywołania Token Program w celu zainicjowania danych Token Account
Aby utworzyć nowe token account z nowym keypair zamiast adresu associated token account, wyślij transakcję z dwiema instrukcjami. Oto przykład w JavaScript na Solana Playground.
-
System Program tworzy nowe konto z miejscem na dane Token Account i przekazuje własność do Token Program.
-
Token Program inicjalizuje dane jako Token Account
Mintowanie tokenów
Aby utworzyć nowe jednostki tokena, mintuj tokeny na Token Account:
$spl-token mint [OPTIONS] <TOKEN_ADDRESS> <TOKEN_AMOUNT> [--] [RECIPIENT_TOKEN_ACCOUNT_ADDRESS]
Przykładowa komenda:
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100
Wynik:
Minting 100 tokensToken: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgRecipient: AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Signature: 2NJ1m7qCraPSBAVxbr2ssmWZmBU9Jc8pDtJAnyZsZJRcaYCYMqq1oRY1gqA4ddQno3g3xcnny5fzr1dvsnFKMEqG
Aby mintować tokeny na inne token account:
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 -- Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Wynik:
Minting 100 tokensToken: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgRecipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 3SQvNM3o9DsTiLwcEkSPT1Edr14RgE2wC54TEjonEP2swyVCp2jPWYWdD6RwXUGpvDNUkKWzVBZVFShn5yntxVd7
Instrukcja MintTo w Token Program tworzy nowe tokeny. Autorytet mint musi
podpisać transakcję. Instrukcja mintuje tokeny na Token Account i zwiększa
całkowitą podaż na Mint Account. Oto przykład w JavaScript na
Solana Playground.
Przesyłanie tokenów
Aby przesłać tokeny między token accounts:
spl-token transfer [OPTIONS] <TOKEN_ADDRESS> <TOKEN_AMOUNT> <RECIPIENT_ADDRESS or RECIPIENT_TOKEN_ACCOUNT_ADDRESS>
Przykładowa komenda:
spl-token transfer 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Wynik:
Transfer 100 tokensSender: AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Recipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 5y6HVwV8V2hHGLTVmTmdySRiEUCZnWmkasAvJ7J6m7JR46obbGKCBqUFgLpZu5zQGwM4Xy6GZ4M5LKd1h6Padx3o
Instrukcja Transfer w Token Program obsługuje transfery tokenów.
Właściciel konta tokenowego nadawcy musi podpisać transakcję. Instrukcja
przenosi tokeny pomiędzy kontami tokenowymi. Oto przykład w JavaScript na
Solana Playground.
Zarówno nadawca, jak i odbiorca muszą mieć konta tokenowe dla danego tokena (mint). Nadawca może dodać instrukcje tworzące konto tokenowe odbiorcy w tej samej transakcji.
Tworzenie metadanych tokena
Token Extensions Program pozwala przechowywać metadane (nazwa, symbol, link do obrazu) bezpośrednio na Mint Account.
Aby utworzyć token z rozszerzeniem metadanych:
spl-token create-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb --enable-metadata
Wynik:
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
Aby zainicjować metadane:
spl-token initialize-metadata <TOKEN_MINT_ADDRESS> <YOUR_TOKEN_NAME> <YOUR_TOKEN_SYMBOL> <YOUR_TOKEN_URI>
Token URI prowadzi do metadanych poza łańcuchem. Przykładowy format JSON znajdziesz tutaj.
Przykładowa komenda:
spl-token initialize-metadata BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP "TokenName" "TokenSymbol" "https://raw.githubusercontent.com/solana-developers/opos-asset/main/assets/DeveloperPortal/metadata.json"
Zobacz metadane w Solana Explorer.
Dowiedz się więcej w Przewodniku po rozszerzeniu metadanych. Szczegóły dotyczące Token Extensions znajdziesz w Przewodniku dla początkujących oraz w dokumentacji SPL.
Is this page helpful?