From 83342a14fc2347db88eba40f2bc0ffbc7cc0ba41 Mon Sep 17 00:00:00 2001 From: dapplion <35266934+dapplion@users.noreply.github.com> Date: Sun, 21 Dec 2025 19:26:43 -0300 Subject: [PATCH 01/18] Era files consumer --- Cargo.lock | 1809 ++++++++++------- Cargo.toml | 3 +- beacon_node/lighthouse_network/src/config.rs | 3 + .../lighthouse_network/src/types/globals.rs | 5 + beacon_node/network/Cargo.toml | 1 + .../src/network_beacon_processor/mod.rs | 2 +- .../network_beacon_processor/sync_methods.rs | 24 +- .../network/src/sync/backfill_sync/mod.rs | 26 + .../network/src/sync/backfill_sync_era/mod.rs | 277 +++ beacon_node/network/src/sync/manager.rs | 118 +- beacon_node/network/src/sync/mod.rs | 1 + beacon_node/src/cli.rs | 9 + beacon_node/src/config.rs | 3 + 13 files changed, 1509 insertions(+), 772 deletions(-) create mode 100644 beacon_node/network/src/sync/backfill_sync_era/mod.rs diff --git a/Cargo.lock b/Cargo.lock index 69204ccaecd..f883dccb655 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,7 +4,7 @@ version = 4 [[package]] name = "account_manager" -version = "8.1.0" +version = "8.0.1" dependencies = [ "account_utils", "bls", @@ -65,6 +65,19 @@ dependencies = [ "generic-array", ] +[[package]] +name = "aes" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" +dependencies = [ + "cfg-if", + "cipher 0.3.0", + "cpufeatures", + "ctr 0.8.0", + "opaque-debug", +] + [[package]] name = "aes" version = "0.8.4" @@ -72,7 +85,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ "cfg-if", - "cipher", + "cipher 0.4.4", "cpufeatures", ] @@ -83,9 +96,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" dependencies = [ "aead", - "aes", - "cipher", - "ctr", + "aes 0.8.4", + "cipher 0.4.4", + "ctr 0.9.2", "ghash", "subtle", ] @@ -111,15 +124,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "alloca" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5a7d05ea6aea7e9e64d25b9156ba2fee3fdd659e34e41063cd2fc7cd020d7f4" -dependencies = [ - "cc", -] - [[package]] name = "allocator-api2" version = "0.2.21" @@ -128,9 +132,9 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "alloy-chains" -version = "0.2.23" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35d744058a9daa51a8cf22a3009607498fcf82d3cf4c5444dd8056cdf651f471" +checksum = "4bc32535569185cbcb6ad5fa64d989a47bccb9a08e27284b1f2a3ccf16e6d010" dependencies = [ "alloy-primitives", "num_enum", @@ -152,7 +156,7 @@ dependencies = [ "auto_impl", "borsh", "c-kzg", - "derive_more 2.1.0", + "derive_more 2.0.1", "either", "k256", "once_cell", @@ -180,9 +184,9 @@ dependencies = [ [[package]] name = "alloy-dyn-abi" -version = "1.5.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3b1db3281bcaf03cfadb9d125fac55603526cc1d0577da555dc6184f5188f6f" +checksum = "3fdff496dd4e98a81f4861e66f7eaf5f2488971848bb42d9c892f871730245c8" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -245,19 +249,19 @@ dependencies = [ "auto_impl", "borsh", "c-kzg", - "derive_more 2.1.0", + "derive_more 2.0.1", "either", "serde", "serde_with", - "sha2", + "sha2 0.10.9", "thiserror 2.0.17", ] [[package]] name = "alloy-json-abi" -version = "1.5.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bfca3dbbcb7498f0f60e67aff2ad6aff57032e22eb2fd03189854be11a22c03" +checksum = "5513d5e6bd1cba6bdcf5373470f559f320c05c8c59493b6e98912fbe6733943f" dependencies = [ "alloy-primitives", "alloy-sol-type-parser", @@ -273,7 +277,7 @@ checksum = "f72cf87cda808e593381fb9f005ffa4d2475552b7a6c5ac33d087bf77d82abd0" dependencies = [ "alloy-primitives", "alloy-sol-types", - "http 1.4.0", + "http 1.3.1", "serde", "serde_json", "thiserror 2.0.17", @@ -299,7 +303,7 @@ dependencies = [ "alloy-sol-types", "async-trait", "auto_impl", - "derive_more 2.1.0", + "derive_more 2.0.1", "futures-utils-wasm", "serde", "serde_json", @@ -321,20 +325,20 @@ dependencies = [ [[package]] name = "alloy-primitives" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c850e6ccbd34b8a463a1e934ffc8fc00e1efc5e5489f2ad82d7797949f3bd4e" +checksum = "7db950a29746be9e2f2c6288c8bd7a6202a81f999ce109a2933d2379970ec0fa" dependencies = [ "alloy-rlp", "arbitrary", "bytes", "cfg-if", "const-hex", - "derive_more 2.1.0", + "derive_more 2.0.1", "foldhash 0.2.0", "getrandom 0.3.4", - "hashbrown 0.16.1", - "indexmap 2.12.1", + "hashbrown 0.16.0", + "indexmap 2.12.0", "itoa", "k256", "keccak-asm", @@ -408,7 +412,7 @@ checksum = "64b728d511962dda67c1bc7ea7c03736ec275ed2cf4c35d9585298ac9ccf3b73" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -510,41 +514,41 @@ dependencies = [ [[package]] name = "alloy-sol-macro" -version = "1.5.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2218e3aeb3ee665d117fdf188db0d5acfdc3f7b7502c827421cb78f26a2aec0" +checksum = "f3ce480400051b5217f19d6e9a82d9010cdde20f1ae9c00d53591e4a1afbb312" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] name = "alloy-sol-macro-expander" -version = "1.5.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b231cb8cc48e66dd1c6e11a1402f3ac86c3667cbc13a6969a0ac030ba7bb8c88" +checksum = "6d792e205ed3b72f795a8044c52877d2e6b6e9b1d13f431478121d8d4eaa9028" dependencies = [ "alloy-sol-macro-input", "const-hex", "heck", - "indexmap 2.12.1", + "indexmap 2.12.0", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", "syn-solidity", "tiny-keccak", ] [[package]] name = "alloy-sol-macro-input" -version = "1.5.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49a522d79929c1bf0152b07567a38f7eaed3ab149e53e7528afa78ff11994668" +checksum = "0bd1247a8f90b465ef3f1207627547ec16940c35597875cdc09c49d58b19693c" dependencies = [ "const-hex", "dunce", @@ -552,15 +556,15 @@ dependencies = [ "macro-string", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", "syn-solidity", ] [[package]] name = "alloy-sol-type-parser" -version = "1.5.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0475c459859c8d9428af6ff3736614655a57efda8cc435a3b8b4796fa5ac1dd0" +checksum = "954d1b2533b9b2c7959652df3076954ecb1122a28cc740aa84e7b0a49f6ac0a9" dependencies = [ "serde", "winnow", @@ -568,9 +572,9 @@ dependencies = [ [[package]] name = "alloy-sol-types" -version = "1.5.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35287d9d821d5f26011bcd8d9101340898f761c9933cf50fca689bb7ed62fdeb" +checksum = "70319350969a3af119da6fb3e9bddb1bce66c9ea933600cb297c8b1850ad2a3c" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -587,7 +591,7 @@ dependencies = [ "alloy-json-rpc", "auto_impl", "base64 0.22.1", - "derive_more 2.1.0", + "derive_more 2.0.1", "futures", "futures-utils-wasm", "parking_lot", @@ -625,7 +629,7 @@ dependencies = [ "alloy-primitives", "alloy-rlp", "arrayvec", - "derive_more 2.1.0", + "derive_more 2.0.1", "nybbles", "serde", "smallvec", @@ -641,7 +645,7 @@ dependencies = [ "darling 0.21.3", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -824,7 +828,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" dependencies = [ "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -862,7 +866,7 @@ dependencies = [ "num-traits", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -973,7 +977,7 @@ checksum = "3109e49b1e4909e9db6515a30c633684d68cdeaa252f215214cb4fa1a5bfee2c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", "synstructure", ] @@ -985,7 +989,7 @@ checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -1040,7 +1044,7 @@ dependencies = [ "futures-lite", "parking", "polling", - "rustix", + "rustix 1.1.2", "slab", "windows-sys 0.61.2", ] @@ -1064,7 +1068,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -1075,7 +1079,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -1104,7 +1108,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16e2cdb6d5ed835199484bb92bb8b3edd526effe995c61732580439c1a67e2e9" dependencies = [ "base64 0.22.1", - "http 1.4.0", + "http 1.3.1", "log", "url", ] @@ -1117,7 +1121,7 @@ checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -1136,7 +1140,7 @@ dependencies = [ "axum-core", "bytes", "futures-util", - "http 1.4.0", + "http 1.3.1", "http-body 1.0.1", "http-body-util", "itoa", @@ -1162,7 +1166,7 @@ dependencies = [ "async-trait", "bytes", "futures-util", - "http 1.4.0", + "http 1.3.1", "http-body 1.0.1", "http-body-util", "mime", @@ -1215,9 +1219,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" -version = "1.8.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e050f626429857a27ddccb31e0aca21356bfa709c04041aefddac081a8f068a" +checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" [[package]] name = "beacon_chain" @@ -1232,8 +1236,8 @@ dependencies = [ "eth2_network_config", "ethereum_hashing", "ethereum_serde_utils", - "ethereum_ssz", - "ethereum_ssz_derive", + "ethereum_ssz 0.10.0", + "ethereum_ssz_derive 0.10.0", "execution_layer", "fixed_bytes", "fork_choice", @@ -1241,8 +1245,9 @@ dependencies = [ "genesis", "hex", "int_to_bytes", - "itertools 0.14.0", + "itertools 0.10.5", "kzg", + "lighthouse_tracing", "lighthouse_version", "logging", "lru 0.12.5", @@ -1280,12 +1285,12 @@ dependencies = [ "tree_hash_derive", "typenum", "types", - "zstd", + "zstd 0.13.3", ] [[package]] name = "beacon_node" -version = "8.1.0" +version = "8.0.1" dependencies = [ "account_utils", "beacon_chain", @@ -1324,7 +1329,7 @@ dependencies = [ "clap", "eth2", "futures", - "itertools 0.14.0", + "itertools 0.10.5", "sensitive_url", "serde", "slot_clock", @@ -1343,7 +1348,7 @@ version = "0.1.0" dependencies = [ "fnv", "futures", - "itertools 0.14.0", + "itertools 0.10.5", "lighthouse_network", "logging", "metrics", @@ -1380,32 +1385,15 @@ dependencies = [ "itertools 0.12.1", "lazy_static", "lazycell", - "proc-macro2", - "quote", - "regex", - "rustc-hash 1.1.0", - "shlex", - "syn 2.0.111", -] - -[[package]] -name = "bindgen" -version = "0.72.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" -dependencies = [ - "bitflags 2.10.0", - "cexpr", - "clang-sys", - "itertools 0.13.0", "log", "prettyplease", "proc-macro2", "quote", "regex", - "rustc-hash 2.1.1", + "rustc-hash 1.1.0", "shlex", - "syn 2.0.111", + "syn 2.0.110", + "which", ] [[package]] @@ -1425,15 +1413,15 @@ checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" [[package]] name = "bitcoin-io" -version = "0.1.4" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dee39a0ee5b4095224a0cfc6bf4cc1baf0f9624b96b367e53b66d974e51d953" +checksum = "0b47c4ab7a93edb0c7198c5535ed9b52b63095f4e9b45279c6736cec4b856baf" [[package]] name = "bitcoin_hashes" -version = "0.14.1" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26ec84b80c482df901772e931a9a681e26a1b9ee2302edeff23cb30328745c8b" +checksum = "bb18c03d0db0247e147a21a6faafd5a7eb851c743db062de72018b6b7e8e4d16" dependencies = [ "bitcoin-io", "hex-conservative", @@ -1474,18 +1462,18 @@ dependencies = [ [[package]] name = "block-buffer" -version = "0.10.4" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" dependencies = [ "generic-array", ] [[package]] -name = "block-padding" -version = "0.3.3" +name = "block-buffer" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ "generic-array", ] @@ -1508,7 +1496,7 @@ dependencies = [ "blst", "ethereum_hashing", "ethereum_serde_utils", - "ethereum_ssz", + "ethereum_ssz 0.10.0", "fixed_bytes", "hex", "rand 0.9.2", @@ -1548,14 +1536,14 @@ dependencies = [ [[package]] name = "boot_node" -version = "8.1.0" +version = "8.0.1" dependencies = [ "beacon_node", "bytes", "clap", "clap_utils", "eth2_network_config", - "ethereum_ssz", + "ethereum_ssz 0.10.0", "hex", "lighthouse_network", "log", @@ -1570,9 +1558,9 @@ dependencies = [ [[package]] name = "borsh" -version = "1.6.0" +version = "1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1da5ab77c1437701eeff7c88d968729e7766172279eab0676857b3d63af7a6f" +checksum = "ad8646f98db542e39fc66e68a20b2144f6a732636df7c2354e74645faaa433ce" dependencies = [ "borsh-derive", "cfg_aliases", @@ -1580,15 +1568,15 @@ dependencies = [ [[package]] name = "borsh-derive" -version = "1.6.0" +version = "1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0686c856aa6aac0c4498f936d7d6a02df690f614c03e4d906d1018062b5c5e2c" +checksum = "fdd1d3c0c2f5833f22386f252fe8ed005c7f59fdcddeef025c01b4c3b9fd9ac3" dependencies = [ "once_cell", "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -1613,7 +1601,7 @@ dependencies = [ "bls", "context_deserialize", "eth2", - "ethereum_ssz", + "ethereum_ssz 0.10.0", "lighthouse_version", "mockito", "reqwest", @@ -1625,9 +1613,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.19.1" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "byte-slice-cast" @@ -1643,13 +1631,33 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.11.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" dependencies = [ "serde", ] +[[package]] +name = "bzip2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" +dependencies = [ + "bzip2-sys", + "libc", +] + +[[package]] +name = "bzip2-sys" +version = "0.1.13+1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225bff33b2141874fe80d71e07d6eec4f85c5c216453dd96388240f96e1acc14" +dependencies = [ + "cc", + "pkg-config", +] + [[package]] name = "c-kzg" version = "2.1.5" @@ -1667,9 +1675,9 @@ dependencies = [ [[package]] name = "camino" -version = "1.2.2" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" +checksum = "276a59bf2b2c967788139340c9f0c5b12d7fd6630315c15c217e559de85d2609" dependencies = [ "serde_core", ] @@ -1703,20 +1711,11 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" -[[package]] -name = "cbc" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" -dependencies = [ - "cipher", -] - [[package]] name = "cc" -version = "1.2.49" +version = "1.2.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90583009037521a116abf44494efecd645ba48b6622457080f080b85544e2215" +checksum = "b97463e1064cb1b1c1384ad0a0b9c8abd0988e2a91f52606c80ef14aadb63e36" dependencies = [ "find-msvc-tools", "jobserver", @@ -1752,7 +1751,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" dependencies = [ "cfg-if", - "cipher", + "cipher 0.4.4", "cpufeatures", ] @@ -1764,7 +1763,7 @@ checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" dependencies = [ "aead", "chacha20", - "cipher", + "cipher 0.4.4", "poly1305", "zeroize", ] @@ -1810,6 +1809,15 @@ dependencies = [ "half", ] +[[package]] +name = "cipher" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" +dependencies = [ + "generic-array", +] + [[package]] name = "cipher" version = "0.4.4" @@ -1851,7 +1859,7 @@ dependencies = [ "anstream", "anstyle", "clap_lex", - "strsim", + "strsim 0.11.1", "terminal_size", ] @@ -1864,7 +1872,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -1881,7 +1889,7 @@ dependencies = [ "clap", "dirs", "eth2_network_config", - "ethereum_ssz", + "ethereum_ssz 0.10.0", "hex", "serde", "serde_json", @@ -1900,7 +1908,7 @@ dependencies = [ "environment", "eth2", "eth2_config", - "ethereum_ssz", + "ethereum_ssz 0.10.0", "execution_layer", "futures", "genesis", @@ -1934,25 +1942,13 @@ dependencies = [ [[package]] name = "cmake" -version = "0.1.57" +version = "0.1.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d" +checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" dependencies = [ "cc", ] -[[package]] -name = "cms" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b77c319abfd5219629c45c34c89ba945ed3c5e49fcde9d16b6c3885f118a730" -dependencies = [ - "const-oid", - "der", - "spki", - "x509-cert", -] - [[package]] name = "colorchoice" version = "1.0.4" @@ -1970,9 +1966,9 @@ dependencies = [ [[package]] name = "compare_fields" -version = "0.1.1" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f45d0b4d61b582303179fb7a1a142bc9d647b7583db3b0d5f25a21d286fab9" +checksum = "05162add7c8618791829528194a271dca93f69194d35b19db1ca7fbfb8275278" dependencies = [ "compare_fields_derive", "itertools 0.14.0", @@ -1980,12 +1976,12 @@ dependencies = [ [[package]] name = "compare_fields_derive" -version = "0.1.1" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92ff1dbbda10d495b2c92749c002b2025e0be98f42d1741ecc9ff820d2f04dce" +checksum = "5f5ee468b2e568b668e2a686112935e7bbe9a81bf4fa6b9f6fc3410ea45fb7ce" dependencies = [ "quote", - "syn 2.0.111", + "syn 1.0.109", ] [[package]] @@ -2080,11 +2076,17 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + [[package]] name = "context_deserialize" -version = "0.2.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c523eea4af094b5970c321f4604abc42c5549d3cbae332e98325403fbbdbf70" +checksum = "5c5f9ea0a0ae2de4943f5ca71590b6dbd0b952475f0a0cafb30a470cec78c8b9" dependencies = [ "context_deserialize_derive", "serde", @@ -2092,12 +2094,12 @@ dependencies = [ [[package]] name = "context_deserialize_derive" -version = "0.2.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b7bf98c48ffa511b14bb3c76202c24a8742cea1efa9570391c5d41373419a09" +checksum = "5c57b2db1e4e3ed804dcc49894a144b68fe6c754b8f545eb1dda7ad3c7dbe7e6" dependencies = [ "quote", - "syn 2.0.111", + "syn 1.0.109", ] [[package]] @@ -2106,15 +2108,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" -[[package]] -name = "convert_case" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" -dependencies = [ - "unicode-segmentation", -] - [[package]] name = "core-foundation" version = "0.9.4" @@ -2161,9 +2154,9 @@ dependencies = [ [[package]] name = "crc" -version = "3.4.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" +checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" dependencies = [ "crc-catalog", ] @@ -2185,24 +2178,25 @@ dependencies = [ [[package]] name = "criterion" -version = "0.8.2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "950046b2aa2492f9a536f5f4f9a3de7b9e2476e575e05bd6c333371add4d98f3" +checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" dependencies = [ - "alloca", "anes", "cast", "ciborium", "clap", "criterion-plot", - "itertools 0.13.0", + "is-terminal", + "itertools 0.10.5", "num-traits", + "once_cell", "oorandom", - "page_size", "plotters", "rayon", "regex", "serde", + "serde_derive", "serde_json", "tinytemplate", "walkdir", @@ -2210,12 +2204,12 @@ dependencies = [ [[package]] name = "criterion-plot" -version = "0.8.2" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8d80a2f4f5b554395e47b5d8305bc3d27813bacb73493eb1001e8f76dae29ea" +checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" dependencies = [ "cast", - "itertools 0.13.0", + "itertools 0.10.5", ] [[package]] @@ -2287,13 +2281,32 @@ dependencies = [ "typenum", ] +[[package]] +name = "crypto-mac" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25fab6889090c8133f3deb8f73ba3c65a7f456f66436fc012a1b1e272b1e103e" +dependencies = [ + "generic-array", + "subtle", +] + +[[package]] +name = "ctr" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "049bb91fb4aaf0e3c7efa6cd5ef877dbbbd15b39dad06d9948de4ec8a75761ea" +dependencies = [ + "cipher 0.3.0", +] + [[package]] name = "ctr" version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" dependencies = [ - "cipher", + "cipher 0.4.4", ] [[package]] @@ -2331,7 +2344,27 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", +] + +[[package]] +name = "darling" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" +dependencies = [ + "darling_core 0.13.4", + "darling_macro 0.13.4", +] + +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core 0.20.11", + "darling_macro 0.20.11", ] [[package]] @@ -2345,63 +2378,79 @@ dependencies = [ ] [[package]] -name = "darling" -version = "0.23.0" +name = "darling_core" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" dependencies = [ - "darling_core 0.23.0", - "darling_macro 0.23.0", + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.10.0", + "syn 1.0.109", ] [[package]] name = "darling_core" -version = "0.21.3" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "serde", - "strsim", - "syn 2.0.111", + "strsim 0.11.1", + "syn 2.0.110", ] [[package]] name = "darling_core" -version = "0.23.0" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" dependencies = [ + "fnv", "ident_case", "proc-macro2", "quote", - "strsim", - "syn 2.0.111", + "serde", + "strsim 0.11.1", + "syn 2.0.110", ] [[package]] name = "darling_macro" -version = "0.21.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" +checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" dependencies = [ - "darling_core 0.21.3", + "darling_core 0.13.4", "quote", - "syn 2.0.111", + "syn 1.0.109", ] [[package]] name = "darling_macro" -version = "0.23.0" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core 0.20.11", + "quote", + "syn 2.0.110", +] + +[[package]] +name = "darling_macro" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ - "darling_core 0.23.0", + "darling_core 0.21.3", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -2461,7 +2510,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d162beedaa69905488a8da94f5ac3edb4dd4788b732fadb7bd120b2625c1976" dependencies = [ "data-encoding", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -2506,11 +2555,11 @@ dependencies = [ "alloy-json-abi", "alloy-primitives", "bls", - "ethereum_ssz", + "ethereum_ssz 0.10.0", "hex", "reqwest", "serde_json", - "sha2", + "sha2 0.9.9", "tree_hash", "types", ] @@ -2522,9 +2571,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" dependencies = [ "const-oid", - "der_derive", - "flagset", - "pem-rfc7468", "zeroize", ] @@ -2542,17 +2588,6 @@ dependencies = [ "rusticata-macros", ] -[[package]] -name = "der_derive" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8034092389675178f570469e6c3b0465d3d30b4505c294a6550db47f3c17ad18" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - [[package]] name = "deranged" version = "0.5.5" @@ -2582,7 +2617,7 @@ checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -2591,45 +2626,34 @@ version = "0.99.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" dependencies = [ - "convert_case 0.4.0", + "convert_case", "proc-macro2", "quote", "rustc_version 0.4.1", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] name = "derive_more" -version = "2.1.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10b768e943bed7bf2cab53df09f4bc34bfd217cdb57d971e769874c9a6710618" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" dependencies = [ "derive_more-impl", ] [[package]] name = "derive_more-impl" -version = "2.1.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d286bfdaf75e988b4a78e013ecd79c581e06399ab53fbacd2d916c2f904f30b" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" dependencies = [ - "convert_case 0.10.0", "proc-macro2", "quote", - "rustc_version 0.4.1", - "syn 2.0.111", + "syn 2.0.110", "unicode-xid", ] -[[package]] -name = "des" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffdd80ce8ce993de27e9f063a444a4d53ce8e8db4c1f00cc03af5ad5a9867a1e" -dependencies = [ - "cipher", -] - [[package]] name = "digest" version = "0.9.0" @@ -2645,7 +2669,7 @@ version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", + "block-buffer 0.10.4", "const-oid", "crypto-common", "subtle", @@ -2686,11 +2710,11 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f170f4f6ed0e1df52bf43b403899f0081917ecf1500bfe312505cc3b515a8899" dependencies = [ - "aes", + "aes 0.8.4", "aes-gcm", "alloy-rlp", "arrayvec", - "ctr", + "ctr 0.9.2", "delay_map", "enr", "fnv", @@ -2733,7 +2757,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -2814,7 +2838,7 @@ dependencies = [ "ed25519", "rand_core 0.6.4", "serde", - "sha2", + "sha2 0.10.9", "subtle", "zeroize", ] @@ -2828,7 +2852,7 @@ dependencies = [ "enum-ordinalize", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -2842,8 +2866,8 @@ dependencies = [ "context_deserialize", "educe", "eth2_network_config", - "ethereum_ssz", - "ethereum_ssz_derive", + "ethereum_ssz 0.10.0", + "ethereum_ssz_derive 0.10.0", "execution_layer", "fork_choice", "fs2", @@ -2882,7 +2906,7 @@ dependencies = [ "itertools 0.14.0", "serde", "serde_json", - "sha2", + "sha2 0.10.9", ] [[package]] @@ -2947,7 +2971,7 @@ dependencies = [ "ekzg-bls12-381", "ekzg-maybe-rayon", "ekzg-polynomial", - "sha2", + "sha2 0.10.9", ] [[package]] @@ -3051,7 +3075,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -3071,7 +3095,7 @@ checksum = "8ca9601fb2d62598ee17836250842873a413586e5d7ed88b356e38ddbb0ec631" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -3122,8 +3146,8 @@ dependencies = [ "eip_3076", "eth2_keystore", "ethereum_serde_utils", - "ethereum_ssz", - "ethereum_ssz_derive", + "ethereum_ssz 0.10.0", + "ethereum_ssz_derive 0.10.0", "futures", "futures-util", "mediatype", @@ -3172,7 +3196,7 @@ dependencies = [ "hex", "num-bigint-dig", "ring", - "sha2", + "sha2 0.9.9", "zeroize", ] @@ -3180,20 +3204,18 @@ dependencies = [ name = "eth2_keystore" version = "0.1.0" dependencies = [ - "aes", + "aes 0.7.5", "bls", - "cipher", - "ctr", "eth2_key_derivation", "hex", - "hmac", - "pbkdf2", + "hmac 0.11.0", + "pbkdf2 0.8.0", "rand 0.9.2", "scrypt", "serde", "serde_json", "serde_repr", - "sha2", + "sha2 0.9.9", "tempfile", "unicode-normalization", "uuid 0.8.2", @@ -3207,14 +3229,14 @@ dependencies = [ "bytes", "discv5", "eth2_config", - "ethereum_ssz", + "ethereum_ssz 0.10.0", "fixed_bytes", "kzg", "pretty_reqwest_error", "reqwest", "sensitive_url", "serde_yaml", - "sha2", + "sha2 0.9.9", "tempfile", "tokio", "tracing", @@ -3256,7 +3278,7 @@ checksum = "5aa93f58bb1eb3d1e556e4f408ef1dac130bad01ac37db4e7ade45de40d1c86a" dependencies = [ "cpufeatures", "ring", - "sha2", + "sha2 0.10.9", ] [[package]] @@ -3274,15 +3296,30 @@ dependencies = [ [[package]] name = "ethereum_ssz" -version = "0.10.1" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dcddb2554d19cde19b099fadddde576929d7a4d0c1cd3512d1fd95cf174375c" +dependencies = [ + "alloy-primitives", + "ethereum_serde_utils", + "itertools 0.13.0", + "serde", + "serde_derive", + "smallvec", + "typenum", +] + +[[package]] +name = "ethereum_ssz" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2128a84f7a3850d54ee343334e3392cca61f9f6aa9441eec481b9394b43c238b" +checksum = "7e8cd8c4f47dfb947dbfe3cdf2945ae1da808dbedc592668658e827a12659ba1" dependencies = [ "alloy-primitives", "arbitrary", "context_deserialize", "ethereum_serde_utils", - "itertools 0.14.0", + "itertools 0.13.0", "serde", "serde_derive", "smallvec", @@ -3291,14 +3328,26 @@ dependencies = [ [[package]] name = "ethereum_ssz_derive" -version = "0.10.1" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a657b6b3b7e153637dc6bdc6566ad9279d9ee11a15b12cfb24a2e04360637e9f" +dependencies = [ + "darling 0.20.11", + "proc-macro2", + "quote", + "syn 2.0.110", +] + +[[package]] +name = "ethereum_ssz_derive" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd596f91cff004fc8d02be44c21c0f9b93140a04b66027ae052f5f8e05b48eba" +checksum = "78d247bc40823c365a62e572441a8f8b12df03f171713f06bc76180fcd56ab71" dependencies = [ - "darling 0.23.0", + "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -3382,7 +3431,7 @@ dependencies = [ "bytes", "eth2", "ethereum_serde_utils", - "ethereum_ssz", + "ethereum_ssz 0.10.0", "fixed_bytes", "fork_choice", "hash-db", @@ -3402,7 +3451,7 @@ dependencies = [ "sensitive_url", "serde", "serde_json", - "sha2", + "sha2 0.9.9", "slot_clock", "ssz_types", "state_processing", @@ -3539,12 +3588,6 @@ dependencies = [ "safe_arith", ] -[[package]] -name = "flagset" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7ac824320a75a52197e8f2d787f6a38b6718bb6897a35142d749af3c0e8f4fe" - [[package]] name = "flate2" version = "1.1.5" @@ -3552,7 +3595,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" dependencies = [ "crc32fast", - "libz-rs-sys", "libz-sys", "miniz_oxide", ] @@ -3575,13 +3617,28 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "fork_choice" version = "0.1.0" dependencies = [ "beacon_chain", - "ethereum_ssz", - "ethereum_ssz_derive", + "ethereum_ssz 0.10.0", + "ethereum_ssz_derive 0.10.0", "fixed_bytes", "logging", "metrics", @@ -3702,7 +3759,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -3775,7 +3832,7 @@ version = "0.2.0" dependencies = [ "bls", "ethereum_hashing", - "ethereum_ssz", + "ethereum_ssz 0.10.0", "int_to_bytes", "merkle_proof", "rayon", @@ -3865,7 +3922,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.12.1", + "indexmap 2.12.0", "slab", "tokio", "tokio-util", @@ -3883,8 +3940,8 @@ dependencies = [ "fnv", "futures-core", "futures-sink", - "http 1.4.0", - "indexmap 2.12.1", + "http 1.3.1", + "indexmap 2.12.0", "slab", "tokio", "tokio-util", @@ -3946,13 +4003,12 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.16.1" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" dependencies = [ "foldhash 0.2.0", "serde", - "serde_core", ] [[package]] @@ -4035,6 +4091,12 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + [[package]] name = "hermit-abi" version = "0.5.2" @@ -4049,9 +4111,9 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "hex-conservative" -version = "0.2.2" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda06d18ac606267c40c04e41b9947729bf8b9efe74bd4e82b61a5f26a510b9f" +checksum = "5313b072ce3c597065a808dbf612c4c8e8590bdbf8b579508bf7a762c5eae6cd" dependencies = [ "arrayvec", ] @@ -4115,7 +4177,17 @@ version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" dependencies = [ - "hmac", + "hmac 0.12.1", +] + +[[package]] +name = "hmac" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" +dependencies = [ + "crypto-mac", + "digest 0.9.0", ] [[package]] @@ -4127,6 +4199,15 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "home" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" +dependencies = [ + "windows-sys 0.61.2", +] + [[package]] name = "http" version = "0.2.12" @@ -4140,11 +4221,12 @@ dependencies = [ [[package]] name = "http" -version = "1.4.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" dependencies = [ "bytes", + "fnv", "itoa", ] @@ -4166,7 +4248,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.4.0", + "http 1.3.1", ] [[package]] @@ -4177,7 +4259,7 @@ checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", "futures-core", - "http 1.4.0", + "http 1.3.1", "http-body 1.0.1", "pin-project-lite", ] @@ -4196,7 +4278,7 @@ dependencies = [ "either", "eth2", "ethereum_serde_utils", - "ethereum_ssz", + "ethereum_ssz 0.10.0", "execution_layer", "fixed_bytes", "futures", @@ -4204,6 +4286,7 @@ dependencies = [ "health_metrics", "hex", "lighthouse_network", + "lighthouse_tracing", "lighthouse_version", "logging", "lru 0.12.5", @@ -4309,7 +4392,7 @@ dependencies = [ "futures-channel", "futures-core", "h2 0.4.12", - "http 1.4.0", + "http 1.3.1", "http-body 1.0.1", "httparse", "httpdate", @@ -4327,7 +4410,7 @@ version = "0.27.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ - "http 1.4.0", + "http 1.3.1", "hyper 1.8.1", "hyper-util", "rustls 0.23.35", @@ -4351,18 +4434,34 @@ dependencies = [ "tower-service", ] +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper 1.8.1", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + [[package]] name = "hyper-util" -version = "0.1.19" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f" +checksum = "52e9a2a24dc5c6821e71a7030e1e14b7b632acac55c40e9d2e082c621261bb56" dependencies = [ "base64 0.22.1", "bytes", "futures-channel", "futures-core", "futures-util", - "http 1.4.0", + "http 1.3.1", "http-body 1.0.1", "hyper 1.8.1", "ipnet", @@ -4447,9 +4546,9 @@ checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" [[package]] name = "icu_properties" -version = "2.1.2" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" dependencies = [ "icu_collections", "icu_locale_core", @@ -4461,9 +4560,9 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.1.2" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" +checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" [[package]] name = "icu_provider" @@ -4517,16 +4616,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "if-addrs" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf39cc0423ee66021dc5eccface85580e4a001e0c5288bae8bea7ecb69225e90" -dependencies = [ - "libc", - "windows-sys 0.59.0", -] - [[package]] name = "if-watch" version = "3.2.1" @@ -4537,7 +4626,7 @@ dependencies = [ "core-foundation 0.9.4", "fnv", "futures", - "if-addrs 0.10.2", + "if-addrs", "ipnet", "log", "netlink-packet-core", @@ -4560,7 +4649,7 @@ dependencies = [ "attohttpc", "bytes", "futures", - "http 1.4.0", + "http 1.3.1", "http-body-util", "hyper 1.8.1", "hyper-util", @@ -4588,7 +4677,7 @@ checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -4604,13 +4693,13 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.12.1" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" +checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" dependencies = [ "arbitrary", "equivalent", - "hashbrown 0.16.1", + "hashbrown 0.16.0", "serde", "serde_core", ] @@ -4626,9 +4715,7 @@ dependencies = [ "filesystem", "lockfile", "metrics", - "p12-keystore", "parking_lot", - "pem", "rand 0.9.2", "reqwest", "serde", @@ -4649,7 +4736,6 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" dependencies = [ - "block-padding", "generic-array", ] @@ -4671,6 +4757,17 @@ dependencies = [ "num-traits", ] +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "windows-sys 0.48.0", +] + [[package]] name = "ipconfig" version = "0.3.2" @@ -4699,6 +4796,17 @@ dependencies = [ "serde", ] +[[package]] +name = "is-terminal" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" +dependencies = [ + "hermit-abi 0.5.2", + "libc", + "windows-sys 0.61.2", +] + [[package]] name = "is_terminal_polyfill" version = "1.70.2" @@ -4759,9 +4867,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.83" +version = "0.3.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" +checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" dependencies = [ "once_cell", "wasm-bindgen", @@ -4793,7 +4901,7 @@ dependencies = [ "elliptic-curve", "once_cell", "serdect", - "sha2", + "sha2 0.10.9", "signature", ] @@ -4836,8 +4944,8 @@ dependencies = [ "educe", "ethereum_hashing", "ethereum_serde_utils", - "ethereum_ssz", - "ethereum_ssz_derive", + "ethereum_ssz 0.10.0", + "ethereum_ssz_derive 0.10.0", "hex", "rayon", "rust_eth_kzg", @@ -4864,7 +4972,7 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "lcli" -version = "8.1.0" +version = "8.0.1" dependencies = [ "account_utils", "beacon_chain", @@ -4877,7 +4985,7 @@ dependencies = [ "eth2_network_config", "eth2_wallet", "ethereum_hashing", - "ethereum_ssz", + "ethereum_ssz 0.10.0", "execution_layer", "fixed_bytes", "hex", @@ -4925,9 +5033,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.178" +version = "0.2.177" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" [[package]] name = "libloading" @@ -4962,8 +5070,9 @@ dependencies = [ [[package]] name = "libp2p" -version = "0.56.1" -source = "git+https://github.com/libp2p/rust-libp2p.git#5e3519fb66b92c7f7c0dc744ab360fd8b669fe54" +version = "0.56.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce71348bf5838e46449ae240631117b487073d5f347c06d434caddcb91dceb5a" dependencies = [ "bytes", "either", @@ -4974,12 +5083,12 @@ dependencies = [ "libp2p-connection-limits", "libp2p-core", "libp2p-dns", - "libp2p-gossipsub", "libp2p-identify", "libp2p-identity", "libp2p-mdns", "libp2p-metrics", "libp2p-noise", + "libp2p-plaintext", "libp2p-quic", "libp2p-swarm", "libp2p-tcp", @@ -4994,7 +5103,8 @@ dependencies = [ [[package]] name = "libp2p-allow-block-list" version = "0.6.0" -source = "git+https://github.com/libp2p/rust-libp2p.git#5e3519fb66b92c7f7c0dc744ab360fd8b669fe54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d16ccf824ee859ca83df301e1c0205270206223fd4b1f2e512a693e1912a8f4a" dependencies = [ "libp2p-core", "libp2p-identity", @@ -5004,7 +5114,8 @@ dependencies = [ [[package]] name = "libp2p-connection-limits" version = "0.6.0" -source = "git+https://github.com/libp2p/rust-libp2p.git#5e3519fb66b92c7f7c0dc744ab360fd8b669fe54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18b8b607cf3bfa2f8c57db9c7d8569a315d5cc0a282e6bfd5ebfc0a9840b2a0" dependencies = [ "libp2p-core", "libp2p-identity", @@ -5013,8 +5124,9 @@ dependencies = [ [[package]] name = "libp2p-core" -version = "0.43.2" -source = "git+https://github.com/libp2p/rust-libp2p.git#5e3519fb66b92c7f7c0dc744ab360fd8b669fe54" +version = "0.43.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d28e2d2def7c344170f5c6450c0dbe3dfef655610dbfde2f6ac28a527abbe36" dependencies = [ "either", "fnv", @@ -5031,14 +5143,15 @@ dependencies = [ "rw-stream-sink", "thiserror 2.0.17", "tracing", - "unsigned-varint", + "unsigned-varint 0.8.0", "web-time", ] [[package]] name = "libp2p-dns" version = "0.44.0" -source = "git+https://github.com/libp2p/rust-libp2p.git#5e3519fb66b92c7f7c0dc744ab360fd8b669fe54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b770c1c8476736ca98c578cba4b505104ff8e842c2876b528925f9766379f9a" dependencies = [ "async-trait", "futures", @@ -5053,7 +5166,7 @@ dependencies = [ [[package]] name = "libp2p-gossipsub" version = "0.50.0" -source = "git+https://github.com/libp2p/rust-libp2p.git#5e3519fb66b92c7f7c0dc744ab360fd8b669fe54" +source = "git+https://github.com/sigp/rust-libp2p.git?rev=5acdf89a65d64098f9346efa5769e57bcd19dea9#5acdf89a65d64098f9346efa5769e57bcd19dea9" dependencies = [ "async-channel 2.5.0", "asynchronous-codec", @@ -5075,7 +5188,7 @@ dependencies = [ "quick-protobuf-codec", "rand 0.8.5", "regex", - "sha2", + "sha2 0.10.9", "tracing", "web-time", ] @@ -5083,7 +5196,8 @@ dependencies = [ [[package]] name = "libp2p-identify" version = "0.47.0" -source = "git+https://github.com/libp2p/rust-libp2p.git#5e3519fb66b92c7f7c0dc744ab360fd8b669fe54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ab792a8b68fdef443a62155b01970c81c3aadab5e659621b063ef252a8e65e8" dependencies = [ "asynchronous-codec", "either", @@ -5102,9 +5216,9 @@ dependencies = [ [[package]] name = "libp2p-identity" -version = "0.2.13" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0c7892c221730ba55f7196e98b0b8ba5e04b4155651736036628e9f73ed6fc3" +checksum = "3104e13b51e4711ff5738caa1fb54467c8604c2e94d607e27745bcf709068774" dependencies = [ "asn1_der", "bs58 0.5.1", @@ -5114,7 +5228,7 @@ dependencies = [ "multihash", "quick-protobuf", "rand 0.8.5", - "sha2", + "sha2 0.10.9", "thiserror 2.0.17", "tracing", "zeroize", @@ -5123,7 +5237,8 @@ dependencies = [ [[package]] name = "libp2p-mdns" version = "0.48.0" -source = "git+https://github.com/libp2p/rust-libp2p.git#5e3519fb66b92c7f7c0dc744ab360fd8b669fe54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c66872d0f1ffcded2788683f76931be1c52e27f343edb93bc6d0bcd8887be443" dependencies = [ "futures", "hickory-proto", @@ -5133,19 +5248,19 @@ dependencies = [ "libp2p-swarm", "rand 0.8.5", "smallvec", - "socket2 0.6.1", + "socket2 0.5.10", "tokio", "tracing", ] [[package]] name = "libp2p-metrics" -version = "0.17.1" -source = "git+https://github.com/libp2p/rust-libp2p.git#5e3519fb66b92c7f7c0dc744ab360fd8b669fe54" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "805a555148522cb3414493a5153451910cb1a146c53ffbf4385708349baf62b7" dependencies = [ "futures", "libp2p-core", - "libp2p-gossipsub", "libp2p-identify", "libp2p-identity", "libp2p-swarm", @@ -5157,7 +5272,8 @@ dependencies = [ [[package]] name = "libp2p-mplex" version = "0.43.1" -source = "git+https://github.com/libp2p/rust-libp2p.git#5e3519fb66b92c7f7c0dc744ab360fd8b669fe54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a4019ba30c4e42b776113e9778071691fe3f34bf23b6b3bf0dfcf29d801f3d" dependencies = [ "asynchronous-codec", "bytes", @@ -5169,13 +5285,14 @@ dependencies = [ "rand 0.8.5", "smallvec", "tracing", - "unsigned-varint", + "unsigned-varint 0.8.0", ] [[package]] name = "libp2p-noise" version = "0.46.1" -source = "git+https://github.com/libp2p/rust-libp2p.git#5e3519fb66b92c7f7c0dc744ab360fd8b669fe54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc73eacbe6462a0eb92a6527cac6e63f02026e5407f8831bde8293f19217bfbf" dependencies = [ "asynchronous-codec", "bytes", @@ -5194,10 +5311,27 @@ dependencies = [ "zeroize", ] +[[package]] +name = "libp2p-plaintext" +version = "0.43.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e659439578fc6d305da8303834beb9d62f155f40e7f5b9d81c9f2b2c69d1926" +dependencies = [ + "asynchronous-codec", + "bytes", + "futures", + "libp2p-core", + "libp2p-identity", + "quick-protobuf", + "quick-protobuf-codec", + "tracing", +] + [[package]] name = "libp2p-quic" version = "0.13.0" -source = "git+https://github.com/libp2p/rust-libp2p.git#5e3519fb66b92c7f7c0dc744ab360fd8b669fe54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8dc448b2de9f4745784e3751fe8bc6c473d01b8317edd5ababcb0dec803d843f" dependencies = [ "futures", "futures-timer", @@ -5209,7 +5343,7 @@ dependencies = [ "rand 0.8.5", "ring", "rustls 0.23.35", - "socket2 0.6.1", + "socket2 0.5.10", "thiserror 2.0.17", "tokio", "tracing", @@ -5218,16 +5352,17 @@ dependencies = [ [[package]] name = "libp2p-swarm" version = "0.47.0" -source = "git+https://github.com/libp2p/rust-libp2p.git#5e3519fb66b92c7f7c0dc744ab360fd8b669fe54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aa762e5215919a34e31c35d4b18bf2e18566ecab7f8a3d39535f4a3068f8b62" dependencies = [ "either", "fnv", "futures", "futures-timer", - "hashlink 0.10.0", "libp2p-core", "libp2p-identity", "libp2p-swarm-derive", + "lru 0.12.5", "multistream-select", "rand 0.8.5", "smallvec", @@ -5239,24 +5374,26 @@ dependencies = [ [[package]] name = "libp2p-swarm-derive" version = "0.35.1" -source = "git+https://github.com/libp2p/rust-libp2p.git#5e3519fb66b92c7f7c0dc744ab360fd8b669fe54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd297cf53f0cb3dee4d2620bb319ae47ef27c702684309f682bdb7e55a18ae9c" dependencies = [ "heck", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] name = "libp2p-tcp" -version = "0.44.1" -source = "git+https://github.com/libp2p/rust-libp2p.git#5e3519fb66b92c7f7c0dc744ab360fd8b669fe54" +version = "0.44.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65b4e030c52c46c8d01559b2b8ca9b7c4185f10576016853129ca1fe5cd1a644" dependencies = [ "futures", "futures-timer", "if-watch", "libc", "libp2p-core", - "socket2 0.6.1", + "socket2 0.5.10", "tokio", "tracing", ] @@ -5264,7 +5401,8 @@ dependencies = [ [[package]] name = "libp2p-tls" version = "0.6.2" -source = "git+https://github.com/libp2p/rust-libp2p.git#5e3519fb66b92c7f7c0dc744ab360fd8b669fe54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96ff65a82e35375cbc31ebb99cacbbf28cb6c4fefe26bf13756ddcf708d40080" dependencies = [ "futures", "futures-rustls", @@ -5281,8 +5419,9 @@ dependencies = [ [[package]] name = "libp2p-upnp" -version = "0.6.0" -source = "git+https://github.com/libp2p/rust-libp2p.git#5e3519fb66b92c7f7c0dc744ab360fd8b669fe54" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4757e65fe69399c1a243bbb90ec1ae5a2114b907467bf09f3575e899815bb8d3" dependencies = [ "futures", "futures-timer", @@ -5296,7 +5435,8 @@ dependencies = [ [[package]] name = "libp2p-yamux" version = "0.47.0" -source = "git+https://github.com/libp2p/rust-libp2p.git#5e3519fb66b92c7f7c0dc744ab360fd8b669fe54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f15df094914eb4af272acf9adaa9e287baa269943f32ea348ba29cfb9bfc60d8" dependencies = [ "either", "futures", @@ -5309,9 +5449,9 @@ dependencies = [ [[package]] name = "libredox" -version = "0.1.11" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df15f6eac291ed1cf25865b1ee60399f57e7c227e7f51bdbd4c5270396a9ed50" +checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" dependencies = [ "bitflags 2.10.0", "libc", @@ -5328,15 +5468,6 @@ dependencies = [ "vcpkg", ] -[[package]] -name = "libz-rs-sys" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15413ef615ad868d4d65dce091cb233b229419c7c0c4bcaa746c0901c49ff39c" -dependencies = [ - "zlib-rs", -] - [[package]] name = "libz-sys" version = "1.1.23" @@ -5350,7 +5481,7 @@ dependencies = [ [[package]] name = "lighthouse" -version = "8.1.0" +version = "8.0.1" dependencies = [ "account_manager", "account_utils", @@ -5371,6 +5502,7 @@ dependencies = [ "futures", "initialized_validators", "lighthouse_network", + "lighthouse_tracing", "lighthouse_version", "logging", "malloc_utils", @@ -5391,7 +5523,6 @@ dependencies = [ "tracing", "tracing-opentelemetry", "tracing-subscriber", - "tracing_samplers", "types", "validator_client", "validator_dir", @@ -5414,17 +5545,18 @@ dependencies = [ "discv5", "either", "eth2", - "ethereum_ssz", - "ethereum_ssz_derive", + "ethereum_ssz 0.10.0", + "ethereum_ssz_derive 0.10.0", "fixed_bytes", "fnv", "futures", "hex", - "if-addrs 0.14.0", - "itertools 0.14.0", + "itertools 0.10.5", "libp2p", + "libp2p-gossipsub", "libp2p-mplex", "lighthouse_version", + "local-ip-address", "logging", "lru 0.12.5", "lru_cache", @@ -5436,7 +5568,7 @@ dependencies = [ "rand 0.9.2", "regex", "serde", - "sha2", + "sha2 0.9.9", "smallvec", "snap", "ssz_types", @@ -5450,9 +5582,13 @@ dependencies = [ "tracing-subscriber", "typenum", "types", - "unsigned-varint", + "unsigned-varint 0.8.0", ] +[[package]] +name = "lighthouse_tracing" +version = "0.1.0" + [[package]] name = "lighthouse_validator_store" version = "0.1.0" @@ -5482,11 +5618,23 @@ dependencies = [ [[package]] name = "lighthouse_version" -version = "8.1.0" +version = "8.0.1" dependencies = [ "regex", ] +[[package]] +name = "linux-raw-sys" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + [[package]] name = "linux-raw-sys" version = "0.11.0" @@ -5520,6 +5668,18 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "local-ip-address" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "656b3b27f8893f7bbf9485148ff9a65f019e3f33bd5cdc87c83cab16b3fd9ec8" +dependencies = [ + "libc", + "neli", + "thiserror 2.0.17", + "windows-sys 0.59.0", +] + [[package]] name = "lock_api" version = "0.4.14" @@ -5539,9 +5699,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.29" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] name = "logging" @@ -5622,7 +5782,7 @@ checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -5644,13 +5804,13 @@ checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" [[package]] name = "match-lookup" -version = "0.1.2" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "757aee279b8bdbb9f9e676796fd459e4207a1f986e87886700abf589f5abf771" +checksum = "1265724d8cb29dbbc2b0f06fffb8bf1a8c0cf73a78eede9ba73a4a66c52a981e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 1.0.109", ] [[package]] @@ -5679,7 +5839,7 @@ name = "mdbx-sys" version = "0.11.6-4" source = "git+https://github.com/sigp/libmdbx-rs?rev=e6ff4b9377c1619bcf0bfdf52bee5a980a432a1a#e6ff4b9377c1619bcf0bfdf52bee5a980a432a1a" dependencies = [ - "bindgen 0.69.5", + "bindgen", "cc", "cmake", "libc", @@ -5719,25 +5879,25 @@ dependencies = [ [[package]] name = "metastruct" -version = "0.1.4" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "969a1be9bd80794bdf93b23ab552c2ec6f3e83b33164824553fd996cdad513b8" +checksum = "d74f54f231f9a18d77393ecc5cc7ab96709b2a61ee326c2b2b291009b0cc5a07" dependencies = [ "metastruct_macro", ] [[package]] name = "metastruct_macro" -version = "0.1.4" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de9164f767d73a507c19205868c84da411dc7795f4bdabf497d3dd93cfef9930" +checksum = "985e7225f3a4dfbec47a0c6a730a874185fda840d365d7bbd6ba199dd81796d5" dependencies = [ - "darling 0.23.0", - "itertools 0.14.0", + "darling 0.13.4", + "itertools 0.10.5", "proc-macro2", "quote", "smallvec", - "syn 2.0.111", + "syn 1.0.109", ] [[package]] @@ -5758,8 +5918,8 @@ dependencies = [ "context_deserialize", "educe", "ethereum_hashing", - "ethereum_ssz", - "ethereum_ssz_derive", + "ethereum_ssz 0.10.0", + "ethereum_ssz_derive 0.10.0", "itertools 0.13.0", "parking_lot", "rayon", @@ -5805,9 +5965,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.1.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" dependencies = [ "libc", "wasi", @@ -5843,7 +6003,7 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -5855,26 +6015,25 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] name = "mockito" -version = "1.7.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e0603425789b4a70fcc4ac4f5a46a566c116ee3e2a6b768dc623f7719c611de" +checksum = "7760e0e418d9b7e5777c0374009ca4c93861b9066f18cb334a20ce50ab63aa48" dependencies = [ "assert-json-diff", "bytes", "colored", - "futures-core", - "http 1.4.0", + "futures-util", + "http 1.3.1", "http-body 1.0.1", "http-body-util", "hyper 1.8.1", "hyper-util", "log", - "pin-project-lite", "rand 0.9.2", "regex", "serde_json", @@ -5898,7 +6057,7 @@ dependencies = [ "rustc_version 0.4.1", "smallvec", "tagptr", - "uuid 1.19.0", + "uuid 1.18.1", ] [[package]] @@ -5941,7 +6100,7 @@ dependencies = [ "percent-encoding", "serde", "static_assertions", - "unsigned-varint", + "unsigned-varint 0.8.0", "url", ] @@ -5964,20 +6123,63 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6b430e7953c29dd6a09afc29ff0bb69c6e306329ee6794700aee27b76a1aea8d" dependencies = [ "core2", - "unsigned-varint", + "unsigned-varint 0.8.0", ] [[package]] name = "multistream-select" version = "0.13.0" -source = "git+https://github.com/libp2p/rust-libp2p.git#5e3519fb66b92c7f7c0dc744ab360fd8b669fe54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea0df8e5eec2298a62b326ee4f0d7fe1a6b90a09dfcf9df37b38f947a8c42f19" dependencies = [ "bytes", "futures", + "log", "pin-project", "smallvec", - "tracing", - "unsigned-varint", + "unsigned-varint 0.7.2", +] + +[[package]] +name = "native-tls" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework 2.11.1", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "neli" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93062a0dce6da2517ea35f301dfc88184ce18d3601ec786a727a87bf535deca9" +dependencies = [ + "byteorder", + "libc", + "log", + "neli-proc-macros", +] + +[[package]] +name = "neli-proc-macros" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c8034b7fbb6f9455b2a96c19e6edf8dc9fc34c70449938d8ee3b4df363f61fe" +dependencies = [ + "either", + "proc-macro2", + "quote", + "serde", + "syn 1.0.109", ] [[package]] @@ -6059,7 +6261,7 @@ dependencies = [ "educe", "eth2", "eth2_network_config", - "ethereum_ssz", + "ethereum_ssz 0.10.0", "execution_layer", "fixed_bytes", "fnv", @@ -6067,11 +6269,12 @@ dependencies = [ "genesis", "hex", "igd-next", - "itertools 0.14.0", + "itertools 0.10.5", "k256", "kzg", - "libp2p", + "libp2p-gossipsub", "lighthouse_network", + "lighthouse_tracing", "logging", "lru_cache", "matches", @@ -6082,6 +6285,7 @@ dependencies = [ "rand 0.9.2", "rand_chacha 0.3.1", "rand_chacha 0.9.0", + "reth-era", "serde_json", "slot_clock", "smallvec", @@ -6226,9 +6430,9 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.2.0" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" [[package]] name = "num-integer" @@ -6266,7 +6470,7 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" dependencies = [ - "hermit-abi", + "hermit-abi 0.5.2", "libc", ] @@ -6288,7 +6492,7 @@ checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -6364,12 +6568,60 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" +[[package]] +name = "openssl" +version = "0.10.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" +dependencies = [ + "bitflags 2.10.0", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.110", +] + [[package]] name = "openssl-probe" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" +[[package]] +name = "openssl-src" +version = "300.5.4+3.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507b3792995dae9b0df8a1c1e3771e8418b7c2d9f0baeba32e6fe8b06c7cb72" +dependencies = [ + "cc", +] + +[[package]] +name = "openssl-sys" +version = "0.9.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" +dependencies = [ + "cc", + "libc", + "openssl-src", + "pkg-config", + "vcpkg", +] + [[package]] name = "opentelemetry" version = "0.30.0" @@ -6392,7 +6644,7 @@ checksum = "50f6639e842a97dbea8886e3439710ae463120091e2e064518ba8e716e6ac36d" dependencies = [ "async-trait", "bytes", - "http 1.4.0", + "http 1.3.1", "opentelemetry", "reqwest", ] @@ -6403,7 +6655,7 @@ version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dbee664a43e07615731afc539ca60c6d9f1a9425e25ca09c57bc36c87c55852b" dependencies = [ - "http 1.4.0", + "http 1.3.1", "opentelemetry", "opentelemetry-http", "opentelemetry-proto", @@ -6452,10 +6704,10 @@ dependencies = [ "bitvec", "bls", "educe", - "ethereum_ssz", - "ethereum_ssz_derive", + "ethereum_ssz 0.10.0", + "ethereum_ssz_derive 0.10.0", "fixed_bytes", - "itertools 0.14.0", + "itertools 0.10.5", "maplit", "metrics", "parking_lot", @@ -6470,39 +6722,6 @@ dependencies = [ "types", ] -[[package]] -name = "p12-keystore" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8d55319bae67f92141ce4da80c5392acd3d1323bd8312c1ffdfb018927d07d7" -dependencies = [ - "base64 0.22.1", - "cbc", - "cms", - "der", - "des", - "hex", - "hmac", - "pkcs12", - "pkcs5", - "rand 0.9.2", - "rc2", - "sha1", - "sha2", - "thiserror 2.0.17", - "x509-parser", -] - -[[package]] -name = "page_size" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d5b2194ed13191c1999ae0704b7839fb18384fa22e49b57eeaa97d79ce40da" -dependencies = [ - "libc", - "winapi", -] - [[package]] name = "pairing" version = "0.23.0" @@ -6537,7 +6756,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -6569,6 +6788,17 @@ dependencies = [ "windows-link", ] +[[package]] +name = "password-hash" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" +dependencies = [ + "base64ct", + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "paste" version = "1.0.15" @@ -6577,12 +6807,23 @@ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pbkdf2" -version = "0.12.2" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d95f5254224e617595d2cc3cc73ff0a5eaf2637519e25f03388154e9378b6ffa" +dependencies = [ + "crypto-mac", +] + +[[package]] +name = "pbkdf2" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" dependencies = [ "digest 0.10.7", - "hmac", + "hmac 0.12.1", + "password-hash", + "sha2 0.10.9", ] [[package]] @@ -6595,15 +6836,6 @@ dependencies = [ "serde_core", ] -[[package]] -name = "pem-rfc7468" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" -dependencies = [ - "base64ct", -] - [[package]] name = "percent-encoding" version = "2.3.2" @@ -6612,9 +6844,9 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pest" -version = "2.8.4" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbcfd20a6d4eeba40179f05735784ad32bdaef05ce8e8af05f180d45bb3e7e22" +checksum = "989e7521a040efde50c3ab6bbadafbe15ab6dc042686926be59ac35d74607df4" dependencies = [ "memchr", "ucd-trie", @@ -6637,7 +6869,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -6652,36 +6884,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" -[[package]] -name = "pkcs12" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "695b3df3d3cc1015f12d70235e35b6b79befc5fa7a9b95b951eab1dd07c9efc2" -dependencies = [ - "cms", - "const-oid", - "der", - "digest 0.10.7", - "spki", - "x509-cert", - "zeroize", -] - -[[package]] -name = "pkcs5" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e847e2c91a18bfa887dd028ec33f2fe6f25db77db3619024764914affe8b69a6" -dependencies = [ - "aes", - "cbc", - "der", - "pbkdf2", - "scrypt", - "sha2", - "spki", -] - [[package]] name = "pkcs8" version = "0.10.2" @@ -6740,9 +6942,9 @@ checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" dependencies = [ "cfg-if", "concurrent-queue", - "hermit-abi", + "hermit-abi 0.5.2", "pin-project-lite", - "rustix", + "rustix 1.1.2", "windows-sys 0.61.2", ] @@ -6840,7 +7042,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -6882,7 +7084,7 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -6896,23 +7098,17 @@ dependencies = [ [[package]] name = "procfs" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25485360a54d6861439d60facef26de713b1e126bf015ec8f98239467a2b82f7" -dependencies = [ - "bitflags 2.10.0", - "procfs-core", - "rustix", -] - -[[package]] -name = "procfs-core" -version = "0.18.0" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6401bf7b6af22f78b563665d15a22e9aef27775b79b149a66ca022468a4e405" +checksum = "943ca7f9f29bab5844ecd8fdb3992c5969b6622bb9609b9502fef9b4310e3f1f" dependencies = [ - "bitflags 2.10.0", + "bitflags 1.3.2", + "byteorder", + "chrono", + "flate2", "hex", + "lazy_static", + "rustix 0.36.17", ] [[package]] @@ -6931,9 +7127,9 @@ dependencies = [ [[package]] name = "prometheus-client" -version = "0.24.0" +version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4500adecd7af8e0e9f4dbce15cfee07ce913fbf6ad605cc468b83f2d531ee94" +checksum = "cf41c1a7c32ed72abe5082fb19505b969095c12da9f5732a4bc9878757fd087c" dependencies = [ "dtoa", "itoa", @@ -6943,13 +7139,13 @@ dependencies = [ [[package]] name = "prometheus-client-derive-encode" -version = "0.5.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9adf1691c04c0a5ff46ff8f262b58beb07b0dbb61f96f9f54f6cbd82106ed87f" +checksum = "440f724eba9f6996b75d63681b0a92b06947f1457076d503a4d2e2c8f56442b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -6979,7 +7175,7 @@ checksum = "095a99f75c69734802359b682be8daaf8980296731f6470434ea2c652af1dd30" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -7002,7 +7198,7 @@ dependencies = [ "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -7018,8 +7214,8 @@ dependencies = [ name = "proto_array" version = "0.2.0" dependencies = [ - "ethereum_ssz", - "ethereum_ssz_derive", + "ethereum_ssz 0.10.0", + "ethereum_ssz_derive 0.10.0", "fixed_bytes", "safe_arith", "serde", @@ -7064,13 +7260,14 @@ dependencies = [ [[package]] name = "quick-protobuf-codec" version = "0.3.1" -source = "git+https://github.com/libp2p/rust-libp2p.git#5e3519fb66b92c7f7c0dc744ab360fd8b669fe54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15a0580ab32b169745d7a39db2ba969226ca16738931be152a3209b409de2474" dependencies = [ "asynchronous-codec", "bytes", "quick-protobuf", - "thiserror 2.0.17", - "unsigned-varint", + "thiserror 1.0.69", + "unsigned-varint 0.8.0", ] [[package]] @@ -7253,9 +7450,9 @@ dependencies = [ [[package]] name = "rapidhash" -version = "4.1.1" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8e65c75143ce5d47c55b510297eeb1182f3c739b6043c537670e9fc18612dae" +checksum = "2988730ee014541157f48ce4dcc603940e00915edc3c7f9a8d78092256bb2493" dependencies = [ "rustversion", ] @@ -7280,15 +7477,6 @@ dependencies = [ "crossbeam-utils", ] -[[package]] -name = "rc2" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62c64daa8e9438b84aaae55010a93f396f8e60e3911590fcba770d04643fc1dd" -dependencies = [ - "cipher", -] - [[package]] name = "rcgen" version = "0.13.2" @@ -7348,7 +7536,7 @@ checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -7382,23 +7570,25 @@ checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] name = "reqwest" -version = "0.12.26" +version = "0.12.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b4c14b2d9afca6a60277086b0cc6a6ae0b568f6f7916c943a8cdc79f8be240f" +checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" dependencies = [ "base64 0.22.1", "bytes", "futures-channel", "futures-core", "futures-util", - "http 1.4.0", + "http 1.3.1", "http-body 1.0.1", "http-body-util", "hyper 1.8.1", "hyper-rustls", + "hyper-tls", "hyper-util", "js-sys", "log", + "native-tls", "percent-encoding", "pin-project-lite", "quinn", @@ -7409,6 +7599,7 @@ dependencies = [ "serde_urlencoded", "sync_wrapper", "tokio", + "tokio-native-tls", "tokio-rustls 0.26.4", "tokio-util", "tower 0.5.2", @@ -7444,13 +7635,28 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e061d1b48cb8d38042de4ae0a7a6401009d6143dc80d2e2d6f31f0bdd6470c7" +[[package]] +name = "reth-era" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?rev=62abfdaeb54e8a205a8ee085ddebd56047d93374#62abfdaeb54e8a205a8ee085ddebd56047d93374" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "ethereum_ssz 0.9.1", + "ethereum_ssz_derive 0.9.1", + "snap", + "thiserror 2.0.17", +] + [[package]] name = "rfc6979" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" dependencies = [ - "hmac", + "hmac 0.12.1", "subtle", ] @@ -7517,9 +7723,9 @@ dependencies = [ [[package]] name = "ruint" -version = "1.17.2" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c141e807189ad38a07276942c6623032d3753c8859c146104ac2e4d68865945a" +checksum = "a68df0380e5c9d20ce49534f292a36a7514ae21350726efe1865bdb1fa91d278" dependencies = [ "alloy-rlp", "arbitrary", @@ -7626,6 +7832,33 @@ dependencies = [ "nom", ] +[[package]] +name = "rustix" +version = "0.36.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "305efbd14fde4139eb501df5f136994bb520b033fa9fbdce287507dc23b8c7ed" +dependencies = [ + "bitflags 1.3.2", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys 0.1.4", + "windows-sys 0.45.0", +] + +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags 2.10.0", + "errno", + "libc", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + [[package]] name = "rustix" version = "1.1.2" @@ -7635,7 +7868,7 @@ dependencies = [ "bitflags 2.10.0", "errno", "libc", - "linux-raw-sys", + "linux-raw-sys 0.11.0", "windows-sys 0.61.2", ] @@ -7677,7 +7910,7 @@ dependencies = [ "openssl-probe", "rustls-pki-types", "schannel", - "security-framework", + "security-framework 3.5.1", ] [[package]] @@ -7691,9 +7924,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.13.2" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21e6f2ab2928ca4291b86736a8bd920a277a399bba1589409d72154ff87c1282" +checksum = "94182ad936a0c91c324cd46c6511b9510ed16af436d7b5bab34beab0afd55f7a" dependencies = [ "web-time", "zeroize", @@ -7742,7 +7975,8 @@ dependencies = [ [[package]] name = "rw-stream-sink" version = "0.4.0" -source = "git+https://github.com/libp2p/rust-libp2p.git#5e3519fb66b92c7f7c0dc744ab360fd8b669fe54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8c9026ff5d2f23da5e45bbc283f156383001bfb09c4e44256d02c1a685fe9a1" dependencies = [ "futures", "pin-project", @@ -7763,11 +7997,11 @@ checksum = "b147bb6111014916d3ef9d4c85173124a8e12193a67f6176d67244afd558d6c1" [[package]] name = "salsa20" -version = "0.10.2" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" +checksum = "ecbd2eb639fd7cab5804a0837fe373cc2172d15437e804c054a9fb885cb923b0" dependencies = [ - "cipher", + "cipher 0.3.0", ] [[package]] @@ -7835,13 +8069,14 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "scrypt" -version = "0.11.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0516a385866c09368f0b5bcd1caff3366aace790fcd46e2bb032697bb172fd1f" +checksum = "879588d8f90906e73302547e20fffefdd240eb3e0e744e142321f5d49dea0518" dependencies = [ - "pbkdf2", + "hmac 0.11.0", + "pbkdf2 0.8.0", "salsa20", - "sha2", + "sha2 0.9.9", ] [[package]] @@ -7880,6 +8115,19 @@ dependencies = [ "cc", ] +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.10.0", + "core-foundation 0.9.4", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + [[package]] name = "security-framework" version = "3.5.1" @@ -7978,7 +8226,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -8002,7 +8250,7 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -8019,15 +8267,15 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.16.1" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fa237f2807440d238e0364a218270b98f767a00d3dada77b1c53ae88940e2e7" +checksum = "10574371d41b0d9b2cff89418eda27da52bcaff2cc8741db26382a77c29131f1" dependencies = [ "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.12.1", + "indexmap 2.12.0", "schemars 0.9.0", "schemars 1.1.0", "serde_core", @@ -8038,14 +8286,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.16.1" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52a8e3ca0ca629121f70ab50f95249e5a6f925cc0f6ffe8256c45b728875706c" +checksum = "08a72d8216842fdd57820dc78d840bef99248e35fb2554ff923319e60f2d686b" dependencies = [ "darling 0.21.3", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -8054,7 +8302,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.12.1", + "indexmap 2.12.0", "itoa", "ryu", "serde", @@ -8082,6 +8330,19 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + [[package]] name = "sha2" version = "0.10.9" @@ -8130,9 +8391,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.7" +version = "1.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7664a098b8e616bdfcc2dc0e9ac44eb231eedf41db4e9fe95d8d32ec728dedad" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" dependencies = [ "libc", ] @@ -8167,9 +8428,9 @@ dependencies = [ [[package]] name = "simd-adler32" -version = "0.3.8" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" [[package]] name = "similar" @@ -8225,8 +8486,8 @@ dependencies = [ "bls", "byteorder", "educe", - "ethereum_ssz", - "ethereum_ssz_derive", + "ethereum_ssz 0.10.0", + "ethereum_ssz_derive 0.10.0", "filesystem", "fixed_bytes", "flate2", @@ -8328,7 +8589,7 @@ dependencies = [ "rand_core 0.6.4", "ring", "rustc_version 0.4.1", - "sha2", + "sha2 0.10.9", "subtle", ] @@ -8378,7 +8639,7 @@ dependencies = [ "context_deserialize", "educe", "ethereum_serde_utils", - "ethereum_ssz", + "ethereum_ssz 0.10.0", "itertools 0.14.0", "serde", "serde_derive", @@ -8402,12 +8663,12 @@ dependencies = [ "bls", "educe", "ethereum_hashing", - "ethereum_ssz", - "ethereum_ssz_derive", + "ethereum_ssz 0.10.0", + "ethereum_ssz_derive 0.10.0", "fixed_bytes", "int_to_bytes", "integer-sqrt", - "itertools 0.14.0", + "itertools 0.10.5", "merkle_proof", "metrics", "milhouse", @@ -8430,7 +8691,7 @@ version = "0.1.0" dependencies = [ "beacon_chain", "bls", - "ethereum_ssz", + "ethereum_ssz 0.10.0", "fixed_bytes", "state_processing", "tokio", @@ -8452,10 +8713,10 @@ dependencies = [ "criterion", "db-key", "directory", - "ethereum_ssz", - "ethereum_ssz_derive", + "ethereum_ssz 0.10.0", + "ethereum_ssz_derive 0.10.0", "fixed_bytes", - "itertools 0.14.0", + "itertools 0.10.5", "leveldb", "logging", "lru 0.12.5", @@ -8477,9 +8738,15 @@ dependencies = [ "typenum", "types", "xdelta3", - "zstd", + "zstd 0.13.3", ] +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + [[package]] name = "strsim" version = "0.11.1" @@ -8504,7 +8771,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -8515,16 +8782,16 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "superstruct" -version = "0.10.1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bae4a9ccd7882533c1f210e400763ec6ee64c390fc12248c238276281863719e" +checksum = "3b986e4a629907f20a2c2a639a75bc22a8b5d99b444e0d83c395f4cb309022bf" dependencies = [ - "darling 0.23.0", - "itertools 0.14.0", + "darling 0.20.11", + "itertools 0.13.0", "proc-macro2", "quote", "smallvec", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -8550,9 +8817,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.111" +version = "2.0.110" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" +checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea" dependencies = [ "proc-macro2", "quote", @@ -8561,14 +8828,14 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "1.5.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60ceeb7c95a4536de0c0e1649bd98d1a72a4bb9590b1f3e45a8a0bfdb7c188c0" +checksum = "ff790eb176cc81bb8936aed0f7b9f14fc4670069a2d371b3e3b0ecce908b2cb3" dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -8588,7 +8855,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -8681,7 +8948,7 @@ dependencies = [ "fastrand", "getrandom 0.3.4", "once_cell", - "rustix", + "rustix 1.1.2", "windows-sys 0.61.2", ] @@ -8691,7 +8958,7 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60b8cb979cb11c32ce1603f8137b22262a9d131aaa5c37b5678025f22b8becd0" dependencies = [ - "rustix", + "rustix 1.1.2", "windows-sys 0.60.2", ] @@ -8706,7 +8973,7 @@ name = "test_random_derive" version = "0.2.0" dependencies = [ "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -8735,7 +9002,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -8746,7 +9013,7 @@ checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -8800,30 +9067,30 @@ dependencies = [ [[package]] name = "time" -version = "0.3.47" +version = "0.3.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" dependencies = [ "deranged", "itoa", "num-conv", "powerfmt", - "serde_core", + "serde", "time-core", "time-macros", ] [[package]] name = "time-core" -version = "0.1.8" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" [[package]] name = "time-macros" -version = "0.2.27" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" dependencies = [ "num-conv", "time-core", @@ -8842,15 +9109,17 @@ dependencies = [ [[package]] name = "tiny-bip39" -version = "2.0.0" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a30fd743a02bf35236f6faf99adb03089bb77e91c998dac2c2ad76bb424f668c" +checksum = "62cc94d358b5a1e84a5cb9109f559aa3c4d634d2b1b4de3d0fa4adc7c78e2861" dependencies = [ + "anyhow", + "hmac 0.12.1", "once_cell", - "pbkdf2", + "pbkdf2 0.11.0", "rand 0.8.5", "rustc-hash 1.1.0", - "sha2", + "sha2 0.10.9", "thiserror 1.0.69", "unicode-normalization", "wasm-bindgen", @@ -8927,7 +9196,17 @@ checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", ] [[package]] @@ -8980,20 +9259,20 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.7.4+spec-1.0.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe3cea6b2aa3b910092f6abd4053ea464fab5f9c170ba5e9a6aead16ec4af2b6" +checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" dependencies = [ "serde_core", ] [[package]] name = "toml_edit" -version = "0.23.10+spec-1.0.0" +version = "0.23.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" +checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" dependencies = [ - "indexmap 2.12.1", + "indexmap 2.12.0", "toml_datetime", "toml_parser", "winnow", @@ -9001,9 +9280,9 @@ dependencies = [ [[package]] name = "toml_parser" -version = "1.0.5+spec-1.0.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c03bee5ce3696f31250db0bbaff18bc43301ce0e8db2ed1f07cbb2acf89984c" +checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" dependencies = [ "winnow", ] @@ -9020,7 +9299,7 @@ dependencies = [ "base64 0.22.1", "bytes", "h2 0.4.12", - "http 1.4.0", + "http 1.3.1", "http-body 1.0.1", "http-body-util", "hyper 1.8.1", @@ -9047,7 +9326,7 @@ dependencies = [ "async-trait", "base64 0.22.1", "bytes", - "http 1.4.0", + "http 1.3.1", "http-body 1.0.1", "http-body-util", "hyper 1.8.1", @@ -9094,7 +9373,7 @@ checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" dependencies = [ "futures-core", "futures-util", - "indexmap 2.12.1", + "indexmap 2.12.0", "pin-project-lite", "slab", "sync_wrapper", @@ -9107,14 +9386,14 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.8" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" dependencies = [ "bitflags 2.10.0", "bytes", "futures-util", - "http 1.4.0", + "http 1.3.1", "http-body 1.0.1", "iri-string", "pin-project-lite", @@ -9137,9 +9416,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.43" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d15d90a0b5c19378952d479dc858407149d7bb45a14de0142f6c534b16fc647" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "log", "pin-project-lite", @@ -9149,32 +9428,32 @@ dependencies = [ [[package]] name = "tracing-appender" -version = "0.2.4" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "786d480bce6247ab75f005b14ae1624ad978d3029d9113f0a22fa1ac773faeaf" +checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" dependencies = [ "crossbeam-channel", - "thiserror 2.0.17", + "thiserror 1.0.69", "time", "tracing-subscriber", ] [[package]] name = "tracing-attributes" -version = "0.1.31" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] name = "tracing-core" -version = "0.1.35" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a04e24fab5c89c6a36eb8558c9656f30d81de51dfa4d3b45f26b21d61fa0a6c" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" dependencies = [ "once_cell", "valuable", @@ -9221,9 +9500,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.22" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" +checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" dependencies = [ "matchers", "nu-ansi-term", @@ -9240,37 +9519,29 @@ dependencies = [ "tracing-serde", ] -[[package]] -name = "tracing_samplers" -version = "0.1.0" -dependencies = [ - "opentelemetry", - "opentelemetry_sdk", -] - [[package]] name = "tree_hash" -version = "0.12.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7fd51aa83d2eb83b04570808430808b5d24fdbf479a4d5ac5dee4a2e2dd2be4" +checksum = "2db21caa355767db4fd6129876e5ae278a8699f4a6959b1e3e7aff610b532d52" dependencies = [ "alloy-primitives", "ethereum_hashing", - "ethereum_ssz", + "ethereum_ssz 0.10.0", "smallvec", "typenum", ] [[package]] name = "tree_hash_derive" -version = "0.12.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8840ad4d852e325d3afa7fde8a50b2412f89dce47d7eb291c0cc7f87cd040f38" +checksum = "711cc655fcbb48384a87dc2bf641b991a15c5ad9afc3caa0b1ab1df3b436f70f" dependencies = [ - "darling 0.23.0", + "darling 0.21.3", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -9321,12 +9592,12 @@ dependencies = [ "eth2_interop_keypairs", "ethereum_hashing", "ethereum_serde_utils", - "ethereum_ssz", - "ethereum_ssz_derive", + "ethereum_ssz 0.10.0", + "ethereum_ssz_derive 0.10.0", "fixed_bytes", "hex", "int_to_bytes", - "itertools 0.14.0", + "itertools 0.10.5", "kzg", "maplit", "merkle_proof", @@ -9421,12 +9692,6 @@ dependencies = [ "tinyvec", ] -[[package]] -name = "unicode-segmentation" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" - [[package]] name = "unicode-xid" version = "0.2.6" @@ -9449,6 +9714,12 @@ version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" +[[package]] +name = "unsigned-varint" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6889a77d49f1f013504cec6bf97a2c730394adedaeb1deb5ea08949a50541105" + [[package]] name = "unsigned-varint" version = "0.8.0" @@ -9502,9 +9773,9 @@ dependencies = [ [[package]] name = "uuid" -version = "1.19.0" +version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" +checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" dependencies = [ "getrandom 0.3.4", "js-sys", @@ -9513,7 +9784,7 @@ dependencies = [ [[package]] name = "validator_client" -version = "8.1.0" +version = "8.0.1" dependencies = [ "account_utils", "beacon_node_fallback", @@ -9584,7 +9855,7 @@ dependencies = [ "graffiti_file", "health_metrics", "initialized_validators", - "itertools 0.14.0", + "itertools 0.10.5", "lighthouse_validator_store", "lighthouse_version", "logging", @@ -9832,9 +10103,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.106" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" +checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" dependencies = [ "cfg-if", "once_cell", @@ -9845,9 +10116,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.56" +version = "0.4.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836d9622d604feee9e5de25ac10e3ea5f2d65b41eac0d9ce72eb5deae707ce7c" +checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" dependencies = [ "cfg-if", "js-sys", @@ -9858,9 +10129,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.106" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" +checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -9868,22 +10139,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.106" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" +checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.106" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" +checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" dependencies = [ "unicode-ident", ] @@ -9917,9 +10188,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.83" +version = "0.3.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac" +checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" dependencies = [ "js-sys", "wasm-bindgen", @@ -9977,6 +10248,18 @@ dependencies = [ "rustls-pki-types", ] +[[package]] +name = "which" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +dependencies = [ + "either", + "home", + "once_cell", + "rustix 0.38.44", +] + [[package]] name = "widestring" version = "0.4.3" @@ -10073,7 +10356,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -10084,7 +10367,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -10120,6 +10403,15 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -10165,6 +10457,21 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + [[package]] name = "windows-targets" version = "0.48.5" @@ -10213,6 +10520,12 @@ dependencies = [ "windows_x86_64_msvc 0.53.1", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -10231,6 +10544,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -10249,6 +10568,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -10279,6 +10604,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -10297,6 +10628,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -10315,6 +10652,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -10333,6 +10676,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -10353,9 +10702,9 @@ checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" -version = "0.7.14" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" +checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" dependencies = [ "memchr", ] @@ -10411,17 +10760,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "x509-cert" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1301e935010a701ae5f8655edc0ad17c44bad3ac5ce8c39185f75453b720ae94" -dependencies = [ - "const-oid", - "der", - "spki", -] - [[package]] name = "x509-parser" version = "0.17.0" @@ -10442,15 +10780,15 @@ dependencies = [ [[package]] name = "xdelta3" version = "0.1.5" -source = "git+https://github.com/sigp/xdelta3-rs?rev=fe3906605c87b6c0515bd7c8fc671f47875e3ccc#fe3906605c87b6c0515bd7c8fc671f47875e3ccc" +source = "git+https://github.com/sigp/xdelta3-rs?rev=4db64086bb02e9febb584ba93b9d16bb2ae3825a#4db64086bb02e9febb584ba93b9d16bb2ae3825a" dependencies = [ - "bindgen 0.72.1", + "bindgen", "cc", "futures-io", "futures-util", "libc", "log", - "rand 0.9.2", + "rand 0.8.5", ] [[package]] @@ -10538,28 +10876,28 @@ checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", "synstructure", ] [[package]] name = "zerocopy" -version = "0.8.31" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd74ec98b9250adb3ca554bdde269adf631549f51d8a8f8f0a10b50f1cb298c3" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.31" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a8d209fdf45cf5138cbb5a506f6b52522a25afccc534d1475dad8e31105c6a" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -10579,7 +10917,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", "synstructure", ] @@ -10601,7 +10939,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] @@ -10634,39 +10972,36 @@ checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.110", ] [[package]] name = "zip" -version = "6.0.0" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb2a05c7c36fde6c09b08576c9f7fb4cda705990f73b58fe011abf7dfb24168b" +checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" dependencies = [ - "arbitrary", + "aes 0.8.4", + "byteorder", + "bzip2", + "constant_time_eq", "crc32fast", + "crossbeam-utils", "flate2", - "indexmap 2.12.1", - "memchr", - "zopfli", + "hmac 0.12.1", + "pbkdf2 0.11.0", + "sha1", + "time", + "zstd 0.11.2+zstd.1.5.2", ] [[package]] -name = "zlib-rs" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51f936044d677be1a1168fae1d03b583a285a5dd9d8cbf7b24c23aa1fc775235" - -[[package]] -name = "zopfli" -version = "0.8.3" +name = "zstd" +version = "0.11.2+zstd.1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f05cd8797d63865425ff89b5c4a48804f35ba0ce8d125800027ad6017d2b5249" +checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" dependencies = [ - "bumpalo", - "crc32fast", - "log", - "simd-adler32", + "zstd-safe 5.0.2+zstd.1.5.2", ] [[package]] @@ -10675,7 +11010,17 @@ version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" dependencies = [ - "zstd-safe", + "zstd-safe 7.2.4", +] + +[[package]] +name = "zstd-safe" +version = "5.0.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +dependencies = [ + "libc", + "zstd-sys", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 100a916c501..35199be8e73 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -99,7 +99,7 @@ alloy-consensus = { version = "1", default-features = false } alloy-dyn-abi = { version = "1", default-features = false } alloy-json-abi = { version = "1", default-features = false } alloy-network = { version = "1", default-features = false } -alloy-primitives = { version = "1", default-features = false, features = ["rlp", "getrandom"] } +alloy-primitives = { version = "1.5", default-features = false, features = ["rlp", "getrandom"] } alloy-provider = { version = "1", default-features = false, features = ["reqwest"] } alloy-rlp = { version = "0.3", default-features = false } alloy-rpc-types-eth = { version = "1", default-features = false, features = ["serde"] } @@ -138,6 +138,7 @@ eip_3076 = { path = "common/eip_3076" } either = "1.9" environment = { path = "lighthouse/environment" } eth2 = { path = "common/eth2" } +reth-era = { git = "https://github.com/paradigmxyz/reth", package = "reth-era", rev = "62abfdaeb54e8a205a8ee085ddebd56047d93374" } eth2_config = { path = "common/eth2_config" } eth2_key_derivation = { path = "crypto/eth2_key_derivation" } eth2_keystore = { path = "crypto/eth2_keystore" } diff --git a/beacon_node/lighthouse_network/src/config.rs b/beacon_node/lighthouse_network/src/config.rs index cb94bfff22b..8f45da2926d 100644 --- a/beacon_node/lighthouse_network/src/config.rs +++ b/beacon_node/lighthouse_network/src/config.rs @@ -118,6 +118,8 @@ pub struct Config { /// Whether we are running a block proposer only node. pub proposer_only: bool, + /// Optional directory containing `.era` files for backfill. + pub era_files_dir: Option, /// Whether metrics are enabled. pub metrics_enabled: bool, @@ -357,6 +359,7 @@ impl Default for Config { shutdown_after_sync: false, topics: Vec::new(), proposer_only: false, + era_files_dir: None, metrics_enabled: false, enable_light_client_server: true, outbound_rate_limiter_config: None, diff --git a/beacon_node/lighthouse_network/src/types/globals.rs b/beacon_node/lighthouse_network/src/types/globals.rs index df8dbdc559e..5d98304c769 100644 --- a/beacon_node/lighthouse_network/src/types/globals.rs +++ b/beacon_node/lighthouse_network/src/types/globals.rs @@ -165,6 +165,11 @@ impl NetworkGlobals { self.backfill_state.read().clone() } + /// Set the current backfill state. + pub fn set_backfill_state(&self, state: BackFillState) { + *self.backfill_state.write() = state; + } + /// Returns a `Client` type if one is known for the `PeerId`. pub fn client(&self, peer_id: &PeerId) -> Client { self.peers diff --git a/beacon_node/network/Cargo.toml b/beacon_node/network/Cargo.toml index 78dc0c48a75..b7d36b880d6 100644 --- a/beacon_node/network/Cargo.toml +++ b/beacon_node/network/Cargo.toml @@ -35,6 +35,7 @@ metrics = { workspace = true } operation_pool = { workspace = true } parking_lot = { workspace = true } rand = { workspace = true } +reth-era = { workspace = true } slot_clock = { workspace = true } smallvec = { workspace = true } ssz_types = { workspace = true } diff --git a/beacon_node/network/src/network_beacon_processor/mod.rs b/beacon_node/network/src/network_beacon_processor/mod.rs index fd67fcde825..904608df3f4 100644 --- a/beacon_node/network/src/network_beacon_processor/mod.rs +++ b/beacon_node/network/src/network_beacon_processor/mod.rs @@ -615,7 +615,7 @@ impl NetworkBeaconProcessor { }; Work::ChainSegment(Box::pin(process_fn)) } - ChainSegmentProcessId::BackSyncBatchId(_) => { + ChainSegmentProcessId::BackSyncBatchId(_) | ChainSegmentProcessId::BackSyncEraBatchId(_) => { let process_fn = move || processor.process_chain_segment_backfill(process_id, blocks); Work::ChainSegmentBackfill(Box::new(process_fn)) diff --git a/beacon_node/network/src/network_beacon_processor/sync_methods.rs b/beacon_node/network/src/network_beacon_processor/sync_methods.rs index a6b3ea9e4b1..5d62a63dbc6 100644 --- a/beacon_node/network/src/network_beacon_processor/sync_methods.rs +++ b/beacon_node/network/src/network_beacon_processor/sync_methods.rs @@ -36,6 +36,8 @@ pub enum ChainSegmentProcessId { RangeBatchId(ChainId, Epoch), /// Processing ID for a backfill syncing batch. BackSyncBatchId(Epoch), + /// Processing ID for an era backfill syncing batch. + BackSyncEraBatchId(u64), } /// Returned when a chain segment import fails. @@ -613,14 +615,20 @@ impl NetworkBeaconProcessor { process_id: ChainSegmentProcessId, downloaded_blocks: Vec>, ) { - let ChainSegmentProcessId::BackSyncBatchId(epoch) = process_id else { - // this a request from RangeSync, this should _never_ happen - crit!( - error = - "process_chain_segment_backfill called on a variant other than BackSyncBatchId", - "Please notify the devs" - ); - return; + let epoch = match process_id { + ChainSegmentProcessId::BackSyncBatchId(epoch) => epoch, + ChainSegmentProcessId::BackSyncEraBatchId(_) => { + // Era backfill doesn't encode epochs; use 0 for logging. + Epoch::new(0) + } + _ => { + crit!( + error = + "process_chain_segment_backfill called on a variant other than BackSyncBatchId or BackSyncEraBatchId", + "Please notify the devs" + ); + return; + } }; let start_slot = downloaded_blocks.first().map(|b| b.slot().as_u64()); diff --git a/beacon_node/network/src/sync/backfill_sync/mod.rs b/beacon_node/network/src/sync/backfill_sync/mod.rs index 9802ec56a16..2caf86b0bdd 100644 --- a/beacon_node/network/src/sync/backfill_sync/mod.rs +++ b/beacon_node/network/src/sync/backfill_sync/mod.rs @@ -204,6 +204,32 @@ impl BackFillSync { } } + /// Refreshes backfill start state from the beacon chain. + /// + /// Intended for external backfill sources that may have advanced the anchor. + pub fn reset_from_store(&mut self) { + let anchor_info = self.beacon_chain.store.get_anchor_info(); + if anchor_info.block_backfill_complete(self.beacon_chain.genesis_backfill_slot) { + self.set_state(BackFillState::Completed); + return; + } + + let start_epoch = anchor_info + .oldest_block_slot + .epoch(T::EthSpec::slots_per_epoch()); + + self.current_start = start_epoch; + self.processing_target = start_epoch; + self.to_be_downloaded = start_epoch; + self.last_batch_downloaded = false; + self.current_processing_batch = None; + self.batches.clear(); + self.participating_peers.clear(); + self.restart_failed_sync = false; + self.validated_batches = 0; + self.set_state(BackFillState::Paused); + } + /// Starts or resumes syncing. /// /// If resuming is successful, reports back the current syncing metrics. diff --git a/beacon_node/network/src/sync/backfill_sync_era/mod.rs b/beacon_node/network/src/sync/backfill_sync_era/mod.rs new file mode 100644 index 00000000000..7a04588fb96 --- /dev/null +++ b/beacon_node/network/src/sync/backfill_sync_era/mod.rs @@ -0,0 +1,277 @@ +use crate::network_beacon_processor::ChainSegmentProcessId; +use crate::sync::backfill_sync::{ProcessResult, SyncStart}; +use crate::sync::manager::BatchProcessResult; +use crate::sync::network_context::SyncNetworkContext; +use beacon_chain::block_verification_types::RpcBlock; +use beacon_chain::{BeaconChain, BeaconChainTypes}; +use lighthouse_network::NetworkGlobals; +use lighthouse_network::types::BackFillState; +use reth_era::common::file_ops::StreamReader; +use reth_era::era::file::EraReader; +use std::fs::{self, File}; +use std::path::{Path, PathBuf}; +use std::sync::Arc; +use tracing::{debug, error, info}; +use typenum::Unsigned; +use types::{EthSpec, SignedBeaconBlock, Slot}; + +#[derive(Debug)] +#[allow(dead_code)] +pub enum BackFillEraError { + InternalError(String), + BadEraFile(String), +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +enum BackFillEraState { + NotStarted, + Syncing { era_number: u64 }, + Completed, + Disabled, +} + +pub struct BackFillSyncEra { + state: BackFillEraState, + initial_era: Option, + era_files_dir: PathBuf, + beacon_chain: Arc>, + network_globals: Arc>, +} + +impl BackFillSyncEra { + pub fn new( + beacon_chain: Arc>, + network_globals: Arc>, + era_files_dir: PathBuf, + ) -> Self { + Self { + state: BackFillEraState::NotStarted, + initial_era: None, + era_files_dir, + beacon_chain, + network_globals, + } + } + + pub fn pause(&mut self) { + if matches!(self.state, BackFillEraState::Syncing { .. }) { + self.state = BackFillEraState::NotStarted; + self.network_globals + .set_backfill_state(BackFillState::Paused); + } + } + + pub fn start( + &mut self, + network: &mut SyncNetworkContext, + ) -> Result { + if self.state == BackFillEraState::Disabled { + return Ok(SyncStart::NotSyncing); + } + + let anchor_info = self.beacon_chain.store.get_anchor_info(); + if anchor_info.block_backfill_complete(self.beacon_chain.genesis_backfill_slot) { + self.state = BackFillEraState::Completed; + self.network_globals + .set_backfill_state(BackFillState::Completed); + return Ok(SyncStart::NotSyncing); + } + + if self.state == BackFillEraState::NotStarted { + let start_slot = anchor_info.oldest_block_slot; + let start_era = era_number_for_slot::(start_slot); + self.initial_era = Some(start_era); + if let Err(e) = self.send_next_file(network, start_era) { + self.disable("failed to read era file"); + return Err(e); + } else { + self.network_globals + .set_backfill_state(BackFillState::Syncing); + } + } + + Ok(self.syncing_progress()) + } + + pub fn on_batch_process_result( + &mut self, + network: &mut SyncNetworkContext, + era_number: u64, + result: &BatchProcessResult, + ) -> Result { + let current_era = match self.state { + BackFillEraState::Syncing { era_number } => era_number, + _ => return Ok(ProcessResult::Successful), + }; + + if current_era != era_number { + debug!( + current_era, + era_number, "Ignoring backfill processing result for unknown era number" + ); + return Ok(ProcessResult::Successful); + } + + match result { + BatchProcessResult::Success { .. } => { + if era_start_slot::(current_era) + <= self.beacon_chain.genesis_backfill_slot + { + self.state = BackFillEraState::Completed; + self.network_globals + .set_backfill_state(BackFillState::Completed); + info!("Era backfill sync completed"); + Ok(ProcessResult::SyncCompleted) + } else { + let next_era = current_era.saturating_sub(1); + if let Err(e) = self.send_next_file(network, next_era) { + self.disable("failed to read era file"); + return Err(e); + } + Ok(ProcessResult::Successful) + } + } + BatchProcessResult::FaultyFailure { .. } | BatchProcessResult::NonFaultyFailure => { + self.disable("batch processing failed"); + Err(BackFillEraError::BadEraFile(format!( + "ERA backfill batch {era_number} failed processing" + ))) + } + } + } + + fn send_next_file( + &mut self, + network: &mut SyncNetworkContext, + era_number: u64, + ) -> Result<(), BackFillEraError> { + let blocks = + read_batch::(&self.era_files_dir, era_number, &self.beacon_chain.spec)?; + + if let Err(e) = network.beacon_processor().send_chain_segment( + ChainSegmentProcessId::BackSyncEraBatchId(era_number), + blocks, + ) { + self.state = BackFillEraState::NotStarted; + return Err(BackFillEraError::InternalError(format!( + "failed to send era backfill batch: {e}" + ))); + } else { + self.state = BackFillEraState::Syncing { era_number }; + } + + Ok(()) + } + + fn syncing_progress(&self) -> SyncStart { + let current_era = match self.state { + BackFillEraState::Syncing { era_number } => era_number, + _ => return SyncStart::NotSyncing, + }; + let Some(initial_era) = self.initial_era else { + return SyncStart::NotSyncing; + }; + + let slots_per_era = slots_per_era::(); + let completed = + (initial_era.saturating_sub(current_era)).saturating_mul(slots_per_era) as usize; + let remaining = era_start_slot::(current_era) + .saturating_sub(self.beacon_chain.genesis_backfill_slot) + .as_usize(); + + SyncStart::Syncing { + completed, + remaining, + } + } + + fn disable(&mut self, reason: &str) { + error!( + reason, + "Era backfill disabled, falling back to network backfill" + ); + self.state = BackFillEraState::Disabled; + self.network_globals + .set_backfill_state(BackFillState::Paused); + } +} + +fn read_batch( + era_files_dir: &Path, + era_number: u64, + spec: &types::ChainSpec, +) -> Result>, BackFillEraError> { + let path = find_era_file(era_files_dir, era_number) + .map_err(|e| BackFillEraError::BadEraFile(format!("Bad era file name: {e:?}")))? + .ok_or_else(|| { + BackFillEraError::BadEraFile(format!("No era file for number {era_number}")) + })?; + let file = File::open(&path) + .map_err(|e| BackFillEraError::BadEraFile(format!("Unable to read era file: {e:?}")))?; + let reader = EraReader::new(file); + let mut blocks = Vec::new(); + + for block in reader.iter() { + let compressed = block + .map_err(|e| BackFillEraError::BadEraFile(format!("Error reading era block: {e:?}")))?; + let ssz_bytes = compressed.decompress().map_err(|e| { + BackFillEraError::BadEraFile(format!("failed to decompress block: {e:?}")) + })?; + let block = SignedBeaconBlock::::from_ssz_bytes(&ssz_bytes, spec) + .map_err(|e| BackFillEraError::BadEraFile(format!("failed to decode block: {e:?}")))?; + blocks.push(RpcBlock::new_without_blobs(None, Arc::new(block))); + } + + Ok(blocks) +} + +fn parse_era_number(path: &Path) -> Result, String> { + let Some(stem) = path.file_stem().and_then(|name| name.to_str()) else { + return Ok(None); + }; + let mut parts = stem.split('-'); + let _config = parts.next(); + let Some(era_str) = parts.next() else { + return Ok(None); + }; + let era_number = era_str + .parse::() + .map_err(|_| format!("invalid era number in file: {}", path.display()))?; + Ok(Some(era_number)) +} + +fn find_era_file(dir: &Path, era_number: u64) -> Result, String> { + let mut found: Option = None; + for entry in fs::read_dir(dir).map_err(|e| format!("Error reading dir: {e:?}"))? { + let entry = entry.map_err(|e| format!("Error reading dir entry: {e:?}"))?; + let path = entry.path(); + if path.extension().and_then(|ext| ext.to_str()) != Some("era") { + continue; + } + let parsed = match parse_era_number(&path)? { + Some(parsed) => parsed, + None => continue, + }; + if parsed == era_number { + if found.is_some() { + return Err(format!("multiple era files found for era {era_number}")); + } + found = Some(path); + } + } + + Ok(found) +} + +fn era_number_for_slot(slot: Slot) -> u64 { + slot.as_u64() + .saturating_div(E::SlotsPerHistoricalRoot::to_u64()) +} + +fn era_start_slot(era_number: u64) -> Slot { + Slot::new(era_number.saturating_mul(E::SlotsPerHistoricalRoot::to_u64())) +} + +fn slots_per_era() -> u64 { + E::SlotsPerHistoricalRoot::to_u64() +} diff --git a/beacon_node/network/src/sync/manager.rs b/beacon_node/network/src/sync/manager.rs index 096ed9c3282..2b0b420c07b 100644 --- a/beacon_node/network/src/sync/manager.rs +++ b/beacon_node/network/src/sync/manager.rs @@ -34,6 +34,7 @@ //! search for the block and subsequently search for parents if needed. use super::backfill_sync::{BackFillSync, ProcessResult, SyncStart}; +use super::backfill_sync_era::BackFillSyncEra; use super::block_lookups::BlockLookups; use super::network_context::{ CustodyByRootResult, RangeBlockComponent, RangeRequestId, RpcEvent, SyncNetworkContext, @@ -251,6 +252,9 @@ pub struct SyncManager { /// Backfill syncing. backfill_sync: BackFillSync, + /// Backfill syncing with ERA files + backfill_sync_era: Option>, + /// Custody syncing. custody_backfill_sync: CustodyBackFillSync, @@ -314,6 +318,9 @@ impl SyncManager { ), range_sync: RangeSync::new(beacon_chain.clone()), backfill_sync: BackFillSync::new(beacon_chain.clone(), network_globals.clone()), + backfill_sync_era: network_globals.config.era_files_dir.clone().map(|dir| { + BackFillSyncEra::new(beacon_chain.clone(), network_globals.clone(), dir) + }), custody_backfill_sync: CustodyBackFillSync::new(beacon_chain.clone(), network_globals), block_lookups: BlockLookups::new(), notified_unknown_roots: LRUTimeCache::new(Duration::from_secs( @@ -636,52 +643,76 @@ impl SyncManager { // complete a backfill sync. #[cfg(not(feature = "disable-backfill"))] if matches!(sync_state, SyncState::Synced) { - // Determine if we need to start/resume/restart a backfill sync. - match self.backfill_sync.start(&mut self.network) { - Ok(SyncStart::Syncing { - completed, - remaining, - }) => { - sync_state = SyncState::BackFillSyncing { + let mut era_backfill_active = false; + if let Some(era_backfill_sync) = self.backfill_sync_era.as_mut() { + match era_backfill_sync.start(&mut self.network) { + Ok(SyncStart::Syncing { completed, remaining, - }; - } - Ok(SyncStart::NotSyncing) => {} // Ignore updating the state if the backfill sync state didn't start. - Err(e) => { - error!(error = ?e, "Backfill sync failed to start"); + }) => { + sync_state = SyncState::BackFillSyncing { + completed, + remaining, + }; + era_backfill_active = true; + } + Ok(SyncStart::NotSyncing) => {} + Err(e) => { + error!(error = ?e, "Era backfill sync failed to start"); + } } } - // If backfill is complete, check if we have a pending custody backfill to complete - let anchor_info = self.chain.store.get_anchor_info(); - if anchor_info.block_backfill_complete(self.chain.genesis_backfill_slot) { - match self.custody_backfill_sync.start(&mut self.network) { + if !era_backfill_active { + self.backfill_sync.reset_from_store(); + // Determine if we need to start/resume/restart a backfill sync. + match self.backfill_sync.start(&mut self.network) { Ok(SyncStart::Syncing { completed, remaining, }) => { - sync_state = SyncState::CustodyBackFillSyncing { + sync_state = SyncState::BackFillSyncing { completed, remaining, }; } - Ok(SyncStart::NotSyncing) => {} // Ignore updating the state if custody sync state didn't start. + Ok(SyncStart::NotSyncing) => {} // Ignore updating the state if the backfill sync state didn't start. Err(e) => { - use crate::sync::custody_backfill_sync::CustodyBackfillError; + error!(error = ?e, "Backfill sync failed to start"); + } + } - match &e { - CustodyBackfillError::BatchDownloadFailed(_) - | CustodyBackfillError::BatchProcessingFailed(_) => { - debug!(error=?e, "Custody backfill batch processing or downloading failed"); - } - CustodyBackfillError::BatchInvalidState(_, reason) => { - error!(error=?e, reason, "Custody backfill sync failed due to invalid batch state") - } - CustodyBackfillError::InvalidSyncState(reason) => { - error!(error=?e, reason, "Custody backfill sync failed due to invalid sync state") + // If backfill is complete, check if we have a pending custody backfill to complete + let anchor_info = self.chain.store.get_anchor_info(); + if anchor_info.block_backfill_complete(self.chain.genesis_backfill_slot) + { + match self.custody_backfill_sync.start(&mut self.network) { + Ok(SyncStart::Syncing { + completed, + remaining, + }) => { + sync_state = SyncState::CustodyBackFillSyncing { + completed, + remaining, + }; + } + Ok(SyncStart::NotSyncing) => {} // Ignore updating the state if custody sync state didn't start. + Err(e) => { + use crate::sync::custody_backfill_sync::CustodyBackfillError; + + match &e { + CustodyBackfillError::BatchDownloadFailed(_) + | CustodyBackfillError::BatchProcessingFailed(_) => { + debug!(error=?e, "Custody backfill batch processing or downloading failed"); + } + CustodyBackfillError::BatchInvalidState(_, reason) => { + error!(error=?e, reason, "Custody backfill sync failed due to invalid batch state") + } + CustodyBackfillError::InvalidSyncState(reason) => { + error!(error=?e, reason, "Custody backfill sync failed due to invalid sync state") + } + CustodyBackfillError::Paused => {} } - CustodyBackfillError::Paused => {} } } } @@ -695,6 +726,9 @@ impl SyncManager { // Range sync is in progress. If there is a backfill or custody sync in progress pause it. #[cfg(not(feature = "disable-backfill"))] self.backfill_sync.pause(); + if let Some(era_backfill_sync) = self.backfill_sync_era.as_mut() { + era_backfill_sync.pause(); + } self.custody_backfill_sync .pause("Range sync in progress".to_string()); @@ -708,6 +742,9 @@ impl SyncManager { // in progress pause it. #[cfg(not(feature = "disable-backfill"))] self.backfill_sync.pause(); + if let Some(era_backfill_sync) = self.backfill_sync_era.as_mut() { + era_backfill_sync.pause(); + } self.custody_backfill_sync .pause("Range sync in progress".to_string()); @@ -949,6 +986,27 @@ impl SyncManager { } } } + ChainSegmentProcessId::BackSyncEraBatchId(era_number) => { + if let Some(era_backfill_sync) = self.backfill_sync_era.as_mut() { + match era_backfill_sync.on_batch_process_result( + &mut self.network, + era_number, + &result, + ) { + Ok(ProcessResult::Successful) => {} + Ok(ProcessResult::SyncCompleted) => self.update_sync_state(), + Err(error) => { + error!(error = ?error, "Era backfill sync failed"); + self.update_sync_state(); + } + } + } else { + debug!( + era_number = %era_number, + "Ignoring era backfill batch result without era backfill enabled" + ); + } + } }, SyncMessage::CustodyBatchProcessed { result, batch_id } => { match self.custody_backfill_sync.on_batch_process_result( diff --git a/beacon_node/network/src/sync/mod.rs b/beacon_node/network/src/sync/mod.rs index 054bab654c2..b59bb4571b5 100644 --- a/beacon_node/network/src/sync/mod.rs +++ b/beacon_node/network/src/sync/mod.rs @@ -6,6 +6,7 @@ mod batch; mod block_lookups; mod block_sidecar_coupling; mod custody_backfill_sync; +mod backfill_sync_era; pub mod manager; mod network_context; mod peer_sync_info; diff --git a/beacon_node/src/cli.rs b/beacon_node/src/cli.rs index 9553fe60ba2..8e6475f7f5b 100644 --- a/beacon_node/src/cli.rs +++ b/beacon_node/src/cli.rs @@ -414,6 +414,15 @@ pub fn cli_app() -> Command { .help_heading(FLAG_HEADER) .display_order(0) ) + .arg( + Arg::new("era-files-dir") + .long("era-files-dir") + .value_name("DIR") + .help("Directory containing `.era` files to use for backfill.") + .action(ArgAction::Set) + .help_heading(FLAG_HEADER) + .display_order(0) + ) .arg( Arg::new("complete-blob-backfill") .long("complete-blob-backfill") diff --git a/beacon_node/src/config.rs b/beacon_node/src/config.rs index 752cf105505..fd8b32bce20 100644 --- a/beacon_node/src/config.rs +++ b/beacon_node/src/config.rs @@ -808,6 +808,9 @@ pub fn get_config( client_config.chain.genesis_backfill = true; } + client_config.network.era_files_dir = + clap_utils::parse_optional(cli_args, "era-files-dir")?; + client_config.chain.complete_blob_backfill = cli_args.get_flag("complete-blob-backfill"); // Ensure `prune_blobs` is false whenever complete-blob-backfill is set. This overrides any From 2f7a52e792be3766dffecfddd69236d92cd0b25e Mon Sep 17 00:00:00 2001 From: dapplion <35266934+dapplion@users.noreply.github.com> Date: Tue, 23 Dec 2025 16:57:51 -0300 Subject: [PATCH 02/18] Remove extra fn --- .../network_beacon_processor/sync_methods.rs | 38 ++++++------------- .../network/src/sync/backfill_sync/mod.rs | 26 ------------- beacon_node/network/src/sync/manager.rs | 1 - 3 files changed, 12 insertions(+), 53 deletions(-) diff --git a/beacon_node/network/src/network_beacon_processor/sync_methods.rs b/beacon_node/network/src/network_beacon_processor/sync_methods.rs index 5d62a63dbc6..15e370c1a96 100644 --- a/beacon_node/network/src/network_beacon_processor/sync_methods.rs +++ b/beacon_node/network/src/network_beacon_processor/sync_methods.rs @@ -615,22 +615,7 @@ impl NetworkBeaconProcessor { process_id: ChainSegmentProcessId, downloaded_blocks: Vec>, ) { - let epoch = match process_id { - ChainSegmentProcessId::BackSyncBatchId(epoch) => epoch, - ChainSegmentProcessId::BackSyncEraBatchId(_) => { - // Era backfill doesn't encode epochs; use 0 for logging. - Epoch::new(0) - } - _ => { - crit!( - error = - "process_chain_segment_backfill called on a variant other than BackSyncBatchId or BackSyncEraBatchId", - "Please notify the devs" - ); - return; - } - }; - + let block_count = downloaded_blocks.len(); let start_slot = downloaded_blocks.first().map(|b| b.slot().as_u64()); let end_slot = downloaded_blocks.last().map(|b| b.slot().as_u64()); let sent_blocks = downloaded_blocks.len(); @@ -646,15 +631,16 @@ impl NetworkBeaconProcessor { let result = match self.process_backfill_blocks(downloaded_blocks) { (imported_blocks, Ok(_)) => { debug!( - batch_epoch = %epoch, - first_block_slot = start_slot, - keep_execution_payload = !self.chain.store.get_config().prune_payloads, - last_block_slot = end_slot, - processed_blocks = sent_blocks, - processed_blobs = n_blobs, - processed_data_columns = n_data_columns, - service= "sync", - "Backfill batch processed"); + block_count, + first_block_slot = start_slot, + keep_execution_payload = !self.chain.store.get_config().prune_payloads, + last_block_slot = end_slot, + processed_blocks = sent_blocks, + processed_blobs = n_blobs, + processed_data_columns = n_data_columns, + service = "sync", + "Backfill batch processed" + ); BatchProcessResult::Success { sent_blocks, imported_blocks, @@ -662,7 +648,7 @@ impl NetworkBeaconProcessor { } (_, Err(e)) => { debug!( - batch_epoch = %epoch, + block_count, first_block_slot = start_slot, last_block_slot = end_slot, processed_blobs = n_blobs, diff --git a/beacon_node/network/src/sync/backfill_sync/mod.rs b/beacon_node/network/src/sync/backfill_sync/mod.rs index 2caf86b0bdd..9802ec56a16 100644 --- a/beacon_node/network/src/sync/backfill_sync/mod.rs +++ b/beacon_node/network/src/sync/backfill_sync/mod.rs @@ -204,32 +204,6 @@ impl BackFillSync { } } - /// Refreshes backfill start state from the beacon chain. - /// - /// Intended for external backfill sources that may have advanced the anchor. - pub fn reset_from_store(&mut self) { - let anchor_info = self.beacon_chain.store.get_anchor_info(); - if anchor_info.block_backfill_complete(self.beacon_chain.genesis_backfill_slot) { - self.set_state(BackFillState::Completed); - return; - } - - let start_epoch = anchor_info - .oldest_block_slot - .epoch(T::EthSpec::slots_per_epoch()); - - self.current_start = start_epoch; - self.processing_target = start_epoch; - self.to_be_downloaded = start_epoch; - self.last_batch_downloaded = false; - self.current_processing_batch = None; - self.batches.clear(); - self.participating_peers.clear(); - self.restart_failed_sync = false; - self.validated_batches = 0; - self.set_state(BackFillState::Paused); - } - /// Starts or resumes syncing. /// /// If resuming is successful, reports back the current syncing metrics. diff --git a/beacon_node/network/src/sync/manager.rs b/beacon_node/network/src/sync/manager.rs index 2b0b420c07b..0705335dbbb 100644 --- a/beacon_node/network/src/sync/manager.rs +++ b/beacon_node/network/src/sync/manager.rs @@ -664,7 +664,6 @@ impl SyncManager { } if !era_backfill_active { - self.backfill_sync.reset_from_store(); // Determine if we need to start/resume/restart a backfill sync. match self.backfill_sync.start(&mut self.network) { Ok(SyncStart::Syncing { From cb242aac101da0b4d3ecd50c98de778b7f251ed3 Mon Sep 17 00:00:00 2001 From: dapplion <35266934+dapplion@users.noreply.github.com> Date: Wed, 24 Dec 2025 19:39:27 -0300 Subject: [PATCH 03/18] Fill DB on startup --- Cargo.lock | 1 + beacon_node/beacon_chain/Cargo.toml | 1 + beacon_node/beacon_chain/src/builder.rs | 17 +++ .../beacon_chain/src/era_file_consumer.rs | 117 ++++++++++++++++++ beacon_node/beacon_chain/src/lib.rs | 1 + beacon_node/client/src/builder.rs | 13 +- beacon_node/client/src/config.rs | 3 + beacon_node/src/config.rs | 9 +- beacon_node/store/src/config.rs | 4 + beacon_node/store/src/reconstruct.rs | 2 +- 10 files changed, 164 insertions(+), 4 deletions(-) create mode 100644 beacon_node/beacon_chain/src/era_file_consumer.rs diff --git a/Cargo.lock b/Cargo.lock index f883dccb655..3fa59045af3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1264,6 +1264,7 @@ dependencies = [ "proto_array", "rand 0.9.2", "rayon", + "reth-era", "safe_arith", "sensitive_url", "serde", diff --git a/beacon_node/beacon_chain/Cargo.toml b/beacon_node/beacon_chain/Cargo.toml index 5e1c41b8302..b11463115db 100644 --- a/beacon_node/beacon_chain/Cargo.toml +++ b/beacon_node/beacon_chain/Cargo.toml @@ -47,6 +47,7 @@ parking_lot = { workspace = true } proto_array = { workspace = true } rand = { workspace = true } rayon = { workspace = true } +reth-era = { workspace = true } safe_arith = { workspace = true } sensitive_url = { workspace = true } serde = { workspace = true } diff --git a/beacon_node/beacon_chain/src/builder.rs b/beacon_node/beacon_chain/src/builder.rs index e5b656adf8d..815eb58ede0 100644 --- a/beacon_node/beacon_chain/src/builder.rs +++ b/beacon_node/beacon_chain/src/builder.rs @@ -18,6 +18,7 @@ use crate::persisted_custody::load_custody_context; use crate::shuffling_cache::{BlockShufflingIds, ShufflingCache}; use crate::validator_monitor::{ValidatorMonitor, ValidatorMonitorConfig}; use crate::validator_pubkey_cache::ValidatorPubkeyCache; +use crate::era_file_consumer::import_era_files; use crate::{ BeaconChain, BeaconChainTypes, BeaconForkChoiceStore, BeaconSnapshot, ServerSentEventHandler, }; @@ -37,6 +38,7 @@ use slasher::Slasher; use slot_clock::{SlotClock, TestingSlotClock}; use state_processing::{AllCaches, per_slot_processing}; use std::marker::PhantomData; +use std::path::Path; use std::sync::Arc; use std::time::Duration; use store::{Error as StoreError, HotColdDB, ItemStore, KeyValueStoreOp}; @@ -206,6 +208,21 @@ where self } + /// Import trusted era files into the store before building the chain. + pub fn era_files( + self, + era_files_dir: &Path, + genesis_state: BeaconState, + ) -> Result { + let builder = self.genesis_state(genesis_state)?; + let store = builder + .store + .clone() + .ok_or("era_files requires a store.")?; + import_era_files(&store, era_files_dir, &builder.spec)?; + Ok(builder) + } + /// Sets the store migrator config (optional). pub fn store_migrator_config(mut self, config: MigratorConfig) -> Self { self.store_migrator_config = Some(config); diff --git a/beacon_node/beacon_chain/src/era_file_consumer.rs b/beacon_node/beacon_chain/src/era_file_consumer.rs new file mode 100644 index 00000000000..135a858a7d0 --- /dev/null +++ b/beacon_node/beacon_chain/src/era_file_consumer.rs @@ -0,0 +1,117 @@ +use reth_era::common::file_ops::StreamReader; +use reth_era::era::file::EraReader; +use reth_era::era::types::consensus::{CompressedBeaconState, CompressedSignedBeaconBlock}; +use std::fs::{self, File}; +use std::path::{Path, PathBuf}; +use store::{HotColdDB, ItemStore}; +use tracing::{info, warn}; +use types::{BeaconState, ChainSpec, EthSpec, SignedBeaconBlock}; + +pub(crate) fn import_era_files, Cold: ItemStore>( + store: &HotColdDB, + era_files_dir: &Path, + spec: &ChainSpec, +) -> Result<(), String> { + let mut era_files = list_era_files(era_files_dir)?; + era_files.sort_by_key(|(era_number, _)| *era_number); + + let network_name = spec + .config_name + .clone() + .unwrap_or_else(|| "unknown".to_string()); + + for (era_number, path) in era_files { + info!(era_number, ?path, "Importing era file"); + import_era_file(store, &path, &network_name, spec) + .map_err(|error| format!("era file import failed: {error}"))?; + } + + Ok(()) +} + +fn import_era_file, Cold: ItemStore>( + store: &HotColdDB, + path: &Path, + network_name: &str, + spec: &ChainSpec, +) -> Result<(), String> { + let file = File::open(path).map_err(|error| format!("failed to open era file: {error}"))?; + let era_file = EraReader::new(file) + .read_and_assemble(network_name.to_string()) + .map_err(|error| format!("failed to parse era file: {error:?}"))?; + + for compressed_block in era_file.group.blocks { + let block = decode_block::(compressed_block, spec)?; + let block_root = block.canonical_root(); + store + .put_block(&block_root, block) + .map_err(|error| format!("failed to store block: {error:?}"))?; + } + + let mut state = decode_state::(era_file.group.era_state, spec)?; + let state_root = state + .canonical_root() + .map_err(|error| format!("failed to hash state: {error:?}"))?; + store + .put_state(&state_root, &state) + .map_err(|error| format!("failed to store state: {error:?}"))?; + + Ok(()) +} + +fn decode_block( + compressed: CompressedSignedBeaconBlock, + spec: &ChainSpec, +) -> Result, String> { + let bytes = compressed + .decompress() + .map_err(|error| format!("failed to decompress block: {error:?}"))?; + SignedBeaconBlock::from_ssz_bytes(&bytes, spec) + .map_err(|error| format!("failed to decode block: {error:?}")) +} + +fn decode_state( + compressed: CompressedBeaconState, + spec: &ChainSpec, +) -> Result, String> { + let bytes = compressed + .decompress() + .map_err(|error| format!("failed to decompress state: {error:?}"))?; + BeaconState::from_ssz_bytes(&bytes, spec) + .map_err(|error| format!("failed to decode state: {error:?}")) +} + +fn list_era_files(dir: &Path) -> Result, String> { + let entries = fs::read_dir(dir).map_err(|error| format!("failed to read era dir: {error}"))?; + let mut era_files = Vec::new(); + + for entry in entries { + let entry = entry.map_err(|error| format!("failed to read era entry: {error}"))?; + let path = entry.path(); + let Some(file_name) = path.file_name().and_then(|name| name.to_str()) else { + continue; + }; + + if !file_name.ends_with(".era") { + continue; + } + + let Some((prefix, _hash_part)) = file_name.rsplit_once('-') else { + continue; + }; + let Some((_network_name, era_part)) = prefix.rsplit_once('-') else { + continue; + }; + let Some(era_number) = era_part.parse().ok() else { + continue; + }; + + era_files.push((era_number, path)); + } + + if era_files.is_empty() { + warn!(?dir, "Era files directory is empty"); + } + + Ok(era_files) +} diff --git a/beacon_node/beacon_chain/src/lib.rs b/beacon_node/beacon_chain/src/lib.rs index e77739e2d53..fb1c0ecdecd 100644 --- a/beacon_node/beacon_chain/src/lib.rs +++ b/beacon_node/beacon_chain/src/lib.rs @@ -20,6 +20,7 @@ pub mod custody_context; pub mod data_availability_checker; pub mod data_column_verification; mod early_attester_cache; +mod era_file_consumer; mod errors; pub mod events; pub mod execution_payload; diff --git a/beacon_node/client/src/builder.rs b/beacon_node/client/src/builder.rs index 1b395ac8da5..1501aa86eaa 100644 --- a/beacon_node/client/src/builder.rs +++ b/beacon_node/client/src/builder.rs @@ -248,7 +248,12 @@ where ClientGenesis::DepositContract } else if chain_exists { - if matches!(client_genesis, ClientGenesis::WeakSubjSszBytes { .. }) + if matches!(client_genesis, ClientGenesis::EraFiles { .. }) { + info!( + msg = "database already exists, use --purge-db to force era import", + "Refusing to import era files" + ); + } else if matches!(client_genesis, ClientGenesis::WeakSubjSszBytes { .. }) || matches!(client_genesis, ClientGenesis::CheckpointSyncUrl { .. }) { info!( @@ -460,6 +465,12 @@ where return Err("Loading genesis from deposit contract no longer supported".to_string()); } ClientGenesis::FromStore => builder.resume_from_db()?, + ClientGenesis::EraFiles { era_files_dir } => { + info!(?era_files_dir, "Importing era files"); + let genesis_state = genesis_state(&runtime_context, &config).await?; + let builder = builder.era_files(&era_files_dir, genesis_state)?; + builder.reconstruct_historic_states_from_era_states()? + } }; self.beacon_chain_builder = Some(beacon_chain_builder); diff --git a/beacon_node/client/src/config.rs b/beacon_node/client/src/config.rs index aeaa196df86..db5ad0d217a 100644 --- a/beacon_node/client/src/config.rs +++ b/beacon_node/client/src/config.rs @@ -45,6 +45,9 @@ pub enum ClientGenesis { CheckpointSyncUrl { url: SensitiveUrl, }, + EraFiles { + era_files_dir: PathBuf, + }, } /// The core configuration of a Lighthouse beacon node. diff --git a/beacon_node/src/config.rs b/beacon_node/src/config.rs index fd8b32bce20..f8d748cbcae 100644 --- a/beacon_node/src/config.rs +++ b/beacon_node/src/config.rs @@ -808,8 +808,13 @@ pub fn get_config( client_config.chain.genesis_backfill = true; } - client_config.network.era_files_dir = - clap_utils::parse_optional(cli_args, "era-files-dir")?; + if let Some(dir) = clap_utils::parse_optional::(cli_args, "era-files-dir")? { + let path = PathBuf::from(dir); + client_config.store.era_files_dir = Some(path.clone()); + client_config.genesis = ClientGenesis::EraFiles { + era_files_dir: path, + }; + } client_config.chain.complete_blob_backfill = cli_args.get_flag("complete-blob-backfill"); diff --git a/beacon_node/store/src/config.rs b/beacon_node/store/src/config.rs index 29705283fa9..99b2d10e407 100644 --- a/beacon_node/store/src/config.rs +++ b/beacon_node/store/src/config.rs @@ -5,6 +5,7 @@ use ssz::{Decode, Encode}; use ssz_derive::{Decode, Encode}; use std::io::{Read, Write}; use std::num::NonZeroUsize; +use std::path::PathBuf; use strum::{Display, EnumString, VariantNames}; use superstruct::superstruct; use types::EthSpec; @@ -64,6 +65,8 @@ pub struct StoreConfig { /// The margin for blob pruning in epochs. The oldest blobs are pruned up until /// data_availability_boundary - blob_prune_margin_epochs. Default: 0. pub blob_prune_margin_epochs: u64, + /// Optional path for era file import/production. + pub era_files_dir: Option, } /// Variant of `StoreConfig` that gets written to disk. Contains immutable configuration params. @@ -120,6 +123,7 @@ impl Default for StoreConfig { prune_blobs: true, epochs_per_blob_prune: DEFAULT_EPOCHS_PER_BLOB_PRUNE, blob_prune_margin_epochs: DEFAULT_BLOB_PUNE_MARGIN_EPOCHS, + era_files_dir: None, } } } diff --git a/beacon_node/store/src/reconstruct.rs b/beacon_node/store/src/reconstruct.rs index 7aca692ef9b..d97be9ac774 100644 --- a/beacon_node/store/src/reconstruct.rs +++ b/beacon_node/store/src/reconstruct.rs @@ -9,7 +9,7 @@ use state_processing::{ }; use std::sync::Arc; use tracing::{debug, info}; -use types::EthSpec; +use types::{EthSpec, Slot}; impl HotColdDB where From 3a460b44fdbdd4014c25928b9cc7c9edadc5e209 Mon Sep 17 00:00:00 2001 From: dapplion <35266934+dapplion@users.noreply.github.com> Date: Fri, 26 Dec 2025 17:56:48 -0300 Subject: [PATCH 04/18] Working initial era file loading --- beacon_node/beacon_chain/src/builder.rs | 46 ++++- .../beacon_chain/src/era_file_consumer.rs | 57 +++++- beacon_node/client/src/builder.rs | 3 +- beacon_node/store/src/hot_cold_store.rs | 13 +- beacon_node/store/src/reconstruct.rs | 165 ++++++++++-------- .../src/per_block_processing.rs | 5 +- .../src/per_block_processing/errors.rs | 5 +- 7 files changed, 201 insertions(+), 93 deletions(-) diff --git a/beacon_node/beacon_chain/src/builder.rs b/beacon_node/beacon_chain/src/builder.rs index 815eb58ede0..125ff73310f 100644 --- a/beacon_node/beacon_chain/src/builder.rs +++ b/beacon_node/beacon_chain/src/builder.rs @@ -6,6 +6,7 @@ use crate::beacon_chain::{ use crate::beacon_proposer_cache::BeaconProposerCache; use crate::custody_context::NodeCustodyType; use crate::data_availability_checker::DataAvailabilityChecker; +use crate::era_file_consumer::import_era_files; use crate::fork_choice_signal::ForkChoiceSignalTx; use crate::fork_revert::{reset_fork_choice_to_finalization, revert_to_fork_boundary}; use crate::graffiti_calculator::{GraffitiCalculator, GraffitiOrigin}; @@ -18,7 +19,6 @@ use crate::persisted_custody::load_custody_context; use crate::shuffling_cache::{BlockShufflingIds, ShufflingCache}; use crate::validator_monitor::{ValidatorMonitor, ValidatorMonitorConfig}; use crate::validator_pubkey_cache::ValidatorPubkeyCache; -use crate::era_file_consumer::import_era_files; use crate::{ BeaconChain, BeaconChainTypes, BeaconForkChoiceStore, BeaconSnapshot, ServerSentEventHandler, }; @@ -212,14 +212,44 @@ where pub fn era_files( self, era_files_dir: &Path, - genesis_state: BeaconState, + mut genesis_state: BeaconState, ) -> Result { - let builder = self.genesis_state(genesis_state)?; - let store = builder - .store - .clone() - .ok_or("era_files requires a store.")?; - import_era_files(&store, era_files_dir, &builder.spec)?; + let genesis_state_root = genesis_state + .canonical_root() + .map_err(|e| format!("Error computing genesis state root: {e:?}"))?; + + let builder = self.genesis_state(genesis_state.clone())?; + let store = builder.store.clone().ok_or("era_files requires a store.")?; + + { + let mut ops = vec![]; + store + .store_cold_state(&genesis_state_root, &genesis_state, &mut ops) + .map_err(|e| format!("Error building genesis state write ops: {e:?}"))?; + store + .cold_db + .do_atomically(ops) + .map_err(|e| format!("Error writing genesis state: {e:?}"))?; + } + + let max_era = import_era_files(&store, era_files_dir, &builder.spec)?; + let slots_per_historical_root = E::slots_per_historical_root() as u64; + (1..=max_era).into_par_iter().try_for_each(|era_number| { + let start_slot = Slot::new((era_number - 1) * slots_per_historical_root); + let end_slot = Slot::new(era_number * slots_per_historical_root); + store + .reconstruct_historic_states_on_range( + // Start reconstruction with state at the era file start, but the state has the + // block already applied. So start with the block at the next slot. + start_slot, + start_slot + Slot::new(1), + end_slot, + ) + .map_err(|error| { + format!("Era reconstruction failed for era {era_number}: {error:?}") + }) + })?; + Ok(builder) } diff --git a/beacon_node/beacon_chain/src/era_file_consumer.rs b/beacon_node/beacon_chain/src/era_file_consumer.rs index 135a858a7d0..47f6a4979a5 100644 --- a/beacon_node/beacon_chain/src/era_file_consumer.rs +++ b/beacon_node/beacon_chain/src/era_file_consumer.rs @@ -3,15 +3,15 @@ use reth_era::era::file::EraReader; use reth_era::era::types::consensus::{CompressedBeaconState, CompressedSignedBeaconBlock}; use std::fs::{self, File}; use std::path::{Path, PathBuf}; -use store::{HotColdDB, ItemStore}; +use store::{DBColumn, HotColdDB, ItemStore, KeyValueStoreOp}; use tracing::{info, warn}; -use types::{BeaconState, ChainSpec, EthSpec, SignedBeaconBlock}; +use types::{BeaconState, ChainSpec, EthSpec, SignedBeaconBlock, Slot}; pub(crate) fn import_era_files, Cold: ItemStore>( store: &HotColdDB, era_files_dir: &Path, spec: &ChainSpec, -) -> Result<(), String> { +) -> Result { let mut era_files = list_era_files(era_files_dir)?; era_files.sort_by_key(|(era_number, _)| *era_number); @@ -20,18 +20,21 @@ pub(crate) fn import_era_files, Cold: ItemStore .clone() .unwrap_or_else(|| "unknown".to_string()); + let mut max_era = None; for (era_number, path) in era_files { info!(era_number, ?path, "Importing era file"); - import_era_file(store, &path, &network_name, spec) - .map_err(|error| format!("era file import failed: {error}"))?; + import_era_file(store, &path, era_number, &network_name, spec) + .map_err(|error| format!("era file {era_number} {path:?} import failed: {error}"))?; + max_era = Some(era_number); } - Ok(()) + max_era.ok_or_else(|| "era files directory is empty".to_string()) } fn import_era_file, Cold: ItemStore>( store: &HotColdDB, path: &Path, + era_number: u64, network_name: &str, spec: &ChainSpec, ) -> Result<(), String> { @@ -52,9 +55,11 @@ fn import_era_file, Cold: ItemStore>( let state_root = state .canonical_root() .map_err(|error| format!("failed to hash state: {error:?}"))?; + // Use put_cold_state as the split is not updated and we need the state into the cold store. store - .put_state(&state_root, &state) + .put_cold_state(&state_root, &state) .map_err(|error| format!("failed to store state: {error:?}"))?; + write_block_root_index_for_era(store, &state, era_number)?; Ok(()) } @@ -81,6 +86,44 @@ fn decode_state( .map_err(|error| format!("failed to decode state: {error:?}")) } +fn write_block_root_index_for_era, Cold: ItemStore>( + store: &HotColdDB, + state: &BeaconState, + era_number: u64, +) -> Result<(), String> { + let end_slot = state.slot(); + let slots_per_historical_root = E::slots_per_historical_root() as u64; + let expected_end_slot = Slot::new(era_number * slots_per_historical_root); + if end_slot != expected_end_slot { + return Err(format!( + "era state slot mismatch: expected {expected_end_slot}, got {end_slot}" + )); + } + + let start_slot = end_slot.saturating_sub(slots_per_historical_root); + + let ops = (start_slot.as_u64()..end_slot.as_u64()) + .map(|slot_u64| { + let slot = Slot::new(slot_u64); + let block_root = state + .get_block_root(slot) + .map_err(|error| format!("failed to read block root {slot}: {error:?}"))?; + Ok(KeyValueStoreOp::PutKeyValue( + DBColumn::BeaconBlockRoots, + slot_u64.to_be_bytes().to_vec(), + block_root.as_slice().to_vec(), + )) + }) + .collect::, String>>()?; + + store + .cold_db + .do_atomically(ops) + .map_err(|error| format!("failed to store block root index: {error:?}"))?; + + Ok(()) +} + fn list_era_files(dir: &Path) -> Result, String> { let entries = fs::read_dir(dir).map_err(|error| format!("failed to read era dir: {error}"))?; let mut era_files = Vec::new(); diff --git a/beacon_node/client/src/builder.rs b/beacon_node/client/src/builder.rs index 1501aa86eaa..5f007b286e2 100644 --- a/beacon_node/client/src/builder.rs +++ b/beacon_node/client/src/builder.rs @@ -468,8 +468,7 @@ where ClientGenesis::EraFiles { era_files_dir } => { info!(?era_files_dir, "Importing era files"); let genesis_state = genesis_state(&runtime_context, &config).await?; - let builder = builder.era_files(&era_files_dir, genesis_state)?; - builder.reconstruct_historic_states_from_era_states()? + builder.era_files(&era_files_dir, genesis_state)? } }; diff --git a/beacon_node/store/src/hot_cold_store.rs b/beacon_node/store/src/hot_cold_store.rs index 6e165702a27..6144e8d3b4c 100644 --- a/beacon_node/store/src/hot_cold_store.rs +++ b/beacon_node/store/src/hot_cold_store.rs @@ -196,7 +196,7 @@ pub enum HotColdDBError { RestorePointDecodeError(ssz::DecodeError), BlockReplayBeaconError(BeaconStateError), BlockReplaySlotError(SlotProcessingError), - BlockReplayBlockError(BlockProcessingError), + BlockReplayBlockError(Slot, BlockProcessingError), InvalidSlotsPerRestorePoint { slots_per_restore_point: u64, slots_per_historical_root: u64, @@ -1092,6 +1092,17 @@ impl, Cold: ItemStore> HotColdDB } } + /// Store and commit a state into the cold db store. + pub fn put_cold_state( + &self, + state_root: &Hash256, + state: &BeaconState, + ) -> Result<(), Error> { + let mut ops: Vec = Vec::new(); + self.store_cold_state(state_root, state, &mut ops)?; + self.cold_db.do_atomically(ops) + } + /// Fetch a state from the store. /// /// If `slot` is provided then it will be used as a hint as to which database should diff --git a/beacon_node/store/src/reconstruct.rs b/beacon_node/store/src/reconstruct.rs index d97be9ac774..5f20dcb161c 100644 --- a/beacon_node/store/src/reconstruct.rs +++ b/beacon_node/store/src/reconstruct.rs @@ -1,8 +1,9 @@ //! Implementation of historic state reconstruction (given complete block history). +use crate::forwards_iter::FrozenForwardsIterator; use crate::hot_cold_store::{HotColdDB, HotColdDBError}; -use crate::metrics; +use crate::{DBColumn, KeyValueStoreOp, metrics}; use crate::{Error, ItemStore}; -use itertools::{Itertools, process_results}; +use itertools::process_results; use state_processing::{ BlockSignatureStrategy, ConsensusContext, VerifyBlockRoot, per_block_processing, per_slot_processing, @@ -53,40 +54,103 @@ where return Ok(()); } - // If `num_blocks` is not specified iterate all blocks. Add 1 so that we end on an epoch - // boundary when `num_blocks` is a multiple of an epoch boundary. We want to be *inclusive* - // of the state at slot `lower_limit_slot + num_blocks`. - let block_root_iter = self - .forwards_block_roots_iterator_until(lower_limit_slot, upper_limit_slot - 1, || { - Err(Error::StateShouldNotBeRequired(upper_limit_slot - 1)) - })? - .take(num_blocks.map_or(usize::MAX, |n| n + 1)); + let from_slot = lower_limit_slot; + let to_slot = if let Some(num_blocks) = num_blocks { + std::cmp::min(upper_limit_slot, from_slot + Slot::new(num_blocks as u64)) + } else { + upper_limit_slot + }; + + self.reconstruct_historic_states_on_range(from_slot, from_slot, to_slot)?; + + let remaining = upper_limit_slot + .as_u64() + .saturating_sub(1) + .saturating_sub(to_slot.as_u64()); + info!( + slot = %to_slot, + remaining = %remaining, + "State reconstruction in progress" + ); + + // Update anchor. + let old_anchor = anchor.clone(); + + let reconstruction_complete = to_slot == upper_limit_slot; + if reconstruction_complete { + let new_anchor = old_anchor.as_archive_anchor(); + self.compare_and_set_anchor_info_with_write(old_anchor, new_anchor)?; + + return Ok(()); + } else { + // The lower limit has been raised, store it. + anchor.state_lower_limit = to_slot; + + self.compare_and_set_anchor_info_with_write(old_anchor, anchor.clone())?; + } + + // Check that the split point wasn't mutated during the state reconstruction process. + // It shouldn't have been, due to the serialization of requests through the store migrator, + // so this is just a paranoid check. + let latest_split = self.get_split_info(); + if split != latest_split { + return Err(Error::SplitPointModified(latest_split.slot, split.slot)); + } + + Ok(()) + } + + pub fn reconstruct_historic_states_on_range( + self: &Arc, + with_state_at_slot: Slot, + from_slot: Slot, + to_slot: Slot, + ) -> Result<(), Error> { + debug!( + %from_slot, + %to_slot, + "Starting state reconstruction batch" + ); + + let _t = metrics::start_timer(&metrics::STORE_BEACON_RECONSTRUCTION_TIME); + + let block_root_iter = + FrozenForwardsIterator::new(self, DBColumn::BeaconBlockRoots, from_slot, to_slot)?; // The state to be advanced. - let mut state = self.load_cold_state_by_slot(lower_limit_slot)?; + let mut state = self.load_cold_state_by_slot(with_state_at_slot)?; state.build_caches(&self.spec)?; process_results(block_root_iter, |iter| -> Result<(), Error> { let mut io_batch = vec![]; - let mut prev_state_root = None; - for ((prev_block_root, _), (block_root, slot)) in iter.tuple_windows() { - let is_skipped_slot = prev_block_root == block_root; - - let block = if is_skipped_slot { - None - } else { - Some( - self.get_blinded_block(&block_root)? - .ok_or(Error::BlockNotFound(block_root))?, - ) + for (block_root, slot) in iter { + io_batch.push(KeyValueStoreOp::PutKeyValue( + DBColumn::BeaconBlockRoots, + slot.as_u64().to_be_bytes().to_vec(), + block_root.as_slice().to_vec(), + )); + + let block = { + let block = self + .get_blinded_block(&block_root)? + .ok_or(Error::BlockNotFound(block_root))?; + if block.slot() == slot && block.slot() > self.spec.genesis_slot { + // If block.slot != slot means it's a skipped slot. + // Also skip applying the genesis slot. + Some(block) + } else { + None + } }; // Advance state to slot. - per_slot_processing(&mut state, prev_state_root.take(), &self.spec) - .map_err(HotColdDBError::BlockReplaySlotError)?; + while state.slot() < slot { + per_slot_processing(&mut state, prev_state_root.take(), &self.spec) + .map_err(HotColdDBError::BlockReplaySlotError)?; + } // Apply block. if let Some(block) = block { @@ -102,7 +166,7 @@ where &mut ctxt, &self.spec, ) - .map_err(HotColdDBError::BlockReplayBlockError)?; + .map_err(|e| HotColdDBError::BlockReplayBlockError(block.slot(), e))?; prev_state_root = Some(block.state_root()); } @@ -114,58 +178,21 @@ where // Stage state for storage in freezer DB. self.store_cold_state(&state_root, &state, &mut io_batch)?; - let batch_complete = - num_blocks.is_some_and(|n_blocks| slot == lower_limit_slot + n_blocks as u64); - let reconstruction_complete = slot + 1 == upper_limit_slot; + let batch_complete = slot + 1 == to_slot; // Commit the I/O batch if: // // - The diff/snapshot for this slot is required for future slots, or // - The reconstruction batch is complete (we are about to return), or // - Reconstruction is complete. - if self.hierarchy.should_commit_immediately(slot)? - || batch_complete - || reconstruction_complete - { - info!( - %slot, - remaining = %(upper_limit_slot - 1 - slot), - "State reconstruction in progress" - ); - + if self.hierarchy.should_commit_immediately(slot)? || batch_complete { self.cold_db.do_atomically(std::mem::take(&mut io_batch))?; - // Update anchor. - let old_anchor = anchor.clone(); - - if reconstruction_complete { - // The two limits have met in the middle! We're done! - // Perform one last integrity check on the state reached. - let computed_state_root = state.update_tree_hash_cache()?; - if computed_state_root != state_root { - return Err(Error::StateReconstructionRootMismatch { - slot, - expected: state_root, - computed: computed_state_root, - }); - } - - let new_anchor = old_anchor.as_archive_anchor(); - self.compare_and_set_anchor_info_with_write(old_anchor, new_anchor)?; - - return Ok(()); - } else { - // The lower limit has been raised, store it. - anchor.state_lower_limit = slot; - - self.compare_and_set_anchor_info_with_write(old_anchor, anchor.clone())?; - } - // If this is the end of the batch, return Ok. The caller will run another // batch when there is idle capacity. if batch_complete { debug!( - start_slot = %lower_limit_slot, + start_slot = %from_slot, end_slot = %slot, "Finished state reconstruction batch" ); @@ -179,14 +206,6 @@ where Err(Error::StateReconstructionLogicError) })??; - // Check that the split point wasn't mutated during the state reconstruction process. - // It shouldn't have been, due to the serialization of requests through the store migrator, - // so this is just a paranoid check. - let latest_split = self.get_split_info(); - if split != latest_split { - return Err(Error::SplitPointModified(latest_split.slot, split.slot)); - } - Ok(()) } } diff --git a/consensus/state_processing/src/per_block_processing.rs b/consensus/state_processing/src/per_block_processing.rs index 1de5083f6f3..4ec2249ce48 100644 --- a/consensus/state_processing/src/per_block_processing.rs +++ b/consensus/state_processing/src/per_block_processing.rs @@ -221,7 +221,10 @@ pub fn process_block_header( // Verify that the slots match verify!( block_header.slot == state.slot(), - HeaderInvalid::StateSlotMismatch + HeaderInvalid::StateSlotMismatch { + state: state.slot(), + header: block_header.slot, + } ); // Verify that the block is newer than the latest block header diff --git a/consensus/state_processing/src/per_block_processing/errors.rs b/consensus/state_processing/src/per_block_processing/errors.rs index 5c1db9d732e..124cef1c665 100644 --- a/consensus/state_processing/src/per_block_processing/errors.rs +++ b/consensus/state_processing/src/per_block_processing/errors.rs @@ -277,7 +277,10 @@ impl From for BlockOperationError { #[derive(Debug, PartialEq, Clone)] pub enum HeaderInvalid { ProposalSignatureInvalid, - StateSlotMismatch, + StateSlotMismatch { + state: Slot, + header: Slot, + }, OlderThanLatestBlockHeader { latest_block_header_slot: Slot, block_slot: Slot, From 8078d7ae43c34f384426ba6d91192a3d603db224 Mon Sep 17 00:00:00 2001 From: dapplion <35266934+dapplion@users.noreply.github.com> Date: Sun, 28 Dec 2025 15:12:05 -0300 Subject: [PATCH 05/18] Remove era backfill --- .../lighthouse_network/src/types/globals.rs | 5 - .../src/network_beacon_processor/mod.rs | 2 +- .../network_beacon_processor/sync_methods.rs | 2 - .../network/src/sync/backfill_sync_era/mod.rs | 277 ------------------ beacon_node/network/src/sync/manager.rs | 117 ++------ beacon_node/network/src/sync/mod.rs | 1 - 6 files changed, 31 insertions(+), 373 deletions(-) delete mode 100644 beacon_node/network/src/sync/backfill_sync_era/mod.rs diff --git a/beacon_node/lighthouse_network/src/types/globals.rs b/beacon_node/lighthouse_network/src/types/globals.rs index 5d98304c769..df8dbdc559e 100644 --- a/beacon_node/lighthouse_network/src/types/globals.rs +++ b/beacon_node/lighthouse_network/src/types/globals.rs @@ -165,11 +165,6 @@ impl NetworkGlobals { self.backfill_state.read().clone() } - /// Set the current backfill state. - pub fn set_backfill_state(&self, state: BackFillState) { - *self.backfill_state.write() = state; - } - /// Returns a `Client` type if one is known for the `PeerId`. pub fn client(&self, peer_id: &PeerId) -> Client { self.peers diff --git a/beacon_node/network/src/network_beacon_processor/mod.rs b/beacon_node/network/src/network_beacon_processor/mod.rs index 904608df3f4..fd67fcde825 100644 --- a/beacon_node/network/src/network_beacon_processor/mod.rs +++ b/beacon_node/network/src/network_beacon_processor/mod.rs @@ -615,7 +615,7 @@ impl NetworkBeaconProcessor { }; Work::ChainSegment(Box::pin(process_fn)) } - ChainSegmentProcessId::BackSyncBatchId(_) | ChainSegmentProcessId::BackSyncEraBatchId(_) => { + ChainSegmentProcessId::BackSyncBatchId(_) => { let process_fn = move || processor.process_chain_segment_backfill(process_id, blocks); Work::ChainSegmentBackfill(Box::new(process_fn)) diff --git a/beacon_node/network/src/network_beacon_processor/sync_methods.rs b/beacon_node/network/src/network_beacon_processor/sync_methods.rs index 15e370c1a96..55bd523c892 100644 --- a/beacon_node/network/src/network_beacon_processor/sync_methods.rs +++ b/beacon_node/network/src/network_beacon_processor/sync_methods.rs @@ -36,8 +36,6 @@ pub enum ChainSegmentProcessId { RangeBatchId(ChainId, Epoch), /// Processing ID for a backfill syncing batch. BackSyncBatchId(Epoch), - /// Processing ID for an era backfill syncing batch. - BackSyncEraBatchId(u64), } /// Returned when a chain segment import fails. diff --git a/beacon_node/network/src/sync/backfill_sync_era/mod.rs b/beacon_node/network/src/sync/backfill_sync_era/mod.rs deleted file mode 100644 index 7a04588fb96..00000000000 --- a/beacon_node/network/src/sync/backfill_sync_era/mod.rs +++ /dev/null @@ -1,277 +0,0 @@ -use crate::network_beacon_processor::ChainSegmentProcessId; -use crate::sync::backfill_sync::{ProcessResult, SyncStart}; -use crate::sync::manager::BatchProcessResult; -use crate::sync::network_context::SyncNetworkContext; -use beacon_chain::block_verification_types::RpcBlock; -use beacon_chain::{BeaconChain, BeaconChainTypes}; -use lighthouse_network::NetworkGlobals; -use lighthouse_network::types::BackFillState; -use reth_era::common::file_ops::StreamReader; -use reth_era::era::file::EraReader; -use std::fs::{self, File}; -use std::path::{Path, PathBuf}; -use std::sync::Arc; -use tracing::{debug, error, info}; -use typenum::Unsigned; -use types::{EthSpec, SignedBeaconBlock, Slot}; - -#[derive(Debug)] -#[allow(dead_code)] -pub enum BackFillEraError { - InternalError(String), - BadEraFile(String), -} - -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -enum BackFillEraState { - NotStarted, - Syncing { era_number: u64 }, - Completed, - Disabled, -} - -pub struct BackFillSyncEra { - state: BackFillEraState, - initial_era: Option, - era_files_dir: PathBuf, - beacon_chain: Arc>, - network_globals: Arc>, -} - -impl BackFillSyncEra { - pub fn new( - beacon_chain: Arc>, - network_globals: Arc>, - era_files_dir: PathBuf, - ) -> Self { - Self { - state: BackFillEraState::NotStarted, - initial_era: None, - era_files_dir, - beacon_chain, - network_globals, - } - } - - pub fn pause(&mut self) { - if matches!(self.state, BackFillEraState::Syncing { .. }) { - self.state = BackFillEraState::NotStarted; - self.network_globals - .set_backfill_state(BackFillState::Paused); - } - } - - pub fn start( - &mut self, - network: &mut SyncNetworkContext, - ) -> Result { - if self.state == BackFillEraState::Disabled { - return Ok(SyncStart::NotSyncing); - } - - let anchor_info = self.beacon_chain.store.get_anchor_info(); - if anchor_info.block_backfill_complete(self.beacon_chain.genesis_backfill_slot) { - self.state = BackFillEraState::Completed; - self.network_globals - .set_backfill_state(BackFillState::Completed); - return Ok(SyncStart::NotSyncing); - } - - if self.state == BackFillEraState::NotStarted { - let start_slot = anchor_info.oldest_block_slot; - let start_era = era_number_for_slot::(start_slot); - self.initial_era = Some(start_era); - if let Err(e) = self.send_next_file(network, start_era) { - self.disable("failed to read era file"); - return Err(e); - } else { - self.network_globals - .set_backfill_state(BackFillState::Syncing); - } - } - - Ok(self.syncing_progress()) - } - - pub fn on_batch_process_result( - &mut self, - network: &mut SyncNetworkContext, - era_number: u64, - result: &BatchProcessResult, - ) -> Result { - let current_era = match self.state { - BackFillEraState::Syncing { era_number } => era_number, - _ => return Ok(ProcessResult::Successful), - }; - - if current_era != era_number { - debug!( - current_era, - era_number, "Ignoring backfill processing result for unknown era number" - ); - return Ok(ProcessResult::Successful); - } - - match result { - BatchProcessResult::Success { .. } => { - if era_start_slot::(current_era) - <= self.beacon_chain.genesis_backfill_slot - { - self.state = BackFillEraState::Completed; - self.network_globals - .set_backfill_state(BackFillState::Completed); - info!("Era backfill sync completed"); - Ok(ProcessResult::SyncCompleted) - } else { - let next_era = current_era.saturating_sub(1); - if let Err(e) = self.send_next_file(network, next_era) { - self.disable("failed to read era file"); - return Err(e); - } - Ok(ProcessResult::Successful) - } - } - BatchProcessResult::FaultyFailure { .. } | BatchProcessResult::NonFaultyFailure => { - self.disable("batch processing failed"); - Err(BackFillEraError::BadEraFile(format!( - "ERA backfill batch {era_number} failed processing" - ))) - } - } - } - - fn send_next_file( - &mut self, - network: &mut SyncNetworkContext, - era_number: u64, - ) -> Result<(), BackFillEraError> { - let blocks = - read_batch::(&self.era_files_dir, era_number, &self.beacon_chain.spec)?; - - if let Err(e) = network.beacon_processor().send_chain_segment( - ChainSegmentProcessId::BackSyncEraBatchId(era_number), - blocks, - ) { - self.state = BackFillEraState::NotStarted; - return Err(BackFillEraError::InternalError(format!( - "failed to send era backfill batch: {e}" - ))); - } else { - self.state = BackFillEraState::Syncing { era_number }; - } - - Ok(()) - } - - fn syncing_progress(&self) -> SyncStart { - let current_era = match self.state { - BackFillEraState::Syncing { era_number } => era_number, - _ => return SyncStart::NotSyncing, - }; - let Some(initial_era) = self.initial_era else { - return SyncStart::NotSyncing; - }; - - let slots_per_era = slots_per_era::(); - let completed = - (initial_era.saturating_sub(current_era)).saturating_mul(slots_per_era) as usize; - let remaining = era_start_slot::(current_era) - .saturating_sub(self.beacon_chain.genesis_backfill_slot) - .as_usize(); - - SyncStart::Syncing { - completed, - remaining, - } - } - - fn disable(&mut self, reason: &str) { - error!( - reason, - "Era backfill disabled, falling back to network backfill" - ); - self.state = BackFillEraState::Disabled; - self.network_globals - .set_backfill_state(BackFillState::Paused); - } -} - -fn read_batch( - era_files_dir: &Path, - era_number: u64, - spec: &types::ChainSpec, -) -> Result>, BackFillEraError> { - let path = find_era_file(era_files_dir, era_number) - .map_err(|e| BackFillEraError::BadEraFile(format!("Bad era file name: {e:?}")))? - .ok_or_else(|| { - BackFillEraError::BadEraFile(format!("No era file for number {era_number}")) - })?; - let file = File::open(&path) - .map_err(|e| BackFillEraError::BadEraFile(format!("Unable to read era file: {e:?}")))?; - let reader = EraReader::new(file); - let mut blocks = Vec::new(); - - for block in reader.iter() { - let compressed = block - .map_err(|e| BackFillEraError::BadEraFile(format!("Error reading era block: {e:?}")))?; - let ssz_bytes = compressed.decompress().map_err(|e| { - BackFillEraError::BadEraFile(format!("failed to decompress block: {e:?}")) - })?; - let block = SignedBeaconBlock::::from_ssz_bytes(&ssz_bytes, spec) - .map_err(|e| BackFillEraError::BadEraFile(format!("failed to decode block: {e:?}")))?; - blocks.push(RpcBlock::new_without_blobs(None, Arc::new(block))); - } - - Ok(blocks) -} - -fn parse_era_number(path: &Path) -> Result, String> { - let Some(stem) = path.file_stem().and_then(|name| name.to_str()) else { - return Ok(None); - }; - let mut parts = stem.split('-'); - let _config = parts.next(); - let Some(era_str) = parts.next() else { - return Ok(None); - }; - let era_number = era_str - .parse::() - .map_err(|_| format!("invalid era number in file: {}", path.display()))?; - Ok(Some(era_number)) -} - -fn find_era_file(dir: &Path, era_number: u64) -> Result, String> { - let mut found: Option = None; - for entry in fs::read_dir(dir).map_err(|e| format!("Error reading dir: {e:?}"))? { - let entry = entry.map_err(|e| format!("Error reading dir entry: {e:?}"))?; - let path = entry.path(); - if path.extension().and_then(|ext| ext.to_str()) != Some("era") { - continue; - } - let parsed = match parse_era_number(&path)? { - Some(parsed) => parsed, - None => continue, - }; - if parsed == era_number { - if found.is_some() { - return Err(format!("multiple era files found for era {era_number}")); - } - found = Some(path); - } - } - - Ok(found) -} - -fn era_number_for_slot(slot: Slot) -> u64 { - slot.as_u64() - .saturating_div(E::SlotsPerHistoricalRoot::to_u64()) -} - -fn era_start_slot(era_number: u64) -> Slot { - Slot::new(era_number.saturating_mul(E::SlotsPerHistoricalRoot::to_u64())) -} - -fn slots_per_era() -> u64 { - E::SlotsPerHistoricalRoot::to_u64() -} diff --git a/beacon_node/network/src/sync/manager.rs b/beacon_node/network/src/sync/manager.rs index 0705335dbbb..096ed9c3282 100644 --- a/beacon_node/network/src/sync/manager.rs +++ b/beacon_node/network/src/sync/manager.rs @@ -34,7 +34,6 @@ //! search for the block and subsequently search for parents if needed. use super::backfill_sync::{BackFillSync, ProcessResult, SyncStart}; -use super::backfill_sync_era::BackFillSyncEra; use super::block_lookups::BlockLookups; use super::network_context::{ CustodyByRootResult, RangeBlockComponent, RangeRequestId, RpcEvent, SyncNetworkContext, @@ -252,9 +251,6 @@ pub struct SyncManager { /// Backfill syncing. backfill_sync: BackFillSync, - /// Backfill syncing with ERA files - backfill_sync_era: Option>, - /// Custody syncing. custody_backfill_sync: CustodyBackFillSync, @@ -318,9 +314,6 @@ impl SyncManager { ), range_sync: RangeSync::new(beacon_chain.clone()), backfill_sync: BackFillSync::new(beacon_chain.clone(), network_globals.clone()), - backfill_sync_era: network_globals.config.era_files_dir.clone().map(|dir| { - BackFillSyncEra::new(beacon_chain.clone(), network_globals.clone(), dir) - }), custody_backfill_sync: CustodyBackFillSync::new(beacon_chain.clone(), network_globals), block_lookups: BlockLookups::new(), notified_unknown_roots: LRUTimeCache::new(Duration::from_secs( @@ -643,75 +636,52 @@ impl SyncManager { // complete a backfill sync. #[cfg(not(feature = "disable-backfill"))] if matches!(sync_state, SyncState::Synced) { - let mut era_backfill_active = false; - if let Some(era_backfill_sync) = self.backfill_sync_era.as_mut() { - match era_backfill_sync.start(&mut self.network) { - Ok(SyncStart::Syncing { + // Determine if we need to start/resume/restart a backfill sync. + match self.backfill_sync.start(&mut self.network) { + Ok(SyncStart::Syncing { + completed, + remaining, + }) => { + sync_state = SyncState::BackFillSyncing { completed, remaining, - }) => { - sync_state = SyncState::BackFillSyncing { - completed, - remaining, - }; - era_backfill_active = true; - } - Ok(SyncStart::NotSyncing) => {} - Err(e) => { - error!(error = ?e, "Era backfill sync failed to start"); - } + }; + } + Ok(SyncStart::NotSyncing) => {} // Ignore updating the state if the backfill sync state didn't start. + Err(e) => { + error!(error = ?e, "Backfill sync failed to start"); } } - if !era_backfill_active { - // Determine if we need to start/resume/restart a backfill sync. - match self.backfill_sync.start(&mut self.network) { + // If backfill is complete, check if we have a pending custody backfill to complete + let anchor_info = self.chain.store.get_anchor_info(); + if anchor_info.block_backfill_complete(self.chain.genesis_backfill_slot) { + match self.custody_backfill_sync.start(&mut self.network) { Ok(SyncStart::Syncing { completed, remaining, }) => { - sync_state = SyncState::BackFillSyncing { + sync_state = SyncState::CustodyBackFillSyncing { completed, remaining, }; } - Ok(SyncStart::NotSyncing) => {} // Ignore updating the state if the backfill sync state didn't start. + Ok(SyncStart::NotSyncing) => {} // Ignore updating the state if custody sync state didn't start. Err(e) => { - error!(error = ?e, "Backfill sync failed to start"); - } - } + use crate::sync::custody_backfill_sync::CustodyBackfillError; - // If backfill is complete, check if we have a pending custody backfill to complete - let anchor_info = self.chain.store.get_anchor_info(); - if anchor_info.block_backfill_complete(self.chain.genesis_backfill_slot) - { - match self.custody_backfill_sync.start(&mut self.network) { - Ok(SyncStart::Syncing { - completed, - remaining, - }) => { - sync_state = SyncState::CustodyBackFillSyncing { - completed, - remaining, - }; - } - Ok(SyncStart::NotSyncing) => {} // Ignore updating the state if custody sync state didn't start. - Err(e) => { - use crate::sync::custody_backfill_sync::CustodyBackfillError; - - match &e { - CustodyBackfillError::BatchDownloadFailed(_) - | CustodyBackfillError::BatchProcessingFailed(_) => { - debug!(error=?e, "Custody backfill batch processing or downloading failed"); - } - CustodyBackfillError::BatchInvalidState(_, reason) => { - error!(error=?e, reason, "Custody backfill sync failed due to invalid batch state") - } - CustodyBackfillError::InvalidSyncState(reason) => { - error!(error=?e, reason, "Custody backfill sync failed due to invalid sync state") - } - CustodyBackfillError::Paused => {} + match &e { + CustodyBackfillError::BatchDownloadFailed(_) + | CustodyBackfillError::BatchProcessingFailed(_) => { + debug!(error=?e, "Custody backfill batch processing or downloading failed"); + } + CustodyBackfillError::BatchInvalidState(_, reason) => { + error!(error=?e, reason, "Custody backfill sync failed due to invalid batch state") + } + CustodyBackfillError::InvalidSyncState(reason) => { + error!(error=?e, reason, "Custody backfill sync failed due to invalid sync state") } + CustodyBackfillError::Paused => {} } } } @@ -725,9 +695,6 @@ impl SyncManager { // Range sync is in progress. If there is a backfill or custody sync in progress pause it. #[cfg(not(feature = "disable-backfill"))] self.backfill_sync.pause(); - if let Some(era_backfill_sync) = self.backfill_sync_era.as_mut() { - era_backfill_sync.pause(); - } self.custody_backfill_sync .pause("Range sync in progress".to_string()); @@ -741,9 +708,6 @@ impl SyncManager { // in progress pause it. #[cfg(not(feature = "disable-backfill"))] self.backfill_sync.pause(); - if let Some(era_backfill_sync) = self.backfill_sync_era.as_mut() { - era_backfill_sync.pause(); - } self.custody_backfill_sync .pause("Range sync in progress".to_string()); @@ -985,27 +949,6 @@ impl SyncManager { } } } - ChainSegmentProcessId::BackSyncEraBatchId(era_number) => { - if let Some(era_backfill_sync) = self.backfill_sync_era.as_mut() { - match era_backfill_sync.on_batch_process_result( - &mut self.network, - era_number, - &result, - ) { - Ok(ProcessResult::Successful) => {} - Ok(ProcessResult::SyncCompleted) => self.update_sync_state(), - Err(error) => { - error!(error = ?error, "Era backfill sync failed"); - self.update_sync_state(); - } - } - } else { - debug!( - era_number = %era_number, - "Ignoring era backfill batch result without era backfill enabled" - ); - } - } }, SyncMessage::CustodyBatchProcessed { result, batch_id } => { match self.custody_backfill_sync.on_batch_process_result( diff --git a/beacon_node/network/src/sync/mod.rs b/beacon_node/network/src/sync/mod.rs index b59bb4571b5..054bab654c2 100644 --- a/beacon_node/network/src/sync/mod.rs +++ b/beacon_node/network/src/sync/mod.rs @@ -6,7 +6,6 @@ mod batch; mod block_lookups; mod block_sidecar_coupling; mod custody_backfill_sync; -mod backfill_sync_era; pub mod manager; mod network_context; mod peer_sync_info; From 2fb43168018ae38d2af0714dbbfaa6bcf1c5481a Mon Sep 17 00:00:00 2001 From: dapplion <35266934+dapplion@users.noreply.github.com> Date: Sun, 28 Dec 2025 16:08:40 -0300 Subject: [PATCH 06/18] Track progress in era file reconstruction --- beacon_node/beacon_chain/src/builder.rs | 122 +++++++++++++++++++++--- beacon_node/store/src/hot_cold_store.rs | 23 +---- 2 files changed, 111 insertions(+), 34 deletions(-) diff --git a/beacon_node/beacon_chain/src/builder.rs b/beacon_node/beacon_chain/src/builder.rs index 125ff73310f..f5de531ca24 100644 --- a/beacon_node/beacon_chain/src/builder.rs +++ b/beacon_node/beacon_chain/src/builder.rs @@ -40,8 +40,9 @@ use state_processing::{AllCaches, per_slot_processing}; use std::marker::PhantomData; use std::path::Path; use std::sync::Arc; -use std::time::Duration; -use store::{Error as StoreError, HotColdDB, ItemStore, KeyValueStoreOp}; +use std::sync::atomic::{AtomicU64, Ordering}; +use std::time::{Duration, Instant}; +use store::{DBColumn, Error as StoreError, HotColdDB, ItemStore, KeyValueStoreOp}; use task_executor::{ShutdownReason, TaskExecutor}; use tracing::{debug, error, info}; use tree_hash::TreeHash; @@ -221,6 +222,8 @@ where let builder = self.genesis_state(genesis_state.clone())?; let store = builder.store.clone().ok_or("era_files requires a store.")?; + // Explicitly store the genesis state in the cold DB. In testing this seems necessary. + // TODO(era): Review why ^ { let mut ops = vec![]; store @@ -232,22 +235,65 @@ where .map_err(|e| format!("Error writing genesis state: {e:?}"))?; } + // Import all blocks and states from the ERA files. + info!(?era_files_dir, "Importing blocks and states from ERA files"); let max_era = import_era_files(&store, era_files_dir, &builder.spec)?; + + info!(max_era, "Reconstructing states from ERA files"); let slots_per_historical_root = E::slots_per_historical_root() as u64; + let total_era_files = max_era; + let completed_era_files = Arc::new(AtomicU64::new(0)); + let progress = Arc::new(Mutex::new((Speedo::default(), Instant::now()))); + (1..=max_era).into_par_iter().try_for_each(|era_number| { - let start_slot = Slot::new((era_number - 1) * slots_per_historical_root); - let end_slot = Slot::new(era_number * slots_per_historical_root); - store - .reconstruct_historic_states_on_range( - // Start reconstruction with state at the era file start, but the state has the - // block already applied. So start with the block at the next slot. - start_slot, - start_slot + Slot::new(1), - end_slot, - ) - .map_err(|error| { - format!("Era reconstruction failed for era {era_number}: {error:?}") - }) + let already_reconstructed_db_key = era_reconstruction_key(era_number); + let already_reconstructed = store + .hot_db + .key_exists(DBColumn::BeaconMeta, &already_reconstructed_db_key) + .map_err(|error| format!("Era reconstruction marker read failed: {error:?}"))?; + + if !already_reconstructed { + let start_slot = Slot::new((era_number - 1) * slots_per_historical_root); + let end_slot = Slot::new(era_number * slots_per_historical_root); + store + .reconstruct_historic_states_on_range( + // Start reconstruction with state at the era file start, but the state has the + // block already applied. So start with the block at the next slot. + start_slot, + start_slot + Slot::new(1), + end_slot, + ) + .map_err(|error| { + format!("Era reconstruction failed for era {era_number}: {error:?}") + })?; + + store + .hot_db + .put_bytes(DBColumn::BeaconMeta, &already_reconstructed_db_key, &[1u8]) + .map_err(|error| { + format!("Era reconstruction marker write failed: {error:?}") + })?; + } + + let now = Instant::now(); + let done_era_files = completed_era_files.fetch_add(1, Ordering::Relaxed) + 1; + let done_slots = done_era_files.saturating_mul(slots_per_historical_root); + let mut progress = progress.lock(); + let (speedo, last_log) = &mut *progress; + speedo.observe(Slot::new(done_slots), now); + if now.duration_since(*last_log) >= Duration::from_secs(5) { + *last_log = now; + info!( + completed_era_files = done_era_files, + total_era_files, + completed_slots = done_slots, + total_slots = total_era_files.saturating_mul(slots_per_historical_root), + slots_per_second = speedo.slots_per_second().unwrap_or(0.0), + "Reconstructing from era files" + ); + } + + Ok::<(), String>(()) })?; Ok(builder) @@ -1287,6 +1333,52 @@ fn build_data_columns_from_blobs( Ok(data_columns) } +fn era_reconstruction_key(era_number: u64) -> Vec { + let mut key = b"era_recon:".to_vec(); + key.extend_from_slice(&era_number.to_be_bytes()); + key +} + +/// Track recent slot completion rates for era reconstruction. +#[derive(Default)] +struct Speedo(Vec<(Slot, Instant)>); + +impl Speedo { + fn observe(&mut self, slot: Slot, instant: Instant) { + const SPEEDO_OBSERVATIONS: usize = 4; + if self.0.len() > SPEEDO_OBSERVATIONS { + self.0.remove(0); + } + self.0.push((slot, instant)); + } + + fn slots_per_second(&self) -> Option { + let speeds = self + .0 + .windows(2) + .filter_map(|windows| { + let (slot_a, instant_a) = windows[0]; + let (slot_b, instant_b) = windows[1]; + let distance = f64::from((slot_b - slot_a).as_u64() as u32); + let seconds = f64::from((instant_b - instant_a).as_millis() as u32) / 1_000.0; + if seconds > 0.0 { + Some(distance / seconds) + } else { + None + } + }) + .collect::>(); + + let count = speeds.len(); + let sum: f64 = speeds.iter().sum(); + if count > 0 { + Some(sum / f64::from(count as u32)) + } else { + None + } + } +} + #[cfg(not(debug_assertions))] #[cfg(test)] mod test { diff --git a/beacon_node/store/src/hot_cold_store.rs b/beacon_node/store/src/hot_cold_store.rs index 6144e8d3b4c..5b139af2b2f 100644 --- a/beacon_node/store/src/hot_cold_store.rs +++ b/beacon_node/store/src/hot_cold_store.rs @@ -2095,31 +2095,16 @@ impl, Cold: ItemStore> HotColdDB self.store_cold_state_summary(state_root, state.slot(), ops)?; let slot = state.slot(); - match self.cold_storage_strategy(slot)? { - StorageStrategy::ReplayFrom(from) => { - debug!( - strategy = "replay", - from_slot = %from, - %slot, - "Storing cold state", - ); + let strategy = self.cold_storage_strategy(slot)?; + debug!(?strategy, %slot, "Storing cold state"); + match strategy { + StorageStrategy::ReplayFrom(_) => { // Already have persisted the state summary, don't persist anything else } StorageStrategy::Snapshot => { - debug!( - strategy = "snapshot", - %slot, - "Storing cold state" - ); self.store_cold_state_as_snapshot(state, ops)?; } StorageStrategy::DiffFrom(from) => { - debug!( - strategy = "diff", - from_slot = %from, - %slot, - "Storing cold state" - ); self.store_cold_state_as_diff(state, from, ops)?; } } From 8965fd0d4eab78a2f7dbe9da47f30fc0c23fdecd Mon Sep 17 00:00:00 2001 From: dapplion <35266934+dapplion@users.noreply.github.com> Date: Sun, 28 Dec 2025 16:48:05 -0300 Subject: [PATCH 07/18] Cleaner impl with more checks --- beacon_node/beacon_chain/src/builder.rs | 63 ++-- .../beacon_chain/src/era_file_consumer.rs | 283 ++++++++++++++---- beacon_node/store/src/hot_cold_store.rs | 40 +++ .../types/src/state/historical_summary.rs | 4 + 4 files changed, 314 insertions(+), 76 deletions(-) diff --git a/beacon_node/beacon_chain/src/builder.rs b/beacon_node/beacon_chain/src/builder.rs index f5de531ca24..5f708f2372f 100644 --- a/beacon_node/beacon_chain/src/builder.rs +++ b/beacon_node/beacon_chain/src/builder.rs @@ -6,7 +6,7 @@ use crate::beacon_chain::{ use crate::beacon_proposer_cache::BeaconProposerCache; use crate::custody_context::NodeCustodyType; use crate::data_availability_checker::DataAvailabilityChecker; -use crate::era_file_consumer::import_era_files; +use crate::era_file_consumer::EraFileDir; use crate::fork_choice_signal::ForkChoiceSignalTx; use crate::fork_revert::{reset_fork_choice_to_finalization, revert_to_fork_boundary}; use crate::graffiti_calculator::{GraffitiCalculator, GraffitiOrigin}; @@ -42,7 +42,7 @@ use std::path::Path; use std::sync::Arc; use std::sync::atomic::{AtomicU64, Ordering}; use std::time::{Duration, Instant}; -use store::{DBColumn, Error as StoreError, HotColdDB, ItemStore, KeyValueStoreOp}; +use store::{Error as StoreError, HotColdDB, ItemStore, KeyValueStoreOp}; use task_executor::{ShutdownReason, TaskExecutor}; use tracing::{debug, error, info}; use tree_hash::TreeHash; @@ -236,20 +236,56 @@ where } // Import all blocks and states from the ERA files. - info!(?era_files_dir, "Importing blocks and states from ERA files"); - let max_era = import_era_files(&store, era_files_dir, &builder.spec)?; - - info!(max_era, "Reconstructing states from ERA files"); + let era_dir = EraFileDir::new::(era_files_dir, &builder.spec)?; + let max_era = era_dir.max_era(); let slots_per_historical_root = E::slots_per_historical_root() as u64; + + let imported_era_files_pointer = store + .get_era_import_pointer() + .map_err(|error| format!("Era import pointer read failed: {error:?}"))? + .unwrap_or(0); + info!( + ?era_files_dir, + max_slot = max_era * slots_per_historical_root, + current_slot = imported_era_files_pointer * slots_per_historical_root, + "Importing blocks and states from ERA files" + ); + let mut import_progress = Speedo::default(); + let mut import_last_log = Instant::now(); + for era_number in imported_era_files_pointer + 1..=max_era { + era_dir.import_era_file(&store, era_number, &builder.spec)?; + store + .set_era_import_pointer(era_number) + .map_err(|error| format!("Era import pointer write failed: {error:?}"))?; + + let now = Instant::now(); + let done_slots = era_number * slots_per_historical_root; + import_progress.observe(Slot::new(done_slots), now); + if now.duration_since(import_last_log) >= Duration::from_secs(5) { + import_last_log = now; + info!( + completed_era_files = era_number, + total_era_files = max_era, + completed_slots = done_slots, + total_slots = max_era * slots_per_historical_root, + slots_per_second = import_progress.slots_per_second().unwrap_or(0.0), + "Importing era files" + ); + } + } + + info!( + ?era_files_dir, + max_slot = max_era * slots_per_historical_root, + "Reconstructing states from ERA files" + ); let total_era_files = max_era; let completed_era_files = Arc::new(AtomicU64::new(0)); let progress = Arc::new(Mutex::new((Speedo::default(), Instant::now()))); (1..=max_era).into_par_iter().try_for_each(|era_number| { - let already_reconstructed_db_key = era_reconstruction_key(era_number); let already_reconstructed = store - .hot_db - .key_exists(DBColumn::BeaconMeta, &already_reconstructed_db_key) + .era_reconstruction_done(era_number) .map_err(|error| format!("Era reconstruction marker read failed: {error:?}"))?; if !already_reconstructed { @@ -268,8 +304,7 @@ where })?; store - .hot_db - .put_bytes(DBColumn::BeaconMeta, &already_reconstructed_db_key, &[1u8]) + .set_era_reconstruction_done(era_number) .map_err(|error| { format!("Era reconstruction marker write failed: {error:?}") })?; @@ -1333,12 +1368,6 @@ fn build_data_columns_from_blobs( Ok(data_columns) } -fn era_reconstruction_key(era_number: u64) -> Vec { - let mut key = b"era_recon:".to_vec(); - key.extend_from_slice(&era_number.to_be_bytes()); - key -} - /// Track recent slot completion rates for era reconstruction. #[derive(Default)] struct Speedo(Vec<(Slot, Instant)>); diff --git a/beacon_node/beacon_chain/src/era_file_consumer.rs b/beacon_node/beacon_chain/src/era_file_consumer.rs index 47f6a4979a5..f6500a3bd28 100644 --- a/beacon_node/beacon_chain/src/era_file_consumer.rs +++ b/beacon_node/beacon_chain/src/era_file_consumer.rs @@ -1,68 +1,13 @@ +use bls::FixedBytesExtended; use reth_era::common::file_ops::StreamReader; use reth_era::era::file::EraReader; use reth_era::era::types::consensus::{CompressedBeaconState, CompressedSignedBeaconBlock}; use std::fs::{self, File}; use std::path::{Path, PathBuf}; use store::{DBColumn, HotColdDB, ItemStore, KeyValueStoreOp}; -use tracing::{info, warn}; -use types::{BeaconState, ChainSpec, EthSpec, SignedBeaconBlock, Slot}; - -pub(crate) fn import_era_files, Cold: ItemStore>( - store: &HotColdDB, - era_files_dir: &Path, - spec: &ChainSpec, -) -> Result { - let mut era_files = list_era_files(era_files_dir)?; - era_files.sort_by_key(|(era_number, _)| *era_number); - - let network_name = spec - .config_name - .clone() - .unwrap_or_else(|| "unknown".to_string()); - - let mut max_era = None; - for (era_number, path) in era_files { - info!(era_number, ?path, "Importing era file"); - import_era_file(store, &path, era_number, &network_name, spec) - .map_err(|error| format!("era file {era_number} {path:?} import failed: {error}"))?; - max_era = Some(era_number); - } - - max_era.ok_or_else(|| "era files directory is empty".to_string()) -} - -fn import_era_file, Cold: ItemStore>( - store: &HotColdDB, - path: &Path, - era_number: u64, - network_name: &str, - spec: &ChainSpec, -) -> Result<(), String> { - let file = File::open(path).map_err(|error| format!("failed to open era file: {error}"))?; - let era_file = EraReader::new(file) - .read_and_assemble(network_name.to_string()) - .map_err(|error| format!("failed to parse era file: {error:?}"))?; - - for compressed_block in era_file.group.blocks { - let block = decode_block::(compressed_block, spec)?; - let block_root = block.canonical_root(); - store - .put_block(&block_root, block) - .map_err(|error| format!("failed to store block: {error:?}"))?; - } - - let mut state = decode_state::(era_file.group.era_state, spec)?; - let state_root = state - .canonical_root() - .map_err(|error| format!("failed to hash state: {error:?}"))?; - // Use put_cold_state as the split is not updated and we need the state into the cold store. - store - .put_cold_state(&state_root, &state) - .map_err(|error| format!("failed to store state: {error:?}"))?; - write_block_root_index_for_era(store, &state, era_number)?; - - Ok(()) -} +use tracing::warn; +use tree_hash::TreeHash; +use types::{BeaconState, ChainSpec, EthSpec, Hash256, HistoricalSummary, SignedBeaconBlock, Slot}; fn decode_block( compressed: CompressedSignedBeaconBlock, @@ -86,6 +31,226 @@ fn decode_state( .map_err(|error| format!("failed to decode state: {error:?}")) } +pub(crate) struct EraFileDir { + dir: PathBuf, + network_name: String, + genesis_validators_root: Hash256, + historical_roots: Vec, + historical_summaries: Vec, + max_era: u64, +} + +impl EraFileDir { + pub(crate) fn new(era_files_dir: &Path, spec: &ChainSpec) -> Result { + let mut era_files = list_era_files(era_files_dir)?; + era_files.sort_by_key(|(era_number, _)| *era_number); + + let network_name = spec + .config_name + .clone() + .unwrap_or_else(|| "unknown".to_string()); + + let Some((max_era, reference_path)) = era_files.last().cloned() else { + return Err("era files directory is empty".to_string()); + }; + + let reference_state = read_era_state::(&reference_path, &network_name, spec)?; + + // historical_roots was frozen in capella, and continued as historical_summaries + let historical_roots = reference_state.historical_roots().to_vec(); + // Pre-Capella states don't have historical_summaries property + let historical_summaries = match reference_state.historical_summaries() { + Ok(list) => list.to_vec(), + Err(_) => vec![], + }; + + let dir = era_files_dir.to_path_buf(); + let era_dir = Self { + dir, + network_name, + genesis_validators_root: reference_state.genesis_validators_root(), + historical_roots, + historical_summaries, + max_era, + }; + + // Verify that every expected era file name exists in the directory. + for era_number in 0..=era_dir.max_era { + let expected = era_dir.expected_path(era_number); + if !expected.exists() { + return Err(format!("missing era file: {expected:?}")); + } + } + + Ok(era_dir) + } + + pub(crate) fn max_era(&self) -> u64 { + self.max_era + } + + pub(crate) fn import_era_file, Cold: ItemStore>( + &self, + store: &HotColdDB, + era_number: u64, + spec: &ChainSpec, + ) -> Result<(), String> { + let path = self.expected_path(era_number); + let file = File::open(path).map_err(|error| format!("failed to open era file: {error}"))?; + let era_file = EraReader::new(file) + .read_and_assemble(self.network_name.clone()) + .map_err(|error| format!("failed to parse era file: {error:?}"))?; + + // Consistency checks: ensure the era state matches the expected historical root and that + // each block root matches the state block_roots for its slot. + let mut state = decode_state::(era_file.group.era_state, spec)?; + let expected_root = self + .era_file_name_root(era_number) + .ok_or_else(|| format!("missing historical root for era {era_number}"))?; + let actual_root = era_root_from_state(&state, era_number)?; + if expected_root != actual_root { + return Err(format!( + "era root mismatch for era {era_number}: expected {expected_root:?}, got {actual_root:?}" + )); + } + + let slots_per_historical_root = E::slots_per_historical_root() as u64; + let _start_slot = Slot::new(era_number.saturating_sub(1) * slots_per_historical_root); + let end_slot = Slot::new(era_number * slots_per_historical_root); + if state.slot() != end_slot { + return Err(format!( + "era state slot mismatch: expected {end_slot}, got {}", + state.slot() + )); + } + + // Check that the block roots in this state match the ones in the last state, + // only if the state is post-capella (historical_summaries exist). + if let Ok(summaries) = state.historical_summaries() + && era_number > 0 + { + let index = era_number.saturating_sub(1) as usize; + // historical_summaries started to be appended after capella, so we need to offset + let summary_index = index + .checked_sub(self.historical_roots.len()) + .ok_or_else(|| format!("missing historical summary index for era {era_number}"))?; + let summary = summaries + .get(summary_index) + .ok_or_else(|| format!("missing historical summary for era {era_number}"))?; + let expected_root = state.block_roots().tree_hash_root(); + let actual_root = summary.block_summary_root(); + if actual_root != expected_root { + return Err(format!( + "block summary root mismatch for era {era_number}: {expected_root:?} != {actual_root:?}", + )); + } + } + + // TODO(era): Block signatures are not verified here and are trusted. + for compressed_block in era_file.group.blocks { + let block = decode_block::(compressed_block, spec)?; + let slot = block.slot(); + let block_root = block.canonical_root(); + + // Check consistency that this block is expected w.r.t. the state in the era file. + let expected_block_root = state + .get_block_root(slot) + .map_err(|error| format!("failed to read block root {slot}: {error:?}"))?; + if *expected_block_root != block_root { + return Err(format!( + "block root mismatch at slot {slot}: expected {expected_block_root:?}, got {block_root:?}" + )); + } + store + .put_block(&block_root, block) + .map_err(|error| format!("failed to store block: {error:?}"))?; + } + + // Populate the cold DB slot -> block root index from the state.block_roots() + write_block_root_index_for_era(store, &state, era_number)?; + + let state_root = state + .canonical_root() + .map_err(|error| format!("failed to hash state: {error:?}"))?; + // Use put_cold_state as the split is not updated and we need the state into the cold store. + store + .put_cold_state(&state_root, &state) + .map_err(|error| format!("failed to store state: {error:?}"))?; + Ok(()) + } + + fn expected_path(&self, era_number: u64) -> PathBuf { + let root = self + .era_file_name_root(era_number) + .unwrap_or_else(Hash256::zero); + let short = root + .as_slice() + .iter() + .take(4) + .map(|byte| format!("{byte:02x}")) + .collect::(); + let filename = format!("{}-{era_number:05}-{short}.era", self.network_name); + self.dir.join(filename) + } + + // era_file_name_root for file naming: + // short-era-root is the first 4 bytes of the last historical root in the last state in the + // era file, lower-case hex-encoded (8 characters), except the genesis era which instead + // uses the genesis_validators_root field from the genesis state. + // - The root is available as state.historical_roots[era - 1] except for genesis, which is + // state.genesis_validators_root + // - Post-Capella, the root must be computed from + // `state.historical_summaries[era - state.historical_roots.len - 1]` + fn era_file_name_root(&self, era_number: u64) -> Option { + if era_number == 0 { + return Some(self.genesis_validators_root); + } + let index = era_number.saturating_sub(1) as usize; + if let Some(root) = self.historical_roots.get(index) { + return Some(*root); + } + let summary_index = index.saturating_sub(self.historical_roots.len()); + self.historical_summaries + .get(summary_index) + .map(|summary| summary.tree_hash_root()) + } +} + +fn read_era_state( + path: &Path, + network_name: &str, + spec: &ChainSpec, +) -> Result, String> { + let file = File::open(path).map_err(|error| format!("failed to open era file: {error}"))?; + let era_file = EraReader::new(file) + .read_and_assemble(network_name.to_string()) + .map_err(|error| format!("failed to parse era file: {error:?}"))?; + decode_state::(era_file.group.era_state, spec) +} + +fn era_root_from_state( + state: &BeaconState, + era_number: u64, +) -> Result { + if era_number == 0 { + return Ok(state.genesis_validators_root()); + } + let index = era_number + .checked_sub(1) + .ok_or_else(|| "invalid era number".to_string())? as usize; + if let Some(root) = state.historical_roots().get(index) { + return Ok(*root); + } + if let Ok(summaries) = state.historical_summaries() { + let summary_index = index.saturating_sub(state.historical_roots().len()); + let summary = summaries + .get(summary_index) + .ok_or_else(|| "missing historical summary".to_string())?; + return Ok(summary.tree_hash_root()); + } + Err(format!("missing historical root for era {era_number}")) +} + fn write_block_root_index_for_era, Cold: ItemStore>( store: &HotColdDB, state: &BeaconState, diff --git a/beacon_node/store/src/hot_cold_store.rs b/beacon_node/store/src/hot_cold_store.rs index 5b139af2b2f..6684369c919 100644 --- a/beacon_node/store/src/hot_cold_store.rs +++ b/beacon_node/store/src/hot_cold_store.rs @@ -88,6 +88,16 @@ pub struct HotColdDB, Cold: ItemStore> { _phantom: PhantomData, } +fn era_import_pointer_key() -> &'static [u8] { + b"era_import_ptr" +} + +fn era_reconstruction_key(era_number: u64) -> Vec { + let mut key = b"era_recon:".to_vec(); + key.extend_from_slice(&era_number.to_be_bytes()); + key +} + #[derive(Debug)] struct BlockCache { block_cache: LruCache>, @@ -3133,6 +3143,36 @@ impl, Cold: ItemStore> HotColdDB self.config.compact_on_prune } + pub fn get_era_import_pointer(&self) -> Result, Error> { + let Some(bytes) = self.hot_db.get_bytes(DBColumn::BeaconMeta, era_import_pointer_key())? + else { + return Ok(None); + }; + let bytes: [u8; 8] = bytes + .as_slice() + .try_into() + .map_err(|_| Error::InvalidBytes)?; + Ok(Some(u64::from_be_bytes(bytes))) + } + + pub fn set_era_import_pointer(&self, era_number: u64) -> Result<(), Error> { + self.hot_db + .put_bytes(DBColumn::BeaconMeta, era_import_pointer_key(), &era_number.to_be_bytes()) + } + + pub fn era_reconstruction_done(&self, era_number: u64) -> Result { + self.hot_db + .key_exists(DBColumn::BeaconMeta, &era_reconstruction_key(era_number)) + } + + pub fn set_era_reconstruction_done(&self, era_number: u64) -> Result<(), Error> { + self.hot_db.put_bytes( + DBColumn::BeaconMeta, + &era_reconstruction_key(era_number), + &[1u8], + ) + } + /// Load the timestamp of the last compaction as a `Duration` since the UNIX epoch. pub fn load_compaction_timestamp(&self) -> Result, Error> { Ok(self diff --git a/consensus/types/src/state/historical_summary.rs b/consensus/types/src/state/historical_summary.rs index f520e464837..eca28b88fb0 100644 --- a/consensus/types/src/state/historical_summary.rs +++ b/consensus/types/src/state/historical_summary.rs @@ -47,4 +47,8 @@ impl HistoricalSummary { state_summary_root: state.state_roots().tree_hash_root(), } } + + pub fn block_summary_root(&self) -> Hash256 { + self.block_summary_root + } } From ddba894efa5ccefa15cf8db9a4194051b87b0487 Mon Sep 17 00:00:00 2001 From: dapplion <35266934+dapplion@users.noreply.github.com> Date: Mon, 29 Dec 2025 21:08:11 -0300 Subject: [PATCH 08/18] Add checks precapella --- .../beacon_chain/src/era_file_consumer.rs | 59 +++++++++++++++---- 1 file changed, 48 insertions(+), 11 deletions(-) diff --git a/beacon_node/beacon_chain/src/era_file_consumer.rs b/beacon_node/beacon_chain/src/era_file_consumer.rs index f6500a3bd28..1f6bcf3decf 100644 --- a/beacon_node/beacon_chain/src/era_file_consumer.rs +++ b/beacon_node/beacon_chain/src/era_file_consumer.rs @@ -7,7 +7,10 @@ use std::path::{Path, PathBuf}; use store::{DBColumn, HotColdDB, ItemStore, KeyValueStoreOp}; use tracing::warn; use tree_hash::TreeHash; -use types::{BeaconState, ChainSpec, EthSpec, Hash256, HistoricalSummary, SignedBeaconBlock, Slot}; +use types::{ + BeaconState, ChainSpec, EthSpec, Hash256, HistoricalBatch, HistoricalSummary, + SignedBeaconBlock, Slot, +}; fn decode_block( compressed: CompressedSignedBeaconBlock, @@ -124,24 +127,56 @@ impl EraFileDir { )); } - // Check that the block roots in this state match the ones in the last state, - // only if the state is post-capella (historical_summaries exist). - if let Ok(summaries) = state.historical_summaries() - && era_number > 0 - { + // Check that the block roots vector in this state match the historical summary in the last + // state. Asserts that the blocks are exactly the expected ones given a trusted final state + if era_number == 0 { + // Skip checking genesis state era file for now + } else if state.fork_name_unchecked().capella_enabled() { + // Post-capella state, check against historical summaries + // ```py + // historical_summary = HistoricalSummary( + // block_summary_root=hash_tree_root(state.block_roots), + // state_summary_root=hash_tree_root(state.state_roots), + // ) + // state.historical_summaries.append(historical_summary) + // ``` let index = era_number.saturating_sub(1) as usize; // historical_summaries started to be appended after capella, so we need to offset let summary_index = index .checked_sub(self.historical_roots.len()) .ok_or_else(|| format!("missing historical summary index for era {era_number}"))?; - let summary = summaries + let expected_root = self + .historical_summaries .get(summary_index) - .ok_or_else(|| format!("missing historical summary for era {era_number}"))?; - let expected_root = state.block_roots().tree_hash_root(); - let actual_root = summary.block_summary_root(); + .ok_or_else(|| format!("missing historical summary for era {era_number}"))? + .block_summary_root(); + let actual_root = state.block_roots().tree_hash_root(); + if actual_root != expected_root { + return Err(format!( + "block summary root post-capella mismatch for era {}: {:?} != {:?}", + era_number, expected_root, actual_root + )); + } + } else { + // Pre-capella state, check against historical roots + // ```py + // historical_batch = HistoricalBatch(block_roots=state.block_roots, state_roots=state.state_roots) + // state.historical_roots.append(hash_tree_root(historical_batch)) + // ``` + let index = era_number.saturating_sub(1) as usize; + let expected_root = *self + .historical_roots + .get(index) + .ok_or_else(|| format!("missing historical root for era {era_number}"))?; + let historical_batch = HistoricalBatch:: { + block_roots: state.block_roots().clone(), + state_roots: state.state_roots().clone(), + }; + let actual_root = historical_batch.tree_hash_root(); if actual_root != expected_root { return Err(format!( - "block summary root mismatch for era {era_number}: {expected_root:?} != {actual_root:?}", + "block summary root pre-capella mismatch for era {}: {:?} != {:?}", + era_number, expected_root, actual_root )); } } @@ -153,6 +188,8 @@ impl EraFileDir { let block_root = block.canonical_root(); // Check consistency that this block is expected w.r.t. the state in the era file. + // Since we check that the state block roots match the historical summary, we know that + // this block root is the expected one. let expected_block_root = state .get_block_root(slot) .map_err(|error| format!("failed to read block root {slot}: {error:?}"))?; From 1f94cee29a304875c758033ab3d109f12cc8eab0 Mon Sep 17 00:00:00 2001 From: dapplion <35266934+dapplion@users.noreply.github.com> Date: Mon, 29 Dec 2025 21:59:50 -0300 Subject: [PATCH 09/18] Parallel import --- .../beacon_chain/src/era_file_consumer.rs | 103 ++++++++++++------ beacon_node/store/src/hot_cold_store.rs | 11 +- 2 files changed, 80 insertions(+), 34 deletions(-) diff --git a/beacon_node/beacon_chain/src/era_file_consumer.rs b/beacon_node/beacon_chain/src/era_file_consumer.rs index 1f6bcf3decf..ca3836147a6 100644 --- a/beacon_node/beacon_chain/src/era_file_consumer.rs +++ b/beacon_node/beacon_chain/src/era_file_consumer.rs @@ -1,11 +1,12 @@ use bls::FixedBytesExtended; +use rayon::prelude::*; use reth_era::common::file_ops::StreamReader; use reth_era::era::file::EraReader; use reth_era::era::types::consensus::{CompressedBeaconState, CompressedSignedBeaconBlock}; use std::fs::{self, File}; use std::path::{Path, PathBuf}; use store::{DBColumn, HotColdDB, ItemStore, KeyValueStoreOp}; -use tracing::warn; +use tracing::{debug_span, instrument, warn}; use tree_hash::TreeHash; use types::{ BeaconState, ChainSpec, EthSpec, Hash256, HistoricalBatch, HistoricalSummary, @@ -92,6 +93,7 @@ impl EraFileDir { self.max_era } + #[instrument(level = "debug", skip_all, fields(era_number = %era_number))] pub(crate) fn import_era_file, Cold: ItemStore>( &self, store: &HotColdDB, @@ -100,13 +102,19 @@ impl EraFileDir { ) -> Result<(), String> { let path = self.expected_path(era_number); let file = File::open(path).map_err(|error| format!("failed to open era file: {error}"))?; - let era_file = EraReader::new(file) - .read_and_assemble(self.network_name.clone()) - .map_err(|error| format!("failed to parse era file: {error:?}"))?; + let era_file = { + let _span = debug_span!("era_import_read").entered(); + EraReader::new(file) + .read_and_assemble(self.network_name.clone()) + .map_err(|error| format!("failed to parse era file: {error:?}"))? + }; // Consistency checks: ensure the era state matches the expected historical root and that // each block root matches the state block_roots for its slot. - let mut state = decode_state::(era_file.group.era_state, spec)?; + let mut state = { + let _span = debug_span!("era_import_decode_state").entered(); + decode_state::(era_file.group.era_state, spec)? + }; let expected_root = self .era_file_name_root(era_number) .ok_or_else(|| format!("missing historical root for era {era_number}"))?; @@ -182,37 +190,70 @@ impl EraFileDir { } // TODO(era): Block signatures are not verified here and are trusted. - for compressed_block in era_file.group.blocks { - let block = decode_block::(compressed_block, spec)?; - let slot = block.slot(); - let block_root = block.canonical_root(); - - // Check consistency that this block is expected w.r.t. the state in the era file. - // Since we check that the state block roots match the historical summary, we know that - // this block root is the expected one. - let expected_block_root = state - .get_block_root(slot) - .map_err(|error| format!("failed to read block root {slot}: {error:?}"))?; - if *expected_block_root != block_root { - return Err(format!( - "block root mismatch at slot {slot}: expected {expected_block_root:?}, got {block_root:?}" - )); + // decode and hash is split in two loops to track timings better. If we add spans for each + // block it's too short and the data is not really useful. + let decoded_blocks = { + let _span = debug_span!("era_import_decode_blocks").entered(); + era_file + .group + .blocks + .into_par_iter() + .map(|compressed_block| decode_block::(compressed_block, spec)) + .collect::, _>>()? + }; + let blocks_with_roots = { + let _span = debug_span!("era_import_hash_blocks").entered(); + decoded_blocks + .into_par_iter() + .map(|block| (block.canonical_root(), block)) + .collect::>() + }; + + let mut block_ops = vec![]; + { + let _ = debug_span!("era_import_db_ops_blocks").entered(); + for (block_root, block) in blocks_with_roots { + let slot = block.slot(); + // Check consistency that this block is expected w.r.t. the state in the era file. + // Since we check that the state block roots match the historical summary, we know that + // this block root is the expected one. + let expected_block_root = state + .get_block_root(slot) + .map_err(|error| format!("failed to read block root {slot}: {error:?}"))?; + if *expected_block_root != block_root { + return Err(format!( + "block root mismatch at slot {slot}: expected {expected_block_root:?}, got {block_root:?}" + )); + } + store + .block_as_kv_store_ops(&block_root, block, &mut block_ops) + .map_err(|error| format!("failed to store block: {error:?}"))?; } + } + { + let _ = debug_span!("era_import_write_blocks").entered(); store - .put_block(&block_root, block) - .map_err(|error| format!("failed to store block: {error:?}"))?; + .hot_db + .do_atomically(block_ops) + .map_err(|error| format!("failed to store blocks: {error:?}"))?; } // Populate the cold DB slot -> block root index from the state.block_roots() - write_block_root_index_for_era(store, &state, era_number)?; - - let state_root = state - .canonical_root() - .map_err(|error| format!("failed to hash state: {error:?}"))?; - // Use put_cold_state as the split is not updated and we need the state into the cold store. - store - .put_cold_state(&state_root, &state) - .map_err(|error| format!("failed to store state: {error:?}"))?; + { + let _span = debug_span!("era_import_write_block_index").entered(); + write_block_root_index_for_era(store, &state, era_number)?; + } + + { + let _span = debug_span!("era_import_write_state").entered(); + let state_root = state + .canonical_root() + .map_err(|error| format!("failed to hash state: {error:?}"))?; + // Use put_cold_state as the split is not updated and we need the state into the cold store. + store + .put_cold_state(&state_root, &state) + .map_err(|error| format!("failed to store state: {error:?}"))?; + } Ok(()) } diff --git a/beacon_node/store/src/hot_cold_store.rs b/beacon_node/store/src/hot_cold_store.rs index 6684369c919..44b952233a7 100644 --- a/beacon_node/store/src/hot_cold_store.rs +++ b/beacon_node/store/src/hot_cold_store.rs @@ -3144,7 +3144,9 @@ impl, Cold: ItemStore> HotColdDB } pub fn get_era_import_pointer(&self) -> Result, Error> { - let Some(bytes) = self.hot_db.get_bytes(DBColumn::BeaconMeta, era_import_pointer_key())? + let Some(bytes) = self + .hot_db + .get_bytes(DBColumn::BeaconMeta, era_import_pointer_key())? else { return Ok(None); }; @@ -3156,8 +3158,11 @@ impl, Cold: ItemStore> HotColdDB } pub fn set_era_import_pointer(&self, era_number: u64) -> Result<(), Error> { - self.hot_db - .put_bytes(DBColumn::BeaconMeta, era_import_pointer_key(), &era_number.to_be_bytes()) + self.hot_db.put_bytes( + DBColumn::BeaconMeta, + era_import_pointer_key(), + &era_number.to_be_bytes(), + ) } pub fn era_reconstruction_done(&self, era_number: u64) -> Result { From 595a451bbf14b57b8081042e1c7fed1bbcb5a34f Mon Sep 17 00:00:00 2001 From: dapplion <35266934+dapplion@users.noreply.github.com> Date: Tue, 30 Dec 2025 03:56:51 -0300 Subject: [PATCH 10/18] Add logs --- beacon_node/beacon_chain/src/era_file_consumer.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/beacon_node/beacon_chain/src/era_file_consumer.rs b/beacon_node/beacon_chain/src/era_file_consumer.rs index ca3836147a6..e285fb27bf8 100644 --- a/beacon_node/beacon_chain/src/era_file_consumer.rs +++ b/beacon_node/beacon_chain/src/era_file_consumer.rs @@ -6,7 +6,7 @@ use reth_era::era::types::consensus::{CompressedBeaconState, CompressedSignedBea use std::fs::{self, File}; use std::path::{Path, PathBuf}; use store::{DBColumn, HotColdDB, ItemStore, KeyValueStoreOp}; -use tracing::{debug_span, instrument, warn}; +use tracing::{debug, debug_span, instrument, warn}; use tree_hash::TreeHash; use types::{ BeaconState, ChainSpec, EthSpec, Hash256, HistoricalBatch, HistoricalSummary, @@ -101,6 +101,7 @@ impl EraFileDir { spec: &ChainSpec, ) -> Result<(), String> { let path = self.expected_path(era_number); + debug!(?path, era_number, "Importing era file"); let file = File::open(path).map_err(|error| format!("failed to open era file: {error}"))?; let era_file = { let _span = debug_span!("era_import_read").entered(); @@ -189,6 +190,7 @@ impl EraFileDir { } } + debug!(era_number, "Importing blocks from era file"); // TODO(era): Block signatures are not verified here and are trusted. // decode and hash is split in two loops to track timings better. If we add spans for each // block it's too short and the data is not really useful. @@ -244,6 +246,7 @@ impl EraFileDir { write_block_root_index_for_era(store, &state, era_number)?; } + debug!(era_number, "Importing state from era file"); { let _span = debug_span!("era_import_write_state").entered(); let state_root = state From eb27fad5b23ece8639e49bf756260a450a4838be Mon Sep 17 00:00:00 2001 From: dapplion <35266934+dapplion@users.noreply.github.com> Date: Tue, 30 Dec 2025 04:05:32 -0300 Subject: [PATCH 11/18] add more logs --- beacon_node/beacon_chain/src/builder.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/beacon_node/beacon_chain/src/builder.rs b/beacon_node/beacon_chain/src/builder.rs index 5f708f2372f..3b47ee1b58e 100644 --- a/beacon_node/beacon_chain/src/builder.rs +++ b/beacon_node/beacon_chain/src/builder.rs @@ -253,7 +253,9 @@ where let mut import_progress = Speedo::default(); let mut import_last_log = Instant::now(); for era_number in imported_era_files_pointer + 1..=max_era { + debug!(?era_files_dir, ?era_number, "Importing ERA file"); era_dir.import_era_file(&store, era_number, &builder.spec)?; + debug!(?era_files_dir, ?era_number, "Imported ERA file"); store .set_era_import_pointer(era_number) .map_err(|error| format!("Era import pointer write failed: {error:?}"))?; From 3a87d8dd0ad5f55855a8bd30475698fee1e7614b Mon Sep 17 00:00:00 2001 From: dapplion <35266934+dapplion@users.noreply.github.com> Date: Fri, 2 Jan 2026 16:16:24 -0300 Subject: [PATCH 12/18] Debug stalled loop --- beacon_node/beacon_chain/src/builder.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/beacon_node/beacon_chain/src/builder.rs b/beacon_node/beacon_chain/src/builder.rs index 3b47ee1b58e..d439f14fa45 100644 --- a/beacon_node/beacon_chain/src/builder.rs +++ b/beacon_node/beacon_chain/src/builder.rs @@ -253,12 +253,13 @@ where let mut import_progress = Speedo::default(); let mut import_last_log = Instant::now(); for era_number in imported_era_files_pointer + 1..=max_era { - debug!(?era_files_dir, ?era_number, "Importing ERA file"); + debug!(?era_files_dir, era_number, "Importing ERA file"); era_dir.import_era_file(&store, era_number, &builder.spec)?; - debug!(?era_files_dir, ?era_number, "Imported ERA file"); + debug!(?era_files_dir, era_number, "Imported ERA file"); store .set_era_import_pointer(era_number) .map_err(|error| format!("Era import pointer write failed: {error:?}"))?; + debug!(?era_files_dir, era_number, "Persisted era pointer"); let now = Instant::now(); let done_slots = era_number * slots_per_historical_root; From 4fac1e301c9fbdd82f960f5b20c59d79f311ead8 Mon Sep 17 00:00:00 2001 From: dapplion <35266934+dapplion@users.noreply.github.com> Date: Mon, 5 Jan 2026 20:19:13 -0300 Subject: [PATCH 13/18] Improve error --- beacon_node/beacon_chain/src/era_file_consumer.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/beacon_node/beacon_chain/src/era_file_consumer.rs b/beacon_node/beacon_chain/src/era_file_consumer.rs index e285fb27bf8..8e7d00ed9bd 100644 --- a/beacon_node/beacon_chain/src/era_file_consumer.rs +++ b/beacon_node/beacon_chain/src/era_file_consumer.rs @@ -153,7 +153,10 @@ impl EraFileDir { // historical_summaries started to be appended after capella, so we need to offset let summary_index = index .checked_sub(self.historical_roots.len()) - .ok_or_else(|| format!("missing historical summary index for era {era_number}"))?; + .ok_or_else(|| format!( + "Not enough historical roots era number {era_number} index {index} historical_roots len {}", + self.historical_roots.len() + ))?; let expected_root = self .historical_summaries .get(summary_index) From df7791016be99a349032ab1f7e75c047fad80ee3 Mon Sep 17 00:00:00 2001 From: dapplion <35266934+dapplion@users.noreply.github.com> Date: Mon, 5 Jan 2026 20:44:22 -0300 Subject: [PATCH 14/18] Fix off by one condition on using historical summaries --- .../beacon_chain/src/era_file_consumer.rs | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/beacon_node/beacon_chain/src/era_file_consumer.rs b/beacon_node/beacon_chain/src/era_file_consumer.rs index 8e7d00ed9bd..4e680e4c1e0 100644 --- a/beacon_node/beacon_chain/src/era_file_consumer.rs +++ b/beacon_node/beacon_chain/src/era_file_consumer.rs @@ -9,7 +9,7 @@ use store::{DBColumn, HotColdDB, ItemStore, KeyValueStoreOp}; use tracing::{debug, debug_span, instrument, warn}; use tree_hash::TreeHash; use types::{ - BeaconState, ChainSpec, EthSpec, Hash256, HistoricalBatch, HistoricalSummary, + BeaconState, ChainSpec, Epoch, EthSpec, Hash256, HistoricalBatch, HistoricalSummary, SignedBeaconBlock, Slot, }; @@ -136,11 +136,25 @@ impl EraFileDir { )); } + let historical_summaries_active_at_slot = match store.spec.capella_fork_epoch { + // For mainnet case, Capella activates at 194048 epoch = 6209536 slot = 758 era number. + // The last epoch processing before capella transition adds a last entry to historical + // roots. So historical_roots.len() == 758 at the capella fork boundary. An ERA file + // includes the state AFTER advanced (or applying) the block at the final slot, so the + // state for ERA file 758 is of the Capella variant. However, historical summaries are + // still empty. + Some(epoch) => { + epoch.start_slot(E::slots_per_epoch()) + + Slot::new(E::slots_per_historical_root() as u64) + } + None => Slot::max_value(), + }; + // Check that the block roots vector in this state match the historical summary in the last // state. Asserts that the blocks are exactly the expected ones given a trusted final state if era_number == 0 { // Skip checking genesis state era file for now - } else if state.fork_name_unchecked().capella_enabled() { + } else if state.slot() >= historical_summaries_active_at_slot { // Post-capella state, check against historical summaries // ```py // historical_summary = HistoricalSummary( @@ -357,6 +371,7 @@ fn write_block_root_index_for_era, Cold: ItemStore let block_root = state .get_block_root(slot) .map_err(|error| format!("failed to read block root {slot}: {error:?}"))?; + // TODO(era): Should we write BeaconBlockRoots for missed slots? Ok(KeyValueStoreOp::PutKeyValue( DBColumn::BeaconBlockRoots, slot_u64.to_be_bytes().to_vec(), From 6e519147b2d104d85deaf3f1a58439e9c73e484f Mon Sep 17 00:00:00 2001 From: dapplion <35266934+dapplion@users.noreply.github.com> Date: Tue, 10 Feb 2026 14:44:04 +0100 Subject: [PATCH 15/18] fix lint: remove unused import, sort deps --- Cargo.lock | 1044 ++++++----------- Cargo.toml | 2 +- .../beacon_chain/src/era_file_consumer.rs | 2 +- 3 files changed, 385 insertions(+), 663 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3fa59045af3..fb2f3d13c5e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,7 +4,7 @@ version = 4 [[package]] name = "account_manager" -version = "8.0.1" +version = "8.1.0" dependencies = [ "account_utils", "bls", @@ -65,19 +65,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "aes" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" -dependencies = [ - "cfg-if", - "cipher 0.3.0", - "cpufeatures", - "ctr 0.8.0", - "opaque-debug", -] - [[package]] name = "aes" version = "0.8.4" @@ -85,7 +72,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ "cfg-if", - "cipher 0.4.4", + "cipher", "cpufeatures", ] @@ -96,9 +83,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" dependencies = [ "aead", - "aes 0.8.4", - "cipher 0.4.4", - "ctr 0.9.2", + "aes", + "cipher", + "ctr", "ghash", "subtle", ] @@ -124,6 +111,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "alloca" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7d05ea6aea7e9e64d25b9156ba2fee3fdd659e34e41063cd2fc7cd020d7f4" +dependencies = [ + "cc", +] + [[package]] name = "allocator-api2" version = "0.2.21" @@ -253,7 +249,7 @@ dependencies = [ "either", "serde", "serde_with", - "sha2 0.10.9", + "sha2", "thiserror 2.0.17", ] @@ -1044,7 +1040,7 @@ dependencies = [ "futures-lite", "parking", "polling", - "rustix 1.1.2", + "rustix", "slab", "windows-sys 0.61.2", ] @@ -1245,9 +1241,8 @@ dependencies = [ "genesis", "hex", "int_to_bytes", - "itertools 0.10.5", + "itertools 0.14.0", "kzg", - "lighthouse_tracing", "lighthouse_version", "logging", "lru 0.12.5", @@ -1286,12 +1281,12 @@ dependencies = [ "tree_hash_derive", "typenum", "types", - "zstd 0.13.3", + "zstd", ] [[package]] name = "beacon_node" -version = "8.0.1" +version = "8.1.0" dependencies = [ "account_utils", "beacon_chain", @@ -1330,7 +1325,7 @@ dependencies = [ "clap", "eth2", "futures", - "itertools 0.10.5", + "itertools 0.14.0", "sensitive_url", "serde", "slot_clock", @@ -1349,7 +1344,7 @@ version = "0.1.0" dependencies = [ "fnv", "futures", - "itertools 0.10.5", + "itertools 0.14.0", "lighthouse_network", "logging", "metrics", @@ -1386,15 +1381,32 @@ dependencies = [ "itertools 0.12.1", "lazy_static", "lazycell", + "proc-macro2", + "quote", + "regex", + "rustc-hash 1.1.0", + "shlex", + "syn 2.0.110", +] + +[[package]] +name = "bindgen" +version = "0.72.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" +dependencies = [ + "bitflags 2.10.0", + "cexpr", + "clang-sys", + "itertools 0.13.0", "log", "prettyplease", "proc-macro2", "quote", "regex", - "rustc-hash 1.1.0", + "rustc-hash 2.1.1", "shlex", "syn 2.0.110", - "which", ] [[package]] @@ -1463,18 +1475,18 @@ dependencies = [ [[package]] name = "block-buffer" -version = "0.9.0" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ "generic-array", ] [[package]] -name = "block-buffer" -version = "0.10.4" +name = "block-padding" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" dependencies = [ "generic-array", ] @@ -1537,7 +1549,7 @@ dependencies = [ [[package]] name = "boot_node" -version = "8.0.1" +version = "8.1.0" dependencies = [ "beacon_node", "bytes", @@ -1632,33 +1644,13 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" dependencies = [ "serde", ] -[[package]] -name = "bzip2" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" -dependencies = [ - "bzip2-sys", - "libc", -] - -[[package]] -name = "bzip2-sys" -version = "0.1.13+1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225bff33b2141874fe80d71e07d6eec4f85c5c216453dd96388240f96e1acc14" -dependencies = [ - "cc", - "pkg-config", -] - [[package]] name = "c-kzg" version = "2.1.5" @@ -1712,6 +1704,15 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" +[[package]] +name = "cbc" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" +dependencies = [ + "cipher", +] + [[package]] name = "cc" version = "1.2.46" @@ -1752,7 +1753,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" dependencies = [ "cfg-if", - "cipher 0.4.4", + "cipher", "cpufeatures", ] @@ -1764,7 +1765,7 @@ checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" dependencies = [ "aead", "chacha20", - "cipher 0.4.4", + "cipher", "poly1305", "zeroize", ] @@ -1810,15 +1811,6 @@ dependencies = [ "half", ] -[[package]] -name = "cipher" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" -dependencies = [ - "generic-array", -] - [[package]] name = "cipher" version = "0.4.4" @@ -1950,6 +1942,18 @@ dependencies = [ "cc", ] +[[package]] +name = "cms" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b77c319abfd5219629c45c34c89ba945ed3c5e49fcde9d16b6c3885f118a730" +dependencies = [ + "const-oid", + "der", + "spki", + "x509-cert", +] + [[package]] name = "colorchoice" version = "1.0.4" @@ -2077,12 +2081,6 @@ dependencies = [ "unicode-xid", ] -[[package]] -name = "constant_time_eq" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" - [[package]] name = "context_deserialize" version = "0.2.0" @@ -2179,25 +2177,24 @@ dependencies = [ [[package]] name = "criterion" -version = "0.5.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" +checksum = "950046b2aa2492f9a536f5f4f9a3de7b9e2476e575e05bd6c333371add4d98f3" dependencies = [ + "alloca", "anes", "cast", "ciborium", "clap", "criterion-plot", - "is-terminal", - "itertools 0.10.5", + "itertools 0.13.0", "num-traits", - "once_cell", "oorandom", + "page_size", "plotters", "rayon", "regex", "serde", - "serde_derive", "serde_json", "tinytemplate", "walkdir", @@ -2205,12 +2202,12 @@ dependencies = [ [[package]] name = "criterion-plot" -version = "0.5.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" +checksum = "d8d80a2f4f5b554395e47b5d8305bc3d27813bacb73493eb1001e8f76dae29ea" dependencies = [ "cast", - "itertools 0.10.5", + "itertools 0.13.0", ] [[package]] @@ -2282,32 +2279,13 @@ dependencies = [ "typenum", ] -[[package]] -name = "crypto-mac" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25fab6889090c8133f3deb8f73ba3c65a7f456f66436fc012a1b1e272b1e103e" -dependencies = [ - "generic-array", - "subtle", -] - -[[package]] -name = "ctr" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "049bb91fb4aaf0e3c7efa6cd5ef877dbbbd15b39dad06d9948de4ec8a75761ea" -dependencies = [ - "cipher 0.3.0", -] - [[package]] name = "ctr" version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" dependencies = [ - "cipher 0.4.4", + "cipher", ] [[package]] @@ -2560,7 +2538,7 @@ dependencies = [ "hex", "reqwest", "serde_json", - "sha2 0.9.9", + "sha2", "tree_hash", "types", ] @@ -2572,6 +2550,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" dependencies = [ "const-oid", + "der_derive", + "flagset", + "pem-rfc7468", "zeroize", ] @@ -2589,6 +2570,17 @@ dependencies = [ "rusticata-macros", ] +[[package]] +name = "der_derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8034092389675178f570469e6c3b0465d3d30b4505c294a6550db47f3c17ad18" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.110", +] + [[package]] name = "deranged" version = "0.5.5" @@ -2655,6 +2647,15 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "des" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffdd80ce8ce993de27e9f063a444a4d53ce8e8db4c1f00cc03af5ad5a9867a1e" +dependencies = [ + "cipher", +] + [[package]] name = "digest" version = "0.9.0" @@ -2670,7 +2671,7 @@ version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer 0.10.4", + "block-buffer", "const-oid", "crypto-common", "subtle", @@ -2711,11 +2712,11 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f170f4f6ed0e1df52bf43b403899f0081917ecf1500bfe312505cc3b515a8899" dependencies = [ - "aes 0.8.4", + "aes", "aes-gcm", "alloy-rlp", "arrayvec", - "ctr 0.9.2", + "ctr", "delay_map", "enr", "fnv", @@ -2839,7 +2840,7 @@ dependencies = [ "ed25519", "rand_core 0.6.4", "serde", - "sha2 0.10.9", + "sha2", "subtle", "zeroize", ] @@ -2907,7 +2908,7 @@ dependencies = [ "itertools 0.14.0", "serde", "serde_json", - "sha2 0.10.9", + "sha2", ] [[package]] @@ -2972,7 +2973,7 @@ dependencies = [ "ekzg-bls12-381", "ekzg-maybe-rayon", "ekzg-polynomial", - "sha2 0.10.9", + "sha2", ] [[package]] @@ -3197,7 +3198,7 @@ dependencies = [ "hex", "num-bigint-dig", "ring", - "sha2 0.9.9", + "sha2", "zeroize", ] @@ -3205,18 +3206,20 @@ dependencies = [ name = "eth2_keystore" version = "0.1.0" dependencies = [ - "aes 0.7.5", + "aes", "bls", + "cipher", + "ctr", "eth2_key_derivation", "hex", - "hmac 0.11.0", - "pbkdf2 0.8.0", + "hmac", + "pbkdf2", "rand 0.9.2", "scrypt", "serde", "serde_json", "serde_repr", - "sha2 0.9.9", + "sha2", "tempfile", "unicode-normalization", "uuid 0.8.2", @@ -3237,7 +3240,7 @@ dependencies = [ "reqwest", "sensitive_url", "serde_yaml", - "sha2 0.9.9", + "sha2", "tempfile", "tokio", "tracing", @@ -3279,7 +3282,7 @@ checksum = "5aa93f58bb1eb3d1e556e4f408ef1dac130bad01ac37db4e7ade45de40d1c86a" dependencies = [ "cpufeatures", "ring", - "sha2 0.10.9", + "sha2", ] [[package]] @@ -3452,7 +3455,7 @@ dependencies = [ "sensitive_url", "serde", "serde_json", - "sha2 0.9.9", + "sha2", "slot_clock", "ssz_types", "state_processing", @@ -3589,6 +3592,12 @@ dependencies = [ "safe_arith", ] +[[package]] +name = "flagset" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7ac824320a75a52197e8f2d787f6a38b6718bb6897a35142d749af3c0e8f4fe" + [[package]] name = "flate2" version = "1.1.5" @@ -3596,6 +3605,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" dependencies = [ "crc32fast", + "libz-rs-sys", "libz-sys", "miniz_oxide", ] @@ -3618,21 +3628,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - [[package]] name = "fork_choice" version = "0.1.0" @@ -4032,11 +4027,11 @@ dependencies = [ [[package]] name = "hashlink" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" +checksum = "ea0b22561a9c04a7cb1a302c013e0259cd3b4bb619f145b32f72b8b4bcbed230" dependencies = [ - "hashbrown 0.15.5", + "hashbrown 0.16.0", ] [[package]] @@ -4092,12 +4087,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - [[package]] name = "hermit-abi" version = "0.5.2" @@ -4178,17 +4167,7 @@ version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" dependencies = [ - "hmac 0.12.1", -] - -[[package]] -name = "hmac" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" -dependencies = [ - "crypto-mac", - "digest 0.9.0", + "hmac", ] [[package]] @@ -4200,15 +4179,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "home" -version = "0.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" -dependencies = [ - "windows-sys 0.61.2", -] - [[package]] name = "http" version = "0.2.12" @@ -4287,7 +4257,6 @@ dependencies = [ "health_metrics", "hex", "lighthouse_network", - "lighthouse_tracing", "lighthouse_version", "logging", "lru 0.12.5", @@ -4435,22 +4404,6 @@ dependencies = [ "tower-service", ] -[[package]] -name = "hyper-tls" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" -dependencies = [ - "bytes", - "http-body-util", - "hyper 1.8.1", - "hyper-util", - "native-tls", - "tokio", - "tokio-native-tls", - "tower-service", -] - [[package]] name = "hyper-util" version = "0.1.18" @@ -4617,6 +4570,16 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "if-addrs" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf39cc0423ee66021dc5eccface85580e4a001e0c5288bae8bea7ecb69225e90" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + [[package]] name = "if-watch" version = "3.2.1" @@ -4627,7 +4590,7 @@ dependencies = [ "core-foundation 0.9.4", "fnv", "futures", - "if-addrs", + "if-addrs 0.10.2", "ipnet", "log", "netlink-packet-core", @@ -4716,7 +4679,9 @@ dependencies = [ "filesystem", "lockfile", "metrics", + "p12-keystore", "parking_lot", + "pem", "rand 0.9.2", "reqwest", "serde", @@ -4737,6 +4702,7 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" dependencies = [ + "block-padding", "generic-array", ] @@ -4758,17 +4724,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "io-lifetimes" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" -dependencies = [ - "hermit-abi 0.3.9", - "libc", - "windows-sys 0.48.0", -] - [[package]] name = "ipconfig" version = "0.3.2" @@ -4797,17 +4752,6 @@ dependencies = [ "serde", ] -[[package]] -name = "is-terminal" -version = "0.4.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" -dependencies = [ - "hermit-abi 0.5.2", - "libc", - "windows-sys 0.61.2", -] - [[package]] name = "is_terminal_polyfill" version = "1.70.2" @@ -4902,7 +4846,7 @@ dependencies = [ "elliptic-curve", "once_cell", "serdect", - "sha2 0.10.9", + "sha2", "signature", ] @@ -4973,7 +4917,7 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "lcli" -version = "8.0.1" +version = "8.1.0" dependencies = [ "account_utils", "beacon_chain", @@ -5071,9 +5015,8 @@ dependencies = [ [[package]] name = "libp2p" -version = "0.56.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce71348bf5838e46449ae240631117b487073d5f347c06d434caddcb91dceb5a" +version = "0.56.1" +source = "git+https://github.com/libp2p/rust-libp2p.git#5bad680f71a88be9a028e349770195d8a72356ce" dependencies = [ "bytes", "either", @@ -5084,12 +5027,12 @@ dependencies = [ "libp2p-connection-limits", "libp2p-core", "libp2p-dns", + "libp2p-gossipsub", "libp2p-identify", "libp2p-identity", "libp2p-mdns", "libp2p-metrics", "libp2p-noise", - "libp2p-plaintext", "libp2p-quic", "libp2p-swarm", "libp2p-tcp", @@ -5104,8 +5047,7 @@ dependencies = [ [[package]] name = "libp2p-allow-block-list" version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d16ccf824ee859ca83df301e1c0205270206223fd4b1f2e512a693e1912a8f4a" +source = "git+https://github.com/libp2p/rust-libp2p.git#5bad680f71a88be9a028e349770195d8a72356ce" dependencies = [ "libp2p-core", "libp2p-identity", @@ -5115,8 +5057,7 @@ dependencies = [ [[package]] name = "libp2p-connection-limits" version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a18b8b607cf3bfa2f8c57db9c7d8569a315d5cc0a282e6bfd5ebfc0a9840b2a0" +source = "git+https://github.com/libp2p/rust-libp2p.git#5bad680f71a88be9a028e349770195d8a72356ce" dependencies = [ "libp2p-core", "libp2p-identity", @@ -5125,9 +5066,8 @@ dependencies = [ [[package]] name = "libp2p-core" -version = "0.43.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d28e2d2def7c344170f5c6450c0dbe3dfef655610dbfde2f6ac28a527abbe36" +version = "0.43.2" +source = "git+https://github.com/libp2p/rust-libp2p.git#5bad680f71a88be9a028e349770195d8a72356ce" dependencies = [ "either", "fnv", @@ -5144,15 +5084,14 @@ dependencies = [ "rw-stream-sink", "thiserror 2.0.17", "tracing", - "unsigned-varint 0.8.0", + "unsigned-varint", "web-time", ] [[package]] name = "libp2p-dns" version = "0.44.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b770c1c8476736ca98c578cba4b505104ff8e842c2876b528925f9766379f9a" +source = "git+https://github.com/libp2p/rust-libp2p.git#5bad680f71a88be9a028e349770195d8a72356ce" dependencies = [ "async-trait", "futures", @@ -5167,7 +5106,7 @@ dependencies = [ [[package]] name = "libp2p-gossipsub" version = "0.50.0" -source = "git+https://github.com/sigp/rust-libp2p.git?rev=5acdf89a65d64098f9346efa5769e57bcd19dea9#5acdf89a65d64098f9346efa5769e57bcd19dea9" +source = "git+https://github.com/libp2p/rust-libp2p.git#5bad680f71a88be9a028e349770195d8a72356ce" dependencies = [ "async-channel 2.5.0", "asynchronous-codec", @@ -5179,7 +5118,7 @@ dependencies = [ "futures", "futures-timer", "getrandom 0.2.16", - "hashlink 0.10.0", + "hashlink 0.11.0", "hex_fmt", "libp2p-core", "libp2p-identity", @@ -5189,7 +5128,7 @@ dependencies = [ "quick-protobuf-codec", "rand 0.8.5", "regex", - "sha2 0.10.9", + "sha2", "tracing", "web-time", ] @@ -5197,8 +5136,7 @@ dependencies = [ [[package]] name = "libp2p-identify" version = "0.47.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ab792a8b68fdef443a62155b01970c81c3aadab5e659621b063ef252a8e65e8" +source = "git+https://github.com/libp2p/rust-libp2p.git#5bad680f71a88be9a028e349770195d8a72356ce" dependencies = [ "asynchronous-codec", "either", @@ -5217,9 +5155,9 @@ dependencies = [ [[package]] name = "libp2p-identity" -version = "0.2.12" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3104e13b51e4711ff5738caa1fb54467c8604c2e94d607e27745bcf709068774" +checksum = "f0c7892c221730ba55f7196e98b0b8ba5e04b4155651736036628e9f73ed6fc3" dependencies = [ "asn1_der", "bs58 0.5.1", @@ -5229,7 +5167,7 @@ dependencies = [ "multihash", "quick-protobuf", "rand 0.8.5", - "sha2 0.10.9", + "sha2", "thiserror 2.0.17", "tracing", "zeroize", @@ -5238,8 +5176,7 @@ dependencies = [ [[package]] name = "libp2p-mdns" version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c66872d0f1ffcded2788683f76931be1c52e27f343edb93bc6d0bcd8887be443" +source = "git+https://github.com/libp2p/rust-libp2p.git#5bad680f71a88be9a028e349770195d8a72356ce" dependencies = [ "futures", "hickory-proto", @@ -5249,19 +5186,19 @@ dependencies = [ "libp2p-swarm", "rand 0.8.5", "smallvec", - "socket2 0.5.10", + "socket2 0.6.1", "tokio", "tracing", ] [[package]] name = "libp2p-metrics" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "805a555148522cb3414493a5153451910cb1a146c53ffbf4385708349baf62b7" +version = "0.17.1" +source = "git+https://github.com/libp2p/rust-libp2p.git#5bad680f71a88be9a028e349770195d8a72356ce" dependencies = [ "futures", "libp2p-core", + "libp2p-gossipsub", "libp2p-identify", "libp2p-identity", "libp2p-swarm", @@ -5273,8 +5210,7 @@ dependencies = [ [[package]] name = "libp2p-mplex" version = "0.43.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a4019ba30c4e42b776113e9778071691fe3f34bf23b6b3bf0dfcf29d801f3d" +source = "git+https://github.com/libp2p/rust-libp2p.git#5bad680f71a88be9a028e349770195d8a72356ce" dependencies = [ "asynchronous-codec", "bytes", @@ -5286,14 +5222,13 @@ dependencies = [ "rand 0.8.5", "smallvec", "tracing", - "unsigned-varint 0.8.0", + "unsigned-varint", ] [[package]] name = "libp2p-noise" version = "0.46.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc73eacbe6462a0eb92a6527cac6e63f02026e5407f8831bde8293f19217bfbf" +source = "git+https://github.com/libp2p/rust-libp2p.git#5bad680f71a88be9a028e349770195d8a72356ce" dependencies = [ "asynchronous-codec", "bytes", @@ -5312,27 +5247,10 @@ dependencies = [ "zeroize", ] -[[package]] -name = "libp2p-plaintext" -version = "0.43.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e659439578fc6d305da8303834beb9d62f155f40e7f5b9d81c9f2b2c69d1926" -dependencies = [ - "asynchronous-codec", - "bytes", - "futures", - "libp2p-core", - "libp2p-identity", - "quick-protobuf", - "quick-protobuf-codec", - "tracing", -] - [[package]] name = "libp2p-quic" version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dc448b2de9f4745784e3751fe8bc6c473d01b8317edd5ababcb0dec803d843f" +source = "git+https://github.com/libp2p/rust-libp2p.git#5bad680f71a88be9a028e349770195d8a72356ce" dependencies = [ "futures", "futures-timer", @@ -5344,7 +5262,7 @@ dependencies = [ "rand 0.8.5", "ring", "rustls 0.23.35", - "socket2 0.5.10", + "socket2 0.6.1", "thiserror 2.0.17", "tokio", "tracing", @@ -5352,18 +5270,17 @@ dependencies = [ [[package]] name = "libp2p-swarm" -version = "0.47.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6aa762e5215919a34e31c35d4b18bf2e18566ecab7f8a3d39535f4a3068f8b62" +version = "0.47.1" +source = "git+https://github.com/libp2p/rust-libp2p.git#5bad680f71a88be9a028e349770195d8a72356ce" dependencies = [ "either", "fnv", "futures", "futures-timer", + "hashlink 0.11.0", "libp2p-core", "libp2p-identity", "libp2p-swarm-derive", - "lru 0.12.5", "multistream-select", "rand 0.8.5", "smallvec", @@ -5375,8 +5292,7 @@ dependencies = [ [[package]] name = "libp2p-swarm-derive" version = "0.35.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd297cf53f0cb3dee4d2620bb319ae47ef27c702684309f682bdb7e55a18ae9c" +source = "git+https://github.com/libp2p/rust-libp2p.git#5bad680f71a88be9a028e349770195d8a72356ce" dependencies = [ "heck", "quote", @@ -5385,16 +5301,15 @@ dependencies = [ [[package]] name = "libp2p-tcp" -version = "0.44.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65b4e030c52c46c8d01559b2b8ca9b7c4185f10576016853129ca1fe5cd1a644" +version = "0.44.1" +source = "git+https://github.com/libp2p/rust-libp2p.git#5bad680f71a88be9a028e349770195d8a72356ce" dependencies = [ "futures", "futures-timer", "if-watch", "libc", "libp2p-core", - "socket2 0.5.10", + "socket2 0.6.1", "tokio", "tracing", ] @@ -5402,8 +5317,7 @@ dependencies = [ [[package]] name = "libp2p-tls" version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96ff65a82e35375cbc31ebb99cacbbf28cb6c4fefe26bf13756ddcf708d40080" +source = "git+https://github.com/libp2p/rust-libp2p.git#5bad680f71a88be9a028e349770195d8a72356ce" dependencies = [ "futures", "futures-rustls", @@ -5420,9 +5334,8 @@ dependencies = [ [[package]] name = "libp2p-upnp" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4757e65fe69399c1a243bbb90ec1ae5a2114b907467bf09f3575e899815bb8d3" +version = "0.6.0" +source = "git+https://github.com/libp2p/rust-libp2p.git#5bad680f71a88be9a028e349770195d8a72356ce" dependencies = [ "futures", "futures-timer", @@ -5436,8 +5349,7 @@ dependencies = [ [[package]] name = "libp2p-yamux" version = "0.47.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f15df094914eb4af272acf9adaa9e287baa269943f32ea348ba29cfb9bfc60d8" +source = "git+https://github.com/libp2p/rust-libp2p.git#5bad680f71a88be9a028e349770195d8a72356ce" dependencies = [ "either", "futures", @@ -5469,6 +5381,15 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "libz-rs-sys" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c10501e7805cee23da17c7790e59df2870c0d4043ec6d03f67d31e2b53e77415" +dependencies = [ + "zlib-rs", +] + [[package]] name = "libz-sys" version = "1.1.23" @@ -5482,7 +5403,7 @@ dependencies = [ [[package]] name = "lighthouse" -version = "8.0.1" +version = "8.1.0" dependencies = [ "account_manager", "account_utils", @@ -5503,7 +5424,6 @@ dependencies = [ "futures", "initialized_validators", "lighthouse_network", - "lighthouse_tracing", "lighthouse_version", "logging", "malloc_utils", @@ -5524,6 +5444,7 @@ dependencies = [ "tracing", "tracing-opentelemetry", "tracing-subscriber", + "tracing_samplers", "types", "validator_client", "validator_dir", @@ -5552,12 +5473,11 @@ dependencies = [ "fnv", "futures", "hex", - "itertools 0.10.5", + "if-addrs 0.14.0", + "itertools 0.14.0", "libp2p", - "libp2p-gossipsub", "libp2p-mplex", "lighthouse_version", - "local-ip-address", "logging", "lru 0.12.5", "lru_cache", @@ -5569,7 +5489,7 @@ dependencies = [ "rand 0.9.2", "regex", "serde", - "sha2 0.9.9", + "sha2", "smallvec", "snap", "ssz_types", @@ -5583,13 +5503,9 @@ dependencies = [ "tracing-subscriber", "typenum", "types", - "unsigned-varint 0.8.0", + "unsigned-varint", ] -[[package]] -name = "lighthouse_tracing" -version = "0.1.0" - [[package]] name = "lighthouse_validator_store" version = "0.1.0" @@ -5619,23 +5535,11 @@ dependencies = [ [[package]] name = "lighthouse_version" -version = "8.0.1" +version = "8.1.0" dependencies = [ "regex", ] -[[package]] -name = "linux-raw-sys" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" - -[[package]] -name = "linux-raw-sys" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" - [[package]] name = "linux-raw-sys" version = "0.11.0" @@ -5669,18 +5573,6 @@ dependencies = [ "pkg-config", ] -[[package]] -name = "local-ip-address" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "656b3b27f8893f7bbf9485148ff9a65f019e3f33bd5cdc87c83cab16b3fd9ec8" -dependencies = [ - "libc", - "neli", - "thiserror 2.0.17", - "windows-sys 0.59.0", -] - [[package]] name = "lock_api" version = "0.4.14" @@ -5840,7 +5732,7 @@ name = "mdbx-sys" version = "0.11.6-4" source = "git+https://github.com/sigp/libmdbx-rs?rev=e6ff4b9377c1619bcf0bfdf52bee5a980a432a1a#e6ff4b9377c1619bcf0bfdf52bee5a980a432a1a" dependencies = [ - "bindgen", + "bindgen 0.69.5", "cc", "cmake", "libc", @@ -6101,7 +5993,7 @@ dependencies = [ "percent-encoding", "serde", "static_assertions", - "unsigned-varint 0.8.0", + "unsigned-varint", "url", ] @@ -6124,63 +6016,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6b430e7953c29dd6a09afc29ff0bb69c6e306329ee6794700aee27b76a1aea8d" dependencies = [ "core2", - "unsigned-varint 0.8.0", + "unsigned-varint", ] [[package]] name = "multistream-select" version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea0df8e5eec2298a62b326ee4f0d7fe1a6b90a09dfcf9df37b38f947a8c42f19" +source = "git+https://github.com/libp2p/rust-libp2p.git#5bad680f71a88be9a028e349770195d8a72356ce" dependencies = [ "bytes", "futures", - "log", "pin-project", "smallvec", - "unsigned-varint 0.7.2", -] - -[[package]] -name = "native-tls" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework 2.11.1", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "neli" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93062a0dce6da2517ea35f301dfc88184ce18d3601ec786a727a87bf535deca9" -dependencies = [ - "byteorder", - "libc", - "log", - "neli-proc-macros", -] - -[[package]] -name = "neli-proc-macros" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c8034b7fbb6f9455b2a96c19e6edf8dc9fc34c70449938d8ee3b4df363f61fe" -dependencies = [ - "either", - "proc-macro2", - "quote", - "serde", - "syn 1.0.109", + "tracing", + "unsigned-varint", ] [[package]] @@ -6270,12 +6119,11 @@ dependencies = [ "genesis", "hex", "igd-next", - "itertools 0.10.5", + "itertools 0.14.0", "k256", "kzg", - "libp2p-gossipsub", + "libp2p", "lighthouse_network", - "lighthouse_tracing", "logging", "lru_cache", "matches", @@ -6471,7 +6319,7 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" dependencies = [ - "hermit-abi 0.5.2", + "hermit-abi", "libc", ] @@ -6569,60 +6417,12 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" -[[package]] -name = "openssl" -version = "0.10.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" -dependencies = [ - "bitflags 2.10.0", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.110", -] - [[package]] name = "openssl-probe" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" -[[package]] -name = "openssl-src" -version = "300.5.4+3.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507b3792995dae9b0df8a1c1e3771e8418b7c2d9f0baeba32e6fe8b06c7cb72" -dependencies = [ - "cc", -] - -[[package]] -name = "openssl-sys" -version = "0.9.111" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" -dependencies = [ - "cc", - "libc", - "openssl-src", - "pkg-config", - "vcpkg", -] - [[package]] name = "opentelemetry" version = "0.30.0" @@ -6708,7 +6508,7 @@ dependencies = [ "ethereum_ssz 0.10.0", "ethereum_ssz_derive 0.10.0", "fixed_bytes", - "itertools 0.10.5", + "itertools 0.14.0", "maplit", "metrics", "parking_lot", @@ -6723,6 +6523,39 @@ dependencies = [ "types", ] +[[package]] +name = "p12-keystore" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8d55319bae67f92141ce4da80c5392acd3d1323bd8312c1ffdfb018927d07d7" +dependencies = [ + "base64 0.22.1", + "cbc", + "cms", + "der", + "des", + "hex", + "hmac", + "pkcs12", + "pkcs5", + "rand 0.9.2", + "rc2", + "sha1", + "sha2", + "thiserror 2.0.17", + "x509-parser", +] + +[[package]] +name = "page_size" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d5b2194ed13191c1999ae0704b7839fb18384fa22e49b57eeaa97d79ce40da" +dependencies = [ + "libc", + "winapi", +] + [[package]] name = "pairing" version = "0.23.0" @@ -6789,17 +6622,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "password-hash" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" -dependencies = [ - "base64ct", - "rand_core 0.6.4", - "subtle", -] - [[package]] name = "paste" version = "1.0.15" @@ -6808,23 +6630,12 @@ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pbkdf2" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d95f5254224e617595d2cc3cc73ff0a5eaf2637519e25f03388154e9378b6ffa" -dependencies = [ - "crypto-mac", -] - -[[package]] -name = "pbkdf2" -version = "0.11.0" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" dependencies = [ "digest 0.10.7", - "hmac 0.12.1", - "password-hash", - "sha2 0.10.9", + "hmac", ] [[package]] @@ -6837,6 +6648,15 @@ dependencies = [ "serde_core", ] +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.3.2" @@ -6885,6 +6705,36 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkcs12" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "695b3df3d3cc1015f12d70235e35b6b79befc5fa7a9b95b951eab1dd07c9efc2" +dependencies = [ + "cms", + "const-oid", + "der", + "digest 0.10.7", + "spki", + "x509-cert", + "zeroize", +] + +[[package]] +name = "pkcs5" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e847e2c91a18bfa887dd028ec33f2fe6f25db77db3619024764914affe8b69a6" +dependencies = [ + "aes", + "cbc", + "der", + "pbkdf2", + "scrypt", + "sha2", + "spki", +] + [[package]] name = "pkcs8" version = "0.10.2" @@ -6943,9 +6793,9 @@ checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" dependencies = [ "cfg-if", "concurrent-queue", - "hermit-abi 0.5.2", + "hermit-abi", "pin-project-lite", - "rustix 1.1.2", + "rustix", "windows-sys 0.61.2", ] @@ -7099,17 +6949,23 @@ dependencies = [ [[package]] name = "procfs" -version = "0.15.1" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "943ca7f9f29bab5844ecd8fdb3992c5969b6622bb9609b9502fef9b4310e3f1f" +checksum = "25485360a54d6861439d60facef26de713b1e126bf015ec8f98239467a2b82f7" dependencies = [ - "bitflags 1.3.2", - "byteorder", - "chrono", - "flate2", + "bitflags 2.10.0", + "procfs-core", + "rustix", +] + +[[package]] +name = "procfs-core" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6401bf7b6af22f78b563665d15a22e9aef27775b79b149a66ca022468a4e405" +dependencies = [ + "bitflags 2.10.0", "hex", - "lazy_static", - "rustix 0.36.17", ] [[package]] @@ -7128,9 +6984,9 @@ dependencies = [ [[package]] name = "prometheus-client" -version = "0.23.1" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf41c1a7c32ed72abe5082fb19505b969095c12da9f5732a4bc9878757fd087c" +checksum = "e4500adecd7af8e0e9f4dbce15cfee07ce913fbf6ad605cc468b83f2d531ee94" dependencies = [ "dtoa", "itoa", @@ -7140,9 +6996,9 @@ dependencies = [ [[package]] name = "prometheus-client-derive-encode" -version = "0.4.2" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "440f724eba9f6996b75d63681b0a92b06947f1457076d503a4d2e2c8f56442b8" +checksum = "9adf1691c04c0a5ff46ff8f262b58beb07b0dbb61f96f9f54f6cbd82106ed87f" dependencies = [ "proc-macro2", "quote", @@ -7261,14 +7117,13 @@ dependencies = [ [[package]] name = "quick-protobuf-codec" version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15a0580ab32b169745d7a39db2ba969226ca16738931be152a3209b409de2474" +source = "git+https://github.com/libp2p/rust-libp2p.git#5bad680f71a88be9a028e349770195d8a72356ce" dependencies = [ "asynchronous-codec", "bytes", "quick-protobuf", - "thiserror 1.0.69", - "unsigned-varint 0.8.0", + "thiserror 2.0.17", + "unsigned-varint", ] [[package]] @@ -7478,6 +7333,15 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "rc2" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62c64daa8e9438b84aaae55010a93f396f8e60e3911590fcba770d04643fc1dd" +dependencies = [ + "cipher", +] + [[package]] name = "rcgen" version = "0.13.2" @@ -7585,11 +7449,9 @@ dependencies = [ "http-body-util", "hyper 1.8.1", "hyper-rustls", - "hyper-tls", "hyper-util", "js-sys", "log", - "native-tls", "percent-encoding", "pin-project-lite", "quinn", @@ -7600,7 +7462,6 @@ dependencies = [ "serde_urlencoded", "sync_wrapper", "tokio", - "tokio-native-tls", "tokio-rustls 0.26.4", "tokio-util", "tower 0.5.2", @@ -7657,7 +7518,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" dependencies = [ - "hmac 0.12.1", + "hmac", "subtle", ] @@ -7833,33 +7694,6 @@ dependencies = [ "nom", ] -[[package]] -name = "rustix" -version = "0.36.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "305efbd14fde4139eb501df5f136994bb520b033fa9fbdce287507dc23b8c7ed" -dependencies = [ - "bitflags 1.3.2", - "errno", - "io-lifetimes", - "libc", - "linux-raw-sys 0.1.4", - "windows-sys 0.45.0", -] - -[[package]] -name = "rustix" -version = "0.38.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" -dependencies = [ - "bitflags 2.10.0", - "errno", - "libc", - "linux-raw-sys 0.4.15", - "windows-sys 0.59.0", -] - [[package]] name = "rustix" version = "1.1.2" @@ -7869,7 +7703,7 @@ dependencies = [ "bitflags 2.10.0", "errno", "libc", - "linux-raw-sys 0.11.0", + "linux-raw-sys", "windows-sys 0.61.2", ] @@ -7911,7 +7745,7 @@ dependencies = [ "openssl-probe", "rustls-pki-types", "schannel", - "security-framework 3.5.1", + "security-framework", ] [[package]] @@ -7976,8 +7810,7 @@ dependencies = [ [[package]] name = "rw-stream-sink" version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8c9026ff5d2f23da5e45bbc283f156383001bfb09c4e44256d02c1a685fe9a1" +source = "git+https://github.com/libp2p/rust-libp2p.git#5bad680f71a88be9a028e349770195d8a72356ce" dependencies = [ "futures", "pin-project", @@ -7998,11 +7831,11 @@ checksum = "b147bb6111014916d3ef9d4c85173124a8e12193a67f6176d67244afd558d6c1" [[package]] name = "salsa20" -version = "0.8.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecbd2eb639fd7cab5804a0837fe373cc2172d15437e804c054a9fb885cb923b0" +checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" dependencies = [ - "cipher 0.3.0", + "cipher", ] [[package]] @@ -8070,14 +7903,13 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "scrypt" -version = "0.7.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879588d8f90906e73302547e20fffefdd240eb3e0e744e142321f5d49dea0518" +checksum = "0516a385866c09368f0b5bcd1caff3366aace790fcd46e2bb032697bb172fd1f" dependencies = [ - "hmac 0.11.0", - "pbkdf2 0.8.0", + "pbkdf2", "salsa20", - "sha2 0.9.9", + "sha2", ] [[package]] @@ -8116,19 +7948,6 @@ dependencies = [ "cc", ] -[[package]] -name = "security-framework" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags 2.10.0", - "core-foundation 0.9.4", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - [[package]] name = "security-framework" version = "3.5.1" @@ -8331,19 +8150,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", -] - [[package]] name = "sha2" version = "0.10.9" @@ -8590,7 +8396,7 @@ dependencies = [ "rand_core 0.6.4", "ring", "rustc_version 0.4.1", - "sha2 0.10.9", + "sha2", "subtle", ] @@ -8669,7 +8475,7 @@ dependencies = [ "fixed_bytes", "int_to_bytes", "integer-sqrt", - "itertools 0.10.5", + "itertools 0.14.0", "merkle_proof", "metrics", "milhouse", @@ -8717,7 +8523,7 @@ dependencies = [ "ethereum_ssz 0.10.0", "ethereum_ssz_derive 0.10.0", "fixed_bytes", - "itertools 0.10.5", + "itertools 0.14.0", "leveldb", "logging", "lru 0.12.5", @@ -8739,7 +8545,7 @@ dependencies = [ "typenum", "types", "xdelta3", - "zstd 0.13.3", + "zstd", ] [[package]] @@ -8949,7 +8755,7 @@ dependencies = [ "fastrand", "getrandom 0.3.4", "once_cell", - "rustix 1.1.2", + "rustix", "windows-sys 0.61.2", ] @@ -8959,7 +8765,7 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60b8cb979cb11c32ce1603f8137b22262a9d131aaa5c37b5678025f22b8becd0" dependencies = [ - "rustix 1.1.2", + "rustix", "windows-sys 0.60.2", ] @@ -9110,17 +8916,15 @@ dependencies = [ [[package]] name = "tiny-bip39" -version = "1.0.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62cc94d358b5a1e84a5cb9109f559aa3c4d634d2b1b4de3d0fa4adc7c78e2861" +checksum = "a30fd743a02bf35236f6faf99adb03089bb77e91c998dac2c2ad76bb424f668c" dependencies = [ - "anyhow", - "hmac 0.12.1", "once_cell", - "pbkdf2 0.11.0", + "pbkdf2", "rand 0.8.5", "rustc-hash 1.1.0", - "sha2 0.10.9", + "sha2", "thiserror 1.0.69", "unicode-normalization", "wasm-bindgen", @@ -9200,16 +9004,6 @@ dependencies = [ "syn 2.0.110", ] -[[package]] -name = "tokio-native-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" -dependencies = [ - "native-tls", - "tokio", -] - [[package]] name = "tokio-rustls" version = "0.25.0" @@ -9520,6 +9314,14 @@ dependencies = [ "tracing-serde", ] +[[package]] +name = "tracing_samplers" +version = "0.1.0" +dependencies = [ + "opentelemetry", + "opentelemetry_sdk", +] + [[package]] name = "tree_hash" version = "0.12.0" @@ -9598,7 +9400,7 @@ dependencies = [ "fixed_bytes", "hex", "int_to_bytes", - "itertools 0.10.5", + "itertools 0.14.0", "kzg", "maplit", "merkle_proof", @@ -9715,12 +9517,6 @@ version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" -[[package]] -name = "unsigned-varint" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6889a77d49f1f013504cec6bf97a2c730394adedaeb1deb5ea08949a50541105" - [[package]] name = "unsigned-varint" version = "0.8.0" @@ -9785,7 +9581,7 @@ dependencies = [ [[package]] name = "validator_client" -version = "8.0.1" +version = "8.1.0" dependencies = [ "account_utils", "beacon_node_fallback", @@ -9856,7 +9652,7 @@ dependencies = [ "graffiti_file", "health_metrics", "initialized_validators", - "itertools 0.10.5", + "itertools 0.14.0", "lighthouse_validator_store", "lighthouse_version", "logging", @@ -10249,18 +10045,6 @@ dependencies = [ "rustls-pki-types", ] -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix 0.38.44", -] - [[package]] name = "widestring" version = "0.4.3" @@ -10404,15 +10188,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - [[package]] name = "windows-sys" version = "0.48.0" @@ -10458,21 +10233,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - [[package]] name = "windows-targets" version = "0.48.5" @@ -10521,12 +10281,6 @@ dependencies = [ "windows_x86_64_msvc 0.53.1", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -10545,12 +10299,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -10569,12 +10317,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -10605,12 +10347,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -10629,12 +10365,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -10653,12 +10383,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -10677,12 +10401,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -10761,6 +10479,17 @@ dependencies = [ "zeroize", ] +[[package]] +name = "x509-cert" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1301e935010a701ae5f8655edc0ad17c44bad3ac5ce8c39185f75453b720ae94" +dependencies = [ + "const-oid", + "der", + "spki", +] + [[package]] name = "x509-parser" version = "0.17.0" @@ -10781,15 +10510,15 @@ dependencies = [ [[package]] name = "xdelta3" version = "0.1.5" -source = "git+https://github.com/sigp/xdelta3-rs?rev=4db64086bb02e9febb584ba93b9d16bb2ae3825a#4db64086bb02e9febb584ba93b9d16bb2ae3825a" +source = "git+https://github.com/sigp/xdelta3-rs?rev=fe3906605c87b6c0515bd7c8fc671f47875e3ccc#fe3906605c87b6c0515bd7c8fc671f47875e3ccc" dependencies = [ - "bindgen", + "bindgen 0.72.1", "cc", "futures-io", "futures-util", "libc", "log", - "rand 0.8.5", + "rand 0.9.2", ] [[package]] @@ -10978,50 +10707,43 @@ dependencies = [ [[package]] name = "zip" -version = "0.6.6" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" +checksum = "eb2a05c7c36fde6c09b08576c9f7fb4cda705990f73b58fe011abf7dfb24168b" dependencies = [ - "aes 0.8.4", - "byteorder", - "bzip2", - "constant_time_eq", + "arbitrary", "crc32fast", - "crossbeam-utils", "flate2", - "hmac 0.12.1", - "pbkdf2 0.11.0", - "sha1", - "time", - "zstd 0.11.2+zstd.1.5.2", + "indexmap 2.12.0", + "memchr", + "zopfli", ] [[package]] -name = "zstd" -version = "0.11.2+zstd.1.5.2" +name = "zlib-rs" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" -dependencies = [ - "zstd-safe 5.0.2+zstd.1.5.2", -] +checksum = "40990edd51aae2c2b6907af74ffb635029d5788228222c4bb811e9351c0caad3" [[package]] -name = "zstd" -version = "0.13.3" +name = "zopfli" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +checksum = "f05cd8797d63865425ff89b5c4a48804f35ba0ce8d125800027ad6017d2b5249" dependencies = [ - "zstd-safe 7.2.4", + "bumpalo", + "crc32fast", + "log", + "simd-adler32", ] [[package]] -name = "zstd-safe" -version = "5.0.2+zstd.1.5.2" +name = "zstd" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" dependencies = [ - "libc", - "zstd-sys", + "zstd-safe", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 35199be8e73..e8047c3acce 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -138,7 +138,6 @@ eip_3076 = { path = "common/eip_3076" } either = "1.9" environment = { path = "lighthouse/environment" } eth2 = { path = "common/eth2" } -reth-era = { git = "https://github.com/paradigmxyz/reth", package = "reth-era", rev = "62abfdaeb54e8a205a8ee085ddebd56047d93374" } eth2_config = { path = "common/eth2_config" } eth2_key_derivation = { path = "crypto/eth2_key_derivation" } eth2_keystore = { path = "crypto/eth2_keystore" } @@ -226,6 +225,7 @@ reqwest = { version = "0.12", default-features = false, features = [ "stream", "rustls-tls", ] } +reth-era = { git = "https://github.com/paradigmxyz/reth", package = "reth-era", rev = "62abfdaeb54e8a205a8ee085ddebd56047d93374" } ring = "0.17" rpds = "0.11" rusqlite = { version = "0.28", features = ["bundled"] } diff --git a/beacon_node/beacon_chain/src/era_file_consumer.rs b/beacon_node/beacon_chain/src/era_file_consumer.rs index 4e680e4c1e0..9cbab9ca0bb 100644 --- a/beacon_node/beacon_chain/src/era_file_consumer.rs +++ b/beacon_node/beacon_chain/src/era_file_consumer.rs @@ -9,7 +9,7 @@ use store::{DBColumn, HotColdDB, ItemStore, KeyValueStoreOp}; use tracing::{debug, debug_span, instrument, warn}; use tree_hash::TreeHash; use types::{ - BeaconState, ChainSpec, Epoch, EthSpec, Hash256, HistoricalBatch, HistoricalSummary, + BeaconState, ChainSpec, EthSpec, Hash256, HistoricalBatch, HistoricalSummary, SignedBeaconBlock, Slot, }; From bbe4b408a84e7f9803bedbf3f879ec60eb7f021d Mon Sep 17 00:00:00 2001 From: dapplion <35266934+dapplion@users.noreply.github.com> Date: Tue, 10 Feb 2026 17:00:58 +0100 Subject: [PATCH 16/18] fix test: provide StateSlotMismatch struct fields --- consensus/state_processing/src/per_block_processing/tests.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/consensus/state_processing/src/per_block_processing/tests.rs b/consensus/state_processing/src/per_block_processing/tests.rs index 739717b33ff..765421252b9 100644 --- a/consensus/state_processing/src/per_block_processing/tests.rs +++ b/consensus/state_processing/src/per_block_processing/tests.rs @@ -110,7 +110,10 @@ async fn invalid_block_header_state_slot() { assert_eq!( result, Err(BlockProcessingError::HeaderInvalid { - reason: HeaderInvalid::StateSlotMismatch + reason: HeaderInvalid::StateSlotMismatch { + state: state.slot(), + header: slot + Slot::new(1), + } }) ); } From 9989d6d3682b8e12381f56bd5b7fb00adf7028af Mon Sep 17 00:00:00 2001 From: dapplion <35266934+dapplion@users.noreply.github.com> Date: Tue, 10 Feb 2026 17:28:12 +0100 Subject: [PATCH 17/18] fix test and sort Cargo.toml --- .../state_processing/src/per_block_processing/tests.rs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/consensus/state_processing/src/per_block_processing/tests.rs b/consensus/state_processing/src/per_block_processing/tests.rs index 765421252b9..c07c464f9e0 100644 --- a/consensus/state_processing/src/per_block_processing/tests.rs +++ b/consensus/state_processing/src/per_block_processing/tests.rs @@ -107,15 +107,12 @@ async fn invalid_block_header_state_slot() { &spec, ); - assert_eq!( + assert!(matches!( result, Err(BlockProcessingError::HeaderInvalid { - reason: HeaderInvalid::StateSlotMismatch { - state: state.slot(), - header: slot + Slot::new(1), - } + reason: HeaderInvalid::StateSlotMismatch { .. } }) - ); + )); } #[tokio::test] From 34d5e030eccb74ab80f2fa74f2f2604fcef5c5f6 Mon Sep 17 00:00:00 2001 From: dapplion <35266934+dapplion@users.noreply.github.com> Date: Tue, 10 Feb 2026 20:24:42 +0100 Subject: [PATCH 18/18] regenerate CLI docs and update deps for cargo audit --- Cargo.lock | 38 +++++++++++++++++++------------------- book/src/help_bn.md | 2 ++ 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fb2f3d13c5e..7501ac17801 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -695,7 +695,7 @@ version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -706,7 +706,7 @@ checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -1398,7 +1398,7 @@ dependencies = [ "bitflags 2.10.0", "cexpr", "clang-sys", - "itertools 0.13.0", + "itertools 0.12.1", "log", "prettyplease", "proc-macro2", @@ -3135,7 +3135,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -6247,7 +6247,7 @@ version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -6279,9 +6279,9 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" [[package]] name = "num-integer" @@ -7585,9 +7585,9 @@ dependencies = [ [[package]] name = "ruint" -version = "1.17.0" +version = "1.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a68df0380e5c9d20ce49534f292a36a7514ae21350726efe1865bdb1fa91d278" +checksum = "c141e807189ad38a07276942c6623032d3753c8859c146104ac2e4d68865945a" dependencies = [ "alloy-rlp", "arbitrary", @@ -7704,7 +7704,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -8756,7 +8756,7 @@ dependencies = [ "getrandom 0.3.4", "once_cell", "rustix", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -8874,30 +8874,30 @@ dependencies = [ [[package]] name = "time" -version = "0.3.44" +version = "0.3.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" dependencies = [ "deranged", "itoa", "num-conv", "powerfmt", - "serde", + "serde_core", "time-core", "time-macros", ] [[package]] name = "time-core" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" [[package]] name = "time-macros" -version = "0.2.24" +version = "0.2.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" dependencies = [ "num-conv", "time-core", @@ -10079,7 +10079,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.48.0", ] [[package]] diff --git a/book/src/help_bn.md b/book/src/help_bn.md index d3aa27c8a77..03e6747d97c 100644 --- a/book/src/help_bn.md +++ b/book/src/help_bn.md @@ -496,6 +496,8 @@ Flags: --enable-private-discovery Lighthouse by default does not discover private IP addresses. Set this flag to enable connection attempts to local addresses. + --era-files-dir + Directory containing `.era` files to use for backfill. --genesis-backfill Attempts to download blocks all the way back to genesis when checkpoint syncing.