Skip to content

docs(protocol): URC production-readiness review for permissionless preconf - #22012

Open
dantaik wants to merge 2 commits into
mainfrom
claude/urc-production-readiness-36c173
Open

docs(protocol): URC production-readiness review for permissionless preconf#22012
dantaik wants to merge 2 commits into
mainfrom
claude/urc-production-readiness-36c173

Conversation

@dantaik

@dantaik dantaik commented Aug 13, 2026

Copy link
Copy Markdown
Member

What

Adds packages/protocol/docs/urc_production_readiness_review.md — a thorough production-readiness evaluation of the Universal Registry Contract (eth-fabric/urc @ 132bc79, main HEAD) for use as Taiko's operator-registry + slashing backbone for permissionless preconfirmations, assuming ePBS (EIP-7732, Glamsterdam ~Q4 2026) then FOCIL (EIP-7805, Hegotá ~2027) land first.

Bottom line

Not production-ready at main HEAD, on three independent grounds:

  1. Process/state (red): main frozen ~13 months; README still says "not audited and is not ready for production use"; "Audit 3" unchecked; both prior audits (Zellic, Hashlock) predate HEAD (the Solady swap in #66 is unreviewed) and neither report is public; the standard-BLS signing fix lives only on the unmerged signing-domain branch (which eth-fabric/fabric uses, while our package.json pins urc#main); no canonical deployment anywhere and zero production users.
  2. Contract bugs at HEAD: two High (opt-in slashCommitment has no replay guard → burn ~all collateral; self-triggerable slashWindow escape → permanent immunity + reclaim), three Medium (delegation doesn't bind the slasher; cross-deployment signature replay → wrongful equivocation slashing; getters misreport slashable status), plus Lows and a non-RFC-9380 signing scheme. Several are unpatchable after an immutable deploy.
  3. Immutability + ePBS timing: Registry core is fork-agnostic, but ePBS reshapes the commitment supply chain (proposer→builder), and the Delegation/Commitment schema — frozen forever at deploy — has no builder/constraints notion.

Recommendation: keep the permissioned PreconfWhitelist (live since Aug 2025) as the interim path; adopt the URC only after signing-domain is merged, a fresh audit covers the exact bytecode (and prior reports are published), the contract bugs are fixed, and an ePBS-compatibility analysis of the schema exists. Pin to an audited tag, never a moving branch. This supports keeping our permissionless stack parked on permissionless-preconf (moved off main 2026-07-04) until those gates clear.

Contents

  • Security findings on the URC core (Registry/interfaces/BLS/Merkle), with severity, file:line, exploit scenarios, and fixes.
  • Process/maintenance/ecosystem readiness (audit provenance, deployments, adopters).
  • ePBS/FOCIL impact, split across the Registry core (fork-agnostic), commitment semantics (ePBS-reshaped), and the slasher layer (must be rebuilt).
  • A full, prioritized change list split by owner: URC contract changes, URC process/release gating, ePBS/FOCIL-driven changes, and Taiko-side integration changes — flagging which are must-do-before-any-immutable-deploy.

Documentation only; no code or protocol behavior changes.

🤖 Generated with Claude Code

https://claude.ai/code/session_01EAxjMge8SpdSr3HJTTBgyk


Generated by Claude Code

…s preconf

Adds a review evaluating the Universal Registry Contract (eth-fabric/urc @
132bc79) for use as Taiko's operator-registry + slashing backbone for
permissionless preconfirmations.

Summary of the assessment:
- Process/state: main frozen ~13 months; README still says "not ready for
  production"; Audit 3 unchecked and prior audits (Zellic, Hashlock) predate
  HEAD; standard-BLS fix stranded on unmerged signing-domain branch; no
  canonical deployment and zero production users.
- Contract findings: two High (opt-in slashCommitment replay; self-triggerable
  slash-window escape), three Medium (delegation not binding slasher;
  cross-deployment signature replay -> wrongful equivocation slashing;
  getters misreport slashable status), plus Lows and a non-RFC-9380 signing
  scheme.
- ePBS/FOCIL: Registry core is fork-agnostic; ePBS forces a Delegation/
  Commitment schema decision before an immutable deploy and a rebuild of the
  slasher layer; FOCIL forces a gateway-ordering spec (Taiko-side).
- Includes a full, prioritized change list split by owner (URC contract,
  URC process, fork-driven, Taiko integration).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAxjMge8SpdSr3HJTTBgyk
@dantaik
dantaik marked this pull request as ready for review August 13, 2026 09:23
@dantaik
dantaik enabled auto-merge August 13, 2026 09:23

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 5d956591c8

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

- **E‑2 (P1):** Complete **§10.5 poster‑signature domain separation** (EIP‑712 with chainid + verifying contract); partially addressed by `#21346`.
- **E‑3 (P1):** Harden the `checkProposer` **liveness coupling**: it is called unconditionally inside `propose()` with no gas isolation and no `try/catch`, so a buggy/griefable checker halts the rollup. Add isolation and/or a bounded‑gas contract and a permissionless fallback.
- **E‑4 (P1):** The design doc assumes a **permissionless escape hatch** ("if forced‑inclusion delay exceeded, `Inbox` bypasses proposer checking"); the current `Inbox.sol` calls `checkProposer` **unconditionally** and the permissionless‑delay knobs are stored but never enforced (kimi‑k3 finding I‑01). Add the bypass if the design relies on it.
- **E‑5 (P0):** Re‑pin the URC dependency to the audited tag from B‑2, and reconcile the triplicated, inconsistent **handover‑slot constants** (Go default 8, Rust comment 4, ejector 4) before any of them become on‑chain window logic.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Distinguish the stale Rust comment from its runtime value

At the reviewed parent, the Go default is 8 (packages/taiko-client/driver/driver.go:37) and Rust's actual HAND_OVER_WINDOW_SLOTS is also 8 (packages/taiko-client-rs/crates/whitelist-preconfirmation-driver/src/api/service/mod.rs:49-53); only the Rust comment incorrectly says the Go default is 4, while the ejector runtime default is 4 (packages/ejector/src/config.rs:31). Describing these as three inconsistent constants and assigning E-5 P0 can lead maintainers to change the already-correct Rust runtime value rather than fix its stale comment and reconcile the ejector's actual 4-slot default.

Useful? React with 👍 / 👎.

@github-actions

Copy link
Copy Markdown
Contributor

🐋 DeepSeek Code Review

🟡 Warnings

  1. Security findings are unverified and AI-generated. The document asserts multiple High/Medium severity vulnerabilities against an external contract with line-level references, but no code excerpts or links are included. Since this doc may be used as a production-release gate, every finding—especially H‑1 and H‑2—must be validated by a human against the exact commit before being treated as fact. A wrong severity could incorrectly block or permit adoption.

  2. The document points out a real repo problem but doesn't fix it. It states that packages/protocol/package.json:63 pins urc#main, a moving branch, while the recommendation says "pin to an audited tag, never a moving branch." A documentation-only PR does not change the original bad pin. If the pin exists, the repo should be updated or an issue filed; otherwise the doc is merely pointing out a problem without remediation.

  3. Provenance of the "two audit-grade passes" is unclear. The doc says it was generated with Claude Code, but does not identify who performed the human validation, if any. Without explicit confirmation, it can be mistaken for an external security review. Label it as an unpublished internal draft or list the human reviewers.

  4. Several factual claims about the external repo are unsourced. Examples: "eth-fabric/fabric uses signing-domain", "zero production users", "no canonical deployment anywhere", "README still says not audited". These will rot quickly and should be linked to the repo state at the time of writing, or removed if not verified.

🔵 Suggestions

  1. Add permalinks or commit SHAs for every cited PR (#66, #68, #53, #65) and the internal Taiko PR (#21346), plus permalinks to the referenced URC source lines at 132bc79.

  2. Include a short "Verification status" section stating which findings have been confirmed by a human auditor, and by whom, before merging.

  3. Convert the "Full, detailed change list" into tracked issues or a project board so the pre-deploy gates don't get lost.

  4. Remove the AI-generated badges/session link if this is intended as official protocol documentation, or clearly mark it as an AI-assisted draft requiring human sign-off.

  5. The document uses Unicode non-breaking hyphens (, ) throughout. Not a problem, but if the repo convention is ASCII, consider normalizing.

🟢 What Looks Good

  • Clear bottom-line recommendation with prioritized pre-deploy gates.
  • Good separation of URC contract changes vs. process/release gating vs. fork-driven vs. Taiko-side integration.
  • Correctly emphasizes that immutability makes several bugs unpatchable after deployment.
  • Directly answers the brief and gives a concrete interim path (PreconfWhitelist).

Automatically triggered on PR update • model: deepseek-v4-pro

dantaik added a commit that referenced this pull request Aug 14, 2026
- _buildProposal now calls the proposer checker gas-isolated (bounded gas +
  try/catch): a buggy or reverting checker can no longer halt the rollup
  (PR #22012 E-3).
- On checker revert, permissionless proposing is allowed while the escape
  hatch is open: the oldest queued forced inclusion overdue beyond
  forcedInclusionDelay * permissionlessInclusionMultiplier (wires the
  previously-unenforced knob, kimi-k3 I-01 / PR #22012 E-4). The
  authorization runs BEFORE forced inclusions are consumed so the hatch can
  observe the stale inclusion it is gated on.
- New Config field proposerCheckerGasLimit (validated; 3M on mainnet/devnet
  configs); LibForcedInclusion.isPermissionlessInclusionAllowed helper.
- Tests: permissionless proposing succeeds for an unauthorized caller when
  the hatch is open (and consumes the overdue inclusion); reverts with
  PermissionlessProposingNotAllowed otherwise (not overdue / no inclusions).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants