From 62c971414cad21003cc4e34b9104d0cc604d012d Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Wed, 12 Mar 2025 14:22:24 -0700 Subject: [PATCH 01/23] init_tracing --- Cargo.lock | 2083 ++++++++++++++++++++++++++++------------------ Cargo.toml | 35 +- src/debug_api.rs | 2 +- src/main.rs | 78 +- src/proxy.rs | 5 +- src/tracing.rs | 66 ++ 6 files changed, 1409 insertions(+), 860 deletions(-) create mode 100644 src/tracing.rs diff --git a/Cargo.lock b/Cargo.lock index f48b3c84..c91fc35a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -26,7 +26,7 @@ dependencies = [ "cfg-if 1.0.0", "once_cell", "version_check", - "zerocopy", + "zerocopy 0.7.35", ] [[package]] @@ -55,81 +55,93 @@ dependencies = [ [[package]] name = "alloy-consensus" -version = "0.7.3" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a101d4d016f47f13890a74290fdd17b05dd175191d9337bc600791fb96e4dea8" +checksum = "a84efb7b8ddb9223346bfad9d8094e1a100c254037a3b5913243bfa8e04be266" dependencies = [ - "alloy-eips 0.7.3", + "alloy-eips", "alloy-primitives", "alloy-rlp", - "alloy-serde 0.7.3", + "alloy-serde", "alloy-trie", "auto_impl", "c-kzg", - "derive_more", + "derive_more 2.0.1", + "either", + "k256", + "once_cell", + "rand", "serde", + "serde_with", + "thiserror 2.0.12", ] [[package]] name = "alloy-consensus-any" -version = "0.7.3" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa60357dda9a3d0f738f18844bd6d0f4a5924cc5cf00bfad2ff1369897966123" +checksum = "fafded0c1ff8f0275c4a484239058e1c01c0c2589f8a16e03669ef7094a06f9b" dependencies = [ "alloy-consensus", - "alloy-eips 0.7.3", + "alloy-eips", "alloy-primitives", "alloy-rlp", + "alloy-serde", + "serde", ] [[package]] -name = "alloy-eip2930" +name = "alloy-eip2124" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0069cf0642457f87a01a014f6dc29d5d893cd4fd8fddf0c3cdfad1bb3ebafc41" +checksum = "675264c957689f0fd75f5993a73123c2cc3b5c235a38f5b9037fe6c826bfb2c0" dependencies = [ "alloy-primitives", "alloy-rlp", + "crc", "serde", + "thiserror 2.0.12", ] [[package]] -name = "alloy-eip7702" -version = "0.4.2" +name = "alloy-eip2930" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c986539255fb839d1533c128e190e557e52ff652c9ef62939e233a81dd93f7e" +checksum = "0069cf0642457f87a01a014f6dc29d5d893cd4fd8fddf0c3cdfad1bb3ebafc41" dependencies = [ "alloy-primitives", "alloy-rlp", - "derive_more", "serde", ] [[package]] name = "alloy-eip7702" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cabf647eb4650c91a9d38cb6f972bb320009e7e9d61765fb688a86f1563b33e8" +checksum = "9b15b13d38b366d01e818fe8e710d4d702ef7499eacd44926a06171dd9585d0c" dependencies = [ "alloy-primitives", "alloy-rlp", - "derive_more", "serde", + "thiserror 2.0.12", ] [[package]] name = "alloy-eips" -version = "0.7.3" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6755b093afef5925f25079dd5a7c8d096398b804ba60cb5275397b06b31689" +checksum = "5f4bffedaddc627520eabdcbfe27a2d2c2f716e15295e2ed1010df3feae67040" dependencies = [ + "alloy-eip2124", "alloy-eip2930", - "alloy-eip7702 0.4.2", + "alloy-eip7702", "alloy-primitives", "alloy-rlp", - "alloy-serde 0.7.3", + "alloy-serde", + "auto_impl", "c-kzg", - "derive_more", + "derive_more 2.0.1", + "either", "ethereum_ssz", "ethereum_ssz_derive", "once_cell", @@ -138,52 +150,45 @@ dependencies = [ ] [[package]] -name = "alloy-eips" -version = "0.9.2" +name = "alloy-json-abi" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52dd5869ed09e399003e0e0ec6903d981b2a92e74c5d37e6b40890bad2517526" +checksum = "125601804507fef5ae7debcbf800906b12741f19800c1c05b953d0f1b990131a" dependencies = [ - "alloy-eip2930", - "alloy-eip7702 0.5.0", "alloy-primitives", - "alloy-rlp", - "alloy-serde 0.9.2", - "c-kzg", - "derive_more", - "once_cell", + "alloy-sol-type-parser", "serde", - "sha2", + "serde_json", ] [[package]] name = "alloy-network-primitives" -version = "0.7.3" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20219d1ad261da7a6331c16367214ee7ded41d001fabbbd656fbf71898b2773" +checksum = "4c06932646544ea341f0fda48d2c0fe4fda75bc132379cb84019cdfb6ddcb0fb" dependencies = [ "alloy-consensus", - "alloy-eips 0.7.3", + "alloy-eips", "alloy-primitives", - "alloy-serde 0.7.3", + "alloy-serde", "serde", ] [[package]] name = "alloy-primitives" -version = "0.8.15" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6259a506ab13e1d658796c31e6e39d2e2ee89243bcc505ddc613b35732e0a430" +checksum = "8c66bb6715b7499ea755bde4c96223ae8eb74e05c014ab38b9db602879ffb825" dependencies = [ "alloy-rlp", "bytes", "cfg-if 1.0.0", "const-hex", - "derive_more", + "derive_more 2.0.1", "foldhash", "getrandom 0.2.15", - "hashbrown 0.15.0", - "hex-literal", - "indexmap 2.6.0", + "hashbrown 0.15.2", + "indexmap 2.8.0", "itoa", "k256", "keccak-asm", @@ -191,7 +196,7 @@ dependencies = [ "proptest", "rand", "ruint", - "rustc-hash 2.0.0", + "rustc-hash 2.1.1", "serde", "sha3", "tiny-keccak", @@ -199,9 +204,9 @@ dependencies = [ [[package]] name = "alloy-rlp" -version = "0.3.9" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0822426598f95e45dd1ea32a738dac057529a709ee645fcc516ffa4cbde08f" +checksum = "3d6c1d995bff8d011f7cd6c81820d51825e6e06d6db73914c1630ecf544d83d6" dependencies = [ "alloy-rlp-derive", "arrayvec", @@ -210,27 +215,27 @@ dependencies = [ [[package]] name = "alloy-rlp-derive" -version = "0.3.9" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b09cae092c27b6f1bde952653a22708691802e57bfef4a2973b80bea21efd3f" +checksum = "a40e1ef334153322fd878d07e86af7a529bcb86b2439525920a88eba87bcf943" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] name = "alloy-rpc-types-engine" -version = "0.7.3" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d297268357e3eae834ddd6888b15f764cbc0f4b3be9265f5f6ec239013f3d68" +checksum = "b1a1a0710dbfbab2b33200ef45c650963d63edf6a81b2c7399ede762b3586dfd" dependencies = [ "alloy-consensus", - "alloy-eips 0.7.3", + "alloy-eips", "alloy-primitives", "alloy-rlp", - "alloy-serde 0.7.3", - "derive_more", + "alloy-serde", + "derive_more 2.0.1", "ethereum_ssz", "ethereum_ssz_derive", "jsonwebtoken", @@ -241,40 +246,29 @@ dependencies = [ [[package]] name = "alloy-rpc-types-eth" -version = "0.7.3" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0600b8b5e2dc0cab12cbf91b5a885c35871789fb7b3a57b434bd4fced5b7a8b" +checksum = "8e18d94b1036302720b987564560e4a5b85035a17553c53a50afa2bd8762b487" dependencies = [ "alloy-consensus", "alloy-consensus-any", - "alloy-eips 0.7.3", + "alloy-eips", "alloy-network-primitives", "alloy-primitives", "alloy-rlp", - "alloy-serde 0.7.3", + "alloy-serde", "alloy-sol-types", - "derive_more", - "itertools 0.13.0", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-serde" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afa753a97002a33b2ccb707d9f15f31c81b8c1b786c95b73cc62bb1d1fd0c3f" -dependencies = [ - "alloy-primitives", + "itertools 0.14.0", "serde", "serde_json", + "thiserror 2.0.12", ] [[package]] name = "alloy-serde" -version = "0.9.2" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae0465c71d4dced7525f408d84873aeebb71faf807d22d74c4a426430ccd9b55" +checksum = "9824e1bf92cd7848ca6fabb01c9aca15c9c5fb0ab96da5514ef0543f021c69f6" dependencies = [ "alloy-primitives", "serde", @@ -283,83 +277,110 @@ dependencies = [ [[package]] name = "alloy-sol-macro" -version = "0.8.14" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bfd7853b65a2b4f49629ec975fee274faf6dff15ab8894c620943398ef283c0" +checksum = "c7f9c3c7bc1f4e334e5c5fc59ec8dac894973a71b11da09065affc6094025049" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] name = "alloy-sol-macro-expander" -version = "0.8.14" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82ec42f342d9a9261699f8078e57a7a4fda8aaa73c1a212ed3987080e6a9cd13" +checksum = "46ff7aa715eb2404cb87fa94390d2c5d5addd70d9617e20b2398ee6f48cb21f0" dependencies = [ "alloy-sol-macro-input", "const-hex", "heck", - "indexmap 2.6.0", + "indexmap 2.8.0", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", "syn-solidity", "tiny-keccak", ] [[package]] name = "alloy-sol-macro-input" -version = "0.8.14" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2c50e6a62ee2b4f7ab3c6d0366e5770a21cad426e109c2f40335a1b3aff3df" +checksum = "6f105fa700140c0cc6e2c3377adef650c389ac57b8ead8318a2e6bd52f1ae841" dependencies = [ "const-hex", "dunce", "heck", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", "syn-solidity", ] +[[package]] +name = "alloy-sol-type-parser" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c649acc6c9d3893e392c737faeadce30b4a1751eed148ae43bc2f27f29c4480c" +dependencies = [ + "serde", + "winnow", +] + [[package]] name = "alloy-sol-types" -version = "0.8.14" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9dc0fffe397aa17628160e16b89f704098bf3c9d74d5d369ebc239575936de5" +checksum = "5f819635439ebb06aa13c96beac9b2e7360c259e90f5160a6848ae0d94d10452" dependencies = [ + "alloy-json-abi", "alloy-primitives", "alloy-sol-macro", "const-hex", + "serde", ] [[package]] name = "alloy-trie" -version = "0.7.6" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a5fd8fea044cc9a8c8a50bb6f28e31f0385d820f116c5b98f6f4e55d6e5590b" +checksum = "d95a94854e420f07e962f7807485856cde359ab99ab6413883e15235ad996e8b" dependencies = [ "alloy-primitives", "alloy-rlp", "arrayvec", - "derive_more", + "derive_more 1.0.0", "nybbles", "serde", "smallvec", "tracing", ] +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "anstream" -version = "0.6.17" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23a1e53f0f5d86382dafe1cf314783b2044280f406e7e1506368220ad11b1338" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", @@ -372,9 +393,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8365de52b16c035ff4fcafe0092ba9390540e3e352870ac09933bebcaa2c8c56" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" @@ -396,19 +417,20 @@ dependencies = [ [[package]] name = "anstyle-wincon" -version = "3.0.6" +version = "3.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" dependencies = [ "anstyle", + "once_cell", "windows-sys 0.59.0", ] [[package]] name = "anyhow" -version = "1.0.91" +version = "1.0.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c042108f3ed77fd83760a5fd79b53be043192bb3b9dba91d8c574c0ada7850c8" +checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" [[package]] name = "ark-ff" @@ -561,9 +583,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.18" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df895a515f70646414f4b45c0b79082783b80552b373a68283012928df56f522" +checksum = "310c9bcae737a48ef5cdee3174184e6d548b292739ede61a1f955ef76a738861" dependencies = [ "brotli", "flate2", @@ -594,18 +616,18 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] name = "async-trait" -version = "0.1.83" +version = "0.1.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" +checksum = "d556ec1359574147ec0c4fc5eb525f3f23263a592b1a9c07e0a75b427de55c97" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] @@ -616,13 +638,13 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "auto_impl" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" +checksum = "e12882f59de5360c748c4cbf569a042d5fb0eb515f7bea9c1f470b47f6ffbd73" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] @@ -633,41 +655,39 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "aws-lc-rs" -version = "1.12.2" +version = "1.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c2b7ddaa2c56a367ad27a094ad8ef4faacf8a617c2575acb2ba88949df999ca" +checksum = "dabb68eb3a7aa08b46fddfd59a3d55c978243557a90ab804769f7e20e67d2b01" dependencies = [ "aws-lc-sys", - "paste", "zeroize", ] [[package]] name = "aws-lc-sys" -version = "0.25.1" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54ac4f13dad353b209b34cbec082338202cbc01c8f00336b55c750c13ac91f8f" +checksum = "6bbe221bbf523b625a4dd8585c7f38166e31167ec2ca98051dbcb4c3b6e825d2" dependencies = [ "bindgen 0.69.5", "cc", "cmake", "dunce", "fs_extra", - "paste", ] [[package]] name = "axum" -version = "0.7.7" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "504e3947307ac8326a5437504c517c4b56716c9d98fac0028c2acc7ca47d70ae" +checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" dependencies = [ "async-trait", "axum-core", "bytes", "futures-util", - "http 1.1.0", - "http-body 1.0.1", + "http", + "http-body", "http-body-util", "itoa", "matchit", @@ -677,8 +697,8 @@ dependencies = [ "pin-project-lite", "rustversion", "serde", - "sync_wrapper 1.0.1", - "tower 0.5.1", + "sync_wrapper", + "tower 0.5.2", "tower-layer", "tower-service", ] @@ -692,13 +712,13 @@ dependencies = [ "async-trait", "bytes", "futures-util", - "http 1.1.0", - "http-body 1.0.1", + "http", + "http-body", "http-body-util", "mime", "pin-project-lite", "rustversion", - "sync_wrapper 1.0.1", + "sync_wrapper", "tower-layer", "tower-service", ] @@ -715,7 +735,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -724,12 +744,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - [[package]] name = "base64" version = "0.22.1" @@ -738,9 +752,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" -version = "1.6.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +checksum = "bb97d56060ee67d285efb8001fec9d2a4c710c32efd2e14b5cbb5ba71930fc2d" [[package]] name = "bindgen" @@ -748,7 +762,7 @@ version = "0.69.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.0", "cexpr", "clang-sys", "itertools 0.12.1", @@ -761,7 +775,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.90", + "syn 2.0.100", "which", ] @@ -771,7 +785,7 @@ version = "0.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.0", "cexpr", "clang-sys", "itertools 0.13.0", @@ -780,23 +794,23 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] name = "bit-set" -version = "0.5.3" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" dependencies = [ "bit-vec", ] [[package]] name = "bit-vec" -version = "0.6.3" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" [[package]] name = "bitflags" @@ -806,9 +820,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.6.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" [[package]] name = "bitvec" @@ -833,9 +847,9 @@ dependencies = [ [[package]] name = "blst" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4378725facc195f1a538864863f6de233b500a8862747e7f165078a419d5e874" +checksum = "47c79a94619fade3c0b887670333513a67ac28a6a7e653eb260bf0d4103db38d" dependencies = [ "cc", "glob", @@ -856,9 +870,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "4.0.1" +version = "4.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a45bd2e4095a8b518033b128020dd4a55aab1c0a381ba4404a472630f4bc362" +checksum = "74fa05ad7d803d413eb8380983b092cbbaf9a85f151b871360e7b00cd7060b37" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -866,26 +880,26 @@ dependencies = [ [[package]] name = "bstr" -version = "1.10.0" +version = "1.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40723b8fb387abc38f4f4a37c09073622e41dd12327033091ef8950659e6dc0c" +checksum = "531a9155a481e2ee699d4f98f43c0ca4ff8ee1bfd55c31e9e98fb29d2b176fe0" dependencies = [ "memchr", - "regex-automata 0.4.8", + "regex-automata 0.4.9", "serde", ] [[package]] name = "bumpalo" -version = "3.16.0" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "byte-slice-cast" -version = "1.2.2" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" +checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" [[package]] name = "byteorder" @@ -895,9 +909,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.8.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" dependencies = [ "serde", ] @@ -919,9 +933,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.31" +version = "1.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" +checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c" dependencies = [ "jobserver", "libc", @@ -955,6 +969,19 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "chrono" +version = "0.4.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "num-traits", + "serde", + "windows-link", +] + [[package]] name = "clang-sys" version = "1.8.1" @@ -968,9 +995,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.20" +version = "4.5.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" +checksum = "6088f3ae8c3608d19260cd7445411865a485688711b78b5be70d78cd96136f83" dependencies = [ "clap_builder", "clap_derive", @@ -978,9 +1005,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.20" +version = "4.5.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" +checksum = "22a7ef7f676155edfb82daa97f99441f3ebf4a58d5e32f295a56259f1b6facc8" dependencies = [ "anstream", "anstyle", @@ -990,27 +1017,27 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.18" +version = "4.5.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" +checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] name = "clap_lex" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" [[package]] name = "cmake" -version = "0.1.51" +version = "0.1.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb1e43aa7fd152b1f968787f7dbcdeb306d1867ff373c69955211876c053f91a" +checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" dependencies = [ "cc", ] @@ -1050,6 +1077,26 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +[[package]] +name = "const_format" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -1060,6 +1107,16 @@ dependencies = [ "libc", ] +[[package]] +name = "core-foundation" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -1068,13 +1125,28 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.14" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] +[[package]] +name = "crc" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + [[package]] name = "crc32fast" version = "1.4.2" @@ -1095,15 +1167,15 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.20" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" [[package]] name = "crypto-bigint" @@ -1129,18 +1201,19 @@ dependencies = [ [[package]] name = "ctor" -version = "0.3.6" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21d960ecacd0a1bf55e73144b72de745e7bf275c7952c50e36e8af0a0cb7ab1f" +checksum = "07e9666f4a9a948d4f1dff0c08a4512b0f7c86414b23960104c243c10d79f4c3" dependencies = [ "ctor-proc-macro", + "dtor", ] [[package]] name = "ctor-proc-macro" -version = "0.0.4" +version = "0.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c426d2ba3e525b39c1f0a9ba41b9fe61878dee11fa4e4a76b6ab440f46c5db5d" +checksum = "4f211af61d8efdd104f96e57adf5e426ba1bc3ed7a4ead616e15e5881fd79c4d" [[package]] name = "darling" @@ -1163,7 +1236,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] @@ -1174,7 +1247,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] @@ -1194,6 +1267,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" dependencies = [ "powerfmt", + "serde", ] [[package]] @@ -1213,7 +1287,16 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" dependencies = [ - "derive_more-impl", + "derive_more-impl 1.0.0", +] + +[[package]] +name = "derive_more" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +dependencies = [ + "derive_more-impl 2.0.1", ] [[package]] @@ -1224,7 +1307,19 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", + "unicode-xid", +] + +[[package]] +name = "derive_more-impl" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", "unicode-xid", ] @@ -1255,6 +1350,17 @@ dependencies = [ "subtle", ] +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + [[package]] name = "doc-comment" version = "0.3.3" @@ -1267,6 +1373,21 @@ version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" +[[package]] +name = "dtor" +version = "0.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "222ef136a1c687d4aa0395c175f2c4586e379924c352fd02f7870cf7de783c23" +dependencies = [ + "dtor-proc-macro", +] + +[[package]] +name = "dtor-proc-macro" +version = "0.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7454e41ff9012c00d53cf7f475c5e3afa3b91b7c90568495495e8d9bf47a1055" + [[package]] name = "dunce" version = "1.0.5" @@ -1283,15 +1404,19 @@ dependencies = [ "digest 0.10.7", "elliptic-curve", "rfc6979", + "serdect", "signature", "spki", ] [[package]] name = "either" -version = "1.13.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +dependencies = [ + "serde", +] [[package]] name = "elliptic-curve" @@ -1308,6 +1433,7 @@ dependencies = [ "pkcs8", "rand_core", "sec1", + "serdect", "subtle", "zeroize", ] @@ -1329,18 +1455,18 @@ checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d" [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1358,12 +1484,11 @@ dependencies = [ [[package]] name = "ethereum_ssz" -version = "0.8.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfbba28f4f3f32d92c06a64f5bf6c4537b5d4e21f28c689bd2bbaecfea4e0d3e" +checksum = "86da3096d1304f5f28476ce383005385459afeaf0eea08592b65ddbc9b258d16" dependencies = [ "alloy-primitives", - "derivative", "ethereum_serde_utils", "itertools 0.13.0", "serde", @@ -1374,14 +1499,14 @@ dependencies = [ [[package]] name = "ethereum_ssz_derive" -version = "0.8.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d37845ba7c16bf4be8be4b5786f03a2ba5f2fda0d7f9e7cb2282f69cff420d7" +checksum = "d832a5c38eba0e7ad92592f7a22d693954637fbb332b4f669590d66a5c3183e5" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] @@ -1396,9 +1521,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.1.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "fastrlp" @@ -1411,11 +1536,22 @@ dependencies = [ "bytes", ] +[[package]] +name = "fastrlp" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + [[package]] name = "ff" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" dependencies = [ "rand_core", "subtle", @@ -1445,9 +1581,9 @@ dependencies = [ [[package]] name = "float-cmp" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" +checksum = "b09cf3155332e944990140d967ff5eceb70df778b34f77d8075db46e4704e6d8" dependencies = [ "num-traits", ] @@ -1460,9 +1596,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "foldhash" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2" +checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" [[package]] name = "foreign-types" @@ -1556,7 +1692,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] @@ -1632,7 +1768,7 @@ dependencies = [ "cfg-if 1.0.0", "libc", "wasi 0.13.3+wasi-0.2.2", - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -1643,9 +1779,9 @@ checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "glob" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" [[package]] name = "gloo-net" @@ -1657,12 +1793,12 @@ dependencies = [ "futures-core", "futures-sink", "gloo-utils", - "http 1.1.0", + "http", "js-sys", "pin-project", "serde", "serde_json", - "thiserror 1.0.65", + "thiserror 1.0.69", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -1706,17 +1842,17 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.6" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" +checksum = "5017294ff4bb30944501348f6f8e42e6ad28f42c8bbef7a74029aff064a4e3c2" dependencies = [ "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "http 1.1.0", - "indexmap 2.6.0", + "http", + "indexmap 2.8.0", "slab", "tokio", "tokio-util", @@ -1740,9 +1876,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.0" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" dependencies = [ "foldhash", "serde", @@ -1769,12 +1905,6 @@ dependencies = [ "serde", ] -[[package]] -name = "hex-literal" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" - [[package]] name = "hmac" version = "0.12.1" @@ -1786,46 +1916,24 @@ dependencies = [ [[package]] name = "home" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "http" -version = "0.2.12" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" dependencies = [ - "bytes", - "fnv", - "itoa", + "windows-sys 0.59.0", ] [[package]] name = "http" -version = "1.1.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" dependencies = [ "bytes", "fnv", "itoa", ] -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http 0.2.12", - "pin-project-lite", -] - [[package]] name = "http-body" version = "1.0.1" @@ -1833,19 +1941,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.1.0", + "http", ] [[package]] name = "http-body-util" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", - "futures-util", - "http 1.1.0", - "http-body 1.0.1", + "futures-core", + "http", + "http-body", "pin-project-lite", ] @@ -1857,9 +1965,9 @@ checksum = "9171a2ea8a68358193d15dd5d70c1c10a2afc3e7e4c5bc92bc9f025cebd7359c" [[package]] name = "httparse" -version = "1.9.5" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "httpdate" @@ -1869,16 +1977,16 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" dependencies = [ "bytes", "futures-channel", "futures-util", "h2", - "http 1.1.0", - "http-body 1.0.1", + "http", + "http-body", "httparse", "httpdate", "itoa", @@ -1890,17 +1998,17 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.3" +version = "0.27.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" +checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" dependencies = [ "futures-util", - "http 1.1.0", + "http", "hyper", "hyper-util", "log", "rustls", - "rustls-native-certs 0.8.0", + "rustls-native-certs 0.8.1", "rustls-pki-types", "tokio", "tokio-rustls", @@ -1909,9 +2017,9 @@ dependencies = [ [[package]] name = "hyper-timeout" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3203a961e5c83b6f5498933e78b6b263e208c197b63e9c6c53cc82ffd3f63793" +checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" dependencies = [ "hyper", "hyper-util", @@ -1945,8 +2053,8 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.1.0", - "http-body 1.0.1", + "http", + "http-body", "hyper", "pin-project-lite", "socket2", @@ -1956,73 +2064,226 @@ dependencies = [ ] [[package]] -name = "ident_case" -version = "1.0.1" +name = "iana-time-zone" +version = "0.1.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core 0.52.0", +] [[package]] -name = "idna" -version = "0.5.0" +name = "iana-time-zone-haiku" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "cc", ] [[package]] -name = "impl-codec" -version = "0.6.0" +name = "icu_collections" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" dependencies = [ - "parity-scale-codec", + "displaydoc", + "yoke", + "zerofrom", + "zerovec", ] [[package]] -name = "impl-trait-for-tuples" -version = "0.2.2" +name = "icu_locid" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", ] [[package]] -name = "indenter" -version = "0.3.3" +name = "icu_locid_transform" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] [[package]] -name = "indexmap" -version = "1.9.3" +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "impl-codec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "impl-trait-for-tuples" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + +[[package]] +name = "indexmap" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", "hashbrown 0.12.3", + "serde", ] [[package]] name = "indexmap" -version = "2.6.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058" dependencies = [ "equivalent", - "hashbrown 0.15.0", + "hashbrown 0.15.2", "serde", ] [[package]] name = "ipnet" -version = "2.10.1" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "iri-string" @@ -2067,11 +2328,20 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jni" @@ -2083,7 +2353,7 @@ dependencies = [ "combine", "jni-sys", "log", - "thiserror 1.0.65", + "thiserror 1.0.69", "walkdir", ] @@ -2104,18 +2374,19 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.72" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ + "once_cell", "wasm-bindgen", ] [[package]] name = "jsonrpsee" -version = "0.24.7" +version = "0.24.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5c71d8c1a731cc4227c2f698d377e7848ca12c8a48866fc5e6951c43a4db843" +checksum = "834af00800e962dee8f7bfc0f60601de215e73e78e5497d733a2919da837d3c8" dependencies = [ "jsonrpsee-client-transport", "jsonrpsee-core", @@ -2131,22 +2402,22 @@ dependencies = [ [[package]] name = "jsonrpsee-client-transport" -version = "0.24.7" +version = "0.24.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "548125b159ba1314104f5bb5f38519e03a41862786aa3925cf349aae9cdd546e" +checksum = "def0fd41e2f53118bd1620478d12305b2c75feef57ea1f93ef70568c98081b7e" dependencies = [ - "base64 0.22.1", + "base64", "futures-channel", "futures-util", "gloo-net", - "http 1.1.0", + "http", "jsonrpsee-core", "pin-project", "rustls", "rustls-pki-types", "rustls-platform-verifier", "soketto", - "thiserror 1.0.65", + "thiserror 1.0.69", "tokio", "tokio-rustls", "tokio-util", @@ -2156,25 +2427,25 @@ dependencies = [ [[package]] name = "jsonrpsee-core" -version = "0.24.7" +version = "0.24.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2882f6f8acb9fdaec7cefc4fd607119a9bd709831df7d7672a1d3b644628280" +checksum = "76637f6294b04e747d68e69336ef839a3493ca62b35bf488ead525f7da75c5bb" dependencies = [ "async-trait", "bytes", "futures-timer", "futures-util", - "http 1.1.0", - "http-body 1.0.1", + "http", + "http-body", "http-body-util", "jsonrpsee-types", "parking_lot", "pin-project", "rand", - "rustc-hash 2.0.0", + "rustc-hash 2.1.1", "serde", "serde_json", - "thiserror 1.0.65", + "thiserror 1.0.69", "tokio", "tokio-stream", "tracing", @@ -2183,13 +2454,13 @@ dependencies = [ [[package]] name = "jsonrpsee-http-client" -version = "0.24.7" +version = "0.24.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3638bc4617f96675973253b3a45006933bde93c2fd8a6170b33c777cc389e5b" +checksum = "87c24e981ad17798bbca852b0738bfb7b94816ed687bd0d5da60bfa35fa0fdc3" dependencies = [ "async-trait", - "base64 0.22.1", - "http-body 1.0.1", + "base64", + "http-body", "hyper", "hyper-rustls", "hyper-util", @@ -2199,7 +2470,7 @@ dependencies = [ "rustls-platform-verifier", "serde", "serde_json", - "thiserror 1.0.65", + "thiserror 1.0.69", "tokio", "tower 0.4.13", "tracing", @@ -2208,26 +2479,26 @@ dependencies = [ [[package]] name = "jsonrpsee-proc-macros" -version = "0.24.7" +version = "0.24.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06c01ae0007548e73412c08e2285ffe5d723195bf268bce67b1b77c3bb2a14d" +checksum = "6fcae0c6c159e11541080f1f829873d8f374f81eda0abc67695a13fc8dc1a580" dependencies = [ "heck", "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] name = "jsonrpsee-server" -version = "0.24.7" +version = "0.24.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82ad8ddc14be1d4290cd68046e7d1d37acd408efed6d3ca08aefcc3ad6da069c" +checksum = "66b7a3df90a1a60c3ed68e7ca63916b53e9afa928e33531e87f61a9c8e9ae87b" dependencies = [ "futures-util", - "http 1.1.0", - "http-body 1.0.1", + "http", + "http-body", "http-body-util", "hyper", "hyper-util", @@ -2238,7 +2509,7 @@ dependencies = [ "serde", "serde_json", "soketto", - "thiserror 1.0.65", + "thiserror 1.0.69", "tokio", "tokio-stream", "tokio-util", @@ -2248,21 +2519,21 @@ dependencies = [ [[package]] name = "jsonrpsee-types" -version = "0.24.7" +version = "0.24.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a178c60086f24cc35bb82f57c651d0d25d99c4742b4d335de04e97fa1f08a8a1" +checksum = "ddb81adb1a5ae9182df379e374a79e24e992334e7346af4d065ae5b2acb8d4c6" dependencies = [ - "http 1.1.0", + "http", "serde", "serde_json", - "thiserror 1.0.65", + "thiserror 1.0.69", ] [[package]] name = "jsonrpsee-wasm-client" -version = "0.24.7" +version = "0.24.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a01cd500915d24ab28ca17527e23901ef1be6d659a2322451e1045532516c25" +checksum = "42e41af42ca39657313748174d02766e5287d3a57356f16756dbd8065b933977" dependencies = [ "jsonrpsee-client-transport", "jsonrpsee-core", @@ -2271,11 +2542,11 @@ dependencies = [ [[package]] name = "jsonrpsee-ws-client" -version = "0.24.7" +version = "0.24.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fe322e0896d0955a3ebdd5bf813571c53fea29edd713bc315b76620b327e86d" +checksum = "6f4f3642a292f5b76d8a16af5c88c16a0860f2ccc778104e5c848b28183d9538" dependencies = [ - "http 1.1.0", + "http", "jsonrpsee-client-transport", "jsonrpsee-core", "jsonrpsee-types", @@ -2284,11 +2555,11 @@ dependencies = [ [[package]] name = "jsonwebtoken" -version = "9.3.0" +version = "9.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ae10193d25051e74945f1ea2d0b42e03cc3b890f7e4cc5faa44997d808193f" +checksum = "5a87cc7a48537badeae96744432de36f4be2b4a34a05a5ef32e9dd8a1c169dde" dependencies = [ - "base64 0.21.7", + "base64", "js-sys", "pem", "ring", @@ -2307,6 +2578,7 @@ dependencies = [ "ecdsa", "elliptic-curve", "once_cell", + "serdect", "sha2", ] @@ -2343,18 +2615,18 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.161" +version = "0.2.171" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" +checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" [[package]] name = "libloading" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" +checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if 1.0.0", - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -2376,9 +2648,21 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.4.14" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "linux-raw-sys" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db9c683daf087dc577b7506e9695b3d556a9f3849903fa28186283afd6809e9" + +[[package]] +name = "litemap" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" [[package]] name = "lock_api" @@ -2392,9 +2676,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.22" +version = "0.4.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" [[package]] name = "lru" @@ -2437,9 +2721,9 @@ checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "metrics" -version = "0.24.0" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae428771d17306715c5091d446327d1cfdedc82185c65ba8423ab404e45bf10" +checksum = "7a7deb012b3b2767169ff203fadb4c6b0b82b947512e5eb9e0b78c2e186ad9e3" dependencies = [ "ahash", "portable-atomic", @@ -2454,35 +2738,35 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] name = "metrics-exporter-prometheus" -version = "0.16.0" +version = "0.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b6f8152da6d7892ff1b7a1c0fa3f435e92b5918ad67035c3bb432111d9a29b" +checksum = "dd7399781913e5393588a8d8c6a2867bf85fb38eaf2502fdce465aad2dc6f034" dependencies = [ - "base64 0.22.1", + "base64", "http-body-util", "hyper", "hyper-rustls", "hyper-util", - "indexmap 2.6.0", + "indexmap 2.8.0", "ipnet", "metrics", "metrics-util", "quanta", - "thiserror 1.0.65", + "thiserror 1.0.69", "tokio", "tracing", ] [[package]] name = "metrics-process" -version = "2.3.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57ca8ecd85575fbb143b2678cb123bb818779391ec0f745b1c4a9dbabadde407" +checksum = "4a82c8add4382f29a122fa64fff1891453ed0f6b2867d971e7d60cb8dfa322ff" dependencies = [ "libc", "libproc", @@ -2496,19 +2780,21 @@ dependencies = [ [[package]] name = "metrics-util" -version = "0.18.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15b482df36c13dd1869d73d14d28cd4855fbd6cfc32294bee109908a9f4a4ed7" +checksum = "dbd4884b1dd24f7d6628274a2f5ae22465c337c5ba065ec9b6edccddf8acc673" dependencies = [ "aho-corasick", "crossbeam-epoch", "crossbeam-utils", - "hashbrown 0.15.0", - "indexmap 2.6.0", + "hashbrown 0.15.2", + "indexmap 2.8.0", "metrics", "ordered-float", "quanta", "radix_trie", + "rand", + "rand_xoshiro", "sketches-ddsketch", ] @@ -2545,11 +2831,10 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ - "hermit-abi", "libc", "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", @@ -2557,9 +2842,9 @@ dependencies = [ [[package]] name = "native-tls" -version = "0.2.12" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" dependencies = [ "libc", "log", @@ -2567,7 +2852,7 @@ dependencies = [ "openssl-probe", "openssl-sys", "schannel", - "security-framework", + "security-framework 2.11.1", "security-framework-sys", "tempfile", ] @@ -2667,90 +2952,53 @@ dependencies = [ [[package]] name = "nybbles" -version = "0.2.1" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95f06be0417d97f81fe4e5c86d7d01b392655a9cac9c19a848aa033e18937b23" +checksum = "8983bb634df7248924ee0c4c3a749609b5abcb082c28fffe3254b3eb3602b307" dependencies = [ + "alloy-rlp", "const-hex", + "proptest", "serde", "smallvec", ] [[package]] name = "object" -version = "0.36.5" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.20.2" +version = "1.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +checksum = "cde51589ab56b20a6f686b2c68f7a0bd6add753d697abf720d63f8db3ab7b1ad" [[package]] name = "op-alloy-consensus" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78f0daa0d0936d436a21b57571b1e27c5663aa2ab62f6edae5ba5be999f9f93e" -dependencies = [ - "alloy-consensus", - "alloy-eips 0.7.3", - "alloy-primitives", - "alloy-rlp", - "alloy-serde 0.7.3", - "derive_more", - "serde", - "thiserror 2.0.4", -] - -[[package]] -name = "op-alloy-genesis" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eb0964932faa7050b74689f017aca66ffa3e52501080278a81bb0a43836c8dd" -dependencies = [ - "alloy-consensus", - "alloy-eips 0.7.3", - "alloy-primitives", - "alloy-sol-types", - "serde", - "serde_repr", - "thiserror 2.0.4", -] - -[[package]] -name = "op-alloy-protocol" -version = "0.7.3" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d8c057c1a5bdf72d1f86c470a4d90f2d2ad1b273caa547c04cd6affe45b466d" +checksum = "5e5099f9c3a41a313dd5f7fe7657545d972781e53d70c62976858aba8dac9eef" dependencies = [ - "alloc-no-stdlib", "alloy-consensus", - "alloy-eips 0.7.3", + "alloy-eips", "alloy-primitives", "alloy-rlp", - "alloy-serde 0.7.3", - "async-trait", - "brotli", - "cfg-if 1.0.0", - "miniz_oxide", - "op-alloy-consensus", - "op-alloy-genesis", + "alloy-serde", + "derive_more 1.0.0", "serde", - "thiserror 2.0.4", - "tracing", - "unsigned-varint", + "thiserror 2.0.12", ] [[package]] name = "op-alloy-rpc-jsonrpsee" -version = "0.9.6" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6446c38f9e3e86acac6f2972a4953ffdd8bfef032bec633b0280a95783c0babd" +checksum = "20ad24013146aecff6fb5cc5f3ed2273830b79a1b12c1bad0bdd76e2f5fe43c6" dependencies = [ "alloy-primitives", "jsonrpsee", @@ -2758,17 +3006,17 @@ dependencies = [ [[package]] name = "op-alloy-rpc-types" -version = "0.7.3" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73741855ffaa2041b33cb616d7db7180c1149b648c68c23bee9e15501073fb32" +checksum = "b01f7baa1b04d0bf3816868dd5f4f3e411971a1c95b4a656d3c5c583bdb75ea5" dependencies = [ "alloy-consensus", - "alloy-eips 0.7.3", + "alloy-eips", "alloy-network-primitives", "alloy-primitives", "alloy-rpc-types-eth", - "alloy-serde 0.7.3", - "derive_more", + "alloy-serde", + "derive_more 1.0.0", "op-alloy-consensus", "serde", "serde_json", @@ -2776,31 +3024,30 @@ dependencies = [ [[package]] name = "op-alloy-rpc-types-engine" -version = "0.7.3" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebedc32e24013c8b3faea62d091bccbb90f871286fe2238c6f7e2ff29974df8e" +checksum = "e829ee4a0f373132258ccdce71ed1984cdbf7df83ab928522997ee79943879c2" dependencies = [ - "alloy-eips 0.7.3", + "alloy-consensus", + "alloy-eips", "alloy-primitives", "alloy-rpc-types-engine", - "alloy-serde 0.7.3", - "derive_more", + "alloy-serde", + "derive_more 1.0.0", "ethereum_ssz", "op-alloy-consensus", - "op-alloy-genesis", - "op-alloy-protocol", "serde", "snap", - "thiserror 2.0.4", + "thiserror 2.0.12", ] [[package]] name = "openssl" -version = "0.10.68" +version = "0.10.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" +checksum = "5e14130c6a98cd258fdcb0fb6d744152343ff729cbfcb28c656a9d12b999fbcd" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.0", "cfg-if 1.0.0", "foreign-types", "libc", @@ -2817,20 +3064,20 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] name = "openssl-probe" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.104" +version = "0.9.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" +checksum = "8bb61ea9811cc39e3c2069f40b8b8e2e70d8569b361f879786cc7ed48b777cdd" dependencies = [ "cc", "libc", @@ -2840,40 +3087,41 @@ dependencies = [ [[package]] name = "opentelemetry" -version = "0.26.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "570074cc999d1a58184080966e5bd3bf3a9a4af650c3b05047c2621e7405cd17" +checksum = "236e667b670a5cdf90c258f5a55794ec5ac5027e960c224bff8367a59e1e6426" dependencies = [ "futures-core", "futures-sink", "js-sys", - "once_cell", "pin-project-lite", - "thiserror 1.0.65", + "thiserror 2.0.12", + "tracing", ] [[package]] name = "opentelemetry-http" -version = "0.26.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6351496aeaa49d7c267fb480678d85d1cd30c5edb20b497c48c56f62a8c14b99" +checksum = "a8863faf2910030d139fb48715ad5ff2f35029fc5f244f6d5f689ddcf4d26253" dependencies = [ "async-trait", "bytes", - "http 1.1.0", + "http", "opentelemetry", "reqwest", + "tracing", ] [[package]] name = "opentelemetry-otlp" -version = "0.26.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29e1f9c8b032d4f635c730c0efcf731d5e2530ea13fa8bef7939ddc8420696bd" +checksum = "5bef114c6d41bea83d6dc60eb41720eedd0261a67af57b66dd2b84ac46c01d91" dependencies = [ "async-trait", "futures-core", - "http 1.1.0", + "http", "opentelemetry", "opentelemetry-http", "opentelemetry-proto", @@ -2881,17 +3129,19 @@ dependencies = [ "prost", "reqwest", "serde_json", - "thiserror 1.0.65", + "thiserror 2.0.12", "tokio", "tonic", + "tracing", ] [[package]] name = "opentelemetry-proto" -version = "0.26.1" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9d3968ce3aefdcca5c27e3c4ea4391b37547726a70893aab52d3de95d5f8b34" +checksum = "56f8870d3024727e99212eb3bb1762ec16e255e3e6f58eeb3dc8db1aa226746d" dependencies = [ + "base64", "hex", "opentelemetry", "opentelemetry_sdk", @@ -2902,30 +3152,30 @@ dependencies = [ [[package]] name = "opentelemetry_sdk" -version = "0.26.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2c627d9f4c9cdc1f21a29ee4bfbd6028fcb8bcf2a857b43f3abdf72c9c862f3" +checksum = "84dfad6042089c7fc1f6118b7040dc2eb4ab520abbf410b79dc481032af39570" dependencies = [ "async-trait", "futures-channel", "futures-executor", "futures-util", "glob", - "once_cell", "opentelemetry", "percent-encoding", "rand", "serde_json", - "thiserror 1.0.65", + "thiserror 2.0.12", "tokio", "tokio-stream", + "tracing", ] [[package]] name = "ordered-float" -version = "4.4.0" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83e7ccb95e240b7c9506a3d544f10d935e142cc90b0a1d56954fb44d89ad6b97" +checksum = "7bb71e1b3fa6ca1c61f383464aaf2bb0e2f8e772a1f01d486832464de363b951" dependencies = [ "num-traits", ] @@ -2938,28 +3188,30 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "parity-scale-codec" -version = "3.6.12" +version = "3.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" +checksum = "c9fde3d0718baf5bc92f577d652001da0f8d54cd03a7974e118d04fc888dc23d" dependencies = [ "arrayvec", "bitvec", "byte-slice-cast", + "const_format", "impl-trait-for-tuples", "parity-scale-codec-derive", + "rustversion", "serde", ] [[package]] name = "parity-scale-codec-derive" -version = "3.6.12" +version = "3.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" +checksum = "581c837bb6b9541ce7faa9377c20616e4fb7650f6b0f68bc93c827ee504fb7b3" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.100", ] [[package]] @@ -2982,7 +3234,7 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -2993,11 +3245,11 @@ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pem" -version = "3.0.4" +version = "3.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" +checksum = "38af38e8470ac9dee3ce1bae1af9c1671fffc44ddfd8bd1d0a3445bf349a8ef3" dependencies = [ - "base64 0.22.1", + "base64", "serde", ] @@ -3009,40 +3261,40 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.14" +version = "2.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879952a81a83930934cbf1786752d6dedc3b1f29e8f8fb2ad1d0a36f377cf442" +checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc" dependencies = [ "memchr", - "thiserror 1.0.65", + "thiserror 2.0.12", "ucd-trie", ] [[package]] name = "pin-project" -version = "1.1.7" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.7" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] name = "pin-project-lite" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -3062,15 +3314,15 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "portable-atomic" -version = "1.9.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" +checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" [[package]] name = "powerfmt" @@ -3080,18 +3332,18 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "zerocopy", + "zerocopy 0.8.23", ] [[package]] name = "predicates" -version = "3.1.2" +version = "3.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e9086cc7640c29a356d1a29fd134380bee9d8f79a17410aa76e7ad295f42c97" +checksum = "a5d19ee57562043d37e82899fade9a22ebab7be9cef5026b07fda9cdd4293573" dependencies = [ "anstyle", "difflib", @@ -3103,15 +3355,15 @@ dependencies = [ [[package]] name = "predicates-core" -version = "1.0.8" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae8177bee8e75d6846599c6b9ff679ed51e882816914eec639944d7c9aa11931" +checksum = "727e462b119fe9c93fd0eb1429a5f7647394014cf3c04ab2c0350eeb09095ffa" [[package]] name = "predicates-tree" -version = "1.0.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41b740d195ed3166cd147c8047ec98db0e22ec019eb8eeb76d343b795304fb13" +checksum = "72dd2d6d381dfb73a193c7fca536518d7caee39fc8503f74e7dc0be0531b425c" dependencies = [ "predicates-core", "termtree", @@ -3119,12 +3371,12 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.25" +version = "0.2.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" +checksum = "f1ccf34da56fc294e7d4ccf69a85992b7dfb826b7cf57bac6a70bba3494cc08a" dependencies = [ "proc-macro2", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] @@ -3140,9 +3392,9 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "3.2.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" dependencies = [ "toml_edit", ] @@ -3166,14 +3418,14 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] name = "proc-macro2" -version = "1.0.92" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" dependencies = [ "unicode-ident", ] @@ -3184,10 +3436,10 @@ version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc5b72d8145275d844d4b5f6d4e1eef00c8cd889edb6035c21675d1bb1f45c9f" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.0", "hex", "procfs-core", - "rustix", + "rustix 0.38.44", ] [[package]] @@ -3196,19 +3448,19 @@ version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "239df02d8349b06fc07398a3a1697b06418223b1c7725085e801e7c0fc6a12ec" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.0", "hex", ] [[package]] name = "proptest" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c2511913b88df1637da85cc8d96ec8e43a3f8bb8ccb71ee1ac240d6f3df58d" +checksum = "14cae93065090804185d3b75f0bf93b8eeda30c7a9b4a33d3bdb3988d6229e50" dependencies = [ "bit-set", "bit-vec", - "bitflags 2.6.0", + "bitflags 2.9.0", "lazy_static", "num-traits", "rand", @@ -3222,9 +3474,9 @@ dependencies = [ [[package]] name = "prost" -version = "0.13.3" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b0487d90e047de87f984913713b85c601c05609aad5b0df4b4573fbf69aa13f" +checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" dependencies = [ "bytes", "prost-derive", @@ -3232,22 +3484,22 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.13.3" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9552f850d5f0964a4e4d0bf306459ac29323ddfbae05e35a7c0d35cb0803cc5" +checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" dependencies = [ "anyhow", - "itertools 0.13.0", + "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] name = "quanta" -version = "0.12.3" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5167a477619228a0b284fac2674e3c388cba90631d7b7de620e6f1fcd08da5" +checksum = "3bd1fe6824cea6538803de3ff1bc0cf3949024db3d43c9643024bfb33a807c0e" dependencies = [ "crossbeam-utils", "libc", @@ -3266,9 +3518,9 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quote" -version = "1.0.37" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] @@ -3329,22 +3581,31 @@ dependencies = [ "rand_core", ] +[[package]] +name = "rand_xoshiro" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa" +dependencies = [ + "rand_core", +] + [[package]] name = "raw-cpuid" -version = "11.2.0" +version = "11.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ab240315c661615f2ee9f0f2cd32d5a7343a84d5ebcccb99d46e6637565e7b0" +checksum = "c6df7ab838ed27997ba19a4664507e6f82b41fe6e20be42929332156e5e85146" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.0", ] [[package]] name = "redox_syscall" -version = "0.5.7" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.0", ] [[package]] @@ -3355,7 +3616,7 @@ checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.8", + "regex-automata 0.4.9", "regex-syntax 0.8.5", ] @@ -3370,9 +3631,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -3393,19 +3654,19 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.9" +version = "0.12.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" +checksum = "989e327e510263980e231de548a33e63d34962d29ae61b467389a1a09627a254" dependencies = [ - "base64 0.22.1", + "base64", "bytes", "encoding_rs", "futures-channel", "futures-core", "futures-util", "h2", - "http 1.1.0", - "http-body 1.0.1", + "http", + "http-body", "http-body-util", "hyper", "hyper-rustls", @@ -3423,10 +3684,11 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "sync_wrapper 1.0.1", + "sync_wrapper", "system-configuration", "tokio", "tokio-native-tls", + "tower 0.5.2", "tower-service", "url", "wasm-bindgen", @@ -3437,11 +3699,11 @@ dependencies = [ [[package]] name = "reth-rpc-layer" -version = "1.1.2" -source = "git+https://github.com/paradigmxyz/reth.git?rev=e022b6fd92a33cd44e3ae51ee2fc2ecc0f773222#e022b6fd92a33cd44e3ae51ee2fc2ecc0f773222" +version = "1.3.0" +source = "git+https://github.com/paradigmxyz/reth.git?rev=v1.3.0#aef442740c51fc00884d34931ebc3b547e41b9f4" dependencies = [ "alloy-rpc-types-engine", - "http 1.1.0", + "http", "jsonrpsee-http-client", "pin-project", "tower 0.4.13", @@ -3461,15 +3723,14 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.8" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if 1.0.0", "getrandom 0.2.15", "libc", - "spin", "untrusted", "windows-sys 0.52.0", ] @@ -3497,7 +3758,7 @@ dependencies = [ name = "rollup-boost" version = "0.1.0" dependencies = [ - "alloy-eips 0.9.2", + "alloy-eips", "alloy-primitives", "alloy-rpc-types-engine", "alloy-rpc-types-eth", @@ -3511,8 +3772,8 @@ dependencies = [ "flate2", "futures", "futures-util", - "http 1.1.0", - "http-body 0.4.6", + "http", + "http-body", "http-body-util", "hyper", "hyper-rustls", @@ -3540,7 +3801,7 @@ dependencies = [ "rustls", "serde", "serde_json", - "thiserror 1.0.65", + "thiserror 2.0.12", "time", "tokio", "tokio-util", @@ -3558,16 +3819,18 @@ checksum = "afab94fb28594581f62d981211a9a4d53cc8130bbcbbb89a0440d9b8e81a7746" [[package]] name = "ruint" -version = "1.12.3" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c3cc4c2511671f327125da14133d0c5c5d137f006a1017a16f557bc85b16286" +checksum = "825df406ec217a8116bd7b06897c6cc8f65ffefc15d030ae2c9540acc9ed50b6" dependencies = [ "alloy-rlp", "ark-ff 0.3.0", "ark-ff 0.4.2", "bytes", - "fastrlp", + "fastrlp 0.3.1", + "fastrlp 0.4.0", "num-bigint", + "num-integer", "num-traits", "parity-scale-codec", "primitive-types", @@ -3600,9 +3863,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustc-hash" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" dependencies = [ "rand", ] @@ -3628,20 +3891,33 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ - "semver 1.0.23", + "semver 1.0.26", ] [[package]] name = "rustix" -version = "0.38.38" +version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa260229e6538e52293eeb577aabd09945a09d6d9cc0fc550ed7529056c2e32a" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.0", "errno", "libc", - "linux-raw-sys", - "windows-sys 0.52.0", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustix" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7178faa4b75a30e269c71e61c353ce2748cf3d76f0c44c393f4e60abf49b825" +dependencies = [ + "bitflags 2.9.0", + "errno", + "libc", + "linux-raw-sys 0.9.2", + "windows-sys 0.59.0", ] [[package]] @@ -3670,20 +3946,19 @@ dependencies = [ "rustls-pemfile", "rustls-pki-types", "schannel", - "security-framework", + "security-framework 2.11.1", ] [[package]] name = "rustls-native-certs" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcaf18a4f2be7326cd874a5fa579fae794320a0f388d365dca7e480e55f83f8a" +checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" dependencies = [ "openssl-probe", - "rustls-pemfile", "rustls-pki-types", "schannel", - "security-framework", + "security-framework 3.2.0", ] [[package]] @@ -3697,9 +3972,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" +checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" [[package]] name = "rustls-platform-verifier" @@ -3707,7 +3982,7 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "afbb878bdfdf63a336a5e63561b1835e7a8c91524f51621db870169eac84b490" dependencies = [ - "core-foundation", + "core-foundation 0.9.4", "core-foundation-sys", "jni", "log", @@ -3716,7 +3991,7 @@ dependencies = [ "rustls-native-certs 0.7.3", "rustls-platform-verifier-android", "rustls-webpki", - "security-framework", + "security-framework 2.11.1", "security-framework-sys", "webpki-roots", "winapi", @@ -3742,9 +4017,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.18" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" [[package]] name = "rusty-fork" @@ -3760,9 +4035,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.18" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "same-file" @@ -3775,9 +4050,9 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" dependencies = [ "windows-sys 0.59.0", ] @@ -3798,6 +4073,7 @@ dependencies = [ "der", "generic-array", "pkcs8", + "serdect", "subtle", "zeroize", ] @@ -3808,19 +4084,32 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.6.0", - "core-foundation", + "bitflags 2.9.0", + "core-foundation 0.9.4", "core-foundation-sys", "libc", "num-bigint", "security-framework-sys", ] +[[package]] +name = "security-framework" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" +dependencies = [ + "bitflags 2.9.0", + "core-foundation 0.10.0", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + [[package]] name = "security-framework-sys" -version = "2.12.0" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" dependencies = [ "core-foundation-sys", "libc", @@ -3837,15 +4126,15 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.23" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" [[package]] name = "semver-parser" -version = "0.10.2" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" +checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" dependencies = [ "pest", ] @@ -3858,29 +4147,29 @@ checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" [[package]] name = "serde" -version = "1.0.214" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.214" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] name = "serde_json" -version = "1.0.132" +version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ "itoa", "memchr", @@ -3889,25 +4178,54 @@ dependencies = [ ] [[package]] -name = "serde_repr" -version = "0.1.19" +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" +checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" dependencies = [ + "base64", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.8.0", + "serde", + "serde_derive", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" +dependencies = [ + "darling", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] -name = "serde_urlencoded" -version = "0.7.1" +name = "serdect" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177" dependencies = [ - "form_urlencoded", - "itoa", - "ryu", + "base16ct", "serde", ] @@ -3989,13 +4307,13 @@ dependencies = [ [[package]] name = "simple_asn1" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" +checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" dependencies = [ "num-bigint", "num-traits", - "thiserror 1.0.65", + "thiserror 2.0.12", "time", ] @@ -4016,9 +4334,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.2" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" dependencies = [ "serde", ] @@ -4031,9 +4349,9 @@ checksum = "1b6b67fb9a61334225b5b790716f609cd58395f895b3fe8b328786812a40bc3b" [[package]] name = "socket2" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" dependencies = [ "libc", "windows-sys 0.52.0", @@ -4041,26 +4359,20 @@ dependencies = [ [[package]] name = "soketto" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37468c595637c10857701c990f93a40ce0e357cedb0953d1c26c8d8027f9bb53" +checksum = "2e859df029d160cb88608f5d7df7fb4753fd20fdfb4de5644f3d8b8440841721" dependencies = [ - "base64 0.22.1", + "base64", "bytes", "futures", - "http 1.1.0", + "http", "httparse", "log", "rand", "sha1", ] -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - [[package]] name = "spki" version = "0.7.3" @@ -4071,6 +4383,12 @@ dependencies = [ "der", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "static_assertions" version = "1.1.0" @@ -4085,24 +4403,24 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "strum" -version = "0.26.3" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" dependencies = [ "strum_macros", ] [[package]] name = "strum_macros" -version = "0.26.4" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" dependencies = [ "heck", "proc-macro2", "quote", "rustversion", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] @@ -4124,9 +4442,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.90" +version = "2.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" dependencies = [ "proc-macro2", "quote", @@ -4135,29 +4453,34 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "0.8.14" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0523f59468a2696391f2a772edc089342aacd53c3caa2ac3264e598edf119b" +checksum = "ac9f9798a84bca5cd4d1760db691075fda8f2c3a5d9647e8bfd29eb9b3fabb87" dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] name = "sync_wrapper" -version = "0.1.2" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] [[package]] -name = "sync_wrapper" -version = "1.0.1" +name = "synstructure" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ - "futures-core", + "proc-macro2", + "quote", + "syn 2.0.100", ] [[package]] @@ -4166,8 +4489,8 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.6.0", - "core-foundation", + "bitflags 2.9.0", + "core-foundation 0.9.4", "system-configuration-sys", ] @@ -4189,61 +4512,62 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.13.0" +version = "3.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" +checksum = "2c317e0a526ee6120d8dabad239c8dadca62b24b6f168914bbbc8e2fb1f0e567" dependencies = [ "cfg-if 1.0.0", "fastrand", + "getrandom 0.3.1", "once_cell", - "rustix", + "rustix 1.0.2", "windows-sys 0.59.0", ] [[package]] name = "termtree" -version = "0.4.1" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" +checksum = "8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683" [[package]] name = "thiserror" -version = "1.0.65" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl 1.0.65", + "thiserror-impl 1.0.69", ] [[package]] name = "thiserror" -version = "2.0.4" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f49a1853cf82743e3b7950f77e0f4d622ca36cf4317cba00c767838bac8d490" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" dependencies = [ - "thiserror-impl 2.0.4", + "thiserror-impl 2.0.12", ] [[package]] name = "thiserror-impl" -version = "1.0.65" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] name = "thiserror-impl" -version = "2.0.4" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8381894bb3efe0c4acac3ded651301ceee58a15d47c2e34885ed1908ad667061" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] @@ -4267,9 +4591,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.36" +version = "0.3.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +checksum = "dad298b01a40a23aac4580b67e3dbedb7cc8402f3592d7f49469de2ea4aecdd8" dependencies = [ "deranged", "itoa", @@ -4282,15 +4606,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" +checksum = "765c97a5b985b7c11d7bc27fa927dc4fe6af3a6dfb021d28deb60d3bf51e76ef" [[package]] name = "time-macros" -version = "0.2.18" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +checksum = "e8093bc3e81c3bc5f7879de09619d06c9a5a5e45ca44dfeeb7225bae38005c5c" dependencies = [ "num-conv", "time-core", @@ -4306,25 +4630,20 @@ dependencies = [ ] [[package]] -name = "tinyvec" -version = "1.8.0" +name = "tinystr" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" dependencies = [ - "tinyvec_macros", + "displaydoc", + "zerovec", ] -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - [[package]] name = "tokio" -version = "1.41.0" +version = "1.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb" +checksum = "9975ea0f48b5aa3972bf2d888c238182458437cc2a19374b81b25cdf1023fb3a" dependencies = [ "backtrace", "bytes", @@ -4340,13 +4659,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] @@ -4361,20 +4680,19 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.0" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ "rustls", - "rustls-pki-types", "tokio", ] [[package]] name = "tokio-stream" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" dependencies = [ "futures-core", "pin-project-lite", @@ -4404,11 +4722,11 @@ checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" [[package]] name = "toml_edit" -version = "0.22.22" +version = "0.22.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.8.0", "toml_datetime", "winnow", ] @@ -4422,11 +4740,11 @@ dependencies = [ "async-stream", "async-trait", "axum", - "base64 0.22.1", + "base64", "bytes", "h2", - "http 1.1.0", - "http-body 1.0.1", + "http", + "http-body", "http-body-util", "hyper", "hyper-timeout", @@ -4465,14 +4783,15 @@ dependencies = [ [[package]] name = "tower" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2873938d487c3cfb9aed7546dc9f2711d867c9f90c46b889989a2cb84eba6b4f" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" dependencies = [ "futures-core", "futures-util", "pin-project-lite", - "sync_wrapper 0.1.2", + "sync_wrapper", + "tokio", "tower-layer", "tower-service", ] @@ -4484,13 +4803,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "403fa3b783d4b626a8ad51d766ab03cb6d2dbfc46b1c5d4448395e6628dc9697" dependencies = [ "async-compression", - "base64 0.22.1", - "bitflags 2.6.0", + "base64", + "bitflags 2.9.0", "bytes", "futures-core", "futures-util", - "http 1.1.0", - "http-body 1.0.1", + "http", + "http-body", "http-body-util", "http-range-header", "httpdate", @@ -4501,7 +4820,7 @@ dependencies = [ "pin-project-lite", "tokio", "tokio-util", - "tower 0.5.1", + "tower 0.5.2", "tower-layer", "tower-service", "tracing", @@ -4522,9 +4841,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "log", "pin-project-lite", @@ -4534,20 +4853,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", "valuable", @@ -4566,9 +4885,9 @@ dependencies = [ [[package]] name = "tracing-opentelemetry" -version = "0.27.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc58af5d3f6c5811462cabb3289aec0093f7338e367e5a33d28c0433b3c7360b" +checksum = "721f2d2569dce9f3dfbbddee5906941e953bfcdf736a62da3377f5751650cc36" dependencies = [ "js-sys", "once_cell", @@ -4584,9 +4903,9 @@ dependencies = [ [[package]] name = "tracing-serde" -version = "0.1.3" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1" +checksum = "704b1aeb7be0d0a84fc9828cae51dab5970fee5088f83d1dd7ee6f6246fc6ff1" dependencies = [ "serde", "tracing-core", @@ -4594,9 +4913,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.18" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" dependencies = [ "matchers", "nu-ansi-term", @@ -4621,9 +4940,9 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "typenum" -version = "1.17.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" [[package]] name = "ucd-trie" @@ -4655,26 +4974,11 @@ version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" -[[package]] -name = "unicode-bidi" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" - [[package]] name = "unicode-ident" -version = "1.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" - -[[package]] -name = "unicode-normalization" -version = "0.1.24" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" -dependencies = [ - "tinyvec", -] +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "unicode-xid" @@ -4682,12 +4986,6 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" -[[package]] -name = "unsigned-varint" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb066959b24b5196ae73cb057f45598450d2c5f71460e98c49b738086eff9c06" - [[package]] name = "untrusted" version = "0.9.0" @@ -4696,15 +4994,27 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.2" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", "idna", "percent-encoding", ] +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" version = "0.2.2" @@ -4713,18 +5023,18 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.13.2" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c1f41ffb7cf259f1ecc2876861a17e7142e63ead296f671f81f6ae85903e0d6" +checksum = "e0f540e3240398cce6128b64ba83fdbdd86129c16a3aa1a3a252efd66eb3d587" dependencies = [ "getrandom 0.3.1", ] [[package]] name = "valuable" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" [[package]] name = "vcpkg" @@ -4746,9 +5056,9 @@ checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" [[package]] name = "wait-timeout" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" +checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" dependencies = [ "libc", ] @@ -4789,47 +5099,48 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if 1.0.0", "once_cell", + "rustversion", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.45" +version = "0.4.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" dependencies = [ "cfg-if 1.0.0", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4837,28 +5148,31 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] [[package]] name = "web-sys" -version = "0.3.72" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" dependencies = [ "js-sys", "wasm-bindgen", @@ -4876,9 +5190,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.26.6" +version = "0.26.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958" +checksum = "2210b291f7ea53617fbafcc4939f10914214ec15aace5ba62293a668f322c5c9" dependencies = [ "rustls-pki-types", ] @@ -4892,7 +5206,7 @@ dependencies = [ "either", "home", "once_cell", - "rustix", + "rustix 0.38.44", ] [[package]] @@ -4932,8 +5246,17 @@ version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" dependencies = [ - "windows-core", - "windows-targets", + "windows-core 0.58.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.6", ] [[package]] @@ -4944,9 +5267,9 @@ checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" dependencies = [ "windows-implement", "windows-interface", - "windows-result", - "windows-strings", - "windows-targets", + "windows-result 0.2.0", + "windows-strings 0.1.0", + "windows-targets 0.52.6", ] [[package]] @@ -4957,7 +5280,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] @@ -4968,18 +5291,24 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", ] +[[package]] +name = "windows-link" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dccfd733ce2b1753b03b6d3c65edf020262ea35e20ccdf3e288043e6dd620e3" + [[package]] name = "windows-registry" -version = "0.2.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" dependencies = [ - "windows-result", - "windows-strings", - "windows-targets", + "windows-result 0.3.1", + "windows-strings 0.3.1", + "windows-targets 0.53.0", ] [[package]] @@ -4988,7 +5317,16 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" dependencies = [ - "windows-targets", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06374efe858fab7e4f881500e6e86ec8bc28f9462c47e5a9941a0142ad86b189" +dependencies = [ + "windows-link", ] [[package]] @@ -4997,8 +5335,17 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" dependencies = [ - "windows-result", - "windows-targets", + "windows-result 0.2.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" +dependencies = [ + "windows-link", ] [[package]] @@ -5007,7 +5354,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -5016,7 +5363,7 @@ version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -5025,14 +5372,30 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" +dependencies = [ + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", ] [[package]] @@ -5041,53 +5404,101 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + [[package]] name = "windows_i686_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + [[package]] name = "winnow" -version = "0.6.20" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +checksum = "0e97b544156e9bebe1a0ffbc03484fc1ffe3100cbce3ffb17eac35f7cdd7ab36" dependencies = [ "memchr", ] @@ -5098,9 +5509,21 @@ version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.0", ] +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + [[package]] name = "wyz" version = "0.5.1" @@ -5110,14 +5533,46 @@ dependencies = [ "tap", ] +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", + "synstructure", +] + [[package]] name = "zerocopy" version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ - "byteorder", - "zerocopy-derive", + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd97444d05a4328b90e75e503a34bad781f14e28a823ad3557f0750df1ebcbc6" +dependencies = [ + "zerocopy-derive 0.8.23", ] [[package]] @@ -5128,7 +5583,39 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6352c01d0edd5db859a63e2605f4ea3183ddbd15e2c4a9e7d32184df75e4f154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", + "synstructure", ] [[package]] @@ -5148,32 +5635,54 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", +] + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", ] [[package]] name = "zstd" -version = "0.13.2" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" -version = "7.2.1" +version = "7.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059" +checksum = "f3051792fbdc2e1e143244dc28c60f73d8470e93f3f9cbd0ead44da5ed802722" dependencies = [ "zstd-sys", ] [[package]] name = "zstd-sys" -version = "2.0.13+zstd.1.5.6" +version = "2.0.14+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" +checksum = "8fb060d4926e4ac3a3ad15d864e99ceb5f343c6b34f5bd6d81ae6ed417311be5" dependencies = [ "cc", "pkg-config", diff --git a/Cargo.toml b/Cargo.toml index 7b74ea9c..4ca80c6e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,18 +4,18 @@ version = "0.1.0" edition = "2021" [dependencies] -op-alloy-rpc-types-engine = "0.7.3" -op-alloy-rpc-types = "0.7.3" -op-alloy-rpc-jsonrpsee = { version = "0.9.6", features = ["client"] } -alloy-rpc-types-engine = "0.7.3" -alloy-rpc-types-eth = "0.7.3" +op-alloy-rpc-types-engine = "0.11.1" +op-alloy-rpc-types = "0.11.1" +op-alloy-rpc-jsonrpsee = { version = "0.11.1", features = ["client"] } +alloy-rpc-types-engine = "0.12.5" +alloy-rpc-types-eth = "0.12.5" alloy-primitives = { version = "0.8.10", features = ["rand"] } -alloy-eips = { version = "0.9.2", features = ["serde"] } +alloy-eips = { version = "0.12.5", features = ["serde"] } tokio = { version = "1", features = ["full"] } tracing = "0.1.4" tracing-subscriber = { version = "0.3.11", features = ["env-filter", "json"] } serde = { version = "1", features = ["derive"] } -thiserror = "1.0" +thiserror = "2.0.12" clap = { version = "4", features = ["derive", "env"] } jsonrpsee = { version = "0.24", features = ["server", "http-client", "macros"] } lru = "0.10.0" @@ -23,30 +23,31 @@ reqwest = "0.12.5" http = "1.1.0" dotenv = "0.15.0" tower = "0.4.13" -http-body = "0.4.5" +http-body = "1.0.1" http-body-util = "0.1.2" hyper = { version = "1.4.1", features = ["full"] } hyper-util = { version = "0.1", features = ["full"] } hyper-rustls = { version = "0.27.0", features = ["ring"] } -rustls = {version = "0.23.23", features = ["ring"] } +rustls = { version = "0.23.23", features = ["ring"] } serde_json = "1.0.96" -opentelemetry = { version = "0.26.0", features = ["trace"] } -opentelemetry-http = "0.26.0" -opentelemetry-otlp = { version = "0.26.0", features = [ +opentelemetry = { version = "0.28.0", features = ["trace"] } +opentelemetry-http = "0.28.0" +opentelemetry-otlp = { version = "0.28.0", features = [ "http-proto", "http-json", "reqwest-client", "trace", + "grpc-tonic", ] } -opentelemetry_sdk = { version = "0.26.0", features = ["rt-tokio"] } -tracing-opentelemetry = "0.27.0" +opentelemetry_sdk = { version = "0.28.0", features = ["rt-tokio"] } +tracing-opentelemetry = "0.29.0" flate2 = "1.0.35" futures = "0.3.31" metrics-derive = "0.1" metrics = "0.24.0" metrics-exporter-prometheus = "0.16.0" metrics-process = "2.3.1" -metrics-util = "0.18.0" +metrics-util = "0.19.0" eyre = "0.6.12" paste = "1.0.15" @@ -62,8 +63,8 @@ predicates = "3.1.2" tokio-util = { version = "0.7.13" } nix = "0.15.0" bytes = "1.2" -reth-rpc-layer = { git = "https://github.com/paradigmxyz/reth.git", rev = "e022b6fd92a33cd44e3ae51ee2fc2ecc0f773222" } -ctor = "0.3.5" +reth-rpc-layer = { git = "https://github.com/paradigmxyz/reth.git", rev = "v1.3.0" } +ctor = "0.4.1" [features] integration = [] diff --git a/src/debug_api.rs b/src/debug_api.rs index 746a4206..0232a788 100644 --- a/src/debug_api.rs +++ b/src/debug_api.rs @@ -121,7 +121,7 @@ mod tests { let execution_mode = Arc::new(Mutex::new(ExecutionMode::Enabled)); let server = DebugServer::new(execution_mode.clone()); - let _ = server.run(DEFAULT_ADDR).await.unwrap(); + server.run(DEFAULT_ADDR).await.unwrap(); let client = DebugClient::new(format!("http://{}", DEFAULT_ADDR).as_str()).unwrap(); diff --git a/src/main.rs b/src/main.rs index eab5aa21..8fc21e49 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,9 +1,11 @@ +#![allow(clippy::complexity)] +use ::tracing::{error, info, Level}; use clap::{arg, Parser, Subcommand}; use client::{BuilderArgs, ExecutionClient, L2ClientArgs}; use debug_api::DebugClient; use metrics::{ClientMetrics, ServerMetrics}; -use server::ExecutionMode; use std::{net::SocketAddr, sync::Arc}; +use tracing::init_tracing; use alloy_rpc_types_engine::JwtSecret; use dotenv::dotenv; @@ -17,16 +19,11 @@ use jsonrpsee::server::Server; use jsonrpsee::RpcModule; use metrics_exporter_prometheus::{PrometheusBuilder, PrometheusHandle}; use metrics_util::layers::{PrefixLayer, Stack}; -use opentelemetry::global; -use opentelemetry_otlp::WithExportConfig; -use opentelemetry_sdk::{propagation::TraceContextPropagator, trace::Config, Resource}; use proxy::ProxyLayer; -use server::{PayloadSource, RollupBoostServer}; +use server::{ExecutionMode, PayloadSource, RollupBoostServer}; use tokio::net::TcpListener; use tokio::signal::unix::{signal as unix_signal, SignalKind}; -use tracing::{error, info, Level}; -use tracing_subscriber::EnvFilter; mod auth_layer; mod client; @@ -36,6 +33,7 @@ mod integration; mod metrics; mod proxy; mod server; +mod tracing; #[derive(Parser, Debug)] #[clap(author, version, about)] @@ -87,7 +85,7 @@ struct Args { /// Log format #[arg(long, env, default_value = "text")] - log_format: String, + log_format: LogFormat, /// Host to run the debug server on #[arg(long, env, default_value = "127.0.0.1")] @@ -102,6 +100,24 @@ struct Args { execution_mode: ExecutionMode, } +#[derive(Clone, Debug)] +enum LogFormat { + Json, + Text, +} + +impl std::str::FromStr for LogFormat { + type Err = String; + + fn from_str(s: &str) -> Result { + match s.to_lowercase().as_str() { + "json" => Ok(LogFormat::Json), + "text" => Ok(LogFormat::Text), + _ => Err("Invalid log format".into()), + } + } +} + #[derive(Subcommand, Debug)] enum Commands { /// Debug commands @@ -154,23 +170,7 @@ async fn main() -> eyre::Result<()> { }; } - // Initialize logging - let log_format = args.log_format.to_lowercase(); - let log_level = args.log_level.to_string(); - if log_format == "json" { - // JSON log format - tracing_subscriber::fmt() - .json() // Use JSON format - .with_env_filter(EnvFilter::new(log_level)) // Set log level - .with_ansi(false) // Disable colored logging - .init(); - } else { - // Default (text) log format - tracing_subscriber::fmt() - .with_env_filter(EnvFilter::new(log_level)) // Set log level - .with_ansi(false) // Disable colored logging - .init(); - } + init_tracing(&args)?; let metrics = if args.metrics { let recorder = PrometheusBuilder::new().build_recorder(); @@ -190,11 +190,6 @@ async fn main() -> eyre::Result<()> { None }; - // Telemetry setup - if args.tracing { - init_tracing(&args.otlp_endpoint); - } - let l2_client_args = args.l2_client; let l2_auth_jwt = if let Some(secret) = l2_client_args.l2_jwt_token { @@ -300,29 +295,6 @@ async fn main() -> eyre::Result<()> { Ok(()) } -fn init_tracing(endpoint: &str) { - global::set_text_map_propagator(TraceContextPropagator::new()); - let provider = opentelemetry_otlp::new_pipeline() - .tracing() - .with_exporter( - opentelemetry_otlp::new_exporter() - .tonic() - .with_endpoint(endpoint), - ) - .with_trace_config(Config::default().with_resource(Resource::new(vec![ - opentelemetry::KeyValue::new("service.name", "rollup-boost"), - ]))) - .install_batch(opentelemetry_sdk::runtime::Tokio); - match provider { - Ok(provider) => { - let _ = global::set_tracer_provider(provider); - } - Err(e) => { - error!(message = "failed to initiate tracing provider", "error" = %e); - } - } -} - async fn init_metrics_server(addr: SocketAddr, handle: PrometheusHandle) -> eyre::Result<()> { let listener = TcpListener::bind(addr).await?; info!("Metrics server running on {}", addr); diff --git a/src/proxy.rs b/src/proxy.rs index 786768e4..4ef8861e 100644 --- a/src/proxy.rs +++ b/src/proxy.rs @@ -383,7 +383,7 @@ mod tests { use super::*; use alloy_primitives::{hex, Bytes, B256, U128, U64}; use alloy_rpc_types_engine::JwtSecret; - use alloy_rpc_types_eth::erc4337::ConditionalOptions; + use alloy_rpc_types_eth::erc4337::TransactionConditional; use http_body_util::BodyExt; use hyper::service::service_fn; use hyper_util::rt::TokioIo; @@ -437,6 +437,7 @@ mod tests { let temp_listener = TcpListener::bind("0.0.0.0:0").await?; let server_addr = temp_listener.local_addr()?; drop(temp_listener); + let server = Server::builder() .set_http_middleware(middleware.clone()) .build(server_addr) @@ -797,7 +798,7 @@ mod tests { let expected_tx: Bytes = hex!("1234").into(); let expected_method = "eth_sendRawTransactionConditional"; - let transact_conditionals = ConditionalOptions::default(); + let transact_conditionals = TransactionConditional::default(); test_harness .proxy_client .request::( diff --git a/src/tracing.rs b/src/tracing.rs new file mode 100644 index 00000000..8df4463d --- /dev/null +++ b/src/tracing.rs @@ -0,0 +1,66 @@ +use eyre::Context as _; +use opentelemetry::trace::TracerProvider as _; +use opentelemetry::{global, KeyValue}; +use opentelemetry_otlp::WithExportConfig; +use opentelemetry_sdk::{propagation::TraceContextPropagator, Resource}; +use tracing_opentelemetry::OpenTelemetryLayer; +use tracing_subscriber::{layer::SubscriberExt, EnvFilter}; + +use crate::{Args, LogFormat}; + +pub(crate) fn init_tracing(args: &Args) -> eyre::Result<()> { + let log_level = args.log_level.to_string(); + let registry = tracing_subscriber::registry().with(EnvFilter::new(log_level)); + + // Weird control flow here is required because of type system + if args.tracing { + global::set_text_map_propagator(TraceContextPropagator::new()); + let otlp_exporter = opentelemetry_otlp::SpanExporter::builder() + .with_tonic() + .with_endpoint(&args.otlp_endpoint) + .build() + .context("Failed to create OTLP exporter")?; + let provider = opentelemetry_sdk::trace::SdkTracerProvider::builder() + .with_batch_exporter(otlp_exporter) + .with_resource( + Resource::builder_empty() + .with_attributes([ + KeyValue::new("service.name", env!("CARGO_PKG_NAME")), + KeyValue::new("service.version", env!("CARGO_PKG_VERSION")), + ]) + .build(), + ) + .build(); + + let tracer = provider.tracer(env!("CARGO_PKG_NAME")); + let registry = registry.with(OpenTelemetryLayer::new(tracer)); + + match args.log_format { + LogFormat::Json => { + tracing::subscriber::set_global_default(registry.with( + tracing_subscriber::fmt::layer().json().with_ansi(false), // Disable colored logging + ))?; + } + LogFormat::Text => { + tracing::subscriber::set_global_default( + registry.with(tracing_subscriber::fmt::layer()), + )?; + } + } + } else { + match args.log_format { + LogFormat::Json => { + tracing::subscriber::set_global_default( + registry.with(tracing_subscriber::fmt::layer().json()), + )?; + } + LogFormat::Text => { + tracing::subscriber::set_global_default( + registry.with(tracing_subscriber::fmt::layer()), + )?; + } + } + } + + Ok(()) +} From 1d95ab0709f40c318b176137319a336923409de5 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Wed, 12 Mar 2025 16:00:19 -0700 Subject: [PATCH 02/23] get rid of manual span metrics --- Cargo.toml | 2 +- src/metrics.rs | 9 -------- src/server.rs | 57 +++++++------------------------------------------- src/tracing.rs | 26 +++++++++++++++++++++++ 4 files changed, 34 insertions(+), 60 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 4ca80c6e..51039e59 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,7 @@ alloy-rpc-types-eth = "0.12.5" alloy-primitives = { version = "0.8.10", features = ["rand"] } alloy-eips = { version = "0.12.5", features = ["serde"] } tokio = { version = "1", features = ["full"] } -tracing = "0.1.4" +tracing = { version = "0.1.4", features = ["log-always"] } tracing-subscriber = { version = "0.3.11", features = ["env-filter", "json"] } serde = { version = "1", features = ["derive"] } thiserror = "2.0.12" diff --git a/src/metrics.rs b/src/metrics.rs index 701258d0..c9f3770a 100644 --- a/src/metrics.rs +++ b/src/metrics.rs @@ -8,15 +8,6 @@ use crate::server::PayloadSource; #[derive(Metrics)] #[metrics(scope = "rpc")] pub struct ServerMetrics { - #[metric(describe = "Total latency for server `engine_newPayloadV3` call")] - pub new_payload_v3_total: Histogram, - - #[metric(describe = "Total latency for server `engine_getPayloadV3` call")] - pub get_payload_v3_total: Histogram, - - #[metric(describe = "Total latency for server `engine_forkChoiceUpdatedV3` call")] - pub fork_choice_updated_v3_total: Histogram, - // Builder proxy metrics #[metric(describe = "Latency for builder client forwarded rpc calls (excluding the engine api)", labels = ["method"])] #[allow(dead_code)] diff --git a/src/server.rs b/src/server.rs index a2995ed8..a7872b5a 100644 --- a/src/server.rs +++ b/src/server.rs @@ -5,7 +5,6 @@ use alloy_primitives::B256; use debug_api::DebugServer; use std::num::NonZero; use std::sync::Arc; -use std::time::Instant; use alloy_rpc_types_engine::{ ExecutionPayload, ExecutionPayloadV3, ForkchoiceState, ForkchoiceUpdated, PayloadId, @@ -23,7 +22,7 @@ use opentelemetry::{Context, KeyValue}; use serde::{Deserialize, Serialize}; use tokio::sync::Mutex; -use tracing::{debug, error, info}; +use tracing::{debug, error, info, instrument}; use jsonrpsee::proc_macros::rpc; @@ -228,54 +227,12 @@ pub trait EngineApi { #[async_trait] impl EngineApiServer for RollupBoostServer { - async fn fork_choice_updated_v3( - &self, - fork_choice_state: ForkchoiceState, - payload_attributes: Option, - ) -> RpcResult { - let start = Instant::now(); - let res = self - .fork_choice_updated_v3(fork_choice_state, payload_attributes) - .await; - let elapsed = start.elapsed(); - if let Some(metrics) = &self.metrics { - metrics.fork_choice_updated_v3_total.record(elapsed); - } - res - } - - async fn get_payload_v3( - &self, - payload_id: PayloadId, - ) -> RpcResult { - let start = Instant::now(); - let res = self.get_payload_v3(payload_id).await; - let elapsed = start.elapsed(); - if let Some(metrics) = &self.metrics { - metrics.get_payload_v3_total.record(elapsed); - } - res - } - - async fn new_payload_v3( - &self, - payload: ExecutionPayloadV3, - versioned_hashes: Vec, - parent_beacon_block_root: B256, - ) -> RpcResult { - let start = Instant::now(); - let res = self - .new_payload_v3(payload, versioned_hashes, parent_beacon_block_root) - .await; - let elapsed = start.elapsed(); - if let Some(metrics) = &self.metrics { - metrics.new_payload_v3_total.record(elapsed); - } - res - } -} - -impl RollupBoostServer { + #[instrument(skip_all, + fields( + has_attributes = payload_attributes.is_some(), + head_block_hash = %fork_choice_state.head_block_hash + ) + )] async fn fork_choice_updated_v3( &self, fork_choice_state: ForkchoiceState, diff --git a/src/tracing.rs b/src/tracing.rs index 8df4463d..a0128433 100644 --- a/src/tracing.rs +++ b/src/tracing.rs @@ -1,13 +1,38 @@ use eyre::Context as _; +use metrics::histogram; use opentelemetry::trace::TracerProvider as _; use opentelemetry::{global, KeyValue}; use opentelemetry_otlp::WithExportConfig; +use opentelemetry_sdk::trace::SpanProcessor; use opentelemetry_sdk::{propagation::TraceContextPropagator, Resource}; use tracing_opentelemetry::OpenTelemetryLayer; use tracing_subscriber::{layer::SubscriberExt, EnvFilter}; use crate::{Args, LogFormat}; +#[derive(Debug)] +struct MetricsSpanProcessor; + +impl SpanProcessor for MetricsSpanProcessor { + fn on_start(&self, _span: &mut opentelemetry_sdk::trace::Span, _cx: &opentelemetry::Context) {} + + fn on_end(&self, span: opentelemetry_sdk::trace::SpanData) { + let duration = span + .end_time + .duration_since(span.start_time) + .unwrap_or_default(); + histogram!(format!("{}_duration", span.name)).record(duration); + } + + fn force_flush(&self) -> opentelemetry_sdk::error::OTelSdkResult { + Ok(()) + } + + fn shutdown(&self) -> opentelemetry_sdk::error::OTelSdkResult { + Ok(()) + } +} + pub(crate) fn init_tracing(args: &Args) -> eyre::Result<()> { let log_level = args.log_level.to_string(); let registry = tracing_subscriber::registry().with(EnvFilter::new(log_level)); @@ -22,6 +47,7 @@ pub(crate) fn init_tracing(args: &Args) -> eyre::Result<()> { .context("Failed to create OTLP exporter")?; let provider = opentelemetry_sdk::trace::SdkTracerProvider::builder() .with_batch_exporter(otlp_exporter) + .with_span_processor(MetricsSpanProcessor) .with_resource( Resource::builder_empty() .with_attributes([ From ae14d39c316e952cf5b58f8d4e9c687c7a3343b3 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Wed, 12 Mar 2025 16:07:23 -0700 Subject: [PATCH 03/23] guard for metrics span processor --- src/tracing.rs | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/tracing.rs b/src/tracing.rs index a0128433..97aa7bcf 100644 --- a/src/tracing.rs +++ b/src/tracing.rs @@ -45,9 +45,8 @@ pub(crate) fn init_tracing(args: &Args) -> eyre::Result<()> { .with_endpoint(&args.otlp_endpoint) .build() .context("Failed to create OTLP exporter")?; - let provider = opentelemetry_sdk::trace::SdkTracerProvider::builder() + let mut provider_builder = opentelemetry_sdk::trace::SdkTracerProvider::builder() .with_batch_exporter(otlp_exporter) - .with_span_processor(MetricsSpanProcessor) .with_resource( Resource::builder_empty() .with_attributes([ @@ -55,21 +54,24 @@ pub(crate) fn init_tracing(args: &Args) -> eyre::Result<()> { KeyValue::new("service.version", env!("CARGO_PKG_VERSION")), ]) .build(), - ) - .build(); + ); + if args.metrics { + provider_builder = provider_builder.with_span_processor(MetricsSpanProcessor); + } + let provider = provider_builder.build(); let tracer = provider.tracer(env!("CARGO_PKG_NAME")); let registry = registry.with(OpenTelemetryLayer::new(tracer)); match args.log_format { LogFormat::Json => { - tracing::subscriber::set_global_default(registry.with( - tracing_subscriber::fmt::layer().json().with_ansi(false), // Disable colored logging - ))?; + tracing::subscriber::set_global_default( + registry.with(tracing_subscriber::fmt::layer().with_ansi(false).json()), + )?; } LogFormat::Text => { tracing::subscriber::set_global_default( - registry.with(tracing_subscriber::fmt::layer()), + registry.with(tracing_subscriber::fmt::layer().with_ansi(false)), )?; } } @@ -77,12 +79,12 @@ pub(crate) fn init_tracing(args: &Args) -> eyre::Result<()> { match args.log_format { LogFormat::Json => { tracing::subscriber::set_global_default( - registry.with(tracing_subscriber::fmt::layer().json()), + registry.with(tracing_subscriber::fmt::layer().with_ansi(false).json()), )?; } LogFormat::Text => { tracing::subscriber::set_global_default( - registry.with(tracing_subscriber::fmt::layer()), + registry.with(tracing_subscriber::fmt::layer().with_ansi(false)), )?; } } From 9e1a3634c6bc964a605f8009fd330d0daca6a065 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Wed, 12 Mar 2025 16:14:01 -0700 Subject: [PATCH 04/23] extract init metrics into function --- src/main.rs | 24 +++--------------------- src/metrics.rs | 25 +++++++++++++++++++++++-- 2 files changed, 26 insertions(+), 23 deletions(-) diff --git a/src/main.rs b/src/main.rs index 8fc21e49..55fdb36b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,7 +3,7 @@ use ::tracing::{error, info, Level}; use clap::{arg, Parser, Subcommand}; use client::{BuilderArgs, ExecutionClient, L2ClientArgs}; use debug_api::DebugClient; -use metrics::{ClientMetrics, ServerMetrics}; +use metrics::{init_metrics, ClientMetrics}; use std::{net::SocketAddr, sync::Arc}; use tracing::init_tracing; @@ -17,8 +17,7 @@ use hyper_util::rt::TokioIo; use jsonrpsee::http_client::HttpBody; use jsonrpsee::server::Server; use jsonrpsee::RpcModule; -use metrics_exporter_prometheus::{PrometheusBuilder, PrometheusHandle}; -use metrics_util::layers::{PrefixLayer, Stack}; +use metrics_exporter_prometheus::PrometheusHandle; use proxy::ProxyLayer; use server::{ExecutionMode, PayloadSource, RollupBoostServer}; @@ -171,24 +170,7 @@ async fn main() -> eyre::Result<()> { } init_tracing(&args)?; - - let metrics = if args.metrics { - let recorder = PrometheusBuilder::new().build_recorder(); - let handle = recorder.handle(); - - // Build metrics stack - Stack::new(recorder) - .push(PrefixLayer::new("rollup-boost")) - .install()?; - - // Start the metrics server - let metrics_addr = format!("{}:{}", args.metrics_host, args.metrics_port); - let addr: SocketAddr = metrics_addr.parse()?; - tokio::spawn(init_metrics_server(addr, handle)); // Run the metrics server in a separate task - Some(Arc::new(ServerMetrics::default())) - } else { - None - }; + let metrics = init_metrics(&args)?; let l2_client_args = args.l2_client; diff --git a/src/metrics.rs b/src/metrics.rs index c9f3770a..dd41bd17 100644 --- a/src/metrics.rs +++ b/src/metrics.rs @@ -1,9 +1,12 @@ -use std::time::Duration; +use std::{net::SocketAddr, sync::Arc, time::Duration}; +use eyre::Result; use metrics::{counter, histogram, Counter, Histogram}; use metrics_derive::Metrics; +use metrics_exporter_prometheus::PrometheusBuilder; +use metrics_util::layers::{PrefixLayer, Stack}; -use crate::server::PayloadSource; +use crate::{init_metrics_server, server::PayloadSource, Args}; #[derive(Metrics)] #[metrics(scope = "rpc")] @@ -126,3 +129,21 @@ impl ClientMetrics { counter!("rpc.fork_choice_updated_v3_response_count", "code" => code).increment(1); } } + +pub(crate) fn init_metrics(args: &Args) -> Result>> { + if args.metrics { + let recorder = PrometheusBuilder::new().build_recorder(); + let handle = recorder.handle(); + + Stack::new(recorder) + .push(PrefixLayer::new("rollup-boost")) + .install()?; + + let metrics_addr = format!("{}:{}", args.metrics_host, args.metrics_port); + let addr: SocketAddr = metrics_addr.parse()?; + tokio::spawn(init_metrics_server(addr, handle)); // Run the metrics server in a separate task + Ok(Some(Arc::new(ServerMetrics::default()))) + } else { + Ok(None) + } +} From 496538b7eb655eb773d41eb7b9d065098f6d8705 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Wed, 12 Mar 2025 19:33:32 -0700 Subject: [PATCH 05/23] trace filtering --- Cargo.toml | 1 + src/integration/mod.rs | 2 -- src/integration/service_rb.rs | 6 +++- src/metrics.rs | 1 + src/server.rs | 21 +++++++----- src/tracing.rs | 63 +++++++++++++++++++++++++++++------ 6 files changed, 73 insertions(+), 21 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 51039e59..b8f66354 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -67,4 +67,5 @@ reth-rpc-layer = { git = "https://github.com/paradigmxyz/reth.git", rev = "v1.3. ctor = "0.4.1" [features] +default = ["integration"] integration = [] diff --git a/src/integration/mod.rs b/src/integration/mod.rs index d26b01aa..1174e2a4 100644 --- a/src/integration/mod.rs +++ b/src/integration/mod.rs @@ -724,8 +724,6 @@ impl SimpleBlockGenerator { timestamp: self.timestamp + 1000, // 1 second later prev_randao: B256::ZERO, suggested_fee_recipient: Default::default(), - target_blobs_per_block: None, - max_blobs_per_block: None, }, transactions: None, no_tx_pool: Some(empty_blocks), diff --git a/src/integration/service_rb.rs b/src/integration/service_rb.rs index 6919a2f9..e3cd2d47 100644 --- a/src/integration/service_rb.rs +++ b/src/integration/service_rb.rs @@ -54,7 +54,11 @@ impl Service for RollupBoostConfig { .arg(Arg::Port { name: "debug".into(), preferred: 5555, - }); + }) + .arg("--tracing") + .arg("--metrics") + .arg("--log-level") + .arg("trace"); cmd } diff --git a/src/metrics.rs b/src/metrics.rs index dd41bd17..6eb3565b 100644 --- a/src/metrics.rs +++ b/src/metrics.rs @@ -139,6 +139,7 @@ pub(crate) fn init_metrics(args: &Args) -> Result>> { .push(PrefixLayer::new("rollup-boost")) .install()?; + // Start the metrics server let metrics_addr = format!("{}:{}", args.metrics_host, args.metrics_port); let addr: SocketAddr = metrics_addr.parse()?; tokio::spawn(init_metrics_server(addr, handle)); // Run the metrics server in a separate task diff --git a/src/server.rs b/src/server.rs index a7872b5a..694a575d 100644 --- a/src/server.rs +++ b/src/server.rs @@ -17,7 +17,7 @@ use jsonrpsee::RpcModule; use lru::LruCache; use op_alloy_rpc_types_engine::{OpExecutionPayloadEnvelopeV3, OpPayloadAttributes}; use opentelemetry::global::{self, BoxedSpan, BoxedTracer}; -use opentelemetry::trace::{Span, TraceContextExt, Tracer}; +use opentelemetry::trace::{Span, SpanKind, TraceContextExt, Tracer}; use opentelemetry::{Context, KeyValue}; use serde::{Deserialize, Serialize}; @@ -38,7 +38,7 @@ pub struct PayloadTraceContext { impl PayloadTraceContext { fn new() -> Self { PayloadTraceContext { - tracer: Arc::new(global::tracer("rollup-boost")), + tracer: Arc::new(global::tracer(env!("CARGO_PKG_NAME"))), block_hash_to_payload_ids: Arc::new(Mutex::new(LruCache::new( NonZero::new(CACHE_SIZE).unwrap(), ))), @@ -229,6 +229,7 @@ pub trait EngineApi { impl EngineApiServer for RollupBoostServer { #[instrument(skip_all, fields( + otel.kind = ?SpanKind::Server, has_attributes = payload_attributes.is_some(), head_block_hash = %fork_choice_state.head_block_hash ) @@ -238,12 +239,6 @@ impl EngineApiServer for RollupBoostServer { fork_choice_state: ForkchoiceState, payload_attributes: Option, ) -> RpcResult { - info!( - message = "received fork_choice_updated_v3", - "head_block_hash" = %fork_choice_state.head_block_hash, - "has_attributes" = payload_attributes.is_some(), - ); - // First get the local payload ID from L2 client let l2_response = self .l2_client @@ -382,6 +377,11 @@ impl EngineApiServer for RollupBoostServer { Ok(l2_response) } + #[instrument(skip_all, + fields( + otel.kind = ?SpanKind::Server, + ) + )] async fn get_payload_v3( &self, payload_id: PayloadId, @@ -506,6 +506,11 @@ impl EngineApiServer for RollupBoostServer { }) } + #[instrument(skip_all, + fields( + otel.kind = ?SpanKind::Server, + ) + )] async fn new_payload_v3( &self, payload: ExecutionPayloadV3, diff --git a/src/tracing.rs b/src/tracing.rs index 97aa7bcf..21f81a6e 100644 --- a/src/tracing.rs +++ b/src/tracing.rs @@ -5,8 +5,11 @@ use opentelemetry::{global, KeyValue}; use opentelemetry_otlp::WithExportConfig; use opentelemetry_sdk::trace::SpanProcessor; use opentelemetry_sdk::{propagation::TraceContextPropagator, Resource}; +use tracing::level_filters::LevelFilter; use tracing_opentelemetry::OpenTelemetryLayer; -use tracing_subscriber::{layer::SubscriberExt, EnvFilter}; +use tracing_subscriber::filter::Targets; +use tracing_subscriber::layer::SubscriberExt; +use tracing_subscriber::Layer; use crate::{Args, LogFormat}; @@ -21,7 +24,18 @@ impl SpanProcessor for MetricsSpanProcessor { .end_time .duration_since(span.start_time) .unwrap_or_default(); - histogram!(format!("{}_duration", span.name)).record(duration); + + let labels = span + .attributes + .iter() + .map(|kv| (kv.key.to_string(), kv.value.to_string())) + .chain(std::iter::once(( + "span_kind".to_string(), + format!("{:?}", span.span_kind), + ))) + .collect::>(); + + histogram!(format!("{}_duration", span.name), &labels).record(duration); } fn force_flush(&self) -> opentelemetry_sdk::error::OTelSdkResult { @@ -34,12 +48,16 @@ impl SpanProcessor for MetricsSpanProcessor { } pub(crate) fn init_tracing(args: &Args) -> eyre::Result<()> { - let log_level = args.log_level.to_string(); - let registry = tracing_subscriber::registry().with(EnvFilter::new(log_level)); + let log_filter = Targets::new() + .with_default(LevelFilter::INFO) + .with_target("rollup-boost", args.log_level); + + let registry = tracing_subscriber::registry(); // Weird control flow here is required because of type system if args.tracing { global::set_text_map_propagator(TraceContextPropagator::new()); + // Define a custom sampler that checks if the span's name starts with your crate's name. let otlp_exporter = opentelemetry_otlp::SpanExporter::builder() .with_tonic() .with_endpoint(&args.otlp_endpoint) @@ -59,19 +77,35 @@ pub(crate) fn init_tracing(args: &Args) -> eyre::Result<()> { provider_builder = provider_builder.with_span_processor(MetricsSpanProcessor); } let provider = provider_builder.build(); - let tracer = provider.tracer(env!("CARGO_PKG_NAME")); - let registry = registry.with(OpenTelemetryLayer::new(tracer)); + + // Set global tracer provider for use with opentelemetry api + global::set_tracer_provider(provider); + + let trace_filter = Targets::new() + .with_default(LevelFilter::OFF) + .with_target(env!("CARGO_PKG_NAME"), LevelFilter::TRACE); + + let registry = registry.with(OpenTelemetryLayer::new(tracer).with_filter(trace_filter)); match args.log_format { LogFormat::Json => { tracing::subscriber::set_global_default( - registry.with(tracing_subscriber::fmt::layer().with_ansi(false).json()), + registry.with( + tracing_subscriber::fmt::layer() + .json() + .with_ansi(false) + .with_filter(log_filter.clone()), + ), )?; } LogFormat::Text => { tracing::subscriber::set_global_default( - registry.with(tracing_subscriber::fmt::layer().with_ansi(false)), + registry.with( + tracing_subscriber::fmt::layer() + .with_ansi(false) + .with_filter(log_filter.clone()), + ), )?; } } @@ -79,12 +113,21 @@ pub(crate) fn init_tracing(args: &Args) -> eyre::Result<()> { match args.log_format { LogFormat::Json => { tracing::subscriber::set_global_default( - registry.with(tracing_subscriber::fmt::layer().with_ansi(false).json()), + registry.with( + tracing_subscriber::fmt::layer() + .json() + .with_ansi(false) + .with_filter(log_filter.clone()), + ), )?; } LogFormat::Text => { tracing::subscriber::set_global_default( - registry.with(tracing_subscriber::fmt::layer().with_ansi(false)), + registry.with( + tracing_subscriber::fmt::layer() + .with_ansi(false) + .with_filter(log_filter.clone()), + ), )?; } } From d26f8c6225cda7352013f7893a470ec57bafefcf Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Wed, 12 Mar 2025 19:54:15 -0700 Subject: [PATCH 06/23] fix for log target string --- src/tracing.rs | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/src/tracing.rs b/src/tracing.rs index 21f81a6e..a2e7a428 100644 --- a/src/tracing.rs +++ b/src/tracing.rs @@ -1,3 +1,5 @@ +use std::str::FromStr; + use eyre::Context as _; use metrics::histogram; use opentelemetry::trace::TracerProvider as _; @@ -9,7 +11,7 @@ use tracing::level_filters::LevelFilter; use tracing_opentelemetry::OpenTelemetryLayer; use tracing_subscriber::filter::Targets; use tracing_subscriber::layer::SubscriberExt; -use tracing_subscriber::Layer; +use tracing_subscriber::{EnvFilter, Layer}; use crate::{Args, LogFormat}; @@ -48,11 +50,18 @@ impl SpanProcessor for MetricsSpanProcessor { } pub(crate) fn init_tracing(args: &Args) -> eyre::Result<()> { - let log_filter = Targets::new() + // Be cautious with snake_case and kebab-case here + let filter_name = "rollup_boost".to_string(); + + let global_filter = Targets::new() .with_default(LevelFilter::INFO) - .with_target("rollup-boost", args.log_level); + .with_target(&filter_name, LevelFilter::TRACE); - let registry = tracing_subscriber::registry(); + let registry = tracing_subscriber::registry().with(global_filter); + + let log_filter = Targets::new() + .with_default(LevelFilter::INFO) + .with_target(&filter_name, args.log_level); // Weird control flow here is required because of type system if args.tracing { @@ -84,9 +93,13 @@ pub(crate) fn init_tracing(args: &Args) -> eyre::Result<()> { let trace_filter = Targets::new() .with_default(LevelFilter::OFF) - .with_target(env!("CARGO_PKG_NAME"), LevelFilter::TRACE); + .with_target(&filter_name, LevelFilter::TRACE); - let registry = registry.with(OpenTelemetryLayer::new(tracer).with_filter(trace_filter)); + let registry = registry.with( + OpenTelemetryLayer::new(tracer) + .with_level(true) + .with_filter(trace_filter), + ); match args.log_format { LogFormat::Json => { From 55b9246824386bc8646c3b699b93c211773c6bab Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Wed, 12 Mar 2025 22:51:52 -0700 Subject: [PATCH 07/23] convert spans to tracing --- src/main.rs | 6 +- src/server.rs | 358 +++++++++++++++---------------------------------- src/tracing.rs | 28 ++-- 3 files changed, 125 insertions(+), 267 deletions(-) diff --git a/src/main.rs b/src/main.rs index 55fdb36b..21506a49 100644 --- a/src/main.rs +++ b/src/main.rs @@ -354,11 +354,6 @@ mod tests { } #[tokio::test] - async fn test_create_client() { - valid_jwt().await; - invalid_jwt().await; - } - async fn valid_jwt() { let secret = JwtSecret::from_hex(SECRET).unwrap(); @@ -369,6 +364,7 @@ mod tests { assert_eq!(response.unwrap(), "You are the dark lord"); } + #[tokio::test] async fn invalid_jwt() { let secret = JwtSecret::random(); let auth_rpc = Uri::from_str(&format!("http://{}:{}", AUTH_ADDR, AUTH_PORT)).unwrap(); diff --git a/src/server.rs b/src/server.rs index 694a575d..7fc6f15c 100644 --- a/src/server.rs +++ b/src/server.rs @@ -16,9 +16,7 @@ use jsonrpsee::types::ErrorObject; use jsonrpsee::RpcModule; use lru::LruCache; use op_alloy_rpc_types_engine::{OpExecutionPayloadEnvelopeV3, OpPayloadAttributes}; -use opentelemetry::global::{self, BoxedSpan, BoxedTracer}; -use opentelemetry::trace::{Span, SpanKind, TraceContextExt, Tracer}; -use opentelemetry::{Context, KeyValue}; +use opentelemetry::trace::{ SpanKind}; use serde::{Deserialize, Serialize}; use tokio::sync::Mutex; @@ -29,31 +27,25 @@ use jsonrpsee::proc_macros::rpc; const CACHE_SIZE: usize = 100; pub struct PayloadTraceContext { - tracer: Arc, block_hash_to_payload_ids: Arc>>>, - payload_id_to_span: Arc>>>, - local_to_external_payload_ids: Arc>>, + payload_id_to_trace_id: Arc>>, } impl PayloadTraceContext { fn new() -> Self { PayloadTraceContext { - tracer: Arc::new(global::tracer(env!("CARGO_PKG_NAME"))), block_hash_to_payload_ids: Arc::new(Mutex::new(LruCache::new( NonZero::new(CACHE_SIZE).unwrap(), ))), - payload_id_to_span: Arc::new(Mutex::new(LruCache::new( - NonZero::new(CACHE_SIZE).unwrap(), - ))), - local_to_external_payload_ids: Arc::new(Mutex::new(LruCache::new( + payload_id_to_trace_id: Arc::new(Mutex::new(LruCache::new( NonZero::new(CACHE_SIZE).unwrap(), ))), } } - async fn store(&self, payload_id: PayloadId, parent_hash: B256, parent_span: BoxedSpan) { - let mut store = self.payload_id_to_span.lock().await; - store.put(payload_id, Arc::new(parent_span)); + async fn store(&self, payload_id: PayloadId, parent_hash: B256, trace_id: tracing::Id) { + let mut store = self.payload_id_to_trace_id.lock().await; + store.put(payload_id, trace_id); let mut store = self.block_hash_to_payload_ids.lock().await; if let Some(payload_ids) = store.get_mut(&parent_hash) { payload_ids.push(payload_id); @@ -62,9 +54,9 @@ impl PayloadTraceContext { } } - async fn retrieve_by_parent_hash(&self, parent_hash: &B256) -> Option>> { + async fn retrieve_by_parent_hash(&self, parent_hash: &B256) -> Option> { let mut block_hash_to_payload_ids = self.block_hash_to_payload_ids.lock().await; - let mut payload_id_to_span = self.payload_id_to_span.lock().await; + let mut payload_id_to_span = self.payload_id_to_trace_id.lock().await; block_hash_to_payload_ids .get(parent_hash) .map(move |payload_ids| { @@ -76,14 +68,14 @@ impl PayloadTraceContext { }) } - async fn retrieve_by_payload_id(&self, payload_id: &PayloadId) -> Option> { - let mut store = self.payload_id_to_span.lock().await; + async fn retrieve_by_payload_id(&self, payload_id: &PayloadId) -> Option { + let mut store = self.payload_id_to_trace_id.lock().await; store.get(payload_id).cloned() } async fn remove_by_parent_hash(&self, block_hash: &B256) { let mut block_hash_to_payload_ids = self.block_hash_to_payload_ids.lock().await; - let mut payload_id_to_span = self.payload_id_to_span.lock().await; + let mut payload_id_to_span = self.payload_id_to_trace_id.lock().await; if let Some(payload_ids) = block_hash_to_payload_ids.get_mut(block_hash) { for payload_id in payload_ids { payload_id_to_span.pop(payload_id); @@ -91,16 +83,6 @@ impl PayloadTraceContext { } block_hash_to_payload_ids.pop(block_hash); } - - async fn store_payload_id_mapping(&self, local_id: PayloadId, external_id: PayloadId) { - let mut local_to_external = self.local_to_external_payload_ids.lock().await; - local_to_external.put(local_id, external_id); - } - - async fn get_external_payload_id(&self, local_id: &PayloadId) -> Option { - let mut store = self.local_to_external_payload_ids.lock().await; - store.get(local_id).copied() - } } #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, clap::ValueEnum)] @@ -231,7 +213,9 @@ impl EngineApiServer for RollupBoostServer { fields( otel.kind = ?SpanKind::Server, has_attributes = payload_attributes.is_some(), - head_block_hash = %fork_choice_state.head_block_hash + head_block_hash = %fork_choice_state.head_block_hash, + timestamp = ?payload_attributes.as_ref().map(|attrs| attrs.payload_attributes.timestamp), + payload_id ) )] async fn fork_choice_updated_v3( @@ -245,6 +229,8 @@ impl EngineApiServer for RollupBoostServer { .fork_choice_updated_v3(fork_choice_state, payload_attributes.clone()) .await?; + let payload_id = l2_response.payload_id; + // TODO: Use _is_block_building_call to log the correct message during the async call to builder let (should_send_to_builder, _is_block_building_call) = if let Some(attr) = payload_attributes.as_ref() { @@ -260,117 +246,26 @@ impl EngineApiServer for RollupBoostServer { }; let execution_mode = self.execution_mode.lock().await; + let trace_id = tracing::Span::current().id(); + if let (Some(payload_id), Some(trace)) = (l2_response.payload_id, trace_id) { + self.payload_trace_context + .store( + payload_id, + fork_choice_state.head_block_hash, + trace, + ) + .await; + } if execution_mode.is_disabled() { debug!(message = "execution mode is disabled, skipping FCU call to builder", "head_block_hash" = %fork_choice_state.head_block_hash); } else if should_send_to_builder { - let span: Option = - if let (Some(payload_attributes), Some(local_payload_id)) = - (payload_attributes.clone(), l2_response.payload_id) - { - let mut parent_span = self - .payload_trace_context - .tracer - .start_with_context("build-block", &Context::current()); - - parent_span.set_attribute(KeyValue::new( - "parent_hash", - fork_choice_state.head_block_hash.to_string(), - )); - parent_span.set_attribute(KeyValue::new( - "timestamp", - payload_attributes.payload_attributes.timestamp as i64, - )); - parent_span - .set_attribute(KeyValue::new("payload_id", local_payload_id.to_string())); - let ctx = Context::current() - .with_remote_span_context(parent_span.span_context().clone()); - self.payload_trace_context - .store( - local_payload_id, - fork_choice_state.head_block_hash, - parent_span, - ) - .await; - Some( - self.payload_trace_context - .tracer - .start_with_context("fcu", &ctx), - ) - } else { - None - }; - - // async call to builder to trigger payload building and sync - let builder_client = self.builder_client.clone(); - let attr = payload_attributes.clone(); - let payload_trace_context = self.payload_trace_context.clone(); - let local_payload_id = l2_response.payload_id; - tokio::spawn(async move { - match builder_client - .fork_choice_updated_v3(fork_choice_state, attr) - .await - { - Ok(response) => { - let external_payload_id = response.payload_id; - if let (Some(local_id), Some(external_id)) = - (local_payload_id, external_payload_id) - { - // Only store mapping if local and external IDs are different - if local_id != external_id { - payload_trace_context - .store_payload_id_mapping(local_id, external_id) - .await; - } - } - if response.is_invalid() { - let payload_id_str = external_payload_id - .map(|id| id.to_string()) - .unwrap_or_default(); - error!(message = "builder rejected fork_choice_updated_v3 with attributes", "url" = ?builder_client.auth_rpc, "payload_id" = payload_id_str, "validation_error" = %response.payload_status.status); - } else if let Some(external_id) = external_payload_id { - info!( - message = "called fork_choice_updated_v3 to builder with payload attributes", - "url" = ?builder_client.auth_rpc, - "payload_status" = %response.payload_status.status, - "payload_id" = %external_id - ); - } else { - info!( - message = "called fork_choice_updated_v3 to builder without payload attributes", - "url" = ?builder_client.auth_rpc, - "payload_status" = %response.payload_status.status - ); - } - } - - Err(e) => { - error!( - message = "error calling fork_choice_updated_v3 to builder", - "url" = ?builder_client.auth_rpc, - "error" = %e, - "head_block_hash" = %fork_choice_state.head_block_hash - ); - } - } - if let Some(mut s) = span { - s.end() - }; - }); + self.send_to_builder( + payload_attributes, + l2_response.clone(), + fork_choice_state.clone(), + ).await; } else { - // If no payload attributes are provided, the builder will not build a block - // We store a mapping from the local payload ID to an empty payload ID to signal - // during get_payload_v3 request that the builder does not need to be queried. - if let Some(local_id) = l2_response.payload_id { - let payload_trace_context = self.payload_trace_context.clone(); - - payload_trace_context - .store_payload_id_mapping(local_id, PayloadId::default()) - .await; - } else { - error!(message = "no local payload id returned from l2 client", "head_block_hash" = %fork_choice_state.head_block_hash); - } - info!(message = "no payload attributes provided or no_tx_pool is set", "head_block_hash" = %fork_choice_state.head_block_hash); } @@ -378,6 +273,7 @@ impl EngineApiServer for RollupBoostServer { } #[instrument(skip_all, + follow_from = [causes] fields( otel.kind = ?SpanKind::Server, ) @@ -402,77 +298,37 @@ impl EngineApiServer for RollupBoostServer { ))); } - let parent_span = self + let cause = self .payload_trace_context .retrieve_by_payload_id(&payload_id) .await; - let span = parent_span.clone().map(|span| { - self.payload_trace_context.tracer.start_with_context( - "get_payload", - &Context::current().with_remote_span_context(span.span_context().clone()), - ) - }); - - // Get the external builder's payload ID that corresponds to our local payload ID - // If no mapping exists, fallback to local ID - let external_payload_id = self - .payload_trace_context - .get_external_payload_id(&payload_id) - .await - .unwrap_or(payload_id); - - if external_payload_id == PayloadId::default() { - info!( - message = - "no-tx-pool call and builder did not build a block, defer to L2 result" - ); - - // Note: We are sending an error here to return early from the future and this error - // is not logged later on, so it's not causing issues. However, we should find a better - // way to handle this case in the future rather than relying on this error being silently - // ignored. - return Err(ClientError::Call(ErrorObject::owned( - INVALID_REQUEST_CODE, - "Builder payload was not valid", - None::, - ))); - } let builder = self.builder_client.clone(); - let (payload, source) = builder.get_payload_v3(external_payload_id).await.map_err(|e| { - error!(message = "error calling get_payload_v3 from builder", "url" = ?builder.auth_rpc, "error" = %e, "local_payload_id" = %payload_id, "external_payload_id" = %external_payload_id); + let (payload, source) = builder.get_payload_v3(payload_id).await.map_err(|e| { + error!(message = "error calling get_payload_v3 from builder", "url" = ?builder.auth_rpc, "error" = %e, "local_payload" = %payload_id); e })?; let block_hash = ExecutionPayload::from(payload.clone().execution_payload).block_hash(); - info!(message = "received payload from builder", "local_payload_id" = %payload_id, "external_payload_id" = %external_payload_id, "block_hash" = %block_hash); + info!(message = "received payload from builder", "payload_id" = %payload_id, "block_hash" = %block_hash); // Send the payload to the local execution engine with engine_newPayload to validate the block from the builder. // Otherwise, we do not want to risk the network to a halt since op-node will not be able to propose the block. // If validation fails, return the local block since that one has already been validated. let payload_status = self.l2_client.auth_client.new_payload_v3(payload.execution_payload.clone(), vec![], payload.parent_beacon_block_root).await.map_err(|e| { - error!(message = "error calling new_payload_v3 to validate builder payload", "url" = ?self.l2_client.auth_rpc, "error" = %e, "local_payload_id" = %payload_id, "external_payload_id" = %external_payload_id); + error!(message = "error calling new_payload_v3 to validate builder payload", "url" = ?self.l2_client.auth_rpc, "error" = %e, "payload_id" = %payload_id); e })?; - if let Some(mut s) = span { - s.end(); - }; - if let Some(mut parent) = parent_span { - let parent = Arc::get_mut(&mut parent); - if let Some(parent) = parent { - parent.end(); - } - }; if payload_status.is_invalid() { - error!(message = "builder payload was not valid", "url" = ?builder.auth_rpc, "payload_status" = %payload_status.status, "local_payload_id" = %payload_id, "external_payload_id" = %external_payload_id); + error!(message = "builder payload was not valid", "url" = ?builder.auth_rpc, "payload_status" = %payload_status.status, "payload_id" = %payload_id); Err(ClientError::Call(ErrorObject::owned( INVALID_REQUEST_CODE, "Builder payload was not valid", None::, ))) } else { - info!(message = "received payload status from local execution engine validating builder payload", "local_payload_id" = %payload_id, "external_payload_id" = %external_payload_id); + info!(message = "received payload status from local execution engine validating builder payload", "payload_id" = %payload_id); Ok((payload, source)) } }); @@ -524,22 +380,16 @@ impl EngineApiServer for RollupBoostServer { // async call to builder to sync the builder node let execution_mode = self.execution_mode.lock().await; if self.boost_sync && !execution_mode.is_disabled() { - let parent_spans = self + if let Some(causes) = self .payload_trace_context .retrieve_by_parent_hash(&parent_hash) - .await; - let spans: Option> = parent_spans.as_ref().map(|spans| { - spans - .iter() - .map(|span| { - self.payload_trace_context.tracer.start_with_context( - "new_payload", - &Context::current() - .with_remote_span_context(span.span_context().clone()), - ) - }) - .collect() - }); + .await { + + for cause in causes { + tracing::Span::current().follows_from(cause); + } + } + self.payload_trace_context .remove_by_parent_hash(&parent_hash) .await; @@ -559,9 +409,6 @@ impl EngineApiServer for RollupBoostServer { error!(message = "error calling new_payload_v3 to builder", "url" = ?builder.auth_rpc, "error" = %e, "block_hash" = %block_hash); e }); - if let Some(mut spans) = spans { - spans.iter_mut().for_each(|s| s.end()); - }; }); } self.l2_client @@ -570,6 +417,67 @@ impl EngineApiServer for RollupBoostServer { } } + +impl RollupBoostServer { + #[instrument(skip_all, + fields( + otel.kind = ?SpanKind::Client, + ) + )] + async fn send_to_builder( + &self, + payload_attributes: Option, + l2_response: ForkchoiceUpdated, + fork_choice_state: ForkchoiceState, + ) { + + // async call to builder to trigger payload building and sync + let builder_client = self.builder_client.clone(); + let attr = payload_attributes.clone(); + let payload_trace_context = self.payload_trace_context.clone(); + let local_payload_id = l2_response.payload_id; + tokio::spawn(async move { + match builder_client + .fork_choice_updated_v3(fork_choice_state, attr) + .await + { + Ok(response) => { + let external_payload_id = response.payload_id; + if response.is_invalid() { + let payload_id_str = external_payload_id + .map(|id| id.to_string()) + .unwrap_or_default(); + error!(message = "builder rejected fork_choice_updated_v3 with attributes", "url" = ?builder_client.auth_rpc, "payload_id" = payload_id_str, "validation_error" = %response.payload_status.status); + } else if let Some(external_id) = external_payload_id { + info!( + message = "called fork_choice_updated_v3 to builder with payload attributes", + "url" = ?builder_client.auth_rpc, + "payload_status" = %response.payload_status.status, + "payload_id" = %external_id + ); + } else { + info!( + message = "called fork_choice_updated_v3 to builder without payload attributes", + "url" = ?builder_client.auth_rpc, + "payload_status" = %response.payload_status.status + ); + } + } + + Err(e) => { + error!( + message = "error calling fork_choice_updated_v3 to builder", + "url" = ?builder_client.auth_rpc, + "error" = %e, + "head_block_hash" = %fork_choice_state.head_block_hash + ); + } + } + }); + + } +} + #[cfg(test)] mod tests { @@ -735,7 +643,6 @@ mod tests { engine_success().await; boost_sync_enabled().await; builder_payload_err().await; - test_local_external_payload_ids_different().await; test_local_external_payload_ids_same().await; } @@ -984,53 +891,4 @@ mod tests { test_harness.cleanup().await; } - - async fn test_local_external_payload_ids_different() { - let local_id = PayloadId::new([1, 2, 3, 4, 5, 6, 7, 8]); - let external_id = PayloadId::new([9, 9, 9, 9, 9, 9, 9, 9]); - - let mut l2_mock = MockEngineServer::new(); - let mut fcu_resp = - ForkchoiceUpdated::new(PayloadStatus::from_status(PayloadStatusEnum::Valid)); - fcu_resp.payload_id = Some(local_id); - l2_mock.fcu_response = Ok(fcu_resp); - - let mut builder_mock = MockEngineServer::new(); - builder_mock.override_payload_id = Some(external_id); - - let test_harness = - TestHarness::new(true, Some(l2_mock.clone()), Some(builder_mock.clone())).await; - - // Test FCU call - let fcu = ForkchoiceState { - head_block_hash: B256::random(), - safe_block_hash: B256::random(), - finalized_block_hash: B256::random(), - }; - let fcu_response = test_harness.client.fork_choice_updated_v3(fcu, None).await; - assert!(fcu_response.is_ok()); - - // wait for builder to observe the FCU call - sleep(std::time::Duration::from_millis(100)).await; - - assert_eq!(l2_mock.fcu_requests.lock().unwrap().len(), 1); - assert_eq!(builder_mock.fcu_requests.lock().unwrap().len(), 1); - - // Test getPayload call with local->external mapping - let get_res = test_harness.client.get_payload_v3(local_id).await; - assert!(get_res.is_ok(), "getPayload should succeed"); - - // wait for builder to observe the getPayload call - sleep(std::time::Duration::from_millis(100)).await; - - let builder_gp = builder_mock.get_payload_requests.lock().unwrap(); - assert_eq!(builder_gp.len(), 1); - assert_eq!(builder_gp[0], external_id); - - let l2_gp = l2_mock.get_payload_requests.lock().unwrap(); - assert_eq!(l2_gp.len(), 1); - assert_eq!(l2_gp[0], local_id); - - test_harness.cleanup().await; - } } diff --git a/src/tracing.rs b/src/tracing.rs index a2e7a428..9a10cfe5 100644 --- a/src/tracing.rs +++ b/src/tracing.rs @@ -1,5 +1,3 @@ -use std::str::FromStr; - use eyre::Context as _; use metrics::histogram; use opentelemetry::trace::TracerProvider as _; @@ -11,10 +9,11 @@ use tracing::level_filters::LevelFilter; use tracing_opentelemetry::OpenTelemetryLayer; use tracing_subscriber::filter::Targets; use tracing_subscriber::layer::SubscriberExt; -use tracing_subscriber::{EnvFilter, Layer}; +use tracing_subscriber::Layer; use crate::{Args, LogFormat}; +/// Custom span processor that records span durations as histograms #[derive(Debug)] struct MetricsSpanProcessor; @@ -27,15 +26,20 @@ impl SpanProcessor for MetricsSpanProcessor { .duration_since(span.start_time) .unwrap_or_default(); - let labels = span - .attributes - .iter() - .map(|kv| (kv.key.to_string(), kv.value.to_string())) - .chain(std::iter::once(( - "span_kind".to_string(), - format!("{:?}", span.span_kind), - ))) - .collect::>(); + // Add custom labels + let mut labels = vec![("span_kind", format!("{:?}", span.span_kind))]; + + if span.name.starts_with("fork_choice_update") { + let with_attributes = span + .attributes + .iter() + .find(|e| e.key.as_str() == "has_attributes") + .map(|e| e.value.as_str()); + + if let Some(with_attributes) = with_attributes { + labels.push(("has_attributes", with_attributes.to_string())); + } + } histogram!(format!("{}_duration", span.name), &labels).record(duration); } From 6510a9c3f54b7cff62e3358cbb652806f8c24a88 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Wed, 12 Mar 2025 23:29:37 -0700 Subject: [PATCH 08/23] cleanup --- src/client.rs | 70 ++++++++++++++++++++++---------------------------- src/main.rs | 22 ++++------------ src/metrics.rs | 58 ----------------------------------------- src/server.rs | 40 +++++++++++------------------ src/tracing.rs | 9 +------ 5 files changed, 51 insertions(+), 148 deletions(-) diff --git a/src/client.rs b/src/client.rs index 78aeecb2..9741fab2 100644 --- a/src/client.rs +++ b/src/client.rs @@ -1,5 +1,4 @@ use crate::auth_layer::{AuthClientLayer, AuthClientService}; -use crate::metrics::ClientMetrics; use crate::server::{EngineApiClient, PayloadSource}; use alloy_primitives::B256; use alloy_rpc_types_engine::{ @@ -7,18 +6,19 @@ use alloy_rpc_types_engine::{ PayloadId, PayloadStatus, }; use clap::{arg, Parser}; -use http::{StatusCode, Uri}; +use http::{ Uri}; use jsonrpsee::core::{ClientError, RpcResult}; use jsonrpsee::http_client::transport::HttpBackend; use jsonrpsee::http_client::{HttpClient, HttpClientBuilder}; use jsonrpsee::types::ErrorCode; use op_alloy_rpc_types_engine::{OpExecutionPayloadEnvelopeV3, OpPayloadAttributes}; +use opentelemetry::trace::SpanKind; use paste::paste; use std::path::PathBuf; use std::sync::Arc; -use std::time::{Duration, Instant}; +use std::time::Duration; use thiserror::Error; -use tracing::error; +use tracing::{error, instrument}; #[derive(Error, Debug)] pub enum ExecutionClientError { @@ -40,8 +40,6 @@ pub struct ExecutionClient { pub auth_client: Arc>>, /// Uri of the RPC server for authenticated Engine API calls pub auth_rpc: Uri, - /// Metrics for the client - pub metrics: Option>, /// The source of the payload pub payload_source: PayloadSource, } @@ -52,7 +50,6 @@ impl ExecutionClient { auth_rpc: Uri, auth_rpc_jwt_secret: JwtSecret, timeout: u64, - metrics: Option>, payload_source: PayloadSource, ) -> Result { let auth_layer = AuthClientLayer::new(auth_rpc_jwt_secret); @@ -64,19 +61,23 @@ impl ExecutionClient { Ok(Self { auth_client: Arc::new(auth_client), auth_rpc, - metrics, payload_source, }) } + #[instrument(skip_all, + err, + fields( + otel.kind = ?SpanKind::Client, + target = self.payload_source.to_string(), + ) + )] pub async fn fork_choice_updated_v3( &self, fork_choice_state: ForkchoiceState, payload_attributes: Option, ) -> RpcResult { - let start = Instant::now(); - let response = self - .auth_client + self.auth_client .fork_choice_updated_v3(fork_choice_state, payload_attributes.clone()) .await .map_err(|e| match e { @@ -90,21 +91,20 @@ impl ExecutionClient { ); ErrorCode::InternalError.into() } - }); - if let Some(metrics) = &self.metrics { - metrics - .record_fork_choice_updated_v3(start.elapsed(), self.get_response_code(&response)); - } - response + }) } + #[instrument(skip_all, + fields( + otel.kind = ?SpanKind::Client, + target = self.payload_source.to_string(), + ) + )] pub async fn get_payload_v3( &self, payload_id: PayloadId, ) -> RpcResult<(OpExecutionPayloadEnvelopeV3, PayloadSource)> { - let start = Instant::now(); - let response = self - .auth_client + self.auth_client .get_payload_v3(payload_id) .await .map(|payload| (payload, self.payload_source.clone())) @@ -118,13 +118,16 @@ impl ExecutionClient { ); ErrorCode::InternalError.into() } - }); - if let Some(metrics) = &self.metrics { - metrics.record_get_payload_v3(start.elapsed(), self.get_response_code(&response)); - } - response + }) } + #[instrument(skip_all, + err + fields( + otel.kind = ?SpanKind::Client, + target = self.payload_source.to_string(), + ) + )] pub async fn new_payload_v3( &self, payload: ExecutionPayloadV3, @@ -133,9 +136,7 @@ impl ExecutionClient { ) -> RpcResult { let execution_payload = ExecutionPayload::from(payload.clone()); let block_hash = execution_payload.block_hash(); - let start = Instant::now(); - let response = self - .auth_client + self.auth_client .new_payload_v3(payload, versioned_hashes, parent_beacon_block_root) .await .map_err(|e| match e { @@ -149,18 +150,7 @@ impl ExecutionClient { ); ErrorCode::InternalError.into() } - }); - if let Some(metrics) = &self.metrics { - metrics.record_new_payload_v3(start.elapsed(), self.get_response_code(&response)); - } - response - } - - fn get_response_code(&self, response: &RpcResult) -> String { - match response { - Ok(_) => StatusCode::OK.to_string(), - Err(e) => e.code().to_string(), - } + }) } } diff --git a/src/main.rs b/src/main.rs index 21506a49..aa32dcfd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,8 +3,8 @@ use ::tracing::{error, info, Level}; use clap::{arg, Parser, Subcommand}; use client::{BuilderArgs, ExecutionClient, L2ClientArgs}; use debug_api::DebugClient; -use metrics::{init_metrics, ClientMetrics}; -use std::{net::SocketAddr, sync::Arc}; +use metrics::init_metrics; +use std::net::SocketAddr; use tracing::init_tracing; use alloy_rpc_types_engine::JwtSecret; @@ -182,16 +182,10 @@ async fn main() -> eyre::Result<()> { bail!("Missing L2 Client JWT secret"); }; - let l2_metrics = if args.metrics { - Some(Arc::new(ClientMetrics::new(&PayloadSource::L2))) - } else { - None - }; let l2_client = ExecutionClient::new( l2_client_args.l2_url.clone(), l2_auth_jwt, l2_client_args.l2_timeout, - l2_metrics, PayloadSource::L2, )?; @@ -204,17 +198,10 @@ async fn main() -> eyre::Result<()> { bail!("Missing Builder JWT secret"); }; - let builder_metrics = if args.metrics { - Some(Arc::new(ClientMetrics::new(&PayloadSource::Builder))) - } else { - None - }; - let builder_client = ExecutionClient::new( builder_args.builder_url.clone(), builder_auth_jwt, builder_args.builder_timeout, - builder_metrics, PayloadSource::Builder, )?; @@ -336,6 +323,7 @@ mod tests { use reth_rpc_layer::{AuthLayer, JwtAuthValidator}; use std::result::Result; use std::str::FromStr; + use std::sync::Arc; use super::*; @@ -358,7 +346,7 @@ mod tests { let secret = JwtSecret::from_hex(SECRET).unwrap(); let auth_rpc = Uri::from_str(&format!("http://{}:{}", AUTH_ADDR, AUTH_PORT)).unwrap(); - let client = ExecutionClient::new(auth_rpc, secret, 1000, None, PayloadSource::L2).unwrap(); + let client = ExecutionClient::new(auth_rpc, secret, 1000, PayloadSource::L2).unwrap(); let response = send_request(client.auth_client).await; assert!(response.is_ok()); assert_eq!(response.unwrap(), "You are the dark lord"); @@ -368,7 +356,7 @@ mod tests { async fn invalid_jwt() { let secret = JwtSecret::random(); let auth_rpc = Uri::from_str(&format!("http://{}:{}", AUTH_ADDR, AUTH_PORT)).unwrap(); - let client = ExecutionClient::new(auth_rpc, secret, 1000, None, PayloadSource::L2).unwrap(); + let client = ExecutionClient::new(auth_rpc, secret, 1000, PayloadSource::L2).unwrap(); let response = send_request(client.auth_client).await; assert!(response.is_err()); assert!(matches!( diff --git a/src/metrics.rs b/src/metrics.rs index 6eb3565b..ad698743 100644 --- a/src/metrics.rs +++ b/src/metrics.rs @@ -30,34 +30,6 @@ pub struct ServerMetrics { pub l2_rpc_response_count: Counter, } -#[derive(Metrics)] -#[metrics(scope = "rpc")] -pub struct ClientMetrics { - #[metric(describe = "Latency for client `engine_newPayloadV3` call")] - #[allow(dead_code)] - pub new_payload_v3: Histogram, - - #[metric(describe = "Number of client `engine_newPayloadV3` responses", labels = ["code"])] - #[allow(dead_code)] - pub new_payload_v3_response_count: Counter, - - #[metric(describe = "Latency for client `engine_getPayloadV3` call")] - #[allow(dead_code)] - pub get_payload_v3: Histogram, - - #[metric(describe = "Number of client `engine_getPayloadV3` responses", labels = ["code"])] - #[allow(dead_code)] - pub get_payload_v3_response_count: Counter, - - #[metric(describe = "Latency for client `engine_forkChoiceUpdatedV3` call")] - #[allow(dead_code)] - pub fork_choice_updated_v3: Histogram, - - #[metric(describe = "Number of client `engine_forkChoiceUpdatedV3` responses", labels = ["code"])] - #[allow(dead_code)] - pub fork_choice_updated_v3_response_count: Counter, -} - impl ServerMetrics { pub fn increment_blocks_created(&self, source: &PayloadSource) { counter!("rpc.blocks_created", "source" => source.to_string()).increment(1); @@ -100,36 +72,6 @@ impl ServerMetrics { } } -impl ClientMetrics { - pub fn new(source: &PayloadSource) -> Self { - Self { - new_payload_v3: histogram!("rpc.new_payload_v3", "target" => source.to_string()), - get_payload_v3: histogram!("rpc.get_payload_v3", "target" => source.to_string()), - fork_choice_updated_v3: histogram!("rpc.fork_choice_updated_v3", "target" => source.to_string()), - new_payload_v3_response_count: counter!("rpc.new_payload_v3_response_count"), - get_payload_v3_response_count: counter!("rpc.get_payload_v3_response_count"), - fork_choice_updated_v3_response_count: counter!( - "rpc.fork_choice_updated_v3_response_count" - ), - } - } - - pub fn record_new_payload_v3(&self, latency: Duration, code: String) { - self.new_payload_v3.record(latency.as_secs_f64()); - counter!("rpc.new_payload_v3_response_count", "code" => code).increment(1); - } - - pub fn record_get_payload_v3(&self, latency: Duration, code: String) { - self.get_payload_v3.record(latency.as_secs_f64()); - counter!("rpc.get_payload_v3_response_count", "code" => code).increment(1); - } - - pub fn record_fork_choice_updated_v3(&self, latency: Duration, code: String) { - self.fork_choice_updated_v3.record(latency.as_secs_f64()); - counter!("rpc.fork_choice_updated_v3_response_count", "code" => code).increment(1); - } -} - pub(crate) fn init_metrics(args: &Args) -> Result>> { if args.metrics { let recorder = PrometheusBuilder::new().build_recorder(); diff --git a/src/server.rs b/src/server.rs index 7fc6f15c..bff3911b 100644 --- a/src/server.rs +++ b/src/server.rs @@ -16,7 +16,7 @@ use jsonrpsee::types::ErrorObject; use jsonrpsee::RpcModule; use lru::LruCache; use op_alloy_rpc_types_engine::{OpExecutionPayloadEnvelopeV3, OpPayloadAttributes}; -use opentelemetry::trace::{ SpanKind}; +use opentelemetry::trace::SpanKind; use serde::{Deserialize, Serialize}; use tokio::sync::Mutex; @@ -249,11 +249,7 @@ impl EngineApiServer for RollupBoostServer { let trace_id = tracing::Span::current().id(); if let (Some(payload_id), Some(trace)) = (l2_response.payload_id, trace_id) { self.payload_trace_context - .store( - payload_id, - fork_choice_state.head_block_hash, - trace, - ) + .store(payload_id, fork_choice_state.head_block_hash, trace) .await; } @@ -264,7 +260,8 @@ impl EngineApiServer for RollupBoostServer { payload_attributes, l2_response.clone(), fork_choice_state.clone(), - ).await; + ) + .await; } else { info!(message = "no payload attributes provided or no_tx_pool is set", "head_block_hash" = %fork_choice_state.head_block_hash); } @@ -273,7 +270,6 @@ impl EngineApiServer for RollupBoostServer { } #[instrument(skip_all, - follow_from = [causes] fields( otel.kind = ?SpanKind::Server, ) @@ -298,10 +294,13 @@ impl EngineApiServer for RollupBoostServer { ))); } - let cause = self + if let Some(cause) = self .payload_trace_context .retrieve_by_payload_id(&payload_id) - .await; + .await + { + tracing::Span::current().follows_from(cause); + } let builder = self.builder_client.clone(); let (payload, source) = builder.get_payload_v3(payload_id).await.map_err(|e| { @@ -383,8 +382,8 @@ impl EngineApiServer for RollupBoostServer { if let Some(causes) = self .payload_trace_context .retrieve_by_parent_hash(&parent_hash) - .await { - + .await + { for cause in causes { tracing::Span::current().follows_from(cause); } @@ -417,7 +416,6 @@ impl EngineApiServer for RollupBoostServer { } } - impl RollupBoostServer { #[instrument(skip_all, fields( @@ -430,7 +428,6 @@ impl RollupBoostServer { l2_response: ForkchoiceUpdated, fork_choice_state: ForkchoiceState, ) { - // async call to builder to trigger payload building and sync let builder_client = self.builder_client.clone(); let attr = payload_attributes.clone(); @@ -474,7 +471,6 @@ impl RollupBoostServer { } } }); - } } @@ -583,19 +579,13 @@ mod tests { let l2_auth_rpc = Uri::from_str(&format!("http://{}:{}", HOST, L2_PORT)).unwrap(); let l2_client = - ExecutionClient::new(l2_auth_rpc, jwt_secret, 2000, None, PayloadSource::L2) - .unwrap(); + ExecutionClient::new(l2_auth_rpc, jwt_secret, 2000, PayloadSource::L2).unwrap(); let builder_auth_rpc = Uri::from_str(&format!("http://{}:{}", HOST, BUILDER_PORT)).unwrap(); - let builder_client = ExecutionClient::new( - builder_auth_rpc, - jwt_secret, - 2000, - None, - PayloadSource::Builder, - ) - .unwrap(); + let builder_client = + ExecutionClient::new(builder_auth_rpc, jwt_secret, 2000, PayloadSource::Builder) + .unwrap(); let rollup_boost_client = RollupBoostServer::new( l2_client, diff --git a/src/tracing.rs b/src/tracing.rs index 9a10cfe5..31de8a16 100644 --- a/src/tracing.rs +++ b/src/tracing.rs @@ -92,18 +92,11 @@ pub(crate) fn init_tracing(args: &Args) -> eyre::Result<()> { let provider = provider_builder.build(); let tracer = provider.tracer(env!("CARGO_PKG_NAME")); - // Set global tracer provider for use with opentelemetry api - global::set_tracer_provider(provider); - let trace_filter = Targets::new() .with_default(LevelFilter::OFF) .with_target(&filter_name, LevelFilter::TRACE); - let registry = registry.with( - OpenTelemetryLayer::new(tracer) - .with_level(true) - .with_filter(trace_filter), - ); + let registry = registry.with(OpenTelemetryLayer::new(tracer).with_filter(trace_filter)); match args.log_format { LogFormat::Json => { From 9907864cf64415231eeaa83a31fe693b097687c4 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Thu, 13 Mar 2025 00:14:53 -0700 Subject: [PATCH 09/23] cleanup --- src/client.rs | 3 +-- src/server.rs | 18 ++++++++---------- src/tracing.rs | 13 +++++++++++-- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/client.rs b/src/client.rs index 9741fab2..cbeb51e1 100644 --- a/src/client.rs +++ b/src/client.rs @@ -6,7 +6,7 @@ use alloy_rpc_types_engine::{ PayloadId, PayloadStatus, }; use clap::{arg, Parser}; -use http::{ Uri}; +use http::Uri; use jsonrpsee::core::{ClientError, RpcResult}; use jsonrpsee::http_client::transport::HttpBackend; use jsonrpsee::http_client::{HttpClient, HttpClientBuilder}; @@ -66,7 +66,6 @@ impl ExecutionClient { } #[instrument(skip_all, - err, fields( otel.kind = ?SpanKind::Client, target = self.payload_source.to_string(), diff --git a/src/server.rs b/src/server.rs index bff3911b..bf11bd40 100644 --- a/src/server.rs +++ b/src/server.rs @@ -229,24 +229,26 @@ impl EngineApiServer for RollupBoostServer { .fork_choice_updated_v3(fork_choice_state, payload_attributes.clone()) .await?; - let payload_id = l2_response.payload_id; + let span = tracing::Span::current(); + if let Some(payload_id) = l2_response.payload_id { + span.record("payload_id", payload_id.to_string()); + } // TODO: Use _is_block_building_call to log the correct message during the async call to builder - let (should_send_to_builder, _is_block_building_call) = + let should_send_to_builder = if let Some(attr) = payload_attributes.as_ref() { // payload attributes are present. It is a FCU call to start block building // Do not send to builder if no_tx_pool is set, meaning that the CL node wants // a deterministic block without txs. We let the fallback EL node compute those. - let use_tx_pool = !attr.no_tx_pool.unwrap_or_default(); - (use_tx_pool, true) + !attr.no_tx_pool.unwrap_or_default() } else { // no payload attributes. It is a FCU call to lock the head block // previously synced with the new_payload_v3 call. Only send to builder if boost_sync is enabled - (self.boost_sync, false) + self.boost_sync }; let execution_mode = self.execution_mode.lock().await; - let trace_id = tracing::Span::current().id(); + let trace_id = span.id(); if let (Some(payload_id), Some(trace)) = (l2_response.payload_id, trace_id) { self.payload_trace_context .store(payload_id, fork_choice_state.head_block_hash, trace) @@ -258,7 +260,6 @@ impl EngineApiServer for RollupBoostServer { } else if should_send_to_builder { self.send_to_builder( payload_attributes, - l2_response.clone(), fork_choice_state.clone(), ) .await; @@ -425,14 +426,11 @@ impl RollupBoostServer { async fn send_to_builder( &self, payload_attributes: Option, - l2_response: ForkchoiceUpdated, fork_choice_state: ForkchoiceState, ) { // async call to builder to trigger payload building and sync let builder_client = self.builder_client.clone(); let attr = payload_attributes.clone(); - let payload_trace_context = self.payload_trace_context.clone(); - let local_payload_id = l2_response.payload_id; tokio::spawn(async move { match builder_client .fork_choice_updated_v3(fork_choice_state, attr) diff --git a/src/tracing.rs b/src/tracing.rs index 31de8a16..326632e1 100644 --- a/src/tracing.rs +++ b/src/tracing.rs @@ -1,6 +1,6 @@ use eyre::Context as _; use metrics::histogram; -use opentelemetry::trace::TracerProvider as _; +use opentelemetry::trace::{Status, TracerProvider as _}; use opentelemetry::{global, KeyValue}; use opentelemetry_otlp::WithExportConfig; use opentelemetry_sdk::trace::SpanProcessor; @@ -26,8 +26,17 @@ impl SpanProcessor for MetricsSpanProcessor { .duration_since(span.start_time) .unwrap_or_default(); + let status = match span.status { + Status::Ok => "ok", + Status::Error { .. } => "error", + Status::Unset => "unset", + }; + // Add custom labels - let mut labels = vec![("span_kind", format!("{:?}", span.span_kind))]; + let mut labels = vec![ + ("span_kind", format!("{:?}", span.span_kind)), + ("status", status.into()), + ]; if span.name.starts_with("fork_choice_update") { let with_attributes = span From 94256b63187f07fd7a36dfaa67b0a4972c11a886 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Thu, 13 Mar 2025 18:34:32 -0700 Subject: [PATCH 10/23] cleanup logging --- src/server.rs | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/server.rs b/src/server.rs index 49b5aaeb..0f80ef2c 100644 --- a/src/server.rs +++ b/src/server.rs @@ -232,16 +232,17 @@ impl EngineApiServer for RollupBoostServer { } // TODO: Use _is_block_building_call to log the correct message during the async call to builder - let should_send_to_builder = + let (should_send_to_builder, _is_block_building_call) = if let Some(attr) = payload_attributes.as_ref() { // payload attributes are present. It is a FCU call to start block building // Do not send to builder if no_tx_pool is set, meaning that the CL node wants // a deterministic block without txs. We let the fallback EL node compute those. - !attr.no_tx_pool.unwrap_or_default() + let use_tx_pool = !attr.no_tx_pool.unwrap_or_default(); + (use_tx_pool, true) } else { // no payload attributes. It is a FCU call to lock the head block // previously synced with the new_payload_v3 call. Only send to builder if boost_sync is enabled - self.boost_sync + (self.boost_sync, false) }; let execution_mode = self.execution_mode(); @@ -299,31 +300,31 @@ impl EngineApiServer for RollupBoostServer { } let builder = self.builder_client.clone(); - let (payload, source) = builder.get_payload_v3(payload_id).await.map_err(|e| { - error!(message = "error calling get_payload_v3 from builder", "url" = ?builder.auth_rpc, "error" = %e, "local_payload" = %payload_id); - e + let (payload, source) = builder.get_payload_v3(payload_id).await.map_err(|error| { + error!(message = "error calling get_payload_v3 from builder", "url" = ?builder.auth_rpc, %error, %payload_id); + error })?; let block_hash = ExecutionPayload::from(payload.clone().execution_payload).block_hash(); - info!(message = "received payload from builder", "payload_id" = %payload_id, "block_hash" = %block_hash); + info!(message = "received payload from builder", %payload_id, %block_hash); // Send the payload to the local execution engine with engine_newPayload to validate the block from the builder. // Otherwise, we do not want to risk the network to a halt since op-node will not be able to propose the block. // If validation fails, return the local block since that one has already been validated. - let payload_status = self.l2_client.auth_client.new_payload_v3(payload.execution_payload.clone(), vec![], payload.parent_beacon_block_root).await.map_err(|e| { - error!(message = "error calling new_payload_v3 to validate builder payload", "url" = ?self.l2_client.auth_rpc, "error" = %e, "payload_id" = %payload_id); - e + let payload_status = self.l2_client.auth_client.new_payload_v3(payload.execution_payload.clone(), vec![], payload.parent_beacon_block_root).await.map_err(|error| { + error!(message = "error calling new_payload_v3 to validate builder payload", "url" = ?self.l2_client.auth_rpc, %error, %payload_id); + error })?; if payload_status.is_invalid() { - error!(message = "builder payload was not valid", "url" = ?builder.auth_rpc, "payload_status" = %payload_status.status, "payload_id" = %payload_id); + error!(message = "builder payload was not valid", "url" = ?builder.auth_rpc, "payload_status" = %payload_status.status, %payload_id); Err(ClientError::Call(ErrorObject::owned( INVALID_REQUEST_CODE, "Builder payload was not valid", None::, ))) } else { - info!(message = "received payload status from local execution engine validating builder payload", "payload_id" = %payload_id); + info!(message = "received payload status from local execution engine validating builder payload", %payload_id); Ok((payload, source)) } }); From 84a44af68856fb11311d5d3ce7b06bd49e71993a Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Thu, 13 Mar 2025 20:41:46 -0700 Subject: [PATCH 11/23] rpc client cleanup --- src/client.rs | 107 +++++++++++++++++--------------- src/main.rs | 15 +++-- src/metrics.rs | 8 +-- src/server.rs | 161 +++++++++++++++++-------------------------------- 4 files changed, 125 insertions(+), 166 deletions(-) diff --git a/src/client.rs b/src/client.rs index cbeb51e1..a58f5ac5 100644 --- a/src/client.rs +++ b/src/client.rs @@ -7,10 +7,10 @@ use alloy_rpc_types_engine::{ }; use clap::{arg, Parser}; use http::Uri; -use jsonrpsee::core::{ClientError, RpcResult}; +// use jsonrpsee::core::ClientError; use jsonrpsee::http_client::transport::HttpBackend; use jsonrpsee::http_client::{HttpClient, HttpClientBuilder}; -use jsonrpsee::types::ErrorCode; +use jsonrpsee::types::ErrorObjectOwned; use op_alloy_rpc_types_engine::{OpExecutionPayloadEnvelopeV3, OpPayloadAttributes}; use opentelemetry::trace::SpanKind; use paste::paste; @@ -20,6 +20,33 @@ use std::time::Duration; use thiserror::Error; use tracing::{error, instrument}; +pub(crate) type ClientResult = Result; + +#[derive(Error, Debug)] +pub(crate) enum ClientError { + #[error(transparent)] + Jsonrpsee(#[from] jsonrpsee::core::client::Error), + #[error("Invalid payload: {0}")] + InvalidPayload(String) +} + +impl From for ErrorObjectOwned { + fn from(err: ClientError) -> Self { + match err { + ClientError::Jsonrpsee(err) => { + match err { + jsonrpsee::core::ClientError::Call(error_object) => error_object, + e => ErrorObjectOwned::owned(0, e.to_string(), Option::<()>::None) +, + } + }, + e => { + ErrorObjectOwned::owned(0, e.to_string(), Option::<()>::None) + } + } + } +} + #[derive(Error, Debug)] pub enum ExecutionClientError { #[error(transparent)] @@ -66,58 +93,51 @@ impl ExecutionClient { } #[instrument(skip_all, + err fields( otel.kind = ?SpanKind::Client, target = self.payload_source.to_string(), + head_block_hash = %fork_choice_state.head_block_hash, + url = %self.auth_rpc, + payload_id ) )] pub async fn fork_choice_updated_v3( &self, fork_choice_state: ForkchoiceState, payload_attributes: Option, - ) -> RpcResult { - self.auth_client + ) -> ClientResult { + let res = self.auth_client .fork_choice_updated_v3(fork_choice_state, payload_attributes.clone()) - .await - .map_err(|e| match e { - ClientError::Call(err) => err, - other_error => { - error!( - message = "error calling fork_choice_updated_v3 for l2 client", - "url" = ?self.auth_rpc, - "error" = %other_error, - "head_block_hash" = %fork_choice_state.head_block_hash, - ); - ErrorCode::InternalError.into() - } - }) + .await?; + + if let Some(payload_id) = res.payload_id { + tracing::Span::current().record("payload_id", payload_id.to_string()); + } + + if res.is_invalid() { + return Err(ClientError::InvalidPayload(res.payload_status.status.to_string())) + } + + Ok(res) } - #[instrument(skip_all, + #[instrument(skip(self), + err, fields( otel.kind = ?SpanKind::Client, target = self.payload_source.to_string(), + url = %self.auth_rpc, + %payload_id, ) )] pub async fn get_payload_v3( &self, payload_id: PayloadId, - ) -> RpcResult<(OpExecutionPayloadEnvelopeV3, PayloadSource)> { - self.auth_client + ) -> ClientResult { + Ok(self.auth_client .get_payload_v3(payload_id) - .await - .map(|payload| (payload, self.payload_source.clone())) - .map_err(|e| match e { - ClientError::Call(err) => err, - other_error => { - error!( - message = "error calling get_payload_v3", - "error" = %other_error, - "payload_id" = %payload_id - ); - ErrorCode::InternalError.into() - } - }) + .await?) } #[instrument(skip_all, @@ -125,6 +145,8 @@ impl ExecutionClient { fields( otel.kind = ?SpanKind::Client, target = self.payload_source.to_string(), + url = %self.auth_rpc, + block_hash, ) )] pub async fn new_payload_v3( @@ -132,24 +154,13 @@ impl ExecutionClient { payload: ExecutionPayloadV3, versioned_hashes: Vec, parent_beacon_block_root: B256, - ) -> RpcResult { + ) -> ClientResult { let execution_payload = ExecutionPayload::from(payload.clone()); let block_hash = execution_payload.block_hash(); - self.auth_client + tracing::Span::current().record("block_hash", block_hash.to_string()); + Ok(self.auth_client .new_payload_v3(payload, versioned_hashes, parent_beacon_block_root) - .await - .map_err(|e| match e { - ClientError::Call(err) => err, - other_error => { - error!( - message = "error calling new_payload_v3", - "url" = ?self.auth_rpc, - "error" = %other_error, - "block_hash" = %block_hash - ); - ErrorCode::InternalError.into() - } - }) + .await?) } } diff --git a/src/main.rs b/src/main.rs index aa32dcfd..aaf8d1fe 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,6 @@ #![allow(clippy::complexity)] -use ::tracing::{error, info, Level}; -use clap::{arg, Parser, Subcommand}; +use ::tracing::{Level, error, info}; +use clap::{Parser, Subcommand, arg}; use client::{BuilderArgs, ExecutionClient, L2ClientArgs}; use debug_api::DebugClient; use metrics::init_metrics; @@ -12,17 +12,17 @@ use dotenv::dotenv; use eyre::bail; use http::StatusCode; use hyper::service::service_fn; -use hyper::{server::conn::http1, Request, Response}; +use hyper::{Request, Response, server::conn::http1}; use hyper_util::rt::TokioIo; +use jsonrpsee::RpcModule; use jsonrpsee::http_client::HttpBody; use jsonrpsee::server::Server; -use jsonrpsee::RpcModule; use metrics_exporter_prometheus::PrometheusHandle; use proxy::ProxyLayer; use server::{ExecutionMode, PayloadSource, RollupBoostServer}; use tokio::net::TcpListener; -use tokio::signal::unix::{signal as unix_signal, SignalKind}; +use tokio::signal::unix::{SignalKind, signal as unix_signal}; mod auth_layer; mod client; @@ -214,7 +214,6 @@ async fn main() -> eyre::Result<()> { l2_client, builder_client, boost_sync_enabled, - metrics.clone(), args.execution_mode, ); @@ -310,10 +309,10 @@ mod tests { use crate::auth_layer::AuthClientService; use crate::server::PayloadSource; use alloy_rpc_types_engine::JwtSecret; + use jsonrpsee::RpcModule; + use jsonrpsee::http_client::HttpClient; use jsonrpsee::http_client::transport::Error as TransportError; use jsonrpsee::http_client::transport::HttpBackend; - use jsonrpsee::http_client::HttpClient; - use jsonrpsee::RpcModule; use jsonrpsee::{ core::ClientError, rpc_params, diff --git a/src/metrics.rs b/src/metrics.rs index ad698743..be5b0579 100644 --- a/src/metrics.rs +++ b/src/metrics.rs @@ -1,12 +1,12 @@ use std::{net::SocketAddr, sync::Arc, time::Duration}; use eyre::Result; -use metrics::{counter, histogram, Counter, Histogram}; +use metrics::{Counter, Histogram, counter, histogram}; use metrics_derive::Metrics; use metrics_exporter_prometheus::PrometheusBuilder; use metrics_util::layers::{PrefixLayer, Stack}; -use crate::{init_metrics_server, server::PayloadSource, Args}; +use crate::{Args, init_metrics_server}; #[derive(Metrics)] #[metrics(scope = "rpc")] @@ -31,10 +31,6 @@ pub struct ServerMetrics { } impl ServerMetrics { - pub fn increment_blocks_created(&self, source: &PayloadSource) { - counter!("rpc.blocks_created", "source" => source.to_string()).increment(1); - } - pub fn record_builder_forwarded_call(&self, latency: Duration, method: String) { histogram!("rpc.builder_forwarded_call", "method" => method).record(latency.as_secs_f64()); } diff --git a/src/server.rs b/src/server.rs index 0f80ef2c..8f8d2a91 100644 --- a/src/server.rs +++ b/src/server.rs @@ -1,6 +1,5 @@ -use crate::client::ExecutionClient; +use crate::client::{ClientError, ClientResult, ExecutionClient}; use crate::debug_api::DebugServer; -use crate::metrics::ServerMetrics; use alloy_primitives::B256; use moka::sync::Cache; use opentelemetry::trace::SpanKind; @@ -12,7 +11,7 @@ use alloy_rpc_types_engine::{ PayloadStatus, }; use jsonrpsee::RpcModule; -use jsonrpsee::core::{ClientError, RegisterMethodError, RpcResult, async_trait}; +use jsonrpsee::core::{async_trait, RegisterMethodError, RpcResult}; use jsonrpsee::types::ErrorObject; use jsonrpsee::types::error::INVALID_REQUEST_CODE; use op_alloy_rpc_types_engine::{OpExecutionPayloadEnvelopeV3, OpPayloadAttributes}; @@ -102,10 +101,9 @@ impl ExecutionMode { #[derive(Clone)] pub struct RollupBoostServer { - pub l2_client: ExecutionClient, - pub builder_client: ExecutionClient, + pub l2_client: Arc, + pub builder_client: Arc, pub boost_sync: bool, - pub metrics: Option>, pub payload_trace_context: Arc, execution_mode: Arc>, } @@ -115,14 +113,12 @@ impl RollupBoostServer { l2_client: ExecutionClient, builder_client: ExecutionClient, boost_sync: bool, - metrics: Option>, initial_execution_mode: ExecutionMode, ) -> Self { Self { - l2_client, - builder_client, + l2_client: Arc::new(l2_client), + builder_client: Arc::new(builder_client), boost_sync, - metrics, payload_trace_context: Arc::new(PayloadTraceContext::new()), execution_mode: Arc::new(Mutex::new(initial_execution_mode)), } @@ -187,7 +183,7 @@ pub trait EngineApi { &self, fork_choice_state: ForkchoiceState, payload_attributes: Option, - ) -> RpcResult; + ) -> RpcResult ; #[method(name = "getPayloadV3")] async fn get_payload_v3( @@ -207,6 +203,7 @@ pub trait EngineApi { #[async_trait] impl EngineApiServer for RollupBoostServer { #[instrument(skip_all, + err, fields( otel.kind = ?SpanKind::Server, has_attributes = payload_attributes.is_some(), @@ -255,11 +252,11 @@ impl EngineApiServer for RollupBoostServer { if execution_mode.is_disabled() { debug!(message = "execution mode is disabled, skipping FCU call to builder", "head_block_hash" = %fork_choice_state.head_block_hash); } else if should_send_to_builder { - self.send_to_builder( - payload_attributes, - fork_choice_state.clone(), - ) - .await; + let builder_client = self.builder_client.clone(); + tokio::spawn( async move { + let _ = builder_client.fork_choice_updated_v3(fork_choice_state.clone(), payload_attributes.clone()).await; + } + ); } else { info!(message = "no payload attributes provided or no_tx_pool is set", "head_block_hash" = %fork_choice_state.head_block_hash); } @@ -268,15 +265,16 @@ impl EngineApiServer for RollupBoostServer { } #[instrument(skip_all, + err, fields( otel.kind = ?SpanKind::Server, + %payload_id ) )] async fn get_payload_v3( &self, payload_id: PayloadId, ) -> RpcResult { - info!(message = "received get_payload_v3", "payload_id" = %payload_id); let l2_client_future = self.l2_client.get_payload_v3(payload_id); let builder_client_future = Box::pin(async move { @@ -285,11 +283,11 @@ impl EngineApiServer for RollupBoostServer { info!(message = "dry run mode is enabled, skipping get payload builder call"); // We are in dry run mode, so we do not want to call the builder. - return Err(ClientError::Call(ErrorObject::owned( + return Err(ErrorObject::owned( INVALID_REQUEST_CODE, "Dry run mode is enabled", None::, - ))); + )); } if let Some(cause) = self @@ -300,33 +298,18 @@ impl EngineApiServer for RollupBoostServer { } let builder = self.builder_client.clone(); - let (payload, source) = builder.get_payload_v3(payload_id).await.map_err(|error| { - error!(message = "error calling get_payload_v3 from builder", "url" = ?builder.auth_rpc, %error, %payload_id); - error - })?; - - let block_hash = ExecutionPayload::from(payload.clone().execution_payload).block_hash(); - info!(message = "received payload from builder", %payload_id, %block_hash); + let payload = builder.get_payload_v3(payload_id).await?; // Send the payload to the local execution engine with engine_newPayload to validate the block from the builder. // Otherwise, we do not want to risk the network to a halt since op-node will not be able to propose the block. // If validation fails, return the local block since that one has already been validated. - let payload_status = self.l2_client.auth_client.new_payload_v3(payload.execution_payload.clone(), vec![], payload.parent_beacon_block_root).await.map_err(|error| { - error!(message = "error calling new_payload_v3 to validate builder payload", "url" = ?self.l2_client.auth_rpc, %error, %payload_id); - error - })?; + let payload_status = self.l2_client.new_payload_v3(payload.execution_payload.clone(), vec![], payload.parent_beacon_block_root).await?; if payload_status.is_invalid() { - error!(message = "builder payload was not valid", "url" = ?builder.auth_rpc, "payload_status" = %payload_status.status, %payload_id); - Err(ClientError::Call(ErrorObject::owned( - INVALID_REQUEST_CODE, - "Builder payload was not valid", - None::, - ))) - } else { - info!(message = "received payload status from local execution engine validating builder payload", %payload_id); - Ok((payload, source)) + return Err(ClientError::InvalidPayload(payload_status.status.to_string()).into()) } + + Ok(payload) }); let (l2_payload, builder_payload) = tokio::join!(l2_client_future, builder_client_future); @@ -334,31 +317,26 @@ impl EngineApiServer for RollupBoostServer { (Ok(builder), _) => Ok(builder), (Err(_), Ok(l2)) => Ok(l2), (Err(_), Err(e)) => Err(e), - }; - payload.map(|(payload, context)| { - let inner_payload = ExecutionPayload::from(payload.clone().execution_payload); - let block_hash = inner_payload.block_hash(); - let block_number = inner_payload.block_number(); - - if let Some(metrics) = &self.metrics { - metrics.increment_blocks_created(&context); - } - - // Note: This log message is used by integration tests to track payload context. - // While not ideal to rely on log parsing, it provides a reliable way to verify behavior. - // Happy to consider an alternative approach later on. - info!( - message = "returning block", - "hash" = %block_hash, - "number" = %block_number, - "context" = %context, - "payload_id" = %payload_id - ); - payload - }) + }?; + + let inner_payload = ExecutionPayload::from(payload.clone().execution_payload); + let block_hash = inner_payload.block_hash(); + let block_number = inner_payload.block_number(); + + // Note: This log message is used by integration tests to track payload context. + // While not ideal to rely on log parsing, it provides a reliable way to verify behavior. + // Happy to consider an alternative approach later on. + info!( + message = "returning block", + "hash" = %block_hash, + "number" = %block_number, + "payload_id" = %payload_id + ); + Ok(payload) } #[instrument(skip_all, + err, fields( otel.kind = ?SpanKind::Server, ) @@ -380,9 +358,9 @@ impl EngineApiServer for RollupBoostServer { .payload_trace_context .retrieve_by_parent_hash(&parent_hash) { - for cause in causes { + causes.iter().for_each(|cause| { tracing::Span::current().follows_from(cause); - } + }); } self.payload_trace_context @@ -405,64 +383,40 @@ impl EngineApiServer for RollupBoostServer { }); }); } - self.l2_client + Ok(self.l2_client .new_payload_v3(payload, versioned_hashes, parent_beacon_block_root) - .await + .await?) } } impl RollupBoostServer { #[instrument(skip_all, + err, fields( otel.kind = ?SpanKind::Client, + payload_id, ) )] async fn send_to_builder( &self, payload_attributes: Option, fork_choice_state: ForkchoiceState, - ) { + ) -> ClientResult<()> { // async call to builder to trigger payload building and sync let builder_client = self.builder_client.clone(); let attr = payload_attributes.clone(); - tokio::spawn(async move { - match builder_client - .fork_choice_updated_v3(fork_choice_state, attr) - .await - { - Ok(response) => { - let external_payload_id = response.payload_id; - if response.is_invalid() { - let payload_id_str = external_payload_id - .map(|id| id.to_string()) - .unwrap_or_default(); - error!(message = "builder rejected fork_choice_updated_v3 with attributes", "url" = ?builder_client.auth_rpc, "payload_id" = payload_id_str, "validation_error" = %response.payload_status.status); - } else if let Some(external_id) = external_payload_id { - info!( - message = "called fork_choice_updated_v3 to builder with payload attributes", - "url" = ?builder_client.auth_rpc, - "payload_status" = %response.payload_status.status, - "payload_id" = %external_id - ); - } else { - info!( - message = "called fork_choice_updated_v3 to builder without payload attributes", - "url" = ?builder_client.auth_rpc, - "payload_status" = %response.payload_status.status - ); - } - } + let response = builder_client + .fork_choice_updated_v3(fork_choice_state, attr) + .await?; - Err(e) => { - error!( - message = "error calling fork_choice_updated_v3 to builder", - "url" = ?builder_client.auth_rpc, - "error" = %e, - "head_block_hash" = %fork_choice_state.head_block_hash - ); - } - } - }); + if let Some(payload_id) = response.payload_id { + tracing::Span::current().record("payload_id", payload_id.to_string()); + } + + if response.is_invalid() { + return Err(ClientError::InvalidPayload(response.payload_status.status.to_string())) + } + Ok(()) } } @@ -584,7 +538,6 @@ mod tests { l2_client, builder_client, boost_sync, - None, ExecutionMode::Enabled, ); From 36ec4b8412b1d83570416456967138b7a03e4112 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Thu, 13 Mar 2025 20:53:50 -0700 Subject: [PATCH 12/23] revert context change --- src/server.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/server.rs b/src/server.rs index 8f8d2a91..599345a5 100644 --- a/src/server.rs +++ b/src/server.rs @@ -313,9 +313,9 @@ impl EngineApiServer for RollupBoostServer { }); let (l2_payload, builder_payload) = tokio::join!(l2_client_future, builder_client_future); - let payload = match (builder_payload, l2_payload) { - (Ok(builder), _) => Ok(builder), - (Err(_), Ok(l2)) => Ok(l2), + let (payload, context) = match (builder_payload, l2_payload) { + (Ok(builder), _) => Ok((builder, "builder")), + (Err(_), Ok(l2)) => Ok((l2, "l2")), (Err(_), Err(e)) => Err(e), }?; @@ -330,7 +330,8 @@ impl EngineApiServer for RollupBoostServer { message = "returning block", "hash" = %block_hash, "number" = %block_number, - "payload_id" = %payload_id + %context, + %payload_id, ); Ok(payload) } From ec674e7069c997201c40896cbdf7ddb4c195e9dc Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Fri, 14 Mar 2025 00:09:35 -0700 Subject: [PATCH 13/23] reorg --- .github/workflows/test.yml | 2 +- src/client.rs | 119 ++++++++++++++++++++++++++-- src/integration/integration_test.rs | 11 +-- src/integration/mod.rs | 2 +- src/main.rs | 105 ------------------------ src/server.rs | 14 +--- src/tracing.rs | 6 +- 7 files changed, 122 insertions(+), 137 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index fed30a42..b37b8f3b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -23,4 +23,4 @@ jobs: run: cargo build - name: Run tests - run: cargo test \ No newline at end of file + run: cargo test -- --test-threads=1 diff --git a/src/client.rs b/src/client.rs index a58f5ac5..46ac9a22 100644 --- a/src/client.rs +++ b/src/client.rs @@ -18,7 +18,7 @@ use std::path::PathBuf; use std::sync::Arc; use std::time::Duration; use thiserror::Error; -use tracing::{error, instrument}; +use tracing::{error, info, instrument}; pub(crate) type ClientResult = Result; @@ -62,13 +62,13 @@ pub enum ExecutionClientError { /// - **Engine API** calls are faciliated via the `auth_client` (requires JWT authentication). /// #[derive(Clone)] -pub struct ExecutionClient { +pub(crate) struct ExecutionClient { /// Handles requests to the authenticated Engine API (requires JWT authentication) - pub auth_client: Arc>>, + auth_client: Arc>>, /// Uri of the RPC server for authenticated Engine API calls - pub auth_rpc: Uri, + auth_rpc: Uri, /// The source of the payload - pub payload_source: PayloadSource, + payload_source: PayloadSource, } impl ExecutionClient { @@ -107,6 +107,7 @@ impl ExecutionClient { fork_choice_state: ForkchoiceState, payload_attributes: Option, ) -> ClientResult { + info!("Sending fork_choice_updated_v3 to {}", self.payload_source); let res = self.auth_client .fork_choice_updated_v3(fork_choice_state, payload_attributes.clone()) .await?; @@ -135,6 +136,7 @@ impl ExecutionClient { &self, payload_id: PayloadId, ) -> ClientResult { + info!("Sending get_payload_v3 to {}", self.payload_source); Ok(self.auth_client .get_payload_v3(payload_id) .await?) @@ -155,6 +157,7 @@ impl ExecutionClient { versioned_hashes: Vec, parent_beacon_block_root: B256, ) -> ClientResult { + info!("Sending new_payload_v3 to {}", self.payload_source); let execution_payload = ExecutionPayload::from(payload.clone()); let block_hash = execution_payload.block_hash(); tracing::Span::current().record("block_hash", block_hash.to_string()); @@ -193,3 +196,109 @@ macro_rules! define_rpc_args { } define_rpc_args!((BuilderArgs, builder), (L2ClientArgs, l2)); + +#[cfg(test)] +mod tests { + use assert_cmd::Command; + use http::Uri; + use jsonrpsee::core::client::ClientT; + + use crate::auth_layer::AuthClientService; + use crate::server::PayloadSource; + use alloy_rpc_types_engine::JwtSecret; + use jsonrpsee::RpcModule; + use jsonrpsee::http_client::HttpClient; + use jsonrpsee::http_client::transport::Error as TransportError; + use jsonrpsee::http_client::transport::HttpBackend; + use jsonrpsee::{ + core::ClientError, + rpc_params, + server::{ServerBuilder, ServerHandle}, + }; + use predicates::prelude::*; + use reth_rpc_layer::{AuthLayer, JwtAuthValidator}; + use std::net::SocketAddr; + use std::result::Result; + use std::str::FromStr; + use std::sync::Arc; + + use super::*; + + const AUTH_PORT: u32 = 8550; + const AUTH_ADDR: &str = "0.0.0.0"; + const SECRET: &str = "f79ae8046bc11c9927afe911db7143c51a806c4a537cc08e0d37140b0192f430"; + + #[test] + fn test_invalid_args() { + let mut cmd = Command::cargo_bin("rollup-boost").unwrap(); + cmd.arg("--invalid-arg"); + + cmd.assert().failure().stderr(predicate::str::contains( + "error: unexpected argument '--invalid-arg' found", + )); + } + + #[tokio::test] + async fn valid_jwt() { + let secret = JwtSecret::from_hex(SECRET).unwrap(); + + let auth_rpc = Uri::from_str(&format!("http://{}:{}", AUTH_ADDR, AUTH_PORT)).unwrap(); + let client = ExecutionClient::new(auth_rpc, secret, 1000, PayloadSource::L2).unwrap(); + let response = send_request(client.auth_client).await; + assert!(response.is_ok()); + assert_eq!(response.unwrap(), "You are the dark lord"); + } + + #[tokio::test] + async fn invalid_jwt() { + let secret = JwtSecret::random(); + let auth_rpc = Uri::from_str(&format!("http://{}:{}", AUTH_ADDR, AUTH_PORT)).unwrap(); + let client = ExecutionClient::new(auth_rpc, secret, 1000, PayloadSource::L2).unwrap(); + let response = send_request(client.auth_client).await; + assert!(response.is_err()); + assert!(matches!( + response.unwrap_err(), + ClientError::Transport(e) + if matches!(e.downcast_ref::(), Some(TransportError::Rejected { status_code: 401 })) + )); + } + + async fn send_request( + client: Arc>>, + ) -> Result { + let server = spawn_server().await; + + let response = client + .request::("greet_melkor", rpc_params![]) + .await; + + server.stop().unwrap(); + server.stopped().await; + + response + } + + /// Spawn a new RPC server equipped with a `JwtLayer` auth middleware. + async fn spawn_server() -> ServerHandle { + let secret = JwtSecret::from_hex(SECRET).unwrap(); + let addr = format!("{AUTH_ADDR}:{AUTH_PORT}"); + let validator = JwtAuthValidator::new(secret); + let layer = AuthLayer::new(validator); + let middleware = tower::ServiceBuilder::default().layer(layer); + + // Create a layered server + let server = ServerBuilder::default() + .set_http_middleware(middleware) + .build(addr.parse::().unwrap()) + .await + .unwrap(); + + // Create a mock rpc module + let mut module = RpcModule::new(()); + module + .register_method("greet_melkor", |_, _, _| "You are the dark lord") + .unwrap(); + + server.start(module) + } +} diff --git a/src/integration/integration_test.rs b/src/integration/integration_test.rs index e8e4f17d..34282c9a 100644 --- a/src/integration/integration_test.rs +++ b/src/integration/integration_test.rs @@ -259,7 +259,7 @@ mod tests { Some(result) }); - let mut harness = + let harness = RollupBoostTestHarnessBuilder::new("test_integration_builder_returns_incorrect_block") .proxy_handler(handler) .build() @@ -273,15 +273,6 @@ mod tests { assert!(block_creator.is_l2(), "Block creator should be the builder"); } - // check that at some point we had the log "builder payload was not valid" which signals - // that the builder returned a payload that was not valid and rollup-boost did not process it. - let rb_service = harness._framework.get_mut_service("rollup-boost")?; - let logs = rb_service.get_logs()?; - assert!( - logs.contains("builder payload was not valid"), - "Logs should contain the message 'builder payload was not valid'" - ); - Ok(()) } } diff --git a/src/integration/mod.rs b/src/integration/mod.rs index 4bc581ed..9f688e0a 100644 --- a/src/integration/mod.rs +++ b/src/integration/mod.rs @@ -475,7 +475,7 @@ impl EngineApi { let middleware = tower::ServiceBuilder::default().layer(secret_layer); let client = jsonrpsee::http_client::HttpClientBuilder::default() .set_http_middleware(middleware) - .build(&url) + .build(url) .expect("Failed to create http client"); Ok(Self { diff --git a/src/main.rs b/src/main.rs index aaf8d1fe..95bf4579 100644 --- a/src/main.rs +++ b/src/main.rs @@ -299,108 +299,3 @@ async fn init_metrics_server(addr: SocketAddr, handle: PrometheusHandle) -> eyre } } } - -#[cfg(test)] -mod tests { - use assert_cmd::Command; - use http::Uri; - use jsonrpsee::core::client::ClientT; - - use crate::auth_layer::AuthClientService; - use crate::server::PayloadSource; - use alloy_rpc_types_engine::JwtSecret; - use jsonrpsee::RpcModule; - use jsonrpsee::http_client::HttpClient; - use jsonrpsee::http_client::transport::Error as TransportError; - use jsonrpsee::http_client::transport::HttpBackend; - use jsonrpsee::{ - core::ClientError, - rpc_params, - server::{ServerBuilder, ServerHandle}, - }; - use predicates::prelude::*; - use reth_rpc_layer::{AuthLayer, JwtAuthValidator}; - use std::result::Result; - use std::str::FromStr; - use std::sync::Arc; - - use super::*; - - const AUTH_PORT: u32 = 8550; - const AUTH_ADDR: &str = "0.0.0.0"; - const SECRET: &str = "f79ae8046bc11c9927afe911db7143c51a806c4a537cc08e0d37140b0192f430"; - - #[test] - fn test_invalid_args() { - let mut cmd = Command::cargo_bin("rollup-boost").unwrap(); - cmd.arg("--invalid-arg"); - - cmd.assert().failure().stderr(predicate::str::contains( - "error: unexpected argument '--invalid-arg' found", - )); - } - - #[tokio::test] - async fn valid_jwt() { - let secret = JwtSecret::from_hex(SECRET).unwrap(); - - let auth_rpc = Uri::from_str(&format!("http://{}:{}", AUTH_ADDR, AUTH_PORT)).unwrap(); - let client = ExecutionClient::new(auth_rpc, secret, 1000, PayloadSource::L2).unwrap(); - let response = send_request(client.auth_client).await; - assert!(response.is_ok()); - assert_eq!(response.unwrap(), "You are the dark lord"); - } - - #[tokio::test] - async fn invalid_jwt() { - let secret = JwtSecret::random(); - let auth_rpc = Uri::from_str(&format!("http://{}:{}", AUTH_ADDR, AUTH_PORT)).unwrap(); - let client = ExecutionClient::new(auth_rpc, secret, 1000, PayloadSource::L2).unwrap(); - let response = send_request(client.auth_client).await; - assert!(response.is_err()); - assert!(matches!( - response.unwrap_err(), - ClientError::Transport(e) - if matches!(e.downcast_ref::(), Some(TransportError::Rejected { status_code: 401 })) - )); - } - - async fn send_request( - client: Arc>>, - ) -> Result { - let server = spawn_server().await; - - let response = client - .request::("greet_melkor", rpc_params![]) - .await; - - server.stop().unwrap(); - server.stopped().await; - - response - } - - /// Spawn a new RPC server equipped with a `JwtLayer` auth middleware. - async fn spawn_server() -> ServerHandle { - let secret = JwtSecret::from_hex(SECRET).unwrap(); - let addr = format!("{AUTH_ADDR}:{AUTH_PORT}"); - let validator = JwtAuthValidator::new(secret); - let layer = AuthLayer::new(validator); - let middleware = tower::ServiceBuilder::default().layer(layer); - - // Create a layered server - let server = ServerBuilder::default() - .set_http_middleware(middleware) - .build(addr.parse::().unwrap()) - .await - .unwrap(); - - // Create a mock rpc module - let mut module = RpcModule::new(()); - module - .register_method("greet_melkor", |_, _, _| "You are the dark lord") - .unwrap(); - - server.start(module) - } -} diff --git a/src/server.rs b/src/server.rs index 599345a5..164bf20f 100644 --- a/src/server.rs +++ b/src/server.rs @@ -17,7 +17,7 @@ use jsonrpsee::types::error::INVALID_REQUEST_CODE; use op_alloy_rpc_types_engine::{OpExecutionPayloadEnvelopeV3, OpPayloadAttributes}; use serde::{Deserialize, Serialize}; -use tracing::{debug, error, info, instrument}; +use tracing::{debug, info, instrument}; use jsonrpsee::proc_macros::rpc; @@ -371,17 +371,7 @@ impl EngineApiServer for RollupBoostServer { let builder_payload = payload.clone(); let builder_versioned_hashes = versioned_hashes.clone(); tokio::spawn(async move { - let _ = builder.new_payload_v3(builder_payload, builder_versioned_hashes, parent_beacon_block_root).await - .map(|response: PayloadStatus| { - if response.is_invalid() { - error!(message = "builder rejected new_payload_v3", "url" = ?builder.auth_rpc, "block_hash" = %block_hash); - } else { - info!(message = "called new_payload_v3 to builder", "url" = ?builder.auth_rpc, "payload_status" = %response.status, "block_hash" = %block_hash); - } - }).map_err(|e| { - error!(message = "error calling new_payload_v3 to builder", "url" = ?builder.auth_rpc, "error" = %e, "block_hash" = %block_hash); - e - }); + let _ = builder.new_payload_v3(builder_payload, builder_versioned_hashes, parent_beacon_block_root).await; }); } Ok(self.l2_client diff --git a/src/tracing.rs b/src/tracing.rs index 326632e1..ecce5512 100644 --- a/src/tracing.rs +++ b/src/tracing.rs @@ -1,15 +1,15 @@ use eyre::Context as _; use metrics::histogram; use opentelemetry::trace::{Status, TracerProvider as _}; -use opentelemetry::{global, KeyValue}; +use opentelemetry::{KeyValue, global}; use opentelemetry_otlp::WithExportConfig; use opentelemetry_sdk::trace::SpanProcessor; -use opentelemetry_sdk::{propagation::TraceContextPropagator, Resource}; +use opentelemetry_sdk::{Resource, propagation::TraceContextPropagator}; use tracing::level_filters::LevelFilter; use tracing_opentelemetry::OpenTelemetryLayer; +use tracing_subscriber::Layer; use tracing_subscriber::filter::Targets; use tracing_subscriber::layer::SubscriberExt; -use tracing_subscriber::Layer; use crate::{Args, LogFormat}; From a8b945d20a1a32004ae916118a423ed3303ff7e3 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Fri, 14 Mar 2025 00:13:27 -0700 Subject: [PATCH 14/23] fix formatiing --- src/client.rs | 46 +++++++++++++++++++-------------------- src/server.rs | 60 ++++++++++++++++++++++++++++++++++----------------- 2 files changed, 63 insertions(+), 43 deletions(-) diff --git a/src/client.rs b/src/client.rs index 46ac9a22..354ff9fa 100644 --- a/src/client.rs +++ b/src/client.rs @@ -5,7 +5,7 @@ use alloy_rpc_types_engine::{ ExecutionPayload, ExecutionPayloadV3, ForkchoiceState, ForkchoiceUpdated, JwtError, JwtSecret, PayloadId, PayloadStatus, }; -use clap::{arg, Parser}; +use clap::{Parser, arg}; use http::Uri; // use jsonrpsee::core::ClientError; use jsonrpsee::http_client::transport::HttpBackend; @@ -27,22 +27,17 @@ pub(crate) enum ClientError { #[error(transparent)] Jsonrpsee(#[from] jsonrpsee::core::client::Error), #[error("Invalid payload: {0}")] - InvalidPayload(String) + InvalidPayload(String), } impl From for ErrorObjectOwned { fn from(err: ClientError) -> Self { match err { - ClientError::Jsonrpsee(err) => { - match err { - jsonrpsee::core::ClientError::Call(error_object) => error_object, - e => ErrorObjectOwned::owned(0, e.to_string(), Option::<()>::None) -, - } + ClientError::Jsonrpsee(err) => match err { + jsonrpsee::core::ClientError::Call(error_object) => error_object, + e => ErrorObjectOwned::owned(0, e.to_string(), Option::<()>::None), }, - e => { - ErrorObjectOwned::owned(0, e.to_string(), Option::<()>::None) - } + e => ErrorObjectOwned::owned(0, e.to_string(), Option::<()>::None), } } } @@ -92,8 +87,9 @@ impl ExecutionClient { }) } - #[instrument(skip_all, - err + #[instrument( + skip_all, + err, fields( otel.kind = ?SpanKind::Client, target = self.payload_source.to_string(), @@ -108,22 +104,26 @@ impl ExecutionClient { payload_attributes: Option, ) -> ClientResult { info!("Sending fork_choice_updated_v3 to {}", self.payload_source); - let res = self.auth_client + let res = self + .auth_client .fork_choice_updated_v3(fork_choice_state, payload_attributes.clone()) .await?; if let Some(payload_id) = res.payload_id { tracing::Span::current().record("payload_id", payload_id.to_string()); } - + if res.is_invalid() { - return Err(ClientError::InvalidPayload(res.payload_status.status.to_string())) + return Err(ClientError::InvalidPayload( + res.payload_status.status.to_string(), + )); } Ok(res) } - #[instrument(skip(self), + #[instrument( + skip(self), err, fields( otel.kind = ?SpanKind::Client, @@ -137,13 +137,12 @@ impl ExecutionClient { payload_id: PayloadId, ) -> ClientResult { info!("Sending get_payload_v3 to {}", self.payload_source); - Ok(self.auth_client - .get_payload_v3(payload_id) - .await?) + Ok(self.auth_client.get_payload_v3(payload_id).await?) } - #[instrument(skip_all, - err + #[instrument( + skip_all, + err, fields( otel.kind = ?SpanKind::Client, target = self.payload_source.to_string(), @@ -161,7 +160,8 @@ impl ExecutionClient { let execution_payload = ExecutionPayload::from(payload.clone()); let block_hash = execution_payload.block_hash(); tracing::Span::current().record("block_hash", block_hash.to_string()); - Ok(self.auth_client + Ok(self + .auth_client .new_payload_v3(payload, versioned_hashes, parent_beacon_block_root) .await?) } diff --git a/src/server.rs b/src/server.rs index 164bf20f..c133e0f3 100644 --- a/src/server.rs +++ b/src/server.rs @@ -11,7 +11,7 @@ use alloy_rpc_types_engine::{ PayloadStatus, }; use jsonrpsee::RpcModule; -use jsonrpsee::core::{async_trait, RegisterMethodError, RpcResult}; +use jsonrpsee::core::{RegisterMethodError, RpcResult, async_trait}; use jsonrpsee::types::ErrorObject; use jsonrpsee::types::error::INVALID_REQUEST_CODE; use op_alloy_rpc_types_engine::{OpExecutionPayloadEnvelopeV3, OpPayloadAttributes}; @@ -37,8 +37,7 @@ impl PayloadTraceContext { } fn store(&self, payload_id: PayloadId, parent_hash: B256, parent_span: tracing::Id) { - self.payload_id_to_trace_id - .insert(payload_id, parent_span); + self.payload_id_to_trace_id.insert(payload_id, parent_span); self.block_hash_to_payload_ids .entry(parent_hash) .and_upsert_with(|o| match o { @@ -183,7 +182,7 @@ pub trait EngineApi { &self, fork_choice_state: ForkchoiceState, payload_attributes: Option, - ) -> RpcResult ; + ) -> RpcResult; #[method(name = "getPayloadV3")] async fn get_payload_v3( @@ -202,7 +201,8 @@ pub trait EngineApi { #[async_trait] impl EngineApiServer for RollupBoostServer { - #[instrument(skip_all, + #[instrument( + skip_all, err, fields( otel.kind = ?SpanKind::Server, @@ -253,10 +253,11 @@ impl EngineApiServer for RollupBoostServer { debug!(message = "execution mode is disabled, skipping FCU call to builder", "head_block_hash" = %fork_choice_state.head_block_hash); } else if should_send_to_builder { let builder_client = self.builder_client.clone(); - tokio::spawn( async move { - let _ = builder_client.fork_choice_updated_v3(fork_choice_state.clone(), payload_attributes.clone()).await; - } - ); + tokio::spawn(async move { + let _ = builder_client + .fork_choice_updated_v3(fork_choice_state.clone(), payload_attributes.clone()) + .await; + }); } else { info!(message = "no payload attributes provided or no_tx_pool is set", "head_block_hash" = %fork_choice_state.head_block_hash); } @@ -264,7 +265,8 @@ impl EngineApiServer for RollupBoostServer { Ok(l2_response) } - #[instrument(skip_all, + #[instrument( + skip_all, err, fields( otel.kind = ?SpanKind::Server, @@ -303,19 +305,26 @@ impl EngineApiServer for RollupBoostServer { // Send the payload to the local execution engine with engine_newPayload to validate the block from the builder. // Otherwise, we do not want to risk the network to a halt since op-node will not be able to propose the block. // If validation fails, return the local block since that one has already been validated. - let payload_status = self.l2_client.new_payload_v3(payload.execution_payload.clone(), vec![], payload.parent_beacon_block_root).await?; + let payload_status = self + .l2_client + .new_payload_v3( + payload.execution_payload.clone(), + vec![], + payload.parent_beacon_block_root, + ) + .await?; if payload_status.is_invalid() { - return Err(ClientError::InvalidPayload(payload_status.status.to_string()).into()) + return Err(ClientError::InvalidPayload(payload_status.status.to_string()).into()); } - + Ok(payload) }); let (l2_payload, builder_payload) = tokio::join!(l2_client_future, builder_client_future); let (payload, context) = match (builder_payload, l2_payload) { (Ok(builder), _) => Ok((builder, "builder")), - (Err(_), Ok(l2)) => Ok((l2, "l2")), + (Err(_), Ok(l2)) => Ok((l2, "l2")), (Err(_), Err(e)) => Err(e), }?; @@ -336,7 +345,8 @@ impl EngineApiServer for RollupBoostServer { Ok(payload) } - #[instrument(skip_all, + #[instrument( + skip_all, err, fields( otel.kind = ?SpanKind::Server, @@ -371,17 +381,25 @@ impl EngineApiServer for RollupBoostServer { let builder_payload = payload.clone(); let builder_versioned_hashes = versioned_hashes.clone(); tokio::spawn(async move { - let _ = builder.new_payload_v3(builder_payload, builder_versioned_hashes, parent_beacon_block_root).await; + let _ = builder + .new_payload_v3( + builder_payload, + builder_versioned_hashes, + parent_beacon_block_root, + ) + .await; }); } - Ok(self.l2_client + Ok(self + .l2_client .new_payload_v3(payload, versioned_hashes, parent_beacon_block_root) .await?) } } impl RollupBoostServer { - #[instrument(skip_all, + #[instrument( + skip_all, err, fields( otel.kind = ?SpanKind::Client, @@ -396,7 +414,7 @@ impl RollupBoostServer { // async call to builder to trigger payload building and sync let builder_client = self.builder_client.clone(); let attr = payload_attributes.clone(); - let response = builder_client + let response = builder_client .fork_choice_updated_v3(fork_choice_state, attr) .await?; @@ -405,7 +423,9 @@ impl RollupBoostServer { } if response.is_invalid() { - return Err(ClientError::InvalidPayload(response.payload_status.status.to_string())) + return Err(ClientError::InvalidPayload( + response.payload_status.status.to_string(), + )); } Ok(()) } From 1a89d0588ad786ec9b2be5f9be63e7a07071ad25 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Fri, 14 Mar 2025 01:31:19 -0700 Subject: [PATCH 15/23] add back logic to skip requesting block from builder --- src/client.rs | 36 ++++++++--------- src/server.rs | 110 +++++++++++++++++++++----------------------------- 2 files changed, 64 insertions(+), 82 deletions(-) diff --git a/src/client.rs b/src/client.rs index 354ff9fa..ea0261d3 100644 --- a/src/client.rs +++ b/src/client.rs @@ -7,7 +7,6 @@ use alloy_rpc_types_engine::{ }; use clap::{Parser, arg}; use http::Uri; -// use jsonrpsee::core::ClientError; use jsonrpsee::http_client::transport::HttpBackend; use jsonrpsee::http_client::{HttpClient, HttpClientBuilder}; use jsonrpsee::types::ErrorObjectOwned; @@ -15,7 +14,6 @@ use op_alloy_rpc_types_engine::{OpExecutionPayloadEnvelopeV3, OpPayloadAttribute use opentelemetry::trace::SpanKind; use paste::paste; use std::path::PathBuf; -use std::sync::Arc; use std::time::Duration; use thiserror::Error; use tracing::{error, info, instrument}; @@ -28,6 +26,10 @@ pub(crate) enum ClientError { Jsonrpsee(#[from] jsonrpsee::core::client::Error), #[error("Invalid payload: {0}")] InvalidPayload(String), + #[error(transparent)] + Io(#[from] std::io::Error), + #[error(transparent)] + Jwt(#[from] JwtError), } impl From for ErrorObjectOwned { @@ -42,16 +44,6 @@ impl From for ErrorObjectOwned { } } -#[derive(Error, Debug)] -pub enum ExecutionClientError { - #[error(transparent)] - HttpClient(#[from] jsonrpsee::core::client::Error), - #[error(transparent)] - Io(#[from] std::io::Error), - #[error(transparent)] - Jwt(#[from] JwtError), -} - /// Client interface for interacting with execution layer node's Engine API. /// /// - **Engine API** calls are faciliated via the `auth_client` (requires JWT authentication). @@ -59,7 +51,7 @@ pub enum ExecutionClientError { #[derive(Clone)] pub(crate) struct ExecutionClient { /// Handles requests to the authenticated Engine API (requires JWT authentication) - auth_client: Arc>>, + auth_client: HttpClient>, /// Uri of the RPC server for authenticated Engine API calls auth_rpc: Uri, /// The source of the payload @@ -73,7 +65,7 @@ impl ExecutionClient { auth_rpc_jwt_secret: JwtSecret, timeout: u64, payload_source: PayloadSource, - ) -> Result { + ) -> Result { let auth_layer = AuthClientLayer::new(auth_rpc_jwt_secret); let auth_client = HttpClientBuilder::new() .set_http_middleware(tower::ServiceBuilder::new().layer(auth_layer)) @@ -81,7 +73,7 @@ impl ExecutionClient { .build(auth_rpc.to_string())?; Ok(Self { - auth_client: Arc::new(auth_client), + auth_client, auth_rpc, payload_source, }) @@ -160,10 +152,17 @@ impl ExecutionClient { let execution_payload = ExecutionPayload::from(payload.clone()); let block_hash = execution_payload.block_hash(); tracing::Span::current().record("block_hash", block_hash.to_string()); - Ok(self + + let res = self .auth_client .new_payload_v3(payload, versioned_hashes, parent_beacon_block_root) - .await?) + .await?; + + if res.is_invalid() { + return Err(ClientError::InvalidPayload(res.status.to_string())); + } + + Ok(res) } } @@ -220,7 +219,6 @@ mod tests { use std::net::SocketAddr; use std::result::Result; use std::str::FromStr; - use std::sync::Arc; use super::*; @@ -264,7 +262,7 @@ mod tests { } async fn send_request( - client: Arc>>, + client: HttpClient>, ) -> Result { let server = spawn_server().await; diff --git a/src/server.rs b/src/server.rs index c133e0f3..45c921ab 100644 --- a/src/server.rs +++ b/src/server.rs @@ -1,4 +1,4 @@ -use crate::client::{ClientError, ClientResult, ExecutionClient}; +use crate::client::ExecutionClient; use crate::debug_api::DebugServer; use alloy_primitives::B256; use moka::sync::Cache; @@ -25,19 +25,26 @@ const CACHE_SIZE: u64 = 100; pub struct PayloadTraceContext { block_hash_to_payload_ids: Cache>, - payload_id_to_trace_id: Cache, + payload_id: Cache)>, } impl PayloadTraceContext { fn new() -> Self { PayloadTraceContext { block_hash_to_payload_ids: Cache::new(CACHE_SIZE), - payload_id_to_trace_id: Cache::new(CACHE_SIZE), + payload_id: Cache::new(CACHE_SIZE), } } - fn store(&self, payload_id: PayloadId, parent_hash: B256, parent_span: tracing::Id) { - self.payload_id_to_trace_id.insert(payload_id, parent_span); + fn store( + &self, + payload_id: PayloadId, + parent_hash: B256, + has_attributes: bool, + trace_id: Option, + ) { + self.payload_id + .insert(payload_id, (has_attributes, trace_id)); self.block_hash_to_payload_ids .entry(parent_hash) .and_upsert_with(|o| match o { @@ -52,25 +59,32 @@ impl PayloadTraceContext { }); } - fn retrieve_by_parent_hash(&self, parent_hash: &B256) -> Option> { + fn trace_ids_from_parent_hash(&self, parent_hash: &B256) -> Option> { self.block_hash_to_payload_ids .get(parent_hash) .map(|payload_ids| { payload_ids .iter() - .filter_map(|payload_id| self.payload_id_to_trace_id.get(payload_id)) + .filter_map(|payload_id| self.payload_id.get(payload_id).and_then(|x| x.1)) .collect() }) } - fn retrieve_by_payload_id(&self, payload_id: &PayloadId) -> Option { - self.payload_id_to_trace_id.get(payload_id) + fn trace_id(&self, payload_id: &PayloadId) -> Option { + self.payload_id.get(payload_id).and_then(|x| x.1) + } + + fn has_attributes(&self, payload_id: &PayloadId) -> bool { + self.payload_id + .get(payload_id) + .map(|x| x.0) + .unwrap_or_default() } fn remove_by_parent_hash(&self, block_hash: &B256) { if let Some(payload_ids) = self.block_hash_to_payload_ids.remove(block_hash) { for payload_id in payload_ids.iter() { - self.payload_id_to_trace_id.remove(payload_id); + self.payload_id.remove(payload_id); } } } @@ -217,6 +231,7 @@ impl EngineApiServer for RollupBoostServer { fork_choice_state: ForkchoiceState, payload_attributes: Option, ) -> RpcResult { + info!("received fork_choice_updated_v3"); // First get the local payload ID from L2 client let l2_response = self .l2_client @@ -244,9 +259,13 @@ impl EngineApiServer for RollupBoostServer { let execution_mode = self.execution_mode(); let trace_id = span.id(); - if let (Some(payload_id), Some(trace)) = (l2_response.payload_id, trace_id) { - self.payload_trace_context - .store(payload_id, fork_choice_state.head_block_hash, trace); + if let Some(payload_id) = l2_response.payload_id { + self.payload_trace_context.store( + payload_id, + fork_choice_state.head_block_hash, + payload_attributes.is_some(), + trace_id, + ); } if execution_mode.is_disabled() { @@ -277,8 +296,9 @@ impl EngineApiServer for RollupBoostServer { &self, payload_id: PayloadId, ) -> RpcResult { - let l2_client_future = self.l2_client.get_payload_v3(payload_id); + info!("received get_payload_v3"); + let l2_client_future = self.l2_client.get_payload_v3(payload_id); let builder_client_future = Box::pin(async move { let execution_mode = self.execution_mode(); if !execution_mode.is_get_payload_enabled() { @@ -292,20 +312,22 @@ impl EngineApiServer for RollupBoostServer { )); } - if let Some(cause) = self - .payload_trace_context - .retrieve_by_payload_id(&payload_id) - { + if let Some(cause) = self.payload_trace_context.trace_id(&payload_id) { tracing::Span::current().follows_from(cause); } + if !self.payload_trace_context.has_attributes(&payload_id) { + // block builder won't build a block without attributes + return Ok(None); + } + let builder = self.builder_client.clone(); let payload = builder.get_payload_v3(payload_id).await?; // Send the payload to the local execution engine with engine_newPayload to validate the block from the builder. // Otherwise, we do not want to risk the network to a halt since op-node will not be able to propose the block. // If validation fails, return the local block since that one has already been validated. - let payload_status = self + let _ = self .l2_client .new_payload_v3( payload.execution_payload.clone(), @@ -314,18 +336,14 @@ impl EngineApiServer for RollupBoostServer { ) .await?; - if payload_status.is_invalid() { - return Err(ClientError::InvalidPayload(payload_status.status.to_string()).into()); - } - - Ok(payload) + Ok(Some(payload)) }); let (l2_payload, builder_payload) = tokio::join!(l2_client_future, builder_client_future); let (payload, context) = match (builder_payload, l2_payload) { - (Ok(builder), _) => Ok((builder, "builder")), - (Err(_), Ok(l2)) => Ok((l2, "l2")), - (Err(_), Err(e)) => Err(e), + (Ok(Some(builder)), _) => Ok((builder, "builder")), + (_, Ok(l2)) => Ok((l2, "l2")), + (_, Err(e)) => Err(e), }?; let inner_payload = ExecutionPayload::from(payload.clone().execution_payload); @@ -358,6 +376,7 @@ impl EngineApiServer for RollupBoostServer { versioned_hashes: Vec, parent_beacon_block_root: B256, ) -> RpcResult { + info!("received new_payload_v3"); let execution_payload = ExecutionPayload::from(payload.clone()); let block_hash = execution_payload.block_hash(); let parent_hash = execution_payload.parent_hash(); @@ -367,7 +386,7 @@ impl EngineApiServer for RollupBoostServer { if self.boost_sync && !execution_mode.is_disabled() { if let Some(causes) = self .payload_trace_context - .retrieve_by_parent_hash(&parent_hash) + .trace_ids_from_parent_hash(&parent_hash) { causes.iter().for_each(|cause| { tracing::Span::current().follows_from(cause); @@ -397,44 +416,9 @@ impl EngineApiServer for RollupBoostServer { } } -impl RollupBoostServer { - #[instrument( - skip_all, - err, - fields( - otel.kind = ?SpanKind::Client, - payload_id, - ) - )] - async fn send_to_builder( - &self, - payload_attributes: Option, - fork_choice_state: ForkchoiceState, - ) -> ClientResult<()> { - // async call to builder to trigger payload building and sync - let builder_client = self.builder_client.clone(); - let attr = payload_attributes.clone(); - let response = builder_client - .fork_choice_updated_v3(fork_choice_state, attr) - .await?; - - if let Some(payload_id) = response.payload_id { - tracing::Span::current().record("payload_id", payload_id.to_string()); - } - - if response.is_invalid() { - return Err(ClientError::InvalidPayload( - response.payload_status.status.to_string(), - )); - } - Ok(()) - } -} - #[cfg(test)] #[allow(clippy::complexity)] mod tests { - use super::*; use alloy_primitives::hex; use alloy_primitives::{FixedBytes, U256}; From 8cb97ce35a1de6871709862956eb6601d5dc9c25 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Fri, 14 Mar 2025 01:34:34 -0700 Subject: [PATCH 16/23] remove integration default feature --- Cargo.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 8e6b821a..775cbb8b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -68,5 +68,4 @@ reth-rpc-layer = { git = "https://github.com/paradigmxyz/reth.git", rev = "v1.3. ctor = "0.4.1" [features] -default = ["integration"] integration = [] From a599b4dd7ed416c2ddb26a780c85693e14fe5120 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Fri, 14 Mar 2025 01:58:46 -0700 Subject: [PATCH 17/23] fix tests --- src/server.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/server.rs b/src/server.rs index 45c921ab..656940b4 100644 --- a/src/server.rs +++ b/src/server.rs @@ -318,6 +318,7 @@ impl EngineApiServer for RollupBoostServer { if !self.payload_trace_context.has_attributes(&payload_id) { // block builder won't build a block without attributes + info!(message = "no attributes found, skipping get_payload_v3 call to builder"); return Ok(None); } @@ -655,9 +656,9 @@ mod tests { let get_payload_requests_builder_mu = get_payload_requests_builder.lock(); let new_payload_requests = test_harness.l2_mock.new_payload_requests.clone(); let new_payload_requests_mu = new_payload_requests.lock(); - assert_eq!(get_payload_requests_builder_mu.len(), 1); + assert_eq!(get_payload_requests_builder_mu.len(), 0); assert_eq!(get_payload_requests_mu.len(), 1); - assert_eq!(new_payload_requests_mu.len(), 2); + assert_eq!(new_payload_requests_mu.len(), 1); let req: &PayloadId = get_payload_requests_mu.first().unwrap(); assert_eq!(*req, PayloadId::new([0, 0, 0, 0, 0, 0, 0, 1])); } @@ -827,8 +828,7 @@ mod tests { { let builder_gp_reqs = builder_mock.get_payload_requests.lock(); - assert_eq!(builder_gp_reqs.len(), 1); - assert_eq!(builder_gp_reqs[0], same_id); + assert_eq!(builder_gp_reqs.len(), 0); } { From 293e1633a2d67e5b351c81860eb9942146738e66 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Fri, 14 Mar 2025 08:27:39 -0700 Subject: [PATCH 18/23] remove log-always tracing feature --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 775cbb8b..85c66977 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,7 @@ alloy-rpc-types-eth = "0.12.5" alloy-primitives = { version = "0.8.10", features = ["rand"] } alloy-eips = { version = "0.12.5", features = ["serde"] } tokio = { version = "1", features = ["full"] } -tracing = { version = "0.1.4", features = ["log-always"] } +tracing = "0.1.4" tracing-subscriber = { version = "0.3.11", features = ["env-filter", "json"] } serde = { version = "1", features = ["derive"] } thiserror = "2.0.12" From 9757e00df2d80e5cfb875291d159954db50502d6 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Fri, 14 Mar 2025 11:45:29 -0700 Subject: [PATCH 19/23] fix ClientError status code --- src/client.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/client.rs b/src/client.rs index ea0261d3..c28235b2 100644 --- a/src/client.rs +++ b/src/client.rs @@ -35,11 +35,11 @@ pub(crate) enum ClientError { impl From for ErrorObjectOwned { fn from(err: ClientError) -> Self { match err { - ClientError::Jsonrpsee(err) => match err { - jsonrpsee::core::ClientError::Call(error_object) => error_object, - e => ErrorObjectOwned::owned(0, e.to_string(), Option::<()>::None), - }, - e => ErrorObjectOwned::owned(0, e.to_string(), Option::<()>::None), + ClientError::Jsonrpsee(jsonrpsee::core::ClientError::Call(error_object)) => { + error_object + } + // Status code 13 == internal error + e => ErrorObjectOwned::owned(13, e.to_string(), Option::<()>::None), } } } From 1fa73f0755da9c7b1100c57fe0a09abd05ebf26e Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Fri, 14 Mar 2025 12:10:26 -0700 Subject: [PATCH 20/23] remove stray comment --- src/tracing.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tracing.rs b/src/tracing.rs index ecce5512..8f33225d 100644 --- a/src/tracing.rs +++ b/src/tracing.rs @@ -26,6 +26,7 @@ impl SpanProcessor for MetricsSpanProcessor { .duration_since(span.start_time) .unwrap_or_default(); + // Remove status description to avoid cardinality explosion let status = match span.status { Status::Ok => "ok", Status::Error { .. } => "error", @@ -79,7 +80,6 @@ pub(crate) fn init_tracing(args: &Args) -> eyre::Result<()> { // Weird control flow here is required because of type system if args.tracing { global::set_text_map_propagator(TraceContextPropagator::new()); - // Define a custom sampler that checks if the span's name starts with your crate's name. let otlp_exporter = opentelemetry_otlp::SpanExporter::builder() .with_tonic() .with_endpoint(&args.otlp_endpoint) From 2731643b5f74b7bfef6d83b1c858526c0ff2a7ed Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Mon, 24 Mar 2025 14:26:41 -0700 Subject: [PATCH 21/23] metrics labels --- src/client.rs | 61 +++++++++++++++++++++++++++++++++++++++++++++----- src/server.rs | 9 +++++--- src/tracing.rs | 41 ++++++++++++++++++++------------- 3 files changed, 86 insertions(+), 25 deletions(-) diff --git a/src/client.rs b/src/client.rs index c28235b2..a7fe8fea 100644 --- a/src/client.rs +++ b/src/client.rs @@ -18,6 +18,8 @@ use std::time::Duration; use thiserror::Error; use tracing::{error, info, instrument}; +const INTERNAL_ERROR: i32 = 13; + pub(crate) type ClientResult = Result; #[derive(Error, Debug)] @@ -32,6 +34,44 @@ pub(crate) enum ClientError { Jwt(#[from] JwtError), } +trait Code: Sized { + fn code(&self) -> i32; + + fn set_code(self) -> Self { + tracing::Span::current().record("code", self.code()); + self + } +} + +impl Code for Result { + fn code(&self) -> i32 { + match self { + Ok(_) => 0, + Err(e) => e.code(), + } + } +} + +/// TODO: Add more robust error code system +impl Code for ClientError { + fn code(&self) -> i32 { + match self { + ClientError::Jsonrpsee(e) => e.code(), + // Status code 13 == internal error + _ => INTERNAL_ERROR, + } + } +} + +impl Code for jsonrpsee::core::client::Error { + fn code(&self) -> i32 { + match self { + jsonrpsee::core::client::Error::Call(call) => call.code(), + _ => INTERNAL_ERROR, + } + } +} + impl From for ErrorObjectOwned { fn from(err: ClientError) -> Self { match err { @@ -39,7 +79,7 @@ impl From for ErrorObjectOwned { error_object } // Status code 13 == internal error - e => ErrorObjectOwned::owned(13, e.to_string(), Option::<()>::None), + e => ErrorObjectOwned::owned(INTERNAL_ERROR, e.to_string(), Option::<()>::None), } } } @@ -87,6 +127,7 @@ impl ExecutionClient { target = self.payload_source.to_string(), head_block_hash = %fork_choice_state.head_block_hash, url = %self.auth_rpc, + code, payload_id ) )] @@ -99,7 +140,8 @@ impl ExecutionClient { let res = self .auth_client .fork_choice_updated_v3(fork_choice_state, payload_attributes.clone()) - .await?; + .await + .set_code()?; if let Some(payload_id) = res.payload_id { tracing::Span::current().record("payload_id", payload_id.to_string()); @@ -108,7 +150,8 @@ impl ExecutionClient { if res.is_invalid() { return Err(ClientError::InvalidPayload( res.payload_status.status.to_string(), - )); + )) + .set_code(); } Ok(res) @@ -129,7 +172,11 @@ impl ExecutionClient { payload_id: PayloadId, ) -> ClientResult { info!("Sending get_payload_v3 to {}", self.payload_source); - Ok(self.auth_client.get_payload_v3(payload_id).await?) + Ok(self + .auth_client + .get_payload_v3(payload_id) + .await + .set_code()?) } #[instrument( @@ -140,6 +187,7 @@ impl ExecutionClient { target = self.payload_source.to_string(), url = %self.auth_rpc, block_hash, + code, ) )] pub async fn new_payload_v3( @@ -156,10 +204,11 @@ impl ExecutionClient { let res = self .auth_client .new_payload_v3(payload, versioned_hashes, parent_beacon_block_root) - .await?; + .await + .set_code()?; if res.is_invalid() { - return Err(ClientError::InvalidPayload(res.status.to_string())); + return Err(ClientError::InvalidPayload(res.status.to_string()).set_code()); } Ok(res) diff --git a/src/server.rs b/src/server.rs index 656940b4..23c621dd 100644 --- a/src/server.rs +++ b/src/server.rs @@ -289,7 +289,8 @@ impl EngineApiServer for RollupBoostServer { err, fields( otel.kind = ?SpanKind::Server, - %payload_id + %payload_id, + payload_source ) )] async fn get_payload_v3( @@ -342,11 +343,13 @@ impl EngineApiServer for RollupBoostServer { let (l2_payload, builder_payload) = tokio::join!(l2_client_future, builder_client_future); let (payload, context) = match (builder_payload, l2_payload) { - (Ok(Some(builder)), _) => Ok((builder, "builder")), - (_, Ok(l2)) => Ok((l2, "l2")), + (Ok(Some(builder)), _) => Ok((builder, PayloadSource::Builder)), + (_, Ok(l2)) => Ok((l2, PayloadSource::L2)), (_, Err(e)) => Err(e), }?; + tracing::Span::current().record("payload_source", context.to_string()); + let inner_payload = ExecutionPayload::from(payload.clone().execution_payload); let block_hash = inner_payload.block_hash(); let block_number = inner_payload.block_number(); diff --git a/src/tracing.rs b/src/tracing.rs index 8f33225d..658f0644 100644 --- a/src/tracing.rs +++ b/src/tracing.rs @@ -13,6 +13,13 @@ use tracing_subscriber::layer::SubscriberExt; use crate::{Args, LogFormat}; +/// Span attribute keys that should be recorded as metric labels. +/// +/// Use caution when adding new attributes here and keep +/// label cardinality in mind. Not all span attributes make +/// appropriate labels. +pub const SPAN_ATTRIBUTE_LABELS: [&str; 3] = ["code", "has_attributes", "payload_source"]; + /// Custom span processor that records span durations as histograms #[derive(Debug)] struct MetricsSpanProcessor; @@ -34,22 +41,24 @@ impl SpanProcessor for MetricsSpanProcessor { }; // Add custom labels - let mut labels = vec![ - ("span_kind", format!("{:?}", span.span_kind)), - ("status", status.into()), - ]; - - if span.name.starts_with("fork_choice_update") { - let with_attributes = span - .attributes - .iter() - .find(|e| e.key.as_str() == "has_attributes") - .map(|e| e.value.as_str()); - - if let Some(with_attributes) = with_attributes { - labels.push(("has_attributes", with_attributes.to_string())); - } - } + let labels = span + .attributes + .iter() + .filter(|attr| SPAN_ATTRIBUTE_LABELS.contains(&attr.key.as_str())) + .map(|attr| { + ( + attr.key.as_str().to_string(), + attr.value.as_str().to_string(), + ) + }) + .chain( + [ + ("span_kind".to_string(), format!("{:?}", span.span_kind)), + ("status".to_string(), status.into()), + ] + .into_iter(), + ) + .collect::>(); histogram!(format!("{}_duration", span.name), &labels).record(duration); } From 9f9c53451a02b0e51a286ddbc1fa8e322d688f87 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Mon, 24 Mar 2025 14:49:11 -0700 Subject: [PATCH 22/23] Add invalid payload assertion back --- src/integration/integration_test.rs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/integration/integration_test.rs b/src/integration/integration_test.rs index 34282c9a..b2b6b6a9 100644 --- a/src/integration/integration_test.rs +++ b/src/integration/integration_test.rs @@ -259,7 +259,7 @@ mod tests { Some(result) }); - let harness = + let mut harness = RollupBoostTestHarnessBuilder::new("test_integration_builder_returns_incorrect_block") .proxy_handler(handler) .build() @@ -272,6 +272,15 @@ mod tests { let (_block, block_creator) = block_generator.generate_block(false).await?; assert!(block_creator.is_l2(), "Block creator should be the builder"); } + // check that at some point we had the log "builder payload was not valid" which signals + // that the builder returned a payload that was not valid and rollup-boost did not process it. + let rb_service = harness._framework.get_mut_service("rollup-boost")?; + + let logs = rb_service.get_logs()?; + assert!( + logs.contains("Invalid payload"), + "Logs should contain the message 'builder payload was not valid'" + ); Ok(()) } From b85211a6cd0288423b9d92f78bd57a0445e92475 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Mon, 24 Mar 2025 17:26:39 -0700 Subject: [PATCH 23/23] update docs with metrics info --- docs/running-rollup-boost.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/running-rollup-boost.md b/docs/running-rollup-boost.md index 23c9f0b4..8991f913 100644 --- a/docs/running-rollup-boost.md +++ b/docs/running-rollup-boost.md @@ -44,7 +44,11 @@ To enable metrics, you can set the `--metrics` flag. This will start a metrics s curl http://localhost:9090/metrics ``` -To check that rollup-boost is sending requests to get blocks from the builder, you can check the `builder_get_payload_v3` metric which is incremented when a `engine_getPayloadV3` call is proxied to the builder. +All spans create duration histogram metrics with the name "{span_name}_duration". Currently, this list includes: + +- fork_choice_updated_v3_duration +- get_payload_v3_duration +- new_payload_v3_duration Additionally, execution engines such as op-rbuilder has rpc metrics exposed to check if `engine_getPayloadV3` requests have been received. To check if the builder blocks are landing on-chain, the builder can be configured to include a builder transaction in the block, which is captured as part of the builder metrics. To see more details about obserability in the op-builder, you can check op-rbuilder's [README](https://github.com/flashbots/rbuilder/tree/develop/crates/op-rbuilder).