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フィールドには、アカウントのSOL残高がlamports単位で含まれています。
ownerフィールドは、アカウントを所有するプログラムを示します。ウォレットの場合、所有者は常にSystem
Programであり、アドレスは11111111111111111111111111111111です。
rentEpochフィールドは、廃止されたrent機構の従来のフィールドです。(このフィールドは下位互換性のために含まれています。)
spaceフィールドは、dataフィールドに含まれるバイト数を示します。これはAccount type自体のフィールドではありませんが、レスポンスに含まれています。
この例では、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.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フィールドには、プログラムの実行可能なコードが保存されます。
すべてのプログラムアカウントは、その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.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
authority、総供給量、小数点以下の桁数などのシリアライズされた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.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フィールドには、ミントアカウントのアドレスが含まれます。
mintAuthorityフィールドには、トークンの新しい単位を作成できる唯一のアカウントが表示されます。
supplyフィールドには、ミントされたトークンの総数が表示されます。この値は、トークンの最小単位で測定されます。標準単位での総供給量を取得するには、supplyフィールドの値をdecimalsで調整します。
decimalsフィールドには、トークンの小数点以下の桁数が表示されます。
isInitializedフィールドは、ミントアカウントが初期化されているかどうかを示します。このフィールドは、Token
Programで使用されるセキュリティチェックです。
freezeAuthorityフィールドには、トークンアカウントを凍結する権限を持つアカウントが表示されます。凍結されたトークンアカウントは、含まれているトークンを転送または焼却できません。
tlvDataフィールドには、Token
Extensionsの追加データが含まれており、さらなるデシリアライゼーションが必要です。このフィールドは、Token Extension Program(Token2022)によって作成されたアカウントにのみ関連します。
Is this page helpful?