ما هو حساب السك
يُعرّف حساب السك ويحدد بشكل فريد عملة رقمية على سولانا، ويخزن الحالة المشتركة التي تنطبق على جميع حسابات العملات لذلك السك.
يُعرّف 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>,}
لكل عملة حساب سك واحد، وعنوان السك هو المعرف الفريد للعملة عبر المحافظ والتطبيقات والمستكشفات.
على سبيل المثال، عملة الدولار الأمريكي (USDC) لديها عنوان السك
EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v. يحدد عنوان السك عملة USDC بشكل
فريد في جميع أنحاء نظام سولانا البيئي. يمكنك عرض هذا السك على
مستكشف سولانا.
كيفية إنشاء حساب السك
يتطلب إنشاء السك تعليمتين:
- تعليمة
CreateAccountمن System Program تُنشئ حساباً جديداً معفى من rent وتعيّن Token Program كمالك للبرنامج للحساب الجديد. - تعليمة
InitializeMintأوInitializeMint2من Token Program تُهيئ الحساب الجديد كحساب سك.
قم بتضمين تعليمة CreateAccount وتعليمة تهيئة السك في نفس المعاملة.
أثناء تهيئة السك، يتحقق Token Program من أن حساب السك لم يتم تهيئته بعد وأنه
معفى من rent. ثم يكتب Token Program سلطة السك، وسلطة التجميد، والأرقام العشرية،
وعلامة is_initialized في بيانات حساب السك.
مرجع المصدر
| العنصر | الوصف | Token Program | Token Extensions Program |
|---|---|---|---|
Mint | حالة السك الأساسية المخزنة في كل حساب سك. | المصدر | المصدر |
InitializeMint | تعليمة تهيئة السك التي تتوقع حساب rent sysvar في قائمة الحسابات الخاصة بها. | المصدر | المصدر |
InitializeMint2 | تعليمة تهيئة السك التي لا تتطلب حساب rent sysvar في قائمة الحسابات الخاصة بها. | المصدر | المصدر |
_process_initialize_mint | منطق المعالج المشترك لتهيئة السك. | المصدر | المصدر |
process_initialize_mint | المعالج العام لـ InitializeMint. | المصدر | المصدر |
process_initialize_mint2 | المعالج العام لـ InitializeMint2. | المصدر | المصدر |
Typescript
توضح الأمثلة أدناه Kit النهج الموصى به باستخدام @solana/kit. تم تضمين
الأمثلة القديمة باستخدام @solana/web3.js للمرجعية.
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 الوصفية
أضف البيانات الوصفية باستخدام برنامج Metaplex Token Metadata. يعمل مع كل من Token Program الأصلي وToken-2022.
البيانات الوصفية لامتدادات الرموز
استخدم امتداد البيانات الوصفية المدمج مع Token-2022. امتداد البيانات الوصفية متاح فقط لحسابات الإصدار التي تم إنشاؤها باستخدام Token-2022. لإضافة بيانات وصفية إلى حسابات الإصدار التي تم إنشاؤها باستخدام Token Program الأصلي، استخدم برنامج Metaplex Token Metadata.
Is this page helpful?