Tokeny na Solanie

Tokeny to cyfrowe aktywa, które reprezentują własność różnych kategorii aktywó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. Zobacz sekcję Podstawy tokenów SPL dla 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 uprawniony do tworzenia nowych jednostek tokena).

  • Konto tokenowe śledzi indywidualną własność tokenów dla konkretnego konta mint dla konkretnego właściciela.

  • Powiązane konto tokenowe to konto tokenowe utworzone z adresem wyprowadzonym z 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.

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ówProgram 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 uprawnione do tworzenia nowych jednostek tokena, zwiększając podaż
  • Freeze authority: Konto uprawnione do zamrażania tokenów na Koncie Tokena, uniemożliwiając ich transfer lub spalanie

Konto MintKonto Mint

Pełne szczegóły przechowywane na każdym Koncie Mint obejmują następujące dane:

Mint Account State
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 initialized
pub 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 uprawnione do transferu tokenów z Konta Tokena
  • Amount: Liczba tokenów, które Konto Tokena obecnie przechowuje

Konto TokenaKonto Tokena

Pełne szczegóły przechowywane na każdym Koncie Tokena obejmują następujące dane:

Token Account State
pub struct Account {
/// The mint associated with this account
pub 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 delegate
pub delegate: COption<Pubkey>,
/// The account's state
pub 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 delegated
pub 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).

Relacje kontRelacje 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 Tokena jest tworzone z adresem pochodzącym od adresu właściciela oraz adresu konta mint. Ważne jest, aby zrozumieć, że Powiązane Konto Tokena to po prostu konto tokena z określonym adresem.

Wprowadza to kluczowe pojęcie w rozwoju Solany: Program Derived Address (PDA). PDA deterministycznie wyprowadza adres przy użyciu zdefiniowanych wcześniej danych wejściowych, co ułatwia znalezienie adresu konta.

Powiązane Konto TokenaPowiązane Konto Tokena

Należy pamiętać, że każdy portfel potrzebuje własnego konta tokena, aby przechowywać tokeny z tego samego konta mint.

Rozszerzona Relacja KontRozszerzona Relacja Kont

Przykłady Token CLI

spl-token CLI pomaga eksperymentować z tokenami SPL. Poniższe przykłady korzystają z terminala Solana Playground, aby uruchamiać polecenia CLI bezpośrednio w przeglądarce bez konieczności lokalnej instalacji.

Tworzenie tokenów i kont wymaga SOL na depozyty za wynajem 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żna również uzyskać devnet SOL z publicznego kranika internetowego.

Terminal
$
solana airdrop 2

Uruchom spl-token --help, aby zobaczyć wszystkie dostępne polecenia.

Terminal
$
spl-token --help

Aby zainstalować lokalnie spl-token CLI, uruchom:

Terminal
$
cargo install spl-token-cli

Znajdź więcej przykładów w dokumentacji spl-token documentation.

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:

Terminal
$
spl-token create-token

Wynik wygląda następująco:

Terminal Output
Creating token 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Address: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Decimals: 9
Signature: 44fvKfT1ezBUwdzrCys3fvCdFxbLMnNvBstds76QZyE6cXag5NupBprSXwxPTzzjrC3cA6nvUZaLFTvmcKyzxrm1

Nowe konto mint zaczyna z zerową podażą. Sprawdź aktualną podaż za pomocą:

Terminal
$
spl-token supply <TOKEN_ADDRESS>

Komenda supply dla nowego tokena zwraca 0:

Example
spl-token supply 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg

Utworzenie nowego konta Mint Account wymaga transakcji z dwoma instrukcjami. Oto przykład w Javascript na Solana Playground.

  1. Program Systemowy (System Program) tworzy nowe konto z miejscem na dane konta Mint Account i przekazuje własność do Programu Tokenów (Token Program).

  2. Program Tokenów (Token Program) inicjalizuje dane nowego konta jako Mint Account.

Utwórz konto tokena

Aby przechowywać tokeny konkretnego mint, utwórz konto tokena:

Terminal
$
spl-token create-account <TOKEN_ADDRESS>

Przykładowa komenda:

Example
spl-token create-account 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg

Wynik:

Terminal Output
Creating account AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9
Signature: 2BtrynuCLX9CNofFiaw6Yzbx6hit66pup9Sk7aFjwU2NEbFz7NCHD9w9sWhrCfEd73XveAGK1DxFpJoQZPXU9tS1

Komenda create-account tworzy powiązane konto tokena (associated token account) z adresem twojego portfela jako właściciela.

Aby utworzyć konto tokena z innym właścicielem:

Terminal
$
spl-token create-account --owner <OWNER_ADDRESS> <TOKEN_ADDRESS>

Uwaga: <TOKEN_ADDRESS> określa konto mint dla konta tokena.

Przykładowa komenda:

Example
spl-token create-account --owner 2i3KvjDCZWxBsqcxBHpdEaZYQwQSYE6LXUMx5VjY5XrR 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg

Wynik:

Terminal Output
Creating account Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Signature: 44vqKdfzspT592REDPY4goaRJH3uJ3Ce13G4BCuUHg35dVUbHuGTHvqn4ZjYF9BGe9QrjMfe9GmuLkQhSZCBQuEt

Utworzenie powiązanego konta tokena (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:

Aby utworzyć nowe konto Token Account z nowym keypair zamiast adresu Associated Token Account, wyślij transakcję z dwoma instrukcjami. Oto przykład w Javascript na Solana Playground.

  1. Program System tworzy nowe konto z miejscem na dane konta Token Account i przenosi własność na Token Program.

  2. Token Program inicjalizuje dane jako Token Account.

Mintowanie tokenów

Aby utworzyć nowe jednostki tokena, mintuj tokeny na konto Token Account:

Terminal
$
spl-token mint [OPTIONS] <TOKEN_ADDRESS> <TOKEN_AMOUNT> [--] [RECIPIENT_TOKEN_ACCOUNT_ADDRESS]

Przykładowe polecenie:

Example
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100

Wynik:

Terminal Output
Minting 100 tokens
Token: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Recipient: AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9
Signature: 2NJ1m7qCraPSBAVxbr2ssmWZmBU9Jc8pDtJAnyZsZJRcaYCYMqq1oRY1gqA4ddQno3g3xcnny5fzr1dvsnFKMEqG

Aby mintować tokeny na inne konto tokenowe:

Example
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 -- Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt

Wynik:

Terminal Output
Minting 100 tokens
Token: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Recipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Signature: 3SQvNM3o9DsTiLwcEkSPT1Edr14RgE2wC54TEjonEP2swyVCp2jPWYWdD6RwXUGpvDNUkKWzVBZVFShn5yntxVd7

Instrukcja MintTo w Token Program tworzy nowe tokeny. Autorytet mintowania musi podpisać transakcję. Instrukcja mintuje tokeny na konto Token Account i zwiększa całkowitą podaż na koncie Mint Account. Oto przykład w Javascript na Solana Playground.

Transfer tokenów

Aby przenieść tokeny między kontami tokenowymi:

Terminal
spl-token transfer [OPTIONS] <TOKEN_ADDRESS> <TOKEN_AMOUNT> <RECIPIENT_ADDRESS or RECIPIENT_TOKEN_ACCOUNT_ADDRESS>

Przykładowe polecenie:

Example
spl-token transfer 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt

Wynik:

Terminal Output
Transfer 100 tokens
Sender: AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9
Recipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Signature: 5y6HVwV8V2hHGLTVmTmdySRiEUCZnWmkasAvJ7J6m7JR46obbGKCBqUFgLpZu5zQGwM4Xy6GZ4M5LKd1h6Padx3o

Instrukcja Transfer w Token Program obsługuje transfery tokenów. Właściciel konta Token Account nadawcy musi podpisać transakcję. Instrukcja przenosi tokeny między kontami Token Account. Oto przykład w Javascript na Solana Playground.

Zarówno nadawca, jak i odbiorca muszą mieć konta tokenowe dla konkretnego tokena (mint). Nadawca może dołączyć instrukcje tworzenia konta tokenowego odbiorcy w tej samej transakcji.

Tworzenie metadanych tokena

Program Token Extensions pozwala przechowywać metadane (nazwa, symbol, link do obrazu) bezpośrednio w koncie mint.

Aby utworzyć token z rozszerzeniem metadanych:

Example
spl-token create-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb --enable-metadata

Wynik:

Terminal Output
Creating token BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP under program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb
To 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: BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP
Decimals: 9
Signature: 5iQofFeXdYhMi9uTzZghcq8stAaa6CY6saUwcdnELST13eNSifiuLbvR5DnRt311frkCTUh5oecj8YEvZSB3wfai

Aby zainicjalizować metadane:

Terminal
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:

Example
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?

Spis treści

Edytuj stronę