Skip to content

feat(primitives-traits): add try_recover_signers for parallel batch recovery#21103

Merged
mattsse merged 1 commit intomainfrom
feat/try-recover-signers
Jan 17, 2026
Merged

feat(primitives-traits): add try_recover_signers for parallel batch recovery#21103
mattsse merged 1 commit intomainfrom
feat/try-recover-signers

Conversation

@mattsse
Copy link
Collaborator

@mattsse mattsse commented Jan 15, 2026

Summary

Add try_recover_signers function that combines decoding and signature recovery in a single parallel pass. This is more efficient than sequential recovery for large transaction batches.

Changes

  • Add try_recover_signers to transaction::recover module
  • Uses rayon for parallel recovery when the rayon feature is enabled
  • Update testing RPC to use batch recovery instead of sequential

Usage

let recovered_txs = try_recover_signers(&raw_transactions, |tx| {
    MyTxType::decode_2718_exact(tx.as_ref())
        .map_err(RecoveryError::from_source)
})?;

@mattsse mattsse requested a review from Rjected as a code owner January 15, 2026 15:23
@mattsse mattsse added the A-rpc Related to the RPC implementation label Jan 15, 2026
@mattsse mattsse requested a review from klkvr as a code owner January 15, 2026 15:23
@github-project-automation github-project-automation bot moved this to Backlog in Reth Tracker Jan 15, 2026
@mattsse mattsse added the C-perf A change motivated by improving speed, memory usage or disk footprint label Jan 15, 2026
…ecovery

Add try_recover_signers function that combines decoding and signature
recovery in a single parallel pass. This is more efficient than
sequential recovery for large transaction batches.

- Add try_recover_signers to transaction::recover module
- Uses rayon for parallel recovery when the feature is enabled
- Update testing RPC to use batch recovery instead of sequential
@mattsse mattsse force-pushed the feat/try-recover-signers branch from 875642a to ecf2eac Compare January 15, 2026 16:11
Copy link
Member

@gakonst gakonst left a comment

Choose a reason for hiding this comment

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

Nice refactor! The new try_recover_signers API is a clean abstraction for combining decode + recovery in a single parallel pass.

Code review:

  1. Flat module structure - Good call eliminating the nested rayon/iter modules. The #[cfg] dispatch at the function level is cleaner.

  2. Trait bounds - The TryRecoverItems and TryRecoverFn helper traits handle the Sync requirement for rayon nicely. The blanket impls keep usage ergonomic.

  3. RPC integration - The testing.rs change demonstrates the API well. Replacing the sequential recover_raw_transaction loop with try_recover_signers is a nice win for batch operations.

  4. Error handling - Using .or(Err(EthApiError::InvalidTransactionSignature)) loses the original error context. Consider using .map_err(|_| ...) to at least log the underlying error, but this is minor for testing endpoints.

LGTM :shipit:

@github-project-automation github-project-automation bot moved this from Backlog to In Progress in Reth Tracker Jan 17, 2026
@mattsse mattsse added this pull request to the merge queue Jan 17, 2026
Merged via the queue into main with commit 79b8ffb Jan 17, 2026
44 checks passed
@mattsse mattsse deleted the feat/try-recover-signers branch January 17, 2026 01:35
@github-project-automation github-project-automation bot moved this from In Progress to Done in Reth Tracker Jan 17, 2026
Vui-Chee added a commit to okx/reth that referenced this pull request Jan 20, 2026
* tag 'v1.10.1': (49 commits)
  chore: bump version to 1.10.1 (paradigmxyz#21188)
  chore: rename extend_ref methods on sorted data structures (paradigmxyz#21043)
  fix(flashblocks): Add flashblock ws connection retry period (paradigmxyz#20510)
  chore(bench): add --disable-tx-gossip to benchmark node args (paradigmxyz#21171)
  refactor(stages): reuse history index cache buffers in `collect_history_indices` (paradigmxyz#21017)
  feat(download): resumable snapshot downloads with auto-retry (paradigmxyz#21161)
  ci: update to tempoxyz (paradigmxyz#21176)
  chore: apply spelling and typo fixes (paradigmxyz#21182)
  docs: document minimal storage mode in pruning FAQ (paradigmxyz#21025)
  chore(deps): weekly `cargo update` (paradigmxyz#21167)
  feat(execution-types): add receipts_iter helper (paradigmxyz#21162)
  revert: undo Chain crate, add LazyTrieData to trie-common (paradigmxyz#21155)
  feat(engine): add new_payload_interval metric (start-to-start) (paradigmxyz#21159)
  feat(engine): add time_between_new_payloads metric (paradigmxyz#21158)
  fix(storage-api): gate reth-chain dependency behind std feature
  perf(storage): batch trie updates across blocks in save_blocks (paradigmxyz#21142)
  refactor: use ExecutionOutcome::single instead of tuple From (paradigmxyz#21152)
  chore(chain-state): reorganize deferred_trie.rs impl blocks (paradigmxyz#21151)
  feat(primitives-traits): add try_recover_signers for parallel batch recovery (paradigmxyz#21103)
  perf: make Chain use DeferredTrieData (paradigmxyz#21137)
  ...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-rpc Related to the RPC implementation C-perf A change motivated by improving speed, memory usage or disk footprint

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

2 participants