Solana RPC 2.0 · 図解ハンズオンvisual hands-on

1本の読み取り経路を、
いまの状態過去の履歴に分ける
Splitting one read path into current state and full history

いまのSolanaでは、1つのRPCノード(Agave)が合意形成・状態管理・台帳の保存・あなたのRPCクエリを、同じ1プロセスで抱えています。読み取りはすべてここを通り、古い履歴はBigTableなどに外付けされてきました。RPC 2.0は、その「読み取り」をバリデータから切り離し、性質の違う2つの問い ── いまの状態と、創世記からの履歴 ── に専用の経路をあてる再設計です。Solana Foundationと連携し、AGPLでオープンソース。受け持つのは Cloudbreak(いまの状態)Superbank(全履歴) の2つ。動かしながら理解しましょう。 On Solana today, a single RPC node (Agave) handles consensus, state management, ledger storage, and your RPC queries in one process. Every read funnels through it, and old history has been bolted on via external archives like BigTable. RPC 2.0 takes reads out of the validator and gives two fundamentally different questions — current state, and history since genesis — their own purpose-built paths. In partnership with the Solana Foundation, open-sourced under AGPL. Carried by Cloudbreak (current state) and Superbank (full history). Let's learn it hands-on.

DATA 2026.06 公開段階(AGPL・solana-rpc)open-sourced (AGPL · solana-rpc) 提供元 Triton One × Solana Foundationby Triton One × Solana Foundation

💡 AGPL とは ── 誰でも自由に使え、改変もできるオープンソースライセンス。ただし改変版を(ネット越しの)サービスとして提供するなら、その改変ソースも公開する義務があります。中身を隠した“囲い込み”を防ぎ、誰かの改善がみんなに還る ── まさに本資料の「断片化・ロックインを解く」狙いと同じ思想です。 💡 What AGPL means — a free, open-source license: anyone may use and modify it. But if you run a modified version as a network service, you must also publish your modified source. That blocks hidden "lock-in" and keeps one person's improvements flowing back to everyone — the same anti-fragmentation idea this guide is about.

all RPC reads が Agave から抜けて、2経路へall RPC reads lift out of Agave into two paths
Agave validator · 1 process consensus state ledger store all RPC reads ⚠ すべてが RAM / IO / CPU を共有⚠ everything shares RAM / IO / CPU ✓ 読み取り分の競合が解消✓ read contention resolved RPC 2.0 で分岐split at 2.0 Cloudbreak いま何が正しい?what's true now? = アカウントの状態 · PostgreSQL= account state · PostgreSQL Superbank 過去に何が起きた?what happened before? = 台帳の全履歴 · ClickHouse= full ledger history · ClickHouse 読み取りをバリデータの外へreads moved out of the validator
RPC 2.0 の核心: これまでは Agave(モノリス)が、合意形成と同じ1プロセスで全RPC読み取りも抱え、資源を奪い合っていました。RPC 2.0 は読み取りをバリデータの外へ出し、「いま何が正しい?」= Cloudbreak、「過去に何が起きた?」= Superbank の2経路へ分けます。▶ で before→after の変化を再生できます(初期表示は after)。 The core of RPC 2.0: Agave (the monolith) used to answer every RPC read in the same process as consensus, all contending for resources. RPC 2.0 moves reads out of the validator into two paths — "what's true now?" = Cloudbreak, "what happened before?" = Superbank. Press ▶ for the before→after change (shown here in its after state).
📘 公式OFFICIAL公式リポジトリ(solana-rpc/superbank · cloudbreak)のREADME・DDL、および公式ブログに書かれた、最も硬い事実。Hard facts from the official repos (READMEs, DDL) and Triton's official blog posts.
📊 Triton計測TRITON BENCHTritonのブログの計測値・試算。自社測定で第三者検証ではない点に注意。Benchmarks/estimates from Triton's blog — their own measurements, not independently verified.
🌱 現状CURRENT2026年6月時点の状況(公開直後・改名あり等)。変わり得る。Status as of June 2026 (just open-sourced, renamed, etc.). Subject to change.
00

なぜ必要だったのかWhy it was needed

問題は「どれか1つのクエリが遅い」ことではありません。性質の違う読み取りを、合意形成と同じ1プロセスに詰め込んだ「構造」そのものです。 The problem isn't any single slow query. It's the structure: cramming fundamentally different reads into the same process that also runs consensus.

🤔 まず予想してみよう🤔 Predict first

3ヶ月前のトランザクション履歴を引くと遅い。いちばんの原因は?Pulling 3-month-old transaction history is slow. The main reason?

答え: B。 データ量は確かに大きいですが、本当のボトルネックは保管と取り出し方です。古い履歴はノードの手元になく BigTableへネットワーク往復になり、さらに住所の履歴取得は「署名一覧 → 1件ずつ取得」の N+1 で往復が積み重なります。つまり量ではなく構造の問題 — だから量を減らすのではなく、保管そのものを設計し直します(→ 02)。 Answer: B. The volume is large, but the real bottleneck is how data is stored and fetched. Old history isn't local — it becomes a network round trip to BigTable — and address history piles up N+1 round trips ("list signatures, then fetch one by one"). It's the structure, not the size — so the fix is to redesign storage itself, not shrink the data (→ 02).

モノリスが抱える痛みは、大きく3つ。順番に図解します。 The monolith's pain comes in three forms. Let's diagram each.

01遅さ — 読み取りが合意形成と資源を奪い合うSlow — reads fight consensus for the same resources

1つのAgaveノードが合意形成・アカウント更新・台帳書き込み・全JSON-RPCを同時にこなし、メモリ・I/O・CPUを共有します。DEXが重いクエリを投げると、合意処理やストリーム配信と資源を取り合う。さらに古い履歴は手元になく、BigTableへネットワーク往復が発生します。A single Agave node runs consensus, account updates, ledger writes, and every JSON-RPC call at once, sharing memory, I/O, and CPU. A heavy query competes with consensus and streaming. Worse, old history isn't local — it becomes a network round trip to BigTable.

4ジョブが1組の資源に殺到 → 読み取りが待たされる4 jobs flood one set of resources → the read waits
Agave process consensus accounts DB blockstore writes all JSON-RPC reads ⏳ 読み取り応答が遅延⏳ read response delayed RAM/IO/CPU 1組だけ1 set ⚠ 4ジョブが1組の資源を奪い合う → 読み取りが待たされる⚠ 4 jobs fight over 1 set of resources → the read waits 古い履歴の読み取りだけonly reads of old history BigTable old history network round trip
📘 公式 / 1プロセスが RAM・I/O・CPU の1組を共有し、4つの仕事が奪い合う。混むと読み取りの応答が遅れる。古い履歴は手元になく BigTable へネットワーク往復。▶で競合の様子を再生できます。 📘 Official / one process shares a single set of RAM, I/O & CPU that four jobs fight over; under load the read response lags. Old history isn't local — a network round trip to BigTable. Press ▶ to watch the contention.
メソッド名をタップすると短い説明が出ますtap a method name for a short note
レイテンシ(ミリ秒)— 既存 vs RPC 2.0latency (ms) — before vs RPC 2.0 gPA (jsonParsed, avg) 6,276 314 gSFA 245 (BigTable) 5×(公開RPC比)5× vs public RPC getTransaction 460 138 · 3.3× getSignatureStatuses 188 (BigTable) 1,885 (public RPC) 49 ※ 同じメソッドでも基準次第で 188 と 1,885 が併存 → 倍率が変わる(下の注記)note: same method shows both 188 & 1,885 depending on baseline → the multiplier shifts (see below)
📊 Triton計測(軽負荷7.3 RPS)/ gPAは平均、ほかはp50。gPA平均は base64 で 2,488→205ms(約12×)、jsonParsed で 6,276→314ms(約20×)。看板の「20倍超」はこの平均値基準。基準・統計で数字は動く。 📊 Triton bench (light load, 7.3 RPS) / gPA is the average, others are p50. gPA avg: base64 2,488→205 ms (~12×), jsonParsed 6,276→314 ms (~20×). The headline "20×+" is on these averages. Numbers shift with baseline and statistic.
💡 数字の読み方(正直な注記)How to read the numbers (an honest note)

看板の「38倍」は公開RPC比(1,885ms基準)、アカウント側の「20倍超」は平均値基準(jsonParsed 6,276→314ms)です。一方Triton自身の別記事ではgetSignatureStatusesのBigTable比較が188msと10倍も低く出ています。倍率は「どの遅い相手と、どの統計で比べるか」で大きく変わり、すべてTriton自社・軽負荷の測定。独立した第三者ベンチは見当たりません。速くなったのは確かですが、倍率の数字は控えめに受け取るのが安全です。 The headline "38×" uses a public-RPC baseline (1,885ms); the accounts "20×+" uses an average (jsonParsed 6,276→314ms). Yet Triton's own other post lists the BigTable getSignatureStatuses at 188ms — 10× lower. The multiplier swings with which slow baseline and which statistic you pick, and all of it is Triton's own, light-load measurement. No independent third-party benchmark exists. Faster — yes; but treat the exact multipliers with caution.

02コスト — 読み取りなのにバリデータ級ハードを要求Cost — validator-class hardware just to serve reads

読み取りを速く保つにはノードを増やすしかなく、各ノードはRAM 768GB級・高速NVMeを要求(カスタム索引用の専用ノードは月$3,000超)。しかも二重の痛みがあり、新しいRPCノードがネットワークに加わるほどTurbineが配るデータ量が増え、伝播がみんなにとって遅くなる。本来、読み取りにそんな重装備は要らないのに、です。Keeping reads fast means adding nodes — each demanding 768 GB RAM and fast NVMe (a dedicated index node runs $3,000+/mo). And there's a second sting: every new RPC node joining the network forces the chain to push more shreds via Turbine, slowing propagation for everyone. Reads never needed that heavy a rig.

read node 768 GB RAM fast NVMe · big network dedicated index node $3,000+/mo 増設の悪循環the scaling loop + more RPC nodes Turbine pushes more shreds slower propagation for all
📊 Triton計測 / 公式ブログのコスト・スペック値。バリデータ級は RAM 768GB。📊 Triton bench / cost & spec figures from the blog. Validator-class means 768 GB RAM.

03断片化 — 各社の閉じた自作パイプラインとロックインFragmentation — closed, in-house pipelines and lock-in

性能とコストの壁を回避するため、各プロバイダーがモノリスの周りに独自パイプラインを自作。結果、それぞれが閉じたAPIの裏に隠れ、相互運用を想定しない作りになりました。大きなコードベースほど乗り換えは非現実的になり(ロックイン)、性能改善もエコシステム全体には積み上がりません。To dodge the performance and cost walls, each provider built its own pipeline around the monolith. The result: each hidden behind a closed API, none designed to interoperate. The bigger your codebase, the more impractical switching becomes (lock-in), and performance gains never compound across the ecosystem.

生データは公開 → 各社が閉じた速い経路 → 乗り換え不可 → 改善が渡らないraw open → closed fast paths → lock-in → gains don't cross
生データは公開。でも「速い経路」は各社の中に閉じるraw data is open — but the "fast path" stays closed inside each provider 公開された生データ — 誰でも読めるpublic raw data — anyone can read provider A 🔒 fast path独自索引own index provider B 🔒 fast path独自索引own index provider C 🔒 fast path独自索引own index 改善は他社へ渡らないgains don't cross over app app app ✕ B社へ乗り換え不可✕ can't switch to B 乗り換え不可 · 改善がエコシステムに積み上がらないno switching · gains don't compound across the ecosystem
📊 Triton計測 / 公式ブログの主張。立場上、自社解への動機づけを含む点は割り引いて。▶で「生データ公開→閉じた速い経路→ロックイン→改善が渡らない」を再生。📊 Triton bench / the blog's framing — discount for its motivation toward its own solution. Press ▶ for "raw open → closed fast paths → lock-in → gains don't cross".
だから打ち手はパッチではなく 「読み取りをバリデータの外に出し、2つの専用エンジンを作る」こと。→ 01 でその全体像と、2つが共有する1つの型を見ます。 So the move isn't a patch — it's to take reads out of the validator and build two purpose-built engines. → 01 shows the anatomy, and the single shape both engines share.
01

全体像 — 2つの問い、1つの型Anatomy — two questions, one shape

RPC 2.0 はバリデータから読み取りを外に出し、性質の違う2つの問いに別エンジンをあてます。面白いのは、その2つがまったく同じ4段の型でできていること。 RPC 2.0 lifts reads out of the validator and gives two different questions their own engines. The elegant part: both are built from the very same four-stage shape.

▶ メソッドを選ぶと、どちらのエンジンが答えるか分かれます▶ Pick a method to see which engine answers it
上のメソッドをタップしてみてください。Tap a method above.

🤔 まず予想してみよう🤔 Predict first

アカウントの最新残高と、3ヶ月前の取引履歴。同じデータベースで引くべき?An account's latest balance, and its 3-month-old transaction history. Should one database serve both?

答え: B。 「いまの残高」は1アカウントを頻繁に更新・即時参照する用途、「過去の履歴」は膨大で書き換えのないデータを範囲スキャンする用途。要求が正反対なので、Cloudbreak は PostgreSQL、Superbank は ClickHouse と、土台から分けています。 Answer: B. "Current balance" means frequently updated, instantly read single accounts; "history" means range-scanning huge, immutable data. Opposite demands — so Cloudbreak uses PostgreSQL and Superbank uses ClickHouse, split at the foundation.

1 · Ingest 2 · Store 3 · Auto-optimize 4 · Serve Yellowstone gRPC + スナップショット+ snapshot loader PostgreSQL 状態を保持holds state 適応型 索引adaptive index 生トラフィックに反応reacts to traffic Cloudbreak JSON-RPC ソース非依存の取込source-agnostic ingest Fumarole·gRPC·RPC·Bigtable ClickHouse 列指向で保管columnar store マテビューmaterialized views 定番の形を先回りpre-computed shapes Superbank JSON-RPC 同じ4段の型・中身は別物 — 出口はどちらも標準のSolana JSON-RPC(差し替え可)same 4-stage shape, different contents — both serve standard Solana JSON-RPC (drop-in)
📘 公式 / RPC 2.0記事+両リポジトリ。共通なのは取込→保管→自動最適化→提供という型。中身は別 ── 取込元(Cloudbreak=gRPC+スナップショット / Superbank=ソース非依存)、保管(Postgres↔ClickHouse)、最適化の流儀がそれぞれ違う。 📘 Official / RPC 2.0 post + both repos. The shared part is the ingest → store → auto-optimize → serve shape. The contents differ — ingest (Cloudbreak = gRPC + snapshot / Superbank = source-agnostic), store (Postgres ↔ ClickHouse), and optimization style.
取り込み元は2つで違います: Cloudbreak は Yellowstone gRPC + スナップショット(Triton自身の技術)、Superbank の取り込み器はソース非依存(Fumarole・gRPC・JSON-RPC・Bigtable のいずれからでも。フル履歴のバックフィルにはJetstreamerプラグイン)。→ 02 で、共通の型の中身 ── 2つのオーブンの違いを開けて見ます。 Their inputs differ: Cloudbreak uses Yellowstone gRPC + a snapshot loader (Triton's own tech), while Superbank's ingester is source-agnostic (Fumarole, gRPC, JSON-RPC, or Bigtable; full-history backfill via the Jetstreamer plugin). → 02 opens up the shared shape — the difference between the two ovens.
02

2つのエンジンの設計Inside the two engines

ここが図解の主戦場。まず履歴側(Superbank)、次に状態側(Cloudbreak)。どちらもよく来るクエリの形に合わせて作りを最適化します(Superbankは投入時に先回りで、Cloudbreakはあなたのトラフィックに反応して)。 The heart of the diagrams. History first (Superbank), then state (Cloudbreak). Both optimize their structure for the shapes of common queries — Superbank pre-builds them at write time, Cloudbreak reacts to your traffic.

Superbank · 履歴 · ClickHouse· history · ClickHouse

全履歴は膨大で、Tritonによれば1日あたり数千万件規模の取引が積み上がります。鍵は「全部速く読む」のではなく、関係ない部分を読まないこと。列指向のClickHouseは必要な列だけを読み、各テーブルが検索向けに物理的に並べ替えてあるので、無関係な範囲も丸ごと飛ばせます。The full ledger is enormous — by Triton's account the chain adds tens of millions of transactions a day. The trick isn't reading everything fast — it's not reading the irrelevant parts. Columnar ClickHouse reads only the needed columns, and because each table is physically sorted for the query, it skips irrelevant ranges entirely.

クエリ:「あるアドレスの署名一覧」 — 読む領域を赤=無駄/シアン=必要 で表示query: "signatures for an address" — red = wasted read, cyan = needed slot signature payer fee logs accounts
📘 公式 / ClickHouseは列指向。検索キーで並べ替え、必要な列だけ読む。さらにエポック単位で分割し古い範囲を丸ごとスキップ。 📘 Official / ClickHouse is columnar — sorted by search key, reads only needed columns, and partitions by epoch to skip whole old ranges.

Superbank の取り込みは入口を選びません。どこから取り込んでも、そのまま全部ためて、質問されやすい形に整理しておく ── だから後で速く答えられます。Superbank's ingest is not picky about the inlet. Wherever the data comes from, it stores everything as-is and organizes it for the common questions — so it can answer fast later.

どの入口からでも取り込むtake it in from any inlet (ソースを選ばない)(source-agnostic) そのまま全部everything, as-is 整理してためるorganize & store 質問されやすい形にshaped for the questions すぐ答えるserve fast JSON-RPC 任意: 最近の分はメモリで即答optional: recent slots answered from memory
📘 公式(リポジトリ) / 入口を選ばずそのまま全件ためて、整理して提供する。最近の分だけはメモリで即答する任意機能あり。 📘 Official (repo) / it stores everything unfiltered from any inlet, organized for serving. An optional feature answers just the most recent slots from memory.
実際の取込元・構成を見るSee the real sources & components
取込元(4つから選択)sources (pick one) Fumarole gRPC (DragonsMouth) JSON-RPC (getBlock) Bigtable 取込器ingester filterなしで投入flush, no filter ClickHouse 3テーブル・エポック分割3 tables · epoch-partitioned superbank-rpc JSON-RPC 任意: ヘッドキャッシュ(メモリ保持)optional: head cache (in memory) 有効時 < 1 ms・一部メソッドで processedwhen enabled: < 1 ms · processed on some methods

📘 取込→ClickHouse→提供の3層。取込元はFumarole / gRPC / JSON-RPC / Bigtableから選び、フィルタせず全件投入(フル履歴のバックフィルにはAnzaのJetstreamerプラグイン)。本番トポロジは単一 / cluster / replicated(ZooKeeper)。ヘッドキャッシュは任意(--features grpc-head-cache)で、有効時<1ms・一部の履歴メソッドでprocessed。 📘 Three layers: ingest → ClickHouse → serve. Ingest picks one of Fumarole / gRPC / JSON-RPC / Bigtable and writes everything unfiltered (full-history backfill uses Anza's Jetstreamer plugin). Production topology: local / cluster / replicated (ZooKeeper). The head cache is optional (--features grpc-head-cache): when on, <1 ms with processed on a subset of methods.

ClickHouse側のキモは、よく聞かれる質問の“作り置きの答え”を書き込み時にあらかじめ用意しておくこと。だからクエリ時に重い計算をせず、整った答えをすぐ返せます。The heart of the ClickHouse side: it prepares answers to the common questions ahead of time, at write time. So at query time it skips the heavy work and returns a ready answer.

全トランザクションall transactions 真実の源source of truth 書き込み時に“作り置き”pre-built at write time よく聞かれる質問の“作り置きの答え”prepared answers to common questions 「このアドレスの取引履歴は?」"this address's history?" 「この署名は確定した?」"is this signature final?" 「このトークンの動きは?」"this token's activity?" 答えは新しい順に用意 → 履歴クエリが速いanswers kept newest-first → history queries are fast
📘 公式(リポジトリ) / 1つの“真実の源”から、定番の質問への答えを書き込み時に自動で用意(マテリアライズドビュー)。各答えは新しい順に並ぶので、履歴の問い合わせが速い。 📘 Official (repo) / from one source of truth, answers to the common questions are prepared automatically at write time (materialized views). Each is kept newest-first, so history lookups are fast.
実テーブル名と DDL を見るSee the real table names & DDL
基底テーブルbase tables MV(挿入時に派生)MVs (derived at insert) transactions真実の源source of truthPART intDiv(slot,432000) blocks_metadataORDER (slot) entries (PoH)ORDER (slot, entry_index) → getTransaction / getBlock を直接担当→ serve getTransaction / getBlock directly gsfa → getSignaturesForAddress+ gTFA の署名走査+ gTFA signature scanPART addr_bucket · ORDER (address, slot↓) signatures → getSignatureStatusesPART sig_bucket · ORDER (signature, slot↓) token_owner_activity→ gTFA の tokenAccounts フィルタ(任意)→ gTFA tokenAccounts filter (optional)PART owner_bucket · ORDER (owner, slot↓) 挿入時に自動派生auto-derived at insert

📘 全テーブルは ReplacingMergeTree(slot)。基底 transactions がMVの供給源で、各MVは「住所 / 署名 / 所有者」のバケットで分け、slot降順で並べる ── 最新が先頭に来るので履歴クエリが速い。 📘 Every table is ReplacingMergeTree(slot). Base transactions feeds the MVs; each buckets by address / signature / owner and sorts slot-descending so the newest rows sit first.

新メソッド getTransactionsForAddress(beta) ── ウォレットの履歴取得は、これまで「署名を一覧 → 1件ずつ明細を取得」と何度も往復が必要でした(N+1問題)。gTFAはこれを“1回お願いするだけ”にまとめ、サーバ内で処理して1往復で返します。New method getTransactionsForAddress (beta) — fetching wallet history used to need many round trips: list signatures, then fetch each one (the N+1 problem). gTFA folds it into a single request, resolved server-side and returned in one round trip.

これまで — 何度も往復(N+1)before — many round trips (N+1) クライアントclient 署名の一覧をもらうget a list of signatures 1件ずつ明細を取りに行くfetch each one, one by one× N 回× N times 往復 N+1 回N+1 round trips gTFA — 1回にまとめるgTFA — folded into one クライアントclient 1回お願いするだけjust ask once サーバが中でまとめて処理the server does it all inside 往復 1 回1 round trip
📘 公式(リポジトリ) / 「1件ずつ」を「まとめて1回」に畳むのが gTFA。往復の数が N+1 → 1 に減るのがキモ。Solana標準外のcustomメソッドでbeta。 📘 Official (repo) / gTFA folds "one by one" into "all at once". The key is round trips dropping from N+1 → 1. A non-standard custom method, in beta.
サーバ内部の仕組み(実テーブル)を見るSee how it works inside (real tables)
クライアントclient getTransactionsForAddress1往復1 round trip サーバ内で完結resolved server-sidescan gsfa → hydrate from transactionstokenAccounts → token_owner_activity

📘 gTFAは gsfa(署名側)を走査し transactions(明細)で補完して1リクエストに束ねる。tokenAccounts フィルタは token_owner_activity が必要(無ければ拒否)。transactionDetailssortOrderpaginationToken 対応。 📘 gTFA scans gsfa (signatures) and hydrates from transactions (details) in one request. tokenAccounts filters require token_owner_activity (rejected if absent). Supports transactionDetails, sortOrder, paginationToken.

Cloudbreak · 状態 · PostgreSQL· state · PostgreSQL

Cloudbreak の見せ場は自動索引化。あなたの実トラフィックを数え、よく来るフィルタ型が閾値を超えると、専用のPostgreSQL索引を自動で作り、以後そのクエリはスキャンを飛ばして直接索引に当たります。手動の設定も申請も不要。(公式のexample設定では既定値 index-generation-threshold = 10。下のデモもこれに合わせています。)下のボタンで動かしてみてください。Cloudbreak's showpiece is auto-indexing. It counts your real traffic, and once a filter pattern crosses a threshold it builds a tailored PostgreSQL index automatically — and from then on matching queries skip the scan and hit the index directly. No manual setup or index requests. (The official example config defaults to index-generation-threshold = 10; the demo below matches that.) Try it below.

回数count 0 / 10 (例)(demo)
このクエリの体感レイテンシlatency for this query
クエリを投げると、Query Tracker が回数を数えます。Fire a query — the Query Tracker starts counting.

仕組みを一言でいうと、「よく来る質問を数えて、多ければ専用の“近道”を自動で用意する」。図にするとこうです:In a line: it counts which questions come often, and for the frequent ones it auto-builds a "shortcut". As a picture:

アプリapp 質問の回数を数えるcount how often each is asked よく来る質問に“近道(索引)”を自動で作るauto-build a "shortcut (index)" for frequent ones 以後そのクエリは近道で即答(スキャンを飛ばす)that query then takes the shortcut (skips the scan) 回数が多いとif frequent
📘 公式 / 実トラフィックの回数を数え、よく来るフィルタ型が閾値を超えると専用のPostgreSQL索引を自動作成。以後そのクエリはスキャンを飛ばして即答。手動の設定も申請も不要。 📘 Official / it counts real traffic, and once a filter pattern crosses a threshold it auto-builds a tailored PostgreSQL index. That query then skips the scan and answers instantly. No manual setup or requests.
実際の構成と既定値を見るSee the real components & defaults
スナップショットsnapshot gRPC stream Indexer PostgreSQL Query Tracker API server client

📘 5構成 ── 取込・保管・Query Tracker(フィルタ型の回数を数える)・Index(閾値超で専用Postgres索引)・Serve(標準JSON-RPCを振り分け)。対象プログラムに絞ることも可能。 📘 Five parts — ingest, store, Query Tracker (counts filter patterns), Index (tailored Postgres index past a threshold), Serve (routes standard JSON-RPC). Can be scoped to specific programs.

📘 query-tracker の既定値(公式 example 設定): index-generation-threshold=10 · index-creation-delay=10s · query-counts-reset-interval=24h · indexer-metrics-threshold=5(インデクサーが多忙なら索引作成を待機) · max-auto-indexes=100included/excluded-programs で対象を限定可。 📘 query-tracker defaults (official example config): index-generation-threshold=10 · index-creation-delay=10s · query-counts-reset-interval=24h · indexer-metrics-threshold=5 (pause index creation when the indexer is busy) · max-auto-indexes=100. Scope via included/excluded-programs.

速くて安いのは分かった。では 正しいの? 壊れないの? → 03 でデータの正しさと自己修復を見ます。 Fast and cheap — fine. But is it correct? does it stay correct? → 03 covers data correctness and self-healing.
03

整合性と自己修復Consistency & self-healing

速い別系統のDBは、停止やデータの取りこぼしにどう耐えるのか。Cloudbreakは起動時にSolanaのフルスナップショットで全アカウントをそろえ、ライブgRPCで更新を追い、取りこぼしを検出すると増分スナップショットから自動で復旧します。 How does a fast, separate database stay consistent and survive dropped data? Cloudbreak seeds the full account set from a full Solana snapshot on startup, follows live gRPC for updates, and auto-recovers from incremental snapshots when it detects a gap.

🤔 まず予想してみよう🤔 Predict first

ライブgRPCがスロットを取りこぼしたら、データはどうなる?If the live gRPC stream drops slots, what happens to the data?

答え: B。 公式によれば、ストリームがスロットを落とすと取り込み器が欠損を検出し、手動介入なしに増分スナップショットから自動復旧します。さらにデータセットは有界で、各アカウントは最新版のみを保持し、上書きされた版は確定時に破棄されます。 Answer: B. Officially, if the stream drops slots the ingester detects the gap and automatically recovers from incremental snapshots, with no manual intervention. The dataset is also bounded: only the latest version of each account is kept, with superseded versions discarded on finalisation.

Solanasnapshot live gRPC継続更新ongoing updates PostgreSQL起動時に全アカウントをシードfull account set seeded 有界データセットbounded dataset= 各口座 最新の1枚だけ残す= keep only the newest per account口座Aacct Av1v2v3🗑 旧版は捨てる🗑 old: dropped最新だけnewest kept確定時にGC → 履歴で膨らまないGC'd on finalisation → never grows
📘 公式 / 起動時にスナップショットで全アカウントをそろえ、ライブgRPCで更新。各口座は最新の1枚だけ残し、上書きされた旧版は確定時に捨てる(GC)。だから履歴でデータが無限に増えず、常に完全な現在状態を即座に返せる。 📘 Official / seed all accounts from a snapshot at boot, update via live gRPC. Each account keeps only its newest version; superseded ones are discarded (GC'd) on finalisation. So the data never grows without bound with history, and complete current state is returned instantly.
💡 補足:ラティスハッシュはプロトコル側の土台Context: the lattice hash is a protocol-level basis

Solana自体が、全アカウント状態の準同型ハッシュ「Accounts Lattice Hash」をスナップショットに書き込む仕組み(SIMD-215 / 220)を持ち、ノードは起動時にこれを検証することが推奨されています。つまり「スナップショットを真実の源とする」設計には、ネットワーク側に検証可能性の土台があります。ただし、Cloudbreakが内部でこのハッシュ照合や参照Agaveノードとの応答比較をどう使うかは、公開ブログには記載がありません(実装レベルの詳細)。本資料では確証できる範囲に留め、断定は避けています。 Solana itself writes a homomorphic hash of total account state — the Accounts Lattice Hash — into snapshots (SIMD-215 / 220), and nodes are advised to verify it at boot. So a "snapshot as source of truth" design rests on a network-level basis for verifiability. However, exactly how Cloudbreak uses such hashing or reference-Agave comparison internally is not stated in the public posts (an implementation-level detail), so we don't assert it here.

1 / 4
起動: フルスナップboot: full snapshot全アカウントをシードseeds all accounts live gRPC更新を反映applies updates スロット取りこぼしdropped slots→ 欠損を検出→ detect gap 増分スナップからfrom incremental自動復旧snapshots (auto) 整合回復consistent手動不要no manual fix
📘 公式 / 起動時にフルスナップショットでそろえ、ライブgRPCで追従。取りこぼしを検出すると、手動介入なしに増分スナップショットから自動復旧して整合を回復。 📘 Official / seed from a full snapshot at boot, follow live gRPC; on dropped slots, the ingester detects the gap and automatically recovers from incremental snapshots with no manual intervention.

スナップショットはどう手に入れる? ── ブートストラップも自己修復も、同じ cluster trackersnapshot crate の仕組みを使います。Where do the snapshots come from? — both bootstrap and self-healing use the same cluster tracker and snapshot crate machinery.

① まず「どのスナップショットを使うか」を知る① first, find out which snapshot to use スナップショット源snapshot sourcesRPCノードRPC nodessolcluster sidecar cluster tracker (Blockdaemon solcluster)/v1/snapshotsフル+増分ペアの一覧を公開lists full + incremental pairs 走査scrape ② snapshot crate がやること② what the snapshot crate does = スナップショットから必要な口座だけ取り出して Postgres へ= pull just the needed accounts out of a snapshot into Postgres 「このスロットを覆うペアは?」"which pair covers this slot?" 1 ペアを問い合わせask for the pair 2 ダウンロードdownload 3 展開(解凍)unpack 4 AccountsFileAccountsFileを読取read accounts 5 必要な口座をneeded accounts一括 upsertbulk-upsert PG
📘 公式(リポジトリ) / cluster tracker は Blockdaemon の solcluster で、スナップショット源を走査して /v1/snapshots にフル+増分ペアを並べる。snapshot crate は「このスロットを覆うペアは?」と尋ね、取得・展開して AccountsFile を読み、Postgresへ一括投入 ── 起動時のブートストラップにも、欠損時の自己修復にも同じ経路を使う。 📘 Official (repo) / the cluster tracker is Blockdaemon's solcluster; it scrapes snapshot sources and lists full + incremental pairs at /v1/snapshots. The snapshot crate asks "which pair covers this slot?", downloads and unpacks them, reads AccountsFile entries, and bulk-upserts into Postgres — the same path serves both startup bootstrap and gap recovery.
速さ・安さに加え、整合性と自己修復も押さえた。最後に → 04 で、オープン化・コスト・現在地を、誇張なしで見ます。 Fast, cheap, and now consistent and self-healing too. Finally → 04 covers open-sourcing, cost, and where things actually stand — without hype.
04

オープン化と現在地Open-sourcing & where it stands

RPC 2.0 は、両モジュールをAGPLで公開し、Solana Foundation が運営する中立組織 solana-rpc の下に置く取り組みです。 RPC 2.0 open-sources both modules under AGPL and places them under solana-rpc, a neutral org run by the Solana Foundation.

コスト — 古いデータに割増なしCost — no premium for old data

運用コストが下がったため、どの時代のデータでも料金は同じ。自前運用も現実的で、Cloudbreakはフルチェーンのインスタンス(数百のクエリパターン)でも約700GBに収まり、単一のPostgreSQLノードで月$400未満で動きます。対比として、カスタム索引用の専用Agaveノードは月$3,000超でした。Lower operating cost means the same price for data from any era. Self-hosting is realistic too: a full-chain Cloudbreak instance with hundreds of query patterns fits in ~700 GB and runs on a single PostgreSQL node for under $400/mo — versus a dedicated Agave index node at $3,000+/mo.

あゆみTimeline

2021〜
Geyser(Anza)で配信の土台 → Triton が Yellowstone gRPC(Dragon's Mouth)を構築Geyser (Anza) lays the streaming foundation → Triton builds Yellowstone gRPC (Dragon's Mouth)
その後later
Old Faithful — 創世記を含む完全な台帳を誰もがアクセス可能に。Superbankの前身。— made the complete ledger (from genesis) accessible to everyone. Superbank's predecessor.
2026.04.14
RPC 2.0 を発表RPC 2.0 announced — Foundationと連携、読み取り層を再設計— with the Foundation, rebuilding the read layer
2026.04.20–22
Hydrant / Steamboat を紹介Hydrant / Steamboat introduced — のちに改名— later renamed
2026.06.12
Superbank + Cloudbreak をAGPLで公開Superbank + Cloudbreak open-sourced (AGPL)

正直な現在地(2026年6月)Honest status (June 2026)

動いているWORKING
  • Tritonの本番で稼働中。履歴・アカウントの主要メソッドを提供。Running in Triton production, serving the main history & account methods.
  • 標準のSolana JSON-RPC互換で差し替え可。既存連携はそのまま。Drop-in on standard Solana JSON-RPC; existing integrations keep working.
  • 本番運用中(Cloudbreakは既存サービスの再設計、Superbankはゼロからの再構築でOld Faithfulの後継)。Running in production (Cloudbreak = re-architecture of an existing service; Superbank = ground-up rebuild, successor to Old Faithful).
🟡 公開直後EARLY AS OSS
  • 2026年6月に公開されたばかり(デプロイ可能なコード・docs・テストは同梱)。Open-sourced only in June 2026 (ships deployment-ready code, docs & tests).
  • 改名直後(Hydrant/Steamboat→Superbank/Cloudbreak)で名残あり。Just renamed (Hydrant/Steamboat → Superbank/Cloudbreak); leftovers remain.
  • 外部の採用・貢献はこれから(RPCワーキンググループは発足済み)。External adoption & contribution are still nascent (the RPC working group is established).
🔲 未検証・要注意UNVERIFIED
  • 性能・コストはすべてTriton自社計測。第三者ベンチなし。All performance/cost is Triton's own; no third-party benchmark.
  • 「38倍(履歴)/20倍超(アカウント)」は基準・統計の取り方依存"38× (history) / 20×+ (accounts)" depends on baseline & statistic.
  • 稼働には外部データソースが必要(Cloudbreak=Yellowstone gRPC / Superbank=Fumarole・gRPC・JSON-RPC・Bigtable)。フル履歴の自己ホストは容量が大きく重い。Needs an external data source (Cloudbreak = Yellowstone gRPC / Superbank = Fumarole, gRPC, JSON-RPC, or Bigtable); full-history self-host is large and heavy.
  • processedコミットメントは限定的: Cloudbreakは既定でエラー(将来プラグイン予定)、Superbankはヘッドキャッシュ有効時の一部メソッドのみ。processed commitment is limited: Cloudbreak errors by default (plugin planned), Superbank only via the head cache for a subset of methods.
命名についての注記: 2026年4月時点の名称は Hydrant(履歴)Steamboat(状態) で、のちに SuperbankCloudbreak に改名されました。「Hydrant」は旧称として一部の画像やプラグインのURL等に名残がありますが、実際の取り込み器クレートは superbank です。 A note on naming: the April 2026 names were Hydrant (history) and Steamboat (state), later renamed Superbank and Cloudbreak. "Hydrant" lingers in some legacy artifacts (an image, a plugin's repo URL), but the actual ingestor crate is named superbank.

非公式の教育目的の解説です。事実は 📘公式 / 📊Triton計測 / 🌱現状 のラベルで出所を区別しています。📊の数値はTriton自身の計測・試算で、第三者検証ではありません。2026年6月時点の情報で、公開直後のため変わり得ます。一次情報は上の出典でご確認ください。 An unofficial educational explainer. Facts are tagged by origin: 📘 official / 📊 Triton bench / 🌱 current. The 📊 figures are Triton's own measurements/estimates, not independently verified. Current as of June 2026 and subject to change. Verify against the primary sources above.

Yuki Takahashi
Yuki Takahashi Solana Foundation External DevRel Japan / CAC株式会社 ブロックチェーン推進グループSolana Foundation External DevRel Japan / CAC Corporation, Blockchain Promotion Group