Wat Is een Mint Account
Een mint account definieert en identificeert uniek een token op Solana, en slaat de gedeelde staat op die van toepassing is op alle token accounts voor die mint.
Het Token Program definieert het Mint accounttype als:
/// 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>,}
Elke token heeft één mint account, en het mint-adres is de unieke identificatie van de token binnen wallets, applicaties en explorers.
USD Coin (USDC) heeft bijvoorbeeld het mint-adres
EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v. Het mint-adres identificeert
USDC uniek binnen het gehele Solana-ecosysteem. Je kunt deze mint bekijken op
Solana Explorer.
Hoe Maak Je een Mint Account Aan
Het aanmaken van een mint vereist twee instructies:
- De
CreateAccountinstructie van het System Program maakt een nieuw rent-vrijgesteld account aan en wijst het Token Program toe als de program owner van het nieuwe account. - De
InitializeMintofInitializeMint2instructie van het Token Program initialiseert het nieuwe account als een mint.
Neem de CreateAccount instructie en de mint-initialisatie-instructie op in
dezelfde transactie.
Tijdens de mint-initialisatie controleert het Token Program of het mint account
nog niet is geïnitialiseerd en rent-vrijgesteld is. Het Token Program schrijft
vervolgens de mint authority, freeze authority, decimalen en de
is_initialized vlag naar de mint account data.
Bronverwijzing
| Item | Beschrijving | Token Program | Token Extensions Program |
|---|---|---|---|
Mint | De basale mint-staat die in elk mint account wordt opgeslagen. | Bron | Bron |
InitializeMint | Een mint-initialisatie-instructie die het rent sysvar account in zijn accountslijst verwacht. | Bron | Bron |
InitializeMint2 | Een mint-initialisatie-instructie die het rent sysvar account niet vereist in zijn accountslijst. | Bron | Bron |
_process_initialize_mint | Gedeelde processorlogica voor mint-initialisatie. | Bron | Bron |
process_initialize_mint | Publieke handler voor InitializeMint. | Bron | Bron |
process_initialize_mint2 | Publieke handler voor InitializeMint2. | Bron | Bron |
Typescript
De Kit voorbeelden hieronder tonen de aanbevolen aanpak met @solana/kit.
Legacy voorbeelden met @solana/web3.js zijn ter referentie opgenomen.
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())
Hoe Metadata Toevoegen
Een mint account slaat alleen basis tokeninformatie op (supply, decimalen, authorities). Om leesbare metadata zoals een naam, symbool en afbeelding aan je token toe te voegen, heb je twee opties:
Metaplex Token Metadata
Voeg metadata toe met het Metaplex Token Metadata Program. Werkt met zowel het originele Token Program als Token-2022.
Token Extensions Metadata
Gebruik de ingebouwde metadata-extensie met Token-2022. De metadata-extensie is alleen beschikbaar voor mint accounts die zijn aangemaakt met Token-2022. Om metadata toe te voegen aan mint accounts die zijn aangemaakt met het originele Token Program, gebruik je het Metaplex Token Metadata Program.
Is this page helpful?