Skip to content

Commit

Permalink
fix: mining blocks when forking non-eth chains (#5127)
Browse files Browse the repository at this point in the history
  • Loading branch information
Wodann committed Apr 17, 2024
1 parent a41cb44 commit 8c7965d
Show file tree
Hide file tree
Showing 5 changed files with 57 additions and 18 deletions.
5 changes: 5 additions & 0 deletions .changeset/friendly-papayas-drum.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@nomicfoundation/edr": patch
---

Fixed mining of blocks when forking a chain that has non-Ethereum block headers
36 changes: 22 additions & 14 deletions crates/edr_evm/src/block/builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use std::{
};

use edr_eth::{
block::{BlobGas, BlockOptions, Header, PartialHeader},
block::{BlobGas, BlockOptions, PartialHeader},
log::{add_log_to_bloom, Log},
receipt::{TransactionReceipt, TypedReceipt, TypedReceiptData},
transaction::SignedTransaction,
Expand All @@ -27,7 +27,7 @@ use crate::{
blockchain::SyncBlockchain,
debug::{DebugContext, EvmContext},
state::{AccountModifierFn, StateDebug, StateDiff, SyncState},
ExecutableTransaction,
ExecutableTransaction, SyncBlock,
};

const DAO_EXTRA_DATA: &[u8] = b"dao-hard-fork";
Expand Down Expand Up @@ -139,9 +139,9 @@ pub struct BlockBuilder {
impl BlockBuilder {
/// Creates an intance of [`BlockBuilder`].
#[cfg_attr(feature = "tracing", tracing::instrument(skip_all))]
pub fn new(
pub fn new<BlockchainErrorT>(
cfg: CfgEnvWithHandlerCfg,
parent: &Header,
parent: &dyn SyncBlock<Error = BlockchainErrorT>,
mut options: BlockOptions,
dao_hardfork_activation_block: Option<u64>,
) -> Result<Self, BlockBuilderCreationError> {
Expand All @@ -151,8 +151,9 @@ impl BlockBuilder {
));
}

let parent_header = parent.header();
let parent_gas_limit = if options.gas_limit.is_none() {
Some(parent.gas_limit)
Some(parent_header.gas_limit)
} else {
None
};
Expand All @@ -165,7 +166,8 @@ impl BlockBuilder {
}
});

let header = PartialHeader::new(cfg.handler_cfg.spec_id, options, Some(parent));
options.parent_hash = Some(*parent.hash());
let header = PartialHeader::new(cfg.handler_cfg.spec_id, options, Some(parent_header));

if let Some(dao_hardfork_activation_block) = dao_hardfork_activation_block {
const DAO_FORCE_EXTRA_DATA_RANGE: u64 = 9;
Expand Down Expand Up @@ -523,12 +525,15 @@ mod tests {
const DUMMY_DAO_HARDFORK_BLOCK_NUMBER: u64 = 3;

// Create a random block header
let header = Header {
let partial_header = PartialHeader {
number: DUMMY_DAO_HARDFORK_BLOCK_NUMBER - 1,
..Header::default()
..PartialHeader::default()
};

let cfg = CfgEnvWithHandlerCfg::new_with_spec_id(CfgEnv::default(), SpecId::BYZANTIUM);
let spec_id = SpecId::BYZANTIUM;
let parent = LocalBlock::empty(spec_id, partial_header);

let cfg = CfgEnvWithHandlerCfg::new_with_spec_id(CfgEnv::default(), spec_id);
let block_options = BlockOptions {
number: Some(DUMMY_DAO_HARDFORK_BLOCK_NUMBER),
extra_data: Some(Bytes::from(DAO_EXTRA_DATA)),
Expand All @@ -537,7 +542,7 @@ mod tests {

let block_builder = BlockBuilder::new(
cfg,
&header,
&parent,
block_options,
Some(DUMMY_DAO_HARDFORK_BLOCK_NUMBER),
);
Expand All @@ -553,12 +558,15 @@ mod tests {
const DUMMY_DAO_HARDFORK_BLOCK_NUMBER: u64 = 3;

// Create a random block header
let header = Header {
let partial_header = PartialHeader {
number: DUMMY_DAO_HARDFORK_BLOCK_NUMBER - 1,
..Header::default()
..PartialHeader::default()
};

let cfg = CfgEnvWithHandlerCfg::new_with_spec_id(CfgEnv::default(), SpecId::BYZANTIUM);
let spec_id = SpecId::BYZANTIUM;
let parent = LocalBlock::empty(spec_id, partial_header);

let cfg = CfgEnvWithHandlerCfg::new_with_spec_id(CfgEnv::default(), spec_id);

let block_options = BlockOptions {
number: Some(DUMMY_DAO_HARDFORK_BLOCK_NUMBER),
Expand All @@ -567,7 +575,7 @@ mod tests {

let block_builder = BlockBuilder::new(
cfg,
&header,
&parent,
block_options,
Some(DUMMY_DAO_HARDFORK_BLOCK_NUMBER),
);
Expand Down
4 changes: 1 addition & 3 deletions crates/edr_evm/src/miner.rs
Original file line number Diff line number Diff line change
Expand Up @@ -105,11 +105,9 @@ where
.last_block()
.map_err(MineBlockError::Blockchain)?;

let parent_header = parent_block.header();

let mut block_builder = BlockBuilder::new(
cfg.clone(),
parent_header,
&parent_block,
options,
dao_hardfork_activation_block,
)?;
Expand Down
2 changes: 1 addition & 1 deletion crates/edr_provider/src/test_utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ pub async fn run_full_block(url: String, block_number: u64, chain_id: u64) -> an

let mut builder = BlockBuilder::new(
cfg,
parent.header(),
&parent,
BlockOptions {
beneficiary: Some(replay_header.beneficiary),
gas_limit: Some(replay_header.gas_limit),
Expand Down
28 changes: 28 additions & 0 deletions crates/edr_provider/tests/issue_384.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
#![cfg(feature = "test-utils")]

use edr_provider::{
hardhat_rpc_types::ForkConfig, test_utils::create_test_config_with_fork, MethodInvocation,
NoopLogger, Provider, ProviderRequest,
};
use edr_test_utils::env::get_infura_url;
use tokio::runtime;

#[tokio::test(flavor = "multi_thread")]
async fn avalanche_chain_mine_local_block() -> anyhow::Result<()> {
const BLOCK_NUMBER: u64 = 22_587_773;

let logger = Box::new(NoopLogger);
let subscriber = Box::new(|_event| {});

let config = create_test_config_with_fork(Some(ForkConfig {
json_rpc_url: get_infura_url().replace("mainnet", "avalanche-mainnet"),
block_number: Some(BLOCK_NUMBER),
http_headers: None,
}));

let provider = Provider::new(runtime::Handle::current(), logger, subscriber, config)?;

provider.handle_request(ProviderRequest::Single(MethodInvocation::EvmMine(None)))?;

Ok(())
}

0 comments on commit 8c7965d

Please sign in to comment.