アカウント構造

概要

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

アカウントアドレス

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

  1. 公開鍵: Ed25519keypairに対応(秘密鍵を持つ)
  2. Program Derived Address(PDA): プログラムIDとシードから決定論的に導出される(秘密鍵を持たない)

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

公開鍵

Keypair は、公開鍵(アカウントアドレスとして使用)と秘密鍵(トランザクションの署名に使用)で構成されます。次の例では、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、 MAX_PERMITTED_DATA_LENGTH に相当)であり、5つのフィールドを含みます:

フィールド説明
lamportsu64lamport単位の残高。所有者は引き落とし可能、任意のプログラムが入金可能。
dataVec<u8>アカウントの状態またはプログラムのバイトコード。最大10 MiB。所有者のみ書き込み可能。
ownerPubkey書き込みアクセス権を持つプログラム。データがゼロの場合のみ再割り当て可能。
executableboolTrue = program account。
rent_epochEpoch非推奨。rent免除アカウントには u64::MAX が設定されます。
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,
}

Lamport

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

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

しばしば「rent」と呼ばれますが、rent免除残高は返金可能なデポジットとして機能し、アカウントを閉じる際に全額が返還されます。

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

データ

data フィールドには任意のバイト配列が格納されます。その内容はアカウントの種類によって異なります:

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

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

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

オーナー

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

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

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

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

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

実行可能

executableフィールドは、アカウントが プログラムアカウントデータアカウントかを判断する真偽値です:

  • true = プログラムアカウント(実行可能コードを含む)
  • false = データアカウント(状態を保存)

Rent epoch

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

以前は、アカウントがオンチェーンでデータを維持するための支払いとして、いつlamportsが自動的に差し引かれるかを追跡していました。rent徴収は非推奨となったため、すべての新しいrent-exemptアカウントではrent_epochu64::MAXに設定されます。

Lamport

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

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

しばしば「rent」と呼ばれますが、rent免除残高は返金可能なデポジットとして機能し、アカウントを閉じる際に全額が返還されます。

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

データ

data フィールドには任意のバイト配列が格納されます。その内容はアカウントの種類によって異なります:

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

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

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

オーナー

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

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

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

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

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

実行可能

executableフィールドは、アカウントが プログラムアカウントデータアカウントかを判断する真偽値です:

  • true = プログラムアカウント(実行可能コードを含む)
  • false = データアカウント(状態を保存)

Rent epoch

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

以前は、アカウントがオンチェーンでデータを維持するための支払いとして、いつlamportsが自動的に差し引かれるかを追跡していました。rent徴収は非推奨となったため、すべての新しいrent-exemptアカウントではrent_epochu64::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.
無断転載を禁じます。
つながろう