kona_engine/task_queue/tasks/finalize/
task.rs1use crate::{
4 EngineClient, EngineState, EngineTaskExt, FinalizeTaskError, ForkchoiceTask, Metrics,
5 state::EngineSyncStateUpdate,
6};
7use alloy_provider::Provider;
8use async_trait::async_trait;
9use kona_genesis::RollupConfig;
10use kona_protocol::L2BlockInfo;
11use std::{sync::Arc, time::Instant};
12
13#[derive(Debug, Clone)]
16pub struct FinalizeTask {
17 pub client: Arc<EngineClient>,
19 pub cfg: Arc<RollupConfig>,
21 pub block_number: u64,
23}
24
25impl FinalizeTask {
26 pub const fn new(client: Arc<EngineClient>, cfg: Arc<RollupConfig>, block_number: u64) -> Self {
28 Self { client, cfg, block_number }
29 }
30}
31
32#[async_trait]
33impl EngineTaskExt for FinalizeTask {
34 type Output = ();
35
36 type Error = FinalizeTaskError;
37
38 async fn execute(&self, state: &mut EngineState) -> Result<(), FinalizeTaskError> {
39 if state.sync_state.safe_head().block_info.number < self.block_number {
41 return Err(FinalizeTaskError::BlockNotSafe);
42 }
43
44 let block_fetch_start = Instant::now();
45 let block = self
46 .client
47 .l2_provider()
48 .get_block(self.block_number.into())
49 .full()
50 .await
51 .map_err(FinalizeTaskError::TransportError)?
52 .ok_or(FinalizeTaskError::BlockNotFound(self.block_number))?
53 .into_consensus();
54 let block_info = L2BlockInfo::from_block_and_genesis(&block, &self.client.cfg().genesis)
55 .map_err(FinalizeTaskError::FromBlock)?;
56 let block_fetch_duration = block_fetch_start.elapsed();
57
58 let fcu_start = Instant::now();
60 ForkchoiceTask::new(
61 self.client.clone(),
62 self.cfg.clone(),
63 EngineSyncStateUpdate { finalized_head: Some(block_info), ..Default::default() },
64 None,
65 )
66 .execute(state)
67 .await?;
68 let fcu_duration = fcu_start.elapsed();
69
70 kona_macros::inc!(counter, Metrics::ENGINE_TASK_COUNT, Metrics::FINALIZE_TASK_LABEL);
72
73 info!(
74 target: "engine",
75 hash = %block_info.block_info.hash,
76 number = block_info.block_info.number,
77 ?block_fetch_duration,
78 ?fcu_duration,
79 "Updated finalized head"
80 );
81
82 Ok(())
83 }
84}