Skip to content

Commit d88ec2b

Browse files
committed
chore: new hash_block method added on network trait + ethreum and opstack crate updated
1 parent e8caeb6 commit d88ec2b

File tree

8 files changed

+77
-60
lines changed

8 files changed

+77
-60
lines changed

cli/src/main.rs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,18 +61,14 @@ fn enable_tracer() {
6161
tracing::subscriber::set_global_default(subscriber).expect("subscriber set failed");
6262
}
6363

64-
async fn start_client<N: NetworkSpec, C: Consensus<N::TransactionResponse>>(
65-
client: &mut Client<N, C>,
66-
) {
64+
async fn start_client<N: NetworkSpec, C: Consensus<N::BlockResponse>>(client: &mut Client<N, C>) {
6765
if let Err(err) = client.start().await {
6866
error!(target: "helios::runner", error = %err);
6967
exit(1);
7068
}
7169
}
7270

73-
fn register_shutdown_handler<N: NetworkSpec, C: Consensus<N::TransactionResponse>>(
74-
client: Client<N, C>,
75-
) {
71+
fn register_shutdown_handler<N: NetworkSpec, C: Consensus<N::BlockResponse>>(client: Client<N, C>) {
7672
let client = Arc::new(client);
7773
let shutdown_counter = Arc::new(Mutex::new(0));
7874

core/src/execution/state.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ impl<N: NetworkSpec, R: ExecutionRpc<N>> Inner<N, R> {
327327
if self.blocks.get(&prev).is_none() {
328328
let backfilled = self.rpc.get_block(block.header().parent_hash()).await?;
329329

330-
if backfilled.is_hash_valid()
330+
if N::hash_block(&backfilled) == backfilled.header().hash()
331331
&& block.header().parent_hash() == backfilled.header().hash()
332332
{
333333
info!("backfilled: block={}", backfilled.header().number());

core/src/network_spec.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
use alloy::{network::Network, rpc::types::Log};
1+
use alloy::{network::Network, primitives::B256, rpc::types::Log};
22
use revm::primitives::{BlockEnv, TxEnv};
33

44
pub trait NetworkSpec: Network {
55
fn encode_receipt(receipt: &Self::ReceiptResponse) -> Vec<u8>;
6+
fn hash_block(block: &Self::BlockResponse) -> B256;
67
fn receipt_contains(list: &[Self::ReceiptResponse], elem: &Self::ReceiptResponse) -> bool;
78
fn receipt_logs(receipt: &Self::ReceiptResponse) -> Vec<Log>;
89
fn tx_env(request: &Self::TransactionRequest) -> TxEnv;

ethereum/src/consensus.rs

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ use std::marker::PhantomData;
22
use std::process;
33
use std::sync::Arc;
44

5-
use alloy::consensus::{Header as ConsensusHeader, Sealed, Transaction as TxTrait, TxEnvelope};
6-
use alloy::primitives::{b256, fixed_bytes, B256, U256, U64};
5+
use alloy::consensus::{Header as ConsensusHeader, Transaction as TxTrait, TxEnvelope};
6+
use alloy::primitives::{b256, fixed_bytes, Bloom, BloomInput, B256, U256};
77
use alloy::rlp::{encode, Decodable};
88
use alloy::rpc::types::{Block, BlockTransactions, Header, Transaction};
99
use chrono::Duration;
@@ -59,7 +59,7 @@ pub struct Inner<S: ConsensusSpec, R: ConsensusRpc<S>> {
5959
phantom: PhantomData<S>,
6060
}
6161

62-
impl<S: ConsensusSpec, R: ConsensusRpc<S>, DB: Database> Consensus<Transaction>
62+
impl<S: ConsensusSpec, R: ConsensusRpc<S>, DB: Database> Consensus<Block>
6363
for ConsensusClient<S, R, DB>
6464
{
6565
fn block_recv(&mut self) -> Option<Receiver<Block<Transaction>>> {
@@ -607,36 +607,40 @@ fn payload_to_block<S: ConsensusSpec>(value: ExecutionPayload<S>) -> Block<Trans
607607

608608
let withdrawals = value.withdrawals().unwrap().iter().map(encode);
609609
let withdrawals_root = ordered_trie_root(withdrawals);
610+
let logs_bloom: Bloom =
611+
Bloom::from(BloomInput::Raw(&value.logs_bloom().clone().inner.to_vec()));
610612

611613
let consensus_header = ConsensusHeader {
612-
parent_hash: *value.block_hash(),
614+
parent_hash: *value.parent_hash(),
613615
ommers_hash: empty_uncle_hash,
614616
beneficiary: *value.fee_recipient(),
615617
state_root: *value.state_root(),
616618
transactions_root: B256::from_slice(txs_root.as_bytes()),
617619
receipts_root: *value.receipts_root(),
618620
withdrawals_root: Some(B256::from_slice(withdrawals_root.as_bytes())),
619-
logs_bloom: value.logs_bloom().inner.to_vec().into(),
621+
logs_bloom: logs_bloom,
620622
difficulty: U256::ZERO,
621623
number: *value.block_number(),
622624
gas_limit: *value.gas_limit(),
623625
gas_used: *value.gas_used(),
624626
timestamp: *value.timestamp(),
625627
mix_hash: *value.prev_randao(),
626628
nonce: empty_nonce,
627-
base_fee_per_gas: Some(*value.base_fee_per_gas().into()),
629+
base_fee_per_gas: Some(value.base_fee_per_gas().to::<u64>()),
628630
blob_gas_used: value.blob_gas_used().cloned().ok(),
629631
excess_blob_gas: value.excess_blob_gas().cloned().ok(),
630-
parent_beacon_block_root: Some(*value.parent_hash()),
632+
parent_beacon_block_root: None,
631633
extra_data: value.extra_data().inner.to_vec().into(),
632634
requests_hash: None,
633635
};
634636

635-
let header = Header::from_consensus(
636-
Sealed::new(consensus_header),
637-
Some(U256::ZERO),
638-
Some(U256::ZERO),
639-
);
637+
let header = Header {
638+
hash: *value.block_hash(),
639+
inner: consensus_header,
640+
total_difficulty: Some(U256::ZERO),
641+
size: Some(U256::ZERO),
642+
};
643+
640644
Block::new(header, BlockTransactions::Full(txs))
641645
}
642646

ethereum/src/spec.rs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use alloy::{
2-
consensus::{Receipt, ReceiptWithBloom, TxReceipt, TxType, TypedTransaction},
2+
consensus::{BlockHeader, Receipt, ReceiptWithBloom, TxReceipt, TxType, TypedTransaction},
33
network::{BuildResult, Network, NetworkWallet, TransactionBuilder, TransactionBuilderError},
44
primitives::{Address, Bytes, ChainId, TxKind, U256},
55
rpc::types::{AccessList, Log, TransactionRequest},
@@ -36,6 +36,10 @@ impl NetworkSpec for Ethereum {
3636
}
3737
}
3838

39+
fn hash_block(block: &Self::BlockResponse) -> revm::primitives::B256 {
40+
block.header.hash_slow()
41+
}
42+
3943
fn receipt_contains(list: &[Self::ReceiptResponse], elem: &Self::ReceiptResponse) -> bool {
4044
for receipt in list {
4145
if receipt == elem {
@@ -85,17 +89,17 @@ impl NetworkSpec for Ethereum {
8589

8690
fn block_env(block: &Self::BlockResponse) -> BlockEnv {
8791
let mut block_env = BlockEnv::default();
88-
block_env.number = block.header.number();
92+
block_env.number = U256::from(block.header.number());
8993
block_env.coinbase = block.header.beneficiary();
90-
block_env.timestamp = block.header.timestamp();
91-
block_env.gas_limit = block.header.gas_limit();
92-
block_env.basefee = block.header.base_fee_per_gas();
94+
block_env.timestamp = U256::from(block.header.timestamp());
95+
block_env.gas_limit = U256::from(block.header.gas_limit());
96+
block_env.basefee = U256::from(block.header.base_fee_per_gas().unwrap_or(0_u64));
9397
block_env.difficulty = block.header.difficulty();
94-
block_env.prevrandao = Some(block.header.mix_hash());
98+
block_env.prevrandao = block.header.mix_hash();
9599
block_env.blob_excess_gas_and_price = block
96100
.header
97101
.excess_blob_gas()
98-
.map(|v| BlobExcessGasAndPrice::new(v.to()));
102+
.map(|v| BlobExcessGasAndPrice::new(v.into()));
99103

100104
block_env
101105
}

ethereum/tests/sync.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,5 @@ async fn test_sync() {
2727
let client = setup().await;
2828

2929
let block = client.block_recv.unwrap().recv().await.unwrap();
30-
assert_eq!(block.number.to::<u64>(), 17923112);
30+
assert_eq!(block.header.number, 17923112_u64);
3131
}

opstack/src/consensus.rs

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
use alloy::consensus::{Header as ConsensusHeader, Transaction as TxTrait};
2-
use alloy::primitives::{b256, fixed_bytes, keccak256, Address, B256, U256, U64};
2+
use alloy::primitives::{b256, fixed_bytes, keccak256, Address, Bloom, BloomInput, B256, U256};
33
use alloy::rlp::Decodable;
44
use alloy::rpc::types::{
55
Block, EIP1186AccountProofResponse, Header, Transaction as EthTransaction,
66
};
77
use alloy_rlp::encode;
88
use eyre::{eyre, OptionExt, Result};
99
use op_alloy_consensus::OpTxEnvelope;
10+
use op_alloy_network::primitives::BlockTransactions;
1011
use op_alloy_rpc_types::Transaction;
1112
use std::str::FromStr;
1213
use std::time::Duration;
@@ -82,7 +83,7 @@ impl ConsensusClient {
8283
}
8384
}
8485

85-
impl Consensus<Transaction> for ConsensusClient {
86+
impl Consensus<Block<Transaction>> for ConsensusClient {
8687
fn chain_id(&self) -> u64 {
8788
self.chain_id
8889
}
@@ -142,7 +143,7 @@ impl Inner {
142143
let number = payload.block_number;
143144

144145
if let Ok(block) = payload_to_block(payload) {
145-
self.latest_block = Some(block.number.to());
146+
self.latest_block = Some(block.header.number);
146147
_ = self.block_send.send(block).await;
147148

148149
tracing::info!(
@@ -193,7 +194,10 @@ fn verify_unsafe_signer(config: Config, signer: Arc<Mutex<Address>>) {
193194
.ok_or_eyre("failed to receive block")?;
194195

195196
// Query proof from op consensus server
196-
let req = format!("{}unsafe_signer_proof/{}", config.consensus_rpc, block.hash);
197+
let req = format!(
198+
"{}unsafe_signer_proof/{}",
199+
config.consensus_rpc, block.header.hash
200+
);
197201
let proof = reqwest::get(req)
198202
.await?
199203
.json::<EIP1186AccountProofResponse>()
@@ -205,7 +209,7 @@ fn verify_unsafe_signer(config: Config, signer: Arc<Mutex<Address>>) {
205209
let account_encoded = encode_account(&proof);
206210
let is_valid = verify_proof(
207211
&proof.account_proof,
208-
block.state_root.as_slice(),
212+
block.header.state_root.as_slice(),
209213
&account_path,
210214
&account_encoded,
211215
);
@@ -340,36 +344,38 @@ fn payload_to_block(value: ExecutionPayload) -> Result<Block<Transaction>> {
340344

341345
let withdrawals = value.withdrawals.iter().map(|v| encode(v));
342346
let withdrawals_root = ordered_trie_root(withdrawals);
347+
let logs_bloom: Bloom = Bloom::from(BloomInput::Raw(&value.logs_bloom.to_vec()));
343348

344349
let consensus_header = ConsensusHeader {
345-
parent_hash: *value.block_hash(),
350+
parent_hash: value.parent_hash.into(),
346351
ommers_hash: empty_uncle_hash,
347-
beneficiary: *value.fee_recipient(),
348-
state_root: *value.state_root(),
352+
beneficiary: Address::from(*value.fee_recipient),
353+
state_root: value.state_root.into(),
349354
transactions_root: B256::from_slice(txs_root.as_bytes()),
350-
receipts_root: *value.receipts_root(),
355+
receipts_root: value.receipts_root.into(),
351356
withdrawals_root: Some(B256::from_slice(withdrawals_root.as_bytes())),
352-
logs_bloom: value.logs_bloom().inner.to_vec().into(),
357+
logs_bloom: logs_bloom,
353358
difficulty: U256::ZERO,
354-
number: *value.block_number(),
355-
gas_limit: *value.gas_limit(),
356-
gas_used: *value.gas_used(),
357-
timestamp: *value.timestamp(),
358-
mix_hash: *value.prev_randao(),
359+
number: value.block_number,
360+
gas_limit: value.gas_limit,
361+
gas_used: value.gas_used,
362+
timestamp: value.timestamp,
363+
mix_hash: value.prev_randao.into(),
359364
nonce: empty_nonce,
360-
base_fee_per_gas: Some(*value.base_fee_per_gas().into()),
361-
blob_gas_used: value.blob_gas_used().cloned().ok(),
362-
excess_blob_gas: value.excess_blob_gas().cloned().ok(),
363-
parent_beacon_block_root: Some(*value.parent_hash()),
364-
extra_data: value.extra_data().inner.to_vec().into(),
365+
base_fee_per_gas: Some(value.base_fee_per_gas.to::<u64>()),
366+
blob_gas_used: Some(value.blob_gas_used),
367+
excess_blob_gas: Some(value.excess_blob_gas),
368+
parent_beacon_block_root: None,
369+
extra_data: value.extra_data.to_vec().into(),
365370
requests_hash: None,
366371
};
367372

368-
let header = Header::from_consensus(
369-
Sealed::new(consensus_header),
370-
Some(U256::ZERO),
371-
Some(U256::ZERO),
372-
);
373+
let header = Header {
374+
hash: value.block_hash,
375+
inner: consensus_header,
376+
total_difficulty: Some(U256::ZERO),
377+
size: Some(U256::ZERO),
378+
};
373379

374380
Ok(Block::new(header, BlockTransactions::Full(txs)))
375381
}

opstack/src/spec.rs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
use alloy::{
2-
consensus::{Receipt, ReceiptWithBloom, Transaction as TxTrait, TxReceipt, TxType},
2+
consensus::{
3+
BlockHeader, Receipt, ReceiptWithBloom, Transaction as TxTrait, TxReceipt, TxType,
4+
},
35
primitives::{Address, Bytes, ChainId, TxKind, U256},
46
rpc::types::{AccessList, Log, TransactionRequest},
57
};
@@ -67,6 +69,10 @@ impl NetworkSpec for OpStack {
6769
}
6870
}
6971

72+
fn hash_block(block: &Self::BlockResponse) -> revm::primitives::B256 {
73+
block.header.hash_slow()
74+
}
75+
7076
fn receipt_contains(list: &[Self::ReceiptResponse], elem: &Self::ReceiptResponse) -> bool {
7177
for receipt in list {
7278
if receipt == elem {
@@ -122,17 +128,17 @@ impl NetworkSpec for OpStack {
122128

123129
fn block_env(block: &Self::BlockResponse) -> BlockEnv {
124130
let mut block_env = BlockEnv::default();
125-
block_env.number = block.header.number();
131+
block_env.number = U256::from(block.header.number());
126132
block_env.coinbase = block.header.beneficiary();
127-
block_env.timestamp = block.header.timestamp();
128-
block_env.gas_limit = block.header.gas_limit();
129-
block_env.basefee = block.header.base_fee_per_gas();
133+
block_env.timestamp = U256::from(block.header.timestamp());
134+
block_env.gas_limit = U256::from(block.header.gas_limit());
135+
block_env.basefee = U256::from(block.header.base_fee_per_gas().unwrap_or(0_u64));
130136
block_env.difficulty = block.header.difficulty();
131-
block_env.prevrandao = Some(block.header.mix_hash());
137+
block_env.prevrandao = block.header.mix_hash();
132138
block_env.blob_excess_gas_and_price = block
133139
.header
134140
.excess_blob_gas()
135-
.map(|v| BlobExcessGasAndPrice::new(v.to()));
141+
.map(|v| BlobExcessGasAndPrice::new(v.into()));
136142

137143
block_env
138144
}

0 commit comments

Comments
 (0)