midnight-storage について
Midnightのストレージ構成を解説するスキルです。ブロックチェーンの状態の編成、コミット、照会を調べる人向けに、ParityDB、Patricia-Merkle Trie、ストレージキーのハッシュ、クエリ経路を説明します。
主な機能
- 01ParityDBによる状態の永続化
- 02Patricia-Merkle Trieの状態コミットメント
- 03twoxhashによるストレージキー生成
- 04ブロックごとの状態コミット処理
- 05RPCとGraphQLのクエリ経路
活用シーン
- 01Midnightの状態永続化の理解
- 02状態ルートの計算方法の確認
- 03コントラクト状態の照会経路の特定
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ kali-decoder/ midnight-skills --skill midnight-storageインストール後、Claude Code で/midnight-storageを入力して読み込まれたか確認します。
詳細
ストレージ
Midnight は Polkadot SDK(Substrate) 上に構築されており、デフォルトのデータベースバックエンドとして ParityDB を使用します。
ストレージスタック
flowchart TB
subgraph Runtime["Runtime execution"]
STF["State transition function (WASM)"]
PM["pallet-midnight + other pallets"]
end
subgraph Trie["State layer"]
MPT["Patricia-Merkle trie"]
T2H["twoxhash — storage key generation"]
MPT --- T2H
end
subgraph Persist["Persistence"]
PDB["ParityDB — key-value store"]
end
STF --> PM
PM --> MPT
MPT --> PDB
MPT --> Commit["State root commitment per block"]
ParityDB
ParityDB は、ブロックチェーンのワークロード向けに設計された高速なキー・バリューストアです。
- すべてのオンチェーン状態を保存します。
- Midnight を含む Substrate/Polkadot SDK チェーンのデフォルトバックエンドです。
- ブロックのインポートと状態のコミット時に、高い書き込みスループットを実現するよう最適化されています。
パトリシア・マークル・トライ
トライは、状態コミットメントの基盤となるデータ構造です。
| 特性 | 利点 |
|---|---|
| マークル構造 | ブロックごとに改ざんを検知できる状態ルート |
| 包含証明 | コントラクトの状態や残高などを効率的に検証 |
| 増分更新 | ブロックごとに変更されたパスのみを再計算 |
ランタイムパレット(pallet-midnight を含む)の正規台帳状態はこのトライに整理され、ParityDB を介して永続化されます。
flowchart LR
BlockN["Block N state root"] --> Root["Trie root hash"]
Root --> Leaf1["Storage item A"]
Root --> Leaf2["Storage item B"]
Root --> Leaf3["Contract state …"]
Query["RPC / light client"] --> Proof["Merkle inclusion proof"]
Proof --> Leaf2
twoxhash(ストレージキー)
twoxhash は、トライ内のストレージキーを生成します。
| 項目 | 詳細 |
|---|---|
| 種類 | 非暗号学的ハッシュ |
| 用途 | 内部での高速なキー・バリュー検索 |
| 特性 | 高速で、衝突率が低い |
| 用途外 | セキュリティが重要なハッシュ処理(Blake2-256 を使用) |
twoxhash は、キーの導出ごとに暗号学的ハッシュを計算するコストをかけずに、マップ検索のトライ性能を大幅に向上させます。
ハッシュと署名の使い分けについては、midnight-cryptography/ を参照してください。
状態のコミットフロー
各ブロックでは、次の処理が行われます。
- ランタイムがトランザクションを実行し、パレットのストレージを更新します。
- 変更されたトライノードを計算し、状態ルートを導出します。
- Midnight Ledger コミットメントを、標準の Substrate 状態とともに永続化します(
pallet-midnight)。 - ParityDB が、更新されたトライの基盤ストアを永続化します。
sequenceDiagram
participant RT as Runtime
participant Trie as Patricia-Merkle trie
participant PM as pallet-midnight
participant DB as ParityDB
RT->>Trie: Apply storage writes (twoxhash keys)
RT->>PM: Commit ledger state
Trie->>Trie: Compute new state root
PM->>DB: Persist ledger commitment
Trie->>DB: Persist trie nodes
ストレージのクエリ
| アクセス方法 | 用途 |
|---|---|
state_getStorage(RPC) | 生のストレージキーの読み取り |
midnight_contractState(RPC) | コントラクト固有の状態 |
| インデクサー GraphQL | アプリケーションで使いやすいコントラクト/イベントのクエリ |
関連スキル
midnight-onchain-logic/— ストレージに書き込まれる内容midnight-cryptography/— Blake2-256 と twoxhash の違いmidnight-rpc/— JSON-RPC を介した状態の読み取りmidnight-transactions/— トランザクションによるストレージ更新の仕組み
コメント
Markdown 対応