From d107827b69092025dc3e35d53c50787c8b49810e Mon Sep 17 00:00:00 2001 From: Matthias Seitz Date: Tue, 23 Jul 2024 22:11:45 +0200 Subject: [PATCH] test: add holesky sync test (#9742) --- Cargo.lock | 2 + crates/engine/tree/Cargo.toml | 3 + crates/engine/tree/src/tree/mod.rs | 73 +++++++++++++++++++++- crates/engine/tree/test-data/holesky/1.rlp | 1 + crates/engine/tree/test-data/holesky/2.rlp | 1 + 5 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 crates/engine/tree/test-data/holesky/1.rlp create mode 100644 crates/engine/tree/test-data/holesky/2.rlp diff --git a/Cargo.lock b/Cargo.lock index 0c2652425..24c2e8db9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6975,6 +6975,7 @@ dependencies = [ name = "reth-engine-tree" version = "1.0.3" dependencies = [ + "alloy-rlp", "aquamarine", "assert_matches", "futures", @@ -7006,6 +7007,7 @@ dependencies = [ "reth-prune-types", "reth-revm", "reth-rpc-types", + "reth-rpc-types-compat", "reth-stages", "reth-stages-api", "reth-stages-types", diff --git a/crates/engine/tree/Cargo.toml b/crates/engine/tree/Cargo.toml index aea1d9a0c..ad1c0fc18 100644 --- a/crates/engine/tree/Cargo.toml +++ b/crates/engine/tree/Cargo.toml @@ -74,6 +74,9 @@ reth-prune-types.workspace = true reth-stages = { workspace = true, features = ["test-utils"] } reth-chain-state = { workspace = true, features = ["test-utils"] } reth-tracing.workspace = true +reth-rpc-types-compat.workspace = true + +alloy-rlp.workspace = true assert_matches.workspace = true rand.workspace = true diff --git a/crates/engine/tree/src/tree/mod.rs b/crates/engine/tree/src/tree/mod.rs index ff4ec562f..e087ad2dd 100644 --- a/crates/engine/tree/src/tree/mod.rs +++ b/crates/engine/tree/src/tree/mod.rs @@ -1438,14 +1438,20 @@ impl PersistenceState { mod tests { use super::*; use crate::persistence::PersistenceAction; + use alloy_rlp::Decodable; use reth_beacon_consensus::EthBeaconConsensus; use reth_chain_state::{test_utils::get_executed_blocks, BlockState}; - use reth_chainspec::{ChainSpecBuilder, MAINNET}; + use reth_chainspec::{ChainSpecBuilder, HOLESKY, MAINNET}; use reth_ethereum_engine_primitives::EthEngineTypes; use reth_evm::test_utils::MockExecutorProvider; use reth_payload_builder::PayloadServiceCommand; + use reth_primitives::Bytes; use reth_provider::test_utils::MockEthProvider; - use std::sync::mpsc::{channel, Sender}; + use reth_rpc_types_compat::engine::block_to_payload_v1; + use std::{ + str::FromStr, + sync::mpsc::{channel, Sender}, + }; use tokio::sync::mpsc::unbounded_channel; struct TestHarness { @@ -1456,6 +1462,44 @@ mod tests { payload_command_rx: UnboundedReceiver>, } + impl TestHarness { + fn holesky() -> Self { + let (action_tx, action_rx) = channel(); + let persistence_handle = PersistenceHandle::new(action_tx); + + let chain_spec = HOLESKY.clone(); + let consensus = Arc::new(EthBeaconConsensus::new(chain_spec.clone())); + + let provider = MockEthProvider::default(); + let executor_factory = MockExecutorProvider::default(); + + let payload_validator = ExecutionPayloadValidator::new(chain_spec.clone()); + + let (to_tree_tx, to_tree_rx) = channel(); + let (from_tree_tx, from_tree_rx) = unbounded_channel(); + + let header = chain_spec.genesis_header().seal_slow(); + let engine_api_tree_state = EngineApiTreeState::new(10, 10, header.num_hash()); + + let (to_payload_service, payload_command_rx) = unbounded_channel(); + let payload_builder = PayloadBuilderHandle::new(to_payload_service); + let tree = EngineApiTreeHandlerImpl::new( + provider, + executor_factory, + consensus, + payload_validator, + to_tree_rx, + from_tree_tx, + engine_api_tree_state, + header, + persistence_handle, + payload_builder, + ); + + Self { tree, to_tree_tx, blocks: vec![], action_rx, payload_command_rx } + } + } + fn get_default_test_harness(number_of_blocks: u64) -> TestHarness { let blocks: Vec<_> = get_executed_blocks(0..number_of_blocks).collect(); @@ -1593,4 +1637,29 @@ mod tests { let resp = rx.await.unwrap().unwrap().await.unwrap(); assert!(resp.payload_status.is_syncing()); } + + #[tokio::test] + async fn test_holesky_payload() { + let s = include_str!("../../test-data/holesky/1.rlp"); + let data = Bytes::from_str(s).unwrap(); + let block = Block::decode(&mut data.as_ref()).unwrap(); + let sealed = block.seal_slow(); + let payload = block_to_payload_v1(sealed); + + let TestHarness { mut tree, to_tree_tx, action_rx, blocks, payload_command_rx } = + TestHarness::holesky(); + + // set backfill active + tree.is_backfill_active = true; + + let (tx, rx) = oneshot::channel(); + tree.on_engine_message(FromEngine::Request(BeaconEngineMessage::NewPayload { + payload: payload.clone().into(), + cancun_fields: None, + tx, + })); + + let resp = rx.await.unwrap().unwrap(); + assert!(resp.is_syncing()); + } } diff --git a/crates/engine/tree/test-data/holesky/1.rlp b/crates/engine/tree/test-data/holesky/1.rlp new file mode 100644 index 000000000..454e6b04c --- /dev/null +++ b/crates/engine/tree/test-data/holesky/1.rlp @@ -0,0 +1 @@ +f90218f90213a0b5f7f912443c940f21fd611f12828d75b534364ed9e95ca4e307729a4661bde4a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a069d8c9d72f6fa4ad42d4702b433707212f90db395eb54dc20bc85de253788783a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800184017dd79d808465156ad899d883010d02846765746888676f312e32312e31856c696e7578a0b5f7f912443c940f21fd611f12828d75b534364ed9e95ca4e307729a4661bde488000000000000000084342770c0c0c0 \ No newline at end of file diff --git a/crates/engine/tree/test-data/holesky/2.rlp b/crates/engine/tree/test-data/holesky/2.rlp new file mode 100644 index 000000000..1b7d04893 --- /dev/null +++ b/crates/engine/tree/test-data/holesky/2.rlp @@ -0,0 +1 @@ +f90218f90213a0e9011e6d15a0d0c16f65a38f84375bf1a6b88201b0ad75a2660df0bb8d1ac381a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794c6e2459991bfe27cca6d86722f35da23a1e4cb97a069d8c9d72f6fa4ad42d4702b433707212f90db395eb54dc20bc85de253788783a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800284017e3711808465156af099d883010d02846765746888676f312e32312e31856c696e7578a0b212724aac0df10d75b1b6d795fd4cd17e4ca4f9ee1bfe97871a16a3af64eed1880000000000000000842da282a8c0c0 \ No newline at end of file