feat: flashbots_validateBuilderSubmissionV4 (#12243)

This commit is contained in:
Ryan Schneider
2024-11-01 14:35:47 -07:00
committed by GitHub
parent c72f11cc85
commit d8bbd36b2f
4 changed files with 149 additions and 8 deletions

View File

@ -46,7 +46,10 @@ pub mod servers {
rpc::RpcApiServer,
trace::TraceApiServer,
txpool::TxPoolApiServer,
validation::{BlockSubmissionValidationApiServer, BuilderBlockValidationRequestV3},
validation::{
BlockSubmissionValidationApiServer, BuilderBlockValidationRequestV3,
BuilderBlockValidationRequestV4,
},
web3::Web3ApiServer,
};
pub use reth_rpc_eth_api::{

View File

@ -3,6 +3,7 @@
use alloy_primitives::B256;
use alloy_rpc_types_beacon::relay::{
BuilderBlockValidationRequest, BuilderBlockValidationRequestV2, SignedBidSubmissionV3,
SignedBidSubmissionV4,
};
use jsonrpsee::proc_macros::rpc;
use serde::{Deserialize, Serialize};
@ -24,6 +25,22 @@ pub struct BuilderBlockValidationRequestV3 {
pub parent_beacon_block_root: B256,
}
/// A Request to validate a [`SignedBidSubmissionV4`]
///
/// <https://github.com/flashbots/builder/blob/7577ac81da21e760ec6693637ce2a81fe58ac9f8/eth/block-validation/api.go#L198-L202>
#[serde_as]
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct BuilderBlockValidationRequestV4 {
/// The request to be validated.
#[serde(flatten)]
pub request: SignedBidSubmissionV4,
/// The registered gas limit for the validation request.
#[serde_as(as = "DisplayFromStr")]
pub registered_gas_limit: u64,
/// The parent beacon block root for the validation request.
pub parent_beacon_block_root: B256,
}
/// Block validation rpc interface.
#[cfg_attr(not(feature = "client"), rpc(server, namespace = "flashbots"))]
#[cfg_attr(feature = "client", rpc(server, client, namespace = "flashbots"))]
@ -48,4 +65,11 @@ pub trait BlockSubmissionValidationApi {
&self,
request: BuilderBlockValidationRequestV3,
) -> jsonrpsee::core::RpcResult<()>;
/// A Request to validate a block submission.
#[method(name = "validateBuilderSubmissionV4")]
async fn validate_builder_submission_v4(
&self,
request: BuilderBlockValidationRequestV4,
) -> jsonrpsee::core::RpcResult<()>;
}

View File

@ -20,7 +20,10 @@ use reth_provider::{
StateProviderFactory, WithdrawalsProvider,
};
use reth_revm::database::StateProviderDatabase;
use reth_rpc_api::{BlockSubmissionValidationApiServer, BuilderBlockValidationRequestV3};
use reth_rpc_api::{
BlockSubmissionValidationApiServer, BuilderBlockValidationRequestV3,
BuilderBlockValidationRequestV4,
};
use reth_rpc_eth_types::EthApiError;
use reth_rpc_server_types::{result::internal_rpc_err, ToRpcResult};
use reth_trie::HashedPostState;
@ -415,4 +418,37 @@ where
.map_err(|e| RethError::Other(e.into()))
.to_rpc_result()
}
/// Validates a block submitted to the relay
async fn validate_builder_submission_v4(
&self,
request: BuilderBlockValidationRequestV4,
) -> RpcResult<()> {
let block = self
.payload_validator
.ensure_well_formed_payload(
ExecutionPayload::V3(request.request.execution_payload),
ExecutionPayloadSidecar::v4(
CancunPayloadFields {
parent_beacon_block_root: request.parent_beacon_block_root,
versioned_hashes: self
.validate_blobs_bundle(request.request.blobs_bundle)
.map_err(|e| RethError::Other(e.into()))
.to_rpc_result()?,
},
request.request.execution_requests.into(),
),
)
.to_rpc_result()?
.try_seal_with_senders()
.map_err(|_| EthApiError::InvalidTransactionSignature)?;
self.validate_message_against_block(
block,
request.request.message,
request.registered_gas_limit,
)
.map_err(|e| RethError::Other(e.into()))
.to_rpc_result()
}
}