From cdf505358c4143d6c6119e3864dbea418e5371a4 Mon Sep 17 00:00:00 2001 From: Bohdan Ohorodnii <35969035+varex83@users.noreply.github.com> Date: Wed, 26 Nov 2025 12:43:02 +0200 Subject: [PATCH 1/7] feat: add core/consensus/protocols --- Cargo.lock | 4360 +++++++++++++++-- Cargo.toml | 1 + crates/charon-core/Cargo.toml | 3 +- crates/charon-core/src/consensus/mod.rs | 8 + crates/charon-core/src/consensus/protocols.rs | 110 + crates/charon-core/src/lib.rs | 3 + deps.txt | 59 + 7 files changed, 4251 insertions(+), 293 deletions(-) create mode 100644 crates/charon-core/src/consensus/mod.rs create mode 100644 crates/charon-core/src/consensus/protocols.rs create mode 100644 deps.txt diff --git a/Cargo.lock b/Cargo.lock index 8c991f8e..aa3e11fa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,68 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "crypto-common", + "generic-array", +] + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "aes-gcm" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "ghash", + "subtle", +] + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + [[package]] name = "android_system_properties" version = "0.1.5" @@ -11,12 +73,135 @@ dependencies = [ "libc", ] +[[package]] +name = "anyhow" +version = "1.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "asn1-rs" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56624a96882bb8c26d61312ae18cb45868e5a9992ea73c58e45c3101e56a1e60" +dependencies = [ + "asn1-rs-derive", + "asn1-rs-impl", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror 2.0.17", + "time", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3109e49b1e4909e9db6515a30c633684d68cdeaa252f215214cb4fa1a5bfee2c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.107", + "synstructure", +] + +[[package]] +name = "asn1-rs-impl" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.107", +] + +[[package]] +name = "asn1_der" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "155a5a185e42c6b77ac7b88a15143d930a9e9727a5b7b77eed417404ab15c247" + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.107", +] + +[[package]] +name = "asynchronous-codec" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a860072022177f903e59730004fb5dc13db9275b79bb2aef7ba8ce831956c233" +dependencies = [ + "bytes", + "futures-sink", + "futures-util", + "memchr", + "pin-project-lite", +] + [[package]] name = "atomic-waker" version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" +[[package]] +name = "attohttpc" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16e2cdb6d5ed835199484bb92bb8b3edd526effe995c61732580439c1a67e2e9" +dependencies = [ + "base64", + "http", + "log", + "url", +] + [[package]] name = "autocfg" version = "1.5.0" @@ -75,23 +260,114 @@ dependencies = [ "tracing", ] +[[package]] +name = "base-x" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base256emoji" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e9430d9a245a77c92176e649af6e275f20839a48389859d1661e9a128d077c" +dependencies = [ + "const-str", + "match-lookup", +] + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" + +[[package]] +name = "bimap" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "230c5f1ca6a325a32553f8640d31ac9b49f2411e901e427570154868b46da4f7" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "bitflags" version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + [[package]] name = "bumpalo" version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + [[package]] name = "bytes" version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +dependencies = [ + "serde", +] + +[[package]] +name = "cbor4ii" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "472931dd4dfcc785075b09be910147f9c6258883fc4591d0dac6116392b2daa6" +dependencies = [ + "serde", +] [[package]] name = "cc" @@ -109,6 +385,36 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "chacha20" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "chacha20poly1305" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" +dependencies = [ + "aead", + "chacha20", + "cipher", + "poly1305", + "zeroize", +] + [[package]] name = "charon" version = "0.1.0" @@ -135,6 +441,7 @@ version = "0.1.0" dependencies = [ "chrono", "hex", + "libp2p", "serde", "serde_json", ] @@ -190,472 +497,3291 @@ dependencies = [ ] [[package]] -name = "core-foundation-sys" -version = "0.8.7" +name = "cipher" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", + "zeroize", +] [[package]] -name = "find-msvc-tools" -version = "0.1.4" +name = "concurrent-queue" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] [[package]] -name = "fnv" -version = "1.0.7" +name = "const-oid" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] -name = "form_urlencoded" -version = "1.2.2" +name = "const-str" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" -dependencies = [ - "percent-encoding", -] +checksum = "2f421161cb492475f1661ddc9815a745a1c894592070661180fdec3d4872e9c3" [[package]] -name = "futures-channel" -version = "0.3.31" +name = "core-foundation" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ - "futures-core", + "core-foundation-sys", + "libc", ] [[package]] -name = "futures-core" -version = "0.3.31" +name = "core-foundation-sys" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] -name = "futures-task" -version = "0.3.31" +name = "core2" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" +dependencies = [ + "memchr", +] [[package]] -name = "futures-util" -version = "0.3.31" +name = "cpufeatures" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ - "futures-core", - "futures-task", - "pin-project-lite", - "pin-utils", + "libc", ] [[package]] -name = "hex" -version = "0.4.3" +name = "critical-section" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" [[package]] -name = "http" -version = "1.3.1" +name = "crossbeam-channel" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" dependencies = [ - "bytes", - "fnv", - "itoa", + "crossbeam-utils", ] [[package]] -name = "http-body" -version = "1.0.1" +name = "crossbeam-deque" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ - "bytes", - "http", + "crossbeam-epoch", + "crossbeam-utils", ] [[package]] -name = "http-body-util" -version = "0.1.3" +name = "crossbeam-epoch" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "pin-project-lite", + "crossbeam-utils", ] [[package]] -name = "httparse" -version = "1.10.1" +name = "crossbeam-utils" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] -name = "httpdate" -version = "1.0.3" +name = "crunchy" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] -name = "hyper" -version = "1.7.0" +name = "crypto-bigint" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ - "atomic-waker", - "bytes", - "futures-channel", - "futures-core", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "pin-utils", - "smallvec", - "tokio", + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", ] [[package]] -name = "hyper-util" -version = "0.1.17" +name = "crypto-common" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "hyper", - "pin-project-lite", - "tokio", - "tower-service", + "generic-array", + "rand_core 0.6.4", + "typenum", ] [[package]] -name = "iana-time-zone" -version = "0.1.64" +name = "ctr" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "log", - "wasm-bindgen", - "windows-core", + "cipher", ] [[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" +name = "cuckoofilter" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +checksum = "b810a8449931679f64cd7eef1bbd0fa315801b6d5d9cdc1ace2804d6529eee18" dependencies = [ - "cc", + "byteorder", + "fnv", + "rand 0.7.3", ] [[package]] -name = "itoa" -version = "1.0.15" +name = "curve25519-dalek" +version = "4.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest", + "fiat-crypto", + "rustc_version", + "subtle", + "zeroize", +] [[package]] -name = "js-sys" -version = "0.3.81" +name = "curve25519-dalek-derive" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ - "once_cell", - "wasm-bindgen", + "proc-macro2", + "quote", + "syn 2.0.107", ] [[package]] -name = "libc" -version = "0.2.177" +name = "data-encoding" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" [[package]] -name = "lock_api" -version = "0.4.14" +name = "data-encoding-macro" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +checksum = "47ce6c96ea0102f01122a185683611bd5ac8d99e62bc59dd12e6bda344ee673d" dependencies = [ - "scopeguard", + "data-encoding", + "data-encoding-macro-internal", ] [[package]] -name = "log" -version = "0.4.28" +name = "data-encoding-macro-internal" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" +checksum = "8d162beedaa69905488a8da94f5ac3edb4dd4788b732fadb7bd120b2625c1976" +dependencies = [ + "data-encoding", + "syn 2.0.107", +] [[package]] -name = "matchit" -version = "0.8.4" +name = "der" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] [[package]] -name = "memchr" -version = "2.7.6" +name = "der-parser" +version = "10.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" +checksum = "07da5016415d5a3c4dd39b11ed26f915f52fc4e0dc197d87908bc916e51bc1a6" +dependencies = [ + "asn1-rs", + "displaydoc", + "nom", + "num-bigint", + "num-traits", + "rusticata-macros", +] [[package]] -name = "mime" -version = "0.3.17" +name = "deranged" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" +dependencies = [ + "powerfmt", +] [[package]] -name = "mio" -version = "1.1.0" +name = "digest" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "libc", - "wasi", - "windows-sys 0.61.2", + "block-buffer", + "const-oid", + "crypto-common", + "subtle", ] [[package]] -name = "num-traits" -version = "0.2.19" +name = "displaydoc" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ - "autocfg", + "proc-macro2", + "quote", + "syn 2.0.107", ] [[package]] -name = "once_cell" -version = "1.21.3" +name = "dtoa" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "d6add3b8cff394282be81f3fc1a0605db594ed69890078ca6e2cab1c408bcf04" [[package]] -name = "parking_lot" -version = "0.12.5" +name = "ecdsa" +version = "0.16.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ - "lock_api", - "parking_lot_core", + "der", + "digest", + "elliptic-curve", + "rfc6979", + "signature", + "spki", ] [[package]] -name = "parking_lot_core" -version = "0.9.12" +name = "ed25519" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-link", + "pkcs8", + "signature", ] [[package]] -name = "percent-encoding" -version = "2.3.2" +name = "ed25519-dalek" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" +checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" +dependencies = [ + "curve25519-dalek", + "ed25519", + "serde", + "sha2", + "subtle", + "zeroize", +] [[package]] -name = "pin-project-lite" -version = "0.2.16" +name = "either" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] -name = "pin-utils" -version = "0.1.0" +name = "elliptic-curve" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest", + "ff", + "generic-array", + "group", + "pem-rfc7468", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] [[package]] -name = "proc-macro2" -version = "1.0.101" +name = "enum-as-inner" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" +checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" dependencies = [ - "unicode-ident", + "heck", + "proc-macro2", + "quote", + "syn 2.0.107", ] [[package]] -name = "quote" -version = "1.0.41" +name = "equivalent" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ - "proc-macro2", + "libc", + "windows-sys 0.61.2", ] [[package]] -name = "redox_syscall" -version = "0.5.18" +name = "event-listener" +version = "5.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" dependencies = [ - "bitflags", + "concurrent-queue", + "parking", + "pin-project-lite", ] [[package]] -name = "rustversion" -version = "1.0.22" +name = "event-listener-strategy" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener", + "pin-project-lite", +] [[package]] -name = "ryu" -version = "1.0.20" +name = "ff" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] [[package]] -name = "scopeguard" -version = "1.2.0" +name = "fiat-crypto" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" [[package]] -name = "serde" -version = "1.0.228" +name = "find-msvc-tools" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" -dependencies = [ - "serde_core", - "serde_derive", -] +checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" [[package]] -name = "serde_core" -version = "1.0.228" +name = "fnv" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" -dependencies = [ - "serde_derive", -] +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] -name = "serde_derive" -version = "1.0.228" +name = "foldhash" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ - "proc-macro2", - "quote", - "syn", + "percent-encoding", ] [[package]] -name = "serde_json" -version = "1.0.145" +name = "futures" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", - "serde_core", + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", ] [[package]] -name = "serde_path_to_error" -version = "0.1.20" +name = "futures-bounded" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" +checksum = "91f328e7fb845fc832912fb6a34f40cf6d1888c92f974d1893a54e97b5ff542e" dependencies = [ - "itoa", - "serde", - "serde_core", + "futures-timer", + "futures-util", ] [[package]] -name = "serde_urlencoded" -version = "0.7.1" +name = "futures-channel" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", + "futures-core", + "futures-sink", ] [[package]] -name = "shlex" -version = "1.3.0" +name = "futures-core" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] -name = "signal-hook-registry" -version = "1.4.6" +name = "futures-executor" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ - "libc", + "futures-core", + "futures-task", + "futures-util", + "num_cpus", ] [[package]] -name = "smallvec" -version = "1.15.1" +name = "futures-io" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] -name = "socket2" -version = "0.6.1" +name = "futures-lite" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" dependencies = [ - "libc", - "windows-sys 0.60.2", + "futures-core", + "pin-project-lite", ] [[package]] -name = "syn" -version = "2.0.107" +name = "futures-macro" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a26dbd934e5451d21ef060c018dae56fc073894c5a7896f882928a76e6d081b" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "unicode-ident", + "syn 2.0.107", ] [[package]] -name = "sync_wrapper" -version = "1.0.2" +name = "futures-rustls" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +checksum = "a8f2f12607f92c69b12ed746fabf9ca4f5c482cba46679c1a75b874ed7c26adb" +dependencies = [ + "futures-io", + "rustls", + "rustls-pki-types", +] [[package]] -name = "tokio" -version = "1.48.0" +name = "futures-sink" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" -dependencies = [ +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-timer" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" +dependencies = [ + "gloo-timers", + "send_wrapper 0.4.0", +] + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi", + "wasip2", + "wasm-bindgen", +] + +[[package]] +name = "ghash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" +dependencies = [ + "opaque-debug", + "polyval", +] + +[[package]] +name = "gloo-timers" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "h2" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + +[[package]] +name = "hashlink" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" +dependencies = [ + "hashbrown 0.14.5", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hex_fmt" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b07f60793ff0a4d9cef0f18e63b5357e06209987153a64648c972c1e5aff336f" + +[[package]] +name = "hickory-proto" +version = "0.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8a6fe56c0038198998a6f217ca4e7ef3a5e51f46163bd6dd60b5c71ca6c6502" +dependencies = [ + "async-trait", + "cfg-if", + "data-encoding", + "enum-as-inner", + "futures-channel", + "futures-io", + "futures-util", + "idna", + "ipnet", + "once_cell", + "rand 0.9.2", + "ring", + "socket2 0.5.10", + "thiserror 2.0.17", + "tinyvec", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "hickory-resolver" +version = "0.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc62a9a99b0bfb44d2ab95a7208ac952d31060efc16241c87eaf36406fecf87a" +dependencies = [ + "cfg-if", + "futures-util", + "hickory-proto", + "ipconfig", + "moka", + "once_cell", + "parking_lot", + "rand 0.9.2", + "resolv-conf", + "smallvec", + "thiserror 2.0.17", + "tokio", + "tracing", +] + +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-util" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http", + "http-body", + "hyper", + "libc", + "pin-project-lite", + "socket2 0.6.1", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core 0.62.2", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_collections" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" + +[[package]] +name = "icu_properties" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" + +[[package]] +name = "icu_provider" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "if-addrs" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cabb0019d51a643781ff15c9c8a3e5dedc365c47211270f4e8f82812fedd8f0a" +dependencies = [ + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "if-watch" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdf9d64cfcf380606e64f9a0bcf493616b65331199f984151a6fa11a7b3cde38" +dependencies = [ + "async-io", + "core-foundation", + "fnv", + "futures", + "if-addrs", + "ipnet", + "log", + "netlink-packet-core", + "netlink-packet-route", + "netlink-proto", + "netlink-sys", + "rtnetlink", + "system-configuration", + "tokio", + "windows 0.53.0", +] + +[[package]] +name = "igd-next" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "516893339c97f6011282d5825ac94fc1c7aad5cad26bdc2d0cee068c0bf97f97" +dependencies = [ + "async-trait", + "attohttpc", + "bytes", + "futures", + "http", + "http-body-util", + "hyper", + "hyper-util", + "log", + "rand 0.9.2", + "tokio", + "url", + "xmltree", +] + +[[package]] +name = "indexmap" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" +dependencies = [ + "equivalent", + "hashbrown 0.16.1", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + +[[package]] +name = "ipconfig" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" +dependencies = [ + "socket2 0.5.10", + "widestring", + "windows-sys 0.48.0", + "winreg", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "js-sys" +version = "0.3.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "k256" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2", + "signature", +] + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.177" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" + +[[package]] +name = "libp2p" +version = "0.56.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce71348bf5838e46449ae240631117b487073d5f347c06d434caddcb91dceb5a" +dependencies = [ + "bytes", + "either", + "futures", + "futures-timer", + "getrandom 0.2.16", + "libp2p-allow-block-list", + "libp2p-autonat", + "libp2p-connection-limits", + "libp2p-core", + "libp2p-dcutr", + "libp2p-dns", + "libp2p-floodsub", + "libp2p-gossipsub", + "libp2p-identify", + "libp2p-identity", + "libp2p-kad", + "libp2p-mdns", + "libp2p-memory-connection-limits", + "libp2p-metrics", + "libp2p-noise", + "libp2p-ping", + "libp2p-plaintext", + "libp2p-pnet", + "libp2p-quic", + "libp2p-relay", + "libp2p-rendezvous", + "libp2p-request-response", + "libp2p-swarm", + "libp2p-tcp", + "libp2p-tls", + "libp2p-uds", + "libp2p-upnp", + "libp2p-webrtc-websys", + "libp2p-websocket", + "libp2p-websocket-websys", + "libp2p-webtransport-websys", + "libp2p-yamux", + "multiaddr", + "pin-project", + "rw-stream-sink", + "thiserror 2.0.17", +] + +[[package]] +name = "libp2p-allow-block-list" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d16ccf824ee859ca83df301e1c0205270206223fd4b1f2e512a693e1912a8f4a" +dependencies = [ + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", +] + +[[package]] +name = "libp2p-autonat" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fab5e25c49a7d48dac83d95d8f3bac0a290d8a5df717012f6e34ce9886396c0b" +dependencies = [ + "async-trait", + "asynchronous-codec", + "either", + "futures", + "futures-bounded", + "futures-timer", + "libp2p-core", + "libp2p-identity", + "libp2p-request-response", + "libp2p-swarm", + "quick-protobuf", + "quick-protobuf-codec", + "rand 0.8.5", + "rand_core 0.6.4", + "thiserror 2.0.17", + "tracing", + "web-time", +] + +[[package]] +name = "libp2p-connection-limits" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18b8b607cf3bfa2f8c57db9c7d8569a315d5cc0a282e6bfd5ebfc0a9840b2a0" +dependencies = [ + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", +] + +[[package]] +name = "libp2p-core" +version = "0.43.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d28e2d2def7c344170f5c6450c0dbe3dfef655610dbfde2f6ac28a527abbe36" +dependencies = [ + "either", + "fnv", + "futures", + "futures-timer", + "libp2p-identity", + "multiaddr", + "multihash", + "multistream-select", + "parking_lot", + "pin-project", + "quick-protobuf", + "rand 0.8.5", + "rw-stream-sink", + "thiserror 2.0.17", + "tracing", + "unsigned-varint 0.8.0", + "web-time", +] + +[[package]] +name = "libp2p-dcutr" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f4f0eec23bc79cabfdf6934718f161fc42a1d98e2c9d44007c80eb91534200c" +dependencies = [ + "asynchronous-codec", + "either", + "futures", + "futures-bounded", + "futures-timer", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "lru", + "quick-protobuf", + "quick-protobuf-codec", + "thiserror 2.0.17", + "tracing", + "web-time", +] + +[[package]] +name = "libp2p-dns" +version = "0.44.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b770c1c8476736ca98c578cba4b505104ff8e842c2876b528925f9766379f9a" +dependencies = [ + "async-trait", + "futures", + "hickory-resolver", + "libp2p-core", + "libp2p-identity", + "parking_lot", + "smallvec", + "tracing", +] + +[[package]] +name = "libp2p-floodsub" +version = "0.47.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0914997f56315c83bc64ffb721cd4e764ad819370582db287232c5791469697" +dependencies = [ + "asynchronous-codec", + "bytes", + "cuckoofilter", + "fnv", + "futures", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "quick-protobuf", + "quick-protobuf-codec", + "rand 0.8.5", + "smallvec", + "thiserror 2.0.17", + "tracing", +] + +[[package]] +name = "libp2p-gossipsub" +version = "0.49.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7f58e37d8d6848e5c4c9e3c35c6f61133235bff2960c9c00a663b0849301221" +dependencies = [ + "async-channel", + "asynchronous-codec", + "base64", + "byteorder", + "bytes", + "either", + "fnv", + "futures", + "futures-timer", + "getrandom 0.2.16", + "hashlink", + "hex_fmt", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "quick-protobuf", + "quick-protobuf-codec", + "rand 0.8.5", + "regex", + "serde", + "sha2", + "tracing", + "web-time", +] + +[[package]] +name = "libp2p-identify" +version = "0.47.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ab792a8b68fdef443a62155b01970c81c3aadab5e659621b063ef252a8e65e8" +dependencies = [ + "asynchronous-codec", + "either", + "futures", + "futures-bounded", + "futures-timer", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "quick-protobuf", + "quick-protobuf-codec", + "smallvec", + "thiserror 2.0.17", + "tracing", +] + +[[package]] +name = "libp2p-identity" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3104e13b51e4711ff5738caa1fb54467c8604c2e94d607e27745bcf709068774" +dependencies = [ + "asn1_der", + "bs58", + "ed25519-dalek", + "hkdf", + "k256", + "multihash", + "p256", + "quick-protobuf", + "rand 0.8.5", + "ring", + "sec1", + "serde", + "sha2", + "thiserror 2.0.17", + "tracing", + "zeroize", +] + +[[package]] +name = "libp2p-kad" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13d3fd632a5872ec804d37e7413ceea20588f69d027a0fa3c46f82574f4dee60" +dependencies = [ + "asynchronous-codec", + "bytes", + "either", + "fnv", + "futures", + "futures-bounded", + "futures-timer", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "quick-protobuf", + "quick-protobuf-codec", + "rand 0.8.5", + "serde", + "sha2", + "smallvec", + "thiserror 2.0.17", + "tracing", + "uint", + "web-time", +] + +[[package]] +name = "libp2p-mdns" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c66872d0f1ffcded2788683f76931be1c52e27f343edb93bc6d0bcd8887be443" +dependencies = [ + "futures", + "hickory-proto", + "if-watch", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "rand 0.8.5", + "smallvec", + "socket2 0.5.10", + "tokio", + "tracing", +] + +[[package]] +name = "libp2p-memory-connection-limits" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d052a767edd0235d5c29dacf46013955eabce1085781ce0d12a4fc66bf87cd" +dependencies = [ + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "memory-stats", + "sysinfo", + "tracing", +] + +[[package]] +name = "libp2p-metrics" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "805a555148522cb3414493a5153451910cb1a146c53ffbf4385708349baf62b7" +dependencies = [ + "futures", + "libp2p-core", + "libp2p-dcutr", + "libp2p-gossipsub", + "libp2p-identify", + "libp2p-identity", + "libp2p-kad", + "libp2p-ping", + "libp2p-relay", + "libp2p-swarm", + "pin-project", + "prometheus-client", + "web-time", +] + +[[package]] +name = "libp2p-noise" +version = "0.46.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc73eacbe6462a0eb92a6527cac6e63f02026e5407f8831bde8293f19217bfbf" +dependencies = [ + "asynchronous-codec", + "bytes", + "futures", + "libp2p-core", + "libp2p-identity", + "multiaddr", + "multihash", + "quick-protobuf", + "rand 0.8.5", + "snow", + "static_assertions", + "thiserror 2.0.17", + "tracing", + "x25519-dalek", + "zeroize", +] + +[[package]] +name = "libp2p-ping" +version = "0.47.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74bb7fcdfd9fead4144a3859da0b49576f171a8c8c7c0bfc7c541921d25e60d3" +dependencies = [ + "futures", + "futures-timer", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "rand 0.8.5", + "tracing", + "web-time", +] + +[[package]] +name = "libp2p-plaintext" +version = "0.43.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e659439578fc6d305da8303834beb9d62f155f40e7f5b9d81c9f2b2c69d1926" +dependencies = [ + "asynchronous-codec", + "bytes", + "futures", + "libp2p-core", + "libp2p-identity", + "quick-protobuf", + "quick-protobuf-codec", + "tracing", +] + +[[package]] +name = "libp2p-pnet" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf240b834dfa3f8b48feb2c4b87bb2cf82751543001b6ee86077f48183b18d52" +dependencies = [ + "futures", + "pin-project", + "rand 0.8.5", + "salsa20", + "sha3", + "tracing", +] + +[[package]] +name = "libp2p-quic" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8dc448b2de9f4745784e3751fe8bc6c473d01b8317edd5ababcb0dec803d843f" +dependencies = [ + "futures", + "futures-timer", + "if-watch", + "libp2p-core", + "libp2p-identity", + "libp2p-tls", + "quinn", + "rand 0.8.5", + "ring", + "rustls", + "socket2 0.5.10", + "thiserror 2.0.17", + "tokio", + "tracing", +] + +[[package]] +name = "libp2p-relay" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "551b24ae04c63859bf5e25644acdd6aa469deb5c5cd872ca21c2c9b45a5a5192" +dependencies = [ + "asynchronous-codec", + "bytes", + "either", + "futures", + "futures-bounded", + "futures-timer", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "quick-protobuf", + "quick-protobuf-codec", + "rand 0.8.5", + "static_assertions", + "thiserror 2.0.17", + "tracing", + "web-time", +] + +[[package]] +name = "libp2p-rendezvous" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15285d828c2b4a34cb660c2e74cd6938116daceab1f4357bae933d5b08cca933" +dependencies = [ + "async-trait", + "asynchronous-codec", + "bimap", + "futures", + "futures-timer", + "libp2p-core", + "libp2p-identity", + "libp2p-request-response", + "libp2p-swarm", + "quick-protobuf", + "quick-protobuf-codec", + "rand 0.8.5", + "thiserror 2.0.17", + "tracing", + "web-time", +] + +[[package]] +name = "libp2p-request-response" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9f1cca83488b90102abac7b67d5c36fc65bc02ed47620228af7ed002e6a1478" +dependencies = [ + "async-trait", + "cbor4ii", + "futures", + "futures-bounded", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "rand 0.8.5", + "serde", + "serde_json", + "smallvec", + "tracing", +] + +[[package]] +name = "libp2p-swarm" +version = "0.47.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aa762e5215919a34e31c35d4b18bf2e18566ecab7f8a3d39535f4a3068f8b62" +dependencies = [ + "either", + "fnv", + "futures", + "futures-timer", + "getrandom 0.2.16", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm-derive", + "lru", + "multistream-select", + "rand 0.8.5", + "smallvec", + "tokio", + "tracing", + "wasm-bindgen-futures", + "web-time", +] + +[[package]] +name = "libp2p-swarm-derive" +version = "0.35.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd297cf53f0cb3dee4d2620bb319ae47ef27c702684309f682bdb7e55a18ae9c" +dependencies = [ + "heck", + "quote", + "syn 2.0.107", +] + +[[package]] +name = "libp2p-tcp" +version = "0.44.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65b4e030c52c46c8d01559b2b8ca9b7c4185f10576016853129ca1fe5cd1a644" +dependencies = [ + "futures", + "futures-timer", + "if-watch", + "libc", + "libp2p-core", + "socket2 0.5.10", + "tokio", + "tracing", +] + +[[package]] +name = "libp2p-tls" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96ff65a82e35375cbc31ebb99cacbbf28cb6c4fefe26bf13756ddcf708d40080" +dependencies = [ + "futures", + "futures-rustls", + "libp2p-core", + "libp2p-identity", + "rcgen", + "ring", + "rustls", + "rustls-webpki", + "thiserror 2.0.17", + "x509-parser", + "yasna", +] + +[[package]] +name = "libp2p-uds" +version = "0.43.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0413aa7a1cc51c409358186a46a198ad9195a782dae6b9a95ea3acf5db67569d" +dependencies = [ + "futures", + "libp2p-core", + "tracing", +] + +[[package]] +name = "libp2p-upnp" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4757e65fe69399c1a243bbb90ec1ae5a2114b907467bf09f3575e899815bb8d3" +dependencies = [ + "futures", + "futures-timer", + "igd-next", + "libp2p-core", + "libp2p-swarm", + "tokio", + "tracing", +] + +[[package]] +name = "libp2p-webrtc-utils" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "490abff5ee5f9a7a77f0145c79cc97c76941231a3626f4dee18ebf2abb95618f" +dependencies = [ + "asynchronous-codec", + "bytes", + "futures", + "hex", + "libp2p-core", + "libp2p-identity", + "libp2p-noise", + "quick-protobuf", + "quick-protobuf-codec", + "rand 0.8.5", + "serde", + "sha2", + "tinytemplate", + "tracing", +] + +[[package]] +name = "libp2p-webrtc-websys" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3830f0bf6f0f16ded2c735599fe70baea43a8c1a2d76152216693329217301dd" +dependencies = [ + "bytes", + "futures", + "getrandom 0.2.16", + "hex", + "js-sys", + "libp2p-core", + "libp2p-identity", + "libp2p-webrtc-utils", + "send_wrapper 0.6.0", + "thiserror 2.0.17", + "tracing", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "libp2p-websocket" +version = "0.45.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520e29066a48674c007bc11defe5dce49908c24cafd8fad2f5e1a6a8726ced53" +dependencies = [ + "either", + "futures", + "futures-rustls", + "libp2p-core", + "libp2p-identity", + "parking_lot", + "pin-project-lite", + "rw-stream-sink", + "soketto", + "thiserror 2.0.17", + "tracing", + "url", + "webpki-roots 0.26.11", +] + +[[package]] +name = "libp2p-websocket-websys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e73d85b4dc8c2044f58508461bd8bb12f541217c0038ade8cce0ddc1607b8f72" +dependencies = [ + "bytes", + "futures", + "js-sys", + "libp2p-core", + "send_wrapper 0.6.0", + "thiserror 2.0.17", + "tracing", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "libp2p-webtransport-websys" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34bc528d7fa278e1324a88978114a610deaa9e75c8e2230cd868321c512b3f43" +dependencies = [ + "futures", + "js-sys", + "libp2p-core", + "libp2p-identity", + "libp2p-noise", + "multiaddr", + "multihash", + "send_wrapper 0.6.0", + "thiserror 2.0.17", + "tracing", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "libp2p-yamux" +version = "0.47.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f15df094914eb4af272acf9adaa9e287baa269943f32ea348ba29cfb9bfc60d8" +dependencies = [ + "either", + "futures", + "libp2p-core", + "thiserror 2.0.17", + "tracing", + "yamux 0.12.1", + "yamux 0.13.8", +] + +[[package]] +name = "linux-raw-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" + +[[package]] +name = "litemap" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" + +[[package]] +name = "lru" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +dependencies = [ + "hashbrown 0.15.5", +] + +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + +[[package]] +name = "match-lookup" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1265724d8cb29dbbc2b0f06fffb8bf1a8c0cf73a78eede9ba73a4a66c52a981e" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "matchit" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" + +[[package]] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[package]] +name = "memory-stats" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c73f5c649995a115e1a0220b35e4df0a1294500477f97a91d0660fb5abeb574a" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "mio" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" +dependencies = [ + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.61.2", +] + +[[package]] +name = "moka" +version = "0.12.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8261cd88c312e0004c1d51baad2980c66528dfdb2bee62003e643a4d8f86b077" +dependencies = [ + "crossbeam-channel", + "crossbeam-epoch", + "crossbeam-utils", + "equivalent", + "parking_lot", + "portable-atomic", + "rustc_version", + "smallvec", + "tagptr", + "uuid", +] + +[[package]] +name = "multiaddr" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe6351f60b488e04c1d21bc69e56b89cb3f5e8f5d22557d6e8031bdfd79b6961" +dependencies = [ + "arrayref", + "byteorder", + "data-encoding", + "libp2p-identity", + "multibase", + "multihash", + "percent-encoding", + "serde", + "static_assertions", + "unsigned-varint 0.8.0", + "url", +] + +[[package]] +name = "multibase" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8694bb4835f452b0e3bb06dbebb1d6fc5385b6ca1caf2e55fd165c042390ec77" +dependencies = [ + "base-x", + "base256emoji", + "data-encoding", + "data-encoding-macro", +] + +[[package]] +name = "multihash" +version = "0.19.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b430e7953c29dd6a09afc29ff0bb69c6e306329ee6794700aee27b76a1aea8d" +dependencies = [ + "core2", + "serde", + "unsigned-varint 0.8.0", +] + +[[package]] +name = "multistream-select" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea0df8e5eec2298a62b326ee4f0d7fe1a6b90a09dfcf9df37b38f947a8c42f19" +dependencies = [ + "bytes", + "futures", + "log", + "pin-project", + "smallvec", + "unsigned-varint 0.7.2", +] + +[[package]] +name = "netlink-packet-core" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72724faf704479d67b388da142b186f916188505e7e0b26719019c525882eda4" +dependencies = [ + "anyhow", + "byteorder", + "netlink-packet-utils", +] + +[[package]] +name = "netlink-packet-route" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053998cea5a306971f88580d0829e90f270f940befd7cf928da179d4187a5a66" +dependencies = [ + "anyhow", + "bitflags 1.3.2", + "byteorder", + "libc", + "netlink-packet-core", + "netlink-packet-utils", +] + +[[package]] +name = "netlink-packet-utils" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ede8a08c71ad5a95cdd0e4e52facd37190977039a4704eb82a283f713747d34" +dependencies = [ + "anyhow", + "byteorder", + "paste", + "thiserror 1.0.69", +] + +[[package]] +name = "netlink-proto" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72452e012c2f8d612410d89eea01e2d9b56205274abb35d53f60200b2ec41d60" +dependencies = [ + "bytes", + "futures", + "log", + "netlink-packet-core", + "netlink-sys", + "thiserror 2.0.17", +] + +[[package]] +name = "netlink-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16c903aa70590cb93691bf97a767c8d1d6122d2cc9070433deb3bbf36ce8bd23" +dependencies = [ + "bytes", + "futures", + "libc", + "log", + "tokio", +] + +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", +] + +[[package]] +name = "nohash-hasher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "ntapi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" +dependencies = [ + "winapi", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "oid-registry" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f40cff3dde1b6087cc5d5f5d4d65712f34016a03ed60e9c08dcc392736b5b7" +dependencies = [ + "asn1-rs", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +dependencies = [ + "critical-section", + "portable-atomic", +] + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pem" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" +dependencies = [ + "base64", + "serde_core", +] + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.107", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "poly1305" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" +dependencies = [ + "cpufeatures", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "polyval" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +dependencies = [ + "cfg-if", + "cpufeatures", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "portable-atomic" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" + +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + +[[package]] +name = "proc-macro2" +version = "1.0.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "prometheus-client" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf41c1a7c32ed72abe5082fb19505b969095c12da9f5732a4bc9878757fd087c" +dependencies = [ + "dtoa", + "itoa", + "parking_lot", + "prometheus-client-derive-encode", +] + +[[package]] +name = "prometheus-client-derive-encode" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "440f724eba9f6996b75d63681b0a92b06947f1457076d503a4d2e2c8f56442b8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.107", +] + +[[package]] +name = "quick-protobuf" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d6da84cc204722a989e01ba2f6e1e276e190f22263d0cb6ce8526fcdb0d2e1f" +dependencies = [ + "byteorder", +] + +[[package]] +name = "quick-protobuf-codec" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15a0580ab32b169745d7a39db2ba969226ca16738931be152a3209b409de2474" +dependencies = [ + "asynchronous-codec", + "bytes", + "quick-protobuf", + "thiserror 1.0.69", + "unsigned-varint 0.8.0", +] + +[[package]] +name = "quinn" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +dependencies = [ + "bytes", + "cfg_aliases", + "futures-io", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2 0.6.1", + "thiserror 2.0.17", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" +dependencies = [ + "bytes", + "getrandom 0.3.4", + "lru-slab", + "rand 0.9.2", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.17", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2 0.6.1", + "tracing", + "windows-sys 0.60.2", +] + +[[package]] +name = "quote" +version = "1.0.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.16", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rayon" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "rcgen" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75e669e5202259b5314d1ea5397316ad400819437857b90861765f24c4cf80a2" +dependencies = [ + "pem", + "ring", + "rustls-pki-types", + "time", + "yasna", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.10.0", +] + +[[package]] +name = "regex" +version = "1.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" + +[[package]] +name = "resolv-conf" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e061d1b48cb8d38042de4ae0a7a6401009d6143dc80d2e2d6f31f0bdd6470c7" + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.16", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rtnetlink" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a552eb82d19f38c3beed3f786bd23aa434ceb9ac43ab44419ca6d67a7e186c0" +dependencies = [ + "futures", + "log", + "netlink-packet-core", + "netlink-packet-route", + "netlink-packet-utils", + "netlink-proto", + "netlink-sys", + "nix", + "thiserror 1.0.69", + "tokio", +] + +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rusticata-macros" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" +dependencies = [ + "nom", +] + +[[package]] +name = "rustix" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" +dependencies = [ + "bitflags 2.10.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls" +version = "0.23.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" +dependencies = [ + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94182ad936a0c91c324cd46c6511b9510ed16af436d7b5bab34beab0afd55f7a" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "rw-stream-sink" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8c9026ff5d2f23da5e45bbc283f156383001bfb09c4e44256d02c1a685fe9a1" +dependencies = [ + "futures", + "pin-project", + "static_assertions", +] + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "salsa20" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" +dependencies = [ + "cipher", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" + +[[package]] +name = "send_wrapper" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" + +[[package]] +name = "send_wrapper" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" +dependencies = [ + "futures-core", +] + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.107", +] + +[[package]] +name = "serde_json" +version = "1.0.145" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", + "serde_core", +] + +[[package]] +name = "serde_path_to_error" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" +dependencies = [ + "itoa", + "serde", + "serde_core", +] + +[[package]] +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 = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest", + "keccak", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" +dependencies = [ + "libc", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core 0.6.4", +] + +[[package]] +name = "slab" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "snow" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "850948bee068e713b8ab860fe1adc4d109676ab4c3b621fd8147f06b261f2f85" +dependencies = [ + "aes-gcm", + "blake2", + "chacha20poly1305", + "curve25519-dalek", + "rand_core 0.6.4", + "ring", + "rustc_version", + "sha2", + "subtle", +] + +[[package]] +name = "socket2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "socket2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + +[[package]] +name = "soketto" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e859df029d160cb88608f5d7df7fb4753fd20fdfb4de5644f3d8b8440841721" +dependencies = [ + "base64", + "bytes", + "futures", + "httparse", + "log", + "rand 0.8.5", + "sha1", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a26dbd934e5451d21ef060c018dae56fc073894c5a7896f882928a76e6d081b" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.107", +] + +[[package]] +name = "sysinfo" +version = "0.33.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fc858248ea01b66f19d8e8a6d55f41deaf91e9d495246fd01368d99935c6c01" +dependencies = [ + "core-foundation-sys", + "libc", + "memchr", + "ntapi", + "rayon", + "windows 0.57.0", +] + +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags 2.10.0", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tagptr" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +dependencies = [ + "thiserror-impl 2.0.17", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.107", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.107", +] + +[[package]] +name = "time" +version = "0.3.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" + +[[package]] +name = "time-macros" +version = "0.2.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "tinyvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +dependencies = [ + "tinyvec_macros", +] + +[[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.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" +dependencies = [ "bytes", "libc", "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2", + "socket2 0.6.1", "tokio-macros", "windows-sys 0.61.2", ] @@ -668,7 +3794,20 @@ checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.107", +] + +[[package]] +name = "tokio-util" +version = "0.7.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", ] [[package]] @@ -707,9 +3846,21 @@ checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "log", "pin-project-lite", + "tracing-attributes", "tracing-core", ] +[[package]] +name = "tracing-attributes" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.107", +] + [[package]] name = "tracing-core" version = "0.1.34" @@ -719,18 +3870,129 @@ dependencies = [ "once_cell", ] +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "uint" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "909988d098b2f738727b161a106cfc7cab00c539c2687a8836f8e565976fb53e" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + [[package]] name = "unicode-ident" version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common", + "subtle", +] + +[[package]] +name = "unsigned-varint" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6889a77d49f1f013504cec6bf97a2c730394adedaeb1deb5ea08949a50541105" + +[[package]] +name = "unsigned-varint" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb066959b24b5196ae73cb057f45598450d2c5f71460e98c49b738086eff9c06" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" +dependencies = [ + "getrandom 0.3.4", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + [[package]] name = "wasi" version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", +] + [[package]] name = "wasm-bindgen" version = "0.2.104" @@ -745,49 +4007,170 @@ dependencies = [ ] [[package]] -name = "wasm-bindgen-backend" -version = "0.2.104" +name = "wasm-bindgen-backend" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn 2.0.107", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.107", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "0.26.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" +dependencies = [ + "webpki-roots 1.0.4", +] + +[[package]] +name = "webpki-roots" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2878ef029c47c6e8cf779119f20fcf52bde7ad42a731b2a304bc221df17571e" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "widestring" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efc5cf48f83140dcaab716eeaea345f9e93d0018fb81162753a3f76c3397b538" dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", + "windows-core 0.53.0", + "windows-targets 0.52.6", ] [[package]] -name = "wasm-bindgen-macro" -version = "0.2.104" +name = "windows" +version = "0.57.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" +checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143" dependencies = [ - "quote", - "wasm-bindgen-macro-support", + "windows-core 0.57.0", + "windows-targets 0.52.6", ] [[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.104" +name = "windows-core" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" +checksum = "9dcc5b895a6377f1ab9fa55acedab1fd5ac0db66ad1e6c7f47e28a22e446a5dd" dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", + "windows-result 0.1.2", + "windows-targets 0.52.6", ] [[package]] -name = "wasm-bindgen-shared" -version = "0.2.104" +name = "windows-core" +version = "0.57.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" +checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d" dependencies = [ - "unicode-ident", + "windows-implement 0.57.0", + "windows-interface 0.57.0", + "windows-result 0.1.2", + "windows-targets 0.52.6", ] [[package]] @@ -796,13 +4179,24 @@ version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ - "windows-implement", - "windows-interface", + "windows-implement 0.60.2", + "windows-interface 0.59.3", "windows-link", - "windows-result", + "windows-result 0.4.1", "windows-strings", ] +[[package]] +name = "windows-implement" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.107", +] + [[package]] name = "windows-implement" version = "0.60.2" @@ -811,7 +4205,18 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.107", +] + +[[package]] +name = "windows-interface" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.107", ] [[package]] @@ -822,7 +4227,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.107", ] [[package]] @@ -831,6 +4236,15 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" +[[package]] +name = "windows-result" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-result" version = "0.4.1" @@ -849,13 +4263,31 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets", + "windows-targets 0.53.5", ] [[package]] @@ -867,6 +4299,37 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "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.5" @@ -874,60 +4337,373 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" dependencies = [ "windows-link", - "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.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + [[package]] name = "windows_aarch64_gnullvm" version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[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.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[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.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" +[[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.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[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.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[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.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[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.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[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.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "wit-bindgen" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "writeable" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" + +[[package]] +name = "x25519-dalek" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" +dependencies = [ + "curve25519-dalek", + "rand_core 0.6.4", + "serde", + "zeroize", +] + +[[package]] +name = "x509-parser" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4569f339c0c402346d4a75a9e39cf8dad310e287eef1ff56d4c68e5067f53460" +dependencies = [ + "asn1-rs", + "data-encoding", + "der-parser", + "lazy_static", + "nom", + "oid-registry", + "rusticata-macros", + "thiserror 2.0.17", + "time", +] + +[[package]] +name = "xml-rs" +version = "0.8.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f" + +[[package]] +name = "xmltree" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7d8a75eaf6557bb84a65ace8609883db44a29951042ada9b393151532e41fcb" +dependencies = [ + "xml-rs", +] + +[[package]] +name = "yamux" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed0164ae619f2dc144909a9f082187ebb5893693d8c0196e8085283ccd4b776" +dependencies = [ + "futures", + "log", + "nohash-hasher", + "parking_lot", + "pin-project", + "rand 0.8.5", + "static_assertions", +] + +[[package]] +name = "yamux" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "deab71f2e20691b4728b349c6cee8fc7223880fa67b6b4f92225ec32225447e5" +dependencies = [ + "futures", + "log", + "nohash-hasher", + "parking_lot", + "pin-project", + "rand 0.9.2", + "static_assertions", + "web-time", +] + +[[package]] +name = "yasna" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" +dependencies = [ + "time", +] + +[[package]] +name = "yoke" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.107", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea879c944afe8a2b25fef16bb4ba234f47c694565e97383b36f3a878219065c" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf955aa904d6040f70dc8e9384444cb1030aed272ba3cb09bbc4ab9e7c1f34f5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.107", +] + +[[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.107", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.107", +] + +[[package]] +name = "zerotrie" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.107", +] diff --git a/Cargo.toml b/Cargo.toml index 72e34048..cdecc83c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,6 +31,7 @@ hex = { version = "^0.4.3" } serde = { version = "1.0", features = ["derive"] } serde_json = { version = "^1.0" } tokio = { version = "1", features = ["full"] } +libp2p = { version = "0.56", features = ["full", "secp256k1"] } [workspace.lints.rust] missing_docs = "deny" diff --git a/crates/charon-core/Cargo.toml b/crates/charon-core/Cargo.toml index 82e06e30..63361088 100644 --- a/crates/charon-core/Cargo.toml +++ b/crates/charon-core/Cargo.toml @@ -11,6 +11,7 @@ chrono.workspace = true hex.workspace = true serde.workspace = true serde_json.workspace = true +libp2p.workspace = true [lints] -workspace = true +workspace = true \ No newline at end of file diff --git a/crates/charon-core/src/consensus/mod.rs b/crates/charon-core/src/consensus/mod.rs new file mode 100644 index 00000000..5b67aeb2 --- /dev/null +++ b/crates/charon-core/src/consensus/mod.rs @@ -0,0 +1,8 @@ +//! # Charon Consensus +//! +//! Consensus-related functionality for the Charon distributed validator node. +//! This crate implements the consensus algorithms and protocols required for +//! coordinating validator operations across the distributed network. + +/// Consensus protocols. +pub mod protocols; diff --git a/crates/charon-core/src/consensus/protocols.rs b/crates/charon-core/src/consensus/protocols.rs new file mode 100644 index 00000000..6f590171 --- /dev/null +++ b/crates/charon-core/src/consensus/protocols.rs @@ -0,0 +1,110 @@ +use libp2p::StreamProtocol; + +const PROTOCOL_ID_PREFIX: &str = "/charon/consensus/"; + +/// QBFT v2 protocol ID. +pub const QBFT_V2_PROTOCOL_ID: &str = "/charon/consensus/qbft/v2"; + +/// Protocols supported by the Charon core. +pub fn protocols() -> Vec { + vec![StreamProtocol::new(QBFT_V2_PROTOCOL_ID)] +} + +/// Returns the most preferred consensus protocol from the list of protocols. +pub fn most_preferred_consensus_protocol<'a>(protocols: &[&'a str]) -> &'a str { + protocols + .iter() + .find(|p| p.to_string().starts_with(PROTOCOL_ID_PREFIX)) + .cloned() + .unwrap_or(QBFT_V2_PROTOCOL_ID) +} + +/// Returns true if the protocol name is supported by the Charon core. +pub fn is_supported_protocol_name(name: &str) -> bool { + let normalized_name = name.to_lowercase(); + + protocols().iter().any(|protocol| { + protocol + .to_string() + .strip_prefix(PROTOCOL_ID_PREFIX) + .and_then(|name_and_version| name_and_version.split('/').next()) + .is_some_and(|protocol_name| protocol_name == normalized_name) + }) +} + +/// Prioritizes protocols matching the given name by moving them to the front. +pub fn prioritize_protocols_by_name( + protocol_name: &str, + all_protocols: &[StreamProtocol], +) -> Vec { + let target_prefix = format!("{}{}/", PROTOCOL_ID_PREFIX, protocol_name); + + let (matching, others): (Vec<_>, Vec<_>) = all_protocols + .iter() + .cloned() + .partition(|p| p.to_string().starts_with(&target_prefix)); + + matching.into_iter().chain(others).collect() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_is_supported_protocol_name() { + assert!(is_supported_protocol_name("qbft")); + assert!(!is_supported_protocol_name("unreal")); + } + + #[test] + fn test_protocols() { + let protocols = protocols(); + assert_eq!(protocols, vec![StreamProtocol::new(QBFT_V2_PROTOCOL_ID)]); + } + + #[test] + fn test_most_preferred_consensus_protocol_default_is_qbft() { + assert_eq!( + most_preferred_consensus_protocol(&["unreal"]), + QBFT_V2_PROTOCOL_ID + ); + assert_eq!(most_preferred_consensus_protocol(&[]), QBFT_V2_PROTOCOL_ID); + } + + #[test] + fn test_most_preferred_consensus_protocol_latest_abft_is_preferred() { + let pp = vec![ + "/charon/consensus/abft/3.0.0", + "/charon/consensus/abft/1.0.0", + "/charon/consensus/qbft/1.0.0", + ]; + + assert_eq!( + most_preferred_consensus_protocol(&pp), + "/charon/consensus/abft/3.0.0" + ); + } + + #[test] + fn test_prioritize_protocols_by_name() { + let initial = vec![ + StreamProtocol::new("/charon/consensus/hotstuff/1.0.0"), + StreamProtocol::new("/charon/consensus/abft/3.0.0"), + StreamProtocol::new("/charon/consensus/abft/1.0.0"), + StreamProtocol::new("/charon/consensus/qbft/1.0.0"), + ]; + + let bumped = prioritize_protocols_by_name("abft", &initial); + + assert_eq!( + bumped, + vec![ + StreamProtocol::new("/charon/consensus/abft/3.0.0"), + StreamProtocol::new("/charon/consensus/abft/1.0.0"), + StreamProtocol::new("/charon/consensus/hotstuff/1.0.0"), + StreamProtocol::new("/charon/consensus/qbft/1.0.0"), + ] + ); + } +} diff --git a/crates/charon-core/src/lib.rs b/crates/charon-core/src/lib.rs index 7a6c37d5..be29537e 100644 --- a/crates/charon-core/src/lib.rs +++ b/crates/charon-core/src/lib.rs @@ -6,3 +6,6 @@ /// Types for the Charon core. pub mod types; + +/// Consensus-related functionality. +pub mod consensus; diff --git a/deps.txt b/deps.txt new file mode 100644 index 00000000..5fcf4785 --- /dev/null +++ b/deps.txt @@ -0,0 +1,59 @@ +p2p: + - app/protonil + - app/log + - app/z + - app/lifecycle + - app/expbackoff (use external crate?) + - app/k1util (done) + - eth2util/enr (done) + - app/promauto (metrics) +p2p.testing: + - core/corepb/v1 + - testutil + +app/lifecycle: + - app/log + +app/protonil: + - app/z + +app/z: + +app/promauto: + +app/log: + - app/z + - app/promauto + - app/expbackoff + +cmd: + - app/version + - core/consensus/protocols + - app/log + - app/z + - app/k1util (done) + - charon/cluster (done) + - eth2util/enr (done) + - charon/p2p + - app/obolapi + - charon/app + - app/promauto (metrics) + - cluster/manifestpb (done) + - cluster/manifest + - tbls (done) + - eth2util + - eth2util/signing + - eth2wrap + - eth2util/keystore + - tblsconv + - dkg + - eth2util/deposit + - core + - eth2util/keymanager + - eth2util/registration + - app/featureset + +cmd.testing: + - testutil + - testutil/relay + - different mocks for different components From 5e036eb4cb52370b258feb6dc7d75d4fc2794620 Mon Sep 17 00:00:00 2001 From: Bohdan Ohorodnii <35969035+varex83@users.noreply.github.com> Date: Wed, 26 Nov 2025 13:48:23 +0200 Subject: [PATCH 2/7] feat: add corepb --- Cargo.lock | 115 ++++++++++++++++++ Cargo.toml | 3 + crates/charon-core/Cargo.toml | 5 + crates/charon-core/build.rs | 77 ++++++++++++ crates/charon-core/src/corepb/mod.rs | 2 + crates/charon-core/src/corepb/v1.rs | 8 ++ .../charon-core/src/corepb/v1/consensus.proto | 47 +++++++ crates/charon-core/src/corepb/v1/consensus.rs | 65 ++++++++++ crates/charon-core/src/corepb/v1/core.proto | 22 ++++ crates/charon-core/src/corepb/v1/core.rs | 49 ++++++++ .../charon-core/src/corepb/v1/parsigex.proto | 10 ++ crates/charon-core/src/corepb/v1/parsigex.rs | 13 ++ .../charon-core/src/corepb/v1/priority.proto | 40 ++++++ crates/charon-core/src/corepb/v1/priority.rs | 52 ++++++++ crates/charon-core/src/lib.rs | 3 + 15 files changed, 511 insertions(+) create mode 100644 crates/charon-core/build.rs create mode 100644 crates/charon-core/src/corepb/mod.rs create mode 100644 crates/charon-core/src/corepb/v1.rs create mode 100644 crates/charon-core/src/corepb/v1/consensus.proto create mode 100644 crates/charon-core/src/corepb/v1/consensus.rs create mode 100644 crates/charon-core/src/corepb/v1/core.proto create mode 100644 crates/charon-core/src/corepb/v1/core.rs create mode 100644 crates/charon-core/src/corepb/v1/parsigex.proto create mode 100644 crates/charon-core/src/corepb/v1/parsigex.rs create mode 100644 crates/charon-core/src/corepb/v1/priority.proto create mode 100644 crates/charon-core/src/corepb/v1/priority.rs diff --git a/Cargo.lock b/Cargo.lock index aa3e11fa..2157553a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -442,6 +442,9 @@ dependencies = [ "chrono", "hex", "libp2p", + "prost", + "prost-build", + "prost-types", "serde", "serde_json", ] @@ -880,6 +883,12 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + [[package]] name = "ff" version = "0.13.1" @@ -902,6 +911,12 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" +[[package]] +name = "fixedbitset" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" + [[package]] name = "fnv" version = "1.0.7" @@ -1586,6 +1601,15 @@ version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" +[[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.15" @@ -2506,6 +2530,12 @@ dependencies = [ "unsigned-varint 0.8.0", ] +[[package]] +name = "multimap" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" + [[package]] name = "multistream-select" version = "0.13.0" @@ -2761,6 +2791,16 @@ version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" +[[package]] +name = "petgraph" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772" +dependencies = [ + "fixedbitset", + "indexmap", +] + [[package]] name = "pin-project" version = "1.1.10" @@ -2870,6 +2910,16 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.107", +] + [[package]] name = "primeorder" version = "0.13.6" @@ -2911,6 +2961,58 @@ dependencies = [ "syn 2.0.107", ] +[[package]] +name = "prost" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7231bd9b3d3d33c86b58adbac74b5ec0ad9f496b19d22801d773636feaa95f3d" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-build" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac6c3320f9abac597dcbc668774ef006702672474aad53c6d596b62e487b40b1" +dependencies = [ + "heck", + "itertools", + "log", + "multimap", + "once_cell", + "petgraph", + "prettyplease", + "prost", + "prost-types", + "regex", + "syn 2.0.107", + "tempfile", +] + +[[package]] +name = "prost-derive" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9120690fafc389a67ba3803df527d0ec9cbbc9cc45e4cc20b332996dfb672425" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2", + "quote", + "syn 2.0.107", +] + +[[package]] +name = "prost-types" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9b4db3d6da204ed77bb26ba83b6122a73aeb2e87e25fbf7ad2e84c4ccbf8f72" +dependencies = [ + "prost", +] + [[package]] name = "quick-protobuf" version = "0.8.1" @@ -3663,6 +3765,19 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" +[[package]] +name = "tempfile" +version = "3.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" +dependencies = [ + "fastrand", + "getrandom 0.3.4", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + [[package]] name = "thiserror" version = "1.0.69" diff --git a/Cargo.toml b/Cargo.toml index cdecc83c..58e4cfc5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,6 +32,9 @@ serde = { version = "1.0", features = ["derive"] } serde_json = { version = "^1.0" } tokio = { version = "1", features = ["full"] } libp2p = { version = "0.56", features = ["full", "secp256k1"] } +prost = "0.14" +prost-types = "0.14" +prost-build = "0.14" [workspace.lints.rust] missing_docs = "deny" diff --git a/crates/charon-core/Cargo.toml b/crates/charon-core/Cargo.toml index 63361088..b80d103d 100644 --- a/crates/charon-core/Cargo.toml +++ b/crates/charon-core/Cargo.toml @@ -12,6 +12,11 @@ hex.workspace = true serde.workspace = true serde_json.workspace = true libp2p.workspace = true +prost.workspace = true +prost-types.workspace = true + +[build-dependencies] +prost-build.workspace = true [lints] workspace = true \ No newline at end of file diff --git a/crates/charon-core/build.rs b/crates/charon-core/build.rs new file mode 100644 index 00000000..29bcd166 --- /dev/null +++ b/crates/charon-core/build.rs @@ -0,0 +1,77 @@ +//! # Charon Core Build Script +//! +//! This build script compiles the protobuf files. + +use std::{fs, io::Result, path::PathBuf}; + +fn main() -> Result<()> { + let proto_dir = "src/corepb/v1"; + + let proto_files: Vec = fs::read_dir(proto_dir)? + .filter_map(|entry| entry.ok()) + .map(|entry| entry.path()) + .filter(|path| path.extension().is_some_and(|ext| ext == "proto")) + .collect(); + + if proto_files.is_empty() { + println!("cargo:warning=No .proto files found in {}", proto_dir); + return Ok(()); + } + + let mut config = prost_build::Config::new(); + config.btree_map(["."]).bytes(["."]).out_dir(proto_dir); + + config.compile_protos( + &proto_files.iter().map(|p| p.as_path()).collect::>(), + &[proto_dir], + )?; + + add_file_attributes(proto_dir)?; + + for proto_file in &proto_files { + println!("cargo:rerun-if-changed={}", proto_file.display()); + } + println!("cargo:rerun-if-changed={}", proto_dir); + println!("cargo:rerun-if-changed=build.rs"); + + Ok(()) +} + +fn add_file_attributes(proto_dir: &str) -> Result<()> { + let header = "// This file is @generated by prost-build.\n\ + #![allow(dead_code)]\n\ + #![allow(missing_docs)]\n\ + #![allow(clippy::all)]\n\ + #![allow(rustdoc::all)]\n\n"; + + let generated_files: Vec = fs::read_dir(proto_dir)? + .filter_map(|entry| entry.ok()) + .map(|entry| entry.path()) + .filter(|path| { + path.extension().is_some_and(|ext| ext == "rs") + && path.file_name().is_some_and(|name| name != "mod.rs") + }) + .collect(); + + for file_path in generated_files { + let content = fs::read_to_string(&file_path)?; + let mut lines = content.lines(); + let first_line = lines.next(); + let rest: String = if let Some(line) = first_line { + if line.trim() == "// This file is @generated by prost-build." { + lines.collect::>().join("\n") + } else { + std::iter::once(line) + .chain(lines) + .collect::>() + .join("\n") + } + } else { + String::new() + }; + let new_content = format!("{}{}", header, rest); + fs::write(&file_path, new_content)?; + } + + Ok(()) +} diff --git a/crates/charon-core/src/corepb/mod.rs b/crates/charon-core/src/corepb/mod.rs new file mode 100644 index 00000000..bb6553a6 --- /dev/null +++ b/crates/charon-core/src/corepb/mod.rs @@ -0,0 +1,2 @@ +/// V1 +pub mod v1; diff --git a/crates/charon-core/src/corepb/v1.rs b/crates/charon-core/src/corepb/v1.rs new file mode 100644 index 00000000..4c4c5b7d --- /dev/null +++ b/crates/charon-core/src/corepb/v1.rs @@ -0,0 +1,8 @@ +/// Consensus protobuf definitions. +pub mod consensus; +/// Core protobuf definitions. +pub mod core; +/// ParSigEx protobuf definitions. +pub mod parsigex; +/// Priority protobuf definitions. +pub mod priority; diff --git a/crates/charon-core/src/corepb/v1/consensus.proto b/crates/charon-core/src/corepb/v1/consensus.proto new file mode 100644 index 00000000..b3b035cb --- /dev/null +++ b/crates/charon-core/src/corepb/v1/consensus.proto @@ -0,0 +1,47 @@ +syntax = "proto3"; + +package consensus; + +import "core.proto"; +import "google/protobuf/any.proto"; +import "google/protobuf/timestamp.proto"; + +message QBFTMsg { + int64 type = 1; + core.Duty duty = 2; + int64 peer_idx = 3; + int64 round = 4; + reserved 5; + int64 prepared_round = 6; + reserved 7; + bytes signature = 8; + reserved 9; + reserved 10; + bytes value_hash = 11; + bytes prepared_value_hash = 12; +} + +message QBFTConsensusMsg { + QBFTMsg msg = 1; // msg is the message that we send + repeated QBFTMsg justification = 2; // justification is the justifications from others for the message + repeated google.protobuf.Any values = 3; // values of the hashes in the messages +} + +message SniffedConsensusMsg { + google.protobuf.Timestamp timestamp = 1; + QBFTConsensusMsg msg = 2; + // Other consensus protocol messages can be added here +} + +message SniffedConsensusInstance { + google.protobuf.Timestamp started_at = 1; + int64 nodes = 2; + int64 peer_idx = 3; + repeated SniffedConsensusMsg msgs = 4; + string protocol_id = 5; +} + +message SniffedConsensusInstances { + repeated SniffedConsensusInstance instances = 1; + string git_hash = 2; +} diff --git a/crates/charon-core/src/corepb/v1/consensus.rs b/crates/charon-core/src/corepb/v1/consensus.rs new file mode 100644 index 00000000..14ef3f3d --- /dev/null +++ b/crates/charon-core/src/corepb/v1/consensus.rs @@ -0,0 +1,65 @@ +// This file is @generated by prost-build. +#![allow(dead_code)] +#![allow(missing_docs)] +#![allow(clippy::all)] +#![allow(rustdoc::all)] + +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct QbftMsg { + #[prost(int64, tag = "1")] + pub r#type: i64, + #[prost(message, optional, tag = "2")] + pub duty: ::core::option::Option, + #[prost(int64, tag = "3")] + pub peer_idx: i64, + #[prost(int64, tag = "4")] + pub round: i64, + #[prost(int64, tag = "6")] + pub prepared_round: i64, + #[prost(bytes = "bytes", tag = "8")] + pub signature: ::prost::bytes::Bytes, + #[prost(bytes = "bytes", tag = "11")] + pub value_hash: ::prost::bytes::Bytes, + #[prost(bytes = "bytes", tag = "12")] + pub prepared_value_hash: ::prost::bytes::Bytes, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct QbftConsensusMsg { + /// msg is the message that we send + #[prost(message, optional, tag = "1")] + pub msg: ::core::option::Option, + /// justification is the justifications from others for the message + #[prost(message, repeated, tag = "2")] + pub justification: ::prost::alloc::vec::Vec, + /// values of the hashes in the messages + #[prost(message, repeated, tag = "3")] + pub values: ::prost::alloc::vec::Vec<::prost_types::Any>, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct SniffedConsensusMsg { + #[prost(message, optional, tag = "1")] + pub timestamp: ::core::option::Option<::prost_types::Timestamp>, + /// Other consensus protocol messages can be added here + #[prost(message, optional, tag = "2")] + pub msg: ::core::option::Option, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct SniffedConsensusInstance { + #[prost(message, optional, tag = "1")] + pub started_at: ::core::option::Option<::prost_types::Timestamp>, + #[prost(int64, tag = "2")] + pub nodes: i64, + #[prost(int64, tag = "3")] + pub peer_idx: i64, + #[prost(message, repeated, tag = "4")] + pub msgs: ::prost::alloc::vec::Vec, + #[prost(string, tag = "5")] + pub protocol_id: ::prost::alloc::string::String, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct SniffedConsensusInstances { + #[prost(message, repeated, tag = "1")] + pub instances: ::prost::alloc::vec::Vec, + #[prost(string, tag = "2")] + pub git_hash: ::prost::alloc::string::String, +} \ No newline at end of file diff --git a/crates/charon-core/src/corepb/v1/core.proto b/crates/charon-core/src/corepb/v1/core.proto new file mode 100644 index 00000000..daf349eb --- /dev/null +++ b/crates/charon-core/src/corepb/v1/core.proto @@ -0,0 +1,22 @@ +syntax = "proto3"; + +package core; + +message Duty { // core.Duty + uint64 slot = 1; // uint64 + int32 type = 2; // core.DutyType +} + +message UnsignedDataSet { // core.UnsignedDataSet + map set = 1; // map[core.PubKey]core.UnsignedData +} + +message ParSignedDataSet { // core.ParSignedDataSet + map set = 1; // map[core.PubKey]core.ParSignedData +} + +message ParSignedData { // core.ParSignedData + bytes data = 1; // []byte + bytes signature = 2; // core.Signature + int32 share_idx = 3; // int +} diff --git a/crates/charon-core/src/corepb/v1/core.rs b/crates/charon-core/src/corepb/v1/core.rs new file mode 100644 index 00000000..a827b8a2 --- /dev/null +++ b/crates/charon-core/src/corepb/v1/core.rs @@ -0,0 +1,49 @@ +// This file is @generated by prost-build. +#![allow(dead_code)] +#![allow(missing_docs)] +#![allow(clippy::all)] +#![allow(rustdoc::all)] + +/// core.Duty +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] +pub struct Duty { + /// uint64 + #[prost(uint64, tag = "1")] + pub slot: u64, + /// core.DutyType + #[prost(int32, tag = "2")] + pub r#type: i32, +} +/// core.UnsignedDataSet +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct UnsignedDataSet { + /// map\[core.PubKey\]core.UnsignedData + #[prost(btree_map = "string, bytes", tag = "1")] + pub set: ::prost::alloc::collections::BTreeMap< + ::prost::alloc::string::String, + ::prost::bytes::Bytes, + >, +} +/// core.ParSignedDataSet +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ParSignedDataSet { + /// map\[core.PubKey\]core.ParSignedData + #[prost(btree_map = "string, message", tag = "1")] + pub set: ::prost::alloc::collections::BTreeMap< + ::prost::alloc::string::String, + ParSignedData, + >, +} +/// core.ParSignedData +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct ParSignedData { + /// \[\]byte + #[prost(bytes = "bytes", tag = "1")] + pub data: ::prost::bytes::Bytes, + /// core.Signature + #[prost(bytes = "bytes", tag = "2")] + pub signature: ::prost::bytes::Bytes, + /// int + #[prost(int32, tag = "3")] + pub share_idx: i32, +} \ No newline at end of file diff --git a/crates/charon-core/src/corepb/v1/parsigex.proto b/crates/charon-core/src/corepb/v1/parsigex.proto new file mode 100644 index 00000000..c7ada4c2 --- /dev/null +++ b/crates/charon-core/src/corepb/v1/parsigex.proto @@ -0,0 +1,10 @@ +syntax = "proto3"; + +package parsigex; + +import "core.proto"; + +message ParSigExMsg { + core.Duty duty = 1; + core.ParSignedDataSet data_set = 2; +} diff --git a/crates/charon-core/src/corepb/v1/parsigex.rs b/crates/charon-core/src/corepb/v1/parsigex.rs new file mode 100644 index 00000000..3a35434a --- /dev/null +++ b/crates/charon-core/src/corepb/v1/parsigex.rs @@ -0,0 +1,13 @@ +// This file is @generated by prost-build. +#![allow(dead_code)] +#![allow(missing_docs)] +#![allow(clippy::all)] +#![allow(rustdoc::all)] + +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ParSigExMsg { + #[prost(message, optional, tag = "1")] + pub duty: ::core::option::Option, + #[prost(message, optional, tag = "2")] + pub data_set: ::core::option::Option, +} \ No newline at end of file diff --git a/crates/charon-core/src/corepb/v1/priority.proto b/crates/charon-core/src/corepb/v1/priority.proto new file mode 100644 index 00000000..f05e9c6b --- /dev/null +++ b/crates/charon-core/src/corepb/v1/priority.proto @@ -0,0 +1,40 @@ +syntax = "proto3"; + +package priority; + +import "core.proto"; +import "google/protobuf/any.proto"; + +// PriorityResult defines a cluster wide priority result of the Prioritiser protocol. +message PriorityResult { + repeated PriorityMsg msgs = 1; + repeated PriorityTopicResult topics = 2; +} + +// PriorityMsg defines all the priorities and metadata of a single peer in the Prioritiser protocol. +message PriorityMsg { + core.Duty duty = 1; + repeated PriorityTopicProposal topics = 2; + string peer_id = 3; + bytes signature = 4; +} + +// PriorityTopicProposal defines a single peers proposed priorities for a single topic in the Prioritiser protocol. +message PriorityTopicProposal { + google.protobuf.Any topic = 1; + repeated google.protobuf.Any priorities = 2; +} + +// PriorityTopicResult defines the cluster wide resulting priorities for a +// single topic in the Prioritiser protocol. +message PriorityTopicResult { + google.protobuf.Any topic = 1; + // priorities are ordered by decreasing score, ties are broken by peer with lowest peer ID. + repeated PriorityScoredResult priorities = 2; +} + +// PriorityScoredResult defines the cluster wide priority score in the Prioritiser protocol. +message PriorityScoredResult { + google.protobuf.Any priority = 1; + int64 score = 2; +} diff --git a/crates/charon-core/src/corepb/v1/priority.rs b/crates/charon-core/src/corepb/v1/priority.rs new file mode 100644 index 00000000..dd723bea --- /dev/null +++ b/crates/charon-core/src/corepb/v1/priority.rs @@ -0,0 +1,52 @@ +// This file is @generated by prost-build. +#![allow(dead_code)] +#![allow(missing_docs)] +#![allow(clippy::all)] +#![allow(rustdoc::all)] + +/// PriorityResult defines a cluster wide priority result of the Prioritiser protocol. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct PriorityResult { + #[prost(message, repeated, tag = "1")] + pub msgs: ::prost::alloc::vec::Vec, + #[prost(message, repeated, tag = "2")] + pub topics: ::prost::alloc::vec::Vec, +} +/// PriorityMsg defines all the priorities and metadata of a single peer in the Prioritiser protocol. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct PriorityMsg { + #[prost(message, optional, tag = "1")] + pub duty: ::core::option::Option, + #[prost(message, repeated, tag = "2")] + pub topics: ::prost::alloc::vec::Vec, + #[prost(string, tag = "3")] + pub peer_id: ::prost::alloc::string::String, + #[prost(bytes = "bytes", tag = "4")] + pub signature: ::prost::bytes::Bytes, +} +/// PriorityTopicProposal defines a single peers proposed priorities for a single topic in the Prioritiser protocol. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct PriorityTopicProposal { + #[prost(message, optional, tag = "1")] + pub topic: ::core::option::Option<::prost_types::Any>, + #[prost(message, repeated, tag = "2")] + pub priorities: ::prost::alloc::vec::Vec<::prost_types::Any>, +} +/// PriorityTopicResult defines the cluster wide resulting priorities for a +/// single topic in the Prioritiser protocol. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct PriorityTopicResult { + #[prost(message, optional, tag = "1")] + pub topic: ::core::option::Option<::prost_types::Any>, + /// priorities are ordered by decreasing score, ties are broken by peer with lowest peer ID. + #[prost(message, repeated, tag = "2")] + pub priorities: ::prost::alloc::vec::Vec, +} +/// PriorityScoredResult defines the cluster wide priority score in the Prioritiser protocol. +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct PriorityScoredResult { + #[prost(message, optional, tag = "1")] + pub priority: ::core::option::Option<::prost_types::Any>, + #[prost(int64, tag = "2")] + pub score: i64, +} \ No newline at end of file diff --git a/crates/charon-core/src/lib.rs b/crates/charon-core/src/lib.rs index be29537e..2d964756 100644 --- a/crates/charon-core/src/lib.rs +++ b/crates/charon-core/src/lib.rs @@ -9,3 +9,6 @@ pub mod types; /// Consensus-related functionality. pub mod consensus; + +/// Protobuf definitions. +pub mod corepb; From c88e0aac911759d77cb915c86bbff58d42a74dfc Mon Sep 17 00:00:00 2001 From: Bohdan Ohorodnii <35969035+varex83@users.noreply.github.com> Date: Wed, 26 Nov 2025 13:59:35 +0200 Subject: [PATCH 3/7] fix: linting errors after generation --- crates/charon-core/build.rs | 24 +++++++- .../src/corepb/v1-proto/consensus.proto | 47 +++++++++++++++ .../src/corepb/v1-proto/consensus.rs | 60 +++++++++++++++++++ .../src/corepb/v1-proto/core.proto | 22 +++++++ .../charon-core/src/corepb/v1-proto/core.rs | 44 ++++++++++++++ .../src/corepb/v1-proto/parsigex.proto | 10 ++++ .../src/corepb/v1-proto/parsigex.rs | 8 +++ .../src/corepb/v1-proto/priority.proto | 40 +++++++++++++ .../src/corepb/v1-proto/priority.rs | 47 +++++++++++++++ crates/charon-core/src/corepb/v1/consensus.rs | 2 +- crates/charon-core/src/corepb/v1/core.rs | 7 +-- crates/charon-core/src/corepb/v1/parsigex.rs | 2 +- crates/charon-core/src/corepb/v1/priority.rs | 17 ++++-- 13 files changed, 316 insertions(+), 14 deletions(-) create mode 100644 crates/charon-core/src/corepb/v1-proto/consensus.proto create mode 100644 crates/charon-core/src/corepb/v1-proto/consensus.rs create mode 100644 crates/charon-core/src/corepb/v1-proto/core.proto create mode 100644 crates/charon-core/src/corepb/v1-proto/core.rs create mode 100644 crates/charon-core/src/corepb/v1-proto/parsigex.proto create mode 100644 crates/charon-core/src/corepb/v1-proto/parsigex.rs create mode 100644 crates/charon-core/src/corepb/v1-proto/priority.proto create mode 100644 crates/charon-core/src/corepb/v1-proto/priority.rs diff --git a/crates/charon-core/build.rs b/crates/charon-core/build.rs index 29bcd166..5872dbb2 100644 --- a/crates/charon-core/build.rs +++ b/crates/charon-core/build.rs @@ -2,7 +2,7 @@ //! //! This build script compiles the protobuf files. -use std::{fs, io::Result, path::PathBuf}; +use std::{fs, io::Result, path::PathBuf, process::Command}; fn main() -> Result<()> { let proto_dir = "src/corepb/v1"; @@ -27,6 +27,7 @@ fn main() -> Result<()> { )?; add_file_attributes(proto_dir)?; + format_generated_files(proto_dir)?; for proto_file in &proto_files { println!("cargo:rerun-if-changed={}", proto_file.display()); @@ -75,3 +76,24 @@ fn add_file_attributes(proto_dir: &str) -> Result<()> { Ok(()) } + +fn format_generated_files(proto_dir: &str) -> Result<()> { + let output = Command::new("cargo") + .args(["+nightly", "fmt", "--", proto_dir]) + .output() + .or_else(|_| { + println!("cargo:warning=Nightly rustfmt not available, using stable"); + Command::new("cargo") + .args(["fmt", "--", proto_dir]) + .output() + })?; + + if !output.status.success() { + println!( + "cargo:warning=Failed to format generated files: {}", + String::from_utf8_lossy(&output.stderr) + ); + } + + Ok(()) +} diff --git a/crates/charon-core/src/corepb/v1-proto/consensus.proto b/crates/charon-core/src/corepb/v1-proto/consensus.proto new file mode 100644 index 00000000..b3b035cb --- /dev/null +++ b/crates/charon-core/src/corepb/v1-proto/consensus.proto @@ -0,0 +1,47 @@ +syntax = "proto3"; + +package consensus; + +import "core.proto"; +import "google/protobuf/any.proto"; +import "google/protobuf/timestamp.proto"; + +message QBFTMsg { + int64 type = 1; + core.Duty duty = 2; + int64 peer_idx = 3; + int64 round = 4; + reserved 5; + int64 prepared_round = 6; + reserved 7; + bytes signature = 8; + reserved 9; + reserved 10; + bytes value_hash = 11; + bytes prepared_value_hash = 12; +} + +message QBFTConsensusMsg { + QBFTMsg msg = 1; // msg is the message that we send + repeated QBFTMsg justification = 2; // justification is the justifications from others for the message + repeated google.protobuf.Any values = 3; // values of the hashes in the messages +} + +message SniffedConsensusMsg { + google.protobuf.Timestamp timestamp = 1; + QBFTConsensusMsg msg = 2; + // Other consensus protocol messages can be added here +} + +message SniffedConsensusInstance { + google.protobuf.Timestamp started_at = 1; + int64 nodes = 2; + int64 peer_idx = 3; + repeated SniffedConsensusMsg msgs = 4; + string protocol_id = 5; +} + +message SniffedConsensusInstances { + repeated SniffedConsensusInstance instances = 1; + string git_hash = 2; +} diff --git a/crates/charon-core/src/corepb/v1-proto/consensus.rs b/crates/charon-core/src/corepb/v1-proto/consensus.rs new file mode 100644 index 00000000..f67f1d2f --- /dev/null +++ b/crates/charon-core/src/corepb/v1-proto/consensus.rs @@ -0,0 +1,60 @@ +// This file is @generated by prost-build. +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct QbftMsg { + #[prost(int64, tag = "1")] + pub r#type: i64, + #[prost(message, optional, tag = "2")] + pub duty: ::core::option::Option, + #[prost(int64, tag = "3")] + pub peer_idx: i64, + #[prost(int64, tag = "4")] + pub round: i64, + #[prost(int64, tag = "6")] + pub prepared_round: i64, + #[prost(bytes = "bytes", tag = "8")] + pub signature: ::prost::bytes::Bytes, + #[prost(bytes = "bytes", tag = "11")] + pub value_hash: ::prost::bytes::Bytes, + #[prost(bytes = "bytes", tag = "12")] + pub prepared_value_hash: ::prost::bytes::Bytes, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct QbftConsensusMsg { + /// msg is the message that we send + #[prost(message, optional, tag = "1")] + pub msg: ::core::option::Option, + /// justification is the justifications from others for the message + #[prost(message, repeated, tag = "2")] + pub justification: ::prost::alloc::vec::Vec, + /// values of the hashes in the messages + #[prost(message, repeated, tag = "3")] + pub values: ::prost::alloc::vec::Vec<::prost_types::Any>, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct SniffedConsensusMsg { + #[prost(message, optional, tag = "1")] + pub timestamp: ::core::option::Option<::prost_types::Timestamp>, + /// Other consensus protocol messages can be added here + #[prost(message, optional, tag = "2")] + pub msg: ::core::option::Option, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct SniffedConsensusInstance { + #[prost(message, optional, tag = "1")] + pub started_at: ::core::option::Option<::prost_types::Timestamp>, + #[prost(int64, tag = "2")] + pub nodes: i64, + #[prost(int64, tag = "3")] + pub peer_idx: i64, + #[prost(message, repeated, tag = "4")] + pub msgs: ::prost::alloc::vec::Vec, + #[prost(string, tag = "5")] + pub protocol_id: ::prost::alloc::string::String, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct SniffedConsensusInstances { + #[prost(message, repeated, tag = "1")] + pub instances: ::prost::alloc::vec::Vec, + #[prost(string, tag = "2")] + pub git_hash: ::prost::alloc::string::String, +} diff --git a/crates/charon-core/src/corepb/v1-proto/core.proto b/crates/charon-core/src/corepb/v1-proto/core.proto new file mode 100644 index 00000000..daf349eb --- /dev/null +++ b/crates/charon-core/src/corepb/v1-proto/core.proto @@ -0,0 +1,22 @@ +syntax = "proto3"; + +package core; + +message Duty { // core.Duty + uint64 slot = 1; // uint64 + int32 type = 2; // core.DutyType +} + +message UnsignedDataSet { // core.UnsignedDataSet + map set = 1; // map[core.PubKey]core.UnsignedData +} + +message ParSignedDataSet { // core.ParSignedDataSet + map set = 1; // map[core.PubKey]core.ParSignedData +} + +message ParSignedData { // core.ParSignedData + bytes data = 1; // []byte + bytes signature = 2; // core.Signature + int32 share_idx = 3; // int +} diff --git a/crates/charon-core/src/corepb/v1-proto/core.rs b/crates/charon-core/src/corepb/v1-proto/core.rs new file mode 100644 index 00000000..773acbeb --- /dev/null +++ b/crates/charon-core/src/corepb/v1-proto/core.rs @@ -0,0 +1,44 @@ +// This file is @generated by prost-build. +/// core.Duty +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] +pub struct Duty { + /// uint64 + #[prost(uint64, tag = "1")] + pub slot: u64, + /// core.DutyType + #[prost(int32, tag = "2")] + pub r#type: i32, +} +/// core.UnsignedDataSet +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct UnsignedDataSet { + /// map\[core.PubKey\]core.UnsignedData + #[prost(btree_map = "string, bytes", tag = "1")] + pub set: ::prost::alloc::collections::BTreeMap< + ::prost::alloc::string::String, + ::prost::bytes::Bytes, + >, +} +/// core.ParSignedDataSet +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ParSignedDataSet { + /// map\[core.PubKey\]core.ParSignedData + #[prost(btree_map = "string, message", tag = "1")] + pub set: ::prost::alloc::collections::BTreeMap< + ::prost::alloc::string::String, + ParSignedData, + >, +} +/// core.ParSignedData +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct ParSignedData { + /// \[\]byte + #[prost(bytes = "bytes", tag = "1")] + pub data: ::prost::bytes::Bytes, + /// core.Signature + #[prost(bytes = "bytes", tag = "2")] + pub signature: ::prost::bytes::Bytes, + /// int + #[prost(int32, tag = "3")] + pub share_idx: i32, +} diff --git a/crates/charon-core/src/corepb/v1-proto/parsigex.proto b/crates/charon-core/src/corepb/v1-proto/parsigex.proto new file mode 100644 index 00000000..c7ada4c2 --- /dev/null +++ b/crates/charon-core/src/corepb/v1-proto/parsigex.proto @@ -0,0 +1,10 @@ +syntax = "proto3"; + +package parsigex; + +import "core.proto"; + +message ParSigExMsg { + core.Duty duty = 1; + core.ParSignedDataSet data_set = 2; +} diff --git a/crates/charon-core/src/corepb/v1-proto/parsigex.rs b/crates/charon-core/src/corepb/v1-proto/parsigex.rs new file mode 100644 index 00000000..0f4ddf5f --- /dev/null +++ b/crates/charon-core/src/corepb/v1-proto/parsigex.rs @@ -0,0 +1,8 @@ +// This file is @generated by prost-build. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ParSigExMsg { + #[prost(message, optional, tag = "1")] + pub duty: ::core::option::Option, + #[prost(message, optional, tag = "2")] + pub data_set: ::core::option::Option, +} diff --git a/crates/charon-core/src/corepb/v1-proto/priority.proto b/crates/charon-core/src/corepb/v1-proto/priority.proto new file mode 100644 index 00000000..f05e9c6b --- /dev/null +++ b/crates/charon-core/src/corepb/v1-proto/priority.proto @@ -0,0 +1,40 @@ +syntax = "proto3"; + +package priority; + +import "core.proto"; +import "google/protobuf/any.proto"; + +// PriorityResult defines a cluster wide priority result of the Prioritiser protocol. +message PriorityResult { + repeated PriorityMsg msgs = 1; + repeated PriorityTopicResult topics = 2; +} + +// PriorityMsg defines all the priorities and metadata of a single peer in the Prioritiser protocol. +message PriorityMsg { + core.Duty duty = 1; + repeated PriorityTopicProposal topics = 2; + string peer_id = 3; + bytes signature = 4; +} + +// PriorityTopicProposal defines a single peers proposed priorities for a single topic in the Prioritiser protocol. +message PriorityTopicProposal { + google.protobuf.Any topic = 1; + repeated google.protobuf.Any priorities = 2; +} + +// PriorityTopicResult defines the cluster wide resulting priorities for a +// single topic in the Prioritiser protocol. +message PriorityTopicResult { + google.protobuf.Any topic = 1; + // priorities are ordered by decreasing score, ties are broken by peer with lowest peer ID. + repeated PriorityScoredResult priorities = 2; +} + +// PriorityScoredResult defines the cluster wide priority score in the Prioritiser protocol. +message PriorityScoredResult { + google.protobuf.Any priority = 1; + int64 score = 2; +} diff --git a/crates/charon-core/src/corepb/v1-proto/priority.rs b/crates/charon-core/src/corepb/v1-proto/priority.rs new file mode 100644 index 00000000..d3854e51 --- /dev/null +++ b/crates/charon-core/src/corepb/v1-proto/priority.rs @@ -0,0 +1,47 @@ +// This file is @generated by prost-build. +/// PriorityResult defines a cluster wide priority result of the Prioritiser protocol. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct PriorityResult { + #[prost(message, repeated, tag = "1")] + pub msgs: ::prost::alloc::vec::Vec, + #[prost(message, repeated, tag = "2")] + pub topics: ::prost::alloc::vec::Vec, +} +/// PriorityMsg defines all the priorities and metadata of a single peer in the Prioritiser protocol. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct PriorityMsg { + #[prost(message, optional, tag = "1")] + pub duty: ::core::option::Option, + #[prost(message, repeated, tag = "2")] + pub topics: ::prost::alloc::vec::Vec, + #[prost(string, tag = "3")] + pub peer_id: ::prost::alloc::string::String, + #[prost(bytes = "bytes", tag = "4")] + pub signature: ::prost::bytes::Bytes, +} +/// PriorityTopicProposal defines a single peers proposed priorities for a single topic in the Prioritiser protocol. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct PriorityTopicProposal { + #[prost(message, optional, tag = "1")] + pub topic: ::core::option::Option<::prost_types::Any>, + #[prost(message, repeated, tag = "2")] + pub priorities: ::prost::alloc::vec::Vec<::prost_types::Any>, +} +/// PriorityTopicResult defines the cluster wide resulting priorities for a +/// single topic in the Prioritiser protocol. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct PriorityTopicResult { + #[prost(message, optional, tag = "1")] + pub topic: ::core::option::Option<::prost_types::Any>, + /// priorities are ordered by decreasing score, ties are broken by peer with lowest peer ID. + #[prost(message, repeated, tag = "2")] + pub priorities: ::prost::alloc::vec::Vec, +} +/// PriorityScoredResult defines the cluster wide priority score in the Prioritiser protocol. +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct PriorityScoredResult { + #[prost(message, optional, tag = "1")] + pub priority: ::core::option::Option<::prost_types::Any>, + #[prost(int64, tag = "2")] + pub score: i64, +} diff --git a/crates/charon-core/src/corepb/v1/consensus.rs b/crates/charon-core/src/corepb/v1/consensus.rs index 14ef3f3d..f539216c 100644 --- a/crates/charon-core/src/corepb/v1/consensus.rs +++ b/crates/charon-core/src/corepb/v1/consensus.rs @@ -62,4 +62,4 @@ pub struct SniffedConsensusInstances { pub instances: ::prost::alloc::vec::Vec, #[prost(string, tag = "2")] pub git_hash: ::prost::alloc::string::String, -} \ No newline at end of file +} diff --git a/crates/charon-core/src/corepb/v1/core.rs b/crates/charon-core/src/corepb/v1/core.rs index a827b8a2..8170ec01 100644 --- a/crates/charon-core/src/corepb/v1/core.rs +++ b/crates/charon-core/src/corepb/v1/core.rs @@ -29,10 +29,7 @@ pub struct UnsignedDataSet { pub struct ParSignedDataSet { /// map\[core.PubKey\]core.ParSignedData #[prost(btree_map = "string, message", tag = "1")] - pub set: ::prost::alloc::collections::BTreeMap< - ::prost::alloc::string::String, - ParSignedData, - >, + pub set: ::prost::alloc::collections::BTreeMap<::prost::alloc::string::String, ParSignedData>, } /// core.ParSignedData #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] @@ -46,4 +43,4 @@ pub struct ParSignedData { /// int #[prost(int32, tag = "3")] pub share_idx: i32, -} \ No newline at end of file +} diff --git a/crates/charon-core/src/corepb/v1/parsigex.rs b/crates/charon-core/src/corepb/v1/parsigex.rs index 3a35434a..517bcabc 100644 --- a/crates/charon-core/src/corepb/v1/parsigex.rs +++ b/crates/charon-core/src/corepb/v1/parsigex.rs @@ -10,4 +10,4 @@ pub struct ParSigExMsg { pub duty: ::core::option::Option, #[prost(message, optional, tag = "2")] pub data_set: ::core::option::Option, -} \ No newline at end of file +} diff --git a/crates/charon-core/src/corepb/v1/priority.rs b/crates/charon-core/src/corepb/v1/priority.rs index dd723bea..c12055e9 100644 --- a/crates/charon-core/src/corepb/v1/priority.rs +++ b/crates/charon-core/src/corepb/v1/priority.rs @@ -4,7 +4,8 @@ #![allow(clippy::all)] #![allow(rustdoc::all)] -/// PriorityResult defines a cluster wide priority result of the Prioritiser protocol. +/// PriorityResult defines a cluster wide priority result of the Prioritiser +/// protocol. #[derive(Clone, PartialEq, ::prost::Message)] pub struct PriorityResult { #[prost(message, repeated, tag = "1")] @@ -12,7 +13,8 @@ pub struct PriorityResult { #[prost(message, repeated, tag = "2")] pub topics: ::prost::alloc::vec::Vec, } -/// PriorityMsg defines all the priorities and metadata of a single peer in the Prioritiser protocol. +/// PriorityMsg defines all the priorities and metadata of a single peer in the +/// Prioritiser protocol. #[derive(Clone, PartialEq, ::prost::Message)] pub struct PriorityMsg { #[prost(message, optional, tag = "1")] @@ -24,7 +26,8 @@ pub struct PriorityMsg { #[prost(bytes = "bytes", tag = "4")] pub signature: ::prost::bytes::Bytes, } -/// PriorityTopicProposal defines a single peers proposed priorities for a single topic in the Prioritiser protocol. +/// PriorityTopicProposal defines a single peers proposed priorities for a +/// single topic in the Prioritiser protocol. #[derive(Clone, PartialEq, ::prost::Message)] pub struct PriorityTopicProposal { #[prost(message, optional, tag = "1")] @@ -38,15 +41,17 @@ pub struct PriorityTopicProposal { pub struct PriorityTopicResult { #[prost(message, optional, tag = "1")] pub topic: ::core::option::Option<::prost_types::Any>, - /// priorities are ordered by decreasing score, ties are broken by peer with lowest peer ID. + /// priorities are ordered by decreasing score, ties are broken by peer with + /// lowest peer ID. #[prost(message, repeated, tag = "2")] pub priorities: ::prost::alloc::vec::Vec, } -/// PriorityScoredResult defines the cluster wide priority score in the Prioritiser protocol. +/// PriorityScoredResult defines the cluster wide priority score in the +/// Prioritiser protocol. #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct PriorityScoredResult { #[prost(message, optional, tag = "1")] pub priority: ::core::option::Option<::prost_types::Any>, #[prost(int64, tag = "2")] pub score: i64, -} \ No newline at end of file +} From 8cf80352be0f1d644789c53a3b782c8eb0770708 Mon Sep 17 00:00:00 2001 From: Bohdan Ohorodnii <35969035+varex83@users.noreply.github.com> Date: Wed, 26 Nov 2025 16:09:35 +0200 Subject: [PATCH 4/7] refactor: put compilation logic into a separate module --- Cargo.lock | 9 +- Cargo.toml | 2 + crates/charon-build-proto/Cargo.toml | 13 ++ crates/charon-build-proto/src/lib.rs | 129 ++++++++++++++++++ crates/charon-core/Cargo.toml | 2 +- crates/charon-core/build.rs | 94 +------------ .../src/corepb/v1-proto/consensus.proto | 47 ------- .../src/corepb/v1-proto/consensus.rs | 60 -------- .../src/corepb/v1-proto/core.proto | 22 --- .../charon-core/src/corepb/v1-proto/core.rs | 44 ------ .../src/corepb/v1-proto/parsigex.proto | 10 -- .../src/corepb/v1-proto/parsigex.rs | 8 -- .../src/corepb/v1-proto/priority.proto | 40 ------ .../src/corepb/v1-proto/priority.rs | 47 ------- 14 files changed, 155 insertions(+), 372 deletions(-) create mode 100644 crates/charon-build-proto/Cargo.toml create mode 100644 crates/charon-build-proto/src/lib.rs delete mode 100644 crates/charon-core/src/corepb/v1-proto/consensus.proto delete mode 100644 crates/charon-core/src/corepb/v1-proto/consensus.rs delete mode 100644 crates/charon-core/src/corepb/v1-proto/core.proto delete mode 100644 crates/charon-core/src/corepb/v1-proto/core.rs delete mode 100644 crates/charon-core/src/corepb/v1-proto/parsigex.proto delete mode 100644 crates/charon-core/src/corepb/v1-proto/parsigex.rs delete mode 100644 crates/charon-core/src/corepb/v1-proto/priority.proto delete mode 100644 crates/charon-core/src/corepb/v1-proto/priority.rs diff --git a/Cargo.lock b/Cargo.lock index 2157553a..8a8b0560 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -419,6 +419,13 @@ dependencies = [ name = "charon" version = "0.1.0" +[[package]] +name = "charon-build-proto" +version = "0.1.0" +dependencies = [ + "prost-build", +] + [[package]] name = "charon-cli" version = "0.1.0" @@ -439,11 +446,11 @@ version = "0.1.0" name = "charon-core" version = "0.1.0" dependencies = [ + "charon-build-proto", "chrono", "hex", "libp2p", "prost", - "prost-build", "prost-types", "serde", "serde_json", diff --git a/Cargo.toml b/Cargo.toml index 58e4cfc5..34244205 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,6 +14,7 @@ members = [ "crates/charon-p2p", "crates/charon-serde", "crates/charon-testutil", + "crates/charon-build-proto", ] resolver = "3" @@ -35,6 +36,7 @@ libp2p = { version = "0.56", features = ["full", "secp256k1"] } prost = "0.14" prost-types = "0.14" prost-build = "0.14" +charon-build-proto = { path = "crates/charon-build-proto" } [workspace.lints.rust] missing_docs = "deny" diff --git a/crates/charon-build-proto/Cargo.toml b/crates/charon-build-proto/Cargo.toml new file mode 100644 index 00000000..f9a4ca7e --- /dev/null +++ b/crates/charon-build-proto/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "charon-build-proto" +version.workspace = true +edition.workspace = true +repository.workspace = true +license.workspace = true +publish.workspace = true + +[dependencies] +prost-build.workspace = true + +[lints] +workspace = true diff --git a/crates/charon-build-proto/src/lib.rs b/crates/charon-build-proto/src/lib.rs new file mode 100644 index 00000000..547d60f3 --- /dev/null +++ b/crates/charon-build-proto/src/lib.rs @@ -0,0 +1,129 @@ +//! # Charon Build Proto +//! +//! This crate compiles the protobuf files. + +use std::{fs, io::Result, path::PathBuf, process::Command}; + +/// Compiles the protobuf files in the given directory. +pub fn compile_protos(proto_dir: &str) -> Result<()> { + let proto_files: Vec = fs::read_dir(proto_dir)? + .filter_map(|entry| entry.ok()) + .map(|entry| entry.path()) + .filter(|path| path.extension().is_some_and(|ext| ext == "proto")) + .collect(); + + if proto_files.is_empty() { + println!("cargo:warning=No .proto files found in {}", proto_dir); + return Ok(()); + } + + let mut config = prost_build::Config::new(); + config.btree_map(["."]).bytes(["."]).out_dir(proto_dir); + + config.compile_protos( + &proto_files.iter().map(|p| p.as_path()).collect::>(), + &[proto_dir], + )?; + + add_file_attributes(proto_dir)?; + format_generated_files(proto_dir)?; + + for proto_file in &proto_files { + println!("cargo:rerun-if-changed={}", proto_file.display()); + } + println!("cargo:rerun-if-changed={}", proto_dir); + println!("cargo:rerun-if-changed=build.rs"); + + Ok(()) +} + +/// Adds file attributes to the generated files. +fn add_file_attributes(proto_dir: &str) -> Result<()> { + let header = "// This file is @generated by prost-build.\n\ + #![allow(dead_code)]\n\ + #![allow(missing_docs)]\n\ + #![allow(clippy::all)]\n\ + #![allow(rustdoc::all)]\n\n"; + + let generated_files: Vec = fs::read_dir(proto_dir)? + .filter_map(|entry| entry.ok()) + .map(|entry| entry.path()) + .filter(|path| { + path.extension().is_some_and(|ext| ext == "rs") + && path.file_name().is_some_and(|name| name != "mod.rs") + }) + .collect(); + + for file_path in generated_files { + let content = fs::read_to_string(&file_path)?; + let mut lines = content.lines(); + let first_line = lines.next(); + let rest: String = if let Some(line) = first_line { + if line.trim() == "// This file is @generated by prost-build." { + lines.collect::>().join("\n") + } else { + std::iter::once(line) + .chain(lines) + .collect::>() + .join("\n") + } + } else { + String::new() + }; + let new_content = format!("{}{}", header, rest); + fs::write(&file_path, new_content)?; + } + + Ok(()) +} + +fn format_generated_files(proto_dir: &str) -> Result<()> { + let generated_files: Vec = fs::read_dir(proto_dir)? + .filter_map(|entry| entry.ok()) + .map(|entry| entry.path()) + .filter(|path| { + path.extension().is_some_and(|ext| ext == "rs") + && path.file_name().is_some_and(|name| name != "mod.rs") + }) + .collect(); + + if generated_files.is_empty() { + return Ok(()); + } + + // Try nightly first + let result = run_cargo_fmt("+nightly", &generated_files); + + // Fall back to stable if nightly fails + let output = if result.is_err() { + println!("cargo:warning=Nightly rustfmt not available, using stable"); + run_cargo_fmt("", &generated_files)? + } else { + result? + }; + + if !output.status.success() { + println!( + "cargo:warning=Failed to format generated files: {}", + String::from_utf8_lossy(&output.stderr) + ); + } + + Ok(()) +} + +fn run_cargo_fmt(toolchain: &str, files: &[PathBuf]) -> std::io::Result { + let mut cmd = Command::new("cargo"); + + if !toolchain.is_empty() { + cmd.arg(toolchain); + } + + cmd.arg("fmt").arg("--"); + + for file in files { + cmd.arg(file); + } + + cmd.output() +} diff --git a/crates/charon-core/Cargo.toml b/crates/charon-core/Cargo.toml index b80d103d..92186841 100644 --- a/crates/charon-core/Cargo.toml +++ b/crates/charon-core/Cargo.toml @@ -16,7 +16,7 @@ prost.workspace = true prost-types.workspace = true [build-dependencies] -prost-build.workspace = true +charon-build-proto.workspace = true [lints] workspace = true \ No newline at end of file diff --git a/crates/charon-core/build.rs b/crates/charon-core/build.rs index 5872dbb2..b0b60ede 100644 --- a/crates/charon-core/build.rs +++ b/crates/charon-core/build.rs @@ -2,98 +2,8 @@ //! //! This build script compiles the protobuf files. -use std::{fs, io::Result, path::PathBuf, process::Command}; +use std::io::Result; fn main() -> Result<()> { - let proto_dir = "src/corepb/v1"; - - let proto_files: Vec = fs::read_dir(proto_dir)? - .filter_map(|entry| entry.ok()) - .map(|entry| entry.path()) - .filter(|path| path.extension().is_some_and(|ext| ext == "proto")) - .collect(); - - if proto_files.is_empty() { - println!("cargo:warning=No .proto files found in {}", proto_dir); - return Ok(()); - } - - let mut config = prost_build::Config::new(); - config.btree_map(["."]).bytes(["."]).out_dir(proto_dir); - - config.compile_protos( - &proto_files.iter().map(|p| p.as_path()).collect::>(), - &[proto_dir], - )?; - - add_file_attributes(proto_dir)?; - format_generated_files(proto_dir)?; - - for proto_file in &proto_files { - println!("cargo:rerun-if-changed={}", proto_file.display()); - } - println!("cargo:rerun-if-changed={}", proto_dir); - println!("cargo:rerun-if-changed=build.rs"); - - Ok(()) -} - -fn add_file_attributes(proto_dir: &str) -> Result<()> { - let header = "// This file is @generated by prost-build.\n\ - #![allow(dead_code)]\n\ - #![allow(missing_docs)]\n\ - #![allow(clippy::all)]\n\ - #![allow(rustdoc::all)]\n\n"; - - let generated_files: Vec = fs::read_dir(proto_dir)? - .filter_map(|entry| entry.ok()) - .map(|entry| entry.path()) - .filter(|path| { - path.extension().is_some_and(|ext| ext == "rs") - && path.file_name().is_some_and(|name| name != "mod.rs") - }) - .collect(); - - for file_path in generated_files { - let content = fs::read_to_string(&file_path)?; - let mut lines = content.lines(); - let first_line = lines.next(); - let rest: String = if let Some(line) = first_line { - if line.trim() == "// This file is @generated by prost-build." { - lines.collect::>().join("\n") - } else { - std::iter::once(line) - .chain(lines) - .collect::>() - .join("\n") - } - } else { - String::new() - }; - let new_content = format!("{}{}", header, rest); - fs::write(&file_path, new_content)?; - } - - Ok(()) -} - -fn format_generated_files(proto_dir: &str) -> Result<()> { - let output = Command::new("cargo") - .args(["+nightly", "fmt", "--", proto_dir]) - .output() - .or_else(|_| { - println!("cargo:warning=Nightly rustfmt not available, using stable"); - Command::new("cargo") - .args(["fmt", "--", proto_dir]) - .output() - })?; - - if !output.status.success() { - println!( - "cargo:warning=Failed to format generated files: {}", - String::from_utf8_lossy(&output.stderr) - ); - } - - Ok(()) + charon_build_proto::compile_protos("src/corepb/v1") } diff --git a/crates/charon-core/src/corepb/v1-proto/consensus.proto b/crates/charon-core/src/corepb/v1-proto/consensus.proto deleted file mode 100644 index b3b035cb..00000000 --- a/crates/charon-core/src/corepb/v1-proto/consensus.proto +++ /dev/null @@ -1,47 +0,0 @@ -syntax = "proto3"; - -package consensus; - -import "core.proto"; -import "google/protobuf/any.proto"; -import "google/protobuf/timestamp.proto"; - -message QBFTMsg { - int64 type = 1; - core.Duty duty = 2; - int64 peer_idx = 3; - int64 round = 4; - reserved 5; - int64 prepared_round = 6; - reserved 7; - bytes signature = 8; - reserved 9; - reserved 10; - bytes value_hash = 11; - bytes prepared_value_hash = 12; -} - -message QBFTConsensusMsg { - QBFTMsg msg = 1; // msg is the message that we send - repeated QBFTMsg justification = 2; // justification is the justifications from others for the message - repeated google.protobuf.Any values = 3; // values of the hashes in the messages -} - -message SniffedConsensusMsg { - google.protobuf.Timestamp timestamp = 1; - QBFTConsensusMsg msg = 2; - // Other consensus protocol messages can be added here -} - -message SniffedConsensusInstance { - google.protobuf.Timestamp started_at = 1; - int64 nodes = 2; - int64 peer_idx = 3; - repeated SniffedConsensusMsg msgs = 4; - string protocol_id = 5; -} - -message SniffedConsensusInstances { - repeated SniffedConsensusInstance instances = 1; - string git_hash = 2; -} diff --git a/crates/charon-core/src/corepb/v1-proto/consensus.rs b/crates/charon-core/src/corepb/v1-proto/consensus.rs deleted file mode 100644 index f67f1d2f..00000000 --- a/crates/charon-core/src/corepb/v1-proto/consensus.rs +++ /dev/null @@ -1,60 +0,0 @@ -// This file is @generated by prost-build. -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct QbftMsg { - #[prost(int64, tag = "1")] - pub r#type: i64, - #[prost(message, optional, tag = "2")] - pub duty: ::core::option::Option, - #[prost(int64, tag = "3")] - pub peer_idx: i64, - #[prost(int64, tag = "4")] - pub round: i64, - #[prost(int64, tag = "6")] - pub prepared_round: i64, - #[prost(bytes = "bytes", tag = "8")] - pub signature: ::prost::bytes::Bytes, - #[prost(bytes = "bytes", tag = "11")] - pub value_hash: ::prost::bytes::Bytes, - #[prost(bytes = "bytes", tag = "12")] - pub prepared_value_hash: ::prost::bytes::Bytes, -} -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct QbftConsensusMsg { - /// msg is the message that we send - #[prost(message, optional, tag = "1")] - pub msg: ::core::option::Option, - /// justification is the justifications from others for the message - #[prost(message, repeated, tag = "2")] - pub justification: ::prost::alloc::vec::Vec, - /// values of the hashes in the messages - #[prost(message, repeated, tag = "3")] - pub values: ::prost::alloc::vec::Vec<::prost_types::Any>, -} -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct SniffedConsensusMsg { - #[prost(message, optional, tag = "1")] - pub timestamp: ::core::option::Option<::prost_types::Timestamp>, - /// Other consensus protocol messages can be added here - #[prost(message, optional, tag = "2")] - pub msg: ::core::option::Option, -} -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct SniffedConsensusInstance { - #[prost(message, optional, tag = "1")] - pub started_at: ::core::option::Option<::prost_types::Timestamp>, - #[prost(int64, tag = "2")] - pub nodes: i64, - #[prost(int64, tag = "3")] - pub peer_idx: i64, - #[prost(message, repeated, tag = "4")] - pub msgs: ::prost::alloc::vec::Vec, - #[prost(string, tag = "5")] - pub protocol_id: ::prost::alloc::string::String, -} -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct SniffedConsensusInstances { - #[prost(message, repeated, tag = "1")] - pub instances: ::prost::alloc::vec::Vec, - #[prost(string, tag = "2")] - pub git_hash: ::prost::alloc::string::String, -} diff --git a/crates/charon-core/src/corepb/v1-proto/core.proto b/crates/charon-core/src/corepb/v1-proto/core.proto deleted file mode 100644 index daf349eb..00000000 --- a/crates/charon-core/src/corepb/v1-proto/core.proto +++ /dev/null @@ -1,22 +0,0 @@ -syntax = "proto3"; - -package core; - -message Duty { // core.Duty - uint64 slot = 1; // uint64 - int32 type = 2; // core.DutyType -} - -message UnsignedDataSet { // core.UnsignedDataSet - map set = 1; // map[core.PubKey]core.UnsignedData -} - -message ParSignedDataSet { // core.ParSignedDataSet - map set = 1; // map[core.PubKey]core.ParSignedData -} - -message ParSignedData { // core.ParSignedData - bytes data = 1; // []byte - bytes signature = 2; // core.Signature - int32 share_idx = 3; // int -} diff --git a/crates/charon-core/src/corepb/v1-proto/core.rs b/crates/charon-core/src/corepb/v1-proto/core.rs deleted file mode 100644 index 773acbeb..00000000 --- a/crates/charon-core/src/corepb/v1-proto/core.rs +++ /dev/null @@ -1,44 +0,0 @@ -// This file is @generated by prost-build. -/// core.Duty -#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] -pub struct Duty { - /// uint64 - #[prost(uint64, tag = "1")] - pub slot: u64, - /// core.DutyType - #[prost(int32, tag = "2")] - pub r#type: i32, -} -/// core.UnsignedDataSet -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct UnsignedDataSet { - /// map\[core.PubKey\]core.UnsignedData - #[prost(btree_map = "string, bytes", tag = "1")] - pub set: ::prost::alloc::collections::BTreeMap< - ::prost::alloc::string::String, - ::prost::bytes::Bytes, - >, -} -/// core.ParSignedDataSet -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct ParSignedDataSet { - /// map\[core.PubKey\]core.ParSignedData - #[prost(btree_map = "string, message", tag = "1")] - pub set: ::prost::alloc::collections::BTreeMap< - ::prost::alloc::string::String, - ParSignedData, - >, -} -/// core.ParSignedData -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct ParSignedData { - /// \[\]byte - #[prost(bytes = "bytes", tag = "1")] - pub data: ::prost::bytes::Bytes, - /// core.Signature - #[prost(bytes = "bytes", tag = "2")] - pub signature: ::prost::bytes::Bytes, - /// int - #[prost(int32, tag = "3")] - pub share_idx: i32, -} diff --git a/crates/charon-core/src/corepb/v1-proto/parsigex.proto b/crates/charon-core/src/corepb/v1-proto/parsigex.proto deleted file mode 100644 index c7ada4c2..00000000 --- a/crates/charon-core/src/corepb/v1-proto/parsigex.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -package parsigex; - -import "core.proto"; - -message ParSigExMsg { - core.Duty duty = 1; - core.ParSignedDataSet data_set = 2; -} diff --git a/crates/charon-core/src/corepb/v1-proto/parsigex.rs b/crates/charon-core/src/corepb/v1-proto/parsigex.rs deleted file mode 100644 index 0f4ddf5f..00000000 --- a/crates/charon-core/src/corepb/v1-proto/parsigex.rs +++ /dev/null @@ -1,8 +0,0 @@ -// This file is @generated by prost-build. -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct ParSigExMsg { - #[prost(message, optional, tag = "1")] - pub duty: ::core::option::Option, - #[prost(message, optional, tag = "2")] - pub data_set: ::core::option::Option, -} diff --git a/crates/charon-core/src/corepb/v1-proto/priority.proto b/crates/charon-core/src/corepb/v1-proto/priority.proto deleted file mode 100644 index f05e9c6b..00000000 --- a/crates/charon-core/src/corepb/v1-proto/priority.proto +++ /dev/null @@ -1,40 +0,0 @@ -syntax = "proto3"; - -package priority; - -import "core.proto"; -import "google/protobuf/any.proto"; - -// PriorityResult defines a cluster wide priority result of the Prioritiser protocol. -message PriorityResult { - repeated PriorityMsg msgs = 1; - repeated PriorityTopicResult topics = 2; -} - -// PriorityMsg defines all the priorities and metadata of a single peer in the Prioritiser protocol. -message PriorityMsg { - core.Duty duty = 1; - repeated PriorityTopicProposal topics = 2; - string peer_id = 3; - bytes signature = 4; -} - -// PriorityTopicProposal defines a single peers proposed priorities for a single topic in the Prioritiser protocol. -message PriorityTopicProposal { - google.protobuf.Any topic = 1; - repeated google.protobuf.Any priorities = 2; -} - -// PriorityTopicResult defines the cluster wide resulting priorities for a -// single topic in the Prioritiser protocol. -message PriorityTopicResult { - google.protobuf.Any topic = 1; - // priorities are ordered by decreasing score, ties are broken by peer with lowest peer ID. - repeated PriorityScoredResult priorities = 2; -} - -// PriorityScoredResult defines the cluster wide priority score in the Prioritiser protocol. -message PriorityScoredResult { - google.protobuf.Any priority = 1; - int64 score = 2; -} diff --git a/crates/charon-core/src/corepb/v1-proto/priority.rs b/crates/charon-core/src/corepb/v1-proto/priority.rs deleted file mode 100644 index d3854e51..00000000 --- a/crates/charon-core/src/corepb/v1-proto/priority.rs +++ /dev/null @@ -1,47 +0,0 @@ -// This file is @generated by prost-build. -/// PriorityResult defines a cluster wide priority result of the Prioritiser protocol. -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct PriorityResult { - #[prost(message, repeated, tag = "1")] - pub msgs: ::prost::alloc::vec::Vec, - #[prost(message, repeated, tag = "2")] - pub topics: ::prost::alloc::vec::Vec, -} -/// PriorityMsg defines all the priorities and metadata of a single peer in the Prioritiser protocol. -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct PriorityMsg { - #[prost(message, optional, tag = "1")] - pub duty: ::core::option::Option, - #[prost(message, repeated, tag = "2")] - pub topics: ::prost::alloc::vec::Vec, - #[prost(string, tag = "3")] - pub peer_id: ::prost::alloc::string::String, - #[prost(bytes = "bytes", tag = "4")] - pub signature: ::prost::bytes::Bytes, -} -/// PriorityTopicProposal defines a single peers proposed priorities for a single topic in the Prioritiser protocol. -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct PriorityTopicProposal { - #[prost(message, optional, tag = "1")] - pub topic: ::core::option::Option<::prost_types::Any>, - #[prost(message, repeated, tag = "2")] - pub priorities: ::prost::alloc::vec::Vec<::prost_types::Any>, -} -/// PriorityTopicResult defines the cluster wide resulting priorities for a -/// single topic in the Prioritiser protocol. -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct PriorityTopicResult { - #[prost(message, optional, tag = "1")] - pub topic: ::core::option::Option<::prost_types::Any>, - /// priorities are ordered by decreasing score, ties are broken by peer with lowest peer ID. - #[prost(message, repeated, tag = "2")] - pub priorities: ::prost::alloc::vec::Vec, -} -/// PriorityScoredResult defines the cluster wide priority score in the Prioritiser protocol. -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct PriorityScoredResult { - #[prost(message, optional, tag = "1")] - pub priority: ::core::option::Option<::prost_types::Any>, - #[prost(int64, tag = "2")] - pub score: i64, -} From 9b3a9a70ab700cb6dc4df0e4d0029e217ac18ec1 Mon Sep 17 00:00:00 2001 From: Bohdan Ohorodnii <35969035+varex83@users.noreply.github.com> Date: Wed, 26 Nov 2025 16:30:35 +0200 Subject: [PATCH 5/7] feat: add peerinfopb --- Cargo.lock | 5 +++ crates/charon/Cargo.toml | 5 +++ crates/charon/build.rs | 9 +++++ crates/charon/src/lib.rs | 35 ++----------------- crates/charon/src/peerinfo/mod.rs | 2 ++ crates/charon/src/peerinfo/peerinfopb/mod.rs | 2 ++ crates/charon/src/peerinfo/peerinfopb/v1.rs | 2 ++ .../src/peerinfo/peerinfopb/v1/peerinfo.proto | 17 +++++++++ .../src/peerinfo/peerinfopb/v1/peerinfo.rs | 23 ++++++++++++ 9 files changed, 67 insertions(+), 33 deletions(-) create mode 100644 crates/charon/build.rs create mode 100644 crates/charon/src/peerinfo/mod.rs create mode 100644 crates/charon/src/peerinfo/peerinfopb/mod.rs create mode 100644 crates/charon/src/peerinfo/peerinfopb/v1.rs create mode 100644 crates/charon/src/peerinfo/peerinfopb/v1/peerinfo.proto create mode 100644 crates/charon/src/peerinfo/peerinfopb/v1/peerinfo.rs diff --git a/Cargo.lock b/Cargo.lock index 8a8b0560..a420d7bd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -418,6 +418,11 @@ dependencies = [ [[package]] name = "charon" version = "0.1.0" +dependencies = [ + "charon-build-proto", + "prost", + "prost-types", +] [[package]] name = "charon-build-proto" diff --git a/crates/charon/Cargo.toml b/crates/charon/Cargo.toml index fc437a8a..56dbdc4b 100644 --- a/crates/charon/Cargo.toml +++ b/crates/charon/Cargo.toml @@ -7,6 +7,11 @@ license.workspace = true publish.workspace = true [dependencies] +prost.workspace = true +prost-types.workspace = true + +[build-dependencies] +charon-build-proto.workspace = true [lints] workspace = true diff --git a/crates/charon/build.rs b/crates/charon/build.rs new file mode 100644 index 00000000..b4a8b370 --- /dev/null +++ b/crates/charon/build.rs @@ -0,0 +1,9 @@ +//! # Charon Peerinfo Build Script +//! +//! This build script compiles the protobuf files. + +use std::io::Result; + +fn main() -> Result<()> { + charon_build_proto::compile_protos("src/peerinfo/peerinfopb/v1") +} diff --git a/crates/charon/src/lib.rs b/crates/charon/src/lib.rs index 5ef0c7fe..d0a1debc 100644 --- a/crates/charon/src/lib.rs +++ b/crates/charon/src/lib.rs @@ -4,36 +4,5 @@ //! coordination for Ethereum 2.0 validators. This crate serves as the primary //! entry point for the Charon distributed validator node implementation. -/// Adds two numbers together. -/// -/// # Arguments -/// -/// * `left` - The first number to add -/// * `right` - The second number to add -/// -/// # Returns -/// -/// The sum of the two numbers -/// -/// # Examples -/// -/// ``` -/// use charon::add; -/// -/// let result = add(2, 2); -/// assert_eq!(result, 4); -/// ``` -pub fn add(left: u64, right: u64) -> u64 { - left.wrapping_add(right) -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn it_works() { - let result = add(2, 2); - assert_eq!(result, 4); - } -} +/// Peerinfo. +pub mod peerinfo; diff --git a/crates/charon/src/peerinfo/mod.rs b/crates/charon/src/peerinfo/mod.rs new file mode 100644 index 00000000..f2f898d3 --- /dev/null +++ b/crates/charon/src/peerinfo/mod.rs @@ -0,0 +1,2 @@ +/// Peerinfo protobuf definitions. +pub mod peerinfopb; diff --git a/crates/charon/src/peerinfo/peerinfopb/mod.rs b/crates/charon/src/peerinfo/peerinfopb/mod.rs new file mode 100644 index 00000000..bb6553a6 --- /dev/null +++ b/crates/charon/src/peerinfo/peerinfopb/mod.rs @@ -0,0 +1,2 @@ +/// V1 +pub mod v1; diff --git a/crates/charon/src/peerinfo/peerinfopb/v1.rs b/crates/charon/src/peerinfo/peerinfopb/v1.rs new file mode 100644 index 00000000..318a23bc --- /dev/null +++ b/crates/charon/src/peerinfo/peerinfopb/v1.rs @@ -0,0 +1,2 @@ +/// Peerinfo protobuf definitions. +pub mod peerinfo; diff --git a/crates/charon/src/peerinfo/peerinfopb/v1/peerinfo.proto b/crates/charon/src/peerinfo/peerinfopb/v1/peerinfo.proto new file mode 100644 index 00000000..c467aaf9 --- /dev/null +++ b/crates/charon/src/peerinfo/peerinfopb/v1/peerinfo.proto @@ -0,0 +1,17 @@ +syntax = "proto3"; + +package peerinfo; + +import "google/protobuf/timestamp.proto"; + +message PeerInfo { + string charon_version = 1; + bytes lock_hash = 2; + optional google.protobuf.Timestamp sent_at = 3; + string git_hash = 4; + optional google.protobuf.Timestamp started_at = 5; + bool builder_api_enabled = 6; + string nickname = 7; + + // NOTE: Always populate timestamps when sending, then make them required after subsequent release. +} diff --git a/crates/charon/src/peerinfo/peerinfopb/v1/peerinfo.rs b/crates/charon/src/peerinfo/peerinfopb/v1/peerinfo.rs new file mode 100644 index 00000000..18793065 --- /dev/null +++ b/crates/charon/src/peerinfo/peerinfopb/v1/peerinfo.rs @@ -0,0 +1,23 @@ +// This file is @generated by prost-build. +#![allow(dead_code)] +#![allow(missing_docs)] +#![allow(clippy::all)] +#![allow(rustdoc::all)] + +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct PeerInfo { + #[prost(string, tag = "1")] + pub charon_version: ::prost::alloc::string::String, + #[prost(bytes = "bytes", tag = "2")] + pub lock_hash: ::prost::bytes::Bytes, + #[prost(message, optional, tag = "3")] + pub sent_at: ::core::option::Option<::prost_types::Timestamp>, + #[prost(string, tag = "4")] + pub git_hash: ::prost::alloc::string::String, + #[prost(message, optional, tag = "5")] + pub started_at: ::core::option::Option<::prost_types::Timestamp>, + #[prost(bool, tag = "6")] + pub builder_api_enabled: bool, + #[prost(string, tag = "7")] + pub nickname: ::prost::alloc::string::String, +} From 2acb23a1bc34dea8d6143ae0695beeec3167e26f Mon Sep 17 00:00:00 2001 From: Bohdan Ohorodnii <35969035+varex83@users.noreply.github.com> Date: Wed, 26 Nov 2025 16:42:42 +0200 Subject: [PATCH 6/7] feat: add lokipb --- crates/charon/build.rs | 5 +++- crates/charon/src/lib.rs | 3 +++ crates/charon/src/log/loki/lokipb/mod.rs | 2 ++ crates/charon/src/log/loki/lokipb/v1.rs | 2 ++ .../charon/src/log/loki/lokipb/v1/loki.proto | 20 ++++++++++++++ crates/charon/src/log/loki/lokipb/v1/loki.rs | 27 +++++++++++++++++++ crates/charon/src/log/loki/mod.rs | 2 ++ crates/charon/src/log/mod.rs | 2 ++ 8 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 crates/charon/src/log/loki/lokipb/mod.rs create mode 100644 crates/charon/src/log/loki/lokipb/v1.rs create mode 100644 crates/charon/src/log/loki/lokipb/v1/loki.proto create mode 100644 crates/charon/src/log/loki/lokipb/v1/loki.rs create mode 100644 crates/charon/src/log/loki/mod.rs create mode 100644 crates/charon/src/log/mod.rs diff --git a/crates/charon/build.rs b/crates/charon/build.rs index b4a8b370..ef2ad4cd 100644 --- a/crates/charon/build.rs +++ b/crates/charon/build.rs @@ -5,5 +5,8 @@ use std::io::Result; fn main() -> Result<()> { - charon_build_proto::compile_protos("src/peerinfo/peerinfopb/v1") + charon_build_proto::compile_protos("src/peerinfo/peerinfopb/v1")?; + charon_build_proto::compile_protos("src/log/loki/lokipb/v1")?; + + Ok(()) } diff --git a/crates/charon/src/lib.rs b/crates/charon/src/lib.rs index d0a1debc..93f0371f 100644 --- a/crates/charon/src/lib.rs +++ b/crates/charon/src/lib.rs @@ -6,3 +6,6 @@ /// Peerinfo. pub mod peerinfo; + +/// Log +pub mod log; diff --git a/crates/charon/src/log/loki/lokipb/mod.rs b/crates/charon/src/log/loki/lokipb/mod.rs new file mode 100644 index 00000000..bb6553a6 --- /dev/null +++ b/crates/charon/src/log/loki/lokipb/mod.rs @@ -0,0 +1,2 @@ +/// V1 +pub mod v1; diff --git a/crates/charon/src/log/loki/lokipb/v1.rs b/crates/charon/src/log/loki/lokipb/v1.rs new file mode 100644 index 00000000..02d5f8ca --- /dev/null +++ b/crates/charon/src/log/loki/lokipb/v1.rs @@ -0,0 +1,2 @@ +/// Loki protobuf definitions. +pub mod loki; diff --git a/crates/charon/src/log/loki/lokipb/v1/loki.proto b/crates/charon/src/log/loki/lokipb/v1/loki.proto new file mode 100644 index 00000000..541e79a8 --- /dev/null +++ b/crates/charon/src/log/loki/lokipb/v1/loki.proto @@ -0,0 +1,20 @@ +syntax = "proto3"; + +package loki; + +import "google/protobuf/timestamp.proto"; + +message PushRequest { + repeated Stream streams = 1; +} + +message Stream { + string labels = 1; + repeated Entry entries = 2; + uint64 hash = 3; +} + +message Entry { + google.protobuf.Timestamp timestamp = 1; + string line = 2; +} diff --git a/crates/charon/src/log/loki/lokipb/v1/loki.rs b/crates/charon/src/log/loki/lokipb/v1/loki.rs new file mode 100644 index 00000000..47c8d95e --- /dev/null +++ b/crates/charon/src/log/loki/lokipb/v1/loki.rs @@ -0,0 +1,27 @@ +// This file is @generated by prost-build. +#![allow(dead_code)] +#![allow(missing_docs)] +#![allow(clippy::all)] +#![allow(rustdoc::all)] + +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct PushRequest { + #[prost(message, repeated, tag = "1")] + pub streams: ::prost::alloc::vec::Vec, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Stream { + #[prost(string, tag = "1")] + pub labels: ::prost::alloc::string::String, + #[prost(message, repeated, tag = "2")] + pub entries: ::prost::alloc::vec::Vec, + #[prost(uint64, tag = "3")] + pub hash: u64, +} +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct Entry { + #[prost(message, optional, tag = "1")] + pub timestamp: ::core::option::Option<::prost_types::Timestamp>, + #[prost(string, tag = "2")] + pub line: ::prost::alloc::string::String, +} diff --git a/crates/charon/src/log/loki/mod.rs b/crates/charon/src/log/loki/mod.rs new file mode 100644 index 00000000..4c05e265 --- /dev/null +++ b/crates/charon/src/log/loki/mod.rs @@ -0,0 +1,2 @@ +/// Loki protobuf definitions. +pub mod lokipb; diff --git a/crates/charon/src/log/mod.rs b/crates/charon/src/log/mod.rs new file mode 100644 index 00000000..81107ba1 --- /dev/null +++ b/crates/charon/src/log/mod.rs @@ -0,0 +1,2 @@ +/// Loki +pub mod loki; From 15200f85daae4ffad128cb388f84ee58ff30fa85 Mon Sep 17 00:00:00 2001 From: Bohdan Ohorodnii <35969035+varex83@users.noreply.github.com> Date: Wed, 3 Dec 2025 17:52:46 +0200 Subject: [PATCH 7/7] fix: remove deps.txt --- deps.txt | 59 -------------------------------------------------------- 1 file changed, 59 deletions(-) delete mode 100644 deps.txt diff --git a/deps.txt b/deps.txt deleted file mode 100644 index 5fcf4785..00000000 --- a/deps.txt +++ /dev/null @@ -1,59 +0,0 @@ -p2p: - - app/protonil - - app/log - - app/z - - app/lifecycle - - app/expbackoff (use external crate?) - - app/k1util (done) - - eth2util/enr (done) - - app/promauto (metrics) -p2p.testing: - - core/corepb/v1 - - testutil - -app/lifecycle: - - app/log - -app/protonil: - - app/z - -app/z: - -app/promauto: - -app/log: - - app/z - - app/promauto - - app/expbackoff - -cmd: - - app/version - - core/consensus/protocols - - app/log - - app/z - - app/k1util (done) - - charon/cluster (done) - - eth2util/enr (done) - - charon/p2p - - app/obolapi - - charon/app - - app/promauto (metrics) - - cluster/manifestpb (done) - - cluster/manifest - - tbls (done) - - eth2util - - eth2util/signing - - eth2wrap - - eth2util/keystore - - tblsconv - - dkg - - eth2util/deposit - - core - - eth2util/keymanager - - eth2util/registration - - app/featureset - -cmd.testing: - - testutil - - testutil/relay - - different mocks for different components