네트워크에서 읽기

Solana 네트워크에서 다양한 계정을 가져와 데이터를 읽어보세요. 이 가이드는 Solana 계정의 구조를 설명합니다. 각 Solana 계정에는 온체인 데이터를 찾는 데 사용되는 고유한 주소가 있습니다. Solana 계정은 상태 데이터 또는 실행 가능한 프로그램을 포함합니다.

지갑 계정 가져오기

지갑 계정은 System Program이 소유한 계정입니다. 지갑 계정은 주로 SOL을 보유하고 트랜잭션에 서명하는 데 사용됩니다. SOL이 처음으로 새 주소로 전송되면 시스템 계정이 자동으로 생성됩니다.

아래 예제는 Kit 클라이언트를 생성하고, 새 서명자를 생성하며, 새 주소에 자금을 지원하기 위해 SOL을 요청하고, 클라이언트의 RPC API에서 계정 데이터를 가져옵니다.

Fetch account
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 account
await client.airdrop(signer.address, lamports(1_000_000_000n));
const accountInfo = await client.rpc.getAccountInfo(signer.address).send();
console.log(accountInfo);
Console
Click to execute the code.

getAccountInfo()로 지갑 계정을 가져오면 Kit은 오른쪽 예제 출력에 표시된 RPC 응답을 반환합니다.

응답에는 두 개의 최상위 필드가 있습니다. context는 읽기가 발생한 시점을 나타내고, value는 RPC 메서드가 반환한 계정 필드를 포함합니다.

context 필드는 계정을 읽는 데 사용된 slot과 응답을 처리한 RPC API 버전을 보여줍니다. 이후 읽기에서는 다른 slot이나 API 버전이 반환될 수 있습니다.

value 필드에는 RPC 메서드가 반환한 계정 상태가 포함됩니다. 다음 단계에서는 value 내부의 필드를 나타나는 순서대로 설명합니다.

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

lamports 필드에는 계정의 SOL 잔액이 포함되며, 가장 작은 SOL 단위인 lamports로 측정됩니다.

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

data 필드에는 바이트로 저장된 계정 데이터가 포함됩니다. RPC는 계정 데이터를 튜플 형태로 반환합니다: 인코딩된 데이터 문자열과 인코딩 방식이 순서대로 제공됩니다. 지갑 계정의 경우, 계정에 저장된 데이터가 0바이트이므로 인코딩된 데이터 문자열은 비어 있습니다.

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

owner 필드는 계정을 소유한 프로그램을 나타냅니다. 지갑의 경우, 소유자는 항상 System Program이며, 주소는 11111111111111111111111111111111입니다.

Example output
{
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 메커니즘의 레거시 필드입니다. 이 필드는 하위 호환성을 위해 계속 반환됩니다.

Example output
{
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입니다.

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

getAccountInfo()로 지갑 계정을 가져오면 Kit은 오른쪽 예제 출력에 표시된 RPC 응답을 반환합니다.

응답에는 두 개의 최상위 필드가 있습니다. context는 읽기가 발생한 시점을 나타내고, value는 RPC 메서드가 반환한 계정 필드를 포함합니다.

context 필드는 계정을 읽는 데 사용된 slot과 응답을 처리한 RPC API 버전을 보여줍니다. 이후 읽기에서는 다른 slot이나 API 버전이 반환될 수 있습니다.

value 필드에는 RPC 메서드가 반환한 계정 상태가 포함됩니다. 다음 단계에서는 value 내부의 필드를 나타나는 순서대로 설명합니다.

lamports 필드에는 계정의 SOL 잔액이 포함되며, 가장 작은 SOL 단위인 lamports로 측정됩니다.

data 필드에는 바이트로 저장된 계정 데이터가 포함됩니다. RPC는 계정 데이터를 튜플 형태로 반환합니다: 인코딩된 데이터 문자열과 인코딩 방식이 순서대로 제공됩니다. 지갑 계정의 경우, 계정에 저장된 데이터가 0바이트이므로 인코딩된 데이터 문자열은 비어 있습니다.

owner 필드는 계정을 소유한 프로그램을 나타냅니다. 지갑의 경우, 소유자는 항상 System Program이며, 주소는 11111111111111111111111111111111입니다.

executable 필드는 계정 주소가 호출 가능한지 여부를 나타냅니다. true는 해당 주소가 명령어를 처리할 수 있는 프로그램임을 의미합니다. false는 계정이 지갑 잔액이나 계정 데이터와 같은 상태를 저장하며, 프로그램으로 호출되지 않음을 의미합니다. 지갑 계정은 false를 사용합니다.

rentEpoch 필드는 더 이상 사용되지 않는 rent 메커니즘의 레거시 필드입니다. 이 필드는 하위 호환성을 위해 계속 반환됩니다.

space 필드는 data 필드에 포함된 바이트 수를 나타냅니다. space 필드는 계정 조회 응답과 함께 반환되지만, 계정의 데이터 타입에는 포함되지 않습니다.

지갑 계정 예시의 경우, data 필드에 데이터가 0바이트 포함되어 있으므로 space 필드는 0입니다.

Example output
{
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를 확인할 수 있습니다.

Fetch 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);
Console
Click to execute the code.

Token Program은 실행 가능한 program account입니다. 프로그램은 모든 계정과 동일한 기본 필드를 가지지만, 몇 가지 중요한 차이점이 있습니다.

Token Program 예제는 program account의 원시 데이터를 반환하기 위해 base64 인코딩을 사용합니다.

다음 단계에서는 value 내부의 필드가 나타나는 순서대로 각 필드를 살펴봅니다.

Token program 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
}
}

data 필드는 BPF Upgradeable Loader의 program account 상태를 저장합니다. 첫 번째 튜플 항목에는 base64로 인코딩된 전체 계정 데이터가 포함됩니다. 두 번째 튜플 항목은 인코딩 방식을 나타냅니다. 여기서 36바이트에는 메타데이터와 programdata account 주소가 포함됩니다.

업그레이드 가능한 프로그램의 경우, program account 상태는 프로그램의 실행 코드를 저장하는 별도의 programdata account를 가리킵니다.

Token program 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로 설정되어 있으며, 이는 해당 계정의 주소가 프로그램으로 호출될 수 있음을 나타냅니다.

Token program 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
}
}

lamports 필드에는 program account가 보유한 SOL 잔액이 포함되어 있습니다. Program account는 rent 면제 상태를 유지하기 위해 충분한 lamport가 필요합니다.

Token program 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
}
}

모든 program account는 로더 프로그램이 소유합니다. Token Program account의 경우, owner는 BPF Upgradeable Loader입니다.

Token program 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
}
}

rentEpoch 필드는 더 이상 사용되지 않는 rent 메커니즘의 레거시 필드입니다. 이 필드는 하위 호환성을 위해 계속 반환됩니다.

Token program 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
}
}

space 필드는 program account 데이터의 전체 크기를 바이트 단위로 나타냅니다. space 값이 36 바이트에 불과한 이유는, program account가 전체 컴파일된 프로그램이 아닌 로더 메타데이터와 ProgramData 계정의 주소를 저장하기 때문입니다.

Token program 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
}
}

이전 응답은 program account의 data 필드를 base64 튜플로 반환했습니다. 파싱된 응답은 해당 바이트를 data 객체의 명명된 필드로 역직렬화합니다. programData 필드에는 실행 가능한 프로그램 코드를 저장하는 ProgramData 계정의 주소가 포함되어 있습니다.

Parsed Token program account
{
executable: true,
lamports: 43712780n,
programAddress: "BPFLoaderUpgradeab1e11111111111111111111111",
space: 36n,
address: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
data: {
programData: "3gvYRKWyXRR9xKWe1ZjPhLY5ZJRN7KDB4rFZFGoJfFk2",
parsedAccountMeta: { program: "bpf-upgradeable-loader", type: "program" }
},
exists: true
}

Token Program은 실행 가능한 program account입니다. 프로그램은 모든 계정과 동일한 기본 필드를 가지지만, 몇 가지 중요한 차이점이 있습니다.

Token Program 예제는 program account의 원시 데이터를 반환하기 위해 base64 인코딩을 사용합니다.

다음 단계에서는 value 내부의 필드가 나타나는 순서대로 각 필드를 살펴봅니다.

data 필드는 BPF Upgradeable Loader의 program account 상태를 저장합니다. 첫 번째 튜플 항목에는 base64로 인코딩된 전체 계정 데이터가 포함됩니다. 두 번째 튜플 항목은 인코딩 방식을 나타냅니다. 여기서 36바이트에는 메타데이터와 programdata account 주소가 포함됩니다.

업그레이드 가능한 프로그램의 경우, program account 상태는 프로그램의 실행 코드를 저장하는 별도의 programdata account를 가리킵니다.

executable 필드는 true로 설정되어 있으며, 이는 해당 계정의 주소가 프로그램으로 호출될 수 있음을 나타냅니다.

lamports 필드에는 program account가 보유한 SOL 잔액이 포함되어 있습니다. Program account는 rent 면제 상태를 유지하기 위해 충분한 lamport가 필요합니다.

모든 program account는 로더 프로그램이 소유합니다. Token Program account의 경우, owner는 BPF Upgradeable Loader입니다.

rentEpoch 필드는 더 이상 사용되지 않는 rent 메커니즘의 레거시 필드입니다. 이 필드는 하위 호환성을 위해 계속 반환됩니다.

space 필드는 program account 데이터의 전체 크기를 바이트 단위로 나타냅니다. space 값이 36 바이트에 불과한 이유는, program account가 전체 컴파일된 프로그램이 아닌 로더 메타데이터와 ProgramData 계정의 주소를 저장하기 때문입니다.

이전 응답은 program account의 data 필드를 base64 튜플로 반환했습니다. 파싱된 응답은 해당 바이트를 data 객체의 명명된 필드로 역직렬화합니다. programData 필드에는 실행 가능한 프로그램 코드를 저장하는 ProgramData 계정의 주소가 포함되어 있습니다.

Token program 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
}
}

mint account 가져오기

mint account는 특정 토큰의 전역 메타데이터를 저장하는 Token Program 소유의 계정입니다. mint account는 토큰의 총 공급량, 소수점 자릿수, 발행 권한(mint authority), 동결 권한(freeze authority)을 저장합니다. mint account의 주소는 Solana 네트워크에서 토큰을 고유하게 식별합니다.

아래 예제는 USD Coin Mint 계정을 가져와 프로그램의 상태가 별도의 계정에 어떻게 저장되는지 보여줍니다. 정확한 잔액 및 공급량 값은 RPC 노드가 읽는 slot에 따라 다를 수 있습니다.

Fetch mint account
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);
Console
Click to execute the code.

mint account는 실행 가능한 코드가 아닌 상태(state)를 저장합니다. mint account는 Token Program이 소유하며, Token Program에는 mint account를 생성하고 업데이트하는 방법을 정의하는 명령어가 포함되어 있습니다.

다음 단계에서는 value의 필드가 나타나는 순서대로 각 필드를 살펴봅니다.

Mint account
{
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 데이터 타입으로 역직렬화해야 하며, 이는 다음 예제에서 확인할 수 있습니다.

Mint account
{
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입니다.

Mint account
{
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) 잔액입니다.

Mint account
{
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의 명령어로만 수정할 수 있습니다.

Mint account
{
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 메커니즘의 레거시 필드입니다. 이 필드는 하위 호환성을 위해 계속 반환됩니다.

Mint account
{
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바이트의 데이터가 포함되어 있음을 나타냅니다.

Mint account
{
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는 실행 가능한 코드가 아닌 상태(state)를 저장합니다. mint account는 Token Program이 소유하며, Token Program에는 mint account를 생성하고 업데이트하는 방법을 정의하는 명령어가 포함되어 있습니다.

다음 단계에서는 value의 필드가 나타나는 순서대로 각 필드를 살펴봅니다.

data 필드에는 직렬화된 Mint 계정 상태가 포함되어 있습니다. 튜플의 첫 번째 항목에는 base64로 인코딩된 82바이트 전체 계정 데이터가 포함됩니다. 두 번째 항목은 인코딩 방식을 나타냅니다.

mint account에서 데이터를 읽으려면 data 필드를 Mint 데이터 타입으로 역직렬화해야 하며, 이는 다음 예제에서 확인할 수 있습니다.

executable 필드는 해당 계정을 프로그램으로 호출할 수 있는지 여부를 나타냅니다. mint account는 상태를 저장하므로 executable 필드는 false입니다.

lamports 필드에는 mint account가 보유한 SOL 잔액이 포함됩니다. lamport 값은 토큰 공급량이 아닌 mint account의 렌트 면제(rent-exempt) 잔액입니다.

mint account는 Token Program이 소유합니다. mint account의 data 필드는 Token Program의 명령어로만 수정할 수 있습니다.

rentEpoch 필드는 더 이상 사용되지 않는 rent 메커니즘의 레거시 필드입니다. 이 필드는 하위 호환성을 위해 계속 반환됩니다.

space 필드는 mint account에 82바이트의 데이터가 포함되어 있음을 나타냅니다.

Mint account
{
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() 함수가 포함되어 있습니다.

Deserialize mint account data
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);
Console
Click to execute the code.
Mint account type
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 initialized
pub is_initialized: bool,
/// Optional authority to freeze token accounts.
pub freeze_authority: COption<Pubkey>,
}

fetchMint() 함수는 mint account를 가져오고 mint account의 data 필드를 Mint 계정 타입으로 역직렬화합니다.

Mint account
{
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 데이터를 확인할 수 있습니다.

Decoded 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의 주소가 포함되어 있습니다.

Decoded 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 계정 유형에서 가져옵니다.

Decoded 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.mintAuthority 필드는 토큰의 새 단위를 생성할 수 있는 유일한 계정을 나타냅니다.

Decoded 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
}

supply 필드는 발행된 토큰의 총 수량을 나타냅니다. 공급량 값은 토큰의 최소 단위로 측정됩니다. 표준 단위로 총 공급량을 구하려면 supply 필드의 값을 decimals로 조정하십시오.

Decoded 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
}

decimals 필드는 토큰의 소수점 자릿수를 나타냅니다.

Decoded 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
}

isInitialized 필드는 mint account가 초기화되었는지 여부를 나타냅니다. isInitialized 필드는 Token Program에서 사용되는 보안 검사입니다.

Decoded 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.freezeAuthority 필드는 token account를 동결할 권한이 있는 계정을 나타냅니다. token account는 소유자의 토큰 단위를 저장하는 별도의 계정입니다. 동결된 경우, token account는 토큰 잔액을 전송하거나 소각할 수 없습니다.

Decoded 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
}

executable 필드는 false입니다. USDC mint account는 토큰 상태를 저장하므로, USDC mint account는 프로그램으로 호출될 수 없습니다.

Decoded 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의 렌트 면제 잔액입니다.

Decoded 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 필드를 수정할 수 있습니다.

Decoded 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
}

space 필드는 원래 mint account 데이터의 크기를 바이트 단위로 나타냅니다. Token Program의 기본 Mint 계정은 82바이트입니다.

Decoded 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
}

fetchMint() 함수는 mint account를 가져오고 mint account의 data 필드를 Mint 계정 타입으로 역직렬화합니다.

Mint account
{
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 필드에는 mint account의 주소가 포함되어 있습니다.

data 필드에는 역직렬화된 Mint 계정 상태가 포함되어 있습니다. data의 중첩 필드는 Token Program의 Mint 계정 유형에서 가져옵니다.

data.mintAuthority 필드는 토큰의 새 단위를 생성할 수 있는 유일한 계정을 나타냅니다.

supply 필드는 발행된 토큰의 총 수량을 나타냅니다. 공급량 값은 토큰의 최소 단위로 측정됩니다. 표준 단위로 총 공급량을 구하려면 supply 필드의 값을 decimals로 조정하십시오.

decimals 필드는 토큰의 소수점 자릿수를 나타냅니다.

isInitialized 필드는 mint account가 초기화되었는지 여부를 나타냅니다. isInitialized 필드는 Token Program에서 사용되는 보안 검사입니다.

data.freezeAuthority 필드는 token account를 동결할 권한이 있는 계정을 나타냅니다. token account는 소유자의 토큰 단위를 저장하는 별도의 계정입니다. 동결된 경우, token account는 토큰 잔액을 전송하거나 소각할 수 없습니다.

executable 필드는 false입니다. USDC mint account는 토큰 상태를 저장하므로, USDC mint account는 프로그램으로 호출될 수 없습니다.

lamports 필드는 mint account가 보유한 SOL 잔액을 나타냅니다. lamport 값은 토큰 공급량이 아니라 mint account의 렌트 면제 잔액입니다.

programAddress 필드는 mint account를 소유한 프로그램을 나타냅니다. USDC의 경우, 소유 프로그램은 Token Program입니다. 계정을 소유한 프로그램만이 해당 프로그램의 배포된 명령어를 통해 data 필드를 수정할 수 있습니다.

space 필드는 원래 mint account 데이터의 크기를 바이트 단위로 나타냅니다. Token Program의 기본 Mint 계정은 82바이트입니다.

Decoded 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
}

직렬화된 출력 vs 역직렬화된 출력

두 예시 모두 동일한 USDC mint account를 읽습니다. 첫 번째 응답은 data 필드를 직렬화된 상태로 둡니다. mint account의 내용을 읽으려면, 소유 프로그램이 정의한 계정 유형으로 해당 데이터를 디코딩해야 합니다. mint account의 경우, Token Program이 오른쪽에 표시된 Mint 유형을 정의합니다.

디코딩하기 전에, data 필드에는 직렬화된 계정 데이터가 포함되어 있습니다.

Serialized mint account
{
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 필드에는 명명된 계정 필드가 포함됩니다.

Deserialized 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
}

Is this page helpful?

목차

페이지 편집