diff --git a/Cargo.lock b/Cargo.lock index f533fe1e19a..613a2f23bbb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -116,7 +116,7 @@ dependencies = [ "num_enum", "proptest", "serde", - "strum", + "strum 0.27.2", ] [[package]] @@ -263,7 +263,7 @@ dependencies = [ [[package]] name = "alloy-eip7928" version = "0.4.1" -source = "git+https://github.com/Rimeeeeee/eips?branch=eip-8268#e22373e82a584cfbc485c0f0fd053897be7885d8" +source = "git+https://github.com/Rimeeeeee/eips?branch=eip-8268#d27b48841ecf0629ac75df762943216c00d72281" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -505,7 +505,7 @@ dependencies = [ "either", "futures", "futures-utils-wasm", - "lru", + "lru 0.16.4", "parking_lot", "pin-project", "reqwest 0.13.4", @@ -682,7 +682,7 @@ dependencies = [ "jsonwebtoken", "rand 0.8.6", "serde", - "strum", + "strum 0.27.2", ] [[package]] @@ -1646,9 +1646,9 @@ dependencies = [ [[package]] name = "bitflags" -version = "2.12.1" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84d7ced0ae9557296835c32bf1b1e02b44c746701f898460fb000d7eaa84f00a" +checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" dependencies = [ "arbitrary", "serde_core", @@ -1948,6 +1948,12 @@ version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" +[[package]] +name = "by_address" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06" + [[package]] name = "byte-slice-cast" version = "1.2.3" @@ -3832,6 +3838,12 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8eb564c5c7423d25c886fb561d1e4ee69f72354d16918afa32c08811f6b6a55" +[[package]] +name = "fast-srgb8" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd2e7510819d6fbf51a5545c8f922716ecfb14df168a3242f7d33e0239efe6a1" + [[package]] name = "fastrand" version = "2.4.1" @@ -4405,6 +4417,8 @@ version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" dependencies = [ + "allocator-api2", + "equivalent", "foldhash 0.2.0", "serde", "serde_core", @@ -4412,9 +4426,9 @@ dependencies = [ [[package]] name = "hashlink" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea0b22561a9c04a7cb1a302c013e0259cd3b4bb619f145b32f72b8b4bcbed230" +checksum = "824e001ac4f3012dd16a264bec811403a67ca9deb6c102fc5049b32c4574b35f" dependencies = [ "hashbrown 0.16.1", ] @@ -4562,9 +4576,9 @@ dependencies = [ [[package]] name = "http" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8be7462df143984c4598a256ef469b251d7d7f9e271135073e78fc535414f3d0" +checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" dependencies = [ "bytes", "itoa", @@ -5231,13 +5245,12 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.99" +version = "0.3.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "142bc4740e452c1e57ade0cbc129f139c9093e354346f0872ef985f4f5cf5f11" +checksum = "f2025f20d7a4fa7785846e7b63d10a76d3f1cee98ee5cb79ea59703f95e42162" dependencies = [ "cfg-if", "futures-util", - "once_cell", "wasm-bindgen", ] @@ -5478,9 +5491,9 @@ dependencies = [ [[package]] name = "keccak-asm" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1766b89733097006f3a1388a02849865d6bc98c89273cb622e29fdd209922183" +checksum = "dd5dc2c0d691cbf7595cde551ced329cca99c2387c2cbc97754c5d0cd045d3ee" dependencies = [ "digest 0.10.7", "sha3-asm", @@ -5726,6 +5739,15 @@ dependencies = [ "hashbrown 0.16.1", ] +[[package]] +name = "lru" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a860605968fce16869fd239cf4237a82f3ac470723415db603b0e8b6c8d4fb9" +dependencies = [ + "hashbrown 0.17.1", +] + [[package]] name = "lru-slab" version = "0.1.2" @@ -6443,6 +6465,30 @@ dependencies = [ "winapi", ] +[[package]] +name = "palette" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cbf71184cc5ecc2e4e1baccdb21026c20e5fc3dcf63028a086131b3ab00b6e6" +dependencies = [ + "approx", + "fast-srgb8", + "libm", + "palette_derive", +] + +[[package]] +name = "palette_derive" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5030daf005bface118c096f510ffb781fc28f9ab6a32ab224d8631be6851d30" +dependencies = [ + "by_address", + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "parity-scale-codec" version = "3.7.5" @@ -6918,9 +6964,9 @@ dependencies = [ [[package]] name = "prost" -version = "0.14.3" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2ea70524a2f82d518bce41317d0fae74151505651af45faf1ffbd6fd33f0568" +checksum = "528ac67416ff8646872a3c02cad9cc4ee5dc9f9540c9b10771855c95cb2e5ae1" dependencies = [ "bytes", "prost-derive", @@ -6928,9 +6974,9 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.14.3" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27c6023962132f4b30eb4c172c91ce92d933da334c59c23cddee82358ddafb0b" +checksum = "b570b25f7617e43d59005d0990ccb79e950a423952cea19671b7a876da390adf" dependencies = [ "anyhow", "itertools 0.14.0", @@ -7152,30 +7198,33 @@ dependencies = [ [[package]] name = "ratatui" -version = "0.30.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1ce67fb8ba4446454d1c8dbaeda0557ff5e94d39d5e5ed7f10a65eb4c8266bc" +checksum = "1695748e3a735b34968c887ceea5a380b43545903868ae8f5b666593100f6b68" dependencies = [ "instability", "ratatui-core", "ratatui-crossterm", "ratatui-widgets", + "serde", ] [[package]] name = "ratatui-core" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef8dea09a92caaf73bff7adb70b76162e5937524058a7e5bff37869cbbec293" +checksum = "42d3603f354bba8c595fa47860e60142d7372b7210c27044c6a7d0e1a4336b44" dependencies = [ "bitflags", "compact_str", - "hashbrown 0.16.1", + "hashbrown 0.17.1", "indoc", "itertools 0.14.0", "kasuari", - "lru", - "strum", + "lru 0.18.0", + "palette", + "serde", + "strum 0.28.0", "thiserror 2.0.18", "unicode-segmentation", "unicode-truncate", @@ -7184,9 +7233,9 @@ dependencies = [ [[package]] name = "ratatui-crossterm" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "577c9b9f652b4c121fb25c6a391dd06406d3b092ba68827e6d2f09550edc54b3" +checksum = "2b2867bedcbd6a690ca4f8672a687b730ec07660c79844517b084311b529980c" dependencies = [ "cfg-if", "crossterm", @@ -7196,18 +7245,19 @@ dependencies = [ [[package]] name = "ratatui-widgets" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7dbfa023cd4e604c2553483820c5fe8aa9d71a42eea5aa77c6e7f35756612db" +checksum = "7ef4f17dd7ac3abf5adc2b920a03c61eee4bfe6a88fa5191936895525371d79c" dependencies = [ "bitflags", - "hashbrown 0.16.1", + "hashbrown 0.17.1", "indoc", "instability", "itertools 0.14.0", "line-clipping", "ratatui-core", - "strum", + "serde", + "strum 0.28.0", "time", "unicode-segmentation", "unicode-width", @@ -7290,9 +7340,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.12.3" +version = "1.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +checksum = "f1292b7759ae1cb9ec195452d1390a074f0cd8541ab7a5a8c31cd6db45d4a6ba" dependencies = [ "aho-corasick", "memchr", @@ -7313,9 +7363,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.10" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" [[package]] name = "regress" @@ -7726,9 +7776,9 @@ dependencies = [ [[package]] name = "reth-codecs" -version = "0.4.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f54468f34d9ed03356dee71bb182a2815a490934f1a291f58158053eee946ba" +checksum = "f9c37bb4d1bac98661bf9128e1141b969034640d68697b22f70377e492fd332c" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7747,9 +7797,9 @@ dependencies = [ [[package]] name = "reth-codecs-derive" -version = "0.4.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c80c0516faf1698c57f91f07c98ecd9f3a9d3f163f1ad4bb263d9c495b3928e0" +checksum = "ceeb8dab90194305d3f7e3f043a22d2db1fb54b6dcf5d8e75c5a4fa8540e1f57" dependencies = [ "proc-macro2", "quote", @@ -7854,7 +7904,7 @@ dependencies = [ "rustc-hash", "serde", "serde_json", - "strum", + "strum 0.27.2", "sysinfo", "tempfile", "thiserror 2.0.18", @@ -9203,7 +9253,7 @@ dependencies = [ "reth-transaction-pool", "secp256k1 0.30.0", "serde", - "strum", + "strum 0.27.2", "thiserror 2.0.18", "tokio", "toml", @@ -9444,9 +9494,9 @@ dependencies = [ [[package]] name = "reth-primitives-traits" -version = "0.4.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d1216ba179909d41d8d55c5eae6c1c33698bc7a3053c35fd425c7789a5de3c1" +checksum = "9102518f0bbf99bc8f0e656a56fb2a7513248630275b608d3706076a82fde42b" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9464,7 +9514,6 @@ dependencies = [ "once_cell", "proptest", "proptest-arbitrary-interop", - "quanta", "rayon", "reth-codecs", "revm-bytecode", @@ -9523,7 +9572,7 @@ dependencies = [ "revm-state", "rocksdb", "smallvec", - "strum", + "strum 0.27.2", "tempfile", "tokio", "tokio-stream", @@ -9580,7 +9629,7 @@ dependencies = [ "reth-codecs", "serde", "serde_json", - "strum", + "strum 0.27.2", "thiserror 2.0.18", "toml", "tracing", @@ -9991,14 +10040,14 @@ dependencies = [ "reth-errors", "reth-network-api", "serde", - "strum", + "strum 0.27.2", ] [[package]] name = "reth-rpc-traits" -version = "0.4.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75186b77fef29e0160f476c9a6bde3363e503f0f32ac4ef47726ef1e3da81118" +checksum = "9fa03a2c9681c385ae1c72b169ac9c3525163b71db0b3362f16e8929e19e45fd" dependencies = [ "alloy-consensus", "alloy-network", @@ -10157,7 +10206,7 @@ dependencies = [ "reth-stages-types", "serde", "serde_json", - "strum", + "strum 0.27.2", "tempfile", "tracing", ] @@ -10534,9 +10583,9 @@ dependencies = [ [[package]] name = "reth-zstd-compressors" -version = "0.4.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80dcfa0327b7642cc41c71d8cd3626a48ac76fb8304c28bcbdf416a45615d020" +checksum = "dc0e86cf594718932d42cebce1fa48292fb7b92721f7c914631add1ca970e814" dependencies = [ "zstd", ] @@ -10544,7 +10593,7 @@ dependencies = [ [[package]] name = "revm" version = "40.0.3" -source = "git+https://github.com/Rimeeeeee/revm?branch=compute-storage-root#666238b8b24225dff85411d1f439959e139f3612" +source = "git+https://github.com/Rimeeeeee/revm?branch=compute-storage-root#3debf202bad9f6469a6120af760753de70fdd549" dependencies = [ "revm-bytecode", "revm-context", @@ -10562,7 +10611,7 @@ dependencies = [ [[package]] name = "revm-bytecode" version = "11.0.1" -source = "git+https://github.com/Rimeeeeee/revm?branch=compute-storage-root#666238b8b24225dff85411d1f439959e139f3612" +source = "git+https://github.com/Rimeeeeee/revm?branch=compute-storage-root#3debf202bad9f6469a6120af760753de70fdd549" dependencies = [ "bitvec", "phf", @@ -10573,7 +10622,7 @@ dependencies = [ [[package]] name = "revm-context" version = "18.0.3" -source = "git+https://github.com/Rimeeeeee/revm?branch=compute-storage-root#666238b8b24225dff85411d1f439959e139f3612" +source = "git+https://github.com/Rimeeeeee/revm?branch=compute-storage-root#3debf202bad9f6469a6120af760753de70fdd549" dependencies = [ "bitvec", "cfg-if", @@ -10589,7 +10638,7 @@ dependencies = [ [[package]] name = "revm-context-interface" version = "19.0.3" -source = "git+https://github.com/Rimeeeeee/revm?branch=compute-storage-root#666238b8b24225dff85411d1f439959e139f3612" +source = "git+https://github.com/Rimeeeeee/revm?branch=compute-storage-root#3debf202bad9f6469a6120af760753de70fdd549" dependencies = [ "alloy-eip2930", "alloy-eip7702", @@ -10604,7 +10653,7 @@ dependencies = [ [[package]] name = "revm-database" version = "15.0.2" -source = "git+https://github.com/Rimeeeeee/revm?branch=compute-storage-root#666238b8b24225dff85411d1f439959e139f3612" +source = "git+https://github.com/Rimeeeeee/revm?branch=compute-storage-root#3debf202bad9f6469a6120af760753de70fdd549" dependencies = [ "alloy-eips", "derive_more", @@ -10618,7 +10667,7 @@ dependencies = [ [[package]] name = "revm-database-interface" version = "12.1.1" -source = "git+https://github.com/Rimeeeeee/revm?branch=compute-storage-root#666238b8b24225dff85411d1f439959e139f3612" +source = "git+https://github.com/Rimeeeeee/revm?branch=compute-storage-root#3debf202bad9f6469a6120af760753de70fdd549" dependencies = [ "auto_impl", "either", @@ -10631,7 +10680,7 @@ dependencies = [ [[package]] name = "revm-handler" version = "20.0.3" -source = "git+https://github.com/Rimeeeeee/revm?branch=compute-storage-root#666238b8b24225dff85411d1f439959e139f3612" +source = "git+https://github.com/Rimeeeeee/revm?branch=compute-storage-root#3debf202bad9f6469a6120af760753de70fdd549" dependencies = [ "auto_impl", "derive-where", @@ -10649,7 +10698,7 @@ dependencies = [ [[package]] name = "revm-inspector" version = "21.0.3" -source = "git+https://github.com/Rimeeeeee/revm?branch=compute-storage-root#666238b8b24225dff85411d1f439959e139f3612" +source = "git+https://github.com/Rimeeeeee/revm?branch=compute-storage-root#3debf202bad9f6469a6120af760753de70fdd549" dependencies = [ "auto_impl", "either", @@ -10665,9 +10714,9 @@ dependencies = [ [[package]] name = "revm-inspectors" -version = "0.40.0" +version = "0.40.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2854f2c48cecac90e8ad48fe8d8842707f79df2b748913b67bd2439a9ea3b4ab" +checksum = "15e0cdc845c8dbf41255c9add80923b45df7bf1dd0473e41483ac398005dba12" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -10686,7 +10735,7 @@ dependencies = [ [[package]] name = "revm-interpreter" version = "37.0.3" -source = "git+https://github.com/Rimeeeeee/revm?branch=compute-storage-root#666238b8b24225dff85411d1f439959e139f3612" +source = "git+https://github.com/Rimeeeeee/revm?branch=compute-storage-root#3debf202bad9f6469a6120af760753de70fdd549" dependencies = [ "revm-bytecode", "revm-context-interface", @@ -10698,7 +10747,7 @@ dependencies = [ [[package]] name = "revm-precompile" version = "36.0.3" -source = "git+https://github.com/Rimeeeeee/revm?branch=compute-storage-root#666238b8b24225dff85411d1f439959e139f3612" +source = "git+https://github.com/Rimeeeeee/revm?branch=compute-storage-root#3debf202bad9f6469a6120af760753de70fdd549" dependencies = [ "ark-bls12-381", "ark-bn254", @@ -10723,7 +10772,7 @@ dependencies = [ [[package]] name = "revm-primitives" version = "24.0.1" -source = "git+https://github.com/Rimeeeeee/revm?branch=compute-storage-root#666238b8b24225dff85411d1f439959e139f3612" +source = "git+https://github.com/Rimeeeeee/revm?branch=compute-storage-root#3debf202bad9f6469a6120af760753de70fdd549" dependencies = [ "alloy-primitives", "once_cell", @@ -10733,7 +10782,7 @@ dependencies = [ [[package]] name = "revm-state" version = "12.0.1" -source = "git+https://github.com/Rimeeeeee/revm?branch=compute-storage-root#666238b8b24225dff85411d1f439959e139f3612" +source = "git+https://github.com/Rimeeeeee/revm?branch=compute-storage-root#3debf202bad9f6469a6120af760753de70fdd549" dependencies = [ "alloy-eip7928 0.4.1", "alloy-trie", @@ -11358,9 +11407,9 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.20.0" +version = "3.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e72c1c2cb7b223fafb600a619537a871c2818583d619401b785e7c0b746ccde2" +checksum = "76a5c54c7310e7b8b9577c286d7e399ddd876c3e12b3ed917a8aabc4b96e9e8c" dependencies = [ "base64 0.22.1", "bs58", @@ -11378,9 +11427,9 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.20.0" +version = "3.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b90c488738ecb4fb0262f41f43bc40efc5868d9fb744319ddf5f5317f417bfac" +checksum = "84d57bc0c8b9a17920c178daa6bb924850d54a9c97ab45194bb8c17ad66bb660" dependencies = [ "darling 0.23.0", "proc-macro2", @@ -11442,9 +11491,9 @@ dependencies = [ [[package]] name = "sha3-asm" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f3f15d4e239ebe08413eed880e0f9b5af4b40ee0472543320efa91d488e96a7" +checksum = "a6287fd675f713484342a89cbf0a386abef5f15919cfad607e5e1f19e1e15331" dependencies = [ "cc", "cfg-if", @@ -11717,7 +11766,16 @@ version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" dependencies = [ - "strum_macros", + "strum_macros 0.27.2", +] + +[[package]] +name = "strum" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd" +dependencies = [ + "strum_macros 0.28.0", ] [[package]] @@ -11732,6 +11790,18 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "strum_macros" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "subtle" version = "2.6.1" @@ -12791,9 +12861,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.23.2" +version = "1.23.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d258b83ceec21034727ecee8c382cfa6c3e133699b0742c64571814fb420c9f7" +checksum = "144d6b123cef80b301b8f72a9e2ca4370ddec21950d0a103dd22c437006d2db7" dependencies = [ "getrandom 0.4.2", "js-sys", @@ -12924,9 +12994,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.122" +version = "0.2.123" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed04576f974d2b2fba0f38c51dbc5518011e38c36bf1143164be765528fd409" +checksum = "a254a4b10c19a76f09a27640e7ffbf9bc30bf67e16a3bf28aaefa4920fe81563" dependencies = [ "cfg-if", "once_cell", @@ -12937,9 +13007,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.72" +version = "0.4.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9473dbd2991ae90b6291c3c32c30c6187ac49aa32f9905d1cce280ec1e110b0f" +checksum = "54568702fabf5d4849ce2b90fadfa64168a097eaf4b351ce9df8b687a0086aaf" dependencies = [ "js-sys", "wasm-bindgen", @@ -12947,9 +13017,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.122" +version = "0.2.123" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "916151b09da36bd82f6615cbf3a419e2f0ba23a03c6160e8e92eb6bd4aa1dec6" +checksum = "24a40fc75b0ec6f3746ceb10d36f53a93dcd68a93b11b6445983945d79eba0dc" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -12957,9 +13027,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.122" +version = "0.2.123" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "299047362ccbfce148b67ab7e73349f77748e00c8296f9542adfad2ad82c5c5e" +checksum = "908f34bd9b9ce3d4caf07b72dfab63d61504d156856c6bd3cd87fa350cf3985b" dependencies = [ "bumpalo", "proc-macro2", @@ -12970,9 +13040,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.122" +version = "0.2.123" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a929b2c61f11ba3e9bc35b50c1f25cb38e0e892c0c231ae2b8cf78d5dad4437" +checksum = "7acbf7616c27b194bbb550bf77ed0c2c3e5b7fd1260a93082b95fb7f47959b92" dependencies = [ "unicode-ident", ] @@ -13040,9 +13110,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.99" +version = "0.3.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621441cfc37b84979402712047321980c178f299193a3589d05b99e8763436" +checksum = "6e0871acf327f283dc6da28a1696cdc64fb355ba9f935d052021fa77f35cce69" dependencies = [ "js-sys", "wasm-bindgen", @@ -13778,18 +13848,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.50" +version = "0.8.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b065d4f0e55f82fae73202e189638116a87c55ab6b8e6c2721e13dd9d854ad1" +checksum = "ce1022995ff5ff5d841ad7d994facc23098cd40152f2c1d11cd607c6f530653f" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.50" +version = "0.8.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b631b19d36a892ab55420c92dbc83ccd79274f25be714855d3074aa71cab639" +checksum = "1ae7f38b72ec2a254e2b87ef277cf2cd4fb97cbebf944faa6f33354da0867930" dependencies = [ "proc-macro2", "quote", diff --git a/crates/engine/tree/src/tree/payload_processor/bal/execute.rs b/crates/engine/tree/src/tree/payload_processor/bal/execute.rs index 4b910b952d0..213a2ffa05a 100644 --- a/crates/engine/tree/src/tree/payload_processor/bal/execute.rs +++ b/crates/engine/tree/src/tree/payload_processor/bal/execute.rs @@ -1134,7 +1134,7 @@ mod tests { .iter_mut() .find(|account| account.address() == sstore_contract) .expect("SSTORE contract must be present in BAL"); - account.storage_root = Some(B256::from([0x99; 32])); + account.storage_root = Some(alloy_eip7928::StorageRoot::Root(B256::from([0x99; 32]))); let tampered_hash = alloy_eip7928::compute_block_access_list_hash(&tampered_bal); let block = empty_amsterdam_block(tampered_hash); diff --git a/crates/engine/tree/src/tree/payload_processor/mod.rs b/crates/engine/tree/src/tree/payload_processor/mod.rs index 5949cbf0e4a..27ae24f125e 100644 --- a/crates/engine/tree/src/tree/payload_processor/mod.rs +++ b/crates/engine/tree/src/tree/payload_processor/mod.rs @@ -8,7 +8,7 @@ use crate::tree::{ ExecutionCache, PayloadExecutionCache, SavedCache, StateProviderBuilder, TreeConfig, WaitForCaches, }; -use alloy_eip7928::bal::DecodedBal; +use alloy_eip7928::{bal::DecodedBal, StorageRoot}; use alloy_eips::{eip1898::BlockWithParent, eip4895::Withdrawal}; use alloy_primitives::B256; use crossbeam_channel::{Receiver as CrossbeamReceiver, Sender as CrossbeamSender}; @@ -30,6 +30,7 @@ use reth_tasks::{utils::increase_thread_priority, ForEachOrdered, Runtime}; use reth_trie::{ hashed_cursor::HashedCursorFactory, trie_cursor::TrieCursorFactory, HashedPostState, }; +use reth_trie_common::EMPTY_ROOT_HASH; use reth_trie_parallel::{ proof_task::{ProofTaskCtx, ProofWorkerHandle}, root::ParallelStateRootError, @@ -83,6 +84,15 @@ pub const SPARSE_TRIE_MAX_VALUES_SHRINK_CAPACITY: usize = 1_000_000; /// prewarm workers exceeds the execution time saved. pub const SMALL_BLOCK_TX_THRESHOLD: usize = 5; +/// Converts a BAL storage root into the trie root used for state-root computation. +pub(crate) const fn bal_storage_root_to_b256(storage_root: Option) -> Option { + match storage_root { + Some(StorageRoot::Empty) => Some(EMPTY_ROOT_HASH), + Some(StorageRoot::Root(root)) => Some(root), + None => None, + } +} + /// Type alias for [`PayloadHandle`] returned by payload processor spawn methods. type IteratorTx = RecoveredTx, >::Recovered>; @@ -1019,7 +1029,10 @@ where #[cfg(test)] mod tests { use crate::tree::{ - payload_processor::{evm_state_to_hashed_post_state, ExecutionEnv, PayloadProcessor}, + payload_processor::{ + bal_storage_root_to_b256, evm_state_to_hashed_post_state, ExecutionEnv, + PayloadProcessor, + }, precompile_cache::PrecompileCacheMap, ExecutionCache, PayloadExecutionCache, SavedCache, StateProviderBuilder, TreeConfig, }; @@ -1050,6 +1063,21 @@ mod tests { SavedCache::new(hash, execution_cache) } + #[test] + fn bal_storage_root_to_b256_maps_optional_empty_and_root() { + let root = B256::from([0x42; 32]); + + assert_eq!( + bal_storage_root_to_b256(Some(alloy_eip7928::StorageRoot::Empty)), + Some(reth_trie_common::EMPTY_ROOT_HASH) + ); + assert_eq!( + bal_storage_root_to_b256(Some(alloy_eip7928::StorageRoot::Root(root))), + Some(root) + ); + assert_eq!(bal_storage_root_to_b256(None), None); + } + #[test] fn execution_cache_allows_single_checkout() { let execution_cache = PayloadExecutionCache::default(); diff --git a/crates/engine/tree/src/tree/payload_processor/prewarm.rs b/crates/engine/tree/src/tree/payload_processor/prewarm.rs index c44efbe9933..fece47dedbf 100644 --- a/crates/engine/tree/src/tree/payload_processor/prewarm.rs +++ b/crates/engine/tree/src/tree/payload_processor/prewarm.rs @@ -12,7 +12,7 @@ //! 3. When actual block execution happens, it benefits from the warmed cache use crate::tree::{ - payload_processor::multiproof::StateRootMessage, + payload_processor::{bal_storage_root_to_b256, multiproof::StateRootMessage}, precompile_cache::{CachedPrecompile, PrecompileCacheMap}, CachedStateCacheMetrics, CachedStateMetrics, CachedStateProvider, ExecutionEnv, PayloadExecutionCache, SavedCache, StateProviderBuilder, @@ -20,7 +20,7 @@ use crate::tree::{ use alloy_consensus::transaction::TxHashRef; use alloy_eip7928::bal::DecodedBal; use alloy_eips::eip4895::Withdrawal; -use alloy_primitives::{keccak256, StorageKey, B256}; +use alloy_primitives::{keccak256, map::B256Map, StorageKey, B256}; use crossbeam_channel::Sender as CrossbeamSender; use metrics::{Counter, Gauge, Histogram}; use rayon::prelude::*; @@ -34,6 +34,7 @@ use reth_provider::{ use reth_revm::{database::StateProviderDatabase, state::EvmState}; use reth_tasks::{pool::WorkerPool, Runtime}; use reth_trie_common::{MultiProofTargetsV2, ProofV2Target}; +use revm_primitives::hardfork::SpecId; use std::sync::{ atomic::{AtomicBool, AtomicUsize, Ordering}, mpsc::{self, channel, Receiver, Sender}, @@ -354,6 +355,8 @@ where let ctx = self.ctx.clone(); let to_sparse_trie_task = self.to_sparse_trie_task.clone(); let executor = self.executor.clone(); + let is_bogota_active = + Into::::into(*self.ctx.env.evm_env.spec_id()).is_enabled_in(SpecId::BOGOTA); let parent_span = Span::current(); let prefetch_parent_span = parent_span.clone(); let stream_parent_span = parent_span; @@ -374,6 +377,21 @@ where let parent_span = branch_span.clone(); let _span = branch_span.entered(); + if is_bogota_active { + let storage_roots = stream_bal + .as_bal() + .iter() + .filter_map(|account| { + bal_storage_root_to_b256(account.storage_root_value()) + .map(|root| (keccak256(account.address()), root)) + }) + .collect::>(); + if !storage_roots.is_empty() { + let _ = + to_sparse_trie_task.send(StateRootMessage::StorageRoots(storage_roots)); + } + } + stream_bal.as_bal().par_iter().for_each(|account_changes| { WorkerPool::with_worker_mut(|worker| { let provider = diff --git a/crates/engine/tree/src/tree/payload_processor/sparse_trie.rs b/crates/engine/tree/src/tree/payload_processor/sparse_trie.rs index 73e3fcd81f3..a791e7e7719 100644 --- a/crates/engine/tree/src/tree/payload_processor/sparse_trie.rs +++ b/crates/engine/tree/src/tree/payload_processor/sparse_trie.rs @@ -66,6 +66,8 @@ pub(super) struct SparseTrieCacheTask, /// Storage trie updates. hashed address -> slot -> update. storage_updates: B256Map>, + /// Precomputed post-block storage roots from the Bogota BAL. + precomputed_storage_roots: B256Map, /// Account updates that are buffered but were not yet applied to the trie. new_account_updates: B256Map, @@ -158,6 +160,7 @@ where max_targets_for_chunking: DEFAULT_MAX_TARGETS_FOR_CHUNKING, account_updates: Default::default(), storage_updates: Default::default(), + precomputed_storage_roots: Default::default(), new_account_updates: Default::default(), new_storage_updates: Default::default(), pending_account_updates: Default::default(), @@ -208,6 +211,7 @@ where StateRootMessage::HashedStateUpdate(state) => { SparseTrieTaskMessage::HashedState(state) } + StateRootMessage::StorageRoots(roots) => SparseTrieTaskMessage::StorageRoots(roots), }; if hashed_state_tx.send(msg).is_err() { break; @@ -427,6 +431,9 @@ where SparseTrieTaskMessage::HashedState(hashed_state) => { self.on_hashed_state_update(hashed_state) } + SparseTrieTaskMessage::StorageRoots(roots) => { + self.precomputed_storage_roots.extend(roots); + } SparseTrieTaskMessage::FinishedStateUpdates => { let _ = self .final_hashed_state_tx @@ -694,6 +701,9 @@ where let mut tries_to_compute_roots: Vec<(B256, SendStorageTriePtr)> = Vec::with_capacity(addresses_to_compute_roots.len()); for address in addresses_to_compute_roots { + if self.precomputed_storage_roots.contains_key(&address) { + continue; + } if let Some(trie) = self.trie.storage_tries_mut().get_mut(&address) && !trie.is_root_cached() { @@ -754,29 +764,39 @@ where let span = trace_span!("promote_updates", promoted = tracing::field::Empty).entered(); // Now handle pending account updates that can be upgraded to a proper update. let account_rlp_buf = &mut self.account_rlp_buf; + let account_updates = &mut self.account_updates; + let storage_updates = &self.storage_updates; + let precomputed_storage_roots = &self.precomputed_storage_roots; + let trie = &mut self.trie; + let storage_root = |trie: &mut SparseStateTrie, address: &B256| { + precomputed_storage_roots + .get(address) + .copied() + .or_else(|| trie.storage_root(address)) + }; let mut num_promoted = 0; self.pending_account_updates.retain(|addr, account| { - if let Some(updates) = self.storage_updates.get(addr) { + if let Some(updates) = storage_updates.get(addr) { if !updates.is_empty() { // If account has pending storage updates, it is still pending. return true; } else if let Some(account) = account.take() { - let storage_root = self.trie.storage_root(addr).expect("updates are drained, storage trie should be revealed by now"); + let storage_root = storage_root(trie, addr).expect("updates are drained, storage trie should be revealed by now"); let encoded = encode_account_leaf_value(account, storage_root, account_rlp_buf); - self.account_updates.insert(*addr, LeafUpdate::Changed(encoded)); + account_updates.insert(*addr, LeafUpdate::Changed(encoded)); num_promoted += 1; return false; } } // Get the current account state either from the trie or from latest account update. - let trie_account = match self.account_updates.get(addr) { + let trie_account = match account_updates.get(addr) { Some(LeafUpdate::Changed(encoded)) => { Some(encoded).filter(|encoded| !encoded.is_empty()) } // Needs to be revealed first Some(LeafUpdate::Touched) => return true, - None => self.trie.get_account_value(addr), + None => trie.get_account_value(addr), }; let trie_account = trie_account.map(|value| TrieAccount::decode(&mut &value[..]).expect("invalid account RLP")); @@ -790,11 +810,11 @@ where (account, storage_root) } else { - (trie_account.map(Into::into), self.trie.storage_root(addr).expect("account had storage updates that were applied to its trie, storage root must be revealed by now")) + (trie_account.map(Into::into), storage_root(trie, addr).expect("account had storage updates that were applied to its trie, storage root must be revealed by now")) }; let encoded = encode_account_leaf_value(account, storage_root, account_rlp_buf); - self.account_updates.insert(*addr, LeafUpdate::Changed(encoded)); + account_updates.insert(*addr, LeafUpdate::Changed(encoded)); num_promoted += 1; false @@ -904,6 +924,8 @@ impl PendingTargets { enum SparseTrieTaskMessage { /// A hashed state update ready to be processed. HashedState(HashedPostState), + /// Precomputed post-block storage roots keyed by hashed account address. + StorageRoots(B256Map), /// Prefetch proof targets (passed through directly). PrefetchProofs(MultiProofTargetsV2), /// Signals that all state updates have been received. diff --git a/crates/engine/tree/src/tree/payload_validator.rs b/crates/engine/tree/src/tree/payload_validator.rs index 9b3a7f24175..bf39af89676 100644 --- a/crates/engine/tree/src/tree/payload_validator.rs +++ b/crates/engine/tree/src/tree/payload_validator.rs @@ -42,7 +42,7 @@ use crate::tree::{ error::{InsertBlockError, InsertBlockErrorKind, InsertPayloadError}, instrumented_state::{InstrumentedStateProvider, StateProviderMetrics, StateProviderStats}, multiproof::{StateRootComputeOutcome, StateRootHandle}, - payload_processor::PayloadProcessor, + payload_processor::{bal_storage_root_to_b256, PayloadProcessor}, precompile_cache::{CachedPrecompile, CachedPrecompileMetrics, PrecompileCacheMap}, types::{InsertPayloadResult, ValidationOutput}, CacheWaitDurations, CachedStateProvider, EngineApiMetrics, EngineApiTreeState, ExecutionEnv, @@ -52,7 +52,11 @@ use alloy_consensus::transaction::{Either, TxHashRef}; use alloy_eip7928::{bal::DecodedBal, compute_block_access_list_hash, BlockAccessList}; use alloy_eips::{eip1898::BlockWithParent, eip4895::Withdrawal, NumHash}; use alloy_evm::Evm; -use alloy_primitives::{map::B256Set, B256}; +use alloy_primitives::{ + keccak256, + map::{B256Map, B256Set}, + B256, +}; use reth_tasks::LazyHandle; #[cfg(feature = "trie-debug")] use reth_trie_sparse::debug_recorder::TrieDebugRecorder; @@ -573,6 +577,8 @@ where // Execute the block and handle any execution errors. // The receipt root task is spawned before execution and receives receipts incrementally // as transactions complete, allowing parallel computation during execution. + let is_bogota_active = + Into::::into(*env.evm_env.spec_id()).is_enabled_in(SpecId::BOGOTA); let execute_block_start = Instant::now(); let execution_result = if parallel_bal_execution { self.execute_block_bal(env, &input, &handle, &make_state_provider) @@ -651,7 +657,7 @@ where &output, &mut ctx, receipt_root_bloom, - built_bal + built_bal.clone() ), block ); @@ -770,6 +776,7 @@ where provider_factory, overlay_builder, &hashed_state, + built_bal.as_ref().filter(|_| is_bogota_active), ) { Ok(result) => { let elapsed = root_time.elapsed(); @@ -1339,6 +1346,7 @@ where provider_factory: P, overlay_builder: OverlayBuilder, hashed_state: &LazyHashedPostState, + built_bal: Option<&BlockAccessList>, ) -> Result<(B256, TrieUpdates), ParallelStateRootError> { let hashed_state = hashed_state.get(); // The `hashed_state` argument will be taken into account as part of the overlay, but we @@ -1349,9 +1357,21 @@ where overlay_builder.with_extended_hashed_state_overlay(hashed_state.clone_into_sorted()); let overlay_factory = OverlayStateProviderFactory::new(provider_factory, overlay_builder); ParallelStateRoot::new(overlay_factory, prefix_sets, self.runtime.clone()) + .with_precomputed_storage_roots(Self::bal_storage_roots(built_bal)) .incremental_root_with_updates() } + fn bal_storage_roots(built_bal: Option<&BlockAccessList>) -> B256Map { + built_bal + .into_iter() + .flat_map(|bal| bal.iter()) + .filter_map(|account| { + bal_storage_root_to_b256(account.storage_root_value()) + .map(|storage_root| (keccak256(account.address()), storage_root)) + }) + .collect() + } + /// Compute state root for the given hashed post state in serial. /// /// Uses the same provider construction path as main execution and computes the state root and diff --git a/crates/trie/parallel/src/root.rs b/crates/trie/parallel/src/root.rs index d04108dd786..be2bb73b3b2 100644 --- a/crates/trie/parallel/src/root.rs +++ b/crates/trie/parallel/src/root.rs @@ -1,7 +1,7 @@ #[cfg(feature = "metrics")] use crate::metrics::ParallelStateRootMetrics; use crate::{stats::ParallelTrieTracker, storage_root_targets::StorageRootTargets}; -use alloy_primitives::B256; +use alloy_primitives::{map::B256Map, B256}; use alloy_rlp::{BufMut, Encodable}; use itertools::Itertools; use reth_execution_errors::{SparseTrieError, StateProofError, StorageRootError}; @@ -39,6 +39,8 @@ pub struct ParallelStateRoot { prefix_sets: TriePrefixSets, /// The runtime handle for spawning blocking tasks. runtime: Runtime, + /// Storage roots that were already computed by execution. + precomputed_storage_roots: B256Map, /// Parallel state root metrics. #[cfg(feature = "metrics")] metrics: ParallelStateRootMetrics, @@ -51,10 +53,17 @@ impl ParallelStateRoot { factory, prefix_sets, runtime, + precomputed_storage_roots: B256Map::default(), #[cfg(feature = "metrics")] metrics: ParallelStateRootMetrics::default(), } } + + /// Use storage roots that were already computed by execution. + pub fn with_precomputed_storage_roots(mut self, roots: B256Map) -> Self { + self.precomputed_storage_roots = roots; + self + } } impl ParallelStateRoot @@ -94,13 +103,28 @@ where // Pre-calculate storage roots in parallel for accounts which were changed. tracker.set_precomputed_storage_roots(storage_root_targets.len() as u64); debug!(target: "trie::parallel_state_root", len = storage_root_targets.len(), "pre-calculating storage roots"); + enum PendingStorageRoot { + Precomputed(B256), + Receiver( + mpsc::Receiver>, + ), + } + let mut storage_roots = HashMap::with_capacity(storage_root_targets.len()); + let mut precomputed_storage_roots = self.precomputed_storage_roots; let handle = self.runtime.handle().clone(); for (hashed_address, prefix_set) in storage_root_targets.into_iter().sorted_unstable_by_key(|(address, _)| *address) { + if prefix_set.is_empty() && + let Some(root) = precomputed_storage_roots.remove(&hashed_address) + { + storage_roots.insert(hashed_address, PendingStorageRoot::Precomputed(root)); + continue + } + let factory = self.factory.clone(); #[cfg(feature = "metrics")] let metrics = self.metrics.storage_trie.clone(); @@ -123,7 +147,7 @@ where })(); let _ = tx.send(result); })); - storage_roots.insert(hashed_address, rx); + storage_roots.insert(hashed_address, PendingStorageRoot::Receiver(rx)); } trace!(target: "trie::parallel_state_root", "calculating state root"); @@ -150,7 +174,10 @@ where } TrieElement::Leaf(hashed_address, account) => { let storage_root_result = match storage_roots.remove(&hashed_address) { - Some(rx) => rx.recv().map_err(|_| { + Some(PendingStorageRoot::Precomputed(root)) => { + reth_trie::StorageRootProgress::Complete(root, 0, Default::default()) + } + Some(PendingStorageRoot::Receiver(rx)) => rx.recv().map_err(|_| { ParallelStateRootError::StorageRoot(StorageRootError::Database( DatabaseError::Other(format!( "channel closed for {hashed_address}" diff --git a/crates/trie/parallel/src/state_root_task.rs b/crates/trie/parallel/src/state_root_task.rs index 6f1619bd0aa..199f91ec10d 100644 --- a/crates/trie/parallel/src/state_root_task.rs +++ b/crates/trie/parallel/src/state_root_task.rs @@ -2,7 +2,7 @@ use crate::root::ParallelStateRootError; use alloy_eip7928::BlockAccessList; -use alloy_primitives::{keccak256, B256}; +use alloy_primitives::{keccak256, map::B256Map, B256}; use derive_more::derive::Deref; use reth_trie::{updates::TrieUpdates, HashedPostState, HashedStorage, MultiProofTargetsV2}; use revm_state::EvmState; @@ -18,6 +18,8 @@ pub enum StateRootMessage { StateUpdate(EvmState), /// Pre-hashed state update from BAL conversion that can be applied directly without proofs. HashedStateUpdate(HashedPostState), + /// Post-block storage roots keyed by hashed account address. + StorageRoots(B256Map), /// Block Access List (EIP-7928; BAL) containing complete state changes for the block. /// /// When received, the task generates a single state update from the BAL and processes it.