アカウント構造

概要

アカウントには5つのフィールドがあります:lamports、data、owner、executable、rent_epochです。各アカウントは一意の32バイトアドレスで識別されます。アカウントがオンチェーンに残るには、データサイズに比例した最小lamport残高を保持する必要があります。

アカウントアドレス

すべてのアカウントアドレスは32バイトの値で、base58エンコードされた文字列として表示されます。アドレスは次の2つのタイプのいずれかです:

  1. 公開鍵Ed25519のkeypairに対応します(秘密鍵を持ちます)
  2. Program Derived Address(PDA):プログラムIDとシードから決定論的に導出されます(秘密鍵を持ちません)

base58エンコードされた公開鍵アドレスを持つアカウントbase58エンコードされた公開鍵アドレスを持つアカウント

公開鍵

*rsKeypair*は、公開鍵(アカウントアドレスとして使用)と秘密鍵(トランザクションの署名に使用)で構成されます。次の例では、Solana SDKを使用してkeypairを生成します。

import { generateKeyPairSigner } from "@solana/kit";
// Kit does not enable extractable private keys
const keypairSigner = await generateKeyPairSigner();
console.log(keypairSigner);
Console
Click to execute the code.

Program Derived Address

Program Derived Address(PDA)は、プログラムIDと1つ以上のオプションのシードから決定論的に導出されます。PDAには対応する秘密鍵がありません。次の例では、Solana SDKを使用してPDAを導出します。

import { Address, getProgramDerivedAddress } from "@solana/kit";
const programAddress = "11111111111111111111111111111111" as Address;
const seeds = ["helloWorld"];
const [pda, bump] = await getProgramDerivedAddress({
programAddress,
seeds
});
console.log(`PDA: ${pda}`);
console.log(`Bump: ${bump}`);
Console
Click to execute the code.

アカウントフィールド

すべての Account は最大サイズが MAX_ACCOUNT_DATA_LEN (10 MiB、*rsMAX_PERMITTED_DATA_LENGTH*に相当)であり、5つのフィールドを含みます。

フィールド説明
lamportsu64lamport単位の残高。所有者はデビット可能、任意のプログラムがクレジット可能。
dataVec<u8>アカウント状態またはプログラムバイトコード。最大10 MiB。所有者のみ書き込み可能。
ownerPubkey書き込みアクセス権を持つプログラム。データがゼロ化された場合のみ再割り当て可能。
executableboolTrue = program account。
rent_epochEpoch非推奨。rent免除アカウントの場合はINLINE_CODE_PLACEHOLDER_cd7972524d20f29fに設定。
Account
pub struct Account {
/// lamports in the account
pub lamports: u64,
/// data held in this account
#[cfg_attr(feature = "serde", serde(with = "serde_bytes"))]
pub data: Vec<u8>,
/// the program that owns this account. If executable, the program that loads this account.
pub owner: Pubkey,
/// if true, this account's data contains a program (and is now read-only)
pub executable: bool,
/// deprecated
pub rent_epoch: Epoch,
}

Lamports

lamportsフィールドは、アカウントの残高を lamports単位で保持します(1 SOL = 1,000,000,000 lamports)。

すべてのアカウントは、データをオンチェーンに保存し続けるために、rent免除残高と呼ばれる最小lamport残高を維持する必要があります。この残高はアカウントのデータサイズに比例します。

「rent」と呼ばれることが多いですが、rent免除残高は返金可能なデポジットとして機能し、アカウントが閉鎖されると全額が回収されます。

minimum_balance() およびrent 定数を参照してください。

Data

dataフィールドは任意のバイト配列を格納します。その内容はアカウントタイプによって異なります。

  • Program accounts: 実行可能なバイトコード、またはバイトコードを格納する program data account のアドレスを含みます。
  • Data accounts: プログラム定義の状態データを含みます。所有プログラムがシリアライゼーション形式を定義します。

アカウントデータの読み取りには2つのステップが必要です。

  1. アドレスでアカウントを取得します。
  2. dataフィールドを生バイトからプログラム定義のデータ構造にデシリアライズします。

オーナー

ownerフィールドには、このアカウントを所有するプログラムのプログラムID(公開鍵)が含まれます。

オーナープログラムは、以下の操作を実行できる唯一のプログラムです:

  • アカウントのdataフィールドを変更する
  • アカウントのlamportsフィールドからlamportを差し引く

どのプログラムも他のアカウントにlamportを追加できますが、オーナーのみがlamportを差し引くことができます。

program accountの場合、オーナーはアカウントのローダープログラムです。

実行可能

executableフィールドは、アカウントがprogram accountデータアカウントかを決定するブール値です:

  • true = program account(実行可能コードを含む)
  • false = データアカウント(状態を保存)

Rent epoch

rent_epochフィールドは非推奨です。

以前は、アカウントがオンチェーンでデータを維持するためにlamportが自動的に差し引かれる時期を追跡していました。rent徴収が非推奨になったため、rent_epochは、すべての新しいrent免除アカウントでu64::MAXに設定されます。

Lamports

lamportsフィールドは、アカウントの残高を lamports単位で保持します(1 SOL = 1,000,000,000 lamports)。

すべてのアカウントは、データをオンチェーンに保存し続けるために、rent免除残高と呼ばれる最小lamport残高を維持する必要があります。この残高はアカウントのデータサイズに比例します。

「rent」と呼ばれることが多いですが、rent免除残高は返金可能なデポジットとして機能し、アカウントが閉鎖されると全額が回収されます。

minimum_balance() およびrent 定数を参照してください。

Data

dataフィールドは任意のバイト配列を格納します。その内容はアカウントタイプによって異なります。

  • Program accounts: 実行可能なバイトコード、またはバイトコードを格納する program data account のアドレスを含みます。
  • Data accounts: プログラム定義の状態データを含みます。所有プログラムがシリアライゼーション形式を定義します。

アカウントデータの読み取りには2つのステップが必要です。

  1. アドレスでアカウントを取得します。
  2. dataフィールドを生バイトからプログラム定義のデータ構造にデシリアライズします。

オーナー

ownerフィールドには、このアカウントを所有するプログラムのプログラムID(公開鍵)が含まれます。

オーナープログラムは、以下の操作を実行できる唯一のプログラムです:

  • アカウントのdataフィールドを変更する
  • アカウントのlamportsフィールドからlamportを差し引く

どのプログラムも他のアカウントにlamportを追加できますが、オーナーのみがlamportを差し引くことができます。

program accountの場合、オーナーはアカウントのローダープログラムです。

実行可能

executableフィールドは、アカウントがprogram accountデータアカウントかを決定するブール値です:

  • true = program account(実行可能コードを含む)
  • false = データアカウント(状態を保存)

Rent epoch

rent_epochフィールドは非推奨です。

以前は、アカウントがオンチェーンでデータを維持するためにlamportが自動的に差し引かれる時期を追跡していました。rent徴収が非推奨になったため、rent_epochは、すべての新しいrent免除アカウントでu64::MAXに設定されます。

Account Examples
// Example Token Mint Account
Account {
lamports: 1461600,
data.len: 82,
owner: TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb,
executable: false,
rent_epoch: 0,
data: 010000001e213c90625a7e643d9555bb01b6c3fe6416d7afd523ce8c7ddd9b923ceafb9d00000000000000000901010000001e213c90625a7e643d9555bb01b6,
}
// Example Token Program Account
Account {
lamports: 4513200894,
data.len: 134080,
owner: BPFLoader2111111111111111111111111111111111,
executable: true,
rent_epoch: 18446744073709551615,
data: 7f454c460201010000000000000000000300f70001000000d8f90000000000004000000000000000800902000000000000000000400038000400400009000800,
}

Is this page helpful?

目次

ページを編集

管理運営

© 2026 Solana Foundation.
無断転載を禁じます。
つながろう