Conversation
Signed-off-by: Gregory Edison <gregory.edison1993@gmail.com> Co-authored-by: Léa Narzis <78718413+lean-apple@users.noreply.github.com> Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com> Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de> Co-authored-by: Darshan Kathiriya <8559992+lakshya-sky@users.noreply.github.com> Co-authored-by: dkathiriya <lakshya-sky@users.noreply.github.com> Co-authored-by: Ryan Schneider <ryanleeschneider@gmail.com> Co-authored-by: Tien Nguyen <htiennv@gmail.com> Co-authored-by: Roman Krasiuk <rokrassyuk@gmail.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com> Co-authored-by: Alexey Shekhirin <a.shekhirin@gmail.com> Co-authored-by: Querty <98064975+Quertyy@users.noreply.github.com> Co-authored-by: Federico Gimenez <fgimenez@users.noreply.github.com> Co-authored-by: joshieDo <93316087+joshieDo@users.noreply.github.com> Co-authored-by: Hai | RISE <150876604+hai-rise@users.noreply.github.com> Co-authored-by: Minhyuk Kim <kimminhyuk1004@gmail.com> Co-authored-by: Dan Cline <6798349+Rjected@users.noreply.github.com> Co-authored-by: Emilia Hane <elsaemiliaevahane@gmail.com> Co-authored-by: morito <ikeda.morito@gmail.com> Co-authored-by: Alessandro Mazza <121622391+alessandromazza98@users.noreply.github.com> Co-authored-by: frisitano <35734660+frisitano@users.noreply.github.com> Co-authored-by: kien-rise <157339831+kien-rise@users.noreply.github.com> Co-authored-by: Woolfgm <160153877+Dahka2321@users.noreply.github.com> Co-authored-by: Steven <112043913+stevencartavia@users.noreply.github.com> Co-authored-by: Ahmet Yazıcı <75089142+yaziciahmet@users.noreply.github.com> Co-authored-by: Skylar Ray <137945430+sky-coderay@users.noreply.github.com> Co-authored-by: Elvis <43846394+Elvis339@users.noreply.github.com> Co-authored-by: Harsh Vardhan Roy <42067944+royvardhan@users.noreply.github.com> Co-authored-by: greg <82421016+greged93@users.noreply.github.com> Co-authored-by: DaniPopes <57450786+DaniPopes@users.noreply.github.com> Co-authored-by: angel-ding-cb <141944320+angel-ding-cb@users.noreply.github.com> Co-authored-by: Miguel Oliveira <migueloliveiradev@gmail.com> Co-authored-by: faheelsattar <faheelsattar@yahoo.com> Co-authored-by: Tuan Tran <tropicaldog17@gmail.com> Co-authored-by: Ayodeji Akinola <akinayodeji4all@gmail.com> Co-authored-by: Tien Nguyen <116023870+htiennv@users.noreply.github.com> Co-authored-by: Victor Castell <0x@vcastellm.xyz> Co-authored-by: Christian Drappi <c@seismic.systems>
…se runner size (#44)
Co-authored-by: phexyz <32248504+phexyz@users.noreply.github.com>
Co-authored-by: Spencer Solit <sol@seismic.systems>
Co-authored-by: Ameya Deshmukh <ad@seismic.systems>
This is a no-op change. I just force rebased the seismic branch on seismic-evm repo to clean up its history. So the commit is different but it's pointing to the exact same code (old commit kept as head of seismic-pre-rebase branch).
This matches CLAUDE.md recommended settings, so I think it should be committed. This way vscode will format rust files properly.
Move seismic-features.md under docs/seismic, to follow the same convention as other repos (makes it easier for LLMs to find these docs). Also made minor updates, incorporating changes from https://github.com/SeismicSystems/documentation
Current behavior of eth_getProof is that it returns proofs for any slots, including private slots. We've already decided that eth_getStorageAt should return 0x00 for private slots, so eth_getProof should follow this behavior. ### Design Options There are 3 places where we could have prevented this: 1. (lowest level): disallow even generating proofs inside our seismic-trie fork 2. disallow generating [StorageProof](https://github.com/SeismicSystems/seismic-reth/blob/22816a566d49bdeeb7b40f696be876a7b90c67d8/crates/trie/common/src/proofs.rs#L732) structs for private slots 3. (highest-level: what this PR implements): retract slot+proof when converting StorageProof->EIP1186StorageProof (which is returned by the eth_getProof rpc) Opting for option 3. One downside is that there is confidential information potentially sticking around in memory, which has chances of leaking to logs (see this [issue](SeismicSystems/seismic-trie#17)) or being extracted from TEE from exploits somehow. The upside is that we can try to make our fork as minimal as possible and leave all the low-level librairies almost stock (I think there is a world where we can even completely get rid of our seismic-trie fork). This choice also mimicks how we implement CLOAD/CSTORE in the evm: the journal/storage layer behaves exactly the same as for sload/cload and will return any data: its the job of the evm instruction evaluation (highest-level) to enforce the privacy semantics and halt when SLOAD from the journal has returned a private slot.
… order genesis.json (#312) 3 main things: 1. changed contracts URL to point to contracts' new location in seismic monorepo 2. fixed binary cargo.toml by adding required "fmt" feature to tracing-subscriber 3. made produced dev.json genesis file lexicographically ordered to get better reproducibility going forward (will be easy to git diff for differences when we change some contracts' bytecode for example)
Bounded cache with HashSet + VecDeque for O(1) contains and FIFO eviction. Supports sequential appends, gap backfilling, and full rebuilds for reorg recovery via a `canonical_hash_at` closure.
… validation Replace per-transaction client iteration with O(1) cache lookups. The cache is populated at startup and updated via on_new_head_block, which uses the same consensus-driven source as the RPC layer, fixing the intermittent "recent_block_hash not found" error caused by database lag.
…315) This PR adds the following: ## Adversarial fuzzing framework A proptest-based fuzzing framework (`reth-seismic-fuzz`) that stress-tests all Seismic-specific code paths for panics. Any panic in production code is treated as a security bug since it can crash the node. ### What's tested - **Precompile crash-freedom**: All 5 stateless seismic precompiles (AES-GCM encrypt/decrypt, ECDH, HKDF, secp256k1-sign) fuzzed with arbitrary bytes and gas limits, including boundary-length inputs near each precompile's expected input size. - **EVM execution crash-freedom**: Full `SeismicEvm.transact()` with arbitrary transactions across all tx types except EIP-4844 (Legacy, EIP-2930, EIP-1559, Seismic 0x4A) and contract deployments. - **Flagged storage crash-freedom**: Dynamically-constructed bytecode with SLOAD, CLOAD (0xB0), and CSTORE (0xB1) opcodes on arbitrary storage slots, exercising the privacy boundary enforcement between public and private storage. - **Differential correctness**: Same non-seismic transaction executed on both SeismicEvm and plain revm, comparing success/failure outcome, gas usage, output bytes, and error reasons. Any divergence is a regression. - **Transaction encoding roundtrips**: EIP-2718 and Compact codec encode/decode roundtrips, plus raw arbitrary bytes fed into decoders to verify crash-freedom on the P2P attack surface. ### Bug fix: `Decompress` panic on corrupt database entries The zstd decompressor in `ReusableDecompressor::decompress` (`zstd-compressors/src/lib.rs`) panics via `assert!` when it encounters malformed data (e.g. "Unknown frame descriptor", "Dictionary mismatch"). This panic is reachable through any DB read that touches a corrupt entry — including P2P request handlers serving data to remote peers. This is a known issue in upstream reth. A user reported it in [paradigmxyz/reth#16052](paradigmxyz/reth#16052): their node ran for 6 hours with a corrupt snapshot, surviving its own sync loop (which handled MDBX-level corruption gracefully), until a random peer requested data from the corrupt region. The P2P handler hit the zstd assert and the entire node crashed. **Fix**: The `Decompress` trait implementations in `db-api/src/models/mod.rs` (the bridge between `Compact::from_compact` and the DB read path) now wrap `from_compact` in `catch_unwind`. If the zstd decompressor (or any other `from_compact` code) panics, it's caught and converted to `DatabaseError::Decode`. The existing error handling at every layer above — staged sync pipeline, P2P request handler, RPC — handles `DatabaseError` gracefully. The node stays up. **Validation**: The `db_corruption.rs` integration test writes a valid transaction to MDBX, overwrites it with corrupt bytes (zstd flag set, garbage payload) via `RawTable`, then reads it back through the production code path (`tx.get::<Transactions>()` → `decode_one` → `Decompress::decompress`). It asserts that: 1. The read returns `Err(DatabaseError::Decode)` instead of panicking 2. The zstd decompressor panic actually fired internally (captured via `set_hook`)
This PR introduces EIP-4844 (blob transaction) coverage to the fuzz testing framework. ## What changed - Removed the EIP-4844 skip guards in `tx_encoding.rs` that were blocking roundtrip fuzz coverage. The `arbitrary(skip)` on the EIP-4844 variant in `seismic-alloy` has been removed upstream, so `proptest` now generates blob transactions naturally (~20% of cases). The "known encoding limitations" comment was stale — both EIP-2718 and `Compact` roundtrips pass for EIP-4844. - Added `tx_type = 3` (EIP-4844) to the `FuzzSeismicTx` generator in `tx_gen.rs`. The selector changed from `% 4` to `% 5`, and blob-specific fields (`blob_hashes`, `max_fee_per_blob_gas`) are populated when generating blob transactions. This means EVM execution, differential, and flagged storage fuzz tests now exercise EIP-4844 code paths. - Updated `into_eth_compatible_tx` to include EIP-4844 in differential testing (it's a standard Ethereum tx type). ## What's now fuzzed - `tx_roundtrip_2718` — EIP-4844 encode/decode roundtrip - `tx_roundtrip_compact` — EIP-4844 `Compact`/zstd roundtrip - `evm_transact_never_panics` — EVM execution with `tx_type=3` and blob fields - `differential_eth_vs_seismic_outcome` — `SeismicEvm` vs plain `revm` with blob txs
Just a small change where enclave uses tracing instead of println so that --quiet actually doesnt show the enclave logs. Only incorporates this one commit: SeismicSystems/enclave#173
Adds automated PR review via Claude Code GitHub Action. Reviews trigger on every PR open/push and on `@claude` mentions in PR comments. Scoped to read-only tools (gh pr diff/view/comment, git). Review focus includes Seismic-specific concerns: - Confidential tx (0x4a) encryption handling and plaintext leak prevention - Enclave/TEE purpose key safety - EVM execution and confidential state isolation - TxPool RecentBlockCache correctness - RPC extension safety - Clippy strictness (no unwrap/expect/indexing/panic/unreachable/todo) Requires `ANTHROPIC_API_KEY` secret to be set in repo Settings > Secrets and variables > Actions.
PR Review SummaryChangesThis PR ([DONT MERGE] Seismic => upstream diff) captures the full delta between the Blocking Issues1.
2. Hardcoded let rng_mode = RngMode::Execution; // TODO WARNING: chose a default valueThe comment itself flags this as a known incorrect default. 3. Debug log of full consensus tx (potentially including input) in payload builder debug!("default_seismic_payload: tx: {:?}", tx); // tx is full SeismicTransactionSignedMissing 4. Debug log of full recovered transaction (ciphertext + sender) in tracing::debug!(target: "reth-seismic-rpc::eth", ?recovered, "serving seismic_eth_api::send_raw_transaction");
tracing::debug!(target: "reth-seismic-rpc::eth", tx_hash=%recovered.tx_hash(), sender=%recovered.signer(), "serving seismic_eth_api::send_raw_transaction");5. Debug log of full tracing::debug!("reth-seismic-rpc::eth create_txn_env {:?}", env);Missing 6. Debug log of full tracing::debug!("from_recovered_tx: tx: {:?}", tx);
7. Mock enclave server gated only by runtime CLI flag, not compile-time feature The mock server and all #[cfg(any(test, feature = "mock-enclave"))]
if config.mock_server { ... }Emit a compile error if Suggestions
Positive Notes
|
…e-review (#321) ## Summary - Remove `synchronize` from PR triggers to break the push→review→new-issues→push loop; re-reviews now happen on-demand via `@claude` comments only - Add exhaustive initial review mode that catches all issues in a single pass and stamps the reviewed commit SHA - Add incremental re-review mode that diffs only new changes since the last review and tracks resolution of previously flagged issues - Use `fetch-depth: 0` for full git history and add `PR_NUMBER`/`IS_REREVIEW` env vars for cleaner prompt interpolation ## Test plan - [ ] Open a test PR to verify the initial review triggers on `opened` and produces a single exhaustive comment with the reviewed commit SHA - [ ] Push a follow-up commit and confirm no automatic re-review fires - [ ] Comment `@claude` on the PR and verify the re-review mode activates, diffs against the last reviewed SHA, and uses the re-review output format
No description provided.