Skip to main content
このページは AI による自動翻訳です。すべての内容は英語版を正とします。英語版を表示 →
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プール作成の合計コストが約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を参照してください。

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

すべてのSolanaトランザクションは、読み書きするアカウントの明示的なリストを記載しています。ランタイムは以下を強制します:
  • リストされたアカウントは読み書きできます(is_writableフラグ当たり)。
  • リストされていないアカウントには触れることはできません。
Raydiumスワップの場合、トランザクションのアカウントリストには以下が含まれます:
この明示的な列挙により、Solanaトランザクションは高速で並列化可能です — ランタイムは事前に競合しないtxsを決定できます。

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

すべてのRaydiumアカウントは固定または上限付きサイズを持ちます。レイアウトはコードで定義されています(#[repr(C)]付きRustストラクト)そしてsdk-api/anchor-idlに文書化されています。 Anchorプログラムは作成するすべてのアカウントに8バイトのディスクリミネータを追加します。これはhash("account:<StructName>")[0..8]から導出されます。これにより、クライアントは最初の8バイトを読むだけでアカウントのタイプを識別できます — すべてのタイプのアカウントを列挙するgetProgramAccountsスキャンに重要です。

Raydiumプール状態を読む

SDK経由:
Raw RPC + レイアウト経由:
レイアウトはSDKソースのsrc/raydium/cpmm/layout.tsにあります。

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

ユーザーのUSDCバランスを読みましょう。
このパターン — アドレスを導出、アカウントをフェッチ、所有者を検証、デコード — は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、ファームプログラムによって所有。

ポインタ

ソース: