ネットワークからの読み取り
Solanaネットワークから異なるアカウントを取得してデータを読み取ります。このセクションでは、Solanaのアカウントの構造を理解するのに役立ちます。各Solanaアカウントには、対応するオンチェーンデータを見つけるために使用される一意のアドレスがあります。アカウントには状態データまたは実行可能なプログラムが含まれています。
ウォレットアカウントの取得
ウォレットはSystem Programが所有するアカウントです。ウォレットは主にSOLを保持し、トランザクションに署名するために使用されます。SOLが初めて新しいアドレスに送信されると、システムアカウントが自動的に作成されます。
以下の例では、新しいキーペアを生成し、新しい公開鍵アドレスに資金を提供するためにSOLをリクエストし、新しく資金提供されたウォレットのアカウントデータを取得します。
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 accountconst 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));
ウォレットアカウントを取得すると、右側の例に示すようなフィールドがレスポンスに含まれます。
dataフィールドには、バイトとして保存されたアカウントのデータが含まれています。ウォレットアカウントの場合、このフィールドは空(0バイト)です。
executableフィールドは、アカウントのdataフィールドに実行可能なプログラムコードが含まれているかどうかを示します。ウォレットアカウントの場合、このフィールドはfalseです。
lamportsフィールドには、lamport単位のアカウントのSOL残高が含まれています。
owner
フィールドは、アカウントを所有するプログラムを示します。ウォレットの場合、所有者は常に System
Program であり、アドレスは 11111111111111111111111111111111 です。
rentEpoch
フィールドは、廃止された rent メカニズムからの古いフィールドです。(このフィールドは後方互換性のために含まれています。)
space フィールドは、data フィールドに含まれるバイト数を示します。これは
Account タイプ自体のフィールドではありませんが、レスポンスに含まれています。
この例では、data フィールドに0バイトのデータが含まれているため、space
フィールドは0です。
Token Programを取得する
以下の例では、ウォレットとプログラムアカウントの違いを示すためにToken Programを取得します。プログラムアカウントには、Token Programの ソースコードのコンパイルされたバイトコードが格納されています。このプログラムアカウントは Solana Explorerで確認できます。
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);
Token Programは実行可能な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プログラムです。
mint accountの取得
mint accountは、Token Programによって所有されるアカウントで、特定のトークンに関するグローバルなメタデータを格納します。これには、総供給量、小数点以下の桁数、トークンの発行や凍結を許可されたアカウントが含まれます。mint accountのアドレスは、Solanaネットワーク上のトークンを一意に識別します。
以下の例では、USD Coin Mint 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);
mint accountは実行可能コードではなく状態を格納します。これらはToken Programによって所有され、Token Programにはmint accountの作成と更新方法を定義するinstructionsが含まれています。
{"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フィールドに格納されます。
{"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データ型にデシリアライズする必要があります。これは次の例で示されています。
{"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によってのみ変更できることを意味します。
{"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()関数が含まれています。
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");
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>,}
*tsgetMint()*関数は、mint
accountのdataフィールドをMintアカウントタイプにデシリアライズします。
{"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)によって作成されたアカウントにのみ関連しています。
Is this page helpful?