Δημιουργία ενός Token Mint
Τι είναι ένας Mint Account;
Ένας mint account είναι ένας τύπος λογαριασμού στα Token Programs της Solana που αντιπροσωπεύει μοναδικά ένα token στο δίκτυο και αποθηκεύει καθολικά μεταδεδομένα σχετικά με το token.
/// 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>,}
Σημειώστε ότι τόσο το Token Program όσο και το Token Extension Program μοιράζονται την ίδια βασική υλοποίηση για τον Mint account.
Κάθε token στη Solana υπάρχει ως mint account όπου η διεύθυνση του mint account είναι το μοναδικό αναγνωριστικό του στο δίκτυο.
Για παράδειγμα, το USD Coin (USDC) ψηφιακό δολάριο στη Solana έχει τη διεύθυνση
mint EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
. Αυτή η διεύθυνση mint
λειτουργεί ως μοναδικό αναγνωριστικό του USD Coin σε ολόκληρο το οικοσύστημα της
Solana. Μπορείτε να δείτε λεπτομέρειες σχετικά με αυτόν τον mint account στον
Solana Explorer.
Πώς να δημιουργήσετε έναν Mint Account
Για να δημιουργήσετε έναν Mint Account, καλέστε την εντολή
InitializeMint
.
Μπορείτε να βρείτε υλοποιήσεις αυτής της εντολής
εδώ.
Η συναλλαγή για τη δημιουργία ενός mint account χρειάζεται δύο εντολές:
- Καλέστε το System Program για να δημιουργήσετε και να διαθέσετε χώρο για έναν mint account και να μεταφέρετε την ιδιοκτησία στο Token Program.
- Καλέστε το Token Program για να αρχικοποιήσετε τα δεδομένα του mint account.
Typescript
import {airdropFactory,appendTransactionMessageInstructions,createSolanaRpc,createSolanaRpcSubscriptions,createTransactionMessage,generateKeyPairSigner,getSignatureFromTransaction,lamports,pipe,sendAndConfirmTransactionFactory,setTransactionMessageFeePayerSigner,setTransactionMessageLifetimeUsingBlockhash,signTransactionMessageWithSigners} from "@solana/kit";import { getCreateAccountInstruction } from "@solana-program/system";import {getInitializeMintInstruction,getMintSize,TOKEN_2022_PROGRAM_ADDRESS} from "@solana-program/token-2022";// Create Connection, local validator in this exampleconst rpc = createSolanaRpc("http://127.0.0.1:8899");const rpcSubscriptions = createSolanaRpcSubscriptions("ws://localhost:8900");// Generate keypairs for fee payerconst feePayer = await generateKeyPairSigner();// Fund fee payerawait airdropFactory({ rpc, rpcSubscriptions })({recipientAddress: feePayer.address,lamports: lamports(1_000_000_000n),commitment: "confirmed"});// Generate keypair to use as address of mintconst mint = await generateKeyPairSigner();// Get default mint account size (in bytes), no extensions enabledconst space = BigInt(getMintSize());// Get minimum balance for rent exemptionconst rent = await rpc.getMinimumBalanceForRentExemption(space).send();// Instruction to create new account for mint (token 2022 program)// Invokes the system programconst createAccountInstruction = getCreateAccountInstruction({payer: feePayer,newAccount: mint,lamports: rent,space,programAddress: TOKEN_2022_PROGRAM_ADDRESS});// Instruction to initialize mint account data// Invokes the token 2022 programconst initializeMintInstruction = getInitializeMintInstruction({mint: mint.address,decimals: 9,mintAuthority: feePayer.address});const instructions = [createAccountInstruction, initializeMintInstruction];// Get latest blockhash to include in transactionconst { value: latestBlockhash } = await rpc.getLatestBlockhash().send();// Create transaction messageconst transactionMessage = pipe(createTransactionMessage({ version: 0 }), // Create transaction message(tx) => setTransactionMessageFeePayerSigner(feePayer, tx), // Set fee payer(tx) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx), // Set transaction blockhash(tx) => appendTransactionMessageInstructions(instructions, tx) // Append instructions);// Sign transaction message with required signers (fee payer and mint keypair)const signedTransaction =await signTransactionMessageWithSigners(transactionMessage);// Send and confirm transactionawait sendAndConfirmTransactionFactory({ rpc, rpcSubscriptions })(signedTransaction,{ commitment: "confirmed" });// Get transaction signatureconst transactionSignature = getSignatureFromTransaction(signedTransaction);console.log("Mint Address:", mint.address);console.log("Transaction Signature:", transactionSignature);
Rust
use anyhow::Result;use solana_client::rpc_client::RpcClient;use solana_sdk::{commitment_config::CommitmentConfig,program_pack::Pack,signature::{Keypair, Signer},system_instruction::create_account,transaction::Transaction,};use spl_token_2022::{id as token_2022_program_id, instruction::initialize_mint, state::Mint};fn main() -> Result<()> {// Create connection to local validatorlet client = RpcClient::new_with_commitment(String::from("http://127.0.0.1:8899"),CommitmentConfig::confirmed(),);let recent_blockhash = client.get_latest_blockhash()?;// Generate a new keypair for the fee payerlet fee_payer = Keypair::new();// Airdrop 1 SOL to fee payerlet airdrop_signature = client.request_airdrop(&fee_payer.pubkey(), 1_000_000_000)?;client.confirm_transaction(&airdrop_signature)?;loop {let confirmed = client.confirm_transaction(&airdrop_signature)?;if confirmed {break;}}// Generate keypair to use as address of mintlet mint = Keypair::new();let mint_space = Mint::LEN;let rent = client.get_minimum_balance_for_rent_exemption(mint_space)?;// Create account instruction for mintlet create_account_instruction = create_account(&fee_payer.pubkey(), // payer&mint.pubkey(), // mint addressrent, // rentmint_space as u64, // space&token_2022_program_id(), // program id);// Initialize mint account datalet initialize_mint_instruction = initialize_mint(&token_2022_program_id(), // program id&mint.pubkey(), // mint address&fee_payer.pubkey(), // mint authoritySome(&fee_payer.pubkey()),// freeze authority9, // decimals)?;// Create transaction and add instructionslet transaction = Transaction::new_signed_with_payer(&[create_account_instruction, initialize_mint_instruction],Some(&fee_payer.pubkey()),&[&fee_payer, &mint],recent_blockhash,);// Send and confirm transactionlet transaction_signature = client.send_and_confirm_transaction(&transaction)?;println!("Mint Address: {}", mint.pubkey());println!("Transaction Signature: {}", transaction_signature);Ok(())}
Is this page helpful?