Skip to content

Commit 902f09d

Browse files
committed
Add permit flashtestations tx calls from builder
1 parent fa24368 commit 902f09d

File tree

12 files changed

+871
-220
lines changed

12 files changed

+871
-220
lines changed

crates/op-rbuilder/src/builders/builder_tx.rs

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ pub enum BuilderTransactionError {
5555
/// Signature signing fails
5656
#[error("failed to sign transaction: {0}")]
5757
SigningError(secp256k1::Error),
58+
/// Invalid contract data returned
59+
#[error("invalid contract data returned {0}")]
60+
InvalidContract(Address),
5861
/// Invalid tx errors during evm execution.
5962
#[error("invalid transaction error {0}")]
6063
InvalidTransactionError(Box<dyn core::error::Error + Send + Sync>),
@@ -98,16 +101,17 @@ impl BuilderTransactionError {
98101
}
99102
}
100103

101-
pub trait BuilderTransactions<ExtraCtx: Debug + Default = ()>: Debug {
102-
fn simulate_builder_txs<Extra: Debug + Default>(
104+
pub trait BuilderTransactions<ExtraCtx: Debug + Default = (), Extra: Debug + Default = ()> {
105+
fn simulate_builder_txs(
103106
&self,
104107
state_provider: impl StateProvider + Clone,
105108
info: &mut ExecutionInfo<Extra>,
106109
ctx: &OpPayloadBuilderCtx<ExtraCtx>,
107110
db: &mut State<impl Database>,
111+
top_of_block: bool,
108112
) -> Result<Vec<BuilderTransactionCtx>, BuilderTransactionError>;
109113

110-
fn add_builder_txs<Extra: Debug + Default>(
114+
fn add_builder_txs(
111115
&self,
112116
state_provider: impl StateProvider + Clone,
113117
info: &mut ExecutionInfo<Extra>,
@@ -122,8 +126,13 @@ pub trait BuilderTransactions<ExtraCtx: Debug + Default = ()>: Debug {
122126

123127
let mut invalid: HashSet<Address> = HashSet::new();
124128

125-
let builder_txs =
126-
self.simulate_builder_txs(state_provider, info, builder_ctx, evm.db_mut())?;
129+
let builder_txs = self.simulate_builder_txs(
130+
state_provider,
131+
info,
132+
builder_ctx,
133+
evm.db_mut(),
134+
top_of_block,
135+
)?;
127136
for builder_tx in builder_txs.iter() {
128137
if builder_tx.is_top_of_block != top_of_block {
129138
// don't commit tx if the buidler tx is not being added in the intended
@@ -140,7 +149,7 @@ pub trait BuilderTransactions<ExtraCtx: Debug + Default = ()>: Debug {
140149
.map_err(|err| BuilderTransactionError::EvmExecutionError(Box::new(err)))?;
141150

142151
if !result.is_success() {
143-
warn!(target: "payload_builder", tx_hash = ?builder_tx.signed_tx.tx_hash(), "builder tx reverted");
152+
warn!(target: "payload_builder", tx_hash = ?builder_tx.signed_tx.tx_hash(), result = ?result, "builder tx reverted");
144153
invalid.insert(builder_tx.signed_tx.signer());
145154
continue;
146155
}
@@ -174,7 +183,7 @@ pub trait BuilderTransactions<ExtraCtx: Debug + Default = ()>: Debug {
174183
}
175184
}
176185

177-
fn simulate_builder_txs_state<Extra: Debug + Default>(
186+
fn simulate_builder_txs_state(
178187
&self,
179188
state_provider: impl StateProvider + Clone,
180189
builder_txs: Vec<&BuilderTransactionCtx>,
@@ -204,16 +213,20 @@ pub trait BuilderTransactions<ExtraCtx: Debug + Default = ()>: Debug {
204213
}
205214

206215
#[derive(Debug, Clone)]
207-
pub(super) struct BuilderTxBase {
216+
pub(super) struct BuilderTxBase<ExtraCtx = ()> {
208217
pub signer: Option<Signer>,
218+
_marker: std::marker::PhantomData<ExtraCtx>,
209219
}
210220

211-
impl BuilderTxBase {
221+
impl<ExtraCtx: Debug + Default> BuilderTxBase<ExtraCtx> {
212222
pub(super) fn new(signer: Option<Signer>) -> Self {
213-
Self { signer }
223+
Self {
224+
signer,
225+
_marker: std::marker::PhantomData,
226+
}
214227
}
215228

216-
pub(super) fn simulate_builder_tx<ExtraCtx: Debug + Default>(
229+
pub(super) fn simulate_builder_tx(
217230
&self,
218231
ctx: &OpPayloadBuilderCtx<ExtraCtx>,
219232
db: &mut State<impl Database>,
@@ -258,7 +271,7 @@ impl BuilderTxBase {
258271
std::cmp::max(zero_cost + nonzero_cost + 21_000, floor_gas)
259272
}
260273

261-
fn signed_builder_tx<ExtraCtx: Debug + Default>(
274+
fn signed_builder_tx(
262275
&self,
263276
ctx: &OpPayloadBuilderCtx<ExtraCtx>,
264277
db: &mut State<impl Database>,

crates/op-rbuilder/src/builders/flashblocks/builder_tx.rs

Lines changed: 54 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use crate::{
2323
BuilderTransactionCtx, BuilderTransactionError, BuilderTransactions,
2424
builder_tx::{BuilderTxBase, get_nonce, log_exists},
2525
context::OpPayloadBuilderCtx,
26-
flashblocks::payload::FlashblocksExtraCtx,
26+
flashblocks::payload::{FlashblocksExecutionInfo, FlashblocksExtraCtx},
2727
},
2828
flashtestations::builder_tx::FlashtestationsBuilderTx,
2929
primitives::reth::ExecutionInfo,
@@ -64,14 +64,17 @@ pub(super) enum FlashblockNumberError {
6464
// This will be the end of block transaction of a regular block
6565
#[derive(Debug, Clone)]
6666
pub(super) struct FlashblocksBuilderTx {
67-
pub base_builder_tx: BuilderTxBase,
68-
pub flashtestations_builder_tx: Option<FlashtestationsBuilderTx>,
67+
pub base_builder_tx: BuilderTxBase<FlashblocksExtraCtx>,
68+
pub flashtestations_builder_tx:
69+
Option<FlashtestationsBuilderTx<FlashblocksExtraCtx, FlashblocksExecutionInfo>>,
6970
}
7071

7172
impl FlashblocksBuilderTx {
7273
pub(super) fn new(
7374
signer: Option<Signer>,
74-
flashtestations_builder_tx: Option<FlashtestationsBuilderTx>,
75+
flashtestations_builder_tx: Option<
76+
FlashtestationsBuilderTx<FlashblocksExtraCtx, FlashblocksExecutionInfo>,
77+
>,
7578
) -> Self {
7679
let base_builder_tx = BuilderTxBase::new(signer);
7780
Self {
@@ -81,13 +84,14 @@ impl FlashblocksBuilderTx {
8184
}
8285
}
8386

84-
impl BuilderTransactions<FlashblocksExtraCtx> for FlashblocksBuilderTx {
85-
fn simulate_builder_txs<Extra: Debug + Default>(
87+
impl BuilderTransactions<FlashblocksExtraCtx, FlashblocksExecutionInfo> for FlashblocksBuilderTx {
88+
fn simulate_builder_txs(
8689
&self,
8790
state_provider: impl StateProvider + Clone,
88-
info: &mut ExecutionInfo<Extra>,
91+
info: &mut ExecutionInfo<FlashblocksExecutionInfo>,
8992
ctx: &OpPayloadBuilderCtx<FlashblocksExtraCtx>,
9093
db: &mut State<impl Database>,
94+
top_of_block: bool,
9195
) -> Result<Vec<BuilderTransactionCtx>, BuilderTransactionError> {
9296
let mut builder_txs = Vec::<BuilderTransactionCtx>::new();
9397

@@ -102,19 +106,30 @@ impl BuilderTransactions<FlashblocksExtraCtx> for FlashblocksBuilderTx {
102106

103107
if let Some(flashtestations_builder_tx) = &self.flashtestations_builder_tx {
104108
// We only include flashtestations txs in the last flashblock
105-
let mut simulation_state = self.simulate_builder_txs_state::<FlashblocksExtraCtx>(
109+
let mut simulation_state = self.simulate_builder_txs_state(
106110
state_provider.clone(),
107-
base_tx.iter().collect(),
111+
base_tx
112+
.iter()
113+
.filter(|tx| tx.is_top_of_block == top_of_block)
114+
.collect(),
108115
ctx,
109116
db,
110117
)?;
111-
let flashtestations_builder_txs = flashtestations_builder_tx.simulate_builder_txs(
118+
// We only include flashtestations txs in the last flashblock
119+
match flashtestations_builder_tx.simulate_builder_txs(
112120
state_provider,
113121
info,
114122
ctx,
115123
&mut simulation_state,
116-
)?;
117-
builder_txs.extend(flashtestations_builder_txs);
124+
top_of_block,
125+
) {
126+
Ok(flashtestations_builder_txs) => {
127+
builder_txs.extend(flashtestations_builder_txs)
128+
}
129+
Err(e) => {
130+
warn!(target: "flashtestations", error = ?e, "failed to add flashtestations builder tx")
131+
}
132+
}
118133
}
119134
}
120135
Ok(builder_txs)
@@ -126,15 +141,18 @@ impl BuilderTransactions<FlashblocksExtraCtx> for FlashblocksBuilderTx {
126141
pub(super) struct FlashblocksNumberBuilderTx {
127142
pub signer: Option<Signer>,
128143
pub flashblock_number_address: Address,
129-
pub base_builder_tx: BuilderTxBase,
130-
pub flashtestations_builder_tx: Option<FlashtestationsBuilderTx>,
144+
pub base_builder_tx: BuilderTxBase<FlashblocksExtraCtx>,
145+
pub flashtestations_builder_tx:
146+
Option<FlashtestationsBuilderTx<FlashblocksExtraCtx, FlashblocksExecutionInfo>>,
131147
}
132148

133149
impl FlashblocksNumberBuilderTx {
134150
pub(super) fn new(
135151
signer: Option<Signer>,
136152
flashblock_number_address: Address,
137-
flashtestations_builder_tx: Option<FlashtestationsBuilderTx>,
153+
flashtestations_builder_tx: Option<
154+
FlashtestationsBuilderTx<FlashblocksExtraCtx, FlashblocksExecutionInfo>,
155+
>,
138156
) -> Self {
139157
let base_builder_tx = BuilderTxBase::new(signer);
140158
Self {
@@ -213,13 +231,16 @@ impl FlashblocksNumberBuilderTx {
213231
}
214232
}
215233

216-
impl BuilderTransactions<FlashblocksExtraCtx> for FlashblocksNumberBuilderTx {
217-
fn simulate_builder_txs<Extra: Debug + Default>(
234+
impl BuilderTransactions<FlashblocksExtraCtx, FlashblocksExecutionInfo>
235+
for FlashblocksNumberBuilderTx
236+
{
237+
fn simulate_builder_txs(
218238
&self,
219239
state_provider: impl StateProvider + Clone,
220-
info: &mut ExecutionInfo<Extra>,
240+
info: &mut ExecutionInfo<FlashblocksExecutionInfo>,
221241
ctx: &OpPayloadBuilderCtx<FlashblocksExtraCtx>,
222242
db: &mut State<impl Database>,
243+
top_of_block: bool,
223244
) -> Result<Vec<BuilderTransactionCtx>, BuilderTransactionError> {
224245
let mut builder_txs = Vec::<BuilderTransactionCtx>::new();
225246
let state = StateProviderDatabase::new(state_provider.clone());
@@ -280,20 +301,30 @@ impl BuilderTransactions<FlashblocksExtraCtx> for FlashblocksNumberBuilderTx {
280301
if ctx.is_last_flashblock() {
281302
if let Some(flashtestations_builder_tx) = &self.flashtestations_builder_tx {
282303
let flashblocks_builder_txs = builder_txs.clone();
283-
let mut simulation_state = self.simulate_builder_txs_state::<FlashblocksExtraCtx>(
304+
let mut simulation_state = self.simulate_builder_txs_state(
284305
state_provider.clone(),
285-
flashblocks_builder_txs.iter().collect(),
306+
flashblocks_builder_txs
307+
.iter()
308+
.filter(|tx| tx.is_top_of_block == top_of_block)
309+
.collect(),
286310
ctx,
287311
db,
288312
)?;
289313
// We only include flashtestations txs in the last flashblock
290-
let flashtestations_builder_txs = flashtestations_builder_tx.simulate_builder_txs(
314+
match flashtestations_builder_tx.simulate_builder_txs(
291315
state_provider,
292316
info,
293317
ctx,
294318
&mut simulation_state,
295-
)?;
296-
builder_txs.extend(flashtestations_builder_txs);
319+
top_of_block,
320+
) {
321+
Ok(flashtestations_builder_txs) => {
322+
builder_txs.extend(flashtestations_builder_txs)
323+
}
324+
Err(e) => {
325+
warn!(target: "flashtestations", error = ?e, "failed to add flashtestations builder tx")
326+
}
327+
}
297328
}
298329
}
299330

crates/op-rbuilder/src/builders/flashblocks/payload.rs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -67,13 +67,13 @@ type NextBestFlashblocksTxs<Pool> = BestFlashblocksTxs<
6767
>,
6868
>;
6969

70-
#[derive(Debug, Default)]
71-
struct ExtraExecutionInfo {
70+
#[derive(Debug, Default, Clone)]
71+
pub(super) struct FlashblocksExecutionInfo {
7272
/// Index of the last consumed flashblock
7373
pub last_flashblock_index: usize,
7474
}
7575

76-
#[derive(Debug, Default)]
76+
#[derive(Debug, Default, Clone)]
7777
pub struct FlashblocksExtraCtx {
7878
/// Current flashblock index
7979
flashblock_index: u64,
@@ -211,7 +211,7 @@ impl<Pool, Client, BuilderTx> OpPayloadBuilder<Pool, Client, BuilderTx>
211211
where
212212
Pool: PoolBounds,
213213
Client: ClientBounds,
214-
BuilderTx: BuilderTransactions<FlashblocksExtraCtx> + Send + Sync,
214+
BuilderTx: BuilderTransactions<FlashblocksExtraCtx, FlashblocksExecutionInfo> + Send + Sync,
215215
{
216216
/// Constructs an Optimism payload from the transactions sent via the
217217
/// Payload attributes by the sequencer. If the `no_tx_pool` argument is passed in
@@ -542,7 +542,7 @@ where
542542
>(
543543
&self,
544544
ctx: &mut OpPayloadBuilderCtx<FlashblocksExtraCtx>,
545-
info: &mut ExecutionInfo<ExtraExecutionInfo>,
545+
info: &mut ExecutionInfo<FlashblocksExecutionInfo>,
546546
state: &mut State<DB>,
547547
state_provider: impl reth::providers::StateProvider + Clone,
548548
best_txs: &mut NextBestFlashblocksTxs<Pool>,
@@ -756,7 +756,7 @@ where
756756
fn record_flashblocks_metrics(
757757
&self,
758758
ctx: &OpPayloadBuilderCtx<FlashblocksExtraCtx>,
759-
info: &ExecutionInfo<ExtraExecutionInfo>,
759+
info: &ExecutionInfo<FlashblocksExecutionInfo>,
760760
flashblocks_per_block: u64,
761761
span: &tracing::Span,
762762
message: &str,
@@ -872,7 +872,8 @@ impl<Pool, Client, BuilderTx> PayloadBuilder for OpPayloadBuilder<Pool, Client,
872872
where
873873
Pool: PoolBounds,
874874
Client: ClientBounds,
875-
BuilderTx: BuilderTransactions<FlashblocksExtraCtx> + Clone + Send + Sync,
875+
BuilderTx:
876+
BuilderTransactions<FlashblocksExtraCtx, FlashblocksExecutionInfo> + Clone + Send + Sync,
876877
{
877878
type Attributes = OpPayloadBuilderAttributes<OpTransactionSigned>;
878879
type BuiltPayload = OpBuiltPayload;
@@ -896,7 +897,7 @@ struct FlashblocksMetadata {
896897
fn execute_pre_steps<DB, ExtraCtx>(
897898
state: &mut State<DB>,
898899
ctx: &OpPayloadBuilderCtx<ExtraCtx>,
899-
) -> Result<ExecutionInfo<ExtraExecutionInfo>, PayloadBuilderError>
900+
) -> Result<ExecutionInfo<FlashblocksExecutionInfo>, PayloadBuilderError>
900901
where
901902
DB: Database<Error = ProviderError> + std::fmt::Debug,
902903
ExtraCtx: std::fmt::Debug + Default,
@@ -916,7 +917,7 @@ where
916917
fn build_block<DB, P, ExtraCtx>(
917918
state: &mut State<DB>,
918919
ctx: &OpPayloadBuilderCtx<ExtraCtx>,
919-
info: &mut ExecutionInfo<ExtraExecutionInfo>,
920+
info: &mut ExecutionInfo<FlashblocksExecutionInfo>,
920921
calculate_state_root: bool,
921922
) -> Result<(OpBuiltPayload, FlashblocksPayloadV1), PayloadBuilderError>
922923
where

crates/op-rbuilder/src/builders/flashblocks/service.rs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::{
55
builder_tx::BuilderTransactions,
66
flashblocks::{
77
builder_tx::{FlashblocksBuilderTx, FlashblocksNumberBuilderTx},
8-
payload::FlashblocksExtraCtx,
8+
payload::{FlashblocksExecutionInfo, FlashblocksExtraCtx},
99
},
1010
generator::BlockPayloadJobGenerator,
1111
},
@@ -32,7 +32,12 @@ impl FlashblocksServiceBuilder {
3232
where
3333
Node: NodeBounds,
3434
Pool: PoolBounds,
35-
BuilderTx: BuilderTransactions<FlashblocksExtraCtx> + Unpin + Clone + Send + Sync + 'static,
35+
BuilderTx: BuilderTransactions<FlashblocksExtraCtx, FlashblocksExecutionInfo>
36+
+ Unpin
37+
+ Clone
38+
+ Send
39+
+ Sync
40+
+ 'static,
3641
{
3742
let once_lock = Arc::new(std::sync::OnceLock::new());
3843

@@ -84,8 +89,12 @@ where
8489
_: OpEvmConfig,
8590
) -> eyre::Result<PayloadBuilderHandle<<Node::Types as NodeTypes>::Payload>> {
8691
let signer = self.0.builder_signer;
87-
let flashtestations_builder_tx = if self.0.flashtestations_config.flashtestations_enabled {
88-
match bootstrap_flashtestations(self.0.flashtestations_config.clone(), ctx).await {
92+
let flashtestations_builder_tx = if let Some(builder_key) = signer
93+
&& self.0.flashtestations_config.flashtestations_enabled
94+
{
95+
match bootstrap_flashtestations(self.0.flashtestations_config.clone(), builder_key, ctx)
96+
.await
97+
{
8998
Ok(builder_tx) => Some(builder_tx),
9099
Err(e) => {
91100
tracing::warn!(error = %e, "Failed to bootstrap flashtestations, builder will not include flashtestations txs");

0 commit comments

Comments
 (0)