Skip to content

repro ecpairing blowup#11

Draft
fakedev9999 wants to merge 15 commits intobase:mainfrom
fakedev9999:fakedev9999/repro-ecpairing-blowup
Draft

repro ecpairing blowup#11
fakedev9999 wants to merge 15 commits intobase:mainfrom
fakedev9999:fakedev9999/repro-ecpairing-blowup

Conversation

@fakedev9999
Copy link

No description provided.

fakedev9999 and others added 15 commits February 10, 2026 17:08
Overhaul dependencies from superchain-primitives/old-kona/alloy-0.x to
kona-genesis (op-rs/kona v1.2.7), alloy 1.4, op-succinct (SP1 v6.0.0-rc.1).

New CLI commands:
- `from-op-succinct`: generates SP1Stdin fixtures via SingleChainOPSuccinctHost
- `run-op-succinct`: executes fixtures through CpuProver, extracts per-precompile
  cycle stats (bn_pair, bn_add, bn_mul, kzg_eval, ec_recover, p256_verify)

New justfile recipes: generate-op-succinct-fixture, run-op-succinct-fixture.

Old from-op-program/run-op-program commands stubbed (incompatible with new deps).
- Fix critical bug in From<RollupConfig> for kona_genesis::RollupConfig
  where self. references were used instead of cfg. parameter
- Convert impl Into<BlockNumHash> to idiomatic impl From<BlockID>
- Remove needless return and redundant .to_string() in TryFrom
- Remove unused Uint import in tests
- Apply field init shorthand
- Fix redundant doc comment
- Remove redundant help attributes (doc comments serve as clap help)
- Remove numbered inline comments restating the code
- Remove redundant SP1Stdin type annotation
- Remove verbose per-field doc comments on OpSuccinctStats (field names
  are self-documenting; suppress missing_docs lint)
- Remove unused std::fs import in util.rs tests
The hex literal was truncated during the initial implementation commit
(14110 chars vs 16816 on main), causing the test to fail with
"failed to fill whole buffer". Restored from main.
- Update devnet/standard.yaml to dict-based format required by current
  ethpandaops/optimism-package (chains/participants as named dicts,
  nested el/cl type fields, add network_id and fund_dev_accounts)
- Use env_var_or_default for OPTIMISM_DIR in justfile so recipes that
  don't need cannon/op-program don't fail on missing env var
…loyer-configs

- Update kurtosis service names in justfile to match new naming convention
  (op-el-2151908-node0-op-geth, op-cl-2151908-node0-op-node)
- Fix rollup node port grep (http -> rpc)
- Add op-deployer-configs/ to .gitignore (generated from devnet)
The OPSuccinctDataFetcher requires an L1 ChainConfig file for
non-mainnet chains. The built-in registry only has chain ID 1,
so generate-op-succinct-fixture fails on the devnet L1 (3151908).
Add the config queried from the devnet geth node via admin_nodeInfo.
The derivation pipeline was exhausting its L1 data source before reaching
the target L2 block because calculate_safe_l1_head() caps at the finalized
L1 block, which lags on minimal-preset devnets. Pass the L1 head hash
from op-node sync status directly via --l1-head, bypassing the estimation.
The via-ir pipeline without the optimizer lacks the Stack Limit Evader
step, causing stack-too-deep errors when compiling OpenZeppelin's ERC20
on older solc versions (e.g. 0.8.20 resolved on Linux). Pinning the
solc version ensures cross-platform reproducibility.
Point devnet contract deployer at op-deployer:local, built from
succinctlabs/optimism@fakedev9999/raise-max-gas-limit which raises
SystemConfig.MAX_GAS_LIMIT from 500M to 4B to support 2G+ gas block testing.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
The custom op-node build requires --rollup.l1-chain-config for non-standard
L1 chains (chain ID 3151908). Bake the config into a wrapper Docker image
and pass the flag via extra_params in standard.yaml.
Replace just shell() (evaluates at parse time) with runtime jq call
so the address is read from the freshly downloaded op-deployer-configs.
Root cause of 7.17x bn_pair_cycles blowup: the [patch.crates-io] entry
`substrate-bn = { ..., package = "substrate-bn-succinct-rs" }` fails to
replace the guest's transitive substrate-bn dependency from crates.io.
Guest programs run unpatched pure-software BN254 field arithmetic (21.4M
instructions/pairing) instead of SP1 precompile syscalls (1.18M with fix).

Changes:
- Add syscall_counts and opcode_counts fields to OpSuccinctStats, populated
  from ExecutionReport's EnumMap fields (Step 1)
- Add bench/pairing-v6: isolated BN254 pairing benchmark for SP1 v6, with
  direct git dep fix applied to guest Cargo.toml (Step 3)
- Add bench/pairing-v5: same benchmark for SP1 v5.2.4 as baseline (Step 3b)
- Add bench/v5: standalone v5 baseline workspace using lincoln's crates
  via path deps for full op-succinct reproduction (Step 2)

Benchmark results (per pairing, n=1):
  v5:         2,690,238 instructions, 31,802 syscalls
  v6 broken: 21,415,257 instructions, 0 syscalls (no precompile acceleration)
  v6 fixed:   1,182,752 instructions, 46,832 syscalls (2.27x faster than v5)
Updates op-succinct from #73725895 to #006e459c (PR #798 branch),
which includes the substrate-bn patch fix (PR #811). Also bumps
sp1-sdk from 6.0.0-rc.1 to 6.0.0 release.

Verified: ECPairing 20M gas fixture drops from 7.46B to 684M total
instructions (10.9x), bn_pair_cycles from 7.18B to 422M (17x).
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.

1 participant