Tokeny na Solanie
Tokeny to cyfrowe aktywa, które reprezentują własność różnych kategorii zasobów. Tokenizacja umożliwia cyfryzację praw własności. Tokeny na Solanie są określane jako tokeny SPL (Solana Program Library).
Ta sekcja obejmuje podstawowe pojęcia dotyczące reprezentacji tokenów na Solanie. Zapoznaj się z sekcją Podstawy Tokenów SPL w celu uzyskania przykładów kodu.
Kluczowe punkty
-
Programy Tokenów zawierają całą logikę instrukcji do interakcji z tokenami w sieci (zarówno wymienialnymi, jak i niewymienialnymi).
-
Konto Mint reprezentuje konkretny token i przechowuje globalne metadane o tokenie, takie jak całkowita podaż i autorytet mint (adres upoważniony do tworzenia nowych jednostek tokena).
-
Konto Tokena śledzi indywidualną własność tokenów dla konkretnego konta mint dla konkretnego właściciela.
-
Powiązane Konto Tokena to Konto Tokena utworzone z adresem pochodzącym od adresów właściciela i konta mint.
Programy Tokenów
Ekosystem Solany posiada dwa główne Programy Tokenów. Kod źródłowy obu programów poniżej.
Program Tokenów (Oryginalny)
- Podstawowe funkcje tokenów (mint, transfer, itp.)
- Niezmienny i szeroko stosowany
Program Rozszerzeń Tokenów (Token 2022)
- Zawiera wszystkie funkcje oryginalnego Programu Tokenów
- Dodaje funkcje poprzez "rozszerzenia"
Programy Tokenów zawierają całą logikę instrukcji do interakcji z tokenami w sieci (zarówno wymienialnymi, jak i niewymienialnymi). Wszystkie tokeny na Solanie są w istocie kontami danych należącymi do Programu Tokenów.
Program Tokenów
Konto Mint
Tokeny na Solanie są unikalnie identyfikowane przez adres Konta Mint należącego do Programu Tokenów. To konto działa jako globalny licznik dla konkretnego tokena i przechowuje dane takie jak:
- Supply: Całkowita podaż tokena
- Decimals: Precyzja dziesiętna tokena
- Mint authority: Konto upoważnione do tworzenia nowych jednostek tokena, zwiększając podaż
- Freeze authority: Konto upoważnione do zamrażania tokenów na Koncie Tokena, uniemożliwiając ich transfer lub spalanie
Konto Mint
Pełne szczegóły 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 dla Konta Mint USDC.
Konto Tokena
Program Token tworzy Konta Tokenów do śledzenia indywidualnej własności każdej jednostki tokena. Konto Tokena przechowuje dane takie jak:
- Mint: Token, którego jednostki przechowuje Konto Tokena
- Owner: Konto upoważnione do transferu tokenów z Konta Tokena
- Amount: Liczba tokenów, które Konto Tokena obecnie przechowuje
Konto Tokena
Pełne szczegóły 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 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 tokenów dla tego samego tokena (mint), ale konto tokena może mieć tylko jednego właściciela i przechowywać jednostki jednego tokena (mint).
Relacja Kont
Zwróć uwagę, że dane każdego Konta Tokena zawierają pole owner
identyfikujące,
kto ma uprawnienia do Konta Tokena. Różni się to od właściciela programu
określonego w podstawowym typie Konto,
którym jest Program Token dla wszystkich Kont Tokenów.
Powiązane Konto Tokena
Powiązane Konta Tokenów upraszczają proces znajdowania adresu konta tokena dla określonego mint i właściciela. Można myśleć o Powiązanym Koncie Tokena jako o "domyślnym" koncie tokena dla określonego mint i właściciela.
Powiązane konto tokenowe (Associated Token Account) jest tworzone z adresem wyprowadzonym z adresu właściciela oraz adresu konta mint. Ważne jest, aby zrozumieć, że powiązane konto tokenowe to po prostu konto tokenowe z określonym adresem.
Wprowadza to kluczowe pojęcie w rozwoju Solany: Program Derived Address (PDA). PDA wyprowadza adres deterministycznie, używając zdefiniowanych wcześniej 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 mint.
Rozszerzone relacje kont
Przykłady Token CLI
CLI spl-token
pomaga eksperymentować z tokenami SPL. Poniższe przykłady
wykorzystują terminal Solana Playground do
uruchamiania poleceń CLI bezpośrednio w przeglądarce, bez potrzeby lokalnej
instalacji.
Tworzenie tokenów i kont wymaga SOL na depozyty czynszowe kont oraz opłaty
transakcyjne. Dla nowych użytkowników Solana Playground należy utworzyć portfel
Playground i uruchomić polecenie solana airdrop
w terminalu Playground.
Możesz również uzyskać devnet SOL z publicznego
kranu internetowego.
$solana airdrop 2
Uruchom spl-token --help
, aby zobaczyć wszystkie dostępne polecenia.
$spl-token --help
Aby zainstalować CLI spl-token
lokalnie, uruchom:
$cargo install spl-token-cli
Znajdź więcej przykładów w
dokumentacji CLI spl-token
.
Adresy kont wyświetlane w wynikach terminala różnią się od poniższych
przykładów. Użyj adresów z terminala Playground podczas wykonywania instrukcji.
Na przykład polecenie create-token
wyświetla adres konta mint z twoim
portfelem Playground jako autorytetem mint.
Utwórz nowy token
Aby utworzyć nowy token (konto mint), uruchom:
$spl-token create-token
Wynik wygląda następująco:
Creating token 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgAddress: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgDecimals: 9Signature: 44fvKfT1ezBUwdzrCys3fvCdFxbLMnNvBstds76QZyE6cXag5NupBprSXwxPTzzjrC3cA6nvUZaLFTvmcKyzxrm1
Nowe konto mint zaczyna z zerową podażą. Sprawdź aktualną podaż za pomocą:
$spl-token supply <TOKEN_ADDRESS>
Polecenie supply
dla nowego tokena zwraca 0
:
spl-token supply 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Utworzenie nowego konta Mint Account wymaga transakcji z dwoma instrukcjami. Oto przykład w JavaScript na Solana Playground.
-
Program System tworzy nowe konto z miejscem na dane konta 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 konkretnego mint, utwórz konto tokena:
$spl-token create-account <TOKEN_ADDRESS>
Przykładowe polecenie:
spl-token create-account 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Wynik:
Creating account AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Signature: 2BtrynuCLX9CNofFiaw6Yzbx6hit66pup9Sk7aFjwU2NEbFz7NCHD9w9sWhrCfEd73XveAGK1DxFpJoQZPXU9tS1
Polecenie create-account
tworzy powiązane konto tokena z adresem twojego
portfela jako właściciela.
Aby utworzyć konto tokena z innym właścicielem:
$spl-token create-account --owner <OWNER_ADDRESS> <TOKEN_ADDRESS>
Uwaga: <TOKEN_ADDRESS>
określa konto mint dla konta tokena.
Przykładowe polecenie:
spl-token create-account --owner 2i3KvjDCZWxBsqcxBHpdEaZYQwQSYE6LXUMx5VjY5XrR 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Wynik:
Creating account Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 44vqKdfzspT592REDPY4goaRJH3uJ3Ce13G4BCuUHg35dVUbHuGTHvqn4ZjYF9BGe9QrjMfe9GmuLkQhSZCBQuEt
Utworzenie powiązanego konta tokena 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 przy użyciu dostarczonego PDA jako adresu
- Wywołania Token Program w celu zainicjowania danych konta tokena.
Aby utworzyć nowe konto tokena (Token Account) z nowym keypair zamiast adresu powiązanego konta tokena (Associated Token Account), wyślij transakcję z dwoma instrukcjami. Oto przykład w Javascript na Solana Playground.
-
Program Systemowy (System Program) tworzy nowe konto z miejscem na dane konta tokena (Token Account) i przekazuje własność do Programu Tokenów (Token Program).
-
Program Tokenów (Token Program) inicjalizuje dane jako konto tokena (Token Account).
Mintowanie tokenów
Aby utworzyć nowe jednostki tokena, mintuj tokeny na konto tokena (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 konto tokena (Token Account):
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 -- Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Wynik:
Minting 100 tokensToken: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgRecipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 3SQvNM3o9DsTiLwcEkSPT1Edr14RgE2wC54TEjonEP2swyVCp2jPWYWdD6RwXUGpvDNUkKWzVBZVFShn5yntxVd7
Instrukcja MintTo
w Programie Tokenów (Token Program) tworzy nowe tokeny.
Autorytet mintowania (mint authority) musi podpisać transakcję. Instrukcja
mintuje tokeny na konto tokena (Token Account) i zwiększa całkowitą podaż na
koncie mint (Mint Account). Oto przykład w Javascript na
Solana Playground.
Transfer tokenów
Aby przenieść tokeny między kontami tokenów (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 Programie Tokenów (Token Program) obsługuje
transfery tokenów. Właściciel konta tokena nadawcy musi podpisać transakcję.
Instrukcja przenosi tokeny między kontami tokenów (Token Accounts). Oto przykład
w Javascript na
Solana Playground.
Zarówno nadawca, jak i odbiorca muszą mieć konta tokenów (Token Accounts) dla danego tokena (mint). Nadawca może dołączyć instrukcje tworzenia konta tokena odbiorcy w tej samej transakcji.
Tworzenie metadanych tokena
Program Token Extensions pozwala przechowywać metadane (nazwa, symbol, link do obrazu) bezpośrednio na koncie 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>
URI tokena prowadzi do metadanych poza łańcuchem. Zobacz przykładowy format JSON tutaj.
Przykładowe polecenie:
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 wprowadzającym oraz w dokumentacji SPL.
Is this page helpful?