reth_rpc_engine_api/
reth_engine_api.rs1use crate::EngineApiError;
2use alloy_rlp::Decodable;
3use alloy_rpc_types_engine::{ForkchoiceState, ForkchoiceUpdated};
4use jsonrpsee_core::RpcResult;
5use reth_engine_primitives::ConsensusEngineHandle;
6use reth_payload_primitives::PayloadTypes;
7use reth_primitives_traits::SealedBlock;
8use reth_rpc_api::{RethEngineApiServer, RethNewPayloadInput, RethPayloadStatus};
9use tracing::trace;
10
11#[derive(Debug)]
17pub struct RethEngineApi<Payload: PayloadTypes> {
18 beacon_engine_handle: ConsensusEngineHandle<Payload>,
19}
20
21impl<Payload: PayloadTypes> RethEngineApi<Payload> {
22 pub const fn new(beacon_engine_handle: ConsensusEngineHandle<Payload>) -> Self {
24 Self { beacon_engine_handle }
25 }
26}
27
28impl<Payload: PayloadTypes> RethEngineApiServer<Payload::ExecutionData> for RethEngineApi<Payload> {
29 async fn reth_new_payload(
30 &self,
31 input: RethNewPayloadInput<Payload::ExecutionData>,
32 wait_for_persistence: Option<bool>,
33 wait_for_caches: Option<bool>,
34 ) -> RpcResult<RethPayloadStatus> {
35 let wait_for_persistence = wait_for_persistence.unwrap_or(true);
36 let wait_for_caches = wait_for_caches.unwrap_or(true);
37 trace!(target: "rpc::engine", wait_for_persistence, wait_for_caches, "Serving reth_newPayload");
38
39 let payload = match input {
40 RethNewPayloadInput::ExecutionData(data) => data,
41 RethNewPayloadInput::BlockRlp { block: block_rlp, bal } => {
42 let block = Decodable::decode(&mut block_rlp.as_ref())
43 .map_err(|err| EngineApiError::Internal(Box::new(err)))?;
44 Payload::block_to_payload(SealedBlock::new_unhashed(block), bal)
45 }
46 };
47
48 let (status, timings) = self
49 .beacon_engine_handle
50 .reth_new_payload(payload, wait_for_persistence, wait_for_caches)
51 .await
52 .map_err(EngineApiError::from)?;
53 Ok(RethPayloadStatus {
54 status,
55 latency_us: timings.latency.as_micros() as u64,
56 persistence_wait_us: timings.persistence_wait.as_micros() as u64,
57 execution_cache_wait_us: timings.execution_cache_wait.map(|d| d.as_micros() as u64),
58 sparse_trie_wait_us: timings.sparse_trie_wait.map(|d| d.as_micros() as u64),
59 })
60 }
61
62 async fn reth_forkchoice_updated(
63 &self,
64 forkchoice_state: ForkchoiceState,
65 ) -> RpcResult<ForkchoiceUpdated> {
66 trace!(target: "rpc::engine", "Serving reth_forkchoiceUpdated");
67 self.beacon_engine_handle
68 .fork_choice_updated(forkchoice_state, None)
69 .await
70 .map_err(|e| EngineApiError::from(e).into())
71 }
72}