Mint Account Nedir
Bir mint account, Solana üzerinde bir token'ı tanımlar ve benzersiz şekilde tanımlar, ve bu mint için tüm token account'larına uygulanan paylaşılan durumu saklar.
Token Program, Mint hesap tipini şu şekilde tanımlar:
/// 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>,}
Her token'ın bir mint account'u vardır ve mint adresi, cüzdanlar, uygulamalar ve explorer'lar arasında token'ın benzersiz tanımlayıcısıdır.
Örneğin, USD Coin (USDC) EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v mint
adresine sahiptir. Mint adresi, USDC'yi Solana ekosistemi genelinde benzersiz
şekilde tanımlar. Bu mint'i
Solana Explorer
üzerinde görüntüleyebilirsiniz.
Mint Account Nasıl Oluşturulur
Bir mint oluşturmak iki talimat gerektirir:
- System Program'ın
CreateAccounttalimatı, yeni bir rent-muaf hesap oluşturur ve Token Program'ı yeni hesabın program sahibi olarak atar. - Token Program'ın
InitializeMintveyaInitializeMint2talimatı, yeni hesabı bir mint olarak başlatır.
CreateAccount talimatını ve mint başlatma talimatını aynı işleme dahil
edin.
Mint başlatma sırasında, Token Program mint account'un henüz başlatılmamış ve
rent-muaf olduğunu kontrol eder. Token Program daha sonra mint yetkisini,
dondurma yetkisini, ondalık basamakları ve is_initialized bayrağını mint
account verisine yazar.
Kaynak Referansı
| Öğe | Açıklama | Token Program | Token Extensions Program |
|---|---|---|---|
Mint | Her mint account'ta saklanan temel mint durumu. | Kaynak | Kaynak |
InitializeMint | Hesaplar listesinde rent sysvar hesabını bekleyen bir mint başlatma talimatı. | Kaynak | Kaynak |
InitializeMint2 | Hesaplar listesinde rent sysvar hesabını gerektirmeyen bir mint başlatma talimatı. | Kaynak | Kaynak |
_process_initialize_mint | Mint başlatma için paylaşılan işlemci mantığı. | Kaynak | Kaynak |
process_initialize_mint | InitializeMint için genel işleyici. | Kaynak | Kaynak |
process_initialize_mint2 | InitializeMint2 için genel işleyici. | Kaynak | Kaynak |
Typescript
Aşağıdaki Kit örnekleri, @solana/kit kullanılarak önerilen yaklaşımı
göstermektedir. Referans için @solana/web3.js kullanan eski örnekler de
eklenmiştir.
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())
Metadata Nasıl Eklenir
Bir mint account yalnızca temel token bilgilerini (arz, ondalık basamaklar, yetkiler) saklar. Token'ınıza ad, sembol ve görsel gibi insan tarafından okunabilir metadata eklemek için iki seçeneğiniz vardır:
Metaplex Token Metadata
Metaplex Token Metadata Program'ı kullanarak metadata ekleyin. Hem orijinal Token Program hem de Token-2022 ile çalışır.
Token Extensions Metadata
Token-2022 ile yerleşik metadata uzantısını kullanın. Metadata uzantısı yalnızca Token-2022 ile oluşturulan mint account'lar için kullanılabilir. Orijinal Token Program ile oluşturulan mint account'lara metadata eklemek için Metaplex Token Metadata Program'ı kullanın.
Is this page helpful?