C-1 reconstruction
C-1 reconstruction
C-3 は「2ノードが同じ公開レコードに到達した」ことを示しました。C-1 はその手前――「運営の管理下にないインフラだけで、独立した2台目のノードを建てて再構築できるのか」、つまり運営のプライベート DB/API/インデクサー/設定/デフォルト FE に依存していないかを、ソースで棚卸しします。レビュアーの §19 #12「正確なノード再構築手順」への回答です。
図書館の蔵書目録を、運営の秘密の裏帳簿を見ずに、公開された手順だけで自分のところに作り直せるか――という問いです。必要なのは、自分の建物(VPS)・自分の棚(DB/索引)・公開アーカイブ(チェーン)への入口だけ。運営しか持っていない部品が1つでも要るなら「独立」とは言えません。
→
自前のDB・索引・RPC運営の部品ゼロ
→
独立ノードが再構築C-3で一致
調べた結果、運営しか出せない部品(プライベート DB/API/インデクサー/設定/FE)への依存は5項目すべてゼロ。実際 node2 は OS をまっさらにしてインストーラを回すだけで再構築でき、C-3 で node1 と同じレコードに到達しました。
1. 主張(検証対象)
運営の管理下にないインフラ(独立した VPS)だけで、公開された手順により独立ノードを建て、公開レコードを再構築できること。すなわち、運営のプライベート DB/API/インデクサー/設定/デフォルト FE のいずれにも依存していないこと(§19 #12)。
2. 検証方法
公開された再構築手順を確認
install.sh は、まっさらな Debian/Ubuntu を CAW ノードに仕立てる公開インストーラ。curl ワンライナーで取得でき、標準 OSS 一式(Node・Postgres・Redis・Elasticsearch・nginx・pm2・certbot)を入れ、非 root の caw ユーザを作り、公開リポジトリ(github.com/GilgameshCaw/Caw)をクローンして対話 CLI で設定・起動します。運営限定の入口はありません。
5つのプライベート依存をソースで棚卸し
レビュアーが挙げる「運営しか出せない部品」――プライベート DB/API/インデクサー/設定/デフォルト FE――それぞれについて、ノードのコードが運営の固有エンドポイントに依存していないかを確認。
実際に独立インフラで再構築して突き合わせ
node2(別 VPS。OS 削除→Ubuntu 再インストール→インストーラ再実行で空DB再構築)で実演し、C-3 で node1 と同一レコード(共通範囲 309,672 アクション)に到達することを確認。
3. 判定
install.sh+公開リポジトリで完結し、node2 のクリーン再構築が実証になっている。- 非依存 DB/インデクサー:自前の PostgreSQL・Elasticsearch を
install.shが導入。運営の DB・索引は不要。 - 非依存 API:レコードはチェーンから再構築され、
Apiは外向き配信。FE はAPI_HOST既定=空=相対 URL で自ノードを叩く。運営 API への逆依存なし。 - 非依存 設定:契約アドレスは config+repo 既定値、RPC は各自が env で供給(
cfg.rpcUrl)。運営から fetch する設定はなし。 - 非依存 デフォルト FE:FE は same-origin で自ノードに接続。運営ドメインのハードコードなし=第三者は自分の FE を自分のノードに向けられる。
示せたこと:再構築は公開された手順とコードだけで完結し、運営しか出せない部品への依存はゼロ。補助経路も運営中央ではありません――rpc-proxy は FE が自ノードの RPCを使うための中継(origin gate 付き)、唯一の外部 fetch DmRelay もノード間 P2P の DM 中継(各ノードが自分の鍵で署名)で、運営の中央サーバではありません。
まだ示せないこと(open door):①ノードは何らかの L2 RPC(公開 dRPC でも自前 Base ノードでも可)を必要とします。これは公開チェーンへの入口であって運営依存ではありませんが、もし運営の RPC を使えば回避可能な依存になります。②両ノードの運用者は同一(私)で、別オペレータによる再構築は第三者ノード待ち(C-3 と同じ open door)。
e2074718 時点・2026-06-23(再構築の実演は C-3)。4. receipt(公開証明)
誰でも、まっさらな Ubuntu からこの1行で同じ手順を再現できます(公開インストーラ・公開リポジトリ):
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/GilgameshCaw/Caw/master/install.sh)" # Node/Postgres/Redis/Elasticsearch/nginx/pm2/certbot を導入 → caw ユーザ作成 # → 公開 repo を clone → 対話 CLI で RPC 等を設定 → サービス起動
5つのプライベート依存テストの棚卸し結果:
| # | 運営しか出せない部品 | 判定 | 根拠(ソース) |
|---|---|---|---|
| 1 | プライベート DB | 非依存 | 自前 PostgreSQL(install.sh) |
| 2 | プライベート API | 非依存 | レコードはチェーンから再構築。Api は外向き。FE は API_HOST ?? ''=相対(自ノード) |
| 3 | プライベート インデクサー | 非依存 | 自前 Elasticsearch(install.sh/docker-compose.elasticsearch.yml) |
| 4 | プライベート 設定 | 非依存 | アドレス=config+repo 既定、RPC=env(cfg.rpcUrl) |
| 5 | デフォルト FE | 非依存 | FE は same-origin。運営ドメインのハードコードなし |
補助経路も運営非依存であることの確認:
# rpc-proxy: FE → 自ノード backend → 自ノードが設定した upstream RPC(origin gate 付き) client/src/api/routes/rpc-proxy.ts # getL1/L2HttpRpcUrl()(運営ではなく各自の RPC) # DmRelay: DM をローカル保存後、受信者を持つ「他インスタンス」へ P2P 中継(各ノードが署名) client/src/services/DmRelayService # 運営中央サーバではない/DM はオフチェーン # FE の API ベース URL FrontEnd/src/api/client.ts # API_HOST = import.meta.env.VITE_API_HOST ?? '' → 相対(自ノード)
そして「手順が実際に機能する」ことは、node2(クリーン再構築)が C-3 で node1 と同一レコードに到達したこと(コンテンツ指紋 82651606…、309,672 件一致)が証明しています。
5. 注記・限界
ノードは公開チェーンへの L2 RPC アクセスを必要とします(公開 dRPC でも自前 Base ノードでも可)。これは運営依存ではなく公開インフラ側の前提ですが、可用性・検閲の観点では RPC プロバイダへの信頼が残ります(open door)。
対象はオンチェーンのレコードです。DM・画像はオフチェーン(DM は P2P 中継/画像は local disk・Filebase)で、再構築の対象外=正直な open door。Base L2 シーケンサ依存も既知の open door です。
本項目(C-1)は再構築手順と運営非依存(#12)を担保します。FE 独立性・API 独立性・インデクサー再現性の個別証明(§19 #19–21)は C-4 で扱います(本棚卸しがその土台)。両ノードの運用者が同一である点は C-3 と共通の open door です。
まっさらな機械で走らせて、同じレコードが立ち上がるまで、再構築できたとは言わない。
C-3 showed that two nodes reach the same public record. C-1 is the step before that — “can an independent second node be stood up and reconstructed on infrastructure outside the operator’s control,” i.e. does it depend on the operator’s private DB / API / indexer / config / default frontend? We take inventory in source. It is the answer to the reviewer’s §19 #12 (“accurate node reconstruction procedure”).
Can you rebuild the library’s catalogue on your own premises using only a published procedure, without ever seeing the operator’s secret back-ledger? All you should need is your own building (a VPS), your own shelves (DB / index), and an entrance to the public archive (the chain). If even one part is something only the operator has, it is not “independent.”
→
own DB / index / RPCzero operator parts
→
independent node rebuildsmatched in C-3
The inventory found zero dependencies on operator-only parts (private DB / API / indexer / config / FE), across all five tests. In fact node2 was rebuilt by simply wiping the OS and running the installer, and it reached the same record as node1 in C-3.
1. Claim (what is verified)
That, using only infrastructure outside the operator’s control (an independent VPS) and a published procedure, an independent node can be stood up to reconstruct the public record — i.e. it depends on none of the operator’s private DB / API / indexer / config / default frontend (§19 #12).
2. Method
Inspect the published reconstruction procedure
install.sh is a public installer that turns a fresh Debian/Ubuntu host into a CAW node. It is fetched by a curl one-liner, installs the standard OSS stack (Node, Postgres, Redis, Elasticsearch, nginx, pm2, certbot), creates a non-root caw user, clones the public repository (github.com/GilgameshCaw/Caw), and configures/starts via an interactive CLI. There is no operator-only entrance.
Take inventory of the five private dependencies in source
For each “operator-only part” the reviewer names — private DB / API / indexer / config / default frontend — confirm the node’s code does not depend on an operator-specific endpoint.
Actually rebuild on independent infra and reconcile
Demonstrated on node2 (a separate VPS — OS deleted, Ubuntu reinstalled, installer re-run, rebuilt from an empty DB), confirming via C-3 that it reaches the same record as node1 (309,672 actions over the common range).
3. Verdict
install.sh + public repository, and node2’s clean rebuild is the demonstration.- independent DB / indexer: self-hosted PostgreSQL and Elasticsearch installed by
install.sh. No operator DB or index needed. - independent API: the record is reconstructed from the chain;
Apiis an outbound serving layer. The FE hits its own node viaAPI_HOSTdefaulting to an empty (relative) URL. No reverse dependency on an operator API. - independent Config: contract addresses from config + repo defaults; RPC supplied by each operator via env (
cfg.rpcUrl). Nothing fetched from the operator. - independent Default FE: the FE connects same-origin to its own node. No hardcoded operator domain — a third party can point their FE at their own node.
Proven: reconstruction is self-contained in the published procedure and code, with zero dependency on operator-only parts. The auxiliary paths are not operator-central either — rpc-proxy is a relay so the FE can use the node’s own RPC (with an origin gate), and the one external fetch, DmRelay, is a peer-to-peer DM relay between instances (each node signs with its own key), not an operator central server.
Not yet proven (open door): (1) the node needs some L2 RPC (public dRPC or your own Base node). That is access to the public chain, not an operator dependency — but using the operator’s RPC would be an avoidable one. (2) Both nodes share the same operator (me); reconstruction by an independent operator awaits a third-party node (same open door as C-3).
e2074718, 2026-06-23 (the rebuild demonstration is in C-3).4. Receipt (public proof)
Anyone can reproduce the same procedure from a fresh Ubuntu with this one line (public installer, public repo):
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/GilgameshCaw/Caw/master/install.sh)" # installs Node/Postgres/Redis/Elasticsearch/nginx/pm2/certbot → creates caw user # → clones the public repo → interactive CLI for RPC etc. → starts services
The inventory of the five private-dependency tests:
| # | Operator-only part | Result | Evidence (source) |
|---|---|---|---|
| 1 | Private DB | independent | self-hosted PostgreSQL (install.sh) |
| 2 | Private API | independent | record rebuilt from chain. Api is outbound. FE uses API_HOST ?? '' = relative (own node) |
| 3 | Private indexer | independent | self-hosted Elasticsearch (install.sh / docker-compose.elasticsearch.yml) |
| 4 | Private config | independent | addresses = config + repo defaults; RPC = env (cfg.rpcUrl) |
| 5 | Default FE | independent | FE is same-origin. No hardcoded operator domain |
Confirming the auxiliary paths are operator-independent too:
# rpc-proxy: FE → own backend → the node's own configured upstream RPC (origin-gated) client/src/api/routes/rpc-proxy.ts # getL1/L2HttpRpcUrl() (each operator's own RPC, not the operator's) # DmRelay: after storing a DM locally, relay P2P to "other instances" serving the recipient (each node signs) client/src/services/DmRelayService # not an operator central server / DMs are off-chain # FE API base URL FrontEnd/src/api/client.ts # API_HOST = import.meta.env.VITE_API_HOST ?? '' → relative (own node)
And that “the procedure actually works” is proven by node2 (the clean rebuild) reaching the same record as node1 in C-3 (content fingerprint 82651606…, 309,672 rows matching).
5. Notes & limits
The node needs L2 RPC access to the public chain (public dRPC or your own Base node). That is a public-infra prerequisite, not an operator dependency, but a trust in the RPC provider remains for availability/censorship (open door).
The scope is the on-chain record. DMs and images are off-chain (DM is P2P-relayed; images on local disk / Filebase) and outside reconstruction — an honest open door. Dependence on the Base L2 sequencer is also a known open door.
This item (C-1) secures the reconstruction procedure and operator-independence (#12). The itemized proofs of FE independence / API independence / indexer reproducibility (§19 #19–21) are covered in C-4 (this inventory is its basis). That both nodes share one operator is the same open door as C-3.
Until it runs on a blank machine and the same record stands up, we do not call it reconstructed.






