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

Solanaネットワークから異なるアカウントを取得してデータを読み取ります。このセクションでは、Solanaのアカウントの構造を理解するのに役立ちます。各Solanaアカウントには、対応するオンチェーンデータを見つけるために使用される一意のアドレスがあります。アカウントには状態データまたは実行可能なプログラムが含まれています。

ウォレットアカウントの取得

ウォレットはSystem Programが所有するアカウントです。ウォレットは主にSOLを保持し、トランザクションに署名するために使用されます。SOLが初めて新しいアドレスに送信されると、システムアカウントが自動的に作成されます。

以下の例では、新しいキーペアを生成し、新しい公開鍵アドレスに資金を提供するためにSOLをリクエストし、新しく資金提供されたウォレットのアカウントデータを取得します。

Fetch account
import { Keypair, Connection, LAMPORTS_PER_SOL } from "@solana/web3.js";
const keypair = Keypair.generate();
console.log(`Public Key: ${keypair.publicKey}`);
const connection = new Connection("http://localhost:8899", "confirmed");
// Funding an address with SOL automatically creates an account
const signature = await connection.requestAirdrop(
keypair.publicKey,
LAMPORTS_PER_SOL
);
await connection.confirmTransaction(signature, "confirmed");
const accountInfo = await connection.getAccountInfo(keypair.publicKey);
console.log(JSON.stringify(accountInfo, null, 2));
Console
Click to execute the code.

ウォレットアカウントを取得すると、右側の例に示すようなフィールドがレスポンスに含まれます。

dataフィールドには、バイトとして保存されたアカウントのデータが含まれています。ウォレットアカウントの場合、このフィールドは空(0バイト)です。

executableフィールドは、アカウントのdataフィールドに実行可能なプログラムコードが含まれているかどうかを示します。ウォレットアカウントの場合、このフィールドはfalseです。

lamportsフィールドには、lamport単位のアカウントのSOL残高が含まれています。

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

rentEpoch フィールドは、廃止された rent メカニズムからの古いフィールドです。(このフィールドは後方互換性のために含まれています。)

space フィールドは、data フィールドに含まれるバイト数を示します。これは Account タイプ自体のフィールドではありませんが、レスポンスに含まれています。

この例では、data フィールドに0バイトのデータが含まれているため、space フィールドは0です。

ウォレットアカウントを取得すると、右側の例に示すようなフィールドがレスポンスに含まれます。

dataフィールドには、バイトとして保存されたアカウントのデータが含まれています。ウォレットアカウントの場合、このフィールドは空(0バイト)です。

executableフィールドは、アカウントのdataフィールドに実行可能なプログラムコードが含まれているかどうかを示します。ウォレットアカウントの場合、このフィールドはfalseです。

lamportsフィールドには、lamport単位のアカウントのSOL残高が含まれています。

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

rentEpoch フィールドは、廃止された rent メカニズムからの古いフィールドです。(このフィールドは後方互換性のために含まれています。)

space フィールドは、data フィールドに含まれるバイト数を示します。これは Account タイプ自体のフィールドではありませんが、レスポンスに含まれています。

この例では、data フィールドに0バイトのデータが含まれているため、space フィールドは0です。

Example output
{
"data": {
"type": "Buffer",
"data": []
},
"executable": false,
"lamports": 1000000000,
"owner": "11111111111111111111111111111111",
"rentEpoch": 0,
"space": 0
}

Token Programを取得する

以下の例では、ウォレットとプログラムアカウントの違いを示すためにToken Programを取得します。プログラムアカウントには、Token Programの ソースコードのコンパイルされたバイトコードが格納されています。このプログラムアカウントは Solana Explorerで確認できます。

Fetch program account
import { Connection, PublicKey } from "@solana/web3.js";
const connection = new Connection(
"https://api.mainnet-beta.solana.com",
"confirmed"
);
const address = new PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA");
const accountInfo = await connection.getAccountInfo(address);
Console
Click to execute the code.

Token Programは実行可能なprogram accountです。プログラムは基本的に全てのアカウントと同じフィールドを持ちますが、重要な違いがあります。

Token program account
{
"data": {
"type": "Buffer",
"data": [127, "...truncated, total bytes: 134080...", 0]
},
"executable": true,
"lamports": 4522329612,
"owner": "BPFLoader2111111111111111111111111111111111",
"rentEpoch": 18446744073709552000,
"space": 134080
}

executableフィールドはtrueに設定されており、アカウントのdataフィールドに実行可能なコードが含まれていることを示しています。

dataフィールドにはプログラムの実行可能コードが格納されています。

すべてのprogram accountは、そのローダープログラム(loader program)によって所有されています。この例では、ownerはBPFLoader2プログラムです。

Token Programは実行可能なprogram accountです。プログラムは基本的に全てのアカウントと同じフィールドを持ちますが、重要な違いがあります。

executableフィールドはtrueに設定されており、アカウントのdataフィールドに実行可能なコードが含まれていることを示しています。

dataフィールドにはプログラムの実行可能コードが格納されています。

すべてのprogram accountは、そのローダープログラム(loader program)によって所有されています。この例では、ownerはBPFLoader2プログラムです。

Token program account
{
"data": {
"type": "Buffer",
"data": [127, "...truncated, total bytes: 134080...", 0]
},
"executable": true,
"lamports": 4522329612,
"owner": "BPFLoader2111111111111111111111111111111111",
"rentEpoch": 18446744073709552000,
"space": 134080
}

mint accountの取得

mint accountは、Token Programによって所有されるアカウントで、特定のトークンに関するグローバルなメタデータを格納します。これには、総供給量、小数点以下の桁数、トークンの発行や凍結を許可されたアカウントが含まれます。mint accountのアドレスは、Solanaネットワーク上のトークンを一意に識別します。

以下の例では、USD Coin Mint accountを取得して、プログラムの状態が別のアカウントにどのように格納されるかを示しています。

Fetch program account
import { Connection, PublicKey } from "@solana/web3.js";
const connection = new Connection(
"https://api.mainnet-beta.solana.com",
"confirmed"
);
const address = new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");
const accountInfo = await connection.getAccountInfo(address);
Console
Click to execute the code.

mint accountは実行可能コードではなく状態を格納します。これらはToken Programによって所有され、Token Programにはmint accountの作成と更新方法を定義するinstructionsが含まれています。

Mint account
{
"data": {
"type": "Buffer",
"data": [1, "...truncated, total bytes: 82...", 103]
},
"executable": false,
"lamports": 407438077149,
"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
"rentEpoch": 18446744073709552000,
"space": 82
}

mint accountのdataフィールドは実行可能なコードではなく状態を格納するため、executableフィールドはfalseです。

Token ProgramはMintデータ型を定義しており、これがdataフィールドに格納されます。

Mint account
{
"data": {
"type": "Buffer",
"data": [1, "...truncated, total bytes: 82...", 103]
},
"executable": false,
"lamports": 407438077149,
"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
"rentEpoch": 18446744073709552000,
"space": 82
}

dataフィールドには、ミント権限、総供給量、小数点以下の桁数などのシリアライズされたMintアカウント状態が含まれています。

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

Mint account
{
"data": {
"type": "Buffer",
"data": [1, "...truncated, total bytes: 82...", 103]
},
"executable": false,
"lamports": 407438077149,
"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
"rentEpoch": 18446744073709552000,
"space": 82
}

mint accountはToken Programによって所有されています。これは、そのdataフィールドがToken Programのinstructionsによってのみ変更できることを意味します。

Mint Account
{
"data": {
"type": "Buffer",
"data": [1, "...truncated, total bytes: 82...", 103]
},
"executable": false,
"lamports": 407438077149,
"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
"rentEpoch": 18446744073709552000,
"space": 82
}

mint accountは実行可能コードではなく状態を格納します。これらはToken Programによって所有され、Token Programにはmint accountの作成と更新方法を定義するinstructionsが含まれています。

mint accountのdataフィールドは実行可能なコードではなく状態を格納するため、executableフィールドはfalseです。

Token ProgramはMintデータ型を定義しており、これがdataフィールドに格納されます。

dataフィールドには、ミント権限、総供給量、小数点以下の桁数などのシリアライズされたMintアカウント状態が含まれています。

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

mint accountはToken Programによって所有されています。これは、そのdataフィールドがToken Programのinstructionsによってのみ変更できることを意味します。

Mint account
{
"data": {
"type": "Buffer",
"data": [1, "...truncated, total bytes: 82...", 103]
},
"executable": false,
"lamports": 407438077149,
"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
"rentEpoch": 18446744073709552000,
"space": 82
}

Mint accountのデシリアライズ

アカウントのdataフィールド内の生バイトを意味のある形で解釈するには、デシリアライズする必要があります。適切なデータ型はアカウントを所有するプログラムによって定義されます。ほとんどのSolanaプログラムは、デシリアライズプロセスを抽象化するヘルパー関数を持つクライアントライブラリを提供しています。これらの関数は生のアカウントバイトを構造化されたデータ型に変換し、アカウントデータの操作を容易にします。

例えば、*shell@solana/spl-token*ライブラリには、mint accountのdataフィールドをToken Programによって定義されたMintデータ型にデシリアライズするのに役立つgetMint()関数が含まれています。

Deserialize mint account data
import { PublicKey, Connection } from "@solana/web3.js";
import { getMint } from "@solana/spl-token";
const connection = new Connection(
"https://api.mainnet-beta.solana.com",
"confirmed"
);
const address = new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");
const mintData = await getMint(connection, address, "confirmed");
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>,
}

*tsgetMint()*関数は、mint accountのdataフィールドをMintアカウントタイプにデシリアライズします。

Mint account
{
"data": {
"type": "Buffer",
"data": [1, "...truncated, total bytes: 82...", 103]
},
"executable": false,
"lamports": 407438077149,
"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
"rentEpoch": 18446744073709552000,
"space": 82
}

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

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

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

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

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

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

freezeAuthority フィールドは、token accountをフリーズする権限を持つアカウントを示します。フリーズされたtoken accountは、保有するトークンの転送や焼却ができなくなります。

tlvData フィールドには、Token Extensionsの追加データが含まれており、さらなるデシリアライズが必要です。このフィールドは、Token Extension Program(Token2022)によって作成されたアカウントにのみ関連しています。

*tsgetMint()*関数は、mint accountのdataフィールドをMintアカウントタイプにデシリアライズします。

Mint account
{
"data": {
"type": "Buffer",
"data": [1, "...truncated, total bytes: 82...", 103]
},
"executable": false,
"lamports": 407438077149,
"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
"rentEpoch": 18446744073709552000,
"space": 82
}

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

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

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

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

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

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

freezeAuthority フィールドは、token accountをフリーズする権限を持つアカウントを示します。フリーズされたtoken accountは、保有するトークンの転送や焼却ができなくなります。

tlvData フィールドには、Token Extensionsの追加データが含まれており、さらなるデシリアライズが必要です。このフィールドは、Token Extension Program(Token2022)によって作成されたアカウントにのみ関連しています。

Deserialized mint data
{
"address": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"mintAuthority": "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG",
"supply": "8985397351591790",
"decimals": 6,
"isInitialized": true,
"freezeAuthority": "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar",
"tlvData": {
"type": "Buffer",
"data": []
}
}

Is this page helpful?

目次

ページを編集

管理運営

© 2025 Solana Foundation.
無断転載を禁じます。