C-4 independence
C-4 independence
C-1 が「運営の部品に頼らず再構築できる」、C-3 が「2ノードで同じレコードに到達」を示しました。C-4 はその下流の3層――検索索引・API・フロントエンド――が、それぞれ運営のプライベートサービスに依存せず独立に成立するかを、個別に証明します。レビュアーの §19 #19(FE 独立性)・#20(API 独立性)・#21(インデクサー再現性)への回答です。
チェーンから組み直した帳簿(C-1/C-3)の下流には3つの設備があります――索引(カード目録)、API(受付窓口)、FE(閲覧室)。これらが運営の秘密設備を借りずに、自分の帳簿と自分のノードだけで立つか、を一つずつ確かめます。
→
索引・API・FE下流3層
→
3層とも独立運営非依存
結果、3層すべて運営非依存。API は自ノードがチェーン由来のレコードを配信(価格すらオンチェーンの Uniswap 由来)、索引は自前 Elasticsearch がローカル DB から構築、FE は公開 repo からビルドして自ノードを向く。外に出るのは GIF や AI 画像など任意の機能だけで、しかも運営ではなく中立の第三者サービスです。
1. 主張(検証対象)
公開レコードの下流3層が、運営のプライベートサービスに依存せず独立に成立すること。すなわち #20 API=レコードをチェーンから組み立て自ノードが配信し運営 API に依存しない、#21 索引=自前インデクサーがローカル DB(チェーン由来)から再現可能に構築される、#19 FE=公開コードだけで独立フロントエンドが立つ、こと。
2. 検証方法
#20 API:レコードの組み立て元を追う
公開レコードがチェーン(RawEventsGatherer → ActionProcessor → PostgreSQL)から組まれ、Api が外向き配信であることを確認。周辺機能が運営 API を叩いていないかも棚卸し。
#21 索引:インデクサーの入力源を確認
Elasticsearch がローカル DB のドメインオブジェクト(ActionProcessor が RawEvent から導出)から構築されること、すなわち運営フィードではなくチェーン由来 DB の決定論的射影であることを確認。
#19 FE:公開コードからの独立ビルド
FrontEnd が公開 repo 内に完結し、vite build でビルド可能で、API ベース URL が相対(自ノード)既定であることを確認。
3. 判定
vite でビルドでき、自ノードを向く。- #20 API レコードはチェーンから再構築され、
Apiは外向き配信。FE は相対 URL で自ノードを叩く。価格すらオンチェーンの Uniswap V2 プール由来で、運営 API への依存はゼロ。 - #21 索引 Elasticsearch は
ActionProcessorがローカル DB(RawEvent由来)から投入。運営フィードではなく、C-3 で再現性を示した DB の決定論的射影。 - #19 FE FrontEnd は公開 repo に完結し
tsc -b && vite buildでビルド可。API ベースはAPI_HOST ?? ''=相対(自ノード)で運営ドメインのハードコードなし。
示せたこと:下流3層とも、チェーン由来のレコードか自ノードだけで成立し、運営のプライベートサービスへの依存はゼロ。外部に出るのは GIF 検索(Giphy)・AI 画像(OpenAI/xAI)・リンクプレビューといった任意の UI 機能で、いずれも運営ではなく中立の第三者 APIを、各ノード運用者自身の API キーで呼ぶもの。公開レコードの構成要素ではなく、無効化しても record は成立します。
まだ示せないこと(open door):#21 は「再現性を示した DB(C-3)の決定論的射影」という論証で担保しており、ES インデックス自体のハッシュを2ノードで突き合わせる end-to-end 実測は将来の追加強化です。両ノードの運用者が同一である点は C-1/C-3 と共通の open door。
e2074718 時点・2026-06-23。4. receipt(公開証明)
3層それぞれの独立性の根拠(ソース):
| # | 層 | 判定 | 根拠(ソース) |
|---|---|---|---|
| 20 | API 独立性 | 独立 | レコードは RawEventsGatherer → ActionProcessor → PostgreSQL。Api は外向き。価格は prices.ts=オンチェーン Uniswap V2 プール由来 |
| 21 | インデクサー再現性 | 独立 | ActionProcessor が RawEvent(チェーン由来)からドメインオブジェクトを導出 → ES へ投入。ローカル DB の決定論的射影 |
| 19 | FE 独立性 | 独立 | FrontEnd/ は公開 repo に完結・vite build 可・API_HOST ?? ''=相対(自ノード) |
外部に出る経路は、運営ではなく中立の第三者 API を「任意機能」のために呼ぶだけです(各自のキー):
# 任意の UI 機能 → 中立の第三者 API(運営ではない・各ノードのキーで呼ぶ) routes/giphy.ts → api.giphy.com # GIF 検索(任意) routes/ai-proxy.ts → api.openai.com / api.x.ai # AI 画像生成(任意) routes/og.ts → ユーザ投稿リンクの OGP # リンクプレビュー(任意) # コアレコードは外部APIゼロ。価格すらオンチェーン由来: routes/prices.ts → Uniswap V2 プール(RPC) # 第三者価格APIではない
FE は公開 repo からこの手順で独立ビルドでき、既定で自ノード(same-origin)を向きます:
cd client/src/services/FrontEnd && npm ci && npm run build # tsc -b && vite build # API_HOST = import.meta.env.VITE_API_HOST ?? '' → 相対URL=自ノード
「索引が再現可能な DB の射影である」根拠は、その DB(RawEvent)が独立2ノードでバイト一致したこと(C-3:コンテンツ指紋 82651606…、309,672 件)に帰着します。
5. 注記・限界
GIF・AI 画像・リンクプレビューは任意の UI 機能で、中立の第三者 API(Giphy/OpenAI/xAI)を各ノード運用者のキーで呼びます。運営依存でも公開レコードの一部でもなく、無効化しても record は成立します(degrade するのは見た目の利便だけ)。
#21(インデクサー再現性)は「C-3 で再現性を実証した DB の決定論的射影」という形で担保しています。ES インデックス自体のハッシュを2ノードで突き合わせる実測は、必須ではないものの将来の追加強化です。
対象はオンチェーンのレコード。DM・画像はオフチェーン、Base L2 シーケンサ依存、両ノード運用者が同一である点は C-1/C-3 と共通の open door です。
その帳簿をチェーンから組み直せる限り、下流は誰の手も借りずに立ち上がる。
C-1 showed “reconstructable without operator-only parts,” and C-3 showed “two nodes reach the same record.” C-4 proves, item by item, that the three downstream layers — search index, API, and frontend — each stand independently, without depending on the operator’s private services. It is the answer to the reviewer’s §19 #19 (FE independence), #20 (API independence), and #21 (indexer reproducibility).
Downstream of the ledger rebuilt from the chain (C-1 / C-3) sit three facilities — the index (card catalogue), the API (the service window), and the FE (the reading room). We check, one by one, whether they stand on your own ledger and your own node, without borrowing the operator’s private equipment.
→
index / API / FE3 downstream layers
→
all 3 independentno operator dep
The result: all three are operator-independent. The API serves the chain-derived record from your own node (even prices come from on-chain Uniswap), the index is built by your own Elasticsearch from the local DB, and the FE builds from the public repo and points at your own node. The only outbound calls are optional features like GIFs and AI images — and those go to neutral third-party services, not the operator.
1. Claim (what is verified)
That the three downstream layers stand independently of the operator’s private services: #20 API — the record is assembled from the chain and served by the node’s own API, with no dependency on an operator API; #21 index — a self-hosted indexer builds reproducibly from the local (chain-derived) DB; #19 FE — an independent frontend stands up from the public code alone.
2. Method
#20 API: trace where the record is assembled
Confirm the public record is assembled from the chain (RawEventsGatherer → ActionProcessor → PostgreSQL) and that Api is an outbound serving layer. Inventory whether any peripheral feature calls an operator API.
#21 Index: confirm the indexer’s input source
Confirm Elasticsearch is built from the local DB’s domain objects (derived by ActionProcessor from RawEvent) — i.e. a deterministic projection of the chain-derived DB, not an operator feed.
#19 FE: independent build from public code
Confirm the FrontEnd is self-contained in the public repo, builds with vite build, and that the API base URL defaults to relative (own node).
3. Verdict
vite and points at the own node.- #20 API The record is reconstructed from the chain;
Apiis outbound; the FE hits its own node via a relative URL. Even prices come from on-chain Uniswap V2 pools — zero dependency on an operator API. - #21 index Elasticsearch is populated by
ActionProcessorfrom the local DB (derived fromRawEvent). Not an operator feed, but a deterministic projection of the DB C-3 proved reproducible. - #19 FE The FrontEnd is self-contained in the public repo and builds with
tsc -b && vite build. The API base isAPI_HOST ?? ''= relative (own node), with no hardcoded operator domain.
Proven: all three downstream layers stand on the chain-derived record or the own node, with zero dependency on operator private services. The only outbound calls are optional UI features — GIF search (Giphy), AI images (OpenAI / xAI), link previews — each to a neutral third-party API, not the operator, using each node operator’s own API key. They are not part of the public record; disable them and the record still stands.
Not yet proven (open door): #21 is secured by the argument that it is a deterministic projection of the DB whose reproducibility C-3 demonstrated; an end-to-end hash comparison of the ES index itself across two nodes is a future strengthening. That both nodes share one operator is the same open door as C-1 / C-3.
e2074718, 2026-06-23.4. Receipt (public proof)
The evidence (source) for each of the three layers’ independence:
| # | Layer | Result | Evidence (source) |
|---|---|---|---|
| 20 | API independence | independent | record from RawEventsGatherer → ActionProcessor → PostgreSQL. Api is outbound. Prices via prices.ts = on-chain Uniswap V2 pools |
| 21 | indexer reproducibility | independent | ActionProcessor derives domain objects from RawEvent (chain-derived) → into ES. A deterministic projection of the local DB |
| 19 | FE independence | independent | FrontEnd/ self-contained in the public repo, builds with vite, API_HOST ?? '' = relative (own node) |
The only outbound paths call neutral third-party APIs for “optional features” (with each node’s own keys):
# optional UI features → neutral third-party APIs (not the operator; each node's own key) routes/giphy.ts → api.giphy.com # GIF search (optional) routes/ai-proxy.ts → api.openai.com / api.x.ai # AI image generation (optional) routes/og.ts → OGP of user-posted links # link previews (optional) # the core record makes zero external API calls. even prices are on-chain: routes/prices.ts → Uniswap V2 pools (RPC) # not a third-party price API
The FE builds independently from the public repo and defaults to its own node (same-origin):
cd client/src/services/FrontEnd && npm ci && npm run build # tsc -b && vite build # API_HOST = import.meta.env.VITE_API_HOST ?? '' → relative URL = own node
That “the index is a projection of a reproducible DB” reduces to the fact that this DB (RawEvent) matched byte-for-byte across two independent nodes (C-3: content fingerprint 82651606…, 309,672 rows).
5. Notes & limits
GIFs, AI images, and link previews are optional UI features calling neutral third-party APIs (Giphy / OpenAI / xAI) with each node operator’s keys. They are neither an operator dependency nor part of the public record; disable them and the record still stands (only the visual convenience degrades).
#21 (indexer reproducibility) is secured as “a deterministic projection of the DB whose reproducibility C-3 demonstrated.” An empirical hash comparison of the ES index itself across two nodes is a future strengthening, not a requirement.
The scope is the on-chain record. DMs and images off-chain, the Base L2 sequencer, and both nodes sharing one operator are the same open doors as C-1 / C-3.
As long as that ledger can be rebuilt from the chain, the downstream stands up with no one else’s help.






