diff --git a/.env.example b/.env.example index 5ce40ef..dd8b0d6 100644 --- a/.env.example +++ b/.env.example @@ -1,8 +1,10 @@ JWT_TOKEN=688f5d737bad920bdfb2fc2f488d6b6209eebda1dae949a8de91398d932c517a +BUILDER_JWT_TOKEN=688f5d737bad920bdfb2fc2f488d6b6209eebda1dae949a8de91398d932c517a L2_URL=http://localhost:8551 BUILDER_URL=http://localhost:8552 RPC_HOST=0.0.0.0 RPC_PORT=8081 TRACING=false LOG_LEVEL=info +METRICS=false BOOST_SYNC=false \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index e0aa343..442dc1b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -313,7 +313,7 @@ checksum = "4d0f2d905ebd295e7effec65e5f6868d153936130ae718352771de3e7d03c75c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.85", ] [[package]] @@ -512,7 +512,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.85", ] [[package]] @@ -524,11 +524,11 @@ dependencies = [ "alloy-sol-macro-input", "const-hex", "heck", - "indexmap 2.5.0", + "indexmap 2.6.0", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.85", "syn-solidity", "tiny-keccak", ] @@ -544,7 +544,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.85", "syn-solidity", ] @@ -702,7 +702,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.85", ] [[package]] @@ -879,7 +879,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.85", ] [[package]] @@ -890,7 +890,7 @@ checksum = "a27b8a3a6e1a44fa4c8baf1f653e4172e81486d4941f2237e20dc2d0cf4ddff1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.85", ] [[package]] @@ -917,7 +917,7 @@ checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.85", ] [[package]] @@ -926,6 +926,33 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +[[package]] +name = "aws-lc-rs" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdd82dba44d209fddb11c190e0a94b78651f95299598e472215667417a03ff1d" +dependencies = [ + "aws-lc-sys", + "mirai-annotations", + "paste", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df7a4168111d7eb622a31b214057b8509c0a7e1794f44c546d742330dc793972" +dependencies = [ + "bindgen 0.69.4", + "cc", + "cmake", + "dunce", + "fs_extra", + "libc", + "paste", +] + [[package]] name = "backtrace" version = "0.3.74" @@ -986,12 +1013,33 @@ dependencies = [ "itertools 0.10.5", "lazy_static", "lazycell", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash 1.1.0", + "shlex", + "syn 2.0.85", + "which", +] + +[[package]] +name = "bindgen" +version = "0.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" +dependencies = [ + "bitflags 2.6.0", + "cexpr", + "clang-sys", + "itertools 0.13.0", "proc-macro2", "quote", "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.77", + "syn 2.0.85", ] [[package]] @@ -1206,7 +1254,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.85", ] [[package]] @@ -1215,6 +1263,15 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" +[[package]] +name = "cmake" +version = "0.1.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb1e43aa7fd152b1f968787f7dbcdeb306d1867ff373c69955211876c053f91a" +dependencies = [ + "cc", +] + [[package]] name = "colorchoice" version = "1.0.2" @@ -1382,7 +1439,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.77", + "syn 2.0.85", ] [[package]] @@ -1393,7 +1450,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.77", + "syn 2.0.85", ] [[package]] @@ -1449,7 +1506,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.85", ] [[package]] @@ -1470,7 +1527,7 @@ dependencies = [ "convert_case", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.85", "unicode-xid", ] @@ -1573,6 +1630,12 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "endian-type" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d" + [[package]] name = "enr" version = "0.12.1" @@ -1597,7 +1660,7 @@ checksum = "2f9ed6b3789237c8a0c1c505af1c7eb2c560df6186f01b098c3a1064ea532f38" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.85", ] [[package]] @@ -1692,6 +1755,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2" + [[package]] name = "foreign-types" version = "0.3.2" @@ -1716,6 +1785,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + [[package]] name = "fsevent-sys" version = "4.1.0" @@ -1733,9 +1808,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -1748,9 +1823,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -1758,15 +1833,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -1775,38 +1850,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-macro" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.85", ] [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -1885,7 +1960,7 @@ dependencies = [ "futures-core", "futures-sink", "http 1.1.0", - "indexmap 2.5.0", + "indexmap 2.6.0", "slab", "tokio", "tokio-util", @@ -1915,6 +1990,15 @@ dependencies = [ "serde", ] +[[package]] +name = "hashbrown" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +dependencies = [ + "foldhash", +] + [[package]] name = "heck" version = "0.5.0" @@ -1951,6 +2035,15 @@ dependencies = [ "digest 0.10.7", ] +[[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" @@ -2052,6 +2145,7 @@ dependencies = [ "hyper-util", "log", "rustls", + "rustls-native-certs 0.8.0", "rustls-pki-types", "tokio", "tokio-rustls", @@ -2105,7 +2199,7 @@ dependencies = [ "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows-core", + "windows-core 0.52.0", ] [[package]] @@ -2191,12 +2285,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", - "hashbrown 0.14.5", + "hashbrown 0.15.0", "serde", ] @@ -2367,7 +2461,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.85", ] [[package]] @@ -2493,9 +2587,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.158" +version = "0.2.161" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" [[package]] name = "libloading" @@ -2513,6 +2607,17 @@ version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +[[package]] +name = "libproc" +version = "0.14.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e78a09b56be5adbcad5aa1197371688dc6bb249a26da3bca2011ee2fb987ebfb" +dependencies = [ + "bindgen 0.70.1", + "errno", + "libc", +] + [[package]] name = "libredox" version = "0.1.3" @@ -2561,6 +2666,15 @@ version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75761162ae2b0e580d7e7c390558127e5f01b4194debd6221fd8c207fc80e3f5" +[[package]] +name = "mach2" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" +dependencies = [ + "libc", +] + [[package]] name = "matchers" version = "0.1.0" @@ -2595,6 +2709,83 @@ dependencies = [ "portable-atomic", ] +[[package]] +name = "metrics" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae428771d17306715c5091d446327d1cfdedc82185c65ba8423ab404e45bf10" +dependencies = [ + "ahash", + "portable-atomic", +] + +[[package]] +name = "metrics-derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3dbdd96ed57d565ec744cba02862d707acf373c5772d152abae6ec5c4e24f6c" +dependencies = [ + "proc-macro2", + "quote", + "regex", + "syn 2.0.85", +] + +[[package]] +name = "metrics-exporter-prometheus" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85b6f8152da6d7892ff1b7a1c0fa3f435e92b5918ad67035c3bb432111d9a29b" +dependencies = [ + "base64 0.22.1", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "indexmap 2.6.0", + "ipnet", + "metrics 0.24.0", + "metrics-util", + "quanta", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "metrics-process" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57ca8ecd85575fbb143b2678cb123bb818779391ec0f745b1c4a9dbabadde407" +dependencies = [ + "libc", + "libproc", + "mach2", + "metrics 0.24.0", + "once_cell", + "procfs", + "rlimit", + "windows 0.58.0", +] + +[[package]] +name = "metrics-util" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15b482df36c13dd1869d73d14d28cd4855fbd6cfc32294bee109908a9f4a4ed7" +dependencies = [ + "aho-corasick", + "crossbeam-epoch", + "crossbeam-utils", + "hashbrown 0.15.0", + "indexmap 2.6.0", + "metrics 0.24.0", + "ordered-float", + "quanta", + "radix_trie", + "sketches-ddsketch", +] + [[package]] name = "mime" version = "0.3.17" @@ -2640,6 +2831,12 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "mirai-annotations" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9be0862c1b3f26a88803c4a49de6889c10e608b3ee9344e6ef5b45fb37ad3d1" + [[package]] name = "modular-bitfield" version = "0.11.2" @@ -2678,6 +2875,15 @@ dependencies = [ "tempfile", ] +[[package]] +name = "nibble_vec" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a5d83df9f36fe23f0c3648c6bbb8b0298bb5f1939c8f2704431371f4b84d43" +dependencies = [ + "smallvec", +] + [[package]] name = "nom" version = "7.1.3" @@ -2838,7 +3044,7 @@ checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.85", ] [[package]] @@ -2975,7 +3181,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.85", ] [[package]] @@ -2996,6 +3202,15 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "ordered-float" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83e7ccb95e240b7c9506a3d544f10d935e142cc90b0a1d56954fb44d89ad6b97" +dependencies = [ + "num-traits", +] + [[package]] name = "overload" version = "0.1.1" @@ -3124,7 +3339,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.85", ] [[package]] @@ -3206,6 +3421,16 @@ dependencies = [ "termtree", ] +[[package]] +name = "prettyplease" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" +dependencies = [ + "proc-macro2", + "syn 2.0.85", +] + [[package]] name = "primeorder" version = "0.13.6" @@ -3278,7 +3503,7 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.85", ] [[package]] @@ -3290,6 +3515,28 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "procfs" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc5b72d8145275d844d4b5f6d4e1eef00c8cd889edb6035c21675d1bb1f45c9f" +dependencies = [ + "bitflags 2.6.0", + "hex", + "procfs-core", + "rustix", +] + +[[package]] +name = "procfs-core" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "239df02d8349b06fc07398a3a1697b06418223b1c7725085e801e7c0fc6a12ec" +dependencies = [ + "bitflags 2.6.0", + "hex", +] + [[package]] name = "proptest" version = "1.5.0" @@ -3318,7 +3565,22 @@ checksum = "6ff7ff745a347b87471d859a377a9a404361e7efc2a971d73424a6d183c0fc77" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.85", +] + +[[package]] +name = "quanta" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5167a477619228a0b284fac2674e3c388cba90631d7b7de620e6f1fcd08da5" +dependencies = [ + "crossbeam-utils", + "libc", + "once_cell", + "raw-cpuid", + "wasi", + "web-sys", + "winapi", ] [[package]] @@ -3342,6 +3604,16 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" +[[package]] +name = "radix_trie" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c069c179fcdc6a2fe24d8d18305cf085fdbd4f922c041943e203685d6a1c58fd" +dependencies = [ + "endian-type", + "nibble_vec", +] + [[package]] name = "rand" version = "0.8.5" @@ -3381,6 +3653,15 @@ dependencies = [ "rand_core", ] +[[package]] +name = "raw-cpuid" +version = "11.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ab240315c661615f2ee9f0f2cd32d5a7343a84d5ebcccb99d46e6637565e7b0" +dependencies = [ + "bitflags 2.6.0", +] + [[package]] name = "rayon" version = "1.10.0" @@ -3506,7 +3787,7 @@ dependencies = [ "alloy-rlp", "futures-core", "futures-util", - "metrics", + "metrics 0.23.0", "reth-chainspec", "reth-metrics", "reth-payload-builder", @@ -3543,7 +3824,7 @@ dependencies = [ "alloy-primitives", "auto_impl", "derive_more", - "metrics", + "metrics 0.23.0", "parking_lot", "pin-project", "reth-chainspec", @@ -3605,7 +3886,7 @@ dependencies = [ "convert_case", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.85", ] [[package]] @@ -3639,7 +3920,7 @@ dependencies = [ "bytes", "derive_more", "eyre", - "metrics", + "metrics 0.23.0", "page_size", "paste", "reth-db-api", @@ -3669,7 +3950,7 @@ dependencies = [ "alloy-primitives", "bytes", "derive_more", - "metrics", + "metrics 0.23.0", "modular-bitfield", "parity-scale-codec", "reth-codecs", @@ -3781,7 +4062,7 @@ dependencies = [ "alloy-eips", "auto_impl", "futures-util", - "metrics", + "metrics 0.23.0", "reth-chainspec", "reth-execution-errors", "reth-execution-types", @@ -3863,7 +4144,7 @@ dependencies = [ "byteorder", "dashmap", "derive_more", - "indexmap 2.5.0", + "indexmap 2.6.0", "parking_lot", "reth-mdbx-sys", "thiserror", @@ -3875,7 +4156,7 @@ name = "reth-mdbx-sys" version = "1.0.7" source = "git+https://github.com/paradigmxyz/reth.git?tag=v1.0.7#75b7172cf77eb4fd65fe1a6924f75066fb09fcd1" dependencies = [ - "bindgen", + "bindgen 0.69.4", "cc", ] @@ -3884,7 +4165,7 @@ name = "reth-metrics" version = "1.0.7" source = "git+https://github.com/paradigmxyz/reth.git?tag=v1.0.7#75b7172cf77eb4fd65fe1a6924f75066fb09fcd1" dependencies = [ - "metrics", + "metrics 0.23.0", "reth-metrics-derive", ] @@ -3896,7 +4177,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.77", + "syn 2.0.85", ] [[package]] @@ -4042,7 +4323,7 @@ source = "git+https://github.com/paradigmxyz/reth.git?tag=v1.0.7#75b7172cf77eb4f dependencies = [ "alloy-primitives", "futures-util", - "metrics", + "metrics 0.23.0", "pin-project", "reth-errors", "reth-ethereum-engine-primitives", @@ -4137,7 +4418,7 @@ dependencies = [ "auto_impl", "dashmap", "itertools 0.13.0", - "metrics", + "metrics 0.23.0", "notify", "parking_lot", "rayon", @@ -4308,7 +4589,7 @@ dependencies = [ "auto_impl", "dyn-clone", "futures-util", - "metrics", + "metrics 0.23.0", "reth-metrics", "thiserror", "tokio", @@ -4343,7 +4624,7 @@ dependencies = [ "auto_impl", "bitflags 2.6.0", "futures-util", - "metrics", + "metrics 0.23.0", "parking_lot", "reth-chain-state", "reth-chainspec", @@ -4375,7 +4656,7 @@ dependencies = [ "auto_impl", "derive_more", "itertools 0.13.0", - "metrics", + "metrics 0.23.0", "rayon", "reth-execution-errors", "reth-metrics", @@ -4417,7 +4698,7 @@ dependencies = [ "auto_impl", "derive_more", "itertools 0.13.0", - "metrics", + "metrics 0.23.0", "rayon", "reth-db", "reth-db-api", @@ -4531,6 +4812,15 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "rlimit" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7043b63bd0cd1aaa628e476b80e6d4023a3b50eb32789f2728908107bd0c793a" +dependencies = [ + "libc", +] + [[package]] name = "rlp" version = "0.5.2" @@ -4572,12 +4862,18 @@ dependencies = [ "assert_cmd", "clap", "dotenv", + "futures", "http 1.1.0", "http-body 0.4.6", "http-body-util", "hyper", "hyper-util", "jsonrpsee", + "metrics 0.24.0", + "metrics-derive", + "metrics-exporter-prometheus", + "metrics-process", + "metrics-util", "op-alloy-rpc-types", "op-alloy-rpc-types-engine", "predicates", @@ -4691,6 +4987,7 @@ version = "0.23.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2dabaac7466917e566adb06783a81ca48944c6898a1b08b9374106dd671f4c8" dependencies = [ + "aws-lc-rs", "log", "once_cell", "ring", @@ -4713,6 +5010,19 @@ dependencies = [ "security-framework", ] +[[package]] +name = "rustls-native-certs" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcaf18a4f2be7326cd874a5fa579fae794320a0f388d365dca7e480e55f83f8a" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "rustls-pki-types", + "schannel", + "security-framework", +] + [[package]] name = "rustls-pemfile" version = "2.1.3" @@ -4741,7 +5051,7 @@ dependencies = [ "log", "once_cell", "rustls", - "rustls-native-certs", + "rustls-native-certs 0.7.3", "rustls-platform-verifier-android", "rustls-webpki", "security-framework", @@ -4762,6 +5072,7 @@ version = "0.102.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" dependencies = [ + "aws-lc-rs", "ring", "rustls-pki-types", "untrusted", @@ -4924,7 +5235,7 @@ checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.85", ] [[package]] @@ -4933,7 +5244,7 @@ version = "1.0.128" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" dependencies = [ - "indexmap 2.5.0", + "indexmap 2.6.0", "itoa", "memchr", "ryu", @@ -4948,7 +5259,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.85", ] [[package]] @@ -4973,7 +5284,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.5.0", + "indexmap 2.6.0", "serde", "serde_derive", "serde_json", @@ -4990,7 +5301,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.85", ] [[package]] @@ -5081,6 +5392,12 @@ dependencies = [ "time", ] +[[package]] +name = "sketches-ddsketch" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1e9a774a6c28142ac54bb25d25562e6bcf957493a184f15ad4eebccb23e410a" + [[package]] name = "slab" version = "0.4.9" @@ -5175,7 +5492,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.77", + "syn 2.0.85", ] [[package]] @@ -5210,9 +5527,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.77" +version = "2.0.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" +checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56" dependencies = [ "proc-macro2", "quote", @@ -5228,7 +5545,7 @@ dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.85", ] [[package]] @@ -5257,7 +5574,7 @@ dependencies = [ "libc", "ntapi", "once_cell", - "windows", + "windows 0.52.0", ] [[package]] @@ -5323,7 +5640,7 @@ checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.85", ] [[package]] @@ -5446,7 +5763,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.85", ] [[package]] @@ -5508,7 +5825,7 @@ version = "0.22.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b072cee73c449a636ffd6f32bd8de3a9f7119139aff882f44943ce2986dc5cf" dependencies = [ - "indexmap 2.5.0", + "indexmap 2.6.0", "toml_datetime", "winnow", ] @@ -5587,7 +5904,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.85", ] [[package]] @@ -5841,7 +6158,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.85", "wasm-bindgen-shared", ] @@ -5875,7 +6192,7 @@ checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.85", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5905,6 +6222,18 @@ dependencies = [ "rustls-pki-types", ] +[[package]] +name = "which" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +dependencies = [ + "either", + "home", + "once_cell", + "rustix", +] + [[package]] name = "winapi" version = "0.3.9" @@ -5942,7 +6271,17 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" dependencies = [ - "windows-core", + "windows-core 0.52.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" +dependencies = [ + "windows-core 0.58.0", "windows-targets 0.52.6", ] @@ -5955,6 +6294,41 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-core" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-implement" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "windows-interface" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", +] + [[package]] name = "windows-registry" version = "0.2.0" @@ -6169,7 +6543,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.85", ] [[package]] @@ -6189,7 +6563,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.85", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 7fc589e..85faad4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,6 +28,12 @@ hyper-util = { version = "0.1", features = ["full"] } serde_json = "1.0.96" reth-rpc-layer = { git = "https://github.com/paradigmxyz/reth.git", tag = "v1.0.7" } reth-optimism-payload-builder = { git = "https://github.com/paradigmxyz/reth.git", tag = "v1.0.7", features = ["optimism"] } +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" [dev-dependencies] anyhow = "1.0" diff --git a/README.md b/README.md index 43fe1f8..a066ea2 100644 --- a/README.md +++ b/README.md @@ -14,12 +14,16 @@ cargo run -- [OPTIONS] ### Command-line Options - `--jwt-token `: JWT token for authentication (required) +- `--jwt-path `: Path to the JWT secret file (required if `--jwt-token` is not provided) - `--l2-url `: URL of the local L2 execution engine (required) - `--builder-url `: URL of the builder execution engine (required) +- `--builder-jwt-token `: JWT token for builder authentication. defaults to the value of `--jwt-token` if not provided +- `--builder-jwt-path `: Path to the builder JWT secret file. - `--rpc-host `: Host to run the server on (default: 0.0.0.0) - `--rpc-port `: Port to run the server on (default: 8081) - `--tracing`: Enable tracing (default: false) - `--log-level `: Log level (default: info) +- `--metrics`: Enable metrics (default: false) - `--boost-sync`: Enable syncing the builder with the proposer op-node (default: false) ### Environment Variables diff --git a/src/error.rs b/src/error.rs index ee0e4a5..734dd7c 100644 --- a/src/error.rs +++ b/src/error.rs @@ -8,4 +8,6 @@ pub enum Error { InitRPCClient(String), #[error("Error Initializing RPC Server: {0}")] InitRPCServer(String), + #[error("Error Initializing Prometheus Metrics: {0}")] + InitMetrics(String), } diff --git a/src/main.rs b/src/main.rs index 09137b3..aa29107 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,6 +7,9 @@ use jsonrpsee::http_client::transport::HttpBackend; use jsonrpsee::http_client::{HttpClient, HttpClientBuilder}; use jsonrpsee::server::Server; use jsonrpsee::RpcModule; +use metrics::ServerMetrics; +use metrics_exporter_prometheus::PrometheusBuilder; +use metrics_util::layers::{PrefixLayer, Stack}; use proxy::ProxyLayer; use reth_rpc_layer::{AuthClientLayer, AuthClientService}; use server::{EngineApiServer, EthEngineApi}; @@ -16,6 +19,7 @@ use tracing::{info, Level}; use tracing_subscriber::EnvFilter; mod error; +mod metrics; mod proxy; mod server; @@ -63,6 +67,10 @@ struct Args { #[arg(long, env, default_value = "false")] tracing: bool, + // Enable Prometheus metrics + #[arg(long, env, default_value = "false")] + metrics: bool, + /// Log level #[arg(long, env, default_value = "info")] log_level: Level, @@ -81,6 +89,21 @@ async fn main() -> Result<()> { .with_env_filter(EnvFilter::new(args.log_level.to_string())) // Set the log level .init(); + let (metrics, handler) = 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() + .map_err(|e| Error::InitMetrics(e.to_string()))?; + + (Some(Arc::new(ServerMetrics::default())), Some(handle)) + } else { + (None, None) + }; + // Handle JWT secret let jwt_secret = match (args.jwt_path, args.jwt_token) { (Some(file), None) => { @@ -119,6 +142,7 @@ async fn main() -> Result<()> { Arc::new(l2_client), Arc::new(builder_client), args.boost_sync, + metrics, ); let mut module: RpcModule<()> = RpcModule::new(()); module @@ -131,6 +155,7 @@ async fn main() -> Result<()> { args.l2_url .parse::() .map_err(|e| Error::InvalidArgs(e.to_string()))?, + handler, )); let server = Server::builder() .set_http_middleware(service_builder) diff --git a/src/metrics.rs b/src/metrics.rs new file mode 100644 index 0000000..ac25905 --- /dev/null +++ b/src/metrics.rs @@ -0,0 +1,18 @@ +use metrics::Counter; +use metrics_derive::Metrics; + +#[derive(Metrics)] +#[metrics(scope = "rpc")] +pub struct ServerMetrics { + #[metric(describe = "Count of forkchoice_updated_v3 calls proxied to the builder")] + pub fcu_count: Counter, + + #[metric(describe = "Count of new_payload_v3 calls proxied to the builder")] + pub new_payload_count: Counter, + + #[metric(describe = "Count of get_payload_v3 calls proxied to the builder")] + pub get_payload_count: Counter, + + #[metric(describe = "Count of send_raw_transaction calls proxied to the builder")] + pub send_raw_tx_count: Counter, +} diff --git a/src/proxy.rs b/src/proxy.rs index a1e2156..aa9fb9d 100644 --- a/src/proxy.rs +++ b/src/proxy.rs @@ -1,9 +1,11 @@ -use http::Uri; +use http::header::CONTENT_TYPE; +use http::{HeaderValue, Uri}; use hyper_util::client::legacy::connect::HttpConnector; use hyper_util::client::legacy::Client; use hyper_util::rt::TokioExecutor; use jsonrpsee::core::{http_helpers, BoxError}; use jsonrpsee::http_client::{HttpBody, HttpRequest, HttpResponse}; +use metrics_exporter_prometheus::PrometheusHandle; use std::task::{Context, Poll}; use std::{future::Future, pin::Pin}; use tower::{Layer, Service}; @@ -14,11 +16,12 @@ const MULTIPLEX_METHODS: [&str; 2] = ["engine_", "eth_sendRawTransaction"]; #[derive(Debug, Clone)] pub struct ProxyLayer { target_url: Uri, + handle: Option, } impl ProxyLayer { - pub fn new(target_url: Uri) -> Self { - ProxyLayer { target_url } + pub fn new(target_url: Uri, handle: Option) -> Self { + ProxyLayer { target_url, handle } } } @@ -30,15 +33,17 @@ impl Layer for ProxyLayer { inner, client: Client::builder(TokioExecutor::new()).build_http(), target_url: self.target_url.clone(), + handle: self.handle.clone(), } } } -#[derive(Debug, Clone)] +#[derive(Clone)] pub struct ProxyService { inner: S, client: Client, target_url: Uri, + handle: Option, } impl Service> for ProxyService @@ -60,7 +65,18 @@ where fn call(&mut self, req: HttpRequest) -> Self::Future { match req.uri().path() { "/healthz" => return Box::pin(async { Ok(Self::Response::new(HttpBody::from("OK"))) }), - "/metrics" => {} + "/metrics" => { + if let Some(handle) = self.handle.as_ref() { + let metrics = handle.render(); + return Box::pin(async { + let mut response = Self::Response::new(HttpBody::from(metrics)); + response + .headers_mut() + .insert(CONTENT_TYPE, HeaderValue::from_static("text/plain")); + Ok::(response) + }); + } + } _ => {} }; @@ -238,7 +254,8 @@ mod tests { /// Spawn a new RPC server with a proxy layer. async fn spawn_proxy_server() -> ServerHandle { let addr = format!("{ADDR}:{PORT}"); - let proxy_layer = ProxyLayer::new(format!("http://{ADDR}:{PROXY_PORT}").parse().unwrap()); + let proxy_layer = + ProxyLayer::new(format!("http://{ADDR}:{PROXY_PORT}").parse().unwrap(), None); // Create a layered server let server = ServerBuilder::default() .set_http_middleware(tower::ServiceBuilder::new().layer(proxy_layer)) diff --git a/src/server.rs b/src/server.rs index 4fcb125..4445e6f 100644 --- a/src/server.rs +++ b/src/server.rs @@ -17,6 +17,8 @@ use reth_rpc_layer::AuthClientService; use std::sync::Arc; use tracing::{debug, error, info}; +use crate::metrics::ServerMetrics; + #[rpc(server, client, namespace = "engine")] pub trait EngineApi { #[method(name = "forkchoiceUpdatedV3")] @@ -51,6 +53,7 @@ pub struct EthEngineApi> { l2_client: Arc>, builder_client: Arc>, boost_sync: bool, + metrics: Option>, } impl EthEngineApi { @@ -58,11 +61,13 @@ impl EthEngineApi { l2_client: Arc>, builder_client: Arc>, boost_sync: bool, + metrics: Option>, ) -> Self { Self { l2_client, builder_client, boost_sync, + metrics, } } } @@ -74,6 +79,11 @@ impl EthApiServer for EthEngineApi { message = "received send_raw_transaction", "bytes_len" = bytes.len() ); + + if let Some(metrics) = &self.metrics { + metrics.send_raw_tx_count.increment(1); + } + let builder = self.builder_client.clone(); let tx_bytes = bytes.clone(); tokio::spawn(async move { @@ -81,6 +91,7 @@ impl EthApiServer for EthEngineApi { error!(message = "error calling send_raw_transaction for builder", "error" = %e); }) }); + self.l2_client .send_raw_transaction(bytes) .await @@ -123,6 +134,9 @@ impl EngineApiServer for EthEngineApi { if should_send_to_builder { // async call to builder to trigger payload building and sync + if let Some(metrics) = &self.metrics { + metrics.fcu_count.increment(1); + } let builder = self.builder_client.clone(); let attr = payload_attributes.clone(); tokio::spawn(async move { @@ -163,17 +177,24 @@ impl EngineApiServer for EthEngineApi { ) -> 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 { - let payload = self.builder_client.get_payload_v3(payload_id).await.map_err(|e| { + let builder_client_future = Box::pin(async move { + if let Some(metrics) = &self.metrics { + metrics.get_payload_count.increment(1); + } + let builder = self.builder_client.clone(); + let payload = builder.get_payload_v3(payload_id).await.map_err(|e| { error!(message = "error calling get_payload_v3 from builder", "error" = %e, "payload_id" = %payload_id); e - })?; + })?; info!(message = "received payload from builder", "payload_id" = %payload_id, "block_hash" = %payload.as_v1_payload().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. + if let Some(metrics) = &self.metrics { + metrics.new_payload_count.increment(1); + } let payload_status = self.l2_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", "error" = %e, "payload_id" = %payload_id); e @@ -217,6 +238,10 @@ impl EngineApiServer for EthEngineApi { // async call to builder to sync the builder node if self.boost_sync { + if let Some(metrics) = &self.metrics { + metrics.new_payload_count.increment(1); + } + let builder = self.builder_client.clone(); let builder_payload = payload.clone(); let builder_versioned_hashes = versioned_hashes.clone();