Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 1 addition & 15 deletions crates/builder/op-rbuilder/src/args/op.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,7 @@ use clap::Parser;
use reth_optimism_cli::commands::Commands;
use reth_optimism_node::args::RollupArgs;

use crate::{
flashtestations::args::FlashtestationsArgs, gas_limiter::args::GasLimiterArgs,
tx_signer::Signer,
};
use crate::{gas_limiter::args::GasLimiterArgs, tx_signer::Signer};

/// Parameters for rollup configuration
#[derive(Debug, Clone, PartialEq, Eq, clap::Args)]
Expand Down Expand Up @@ -62,8 +59,6 @@ pub struct OpRbuilderArgs {
#[command(flatten)]
pub telemetry: TelemetryArgs,
#[command(flatten)]
pub flashtestations: FlashtestationsArgs,
#[command(flatten)]
pub gas_limiter: GasLimiterArgs,
}

Expand Down Expand Up @@ -139,15 +134,6 @@ pub struct FlashblocksArgs {
env = "FLASHBLOCK_NUMBER_CONTRACT_ADDRESS"
)]
pub flashblocks_number_contract_address: Option<Address>,

/// Use permit signatures if flashtestations is enabled with the flashtestation key
/// to increment the flashblocks number
#[arg(
long = "flashblocks.number-contract-use-permit",
env = "FLASHBLOCK_NUMBER_CONTRACT_USE_PERMIT",
default_value = "false"
)]
pub flashblocks_number_contract_use_permit: bool,
}

impl Default for FlashblocksArgs {
Expand Down
18 changes: 4 additions & 14 deletions crates/builder/op-rbuilder/src/builders/builder_tx.rs
Original file line number Diff line number Diff line change
Expand Up @@ -145,23 +145,18 @@ pub trait BuilderTransactions<ExtraCtx: Debug + Default = (), Extra: Debug + Def
// changes to the db so call new_simulation_state to simulate on a new copy of the state
fn simulate_builder_txs(
&self,
state_provider: impl StateProvider + Clone,
info: &mut ExecutionInfo<Extra>,
ctx: &OpPayloadBuilderCtx<ExtraCtx>,
db: &mut State<impl Database + DatabaseRef>,
top_of_block: bool,
) -> Result<Vec<BuilderTransactionCtx>, BuilderTransactionError>;

fn simulate_builder_txs_with_state_copy(
&self,
state_provider: impl StateProvider + Clone,
info: &mut ExecutionInfo<Extra>,
ctx: &OpPayloadBuilderCtx<ExtraCtx>,
db: &State<impl Database>,
top_of_block: bool,
) -> Result<Vec<BuilderTransactionCtx>, BuilderTransactionError> {
let mut simulation_state = self.new_simulation_state(state_provider.clone(), db);
self.simulate_builder_txs(state_provider, info, ctx, &mut simulation_state, top_of_block)
let mut simulation_state = self.new_simulation_state(state_provider, db);
self.simulate_builder_txs(ctx, &mut simulation_state)
}

fn add_builder_txs(
Expand All @@ -173,13 +168,8 @@ pub trait BuilderTransactions<ExtraCtx: Debug + Default = (), Extra: Debug + Def
top_of_block: bool,
) -> Result<Vec<BuilderTransactionCtx>, BuilderTransactionError> {
{
let builder_txs = self.simulate_builder_txs_with_state_copy(
state_provider,
info,
builder_ctx,
db,
top_of_block,
)?;
let builder_txs =
self.simulate_builder_txs_with_state_copy(state_provider, builder_ctx, db)?;

let mut evm =
builder_ctx.evm_config.evm_with_env(&mut *db, builder_ctx.evm_env.clone());
Expand Down
153 changes: 8 additions & 145 deletions crates/builder/op-rbuilder/src/builders/flashblocks/builder_tx.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,11 @@ use core::fmt::Debug;
use alloy_eips::Encodable2718;
use alloy_evm::{Database, Evm};
use alloy_op_evm::OpEvm;
use alloy_primitives::{Address, B256, Signature, U256};
use alloy_primitives::{Address, B256};
use alloy_rpc_types_eth::TransactionInput;
use alloy_sol_types::{SolCall, SolEvent, sol};
use op_alloy_rpc_types::OpTransactionRequest;
use reth_evm::{ConfigureEvm, precompiles::PrecompilesMap};
use reth_provider::StateProvider;
use reth_revm::State;
use revm::{DatabaseRef, inspector::NoOpInspector};
use tracing::warn;
Expand All @@ -22,8 +21,6 @@ use crate::{
flashblocks::payload::{FlashblocksExecutionInfo, FlashblocksExtraCtx},
get_nonce,
},
flashtestations::builder_tx::FlashtestationsBuilderTx,
primitives::reth::ExecutionInfo,
tx_signer::Signer,
};

Expand Down Expand Up @@ -59,30 +56,20 @@ sol!(
#[derive(Debug, Clone)]
pub(super) struct FlashblocksBuilderTx {
pub base_builder_tx: BuilderTxBase<FlashblocksExtraCtx>,
pub flashtestations_builder_tx:
Option<FlashtestationsBuilderTx<FlashblocksExtraCtx, FlashblocksExecutionInfo>>,
}

impl FlashblocksBuilderTx {
pub(super) const fn new(
signer: Option<Signer>,
flashtestations_builder_tx: Option<
FlashtestationsBuilderTx<FlashblocksExtraCtx, FlashblocksExecutionInfo>,
>,
) -> Self {
pub(super) const fn new(signer: Option<Signer>) -> Self {
let base_builder_tx = BuilderTxBase::new(signer);
Self { base_builder_tx, flashtestations_builder_tx }
Self { base_builder_tx }
}
}

impl BuilderTransactions<FlashblocksExtraCtx, FlashblocksExecutionInfo> for FlashblocksBuilderTx {
fn simulate_builder_txs(
&self,
state_provider: impl StateProvider + Clone,
info: &mut ExecutionInfo<FlashblocksExecutionInfo>,
ctx: &OpPayloadBuilderCtx<FlashblocksExtraCtx>,
db: &mut State<impl Database + DatabaseRef>,
top_of_block: bool,
) -> Result<Vec<BuilderTransactionCtx>, BuilderTransactionError> {
let mut builder_txs = Vec::<BuilderTransactionCtx>::new();

Expand All @@ -93,29 +80,7 @@ impl BuilderTransactions<FlashblocksExtraCtx, FlashblocksExecutionInfo> for Flas

if ctx.is_last_flashblock() {
let base_tx = self.base_builder_tx.simulate_builder_tx(ctx, &mut *db)?;
builder_txs.extend(base_tx.clone());

if let Some(flashtestations_builder_tx) = &self.flashtestations_builder_tx {
// Commit state that is included to get the correct nonce
if let Some(builder_tx) = base_tx {
self.commit_txs(vec![builder_tx.signed_tx], ctx, &mut *db)?;
}
// We only include flashtestations txs in the last flashblock
match flashtestations_builder_tx.simulate_builder_txs(
state_provider,
info,
ctx,
db,
top_of_block,
) {
Ok(flashtestations_builder_txs) => {
builder_txs.extend(flashtestations_builder_txs)
}
Err(e) => {
warn!(target: "flashtestations", error = ?e, "failed to add flashtestations builder tx")
}
}
}
builder_txs.extend(base_tx);
}
Ok(builder_txs)
}
Expand All @@ -126,29 +91,13 @@ impl BuilderTransactions<FlashblocksExtraCtx, FlashblocksExecutionInfo> for Flas
pub(super) struct FlashblocksNumberBuilderTx {
pub signer: Signer,
pub flashblock_number_address: Address,
pub use_permit: bool,
pub base_builder_tx: BuilderTxBase<FlashblocksExtraCtx>,
pub flashtestations_builder_tx:
Option<FlashtestationsBuilderTx<FlashblocksExtraCtx, FlashblocksExecutionInfo>>,
}

impl FlashblocksNumberBuilderTx {
pub(super) const fn new(
signer: Signer,
flashblock_number_address: Address,
use_permit: bool,
flashtestations_builder_tx: Option<
FlashtestationsBuilderTx<FlashblocksExtraCtx, FlashblocksExecutionInfo>,
>,
) -> Self {
pub(super) const fn new(signer: Signer, flashblock_number_address: Address) -> Self {
let base_builder_tx = BuilderTxBase::new(Some(signer));
Self {
signer,
flashblock_number_address,
use_permit,
base_builder_tx,
flashtestations_builder_tx,
}
Self { signer, flashblock_number_address, base_builder_tx }
}

fn signed_increment_flashblocks_tx(
Expand All @@ -160,44 +109,6 @@ impl FlashblocksNumberBuilderTx {
self.increment_flashblocks_tx(calldata, ctx, evm)
}

fn increment_flashblocks_permit_signature(
&self,
flashtestations_signer: &Signer,
current_flashblock_number: U256,
ctx: &OpPayloadBuilderCtx<FlashblocksExtraCtx>,
evm: &mut OpEvm<impl Database + DatabaseRef, NoOpInspector, PrecompilesMap>,
) -> Result<Signature, BuilderTransactionError> {
let struct_hash_calldata = IFlashblockNumber::computeStructHashCall {
currentFlashblockNumber: current_flashblock_number,
};
let SimulationSuccessResult { output, .. } =
self.simulate_flashblocks_readonly_call(struct_hash_calldata, ctx, evm)?;
let typed_data_hash_calldata =
IFlashblockNumber::hashTypedDataV4Call { structHash: output };
let SimulationSuccessResult { output, .. } =
self.simulate_flashblocks_readonly_call(typed_data_hash_calldata, ctx, evm)?;
let signature = flashtestations_signer.sign_message(output)?;
Ok(signature)
}

fn signed_increment_flashblocks_permit_tx(
&self,
flashtestations_signer: &Signer,
ctx: &OpPayloadBuilderCtx<FlashblocksExtraCtx>,
evm: &mut OpEvm<impl Database + DatabaseRef, NoOpInspector, PrecompilesMap>,
) -> Result<BuilderTransactionCtx, BuilderTransactionError> {
let current_flashblock_calldata = IFlashblockNumber::flashblockNumberCall {};
let SimulationSuccessResult { output, .. } =
self.simulate_flashblocks_readonly_call(current_flashblock_calldata, ctx, evm)?;
let signature =
self.increment_flashblocks_permit_signature(flashtestations_signer, output, ctx, evm)?;
let calldata = IFlashblockNumber::permitIncrementFlashblockNumberCall {
currentFlashblockNumber: output,
signature: signature.as_bytes().into(),
};
self.increment_flashblocks_tx(calldata, ctx, evm)
}

fn increment_flashblocks_tx<T: SolCall + Clone>(
&self,
calldata: T,
Expand All @@ -223,15 +134,6 @@ impl FlashblocksNumberBuilderTx {
Ok(BuilderTransactionCtx { signed_tx, gas_used, da_size, is_top_of_block: true })
}

fn simulate_flashblocks_readonly_call<T: SolCall>(
&self,
calldata: T,
ctx: &OpPayloadBuilderCtx<FlashblocksExtraCtx>,
evm: &mut OpEvm<impl Database + DatabaseRef, NoOpInspector, PrecompilesMap>,
) -> Result<SimulationSuccessResult<T>, BuilderTransactionError> {
self.simulate_flashblocks_call(calldata, vec![], ctx, evm)
}

fn simulate_flashblocks_call<T: SolCall>(
&self,
calldata: T,
Expand All @@ -243,7 +145,7 @@ impl FlashblocksNumberBuilderTx {
.gas_limit(ctx.block_gas_limit())
.max_fee_per_gas(ctx.base_fee().into())
.to(self.flashblock_number_address)
.from(self.signer.address) // use tee key as signer for simulations
.from(self.signer.address)
.nonce(get_nonce(evm.db(), self.signer.address)?)
.input(TransactionInput::new(calldata.abi_encode().into()));
self.simulate_call::<T, IFlashblockNumber::IFlashblockNumberErrors>(
Expand All @@ -259,11 +161,8 @@ impl BuilderTransactions<FlashblocksExtraCtx, FlashblocksExecutionInfo>
{
fn simulate_builder_txs(
&self,
state_provider: impl StateProvider + Clone,
info: &mut ExecutionInfo<FlashblocksExecutionInfo>,
ctx: &OpPayloadBuilderCtx<FlashblocksExtraCtx>,
db: &mut State<impl Database + DatabaseRef>,
top_of_block: bool,
) -> Result<Vec<BuilderTransactionCtx>, BuilderTransactionError> {
let mut builder_txs = Vec::<BuilderTransactionCtx>::new();

Expand All @@ -278,17 +177,7 @@ impl BuilderTransactions<FlashblocksExtraCtx, FlashblocksExecutionInfo>
cfg.disable_block_gas_limit = true;
});

let flashblocks_num_tx = if let Some(flashtestations) = &self.flashtestations_builder_tx
&& self.use_permit
{
self.signed_increment_flashblocks_permit_tx(
flashtestations.tee_signer(),
ctx,
&mut evm,
)
} else {
self.signed_increment_flashblocks_tx(ctx, &mut evm)
};
let flashblocks_num_tx = self.signed_increment_flashblocks_tx(ctx, &mut evm);

let tx = match flashblocks_num_tx {
Ok(tx) => Some(tx),
Expand All @@ -303,32 +192,6 @@ impl BuilderTransactions<FlashblocksExtraCtx, FlashblocksExecutionInfo>
builder_txs.extend(tx);
}

if ctx.is_last_flashblock()
&& let Some(flashtestations_builder_tx) = &self.flashtestations_builder_tx
{
// Commit state that should be included to compute the correct nonce
let flashblocks_builder_txs = builder_txs
.iter()
.filter(|tx| tx.is_top_of_block == top_of_block)
.map(|tx| tx.signed_tx.clone())
.collect();
self.commit_txs(flashblocks_builder_txs, ctx, &mut *db)?;

// We only include flashtestations txs in the last flashblock
match flashtestations_builder_tx.simulate_builder_txs(
state_provider,
info,
ctx,
db,
top_of_block,
) {
Ok(flashtestations_builder_txs) => builder_txs.extend(flashtestations_builder_txs),
Err(e) => {
warn!(target: "flashtestations", error = ?e, "failed to add flashtestations builder tx")
}
}
}

Ok(builder_txs)
}
}
8 changes: 0 additions & 8 deletions crates/builder/op-rbuilder/src/builders/flashblocks/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,6 @@ pub struct FlashblocksConfig {
///
/// If set a builder tx will be added to the start of every flashblock instead of the regular builder tx.
pub flashblocks_number_contract_address: Option<Address>,

/// whether to use permit signatures for the contract calls
pub flashblocks_number_contract_use_permit: bool,
}

impl Default for FlashblocksConfig {
Expand All @@ -54,7 +51,6 @@ impl Default for FlashblocksConfig {
fixed: false,
disable_state_root: false,
flashblocks_number_contract_address: None,
flashblocks_number_contract_use_permit: false,
}
}
}
Expand All @@ -79,17 +75,13 @@ impl TryFrom<OpRbuilderArgs> for FlashblocksConfig {
let flashblocks_number_contract_address =
args.flashblocks.flashblocks_number_contract_address;

let flashblocks_number_contract_use_permit =
args.flashblocks.flashblocks_number_contract_use_permit;

Ok(Self {
ws_addr,
interval,
leeway_time,
fixed,
disable_state_root,
flashblocks_number_contract_address,
flashblocks_number_contract_use_permit,
})
}
}
Expand Down
Loading