C-1 reconstruction


C-3 は「2ノードが同じ公開レコードに到達した」ことを示しました。C-1 はその手前――「運営の管理下にないインフラだけで、独立した2台目のノードを建てて再構築できるのか」、つまり運営のプライベート DB/API/インデクサー/設定/デフォルト FE に依存していないかを、ソースで棚卸しします。レビュアーの §19 #12「正確なノード再構築手順」への回答です。

やさしく言うと

図書館の蔵書目録を、運営の秘密の裏帳簿を見ずに、公開された手順だけで自分のところに作り直せるか――という問いです。必要なのは、自分の建物(VPS)・自分の棚(DB/索引)・公開アーカイブ(チェーン)への入口だけ。運営しか持っていない部品が1つでも要るなら「独立」とは言えません。

公開インストーラinstall.sh

自前のDB・索引・RPC運営の部品ゼロ

独立ノードが再構築C-3で一致

調べた結果、運営しか出せない部品(プライベート DB/API/インデクサー/設定/FE)への依存は5項目すべてゼロ。実際 node2 は OS をまっさらにしてインストーラを回すだけで再構築でき、C-3 で node1 と同じレコードに到達しました。

このページは検証台帳C-1 項目の詳細記録です。C-3(出力が決定論的に一致するか)と対になり、C-1 は再構築手順そのものと、運営非依存を担保します。

1. 主張(検証対象)

運営の管理下にないインフラ(独立した VPS)だけで、公開された手順により独立ノードを建て、公開レコードを再構築できること。すなわち、運営のプライベート DB/API/インデクサー/設定/デフォルト FE のいずれにも依存していないこと(§19 #12)。

2. 検証方法

1

公開された再構築手順を確認

install.sh は、まっさらな Debian/Ubuntu を CAW ノードに仕立てる公開インストーラ。curl ワンライナーで取得でき、標準 OSS 一式(Node・Postgres・Redis・Elasticsearch・nginx・pm2・certbot)を入れ、非 root の caw ユーザを作り、公開リポジトリgithub.com/GilgameshCaw/Caw)をクローンして対話 CLI で設定・起動します。運営限定の入口はありません。

2

5つのプライベート依存をソースで棚卸し

レビュアーが挙げる「運営しか出せない部品」――プライベート DB/API/インデクサー/設定/デフォルト FE――それぞれについて、ノードのコードが運営の固有エンドポイントに依存していないかを確認。

3

実際に独立インフラで再構築して突き合わせ

node2(別 VPS。OS 削除→Ubuntu 再インストール→インストーラ再実行で空DB再構築)で実演し、C-3 で node1 と同一レコード(共通範囲 309,672 アクション)に到達することを確認。

3. 判定

運営しか出せない部品への依存はゼロ。公開手順だけで独立インフラに再構築でき、C-3 で同じレコードに到達。
プライベート DB/API/インデクサー/設定/デフォルト FE の5項目すべてで運営非依存。再構築は公開 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)。

結論:§19 #12(正確なノード再構築手順)は満たされています。残る依存は「公開チェーンへの RPC アクセス」一点で、これは運営ではなく公開インフラ側。棚卸しは commit 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.shdocker-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”).

In plain terms

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.”

public installerinstall.sh

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.

This page is the detailed record for item C-1 of the Verification Ledger. It pairs with C-3 (whether the output matches deterministically); C-1 secures the reconstruction procedure itself and operator-independence.

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

1

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.

2

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.

3

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

Zero dependency on operator-only parts. The published procedure alone rebuilds the node on independent infra, reaching the same record in C-3.
Operator-independent across all five — private DB / API / indexer / config / default FE. Reconstruction is self-contained in the public 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; Api is an outbound serving layer. The FE hits its own node via API_HOST defaulting 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.
What this proves / what it does not yet prove

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).

Conclusion: §19 #12 (accurate node reconstruction procedure) is met. The remaining dependency is a single one — RPC access to the public chain — which is on the public-infra side, not the operator. Inventory at commit 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.

A procedure is not something you read — it is something you run.
Until it runs on a blank machine and the same record stands up, we do not call it reconstructed.
Copyright ©  CAW JAPAN.com All Rights Reserved.
PAGE TOP
夜の薔薇園へ