Token di Solana

Token adalah aset digital yang mewakili kepemilikan atas berbagai kategori aset. Tokenisasi memungkinkan digitalisasi hak kepemilikan. Token di Solana disebut sebagai Token SPL (Solana Program Library).

Bagian ini membahas konsep dasar tentang bagaimana token direpresentasikan di Solana. Lihat bagian Dasar-dasar Token SPL untuk contoh kode.

Poin Penting

  • Token Program berisi semua logika instruksi untuk berinteraksi dengan token di jaringan (baik token fungible maupun non-fungible).

  • Mint Account mewakili token tertentu dan menyimpan metadata global tentang token seperti total pasokan dan otoritas mint (alamat yang berwenang untuk membuat unit baru dari token).

  • Token Account melacak kepemilikan individual token untuk mint account tertentu untuk pemilik tertentu.

  • Associated Token Account adalah Token Account yang dibuat dengan alamat yang diturunkan dari alamat pemilik dan mint account.

Token Program

Ekosistem Solana memiliki dua Token Program utama. Kode sumber untuk kedua program di bawah ini.

Token Program berisi semua logika instruksi untuk berinteraksi dengan token di jaringan (baik token fungible maupun non-fungible). Semua token di Solana pada dasarnya adalah akun data yang dimiliki oleh Token Program.

Token ProgramToken Program

Mint Account

Token di Solana diidentifikasi secara unik oleh alamat Mint Account yang dimiliki oleh Token Program. Akun ini bertindak sebagai penghitung global untuk token tertentu dan menyimpan data seperti:

  • Supply: Total pasokan token
  • Decimals: Presisi desimal token
  • Mint authority: Akun yang berwenang untuk membuat unit baru token, meningkatkan pasokan
  • Freeze authority: Akun yang berwenang untuk membekukan token dalam Token Account, mencegahnya ditransfer atau dibakar

Mint AccountMint Account

Detail lengkap yang disimpan pada setiap Mint Account mencakup hal berikut:

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>,
}

Sebagai referensi, berikut adalah tautan Solana Explorer ke USDC Mint Account.

Token Account

Token Program membuat Token Accounts untuk melacak kepemilikan individual dari setiap unit token. Token Account menyimpan data seperti:

  • Mint: Token yang unit-unitnya disimpan oleh Token Account
  • Owner: Akun yang berwenang untuk mentransfer token dari Token Account
  • Amount: Jumlah token yang saat ini disimpan oleh Token Account

Token AccountToken Account

Detail lengkap yang disimpan pada setiap Token Account mencakup hal berikut:

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>,
}

Dompet membutuhkan token account untuk setiap token (mint) yang ingin disimpan, dengan alamat dompet ditetapkan sebagai pemilik token account. Setiap dompet dapat memiliki beberapa token account untuk token (mint) yang sama, tetapi token account hanya dapat memiliki satu pemilik dan menyimpan unit dari satu token (mint).

Account RelationshipAccount Relationship

Perhatikan bahwa data setiap Token Account mencakup bidang owner yang mengidentifikasi siapa yang memiliki otoritas atas Token Account. Ini berbeda dari program owner yang ditentukan dalam tipe Account dasar, yang merupakan Token Program untuk semua Token Account.

Associated Token Account

Associated Token Account menyederhanakan proses menemukan alamat token account untuk mint dan pemilik tertentu. Anggap Associated Token Account sebagai token account "default" untuk mint dan pemilik tertentu.

Associated Token Account dibuat dengan alamat yang diturunkan dari alamat pemilik dan alamat mint account. Penting untuk dipahami bahwa Associated Token Account hanyalah token account dengan alamat spesifik.

Ini memperkenalkan konsep kunci dalam pengembangan Solana: Program Derived Address (PDA). PDA menurunkan alamat secara deterministik menggunakan input yang telah ditentukan, sehingga memudahkan untuk menemukan alamat sebuah akun.

Associated Token AccountAssociated Token Account

Perhatikan bahwa setiap dompet membutuhkan token account-nya sendiri untuk menyimpan token dari mint yang sama.

Hubungan Akun yang DiperluasHubungan Akun yang Diperluas

Contoh Token CLI

CLI spl-token membantu Anda bereksperimen dengan token SPL. Contoh di bawah menggunakan terminal Solana Playground untuk menjalankan perintah CLI langsung di browser tanpa instalasi lokal.

Membuat token dan akun memerlukan SOL untuk deposit sewa akun dan biaya transaksi. Untuk pengguna Solana Playground pertama kali, buat dompet Playground dan jalankan perintah solana airdrop di terminal Playground. Anda juga bisa mendapatkan SOL devnet dari web faucet publik.

Terminal
$
solana airdrop 2

Jalankan spl-token --help untuk melihat semua perintah yang tersedia.

Terminal
$
spl-token --help

Untuk menginstal CLI spl-token secara lokal, jalankan:

Terminal
$
cargo install spl-token-cli

Temukan lebih banyak contoh di spl-token dokumentasi.

Alamat akun yang ditampilkan di output terminal Anda berbeda dari contoh di bawah ini. Gunakan alamat dari terminal Playground Anda saat mengikuti. Sebagai contoh, perintah create-token menghasilkan alamat mint account dengan dompet Playground Anda sebagai otoritas mint.

Membuat Token Baru

Untuk membuat token baru (mint account), jalankan:

Terminal
$
spl-token create-token

Outputnya terlihat seperti:

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

Akun mint baru dimulai dengan suplai nol. Periksa suplai saat ini dengan:

Terminal
$
spl-token supply <TOKEN_ADDRESS>

Perintah supply untuk token baru mengembalikan 0:

Example
spl-token supply 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg

Membuat mint account baru memerlukan transaksi dengan dua instruksi. Berikut adalah contoh Javascript di Solana Playground.

  1. System Program membuat akun baru dengan ruang untuk data mint account dan mentransfer kepemilikan ke Token Program.

  2. Token Program menginisialisasi data akun baru sebagai mint account

Membuat token account

Untuk menyimpan token dari mint tertentu, buat token account:

Terminal
$
spl-token create-account <TOKEN_ADDRESS>

Contoh perintah:

Example
spl-token create-account 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg

Output:

Terminal Output
Creating account AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9
Signature: 2BtrynuCLX9CNofFiaw6Yzbx6hit66pup9Sk7aFjwU2NEbFz7NCHD9w9sWhrCfEd73XveAGK1DxFpJoQZPXU9tS1

Perintah create-account membuat associated token account dengan alamat dompet Anda sebagai pemiliknya.

Untuk membuat token account dengan pemilik yang berbeda:

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

Catatan: <TOKEN_ADDRESS> menentukan mint account untuk token account.

Contoh perintah:

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

Output:

Terminal Output
Creating account Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Signature: 44vqKdfzspT592REDPY4goaRJH3uJ3Ce13G4BCuUHg35dVUbHuGTHvqn4ZjYF9BGe9QrjMfe9GmuLkQhSZCBQuEt

Membuat associated token account memerlukan satu instruksi yang memanggil Associated Token Program. Berikut adalah contoh Javascript di Solana Playground.

Associated Token Program menggunakan Cross Program Invocations untuk:

Untuk membuat Token Account baru dengan keypair baru alih-alih alamat Associated Token Account, kirim transaksi dengan dua instruksi. Berikut contoh Javascript di Solana Playground.

  1. System Program membuat akun baru dengan ruang untuk data Token Account dan mentransfer kepemilikan ke Token Program.

  2. Token Program menginisialisasi data sebagai Token Account

Mint Token

Untuk membuat unit baru dari token, mint token ke Token Account:

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

Contoh perintah:

Example
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100

Output:

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

Untuk mint token ke token account yang berbeda:

Example
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 -- Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt

Output:

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

Instruksi MintTo pada Token Program membuat token baru. Otoritas mint harus menandatangani transaksi. Instruksi ini mint token ke Token Account dan meningkatkan total pasokan pada Mint Account. Berikut contoh Javascript di Solana Playground.

Transfer Token

Untuk mentransfer token antar token account:

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

Contoh perintah:

Example
spl-token transfer 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt

Output:

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

Instruksi Transfer pada Token Program menangani transfer token. Pemilik Token Account pengirim harus menandatangani transaksi. Instruksi ini memindahkan token antar Token Account. Berikut contoh Javascript di Solana Playground.

Baik pengirim maupun penerima memerlukan token account untuk token (mint) tertentu. Pengirim dapat menyertakan instruksi untuk membuat token account penerima dalam transaksi yang sama.

Membuat Metadata Token

Program Token Extensions memungkinkan Anda menyimpan metadata (nama, simbol, tautan gambar) langsung di Mint Account.

Untuk membuat token dengan ekstensi metadata:

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

Output:

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

Untuk menginisialisasi metadata:

Terminal
spl-token initialize-metadata <TOKEN_MINT_ADDRESS> <YOUR_TOKEN_NAME> <YOUR_TOKEN_SYMBOL> <YOUR_TOKEN_URI>

URI token menautkan ke metadata off-chain. Lihat contoh format JSON di sini.

Contoh perintah:

Example
spl-token initialize-metadata BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP "TokenName" "TokenSymbol" "https://raw.githubusercontent.com/solana-developers/opos-asset/main/assets/DeveloperPortal/metadata.json"

Lihat metadata di Solana Explorer.

Pelajari lebih lanjut di Panduan Ekstensi Metadata. Untuk detail tentang Token Extensions, lihat Panduan Memulai Token Extensions dan dokumentasi SPL.

Is this page helpful?

Daftar Isi

Edit Halaman