Apa Itu Akun Mint
Akun mint mendefinisikan dan mengidentifikasi secara unik sebuah token di Solana, dan menyimpan state bersama yang berlaku untuk semua token account untuk mint tersebut.
Token Program mendefinisikan tipe akun Mint sebagai:
/// Mint data.#[repr(C)]#[derive(Clone, Copy, Debug, Default, PartialEq)]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>,}
Setiap token memiliki satu mint account, dan alamat mint adalah identifier unik token tersebut di seluruh dompet, aplikasi, dan explorer.
Sebagai contoh, USD Coin (USDC) memiliki alamat mint
EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v. Alamat mint ini mengidentifikasi
USDC secara unik di seluruh ekosistem Solana. Anda dapat melihat mint ini di
Solana Explorer.
Cara Membuat Akun Mint
Membuat mint memerlukan dua instruksi:
- Instruksi
CreateAccountdari System Program membuat akun baru yang bebas rent dan menetapkan Token Program sebagai pemilik program dari akun baru tersebut. - Instruksi
InitializeMintatauInitializeMint2dari Token Program menginisialisasi akun baru tersebut sebagai mint.
Sertakan instruksi CreateAccount dan instruksi inisialisasi mint dalam
transaksi yang sama.
Selama inisialisasi mint, Token Program memeriksa bahwa mint account belum
diinisialisasi dan bebas rent. Token Program kemudian menulis mint authority,
freeze authority, desimal, dan flag is_initialized ke dalam data mint
account.
Referensi Sumber
| Item | Deskripsi | Token Program | Token Extensions Program |
|---|---|---|---|
Mint | State mint dasar yang disimpan di setiap mint account. | Sumber | Sumber |
InitializeMint | Instruksi inisialisasi mint yang memerlukan akun sysvar rent dalam daftar akunnya. | Sumber | Sumber |
InitializeMint2 | Instruksi inisialisasi mint yang tidak memerlukan akun sysvar rent dalam daftar akunnya. | Sumber | Sumber |
_process_initialize_mint | Logika prosesor bersama untuk inisialisasi mint. | Sumber | Sumber |
process_initialize_mint | Handler publik untuk InitializeMint. | Sumber | Sumber |
process_initialize_mint2 | Handler publik untuk InitializeMint2. | Sumber | Sumber |
Typescript
Contoh Kit di bawah ini menunjukkan pendekatan yang direkomendasikan
menggunakan @solana/kit. Contoh lama menggunakan @solana/web3.js disertakan
sebagai referensi.
Kit
import { generateKeyPairSigner } from "@solana/kit";import { createLocalClient } from "@solana/kit-client-rpc";import { tokenProgram } from "@solana-program/token";const client = await createLocalClient().use(tokenProgram());const mint = await generateKeyPairSigner();const result = await client.token.instructions.createMint({newMint: mint, // New mint account to create.decimals: 9, // Decimals to define on the mint account.mintAuthority: client.payer.address, // Authority allowed to mint new tokens.freezeAuthority: client.payer.address // Authority allowed to freeze token accounts.}).sendTransaction();const mintAccount = await client.token.accounts.mint.fetch(mint.address);console.log("Mint Address:", mint.address);console.log("Mint Account:", mintAccount.data);console.log("\nTransaction Signature:", result.context.signature);
Web3.js
import { Connection, Keypair, LAMPORTS_PER_SOL } from "@solana/web3.js";import { createMint, getMint, TOKEN_PROGRAM_ID } from "@solana/spl-token";const mintPubkey = await createMint(connection,feePayer,feePayer.publicKey, // Authority allowed to mint new tokens.feePayer.publicKey, // Authority allowed to freeze token accounts.9, // Decimals to define on the mint account.Keypair.generate(), // New mint account to create.{commitment: "confirmed"},TOKEN_PROGRAM_ID);const mintAccount = await getMint(connection,mintPubkey,"confirmed",TOKEN_PROGRAM_ID);console.log("Mint Address:", mintPubkey.toBase58());console.log("Mint Account:", mintAccount);
Rust
use anyhow::Result;use solana_client::nonblocking::rpc_client::RpcClient;use solana_commitment_config::CommitmentConfig;use solana_sdk::{program_pack::Pack,signature::{Keypair, Signer},transaction::Transaction,};use solana_system_interface::instruction::create_account;use spl_token_interface::{id as token_program_id, instruction::initialize_mint, state::Mint};#[tokio::main]async fn main() -> Result<()> {let client = RpcClient::new_with_commitment(String::from("http://localhost:8899"),CommitmentConfig::confirmed(),);let latest_blockhash = client.get_latest_blockhash().await?;let transaction = Transaction::new_signed_with_payer(&[create_account(&fee_payer.pubkey(), // Account funding account creation.&mint.pubkey(), // New mint account to create.mint_rent, // Lamports funding the new account rent.Mint::LEN as u64, // Account size in bytes.&token_program_id(), // Program that owns the new account.),initialize_mint(&token_program_id(),&mint.pubkey(), // Mint account to initialize.&fee_payer.pubkey(), // Authority allowed to mint new tokens.Some(&fee_payer.pubkey()), // Authority allowed to freeze token accounts.9, // Decimals to define on the mint account.)?,],Some(&fee_payer.pubkey()),&[&fee_payer, &mint],latest_blockhash,);let transaction_signature = client.send_and_confirm_transaction(&transaction).await?;let mint_account = client.get_account(&mint.pubkey()).await?;let mint_data = Mint::unpack(&mint_account.data)?;println!("Mint Address: {}", mint.pubkey());println!("Mint Account: {:#?}", mint_data);println!("\nTransaction Signature: {}", transaction_signature);Ok(())}
Python
#!/usr/bin/env python3import asyncioimport jsonfrom solana.rpc.async_api import AsyncClientfrom solders.keypair import Keypairfrom solders.message import Messagefrom solders.system_program import create_account, CreateAccountParamsfrom solders.transaction import Transactionfrom spl.token.async_client import AsyncTokenfrom spl.token.instructions import initialize_mint, InitializeMintParamsfrom spl.token.constants import MINT_LEN, TOKEN_PROGRAM_IDDECIMALS = 9async def main():rpc = AsyncClient("http://localhost:8899")async with rpc:create_mint_instructions = [create_account(CreateAccountParams(from_pubkey=fee_payer.pubkey(), # Account funding account creation.to_pubkey=mint.pubkey(), # New mint account to create.lamports=mint_rent, # Lamports funding the new account rent.space=MINT_LEN, # Account size in bytes.owner=TOKEN_PROGRAM_ID, # Program that owns the new account.)),initialize_mint(InitializeMintParams(program_id=TOKEN_PROGRAM_ID, # Token program to invoke.mint=mint.pubkey(), # Mint account to initialize.decimals=DECIMALS, # Decimals to define on the mint account.mint_authority=fee_payer.pubkey(), # Authority allowed to mint new tokens.freeze_authority=fee_payer.pubkey(), # Authority allowed to freeze token accounts.)),]latest_blockhash = await rpc.get_latest_blockhash()transaction = Transaction([fee_payer, mint],Message(create_mint_instructions, fee_payer.pubkey()),latest_blockhash.value.blockhash,)result = await rpc.send_transaction(transaction)token = AsyncToken(rpc, mint.pubkey(), TOKEN_PROGRAM_ID, fee_payer)mint_info = await token.get_mint_info()mint_account = {"mint_authority": None if mint_info.mint_authority is None else str(mint_info.mint_authority),"supply": mint_info.supply,"decimals": mint_info.decimals,"is_initialized": mint_info.is_initialized,"freeze_authority": None if mint_info.freeze_authority is None else str(mint_info.freeze_authority),}print("Mint Address:", mint.pubkey())print("Mint Account:")print(json.dumps(mint_account, indent=2))print("\nTransaction Signature:", result.value)if __name__ == "__main__":asyncio.run(main())
Cara Menambahkan Metadata
Mint account hanya menyimpan informasi token dasar (suplai, desimal, otoritas). Untuk menambahkan metadata yang dapat dibaca manusia seperti nama, simbol, dan gambar ke token Anda, Anda memiliki dua opsi:
Metaplex Token Metadata
Tambahkan metadata menggunakan Metaplex Token Metadata Program. Bekerja dengan Token Program asli maupun Token-2022.
Token Extensions Metadata
Gunakan ekstensi metadata bawaan dengan Token-2022. Ekstensi metadata hanya tersedia untuk mint account yang dibuat dengan Token-2022. Untuk menambahkan metadata ke mint account yang dibuat dengan Token Program asli, gunakan Metaplex Token Metadata Program.
Is this page helpful?