Skip to content

feat(observability): add phase-level observablity to newPayload processing #18308

Merged
yongkangc merged 17 commits intoparadigmxyz:mainfrom
Timosdev99:obsevability
Sep 13, 2025
Merged

feat(observability): add phase-level observablity to newPayload processing #18308
yongkangc merged 17 commits intoparadigmxyz:mainfrom
Timosdev99:obsevability

Conversation

@Timosdev99
Copy link
Contributor

@Timosdev99 Timosdev99 commented Sep 6, 2025

closes: #18187

this feature ensures proper granular timing metrics for newPayload processing phases

  • Added newPayloadPhaseMetrics struct in metrics.rs, defining metric of each phase of new payload processing
  • instrumented the on_new_payload function in mod.rs for record duration of overall process, pre-warming execution and post processing phase
  • instrumented the validate_block_with_state function in payload_validator.rs to hold duration for pre-warming initialization , block execution , post-execution validation, sparse tree, and state root algorithm

@github-project-automation github-project-automation bot moved this to Backlog in Reth Tracker Sep 6, 2025
@Timosdev99 Timosdev99 changed the title feat(observability): add phase level observablity to new payload proc… feat(observability): add phase-level observablity to newPayload proc… Sep 6, 2025
@Timosdev99 Timosdev99 changed the title feat(observability): add phase-level observablity to newPayload proc… feat(observability): add phase-level observablity to newPayload processing Sep 6, 2025
Copy link
Member

@Rjected Rjected left a comment

Choose a reason for hiding this comment

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

I think we should remove all "phase" naming and just name things after what is being measured. there's also some redundancy here, left some suggestions for what we should do instead

if block.block.number > highest.number &&
self.state().tree_state.is_descendant(*highest, block)
{
return PersistingKind::PersistingDescendant
Copy link
Member

Choose a reason for hiding this comment

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

Let's bring back no semicolons

/// Metrics for newPayload processing phases
#[derive(Metrics)]
#[metrics(scope = "engine.new_payload")]
pub(crate) struct NewPayloadPhaseMetrics {
Copy link
Member

Choose a reason for hiding this comment

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

These should be all be moved into BlockValidationMetrics IMO

Copy link
Contributor Author

Choose a reason for hiding this comment

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

These should be all be moved into BlockValidationMetrics IMO

please can i know why
i think this way is okay since they both measure different things and tbh i think the current structure is easy to maintain

Copy link
Member

Choose a reason for hiding this comment

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

please can i know why

because newPayload basically just does block validation, and some of the things in this struct, will need to be measured in the same function where the block validation metrics are measured

Copy link
Member

Choose a reason for hiding this comment

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

we could have them as a field in BlockValidation metric?

Comment on lines +514 to +515
// Phase A: Pre-execution (entry → execution start)
let pre_execution_start = Instant::now();
Copy link
Member

Choose a reason for hiding this comment

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

we should just be using validation_start, or new_payload_start, instead of creating two Instants

Copy link
Contributor Author

Choose a reason for hiding this comment

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

we should just be using validation_start, or new_payload_start, instead of creating two Instants

the pre_execution_start instant is used for measuring only the pre-execution phase
we cant use new_payload_start instant to measure both because we need to stop for the pre execution phase long before the entire function finishes

Copy link
Member

Choose a reason for hiding this comment

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

we can use the same Instant here though to record both, since we're just creating one after the other

for example doing this:

let start = Instant::now();

// do thing...

let first_elapsed = start.elapsed();

// do another thing...

let second_elapsed = start.elapsed();

will have the same result as doing

let start = Instant::now();
let second_start = Instant::now();

// do thing...

let first_elapsed = start.elapsed();

// do another thing...

let second_elapsed = second_start.elapsed();

with the exception being the time it takes for the call to

let second_start = Instant::now();

Comment on lines +544 to +548
// record pre-execution phase duration
self.metrics
.new_payload_phases
.pre_execution_duration
.record(pre_execution_start.elapsed().as_secs_f64());
Copy link
Member

Choose a reason for hiding this comment

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

I don't think this metric is useful because we are just recording getting the parent hash here, let's remove this

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I don't think this metric is useful because we are just recording getting the parent hash here, let's remove this

instead of removing it, I can just use it to measure the setup cost separately
IMO, it will be useful to identify bottlenecks

@github-project-automation github-project-automation bot moved this from Backlog to In Progress in Reth Tracker Sep 6, 2025
@Timosdev99
Copy link
Contributor Author

I think we should remove all "phase" naming and just name things after what is being measured. there's also some redundancy here, left some suggestions for what we should do instead

hey @Rjected i made some changes already ,can you please check it out

@Timosdev99
Copy link
Contributor Author

Hey @yongkangc please can I get a review on the changes I made recently on this and any suggestion

@Timosdev99 Timosdev99 requested a review from Rjected September 8, 2025 23:32
Copy link
Member

@Rjected Rjected left a comment

Choose a reason for hiding this comment

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

nice, just a few more comments

Comment on lines +514 to +515
// Phase A: Pre-execution (entry → execution start)
let pre_execution_start = Instant::now();
Copy link
Member

Choose a reason for hiding this comment

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

we can use the same Instant here though to record both, since we're just creating one after the other

for example doing this:

let start = Instant::now();

// do thing...

let first_elapsed = start.elapsed();

// do another thing...

let second_elapsed = start.elapsed();

will have the same result as doing

let start = Instant::now();
let second_start = Instant::now();

// do thing...

let first_elapsed = start.elapsed();

// do another thing...

let second_elapsed = second_start.elapsed();

with the exception being the time it takes for the call to

let second_start = Instant::now();

/// Metrics for newPayload processing phases
#[derive(Metrics)]
#[metrics(scope = "engine.new_payload")]
pub(crate) struct NewPayloadPhaseMetrics {
Copy link
Member

Choose a reason for hiding this comment

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

please can i know why

because newPayload basically just does block validation, and some of the things in this struct, will need to be measured in the same function where the block validation metrics are measured

@yongkangc yongkangc self-requested a review September 9, 2025 04:52
Copy link
Member

@yongkangc yongkangc left a comment

Choose a reason for hiding this comment

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

nice! @Rjected covered most of the pointers

no semicolons colons would be good :)

Err(error) => {
let status = self.on_new_payload_error(error, parent_hash)?;
return Ok(TreeOutcome::new(status))
return Ok(TreeOutcome::new(status));
Copy link
Member

Choose a reason for hiding this comment

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

semicolon cant be removed :)


let status = self.on_invalid_new_payload(block.into_sealed_block(), invalid)?;
return Ok(TreeOutcome::new(status))
return Ok(TreeOutcome::new(status));
Copy link
Member

Choose a reason for hiding this comment

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

semicolon cant be removed :)

@Timosdev99
Copy link
Contributor Author

Hey @Rjected @yongkangc please can I get a review on the recent changes I made

Copy link
Member

@Rjected Rjected left a comment

Choose a reason for hiding this comment

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

mostly nits, I think this is almost there


// record pre-execution phase duration
let pre_execution_elapsed = start.elapsed().as_secs_f64();
self.metrics.block_validation.pre_execution_duration.record(pre_execution_elapsed);
Copy link
Member

Choose a reason for hiding this comment

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

let's remove this metric now, since record_payload_validation should take care of this and records the same thing

// expensive because it requires walking over the paths in the prefix set in every
// proof.
if trie_input.prefix_sets.is_empty() {
let prewarming_start = Instant::now();
Copy link
Member

Choose a reason for hiding this comment

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

let's rename this to spawn_payload_processor_start

Comment on lines +557 to +558
let elapsed = root_time.elapsed();
maybe_state_root = Some((result.0, result.1, elapsed));
Copy link
Member

Choose a reason for hiding this comment

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

Suggested change
let elapsed = root_time.elapsed();
maybe_state_root = Some((result.0, result.1, elapsed));
maybe_state_root = Some((result.0, result.1, root_time.elapsed()));

Comment on lines +574 to +577
let (state_root, trie_output, root_elapsed) = if let Some(ref maybe_state_root) =
maybe_state_root
{
maybe_state_root
maybe_state_root.clone()
Copy link
Member

Choose a reason for hiding this comment

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

why do we need to clone this? would prefer keeping the code as it was here

Comment on lines +592 to +593
// record state root computation duration (Phase E)
self.metrics.block_validation.state_root_histogram.record(root_elapsed.as_secs_f64());
Copy link
Member

Choose a reason for hiding this comment

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

we might not need this now since we do

self.metrics.block_validation.record_state_root(&trie_output, root_elapsed.as_secs_f64());

on the next line

Comment on lines +513 to +514

// Phase A: Pre-execution (entry → execution start)
Copy link
Member

Choose a reason for hiding this comment

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

Suggested change
// Phase A: Pre-execution (entry → execution start)

@Timosdev99
Copy link
Contributor Author

Alright will make corrections soon

Copy link
Member

@yongkangc yongkangc left a comment

Choose a reason for hiding this comment

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

think we should bring back the no semis

self.on_tree_event(event)?;
if needs_backfill {
// can exit early if backfill is needed
return Ok(None)
Copy link
Member

Choose a reason for hiding this comment

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

here too

) -> Result<Option<TreeEvent>, InsertBlockFatalError> {
if blocks.is_empty() {
// nothing to execute
return Ok(None)
Copy link
Member

Choose a reason for hiding this comment

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

here too

Co-authored-by: Dan Cline <6798349+Rjected@users.noreply.github.com>
handle
} else {
self.payload_processor.spawn_cache_exclusive(env.clone(), txs, provider_builder)
let prewarming_start = Instant::now();
Copy link
Member

Choose a reason for hiding this comment

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

@Timosdev99
Copy link
Contributor Author

Hey @yongkangc @Rjected I brought back the no semi colon style back.
What's the impt of using no semi colon

@Timosdev99
Copy link
Contributor Author

@yongkangc please can i get a review on this

@yongkangc yongkangc requested a review from Copilot September 12, 2025 09:24
@yongkangc
Copy link
Member

Hey @yongkangc @Rjected I brought back the no semi colon style back.
What's the impt of using no semi colon

@Timosdev99 that's the current style and when reviewing its much easier as well

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull Request Overview

This PR adds comprehensive phase-level observability metrics to the newPayload processing pipeline to provide granular timing insights into different execution phases.

  • Added timing instrumentation for spawn payload processor initialization and post-execution validation phases
  • Modified overall newPayload timing to capture total duration and reorganized validation timing
  • Updated metrics structure by removing unused state root histogram and adding new phase-specific metrics

Reviewed Changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 9 comments.

File Description
payload_validator.rs Added timing instrumentation for prewarming initialization and post-execution validation phases
mod.rs Restructured newPayload timing to capture total duration and moved validation timing to after pre-execution
metrics.rs Removed unused state_root_histogram and added new metrics for spawn_payload_processor, post_execution_validation_duration, and total_duration

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

yongkangc and others added 2 commits September 12, 2025 17:28
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
@Timosdev99
Copy link
Contributor Author

@yongkangc is it good to go? Or needs more nit

Copy link
Member

@yongkangc yongkangc left a comment

Choose a reason for hiding this comment

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

some extra nits, but would like @mattsse to take a look as well :)

@mattsse this allows us to have more observability into where we are spending most of our time

self.payload_processor.spawn_cache_exclusive(env.clone(), txs, provider_builder);

// Record prewarming initialization duration
self.metrics
Copy link
Member

Choose a reason for hiding this comment

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

@Timosdev99 can we move the timing outside the if-else? so we can avoid dup?

Copy link
Contributor Author

@Timosdev99 Timosdev99 Sep 12, 2025

Choose a reason for hiding this comment

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

if we move it outside wont the timing be inaccurate since we will have to start it before the process?

@mattsse any suggestion?

Copy link
Member

Choose a reason for hiding this comment

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

I think we can't move the timing outside the if-else because otherwise the trie input calculation would be captured in the branch above, which can be fairly expensive. So IMO this is fine

yongkangc

This comment was marked as duplicate.

Copy link
Member

@Rjected Rjected left a comment

Choose a reason for hiding this comment

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

just one comment on adding back the state root duration, otherwise this looks good to me!

self.payload_processor.spawn_cache_exclusive(env.clone(), txs, provider_builder);

// Record prewarming initialization duration
self.metrics
Copy link
Member

Choose a reason for hiding this comment

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

I think we can't move the timing outside the if-else because otherwise the trie input calculation would be captured in the branch above, which can be fairly expensive. So IMO this is fine

pub(crate) state_root_storage_tries_updated_total: Counter,
/// Total number of times the parallel state root computation fell back to regular.
pub(crate) state_root_parallel_fallback_total: Counter,
/// Histogram of state root duration, ie the time spent blocked waiting for the state root.
Copy link
Member

Choose a reason for hiding this comment

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

it's not technically measuring the same thing, because one is a histogram (which records in percentile buckets) and the other one is a duration (recording a point-in-time metric), so we should add this back

@Timosdev99
Copy link
Contributor Author

i have made the requested changes @Rjected @yongkangc

Copy link
Member

@Rjected Rjected left a comment

Choose a reason for hiding this comment

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

This looks good to me, pending @yongkangc

@Timosdev99
Copy link
Contributor Author

This looks good to me, pending @yongkangc

thanks for your time @Rjected @yongkangc

Copy link
Member

@yongkangc yongkangc left a comment

Choose a reason for hiding this comment

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

lgtm, nice work @Timosdev99

@yongkangc yongkangc added this pull request to the merge queue Sep 13, 2025
Merged via the queue into paradigmxyz:main with commit e276480 Sep 13, 2025
41 checks passed
@github-project-automation github-project-automation bot moved this from In Progress to Done in Reth Tracker Sep 13, 2025
Soubhik-10 added a commit to Rimeeeeee/reth that referenced this pull request Sep 13, 2025
* feat: optionally disable balance check for `EthTransactionValidator` (paradigmxyz#18086)

* feat(optimism): Launch `FlashBlockService` when websocket URL is provided in `OpEthApi` (paradigmxyz#18077)

* feat: add NoopNetwork example (paradigmxyz#18093)

* feat: add helper for provider with wallet (paradigmxyz#18085)

* feat(optimism): Add `flashblocks_url` as part of rollup args of the `op-reth` CLI (paradigmxyz#18094)

* perf(engine): only fetch headers instead of full blocks for tree tasks (paradigmxyz#18088)

* feat(optimism): Implement conversion of `ExecutionPayloadBaseV1` into `OpNextBlockEnvAttributes` (paradigmxyz#18097)

* feat(optimism): Remove builder of next block environment from `FlashBlockService` (paradigmxyz#18100)

* refactor: make transaction validator functions reusable (paradigmxyz#17929)

Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>

* feat: add module manipulation methods and RPC server arg helpers (paradigmxyz#18084)

* chore(reth-optimism-cli): use OpTypedTransaction::eip2718_encode (paradigmxyz#18105)

* ci: remove expected failures (paradigmxyz#18099)

* feat: add EIP-7934 block size check to validateBuilderSubmissionV5 (paradigmxyz#18111)

* chore: include err in log (paradigmxyz#18119)

* fix(optimism): Prevent old pending flashblock from being returned from `pending_flashblock` (paradigmxyz#18103)

* chore: make `caller_gas_allowance` an RPC trait method (paradigmxyz#18101)

* fix(optimism): Fix endless poll on the FlashBlockService (paradigmxyz#18120)

* chore: add prewarm traces (paradigmxyz#18117)

* refactor(eth-wire): remove EthVersion::total_messages in favor of EthMessageID::max (paradigmxyz#17999)

* fix(engine): Prevent instant miner from creating empty blocks (paradigmxyz#18108)

Signed-off-by: 7suyash7 <suyashnyn1@gmail.com>

* perf(engine): only clone headers instead of full blocks for tree tasks (paradigmxyz#18116)

* fix(optimism): Verify that flashblocks are not old according to canon state (paradigmxyz#18123)

* fix: import should count on the delta (paradigmxyz#17819)

Signed-off-by: tmel <tmel0103@gmail.com>
Signed-off-by: tmelhao <tmel0103@gmail.com>
Co-authored-by: tmel <tmel0103@gmail.com>

* feat: Forward transactions to a specified endpoint (paradigmxyz#17444)

Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>

* feat(net): implement support of subprotocols (paradigmxyz#18080)

Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>

* fix(optimism): Fail if latest and base flashblock parent are different (paradigmxyz#18132)

Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>

* fix(txpool): ensure fee changes are updated (paradigmxyz#18137)

* refactor: merge `EthTransactionValidator` and `EthTransactionValidatorInner` (paradigmxyz#18129)

* docs(op): op chains don't require deposit contracts, so as dev chain (paradigmxyz#17988)

Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>

* feat: generalize impl EngineValidatorAddOn for OpAddOns (paradigmxyz#18141)

* perf(engine): pre-allocate Vec capacity in payload processor (paradigmxyz#18148)

* perf(engine): pre-allocate channel handles in prewarm task (paradigmxyz#18147)

* chore(reth-optimism-storage): small refactor code (paradigmxyz#18104)

* fix(trie): Fix call to update_account in witness (paradigmxyz#18154)

* feat(optimism): add FlashblocksRx getter (paradigmxyz#18155)

* perf(reth-invalid-block-hooks): use Reverts::eq reduce clone (paradigmxyz#18159)

* perf(optimism): Pass noop provider to skip state root calculations for flashblocks (paradigmxyz#18161)

* chore: Add 0x prefix and use macro (paradigmxyz#18156)

* fix(optimism): find fb attrs in base fb (paradigmxyz#18164)

* chore(deps): bump actions/upload-pages-artifact from 3 to 4 (paradigmxyz#18076)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* perf: optimize single-element collection creation (paradigmxyz#18168)

* ci: Fix .PHONY declaration for install-reth-bench target in Makefile (paradigmxyz#18152)

* fix: correct logical error in delete_outside_range error message (paradigmxyz#18031)

* refactor: remove unnecessary PathBuf clone in CLI help generator (paradigmxyz#18172)

* chore: simplify dev signed tx conversions (paradigmxyz#18171)

* chore(deps): weekly `cargo update` (paradigmxyz#18174)

Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com>

* perf(stages): optimize unwind operation by fetching headers instead full blocks (paradigmxyz#18139)

* chore: avoid using hashmap hashers directly (paradigmxyz#18176)

* feat: enhance engine tree metrics (paradigmxyz#18000)

* perf(txpool): eliminate allocations in basefee enforcement (paradigmxyz#18162)

* perf(optimism): use cached db in `FlashblockService` (paradigmxyz#18125)

Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>

* refactor(optimism): Extract responsibility to connect to a flashblock websocket stream (paradigmxyz#18158)

* test ci on main

* feat(examples): added txpoolExt_clearTxpool to existing example (paradigmxyz#18175)

* fix: Pass prefix set from init_from_state_dump into compute_state_root (paradigmxyz#18185)

* test(optimism): Cover successful decoding of websocket messages in `WsFlashBlockStream` (paradigmxyz#18163)

* test(optimism): Cover the failure case of decoding a non-binary message in `WsFlashBlockStream` (paradigmxyz#18166)

* test(optimism): Cover the case of stream returning errors in `WsFlashBlockStream` (paradigmxyz#18167)

* test(optimism): Cover the case of repeatedly failing to connect to websocket in `WsFlashBlockStream` (paradigmxyz#18169)

* dprint

* fixes

* fixes

* fix: struct serialization to match actual fields (paradigmxyz#18189)

* test(optimism): Test that streaming flashblocks from remote source is successful (paradigmxyz#18170)

* fixes

* fixes

* fixes

* resort

* fixes

* chore: simplify flashblocks poll logic (paradigmxyz#18194)

Co-authored-by: julio4 <30329843+julio4@users.noreply.github.com>
Co-authored-by: Roman Hodulák <roman.hodulak@polyglot-software.com>

* fixes

* chore: impl ExecutorTx for withtxenv (paradigmxyz#18202)

* perf: prepare flashblock txs (paradigmxyz#18201)

Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>

* fixes

* local tar

* try fork

* try fork

* fix: spawn flashblocks service as blocking (paradigmxyz#18214)

* fixes

* revert: "perf(txpool): eliminate allocations in basefee enforcement" (paradigmxyz#18215)

* fix: incorrect blob fee comparison (paradigmxyz#18216)

* fixes

* add an extra check

* add an extra check

* fix(optimism): Prevent repeated executions of current flashblock sequence (paradigmxyz#18224)

* fixes

* try fix

* added another check

* added another check

* test(optimism): Test that sequence stops before a gap (paradigmxyz#18228)

* feat(optimism): Warn if `FlashBlockService` has stopped (paradigmxyz#18227)

* chore: safe None check (paradigmxyz#18225)

* chore: improve flashblock logs (paradigmxyz#18232)

* fix(download): use updated merkle base URL (paradigmxyz#18236)

* fixes

* fixes

* chore(engine): add better logs and spans for execution (paradigmxyz#18240)

* chore(trie): use instrument instead of manual span (paradigmxyz#18239)

* fix: filter zero storage values when computing withdrawals root in genesis header (paradigmxyz#18213)

* enable by default

* perf(reth-optimism-flashblocks): rm redundant clone (paradigmxyz#18196)

* perf(txpool): eliminate allocations in basefee enforcement (paradigmxyz#18218)

Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>

* fixes

* docs: update urls in docs (paradigmxyz#18245)

* feat(optimism): Respond to ping messages with pong in `WsFlashBlockStream` (paradigmxyz#18212)

* removed one check is_some

* with new release

* test(optimism): Test that `WsFlashBlockStream` pongs a ping (paradigmxyz#18217)

* fixes

* fixes

* chore: downgrade debug to trace  for peer reputation logs (paradigmxyz#18250)

* feat: added amsterdam to hardforks

* use alloy config

* chore: unify engine downloader targets (paradigmxyz#18248)

* fix(optimism): Compare parent hash and latest hash to invalidate cached flashblock (paradigmxyz#18238)

* feat(optimism): Decode text messages in `WsFlashBlockStream` (paradigmxyz#18257)

* chore: remove redundant payload trait bounds (paradigmxyz#18262)

* hivd

* feat(optimism): Respond to close messages in `WsFlashBlockStream` (paradigmxyz#18256)

* fix(optimism): Reconnect if ws stream ends in `WsFlashBlockStream` (paradigmxyz#18226)

* test(optimism): Test that UTF-8 encoded messages are received in `WsFlashBlockStream` (paradigmxyz#18269)

* chore: log prune settings on unwind (paradigmxyz#18270)

* feat:db

* new tarball

* new tarball

* chore: extract `validate_against_parent_gas_limit` into separate fn (paradigmxyz#18277)

* perf: rm redundant collect (paradigmxyz#18281)

* fixes

* fixes

* 100

* rerun

* rerun

* rerun

* tracing

* perf: build local pending block without updates (paradigmxyz#18271)

* perf(db): do not heap-allocate the stage key per query (paradigmxyz#18284)

* chore(txpool): add sanity tests for blob fee bit handling (paradigmxyz#18258)

* fix: check prune checkpoints for unwind target limit (paradigmxyz#18263)

* perf: optimize send raw batching (paradigmxyz#18280)

* perf: specialize single batch request (paradigmxyz#18289)

* chore: delist unused deps with `cargo-machete` (paradigmxyz#18259)

* test(optimism): Test that close message is responded to in `WsFlashBlockStream` (paradigmxyz#18268)

* tracing

* fixes

* perf: specialize validate_transactions_with_origin for task validator (paradigmxyz#18288)

* feat(metrics): add `TxPoolValidatorMetrics` to track inflight validation jobs (paradigmxyz#18295)

* fixes

* fixes

* feat(gpo): add default fee price argument (paradigmxyz#18297)

Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>

* fixes

* feat: introduce setting for delegated txs slots (paradigmxyz#18298)

* feat: expose `EvmEnv` to `caller_gas_allowance` (paradigmxyz#18302)

* perf: specialize len 1 (paradigmxyz#18307)

* trace

* chore: fix various typos in comments and documentation (paradigmxyz#18296)

* perf(e2e-test-utils): optimize block checking by fetching header instead of full block (paradigmxyz#18254)

Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>

* feat: introduce maybe_pending method to StateProviderFactory (paradigmxyz#18260)

Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>

* chore: clippy happy (paradigmxyz#18310)

* more trace

* feat(download): support zst archives in reth download (paradigmxyz#18237)

Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>

* with new types

* rerun

* rerun

* rerun

* chore: introduce validationtask with capacity (paradigmxyz#18291)

* chore(deps): weekly `cargo update` (paradigmxyz#18312)

Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com>

* fix(rpc): error code `eth_sendRawTransactionSync` timeout (paradigmxyz#18252)

Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>

* fixes

* fixe

* fixes

* fixes

* chore(trie): dont warn on blinded node reveals (paradigmxyz#18317)

* refactor(optimism): Extract pending block building responsibility out of `FlashBlockService` (paradigmxyz#18247)

Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>

* rerun

* refactor: change PendingPool and PendingTransaction visibility to pub (paradigmxyz#18267)

* refactor(engine): persistence logic (paradigmxyz#18318)

* feat(optimism): flashblock completed sequences (paradigmxyz#18272)

* fix

* feat(trie): Add helper sub-command (paradigmxyz#18301)

* ci: pin Rust to 1.88 when building for Windows in Cross (paradigmxyz#18320)

* docs(reth-bench): fix markdown (paradigmxyz#18322)

* fix(bench): fix deadlock in test data generation (paradigmxyz#18321)

* fix(stateless): verify_execution_witness doc for pre-state mismatch (paradigmxyz#18319)

* fix: DB benches (paradigmxyz#18314)

* chore: bump version 1.7.0 (paradigmxyz#18323)

* chore: bump docs version 1.7.0 (paradigmxyz#18326)

* docs: update public dashboards (paradigmxyz#18331)

* chore(trie): use read-only db handle during repair-trie dry-runs (paradigmxyz#18328)

* chore(deps): bump actions/setup-go from 5 to 6 (paradigmxyz#18332)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): bump actions/github-script from 7 to 8 (paradigmxyz#18334)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): bump actions/stale from 9 to 10 (paradigmxyz#18335)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* feat: cache latest built payload (paradigmxyz#18324)

* perf(merkle-stage): only fetch checkpoint in the branch that needs it (paradigmxyz#18339)

* fix: properly compute genesis hash (paradigmxyz#18300)

* feat(op-reth/flashblocks): subscribe to the flashblock sequences produced (paradigmxyz#18276)

Co-authored-by: julio4 <30329843+julio4@users.noreply.github.com>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>

* perf(reth-engine-local): use VecDeque reduce removal operations (paradigmxyz#18198)

* fix(ci): pin teku image to fix kurtosis-op build (paradigmxyz#18345)

* fix(stages): implement entities checkpoint update in merkle stage unwind (paradigmxyz#18131)

* rerurn

* perf: use debug_assert for parked pool lookup (paradigmxyz#17712)

Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>

* refactor(revm): (paradigmxyz#18150) use hardfork activation helpers (paradigmxyz#18349)

Co-authored-by: Waiting-Chai <1753609696@qq.com>

* feat(stateless): Run EEST tests in stateless block validator & bug fixes (paradigmxyz#18140)

Signed-off-by: Ignacio Hagopian <jsign.uy@gmail.com>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>

* feat: support customizable RPC namespace parsers (paradigmxyz#18160)

Co-authored-by: Federico Gimenez <federico.gimenez@gmail.com>

* fix(prune): TransactionLookup pruning issues with pre-merge expiry (paradigmxyz#18348)

* feat(op-sdk): custom precompiles (paradigmxyz#18350)

* fix: fix search in vocs doc (paradigmxyz#18354)

* merge

* fix

* fix: add is_osaka check before erroring in default_ethereum_payload (paradigmxyz#18355)

* perf: optimize canonical_hashes_range with Vec::with_capacity pre-allocation + benchmark (paradigmxyz#18072)

Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>

* feat: add some ethapi builder fns (paradigmxyz#18358)

* fix(docs): include .vocs to retain search-index (paradigmxyz#18363)

* feat(engine): check header validity after invalid transaction (paradigmxyz#18356)

* fix(engine): avoid block fetching inconsistencies for checks during reorgs (paradigmxyz#18368)

* feat: bump hive eest tests (paradigmxyz#18013)

* fix: check payload id (paradigmxyz#18370)

* perf(trie): Use ParallelSparseTrie (if enabled) for storage tries (paradigmxyz#17959)

* fixes

* refactor!: more type-safety in cli (paradigmxyz#18375)

* feat: add helper aliases for node adapters (paradigmxyz#18366)

* fix: relax nonce gap rule if configured (paradigmxyz#18385)

* fix(docs): disable jekyll which removes the search-index (paradigmxyz#18388)

* fix(docs): mv search-index to dist from .vocs (paradigmxyz#18390)

* fix: map EIP-7623 gas floor errors to expected exception type for test compatibility (paradigmxyz#18389)

* feat: replace PendingBlockAndReceipts tuple with dedicated struct (paradigmxyz#18395)

* fix: still use real chain id for no-op network (paradigmxyz#18382)

* chore: use decode_2718_exact for recover raw txs (paradigmxyz#18381)

* chore: fixed broken link in history-expiry.mdx (paradigmxyz#18400)

* fix(e2e): persist accepted header in CheckPayloadAccepted and align timestamp (paradigmxyz#18275)

Co-authored-by: Federico Gimenez <federico.gimenez@gmail.com>
Co-authored-by: Federico Gimenez <fgimenez@users.noreply.github.com>

* chore: update e2e-test-utils code owners (paradigmxyz#18397)

* perf(db): reuse MDBX DBIs for the same tx (paradigmxyz#18292)

* feat(txpool): break down queued transaction states into specific reasons (paradigmxyz#18106)

Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>

* fix: dont update canon chain to ancestor for opstack (paradigmxyz#18410)

* feat(observability): add phase-level observablity to newPayload processing  (paradigmxyz#18308)

Co-authored-by: YK <chiayongkang@hotmail.com>
Co-authored-by: Dan Cline <6798349+Rjected@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* perf: downsize mempool tx priority from `U256` to `u128` (paradigmxyz#18413)

* chore(storage): remove unused `primed_dbis` (paradigmxyz#18415)

* feat: fn recovered_tx to indexedTx (paradigmxyz#18421)

* feat: add helper to PendingBlockAndReceipts (paradigmxyz#18423)

* refactor and cleanup

* fmt

* fixes

* clippy

* clippy

---------

Signed-off-by: 7suyash7 <suyashnyn1@gmail.com>
Signed-off-by: tmel <tmel0103@gmail.com>
Signed-off-by: tmelhao <tmel0103@gmail.com>
Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: Ignacio Hagopian <jsign.uy@gmail.com>
Co-authored-by: 0xKitsune <77890308+0xKitsune@users.noreply.github.com>
Co-authored-by: Roman Hodulák <roman.hodulak@polyglot-software.com>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
Co-authored-by: Hai | RISE <150876604+hai-rise@users.noreply.github.com>
Co-authored-by: Dharm Singh <153282211+dharmvr1@users.noreply.github.com>
Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>
Co-authored-by: nk_ysg <nk_ysg@163.com>
Co-authored-by: leniram159 <leniram159@gmail.com>
Co-authored-by: Andrea Simeoni <andreasimeoni84@gmail.com>
Co-authored-by: Matus Kysel <MatusKysel@users.noreply.github.com>
Co-authored-by: Suyash Nayan <89125422+7suyash7@users.noreply.github.com>
Co-authored-by: Haotian <303518297@qq.com>
Co-authored-by: tmel <tmel0103@gmail.com>
Co-authored-by: Louis Brown <48462338+louisbrown0212@users.noreply.github.com>
Co-authored-by: Max Bytefield <schoentgenaa@gmail.com>
Co-authored-by: Eric Woolsey <ewoolsey@ualberta.ca>
Co-authored-by: YK <chiayongkang@hotmail.com>
Co-authored-by: Brian Picciano <me@mediocregopher.com>
Co-authored-by: Jonas Bostoen <jonasbostoen@fastmail.com>
Co-authored-by: quantix9 <quantix9@proton.me>
Co-authored-by: Julio <30329843+julio4@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: pepes <155114519+dennsikl@users.noreply.github.com>
Co-authored-by: James Niken <155266991+dizer-ti@users.noreply.github.com>
Co-authored-by: VolodymyrBg <aqdrgg19@gmail.com>
Co-authored-by: David Klank <155117116+davidjsonn@users.noreply.github.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: smileclown2024 <167074920+smileclown2024@users.noreply.github.com>
Co-authored-by: DaniPopes <57450786+DaniPopes@users.noreply.github.com>
Co-authored-by: Fynn <zcheng1004@gmail.com>
Co-authored-by: Soubhik-10 <soubhiksmp2004@gmail.com>
Co-authored-by: TMOT <166535397+Timosdev99@users.noreply.github.com>
Co-authored-by: Brawn <nftdropped@gmail.com>
Co-authored-by: Dan Cline <6798349+Rjected@users.noreply.github.com>
Co-authored-by: Ivan Wang <wff19940326@gmail.com>
Co-authored-by: Mablr <59505383+mablr@users.noreply.github.com>
Co-authored-by: zhygis <5236121+Zygimantass@users.noreply.github.com>
Co-authored-by: Femi Bankole <llordbanks500@gmail.com>
Co-authored-by: Emilia Hane <elsaemiliaevahane@gmail.com>
Co-authored-by: kien-rise <157339831+kien-rise@users.noreply.github.com>
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
Co-authored-by: radik878 <radikpadik76@gmail.com>
Co-authored-by: theo <80177219+theochap@users.noreply.github.com>
Co-authored-by: Federico Gimenez <fgimenez@users.noreply.github.com>
Co-authored-by: かとり <SarahADavisA@gmail.com>
Co-authored-by: malik <aremumalik05@gmail.com>
Co-authored-by: Waiting-Chai <1753609696@qq.com>
Co-authored-by: Ignacio Hagopian <jsign.uy@gmail.com>
Co-authored-by: Federico Gimenez <federico.gimenez@gmail.com>
Co-authored-by: Léa Narzis <78718413+lean-apple@users.noreply.github.com>
Co-authored-by: Rez <rez@berachain.com>
Co-authored-by: Yash Atreya <44857776+yash-atreya@users.noreply.github.com>
Co-authored-by: Soubhik Singha Mahapatra <160333583+Soubhik-10@users.noreply.github.com>
Co-authored-by: stevencartavia <112043913+stevencartavia@users.noreply.github.com>
Co-authored-by: Cypher Pepe <125112044+cypherpepe@users.noreply.github.com>
Co-authored-by: Snezhkko <snezhkodaria38@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

feat(observability): add phase-level observability to newPayload processing

4 participants