Solana 네트워크에서 다양한 계정을 가져와 데이터를 읽어보세요. 이 가이드는 Solana 계정의 구조를 설명합니다. 각 Solana 계정에는 온체인 데이터를 찾는 데 사용되는 고유한 주소가 있습니다. Solana 계정은 상태 데이터 또는 실행 가능한 프로그램을 포함합니다.
지갑 계정 가져오기
지갑 계정은 System Program이 소유한 계정입니다. 지갑 계정은 주로 SOL을 보유하고 트랜잭션에 서명하는 데 사용됩니다. SOL이 처음으로 새 주소로 전송되면 시스템 계정이 자동으로 생성됩니다.
아래 예제는 Kit 클라이언트를 생성하고, 새 서명자를 생성하며, 새 주소에 자금을 지원하기 위해 SOL을 요청하고, 클라이언트의 RPC API에서 계정 데이터를 가져옵니다.
import { createClient, generateKeyPairSigner, lamports } from "@solana/kit";import { solanaRpc, rpcAirdrop } from "@solana/kit-plugin-rpc";import { generatedPayer } from "@solana/kit-plugin-signer";const client = await createClient().use(generatedPayer()).use(solanaRpc({rpcUrl: "http://localhost:8899",rpcSubscriptionsUrl: "ws://localhost:8900"})).use(rpcAirdrop());const signer = await generateKeyPairSigner();console.log(`Address: ${signer.address}`);// Funding an address with SOL automatically creates an accountawait client.airdrop(signer.address, lamports(1_000_000_000n));const accountInfo = await client.rpc.getAccountInfo(signer.address).send();console.log(accountInfo);
getAccountInfo()로 지갑 계정을 가져오면 Kit은 오른쪽 예제 출력에 표시된 RPC
응답을 반환합니다.
응답에는 두 개의 최상위 필드가 있습니다. context는 읽기가 발생한 시점을
나타내고, value는 RPC 메서드가 반환한 계정 필드를 포함합니다.
context 필드는 계정을 읽는 데 사용된 slot과 응답을 처리한 RPC API 버전을
보여줍니다. 이후 읽기에서는 다른 slot이나 API 버전이 반환될 수 있습니다.
value 필드에는 RPC 메서드가 반환한 계정 상태가 포함됩니다. 다음 단계에서는
value 내부의 필드를 나타나는 순서대로 설명합니다.
{context: {slot: 420602714n,apiVersion: "3.1.6"},value: {lamports: 1000000000n,data: ["", "base64"],owner: "11111111111111111111111111111111",executable: false,rentEpoch: 0n,space: 0n}}
lamports 필드에는 계정의 SOL 잔액이 포함되며, 가장 작은 SOL 단위인
lamports로 측정됩니다.
{context: {slot: 420602714n,apiVersion: "3.1.6"},value: {lamports: 1000000000n,data: ["", "base64"],owner: "11111111111111111111111111111111",executable: false,rentEpoch: 0n,space: 0n}}
data 필드에는 바이트로 저장된 계정 데이터가 포함됩니다. RPC는 계정 데이터를
튜플 형태로 반환합니다: 인코딩된 데이터 문자열과 인코딩 방식이 순서대로
제공됩니다. 지갑 계정의 경우, 계정에 저장된 데이터가 0바이트이므로 인코딩된
데이터 문자열은 비어 있습니다.
{context: {slot: 420602714n,apiVersion: "3.1.6"},value: {lamports: 1000000000n,data: ["", "base64"],owner: "11111111111111111111111111111111",executable: false,rentEpoch: 0n,space: 0n}}
owner 필드는 계정을 소유한 프로그램을 나타냅니다. 지갑의 경우, 소유자는 항상
System Program이며, 주소는 11111111111111111111111111111111입니다.
{context: {slot: 420602714n,apiVersion: "3.1.6"},value: {lamports: 1000000000n,data: ["", "base64"],owner: "11111111111111111111111111111111",executable: false,rentEpoch: 0n,space: 0n}}
executable 필드는 계정 주소가 호출 가능한지 여부를 나타냅니다. true는 해당
주소가 명령어를 처리할 수 있는 프로그램임을 의미합니다. false는 계정이 지갑
잔액이나 계정 데이터와 같은 상태를 저장하며, 프로그램으로 호출되지 않음을
의미합니다. 지갑 계정은 false를 사용합니다.
rentEpoch 필드는 더 이상 사용되지 않는 rent 메커니즘의 레거시 필드입니다. 이
필드는 하위 호환성을 위해 계속 반환됩니다.
{context: {slot: 420602714n,apiVersion: "3.1.6"},value: {lamports: 1000000000n,data: ["", "base64"],owner: "11111111111111111111111111111111",executable: false,rentEpoch: 0n,space: 0n}}
space 필드는 data 필드에 포함된 바이트 수를 나타냅니다. space 필드는 계정
조회 응답과 함께 반환되지만, 계정의 데이터 타입에는 포함되지 않습니다.
지갑 계정 예시의 경우, data 필드에 데이터가 0바이트 포함되어 있으므로 space
필드는 0입니다.
{context: {slot: 420602714n,apiVersion: "3.1.6"},value: {lamports: 1000000000n,data: ["", "base64"],owner: "11111111111111111111111111111111",executable: false,rentEpoch: 0n,space: 0n}}
Token Program 가져오기
아래 예제는 지갑 계정과 프로그램 계정의 차이를 보여주기 위해 Token Program을 가져옵니다. Token Program은 토큰 생성 및 전송과 같이 토큰을 다루는 명령어를 정의합니다. 명령어를 처리하기 위해 프로그램이 호출됩니다. 토큰 데이터와 잔액 같은 프로그램 상태는 해당 프로그램이 소유한 별도의 계정에 저장됩니다.
Token Program의 주소는 온체인 program account입니다. 간단히 말해, 프로그램 주소는 프로그램을 호출할 때 사용되는 주소이므로 프로그램 자체라고 생각할 수 있습니다. 업그레이드 가능한 프로그램의 경우, program account는 메타데이터를 저장하고 배포된 실행 코드를 저장하는 별도의 ProgramData 계정을 가리킵니다. Token Program의 소스 코드와 Solana Explorer에서 program account를 확인할 수 있습니다.
import { address, createClient, fetchJsonParsedAccount } from "@solana/kit";import { solanaRpc } from "@solana/kit-plugin-rpc";import { generatedPayer } from "@solana/kit-plugin-signer";const client = await createClient().use(generatedPayer()).use(solanaRpc({rpcUrl: "https://api.mainnet.solana.com"}));const tokenProgramAddress = address("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA");const accountInfo = await client.rpc.getAccountInfo(tokenProgramAddress, {encoding: "base64"}).send();console.log(accountInfo);const parsedAccount = await fetchJsonParsedAccount(client.rpc,tokenProgramAddress);console.log(parsedAccount);
Token Program은 실행 가능한 program account입니다. 프로그램은 모든 계정과 동일한 기본 필드를 가지지만, 몇 가지 중요한 차이점이 있습니다.
Token Program 예제는 program account의 원시 데이터를 반환하기 위해 base64
인코딩을 사용합니다.
다음 단계에서는 value 내부의 필드가 나타나는 순서대로 각 필드를 살펴봅니다.
{context: {apiVersion: "3.1.14",slot: 420601581n},value: {data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],executable: true,lamports: 2191440n,owner: "BPFLoaderUpgradeab1e11111111111111111111111",rentEpoch: 18446744073709551615n,space: 36n}}
data 필드는 BPF Upgradeable Loader의 program account 상태를 저장합니다. 첫
번째 튜플 항목에는 base64로 인코딩된 전체 계정 데이터가 포함됩니다. 두 번째 튜플
항목은 인코딩 방식을 나타냅니다. 여기서 36바이트에는 메타데이터와 programdata
account 주소가 포함됩니다.
업그레이드 가능한 프로그램의 경우, program account 상태는 프로그램의 실행 코드를 저장하는 별도의 programdata account를 가리킵니다.
{context: {apiVersion: "3.1.14",slot: 420601581n},value: {data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],executable: true,lamports: 2191440n,owner: "BPFLoaderUpgradeab1e11111111111111111111111",rentEpoch: 18446744073709551615n,space: 36n}}
executable 필드는 true로 설정되어 있으며, 이는 해당 계정의 주소가
프로그램으로 호출될 수 있음을 나타냅니다.
{context: {apiVersion: "3.1.14",slot: 420601581n},value: {data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],executable: true,lamports: 2191440n,owner: "BPFLoaderUpgradeab1e11111111111111111111111",rentEpoch: 18446744073709551615n,space: 36n}}
lamports 필드에는 program account가 보유한 SOL 잔액이 포함되어 있습니다.
Program account는 rent 면제 상태를 유지하기 위해 충분한 lamport가 필요합니다.
{context: {apiVersion: "3.1.14",slot: 420601581n},value: {data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],executable: true,lamports: 2191440n,owner: "BPFLoaderUpgradeab1e11111111111111111111111",rentEpoch: 18446744073709551615n,space: 36n}}
모든 program account는
로더 프로그램이
소유합니다. Token Program account의 경우, owner는 BPF Upgradeable
Loader입니다.
{context: {apiVersion: "3.1.14",slot: 420601581n},value: {data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],executable: true,lamports: 2191440n,owner: "BPFLoaderUpgradeab1e11111111111111111111111",rentEpoch: 18446744073709551615n,space: 36n}}
rentEpoch 필드는 더 이상 사용되지 않는 rent 메커니즘의 레거시 필드입니다. 이
필드는 하위 호환성을 위해 계속 반환됩니다.
{context: {apiVersion: "3.1.14",slot: 420601581n},value: {data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],executable: true,lamports: 2191440n,owner: "BPFLoaderUpgradeab1e11111111111111111111111",rentEpoch: 18446744073709551615n,space: 36n}}
space 필드는 program account 데이터의 전체 크기를 바이트 단위로 나타냅니다.
space 값이 36 바이트에 불과한 이유는, program account가 전체 컴파일된
프로그램이 아닌 로더 메타데이터와 ProgramData 계정의 주소를 저장하기 때문입니다.
{context: {apiVersion: "3.1.14",slot: 420601581n},value: {data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],executable: true,lamports: 2191440n,owner: "BPFLoaderUpgradeab1e11111111111111111111111",rentEpoch: 18446744073709551615n,space: 36n}}
이전 응답은 program account의 data 필드를 base64 튜플로 반환했습니다. 파싱된
응답은 해당 바이트를 data 객체의 명명된 필드로 역직렬화합니다. programData
필드에는 실행 가능한 프로그램 코드를 저장하는 ProgramData 계정의 주소가 포함되어
있습니다.
{executable: true,lamports: 43712780n,programAddress: "BPFLoaderUpgradeab1e11111111111111111111111",space: 36n,address: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",data: {programData: "3gvYRKWyXRR9xKWe1ZjPhLY5ZJRN7KDB4rFZFGoJfFk2",parsedAccountMeta: { program: "bpf-upgradeable-loader", type: "program" }},exists: true}
mint account 가져오기
mint account는 특정 토큰의 전역 메타데이터를 저장하는 Token Program 소유의 계정입니다. mint account는 토큰의 총 공급량, 소수점 자릿수, 발행 권한(mint authority), 동결 권한(freeze authority)을 저장합니다. mint account의 주소는 Solana 네트워크에서 토큰을 고유하게 식별합니다.
아래 예제는 USD Coin Mint 계정을 가져와 프로그램의 상태가 별도의 계정에 어떻게 저장되는지 보여줍니다. 정확한 잔액 및 공급량 값은 RPC 노드가 읽는 slot에 따라 다를 수 있습니다.
import { address, createClient } from "@solana/kit";import { solanaRpc } from "@solana/kit-plugin-rpc";import { generatedPayer } from "@solana/kit-plugin-signer";const client = await createClient().use(generatedPayer()).use(solanaRpc({rpcUrl: "https://api.mainnet.solana.com"}));const mintAddress = address("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");const accountInfo = await client.rpc.getAccountInfo(mintAddress, {encoding: "base64"}).send();console.log(accountInfo);
mint account는 실행 가능한 코드가 아닌 상태(state)를 저장합니다. mint account는 Token Program이 소유하며, Token Program에는 mint account를 생성하고 업데이트하는 방법을 정의하는 명령어가 포함되어 있습니다.
다음 단계에서는 value의 필드가 나타나는 순서대로 각 필드를 살펴봅니다.
{context: {slot: 325000000n,apiVersion: "3.1.14"},value: {data: ["AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==","base64"],executable: false,lamports: 407438077149n,owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",rentEpoch: 18446744073709551615n,space: 82n}}
data 필드에는 직렬화된 Mint 계정 상태가 포함되어 있습니다. 튜플의 첫 번째
항목에는 base64로 인코딩된 82바이트 전체 계정 데이터가 포함됩니다. 두 번째
항목은 인코딩 방식을 나타냅니다.
mint account에서 데이터를 읽으려면 data 필드를 Mint 데이터 타입으로
역직렬화해야 하며, 이는 다음 예제에서 확인할 수
있습니다.
{context: {slot: 325000000n,apiVersion: "3.1.14"},value: {data: ["AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==","base64"],executable: false,lamports: 407438077149n,owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",rentEpoch: 18446744073709551615n,space: 82n}}
executable 필드는 해당 계정을 프로그램으로 호출할 수 있는지 여부를 나타냅니다.
mint account는 상태를 저장하므로 executable 필드는 false입니다.
{context: {slot: 325000000n,apiVersion: "3.1.14"},value: {data: ["AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==","base64"],executable: false,lamports: 407438077149n,owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",rentEpoch: 18446744073709551615n,space: 82n}}
lamports 필드에는 mint account가 보유한 SOL 잔액이 포함됩니다. lamport 값은
토큰 공급량이 아닌 mint account의 렌트 면제(rent-exempt) 잔액입니다.
{context: {slot: 325000000n,apiVersion: "3.1.14"},value: {data: ["AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==","base64"],executable: false,lamports: 407438077149n,owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",rentEpoch: 18446744073709551615n,space: 82n}}
mint account는 Token Program이
소유합니다. mint account의 data 필드는 Token Program의 명령어로만 수정할 수
있습니다.
{context: {slot: 325000000n,apiVersion: "3.1.14"},value: {data: ["AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==","base64"],executable: false,lamports: 407438077149n,owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",rentEpoch: 18446744073709551615n,space: 82n}}
rentEpoch 필드는 더 이상 사용되지 않는 rent 메커니즘의 레거시 필드입니다. 이
필드는 하위 호환성을 위해 계속 반환됩니다.
{context: {slot: 325000000n,apiVersion: "3.1.14"},value: {data: ["AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==","base64"],executable: false,lamports: 407438077149n,owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",rentEpoch: 18446744073709551615n,space: 82n}}
space 필드는 mint account에 82바이트의 데이터가 포함되어 있음을 나타냅니다.
{context: {slot: 325000000n,apiVersion: "3.1.14"},value: {data: ["AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==","base64"],executable: false,lamports: 407438077149n,owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",rentEpoch: 18446744073709551615n,space: 82n}}
Mint account 역직렬화
계정 데이터는 직렬화된 형식으로 data 필드에 저장됩니다. supply 또는
decimals 같은 필드로 데이터를 읽으려면, data 필드를 소유 프로그램이 정의한
계정 타입으로 역직렬화해야 합니다. 대부분의 Solana 프로그램은 이 단계를 위한
헬퍼 함수가 포함된 클라이언트 라이브러리를 제공합니다. 이러한 헬퍼는 구조화된
계정 데이터를 반환하여 결과를 더 쉽게 다룰 수 있게 해줍니다.
예를 들어, @solana-program/token 라이브러리에는 mint account를 가져오고
mint account의 data 필드를 Token Program이 정의한
Mint
데이터 타입으로 역직렬화하는 fetchMint() 함수가 포함되어
있습니다.
import { address, createClient } from "@solana/kit";import { solanaRpc } from "@solana/kit-plugin-rpc";import { generatedPayer } from "@solana/kit-plugin-signer";import { fetchMint } from "@solana-program/token";const client = await createClient().use(generatedPayer()).use(solanaRpc({rpcUrl: "https://api.mainnet.solana.com"}));const mintAddress = address("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");const mint = await fetchMint(client.rpc, mintAddress);console.log(mint);
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>,}
fetchMint() 함수는 mint account를 가져오고 mint account의 data 필드를
Mint 계정 타입으로 역직렬화합니다.
{context: {slot: 325000000n,apiVersion: "3.1.14"},value: {data: ["AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==","base64"],executable: false,lamports: 407438077149n,owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",rentEpoch: 18446744073709551615n,space: 82n}}
Solana Explorer에서 완전히 역직렬화된 mint account 데이터를 확인할 수 있습니다.
{address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",data: {mintAuthority: {__option: "Some",value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"},supply: 8985397351591790n,decimals: 6,isInitialized: true,freezeAuthority: {__option: "Some",value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"}},executable: false,lamports: 407438077149n,programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",space: 82n}
address 필드에는 mint account의 주소가 포함되어 있습니다.
{address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",data: {mintAuthority: {__option: "Some",value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"},supply: 8985397351591790n,decimals: 6,isInitialized: true,freezeAuthority: {__option: "Some",value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"}},executable: false,lamports: 407438077149n,programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",space: 82n}
data 필드에는 역직렬화된 Mint 계정 상태가 포함되어 있습니다. data의 중첩
필드는 Token Program의 Mint 계정 유형에서 가져옵니다.
{address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",data: {mintAuthority: {__option: "Some",value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"},supply: 8985397351591790n,decimals: 6,isInitialized: true,freezeAuthority: {__option: "Some",value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"}},executable: false,lamports: 407438077149n,programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",space: 82n}
data.mintAuthority 필드는 토큰의 새 단위를 생성할 수 있는 유일한 계정을
나타냅니다.
{address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",data: {mintAuthority: {__option: "Some",value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"},supply: 8985397351591790n,decimals: 6,isInitialized: true,freezeAuthority: {__option: "Some",value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"}},executable: false,lamports: 407438077149n,programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",space: 82n}
supply 필드는 발행된 토큰의 총 수량을 나타냅니다. 공급량 값은 토큰의 최소
단위로 측정됩니다. 표준 단위로 총 공급량을 구하려면 supply 필드의 값을
decimals로 조정하십시오.
{address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",data: {mintAuthority: {__option: "Some",value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"},supply: 8985397351591790n,decimals: 6,isInitialized: true,freezeAuthority: {__option: "Some",value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"}},executable: false,lamports: 407438077149n,programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",space: 82n}
decimals 필드는 토큰의 소수점 자릿수를 나타냅니다.
{address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",data: {mintAuthority: {__option: "Some",value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"},supply: 8985397351591790n,decimals: 6,isInitialized: true,freezeAuthority: {__option: "Some",value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"}},executable: false,lamports: 407438077149n,programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",space: 82n}
isInitialized 필드는 mint account가 초기화되었는지 여부를 나타냅니다.
isInitialized 필드는 Token Program에서 사용되는 보안 검사입니다.
{address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",data: {mintAuthority: {__option: "Some",value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"},supply: 8985397351591790n,decimals: 6,isInitialized: true,freezeAuthority: {__option: "Some",value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"}},executable: false,lamports: 407438077149n,programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",space: 82n}
data.freezeAuthority 필드는 token account를 동결할 권한이 있는 계정을
나타냅니다. token account는 소유자의
토큰 단위를 저장하는 별도의 계정입니다. 동결된 경우, token account는 토큰 잔액을
전송하거나 소각할 수 없습니다.
{address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",data: {mintAuthority: {__option: "Some",value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"},supply: 8985397351591790n,decimals: 6,isInitialized: true,freezeAuthority: {__option: "Some",value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"}},executable: false,lamports: 407438077149n,programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",space: 82n}
executable 필드는 false입니다. USDC mint account는 토큰 상태를 저장하므로,
USDC mint account는 프로그램으로 호출될 수 없습니다.
{address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",data: {mintAuthority: {__option: "Some",value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"},supply: 8985397351591790n,decimals: 6,isInitialized: true,freezeAuthority: {__option: "Some",value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"}},executable: false,lamports: 407438077149n,programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",space: 82n}
lamports 필드는 mint account가 보유한 SOL 잔액을 나타냅니다. lamport 값은 토큰
공급량이 아니라 mint account의 렌트 면제 잔액입니다.
{address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",data: {mintAuthority: {__option: "Some",value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"},supply: 8985397351591790n,decimals: 6,isInitialized: true,freezeAuthority: {__option: "Some",value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"}},executable: false,lamports: 407438077149n,programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",space: 82n}
programAddress 필드는 mint account를 소유한 프로그램을 나타냅니다. USDC의
경우, 소유 프로그램은 Token Program입니다. 계정을 소유한 프로그램만이 해당
프로그램의 배포된 명령어를 통해 data 필드를 수정할 수 있습니다.
{address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",data: {mintAuthority: {__option: "Some",value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"},supply: 8985397351591790n,decimals: 6,isInitialized: true,freezeAuthority: {__option: "Some",value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"}},executable: false,lamports: 407438077149n,programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",space: 82n}
space 필드는 원래 mint account 데이터의 크기를 바이트 단위로 나타냅니다. Token
Program의 기본 Mint 계정은 82바이트입니다.
{address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",data: {mintAuthority: {__option: "Some",value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"},supply: 8985397351591790n,decimals: 6,isInitialized: true,freezeAuthority: {__option: "Some",value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"}},executable: false,lamports: 407438077149n,programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",space: 82n}
직렬화된 출력 vs 역직렬화된 출력
두 예시 모두 동일한 USDC mint account를 읽습니다. 첫 번째 응답은 data 필드를
직렬화된 상태로 둡니다. mint account의 내용을 읽으려면, 소유 프로그램이 정의한
계정 유형으로 해당 데이터를 디코딩해야 합니다. mint account의 경우, Token
Program이 오른쪽에 표시된 Mint 유형을 정의합니다.
디코딩하기 전에, data 필드에는 직렬화된 계정
데이터가 포함되어 있습니다.
{context: {slot: 325000000n,apiVersion: "3.1.14"},value: {data: ["AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==","base64"],executable: false,lamports: 407438077149n,owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",rentEpoch: 18446744073709551615n,space: 82n}}
데이터를 Mint로 디코딩한 후, data 필드에는 명명된
계정 필드가 포함됩니다.
{address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",data: {mintAuthority: {__option: "Some",value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"},supply: 8985397351591790n,decimals: 6,isInitialized: true,freezeAuthority: {__option: "Some",value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"}},executable: false,lamports: 407438077149n,programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",space: 82n}
Is this page helpful?