Skip to content

Commit 519e9c6

Browse files
refactor(taiko-client-rs): remove proposal-id/canonical-tip wiring and use confirmed head-state sync (#21332)
1 parent c500e8a commit 519e9c6

File tree

40 files changed

+1238
-1592
lines changed

40 files changed

+1238
-1592
lines changed

packages/taiko-client-rs/crates/driver/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ pub use config::DriverConfig;
1717
pub use driver::Driver;
1818
pub use error::{DriverError, map_driver_error};
1919
pub use production::PreconfPayload;
20-
pub use sync::{CanonicalTipState, SyncPipeline, SyncStage, event::EventSyncer};
20+
pub use sync::{ConfirmedSyncSnapshot, SyncPipeline, SyncStage, event::EventSyncer};
2121

2222
// Re-export signer from protocol crate for backward compatibility
2323
pub use protocol::signer;

packages/taiko-client-rs/crates/driver/src/metrics.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ impl DriverMetrics {
2020
pub const EVENT_SCANNER_BATCHES_TOTAL: &'static str = "driver_event_scanner_batches_total";
2121
/// Counter tracking scanner stream errors.
2222
pub const EVENT_SCANNER_ERRORS_TOTAL: &'static str = "driver_event_scanner_errors_total";
23+
/// Counter tracking failures while probing confirmed-sync readiness.
24+
pub const EVENT_CONFIRMED_SYNC_PROBE_ERRORS_TOTAL: &'static str =
25+
"driver_event_confirmed_sync_probe_errors_total";
2326
/// Counter tracking proposal logs processed by the driver.
2427
pub const EVENT_PROPOSALS_TOTAL: &'static str = "driver_event_proposals_total";
2528
/// Counter tracking skipped proposals (e.g. zero ID, below initial ID).
@@ -122,6 +125,11 @@ impl DriverMetrics {
122125
Unit::Count,
123126
"Errors emitted by the event scanner stream"
124127
);
128+
metrics::describe_counter!(
129+
Self::EVENT_CONFIRMED_SYNC_PROBE_ERRORS_TOTAL,
130+
Unit::Count,
131+
"Errors emitted while probing confirmed-sync readiness in event sync"
132+
);
125133
metrics::describe_counter!(
126134
Self::EVENT_PROPOSALS_TOTAL,
127135
Unit::Count,
@@ -248,6 +256,7 @@ impl DriverMetrics {
248256
metrics::counter!(Self::BEACON_SYNC_REMOTE_SUBMISSIONS_TOTAL).absolute(0);
249257
metrics::counter!(Self::EVENT_SCANNER_BATCHES_TOTAL).absolute(0);
250258
metrics::counter!(Self::EVENT_SCANNER_ERRORS_TOTAL).absolute(0);
259+
metrics::counter!(Self::EVENT_CONFIRMED_SYNC_PROBE_ERRORS_TOTAL).absolute(0);
251260
metrics::counter!(Self::EVENT_PROPOSALS_TOTAL).absolute(0);
252261
metrics::counter!(Self::EVENT_PROPOSALS_SKIPPED_TOTAL).absolute(0);
253262
metrics::counter!(Self::EVENT_DERIVED_BLOCKS_TOTAL).absolute(0);

packages/taiko-client-rs/crates/driver/src/production/path.rs

Lines changed: 8 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,13 @@ use crate::{
88
derivation::DerivationPipeline,
99
error::DriverError,
1010
metrics::DriverMetrics,
11-
sync::{
12-
AtomicCanonicalTip, CanonicalTipState, engine::PayloadApplier, error::SyncError,
13-
is_stale_preconf,
14-
},
11+
sync::{engine::PayloadApplier, error::SyncError},
1512
};
1613
use alloy::{eips::BlockNumberOrTag, primitives::B256, providers::Provider};
1714
use async_trait::async_trait;
1815
use metrics::{counter, histogram};
1916
use rpc::{RpcClientError, client::Client};
20-
use tracing::{debug, error, warn};
17+
use tracing::{debug, error};
2118

2219
/// A block-production path capable of materialising the provided input into execution blocks.
2320
///
@@ -67,22 +64,15 @@ where
6764
A: PayloadApplier + BlockHashReader,
6865
{
6966
applier: A,
70-
canonical_tip_state: Arc<AtomicCanonicalTip>,
7167
}
7268

7369
impl<A> PreconfirmationPath<A>
7470
where
7571
A: PayloadApplier + BlockHashReader,
7672
{
77-
/// Construct a preconfirmation path with a canonical block tip boundary.
78-
///
79-
/// Blocks at or below this tip are considered event-synced canonical history and must never be
80-
/// rewritten by preconfirmation payloads.
81-
pub fn new_with_canonical_tip_state(
82-
applier: A,
83-
canonical_tip_state: Arc<AtomicCanonicalTip>,
84-
) -> Self {
85-
Self { applier, canonical_tip_state }
73+
/// Construct a preconfirmation path backed by a payload applier.
74+
pub fn new(applier: A) -> Self {
75+
Self { applier }
8676
}
8777
}
8878

@@ -107,29 +97,6 @@ where
10797
let block_number = preconf.block_number();
10898
let parent_number = block_number.saturating_sub(1);
10999

110-
match self.canonical_tip_state.load(std::sync::atomic::Ordering::Relaxed) {
111-
CanonicalTipState::Unknown => {
112-
warn!(
113-
block_number,
114-
"rejecting preconfirmation production: canonical tip unknown"
115-
);
116-
return Err(DriverError::PreconfIngressNotReady);
117-
}
118-
CanonicalTipState::Known(canonical_block_tip) => {
119-
if is_stale_preconf(block_number, canonical_block_tip) {
120-
counter!(DriverMetrics::PRECONF_STALE_DROPPED_TOTAL).increment(1);
121-
counter!(DriverMetrics::PRECONF_STALE_DROPPED_PRODUCTION_TOTAL)
122-
.increment(1);
123-
warn!(
124-
block_number,
125-
canonical_block_tip,
126-
"dropping stale preconfirmation at or below canonical event-sync tip"
127-
);
128-
return Ok(Vec::new());
129-
}
130-
}
131-
}
132-
133100
// Measure parent hash lookup duration.
134101
let lookup_start = Instant::now();
135102
let parent_hash_result = self.applier.block_hash_by_number(parent_number).await;
@@ -421,9 +388,7 @@ mod tests {
421388
fn preconfirmation_path_delegates_to_applier() {
422389
let parent_hash = B256::from([1u8; 32]);
423390
let applier = MockApplier::new(0, parent_hash);
424-
let canonical_tip = Arc::new(AtomicCanonicalTip::new(CanonicalTipState::Known(0)));
425-
let path =
426-
PreconfirmationPath::new_with_canonical_tip_state(applier.clone(), canonical_tip);
391+
let path = PreconfirmationPath::new(applier.clone());
427392
let payload = Arc::new(PreconfPayload::new(sample_payload(1)));
428393

429394
let rt = Runtime::new().unwrap();
@@ -436,30 +401,10 @@ mod tests {
436401
}
437402

438403
#[test]
439-
fn preconfirmation_path_drops_block_at_or_below_canonical_tip() {
440-
let parent_hash = B256::from([1u8; 32]);
441-
let applier = MockApplier::new(0, parent_hash);
442-
let canonical_tip = Arc::new(AtomicCanonicalTip::new(CanonicalTipState::Known(1)));
443-
let path =
444-
PreconfirmationPath::new_with_canonical_tip_state(applier.clone(), canonical_tip);
445-
let payload = Arc::new(PreconfPayload::new(sample_payload(1)));
446-
447-
let rt = Runtime::new().unwrap();
448-
let outcomes = rt
449-
.block_on(path.produce(ProductionInput::Preconfirmation(payload)))
450-
.expect("preconfirmation at canonical boundary should be dropped");
451-
452-
assert_eq!(applier.calls(), 0);
453-
assert!(outcomes.is_empty());
454-
}
455-
456-
#[test]
457-
fn preconfirmation_path_allows_reorg_above_canonical_tip() {
404+
fn preconfirmation_path_produces_above_parent() {
458405
let parent_hash = B256::from([1u8; 32]);
459406
let applier = MockApplier::new(1, parent_hash);
460-
let canonical_tip = Arc::new(AtomicCanonicalTip::new(CanonicalTipState::Known(1)));
461-
let path =
462-
PreconfirmationPath::new_with_canonical_tip_state(applier.clone(), canonical_tip);
407+
let path = PreconfirmationPath::new(applier.clone());
463408
let payload = Arc::new(PreconfPayload::new(sample_payload(2)));
464409

465410
let rt = Runtime::new().unwrap();
@@ -470,22 +415,4 @@ mod tests {
470415
assert_eq!(applier.calls(), 1);
471416
assert_eq!(outcomes.len(), 1);
472417
}
473-
474-
#[test]
475-
fn preconfirmation_path_rejects_when_canonical_tip_unknown() {
476-
let parent_hash = B256::from([1u8; 32]);
477-
let applier = MockApplier::new(0, parent_hash);
478-
let canonical_tip = Arc::new(AtomicCanonicalTip::new(CanonicalTipState::Unknown));
479-
let path =
480-
PreconfirmationPath::new_with_canonical_tip_state(applier.clone(), canonical_tip);
481-
let payload = Arc::new(PreconfPayload::new(sample_payload(1)));
482-
483-
let rt = Runtime::new().unwrap();
484-
let err = rt
485-
.block_on(path.produce(ProductionInput::Preconfirmation(payload)))
486-
.expect_err("unknown canonical tip should reject preconfirmation production");
487-
488-
assert!(matches!(err, DriverError::PreconfIngressNotReady));
489-
assert_eq!(applier.calls(), 0);
490-
}
491418
}

packages/taiko-client-rs/crates/driver/src/sync/canonical_tip.rs

Lines changed: 0 additions & 127 deletions
This file was deleted.

0 commit comments

Comments
 (0)