권한 설정이란 무엇인가요?
권한 설정은 mint account 또는 token account의 특정 권한 역할을 변경하거나 취소합니다.
Mint account는 민트 권한과 동결 권한을 저장할 수 있습니다. Token account는
소유자를 저장하며 선택적으로 닫기 권한을 저장할 수 있습니다. 각 역할은 특정 권한
집합을 제어하며, 권한을 None 로 설정하면 선택한 권한 역할이 영구적으로
제거됩니다.
Token Extensions Program은 특정 확장 기능을 위한 추가 권한 유형도 정의합니다.
권한 설정 방법
권한 변경은 Token Program의 SetAuthority 명령어를 사용합니다.
각 호출은 하나의 mint account 또는 token account에서 하나의 권한 유형을
업데이트합니다. 현재 권한 보유자가 변경에 서명하며, 새 권한은 다른 주소이거나
None 일 수 있습니다. None 로 설정하면 선택한 권한이 영구적으로
취소됩니다.
소스 참조
| 항목 | 설명 | Token Program | Token Extensions Program |
|---|---|---|---|
Mint | mint 상태는 mint_authority 와 freeze_authority 를 저장합니다. | 소스 | 소스 |
Account | token account 상태는 owner 와 close_authority 를 저장합니다. | 소스 | 소스 |
AuthorityType | SetAuthority 가 업데이트할 수 있는 권한 역할입니다. | 소스 | 소스 |
SetAuthority | mint account 또는 token account의 하나의 권한을 변경하거나 취소하는 명령어입니다. | 소스 | 소스 |
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 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 (AuthorityType,initialize_mint,InitializeMintParams,set_authority,SetAuthorityParams,)from spl.token.constants import MINT_LEN, TOKEN_PROGRAM_IDasync 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 valuefor 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?