T2 · Solana / SVM Engineer
コードとデータを完全に分けるチェーンで、他者が接続できるプログラムを書く。
Rust と高性能チェーンの分野向けです。
このページの T2 は Track です。講座の章は「第 T10 章」のようにリンク付きで記します。講座の T2 は暗号学の基礎を扱い、別の内容です。
この Track に向いている人
EVM の考え方を、そのまま Solana に当てはめている。 コントラクトのストレージを探して困惑し、PDA は知っていても、普通のアカウントとのバイト単位の違いを説明できません。
Rust は書けても、安全なアカウント検証ができない。 借用検査やマクロは理解していても、属性マクロが何を検査するか、自分の require に何が抜けたかが分かりません。
Devnet では動くのに、メインネットで問題が起きる。 断続的な失敗、作成時のレント不足、重複実行、領域不足と拡張など、ローカルでは経験しなかった事態に困っています。
プログラムは書けても、他者が使える成果物を作れない。 テストスクリプトだけがあり、接続する人は Rust のソースを読んでアカウント順を推測します。クライアント SDK を書いたことがありません。
境界は、ソースを読まなくても、他者が正しく呼べるプログラムを提供することです。
前提
Part B 全 36 章を読むのが理想です。今始めるなら、知識グラフ上の最短経路は次です。
- 第 T1–T3 章
- 第 T4 章
- 第 T5 章
- 第 T6 章
- 第 T10 章
- 第 T11 章
| 先に読む章 | グラフ上の理由 |
|---|---|
| 第 T1 章から第 T3 章 | 状態、署名、取引ライフサイクル。チェーン共通の土台 |
| 第 T4 章 · RPC とは何か | 第 T5 章の直接の前提。高スループットが RPC の制限と完全性の問題を大きくする |
| 第 T5 章 · EVM Account Model | 第 T6 章の直接の前提。誤記ではありません。状態の索引としてのアカウントを先に理解し、Solana が何を分けたかを見る |
| 第 T6 章 · Solana Account Model | 実際の出発点。プログラムはデータを保持せず、取引は触れるアカウントを事前に宣言する |
| 第 T10 章 · Solana Program | 第 T6 章に依存。PDA と CPI を自分で書く |
| 第 T11 章 · Token Program | 第 T10 章に依存。共有プログラムと個別アカウントが合成可能性を作る |
| 第 T13 章 → 第 T17 章 | Indexer を学ぶ場合のみ必要。第 T17 章の依存は第 T9 章まで戻り、省けない |
学ぶ内容
- Rust
- Anchor
- PDA
- CPI
- Token-2022
- Indexer
- DeFi
七つのテーマを四群に分けます。
1.Rust とフレームワーク:難所はアカウント検証
中心は所有権より、属性マクロがどの検査へ展開されるかを読めることです。署名者、書込可能性、想定した owner、PDA のシードからの導出、領域サイズなどを確認します。
生成されない検査は自分で補います。各命令で、検査の総数、各検査が防ぐもの、省いた場合の悪用を説明できる必要があります。
フレームワークなしで命令入口を一度書くことが、費用対効果の高い練習です。属性マクロをブラックボックスと見なくなります。
2.PDA と CPI:アドレス空間と外部呼び出し
PDA では、シードの決定者と先取り可能性、正規 bump、どのプログラムが署名するかを理解します。重大な問題の多くは、このアカウントへは自分のプログラムだけが書けるという思い込みに戻れます。
CPI では、呼び出す相手が本物か、呼ばれるときに権限が意図せず渡らないかを確認します。深さの制限とアカウントの受け渡し規則は、動かなくなってからではなく設計時に考えます。
3.Token-2022 と接続:誰と共存するか
拡張は機能だけでなく仮定の失効を生みます。送金のフック、手数料、凍結、mint 内のメタデータなどです。送金を単なる残高の増減と考えると、拡張付きトークンで計算を誤ります。
トークンに対する暗黙の仮定を列挙し、どの拡張がそれを崩すかを一つずつ問います。
4.Indexer と DeFi:出来事を検索可能にする
EVM とデータの形が異なり、命令、内部命令、アカウント変化から意味を再構成します。第 T17 章の再編、再開、冪等性はすべて必要で、媒体が変わるだけです。
DeFi は独自プロトコルの制作(Track T4)より、正しい接続が目標です。主要プログラムの配置を読み、交換の予想受取量を計算し、チェーン上の失敗を処理します。
卒業成果物
クライアント SDK 付きで、メインネットに配備した Anchor プログラム。
卒業プロジェクトは横断的なシステム、この Track は一つのプログラムを求め、他者が正しく使えることを重視します。SDK が、自分が書き終えた状態を他者が使える状態へ変えます。
他者が動かせるか。 clone 後、一コマンドで依存を導入し、一コマンドでローカルの検証ノード上の全テストを実行します。バージョンへの依存が強いため、README にツールの版を明記します。
SDK の主な呼び出しを示す、20 行以内の例も付けます。
呼び出す人にアカウント順を要求しない SDK か。 業務パラメーターだけを受け、PDA、アカウント一覧、関連アカウントの有無、必要レントを SDK が処理します。
Rust を読んでいない人が型定義だけで呼び出しを成功させることで確認します。第三アカウントを何にするか聞く必要があれば、未達です。
検証一覧があり、各検査に失敗するテストがあるか。 間違ったアカウントを意図的に渡し、取引が必ず失敗する用例を各項目に付けます。
成功経路だけのテストでは、安全性を証明できません。
失敗と再試行を設計しているか。 既存アカウント、レント不足、領域不足、重複送信、期限切れによる再送を最低限扱います。
SDK が再試行、エラー、冪等な成功のどれを返すかを明記します。
メインネットは少額で、更新と停止の説明があるか。 自分の資金を使い、失っても困らない額にします。更新権限者、放棄・破棄の予定、事故時の停止方法を書きます。
Devnet の配備だけに、まだメインネットへ進むべきでない理由を添えても、評価は成立します。
達成したかを判断するには
実行前に取引間の衝突を判断し、並列化するためです。読書き対象が重ならない取引は同時に実行できます。
その負担は開発者へ移り、PDA と関連アカウントを含め、すべてをクライアントで導出する必要があります。これが SDK を必須とする理由です。導出もプログラムの一部で、チェーン外で実行するだけです。
プログラム id とシードから導出し、意図的に楕円曲線の外へ置くアドレスです。対応する秘密鍵がなく、通常の署名は誰にもできません。
導出では bump を減らしながら、曲線外のアドレスを探します。実行環境は、導出元のプログラムが CPI でシードと bump を渡し、その主体として署名することを認めます。
支配権はシード設計で決まることと、正規 bump が必要なことが重要です。任意の bump を許すと、同じシードが複数のアドレスへ対応します。
owner を調べなければ、攻撃者は自分のプログラムで作った、同じ配置に見えるアカウントを渡し、任意の値を読ませられます。
署名者を調べなければ、誰が始めたかと誰のアカウントを操作するかが分離し、他者の操作を代行できます。
関係を調べなければ、型が正しいポジションと金庫でも、別市場の組合せを渡して精算できます。
最後は個別に見ると合法なので見つけにくく、関係を PDA のシードへ組み込んで防ぎます。
手数料付きなら、100 を出しても相手は 100 未満を受け取り、差は手数料口座へ行くため、渡した量で記帳するとずれます。
フック付きなら別のプログラムを呼び、失敗や予想外の状態変更が起こり、単純な送金にも再入のリスクを持ち込みます。
凍結可能、既定で凍結の拡張では、合法な送金も拒否されるため、処理が失敗に耐える必要があります。
EVM と同じく、渡した数字ではなく、前後の実際の残高変化を使います。
正解は一つではありません。三つを確認します。
- アカウント順、シード、エラーコードは、コメントや記憶だけでなく SDK の型にありますか。
- ソースを読まずに失敗理由を知る経路がありますか。
- 更新時に、相手が気付かずロジックを入れ替えられませんか。答えられなければ、更新権限を資産として管理していません。
よくある誤解
Devnet で動けばメインネットへ進める
混雑、RPC、レントは異なります。期限切れ、優先手数料不足、想定と異なる確認状態が起こります。
永遠に確認されない可能性を既定にし、送信後の確認と再送を明確に設計します。送信だけで成功とはしません。
フレームワークなら検証不要
生成するのは宣言した検査であり、必要な検査ではありません。属性を省いてもコンパイラーは教えてくれません。
一覧を独立した文書にし、コードと照合します。各項目に誤ったアカウントで失敗する用例を付け、実行可能な一覧にします。
PDA のシードは適当でよい
シード設計は権限設計です。次元が欠けると隔離すべき対象が共有され、制約のない利用者入力を含めると先取りされます。
何を表し、誰が作成できるかを先に書き、そこからシードを導きます。所属関係も含め、間違った組合せを導出段階で防ぎます。
Solana には再入がないので順序は不要
EVM 型の再入がなくても、順序の問題はあります。CPI やフックが実行を外へ渡すと、アカウントは途中の状態かもしれません。
第 T28 章と同じく、先に自分の記帳を終え、最後に外部とやり取りします。 チェーンが変わっても規則は変わりません。
次に進むには
- 自分のプログラムとともに、第 T6 章、第 T10 章、第 T11 章を読み直します。
- Indexer なら第 T16 章、第 T17 章を補い、Track T3 · Onchain Data Engineerへ進みます。
- Track T4 · DeFi Engineerで取引、Track T5 · Security Engineerでアカウント検証を深めます。
- 非技術側は Track N4 · Crypto BD & Ecosystemです。接続の半分は技術以外の問題で、SDK は後半、Track は前半を扱います。
- 全体のシステムへ広げるなら卒業プロジェクトへ進みます。