> ## Documentation Index
> Fetch the complete documentation index at: https://docs.raydium.io/llms.txt
> Use this file to discover all available pages before exploring further.

# アカウントモデル

> Solanaのアカウント中心アーキテクチャ — アカウントが状態を保持し、プログラムはアカウントを操作するステートレスコードです。レント、所有権、プログラムアカウント対データアカウント、およびRaydiumのプール状態を読むときのすべての意味。

<Info>
  **このページは AI による自動翻訳です。すべての内容は英語版を正とします。**

  [英語版を表示 →](/solana-fundamentals/account-model)
</Info>

Solanaのアカウントモデルは、Raydiumのコードを読む前に理解すべき最も重要なものです。Ethereumでは状態がコントラクトコードと一緒に存在しますが、Solanaプログラムは完全にステートレスです。すべての状態は独立した「アカウント」に存在し、プログラムはこれらのアカウントを操作します。Raydiumの各プール、ポジション、ボールトはアカウントであり、これらのアカウントの動作を理解することで、ドキュメントの残りが理解できるようになります。

## 基本的な分離：プログラムとアカウント

### プログラム

SolanaにおけるプログラムはBinaryファイルから読み込まれるコンパイル済みバイナリで、`Pubkey`にデプロイされ、トランザクション経由で呼び出し可能な実行可能コードです。プログラムは関連する状態を持たず、ロジックのみを含みます。

Raydiumのプログラム：

* CPMM: `CPMMoo8L3F4NbTegBCKVNunggL7H1Zpdmwpwh8KMoZ0F`
* CLMM: `CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK`
* AMM v4: `675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8`

各プログラムは固定されたBinaryです。プログラムは呼び出し間で何も「記憶」しません。

### アカウント

**アカウント**はオンチェーンのデータ行です。すべてのアカウントには以下があります：

* `pubkey` — そのアドレス。
* `owner` — それを所有するプログラム（書き込みを制御）。
* `data` — 生のバイト。
* `lamports` — SOL残高（1 SOL = 1,000,000,000 lamports）。
* `rent_epoch` — レガシーレント回収フィールド（レント免除が必須になってから無視）。

Raydiumプールをクエリするとき、1つまたは複数のアカウントを読んでいます。スワップが実行されるとき、CPMMプログラムは複数のアカウント — プール状態、ボールト、観察状態、ユーザーのトークンアカウント — を読み書きします。

## 所有権

すべてのアカウントはちょうど1つのプログラムによって所有されます。そのプログラムのコードのみがアカウントの`data`フィールドを変更できます。ユーザーは署名できるアカウントの`lamports`を変更できますが（SOLを送受信）、`data`を変更するには所有プログラムがそれを代わりに行う必要があります。

例：

* ユーザーウォレット：System Programによって所有。Lampportsはここに存在。署名して転送します。
* USDCトークンアカウント：SPL Token Programによって所有。トークンプログラムの`transfer`命令がバランスを更新します。
* Raydiumプール状態アカウント：CPMMプログラムによって所有。CPMMの命令のみが準備金、手数料などを変更できます。
* Raydiumポジション NFTの`PersonalPositionState`：CLMMプログラムによって所有。

「所有」は厳密です。プログラムAがプログラムBによって所有されるアカウントに書き込む場合、Solanaランタイムはトランザクションを拒否します。

## レントとレント免除

アカウントの作成はストレージスペースを消費します。Solanaはそのスペースに対してレントを課しますが、2020年からすべての新しいアカウントは**レント免除**である必要があります — つまり、彼らが2年間に借りるであろうレントが事前に支払われるのに十分なlamplortsを保持しています。実際には：

* レント免除アカウントは永遠に存在します。
* アカウントをクローズするとlamplortsをクローズ署名者に返します。

165バイトのアカウント（例：SPLトークンアカウント）の場合、レント免除は約0.00204 SOLです。1,440バイトのRaydium CPMMプール状態の場合、それは約0.011 SOLです。

### Raydiumレントコスト

| アカウント                      | サイズ       | レント         |
| -------------------------- | --------- | ----------- |
| CPMM PoolState             | \~1,440 B | \~0.011 SOL |
| CLMM PoolState             | \~1,500 B | \~0.012 SOL |
| CLMM TickArray             | \~9,000 B | \~0.063 SOL |
| CLMM PersonalPositionState | \~280 B   | \~0.003 SOL |
| ATA                        | 165 B     | \~0.002 SOL |
| Vault (Token Account)      | 165 B     | \~0.002 SOL |

プール作成は一度に複数のアカウントのレントが必要です — これがCPMMプール作成の合計コストが約0.15 SOLである理由です。

## データと実行可能アカウント

アカウントは2つの種類があります：

### データアカウント

状態を保持します（プール準備金、トークンバランス、ユーザーポジション）。`executable = false`。これが大多数です。

### 実行可能アカウント

プログラムBytecodeを保持します。`executable = true`。これらはプログラム（CPMM、CLMMなど）です。プログラムはBytecode以外のデータを持ちません。

### プログラム派生アカウント（PDA）

PDAはそのアドレスがプログラムといくつかのシード — このアドレスの秘密鍵は存在しない — から確定的に導出されるデータアカウントです。導出プログラムのみが`invoke_signed`経由でPDAの代わりに署名できます。

Raydiumは広範にPDAを使用しています：

* プール状態PDA：`[poolTypeDiscriminator, mintA, mintB, ammConfig]`から導出。
* ボールトPDA：`[pool, mint]`から導出。
* 観察状態PDA：`[observationSeed, pool]`から導出。

PDAはRaydiumがキーを管理することなく予測可能なアドレスでアカウントを作成できます。シードが既知の場合、誰でも既知のプールのPDAアドレスを計算できます。

[`solana-fundamentals/pdas-and-cpis`](/ja/solana-fundamentals/pdas-and-cpis)を参照してください。

## トランザクションとアカウント参照

すべてのSolanaトランザクションは、読み書きするアカウントの明示的なリストを記載しています。ランタイムは以下を強制します：

* リストされたアカウントは読み書きできます（`is_writable`フラグ当たり）。
* リストされていないアカウントには触れることはできません。

Raydiumスワップの場合、トランザクションのアカウントリストには以下が含まれます：

```
[readonly] CPMM program
[writable] pool state
[readonly] amm config
[readonly] pool authority (PDA)
[writable] input vault
[writable] output vault
[writable] user input ATA
[writable] user output ATA
[readonly] input mint
[readonly] output mint
[readonly] input token program
[readonly] output token program
[writable] observation state
[signer,writable] user
```

この明示的な列挙により、Solanaトランザクションは高速で並列化可能です — ランタイムは事前に競合しないtxsを決定できます。

## アカウントサイズとデータレイアウト

すべてのRaydiumアカウントは固定または上限付きサイズを持ちます。レイアウトはコードで定義されています（`#[repr(C)]`付きRustストラクト）そして[`sdk-api/anchor-idl`](/ja/sdk-api/anchor-idl)に文書化されています。

Anchorプログラムは作成するすべてのアカウントに8バイトの**ディスクリミネータ**を追加します。これは`hash("account:<StructName>")[0..8]`から導出されます。これにより、クライアントは最初の8バイトを読むだけでアカウントのタイプを識別できます — すべてのタイプのアカウントを列挙する`getProgramAccounts`スキャンに重要です。

### Raydiumプール状態を読む

SDK経由：

```ts theme={null}
const pool = await raydium.cpmm.getPoolInfoFromRpc({ poolId });
console.log(pool.poolInfo);
```

Raw RPC + レイアウト経由：

```ts theme={null}
const accountInfo = await connection.getAccountInfo(poolId);
const data = accountInfo.data;
// Skip first 8 bytes (discriminator), then parse according to struct layout.
const poolState = CpmmPoolStateLayout.decode(data.slice(8));
```

レイアウトはSDKソースの`src/raydium/cpmm/layout.ts`にあります。

## 実装例：トークンアカウントを読む

ユーザーのUSDCバランスを読みましょう。

```ts theme={null}
import { Connection, PublicKey } from "@solana/web3.js";
import { getAssociatedTokenAddressSync, AccountLayout } from "@solana/spl-token";

const connection = new Connection("https://api.mainnet-beta.solana.com");
const user       = new PublicKey("YourUserWallet...");
const usdcMint   = new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");

// 1. Compute the ATA address (PDA-style derivation).
const ata = getAssociatedTokenAddressSync(usdcMint, user);

// 2. Read the account.
const accountInfo = await connection.getAccountInfo(ata);
if (!accountInfo) {
  console.log("ATA doesn't exist yet (user has never held USDC).");
  return;
}

// 3. Verify owner is SPL Token program.
console.assert(accountInfo.owner.toBase58() === "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA");

// 4. Decode the data.
const parsed = AccountLayout.decode(accountInfo.data);
console.log("Balance (smallest units):", parsed.amount.toString());
console.log("Mint:",                     new PublicKey(parsed.mint).toBase58());
console.log("Owner:",                    new PublicKey(parsed.owner).toBase58());
```

このパターン — アドレスを導出、アカウントをフェッチ、所有者を検証、デコード — はRaydiumプールを含むすべてのオンチェーン読み取りに適用されます。

## Raydiumにとってこれが重要な理由

アカウントモデルはRaydiumの設計を形成しています：

* **プール状態は単一のアカウント** — プールに関するすべて（ミント、準備金、手数料、管理者）は、プールプログラムによって所有される1つのアカウントに存在します。
* **LPトークンは標準SPLトークンアカウント** — Raydiumはトークン化をSPL Tokenプログラムに委任します。
* **ティックアレイはチャンク化** — CLMMは成長可能なティックの単一配列を持つことができません。なぜなら、アカウントは固定割り当てサイズを持つため、代わりにチャンク化された`TickArray` PDAを使用します。
* **ポジション NFTはMetaplex NFT** — CLMMのポジションはMetaplexごとの標準NFTであり、ポジション状態は別のPDAです。

これを理解することで、「Xはどこに存在しますか？」という質問に正しく答えることができます：

* 「プール準備金はどこにありますか？」→ 2つのボールトアカウント（トークンアカウント）、SPL Tokenプログラムによって所有、権限がプールプログラムのPDAに委任されています。
* 「CLMMのティックデータはどこにありますか？」→ 一連のTickArray PDA、各々60連続ティックをカバーしています。
* 「私のファーム賭け金はどこにありますか？」→ `[user, farmId]`から導出された`UserLedger` PDA、ファームプログラムによって所有。

## ポインタ

* [`solana-fundamentals/programs-and-anchor`](/ja/solana-fundamentals/programs-and-anchor) — プログラムがアカウントを処理する方法。
* [`solana-fundamentals/pdas-and-cpis`](/ja/solana-fundamentals/pdas-and-cpis) — PDA導出とCPI。
* [`solana-fundamentals/transactions-and-fees`](/ja/solana-fundamentals/transactions-and-fees) — アカウントがトランザクションで参照される方法。
* [`sdk-api/anchor-idl`](/ja/sdk-api/anchor-idl) — Raydiumのプログラムのアカウントレイアウト。

ソース：

* [Solana Account docs](https://docs.solana.com/developing/programming-model/accounts).
* [SPL Token program](https://spl.solana.com/token) — トークンアカウントが存在する場所。
