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レスポンスを返します。
レスポンスには2つのトップレベルフィールドがあります。contextは読み取りが発生した時点を示し、valueはRPCメソッドが返すアカウントフィールドを含みます。
{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バージョンが返される場合があります。
{context: {slot: 420602714n,apiVersion: "3.1.6"},value: {lamports: 1000000000n,data: ["", "base64"],owner: "11111111111111111111111111111111",executable: false,rentEpoch: 0n,space: 0n}}
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の最小単位であるlamportで表されたアカウントのSOL残高が含まれています。
{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は、そのアドレスがinstructionsを処理できるプログラムであることを意味します。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は、トークンの作成や転送など、トークンを操作するためのinstructionsを定義しています。プログラムはinstructionsを処理するために呼び出されます。トークンデータや残高などのプログラムの状態は、そのプログラムが所有する別のアカウントに保存されます。
Token Programのアドレスは、オンチェーンのprogram accountです。シンプルに考えると、プログラムアドレスはプログラムそのものと捉えることができます。なぜなら、それが呼び出しに使用されるアドレスだからです。アップグレード可能なプログラムの場合、program accountはメタデータを保存し、デプロイされた実行可能コードを格納する別のprogramdata accountを参照します。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は実行可能なプログラムアカウントです。プログラムはすべてのアカウントと同じ基本フィールドを持ちますが、重要な違いがあります。
Token Programの例では、base64エンコーディングを使用して、program
accountの生データを返します。
以下のステップでは、value内のフィールドが表示される順番に沿って説明します。
dataフィールドには、BPF Upgradeable Loaderのprogram
accountの状態が格納されています。タプルの最初の要素には、base64でエンコードされた完全なアカウントデータが含まれます。2番目の要素はエンコーディングを示します。ここでは、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
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のアドレスが含まれています。
{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 accountのアドレスは、Solanaネットワーク上のトークンを一意に識別します。
以下の例では、USD Coin mint accountを取得し、プログラムの状態が別アカウントにどのように保存されるかを示しています。残高や供給量の正確な値は、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は状態を保存するものであり、実行可能なコードは含まれません。mint accountはToken Programが所有しており、Token Programにはmint accountの作成および更新方法を定義したinstructionsが含まれています。
以下のステップでは、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バイトの完全なアカウントデータが含まれます。タプルの2番目の要素はエンコード方式を示します。
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残高が含まれています。このlamportsの値は、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によってのみ変更できます。
{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プログラムは、このステップ用のヘルパー関数を含むクライアントライブラリを提供しています。これらのヘルパーは構造化されたアカウントデータを返すため、結果を扱いやすくなります。
たとえば、*shell@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>,}
*tsfetchMint()*関数は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}}
完全にデシリアライズされた mint account のデータをSolana Explorerで確認できます。
{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
accountsをフリーズする権限を持つアカウントを示します。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残高が含まれます。lamportsの値は、トークン供給量ではなく、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フィールドを変更できます。
{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}
シリアライズ出力とデシリアライズ出力
どちらの例も同じ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?