设置权限

设置权限有什么作用?

设置权限可以更改或撤销铸币账户或代币账户上的特定权限角色。

铸币账户可以存储铸币权限和冻结权限。代币账户存储所有者权限,并可选择性地存储关闭权限。每个角色控制特定的权限集,将权限设置为 None 将永久移除所选的权限角色。

Token Extensions Program 还为特定扩展定义了额外的权限类型。

如何设置权限

更改权限使用 Token Program 的 SetAuthority 指令。

每次调用都会更新一个铸币账户或代币账户上的一个权限类型。当前权限持有者对更改进行签名,新权限可以是另一个地址或 None 以永久撤销所选权限。

源代码参考

项目说明Token ProgramToken Extension Program
Mint铸币状态存储 mint_authorityfreeze_authority源代码源代码
Account代币账户状态存储 ownerclose_authority源代码源代码
AuthorityTypeSetAuthority 可以更新的权限角色。源代码源代码
SetAuthority更改或撤销铸币账户或代币账户上的一个权限的指令。源代码源代码
process_set_authority权限更新的共享处理逻辑。源代码源代码

Typescript

以下 Kit 示例展示了使用 @solana/kit 的推荐方法。同时包含了使用 @solana/web3.js 的传统示例以供参考。

Kit

import { generateKeyPairSigner } from "@solana/kit";
import { createLocalClient } from "@solana/kit-client-rpc";
import { AuthorityType, tokenProgram } from "@solana-program/token";
const client = await createLocalClient()
.use(tokenProgram());
const mint = await generateKeyPairSigner();
const newAuthority = await generateKeyPairSigner();
const result = await client.sendTransaction([
client.token.instructions.setAuthority({
owned: mint.address, // Mint whose authority changes.
owner: client.payer, // Current authority approving this change.
authorityType: AuthorityType.MintTokens, // Authority role to update on the mint.
newAuthority: newAuthority.address // New authority to assign to this role.
}),
client.token.instructions.setAuthority({
owned: mint.address, // Mint whose authority changes.
owner: client.payer, // Current authority approving this change.
authorityType: AuthorityType.FreezeAccount, // Authority role to update on the mint.
newAuthority: newAuthority.address // New authority to assign to this role.
})
]);
const mintAccount = await client.token.accounts.mint.fetch(mint.address);
console.log("Mint Address:", mint.address);
console.log("Mint Account:", mintAccount.data);
console.log("\nNew Authority Address:", newAuthority.address);
console.log("\nTransaction Signature:", result.context.signature);
Console
Click to execute the code.

Web3.js

import {
Connection,
Keypair,
sendAndConfirmTransaction,
Transaction,
LAMPORTS_PER_SOL
} from "@solana/web3.js";
import {
createMint,
AuthorityType,
createSetAuthorityInstruction,
getMint,
TOKEN_PROGRAM_ID
} from "@solana/spl-token";
const authorityBlockhash = await connection.getLatestBlockhash();
const result = await sendAndConfirmTransaction(
connection,
new Transaction({
feePayer: feePayer.publicKey,
blockhash: authorityBlockhash.blockhash,
lastValidBlockHeight: authorityBlockhash.lastValidBlockHeight
}).add(
createSetAuthorityInstruction(
mintPubkey, // Mint whose authority changes.
feePayer.publicKey, // Current authority approving this change.
AuthorityType.MintTokens, // Authority role to update on the mint.
newAuthority.publicKey, // New authority to assign to this role.
[], // Additional multisig signers.
TOKEN_PROGRAM_ID // Token program to invoke.
),
createSetAuthorityInstruction(
mintPubkey, // Mint whose authority changes.
feePayer.publicKey, // Current authority approving this change.
AuthorityType.FreezeAccount, // Authority role to update on the mint.
newAuthority.publicKey, // New authority to assign to this role.
[], // Additional multisig signers.
TOKEN_PROGRAM_ID // Token program to invoke.
)
),
[feePayer]
);
const mintAccount = await getMint(
connection,
mintPubkey,
"confirmed",
TOKEN_PROGRAM_ID
);
console.log("Mint Address:", mintPubkey.toBase58());
console.log("Mint Account:", mintAccount);
console.log("\nNew Authority Address:", newAuthority.publicKey.toBase58());
console.log("\nTransaction Signature:", result);
Console
Click to execute the code.

Rust

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, set_authority, AuthorityType},
state::Mint,
};
#[tokio::main]
async fn main() -> Result<()> {
let client = RpcClient::new_with_commitment(
String::from("http://localhost:8899"),
CommitmentConfig::confirmed(),
);
let new_authority = Keypair::new();
let transaction = Transaction::new_signed_with_payer(
&[
set_authority(
&token_program_id(), // Token program to invoke.
&mint.pubkey(), // Mint whose authority changes.
Some(&new_authority.pubkey()), // New authority to assign to this role.
AuthorityType::MintTokens, // Authority role to update on the mint.
&fee_payer.pubkey(), // Current authority approving this change.
&[], // Additional multisig signers.
)?,
set_authority(
&token_program_id(), // Token program to invoke.
&mint.pubkey(), // Mint whose authority changes.
Some(&new_authority.pubkey()), // New authority to assign to this role.
AuthorityType::FreezeAccount, // Authority role to update on the mint.
&fee_payer.pubkey(), // Current 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 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!("\nNew Authority Address: {}", new_authority.pubkey());
println!("\nTransaction Signature: {}", transaction_signature);
Ok(())
}
Console
Click to execute the code.

Python

Python
#!/usr/bin/env python3
import asyncio
import json
from solana.rpc.async_api import AsyncClient
from solders.keypair import Keypair
from solders.message import Message
from solders.pubkey import Pubkey
from solders.system_program import create_account, CreateAccountParams
from solders.transaction import Transaction
from spl.token.async_client import AsyncToken
from spl.token.instructions import (
AuthorityType,
initialize_mint,
InitializeMintParams,
set_authority,
SetAuthorityParams,
)
from spl.token.constants import MINT_LEN, TOKEN_PROGRAM_ID
async def main():
rpc = AsyncClient("http://localhost:8899")
new_authority = Keypair()
async with rpc:
set_authority_instruction = set_authority(
SetAuthorityParams(
program_id=TOKEN_PROGRAM_ID, # Token program to invoke.
account=mint.pubkey(), # Mint whose authority changes.
authority=AuthorityType.MINT_TOKENS, # Authority role to update.
current_authority=fee_payer.pubkey(), # Current authority approving the authority update.
new_authority=new_authority.pubkey(), # New authority for the selected role.
)
)
latest_blockhash = await rpc.get_latest_blockhash()
transaction = Transaction(
[fee_payer],
Message([set_authority_instruction], fee_payer.pubkey()),
latest_blockhash.value.blockhash,
)
result = await rpc.send_transaction(transaction)
mint_info = await token.get_mint_info()
mint_account = {
key: str(value) if isinstance(value, Pubkey) else value
for key, value in mint_info._asdict().items()
}
print("Mint Address:", mint.pubkey())
print("Mint Account:")
print(json.dumps(mint_account, indent=2))
print("\nNew Authority Address:", new_authority.pubkey())
print("\nTransaction Signature:", result.value)
if __name__ == "__main__":
asyncio.run(main())
Console
Click to execute the code.

Is this page helpful?

Table of Contents

Edit Page

管理者

©️ 2026 Solana 基金会版权所有
取得联系