概要
アカウントには5つのフィールドがあります:lamports、data、owner、executable、rent_epoch。各アカウントは一意の32バイトアドレスによって識別されます。アカウントがオンチェーンに保持されるためには、そのデータサイズに比例した最小lamport残高を保持する必要があります。
アカウントアドレス
すべてのアカウントアドレスは32バイトの値で、base58エンコードされた文字列として表示されます。アドレスは次の2種類のいずれかです:
- 公開鍵: Ed25519keypairに対応(秘密鍵を持つ)
- Program Derived Address(PDA): プログラムIDとシードから決定論的に導出される(秘密鍵を持たない)
base58エンコードされた公開鍵アドレスを持つアカウント
公開鍵
Keypair
は、公開鍵(アカウントアドレスとして使用)と秘密鍵(トランザクションの署名に使用)で構成されます。次の例では、Solana
SDKを使用してkeypairを生成します。
import { generateKeyPairSigner } from "@solana/kit";// Kit does not enable extractable private keysconst keypairSigner = await generateKeyPairSigner();console.log(keypairSigner);
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}`);
アカウントフィールド
すべての
Account
は最大サイズが
MAX_ACCOUNT_DATA_LEN
(10 MiB、 MAX_PERMITTED_DATA_LENGTH
に相当)であり、5つのフィールドを含みます:
| フィールド | 型 | 説明 |
|---|---|---|
lamports | u64 | lamport単位の残高。所有者は引き落とし可能、任意のプログラムが入金可能。 |
data | Vec<u8> | アカウントの状態またはプログラムのバイトコード。最大10 MiB。所有者のみ書き込み可能。 |
owner | Pubkey | 書き込みアクセス権を持つプログラム。データがゼロの場合のみ再割り当て可能。 |
executable | bool | True = program account。 |
rent_epoch | Epoch | 非推奨。rent免除アカウントには u64::MAX が設定されます。 |
pub struct Account {/// lamports in the accountpub 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,/// deprecatedpub 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つのステップが必要です:
- アドレスによってアカウントを取得します。
dataフィールドを生バイトからプログラム定義のデータ構造にデシリアライズします。
オーナー
ownerフィールドには、このアカウントを所有するプログラムのプログラムID(公開鍵)が格納されています。
オーナープログラムは、以下の操作を実行できる唯一のプログラムです:
- アカウントの
dataフィールドを変更する - アカウントの
lamportsフィールドからlamportを差し引く
どのプログラムも他のアカウントにlamportを追加できますが、lamportを差し引けるのはオーナーのみです。
プログラムアカウントの場合、オーナーはそのアカウントの ローダープログラムです。
実行可能
executableフィールドは、アカウントが
プログラムアカウントか
データアカウントかを判断する真偽値です:
true= プログラムアカウント(実行可能コードを含む)false= データアカウント(状態を保存)
Rent epoch
rent_epochフィールドは非推奨です。
以前は、アカウントがオンチェーンでデータを維持するための支払いとして、いつlamportsが自動的に差し引かれるかを追跡していました。rent徴収は非推奨となったため、すべての新しいrent-exemptアカウントではrent_epochがu64::MAXに設定されます。
Is this page helpful?