Cos'è un Mint Account
Un mint account definisce e identifica in modo univoco un token su Solana e memorizza lo stato condiviso che si applica a tutti i token account per quel mint.
Il Token Program definisce il tipo di account Mint come:
/// 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>,}
Ogni token ha un mint account e l'indirizzo del mint è l'identificatore univoco del token attraverso wallet, applicazioni ed explorer.
Ad esempio, USD Coin (USDC) ha l'indirizzo mint
EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v. L'indirizzo mint identifica in
modo univoco USDC in tutto l'ecosistema Solana. Puoi visualizzare questo mint su
Solana Explorer.
Come Creare un Mint Account
La creazione di un mint richiede due istruzioni:
- L'istruzione
CreateAccountdel System Program crea un nuovo account esente da rent e assegna il Token Program come proprietario del programma del nuovo account. - L'istruzione
InitializeMintoInitializeMint2del Token Program inizializza il nuovo account come mint.
Includi l'istruzione CreateAccount e l'istruzione di inizializzazione del
mint nella stessa transazione.
Durante l'inizializzazione del mint, il Token Program verifica che il mint
account non sia già inizializzato e sia esente da rent. Il Token Program scrive
quindi l'autorità di mint, l'autorità di freeze, i decimali e il flag
is_initialized nei dati del mint account.
Riferimento Sorgente
| Elemento | Descrizione | Token Program | Token Extensions Program |
|---|---|---|---|
Mint | Lo stato base del mint memorizzato in ogni mint account. | Sorgente | Sorgente |
InitializeMint | Un'istruzione di inizializzazione del mint che richiede l'account sysvar rent nella sua lista di account. | Sorgente | Sorgente |
InitializeMint2 | Un'istruzione di inizializzazione del mint che non richiede l'account sysvar rent nella sua lista di account. | Sorgente | Sorgente |
_process_initialize_mint | Logica condivisa del processore per l'inizializzazione del mint. | Sorgente | Sorgente |
process_initialize_mint | Gestore pubblico per InitializeMint. | Sorgente | Sorgente |
process_initialize_mint2 | Gestore pubblico per InitializeMint2. | Sorgente | Sorgente |
Typescript
Gli esempi Kit di seguito mostrano l'approccio consigliato utilizzando
@solana/kit. Gli esempi legacy che utilizzano @solana/web3.js sono inclusi
come riferimento.
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())
Come Aggiungere Metadati
Un mint account memorizza solo le informazioni di base del token (supply, decimali, autorità). Per aggiungere metadati leggibili come nome, simbolo e immagine al tuo token, hai due opzioni:
Metaplex Token Metadata
Aggiungi metadati utilizzando il Metaplex Token Metadata Program. Funziona sia con il Token Program originale che con Token-2022.
Token Extensions Metadata
Utilizza l'estensione metadati integrata con Token-2022. L'estensione metadati è disponibile solo per mint account creati con Token-2022. Per aggiungere metadati a mint account creati con il Token Program originale, utilizza il Metaplex Token Metadata Program.
Is this page helpful?