Đóng Băng Tài Khoản Token Có Tác Dụng Gì?
Đóng băng tài khoản token giữ nguyên chủ sở hữu, mint và số dư, nhưng ngăn tài khoản token chuyển hoặc đốt token cho đến khi tài khoản token được mở băng.
Một tài khoản đã đóng băng vẫn có thể bị đóng nếu tài khoản đóng băng đó có số dư token bằng không.
Chỉ mint vẫn còn quyền đóng băng mới có thể đóng băng các tài khoản token. Nếu quyền đóng băng của mint bị thu hồi, các tài khoản của mint đó không thể bị đóng băng nữa.
Cách Đóng Băng Tài Khoản Token
Đóng băng tài khoản token sử dụng lệnh FreezeAccount của Token Program.
Lệnh FreezeAccount xác minh rằng tài khoản token thuộc về mint và người ký
là quyền đóng băng của mint, sau đó thay đổi trạng thái tài khoản token từ đã
khởi tạo sang đã đóng băng.
Tài khoản token gốc không hỗ trợ đóng băng.
Tham Khảo Mã Nguồn
| Mục | Mô tả | Token Program | Token Extensions Program |
|---|---|---|---|
Mint | Trạng thái mint lưu trữ quyền đóng băng tùy chọn được sử dụng để đóng băng tài khoản token. | Nguồn | Nguồn |
AccountState | Các trạng thái tài khoản token, bao gồm Initialized và Frozen. | Nguồn | Nguồn |
FreezeAccount | Một lệnh thay đổi tài khoản token sang trạng thái đóng băng. | Nguồn | Nguồn |
process_toggle_freeze_account | Logic xử lý chung để đóng băng và mở băng tài khoản token. | Nguồn | Nguồn |
Typescript
Các ví dụ Kit dưới đây cho thấy cách tiếp cận được khuyến nghị sử dụng
@solana/kit. Các ví dụ cũ sử dụng @solana/web3.js được bao gồm để tham khảo.
Kit
import { generateKeyPairSigner } from "@solana/kit";import { createLocalClient } from "@solana/kit-client-rpc";import {findAssociatedTokenPda,tokenProgram,TOKEN_PROGRAM_ADDRESS} from "@solana-program/token";const client = await createLocalClient().use(tokenProgram());const mint = await generateKeyPairSigner();const [tokenAccount] = await findAssociatedTokenPda({mint: mint.address,owner: client.payer.address,tokenProgram: TOKEN_PROGRAM_ADDRESS});const result = await client.token.instructions.freezeAccount({account: tokenAccount, // Token account to freeze.mint: mint.address, // Mint for the token account being frozen.owner: client.payer // Freeze authority approving this change.}).sendTransaction();const tokenAccountData = await client.token.accounts.token.fetch(tokenAccount);console.log("Mint Address:", mint.address);console.log("\nToken Account Address:", tokenAccount);console.log("Token Account:", tokenAccountData.data);console.log("\nTransaction Signature:", result.context.signature);
Web3.js
import {createAssociatedTokenAccount,freezeAccount,createMint,getAccount,mintToChecked,TOKEN_PROGRAM_ID} from "@solana/spl-token";import { Connection, Keypair, LAMPORTS_PER_SOL } from "@solana/web3.js";const result = await freezeAccount(connection, // Connection to the local validator.feePayer, // Account paying transaction fees.associatedTokenAccount, // Token account to freeze.mintPubkey, // Mint for the token account being frozen.feePayer, // Freeze authority approving this change.[], // Additional multisig signers.{commitment: "confirmed" // Confirmation options for the transaction.},TOKEN_PROGRAM_ID // Token program to invoke.);const tokenAccountData = await getAccount(connection,associatedTokenAccount,"confirmed",TOKEN_PROGRAM_ID);console.log("Mint Address:", mintPubkey.toBase58());console.log("\nAssociated Token Account Address:",associatedTokenAccount.toBase58());console.log("Associated Token Account:", tokenAccountData);console.log("\nTransaction Signature:", result);
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_associated_token_account_interface::{address::get_associated_token_address, instruction::create_associated_token_account,};use spl_token_interface::{id as token_program_id,instruction::{freeze_account, initialize_mint, mint_to_checked},state::{Account, Mint},};#[tokio::main]async fn main() -> Result<()> {let client = RpcClient::new_with_commitment(String::from("http://localhost:8899"),CommitmentConfig::confirmed(),);let transaction = Transaction::new_signed_with_payer(&[freeze_account(&token_program_id(), // Token program to invoke.&associated_token_address, // Token account to freeze.&mint.pubkey(), // Mint for the token account being frozen.&fee_payer.pubkey(), // Freeze authority approving this change.&[], // Additional multisig signers.)?,],Some(&fee_payer.pubkey()),&[&fee_payer],latest_blockhash,);let transaction_signature = client.send_and_confirm_transaction(&transaction).await?;let token_account = client.get_account(&associated_token_address).await?;let token_data = Account::unpack(&token_account.data)?;println!("Mint Address: {}", mint.pubkey());println!("\nAssociated Token Account Address: {}",associated_token_address);println!("Associated Token Account: {:#?}", token_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.pubkey import Pubkeyfrom solders.system_program import create_account, CreateAccountParamsfrom solders.transaction import Transactionfrom spl.token.async_client import AsyncTokenfrom spl.token.instructions import (create_associated_token_account,freeze_account,FreezeAccountParams,get_associated_token_address,initialize_mint,InitializeMintParams,mint_to_checked,MintToCheckedParams,)from spl.token.constants import MINT_LEN, TOKEN_PROGRAM_IDDECIMALS = 2AMOUNT_TO_MINT = 100async def main():rpc = AsyncClient("http://localhost:8899")async with rpc:freeze_account_instruction = freeze_account(FreezeAccountParams(program_id=TOKEN_PROGRAM_ID, # Token program to invoke.account=token_account_address, # Token account to freeze.mint=mint.pubkey(), # Mint for the token account being frozen.authority=fee_payer.pubkey(), # Freeze authority approving the freeze.))latest_blockhash = await rpc.get_latest_blockhash()transaction = Transaction([fee_payer],Message([freeze_account_instruction], fee_payer.pubkey()),latest_blockhash.value.blockhash,)result = await rpc.send_transaction(transaction)token_account_info = await token.get_account_info(token_account_address)token_account = {key: str(value) if isinstance(value, Pubkey) else valuefor key, value in token_account_info._asdict().items()}print("Mint Address:", mint.pubkey())print("\nToken Account Address:", token_account_address)print("Token Account:")print(json.dumps(token_account, indent=2))print("\nTransaction Signature:", result.value)if __name__ == "__main__":asyncio.run(main())
Is this page helpful?