ネットワークからの読み取り

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レスポンスを返します。

レスポンスには2つのトップレベルフィールドがあります。contextは読み取りが発生した時点を示し、valueはRPCメソッドが返すアカウントフィールドを含みます。

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

contextフィールドには、アカウントの読み取りに使用されたslotと、レスポンスを返したRPC APIのバージョンが表示されます。後続の読み取りでは、異なるslotやAPIバージョンが返される場合があります。

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

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の最小単位であるlamportで表されたアカウントのSOL残高が含まれています。

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は、そのアドレスがinstructionsを処理できるプログラムであることを意味します。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レスポンスを返します。

レスポンスには2つのトップレベルフィールドがあります。contextは読み取りが発生した時点を示し、valueはRPCメソッドが返すアカウントフィールドを含みます。

contextフィールドには、アカウントの読み取りに使用されたslotと、レスポンスを返したRPC APIのバージョンが表示されます。後続の読み取りでは、異なるslotやAPIバージョンが返される場合があります。

valueフィールドには、RPCメソッドが返すアカウントの状態が含まれます。以降のステップでは、value内のフィールドを表示順に説明します。

lamportsフィールドには、SOLの最小単位であるlamportで表されたアカウントのSOL残高が含まれています。

dataフィールドには、バイト列として保存されたアカウントのデータが含まれています。RPCはアカウントデータをタプル形式で返します。エンコードされたデータ文字列の後にエンコーディングが続きます。ウォレットアカウントの場合、アカウントが保存するデータは0バイトのため、エンコードされたデータ文字列は空になります。

ownerフィールドは、アカウントを所有するプログラムを示します。ウォレットの場合、所有者は常にSystem Programであり、そのアドレスは11111111111111111111111111111111です。

executableフィールドは、アカウントのアドレスが呼び出し可能かどうかを示します。trueは、そのアドレスがinstructionsを処理できるプログラムであることを意味します。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は、トークンの作成や転送など、トークンを操作するためのinstructionsを定義しています。プログラムはinstructionsを処理するために呼び出されます。トークンデータや残高などのプログラムの状態は、そのプログラムが所有する別のアカウントに保存されます。

Token Programのアドレスは、オンチェーンのprogram accountです。シンプルに考えると、プログラムアドレスはプログラムそのものと捉えることができます。なぜなら、それが呼び出しに使用されるアドレスだからです。アップグレード可能なプログラムの場合、program accountはメタデータを保存し、デプロイされた実行可能コードを格納する別のprogramdata accountを参照します。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は実行可能なプログラムアカウントです。プログラムはすべてのアカウントと同じ基本フィールドを持ちますが、重要な違いがあります。

Token Programの例では、base64エンコーディングを使用して、program accountの生データを返します。

以下のステップでは、value内のフィールドが表示される順番に沿って説明します。

dataフィールドには、BPF Upgradeable Loaderのprogram accountの状態が格納されています。タプルの最初の要素には、base64でエンコードされた完全なアカウントデータが含まれます。2番目の要素はエンコーディングを示します。ここでは、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 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
}
}

前のレスポンスでは、program accountのdataフィールドがbase64タプルとして返されました。パース済みのレスポンスでは、それらのバイトがdataオブジェクトの名前付きフィールドにデシリアライズされます。programDataフィールドには、実行可能なプログラムコードを格納するprogramdata accountのアドレスが含まれています。

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は実行可能なプログラムアカウントです。プログラムはすべてのアカウントと同じ基本フィールドを持ちますが、重要な違いがあります。

Token Programの例では、base64エンコーディングを使用して、program accountの生データを返します。

以下のステップでは、value内のフィールドが表示される順番に沿って説明します。

dataフィールドには、BPF Upgradeable Loaderのprogram accountの状態が格納されています。タプルの最初の要素には、base64でエンコードされた完全なアカウントデータが含まれます。2番目の要素はエンコーディングを示します。ここでは、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 accountのアドレスが格納されているためです。

前のレスポンスでは、program accountのdataフィールドがbase64タプルとして返されました。パース済みのレスポンスでは、それらのバイトがdataオブジェクトの名前付きフィールドにデシリアライズされます。programDataフィールドには、実行可能なプログラムコードを格納する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
}
}

mint accountの取得

mint accountは、特定のトークンのグローバルメタデータを保存する、Token Programが所有するアカウントです。mint accountには、トークンの総供給量、小数点以下の桁数、ミント権限、およびフリーズ権限が保存されています。mint accountのアドレスは、Solanaネットワーク上のトークンを一意に識別します。

以下の例では、USD Coin mint accountを取得し、プログラムの状態が別アカウントにどのように保存されるかを示しています。残高や供給量の正確な値は、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は状態を保存するものであり、実行可能なコードは含まれません。mint accountはToken Programが所有しており、Token Programにはmint accountの作成および更新方法を定義したinstructionsが含まれています。

以下のステップでは、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バイトの完全なアカウントデータが含まれます。タプルの2番目の要素はエンコード方式を示します。

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残高が含まれています。このlamportsの値は、mint accountのレント免除残高であり、トークンの供給量ではありません。

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のinstructionsによってのみ変更できます。

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は状態を保存するものであり、実行可能なコードは含まれません。mint accountはToken Programが所有しており、Token Programにはmint accountの作成および更新方法を定義したinstructionsが含まれています。

以下のステップでは、value内のフィールドを、フィールドが現れる順序に沿って説明します。

dataフィールドには、シリアライズされたMintアカウントの状態が含まれています。タプルの最初の要素には、base64でエンコードされた82バイトの完全なアカウントデータが含まれます。タプルの2番目の要素はエンコード方式を示します。

mint accountから読み取るには、dataフィールドをMintデータ型にデシリアライズする必要があります。これは次の例に示されています。

executableフィールドは、そのアカウントがプログラムとして呼び出し可能かどうかを示します。mint accountは状態を保存するものであるため、executableフィールドはfalseです。

lamportsフィールドには、mint accountが保有するSOL残高が含まれています。このlamportsの値は、mint accountのレント免除残高であり、トークンの供給量ではありません。

mint accountはToken Programによって所有されています。mint accountのdataフィールドは、Token Programのinstructionsによってのみ変更できます。

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フィールドにシリアライズされた形式で保存されています。supplydecimalsといったフィールドとしてデータを読み取るには、dataフィールドを所有プログラムが定義するアカウント型にデシリアライズする必要があります。ほとんどのSolanaプログラムは、このステップ用のヘルパー関数を含むクライアントライブラリを提供しています。これらのヘルパーは構造化されたアカウントデータを返すため、結果を扱いやすくなります。

たとえば、*shell@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>,
}

*tsfetchMint()*関数は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
}
}

完全にデシリアライズされた mint account のデータをSolana Explorerで確認できます。

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 accountsをフリーズする権限を持つアカウントを示します。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残高が含まれます。lamportsの値は、トークン供給量ではなく、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です。アカウントを所有するプログラムのみが、そのプログラムにデプロイされたinstructionsを通じて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
}

*tsfetchMint()*関数は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
}
}

完全にデシリアライズされた mint account のデータをSolana Explorerで確認できます。

addressフィールドには、mint accountのアドレスが含まれています。

dataフィールドには、デシリアライズされたMintアカウントの状態が含まれています。dataのネストされたフィールドは、Token ProgramのMintアカウント型から来ています。

data.mintAuthorityフィールドは、トークンの新しいユニットを作成できる唯一のアカウントを示しています。

supplyフィールドは、ミントされたトークンの総数を示しています。供給量の値はトークンの最小単位で計測されます。標準単位での総供給量を取得するには、supplyフィールドの値をdecimalsで調整してください。

decimalsフィールドは、トークンの小数点以下の桁数を示しています。

isInitializedフィールドは、mint accountが初期化済みかどうかを示します。isInitializedフィールドは、Token Programで使用されるセキュリティチェックです。

data.freezeAuthorityフィールドは、token accountsをフリーズする権限を持つアカウントを示します。token accountは、所有者のトークン残高を保存する別のアカウントです。フリーズされたtoken accountは、トークン残高の転送やバーンができなくなります。

executableフィールドはfalseです。USDCのmint accountはトークンの状態を保存するため、USDCのmint accountはプログラムとして呼び出すことができません。

lamportsフィールドには、mint accountが保有するSOL残高が含まれます。lamportsの値は、トークン供給量ではなく、mint accountのレント免除残高です。

programAddressフィールドは、mint accountを所有するプログラムを示します。USDCの場合、所有プログラムはToken Programです。アカウントを所有するプログラムのみが、そのプログラムにデプロイされたinstructionsを通じて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
}

シリアライズ出力とデシリアライズ出力

どちらの例も同じ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?

目次

ページを編集
© 2026 Solana Foundation. 無断転載を禁じます。