diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5677b703..21adb771 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,8 +22,12 @@ jobs: steps: - name: Checkout sources uses: actions/checkout@v4 + with: + submodules: true - name: Install stable toolchain uses: dtolnay/rust-toolchain@stable + - name: Install protoc + run: sudo apt-get install protobuf-compiler - run: cargo clippy --all -- -D warnings tests: name: Test @@ -31,6 +35,10 @@ jobs: steps: - name: Checkout sources uses: actions/checkout@v4 + with: + submodules: true - name: Install stable toolchain uses: dtolnay/rust-toolchain@stable + - name: Install protoc + run: sudo apt-get install protobuf-compiler - run: cargo test --all-features diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..fd26c6f2 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "crates/signer/proto"] + path = crates/signer/proto + url = https://github.com/wealdtech/eth2-signer-api.git diff --git a/Cargo.lock b/Cargo.lock index f868a993..4e38ccb0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -65,15 +65,15 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.18" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "alloy" -version = "0.8.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "689e271a72a5c0b05bfdf41c9d0424f11e9df721385dc5bd9045a51f9ea3313b" +checksum = "59febb24956a41c29bb5f450978fbe825bd6456b3f80586c8bd558dc882e7b6a" dependencies = [ "alloy-consensus", "alloy-contract", @@ -96,19 +96,20 @@ dependencies = [ [[package]] name = "alloy-chains" -version = "0.1.24" +version = "0.1.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47ff94ce0f141c2671c23d02c7b88990dd432856639595c5d010663d017c2c58" +checksum = "1e39f295f876b61a1222d937e1dd31f965e4a1acc3bba98e448dd7e84b1a4566" dependencies = [ + "alloy-primitives", "num_enum", "strum", ] [[package]] name = "alloy-consensus" -version = "0.8.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ba14856660f31807ebb26ce8f667e814c72694e1077e97ef102e326ad580f3f" +checksum = "e88e1edea70787c33e11197d3f32ae380f3db19e6e061e539a5bcf8184a6b326" dependencies = [ "alloy-eips", "alloy-primitives", @@ -124,9 +125,9 @@ dependencies = [ [[package]] name = "alloy-consensus-any" -version = "0.8.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28666307e76441e7af37a2b90cde7391c28112121bea59f4e0d804df8b20057e" +checksum = "57b1bb53f40c0273cd1975573cd457b39213e68584e36d1401d25fd0398a1d65" dependencies = [ "alloy-consensus", "alloy-eips", @@ -138,9 +139,9 @@ dependencies = [ [[package]] name = "alloy-contract" -version = "0.8.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3510769905590b8991a8e63a5e0ab4aa72cf07a13ab5fbe23f12f4454d161da" +checksum = "1b668c78c4b1f12f474ede5a85e8ce550d0aa1ef7d49fd1d22855a43b960e725" dependencies = [ "alloy-dyn-abi", "alloy-json-abi", @@ -154,14 +155,14 @@ dependencies = [ "alloy-transport", "futures", "futures-util", - "thiserror 2.0.6", + "thiserror 2.0.11", ] [[package]] name = "alloy-core" -version = "0.8.15" +version = "0.8.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c618bd382f0bc2ac26a7e4bfae01c9b015ca8f21b37ca40059ae35a7e62b3dc6" +checksum = "d0713007d14d88a6edb8e248cddab783b698dbb954a28b8eee4bab21cfb7e578" dependencies = [ "alloy-dyn-abi", "alloy-json-abi", @@ -172,9 +173,9 @@ dependencies = [ [[package]] name = "alloy-dyn-abi" -version = "0.8.15" +version = "0.8.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41056bde53ae10ffbbf11618efbe1e0290859e5eab0fe9ef82ebdb62f12a866f" +checksum = "44e3b98c37b3218924cd1d2a8570666b89662be54e5b182643855f783ea68b33" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -184,7 +185,7 @@ dependencies = [ "itoa", "serde", "serde_json", - "winnow 0.6.13", + "winnow", ] [[package]] @@ -213,9 +214,9 @@ dependencies = [ [[package]] name = "alloy-eips" -version = "0.8.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47e922d558006ba371681d484d12aa73fe673d84884f83747730af7433c0e86d" +checksum = "5f9fadfe089e9ccc0650473f2d4ef0a28bc015bbca5631d9f0f09e49b557fdb3" dependencies = [ "alloy-eip2930", "alloy-eip7702", @@ -224,7 +225,7 @@ dependencies = [ "alloy-serde", "c-kzg", "derive_more", - "ethereum_ssz 0.8.0", + "ethereum_ssz 0.8.2", "ethereum_ssz_derive", "once_cell", "serde", @@ -233,9 +234,9 @@ dependencies = [ [[package]] name = "alloy-genesis" -version = "0.8.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dca170827a7ca156b43588faebf9e9d27c27d0fb07cab82cfd830345e2b24f5" +checksum = "2b2a4cf7b70f3495788e74ce1c765260ffe38820a2a774ff4aacb62e31ea73f9" dependencies = [ "alloy-primitives", "alloy-serde", @@ -245,9 +246,9 @@ dependencies = [ [[package]] name = "alloy-json-abi" -version = "0.8.15" +version = "0.8.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c357da577dfb56998d01f574d81ad7a1958d248740a7981b205d69d65a7da404" +checksum = "731ea743b3d843bc657e120fb1d1e9cc94f5dab8107e35a82125a63e6420a102" dependencies = [ "alloy-primitives", "alloy-sol-type-parser", @@ -257,23 +258,23 @@ dependencies = [ [[package]] name = "alloy-json-rpc" -version = "0.8.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9335278f50b0273e0a187680ee742bb6b154a948adf036f448575bacc5ccb315" +checksum = "e29040b9d5fe2fb70415531882685b64f8efd08dfbd6cc907120650504821105" dependencies = [ "alloy-primitives", "alloy-sol-types", "serde", "serde_json", - "thiserror 2.0.6", + "thiserror 2.0.11", "tracing", ] [[package]] name = "alloy-network" -version = "0.8.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad4e6ad4230df8c4a254c20f8d6a84ab9df151bfca13f463177dbc96571cc1f8" +checksum = "510cc00b318db0dfccfdd2d032411cfae64fc144aef9679409e014145d3dacc4" dependencies = [ "alloy-consensus", "alloy-consensus-any", @@ -291,14 +292,14 @@ dependencies = [ "futures-utils-wasm", "serde", "serde_json", - "thiserror 2.0.6", + "thiserror 2.0.11", ] [[package]] name = "alloy-network-primitives" -version = "0.8.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4df88a2f8020801e0fefce79471d3946d39ca3311802dbbd0ecfdeee5e972e3" +checksum = "9081c099e798b8a2bba2145eb82a9a146f01fc7a35e9ab6e7b43305051f97550" dependencies = [ "alloy-consensus", "alloy-eips", @@ -309,9 +310,9 @@ dependencies = [ [[package]] name = "alloy-primitives" -version = "0.8.15" +version = "0.8.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6259a506ab13e1d658796c31e6e39d2e2ee89243bcc505ddc613b35732e0a430" +checksum = "788bb18e8f61d5d9340b52143f27771daf7e1dccbaf2741621d2493f9debf52e" dependencies = [ "alloy-rlp", "bytes", @@ -320,9 +321,8 @@ dependencies = [ "derive_more", "foldhash", "getrandom", - "hashbrown 0.15.1", - "hex-literal", - "indexmap", + "hashbrown 0.15.2", + "indexmap 2.7.0", "itoa", "k256", "keccak-asm", @@ -338,9 +338,9 @@ dependencies = [ [[package]] name = "alloy-provider" -version = "0.8.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5115c74c037714e1b02a86f742289113afa5d494b5ea58308ba8aa378e739101" +checksum = "dc2dfaddd9a30aa870a78a4e1316e3e115ec1e12e552cbc881310456b85c1f24" dependencies = [ "alloy-chains", "alloy-consensus", @@ -369,7 +369,7 @@ dependencies = [ "schnellru", "serde", "serde_json", - "thiserror 2.0.6", + "thiserror 2.0.11", "tokio", "tracing", "url", @@ -378,9 +378,9 @@ dependencies = [ [[package]] name = "alloy-pubsub" -version = "0.8.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b073afa409698d1b9a30522565815f3bf7010e5b47b997cf399209e6110df097" +checksum = "695809e743628d54510c294ad17a4645bd9f465aeb0d20ee9ce9877c9712dc9c" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -414,14 +414,14 @@ checksum = "5a833d97bf8a5f0f878daf2c8451fff7de7f9de38baa5a45d936ec718d81255a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] name = "alloy-rpc-client" -version = "0.8.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6a0bd0ce5660ac48e4f3bb0c7c5c3a94db287a0be94971599d83928476cbcd" +checksum = "531137b283547d5b9a5cafc96b006c64ef76810c681d606f28be9781955293b6" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -445,9 +445,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types" -version = "0.8.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374ac12e35bb90ebccd86e7c943ddba9590149a6e35cc4d9cd860d6635fd1018" +checksum = "3410a472ce26c457e9780f708ee6bd540b30f88f1f31fdab7a11d00bd6aa1aee" dependencies = [ "alloy-primitives", "alloy-rpc-types-beacon", @@ -459,9 +459,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-any" -version = "0.8.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea98f81bcd759dbfa3601565f9d7a02220d8ef1d294ec955948b90aaafbfd857" +checksum = "ed98e1af55a7d856bfa385f30f63d8d56be2513593655c904a8f4a7ec963aa3e" dependencies = [ "alloy-consensus-any", "alloy-rpc-types-eth", @@ -470,26 +470,25 @@ dependencies = [ [[package]] name = "alloy-rpc-types-beacon" -version = "0.8.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e13e94be8f6f5cb735e604f9db436430bf3773fdd41db7221edaa58c07c4c8a" +checksum = "c966cacae719252501d2c5f6b67beac2fd6c03ec3c5bb64d664e769737ea5651" dependencies = [ "alloy-eips", "alloy-primitives", "alloy-rpc-types-engine", - "alloy-serde", - "ethereum_ssz 0.8.0", + "ethereum_ssz 0.8.2", "ethereum_ssz_derive", "serde", "serde_with", - "thiserror 2.0.6", + "thiserror 2.0.11", ] [[package]] name = "alloy-rpc-types-engine" -version = "0.8.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ca5898f753ff0d15a0dc955c169523d8fee57e05bb5a38a398b3451b0b988be" +checksum = "03bd16fa4959255ebf4a7702df08f325e5631df5cdca07c8a8e58bdc10fe02e3" dependencies = [ "alloy-consensus", "alloy-eips", @@ -497,7 +496,7 @@ dependencies = [ "alloy-rlp", "alloy-serde", "derive_more", - "ethereum_ssz 0.8.0", + "ethereum_ssz 0.8.2", "ethereum_ssz_derive", "serde", "strum", @@ -505,9 +504,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-eth" -version = "0.8.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e518b0a7771e00728f18be0708f828b18a1cfc542a7153bef630966a26388e0" +checksum = "8737d7a6e37ca7bba9c23e9495c6534caec6760eb24abc9d5ffbaaba147818e1" dependencies = [ "alloy-consensus", "alloy-consensus-any", @@ -525,9 +524,9 @@ dependencies = [ [[package]] name = "alloy-serde" -version = "0.8.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed3dc8d4a08ffc90c1381d39a4afa2227668259a42c97ab6eecf51cbd82a8761" +checksum = "5851bf8d5ad33014bd0c45153c603303e730acc8a209450a7ae6b4a12c2789e2" dependencies = [ "alloy-primitives", "serde", @@ -536,23 +535,23 @@ dependencies = [ [[package]] name = "alloy-signer" -version = "0.8.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16188684100f6e0f2a2b949968fe3007749c5be431549064a1bce4e7b3a196a9" +checksum = "7e10ca565da6500cca015ba35ee424d59798f2e1b85bc0dd8f81dafd401f029a" dependencies = [ "alloy-primitives", "async-trait", "auto_impl", "elliptic-curve", "k256", - "thiserror 2.0.6", + "thiserror 2.0.11", ] [[package]] name = "alloy-signer-local" -version = "0.8.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2184dab8c9493ab3e1c9f6bd3bdb563ed322b79023d81531935e84a4fdf7cf1" +checksum = "47fababf5a745133490cde927d48e50267f97d3d1209b9fc9f1d1d666964d172" dependencies = [ "alloy-consensus", "alloy-network", @@ -561,47 +560,47 @@ dependencies = [ "async-trait", "k256", "rand", - "thiserror 2.0.6", + "thiserror 2.0.11", ] [[package]] name = "alloy-sol-macro" -version = "0.8.15" +version = "0.8.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9d64f851d95619233f74b310f12bcf16e0cbc27ee3762b6115c14a84809280a" +checksum = "a07b74d48661ab2e4b50bb5950d74dbff5e61dd8ed03bb822281b706d54ebacb" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] name = "alloy-sol-macro-expander" -version = "0.8.15" +version = "0.8.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bf7ed1574b699f48bf17caab4e6e54c6d12bc3c006ab33d58b1e227c1c3559f" +checksum = "19cc9c7f20b90f9be1a8f71a3d8e283a43745137b0837b1a1cb13159d37cad72" dependencies = [ "alloy-json-abi", "alloy-sol-macro-input", "const-hex", "heck", - "indexmap", + "indexmap 2.7.0", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", "syn-solidity", "tiny-keccak", ] [[package]] name = "alloy-sol-macro-input" -version = "0.8.15" +version = "0.8.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c02997ccef5f34f9c099277d4145f183b422938ed5322dc57a089fe9b9ad9ee" +checksum = "713b7e6dfe1cb2f55c80fb05fd22ed085a1b4e48217611365ed0ae598a74c6ac" dependencies = [ "alloy-json-abi", "const-hex", @@ -610,25 +609,25 @@ dependencies = [ "proc-macro2", "quote", "serde_json", - "syn 2.0.90", + "syn 2.0.96", "syn-solidity", ] [[package]] name = "alloy-sol-type-parser" -version = "0.8.15" +version = "0.8.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce13ff37285b0870d0a0746992a4ae48efaf34b766ae4c2640fa15e5305f8e73" +checksum = "1eda2711ab2e1fb517fc6e2ffa9728c9a232e296d16810810e6957b781a1b8bc" dependencies = [ "serde", - "winnow 0.6.13", + "winnow", ] [[package]] name = "alloy-sol-types" -version = "0.8.15" +version = "0.8.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1174cafd6c6d810711b4e00383037bdb458efc4fe3dbafafa16567e0320c54d8" +checksum = "e3b478bc9c0c4737a04cd976accde4df7eba0bdc0d90ad6ff43d58bc93cf79c1" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -639,9 +638,9 @@ dependencies = [ [[package]] name = "alloy-transport" -version = "0.8.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "628be5b9b75e4f4c4f2a71d985bbaca4f23de356dc83f1625454c505f5eef4df" +checksum = "538a04a37221469cac0ce231b737fd174de2fdfcdd843bdd068cb39ed3e066ad" dependencies = [ "alloy-json-rpc", "base64 0.22.1", @@ -649,7 +648,7 @@ dependencies = [ "futures-utils-wasm", "serde", "serde_json", - "thiserror 2.0.6", + "thiserror 2.0.11", "tokio", "tower 0.5.2", "tracing", @@ -659,9 +658,9 @@ dependencies = [ [[package]] name = "alloy-transport-http" -version = "0.8.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e24412cf72f79c95cd9b1d9482e3a31f9d94c24b43c4b3b710cc8d4341eaab0" +checksum = "2ed40eb1e1265b2911512f6aa1dcece9702d078f5a646730c45e39e2be00ac1c" dependencies = [ "alloy-json-rpc", "alloy-transport", @@ -674,9 +673,9 @@ dependencies = [ [[package]] name = "alloy-transport-ipc" -version = "0.8.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0577a1f67ce70ece3f2b27cf1011da7222ef0a5701f7dcb558e5356278eeb531" +checksum = "a7a172a59d24706b26a79a837f86d51745cb26ca6f8524712acd0208a14cff95" dependencies = [ "alloy-json-rpc", "alloy-pubsub", @@ -693,9 +692,9 @@ dependencies = [ [[package]] name = "alloy-transport-ws" -version = "0.8.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ca46272d17f9647fdb56080ed26c72b3ea5078416831130f5ed46f3b4be0ed6" +checksum = "fba0e39d181d13c266dbb8ca54ed584a2c66d6e9279afca89c7a6b1825e98abb" dependencies = [ "alloy-pubsub", "alloy-transport", @@ -711,9 +710,9 @@ dependencies = [ [[package]] name = "alloy-trie" -version = "0.7.6" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a5fd8fea044cc9a8c8a50bb6f28e31f0385d820f116c5b98f6f4e55d6e5590b" +checksum = "6917c79e837aa7b77b7a6dae9f89cbe15313ac161c4d3cfaf8909ef21f3d22d8" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -727,9 +726,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.14" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", @@ -742,43 +741,50 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.7" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" -version = "0.2.4" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.3" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a64c907d4e79225ac72e2a354c9ce84d50ebb4586dee56c82b3ee73004f537f5" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.3" +version = "3.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" +checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" dependencies = [ "anstyle", - "windows-sys 0.52.0", + "once_cell", + "windows-sys 0.59.0", ] +[[package]] +name = "anyhow" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" + [[package]] name = "arbitrary" -version = "1.3.2" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" dependencies = [ "derive_arbitrary", ] @@ -817,7 +823,7 @@ dependencies = [ "num-bigint", "num-traits", "paste", - "rustc_version 0.4.0", + "rustc_version 0.4.1", "zeroize", ] @@ -907,20 +913,26 @@ dependencies = [ "rand", ] +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + [[package]] name = "arrayvec" -version = "0.7.4" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" dependencies = [ "serde", ] [[package]] name = "async-stream" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" dependencies = [ "async-stream-impl", "futures-core", @@ -929,24 +941,24 @@ dependencies = [ [[package]] name = "async-stream-impl" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] name = "async-trait" -version = "0.1.80" +version = "0.1.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" +checksum = "3f934833b4b7233644e5848f235df3f57ed8c80f1528a26c3dfa13d2147fa056" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] @@ -957,7 +969,7 @@ checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" dependencies = [ "futures", "pharos", - "rustc_version 0.4.0", + "rustc_version 0.4.1", ] [[package]] @@ -968,20 +980,47 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "auto_impl" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" +checksum = "e12882f59de5360c748c4cbf569a042d5fb0eb515f7bea9c1f470b47f6ffbd73" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] name = "autocfg" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "axum" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" +dependencies = [ + "async-trait", + "axum-core 0.4.5", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "itoa", + "matchit 0.7.3", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "sync_wrapper", + "tower 0.5.2", + "tower-layer", + "tower-service", +] [[package]] name = "axum" @@ -989,7 +1028,7 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d6fd624c75e18b3b4c6b9caf42b1afe24437daaee904069137d8bab077be8b8" dependencies = [ - "axum-core", + "axum-core 0.5.0", "axum-macros", "bytes", "form_urlencoded", @@ -1000,7 +1039,7 @@ dependencies = [ "hyper", "hyper-util", "itoa", - "matchit", + "matchit 0.8.4", "memchr", "mime", "percent-encoding", @@ -1010,7 +1049,7 @@ dependencies = [ "serde_json", "serde_path_to_error", "serde_urlencoded", - "sync_wrapper 1.0.1", + "sync_wrapper", "tokio", "tower 0.5.2", "tower-layer", @@ -1018,6 +1057,26 @@ dependencies = [ "tracing", ] +[[package]] +name = "axum-core" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "sync_wrapper", + "tower-layer", + "tower-service", +] + [[package]] name = "axum-core" version = "0.5.0" @@ -1032,7 +1091,7 @@ dependencies = [ "mime", "pin-project-lite", "rustversion", - "sync_wrapper 1.0.1", + "sync_wrapper", "tower-layer", "tower-service", "tracing", @@ -1044,8 +1103,8 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "460fc6f625a1f7705c6cf62d0d070794e94668988b1c38111baeec177c715f7b" dependencies = [ - "axum", - "axum-core", + "axum 0.8.1", + "axum-core 0.5.0", "bytes", "futures-util", "headers", @@ -1068,7 +1127,7 @@ checksum = "604fde5e028fea851ce1d8570bbdc034bec850d157f7569d10f347d06808c05c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] @@ -1136,15 +1195,9 @@ checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" [[package]] name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.5.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" +checksum = "1be3f42a67d6d345ecd59f675f3f012d6974981560836e938c22b424b85ce1be" [[package]] name = "bitvec" @@ -1164,7 +1217,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" dependencies = [ - "generic-array", + "generic-array 0.14.7", ] [[package]] @@ -1173,7 +1226,7 @@ version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ - "generic-array", + "generic-array 0.14.7", ] [[package]] @@ -1186,7 +1239,7 @@ dependencies = [ "ethereum-types", "ethereum_hashing 0.6.0", "ethereum_serde_utils 0.5.2", - "ethereum_ssz 0.5.3", + "ethereum_ssz 0.5.4", "hex", "rand", "serde", @@ -1194,11 +1247,38 @@ dependencies = [ "zeroize", ] +[[package]] +name = "blsful" +version = "2.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a676ce0f93ae20ca6defc223b5ac459a6f071bd88c03100a14cb93604a5e994c" +dependencies = [ + "anyhow", + "arrayref", + "blstrs_plus", + "hex", + "hkdf", + "merlin", + "pairing", + "rand", + "rand_chacha", + "rand_core", + "serde", + "serde_bare", + "sha2 0.10.8", + "sha3", + "subtle", + "thiserror 1.0.69", + "uint-zigzag", + "vsss-rs", + "zeroize", +] + [[package]] name = "blst" -version = "0.3.11" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c94087b935a822949d3291a9989ad2b2051ea141eda0fd4e478a75f6aa3e604b" +checksum = "62dc83a094a71d43eeadd254b1ec2d24cb6a0bb6cadce00df51f0db594711a32" dependencies = [ "cc", "glob", @@ -1206,6 +1286,24 @@ dependencies = [ "zeroize", ] +[[package]] +name = "blstrs_plus" +version = "0.8.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a16dd4b0d6b4538e1fa0388843acb186363082713a8fc8416d802a04d013818" +dependencies = [ + "arrayref", + "blst", + "elliptic-curve", + "ff", + "group", + "pairing", + "rand_core", + "serde", + "subtle", + "zeroize", +] + [[package]] name = "builder_log" version = "0.7.0-rc.1" @@ -1237,24 +1335,25 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.6.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" dependencies = [ "serde", ] [[package]] name = "c-kzg" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdf100c4cea8f207e883ff91ca886d621d8a166cb04971dfaa9bb8fd99ed95df" +checksum = "f0307f72feab3300336fb803a57134159f6e20139af1357f36c54cb90d8e8928" dependencies = [ "blst", "cc", "glob", "hex", "libc", + "once_cell", "serde", ] @@ -1263,7 +1362,7 @@ name = "cb-bench-pbs" version = "0.7.0-rc.1" dependencies = [ "alloy", - "axum", + "axum 0.8.1", "cb-common", "cb-pbs", "cb-tests", @@ -1290,7 +1389,7 @@ dependencies = [ "docker-compose-types", "dotenvy", "eyre", - "indexmap", + "indexmap 2.7.0", "serde", "serde_json", "serde_yaml", @@ -1303,7 +1402,7 @@ dependencies = [ "aes 0.8.4", "alloy", "async-trait", - "axum", + "axum 0.8.1", "base64 0.22.1", "bimap", "blst", @@ -1312,7 +1411,7 @@ dependencies = [ "derive_more", "eth2_keystore", "ethereum_serde_utils 0.7.0", - "ethereum_ssz 0.8.0", + "ethereum_ssz 0.8.2", "ethereum_ssz_derive", "eyre", "k256", @@ -1324,9 +1423,10 @@ dependencies = [ "serde_yaml", "sha2 0.10.8", "ssz_types", - "thiserror 1.0.61", + "thiserror 1.0.69", "tokio", "toml", + "tonic", "tracing", "tracing-appender", "tracing-subscriber", @@ -1340,11 +1440,11 @@ dependencies = [ name = "cb-metrics" version = "0.7.0-rc.1" dependencies = [ - "axum", + "axum 0.8.1", "cb-common", "eyre", "prometheus", - "thiserror 1.0.61", + "thiserror 1.0.69", "tokio", "tracing", ] @@ -1355,7 +1455,7 @@ version = "0.7.0-rc.1" dependencies = [ "alloy", "async-trait", - "axum", + "axum 0.8.1", "blst", "cb-common", "cb-metrics", @@ -1367,12 +1467,12 @@ dependencies = [ "prometheus", "reqwest", "serde_json", - "thiserror 1.0.61", + "thiserror 1.0.69", "tokio", "tracing", "tree_hash 0.9.1", "url", - "uuid 1.8.0", + "uuid 1.12.0", ] [[package]] @@ -1380,24 +1480,26 @@ name = "cb-signer" version = "0.7.0-rc.1" dependencies = [ "alloy", - "axum", + "axum 0.8.1", "axum-extra", "bimap", - "blst", + "blsful", "cb-common", "cb-metrics", - "derive_more", "eyre", + "futures", "headers", - "k256", "lazy_static", "prometheus", - "thiserror 1.0.61", + "prost", + "rand", + "thiserror 1.0.69", "tokio", + "tonic", + "tonic-build", "tracing", "tree_hash 0.9.1", - "tree_hash_derive", - "uuid 1.8.0", + "uuid 1.12.0", ] [[package]] @@ -1405,7 +1507,7 @@ name = "cb-tests" version = "0.7.0-rc.1" dependencies = [ "alloy", - "axum", + "axum 0.8.1", "cb-common", "cb-pbs", "eyre", @@ -1420,9 +1522,12 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.98" +version = "1.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41c270e7540d725e65ac7f1b212ac8ce349719624d7bcff99f8e2e488e8cf03f" +checksum = "c8293772165d9345bdaaa39b45b2109591e63fe5e6fbc23c6ff930a048aa310b" +dependencies = [ + "shlex", +] [[package]] name = "cfg-if" @@ -1432,9 +1537,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.38" +version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" dependencies = [ "num-traits", "serde", @@ -1446,7 +1551,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" dependencies = [ - "generic-array", + "generic-array 0.14.7", ] [[package]] @@ -1461,9 +1566,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.4" +version = "4.5.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" +checksum = "a8eb5e908ef3a6efbe1ed62520fb7287959888c88485abe072543190ecc66783" dependencies = [ "clap_builder", "clap_derive", @@ -1471,9 +1576,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.2" +version = "4.5.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" +checksum = "96b01801b5fc6a0a232407abc821660c9c6d25a1cafc0d4f85f29fb8d9afc121" dependencies = [ "anstream", "anstyle", @@ -1483,21 +1588,21 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.4" +version = "4.5.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64" +checksum = "54b755194d6389280185988721fffba69495eed5ee9feeee9a599b53db80318c" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] name = "clap_lex" -version = "0.7.0" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" [[package]] name = "color-eyre" @@ -1528,15 +1633,15 @@ dependencies = [ [[package]] name = "colorchoice" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "comfy-table" -version = "7.1.1" +version = "7.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b34115915337defe99b2aff5c2ce6771e5fbc4079f4b506301f5cf394c8452f7" +checksum = "24f165e7b643266ea80cb858aed492ad9280e3e05ce24d4a99d7d7b889b6a4d9" dependencies = [ "crossterm", "strum", @@ -1593,44 +1698,53 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.6" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core2" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" +dependencies = [ + "memchr", +] [[package]] name = "cpufeatures" -version = "0.2.12" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" dependencies = [ "libc", ] [[package]] name = "crossbeam-channel" -version = "0.5.13" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" +checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.20" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crossterm" -version = "0.27.0" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f476fe445d41c9e991fd07515a6f463074b782242ccf4a5b7b1d1012e70824df" +checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" dependencies = [ - "bitflags 2.5.0", + "bitflags", "crossterm_winapi", - "libc", "parking_lot", + "rustix", "winapi", ] @@ -1655,7 +1769,7 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ - "generic-array", + "generic-array 0.14.7", "rand_core", "subtle", "zeroize", @@ -1667,7 +1781,7 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ - "generic-array", + "generic-array 0.14.7", "typenum", ] @@ -1677,7 +1791,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25fab6889090c8133f3deb8f73ba3c65a7f456f66436fc012a1b1e272b1e103e" dependencies = [ - "generic-array", + "generic-array 0.14.7", "subtle", ] @@ -1717,9 +1831,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.9" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" dependencies = [ "darling_core", "darling_macro", @@ -1727,27 +1841,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.9" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622687fe0bac72a04e5599029151f5796111b90f1baaa9b544d807a5e31cd120" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] name = "darling_macro" -version = "0.20.9" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] @@ -1815,44 +1929,44 @@ dependencies = [ [[package]] name = "derive_arbitrary" -version = "1.3.2" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" +checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] name = "derive_builder" -version = "0.20.0" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0350b5cb0331628a5916d6c5c0b72e97393b8b6b03b47a9284f4e7f5a405ffd7" +checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" dependencies = [ "derive_builder_macro", ] [[package]] name = "derive_builder_core" -version = "0.20.0" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d48cda787f839151732d396ac69e3473923d54312c070ee21e9effcaa8ca0b1d" +checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] name = "derive_builder_macro" -version = "0.20.0" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "206868b8242f27cecce124c19fd88157fbd0dd334df2587f36417bafbc85097b" +checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] @@ -1872,7 +1986,7 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", "unicode-xid", ] @@ -1882,7 +1996,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" dependencies = [ - "generic-array", + "generic-array 0.14.7", ] [[package]] @@ -1897,6 +2011,17 @@ dependencies = [ "subtle", ] +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + [[package]] name = "docker-compose-types" version = "0.12.0" @@ -1904,7 +2029,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9213a368b9c0767c81ef9ced0f712cfd99d27d7de2a22a60e7ac9b1342c8a395" dependencies = [ "derive_builder", - "indexmap", + "indexmap 2.7.0", "serde", "serde_yaml", ] @@ -1923,9 +2048,9 @@ checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" [[package]] name = "dunce" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" [[package]] name = "ecdsa" @@ -1943,9 +2068,9 @@ dependencies = [ [[package]] name = "either" -version = "1.12.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "elliptic-curve" @@ -1957,8 +2082,9 @@ dependencies = [ "crypto-bigint", "digest 0.10.7", "ff", - "generic-array", + "generic-array 0.14.7", "group", + "hkdf", "pkcs8", "rand_core", "sec1", @@ -1968,9 +2094,9 @@ dependencies = [ [[package]] name = "encoding_rs" -version = "0.8.34" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ "cfg-if", ] @@ -1983,12 +2109,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -2103,9 +2229,9 @@ dependencies = [ [[package]] name = "ethereum_ssz" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e61ffea29f26e8249d35128a82ec8d3bd4fbc80179ea5f5e5e3daafef6a80fcb" +checksum = "7d3627f83d8b87b432a5fad9934b4565260722a141a2c40f371f8080adec9425" dependencies = [ "ethereum-types", "itertools 0.10.5", @@ -2114,12 +2240,11 @@ dependencies = [ [[package]] name = "ethereum_ssz" -version = "0.8.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfbba28f4f3f32d92c06a64f5bf6c4537b5d4e21f28c689bd2bbaecfea4e0d3e" +checksum = "862e41ea8eea7508f70cfd8cd560f0c34bb0af37c719a8e06c2672f0f031d8e5" dependencies = [ "alloy-primitives", - "derivative", "ethereum_serde_utils 0.7.0", "itertools 0.13.0", "serde", @@ -2130,14 +2255,14 @@ dependencies = [ [[package]] name = "ethereum_ssz_derive" -version = "0.8.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d37845ba7c16bf4be8be4b5786f03a2ba5f2fda0d7f9e7cb2282f69cff420d7" +checksum = "d31ecf6640112f61dc34b4d8359c081102969af0edd18381fed2052f6db6a410" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] @@ -2152,9 +2277,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.1.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "fastrlp" @@ -2167,12 +2292,24 @@ dependencies = [ "bytes", ] +[[package]] +name = "fastrlp" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + [[package]] name = "ff" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ + "bitvec", "rand_core", "subtle", ] @@ -2189,6 +2326,12 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + [[package]] name = "fnv" version = "1.0.7" @@ -2197,9 +2340,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "foldhash" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2" +checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" [[package]] name = "foreign-types" @@ -2233,9 +2376,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -2248,9 +2391,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -2258,15 +2401,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -2275,38 +2418,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-macro" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -2337,6 +2480,15 @@ dependencies = [ "zeroize", ] +[[package]] +name = "generic-array" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8c8444bc9d71b935156cc0ccab7f622180808af7867b1daae6547d773591703" +dependencies = [ + "typenum", +] + [[package]] name = "getrandom" version = "0.2.15" @@ -2356,9 +2508,9 @@ checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" [[package]] name = "glob" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" [[package]] name = "group" @@ -2367,15 +2519,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff", + "rand", "rand_core", + "rand_xorshift", "subtle", ] [[package]] name = "h2" -version = "0.4.5" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab" +checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" dependencies = [ "atomic-waker", "bytes", @@ -2383,13 +2537,19 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap", + "indexmap 2.7.0", "slab", "tokio", "tokio-util", "tracing", ] +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + [[package]] name = "hashbrown" version = "0.13.2" @@ -2401,17 +2561,15 @@ name = "hashbrown" version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash", - "allocator-api2", -] [[package]] name = "hashbrown" -version = "0.15.1" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" dependencies = [ + "allocator-api2", + "equivalent", "foldhash", "serde", ] @@ -2462,18 +2620,21 @@ dependencies = [ ] [[package]] -name = "hex-literal" -version = "0.4.1" +name = "histogram" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" +checksum = "58cf6b99a250776d813cdf2f0b478a053a822d078e7a2baf5cb36afc88c41a7c" +dependencies = [ + "thiserror 1.0.69", +] [[package]] -name = "histogram" -version = "0.11.0" +name = "hkdf" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62b8d85713ddc62e5e78db13bf9f9305610d0419276faa845076a68b7165872" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" dependencies = [ - "thiserror 1.0.61", + "hmac 0.12.1", ] [[package]] @@ -2497,9 +2658,9 @@ dependencies = [ [[package]] name = "http" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" dependencies = [ "bytes", "fnv", @@ -2508,9 +2669,9 @@ dependencies = [ [[package]] name = "http-body" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", "http", @@ -2518,12 +2679,12 @@ dependencies = [ [[package]] name = "http-body-util" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", - "futures-core", + "futures-util", "http", "http-body", "pin-project-lite", @@ -2531,9 +2692,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.8.0" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" [[package]] name = "httpdate" @@ -2543,9 +2704,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "1.3.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" +checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" dependencies = [ "bytes", "futures-channel", @@ -2563,12 +2724,42 @@ dependencies = [ ] [[package]] -name = "hyper-tls" -version = "0.6.0" +name = "hyper-rustls" +version = "0.27.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" dependencies = [ - "bytes", + "futures-util", + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", +] + +[[package]] +name = "hyper-timeout" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" +dependencies = [ + "hyper", + "hyper-util", + "pin-project-lite", + "tokio", + "tower-service", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", "http-body-util", "hyper", "hyper-util", @@ -2580,9 +2771,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.3" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" dependencies = [ "bytes", "futures-channel", @@ -2593,11 +2784,128 @@ dependencies = [ "pin-project-lite", "socket2", "tokio", - "tower 0.4.13", "tower-service", "tracing", ] +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -2606,12 +2914,23 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.5.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", ] [[package]] @@ -2643,13 +2962,13 @@ dependencies = [ [[package]] name = "impl-trait-for-tuples" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" +checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.96", ] [[package]] @@ -2660,12 +2979,22 @@ checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" [[package]] name = "indexmap" -version = "2.6.0" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", +] + +[[package]] +name = "indexmap" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" dependencies = [ "equivalent", - "hashbrown 0.15.1", + "hashbrown 0.15.2", "serde", ] @@ -2675,7 +3004,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" dependencies = [ - "generic-array", + "generic-array 0.14.7", ] [[package]] @@ -2695,15 +3024,15 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.9.0" +version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" [[package]] name = "is_terminal_polyfill" -version = "1.70.0" +version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" [[package]] name = "itertools" @@ -2725,24 +3054,25 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "js-sys" -version = "0.3.69" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ + "once_cell", "wasm-bindgen", ] [[package]] name = "k256" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" dependencies = [ "cfg-if", "ecdsa", @@ -2763,9 +3093,9 @@ dependencies = [ [[package]] name = "keccak-asm" -version = "0.1.1" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47a3633291834c4fbebf8673acbc1b04ec9d151418ff9b8e26dcd79129928758" +checksum = "505d1856a39b200489082f90d897c3f07c455563880bc5952e38eabf731c83b6" dependencies = [ "digest 0.10.7", "sha3-asm", @@ -2782,21 +3112,27 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.155" +version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "libm" -version = "0.2.8" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" [[package]] name = "linux-raw-sys" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "litemap" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" [[package]] name = "lock_api" @@ -2810,17 +3146,17 @@ dependencies = [ [[package]] name = "log" -version = "0.4.21" +version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" [[package]] name = "lru" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37ee39891760e7d94734f6f63fedc29a2e4a152f836120753a72503f09fcf904" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.14.5", + "hashbrown 0.15.2", ] [[package]] @@ -2832,6 +3168,12 @@ dependencies = [ "regex-automata 0.1.10", ] +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + [[package]] name = "matchit" version = "0.8.4" @@ -2840,9 +3182,21 @@ checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" [[package]] name = "memchr" -version = "2.7.2" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "merlin" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" +dependencies = [ + "byteorder", + "keccak", + "rand_core", + "zeroize", +] [[package]] name = "mime" @@ -2852,31 +3206,36 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "miniz_oxide" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87dfd01fe195c66b572b37921ad8803d010623c0aca821bea2302239d155cdae" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" dependencies = [ "adler", ] [[package]] name = "mio" -version = "0.8.11" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ "libc", "wasi", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] +[[package]] +name = "multimap" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" + [[package]] name = "native-tls" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" dependencies = [ - "lazy_static", "libc", "log", "openssl", @@ -2900,9 +3259,9 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c165a9ab64cf766f73521c0dd2cfdff64f488b8f0b3e621face3462d3db536d7" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ "num-integer", "num-traits", @@ -2989,14 +3348,14 @@ checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] name = "nybbles" -version = "0.2.1" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95f06be0417d97f81fe4e5c86d7d01b392655a9cac9c19a848aa033e18937b23" +checksum = "8983bb634df7248924ee0c4c3a749609b5abcb082c28fffe3254b3eb3602b307" dependencies = [ "alloy-rlp", "const-hex", @@ -3016,9 +3375,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.19.0" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "opaque-debug" @@ -3028,11 +3387,11 @@ checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "openssl" -version = "0.10.64" +version = "0.10.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" +checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" dependencies = [ - "bitflags 2.5.0", + "bitflags", "cfg-if", "foreign-types", "libc", @@ -3049,7 +3408,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] @@ -3060,9 +3419,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.102" +version = "0.9.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" +checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" dependencies = [ "cc", "libc", @@ -3082,6 +3441,15 @@ version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" +[[package]] +name = "pairing" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" +dependencies = [ + "group", +] + [[package]] name = "parity-scale-codec" version = "3.6.12" @@ -3128,7 +3496,7 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.5", + "windows-targets", ] [[package]] @@ -3164,15 +3532,25 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.10" +version = "2.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "560131c633294438da9f7c4b08189194b20946c8274c6b9e38881a7874dc8ee8" +checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc" dependencies = [ "memchr", - "thiserror 1.0.61", + "thiserror 2.0.11", "ucd-trie", ] +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset", + "indexmap 2.7.0", +] + [[package]] name = "pharos" version = "0.5.3" @@ -3180,34 +3558,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" dependencies = [ "futures", - "rustc_version 0.4.0", + "rustc_version 0.4.1", ] [[package]] name = "pin-project" -version = "1.1.5" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +checksum = "1e2ec53ad785f4d35dac0adea7f7dc6f1bb277ad84a680c7afefeae05d1f5916" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.5" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +checksum = "d56a66c0c55993aa927429d0f8a0abfd74f084e4d9c192cffed01e418d83eefb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -3227,9 +3605,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "powerfmt" @@ -3239,9 +3617,22 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "prettyplease" +version = "0.2.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "6924ced06e1f7dfe3fa48d57b9f74f55d8915f5036121bef647ef4b204895fac" +dependencies = [ + "proc-macro2", + "syn 2.0.96", +] [[package]] name = "primitive-types" @@ -3258,11 +3649,11 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "3.1.0" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" dependencies = [ - "toml_edit 0.21.1", + "toml_edit", ] [[package]] @@ -3284,14 +3675,14 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] name = "proc-macro2" -version = "1.0.92" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" dependencies = [ "unicode-ident", ] @@ -3308,29 +3699,81 @@ dependencies = [ "memchr", "parking_lot", "protobuf", - "thiserror 1.0.61", + "thiserror 1.0.69", ] [[package]] name = "proptest" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" +checksum = "b4c2511913b88df1637da85cc8d96ec8e43a3f8bb8ccb71ee1ac240d6f3df58d" dependencies = [ "bit-set", "bit-vec", - "bitflags 2.5.0", + "bitflags", "lazy_static", "num-traits", "rand", "rand_chacha", "rand_xorshift", - "regex-syntax 0.8.3", + "regex-syntax 0.8.5", "rusty-fork", "tempfile", "unarray", ] +[[package]] +name = "prost" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c0fef6c4230e4ccf618a35c59d7ede15dea37de8427500f50aff708806e42ec" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-build" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0f3e5beed80eb580c68e2c600937ac2c4eedabdfd5ef1e5b7ea4f3fba84497b" +dependencies = [ + "heck", + "itertools 0.13.0", + "log", + "multimap", + "once_cell", + "petgraph", + "prettyplease", + "prost", + "prost-types", + "regex", + "syn 2.0.96", + "tempfile", +] + +[[package]] +name = "prost-derive" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "157c5a9d7ea5c2ed2d9fb8f495b64759f7816c7eaea54ba3978f0d63000162e3" +dependencies = [ + "anyhow", + "itertools 0.13.0", + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "prost-types" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2f1e56baa61e93533aebc21af4d2134b70f66275e0fcdf3cbe43d77ff7e8fc" +dependencies = [ + "prost", +] + [[package]] name = "protobuf" version = "2.28.0" @@ -3345,9 +3788,9 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quote" -version = "1.0.36" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] @@ -3406,23 +3849,23 @@ checksum = "d3edd4d5d42c92f0a659926464d4cce56b562761267ecf0f469d85b7de384175" [[package]] name = "redox_syscall" -version = "0.5.1" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" +checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ - "bitflags 2.5.0", + "bitflags", ] [[package]] name = "regex" -version = "1.10.5" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.7", - "regex-syntax 0.8.3", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", ] [[package]] @@ -3436,13 +3879,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.3", + "regex-syntax 0.8.5", ] [[package]] @@ -3453,15 +3896,15 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.4" +version = "0.12.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "566cafdd92868e0939d3fb961bd0dc25fcfaaed179291093b3d43e6b3150ea10" +checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" dependencies = [ "base64 0.22.1", "bytes", @@ -3473,6 +3916,7 @@ dependencies = [ "http-body", "http-body-util", "hyper", + "hyper-rustls", "hyper-tls", "hyper-util", "ipnet", @@ -3487,18 +3931,19 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "sync_wrapper 0.1.2", + "sync_wrapper", "system-configuration", "tokio", "tokio-native-tls", "tokio-util", + "tower 0.5.2", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "wasm-streams", "web-sys", - "winreg", + "windows-registry", ] [[package]] @@ -3553,16 +3998,18 @@ dependencies = [ [[package]] name = "ruint" -version = "1.12.3" +version = "1.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c3cc4c2511671f327125da14133d0c5c5d137f006a1017a16f557bc85b16286" +checksum = "f5ef8fb1dd8de3870cb8400d51b4c2023854bbafd5431a3ac7e7317243e22d2f" dependencies = [ "alloy-rlp", "ark-ff 0.3.0", "ark-ff 0.4.2", "bytes", - "fastrlp", + "fastrlp 0.3.1", + "fastrlp 0.4.0", "num-bigint", + "num-integer", "num-traits", "parity-scale-codec", "primitive-types", @@ -3589,9 +4036,9 @@ checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc-hash" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" +checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" [[package]] name = "rustc-hex" @@ -3610,32 +4057,33 @@ dependencies = [ [[package]] name = "rustc_version" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ - "semver 1.0.23", + "semver 1.0.24", ] [[package]] name = "rustix" -version = "0.38.34" +version = "0.38.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +checksum = "a78891ee6bf2340288408954ac787aa063d8e8817e9f53abb37c695c6d834ef6" dependencies = [ - "bitflags 2.5.0", + "bitflags", "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "rustls" -version = "0.23.20" +version = "0.23.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5065c3f250cbd332cd894be57c40fa52387247659b14a2d6041d121547903b1b" +checksum = "8f287924602bf649d949c63dc8ac8b235fa5387d394020705b80c4eb597ce5b8" dependencies = [ + "log", "once_cell", "ring 0.17.8", "rustls-pki-types", @@ -3646,19 +4094,18 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" dependencies = [ - "base64 0.22.1", "rustls-pki-types", ] [[package]] name = "rustls-pki-types" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" +checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" [[package]] name = "rustls-webpki" @@ -3673,9 +4120,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.17" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" +checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" [[package]] name = "rusty-fork" @@ -3706,18 +4153,18 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.23" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "schnellru" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9a8ef13a93c54d20580de1e5c413e624e53121d42fc7e2c11d10ef7f8b02367" +checksum = "356285bbf17bea63d9e52e96bd18f039672ac92b55b8cb997d6162a2a37d1649" dependencies = [ "ahash", "cfg-if", @@ -3750,7 +4197,7 @@ checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ "base16ct", "der", - "generic-array", + "generic-array 0.14.7", "pkcs8", "subtle", "zeroize", @@ -3758,11 +4205,11 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.5.0", + "bitflags", "core-foundation", "core-foundation-sys", "libc", @@ -3771,9 +4218,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.11.0" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" dependencies = [ "core-foundation-sys", "libc", @@ -3790,15 +4237,15 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.23" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" [[package]] name = "semver-parser" -version = "0.10.2" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" +checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" dependencies = [ "pest", ] @@ -3811,31 +4258,41 @@ checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" [[package]] name = "serde" -version = "1.0.202" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "226b61a0d411b2ba5ff6d7f73a476ac4f8bb900373459cd00fab8512828ba395" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" dependencies = [ "serde_derive", ] +[[package]] +name = "serde_bare" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51c55386eed0f1ae957b091dc2ca8122f287b60c79c774cbe3d5f2b69fded660" +dependencies = [ + "serde", +] + [[package]] name = "serde_derive" -version = "1.0.202" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6048858004bcff69094cd972ed40a32500f153bd3be9f716b2eed2e8217c4838" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] name = "serde_json" -version = "1.0.117" +version = "1.0.135" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" +checksum = "2b0d7ba2887406110130a978386c4e1befb98c674b4fba677954e4db976630d9" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] @@ -3858,14 +4315,14 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] name = "serde_spanned" -version = "0.6.6" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" dependencies = [ "serde", ] @@ -3884,9 +4341,9 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.8.1" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad483d2ab0149d5a5ebcd9972a3852711e0153d863bf5a5d0391d28883c4a20" +checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" dependencies = [ "base64 0.22.1", "chrono", @@ -3900,14 +4357,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.8.1" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65569b702f41443e8bc8bbb1c5779bd0450bbe723b56198980e80ec45780bce2" +checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] @@ -3916,7 +4373,7 @@ version = "0.9.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0623d197252096520c6f2a5e1171ee436e5af99a5d7caa2891e55e61950e6d9" dependencies = [ - "indexmap", + "indexmap 2.7.0", "itoa", "ryu", "serde", @@ -3970,9 +4427,9 @@ dependencies = [ [[package]] name = "sha3-asm" -version = "0.1.1" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9b57fd861253bff08bb1919e995f90ba8f4889de2726091c8876f3a4e823b40" +checksum = "c28efc5e327c837aa837c59eae585fc250715ef939ac32881bcc11677cd02d46" dependencies = [ "cc", "cfg-if", @@ -3987,6 +4444,12 @@ dependencies = [ "lazy_static", ] +[[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.2" @@ -4026,9 +4489,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" dependencies = [ "libc", "windows-sys 0.52.0", @@ -4063,7 +4526,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dad0fa7e9a85c06d0a6ba5100d733fff72e231eb6db2d86078225cf716fd2d95" dependencies = [ "ethereum_serde_utils 0.7.0", - "ethereum_ssz 0.8.0", + "ethereum_ssz 0.8.2", "itertools 0.13.0", "serde", "serde_derive", @@ -4072,6 +4535,12 @@ dependencies = [ "typenum", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "static_assertions" version = "1.1.0" @@ -4083,7 +4552,7 @@ name = "status_api" version = "0.7.0-rc.1" dependencies = [ "async-trait", - "axum", + "axum 0.8.1", "color-eyre", "commit-boost", "eyre", @@ -4120,7 +4589,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] @@ -4142,9 +4611,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.90" +version = "2.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" +checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" dependencies = [ "proc-macro2", "quote", @@ -4153,44 +4622,52 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "0.8.15" +version = "0.8.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219389c1ebe89f8333df8bdfb871f6631c552ff399c23cac02480b6088aad8f0" +checksum = "31e89d8bf2768d277f40573c83a02a099e96d96dd3104e13ea676194e61ac4b0" dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] name = "sync_wrapper" -version = "0.1.2" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] [[package]] -name = "sync_wrapper" -version = "1.0.1" +name = "synstructure" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] [[package]] name = "system-configuration" -version = "0.5.1" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 1.3.2", + "bitflags", "core-foundation", "system-configuration-sys", ] [[package]] name = "system-configuration-sys" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" dependencies = [ "core-foundation-sys", "libc", @@ -4204,54 +4681,76 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.10.1" +version = "3.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704" dependencies = [ "cfg-if", "fastrand", + "getrandom", + "once_cell", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "thiserror" -version = "1.0.61" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl 1.0.61", + "thiserror-impl 1.0.69", ] [[package]] name = "thiserror" -version = "2.0.6" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec2a1820ebd077e2b90c4df007bebf344cd394098a13c563957d0afc83ea47" +checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" dependencies = [ - "thiserror-impl 2.0.6", + "thiserror-impl 2.0.11", ] [[package]] name = "thiserror-impl" -version = "1.0.61" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] name = "thiserror-impl" -version = "2.0.6" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "thiserror-impl-no-std" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d65750cab40f4ff1929fb1ba509e9914eb756131cef4210da8d5d700d26f6312" +checksum = "58e6318948b519ba6dc2b442a6d0b904ebfb8d411a3ad3e07843615a72249758" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 1.0.109", +] + +[[package]] +name = "thiserror-no-std" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3ad459d94dd517257cc96add8a43190ee620011bb6e6cdc82dafd97dfafafea" +dependencies = [ + "thiserror-impl-no-std", ] [[package]] @@ -4275,9 +4774,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.36" +version = "0.3.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" dependencies = [ "deranged", "itoa", @@ -4296,9 +4795,9 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" dependencies = [ "num-conv", "time-core", @@ -4313,11 +4812,21 @@ dependencies = [ "crunchy", ] +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" dependencies = [ "tinyvec_macros", ] @@ -4330,32 +4839,31 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.37.0" +version = "1.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" +checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" dependencies = [ "backtrace", "bytes", "libc", "mio", - "num_cpus", "parking_lot", "pin-project-lite", "signal-hook-registry", "socket2", "tokio-macros", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "tokio-macros" -version = "2.2.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] @@ -4380,9 +4888,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.15" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" dependencies = [ "futures-core", "pin-project-lite", @@ -4408,9 +4916,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.11" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" dependencies = [ "bytes", "futures-core", @@ -4421,47 +4929,82 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.14" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f49eb2ab21d2f26bd6db7bf383edc527a7ebaee412d17af4d40fdccd442f335" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.14", + "toml_edit", ] [[package]] name = "toml_datetime" -version = "0.6.6" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.21.1" +version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ - "indexmap", + "indexmap 2.7.0", + "serde", + "serde_spanned", "toml_datetime", - "winnow 0.5.40", + "winnow", ] [[package]] -name = "toml_edit" -version = "0.22.14" +name = "tonic" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f21c7aaf97f1bd9ca9d4f9e73b0a6c74bd5afef56f2bc931943a6e1c37e04e38" +checksum = "877c5b330756d856ffcc4553ab34a5684481ade925ecc54bcd1bf02b1d0d4d52" dependencies = [ - "indexmap", - "serde", - "serde_spanned", - "toml_datetime", - "winnow 0.6.13", + "async-stream", + "async-trait", + "axum 0.7.9", + "base64 0.22.1", + "bytes", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-timeout", + "hyper-util", + "percent-encoding", + "pin-project", + "prost", + "rustls-pemfile", + "socket2", + "tokio", + "tokio-rustls", + "tokio-stream", + "tower 0.4.13", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tonic-build" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9557ce109ea773b399c9b9e5dca39294110b74f1f342cb347a80d1fce8c26a11" +dependencies = [ + "prettyplease", + "proc-macro2", + "prost-build", + "prost-types", + "quote", + "syn 2.0.96", ] [[package]] @@ -4472,9 +5015,13 @@ checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" dependencies = [ "futures-core", "futures-util", + "indexmap 1.9.3", "pin-project", "pin-project-lite", + "rand", + "slab", "tokio", + "tokio-util", "tower-layer", "tower-service", "tracing", @@ -4489,7 +5036,7 @@ dependencies = [ "futures-core", "futures-util", "pin-project-lite", - "sync_wrapper 1.0.1", + "sync_wrapper", "tokio", "tower-layer", "tower-service", @@ -4510,9 +5057,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "log", "pin-project-lite", @@ -4527,27 +5074,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" dependencies = [ "crossbeam-channel", - "thiserror 1.0.61", + "thiserror 1.0.69", "time", "tracing-subscriber", ] [[package]] name = "tracing-attributes" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", "valuable", @@ -4555,9 +5102,9 @@ dependencies = [ [[package]] name = "tracing-error" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d686ec1c0f384b1277f097b2f279a2ecc11afe8c133c1aabf036a27cb4cd206e" +checksum = "8b1581020d7a273442f5b45074a6a57d5757ad0a47dac0e9f0bd57b81936f3db" dependencies = [ "tracing", "tracing-subscriber", @@ -4576,9 +5123,9 @@ dependencies = [ [[package]] name = "tracing-serde" -version = "0.1.3" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1" +checksum = "704b1aeb7be0d0a84fc9828cae51dab5970fee5088f83d1dd7ee6f6246fc6ff1" dependencies = [ "serde", "tracing-core", @@ -4586,9 +5133,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.18" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" dependencies = [ "matchers", "nu-ansi-term", @@ -4624,7 +5171,7 @@ checksum = "6c58eb0f518840670270d90d97ffee702d8662d9c5494870c9e1e9e0fa00f668" dependencies = [ "alloy-primitives", "ethereum_hashing 0.7.0", - "ethereum_ssz 0.8.0", + "ethereum_ssz 0.8.2", "smallvec", "typenum", ] @@ -4638,7 +5185,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", ] [[package]] @@ -4663,7 +5210,7 @@ dependencies = [ "rustls", "rustls-pki-types", "sha1", - "thiserror 1.0.61", + "thiserror 1.0.69", "utf-8", ] @@ -4675,9 +5222,9 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "ucd-trie" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" [[package]] name = "uint" @@ -4692,22 +5239,25 @@ dependencies = [ ] [[package]] -name = "unarray" -version = "0.1.4" +name = "uint-zigzag" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" +checksum = "abbf77aed65cb885a8ba07138c365879be3d9a93dce82bf6cc50feca9138ec15" +dependencies = [ + "core2", +] [[package]] -name = "unicode-bidi" -version = "0.3.15" +name = "unarray" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" [[package]] name = "unicode-normalization" @@ -4720,15 +5270,15 @@ dependencies = [ [[package]] name = "unicode-width" -version = "0.1.13" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" +checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" [[package]] name = "unicode-xid" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229730647fbc343e3a80e463c1db7f78f3855d3f3739bee0dda773c9a037c90a" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "unsafe-libyaml" @@ -4750,9 +5300,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.0" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", "idna", @@ -4766,11 +5316,23 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" @@ -4784,9 +5346,9 @@ dependencies = [ [[package]] name = "uuid" -version = "1.8.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" +checksum = "744018581f9a3454a9e15beb8a33b017183f1e7c0cd170232a2d1453b23a51c4" dependencies = [ "getrandom", "rand", @@ -4807,9 +5369,25 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vsss-rs" +version = "4.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fabeca519a296f0b39428cfe496b600c0179c9498687986449d61fa40e60806" +dependencies = [ + "crypto-bigint", + "elliptic-curve", + "generic-array 1.2.0", + "rand_core", + "serde", + "sha3", + "subtle", + "thiserror-no-std", +] [[package]] name = "wait-timeout" @@ -4837,46 +5415,48 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.92" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", + "once_cell", + "rustversion", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.92" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.42" +version = "0.4.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" dependencies = [ "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.92" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4884,28 +5464,31 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.92" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.92" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] [[package]] name = "wasm-streams" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e072d4e72f700fb3443d8fe94a39315df013eef1104903cdb0a2abd322bbecd" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" dependencies = [ "futures-util", "js-sys", @@ -4930,9 +5513,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.69" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" dependencies = [ "js-sys", "wasm-bindgen", @@ -4976,171 +5559,137 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "windows-sys" -version = "0.48.0" +name = "windows-registry" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" dependencies = [ - "windows-targets 0.48.5", + "windows-result", + "windows-strings", + "windows-targets", ] [[package]] -name = "windows-sys" -version = "0.52.0" +name = "windows-result" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" dependencies = [ - "windows-targets 0.52.5", + "windows-targets", ] [[package]] -name = "windows-targets" -version = "0.48.5" +name = "windows-strings" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" 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", + "windows-result", + "windows-targets", ] [[package]] -name = "windows-targets" -version = "0.52.5" +name = "windows-sys" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows_aarch64_gnullvm 0.52.5", - "windows_aarch64_msvc 0.52.5", - "windows_i686_gnu 0.52.5", - "windows_i686_gnullvm", - "windows_i686_msvc 0.52.5", - "windows_x86_64_gnu 0.52.5", - "windows_x86_64_gnullvm 0.52.5", - "windows_x86_64_msvc 0.52.5", + "windows-targets", ] [[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" +name = "windows-sys" +version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] [[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.5" +name = "windows-targets" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] [[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" +name = "windows_aarch64_gnullvm" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.5.40" +version = "0.6.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +checksum = "c8d71a593cc5c42ad7876e2c1fda56f314f3754c084128833e64f1345ff8a03a" dependencies = [ "memchr", ] [[package]] -name = "winnow" -version = "0.6.13" +name = "write16" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1" -dependencies = [ - "memchr", -] +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" [[package]] -name = "winreg" -version = "0.52.0" +name = "writeable" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] name = "ws_stream_wasm" @@ -5153,9 +5702,9 @@ dependencies = [ "js-sys", "log", "pharos", - "rustc_version 0.4.0", + "rustc_version 0.4.1", "send_wrapper", - "thiserror 1.0.61", + "thiserror 1.0.69", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -5170,12 +5719,37 @@ dependencies = [ "tap", ] +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", + "synstructure", +] + [[package]] name = "zerocopy" version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ + "byteorder", "zerocopy-derive", ] @@ -5187,14 +5761,35 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", +] + +[[package]] +name = "zerofrom" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", + "synstructure", ] [[package]] name = "zeroize" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" dependencies = [ "zeroize_derive", ] @@ -5207,5 +5802,27 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.96", +] + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", ] diff --git a/Cargo.toml b/Cargo.toml index 029088a3..00ba56ca 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -45,6 +45,9 @@ axum = { version = "0.8.1", features = ["macros"] } axum-extra = { version = "0.10.0", features = ["typed-header"] } reqwest = { version = "0.12.4", features = ["json", "stream"] } headers = "0.4.0" +tonic = { version = "0.12.3", features = ["tls", "channel", "prost"] } +tonic-build = "0.12.3" +prost = "0.13.4" # async / threads tokio = { version = "1.37.0", features = ["full"] } @@ -71,6 +74,7 @@ prometheus = "0.13.4" # crypto blst = "0.3.11" +blsful = "2.5" tree_hash = "0.9" tree_hash_derive = "0.9" eth2_keystore = { git = "https://github.com/sigp/lighthouse", rev = "9e12c21f268c80a3f002ae0ca27477f9f512eb6f" } diff --git a/config.example.toml b/config.example.toml index 4d754b96..301a6724 100644 --- a/config.example.toml +++ b/config.example.toml @@ -136,20 +136,52 @@ id = "mux-relay-1" url = "http://0xa119589bb33ef52acbb8116832bec2b58fca590fe5c85eac5d3230b44d5bc09fe73ccd21f88eab31d6de16194d17782e@def.xyz" # Configuration for the Signer Module, only required if any `commit` module is present, or if `pbs.with_signer = true` -# Currently two types of Signer modules are supported (only one can be used at a time): +# Currently three types of Signer modules are supported (only one can be used at a time): # - Remote: a remote Web3Signer instance +# - Dirk: a remote Dirk instance # - Local: a local Signer module -# More details on the docs (https://commit-boost.github.io/commit-boost-client/get_started/configuration/#local-signer) -# OPTIONAL -# Remote: +# More details on the docs (https://commit-boost.github.io/commit-boost-client/get_started/configuration/#signer-module) +# Docker image to use for the Signer module. +# OPTIONAL, DEFAULT: ghcr.io/commit-boost/signer:latest +# [signer] +# docker_image = "ghcr.io/commit-boost/signer:latest" +# For Remote signer: # [signer.remote] # URL of the Web3Signer instance # url = "https://remote.signer.url" -# Local: -[signer.local] -# Docker image to use for the Signer module. -# OPTIONAL, DEFAULT: ghcr.io/commit-boost/signer:latest -docker_image = "ghcr.io/commit-boost/signer:latest" +# For Dirk signer: +# [signer.dirk] +# Path to the client certificate to authenticate with Dirk +# cert_path = "/path/to/client.crt" +# Path to the client key +# key_path = "/path/to/client.key" +# Path to the secrets directory where the accounts passwords are stored +# secrets_path = "/path/to/secrets" +# Path to the CA certificate that signed the Dirk server certificate +# OPTIONAL +# ca_cert_path = "/path/to/ca.crt" + +# Add one entry like this for each Dirk host +# [[signer.dirk.hosts]] +# Domain name of the server to use in TLS verification, if different from the URL +# OPTIONAL +# server_name = "localhost-1" +# Complete URL of a Dirk gateway +# url = "https://localhost:8881" +# Accounts to use as consensus keys +# accounts = ["Wallet1/Account1", "DistributedWallet/Account1"] + +# [[signer.dirk.hosts]] +# server_name = "localhost-2" +# url = "https://localhost:8882" +# accounts = ["Wallet2/Account2", "DistributedWallet/Account1"] + +# Configuration for how the Signer module should store proxy delegations. +# OPTIONAL +# [signer.dirk.store] +# proxy_dir = "/path/to/proxies" + +# For Local signer: # Configuration for how the Signer module should load validator keys. Currently two types of loaders are supported: # - File: load keys from a plain text file (unsafe, use only for testing purposes) # - ValidatorsDir: load keys from a `keys` and `secrets` file/folder (ERC-2335 style keystores). More details can be found in the docs (https://commit-boost.github.io/commit-boost-client/get_started/configuration/) diff --git a/crates/cli/src/docker_init.rs b/crates/cli/src/docker_init.rs index 5d257365..538e05e9 100644 --- a/crates/cli/src/docker_init.rs +++ b/crates/cli/src/docker_init.rs @@ -6,8 +6,10 @@ use std::{ use cb_common::{ config::{ - CommitBoostConfig, LogsSettings, ModuleKind, SignerConfig, BUILDER_PORT_ENV, - BUILDER_URLS_ENV, CHAIN_SPEC_ENV, CONFIG_DEFAULT, CONFIG_ENV, JWTS_ENV, LOGS_DIR_DEFAULT, + CommitBoostConfig, LogsSettings, ModuleKind, SignerConfig, SignerType, BUILDER_PORT_ENV, + BUILDER_URLS_ENV, CHAIN_SPEC_ENV, CONFIG_DEFAULT, CONFIG_ENV, DIRK_CA_CERT_DEFAULT, + DIRK_CA_CERT_ENV, DIRK_CERT_DEFAULT, DIRK_CERT_ENV, DIRK_DIR_SECRETS_DEFAULT, + DIRK_DIR_SECRETS_ENV, DIRK_KEY_DEFAULT, DIRK_KEY_ENV, JWTS_ENV, LOGS_DIR_DEFAULT, LOGS_DIR_ENV, METRICS_PORT_ENV, MODULE_ID_ENV, MODULE_JWT_ENV, PBS_ENDPOINT_ENV, PBS_MODULE_NAME, PROXY_DIR_DEFAULT, PROXY_DIR_ENV, PROXY_DIR_KEYS_DEFAULT, PROXY_DIR_KEYS_ENV, PROXY_DIR_SECRETS_DEFAULT, PROXY_DIR_SECRETS_ENV, SIGNER_DEFAULT, @@ -77,11 +79,12 @@ pub async fn handle_docker_init(config_path: String, output_dir: String) -> Resu // address for signer API communication let signer_port = 20000; - let signer_server = if let Some(SignerConfig::Remote { url }) = &cb_config.signer { - url.to_string() - } else { - format!("http://cb_signer:{signer_port}") - }; + let signer_server = + if let Some(SignerConfig { inner: SignerType::Remote { url }, .. }) = &cb_config.signer { + url.to_string() + } else { + format!("http://cb_signer:{signer_port}") + }; let builder_events_port = 30000; let mut builder_events_modules = Vec::new(); @@ -166,7 +169,11 @@ pub async fn handle_docker_init(config_path: String, output_dir: String) -> Resu networks: Networks::Simple(module_networks), volumes: module_volumes, environment: Environment::KvPair(module_envs), - depends_on: if let Some(SignerConfig::Remote { .. }) = &cb_config.signer { + depends_on: if let Some(SignerConfig { + inner: SignerType::Remote { .. }, + .. + }) = &cb_config.signer + { DependsOnOptions::Simple(vec![]) } else { DependsOnOptions::Conditional(module_dependencies) @@ -312,131 +319,239 @@ pub async fn handle_docker_init(config_path: String, output_dir: String) -> Resu services.insert("cb_pbs".to_owned(), Some(pbs_service)); // setup signer service - if let Some(SignerConfig::Local { docker_image, loader, store }) = cb_config.signer { - if needs_signer_module { - if metrics_enabled { - targets.push(PrometheusTargetConfig { - targets: vec![format!("cb_signer:{metrics_port}")], - labels: PrometheusLabelsConfig { job: "signer".into() }, - }); - } - - let mut signer_envs = IndexMap::from([ - get_env_val(CONFIG_ENV, CONFIG_DEFAULT), - get_env_same(JWTS_ENV), - get_env_uval(SIGNER_PORT_ENV, signer_port as u64), - ]); - - if let Some((key, val)) = chain_spec_env.clone() { - signer_envs.insert(key, val); - } - if metrics_enabled { - let (key, val) = get_env_uval(METRICS_PORT_ENV, metrics_port as u64); - signer_envs.insert(key, val); - } - if log_to_file { - let (key, val) = get_env_val(LOGS_DIR_ENV, LOGS_DIR_DEFAULT); - signer_envs.insert(key, val); - } + if needs_signer_module { + let Some(signer_config) = cb_config.signer else { + panic!("Signer module required but no signer config provided"); + }; - // write jwts to env - envs.insert(JWTS_ENV.into(), format_comma_separated(&jwts)); + match signer_config.inner { + SignerType::Local { loader, store } => { + if metrics_enabled { + targets.push(PrometheusTargetConfig { + targets: vec![format!("cb_signer:{metrics_port}")], + labels: PrometheusLabelsConfig { job: "signer".into() }, + }); + } - // volumes - let mut volumes = vec![config_volume.clone()]; - volumes.extend(chain_spec_volume.clone()); + let mut signer_envs = IndexMap::from([ + get_env_val(CONFIG_ENV, CONFIG_DEFAULT), + get_env_same(JWTS_ENV), + get_env_uval(SIGNER_PORT_ENV, signer_port as u64), + ]); - match loader { - SignerLoader::File { key_path } => { - volumes.push(Volumes::Simple(format!( - "{}:{}:ro", - key_path.display(), - SIGNER_DEFAULT - ))); - let (k, v) = get_env_val(SIGNER_KEYS_ENV, SIGNER_DEFAULT); - signer_envs.insert(k, v); + if let Some((key, val)) = chain_spec_env.clone() { + signer_envs.insert(key, val); } - SignerLoader::ValidatorsDir { keys_path, secrets_path, format: _ } => { - volumes.push(Volumes::Simple(format!( - "{}:{}:ro", - keys_path.display(), - SIGNER_DIR_KEYS_DEFAULT - ))); - let (k, v) = get_env_val(SIGNER_DIR_KEYS_ENV, SIGNER_DIR_KEYS_DEFAULT); - signer_envs.insert(k, v); - - volumes.push(Volumes::Simple(format!( - "{}:{}:ro", - secrets_path.display(), - SIGNER_DIR_SECRETS_DEFAULT - ))); - let (k, v) = get_env_val(SIGNER_DIR_SECRETS_ENV, SIGNER_DIR_SECRETS_DEFAULT); - signer_envs.insert(k, v); + if metrics_enabled { + let (key, val) = get_env_uval(METRICS_PORT_ENV, metrics_port as u64); + signer_envs.insert(key, val); + } + if log_to_file { + let (key, val) = get_env_val(LOGS_DIR_ENV, LOGS_DIR_DEFAULT); + signer_envs.insert(key, val); } - }; - if let Some(store) = store { - match store { - ProxyStore::File { proxy_dir } => { + // write jwts to env + envs.insert(JWTS_ENV.into(), format_comma_separated(&jwts)); + + // volumes + let mut volumes = vec![config_volume.clone()]; + volumes.extend(chain_spec_volume.clone()); + + match loader { + SignerLoader::File { key_path } => { volumes.push(Volumes::Simple(format!( - "{}:{}:rw", - proxy_dir.display(), - PROXY_DIR_DEFAULT + "{}:{}:ro", + key_path.display(), + SIGNER_DEFAULT ))); - let (k, v) = get_env_val(PROXY_DIR_ENV, PROXY_DIR_DEFAULT); + let (k, v) = get_env_val(SIGNER_KEYS_ENV, SIGNER_DEFAULT); signer_envs.insert(k, v); } - ProxyStore::ERC2335 { keys_path, secrets_path } => { + SignerLoader::ValidatorsDir { keys_path, secrets_path, format: _ } => { volumes.push(Volumes::Simple(format!( - "{}:{}:rw", + "{}:{}:ro", keys_path.display(), - PROXY_DIR_KEYS_DEFAULT + SIGNER_DIR_KEYS_DEFAULT ))); - let (k, v) = get_env_val(PROXY_DIR_KEYS_ENV, PROXY_DIR_KEYS_DEFAULT); + let (k, v) = get_env_val(SIGNER_DIR_KEYS_ENV, SIGNER_DIR_KEYS_DEFAULT); signer_envs.insert(k, v); volumes.push(Volumes::Simple(format!( - "{}:{}:rw", + "{}:{}:ro", secrets_path.display(), - PROXY_DIR_SECRETS_DEFAULT + SIGNER_DIR_SECRETS_DEFAULT ))); - let (k, v) = get_env_val(PROXY_DIR_SECRETS_ENV, PROXY_DIR_SECRETS_DEFAULT); + let (k, v) = + get_env_val(SIGNER_DIR_SECRETS_ENV, SIGNER_DIR_SECRETS_DEFAULT); signer_envs.insert(k, v); } + }; + + if let Some(store) = store { + match store { + ProxyStore::File { proxy_dir } => { + volumes.push(Volumes::Simple(format!( + "{}:{}:rw", + proxy_dir.display(), + PROXY_DIR_DEFAULT + ))); + let (k, v) = get_env_val(PROXY_DIR_ENV, PROXY_DIR_DEFAULT); + signer_envs.insert(k, v); + } + ProxyStore::ERC2335 { keys_path, secrets_path } => { + volumes.push(Volumes::Simple(format!( + "{}:{}:rw", + keys_path.display(), + PROXY_DIR_KEYS_DEFAULT + ))); + let (k, v) = get_env_val(PROXY_DIR_KEYS_ENV, PROXY_DIR_KEYS_DEFAULT); + signer_envs.insert(k, v); + + volumes.push(Volumes::Simple(format!( + "{}:{}:rw", + secrets_path.display(), + PROXY_DIR_SECRETS_DEFAULT + ))); + let (k, v) = + get_env_val(PROXY_DIR_SECRETS_ENV, PROXY_DIR_SECRETS_DEFAULT); + signer_envs.insert(k, v); + } + } } - } - volumes.extend(get_log_volume(&cb_config.logs, SIGNER_MODULE_NAME)); + volumes.extend(get_log_volume(&cb_config.logs, SIGNER_MODULE_NAME)); - // networks - let mut signer_networks = vec![SIGNER_NETWORK.to_owned()]; - if metrics_enabled { - signer_networks.push(METRICS_NETWORK.to_owned()); + // networks + let mut signer_networks = vec![SIGNER_NETWORK.to_owned()]; + if metrics_enabled { + signer_networks.push(METRICS_NETWORK.to_owned()); + } + + let signer_service = Service { + container_name: Some("cb_signer".to_owned()), + image: Some(signer_config.docker_image), + networks: Networks::Simple(signer_networks), + volumes, + environment: Environment::KvPair(signer_envs), + healthcheck: Some(Healthcheck { + test: Some(HealthcheckTest::Single(format!( + "curl -f http://localhost:{signer_port}/status" + ))), + interval: Some("30s".into()), + timeout: Some("5s".into()), + retries: 3, + start_period: Some("5s".into()), + disable: false, + }), + ..Service::default() + }; + + services.insert("cb_signer".to_owned(), Some(signer_service)); } + SignerType::Dirk { cert_path, key_path, secrets_path, ca_cert_path, store, .. } => { + if metrics_enabled { + targets.push(PrometheusTargetConfig { + targets: vec![format!("cb_signer:{metrics_port}")], + labels: PrometheusLabelsConfig { job: "signer".into() }, + }); + } - let signer_service = Service { - container_name: Some("cb_signer".to_owned()), - image: Some(docker_image), - networks: Networks::Simple(signer_networks), - volumes, - environment: Environment::KvPair(signer_envs), - healthcheck: Some(Healthcheck { - test: Some(HealthcheckTest::Single(format!( - "curl -f http://localhost:{signer_port}/status" - ))), - interval: Some("30s".into()), - timeout: Some("5s".into()), - retries: 3, - start_period: Some("5s".into()), - disable: false, - }), - ..Service::default() - }; + let mut signer_envs = IndexMap::from([ + get_env_val(CONFIG_ENV, CONFIG_DEFAULT), + get_env_same(JWTS_ENV), + get_env_uval(SIGNER_PORT_ENV, signer_port as u64), + get_env_val(DIRK_CERT_ENV, DIRK_CERT_DEFAULT), + get_env_val(DIRK_KEY_ENV, DIRK_KEY_DEFAULT), + get_env_val(DIRK_DIR_SECRETS_ENV, DIRK_DIR_SECRETS_DEFAULT), + ]); + + if let Some((key, val)) = chain_spec_env.clone() { + signer_envs.insert(key, val); + } + if metrics_enabled { + let (key, val) = get_env_uval(METRICS_PORT_ENV, metrics_port as u64); + signer_envs.insert(key, val); + } + if log_to_file { + let (key, val) = get_env_val(LOGS_DIR_ENV, LOGS_DIR_DEFAULT); + signer_envs.insert(key, val); + } + + // write jwts to env + envs.insert(JWTS_ENV.into(), format_comma_separated(&jwts)); + + // volumes + let mut volumes = vec![ + config_volume.clone(), + Volumes::Simple(format!("{}:{}:ro", cert_path.display(), DIRK_CERT_DEFAULT)), + Volumes::Simple(format!("{}:{}:ro", key_path.display(), DIRK_KEY_DEFAULT)), + Volumes::Simple(format!( + "{}:{}", + secrets_path.display(), + DIRK_DIR_SECRETS_DEFAULT + )), + ]; + volumes.extend(chain_spec_volume.clone()); + volumes.extend(get_log_volume(&cb_config.logs, SIGNER_MODULE_NAME)); + + if let Some(ca_cert_path) = ca_cert_path { + volumes.push(Volumes::Simple(format!( + "{}:{}:ro", + ca_cert_path.display(), + DIRK_CA_CERT_DEFAULT + ))); + let (key, val) = get_env_val(DIRK_CA_CERT_ENV, DIRK_CA_CERT_DEFAULT); + signer_envs.insert(key, val); + } - services.insert("cb_signer".to_owned(), Some(signer_service)); + match store { + Some(ProxyStore::File { proxy_dir }) => { + volumes.push(Volumes::Simple(format!( + "{}:{}", + proxy_dir.display(), + PROXY_DIR_DEFAULT + ))); + let (key, val) = get_env_val(PROXY_DIR_ENV, PROXY_DIR_DEFAULT); + signer_envs.insert(key, val); + } + Some(ProxyStore::ERC2335 { .. }) => { + panic!("ERC2335 store not supported with Dirk signer"); + } + None => {} + } + + // networks + let mut signer_networks = vec![SIGNER_NETWORK.to_owned()]; + if metrics_enabled { + signer_networks.push(METRICS_NETWORK.to_owned()); + } + + let signer_service = Service { + container_name: Some("cb_signer".to_owned()), + image: Some(signer_config.docker_image), + networks: Networks::Simple(signer_networks), + volumes, + environment: Environment::KvPair(signer_envs), + healthcheck: Some(Healthcheck { + test: Some(HealthcheckTest::Single(format!( + "curl -f http://localhost:{signer_port}/status" + ))), + interval: Some("30s".into()), + timeout: Some("5s".into()), + retries: 3, + start_period: Some("5s".into()), + disable: false, + }), + ..Service::default() + }; + + services.insert("cb_signer".to_owned(), Some(signer_service)); + } + SignerType::Remote { .. } => { + panic!("Signer module required but remote config provided"); + } } - } else if cb_config.signer.is_none() && needs_signer_module { - panic!("Signer module required but no signer config provided"); } // setup metrics services diff --git a/crates/common/Cargo.toml b/crates/common/Cargo.toml index 2c037c47..cd21eba7 100644 --- a/crates/common/Cargo.toml +++ b/crates/common/Cargo.toml @@ -14,6 +14,7 @@ ethereum_serde_utils.workspace = true # networking axum.workspace = true reqwest.workspace = true +tonic.workspace = true # async / threads tokio.workspace = true diff --git a/crates/common/src/commit/request.rs b/crates/common/src/commit/request.rs index b45861f0..36b57cd7 100644 --- a/crates/common/src/commit/request.rs +++ b/crates/common/src/commit/request.rs @@ -3,7 +3,7 @@ use std::{ str::FromStr, }; -use alloy::rpc::types::beacon::BlsSignature; +use alloy::{hex, rpc::types::beacon::BlsSignature}; use derive_more::derive::From; use serde::{Deserialize, Serialize}; use tree_hash::TreeHash; @@ -78,6 +78,31 @@ pub enum SignRequest { ProxyEcdsa(SignProxyRequest), } +impl Display for SignRequest { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + SignRequest::Consensus(req) => write!( + f, + "Consensus(pubkey: {}, object_root: {})", + req.pubkey, + hex::encode_prefixed(req.object_root) + ), + SignRequest::ProxyBls(req) => write!( + f, + "BLS(pubkey: {}, object_root: {})", + req.pubkey, + hex::encode_prefixed(req.object_root) + ), + SignRequest::ProxyEcdsa(req) => write!( + f, + "ECDSA(pubkey: {}, object_root: {})", + req.pubkey, + hex::encode_prefixed(req.object_root) + ), + } + } +} + #[derive(Debug, Clone, Serialize, Deserialize)] pub struct SignConsensusRequest { pub pubkey: BlsPublicKey, diff --git a/crates/common/src/config/constants.rs b/crates/common/src/config/constants.rs index 03d990e8..31580cd8 100644 --- a/crates/common/src/config/constants.rs +++ b/crates/common/src/config/constants.rs @@ -47,6 +47,16 @@ pub const SIGNER_DIR_KEYS_DEFAULT: &str = "/keys"; /// Path to `secrets` folder pub const SIGNER_DIR_SECRETS_ENV: &str = "CB_SIGNER_LOADER_SECRETS_DIR"; pub const SIGNER_DIR_SECRETS_DEFAULT: &str = "/secrets"; +/// Path to Dirk certificate +pub const DIRK_CERT_ENV: &str = "CB_SIGNER_DIRK_CERT_FILE"; +pub const DIRK_CERT_DEFAULT: &str = "/certificates/dirk.crt"; +pub const DIRK_KEY_ENV: &str = "CB_SIGNER_DIRK_KEY_FILE"; +pub const DIRK_KEY_DEFAULT: &str = "/certificates/dirk.key"; +pub const DIRK_CA_CERT_ENV: &str = "CB_SIGNER_DIRK_CA_CERT_FILE"; +pub const DIRK_CA_CERT_DEFAULT: &str = "/certificates/ca.crt"; +/// Path to Dirk `secrets` folder +pub const DIRK_DIR_SECRETS_ENV: &str = "CB_SIGNER_DIRK_SECRETS_DIR"; +pub const DIRK_DIR_SECRETS_DEFAULT: &str = "/dirk_secrets"; /// Path to store proxies with plaintext keys (testing only) pub const PROXY_DIR_ENV: &str = "CB_PROXY_STORE_DIR"; pub const PROXY_DIR_DEFAULT: &str = "/proxies"; diff --git a/crates/common/src/config/signer.rs b/crates/common/src/config/signer.rs index 6f38a800..3d1dccc9 100644 --- a/crates/common/src/config/signer.rs +++ b/crates/common/src/config/signer.rs @@ -1,6 +1,9 @@ +use std::path::PathBuf; + use bimap::BiHashMap; -use eyre::{bail, Result}; +use eyre::{bail, OptionExt, Result}; use serde::{Deserialize, Serialize}; +use tonic::transport::{Certificate, Identity}; use url::Url; use super::{ @@ -9,41 +12,86 @@ use super::{ CommitBoostConfig, SIGNER_PORT_ENV, }; use crate::{ + config::{DIRK_CA_CERT_ENV, DIRK_CERT_ENV, DIRK_DIR_SECRETS_ENV, DIRK_KEY_ENV}, signer::{ProxyStore, SignerLoader}, types::{Chain, Jwt, ModuleId}, }; #[derive(Debug, Serialize, Deserialize, Clone)] #[serde(rename_all = "snake_case")] -pub enum SignerConfig { +pub struct SignerConfig { + /// Docker image of the module + #[serde(default = "default_signer")] + pub docker_image: String, + /// Inner type-specific configuration + #[serde(flatten)] + pub inner: SignerType, +} + +fn default_signer() -> String { + SIGNER_IMAGE_DEFAULT.to_string() +} + +#[derive(Debug, Serialize, Deserialize, Clone)] +#[serde(rename_all = "snake_case")] +pub struct DirkHostConfig { + /// Domain name of the server to use in TLS verification + pub server_name: Option, + /// Complete URL of the Dirk server + pub url: Url, + /// Accounts used as consensus keys + pub accounts: Vec, +} + +#[derive(Debug, Serialize, Deserialize, Clone)] +#[serde(rename_all = "snake_case")] +pub enum SignerType { /// Local signer module Local { - /// Docker image of the module - #[serde(default = "default_signer")] - docker_image: String, /// Which keys to load loader: SignerLoader, /// How to store keys store: Option, }, - /// Remote signer module with compatible API + /// Remote signer module with compatible API like Web3Signer Remote { - /// Complete url of the base API endpoint + /// Complete URL of the base API endpoint url: Url, }, + /// Dirk remote signer module + Dirk { + /// List of Dirk hosts with their accounts + hosts: Vec, + /// Path to the client certificate + cert_path: PathBuf, + /// Path to the client key + key_path: PathBuf, + /// Path to where the account passwords are stored + secrets_path: PathBuf, + /// Path to the CA certificate + ca_cert_path: Option, + /// How to store proxy key delegations + /// ERC2335 is not supported with Dirk signer + store: Option, + }, } -fn default_signer() -> String { - SIGNER_IMAGE_DEFAULT.to_string() +#[derive(Clone, Debug)] +pub struct DirkConfig { + pub hosts: Vec, + pub client_cert: Identity, + pub secrets_path: PathBuf, + pub cert_auth: Option, } -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct StartSignerConfig { pub chain: Chain, - pub loader: SignerLoader, + pub loader: Option, pub store: Option, pub server_port: u16, pub jwts: BiHashMap, + pub dirk: Option, } impl StartSignerConfig { @@ -53,12 +101,64 @@ impl StartSignerConfig { let jwts = load_jwts()?; let server_port = load_env_var(SIGNER_PORT_ENV)?.parse()?; - match config.signer { - Some(SignerConfig::Local { loader, store, .. }) => { - Ok(StartSignerConfig { chain: config.chain, loader, server_port, jwts, store }) + let signer = config.signer.ok_or_eyre("Signer config is missing")?.inner; + + match signer { + SignerType::Local { loader, store, .. } => Ok(StartSignerConfig { + chain: config.chain, + loader: Some(loader), + server_port, + jwts, + store, + dirk: None, + }), + + SignerType::Dirk { + hosts, + cert_path, + key_path, + secrets_path, + ca_cert_path, + store, + .. + } => { + let cert_path = load_env_var(DIRK_CERT_ENV).map(PathBuf::from).unwrap_or(cert_path); + let key_path = load_env_var(DIRK_KEY_ENV).map(PathBuf::from).unwrap_or(key_path); + let secrets_path = + load_env_var(DIRK_DIR_SECRETS_ENV).map(PathBuf::from).unwrap_or(secrets_path); + let ca_cert_path = + load_env_var(DIRK_CA_CERT_ENV).map(PathBuf::from).ok().or(ca_cert_path); + + if let Some(ProxyStore::ERC2335 { .. }) = store { + bail!("ERC2335 store is not supported with Dirk signer") + } + + Ok(StartSignerConfig { + chain: config.chain, + server_port, + jwts, + loader: None, + store, + dirk: Some(DirkConfig { + hosts, + client_cert: Identity::from_pem( + std::fs::read_to_string(cert_path)?, + std::fs::read_to_string(key_path)?, + ), + secrets_path, + cert_auth: match ca_cert_path { + Some(path) => { + Some(Certificate::from_pem(std::fs::read_to_string(path)?)) + } + None => None, + }, + }), + }) + } + + SignerType::Remote { .. } => { + bail!("Remote signer configured") } - Some(SignerConfig::Remote { .. }) => bail!("Remote signer configured"), - None => bail!("Signer config is missing"), } } } diff --git a/crates/common/src/signer/schemes/bls.rs b/crates/common/src/signer/schemes/bls.rs index 82d0c01a..5e9afade 100644 --- a/crates/common/src/signer/schemes/bls.rs +++ b/crates/common/src/signer/schemes/bls.rs @@ -36,6 +36,14 @@ impl AsRef<[u8]> for BlsPublicKey { } } +impl TryFrom<&[u8]> for BlsPublicKey { + type Error = core::array::TryFromSliceError; + + fn try_from(value: &[u8]) -> Result { + Ok(Self { inner: value.try_into()? }) + } +} + #[derive(Clone)] pub enum BlsSigner { Local(BlsSecretKey), diff --git a/crates/common/src/signer/store.rs b/crates/common/src/signer/store.rs index 3127d254..ba98fba8 100644 --- a/crates/common/src/signer/store.rs +++ b/crates/common/src/signer/store.rs @@ -22,7 +22,7 @@ use eth2_keystore::{ use eyre::OptionExt; use rand::Rng; use serde::{Deserialize, Serialize}; -use tracing::warn; +use tracing::{trace, warn}; use super::{load_bls_signer, load_ecdsa_signer}; use crate::{ @@ -153,6 +153,33 @@ impl ProxyStore { Ok(()) } + pub fn store_proxy_bls_delegation( + &self, + module_id: &ModuleId, + delegation: &SignedProxyDelegation, + ) -> eyre::Result<()> { + let base_path = match self { + ProxyStore::File { proxy_dir } => proxy_dir, + ProxyStore::ERC2335 { keys_path, .. } => keys_path, + }; + let file_path = base_path + .join("delegations") + .join(module_id.to_string()) + .join("bls") + .join(format!("{}.sig", delegation.message.proxy)); + let content = serde_json::to_vec(&delegation)?; + trace!(?content, "Writing BLS delegation to {file_path:?}"); + + if let Some(parent) = file_path.parent() { + create_dir_all(parent)?; + } + + let mut file = std::fs::File::create(file_path)?; + file.write_all(content.as_ref())?; + + Ok(()) + } + #[allow(clippy::type_complexity)] pub fn load_proxies( &self, diff --git a/crates/common/src/signer/types.rs b/crates/common/src/signer/types.rs index 4071f858..a5888fdb 100644 --- a/crates/common/src/signer/types.rs +++ b/crates/common/src/signer/types.rs @@ -34,7 +34,7 @@ pub struct EcdsaProxySigner { pub delegation: SignedProxyDelegationEcdsa, } -#[derive(Default)] +#[derive(Default, Clone)] pub struct ProxySigners { pub bls_signers: HashMap, pub ecdsa_signers: HashMap, diff --git a/crates/signer/Cargo.toml b/crates/signer/Cargo.toml index 9eba3fd7..19f4add1 100644 --- a/crates/signer/Cargo.toml +++ b/crates/signer/Cargo.toml @@ -16,19 +16,20 @@ alloy.workspace = true axum.workspace = true axum-extra.workspace = true headers.workspace = true +tonic.workspace = true +prost.workspace = true # async / threads tokio.workspace = true +futures.workspace = true # telemetry tracing.workspace = true prometheus.workspace = true # crypto -blst.workspace = true +blsful.workspace = true tree_hash.workspace = true -tree_hash_derive.workspace = true -k256.workspace = true # misc thiserror.workspace = true @@ -36,4 +37,7 @@ eyre.workspace = true uuid.workspace = true bimap.workspace = true lazy_static.workspace = true -derive_more.workspace = true +rand.workspace = true + +[build-dependencies] +tonic-build.workspace = true diff --git a/crates/signer/README.md b/crates/signer/README.md new file mode 100644 index 00000000..f173f0cd --- /dev/null +++ b/crates/signer/README.md @@ -0,0 +1,12 @@ +# Signer Module + +## Compile proto files + +### Requirements + +- `protoc` compiler +- Submodules initialized: `git submodule update --init` + +To compile the `.proto` files and generate the Rust bindings, simply run `cargo build`. This will only run if there are changes to the `.proto` files. If you want to force a rebuild, run `cargo clean` first. + +Note that this process is not required to run Commit-Boost as the generated files are already included in the repository. diff --git a/crates/signer/build.rs b/crates/signer/build.rs new file mode 100644 index 00000000..596353ea --- /dev/null +++ b/crates/signer/build.rs @@ -0,0 +1,12 @@ +fn main() -> Result<(), Box> { + std::env::set_var("OUT_DIR", "src/proto"); + tonic_build::configure().build_server(false).compile_protos( + &[ + "proto/pb/v1/lister.proto", + "proto/pb/v1/accountmanager.proto", + "proto/pb/v1/signer.proto", + ], + &["proto/pb/v1", "proto/third-party"], + )?; + Ok(()) +} diff --git a/crates/signer/proto b/crates/signer/proto new file mode 160000 index 00000000..4aaf36e5 --- /dev/null +++ b/crates/signer/proto @@ -0,0 +1 @@ +Subproject commit 4aaf36e54f4e62d0cf4edc1b794e9a6354cf4f95 diff --git a/crates/signer/src/error.rs b/crates/signer/src/error.rs index 820bdeed..a60dd9fa 100644 --- a/crates/signer/src/error.rs +++ b/crates/signer/src/error.rs @@ -16,19 +16,32 @@ pub enum SignerModuleError { #[error("unknown proxy signer: 0x{}", hex::encode(.0))] UnknownProxySigner(Vec), - #[error("internal error {0}")] + #[error("Dirk communication error: {0}")] + DirkCommunicationError(String), + + #[error("Dirk signer does not support this operation")] + DirkNotSupported, + + #[error("internal error: {0}")] Internal(String), } impl IntoResponse for SignerModuleError { fn into_response(self) -> Response { - let status = match self { - SignerModuleError::Unauthorized => StatusCode::UNAUTHORIZED, - SignerModuleError::UnknownConsensusSigner(_) => StatusCode::NOT_FOUND, - SignerModuleError::UnknownProxySigner(_) => StatusCode::NOT_FOUND, - SignerModuleError::Internal(_) => StatusCode::INTERNAL_SERVER_ERROR, - }; - - (status, self.to_string()).into_response() + match self { + SignerModuleError::Unauthorized => (StatusCode::UNAUTHORIZED, self.to_string()), + SignerModuleError::UnknownConsensusSigner(_) => { + (StatusCode::NOT_FOUND, self.to_string()) + } + SignerModuleError::UnknownProxySigner(_) => (StatusCode::NOT_FOUND, self.to_string()), + SignerModuleError::DirkCommunicationError(_) => { + (StatusCode::BAD_GATEWAY, "Dirk communication error".to_string()) + } + SignerModuleError::DirkNotSupported => (StatusCode::BAD_REQUEST, self.to_string()), + SignerModuleError::Internal(_) => { + (StatusCode::INTERNAL_SERVER_ERROR, "internal error".to_string()) + } + } + .into_response() } } diff --git a/crates/signer/src/lib.rs b/crates/signer/src/lib.rs index 84bd08d9..4b5e1451 100644 --- a/crates/signer/src/lib.rs +++ b/crates/signer/src/lib.rs @@ -2,4 +2,5 @@ mod constants; pub mod error; pub mod manager; mod metrics; +mod proto; pub mod service; diff --git a/crates/signer/src/manager/dirk.rs b/crates/signer/src/manager/dirk.rs new file mode 100644 index 00000000..ca39df0d --- /dev/null +++ b/crates/signer/src/manager/dirk.rs @@ -0,0 +1,774 @@ +use std::{ + collections::{HashMap, HashSet}, + io::Write, + path::PathBuf, +}; + +use alloy::{hex, rpc::types::beacon::constants::BLS_SIGNATURE_BYTES_LEN}; +use blsful::inner_types::{Field, G2Affine, G2Projective, Group, Scalar}; +use cb_common::{ + commit::request::{ConsensusProxyMap, ProxyDelegation, SignedProxyDelegation}, + config::{DirkConfig, DirkHostConfig}, + constants::COMMIT_BOOST_DOMAIN, + signature::compute_domain, + signer::{BlsPublicKey, BlsSignature, ProxyStore}, + types::{Chain, ModuleId}, +}; +use eyre::{bail, OptionExt}; +use futures::{future::join_all, stream::FuturesUnordered, FutureExt, StreamExt}; +use rand::Rng; +use tonic::transport::{Certificate, Channel, ClientTlsConfig, Identity}; +use tracing::{debug, error, warn}; +use tree_hash::TreeHash; + +use crate::{ + error::SignerModuleError, + proto::v1::{ + account_manager_client::AccountManagerClient, lister_client::ListerClient, sign_request, + signer_client::SignerClient, Endpoint, GenerateRequest, ListAccountsRequest, ResponseState, + SignRequest, UnlockAccountRequest, + }, +}; + +#[derive(Clone, Debug)] +enum Account { + Simple(SimpleAccount), + Distributed(DistributedAccount), +} + +impl Account { + pub fn full_name(&self) -> String { + match self { + Account::Simple(account) => format!("{}/{}", account.wallet, account.name), + Account::Distributed(account) => format!("{}/{}", account.wallet, account.name), + } + } +} + +#[derive(Clone, Debug)] +struct SimpleAccount { + public_key: BlsPublicKey, + connection: Channel, + wallet: String, + name: String, +} + +#[derive(Clone, Debug)] +struct DistributedAccount { + composite_public_key: BlsPublicKey, + participants: HashMap, + threshold: u32, + wallet: String, + name: String, +} + +impl Account { + pub fn public_key(&self) -> BlsPublicKey { + match self { + Account::Simple(account) => account.public_key, + Account::Distributed(account) => account.composite_public_key, + } + } +} + +#[derive(Clone, Debug)] +struct ProxyAccount { + consensus: Account, + module: ModuleId, + inner: Account, +} + +#[derive(Clone, Debug)] +pub struct DirkManager { + /// Chain config for the manager + chain: Chain, + /// Consensus accounts available for signing. The key is the public key of + /// the account. + consensus_accounts: HashMap, + /// Proxy accounts available for signing. The key is the public key of the + /// account. + proxy_accounts: HashMap, + /// Path to store the passwords of the proxy accounts + secrets_path: PathBuf, + /// Store to save proxy delegations + delegations_store: Option, +} + +impl DirkManager { + pub async fn new(chain: Chain, config: DirkConfig) -> eyre::Result { + let mut consensus_accounts = HashMap::new(); + + for host in config.hosts { + let channel = match connect(&host, &config.client_cert, &config.cert_auth).await { + Ok(channel) => channel, + Err(e) => { + warn!("Failed to connect to Dirk host {}: {e}", host.url); + continue; + } + }; + + let wallets: HashSet = host + .accounts + .iter() + .map(|account| decompose_name(account).unwrap_or_default().0) + .collect(); + + let accounts_response = match ListerClient::new(channel.clone()) + .list_accounts(ListAccountsRequest { paths: wallets.into_iter().collect() }) + .await + { + Ok(res) => res, + Err(e) => { + warn!("Failed to list accounts in server {}: {e}", host.url); + continue; + } + }; + + if accounts_response.get_ref().state() != ResponseState::Succeeded { + warn!("Failed to list accounts in server {}", host.url); + continue; + } + + let accounts_response = accounts_response.into_inner(); + load_simple_accounts( + accounts_response.accounts, + &host, + &channel, + &mut consensus_accounts, + ); + load_distributed_accounts( + accounts_response.distributed_accounts, + &host, + &channel, + &mut consensus_accounts, + ) + .map_err(|error| warn!("{error}")) + .ok(); + + for account in host.accounts { + if !consensus_accounts + .values() + .any(|account| account.full_name() == account.full_name()) + { + warn!("Account {account} not found in server {}", host.url); + } + } + } + + debug!( + "Loaded {} consensus accounts: {}", + consensus_accounts.len(), + consensus_accounts.keys().map(|k| k.to_string()).collect::>().join(", ") + ); + + Ok(Self { + chain, + consensus_accounts, + proxy_accounts: HashMap::new(), + secrets_path: config.secrets_path, + delegations_store: None, + }) + } + + /// Set the proxy store to use for storing proxy delegations + pub fn with_proxy_store(self, store: ProxyStore) -> eyre::Result { + if let ProxyStore::ERC2335 { .. } = store { + return Err(eyre::eyre!("ERC2335 proxy store not supported")); + } + + Ok(Self { delegations_store: Some(store), ..self }) + } + + /// Get the number of available consensus signers + pub fn available_consensus_signers(&self) -> usize { + self.consensus_accounts.len() + } + + /// Get the number of available proxy signers + pub fn available_proxy_signers(&self) -> usize { + self.proxy_accounts.len() + } + + /// Get the map structure for `get_pubkey` endpoint + pub fn get_consensus_proxy_maps(&self, module: &ModuleId) -> Vec { + self.consensus_accounts + .values() + .map(|account| ConsensusProxyMap { + consensus: account.public_key(), + proxy_bls: self + .proxy_accounts + .values() + .filter_map(|proxy| { + if proxy.module == *module && + proxy.consensus.public_key() == account.public_key() + { + Some(proxy.inner.public_key()) + } else { + None + } + }) + .collect(), + // ECDSA is not supported + proxy_ecdsa: Vec::new(), + }) + .collect() + } + + /// Request a signature from a consensus signer + pub async fn request_consensus_signature( + &self, + pubkey: &BlsPublicKey, + object_root: [u8; 32], + ) -> Result { + match self.consensus_accounts.get(pubkey) { + Some(Account::Simple(account)) => { + self.request_simple_signature(account, object_root).await + } + Some(Account::Distributed(account)) => { + self.request_distributed_signature(account, object_root).await + } + None => Err(SignerModuleError::UnknownConsensusSigner(pubkey.to_vec())), + } + } + + /// Request a signature from a proxy signer + pub async fn request_proxy_signature( + &self, + pubkey: &BlsPublicKey, + object_root: [u8; 32], + ) -> Result { + match self.proxy_accounts.get(pubkey) { + Some(ProxyAccount { inner: Account::Simple(account), .. }) => { + self.request_simple_signature(account, object_root).await + } + Some(ProxyAccount { inner: Account::Distributed(account), .. }) => { + self.request_distributed_signature(account, object_root).await + } + None => Err(SignerModuleError::UnknownProxySigner(pubkey.to_vec())), + } + } + + /// Sign a message with a `SimpleAccount` + async fn request_simple_signature( + &self, + account: &SimpleAccount, + object_root: [u8; 32], + ) -> Result { + let domain = compute_domain(self.chain, COMMIT_BOOST_DOMAIN); + + let response = SignerClient::new(account.connection.clone()) + .sign(SignRequest { + data: object_root.to_vec(), + domain: domain.to_vec(), + id: Some(sign_request::Id::PublicKey(account.public_key.to_vec())), + }) + .await + .map_err(|e| { + SignerModuleError::DirkCommunicationError(format!("Failed to sign object: {e}")) + })?; + + if response.get_ref().state() != ResponseState::Succeeded { + return Err(SignerModuleError::DirkCommunicationError( + "Failed to sign object, server responded error".to_string(), + )); + } + + BlsSignature::try_from(response.into_inner().signature.as_slice()).map_err(|_| { + SignerModuleError::DirkCommunicationError("Failed to parse signature".to_string()) + }) + } + + /// Sign a message with a `DistributedAccount` + async fn request_distributed_signature( + &self, + account: &DistributedAccount, + object_root: [u8; 32], + ) -> Result { + let mut partials = Vec::with_capacity(account.participants.len()); + let mut requests = Vec::with_capacity(account.participants.len()); + + for (id, channel) in account.participants.iter() { + let request = async move { + SignerClient::new(channel.clone()) + .sign(SignRequest { + data: object_root.to_vec(), + domain: compute_domain(self.chain, COMMIT_BOOST_DOMAIN).to_vec(), + id: Some(sign_request::Id::Account(format!( + "{}/{}", + account.wallet, account.name + ))), + }) + .map(|res| (res, *id)) + .await + }; + requests.push(request); + } + + let mut requests = requests.into_iter().collect::>(); + + while let Some((response, participant_id)) = requests.next().await { + let response = match response { + Ok(res) => res, + Err(e) => { + warn!("Failed to sign object with participant {participant_id}: {e}"); + continue; + } + }; + + if response.get_ref().state() != ResponseState::Succeeded { + warn!("Failed to sign object with participant {participant_id}"); + continue; + } + + let signature = match BlsSignature::try_from(response.into_inner().signature.as_slice()) + { + Ok(sig) => sig, + Err(e) => { + warn!("Failed to parse signature from participant {participant_id}: {e}"); + continue; + } + }; + + partials.push((signature, participant_id)); + + if partials.len() >= account.threshold as usize { + break; + } + } + + if partials.len() < account.threshold as usize { + return Err(SignerModuleError::DirkCommunicationError( + "Failed to get enough partial signatures".to_string(), + )); + } + + aggregate_partial_signatures(partials.as_slice()) + .map_err(|e| SignerModuleError::Internal(e.to_string())) + } + + /// Generate a proxy key for a consensus signer + pub async fn generate_proxy_key( + &mut self, + module: &ModuleId, + consensus: BlsPublicKey, + ) -> Result, SignerModuleError> { + let proxy_account = match self.consensus_accounts.get(&consensus) { + Some(Account::Simple(account)) => { + self.generate_simple_proxy_account(account, module).await? + } + Some(Account::Distributed(account)) => { + self.generate_distributed_proxy_key(account, module).await? + } + None => return Err(SignerModuleError::UnknownConsensusSigner(consensus.to_vec())), + }; + + let message = + ProxyDelegation { delegator: consensus, proxy: proxy_account.inner.public_key() }; + let delegation_signature = + self.request_consensus_signature(&consensus, message.tree_hash_root().0).await?; + + let delegation = SignedProxyDelegation { message, signature: delegation_signature }; + + if let Some(store) = &self.delegations_store { + store.store_proxy_bls_delegation(module, &delegation).map_err(|e| { + warn!("Couldn't store delegation signature: {e}"); + SignerModuleError::Internal("Couldn't store delegation signature".to_string()) + })?; + } + + self.proxy_accounts.insert(proxy_account.inner.public_key(), proxy_account.clone()); + + Ok(delegation) + } + + /// Generate a proxy key for a `SimpleAccount` consensus signer + async fn generate_simple_proxy_account( + &self, + consensus: &SimpleAccount, + module: &ModuleId, + ) -> Result { + let uuid = uuid::Uuid::new_v4(); + let password = random_password(); + + let response = AccountManagerClient::new(consensus.connection.clone()) + .generate(GenerateRequest { + account: format!("{}/{}/{module}/{uuid}", consensus.wallet, consensus.name), + passphrase: password.as_bytes().to_vec(), + participants: 1, + signing_threshold: 1, + }) + .await + .map_err(|e| SignerModuleError::DirkCommunicationError(e.to_string()))?; + + if response.get_ref().state() != ResponseState::Succeeded { + return Err(SignerModuleError::DirkCommunicationError(format!( + "Failed to generate proxy key: {}", + response.get_ref().message + ))); + } + + let proxy_key = BlsPublicKey::try_from(response.into_inner().public_key.as_slice()) + .map_err(|_| { + SignerModuleError::DirkCommunicationError("Failed to parse proxy key".to_string()) + })?; + + let proxy_account = ProxyAccount { + consensus: Account::Simple(consensus.clone()), + module: module.clone(), + inner: Account::Simple(SimpleAccount { + public_key: proxy_key, + connection: consensus.connection.clone(), + wallet: consensus.wallet.clone(), + name: format!("{}/{module}/{uuid}", consensus.name), + }), + }; + + self.store_password(&proxy_account, password.clone()).map_err(|e| { + error!("Failed to store password: {e}"); + SignerModuleError::Internal("Failed to store password".to_string()) + })?; + + if let Err(e) = self.unlock_account(&proxy_account.inner, password).await { + error!("{e}"); + return Err(SignerModuleError::DirkCommunicationError( + "Failed to unlock new account".to_string(), + )); + } + + Ok(proxy_account) + } + + /// Generate a proxy key for a `DistributedAccount` consensus signer + async fn generate_distributed_proxy_key( + &self, + consensus: &DistributedAccount, + module: &ModuleId, + ) -> Result { + let uuid = uuid::Uuid::new_v4(); + let password = random_password(); + + for (id, channel) in consensus.participants.iter() { + let Ok(response) = AccountManagerClient::new(channel.clone()) + .generate(GenerateRequest { + account: format!("{}/{}/{module}/{uuid}", consensus.wallet, consensus.name), + passphrase: password.as_bytes().to_vec(), + participants: consensus.participants.len() as u32, + signing_threshold: consensus.threshold, + }) + .await + else { + warn!("Couldn't generate proxy key with participant {id}"); + continue; + }; + + if response.get_ref().state() != ResponseState::Succeeded { + warn!("Couldn't generate proxy key with participant {id}"); + continue; + } + + let Ok(proxy_key) = BlsPublicKey::try_from(response.into_inner().public_key.as_slice()) + else { + warn!("Failed to parse proxy key with participant {id}"); + continue; + }; + + let proxy_account = ProxyAccount { + consensus: Account::Distributed(consensus.clone()), + module: module.clone(), + inner: Account::Distributed(DistributedAccount { + composite_public_key: proxy_key, + participants: consensus.participants.clone(), + threshold: consensus.threshold, + wallet: consensus.wallet.clone(), + name: format!("{}/{module}/{uuid}", consensus.name), + }), + }; + + self.store_password(&proxy_account, password.clone()).map_err(|e| { + error!("Failed to store password: {e}"); + SignerModuleError::Internal("Failed to store password".to_string()) + })?; + + if let Err(e) = self.unlock_account(&proxy_account.inner, password).await { + error!("{e}"); + return Err(SignerModuleError::DirkCommunicationError( + "Failed to unlock new account".to_string(), + )); + } + + return Ok(proxy_account); + } + + Err(SignerModuleError::DirkCommunicationError( + "All participant connections failed".to_string(), + )) + } + + /// Store the password for a proxy account in disk + fn store_password(&self, account: &ProxyAccount, password: String) -> eyre::Result<()> { + let full_name = account.inner.full_name(); + let (parent, name) = full_name.rsplit_once('/').ok_or_eyre("Invalid account name")?; + let parent_path = self.secrets_path.join(parent); + + std::fs::create_dir_all(parent_path.clone())?; + let mut file = std::fs::File::create(parent_path.join(format!("{name}.pass")))?; + file.write_all(password.as_bytes())?; + + Ok(()) + } + + /// Unlock an account in Dirk + async fn unlock_account(&self, account: &Account, password: String) -> eyre::Result<()> { + let participants = match account { + Account::Simple(account) => vec![&account.connection], + Account::Distributed(account) => account.participants.values().collect(), + }; + + let mut requests = Vec::with_capacity(participants.len()); + for channel in participants { + let password = password.clone(); + let request = async move { + let response = AccountManagerClient::new(channel.clone()) + .unlock(UnlockAccountRequest { + account: account.full_name(), + passphrase: password.as_bytes().to_vec(), + }) + .await; + + response.is_ok_and(|res| res.into_inner().state() == ResponseState::Succeeded) + }; + + requests.push(request); + } + + let responses = join_all(requests).await; + match account { + Account::Simple(_) => { + if responses.first().is_some_and(|x| *x) { + Ok(()) + } else { + bail!("Failed to unlock account") + } + } + Account::Distributed(account) => { + if responses.into_iter().filter(|x| *x).count() >= account.threshold as usize { + Ok(()) + } else { + bail!("Failed to get enough unlocks") + } + } + } + } +} + +/// Connect to a Dirk host +async fn connect( + server: &DirkHostConfig, + client: &Identity, + ca: &Option, +) -> eyre::Result { + let mut tls_config = ClientTlsConfig::new().identity(client.clone()); + if let Some(ca) = ca { + tls_config = tls_config.ca_certificate(ca.clone()); + } + if let Some(server_name) = &server.server_name { + tls_config = tls_config.domain_name(server_name); + } + + Channel::from_shared(server.url.to_string()) + .map_err(eyre::Error::from)? + .tls_config(tls_config) + .map_err(eyre::Error::from)? + .connect() + .await + .map_err(eyre::Error::from) +} + +/// Decompose a full account name into wallet and name +fn decompose_name(full_name: &str) -> eyre::Result<(String, String)> { + full_name + .split_once('/') + .map(|(wallet, name)| (wallet.to_string(), name.to_string())) + .ok_or_else(|| eyre::eyre!("Invalid account name")) +} + +/// Load `SimpleAccount`s into the consensus accounts map +fn load_simple_accounts( + accounts: Vec, + host: &DirkHostConfig, + channel: &Channel, + consensus_accounts: &mut HashMap, +) { + for account in accounts { + if !host.accounts.contains(&account.name) { + continue; + } + + let Ok((wallet, name)) = decompose_name(&account.name) else { + warn!("Invalid account name {}", account.name); + continue; + }; + + match BlsPublicKey::try_from(account.public_key.as_slice()) { + Ok(public_key) => { + consensus_accounts.insert( + public_key, + Account::Simple(SimpleAccount { + public_key, + connection: channel.clone(), + wallet, + name, + }), + ); + } + Err(_) => { + warn!("Failed to parse public key for account {}", account.name); + continue; + } + } + } +} + +/// Load `DistributedAccount`s into the consensus accounts map +fn load_distributed_accounts( + accounts: Vec, + host: &DirkHostConfig, + channel: &Channel, + consensus_accounts: &mut HashMap, +) -> eyre::Result<()> { + let host_name = host + .server_name + .clone() + .or_else(|| host.url.host_str().map(String::from)) + .ok_or(eyre::eyre!("Host name not found for server {}", host.url))?; + + for account in accounts { + if !host.accounts.contains(&account.name) { + continue; + } + + let Ok(public_key) = BlsPublicKey::try_from(account.composite_public_key.as_slice()) else { + warn!("Failed to parse composite public key for account {}", account.name); + continue; + }; + + let Some(&Endpoint { id: participant_id, .. }) = + account.participants.iter().find(|participant| participant.name == host_name) + else { + warn!("Host {host_name} not found as participant for account {}", account.name); + continue; + }; + + match consensus_accounts.get_mut(&public_key) { + Some(Account::Distributed(DistributedAccount { participants, .. })) => { + participants.insert(participant_id as u32, channel.clone()); + } + None => { + let Ok((wallet, name)) = decompose_name(&account.name) else { + warn!("Invalid account name {}", account.name); + continue; + }; + + let mut participants = HashMap::with_capacity(account.participants.len()); + participants.insert(participant_id as u32, channel.clone()); + + consensus_accounts.insert( + public_key, + Account::Distributed(DistributedAccount { + composite_public_key: public_key, + participants, + threshold: account.signing_threshold, + wallet, + name, + }), + ); + } + Some(Account::Simple(_)) => { + bail!("Distributed public key already exists for simple account"); + } + } + } + + Ok(()) +} + +/// Aggregate partial signatures into a master signature +fn aggregate_partial_signatures(partials: &[(BlsSignature, u32)]) -> eyre::Result { + // Deserialize partial signatures into G2 points + let mut shares: HashMap = HashMap::new(); + for (signature, id) in partials { + if signature.len() != BLS_SIGNATURE_BYTES_LEN { + bail!("Invalid signature length") + } + let affine = G2Affine::from_compressed(signature) + .into_option() + .ok_or_eyre("Failed to deserialize signature")?; + shares.insert(*id, G2Projective::from(&affine)); + } + + // Perform Lagrange interpolation to recover the master signature + let mut recovered = G2Projective::identity(); + for (id, point) in &shares { + // Compute the Lagrange coefficient for this identifier + let mut numerator = Scalar::from(1u32); + let mut denominator = Scalar::from(1u32); + for other_id in shares.keys() { + if other_id != id { + numerator *= Scalar::from(*other_id); + denominator *= Scalar::from(*other_id) - Scalar::from(*id); + } + } + let lagrange_coeff = numerator * + denominator + .invert() + .into_option() + .ok_or_eyre("Failed to get lagrange coefficient")?; + + // Multiply the point by the Lagrange coefficient and add to the recovered point + recovered += *point * lagrange_coeff; + } + + // Serialize the recovered point back into a BlsSignature + let bytes = recovered.to_compressed(); + Ok(bytes.into()) +} + +/// Generate a random password of 64 hex-characters +fn random_password() -> String { + let password_bytes: [u8; 32] = rand::thread_rng().gen(); + hex::encode(password_bytes) +} + +mod test { + + #[test] + fn test_signature_aggregation() { + use alloy::hex; + use cb_common::signer::BlsSignature; + + use super::aggregate_partial_signatures; + + let partials = vec![ + (BlsSignature::from_slice(&hex::decode("aa16233b9e65b596caf070122d564ad7a021dad4fc2ed8508fccecfab010da80892fad7336e9fbada607c50e2d0d78e00c9961f26618334ec9f0e7ea225212f3c0c7d66f73ff1c2e555712a3e31f517b8329bd0ad9e15a9aeaa91521ba83502c").unwrap()), 1), + (BlsSignature::from_slice(&hex::decode("b27dd4c088e386edc4d07b6b23c72ba87a34e04cffd4975e8cb679aa4640cec1d34ace3e2bf33ac0dffca023c82422840012bb6c92eab36ca7908a9f9519fa18b1ed2bdbc624a98e01ca217c318a021495cc6cc9c8b982d0afed2cd83dc8fe65").unwrap()), 2), + (BlsSignature::from_slice(&hex::decode("aca4a71373df2f76369e8b242b0e2b1f41fc384feee3abe605ee8d6723f5fb11de1c9bd2408f4a09be981342352c523801e3beea73893a329204dd67fe84cb520220af33f7fa027b6bcc3b7c8e78647f2aa372145e4d3aec7682d2605040a64a").unwrap()), 3) + ]; + let expected = BlsSignature::from_slice(&hex::decode("0x8e343f074f91d19fd5118d9301768e30cecb21fb96a1ad9539cbdeae8907e2e12a88c91fe1d7e1f6995dcde18fb0272b1512cd68800e14ebd1c7f189e7221ba238a0f196226385737157f4b72d348c1886ce18d0a9609ba0cd5503e41546286f").unwrap()); + + // With all signers + let signature = aggregate_partial_signatures(&partials).unwrap(); + assert_eq!(signature, expected); + + // With only 2 signers + let signature = aggregate_partial_signatures(&partials[..2]).unwrap(); + assert_eq!(signature, expected); + + // With other 2 signers + let signature = aggregate_partial_signatures(&partials[1..]).unwrap(); + assert_eq!(signature, expected); + + // Should fail with only 1 signer + let signature = aggregate_partial_signatures(&partials[..1]).unwrap(); + assert_ne!(signature, expected); + } +} diff --git a/crates/signer/src/manager.rs b/crates/signer/src/manager/local.rs similarity index 95% rename from crates/signer/src/manager.rs rename to crates/signer/src/manager/local.rs index 4bf0bfab..59edafa2 100644 --- a/crates/signer/src/manager.rs +++ b/crates/signer/src/manager/local.rs @@ -12,12 +12,12 @@ use cb_common::{ }, types::{Chain, ModuleId}, }; -use eyre::OptionExt; use tree_hash::TreeHash; use crate::error::SignerModuleError; -pub struct SigningManager { +#[derive(Clone)] +pub struct LocalSigningManager { chain: Chain, proxy_store: Option, consensus_signers: HashMap, @@ -29,7 +29,7 @@ pub struct SigningManager { proxy_pubkeys_ecdsa: HashMap>, } -impl SigningManager { +impl LocalSigningManager { pub fn new(chain: Chain, proxy_store: Option) -> eyre::Result { let mut manager = Self { chain, @@ -227,7 +227,7 @@ impl SigningManager { pub fn get_consensus_proxy_maps( &self, module_id: &ModuleId, - ) -> eyre::Result> { + ) -> Result, SignerModuleError> { let consensus = self.consensus_pubkeys(); let proxy_bls = self.proxy_pubkeys_bls.get(module_id).cloned().unwrap_or_default(); let proxy_ecdsa = self.proxy_pubkeys_ecdsa.get(module_id).cloned().unwrap_or_default(); @@ -239,7 +239,7 @@ impl SigningManager { let entry = keys .iter_mut() .find(|x| x.consensus == delegator) - .ok_or_eyre("missing consensus")?; + .ok_or(SignerModuleError::UnknownConsensusSigner(delegator.0.to_vec()))?; entry.proxy_bls.push(bls); } @@ -249,7 +249,7 @@ impl SigningManager { let entry = keys .iter_mut() .find(|x| x.consensus == delegator) - .ok_or_eyre("missing consensus")?; + .ok_or(SignerModuleError::UnknownConsensusSigner(delegator.0.to_vec()))?; entry.proxy_ecdsa.push(ecdsa); } @@ -257,8 +257,8 @@ impl SigningManager { Ok(keys) } - pub fn proxies(&self) -> &ProxySigners { - &self.proxy_signers + pub fn available_proxy_signers(&self) -> usize { + self.proxy_signers.bls_signers.len() + self.proxy_signers.ecdsa_signers.len() } } @@ -276,8 +276,8 @@ mod tests { static ref MODULE_ID: ModuleId = ModuleId("SAMPLE_MODULE".to_string()); } - fn init_signing_manager() -> (SigningManager, BlsPublicKey) { - let mut signing_manager = SigningManager::new(CHAIN, None).unwrap(); + fn init_signing_manager() -> (LocalSigningManager, BlsPublicKey) { + let mut signing_manager = LocalSigningManager::new(CHAIN, None).unwrap(); let consensus_signer = ConsensusSigner::new_random(); let consensus_pk = consensus_signer.pubkey(); diff --git a/crates/signer/src/manager/mod.rs b/crates/signer/src/manager/mod.rs new file mode 100644 index 00000000..2e608674 --- /dev/null +++ b/crates/signer/src/manager/mod.rs @@ -0,0 +1,46 @@ +use cb_common::{commit::request::ConsensusProxyMap, types::ModuleId}; +use dirk::DirkManager; +use local::LocalSigningManager; + +use crate::error::SignerModuleError; + +pub mod dirk; +pub mod local; + +#[derive(Clone)] +pub enum SigningManager { + Local(LocalSigningManager), + Dirk(DirkManager), +} + +impl SigningManager { + /// Amount of consensus signers available + pub fn available_consensus_signers(&self) -> usize { + match self { + SigningManager::Local(local_manager) => local_manager.consensus_pubkeys().len(), + SigningManager::Dirk(dirk_manager) => dirk_manager.available_consensus_signers(), + } + } + + /// Amount of proxy signers available + pub fn available_proxy_signers(&self) -> usize { + match self { + SigningManager::Local(local_manager) => local_manager.available_proxy_signers(), + SigningManager::Dirk(dirk_manager) => dirk_manager.available_proxy_signers(), + } + } + + pub fn get_consensus_proxy_maps( + &self, + module_id: &ModuleId, + ) -> Result, SignerModuleError> { + match self { + SigningManager::Local(local_manager) => { + local_manager.get_consensus_proxy_maps(module_id) + } + SigningManager::Dirk(dirk_manager) => { + Ok(dirk_manager.get_consensus_proxy_maps(module_id)) + } + } + } +} diff --git a/crates/signer/src/proto/google.api.rs b/crates/signer/src/proto/google.api.rs new file mode 100644 index 00000000..243114a3 --- /dev/null +++ b/crates/signer/src/proto/google.api.rs @@ -0,0 +1,306 @@ +// This file is @generated by prost-build. +/// Defines the HTTP configuration for an API service. It contains a list of +/// [HttpRule][google.api.HttpRule], each specifying the mapping of an RPC method +/// to one or more HTTP REST API methods. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Http { + /// A list of HTTP configuration rules that apply to individual API methods. + /// + /// **NOTE:** All service configuration rules follow "last one wins" order. + #[prost(message, repeated, tag = "1")] + pub rules: ::prost::alloc::vec::Vec, + /// When set to true, URL path parmeters will be fully URI-decoded except in + /// cases of single segment matches in reserved expansion, where "%2F" will be + /// left encoded. + /// + /// The default behavior is to not decode RFC 6570 reserved characters in multi + /// segment matches. + #[prost(bool, tag = "2")] + pub fully_decode_reserved_expansion: bool, +} +/// `HttpRule` defines the mapping of an RPC method to one or more HTTP +/// REST API methods. The mapping specifies how different portions of the RPC +/// request message are mapped to URL path, URL query parameters, and +/// HTTP request body. The mapping is typically specified as an +/// `google.api.http` annotation on the RPC method, +/// see "google/api/annotations.proto" for details. +/// +/// The mapping consists of a field specifying the path template and +/// method kind. The path template can refer to fields in the request +/// message, as in the example below which describes a REST GET +/// operation on a resource collection of messages: +/// +/// +/// service Messaging { +/// rpc GetMessage(GetMessageRequest) returns (Message) { +/// option (google.api.http).get = "/v1/messages/{message_id}/{sub.subfield}"; +/// } +/// } +/// message GetMessageRequest { +/// message SubMessage { +/// string subfield = 1; +/// } +/// string message_id = 1; // mapped to the URL +/// SubMessage sub = 2; // `sub.subfield` is url-mapped +/// } +/// message Message { +/// string text = 1; // content of the resource +/// } +/// +/// The same http annotation can alternatively be expressed inside the +/// `GRPC API Configuration` YAML file. +/// +/// http: +/// rules: +/// - selector: .Messaging.GetMessage +/// get: /v1/messages/{message_id}/{sub.subfield} +/// +/// This definition enables an automatic, bidrectional mapping of HTTP +/// JSON to RPC. Example: +/// +/// HTTP | RPC +/// -----|----- +/// `GET /v1/messages/123456/foo` | `GetMessage(message_id: "123456" sub: SubMessage(subfield: "foo"))` +/// +/// In general, not only fields but also field paths can be referenced +/// from a path pattern. Fields mapped to the path pattern cannot be +/// repeated and must have a primitive (non-message) type. +/// +/// Any fields in the request message which are not bound by the path +/// pattern automatically become (optional) HTTP query +/// parameters. Assume the following definition of the request message: +/// +/// +/// service Messaging { +/// rpc GetMessage(GetMessageRequest) returns (Message) { +/// option (google.api.http).get = "/v1/messages/{message_id}"; +/// } +/// } +/// message GetMessageRequest { +/// message SubMessage { +/// string subfield = 1; +/// } +/// string message_id = 1; // mapped to the URL +/// int64 revision = 2; // becomes a parameter +/// SubMessage sub = 3; // `sub.subfield` becomes a parameter +/// } +/// +/// +/// This enables a HTTP JSON to RPC mapping as below: +/// +/// HTTP | RPC +/// -----|----- +/// `GET /v1/messages/123456?revision=2&sub.subfield=foo` | `GetMessage(message_id: "123456" revision: 2 sub: SubMessage(subfield: "foo"))` +/// +/// Note that fields which are mapped to HTTP parameters must have a +/// primitive type or a repeated primitive type. Message types are not +/// allowed. In the case of a repeated type, the parameter can be +/// repeated in the URL, as in `...?param=A¶m=B`. +/// +/// For HTTP method kinds which allow a request body, the `body` field +/// specifies the mapping. Consider a REST update method on the +/// message resource collection: +/// +/// +/// service Messaging { +/// rpc UpdateMessage(UpdateMessageRequest) returns (Message) { +/// option (google.api.http) = { +/// put: "/v1/messages/{message_id}" +/// body: "message" +/// }; +/// } +/// } +/// message UpdateMessageRequest { +/// string message_id = 1; // mapped to the URL +/// Message message = 2; // mapped to the body +/// } +/// +/// +/// The following HTTP JSON to RPC mapping is enabled, where the +/// representation of the JSON in the request body is determined by +/// protos JSON encoding: +/// +/// HTTP | RPC +/// -----|----- +/// `PUT /v1/messages/123456 { "text": "Hi!" }` | `UpdateMessage(message_id: "123456" message { text: "Hi!" })` +/// +/// The special name `*` can be used in the body mapping to define that +/// every field not bound by the path template should be mapped to the +/// request body. This enables the following alternative definition of +/// the update method: +/// +/// service Messaging { +/// rpc UpdateMessage(Message) returns (Message) { +/// option (google.api.http) = { +/// put: "/v1/messages/{message_id}" +/// body: "*" +/// }; +/// } +/// } +/// message Message { +/// string message_id = 1; +/// string text = 2; +/// } +/// +/// +/// The following HTTP JSON to RPC mapping is enabled: +/// +/// HTTP | RPC +/// -----|----- +/// `PUT /v1/messages/123456 { "text": "Hi!" }` | `UpdateMessage(message_id: "123456" text: "Hi!")` +/// +/// Note that when using `*` in the body mapping, it is not possible to +/// have HTTP parameters, as all fields not bound by the path end in +/// the body. This makes this option more rarely used in practice of +/// defining REST APIs. The common usage of `*` is in custom methods +/// which don't use the URL at all for transferring data. +/// +/// It is possible to define multiple HTTP methods for one RPC by using +/// the `additional_bindings` option. Example: +/// +/// service Messaging { +/// rpc GetMessage(GetMessageRequest) returns (Message) { +/// option (google.api.http) = { +/// get: "/v1/messages/{message_id}" +/// additional_bindings { +/// get: "/v1/users/{user_id}/messages/{message_id}" +/// } +/// }; +/// } +/// } +/// message GetMessageRequest { +/// string message_id = 1; +/// string user_id = 2; +/// } +/// +/// +/// This enables the following two alternative HTTP JSON to RPC +/// mappings: +/// +/// HTTP | RPC +/// -----|----- +/// `GET /v1/messages/123456` | `GetMessage(message_id: "123456")` +/// `GET /v1/users/me/messages/123456` | `GetMessage(user_id: "me" message_id: "123456")` +/// +/// # Rules for HTTP mapping +/// +/// The rules for mapping HTTP path, query parameters, and body fields +/// to the request message are as follows: +/// +/// 1. The `body` field specifies either `*` or a field path, or is +/// omitted. If omitted, it indicates there is no HTTP request body. +/// 2. Leaf fields (recursive expansion of nested messages in the +/// request) can be classified into three types: +/// (a) Matched in the URL template. +/// (b) Covered by body (if body is `*`, everything except (a) fields; +/// else everything under the body field) +/// (c) All other fields. +/// 3. URL query parameters found in the HTTP request are mapped to (c) fields. +/// 4. Any body sent with an HTTP request can contain only (b) fields. +/// +/// The syntax of the path template is as follows: +/// +/// Template = "/" Segments \[ Verb \] ; +/// Segments = Segment { "/" Segment } ; +/// Segment = "*" | "**" | LITERAL | Variable ; +/// Variable = "{" FieldPath \[ "=" Segments \] "}" ; +/// FieldPath = IDENT { "." IDENT } ; +/// Verb = ":" LITERAL ; +/// +/// The syntax `*` matches a single path segment. The syntax `**` matches zero +/// or more path segments, which must be the last part of the path except the +/// `Verb`. The syntax `LITERAL` matches literal text in the path. +/// +/// The syntax `Variable` matches part of the URL path as specified by its +/// template. A variable template must not contain other variables. If a variable +/// matches a single path segment, its template may be omitted, e.g. `{var}` +/// is equivalent to `{var=*}`. +/// +/// If a variable contains exactly one path segment, such as `"{var}"` or +/// `"{var=*}"`, when such a variable is expanded into a URL path, all characters +/// except `\[-_.~0-9a-zA-Z\]` are percent-encoded. Such variables show up in the +/// Discovery Document as `{var}`. +/// +/// If a variable contains one or more path segments, such as `"{var=foo/*}"` +/// or `"{var=**}"`, when such a variable is expanded into a URL path, all +/// characters except `\[-_.~/0-9a-zA-Z\]` are percent-encoded. Such variables +/// show up in the Discovery Document as `{+var}`. +/// +/// NOTE: While the single segment variable matches the semantics of +/// [RFC 6570]() Section 3.2.2 +/// Simple String Expansion, the multi segment variable **does not** match +/// RFC 6570 Reserved Expansion. The reason is that the Reserved Expansion +/// does not expand special characters like `?` and `#`, which would lead +/// to invalid URLs. +/// +/// NOTE: the field paths in variables and in the `body` must not refer to +/// repeated fields or map fields. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct HttpRule { + /// Selects methods to which this rule applies. + /// + /// Refer to [selector][google.api.DocumentationRule.selector] for syntax details. + #[prost(string, tag = "1")] + pub selector: ::prost::alloc::string::String, + /// The name of the request field whose value is mapped to the HTTP body, or + /// `*` for mapping all fields not captured by the path pattern to the HTTP + /// body. NOTE: the referred field must not be a repeated field and must be + /// present at the top-level of request message type. + #[prost(string, tag = "7")] + pub body: ::prost::alloc::string::String, + /// Optional. The name of the response field whose value is mapped to the HTTP + /// body of response. Other response fields are ignored. When + /// not set, the response message will be used as HTTP body of response. + #[prost(string, tag = "12")] + pub response_body: ::prost::alloc::string::String, + /// Additional HTTP bindings for the selector. Nested bindings must + /// not contain an `additional_bindings` field themselves (that is, + /// the nesting may only be one level deep). + #[prost(message, repeated, tag = "11")] + pub additional_bindings: ::prost::alloc::vec::Vec, + /// Determines the URL pattern is matched by this rules. This pattern can be + /// used with any of the {get|put|post|delete|patch} methods. A custom method + /// can be defined using the 'custom' field. + #[prost(oneof = "http_rule::Pattern", tags = "2, 3, 4, 5, 6, 8")] + pub pattern: ::core::option::Option, +} +/// Nested message and enum types in `HttpRule`. +pub mod http_rule { + /// Determines the URL pattern is matched by this rules. This pattern can be + /// used with any of the {get|put|post|delete|patch} methods. A custom method + /// can be defined using the 'custom' field. + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Pattern { + /// Used for listing and getting information about resources. + #[prost(string, tag = "2")] + Get(::prost::alloc::string::String), + /// Used for updating a resource. + #[prost(string, tag = "3")] + Put(::prost::alloc::string::String), + /// Used for creating a resource. + #[prost(string, tag = "4")] + Post(::prost::alloc::string::String), + /// Used for deleting a resource. + #[prost(string, tag = "5")] + Delete(::prost::alloc::string::String), + /// Used for updating a resource. + #[prost(string, tag = "6")] + Patch(::prost::alloc::string::String), + /// The custom pattern is used for specifying an HTTP method that is not + /// included in the `pattern` field, such as HEAD, or "*" to leave the + /// HTTP method unspecified for this rule. The wild-card rule is useful + /// for services that provide content to Web (HTML) clients. + #[prost(message, tag = "8")] + Custom(super::CustomHttpPattern), + } +} +/// A custom pattern is used for defining custom HTTP verb. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct CustomHttpPattern { + /// The name of this custom HTTP verb. + #[prost(string, tag = "1")] + pub kind: ::prost::alloc::string::String, + /// The path matched by this custom verb. + #[prost(string, tag = "2")] + pub path: ::prost::alloc::string::String, +} diff --git a/crates/signer/src/proto/mod.rs b/crates/signer/src/proto/mod.rs new file mode 100644 index 00000000..a3a6d96c --- /dev/null +++ b/crates/signer/src/proto/mod.rs @@ -0,0 +1 @@ +pub mod v1; diff --git a/crates/signer/src/proto/v1.rs b/crates/signer/src/proto/v1.rs new file mode 100644 index 00000000..ba8012c3 --- /dev/null +++ b/crates/signer/src/proto/v1.rs @@ -0,0 +1,637 @@ +// This file is @generated by prost-build. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Endpoint { + #[prost(uint64, tag = "1")] + pub id: u64, + #[prost(string, tag = "2")] + pub name: ::prost::alloc::string::String, + #[prost(uint32, tag = "3")] + pub port: u32, +} +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] +#[repr(i32)] +pub enum ResponseState { + /// UNKNOWN occurs when no information about the response is available. + Unknown = 0, + /// SUCCEEDED occurs when a request was successful. + Succeeded = 1, + /// DENIED occurs when a request was denied. + Denied = 2, + /// FAILED occurs when a request failed to complete. + Failed = 3, +} +impl ResponseState { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic + /// use. + pub fn as_str_name(&self) -> &'static str { + match self { + Self::Unknown => "UNKNOWN", + Self::Succeeded => "SUCCEEDED", + Self::Denied => "DENIED", + Self::Failed => "FAILED", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "UNKNOWN" => Some(Self::Unknown), + "SUCCEEDED" => Some(Self::Succeeded), + "DENIED" => Some(Self::Denied), + "FAILED" => Some(Self::Failed), + _ => None, + } + } +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ListAccountsRequest { + #[prost(string, repeated, tag = "1")] + pub paths: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ListAccountsResponse { + #[prost(enumeration = "ResponseState", tag = "1")] + pub state: i32, + #[prost(message, repeated, tag = "2")] + pub accounts: ::prost::alloc::vec::Vec, + #[prost(message, repeated, tag = "3")] + pub distributed_accounts: ::prost::alloc::vec::Vec, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Account { + #[prost(string, tag = "1")] + pub name: ::prost::alloc::string::String, + #[prost(bytes = "vec", tag = "2")] + pub public_key: ::prost::alloc::vec::Vec, + #[prost(bytes = "vec", tag = "3")] + pub uuid: ::prost::alloc::vec::Vec, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct DistributedAccount { + #[prost(string, tag = "1")] + pub name: ::prost::alloc::string::String, + #[prost(bytes = "vec", tag = "2")] + pub public_key: ::prost::alloc::vec::Vec, + #[prost(message, repeated, tag = "3")] + pub participants: ::prost::alloc::vec::Vec, + #[prost(uint32, tag = "4")] + pub signing_threshold: u32, + #[prost(bytes = "vec", tag = "5")] + pub uuid: ::prost::alloc::vec::Vec, + #[prost(bytes = "vec", tag = "6")] + pub composite_public_key: ::prost::alloc::vec::Vec, +} +/// Generated client implementations. +pub mod lister_client { + #![allow( + unused_variables, + dead_code, + missing_docs, + clippy::wildcard_imports, + clippy::let_unit_value + )] + use tonic::codegen::{http::Uri, *}; + #[derive(Debug, Clone)] + pub struct ListerClient { + inner: tonic::client::Grpc, + } + impl ListerClient { + /// Attempt to create a new client by connecting to a given endpoint. + pub async fn connect(dst: D) -> Result + where + D: TryInto, + D::Error: Into, + { + let conn = tonic::transport::Endpoint::new(dst)?.connect().await?; + Ok(Self::new(conn)) + } + } + impl ListerClient + where + T: tonic::client::GrpcService, + T::Error: Into, + T::ResponseBody: Body + std::marker::Send + 'static, + ::Error: Into + std::marker::Send, + { + pub fn new(inner: T) -> Self { + let inner = tonic::client::Grpc::new(inner); + Self { inner } + } + pub fn with_origin(inner: T, origin: Uri) -> Self { + let inner = tonic::client::Grpc::with_origin(inner, origin); + Self { inner } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> ListerClient> + where + F: tonic::service::Interceptor, + T::ResponseBody: Default, + T: tonic::codegen::Service< + http::Request, + Response = http::Response< + >::ResponseBody, + >, + >, + >>::Error: + Into + std::marker::Send + std::marker::Sync, + { + ListerClient::new(InterceptedService::new(inner, interceptor)) + } + /// Compress requests with the given encoding. + /// + /// This requires the server to support it otherwise it might respond + /// with an error. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.send_compressed(encoding); + self + } + /// Enable decompressing responses. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.accept_compressed(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_decoding_message_size(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_encoding_message_size(limit); + self + } + pub async fn list_accounts( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result, tonic::Status> + { + self.inner.ready().await.map_err(|e| { + tonic::Status::unknown(format!("Service was not ready: {}", e.into())) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static("/v1.Lister/ListAccounts"); + let mut req = request.into_request(); + req.extensions_mut().insert(GrpcMethod::new("v1.Lister", "ListAccounts")); + self.inner.unary(req, path, codec).await + } + } +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct UnlockAccountRequest { + #[prost(string, tag = "1")] + pub account: ::prost::alloc::string::String, + #[prost(bytes = "vec", tag = "2")] + pub passphrase: ::prost::alloc::vec::Vec, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct LockAccountRequest { + #[prost(string, tag = "1")] + pub account: ::prost::alloc::string::String, +} +#[derive(Clone, Copy, PartialEq, ::prost::Message)] +pub struct UnlockAccountResponse { + #[prost(enumeration = "ResponseState", tag = "1")] + pub state: i32, +} +#[derive(Clone, Copy, PartialEq, ::prost::Message)] +pub struct LockAccountResponse { + #[prost(enumeration = "ResponseState", tag = "1")] + pub state: i32, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct GenerateRequest { + #[prost(string, tag = "1")] + pub account: ::prost::alloc::string::String, + #[prost(bytes = "vec", tag = "2")] + pub passphrase: ::prost::alloc::vec::Vec, + #[prost(uint32, tag = "3")] + pub participants: u32, + #[prost(uint32, tag = "4")] + pub signing_threshold: u32, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct GenerateResponse { + #[prost(enumeration = "ResponseState", tag = "1")] + pub state: i32, + #[prost(string, tag = "2")] + pub message: ::prost::alloc::string::String, + #[prost(bytes = "vec", tag = "3")] + pub public_key: ::prost::alloc::vec::Vec, + #[prost(message, repeated, tag = "4")] + pub participants: ::prost::alloc::vec::Vec, +} +/// Generated client implementations. +pub mod account_manager_client { + #![allow( + unused_variables, + dead_code, + missing_docs, + clippy::wildcard_imports, + clippy::let_unit_value + )] + use tonic::codegen::{http::Uri, *}; + #[derive(Debug, Clone)] + pub struct AccountManagerClient { + inner: tonic::client::Grpc, + } + impl AccountManagerClient { + /// Attempt to create a new client by connecting to a given endpoint. + pub async fn connect(dst: D) -> Result + where + D: TryInto, + D::Error: Into, + { + let conn = tonic::transport::Endpoint::new(dst)?.connect().await?; + Ok(Self::new(conn)) + } + } + impl AccountManagerClient + where + T: tonic::client::GrpcService, + T::Error: Into, + T::ResponseBody: Body + std::marker::Send + 'static, + ::Error: Into + std::marker::Send, + { + pub fn new(inner: T) -> Self { + let inner = tonic::client::Grpc::new(inner); + Self { inner } + } + pub fn with_origin(inner: T, origin: Uri) -> Self { + let inner = tonic::client::Grpc::with_origin(inner, origin); + Self { inner } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> AccountManagerClient> + where + F: tonic::service::Interceptor, + T::ResponseBody: Default, + T: tonic::codegen::Service< + http::Request, + Response = http::Response< + >::ResponseBody, + >, + >, + >>::Error: + Into + std::marker::Send + std::marker::Sync, + { + AccountManagerClient::new(InterceptedService::new(inner, interceptor)) + } + /// Compress requests with the given encoding. + /// + /// This requires the server to support it otherwise it might respond + /// with an error. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.send_compressed(encoding); + self + } + /// Enable decompressing responses. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.accept_compressed(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_decoding_message_size(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_encoding_message_size(limit); + self + } + pub async fn unlock( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result, tonic::Status> + { + self.inner.ready().await.map_err(|e| { + tonic::Status::unknown(format!("Service was not ready: {}", e.into())) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static("/v1.AccountManager/Unlock"); + let mut req = request.into_request(); + req.extensions_mut().insert(GrpcMethod::new("v1.AccountManager", "Unlock")); + self.inner.unary(req, path, codec).await + } + pub async fn lock( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result, tonic::Status> + { + self.inner.ready().await.map_err(|e| { + tonic::Status::unknown(format!("Service was not ready: {}", e.into())) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static("/v1.AccountManager/Lock"); + let mut req = request.into_request(); + req.extensions_mut().insert(GrpcMethod::new("v1.AccountManager", "Lock")); + self.inner.unary(req, path, codec).await + } + pub async fn generate( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result, tonic::Status> { + self.inner.ready().await.map_err(|e| { + tonic::Status::unknown(format!("Service was not ready: {}", e.into())) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static("/v1.AccountManager/Generate"); + let mut req = request.into_request(); + req.extensions_mut().insert(GrpcMethod::new("v1.AccountManager", "Generate")); + self.inner.unary(req, path, codec).await + } + } +} +/// AttestationData is defined at +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct AttestationData { + #[prost(uint64, tag = "1")] + pub slot: u64, + #[prost(uint64, tag = "2")] + pub committee_index: u64, + #[prost(bytes = "vec", tag = "3")] + pub beacon_block_root: ::prost::alloc::vec::Vec, + #[prost(message, optional, tag = "4")] + pub source: ::core::option::Option, + #[prost(message, optional, tag = "5")] + pub target: ::core::option::Option, +} +/// Checkpoint is defined at +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Checkpoint { + #[prost(uint64, tag = "1")] + pub epoch: u64, + #[prost(bytes = "vec", tag = "2")] + pub root: ::prost::alloc::vec::Vec, +} +/// BeaconBlockheader is defined at +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct BeaconBlockHeader { + #[prost(uint64, tag = "1")] + pub slot: u64, + #[prost(uint64, tag = "2")] + pub proposer_index: u64, + #[prost(bytes = "vec", tag = "3")] + pub parent_root: ::prost::alloc::vec::Vec, + #[prost(bytes = "vec", tag = "4")] + pub state_root: ::prost::alloc::vec::Vec, + #[prost(bytes = "vec", tag = "5")] + pub body_root: ::prost::alloc::vec::Vec, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct SignRequest { + #[prost(bytes = "vec", tag = "3")] + pub data: ::prost::alloc::vec::Vec, + #[prost(bytes = "vec", tag = "4")] + pub domain: ::prost::alloc::vec::Vec, + #[prost(oneof = "sign_request::Id", tags = "1, 2")] + pub id: ::core::option::Option, +} +/// Nested message and enum types in `SignRequest`. +pub mod sign_request { + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Id { + #[prost(bytes, tag = "1")] + PublicKey(::prost::alloc::vec::Vec), + #[prost(string, tag = "2")] + Account(::prost::alloc::string::String), + } +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MultisignRequest { + #[prost(message, repeated, tag = "1")] + pub requests: ::prost::alloc::vec::Vec, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct SignBeaconAttestationRequest { + #[prost(bytes = "vec", tag = "3")] + pub domain: ::prost::alloc::vec::Vec, + #[prost(message, optional, tag = "4")] + pub data: ::core::option::Option, + #[prost(oneof = "sign_beacon_attestation_request::Id", tags = "1, 2")] + pub id: ::core::option::Option, +} +/// Nested message and enum types in `SignBeaconAttestationRequest`. +pub mod sign_beacon_attestation_request { + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Id { + #[prost(bytes, tag = "1")] + PublicKey(::prost::alloc::vec::Vec), + #[prost(string, tag = "2")] + Account(::prost::alloc::string::String), + } +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct SignBeaconAttestationsRequest { + #[prost(message, repeated, tag = "1")] + pub requests: ::prost::alloc::vec::Vec, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct SignBeaconProposalRequest { + #[prost(bytes = "vec", tag = "3")] + pub domain: ::prost::alloc::vec::Vec, + #[prost(message, optional, tag = "4")] + pub data: ::core::option::Option, + #[prost(oneof = "sign_beacon_proposal_request::Id", tags = "1, 2")] + pub id: ::core::option::Option, +} +/// Nested message and enum types in `SignBeaconProposalRequest`. +pub mod sign_beacon_proposal_request { + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Id { + #[prost(bytes, tag = "1")] + PublicKey(::prost::alloc::vec::Vec), + #[prost(string, tag = "2")] + Account(::prost::alloc::string::String), + } +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct SignResponse { + #[prost(enumeration = "ResponseState", tag = "1")] + pub state: i32, + #[prost(bytes = "vec", tag = "2")] + pub signature: ::prost::alloc::vec::Vec, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MultisignResponse { + #[prost(message, repeated, tag = "1")] + pub responses: ::prost::alloc::vec::Vec, +} +/// Generated client implementations. +pub mod signer_client { + #![allow( + unused_variables, + dead_code, + missing_docs, + clippy::wildcard_imports, + clippy::let_unit_value + )] + use tonic::codegen::{http::Uri, *}; + #[derive(Debug, Clone)] + pub struct SignerClient { + inner: tonic::client::Grpc, + } + impl SignerClient { + /// Attempt to create a new client by connecting to a given endpoint. + pub async fn connect(dst: D) -> Result + where + D: TryInto, + D::Error: Into, + { + let conn = tonic::transport::Endpoint::new(dst)?.connect().await?; + Ok(Self::new(conn)) + } + } + impl SignerClient + where + T: tonic::client::GrpcService, + T::Error: Into, + T::ResponseBody: Body + std::marker::Send + 'static, + ::Error: Into + std::marker::Send, + { + pub fn new(inner: T) -> Self { + let inner = tonic::client::Grpc::new(inner); + Self { inner } + } + pub fn with_origin(inner: T, origin: Uri) -> Self { + let inner = tonic::client::Grpc::with_origin(inner, origin); + Self { inner } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> SignerClient> + where + F: tonic::service::Interceptor, + T::ResponseBody: Default, + T: tonic::codegen::Service< + http::Request, + Response = http::Response< + >::ResponseBody, + >, + >, + >>::Error: + Into + std::marker::Send + std::marker::Sync, + { + SignerClient::new(InterceptedService::new(inner, interceptor)) + } + /// Compress requests with the given encoding. + /// + /// This requires the server to support it otherwise it might respond + /// with an error. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.send_compressed(encoding); + self + } + /// Enable decompressing responses. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.accept_compressed(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_decoding_message_size(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_encoding_message_size(limit); + self + } + pub async fn sign( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result, tonic::Status> { + self.inner.ready().await.map_err(|e| { + tonic::Status::unknown(format!("Service was not ready: {}", e.into())) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static("/v1.Signer/Sign"); + let mut req = request.into_request(); + req.extensions_mut().insert(GrpcMethod::new("v1.Signer", "Sign")); + self.inner.unary(req, path, codec).await + } + pub async fn multisign( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result, tonic::Status> { + self.inner.ready().await.map_err(|e| { + tonic::Status::unknown(format!("Service was not ready: {}", e.into())) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static("/v1.Signer/Multisign"); + let mut req = request.into_request(); + req.extensions_mut().insert(GrpcMethod::new("v1.Signer", "Multisign")); + self.inner.unary(req, path, codec).await + } + pub async fn sign_beacon_attestation( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result, tonic::Status> { + self.inner.ready().await.map_err(|e| { + tonic::Status::unknown(format!("Service was not ready: {}", e.into())) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static("/v1.Signer/SignBeaconAttestation"); + let mut req = request.into_request(); + req.extensions_mut().insert(GrpcMethod::new("v1.Signer", "SignBeaconAttestation")); + self.inner.unary(req, path, codec).await + } + pub async fn sign_beacon_attestations( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result, tonic::Status> { + self.inner.ready().await.map_err(|e| { + tonic::Status::unknown(format!("Service was not ready: {}", e.into())) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static("/v1.Signer/SignBeaconAttestations"); + let mut req = request.into_request(); + req.extensions_mut().insert(GrpcMethod::new("v1.Signer", "SignBeaconAttestations")); + self.inner.unary(req, path, codec).await + } + pub async fn sign_beacon_proposal( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result, tonic::Status> { + self.inner.ready().await.map_err(|e| { + tonic::Status::unknown(format!("Service was not ready: {}", e.into())) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static("/v1.Signer/SignBeaconProposal"); + let mut req = request.into_request(); + req.extensions_mut().insert(GrpcMethod::new("v1.Signer", "SignBeaconProposal")); + self.inner.unary(req, path, codec).await + } + } +} diff --git a/crates/signer/src/service.rs b/crates/signer/src/service.rs index f8544137..90a2bb3b 100644 --- a/crates/signer/src/service.rs +++ b/crates/signer/src/service.rs @@ -34,7 +34,7 @@ use uuid::Uuid; use crate::{ error::SignerModuleError, - manager::SigningManager, + manager::{dirk::DirkManager, local::LocalSigningManager, SigningManager}, metrics::{uri_to_tag, SIGNER_METRICS_REGISTRY, SIGNER_STATUS}, }; @@ -57,18 +57,18 @@ impl SigningService { return Ok(()); } - let manager = start_manager(&config) - .map_err(|err| eyre::eyre!("failed to start signing manager {err}"))?; - let module_ids: Vec = config.jwts.left_values().cloned().map(Into::into).collect(); - let loaded_consensus = manager.consensus_pubkeys().len(); - let proxies = manager.proxies(); - let loaded_proxies = proxies.bls_signers.len() + proxies.ecdsa_signers.len(); + let state = SigningState { + manager: Arc::new(RwLock::new(start_manager(config.clone()).await?)), + jwts: config.jwts.into(), + }; + + let loaded_consensus = state.manager.read().await.available_consensus_signers(); + let loaded_proxies = state.manager.read().await.available_proxy_signers(); info!(version = COMMIT_BOOST_VERSION, commit = COMMIT_BOOST_COMMIT, modules =? module_ids, port =? config.server_port, loaded_consensus, loaded_proxies, "Starting signing service"); - let state = SigningState { manager: RwLock::new(manager).into(), jwts: config.jwts.into() }; SigningService::init_metrics(config.chain)?; let app = axum::Router::new() @@ -135,12 +135,14 @@ async fn handle_get_pubkeys( debug!(event = "get_pubkeys", ?req_id, "New request"); - let signing_manager = state.manager.read().await; - let map = signing_manager + let keys = state + .manager + .read() + .await .get_consensus_proxy_maps(&module_id) .map_err(|err| SignerModuleError::Internal(err.to_string()))?; - let res = GetPubkeysResponse { keys: map }; + let res = GetPubkeysResponse { keys }; Ok((StatusCode::OK, Json(res)).into_response()) } @@ -153,38 +155,56 @@ async fn handle_request_signature( ) -> Result { let req_id = Uuid::new_v4(); - debug!(event = "request_signature", ?module_id, ?req_id, "New request"); - - let signing_manager = state.manager.read().await; + debug!(event = "request_signature", ?module_id, %request, ?req_id, "New request"); - let signature_response = match request { - SignRequest::Consensus(SignConsensusRequest { pubkey, object_root }) => signing_manager - .sign_consensus(&pubkey, &object_root) - .await - .map(|sig| Json(sig).into_response()), - SignRequest::ProxyBls(SignProxyRequest { pubkey: bls_pk, object_root }) => { - if !signing_manager.has_proxy_bls_for_module(&bls_pk, &module_id) { - return Err(SignerModuleError::UnknownProxySigner(bls_pk.to_vec())); + let manager = state.manager.read().await; + let res = match &*manager { + SigningManager::Local(local_manager) => match request { + SignRequest::Consensus(SignConsensusRequest { object_root, pubkey }) => local_manager + .sign_consensus(&pubkey, &object_root) + .await + .map(|sig| Json(sig).into_response()), + SignRequest::ProxyBls(SignProxyRequest { object_root, pubkey: bls_key }) => { + local_manager + .sign_proxy_bls(&bls_key, &object_root) + .await + .map(|sig| Json(sig).into_response()) } - - signing_manager - .sign_proxy_bls(&bls_pk, &object_root) + SignRequest::ProxyEcdsa(SignProxyRequest { object_root, pubkey: ecdsa_key }) => { + local_manager + .sign_proxy_ecdsa(&ecdsa_key, &object_root) + .await + .map(|sig| Json(sig).into_response()) + } + }, + SigningManager::Dirk(dirk_manager) => match request { + SignRequest::Consensus(SignConsensusRequest { object_root, pubkey }) => dirk_manager + .request_consensus_signature(&pubkey, object_root) .await - .map(|sig| Json(sig).into_response()) - } - SignRequest::ProxyEcdsa(SignProxyRequest { pubkey: ecdsa_pk, object_root }) => { - if !signing_manager.has_proxy_ecdsa_for_module(&ecdsa_pk, &module_id) { - return Err(SignerModuleError::UnknownProxySigner(ecdsa_pk.to_vec())); + .map(|sig| Json(sig).into_response()), + SignRequest::ProxyBls(SignProxyRequest { object_root, pubkey: bls_key }) => { + dirk_manager + .request_proxy_signature(&bls_key, object_root) + .await + .map(|sig| Json(sig).into_response()) } + SignRequest::ProxyEcdsa(_) => { + error!( + event = "request_signature", + ?module_id, + ?req_id, + "ECDSA proxy sign request not supported with Dirk" + ); + Err(SignerModuleError::DirkNotSupported) + } + }, + }; - signing_manager - .sign_proxy_ecdsa(&ecdsa_pk, &object_root) - .await - .map(|sig| Json(sig).into_response()) - } - }?; + if let Err(err) = &res { + error!(event = "request_signature", ?module_id, ?req_id, "{err}"); + } - Ok(signature_response) + res } async fn handle_generate_proxy( @@ -194,28 +214,41 @@ async fn handle_generate_proxy( ) -> Result { let req_id = Uuid::new_v4(); - debug!(event = "generate_proxy", module_id=?module_id, ?req_id, "New request"); + debug!(event = "generate_proxy", ?module_id, scheme=?request.scheme, pubkey=%request.consensus_pubkey, ?req_id, "New request"); - let mut signing_manager = state.manager.write().await; - - let response = match request.scheme { - EncryptionScheme::Bls => { - let proxy_delegation = - signing_manager.create_proxy_bls(module_id, request.consensus_pubkey).await?; - Json(proxy_delegation).into_response() - } - EncryptionScheme::Ecdsa => { - let proxy_delegation = - signing_manager.create_proxy_ecdsa(module_id, request.consensus_pubkey).await?; - Json(proxy_delegation).into_response() - } + let mut manager = state.manager.write().await; + let res = match &mut *manager { + SigningManager::Local(local_manager) => match request.scheme { + EncryptionScheme::Bls => local_manager + .create_proxy_bls(module_id.clone(), request.consensus_pubkey) + .await + .map(|proxy_delegation| Json(proxy_delegation).into_response()), + EncryptionScheme::Ecdsa => local_manager + .create_proxy_ecdsa(module_id.clone(), request.consensus_pubkey) + .await + .map(|proxy_delegation| Json(proxy_delegation).into_response()), + }, + SigningManager::Dirk(dirk_manager) => match request.scheme { + EncryptionScheme::Bls => dirk_manager + .generate_proxy_key(&module_id, request.consensus_pubkey) + .await + .map(|proxy_delegation| Json(proxy_delegation).into_response()), + EncryptionScheme::Ecdsa => { + error!("ECDSA proxy generation not supported with Dirk"); + Err(SignerModuleError::DirkNotSupported) + } + }, }; - Ok(response) + if let Err(err) = &res { + error!(event = "generate_proxy", module_id=?module_id, ?req_id, "{err}"); + } + + res } async fn handle_reload( - State(state): State, + State(mut state): State, ) -> Result { let req_id = Uuid::new_v4(); @@ -229,7 +262,7 @@ async fn handle_reload( } }; - let new_manager = match start_manager(&config) { + let new_manager = match start_manager(config).await { Ok(manager) => manager, Err(err) => { error!(event = "reload", ?req_id, error = ?err, "Failed to reload manager"); @@ -237,12 +270,12 @@ async fn handle_reload( } }; - *state.manager.write().await = new_manager; + state.manager = Arc::new(RwLock::new(new_manager)); Ok((StatusCode::OK, "OK")) } -fn start_manager(config: &StartSignerConfig) -> eyre::Result { +async fn start_manager(config: StartSignerConfig) -> eyre::Result { let proxy_store = if let Some(store) = config.store.clone() { Some(store.init_from_env()?) } else { @@ -250,11 +283,25 @@ fn start_manager(config: &StartSignerConfig) -> eyre::Result { None }; - let mut manager = SigningManager::new(config.chain, proxy_store)?; + match config.dirk { + Some(dirk) => { + let mut manager = DirkManager::new(config.chain, dirk).await?; + if let Some(store) = config.store { + manager = manager.with_proxy_store(store.init_from_env()?)?; + } - for signer in config.loader.clone().load_keys()? { - manager.add_consensus_signer(signer); + Ok(SigningManager::Dirk(manager)) + } + None => { + let mut manager = LocalSigningManager::new(config.chain, proxy_store)?; + let Some(loader) = config.loader.clone() else { + warn!("No loader configured."); + return Err(eyre::eyre!("No loader configured")); + }; + for signer in loader.load_keys()? { + manager.add_consensus_signer(signer); + } + Ok(SigningManager::Local(manager)) + } } - - Ok(manager) } diff --git a/docs/docs/developing/environment-setup.md b/docs/docs/developing/environment-setup.md new file mode 100644 index 00000000..048b2df9 --- /dev/null +++ b/docs/docs/developing/environment-setup.md @@ -0,0 +1,10 @@ +--- +sidebar_position: 3 +--- +# Environment setup + +## Dirk signer + +In order to test Commit-Boost with a Dirk signer, you need to have a running Dirk instance. You can find a complete step-by-step guide on how to setup one in the Dirk's docs [here](https://github.com/attestantio/dirk/blob/master/docs/distributed_key_generation.md). + +If you are using a custom certificate authority, don't forget to add the CA certificate to the TOML config under `signer.dirk.ca_cert_path`. diff --git a/docs/docs/get_started/configuration.md b/docs/docs/get_started/configuration.md index 0f78b4d6..7f432bf5 100644 --- a/docs/docs/get_started/configuration.md +++ b/docs/docs/get_started/configuration.md @@ -229,15 +229,56 @@ To persist proxy keys across restarts, you must enable the proxy store in the co ### Remote signer -You might choose to use an external service to sign the transactions. For now, we support Web3Signer but we're working on adding support for additional signers. +You might choose to use an external service to sign the transactions. For now, two types of remote signers are supported: Web3Signer and Dirk. -The parameters needed for the remote signer are: +#### Web3Signer + +Web3Signer implements the same API as Commit-Boost, so there's no need to set up a Signer module. The parameters needed for the remote signer are: ```toml [signer.remote] url = "https://remote.signer.url" ``` +#### Dirk + +Dirk is a distributed key management system that can be used to sign transactions. In this case the Signer module is needed as an intermediary between the modules and Dirk. The following parameters are needed: + +```toml +[signer.dirk] +cert_path = "/path/to/client.crt" +key_path = "/path/to/client.key" +secrets_path = "/path/to/secrets" +# Optional parameters +ca_cert_path = "/path/to/ca.crt" + +# Add one entry like this for each host +[[signer.dirk.hosts]] +server_name = "localhost-1" +url = "https://localhost-1:8081" +accounts = ["SomeWallet/SomeAccount", "DistributedWallet/Account1"] + +[[signer.dirk.hosts]] +server_name = "localhost-2" +url = "https://localhost-2:8082" +accounts = ["AnotherWallet/AnotherAccount", "DistributedWallet/Account1"] +``` + +- `cert_path` and `key_path` are the paths to the client certificate and key used to authenticate with Dirk. +- `accounts` is a list of accounts that the Signer module will consider as the consensus keys. Each account has the format `/`. Accounts can be from different wallets. Generated proxy keys will have format `///`. +- `secrets_path` is the path to the folder containing the passwords of the generated proxy accounts, which will be stored in `////.pass`. + +Additionally, you can set a proxy store so that the delegation signatures for generated proxy keys are stored locally. As these signatures are not sensitive, the only supported store type is `File`: + +```toml +[signer.dirk.store] +proxy_dir = "/path/to/proxy_dir" +``` + +Delegation signatures will be stored in files with the format `/delegations//.sig`. + +A full example of a config file with Dirk can be found [here](https://github.com/Commit-Boost/commit-boost-client/blob/main/examples/configs/dirk_signer.toml). + ## Custom module We currently provide a test module that needs to be built locally. To build the module run: ```bash diff --git a/docs/docs/get_started/running/binary.md b/docs/docs/get_started/running/binary.md index 458b08de..b5c962d1 100644 --- a/docs/docs/get_started/running/binary.md +++ b/docs/docs/get_started/running/binary.md @@ -33,6 +33,12 @@ Modules need some environment variables to work correctly. - `CB_SIGNER_LOADER_FORMAT`, `CB_SIGNER_LOADER_KEYS_DIR` and `CB_SIGNER_LOADER_SECRETS_DIR`: paths to the `keys` and `secrets` directories or files (ERC-2335 style keystores, see [Signer config](../configuration/#signer-module) for more info). - For storing proxy keys we currently support: - `CB_PROXY_STORE_DIR`: directory where proxy keys and delegations will be saved in plaintext (for testing purposes only). + - `CB_PROXY_KEYS_DIR` and `CB_PROXY_SECRETS_DIR`: paths to the `keys` and `secrets` directories or files (ERC-2335 style keystores, see [Proxy keys store](../configuration/#proxy-keys-store) for more info). +- For Dirk remote signer the following envs are available (see [Dirk config](../configuration/#dirk) for more info): + - `CB_SIGNER_DIRK_CERT_FILE`: required, path to the client certificate file. + - `CB_SIGNER_DIRK_KEY_FILE`: required, path to the client key file. + - `CB_SIGNER_DIRK_SECRETS_DIR`: required, path to the secrets directory. + - `CB_SIGNER_DIRK_CA_CERT_FILE`: optional, path to the CA certificate file. ### Modules - `CB_MODULE_ID`: required, unique id of the module. diff --git a/docs/sidebars.js b/docs/sidebars.js index 4ba884f0..94725c02 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -54,6 +54,7 @@ const sidebars = { items: [ 'developing/custom-modules', 'developing/commit-module', + 'developing/environment-setup', ], }, { diff --git a/examples/builder_log/Dockerfile b/examples/builder_log/Dockerfile index 2c1353a2..c0fd69b4 100644 --- a/examples/builder_log/Dockerfile +++ b/examples/builder_log/Dockerfile @@ -10,6 +10,8 @@ COPY --from=planner /app/recipe.json recipe.json RUN cargo chef cook --release --recipe-path recipe.json +RUN apt-get update && apt-get install -y protobuf-compiler + COPY . . RUN cargo build --release --bin builder_log diff --git a/examples/configs/dirk_signer.toml b/examples/configs/dirk_signer.toml new file mode 100644 index 00000000..5dd1c9d3 --- /dev/null +++ b/examples/configs/dirk_signer.toml @@ -0,0 +1,31 @@ +chain = "Holesky" + +[pbs] +port = 18550 + +[[relays]] +url = "http://0xa119589bb33ef52acbb8116832bec2b58fca590fe5c85eac5d3230b44d5bc09fe73ccd21f88eab31d6de16194d17782e@def.xyz" + +[signer] +docker_image = "commitboost_signer" + +[signer.dirk] +cert_path = "/path/to/client.crt" +key_path = "/path/to/client.key" +secrets_path = "./dirk_secrets" +ca_cert_path = "/path/to/ca.crt" + +# Example of a single Dirk host +[[signer.dirk.hosts]] +url = "https://gateway.dirk.url" +accounts = ["wallet1/accountX", "wallet2/accountY"] + +[signer.dirk.store] +proxy_dir = "/path/to/proxies" + +[[modules]] +id = "DA_COMMIT" +type = "commit" +docker_image = "test_da_commit" +sleep_secs = 10 +use_ecdsa_keys = false diff --git a/examples/da_commit/Dockerfile b/examples/da_commit/Dockerfile index 25c88dc8..5c513848 100644 --- a/examples/da_commit/Dockerfile +++ b/examples/da_commit/Dockerfile @@ -10,6 +10,8 @@ COPY --from=planner /app/recipe.json recipe.json RUN cargo chef cook --release --recipe-path recipe.json +RUN apt-get update && apt-get install -y protobuf-compiler + COPY . . RUN cargo build --release --bin da_commit diff --git a/examples/da_commit/src/main.rs b/examples/da_commit/src/main.rs index ebcc27b2..6d4dd59c 100644 --- a/examples/da_commit/src/main.rs +++ b/examples/da_commit/src/main.rs @@ -33,6 +33,12 @@ struct DaCommitService { #[derive(Debug, Deserialize)] struct ExtraConfig { sleep_secs: u64, + #[serde(default = "default_ecdsa")] + use_ecdsa_keys: bool, +} + +fn default_ecdsa() -> bool { + true } impl DaCommitService { @@ -49,10 +55,14 @@ impl DaCommitService { info!("Obtained a BLS proxy delegation:\n{proxy_delegation_bls}"); let proxy_bls = proxy_delegation_bls.message.proxy; - let proxy_delegation_ecdsa = - self.config.signer_client.generate_proxy_key_ecdsa(pubkey).await?; - info!("Obtained an ECDSA proxy delegation:\n{proxy_delegation_ecdsa}"); - let proxy_ecdsa = proxy_delegation_ecdsa.message.proxy; + let proxy_ecdsa = if self.config.extra.use_ecdsa_keys { + let proxy_delegation_ecdsa = + self.config.signer_client.generate_proxy_key_ecdsa(pubkey).await?; + info!("Obtained an ECDSA proxy delegation:\n{proxy_delegation_ecdsa}"); + Some(proxy_delegation_ecdsa.message.proxy) + } else { + None + }; let mut data = 0; @@ -68,7 +78,7 @@ impl DaCommitService { data: u64, pubkey: BlsPublicKey, proxy_bls: BlsPublicKey, - proxy_ecdsa: EcdsaPublicKey, + proxy_ecdsa: Option, ) -> Result<()> { let datagram = Datagram { data }; @@ -79,18 +89,23 @@ impl DaCommitService { let proxy_signature_bls = self.config.signer_client.request_proxy_signature_bls(proxy_request_bls); - let proxy_request_ecdsa = SignProxyRequest::builder(proxy_ecdsa).with_msg(&datagram); - let proxy_signature_ecdsa = - self.config.signer_client.request_proxy_signature_ecdsa(proxy_request_ecdsa); + let proxy_signature_ecdsa = proxy_ecdsa.map(|proxy_ecdsa| { + let proxy_request_ecdsa = SignProxyRequest::builder(proxy_ecdsa).with_msg(&datagram); + self.config.signer_client.request_proxy_signature_ecdsa(proxy_request_ecdsa) + }); - let (signature, proxy_signature_bls, proxy_signature_ecdsa) = { - let res = tokio::join!(signature, proxy_signature_bls, proxy_signature_ecdsa); - (res.0?, res.1?, res.2?) + let (signature, proxy_signature_bls) = { + let res = tokio::join!(signature, proxy_signature_bls); + (res.0?, res.1?) }; info!("Proposer commitment (consensus): {}", signature); info!("Proposer commitment (proxy BLS): {}", proxy_signature_bls); - info!("Proposer commitment (proxy ECDSA): {}", proxy_signature_ecdsa); + + if let Some(proxy_signature_ecdsa) = proxy_signature_ecdsa { + let proxy_signature_ecdsa = proxy_signature_ecdsa.await?; + info!("Proposer commitment (proxy ECDSA): {}", proxy_signature_ecdsa); + } SIG_RECEIVED_COUNTER.inc(); diff --git a/examples/status_api/Dockerfile b/examples/status_api/Dockerfile index f6f5568f..dd20f000 100644 --- a/examples/status_api/Dockerfile +++ b/examples/status_api/Dockerfile @@ -10,6 +10,8 @@ COPY --from=planner /app/recipe.json recipe.json RUN cargo chef cook --release --recipe-path recipe.json +RUN apt-get update && apt-get install -y protobuf-compiler + COPY . . RUN cargo build --release --bin status_api diff --git a/provisioning/pbs.Dockerfile b/provisioning/pbs.Dockerfile index 95568b9d..200c95d2 100644 --- a/provisioning/pbs.Dockerfile +++ b/provisioning/pbs.Dockerfile @@ -10,6 +10,8 @@ COPY --from=planner /app/recipe.json recipe.json RUN cargo chef cook --release --recipe-path recipe.json +RUN apt-get update && apt-get install -y protobuf-compiler + COPY . . RUN cargo build --release --bin commit-boost-pbs diff --git a/provisioning/signer.Dockerfile b/provisioning/signer.Dockerfile index 51c192af..85c2be43 100644 --- a/provisioning/signer.Dockerfile +++ b/provisioning/signer.Dockerfile @@ -10,6 +10,8 @@ COPY --from=planner /app/recipe.json recipe.json RUN cargo chef cook --release --recipe-path recipe.json +RUN apt-get update && apt-get install -y protobuf-compiler + COPY . . RUN cargo build --release --bin commit-boost-signer