Что такое аккаунт минта
Аккаунт минта определяет и уникально идентифицирует токен в Solana, а также хранит общее состояние, применимое ко всем токен-аккаунтам для этого минта.
Token Program определяет тип аккаунта Mint следующим образом:
/// 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>,}
У каждого токена есть один аккаунт минта, и адрес минта является уникальным идентификатором токена в кошельках, приложениях и обозревателях.
Например, USD Coin (USDC) имеет адрес минта
EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v. Адрес минта уникально
идентифицирует USDC во всей экосистеме Solana. Вы можете просмотреть этот минт
на
Solana Explorer.
Как создать аккаунт минта
Создание минта требует двух инструкций:
- Инструкция
CreateAccountSystem Program создает новый аккаунт, освобожденный от rent, и назначает Token Program в качестве владельца программы нового аккаунта. - Инструкция
InitializeMintилиInitializeMint2Token Program инициализирует новый аккаунт как минт.
Включите инструкцию CreateAccount и инструкцию инициализации минта в одну
транзакцию.
Во время инициализации минта Token Program проверяет, что аккаунт минта еще не
инициализирован и освобожден от rent. Затем Token Program записывает полномочия
минтинга, полномочия заморозки, количество десятичных знаков и флаг
is_initialized в данные аккаунта минта.
Справочные источники
| Элемент | Описание | Token Program | Token Extensions Program |
|---|---|---|---|
Mint | Базовое состояние минта, хранящееся в каждом аккаунте минта. | Источник | Источник |
InitializeMint | Инструкция инициализации минта, которая ожидает аккаунт системной переменной rent в списке аккаунтов. | Источник | Источник |
InitializeMint2 | Инструкция инициализации минта, которая не требует аккаунт системной переменной rent в списке аккаунтов. | Источник | Источник |
_process_initialize_mint | Общая логика обработчика для инициализации минта. | Источник | Источник |
process_initialize_mint | Публичный обработчик для InitializeMint. | Источник | Источник |
process_initialize_mint2 | Публичный обработчик для InitializeMint2. | Источник | Источник |
Typescript
Примеры ниже демонстрируют рекомендуемый подход с использованием Kit.
Устаревшие примеры с использованием @solana/kit приведены для справки.
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())
Как добавить метаданные
mint account хранит только базовую информацию о токене (эмиссия, десятичные знаки, полномочия). Чтобы добавить к вашему токену человекочитаемые метаданные, такие как название, символ и изображение, у вас есть два варианта:
Metaplex Token Metadata
Добавьте метаданные с помощью Metaplex Token Metadata Program. Работает как с оригинальным Token Program, так и с Token-2022.
Расширение метаданных Token Extensions
Используйте встроенное расширение метаданных с Token-2022. Расширение метаданных доступно только для аккаунтов mint, созданных с помощью Token-2022. Чтобы добавить метаданные к аккаунтам mint, созданным с помощью оригинального Token Program, используйте Metaplex Token Metadata Program.
Is this page helpful?