Skip to content

Commit a79f133

Browse files
committed
feat: sync all tooling changes from ethrex main
Port all tooling changes that landed on ethrex main after the initial ethrex-tooling repo was created: New tools/files: - ef_tests/engine: in-process engine API EF tests runner (#6665) - ef_tests/state_v2/statetest: goevmlab fuzzing subcommand (#6663) - migrations/src/bin/bench_migration + seed_migration_test (#6598) - trace_compare/: opcodeTracer compare script (#6595) - sync/peer_top.py: snap sync observability (#6470) Changes to existing tools: - Add release-fast profile for faster EF test rebuilds - Share merkle pool in blockchain/state_v2 test runners (#6665) - Update amsterdam/zkevm Make targets to be idempotent - Bump fixture URLs for bal-devnet-6/7 (#6574, #6653, #6671) - Bump zkevm fixtures to v0.3.3 (#6527) - Harden JSON-RPC defaults in sync/l2 configs (#6627) - Move getBlockAccessList to eth namespace in REPL (#6709) - Statetest CLI follow-ups (#6721) - Docker monitor disk-full handling (#6500) - Various version bumps and dep updates
1 parent 215859a commit a79f133

51 files changed

Lines changed: 4578 additions & 739 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Cargo.lock

Lines changed: 670 additions & 582 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
members = [
33
"archive_sync",
44
"ef_tests/blockchain",
5+
"ef_tests/engine",
56
"ef_tests/state",
67
"ef_tests/state_v2",
78
"hive_report",
@@ -88,6 +89,9 @@ crossbeam = "0.8.4"
8889
rayon = "1.10.0"
8990
rkyv = { version = "0.8.10", features = ["std", "unaligned"] }
9091
tempfile = "3.8"
92+
anyhow = "1.0.86"
93+
datatest-stable = "0.2.9"
94+
libc = "0.2"
9195
uuid = { version = "1.18.1", features = ["v4"] }
9296
tower-http = { version = "0.6.2", features = ["cors"] }
9397
indexmap = { version = "2.11.4" }
@@ -106,5 +110,13 @@ codegen-units = 1
106110
inherits = "release"
107111
debug = 2
108112

113+
# Release-grade opt-level without thin-LTO so ef_tests rebuilds are fast.
114+
[profile.release-fast]
115+
inherits = "release"
116+
lto = false
117+
codegen-units = 16
118+
debug = "line-tables-only"
119+
incremental = true
120+
109121
[patch.crates-io]
110122
secp256k1 = { git = "https://github.com/sp1-patches/rust-secp256k1", tag = "patch-0.30.0-sp1-5.0.0" }
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
https://github.com/ethereum/execution-spec-tests/releases/download/bal%40v5.6.1/fixtures_bal.tar.gz
1+
https://github.com/ethereum/execution-specs/releases/download/tests-bal%40v7.2.0/fixtures_bal.tar.gz
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
https://github.com/ethereum/execution-spec-tests/releases/download/zkevm%40v0.3.0/fixtures_zkevm.tar.gz
1+
https://github.com/ethereum/execution-spec-tests/releases/download/zkevm%40v0.3.3/fixtures_zkevm.tar.gz

ef_tests/blockchain/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ lazy_static.workspace = true
2424
tokio = { workspace = true, features = ["full"] }
2525
datatest-stable = "0.2.9"
2626
regex = "1.11.1"
27+
rayon.workspace = true
2728

2829
[lib]
2930
path = "./lib.rs"

ef_tests/blockchain/Makefile

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,12 @@ AMSTERDAM_FIXTURES_FILE := .fixtures_url_amsterdam
1616
AMSTERDAM_ARTIFACT := amsterdam-tests.tar.gz
1717
AMSTERDAM_URL := $(shell cat $(AMSTERDAM_FIXTURES_FILE))
1818

19+
# zkevm@v0.3.3 ships fixtures filled against an older Amsterdam base
20+
# (bal@v5.6.1). Extracting them on top of the bal-devnet-7 tree would
21+
# clobber the newer fixtures with stale gas-accounting expectations, so we
22+
# keep them in a separate root and only the stateless harness reads from it.
23+
ZKEVM_VECTORS_ROOT := vectors_zkevm
24+
ZKEVM_VECTORS_DIR := $(ZKEVM_VECTORS_ROOT)/eest
1925
ZKEVM_FIXTURES_FILE := .fixtures_url_zkevm
2026
ZKEVM_ARTIFACT := zkevm-tests.tar.gz
2127
ZKEVM_URL := $(shell cat $(ZKEVM_FIXTURES_FILE))
@@ -44,36 +50,49 @@ $(LEGACYTEST_VECTORS_DIR): $(LEGACYTEST_ARTIFACT)
4450
$(AMSTERDAM_ARTIFACT): $(AMSTERDAM_FIXTURES_FILE)
4551
curl -L -o $(AMSTERDAM_ARTIFACT) $(AMSTERDAM_URL)
4652

47-
amsterdam-vectors: $(AMSTERDAM_ARTIFACT) $(SPECTEST_VECTORS_DIR)
53+
$(SPECTEST_VECTORS_DIR)/for_amsterdam: $(AMSTERDAM_ARTIFACT) $(SPECTEST_VECTORS_DIR)
4854
tar -xzf $(AMSTERDAM_ARTIFACT) --strip-components=2 -C $(SPECTEST_VECTORS_DIR) fixtures/blockchain_tests/for_amsterdam
4955

56+
amsterdam-vectors: $(SPECTEST_VECTORS_DIR)/for_amsterdam
57+
5058
$(ZKEVM_ARTIFACT): $(ZKEVM_FIXTURES_FILE)
5159
curl -L -o $(ZKEVM_ARTIFACT) $(ZKEVM_URL)
5260

53-
zkevm-vectors: $(ZKEVM_ARTIFACT) $(SPECTEST_VECTORS_DIR)
54-
tar -xzf $(ZKEVM_ARTIFACT) --strip-components=2 -C $(SPECTEST_VECTORS_DIR) fixtures/blockchain_tests/for_amsterdam/amsterdam/eip8025_optional_proofs
61+
$(ZKEVM_VECTORS_DIR): $(ZKEVM_ARTIFACT)
62+
rm -rf $(ZKEVM_VECTORS_DIR)
63+
mkdir -p $(ZKEVM_VECTORS_DIR)
64+
tar -xzf $(ZKEVM_ARTIFACT) --strip-components=2 -C $(ZKEVM_VECTORS_DIR) fixtures/blockchain_tests/for_amsterdam
65+
66+
zkevm-vectors: $(ZKEVM_VECTORS_DIR)
5567

5668
help: ## 📚 Show help for each of the Makefile recipes
5769
@grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
5870

5971
download-test-vectors: $(VECTORS_TARGETS) amsterdam-vectors zkevm-vectors ## 📥 Download test vectors
6072

6173
clean-vectors: ## 🗑️ Clean test vectors
62-
rm -rf $(VECTORS_ROOT)
74+
rm -rf $(VECTORS_ROOT) $(ZKEVM_VECTORS_ROOT)
6375
rm -f $(SPECTEST_ARTIFACT) $(LEGACYTEST_ARTIFACT) $(AMSTERDAM_ARTIFACT) $(ZKEVM_ARTIFACT)
6476

65-
test-levm: $(VECTORS_TARGETS) amsterdam-vectors zkevm-vectors ## 🧪 Run blockchain tests with LEVM
66-
cargo test --profile release-with-debug
77+
test-levm: $(VECTORS_TARGETS) amsterdam-vectors ## 🧪 Run blockchain tests with LEVM
78+
cargo test --profile release-fast
6779

68-
test-sp1: $(VECTORS_TARGETS) amsterdam-vectors zkevm-vectors
69-
cargo test --profile release-with-debug --features sp1
80+
test-sp1: $(VECTORS_TARGETS) amsterdam-vectors
81+
cargo test --profile release-fast --features sp1
7082

71-
test-stateless: $(VECTORS_TARGETS) amsterdam-vectors zkevm-vectors
72-
cargo test --profile release-with-debug --features stateless
83+
test-stateless: zkevm-vectors
84+
cargo test --profile release-fast --features stateless
7385

74-
test-stateless-zkevm: $(VECTORS_TARGETS) amsterdam-vectors zkevm-vectors
75-
cargo test --profile release-with-debug --features stateless -- eip8025_optional_proofs
86+
test-stateless-zkevm: zkevm-vectors
87+
cargo test --profile release-fast --features stateless -- eip8025_optional_proofs
7688

77-
test: ## 🧪 Run blockchain tests with LEVM both with state and stateless
89+
test: ## 🧪 Run blockchain tests with LEVM both with state and stateless
7890
$(MAKE) test-levm
79-
$(MAKE) test-stateless
91+
# Narrow stateless coverage to the EIP-8025 optional-proofs suite. The
92+
# zkevm@v0.3.3 fixtures are filled against bal@v5.6.1, which is out of
93+
# sync with this branch's bal-devnet-6+ (and bal-devnet-7-prep) gas
94+
# accounting; the broader `test-stateless` invocation introduced by
95+
# #6527 trips ~549 of those fixtures with `GasUsedMismatch` /
96+
# `ReceiptsRootMismatch` / `BlockAccessListHashMismatch`. Re-broaden
97+
# once the zkevm bundle is regenerated against the current bal spec.
98+
$(MAKE) test-stateless-zkevm

ef_tests/blockchain/test_runner.rs

Lines changed: 78 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,30 @@
1-
use std::{collections::HashMap, path::Path};
1+
use std::{collections::HashMap, path::Path, sync::Arc};
22

33
use crate::{
44
fork::Fork,
55
types::{BlockChainExpectedException, BlockExpectedException, BlockWithRLP, TestUnit},
66
};
77
use ethrex_blockchain::{
8-
Blockchain, BlockchainOptions,
8+
Blockchain,
99
error::{ChainError, InvalidBlockError},
1010
fork_choice::apply_fork_choice,
1111
};
12+
13+
thread_local! {
14+
/// Per-OS-thread merkleization pool, lazily built on first use. Mirrors the
15+
/// pattern used by `tooling/ef_tests/engine` so the ~10k+ blockchain tests
16+
/// don't each spawn a fresh 17-thread rayon pool inside `Blockchain::new`.
17+
/// The merkle protocol's 16 worker jobs cross-communicate via channels, so
18+
/// each pool may have only one concurrent `in_place_scope` caller; keying by
19+
/// `thread_local!` makes the calling test-runner thread the natural
20+
/// exclusive owner.
21+
static MERKLE_POOL: std::cell::OnceCell<Arc<rayon::ThreadPool>> =
22+
const { std::cell::OnceCell::new() };
23+
}
24+
25+
fn merkle_pool() -> Arc<rayon::ThreadPool> {
26+
MERKLE_POOL.with(|cell| cell.get_or_init(Blockchain::build_merkle_pool).clone())
27+
}
1228
#[cfg(feature = "stateless")]
1329
use ethrex_common::types::block_execution_witness::RpcExecutionWitness;
1430
use ethrex_common::{
@@ -85,7 +101,7 @@ pub async fn run_ef_test(
85101
check_prestate_against_db(test_key, test, &store);
86102

87103
// Blockchain EF tests are meant for L1.
88-
let blockchain = Blockchain::new(store.clone(), BlockchainOptions::default());
104+
let blockchain = Blockchain::default_with_store_and_pool(store.clone(), merkle_pool());
89105

90106
// Early return if the exception is in the rlp decoding of the block
91107
for bf in &test.blocks {
@@ -158,8 +174,12 @@ async fn run(
158174
"Warning: Returned exception {error:?} does not match expected {expected_exception:?}",
159175
);
160176
}
161-
// Expected exception matched — stop processing further blocks of this test.
162-
break;
177+
// Expected exception matched — block was rejected, but the test may
178+
// still expect subsequent blocks to be processed (e.g. fork-transition
179+
// tests where a block at the pre-fork timestamp fails and a block at
180+
// the post-fork timestamp succeeds, both built on the same parent).
181+
// Continue with the next block in the fixture.
182+
continue;
163183
}
164184
Ok(_) => {
165185
if expects_exception {
@@ -188,7 +208,7 @@ async fn run(
188208
async fn run_two_pass_parallel(test_key: &str, test: &TestUnit) -> Result<(), String> {
189209
// ---- Pass 1: sequential, collect BALs ----
190210
let store1 = build_store_for_test(test).await;
191-
let blockchain1 = Blockchain::new(store1.clone(), BlockchainOptions::default());
211+
let blockchain1 = Blockchain::default_with_store_and_pool(store1.clone(), merkle_pool());
192212

193213
let mut bals: Vec<BlockAccessList> = Vec::with_capacity(test.blocks.len());
194214

@@ -220,7 +240,7 @@ async fn run_two_pass_parallel(test_key: &str, test: &TestUnit) -> Result<(), St
220240

221241
// ---- Pass 2: parallel (BAL-driven), verify post-state ----
222242
let store2 = build_store_for_test(test).await;
223-
let blockchain2 = Blockchain::new(store2.clone(), BlockchainOptions::default());
243+
let blockchain2 = Blockchain::default_with_store_and_pool(store2.clone(), merkle_pool());
224244

225245
for (block_fixture, bal) in test.blocks.iter().zip(bals.iter()) {
226246
let block: CoreBlock = block_fixture.block().unwrap().clone().into();
@@ -554,29 +574,71 @@ async fn run_stateless_from_fixture(
554574
let block: CoreBlock = block_data.clone().into();
555575
let block_number = block.header.number;
556576

577+
// Absent bytes means "expected to succeed"; malformed bytes are a hard error.
578+
let expected_valid = match block_data.stateless_output_bytes.as_deref() {
579+
None => true,
580+
Some(bytes) => parse_expected_valid_flag(bytes).map_err(|e| {
581+
format!("Malformed statelessOutputBytes for {test_key} block {block_number}: {e}")
582+
})?,
583+
};
584+
585+
// Parse and conversion errors must always fail; only the execution outcome is
586+
// matched against `expected_valid` so the (false, Err(_)) arm below cannot
587+
// absorb regressions in deserialization or witness conversion.
557588
let rpc_witness: RpcExecutionWitness = serde_json::from_value(witness_json.clone())
558589
.map_err(|e| {
559-
format!("Failed to parse executionWitness for block {block_number}: {e}")
590+
format!("executionWitness parse failed for {test_key} block {block_number}: {e}")
560591
})?;
561-
562592
let execution_witness = rpc_witness
563593
.into_execution_witness(*chain_config, block_number)
564-
.map_err(|e| format!("Witness conversion failed for block {block_number}: {e}"))?;
594+
.map_err(|e| {
595+
format!("witness conversion failed for {test_key} block {block_number}: {e}")
596+
})?;
565597

566598
let program_input = ProgramInput::new(vec![block], execution_witness);
567-
568-
let execute_result = match backend_type {
599+
let exec_result = match backend_type {
569600
BackendType::Exec => ExecBackend::new().execute(program_input),
570601
#[cfg(feature = "sp1")]
571602
BackendType::SP1 => Sp1Backend::new().execute(program_input),
572603
};
573604

574-
if let Err(e) = execute_result {
575-
return Err(format!(
576-
"Stateless execution from fixture failed for {test_key} block {block_number}: {e}"
577-
));
605+
match (expected_valid, exec_result) {
606+
(true, Ok(_)) | (false, Err(_)) => {}
607+
(true, Err(e)) => {
608+
return Err(format!(
609+
"Stateless execution from fixture failed for {test_key} block {block_number}: {e}"
610+
));
611+
}
612+
(false, Ok(_)) => {
613+
return Err(format!(
614+
"Stateless execution from fixture succeeded for {test_key} block \
615+
{block_number} but fixture expected it to fail (invalid executionWitness)"
616+
));
617+
}
578618
}
579619
}
580620

581621
Ok(())
582622
}
623+
624+
/// Decode the `valid` byte (index 32) from a zkevm-fixture `statelessOutputBytes` hex
625+
/// string, encoded as `new_payload_request_root (32 B) ++ valid (1 B) ++ padding`.
626+
#[cfg(feature = "stateless")]
627+
fn parse_expected_valid_flag(hex: &str) -> Result<bool, String> {
628+
let trimmed = hex.strip_prefix("0x").unwrap_or(hex);
629+
let byte_hex = trimmed.get(64..66).ok_or_else(|| {
630+
format!(
631+
"expected at least 33 bytes (66 hex chars), got {} hex chars",
632+
trimmed.len()
633+
)
634+
})?;
635+
let byte = u8::from_str_radix(byte_hex, 16)
636+
.map_err(|e| format!("invalid hex at byte 32 ({byte_hex:?}): {e}"))?;
637+
match byte {
638+
0 => Ok(false),
639+
1 => Ok(true),
640+
n => Err(format!(
641+
"invalid validity byte 0x{n:02x} (expected 0x00 or 0x01)"
642+
)),
643+
}
644+
}

ef_tests/blockchain/tests/all.rs

Lines changed: 78 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,13 @@ use std::path::Path;
66
#[cfg(all(feature = "sp1", feature = "stateless"))]
77
compile_error!("Only one of `sp1` and `stateless` can be enabled at a time.");
88

9+
// test-levm / test-sp1 read snobal-devnet-6 + legacy from `vectors/`.
10+
// test-stateless reads zkevm@v0.3.3 (the only bundle that ships executionWitness)
11+
// from a separate `vectors_zkevm/` so its older bal@v5.6.1 base never overlays
12+
// the snobal fixtures used by the other suites.
13+
#[cfg(feature = "stateless")]
14+
const TEST_FOLDER: &str = "vectors_zkevm/";
15+
#[cfg(not(feature = "stateless"))]
916
const TEST_FOLDER: &str = "vectors/";
1017

1118
// Base skips shared by all runs.
@@ -18,23 +25,91 @@ const SKIPPED_BASE: &[&str] = &[
1825
"ValueOverflowParis",
1926
// Skip because it's a "Create" Blob Transaction, which doesn't actually exist. It never reaches the EVM because we can't even parse it as an actual Transaction.
2027
"createBlobhashTx",
28+
// EIP-8025 optional-proofs fixtures filled against bal@v5.6.1 (devnets/bal/3),
29+
// which predates EELS PR #2711 "immutable intrinsic_state_gas for EIP-7702".
30+
// Expected gas assumes the auth refund still deducts from block-accounted state
31+
// gas; our devnet-4 (bal@v5.7.0) impl correctly keeps intrinsic_state_gas
32+
// immutable and routes the refund to the reservoir only. Re-enable once the
33+
// zkevm@v0.4.x release ships fixtures regenerated against devnet-4.
34+
"witness_codes_redelegation_old_marker_included_new_marker_excluded",
35+
"witness_codes_reset_delegation",
36+
"witness_codes_reverted_transaction",
37+
"witness_codes_failed_create_includes_factory",
38+
"witness_codes_reverted_create_same_hash_then_read",
39+
"witness_codes_create_then_selfdestruct_same_tx",
40+
// Additional EIP-8025 optional-proofs fixtures whose expected gas magnitudes
41+
// disagree with bal-devnet-7 (bal@v7.1.1) state-gas accounting. Same root
42+
// cause as the block above: zkevm@v0.3.3 bundle is pinned at an older bal
43+
// spec (storage_set / new_account / cpsb constants pre-recalibration plus
44+
// earlier refund-channel semantics) and the broader fork.py changes from
45+
// EELS PRs #2815/#2816/#2823/#2827/#2828. Re-enable once the zkevm bundle
46+
// is regenerated against bal-7.
47+
"witness_codes_delegation_set_in_same_block",
48+
"witness_codes_auth_nonce_mismatch",
49+
"witness_codes_dedup_identical_bytecode",
50+
"witness_codes_create2_excludes_new_bytecode",
51+
"witness_codes_reverted_inner_call",
52+
"witness_codes_create_same_hash_then_read",
53+
"witness_codes_create_then_call_same_block",
54+
"witness_codes_create_then_call_same_tx",
55+
"witness_codes_failed_create_after_initcode_read",
56+
"witness_codes_initcode_calls_existing_contract",
57+
"witness_excludes_bytecode_created_in_same_block",
58+
"witness_keeps_prestate_code_read_even_if_later_created_with_same_hash",
59+
"witness_codes_selfdestruct_in_initcode",
60+
"witness_codes_selfdestruct_beneficiary_no_code",
61+
"witness_state_delete_with_new_dirty_sibling_omits_post_state_node",
62+
"witness_state_block_diff_delete_insert_before_delete_order",
63+
"witness_state_delete_then_insert_uses_insert_before_delete_order",
64+
"witness_state_sstore_into_empty_storage_omits_post_state_nodes",
65+
"witness_state_sstore_new_slot_omits_post_state_nodes",
66+
"validation_state_missing_absent_slot_proof_leaf_node",
67+
"validation_state_missing_storage_proof_node",
2168
];
2269

2370
// Extra skips added only for prover backends.
24-
#[cfg(feature = "sp1")]
71+
#[cfg(all(feature = "sp1", not(feature = "stateless")))]
2572
const EXTRA_SKIPS: &[&str] = &[
2673
// I believe these tests fail because of how much stress they put into the zkVM, they probably cause an OOM though this should be checked
2774
"static_Call50000",
2875
"Return50000",
2976
"static_Call1MB1024Calldepth",
3077
];
31-
#[cfg(not(feature = "sp1"))]
78+
#[cfg(feature = "stateless")]
79+
const EXTRA_SKIPS: &[&str] = &[
80+
// zkevm@v0.3.3 tolerance tests: the fixture's `statelessOutputBytes` declares `valid = 1`
81+
// because the executed path does not actually consume the malformed/extra/missing witness
82+
// entry, but our RpcExecutionWitness conversion eagerly validates the full witness and
83+
// rejects it. Re-enable once the witness conversion is lazy per EIP-8025 §Tolerance.
84+
"validation_headers_malformed_rlp_header",
85+
"validation_headers_missing_oldest_blockhash_ancestor",
86+
"validation_headers_missing_parent_header",
87+
"validation_state_extra_unused_trie_node",
88+
// zkevm@v0.3.3 rejection tests: `statelessOutputBytes` declares `valid = 0` so the guest
89+
// program must reject the deliberately-incomplete witness, but our stateless path runs
90+
// to completion instead of detecting the missing entry. Re-enable once the witness
91+
// completeness checks land (missing delegation/external-code bytecodes, non-contiguous
92+
// header chain detection).
93+
"validation_codes_missing_delegated_code_on_insufficient_balance_call",
94+
"validation_codes_missing_external_code_read_target",
95+
"validation_codes_missing_redelegation_old_marker",
96+
"validation_codes_missing_sender_delegation_marker",
97+
"validation_headers_non_contiguous_chain",
98+
// zkevm@v0.3.3 conversion-time rejection: `statelessOutputBytes` declares `valid = 0` and
99+
// our `into_execution_witness` correctly rejects the witness because it can't extract the
100+
// initial state root without the parent header. Since 5a597e67d the runner treats
101+
// conversion errors as unconditional regressions, so this correct-rejection-at-the-wrong-
102+
// stage trips the test. Re-enable once conversion is lazy enough to defer the parent-
103+
// header check to execution.
104+
"validation_headers_empty_block_missing_mandatory_parent",
105+
];
106+
#[cfg(not(any(feature = "sp1", feature = "stateless")))]
32107
const EXTRA_SKIPS: &[&str] = &[];
33108

34109
// Select backend
35110
#[cfg(feature = "stateless")]
36111
const BACKEND: Option<BackendType> = Some(BackendType::Exec);
37-
#[cfg(feature = "sp1")]
112+
#[cfg(all(feature = "sp1", not(feature = "stateless")))]
38113
const BACKEND: Option<BackendType> = Some(BackendType::SP1);
39114
#[cfg(not(any(feature = "sp1", feature = "stateless")))]
40115
const BACKEND: Option<BackendType> = None;

ef_tests/engine/.fixtures_url

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
https://github.com/ethereum/execution-spec-tests/releases/download/v5.3.0/fixtures_develop.tar.gz
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
https://github.com/ethereum/execution-spec-tests/releases/download/snobal-devnet-6%40v1.1.0/fixtures_snobal-devnet-6.tar.gz

0 commit comments

Comments
 (0)