B-2 Peers onchain
B-2 Peers onchain
peer が二度と動かせない(B-1)だけでは、まだ半分です。固定された配線が正しい相手を指していなければ、橋は別の岸に架かったまま固まってしまう。この項目では、live V1 の設定済み peer がすべて「正しいチェーンの正しい契約」を指し、しかも往復で噛み合っているかを、メッシュ全体で一本ずつ照合します。
B-1 が「配線を後から動かせない」ことなら、B-2 は「その固定された配線が正しい相手を指しているか」です。電話交換機でいえば、各回線がちゃんと意図したオフィスにつながっていて、しかも往復どちらからかけても噛み合うかを確かめる作業です。
→
1本ずつ照合往復で
→
全部一致8/8
3つのチェーンの間に張られた8本の配線すべてを一本ずつ照合し、全部が正しい契約を指していることを確認しました(8/8 一致)。「動かせない(B-1)」と「正しく繋がっている(B-2)」が揃って、初めて橋は信頼できます。
1. 主張(検証対象)
各 OApp の設定済み peer が、意図された相手チェーンの、意図された契約アドレスを指していること。さらに、その配線が往復で一致している(A が B を指すなら B も A を指す)こと。誤配線・取り違え・片側だけの配線がないこと。
2. 検証方法
意図トポロジを確定
「どの配線が正しいか」を deploy のクロスチェーン配線から確定。設計上のメッシュは2系統――プロファイル網(L1 ハブ ↔ 各 L2 スポーク)と、不正証明網(一方の relay ↔ 他方の archive のクロス L2 ペア)。
全エッジの peers() をオンチェーンで読む
3チェーン(Sepolia 40161 / Base Sepolia 40245 / Arbitrum Sepolia 40231)にまたがる全 8 有向エッジについて peers(eid) を読み出し、下位20バイト(相手アドレス)を取り出す。
期待アドレスと突き合わせ、往復を確認
各エッジを live V1 の相手契約アドレスと照合(PASS / FAIL)。さらに4つの往復ペアが双方向で一致するかを確認。
3. 判定
- 8/8 PASS 全8エッジが、意図された相手契約をそのまま指していた。誤配線・取り違えはゼロ。
- 往復一致 4つのペアすべてが双方向で噛み合う。片側配線・非対称はなし。
系統ごとに見ると――プロファイル網は、L1 の CawProfile が各 L2 の CawProfileL2 と往復で繋がり、ハブ&スポークが正しく閉じています。不正証明網は、一方のチェーンの CawChallengeRelay が他方の CawActionsArchive を指し、その archive も相手の relay を指し返す――relay と archive がクロス L2 で正しく対になっています。
B-1 の「この配線は二度と動かせない」と併せて、メッシュは正しく繋がった状態のまま凍結されている――これが結論です。
4. receipt(公開証明)
全8エッジの照合結果です。2行ずつが1つの往復ペア(A が B を指し、B が A を指し返す)。
| # | 読み出し元 OApp(チェーン) | peers(eid) | 指すべき相手 | 判定 |
|---|---|---|---|---|
| 1 | CawProfile(Sepolia) | 40245 | CawProfileL2_L2 | PASS |
| 2 | CawProfileL2_L2(Base Sepolia) | 40161 | CawProfile_L1 | PASS |
| 3 | CawProfile(Sepolia) | 40231 | CawProfileL2_L2b | PASS |
| 4 | CawProfileL2_L2b(Arb Sepolia) | 40161 | CawProfile_L1 | PASS |
| 5 | CawChallengeRelay_L2(Base Sepolia) | 40231 | CawActionsArchive_L2b | PASS |
| 6 | CawActionsArchive_L2b(Arb Sepolia) | 40245 | CawChallengeRelay_L2 | PASS |
| 7 | CawActionsArchive_L2(Base Sepolia) | 40231 | CawChallengeRelay_L2b | PASS |
| 8 | CawChallengeRelay_L2b(Arb Sepolia) | 40245 | CawActionsArchive_L2 | PASS |
対象アドレス(live V1):CawProfile_L1 0x9fcbb3…74bF/ProfileL2_L2 0x0c3e24…b11d/ProfileL2_L2b 0xbB9c2A…2941/Relay_L2 0x8195A9…6639/Archive_L2 0x3b2A9a…3C05/Relay_L2b 0x454450…3075/Archive_L2b 0x5bCbB3…79E5。
再現は、各エッジについて peers(eid) の下位20バイトを相手契約アドレスと突き合わせるだけです。
peers(eid) を3チェーン8エッジ分読む再現は、自分のノードと同じ ethers v6(node) 版を、下のツールの「コマンドで確認」にコピー安全な形で用意しています(返り値の下位20バイトが相手契約アドレス)。
5. 注記・限界
この項目(B-2)が担保するのは「peer ルーティング表が正しい相手を指していること」です。peer が動かせないことは B-1 で別途確認済み。なお LayerZero のセキュリティスタック(DVN・確認数などの side-channel 設定)の妥当性は配線の整合性とは別の論点で、ここでは扱いません。
補足として、L1 上には CawProfileL2_L1(ミラー)も存在しますが、これは bypassLZ=true で LayerZero peer を持たないローカル用途の契約(A-5 参照)で、本メッシュ照合の対象外です。
正しい岸へ架かって、初めて橋になる。それを、一本ずつ確かめた。
A peer being un-movable (B-1) is only half of it. If the fixed wiring points to the wrong counterpart, the bridge ends up frozen onto the wrong bank. This item checks that every configured peer in live V1 points to “the right contract on the right chain,” and that each is matched round-trip — verifying the whole mesh, one wire at a time.
If B-1 is “the wiring can’t be moved later,” B-2 is “does that fixed wiring point to the right counterpart?” In switchboard terms, it’s checking each line is actually connected to the intended office, and that it matches whichever direction you call from.
→
check eachround-trip
→
all match8/8
We checked all 8 wires strung between the three chains, one by one, and confirmed they all point to the correct contract (8/8 match). Only when “can’t be moved (B-1)” and “connected correctly (B-2)” are both true is the bridge trustworthy.
1. Claim (what is verified)
That each OApp’s configured peer points to the intended contract address on the intended counterpart chain. Furthermore, that the wiring is matched round-trip (if A points to B, then B points to A). That there is no mis-wiring, mix-up, or one-sided wiring.
2. Method
Fix the intended topology
Determine “which wiring is correct” from the deploy cross-chain wiring. The intended mesh is two networks — the profile network (L1 hub ↔ each L2 spoke) and the fraud-proof network (one chain’s relay ↔ the other chain’s archive, a cross-L2 pair).
Read peers() for every edge on-chain
For all 8 directed edges across the three chains (Sepolia 40161 / Base Sepolia 40245 / Arbitrum Sepolia 40231), read peers(eid) and take the low 20 bytes (the counterpart address).
Reconcile with expected addresses and check the round-trip
Reconcile each edge with the live V1 counterpart address (PASS / FAIL). Then check that the four round-trip pairs match in both directions.
3. Verdict
- 8/8 PASS All 8 edges point to the intended counterpart contract as-is. Zero mis-wiring or mix-ups.
- round-trip All four pairs mesh in both directions. No one-sided wiring, no asymmetry.
Per network — the profile network has L1’s CawProfile connected round-trip with each L2’s CawProfileL2, so the hub-and-spoke closes correctly. The fraud-proof network has one chain’s CawChallengeRelay pointing to the other’s CawActionsArchive, and that archive pointing back to the counterpart relay — relay and archive correctly paired cross-L2.
Together with B-1‘s “this wiring can never be moved,” the mesh is frozen in a correctly-connected state — that is the conclusion.
4. Receipt (public proof)
The reconciliation of all 8 edges. Each pair of rows is one round-trip pair (A points to B, B points back to A).
| # | Read-from OApp (chain) | peers(eid) | Should point to | Result |
|---|---|---|---|---|
| 1 | CawProfile (Sepolia) | 40245 | CawProfileL2_L2 | PASS |
| 2 | CawProfileL2_L2 (Base Sepolia) | 40161 | CawProfile_L1 | PASS |
| 3 | CawProfile (Sepolia) | 40231 | CawProfileL2_L2b | PASS |
| 4 | CawProfileL2_L2b (Arb Sepolia) | 40161 | CawProfile_L1 | PASS |
| 5 | CawChallengeRelay_L2 (Base Sepolia) | 40231 | CawActionsArchive_L2b | PASS |
| 6 | CawActionsArchive_L2b (Arb Sepolia) | 40245 | CawChallengeRelay_L2 | PASS |
| 7 | CawActionsArchive_L2 (Base Sepolia) | 40231 | CawChallengeRelay_L2b | PASS |
| 8 | CawChallengeRelay_L2b (Arb Sepolia) | 40245 | CawActionsArchive_L2 | PASS |
Target addresses (live V1): CawProfile_L1 0x9fcbb3…74bF, ProfileL2_L2 0x0c3e24…b11d, ProfileL2_L2b 0xbB9c2A…2941, Relay_L2 0x8195A9…6639, Archive_L2 0x3b2A9a…3C05, Relay_L2b 0x454450…3075, Archive_L2b 0x5bCbB3…79E5.
To reproduce, just match each edge’s peers(eid) low 20 bytes against the counterpart contract address.
Reproducing peers(eid) for all 8 edges — the same ethers v6 (node) — is provided copy-safe under “CLI” in the tool below (the low 20 bytes of each return are the counterpart address).
5. Notes & limits
What this item (B-2) secures is that “the peer routing table points to the right counterpart.” That the peer cannot be moved is confirmed separately in B-1. The validity of the LayerZero security stack (DVN, confirmation counts, and other side-channel config) is a separate question from wiring integrity and is not covered here.
As a note, on L1 there is also a CawProfileL2_L1 (mirror), but it runs with bypassLZ=true and holds no LayerZero peer — a local-use contract (see A-5) outside this mesh reconciliation.
Only by reaching the right bank does it become one — and we checked that, one wire at a time.






