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 (Original)
- Kemampuan token dasar (mint, transfer, dll.)
- Tidak dapat diubah dan banyak digunakan
Token Extension Program (Token 2022)
- Mencakup semua fitur Token Program original
- Menambahkan fitur melalui "ekstensi"
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 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 Account
Detail lengkap yang disimpan pada setiap Mint Account mencakup hal berikut:
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>,}
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 Account
Detail lengkap yang disimpan pada setiap Token Account mencakup hal berikut:
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>,}
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 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 Account
Perhatikan bahwa setiap dompet membutuhkan token account-nya sendiri untuk menyimpan token dari mint yang sama.
Hubungan 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.
$solana airdrop 2
Jalankan spl-token --help
untuk melihat semua perintah yang tersedia.
$spl-token --help
Untuk menginstal CLI spl-token
secara lokal, jalankan:
$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:
$spl-token create-token
Outputnya terlihat seperti:
Creating token 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgAddress: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgDecimals: 9Signature: 44fvKfT1ezBUwdzrCys3fvCdFxbLMnNvBstds76QZyE6cXag5NupBprSXwxPTzzjrC3cA6nvUZaLFTvmcKyzxrm1
Akun mint baru dimulai dengan suplai nol. Periksa suplai saat ini dengan:
$spl-token supply <TOKEN_ADDRESS>
Perintah supply
untuk token baru mengembalikan 0
:
spl-token supply 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Membuat mint account baru memerlukan transaksi dengan dua instruksi. Berikut adalah contoh Javascript di Solana Playground.
-
System Program membuat akun baru dengan ruang untuk data mint account dan mentransfer kepemilikan ke Token Program.
-
Token Program menginisialisasi data akun baru sebagai mint account
Membuat token account
Untuk menyimpan token dari mint tertentu, buat token account:
$spl-token create-account <TOKEN_ADDRESS>
Contoh perintah:
spl-token create-account 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Output:
Creating account AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Signature: 2BtrynuCLX9CNofFiaw6Yzbx6hit66pup9Sk7aFjwU2NEbFz7NCHD9w9sWhrCfEd73XveAGK1DxFpJoQZPXU9tS1
Perintah create-account
membuat associated token account dengan alamat
dompet Anda sebagai pemiliknya.
Untuk membuat token account dengan pemilik yang berbeda:
$spl-token create-account --owner <OWNER_ADDRESS> <TOKEN_ADDRESS>
Catatan: <TOKEN_ADDRESS>
menentukan mint account untuk token account.
Contoh perintah:
spl-token create-account --owner 2i3KvjDCZWxBsqcxBHpdEaZYQwQSYE6LXUMx5VjY5XrR 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Output:
Creating account Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 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:
- Memanggil System Program untuk membuat akun baru menggunakan PDA yang disediakan sebagai alamat
- Memanggil Token Program untuk menginisialisasi data token account
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.
-
System Program membuat akun baru dengan ruang untuk data Token Account dan mentransfer kepemilikan ke Token Program.
-
Token Program menginisialisasi data sebagai Token Account
Mint Token
Untuk membuat unit baru dari token, mint token ke Token Account:
$spl-token mint [OPTIONS] <TOKEN_ADDRESS> <TOKEN_AMOUNT> [--] [RECIPIENT_TOKEN_ACCOUNT_ADDRESS]
Contoh perintah:
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100
Output:
Minting 100 tokensToken: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgRecipient: AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Signature: 2NJ1m7qCraPSBAVxbr2ssmWZmBU9Jc8pDtJAnyZsZJRcaYCYMqq1oRY1gqA4ddQno3g3xcnny5fzr1dvsnFKMEqG
Untuk mint token ke token account yang berbeda:
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 -- Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Output:
Minting 100 tokensToken: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgRecipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 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:
spl-token transfer [OPTIONS] <TOKEN_ADDRESS> <TOKEN_AMOUNT> <RECIPIENT_ADDRESS or RECIPIENT_TOKEN_ACCOUNT_ADDRESS>
Contoh perintah:
spl-token transfer 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Output:
Transfer 100 tokensSender: AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Recipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 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:
spl-token create-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb --enable-metadata
Output:
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
Untuk menginisialisasi metadata:
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:
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?