Skip to content

Commit ade1963

Browse files
authored
refactor: move block/header builder for ephemeral bridge (#1828)
1 parent c773305 commit ade1963

File tree

12 files changed

+86
-183
lines changed

12 files changed

+86
-183
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ quickcheck = "1.0.3"
6969
r2d2 = "0.8.9"
7070
r2d2_sqlite = "0.24.0"
7171
rand = "0.8.5"
72+
rayon = "1.10.0"
7273
reqwest = { version = "0.12.7", features = ["native-tls-vendored", "json"] }
7374
reth-ipc = { tag = "v1.0.8", git = "https://github.com/paradigmxyz/reth.git"}
7475
revm = { version = "22.0", default-features = false, features = ["std", "secp256k1", "serde-json", "c-kzg"] }

bin/e2hs-writer/src/subcommands/head_generator/e2hs_builder.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,20 @@ use std::path::PathBuf;
22

33
use anyhow::ensure;
44
use e2store::e2hs::{E2HSWriter, BLOCKS_PER_E2HS};
5-
use ethportal_api::consensus::{
6-
beacon_block::BeaconBlockElectra, beacon_state::HistoricalBatch,
7-
historical_summaries::historical_summary_index,
5+
use ethportal_api::{
6+
consensus::{
7+
beacon_block::BeaconBlockElectra, beacon_state::HistoricalBatch,
8+
historical_summaries::historical_summary_index,
9+
},
10+
types::execution::builders::block::ExecutionBlockBuilder,
811
};
912
use ssz_types::FixedVector;
1013
use tempfile::TempDir;
1114
use tracing::info;
1215
use trin_validation::header_validator::HeaderValidator;
1316

1417
use super::ethereum_api::EthereumApi;
15-
use crate::{
16-
cli::HeadGeneratorConfig,
17-
subcommands::{execution_block_builder::ExecutionBlockBuilder, full_block::FullBlock},
18-
};
18+
use crate::{cli::HeadGeneratorConfig, subcommands::full_block::FullBlock};
1919

2020
struct ProvingAnchors {
2121
current_historical_batch: HistoricalBatch,
Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
pub mod execution_block_builder;
2-
pub mod execution_header_builder;
31
pub mod full_block;
42
pub mod head_generator;
53
pub mod single_generator;

bin/e2hs-writer/src/subcommands/single_generator/e2hs_builder.rs

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ use anyhow::{anyhow, bail, ensure};
1111
use async_stream::stream;
1212
use e2store::e2hs::{E2HSWriter, BLOCKS_PER_E2HS};
1313
use ethportal_api::{
14-
consensus::beacon_block::SignedBeaconBlock,
1514
types::{
1615
execution::{
1716
accumulator::EpochAccumulator,
17+
builders::block::ExecutionBlockBuilder,
1818
header_with_proof::{
1919
BlockHeaderProof, BlockProofHistoricalHashesAccumulator, HeaderWithProof,
2020
},
@@ -32,7 +32,7 @@ use trin_validation::{accumulator::PreMergeAccumulator, header_validator::Header
3232
use url::Url;
3333

3434
use super::provider::EraProvider;
35-
use crate::subcommands::{execution_block_builder::ExecutionBlockBuilder, full_block::FullBlock};
35+
use crate::subcommands::full_block::FullBlock;
3636

3737
// This struct reads all blocks in an index and creates the block data
3838
// along with the corresponding proofs required to create an E2HS file.
@@ -148,20 +148,7 @@ impl E2HSBuilder {
148148
block.execution_block_number()
149149
);
150150

151-
let (header_with_proof, body) = match &block {
152-
SignedBeaconBlock::Bellatrix(beacon_block) => {
153-
ExecutionBlockBuilder::bellatrix(&beacon_block.message, historical_batch)?
154-
}
155-
SignedBeaconBlock::Capella(beacon_block) => {
156-
ExecutionBlockBuilder::capella(&beacon_block.message, historical_batch)?
157-
}
158-
SignedBeaconBlock::Deneb(beacon_block) => {
159-
ExecutionBlockBuilder::deneb(&beacon_block.message, historical_batch)?
160-
}
161-
SignedBeaconBlock::Electra(beacon_block) => {
162-
ExecutionBlockBuilder::electra(&beacon_block.message, historical_batch)?
163-
}
164-
};
151+
let (header_with_proof, body) = ExecutionBlockBuilder::build(block, historical_batch)?;
165152

166153
let receipts = self.get_receipts(block_number, header_with_proof.header.receipts_root)?;
167154

bin/trin-execution/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ lazy_static.workspace = true
2828
parking_lot.workspace = true
2929
prometheus_exporter.workspace = true
3030
rand.workspace = true
31-
rayon = "1.10.0"
31+
rayon.workspace = true
3232
reqwest = { workspace = true, features = ["stream"] }
3333
revm.workspace = true
3434
revm-inspectors = "0.20.0"

bin/trin-execution/src/era/beacon.rs

Lines changed: 25 additions & 138 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,15 @@
1-
use alloy::{
2-
consensus::{
3-
proofs::{calculate_transaction_root, calculate_withdrawals_root},
4-
Header, TxEnvelope,
5-
},
6-
eips::eip4895::Withdrawal,
7-
primitives::{Bloom, B64},
8-
rlp::Decodable,
9-
};
10-
use ethportal_api::consensus::{
11-
beacon_block::{
1+
use alloy::{consensus::TxEnvelope, eips::eip4895::Withdrawal};
2+
use ethportal_api::{
3+
consensus::beacon_block::{
124
SignedBeaconBlock, SignedBeaconBlockBellatrix, SignedBeaconBlockCapella,
135
SignedBeaconBlockDeneb, SignedBeaconBlockElectra,
146
},
15-
body::Transactions,
7+
types::execution::builders::{block::decode_transactions, header::ExecutionHeaderBuilder},
168
};
179
use rayon::iter::{IntoParallelIterator, ParallelIterator};
18-
use revm_primitives::{b256, B256, U256};
1910

2011
use super::types::{ProcessedBlock, TransactionsWithSender};
2112

22-
pub const EMPTY_UNCLE_ROOT_HASH: B256 =
23-
b256!("1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347");
24-
2513
pub trait ProcessBeaconBlock {
2614
fn process_beacon_block(&self) -> anyhow::Result<ProcessedBlock>;
2715
}
@@ -42,35 +30,11 @@ impl ProcessBeaconBlock for SignedBeaconBlockBellatrix {
4230
let payload = &self.message.body.execution_payload;
4331

4432
let transactions = decode_transactions(&payload.transactions)?;
45-
let transactions_root = calculate_transaction_root(&transactions);
33+
let header = ExecutionHeaderBuilder::bellatrix(payload, &transactions)?;
4634
let transactions = process_transactions(transactions)?;
4735

48-
let header = Header {
49-
parent_hash: payload.parent_hash,
50-
ommers_hash: EMPTY_UNCLE_ROOT_HASH,
51-
beneficiary: payload.fee_recipient,
52-
state_root: payload.state_root,
53-
transactions_root,
54-
receipts_root: payload.receipts_root,
55-
logs_bloom: Bloom::from_slice(payload.logs_bloom.to_vec().as_slice()),
56-
difficulty: U256::ZERO,
57-
number: payload.block_number,
58-
gas_limit: payload.gas_limit,
59-
gas_used: payload.gas_used,
60-
timestamp: payload.timestamp,
61-
extra_data: payload.extra_data.to_vec().into(),
62-
mix_hash: payload.prev_randao,
63-
nonce: B64::ZERO,
64-
base_fee_per_gas: Some(payload.base_fee_per_gas.to()),
65-
withdrawals_root: None,
66-
blob_gas_used: None,
67-
excess_blob_gas: None,
68-
parent_beacon_block_root: None,
69-
requests_hash: None,
70-
};
71-
7236
Ok(ProcessedBlock {
73-
header: header.clone(),
37+
header,
7438
uncles: None,
7539
withdrawals: None,
7640
transactions,
@@ -83,39 +47,13 @@ impl ProcessBeaconBlock for SignedBeaconBlockCapella {
8347
let payload = &self.message.body.execution_payload;
8448

8549
let transactions = decode_transactions(&payload.transactions)?;
86-
let transactions_root = calculate_transaction_root(&transactions);
87-
let transactions = process_transactions(transactions)?;
88-
8950
let withdrawals: Vec<Withdrawal> =
9051
payload.withdrawals.iter().map(Withdrawal::from).collect();
91-
let withdrawals_root = calculate_withdrawals_root(&withdrawals);
92-
93-
let header = Header {
94-
parent_hash: payload.parent_hash,
95-
ommers_hash: EMPTY_UNCLE_ROOT_HASH,
96-
beneficiary: payload.fee_recipient,
97-
state_root: payload.state_root,
98-
transactions_root,
99-
receipts_root: payload.receipts_root,
100-
logs_bloom: Bloom::from_slice(payload.logs_bloom.to_vec().as_slice()),
101-
difficulty: U256::ZERO,
102-
number: payload.block_number,
103-
gas_limit: payload.gas_limit,
104-
gas_used: payload.gas_used,
105-
timestamp: payload.timestamp,
106-
extra_data: payload.extra_data.to_vec().into(),
107-
mix_hash: payload.prev_randao,
108-
nonce: B64::ZERO,
109-
base_fee_per_gas: Some(payload.base_fee_per_gas.to()),
110-
withdrawals_root: Some(withdrawals_root),
111-
blob_gas_used: None,
112-
excess_blob_gas: None,
113-
parent_beacon_block_root: None,
114-
requests_hash: None,
115-
};
52+
let header = ExecutionHeaderBuilder::capella(payload, &transactions, &withdrawals)?;
53+
let transactions = process_transactions(transactions)?;
11654

11755
Ok(ProcessedBlock {
118-
header: header.clone(),
56+
header,
11957
uncles: None,
12058
withdrawals: Some(withdrawals),
12159
transactions,
@@ -128,39 +66,18 @@ impl ProcessBeaconBlock for SignedBeaconBlockDeneb {
12866
let payload = &self.message.body.execution_payload;
12967

13068
let transactions = decode_transactions(&payload.transactions)?;
131-
let transactions_root = calculate_transaction_root(&transactions);
132-
let transactions = process_transactions(transactions)?;
133-
13469
let withdrawals: Vec<Withdrawal> =
13570
payload.withdrawals.iter().map(Withdrawal::from).collect();
136-
let withdrawals_root = calculate_withdrawals_root(&withdrawals);
137-
138-
let header = Header {
139-
parent_hash: payload.parent_hash,
140-
ommers_hash: EMPTY_UNCLE_ROOT_HASH,
141-
beneficiary: payload.fee_recipient,
142-
state_root: payload.state_root,
143-
transactions_root,
144-
receipts_root: payload.receipts_root,
145-
logs_bloom: Bloom::from_slice(payload.logs_bloom.to_vec().as_slice()),
146-
difficulty: U256::ZERO,
147-
number: payload.block_number,
148-
gas_limit: payload.gas_limit,
149-
gas_used: payload.gas_used,
150-
timestamp: payload.timestamp,
151-
extra_data: payload.extra_data.to_vec().into(),
152-
mix_hash: payload.prev_randao,
153-
nonce: B64::ZERO,
154-
base_fee_per_gas: Some(payload.base_fee_per_gas.to()),
155-
withdrawals_root: Some(withdrawals_root),
156-
blob_gas_used: Some(payload.blob_gas_used),
157-
excess_blob_gas: Some(payload.excess_blob_gas),
158-
parent_beacon_block_root: Some(self.message.parent_root),
159-
requests_hash: None,
160-
};
71+
let header = ExecutionHeaderBuilder::deneb(
72+
payload,
73+
self.message.parent_root,
74+
&transactions,
75+
&withdrawals,
76+
)?;
77+
let transactions = process_transactions(transactions)?;
16178

16279
Ok(ProcessedBlock {
163-
header: header.clone(),
80+
header,
16481
uncles: None,
16582
withdrawals: Some(withdrawals),
16683
transactions,
@@ -173,36 +90,16 @@ impl ProcessBeaconBlock for SignedBeaconBlockElectra {
17390
let payload = &self.message.body.execution_payload;
17491

17592
let transactions = decode_transactions(&payload.transactions)?;
176-
let transactions_root = calculate_transaction_root(&transactions);
177-
let transactions = process_transactions(transactions)?;
178-
17993
let withdrawals: Vec<Withdrawal> =
18094
payload.withdrawals.iter().map(Withdrawal::from).collect();
181-
let withdrawals_root = calculate_withdrawals_root(&withdrawals);
182-
183-
let header = Header {
184-
parent_hash: payload.parent_hash,
185-
ommers_hash: EMPTY_UNCLE_ROOT_HASH,
186-
beneficiary: payload.fee_recipient,
187-
state_root: payload.state_root,
188-
transactions_root,
189-
receipts_root: payload.receipts_root,
190-
logs_bloom: Bloom::from_slice(payload.logs_bloom.to_vec().as_slice()),
191-
difficulty: U256::ZERO,
192-
number: payload.block_number,
193-
gas_limit: payload.gas_limit,
194-
gas_used: payload.gas_used,
195-
timestamp: payload.timestamp,
196-
extra_data: payload.extra_data.to_vec().into(),
197-
mix_hash: payload.prev_randao,
198-
nonce: B64::ZERO,
199-
base_fee_per_gas: Some(payload.base_fee_per_gas.to()),
200-
withdrawals_root: Some(withdrawals_root),
201-
blob_gas_used: Some(payload.blob_gas_used),
202-
excess_blob_gas: Some(payload.excess_blob_gas),
203-
parent_beacon_block_root: Some(self.message.parent_root),
204-
requests_hash: Some(self.message.body.execution_requests.requests_hash()),
205-
};
95+
let header = ExecutionHeaderBuilder::electra(
96+
payload,
97+
self.message.parent_root,
98+
&transactions,
99+
&withdrawals,
100+
&self.message.body.execution_requests,
101+
)?;
102+
let transactions = process_transactions(transactions)?;
206103

207104
Ok(ProcessedBlock {
208105
header: header.clone(),
@@ -213,16 +110,6 @@ impl ProcessBeaconBlock for SignedBeaconBlockElectra {
213110
}
214111
}
215112

216-
pub fn decode_transactions(transactions: &Transactions) -> anyhow::Result<Vec<TxEnvelope>> {
217-
transactions
218-
.into_par_iter()
219-
.map(|raw_tx| {
220-
TxEnvelope::decode(&mut &**raw_tx)
221-
.map_err(|err| anyhow::anyhow!("Failed decoding transaction rlp: {err:?}"))
222-
})
223-
.collect::<anyhow::Result<Vec<_>>>()
224-
}
225-
226113
fn process_transactions(
227114
transactions: Vec<TxEnvelope>,
228115
) -> anyhow::Result<Vec<TransactionsWithSender>> {

crates/ethportal-api/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ once_cell = "1.17"
3737
parking_lot.workspace = true
3838
quickcheck.workspace = true
3939
rand.workspace = true
40+
rayon.workspace = true
4041
rs_merkle = "1.4.2"
4142
secp256k1 = { version = "0.29.0", features = ["global-context", "recovery", "rand"] }
4243
serde = { workspace = true, features = ["rc"] }

0 commit comments

Comments
 (0)