From 575a35c6a15e3c36736d633384f1b5d686d1663d Mon Sep 17 00:00:00 2001 From: Valery Klachkov Date: Wed, 10 Sep 2025 11:59:45 +0200 Subject: [PATCH 1/8] Remove jsonrpsee and add reqwest --- Cargo.lock | 1605 +++++++++++++++++++++----------- crates/chainql-core/Cargo.toml | 28 +- 2 files changed, 1070 insertions(+), 563 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 83394d1..67ca084 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -146,9 +146,9 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb00293ba84f51ce3bd026bd0de55899c4e68f0a39a5728cebae3a73ffdc0a4f" dependencies = [ - "ark-ec", - "ark-ff", - "ark-std", + "ark-ec 0.4.2", + "ark-ff 0.4.2", + "ark-std 0.4.0", ] [[package]] @@ -157,10 +157,22 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c775f0d12169cba7aae4caeb547bb6a50781c7449a8aa53793827c9ec4abf488" dependencies = [ - "ark-ec", - "ark-ff", - "ark-serialize", - "ark-std", + "ark-ec 0.4.2", + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", +] + +[[package]] +name = "ark-bls12-381" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3df4dcc01ff89867cd86b0da835f23c3f02738353aaee7dde7495af71363b8d5" +dependencies = [ + "ark-ec 0.5.0", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", ] [[package]] @@ -169,10 +181,10 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" dependencies = [ - "ark-ff", - "ark-poly", - "ark-serialize", - "ark-std", + "ark-ff 0.4.2", + "ark-poly 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", "derivative", "hashbrown 0.13.2", "itertools 0.10.5", @@ -180,16 +192,49 @@ dependencies = [ "zeroize", ] +[[package]] +name = "ark-ec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d68f2d516162846c1238e755a7c4d131b892b70cc70c471a8e3ca3ed818fce" +dependencies = [ + "ahash", + "ark-ff 0.5.0", + "ark-poly 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "educe", + "fnv", + "hashbrown 0.15.5", + "itertools 0.13.0", + "num-bigint", + "num-integer", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ed-on-bls12-381-bandersnatch" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1786b2e3832f6f0f7c8d62d5d5a282f6952a1ab99981c54cd52b6ac1d8f02df5" +dependencies = [ + "ark-bls12-381 0.5.0", + "ark-ec 0.5.0", + "ark-ff 0.5.0", + "ark-std 0.5.0", +] + [[package]] name = "ark-ff" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" dependencies = [ - "ark-ff-asm", - "ark-ff-macros", - "ark-serialize", - "ark-std", + "ark-ff-asm 0.4.2", + "ark-ff-macros 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", "derivative", "digest 0.10.7", "itertools 0.10.5", @@ -200,6 +245,26 @@ dependencies = [ "zeroize", ] +[[package]] +name = "ark-ff" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a177aba0ed1e0fbb62aa9f6d0502e9b46dad8c2eab04c14258a1212d2557ea70" +dependencies = [ + "ark-ff-asm 0.5.0", + "ark-ff-macros 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "arrayvec", + "digest 0.10.7", + "educe", + "itertools 0.13.0", + "num-bigint", + "num-traits", + "paste", + "zeroize", +] + [[package]] name = "ark-ff-asm" version = "0.4.2" @@ -210,6 +275,16 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "ark-ff-asm" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" +dependencies = [ + "quote", + "syn 2.0.106", +] + [[package]] name = "ark-ff-macros" version = "0.4.2" @@ -223,27 +298,68 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "ark-ff-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "ark-poly" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" dependencies = [ - "ark-ff", - "ark-serialize", - "ark-std", + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", "derivative", "hashbrown 0.13.2", ] +[[package]] +name = "ark-poly" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "579305839da207f02b89cd1679e50e67b4331e2f9294a57693e5051b7703fe27" +dependencies = [ + "ahash", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "educe", + "fnv", + "hashbrown 0.15.5", +] + [[package]] name = "ark-serialize" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" dependencies = [ - "ark-serialize-derive", - "ark-std", + "ark-serialize-derive 0.4.2", + "ark-std 0.4.0", + "digest 0.10.7", + "num-bigint", +] + +[[package]] +name = "ark-serialize" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" +dependencies = [ + "ark-serialize-derive 0.5.0", + "ark-std 0.5.0", + "arrayvec", "digest 0.10.7", "num-bigint", ] @@ -259,6 +375,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "ark-serialize-derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "ark-std" version = "0.4.0" @@ -269,6 +396,49 @@ dependencies = [ "rand", ] +[[package]] +name = "ark-std" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" +dependencies = [ + "num-traits", + "rand", +] + +[[package]] +name = "ark-transcript" +version = "0.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47c1c928edb9d8ff24cb5dcb7651d3a98494fff3099eee95c2404cd813a9139f" +dependencies = [ + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "digest 0.10.7", + "rand_core", + "sha3", +] + +[[package]] +name = "ark-vrf" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9501da18569b2afe0eb934fb7afd5a247d238b94116155af4dd068f319adfe6d" +dependencies = [ + "ark-bls12-381 0.5.0", + "ark-ec 0.5.0", + "ark-ed-on-bls12-381-bandersnatch", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "digest 0.10.7", + "rand_chacha", + "sha2 0.10.9", + "w3f-ring-proof", + "zeroize", +] + [[package]] name = "array-bytes" version = "6.2.3" @@ -288,15 +458,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] -name = "async-trait" -version = "0.1.89" +name = "atomic-waker" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" @@ -387,9 +552,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.2" +version = "2.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a65b545ab31d687cff52899d4890855fec459eb6afe0da6417b8a18da87aa29" +checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" [[package]] name = "bitvec" @@ -443,10 +608,11 @@ dependencies = [ [[package]] name = "bounded-collections" -version = "0.2.4" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ad8a0bed7827f0b07a5d23cec2e58cc02038a99e4ca81616cb2bb2025f804d" +checksum = "dee8eddd066a8825ec5570528e6880471210fd5d88cb6abbe1cfdd51ca249c33" dependencies = [ + "jam-codec", "log", "parity-scale-codec", "scale-info", @@ -488,21 +654,16 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cc" -version = "1.2.33" +version = "1.2.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ee0f8803222ba5a7e2777dd72ca451868909b1ac410621b676adf07280e9b5f" +checksum = "5252b3d2648e5eedbc1a6f501e3c795e07025c1e93bbf8bbdd6eef7f447a6d54" dependencies = [ + "find-msvc-tools", "jobserver", "libc", "shlex", ] -[[package]] -name = "cesu8" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" - [[package]] name = "cfg-if" version = "1.0.3" @@ -530,16 +691,14 @@ dependencies = [ "directories", "futures", "hex", - "http", - "hyper", "jrsonnet-evaluator", "jrsonnet-gcmodule", - "jsonrpsee", "libsecp256k1", "num-bigint", "num-traits", "parity-scale-codec", "peg", + "reqwest", "sc-executor", "scale-info", "serde", @@ -548,7 +707,7 @@ dependencies = [ "sp-io", "sp-runtime", "sp-state-machine", - "thiserror 1.0.69", + "thiserror 2.0.16", "tokio", ] @@ -564,9 +723,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.45" +version = "4.5.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fc0e74a703892159f5ae7d3aac52c8e6c392f5ae5f359c70b5881d60aaac318" +checksum = "7eac00902d9d136acd712710d71823fb8ac8004ca445a89e73a41d45aa712931" dependencies = [ "clap_builder", "clap_derive", @@ -574,9 +733,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.44" +version = "4.5.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3e7f4214277f3c7aa526a59dd3fbe306a370daee1f8b7b8c987069cd8e888a8" +checksum = "2ad9bbf750e73b5884fb8a211a9424a1906c1e156724260fdae972f31d70e1d6" dependencies = [ "anstream", "anstyle", @@ -586,9 +745,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.45" +version = "4.5.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14cb31bb0a7d536caef2639baa7fad459e15c3144efefa6dbd1c84562c4739f6" +checksum = "bbfd7eae0b0f1a6e63d4b13c9c478de77c2eb546fba158ad50b4203dc24b9f9c" dependencies = [ "heck", "proc-macro2", @@ -608,16 +767,6 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" -[[package]] -name = "combine" -version = "4.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" -dependencies = [ - "bytes", - "memchr", -] - [[package]] name = "common-path" version = "1.0.0" @@ -658,9 +807,9 @@ checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" [[package]] name = "core-foundation" -version = "0.10.1" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", @@ -863,9 +1012,9 @@ dependencies = [ [[package]] name = "cumulus-primitives-proof-size-hostfunction" -version = "0.11.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e89a46c3a18f3e0b38a308d30a4252516e3a6d41f95071562b68d94e9964ee3" +checksum = "e2c902e7e33f9510b5354b54a68261694da6f37e70c20b3f115f7319da4644a2" dependencies = [ "sp-externalities", "sp-runtime-interface", @@ -912,9 +1061,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.4.0" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +checksum = "d630bccd429a5bb5a64b5e94f693bfc48c9f8566418fda4c494cc94f911f87cc" dependencies = [ "powerfmt", ] @@ -1010,7 +1159,7 @@ dependencies = [ "libc", "option-ext", "redox_users 0.5.2", - "windows-sys 0.60.2", + "windows-sys 0.61.0", ] [[package]] @@ -1062,27 +1211,6 @@ dependencies = [ "walkdir", ] -[[package]] -name = "dyn-clonable" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a36efbb9bfd58e1723780aa04b61aba95ace6a05d9ffabfdb0b43672552f0805" -dependencies = [ - "dyn-clonable-impl", - "dyn-clone", -] - -[[package]] -name = "dyn-clonable-impl" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8671d54058979a37a26f3511fbf8d198ba1aa35ffb202c42587d918d77213a" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] - [[package]] name = "dyn-clone" version = "1.0.20" @@ -1144,6 +1272,18 @@ dependencies = [ "zeroize", ] +[[package]] +name = "educe" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" +dependencies = [ + "enum-ordinalize", + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "either" version = "1.15.0" @@ -1170,6 +1310,35 @@ dependencies = [ "zeroize", ] +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "enum-ordinalize" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea0dcfa4e54eeb516fe454635a95753ddd39acda650ce703031c6973e315dd5" +dependencies = [ + "enum-ordinalize-derive", +] + +[[package]] +name = "enum-ordinalize-derive" +version = "4.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "env_logger" version = "0.10.2" @@ -1197,12 +1366,12 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.0", ] [[package]] @@ -1226,6 +1395,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + [[package]] name = "ff" version = "0.13.1" @@ -1262,6 +1437,12 @@ dependencies = [ "log", ] +[[package]] +name = "find-msvc-tools" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fd99930f64d146689264c637b5af2f0233a933bef0d8570e2526bf9e083192d" + [[package]] name = "fixed-hash" version = "0.8.0" @@ -1286,6 +1467,21 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "form_urlencoded" version = "1.2.2" @@ -1297,9 +1493,9 @@ dependencies = [ [[package]] name = "frame-metadata" -version = "18.0.0" +version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daaf440c68eb2c3d88e5760fe8c7af3f9fee9181fab6c2f2c4e7cc48dcc40bb8" +checksum = "d8c26fcb0454397c522c05fdad5380c4e622f8a875638af33bff5a320d1fc965" dependencies = [ "cfg-if", "parity-scale-codec", @@ -1394,12 +1590,6 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" -[[package]] -name = "futures-timer" -version = "3.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" - [[package]] name = "futures-util" version = "0.3.31" @@ -1458,7 +1648,7 @@ dependencies = [ "cfg-if", "libc", "r-efi", - "wasi 0.14.2+wasi-0.2.4", + "wasi 0.14.5+wasi-0.2.4", ] [[package]] @@ -1499,6 +1689,25 @@ dependencies = [ "subtle", ] +[[package]] +name = "h2" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap 2.11.1", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "hash-db" version = "0.16.0" @@ -1644,12 +1853,31 @@ dependencies = [ "http", ] +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + [[package]] name = "httparse" version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + [[package]] name = "humantime" version = "2.2.0" @@ -1662,24 +1890,93 @@ version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" dependencies = [ + "atomic-waker", "bytes", + "futures-channel", + "futures-core", + "h2", "http", "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", "tokio", + "want", ] [[package]] -name = "icu_collections" -version = "2.0.0" +name = "hyper-rustls" +version = "0.27.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ - "displaydoc", - "potential_utf", - "yoke", - "zerofrom", - "zerovec", -] + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "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", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "system-configuration", + "tokio", + "tower-service", + "tracing", + "windows-registry", +] + +[[package]] +name = "icu_collections" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] [[package]] name = "icu_locale_core" @@ -1828,9 +2125,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.10.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" +checksum = "206a8042aec68fa4a62e8d3f7aa4ceb508177d9324faf261e1959e495b7a1921" dependencies = [ "equivalent", "hashbrown 0.15.5", @@ -1858,15 +2155,31 @@ dependencies = [ [[package]] name = "io-uring" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" +checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" dependencies = [ - "bitflags 2.9.2", + "bitflags 2.9.4", "cfg-if", "libc", ] +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "iri-string" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "is-terminal" version = "0.4.16" @@ -1902,6 +2215,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.15" @@ -1909,32 +2231,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] -name = "jni" -version = "0.21.1" +name = "jam-codec" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +checksum = "cb948eace373d99de60501a02fb17125d30ac632570de20dccc74370cdd611b9" dependencies = [ - "cesu8", - "cfg-if", - "combine", - "jni-sys", - "log", - "thiserror 1.0.69", - "walkdir", - "windows-sys 0.45.0", + "arrayvec", + "bitvec", + "byte-slice-cast", + "const_format", + "impl-trait-for-tuples", + "jam-codec-derive", + "rustversion", + "serde", ] [[package]] -name = "jni-sys" -version = "0.3.0" +name = "jam-codec-derive" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" +checksum = "319af585c4c8a6b5552a52b7787a1ab3e4d59df7614190b1f85b9b842488789d" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.106", +] [[package]] name = "jobserver" -version = "0.1.33" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ "getrandom 0.3.3", "libc", @@ -1969,7 +2297,7 @@ dependencies = [ "jrsonnet-types", "num-bigint", "pathdiff", - "rustc-hash 1.1.0", + "rustc-hash", "serde", "stacker", "static_assertions", @@ -2005,7 +2333,7 @@ checksum = "829e3aac0a8b54b2beec0cd8a79ff1622f3eb5679eea20ce89506c45d81bf294" dependencies = [ "hashbrown 0.14.5", "jrsonnet-gcmodule", - "rustc-hash 1.1.0", + "rustc-hash", ] [[package]] @@ -2064,97 +2392,13 @@ dependencies = [ ] [[package]] -name = "jsonrpsee" -version = "0.24.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37b26c20e2178756451cfeb0661fb74c47dd5988cb7e3939de7e9241fd604d42" -dependencies = [ - "jsonrpsee-core", - "jsonrpsee-proc-macros", - "jsonrpsee-types", - "jsonrpsee-ws-client", - "tracing", -] - -[[package]] -name = "jsonrpsee-client-transport" -version = "0.24.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bacb85abf4117092455e1573625e21b8f8ef4dec8aff13361140b2dc266cdff2" -dependencies = [ - "base64 0.22.1", - "futures-util", - "http", - "jsonrpsee-core", - "pin-project", - "rustls", - "rustls-pki-types", - "rustls-platform-verifier", - "soketto", - "thiserror 1.0.69", - "tokio", - "tokio-rustls", - "tokio-util", - "tracing", - "url", -] - -[[package]] -name = "jsonrpsee-core" -version = "0.24.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456196007ca3a14db478346f58c7238028d55ee15c1df15115596e411ff27925" -dependencies = [ - "async-trait", - "futures-timer", - "futures-util", - "jsonrpsee-types", - "pin-project", - "rustc-hash 2.1.1", - "serde", - "serde_json", - "thiserror 1.0.69", - "tokio", - "tokio-stream", - "tracing", -] - -[[package]] -name = "jsonrpsee-proc-macros" -version = "0.24.9" +name = "js-sys" +version = "0.3.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e65763c942dfc9358146571911b0cd1c361c2d63e2d2305622d40d36376ca80" +checksum = "0c0b063578492ceec17683ef2f8c5e89121fbd0b172cbc280635ab7567db2738" dependencies = [ - "heck", - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "jsonrpsee-types" -version = "0.24.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08a8e70baf945b6b5752fc8eb38c918a48f1234daf11355e07106d963f860089" -dependencies = [ - "http", - "serde", - "serde_json", - "thiserror 1.0.69", -] - -[[package]] -name = "jsonrpsee-ws-client" -version = "0.24.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01b3323d890aa384f12148e8d2a1fd18eb66e9e7e825f9de4fa53bcc19b93eef" -dependencies = [ - "http", - "jsonrpsee-client-transport", - "jsonrpsee-core", - "jsonrpsee-types", - "url", + "once_cell", + "wasm-bindgen", ] [[package]] @@ -2198,7 +2442,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3" dependencies = [ - "bitflags 2.9.2", + "bitflags 2.9.4", "libc", ] @@ -2264,9 +2508,9 @@ checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" [[package]] name = "linux-raw-sys" -version = "0.4.15" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" [[package]] name = "litemap" @@ -2286,9 +2530,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.27" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] name = "mach" @@ -2301,11 +2545,11 @@ dependencies = [ [[package]] name = "matchers" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" dependencies = [ - "regex-automata 0.1.10", + "regex-automata", ] [[package]] @@ -2322,11 +2566,11 @@ checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" [[package]] name = "memfd" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2cffa4ad52c6f791f4f8b15f0c05f9824b2ced1160e88cc393d64fff9a8ac64" +checksum = "ad38eb12aea514a0466ea40a80fd8cc83637065948eb4a426e4aa46261175227" dependencies = [ - "rustix 0.38.44", + "rustix 1.1.2", ] [[package]] @@ -2340,11 +2584,13 @@ dependencies = [ [[package]] name = "memory-db" -version = "0.32.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "808b50db46293432a45e63bc15ea51e0ab4c0a1647b8eb114e31a3e698dd6fbe" +checksum = "7e300c54e3239a86f9c61cc63ab0f03862eb40b1c6e065dc6fd6ceaeff6da93d" dependencies = [ + "foldhash", "hash-db", + "hashbrown 0.15.5", ] [[package]] @@ -2359,6 +2605,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + [[package]] name = "miniz_oxide" version = "0.8.9" @@ -2379,6 +2631,23 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "native-tls" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + [[package]] name = "nohash-hasher" version = "0.2.0" @@ -2387,12 +2656,11 @@ checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" [[package]] name = "nu-ansi-term" -version = "0.46.0" +version = "0.50.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" dependencies = [ - "overload", - "winapi", + "windows-sys 0.52.0", ] [[package]] @@ -2489,6 +2757,32 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" +[[package]] +name = "openssl" +version = "0.10.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" +dependencies = [ + "bitflags 2.9.4", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "openssl-probe" version = "0.1.6" @@ -2496,16 +2790,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] -name = "option-ext" -version = "0.2.0" +name = "openssl-sys" +version = "0.9.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" +checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] [[package]] -name = "overload" -version = "0.1.1" +name = "option-ext" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] name = "parity-bip39" @@ -2653,26 +2953,6 @@ version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" -[[package]] -name = "pin-project" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] - [[package]] name = "pin-project-lite" version = "0.2.16" @@ -2703,114 +2983,78 @@ checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "polkavm" -version = "0.9.3" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a3693e5efdb2bf74e449cd25fd777a28bd7ed87e41f5d5da75eb31b4de48b94" +checksum = "fa028f713d0613f0f08b8b3367402cb859218854f6b96fcbe39a501862894d6f" dependencies = [ "libc", "log", "polkavm-assembler", - "polkavm-common 0.9.0", + "polkavm-common", "polkavm-linux-raw", ] [[package]] name = "polkavm-assembler" -version = "0.9.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa96d6d868243acc12de813dd48e756cbadcc8e13964c70d272753266deadc1" +checksum = "4859a29e1f4ad64610c4bc2bfc40bb9a535068a034933a5b56b5e7a0febf105a" dependencies = [ "log", ] [[package]] name = "polkavm-common" -version = "0.9.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d9428a5cfcc85c5d7b9fc4b6a18c4b802d0173d768182a51cc7751640f08b92" +checksum = "49a5794b695626ba70d29e66e3f4f4835767452a6723f3a0bc20884b07088fe8" dependencies = [ "log", -] - -[[package]] -name = "polkavm-common" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31ff33982a807d8567645d4784b9b5d7ab87bcb494f534a57cadd9012688e102" - -[[package]] -name = "polkavm-derive" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae8c4bea6f3e11cd89bb18bcdddac10bd9a24015399bd1c485ad68a985a19606" -dependencies = [ - "polkavm-derive-impl-macro 0.9.0", + "polkavm-assembler", ] [[package]] name = "polkavm-derive" -version = "0.18.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2eb703f3b6404c13228402e98a5eae063fd16b8f58afe334073ec105ee4117e" +checksum = "95282a203ae1f6828a04ff334145c3f6dc718bba6d3959805d273358b45eab93" dependencies = [ - "polkavm-derive-impl-macro 0.18.0", + "polkavm-derive-impl-macro", ] [[package]] name = "polkavm-derive-impl" -version = "0.9.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c4fdfc49717fb9a196e74a5d28e0bc764eb394a2c803eb11133a31ac996c60c" +checksum = "6069dc7995cde6e612b868a02ce48b54397c6d2582bd1b97b63aabbe962cd779" dependencies = [ - "polkavm-common 0.9.0", + "polkavm-common", "proc-macro2", "quote", "syn 2.0.106", ] -[[package]] -name = "polkavm-derive-impl" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f2116a92e6e96220a398930f4c8a6cda1264206f3e2034fc9982bfd93f261f7" -dependencies = [ - "polkavm-common 0.18.0", - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "polkavm-derive-impl-macro" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ba81f7b5faac81e528eb6158a6f3c9e0bb1008e0ffa19653bc8dea925ecb429" -dependencies = [ - "polkavm-derive-impl 0.9.0", - "syn 2.0.106", -] - [[package]] name = "polkavm-derive-impl-macro" -version = "0.18.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c16669ddc7433e34c1007d31080b80901e3e8e523cb9d4b441c3910cf9294b" +checksum = "581d34cafec741dc5ffafbb341933c205b6457f3d76257a9d99fb56687219c91" dependencies = [ - "polkavm-derive-impl 0.18.1", + "polkavm-derive-impl", "syn 2.0.106", ] [[package]] name = "polkavm-linux-raw" -version = "0.9.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26e85d3456948e650dff0cfc85603915847faf893ed1e66b020bb82ef4557120" +checksum = "28919f542476f4158cc71e6c072b1051f38f4b514253594ac3ad80e3c0211fc8" [[package]] name = "potential_utf" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" dependencies = [ "zerovec", ] @@ -2883,6 +3127,20 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "prometheus" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d33c28a30771f7f96db69893f78b857f7450d7e0237e9c8fc6427a81bae7ed1" +dependencies = [ + "cfg-if", + "fnv", + "lazy_static", + "memchr", + "parking_lot", + "thiserror 1.0.69", +] + [[package]] name = "psm" version = "0.1.26" @@ -2987,7 +3245,7 @@ version = "0.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" dependencies = [ - "bitflags 2.9.2", + "bitflags 2.9.4", ] [[package]] @@ -3046,47 +3304,72 @@ dependencies = [ [[package]] name = "regex" -version = "1.11.1" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.9", - "regex-syntax 0.8.5", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", + "regex-automata", + "regex-syntax", ] [[package]] name = "regex-automata" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.5", + "regex-syntax", ] [[package]] name = "regex-syntax" -version = "0.6.29" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" +checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" [[package]] -name = "regex-syntax" -version = "0.8.5" +name = "reqwest" +version = "0.12.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" +dependencies = [ + "base64 0.22.1", + "bytes", + "encoding_rs", + "futures-core", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-tls", + "hyper-util", + "js-sys", + "log", + "mime", + "native-tls", + "percent-encoding", + "pin-project-lite", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-native-tls", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] [[package]] name = "rfc6979" @@ -3124,12 +3407,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" -[[package]] -name = "rustc-hash" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" - [[package]] name = "rustc-hex" version = "2.1.0" @@ -3161,15 +3438,15 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.44" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" dependencies = [ - "bitflags 2.9.2", + "bitflags 2.9.4", "errno", "libc", - "linux-raw-sys 0.4.15", - "windows-sys 0.59.0", + "linux-raw-sys 0.11.0", + "windows-sys 0.61.0", ] [[package]] @@ -3178,9 +3455,7 @@ version = "0.23.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" dependencies = [ - "log", "once_cell", - "ring", "rustls-pki-types", "rustls-webpki", "subtle", @@ -3188,52 +3463,13 @@ dependencies = [ ] [[package]] -name = "rustls-native-certs" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" -dependencies = [ - "openssl-probe", - "rustls-pki-types", - "schannel", - "security-framework", -] - -[[package]] -name = "rustls-pki-types" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" -dependencies = [ - "zeroize", -] - -[[package]] -name = "rustls-platform-verifier" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19787cda76408ec5404443dc8b31795c87cd8fec49762dc75fa727740d34acc1" -dependencies = [ - "core-foundation", - "core-foundation-sys", - "jni", - "log", - "once_cell", - "rustls", - "rustls-native-certs", - "rustls-platform-verifier-android", - "rustls-webpki", - "security-framework", - "security-framework-sys", - "webpki-root-certs 0.26.11", - "windows-sys 0.59.0", -] - -[[package]] -name = "rustls-platform-verifier-android" -version = "0.1.1" +name = "rustls-pki-types" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +dependencies = [ + "zeroize", +] [[package]] name = "rustls-webpki" @@ -3269,9 +3505,9 @@ dependencies = [ [[package]] name = "sc-allocator" -version = "30.0.0" +version = "33.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a63e577eb150187ddd444a0a6f01e1ece0a5cfc592aacb4204d9f79bdc5265d" +checksum = "7329ce3b230fd59149df2743291a2e1f58ea769eb87e2678ea11e00d118b7cc0" dependencies = [ "log", "sp-core", @@ -3281,9 +3517,9 @@ dependencies = [ [[package]] name = "sc-executor" -version = "0.41.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b450573fc0ca024bdcb6d508d61c104f862519ca7f78c416bd8042c9db32975" +checksum = "9208cad4fa8142858cd02237205a9792d2819f7c0563d2b28d7bbf2d12dd430a" dependencies = [ "parity-scale-codec", "parking_lot", @@ -3305,9 +3541,9 @@ dependencies = [ [[package]] name = "sc-executor-common" -version = "0.36.0" +version = "0.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27f5d872331b68ed4601488100f22e8aa16331de006b51d4c69353930c568a16" +checksum = "c88ba9c113644a21ce48cfecd8f2c99a34a1b3f8a869fb91c0e6a5c72c3a7ac8" dependencies = [ "polkavm", "sc-allocator", @@ -3319,9 +3555,9 @@ dependencies = [ [[package]] name = "sc-executor-polkavm" -version = "0.33.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16c4b3532c0f6dae1fcbe85f4582618042aefb9c8e2a03f855d298f56362daaa" +checksum = "62d4405eff470c6b20e883bc6e7ad855130ac5c99ada0f2265191e21caa2fd85" dependencies = [ "log", "polkavm", @@ -3331,13 +3567,11 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" -version = "0.36.0" +version = "0.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d04b8d98a96a83b56eeb1061cd4a7a1949b7c2c147d572d309c4e4d5c0d870f" +checksum = "250e3469323c427bcf4402909731c07f71e93d3314ffdbbe57c683e8c9349615" dependencies = [ "anyhow", - "cfg-if", - "libc", "log", "parking_lot", "rustix 0.36.17", @@ -3376,11 +3610,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.0", ] [[package]] @@ -3463,11 +3697,11 @@ dependencies = [ [[package]] name = "security-framework" -version = "3.3.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80fb1d92c5028aa318b4b8bd7302a5bfcf48be96a37fc6fc790f806b0004ee0c" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.9.2", + "bitflags 2.9.4", "core-foundation", "core-foundation-sys", "libc", @@ -3476,9 +3710,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.14.0" +version = "2.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" dependencies = [ "core-foundation-sys", "libc", @@ -3540,6 +3774,18 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + [[package]] name = "serde_yaml_with_quirks" version = "0.8.24" @@ -3666,26 +3912,11 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "soketto" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e859df029d160cb88608f5d7df7fb4753fd20fdfb4de5644f3d8b8440841721" -dependencies = [ - "base64 0.22.1", - "bytes", - "futures", - "httparse", - "log", - "rand", - "sha1", -] - [[package]] name = "sp-api" -version = "35.0.0" +version = "38.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7538a61120585b0e1e89d9de57448732ea4d3f9d175cab882b3c86e9809612a0" +checksum = "1d91062b6183f20a6c5fb02d055eeacb4791c8ad32fa1d280c75c0b29aa74acf" dependencies = [ "docify", "hash-db", @@ -3706,9 +3937,9 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" -version = "21.0.2" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1b4dc9405403cef6bf181dba43bfd157f8900a8169e9975ece77be54491dad8" +checksum = "8124c25cffbde85d2ef5978fa710bb900d89c368821e04d59040788a0ece3e25" dependencies = [ "Inflector", "blake2", @@ -3721,9 +3952,9 @@ dependencies = [ [[package]] name = "sp-application-crypto" -version = "39.0.0" +version = "42.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f6850bd745fe9c0a200a8e729a82c8036250e1ad1ef24ed7498b2289935c974" +checksum = "5fb8f2382e7b06f3754d66d781bb57021e415715b48a3a65ea452f9ca7e13ec8" dependencies = [ "parity-scale-codec", "scale-info", @@ -3734,9 +3965,9 @@ dependencies = [ [[package]] name = "sp-arithmetic" -version = "26.1.0" +version = "28.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9971b30935cea3858664965039dabd80f67aca74cc6cc6dd42ff1ab14547bc53" +checksum = "c5f4755af7cc57f4a2a830e134b403fc832caa5d93dacb970ffc7ac717f38c40" dependencies = [ "docify", "integer-sqrt", @@ -3749,16 +3980,17 @@ dependencies = [ [[package]] name = "sp-core" -version = "35.0.0" +version = "38.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4532774405a712a366a98080cbb4daa28c38ddff0ec595902ad6ee6a78a809f8" +checksum = "9eb651e016aa5556f5401596d764566240fe44f7a989dc46ebdefa684e9aeaaa" dependencies = [ + "ark-vrf", "array-bytes", "bitflags 1.3.2", "blake2", "bounded-collections", "bs58", - "dyn-clonable", + "dyn-clone", "ed25519-zebra", "futures", "hash-db", @@ -3780,6 +4012,7 @@ dependencies = [ "secp256k1", "secrecy", "serde", + "sha2 0.10.9", "sp-crypto-hashing", "sp-debug-derive", "sp-externalities", @@ -3843,9 +4076,9 @@ dependencies = [ [[package]] name = "sp-io" -version = "39.0.1" +version = "42.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "594a1c12ec7a1514caa878c2370902d116e6d7606a449c805bc91a4e62ef1ecf" +checksum = "6d0f8eb3f6c8824549b9482d71516324cf6e2fd650fcc0845d7a4080233898da" dependencies = [ "bytes", "docify", @@ -3853,7 +4086,7 @@ dependencies = [ "libsecp256k1", "log", "parity-scale-codec", - "polkavm-derive 0.9.1", + "polkavm-derive", "rustversion", "secp256k1", "sp-core", @@ -3870,9 +4103,9 @@ dependencies = [ [[package]] name = "sp-keystore" -version = "0.41.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1d41475fcdf253f9f0da839564c1b7f8a95c6a293ddfffd6e48e3671e76f33b" +checksum = "f63da3f73c67601452dde155804233f76e993802d4b106e33ae7d88577f46b6a" dependencies = [ "parity-scale-codec", "parking_lot", @@ -3892,9 +4125,9 @@ dependencies = [ [[package]] name = "sp-metadata-ir" -version = "0.8.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "427be4e8e6a33cb8ffc8c91f8834b9c6f563daf246e8f0da16e9e0db3db55f5a" +checksum = "1464c9e76f97c80a8dbccfe3f9fd4be0f25d0cc372efcf8fdf8791619b0998b9" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -3913,9 +4146,9 @@ dependencies = [ [[package]] name = "sp-runtime" -version = "40.1.0" +version = "43.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d1356c519f12de28847f57638490b298b0bb35d7df032c6b2948c8a9a168abe" +checksum = "3992bd6026675946f12fc3c891c863f017a01449a5a15d07656ea1b6503f3ba2" dependencies = [ "binary-merkle-tree", "docify", @@ -3943,14 +4176,14 @@ dependencies = [ [[package]] name = "sp-runtime-interface" -version = "29.0.1" +version = "31.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e99db36a7aff44c335f5d5b36c182a3e0cac61de2fefbe2eeac6af5fb13f63bf" +checksum = "b4820882d8e6e764b98efaeed3a431aa9a0d1738c4adf935fbb4c50113288073" dependencies = [ "bytes", "impl-trait-for-tuples", "parity-scale-codec", - "polkavm-derive 0.18.0", + "polkavm-derive", "primitive-types", "sp-externalities", "sp-runtime-interface-proc-macro", @@ -3963,9 +4196,9 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" -version = "18.0.0" +version = "20.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0195f32c628fee3ce1dfbbf2e7e52a30ea85f3589da9fe62a8b816d70fc06294" +checksum = "04178084ae654b3924934a56943ee73e3562db4d277e948393561b08c3b5b5fe" dependencies = [ "Inflector", "expander", @@ -3977,9 +4210,9 @@ dependencies = [ [[package]] name = "sp-state-machine" -version = "0.44.0" +version = "0.47.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bce4ee5ee6c614994077e6e317270eab6fde2bc346b028290286cbf9d0011b7e" +checksum = "eaa59c3fdf73700dd3e9dcce503fb15c3ef59dfed3ed34f0eec78d8f5b5d1c45" dependencies = [ "hash-db", "log", @@ -4017,11 +4250,12 @@ dependencies = [ [[package]] name = "sp-tracing" -version = "17.1.0" +version = "18.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6147a5b8c98b9ed4bf99dc033fab97a468b4645515460974c8784daeb7c35433" +checksum = "b7fa3a9161173fa99b4455afc52811eb8251e90ca37a2cbebb8be9c47dc55c00" dependencies = [ "parity-scale-codec", + "regex", "tracing", "tracing-core", "tracing-subscriber", @@ -4029,12 +4263,14 @@ dependencies = [ [[package]] name = "sp-trie" -version = "38.0.0" +version = "41.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1851c4929ae88932c6bcdb9e60f4063e478ca612012af3b6d365c7dc9c591f7f" +checksum = "c17205dd7df84be66e55a136b5d80dfb6c23806376c0ef5e847ea9344c0478cf" dependencies = [ "ahash", + "foldhash", "hash-db", + "hashbrown 0.15.5", "memory-db", "nohash-hasher", "parity-scale-codec", @@ -4044,6 +4280,7 @@ dependencies = [ "schnellru", "sp-core", "sp-externalities", + "substrate-prometheus-endpoint", "thiserror 1.0.69", "tracing", "trie-db", @@ -4052,9 +4289,9 @@ dependencies = [ [[package]] name = "sp-version" -version = "38.0.0" +version = "41.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b7561e88742bc47b2f5fbdcab77a1cd98cf04117a3e163c1aadd58b9a592a18" +checksum = "4e0d7b57b6577ddab5b363c2d6e9d49609749e041ee50e7232ecb413bc1cfa3f" dependencies = [ "impl-serde", "parity-scale-codec", @@ -4083,9 +4320,9 @@ dependencies = [ [[package]] name = "sp-wasm-interface" -version = "21.0.1" +version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b066baa6d57951600b14ffe1243f54c47f9c23dd89c262e17ca00ae8dca58be9" +checksum = "568979072b49384ef6bbaa5aa1306a91f0b983a4b22c8ef515b601748683b97c" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -4096,9 +4333,9 @@ dependencies = [ [[package]] name = "sp-weights" -version = "31.1.0" +version = "33.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "515aa194eabac059041df2dbee75b059b99981213ec680e9de85b45b6988346a" +checksum = "cae0642af5f2dd0b1cddcd06f91c36f7abe0528713e97b6e3c36faf0b8229114" dependencies = [ "bounded-collections", "parity-scale-codec", @@ -4178,6 +4415,21 @@ dependencies = [ "zeroize", ] +[[package]] +name = "substrate-prometheus-endpoint" +version = "0.17.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d23e4bc8e910a312820d589047ab683928b761242dbe31dee081fbdb37cbe0be" +dependencies = [ + "http-body-util", + "hyper", + "hyper-util", + "log", + "prometheus", + "thiserror 1.0.69", + "tokio", +] + [[package]] name = "subtle" version = "2.6.1" @@ -4217,6 +4469,15 @@ dependencies = [ "syn 2.0.106", ] +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + [[package]] name = "synstructure" version = "0.13.2" @@ -4228,6 +4489,27 @@ dependencies = [ "syn 2.0.106", ] +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags 2.9.4", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "tap" version = "1.0.1" @@ -4240,6 +4522,19 @@ version = "0.12.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" +[[package]] +name = "tempfile" +version = "3.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84fa4d11fadde498443cca10fd3ac23c951f0dc59e080e9f4b93d4df4e4eea53" +dependencies = [ + "fastrand", + "getrandom 0.3.3", + "once_cell", + "rustix 1.1.2", + "windows-sys 0.61.0", +] + [[package]] name = "termcolor" version = "1.4.1" @@ -4300,12 +4595,11 @@ dependencies = [ [[package]] name = "time" -version = "0.3.41" +version = "0.3.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +checksum = "83bde6f1ec10e72d583d91623c939f623002284ef622b87de38cfd546cbf2031" dependencies = [ "deranged", - "itoa", "num-conv", "powerfmt", "serde", @@ -4315,15 +4609,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" [[package]] name = "time-macros" -version = "0.2.22" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" dependencies = [ "num-conv", "time-core", @@ -4361,25 +4655,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" dependencies = [ "backtrace", + "bytes", "io-uring", "libc", "mio", + "parking_lot", "pin-project-lite", "slab", "socket2", - "tokio-macros", "windows-sys 0.59.0", ] [[package]] -name = "tokio-macros" -version = "2.5.0" +name = "tokio-native-tls" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", + "native-tls", + "tokio", ] [[package]] @@ -4392,17 +4686,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "tokio-stream" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - [[package]] name = "tokio-util" version = "0.7.16" @@ -4411,7 +4694,6 @@ checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" dependencies = [ "bytes", "futures-core", - "futures-io", "futures-sink", "pin-project-lite", "tokio", @@ -4453,7 +4735,7 @@ version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ - "indexmap 2.10.0", + "indexmap 2.11.1", "serde", "serde_spanned", "toml_datetime", @@ -4467,6 +4749,51 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +dependencies = [ + "bitflags 2.9.4", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + [[package]] name = "tracing" version = "0.1.41" @@ -4513,14 +4840,14 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.19" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" dependencies = [ "matchers", "nu-ansi-term", "once_cell", - "regex", + "regex-automata", "sharded-slab", "smallvec", "thread_local", @@ -4532,9 +4859,9 @@ dependencies = [ [[package]] name = "trie-db" -version = "0.29.1" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c992b4f40c234a074d48a757efeabb1a6be88af84c0c23f7ca158950cb0ae7f" +checksum = "6c0670ab45a6b7002c7df369fee950a27cf29ae0474343fd3a15aa15f691e7a6" dependencies = [ "hash-db", "log", @@ -4551,6 +4878,12 @@ dependencies = [ "hash-db", ] +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + [[package]] name = "tuplex" version = "0.1.2" @@ -4589,9 +4922,9 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" [[package]] name = "unicode-normalization" @@ -4622,13 +4955,14 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.6" +version = "2.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "137a3c834eaf7139b73688502f3f1141a0337c5d8e4d9b536f9b8c796e26a7c4" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" dependencies = [ "form_urlencoded", "idna", "percent-encoding", + "serde", ] [[package]] @@ -4649,6 +4983,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version_check" version = "0.9.5" @@ -4662,11 +5002,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6bfb937b3d12077654a9e43e32a4e9c20177dd9fea0f3aba673e7840bb54f32" dependencies = [ "ark-bls12-377", - "ark-bls12-381", - "ark-ec", - "ark-ff", - "ark-serialize", - "ark-serialize-derive", + "ark-bls12-381 0.4.0", + "ark-ec 0.4.2", + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "ark-serialize-derive 0.4.2", "arrayref", "digest 0.10.7", "rand", @@ -4677,6 +5017,52 @@ dependencies = [ "zeroize", ] +[[package]] +name = "w3f-pcs" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbe7a8d5c914b69392ab3b267f679a2e546fe29afaddce47981772ac71bd02e1" +dependencies = [ + "ark-ec 0.5.0", + "ark-ff 0.5.0", + "ark-poly 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "merlin", +] + +[[package]] +name = "w3f-plonk-common" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aca389e494fe08c5c108b512e2328309036ee1c0bc7bdfdb743fef54d448c8c" +dependencies = [ + "ark-ec 0.5.0", + "ark-ff 0.5.0", + "ark-poly 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "getrandom_or_panic", + "rand_core", + "w3f-pcs", +] + +[[package]] +name = "w3f-ring-proof" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a639379402ad51504575dbd258740383291ac8147d3b15859bdf1ea48c677de" +dependencies = [ + "ark-ec 0.5.0", + "ark-ff 0.5.0", + "ark-poly 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "ark-transcript", + "w3f-pcs", + "w3f-plonk-common", +] + [[package]] name = "walkdir" version = "2.5.0" @@ -4687,6 +5073,15 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + [[package]] name = "wasi" version = "0.11.1+wasi-snapshot-preview1" @@ -4695,11 +5090,92 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasi" -version = "0.14.2+wasi-0.2.4" +version = "0.14.5+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4494f6290a82f5fe584817a676a34b9d6763e8d9d18204009fb31dceca98fd4" +dependencies = [ + "wasip2", +] + +[[package]] +name = "wasip2" +version = "1.0.0+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03fa2761397e5bd52002cd7e73110c71af2109aca4e521a9f40473fe685b0a24" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e14915cadd45b529bb8d1f343c4ed0ac1de926144b746e2710f9cd05df6603b" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e28d1ba982ca7923fd01448d5c30c6864d0a14109560296a162f80f305fb93bb" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn 2.0.106", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ca85039a9b469b38336411d6d6ced91f3fc87109a2a27b0c197663f5144dffe" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c3d463ae3eff775b0c45df9da45d68837702ac35af998361e2c84e7c5ec1b0d" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bb4ce89b08211f923caf51d527662b75bdc9c9c7aab40f86dcb9fb85ac552aa" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +checksum = "f143854a3b13752c6950862c906306adb27c7e839f7414cec8fea35beab624c1" dependencies = [ - "wit-bindgen-rt", + "unicode-ident", ] [[package]] @@ -4917,21 +5393,13 @@ dependencies = [ ] [[package]] -name = "webpki-root-certs" -version = "0.26.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75c7f0ef91146ebfb530314f5f1d24528d7f0767efbfd31dce919275413e393e" -dependencies = [ - "webpki-root-certs 1.0.2", -] - -[[package]] -name = "webpki-root-certs" -version = "1.0.2" +name = "web-sys" +version = "0.3.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4ffd8df1c57e87c325000a3d6ef93db75279dc3a231125aac571650f22b12a" +checksum = "77e4b637749ff0d92b8fad63aa1f7cff3cbe125fd49c175cd6345e7272638b12" dependencies = [ - "rustls-pki-types", + "js-sys", + "wasm-bindgen", ] [[package]] @@ -4952,11 +5420,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0978bf7171b3d90bac376700cb56d606feb40f251a475a5d6634613564460b22" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.60.2", + "windows-sys 0.61.0", ] [[package]] @@ -4971,6 +5439,41 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" +[[package]] +name = "windows-link" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" + +[[package]] +name = "windows-registry" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" +dependencies = [ + "windows-link 0.1.3", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link 0.1.3", +] + [[package]] name = "windows-sys" version = "0.45.0" @@ -5016,6 +5519,15 @@ dependencies = [ "windows-targets 0.53.3", ] +[[package]] +name = "windows-sys" +version = "0.61.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e201184e40b2ede64bc2ea34968b28e33622acdbbf37104f0e4a33f7abe657aa" +dependencies = [ + "windows-link 0.2.0", +] + [[package]] name = "windows-targets" version = "0.42.2" @@ -5068,7 +5580,7 @@ version = "0.53.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" dependencies = [ - "windows-link", + "windows-link 0.1.3", "windows_aarch64_gnullvm 0.53.0", "windows_aarch64_msvc 0.53.0", "windows_i686_gnu 0.53.0", @@ -5261,21 +5773,18 @@ checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" [[package]] name = "winnow" -version = "0.7.12" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" +checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" dependencies = [ "memchr", ] [[package]] -name = "wit-bindgen-rt" -version = "0.39.0" +name = "wit-bindgen" +version = "0.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" -dependencies = [ - "bitflags 2.9.2", -] +checksum = "5c573471f125075647d03df72e026074b7203790d41351cd6edc96f46bcccd36" [[package]] name = "writeable" @@ -5327,18 +5836,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.26" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.26" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", @@ -5459,9 +5968,9 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.15+zstd.1.5.7" +version = "2.0.16+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" dependencies = [ "cc", "pkg-config", diff --git a/crates/chainql-core/Cargo.toml b/crates/chainql-core/Cargo.toml index 8892427..bd89943 100644 --- a/crates/chainql-core/Cargo.toml +++ b/crates/chainql-core/Cargo.toml @@ -12,23 +12,21 @@ tokio.workspace = true jrsonnet-evaluator.workspace = true jrsonnet-gcmodule.workspace = true hex = "0.4.3" -jsonrpsee = { version = "0.24.7", features = ["macros", "ws-client"] } -parity-scale-codec = { version = "3.6.12", features = ["derive"] } -scale-info = "2.11.3" -serde = "1.0.203" -serde_json = "1.0.117" -thiserror = "1.0.61" +parity-scale-codec = { version = "3.7.5", features = ["derive"] } +scale-info = "2.11.6" +serde = "1.0.219" +serde_json = "1.0.143" +thiserror = "2.0.16" peg = "0.8.3" num-traits = "0.2.19" -num-bigint = "0.4.5" -cumulus-primitives-proof-size-hostfunction = "0.11.0" -sp-io = "39.0.0" -sp-core = { version = "35.0.0", default-features = false, features = ["std"] } -sc-executor = "0.41.0" -sp-state-machine = "0.44.0" -hyper = "1.3.1" -http = "1.1.0" +num-bigint = "0.4.6" +cumulus-primitives-proof-size-hostfunction = "0.14.0" +sp-io = "42.0.0" +sp-core = { version = "38.0.0", default-features = false, features = ["std"] } +sc-executor = "0.44.0" +sp-state-machine = "0.47.0" libsecp256k1 = "0.7.1" -sp-runtime = "40.0.0" +sp-runtime = "43.0.0" directories = "6.0.0" futures = "0.3.31" +reqwest = "0.12.23" From c004426093a6b34427390055b1f38e92729f700d Mon Sep 17 00:00:00 2001 From: Valery Klachkov Date: Wed, 10 Sep 2025 12:00:03 +0200 Subject: [PATCH 2/8] Remove unused method next() from ClientT --- crates/chainql-core/src/client.rs | 5 ----- crates/chainql-core/src/client/live.rs | 4 ---- 2 files changed, 9 deletions(-) diff --git a/crates/chainql-core/src/client.rs b/crates/chainql-core/src/client.rs index 08177f0..40dcc2f 100644 --- a/crates/chainql-core/src/client.rs +++ b/crates/chainql-core/src/client.rs @@ -42,7 +42,6 @@ pub trait ClientT { fn contains_key(&self, key: &[u8]) -> Result { Ok(self.get_storage(key)?.is_some()) } - fn next(&self) -> Result; } #[derive(Clone, Trace)] @@ -72,8 +71,4 @@ impl ClientT for Client { fn contains_data_for(&self, prefix: &[u8]) -> Result { self.0.contains_data_for(prefix) } - - fn next(&self) -> Result { - self.0.next() - } } diff --git a/crates/chainql-core/src/client/live.rs b/crates/chainql-core/src/client/live.rs index 0686405..5b17731 100644 --- a/crates/chainql-core/src/client/live.rs +++ b/crates/chainql-core/src/client/live.rs @@ -440,8 +440,4 @@ impl ClientT for LiveClient { fn contains_data_for(&self, prefix: &[u8]) -> super::Result { Ok(self.contains_data_for(prefix)?) } - - fn next(&self) -> super::Result { - Err(Error::BlockHistoryNotSupported.into()) - } } From 36d065effbf639124652ad880dc66f9a916add19 Mon Sep 17 00:00:00 2001 From: Valery Klachkov Date: Fri, 12 Sep 2025 02:29:27 +0200 Subject: [PATCH 3/8] HTTPS client with rate limiter --- Cargo.lock | 126 +++++++++++++- Cargo.toml | 2 +- cmds/chainql/Cargo.toml | 3 + cmds/chainql/src/main.rs | 16 ++ crates/chainql-core/Cargo.toml | 5 +- crates/chainql-core/src/client.rs | 2 + crates/chainql-core/src/client/dump.rs | 4 - crates/chainql-core/src/client/live.rs | 177 ++++++++----------- crates/chainql-core/src/client/rpc.rs | 227 +++++++++++++++++++++++++ crates/chainql-core/src/lib.rs | 4 +- 10 files changed, 455 insertions(+), 111 deletions(-) create mode 100644 crates/chainql-core/src/client/rpc.rs diff --git a/Cargo.lock b/Cargo.lock index 67ca084..47614c0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -81,7 +81,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d9b665789884a7e8fb06c84b295e923b03ca51edbb7d08f91a6a50322ecbfe6" dependencies = [ "anstyle", - "unicode-width", + "unicode-width 0.1.14", ] [[package]] @@ -680,6 +680,9 @@ dependencies = [ "jrsonnet-evaluator", "jrsonnet-stdlib", "tokio", + "tracing", + "tracing-indicatif", + "tracing-subscriber", ] [[package]] @@ -709,6 +712,9 @@ dependencies = [ "sp-state-machine", "thiserror 2.0.16", "tokio", + "tracing", + "tracing-indicatif", + "url", ] [[package]] @@ -773,6 +779,19 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2382f75942f4b3be3690fe4f86365e9c853c1587d6ee58212cebf6e2a9ccd101" +[[package]] +name = "console" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b430743a6eb14e9764d4260d4c0d8123087d504eeb9c48f2b2a5e810dd369df4" +dependencies = [ + "encode_unicode", + "libc", + "once_cell", + "unicode-width 0.2.1", + "windows-sys 0.61.0", +] + [[package]] name = "const-oid" version = "0.9.6" @@ -1310,6 +1329,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + [[package]] name = "encoding_rs" version = "0.8.35" @@ -2133,6 +2158,20 @@ dependencies = [ "hashbrown 0.15.5", ] +[[package]] +name = "indicatif" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70a646d946d06bedbbc4cac4c218acf4bbf2d87757a784857025f4d447e4e1cd" +dependencies = [ + "console", + "portable-atomic", + "unicode-width 0.2.1", + "unit-prefix", + "vt100", + "web-time", +] + [[package]] name = "integer-sqrt" version = "0.1.5" @@ -3050,6 +3089,12 @@ version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28919f542476f4158cc71e6c072b1051f38f4b514253594ac3ad80e3c0211fc8" +[[package]] +name = "portable-atomic" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" + [[package]] name = "potential_utf" version = "0.1.3" @@ -4663,9 +4708,21 @@ dependencies = [ "pin-project-lite", "slab", "socket2", + "tokio-macros", "windows-sys 0.59.0", ] +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "tokio-native-tls" version = "0.3.1" @@ -4827,6 +4884,18 @@ dependencies = [ "valuable", ] +[[package]] +name = "tracing-indicatif" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04d4e11e0e27acef25a47f27e9435355fecdc488867fa2bc90e75b0700d2823d" +dependencies = [ + "indicatif", + "tracing", + "tracing-core", + "tracing-subscriber", +] + [[package]] name = "tracing-log" version = "0.2.0" @@ -4941,12 +5010,24 @@ version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" +[[package]] +name = "unicode-width" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a1a07cc7db3810833284e8d372ccdc6da29741639ecc70c9ec107df0fa6154c" + [[package]] name = "unicode-xid" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" +[[package]] +name = "unit-prefix" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "323402cff2dd658f39ca17c789b502021b3f18707c91cdf22e3838e1b4023817" + [[package]] name = "untrusted" version = "0.9.0" @@ -4995,6 +5076,39 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "vt100" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84cd863bf0db7e392ba3bd04994be3473491b31e66340672af5d11943c6274de" +dependencies = [ + "itoa", + "log", + "unicode-width 0.1.14", + "vte", +] + +[[package]] +name = "vte" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5022b5fbf9407086c180e9557be968742d839e68346af7792b8592489732197" +dependencies = [ + "arrayvec", + "utf8parse", + "vte_generate_state_changes", +] + +[[package]] +name = "vte_generate_state_changes" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e369bee1b05d510a7b4ed645f5faa90619e05437111783ea5848f28d97d3c2e" +dependencies = [ + "proc-macro2", + "quote", +] + [[package]] name = "w3f-bls" version = "0.1.9" @@ -5402,6 +5516,16 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "winapi" version = "0.3.9" diff --git a/Cargo.toml b/Cargo.toml index 6dbe1bf..d031641 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,7 +16,7 @@ name = "chainql" chainql-core = { path = "./crates/chainql-core", version = "0.4.10" } frame-metadata = { package = "chainql-frame-metadata", path = "./frame-metadata/frame-metadata", version = "0.4.10" } -tokio = { version = "1.38.0", features = ["rt-multi-thread"] } +tokio = { version = "1.47.1", features = ["rt-multi-thread", "macros"] } jrsonnet-evaluator = { version = "0.5.0-pre97", features = ["exp-destruct", "exp-bigint", "exp-object-iteration", "exp-preserve-order"] } jrsonnet-stdlib = { version = "0.5.0-pre97", features = ["exp-bigint", "exp-preserve-order"] } jrsonnet-cli = { version = "0.5.0-pre97", features = ["exp-bigint", "exp-preserve-order"] } diff --git a/cmds/chainql/Cargo.toml b/cmds/chainql/Cargo.toml index a101876..d755525 100644 --- a/cmds/chainql/Cargo.toml +++ b/cmds/chainql/Cargo.toml @@ -13,3 +13,6 @@ tokio.workspace = true jrsonnet-evaluator.workspace = true jrsonnet-stdlib.workspace = true jrsonnet-cli.workspace = true +tracing = "0.1.41" +tracing-subscriber = "0.3.20" +tracing-indicatif = "0.3.13" diff --git a/cmds/chainql/src/main.rs b/cmds/chainql/src/main.rs index 8fe3255..3633e67 100644 --- a/cmds/chainql/src/main.rs +++ b/cmds/chainql/src/main.rs @@ -4,6 +4,10 @@ use clap::Parser; use jrsonnet_cli::{InputOpts, MiscOpts, StdOpts, TlaOpts, TraceOpts}; use jrsonnet_evaluator::{apply_tla, bail, error::Result, manifest::JsonFormat, State}; use tokio::runtime::Handle; +use tracing_indicatif::IndicatifLayer; +use tracing_subscriber::{ + fmt::writer::MakeWriterExt, layer::SubscriberExt, util::SubscriberInitExt, +}; /// chainql #[derive(Parser)] @@ -23,6 +27,18 @@ struct Opts { } /// Set up Jrsonnet. fn main_jrsonnet(opts: Opts) -> Result { + let indicatif_layer = IndicatifLayer::new(); + tracing_subscriber::registry() + .with( + tracing_subscriber::fmt::layer().without_time().with_writer( + indicatif_layer + .get_stderr_writer() + .with_max_level(tracing::Level::INFO), + ), + ) + .with(indicatif_layer) + .init(); + let import_resolver = opts.misc.import_resolver(); let mut sb = State::builder(); diff --git a/crates/chainql-core/Cargo.toml b/crates/chainql-core/Cargo.toml index bd89943..6fe4df3 100644 --- a/crates/chainql-core/Cargo.toml +++ b/crates/chainql-core/Cargo.toml @@ -29,4 +29,7 @@ libsecp256k1 = "0.7.1" sp-runtime = "43.0.0" directories = "6.0.0" futures = "0.3.31" -reqwest = "0.12.23" +reqwest = { version = "0.12.23", features = ["json"] } +url = "2.5.7" +tracing = "0.1.41" +tracing-indicatif = "0.3.13" diff --git a/crates/chainql-core/src/client.rs b/crates/chainql-core/src/client.rs index 40dcc2f..78bc264 100644 --- a/crates/chainql-core/src/client.rs +++ b/crates/chainql-core/src/client.rs @@ -4,6 +4,8 @@ use frame_metadata::RuntimeMetadataV14; use jrsonnet_evaluator::runtime_error; use jrsonnet_gcmodule::Trace; +mod rpc; + pub mod dump; pub mod live; diff --git a/crates/chainql-core/src/client/dump.rs b/crates/chainql-core/src/client/dump.rs index 5afda13..75f6f2b 100644 --- a/crates/chainql-core/src/client/dump.rs +++ b/crates/chainql-core/src/client/dump.rs @@ -60,8 +60,4 @@ impl ClientT for ClientDump { fn get_metadata(&self) -> super::Result { Ok(self.meta.clone()) } - - fn next(&self) -> super::Result { - Err(Error::NoNextBlock.into()) - } } diff --git a/crates/chainql-core/src/client/live.rs b/crates/chainql-core/src/client/live.rs index 5b17731..4a392ef 100644 --- a/crates/chainql-core/src/client/live.rs +++ b/crates/chainql-core/src/client/live.rs @@ -1,29 +1,31 @@ -use std::cell::Cell; +use std::cell::{Cell, RefCell}; use std::collections::BTreeMap; use std::env; -use std::fmt::Display; +use std::fmt::{Debug, Display}; use std::str::FromStr; use std::time::Duration; use std::vec::Vec; -use std::{cell::RefCell, rc::Rc, result}; +use std::{rc::Rc, result}; use frame_metadata::{RuntimeMetadata, RuntimeMetadataV14}; use futures::{FutureExt, StreamExt, TryStreamExt as _}; use jrsonnet_evaluator::bail; use jrsonnet_gcmodule::Trace; -use jsonrpsee::core::ClientError; -use jsonrpsee::{proc_macros::rpc, ws_client::WsClient}; use parity_scale_codec::Decode; -use serde::Deserialize; use thiserror::Error; use tokio::runtime::Handle; +use tracing::{info_span, Span}; +use tracing_indicatif::span_ext::IndicatifSpanExt; +use tracing_indicatif::style::ProgressStyle; + +use crate::client::rpc::{RpcError, SubstrateRpc}; use super::ClientT; #[derive(Error, Debug)] pub enum Error { #[error("rpc error: {0}")] - Rpc(#[from] ClientError), + Rpc(#[from] RpcError), #[error("unsupported metadata version, only v14 is supported")] UnsupportedMetadataVersion, #[error("something is broken, keys paged chunk size has reached zero")] @@ -33,93 +35,38 @@ pub enum Error { #[error("block history is not supported")] BlockHistoryNotSupported, #[error("url: {0}")] - UrlParse(#[from] http::uri::InvalidUri), -} -type Result = result::Result; - -#[derive(Deserialize)] -pub struct QueryStorageResult { - changes: Vec<(String, Option)>, -} - -#[rpc(client)] -pub trait SubstrateRpc { - #[method(name = "state_getMetadata")] - fn get_metadata(&self, at: Option) -> RpcResult; - #[method(name = "state_getStorage")] - fn get_storage(&self, key: String, at: Option) -> RpcResult>; - #[method(name = "state_queryStorageAt")] - fn query_storage( - &self, - keys: Vec, - at: Option, - ) -> RpcResult>; - #[method(name = "state_getKeys")] - fn get_keys(&self, key: String, at: Option) -> RpcResult>; - #[method(name = "state_getKeysPaged")] - fn get_keys_paged( - &self, - key: String, - count: usize, - start_key: Option, - at: Option, - ) -> RpcResult>; - - #[method(name = "chain_getBlockHash")] - fn get_block_hash(&self, num: Option) -> RpcResult>; + UrlParse(#[from] url::ParseError), } +pub type Result = result::Result; #[derive(Clone, Trace)] pub struct ClientShared { #[trace(skip)] - real: Rc, + rpc_client: Rc, } impl ClientShared { pub fn new(url: impl AsRef) -> Result { - let handle = Handle::current(); - let uri: hyper::Uri = url.as_ref().parse()?; - let mut uri = uri.into_parts(); - let ws_scheme = http::uri::Scheme::try_from("ws").expect("valid"); - let wss_scheme = http::uri::Scheme::try_from("wss").expect("valid"); - if uri.scheme == Some(ws_scheme.clone()) || uri.scheme == Some(wss_scheme) { - if let Some(authority) = &mut uri.authority { - if authority.port().is_none() { - *authority = http::uri::Authority::try_from(format!( - "{authority}:{}", - if uri.scheme == Some(ws_scheme) { - 9944 - } else { - 443 - } - )) - .expect("valid"); - } - }; - } - let uri = hyper::Uri::from_parts(uri).expect("valid reconstruction"); - let client = handle.block_on( - jsonrpsee::ws_client::WsClientBuilder::default() - .request_timeout(Duration::from_secs(300)) - .max_request_size(256 * 1024 * 1024) - .max_response_size(1024 * 1024 * 1024) - .build(uri.to_string()), - )?; + let url = url.as_ref().parse()?; + let rpc_client = SubstrateRpc::new(url, Duration::from_secs(300))?; + Ok(Self { - real: Rc::new(client), + rpc_client: Rc::new(rpc_client), }) } + pub fn block(&self, num: Option) -> Result { let handle = Handle::current(); + let block = handle - .block_on(self.real.get_block_hash(num))? + .block_on(self.rpc_client.get_block_hash(num))? .ok_or(Error::BlockNotFound(num))?; let max_workers = get_var("CHAINQL_WORKERS", 16); - let keys_chunk_size = get_var("CHAINQL_KEYS_CHUNK_SIZE", 60_000); + let keys_chunk_size = get_var("CHAINQL_KEYS_CHUNK_SIZE", 30_000); Ok(LiveClient { - real: self.real.clone(), + real: self.rpc_client.clone(), key_value_cache: Rc::new(RefCell::new(BTreeMap::new())), fetched_prefixes: Rc::new(RefCell::new(Vec::new())), block: Rc::new(block), @@ -127,7 +74,7 @@ impl ClientShared { max_workers, keys_chunk_size, - learned_max_chunk_size: Cell::new(8000), + learned_max_chunk_size: Cell::new(keys_chunk_size), }) } } @@ -141,9 +88,9 @@ where Ok(value) => value, Err(env::VarError::NotPresent) => { return default; - }, + } Err(env::VarError::NotUnicode(err)) => { - eprintln!("Invalid env var '{var}' value: {err:?}"); + tracing::info!("Invalid env var '{var}' value: {err:?}"); std::process::exit(1); } }; @@ -151,7 +98,7 @@ where match value.parse::() { Ok(parsed) => parsed, Err(err) => { - eprintln!("Invalid env var '{var}' value '{value}': {err}"); + tracing::info!("Invalid env var '{var}' value '{value}': {err}"); std::process::exit(1); } } @@ -170,7 +117,7 @@ peg::parser!( #[derive(Clone, Trace)] pub struct LiveClient { #[trace(skip)] - real: Rc, + real: Rc, #[trace(skip)] #[allow(clippy::type_complexity)] key_value_cache: Rc, Option>>>>, @@ -205,6 +152,7 @@ impl LiveClient { handle.block_on(self.get_keys_naive(prefix)) } } + pub async fn get_keys_naive(&self, prefix: &[u8]) -> Result> { let prefix_str = format!("0x{}", hex::encode(prefix)); @@ -222,29 +170,32 @@ impl LiveClient { .map(|k| Key(k.to_vec())) .collect()); } - eprintln!("loading keys by prefix {prefix_str}"); - // let handle = Handle::current(); + tracing::info!("loading keys by prefix {prefix_str}"); + let mut fetched = vec![]; loop { let chunk_result = self .real .get_keys_paged( - prefix_str.clone(), + &prefix_str, self.learned_max_chunk_size.get(), - fetched.last().cloned(), - Some(self.block.as_str().to_owned()), + fetched.last(), + Some(self.block.as_ref()), ) .await; + let chunk = match chunk_result { Ok(v) => v, - Err(ClientError::Call(c)) if c.code() == 4002 => { - if let Ok(v) = text_error::count_exceeds_max(c.message()) { - eprintln!("server didn't like our paged keys limit, resetting to {v}"); + Err(RpcError::Server { code, message }) if code == 4002 => { + if let Ok(v) = text_error::count_exceeds_max(&message) { + tracing::debug!( + "server didn't like our paged keys limit, resetting to {v}" + ); self.learned_max_chunk_size.set(v); } else { - eprintln!("server didn't like our paged keys limit, and we can't extract its limit from {:?}, reducing in half", c.message()); + tracing::debug!("server didn't like our paged keys limit, and we can't extract its limit from message '{message}', reducing in half"); self.learned_max_chunk_size .set(self.learned_max_chunk_size.get() / 2); if self.learned_max_chunk_size.get() == 0 { @@ -259,12 +210,12 @@ impl LiveClient { let has_more = chunk.len() == self.learned_max_chunk_size.get(); let len = chunk.len(); if len != 0 { - eprintln!("loaded {len} keys for pref {}", prefix_str); + tracing::info!("loaded {len} keys for pref {}", prefix_str); } fetched.extend(chunk); if !has_more { if !fetched.is_empty() { - eprintln!("loaded keys, last chunk was {len}"); + tracing::info!("loaded keys, last chunk was {len}"); } break; } @@ -281,13 +232,14 @@ impl LiveClient { .collect::>(); Ok(fetched) } + pub fn get_storage(&self, key: &[u8]) -> Result>> { let mut cache = self.key_value_cache.borrow_mut(); if cache.contains_key(key) { return Ok(cache.get(key).expect("cached").clone()); } let key_str = format!("0x{}", hex::encode(key)); - eprintln!("loading key {key_str}"); + tracing::info!("loading key {key_str}"); let handle = Handle::current(); let value = handle.block_on( @@ -305,7 +257,16 @@ impl LiveClient { cache.insert(key.to_vec(), value.clone()); Ok(value) } + pub fn preload_storage(&self, keys: &[&Vec]) -> Result<()> { + let header_span = info_span!("preload_storage"); + header_span.pb_set_style(&ProgressStyle::with_template("{msg} {wide_bar} {pos}/{len}").unwrap()); + header_span.pb_set_length(keys.len() as u64); + header_span.pb_set_message("preloading keys"); + header_span.pb_set_finish_message("all keys preloaded"); + + let header_span_enter = header_span.enter(); + let handle = Handle::current(); handle.block_on( futures::stream::iter( @@ -314,19 +275,27 @@ impl LiveClient { ) .buffer_unordered(self.max_workers) .try_collect::<()>(), - ) + )?; + + drop(header_span_enter); + drop(header_span); + + tracing::info!("preloaded {} keys", keys.len()); + + Ok(()) } + async fn preload_storage_fallback(&self, keys: &[&Vec]) -> Result<()> { let chunk_size = keys.len(); match self.preload_storage_naive(keys).await { Ok(()) => Ok(()), - Err(Error::Rpc(ClientError::Call(c))) if c.code() == -32702 || c.code() == -32008 => { + Err(Error::Rpc(RpcError::Server { code, .. })) if code == -32702 || code == -32008 => { let (keysa, keysb) = keys.split_at(chunk_size / 2); self.preload_storage_fallback(keysa).boxed_local().await?; self.preload_storage_fallback(keysb).boxed_local().await?; Ok(()) } - Err(e) => Err(e), + Err(err) => Err(err), } } async fn preload_storage_naive(&self, keys: &[&Vec]) -> Result<()> { @@ -342,12 +311,16 @@ impl LiveClient { } drop(cache); } - eprintln!("preloading {} keys", list.len()); - // let handle = Handle::current(); + + let chunk_size = keys.len() as u64; + let value = self .real - .query_storage(list, Some(self.block.as_str().to_owned())) + .query_storage(list, Some(self.block.as_ref())) .await?; + + Span::current().pb_inc(chunk_size); + if value.is_empty() { return Ok(()); } @@ -370,9 +343,9 @@ impl LiveClient { Ok(()) } pub fn get_metadata(&self) -> Result { - eprintln!("loading metadata"); + tracing::info!("loading metadata"); let handle = Handle::current(); - let meta = handle.block_on(self.real.get_metadata(Some(self.block.as_str().to_owned())))?; + let meta = handle.block_on(self.real.get_metadata(Some(self.block.as_ref())))?; assert!(meta.starts_with("0x")); let meta = hex::decode(&meta[2..]).expect("decode hex"); assert!(&meta[0..4] == b"meta"); @@ -406,15 +379,15 @@ impl LiveClient { } return Ok(false); } - eprintln!("checking for keys under {prefix:0>2x?}"); + tracing::info!("checking for keys under {prefix:0>2x?}"); let prefix_str = format!("0x{}", hex::encode(prefix)); let handle = Handle::current(); let chunk = handle.block_on(self.real.get_keys_paged( - prefix_str, + &prefix_str, 1, None, - Some(self.block.as_str().to_owned()), + Some(self.block.as_ref()), ))?; Ok(!chunk.is_empty()) } diff --git a/crates/chainql-core/src/client/rpc.rs b/crates/chainql-core/src/client/rpc.rs new file mode 100644 index 0000000..daf598d --- /dev/null +++ b/crates/chainql-core/src/client/rpc.rs @@ -0,0 +1,227 @@ +use futures::FutureExt; +use reqwest::StatusCode; +use serde::{Deserialize, Serialize}; +use sp_runtime::DeserializeOwned; +use thiserror::Error; +use tokio::{ + sync::Mutex, + time::{sleep, Duration, Instant}, +}; + +#[derive(Debug, Error)] +pub enum RpcError { + #[error("network error: {0}")] + Network(#[from] reqwest::Error), + + #[error("bad response: {0}")] + BadResponse(String), + + #[error("jsonrpc error: {message} (code {code})")] + Server { code: i32, message: String }, +} + +pub type Result = core::result::Result; + +#[derive(Deserialize)] +pub struct Response { + result: Option, + error: Option, +} + +#[derive(Deserialize)] +pub struct ResponseError { + code: i32, + message: String, +} + +#[derive(Deserialize)] +pub struct QueryStorageResult { + pub changes: Vec<(String, Option)>, +} + +pub struct SubstrateRpc { + client: reqwest::Client, + url: reqwest::Url, + rate_limiter: RateLimiter, +} + +struct RateLimiter(Mutex); + +struct State { + rps: u32, + increase_param: u32, + decrease_factor: f32, + last_requested_at: Option, +} + +impl RateLimiter { + fn new() -> Self { + Self(Mutex::new(State { + rps: 1000, + increase_param: 50, + decrease_factor: 0.8, + last_requested_at: None, + })) + } + + async fn wait(&self) { + let requested_at = Instant::now(); + + let sleep_duration= { + let mut this = self.0.lock().await; + + if let Some(last_requested_at) = this.last_requested_at.replace(requested_at) { + (Duration::from_secs(60) / this.rps).saturating_sub(requested_at - last_requested_at) + } else { + Duration::ZERO + } + }; + + sleep(sleep_duration).await + } + + async fn request_succeeded(&self) { + let mut this = self.0.lock().await; + + this.rps += this.increase_param; + } + + async fn request_limited(&self) { + let mut this = self.0.lock().await; + + let new_rps = ((this.rps as f32) * this.decrease_factor).round() as u32; + + this.rps = if new_rps > 0 { + new_rps + } else { + 1 + }; + } +} + +impl SubstrateRpc { + pub fn new(url: reqwest::Url, timeout: Duration) -> Result { + Ok(Self { + client: reqwest::Client::builder() + .timeout(timeout) + .build()?, + url: url, + rate_limiter: RateLimiter::new(), + }) + } + + async fn call(&self, method: &str, params: &impl Serialize) -> Result { + self.rate_limiter.wait().await; + + let body = serde_json::json!({ + "jsonrpc": "2.0", + "id": null, + "method": method, + "params": params, + }); + + let response = self + .client + .post(self.url.clone()) + .json(&body) + .send() + .await?; + + if response.status() == StatusCode::TOO_MANY_REQUESTS || response.status() == StatusCode::GATEWAY_TIMEOUT { + self.rate_limiter.request_limited().await; + return self.call(method, params).boxed_local().await; + } else { + self.rate_limiter.request_succeeded().await; + } + + if response.status() != StatusCode::OK { + return Err(RpcError::BadResponse(format!( + "unexpected status code {}", + response.status() + ))); + } + + let response_body = response.text().await?; + + let deserialized = serde_json::from_str::>(&response_body) + .map_err(|err| RpcError::BadResponse(err.to_string()))?; + + if let Some(result) = deserialized.result { + Ok(result) + } else if let Some(e) = deserialized.error { + Err(RpcError::Server { + code: e.code, + message: e.message, + }) + } else { + Err(RpcError::BadResponse(format!( + "no error or result in json '{response_body}'" + ))) + } + } + + pub async fn get_block_hash(&self, num: Option) -> Result> { + self.call( + "chain_getBlockHash", + &serde_json::json!({ + "num": num + }), + ) + .await + } + + pub async fn get_keys_paged( + &self, + key: &String, + count: usize, + start_key: Option<&String>, + at: Option<&String>, + ) -> Result> { + self.call( + "state_getKeysPaged", + &serde_json::json!({ + "key": key, + "count": count, + "start_key": start_key, + "at": at + }), + ) + .await + } + + pub async fn get_storage(&self, key: String, at: Option) -> Result> { + self.call( + "state_getStorage", + &serde_json::json!({ + "key": key, + "at": at + }), + ) + .await + } + + pub async fn query_storage( + &self, + keys: Vec, + at: Option<&String>, + ) -> Result> { + self.call( + "state_queryStorageAt", + &serde_json::json!({ + "keys": keys, + "at": at + }), + ) + .await + } + + pub async fn get_metadata(&self, at: Option<&String>) -> Result { + self.call( + "state_getMetadata", + &serde_json::json!({ + "at": at + }), + ) + .await + } +} diff --git a/crates/chainql-core/src/lib.rs b/crates/chainql-core/src/lib.rs index 1d511a4..31c2625 100644 --- a/crates/chainql-core/src/lib.rs +++ b/crates/chainql-core/src/lib.rs @@ -952,7 +952,7 @@ fn make_unknown_key(client: Client, prefix: &[u8], known: &[&Vec]) -> Result let client: Client = client; let fetched: Vec> = fetched; Thunk::::evaluated({ - eprintln!("preloading all storage keys"); + tracing::info!("preloading all storage keys"); client.preload_storage(&fetched.iter().collect::>())?; Val::Obj(pending_out.unwrap()) }) @@ -1424,7 +1424,7 @@ fn make_block(client: Client, opts: ChainOpts) -> Result { let pending_out: Pending = pending_out.clone(); let client: Client = client.clone(); Thunk::::evaluated({ - eprintln!("preloading all keys"); + tracing::info!("preloading all keys"); let keys = client.get_keys(&[])?; client.preload_storage(keys.iter().collect::>().as_slice())?; Val::Obj(pending_out.unwrap()) From 03d91579e18507a388a9633f5f1e8093193024ce Mon Sep 17 00:00:00 2001 From: Valery Klachkov Date: Fri, 12 Sep 2025 14:25:23 +0200 Subject: [PATCH 4/8] Prepare for Websocket client return --- crates/chainql-core/src/client.rs | 2 + crates/chainql-core/src/client/live.rs | 13 +- crates/chainql-core/src/client/rpc.rs | 202 +------------------- crates/chainql-core/src/client/rpc_http.rs | 209 +++++++++++++++++++++ crates/chainql-core/src/client/rpc_ws.rs | 0 5 files changed, 228 insertions(+), 198 deletions(-) create mode 100644 crates/chainql-core/src/client/rpc_http.rs create mode 100644 crates/chainql-core/src/client/rpc_ws.rs diff --git a/crates/chainql-core/src/client.rs b/crates/chainql-core/src/client.rs index 78bc264..bc7269c 100644 --- a/crates/chainql-core/src/client.rs +++ b/crates/chainql-core/src/client.rs @@ -5,6 +5,8 @@ use jrsonnet_evaluator::runtime_error; use jrsonnet_gcmodule::Trace; mod rpc; +mod rpc_http; +mod rpc_ws; pub mod dump; pub mod live; diff --git a/crates/chainql-core/src/client/live.rs b/crates/chainql-core/src/client/live.rs index 4a392ef..74342a9 100644 --- a/crates/chainql-core/src/client/live.rs +++ b/crates/chainql-core/src/client/live.rs @@ -18,7 +18,8 @@ use tracing::{info_span, Span}; use tracing_indicatif::span_ext::IndicatifSpanExt; use tracing_indicatif::style::ProgressStyle; -use crate::client::rpc::{RpcError, SubstrateRpc}; +use crate::client::rpc::{Rpc, RpcError}; +use crate::client::rpc_http::HttpClient; use super::ClientT; @@ -37,18 +38,19 @@ pub enum Error { #[error("url: {0}")] UrlParse(#[from] url::ParseError), } + pub type Result = result::Result; #[derive(Clone, Trace)] pub struct ClientShared { #[trace(skip)] - rpc_client: Rc, + rpc_client: Rc, } impl ClientShared { pub fn new(url: impl AsRef) -> Result { let url = url.as_ref().parse()?; - let rpc_client = SubstrateRpc::new(url, Duration::from_secs(300))?; + let rpc_client = HttpClient::new(url, Duration::from_secs(300))?; Ok(Self { rpc_client: Rc::new(rpc_client), @@ -117,7 +119,7 @@ peg::parser!( #[derive(Clone, Trace)] pub struct LiveClient { #[trace(skip)] - real: Rc, + real: Rc, #[trace(skip)] #[allow(clippy::type_complexity)] key_value_cache: Rc, Option>>>>, @@ -260,7 +262,8 @@ impl LiveClient { pub fn preload_storage(&self, keys: &[&Vec]) -> Result<()> { let header_span = info_span!("preload_storage"); - header_span.pb_set_style(&ProgressStyle::with_template("{msg} {wide_bar} {pos}/{len}").unwrap()); + header_span + .pb_set_style(&ProgressStyle::with_template("{msg} {wide_bar} {pos}/{len}").unwrap()); header_span.pb_set_length(keys.len() as u64); header_span.pb_set_message("preloading keys"); header_span.pb_set_finish_message("all keys preloaded"); diff --git a/crates/chainql-core/src/client/rpc.rs b/crates/chainql-core/src/client/rpc.rs index daf598d..c3dfe00 100644 --- a/crates/chainql-core/src/client/rpc.rs +++ b/crates/chainql-core/src/client/rpc.rs @@ -1,12 +1,5 @@ -use futures::FutureExt; -use reqwest::StatusCode; -use serde::{Deserialize, Serialize}; -use sp_runtime::DeserializeOwned; +use serde::Deserialize; use thiserror::Error; -use tokio::{ - sync::Mutex, - time::{sleep, Duration, Instant}, -}; #[derive(Debug, Error)] pub enum RpcError { @@ -22,206 +15,29 @@ pub enum RpcError { pub type Result = core::result::Result; -#[derive(Deserialize)] -pub struct Response { - result: Option, - error: Option, -} - -#[derive(Deserialize)] -pub struct ResponseError { - code: i32, - message: String, -} - #[derive(Deserialize)] pub struct QueryStorageResult { pub changes: Vec<(String, Option)>, } -pub struct SubstrateRpc { - client: reqwest::Client, - url: reqwest::Url, - rate_limiter: RateLimiter, -} - -struct RateLimiter(Mutex); - -struct State { - rps: u32, - increase_param: u32, - decrease_factor: f32, - last_requested_at: Option, -} - -impl RateLimiter { - fn new() -> Self { - Self(Mutex::new(State { - rps: 1000, - increase_param: 50, - decrease_factor: 0.8, - last_requested_at: None, - })) - } - - async fn wait(&self) { - let requested_at = Instant::now(); - - let sleep_duration= { - let mut this = self.0.lock().await; - - if let Some(last_requested_at) = this.last_requested_at.replace(requested_at) { - (Duration::from_secs(60) / this.rps).saturating_sub(requested_at - last_requested_at) - } else { - Duration::ZERO - } - }; - - sleep(sleep_duration).await - } - - async fn request_succeeded(&self) { - let mut this = self.0.lock().await; - - this.rps += this.increase_param; - } - - async fn request_limited(&self) { - let mut this = self.0.lock().await; - - let new_rps = ((this.rps as f32) * this.decrease_factor).round() as u32; - - this.rps = if new_rps > 0 { - new_rps - } else { - 1 - }; - } -} - -impl SubstrateRpc { - pub fn new(url: reqwest::Url, timeout: Duration) -> Result { - Ok(Self { - client: reqwest::Client::builder() - .timeout(timeout) - .build()?, - url: url, - rate_limiter: RateLimiter::new(), - }) - } - - async fn call(&self, method: &str, params: &impl Serialize) -> Result { - self.rate_limiter.wait().await; - - let body = serde_json::json!({ - "jsonrpc": "2.0", - "id": null, - "method": method, - "params": params, - }); - - let response = self - .client - .post(self.url.clone()) - .json(&body) - .send() - .await?; - - if response.status() == StatusCode::TOO_MANY_REQUESTS || response.status() == StatusCode::GATEWAY_TIMEOUT { - self.rate_limiter.request_limited().await; - return self.call(method, params).boxed_local().await; - } else { - self.rate_limiter.request_succeeded().await; - } - - if response.status() != StatusCode::OK { - return Err(RpcError::BadResponse(format!( - "unexpected status code {}", - response.status() - ))); - } - - let response_body = response.text().await?; - - let deserialized = serde_json::from_str::>(&response_body) - .map_err(|err| RpcError::BadResponse(err.to_string()))?; - - if let Some(result) = deserialized.result { - Ok(result) - } else if let Some(e) = deserialized.error { - Err(RpcError::Server { - code: e.code, - message: e.message, - }) - } else { - Err(RpcError::BadResponse(format!( - "no error or result in json '{response_body}'" - ))) - } - } - - pub async fn get_block_hash(&self, num: Option) -> Result> { - self.call( - "chain_getBlockHash", - &serde_json::json!({ - "num": num - }), - ) - .await - } +pub trait Rpc { + async fn get_block_hash(&self, num: Option) -> Result>; - pub async fn get_keys_paged( + async fn get_keys_paged( &self, key: &String, count: usize, start_key: Option<&String>, at: Option<&String>, - ) -> Result> { - self.call( - "state_getKeysPaged", - &serde_json::json!({ - "key": key, - "count": count, - "start_key": start_key, - "at": at - }), - ) - .await - } + ) -> Result>; - pub async fn get_storage(&self, key: String, at: Option) -> Result> { - self.call( - "state_getStorage", - &serde_json::json!({ - "key": key, - "at": at - }), - ) - .await - } + async fn get_storage(&self, key: String, at: Option) -> Result>; - pub async fn query_storage( + async fn query_storage( &self, keys: Vec, at: Option<&String>, - ) -> Result> { - self.call( - "state_queryStorageAt", - &serde_json::json!({ - "keys": keys, - "at": at - }), - ) - .await - } + ) -> Result>; - pub async fn get_metadata(&self, at: Option<&String>) -> Result { - self.call( - "state_getMetadata", - &serde_json::json!({ - "at": at - }), - ) - .await - } + async fn get_metadata(&self, at: Option<&String>) -> Result; } diff --git a/crates/chainql-core/src/client/rpc_http.rs b/crates/chainql-core/src/client/rpc_http.rs new file mode 100644 index 0000000..db34a6d --- /dev/null +++ b/crates/chainql-core/src/client/rpc_http.rs @@ -0,0 +1,209 @@ +use futures::FutureExt; +use reqwest::StatusCode; +use serde::{Deserialize, Serialize}; +use serde_json::json; +use sp_runtime::DeserializeOwned; +use tokio::{ + sync::Mutex, + time::{sleep, Duration, Instant}, +}; + +use crate::client::rpc::{QueryStorageResult, Result, Rpc, RpcError}; + +#[derive(Deserialize)] +pub struct Response { + result: Option, + error: Option, +} + +#[derive(Deserialize)] +pub struct ResponseError { + code: i32, + message: String, +} + +pub struct HttpClient { + client: reqwest::Client, + url: reqwest::Url, + rate_limiter: RateLimiter, +} + +impl HttpClient { + pub fn new(url: reqwest::Url, timeout: Duration) -> Result { + Ok(Self { + client: reqwest::Client::builder().timeout(timeout).build()?, + url: url, + rate_limiter: RateLimiter::new(), + }) + } + + async fn call(&self, method: &str, params: &impl Serialize) -> Result { + self.rate_limiter.wait().await; + + let body = serde_json::json!({ + "jsonrpc": "2.0", + "id": null, + "method": method, + "params": params, + }); + + let response = self + .client + .post(self.url.clone()) + .json(&body) + .send() + .await?; + + if response.status() == StatusCode::TOO_MANY_REQUESTS + || response.status() == StatusCode::GATEWAY_TIMEOUT + { + self.rate_limiter.request_limited().await; + return self.call(method, params).boxed_local().await; + } else { + self.rate_limiter.request_succeeded().await; + } + + if response.status() != StatusCode::OK { + return Err(RpcError::BadResponse(format!( + "unexpected status code {}", + response.status() + ))); + } + + let response_body = response.text().await?; + + let deserialized = serde_json::from_str::>(&response_body) + .map_err(|err| RpcError::BadResponse(err.to_string()))?; + + if let Some(result) = deserialized.result { + Ok(result) + } else if let Some(e) = deserialized.error { + Err(RpcError::Server { + code: e.code, + message: e.message, + }) + } else { + Err(RpcError::BadResponse(format!( + "no error or result in json '{response_body}'" + ))) + } + } +} + +impl Rpc for HttpClient { + async fn get_block_hash(&self, num: Option) -> Result> { + self.call( + "chain_getBlockHash", + &json!({ + "num": num + }), + ) + .await + } + + async fn get_keys_paged( + &self, + key: &String, + count: usize, + start_key: Option<&String>, + at: Option<&String>, + ) -> Result> { + self.call( + "state_getKeysPaged", + &json!({ + "key": key, + "count": count, + "start_key": start_key, + "at": at + }), + ) + .await + } + + async fn get_storage(&self, key: String, at: Option) -> Result> { + self.call( + "state_getStorage", + &json!({ + "key": key, + "at": at + }), + ) + .await + } + + async fn query_storage( + &self, + keys: Vec, + at: Option<&String>, + ) -> Result> { + self.call( + "state_queryStorageAt", + &json!({ + "keys": keys, + "at": at + }), + ) + .await + } + + async fn get_metadata(&self, at: Option<&String>) -> Result { + self.call( + "state_getMetadata", + &json!({ + "at": at + }), + ) + .await + } +} + +struct RateLimiter(Mutex); + +struct RateLimiterState { + rps: u32, + increase_param: u32, + decrease_factor: f32, + last_requested_at: Option, +} + +impl RateLimiter { + fn new() -> Self { + Self(Mutex::new(RateLimiterState { + rps: 1000, + increase_param: 50, + decrease_factor: 0.8, + last_requested_at: None, + })) + } + + async fn wait(&self) { + let requested_at = Instant::now(); + + let sleep_duration = { + let mut this = self.0.lock().await; + + if let Some(last_requested_at) = this.last_requested_at.replace(requested_at) { + (Duration::from_secs(60) / this.rps) + .saturating_sub(requested_at - last_requested_at) + } else { + Duration::ZERO + } + }; + + sleep(sleep_duration).await + } + + async fn request_succeeded(&self) { + let mut this = self.0.lock().await; + + this.rps += this.increase_param; + } + + async fn request_limited(&self) { + let mut this = self.0.lock().await; + + let new_rps = ((this.rps as f32) * this.decrease_factor).round() as u32; + + this.rps = if new_rps > 0 { new_rps } else { 1 }; + } +} diff --git a/crates/chainql-core/src/client/rpc_ws.rs b/crates/chainql-core/src/client/rpc_ws.rs new file mode 100644 index 0000000..e69de29 From 6950e4a7db164a32095a37a27c1491acf6141b41 Mon Sep 17 00:00:00 2001 From: Valery Klachkov Date: Fri, 12 Sep 2025 16:08:03 +0200 Subject: [PATCH 5/8] Restore WebSocket client --- Cargo.lock | 299 ++++++++++++++++++++- cmds/chainql/src/main.rs | 10 +- crates/chainql-core/Cargo.toml | 2 + crates/chainql-core/src/client/live.rs | 41 ++- crates/chainql-core/src/client/rpc.rs | 11 +- crates/chainql-core/src/client/rpc_http.rs | 15 +- crates/chainql-core/src/client/rpc_ws.rs | 102 +++++++ 7 files changed, 452 insertions(+), 28 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 47614c0..648290d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -457,6 +457,17 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "atomic-waker" version = "1.1.2" @@ -664,6 +675,12 @@ dependencies = [ "shlex", ] +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + [[package]] name = "cfg-if" version = "1.0.3" @@ -689,6 +706,7 @@ dependencies = [ name = "chainql-core" version = "0.4.10" dependencies = [ + "async-trait", "chainql-frame-metadata", "cumulus-primitives-proof-size-hostfunction", "directories", @@ -696,6 +714,7 @@ dependencies = [ "hex", "jrsonnet-evaluator", "jrsonnet-gcmodule", + "jsonrpsee", "libsecp256k1", "num-bigint", "num-traits", @@ -773,6 +792,16 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + [[package]] name = "common-path" version = "1.0.0" @@ -834,6 +863,16 @@ dependencies = [ "libc", ] +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -1615,6 +1654,12 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +[[package]] +name = "futures-timer" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" + [[package]] name = "futures-util" version = "0.3.31" @@ -2297,6 +2342,28 @@ dependencies = [ "syn 2.0.106", ] +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + [[package]] name = "jobserver" version = "0.1.34" @@ -2336,7 +2403,7 @@ dependencies = [ "jrsonnet-types", "num-bigint", "pathdiff", - "rustc-hash", + "rustc-hash 1.1.0", "serde", "stacker", "static_assertions", @@ -2372,7 +2439,7 @@ checksum = "829e3aac0a8b54b2beec0cd8a79ff1622f3eb5679eea20ce89506c45d81bf294" dependencies = [ "hashbrown 0.14.5", "jrsonnet-gcmodule", - "rustc-hash", + "rustc-hash 1.1.0", ] [[package]] @@ -2440,6 +2507,103 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "jsonrpsee" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f3f48dc3e6b8bd21e15436c1ddd0bc22a6a54e8ec46fedd6adf3425f396ec6a" +dependencies = [ + "jsonrpsee-core", + "jsonrpsee-proc-macros", + "jsonrpsee-types", + "jsonrpsee-ws-client", + "tracing", +] + +[[package]] +name = "jsonrpsee-client-transport" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf36eb27f8e13fa93dcb50ccb44c417e25b818cfa1a481b5470cd07b19c60b98" +dependencies = [ + "base64 0.22.1", + "futures-util", + "http", + "jsonrpsee-core", + "pin-project", + "rustls", + "rustls-pki-types", + "rustls-platform-verifier", + "soketto", + "thiserror 2.0.16", + "tokio", + "tokio-rustls", + "tokio-util", + "tracing", + "url", +] + +[[package]] +name = "jsonrpsee-core" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "316c96719901f05d1137f19ba598b5fe9c9bc39f4335f67f6be8613921946480" +dependencies = [ + "async-trait", + "futures-timer", + "futures-util", + "http", + "jsonrpsee-types", + "pin-project", + "rustc-hash 2.1.1", + "serde", + "serde_json", + "thiserror 2.0.16", + "tokio", + "tokio-stream", + "tower", + "tracing", +] + +[[package]] +name = "jsonrpsee-proc-macros" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2da3f8ab5ce1bb124b6d082e62dffe997578ceaf0aeb9f3174a214589dc00f07" +dependencies = [ + "heck", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "jsonrpsee-types" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc88ff4688e43cc3fa9883a8a95c6fa27aa2e76c96e610b737b6554d650d7fd5" +dependencies = [ + "http", + "serde", + "serde_json", + "thiserror 2.0.16", +] + +[[package]] +name = "jsonrpsee-ws-client" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b6fceceeb05301cc4c065ab3bd2fa990d41ff4eb44e4ca1b30fa99c057c3e79" +dependencies = [ + "http", + "jsonrpsee-client-transport", + "jsonrpsee-core", + "jsonrpsee-types", + "tower", + "url", +] + [[package]] name = "k256" version = "0.13.4" @@ -2682,7 +2846,7 @@ dependencies = [ "openssl-probe", "openssl-sys", "schannel", - "security-framework", + "security-framework 2.11.1", "security-framework-sys", "tempfile", ] @@ -2992,6 +3156,26 @@ version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "pin-project-lite" version = "0.2.16" @@ -3452,6 +3636,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + [[package]] name = "rustc-hex" version = "2.1.0" @@ -3500,13 +3690,27 @@ version = "0.23.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" dependencies = [ + "log", "once_cell", + "ring", "rustls-pki-types", "rustls-webpki", "subtle", "zeroize", ] +[[package]] +name = "rustls-native-certs" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework 3.4.0", +] + [[package]] name = "rustls-pki-types" version = "1.12.0" @@ -3516,6 +3720,33 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rustls-platform-verifier" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19787cda76408ec5404443dc8b31795c87cd8fec49762dc75fa727740d34acc1" +dependencies = [ + "core-foundation 0.10.1", + "core-foundation-sys", + "jni", + "log", + "once_cell", + "rustls", + "rustls-native-certs", + "rustls-platform-verifier-android", + "rustls-webpki", + "security-framework 3.4.0", + "security-framework-sys", + "webpki-root-certs 0.26.11", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustls-platform-verifier-android" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" + [[package]] name = "rustls-webpki" version = "0.103.4" @@ -3747,7 +3978,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ "bitflags 2.9.4", - "core-foundation", + "core-foundation 0.9.4", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b369d18893388b345804dc0007963c99b7d665ae71d275812d828c6f089640" +dependencies = [ + "bitflags 2.9.4", + "core-foundation 0.10.1", "core-foundation-sys", "libc", "security-framework-sys", @@ -3957,6 +4201,21 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "soketto" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e859df029d160cb88608f5d7df7fb4753fd20fdfb4de5644f3d8b8440841721" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures", + "httparse", + "log", + "rand", + "sha1", +] + [[package]] name = "sp-api" version = "38.0.0" @@ -4541,7 +4800,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ "bitflags 2.9.4", - "core-foundation", + "core-foundation 0.9.4", "system-configuration-sys", ] @@ -4743,6 +5002,17 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-stream" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + [[package]] name = "tokio-util" version = "0.7.16" @@ -4751,6 +5021,7 @@ checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" dependencies = [ "bytes", "futures-core", + "futures-io", "futures-sink", "pin-project-lite", "tokio", @@ -5526,6 +5797,24 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webpki-root-certs" +version = "0.26.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75c7f0ef91146ebfb530314f5f1d24528d7f0767efbfd31dce919275413e393e" +dependencies = [ + "webpki-root-certs 1.0.2", +] + +[[package]] +name = "webpki-root-certs" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e4ffd8df1c57e87c325000a3d6ef93db75279dc3a231125aac571650f22b12a" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "winapi" version = "0.3.9" diff --git a/cmds/chainql/src/main.rs b/cmds/chainql/src/main.rs index 3633e67..705fb83 100644 --- a/cmds/chainql/src/main.rs +++ b/cmds/chainql/src/main.rs @@ -4,9 +4,9 @@ use clap::Parser; use jrsonnet_cli::{InputOpts, MiscOpts, StdOpts, TlaOpts, TraceOpts}; use jrsonnet_evaluator::{apply_tla, bail, error::Result, manifest::JsonFormat, State}; use tokio::runtime::Handle; -use tracing_indicatif::IndicatifLayer; +use tracing_indicatif::{filter::{hide_indicatif_span_fields, IndicatifFilter}, IndicatifLayer}; use tracing_subscriber::{ - fmt::writer::MakeWriterExt, layer::SubscriberExt, util::SubscriberInitExt, + fmt::{format::DefaultFields, writer::MakeWriterExt}, layer::SubscriberExt, util::SubscriberInitExt, Layer, }; /// chainql @@ -27,7 +27,9 @@ struct Opts { } /// Set up Jrsonnet. fn main_jrsonnet(opts: Opts) -> Result { - let indicatif_layer = IndicatifLayer::new(); + let indicatif_layer = IndicatifLayer::new() + .with_span_field_formatter(hide_indicatif_span_fields(DefaultFields::new())); + tracing_subscriber::registry() .with( tracing_subscriber::fmt::layer().without_time().with_writer( @@ -36,7 +38,7 @@ fn main_jrsonnet(opts: Opts) -> Result { .with_max_level(tracing::Level::INFO), ), ) - .with(indicatif_layer) + .with(indicatif_layer.with_filter(IndicatifFilter::new(false))) .init(); let import_resolver = opts.misc.import_resolver(); diff --git a/crates/chainql-core/Cargo.toml b/crates/chainql-core/Cargo.toml index 6fe4df3..f4abec8 100644 --- a/crates/chainql-core/Cargo.toml +++ b/crates/chainql-core/Cargo.toml @@ -33,3 +33,5 @@ reqwest = { version = "0.12.23", features = ["json"] } url = "2.5.7" tracing = "0.1.41" tracing-indicatif = "0.3.13" +jsonrpsee = { version = "0.26.0", features = ["macros", "ws-client"] } +async-trait = "0.1.89" diff --git a/crates/chainql-core/src/client/live.rs b/crates/chainql-core/src/client/live.rs index 74342a9..132f9d8 100644 --- a/crates/chainql-core/src/client/live.rs +++ b/crates/chainql-core/src/client/live.rs @@ -17,14 +17,20 @@ use tokio::runtime::Handle; use tracing::{info_span, Span}; use tracing_indicatif::span_ext::IndicatifSpanExt; use tracing_indicatif::style::ProgressStyle; +use url::Url; -use crate::client::rpc::{Rpc, RpcError}; +use crate::client::rpc::{RpcClient, RpcError}; use crate::client::rpc_http::HttpClient; +use crate::client::rpc_ws::WsClient; use super::ClientT; #[derive(Error, Debug)] pub enum Error { + #[error("url error: {0}")] + UrlParse(#[from] url::ParseError), + #[error("unsupported url scheme: {0}")] + UnsupportedUrlScheme(String), #[error("rpc error: {0}")] Rpc(#[from] RpcError), #[error("unsupported metadata version, only v14 is supported")] @@ -35,8 +41,6 @@ pub enum Error { BlockNotFound(Option), #[error("block history is not supported")] BlockHistoryNotSupported, - #[error("url: {0}")] - UrlParse(#[from] url::ParseError), } pub type Result = result::Result; @@ -44,16 +48,31 @@ pub type Result = result::Result; #[derive(Clone, Trace)] pub struct ClientShared { #[trace(skip)] - rpc_client: Rc, + rpc_client: Rc>, } impl ClientShared { pub fn new(url: impl AsRef) -> Result { - let url = url.as_ref().parse()?; - let rpc_client = HttpClient::new(url, Duration::from_secs(300))?; + let url: Url = url.as_ref().parse()?; + let timeout: Duration = Duration::from_secs(300); + + let client: Box = match url.scheme() { + "http" | "https" => { + let client = HttpClient::new(url, timeout)?; + Box::new(client) + } + "ws" | "wss" => { + let handle = Handle::current(); + let client = handle.block_on(WsClient::new(url, timeout))?; + Box::new(client) + } + scheme => { + return Err(Error::UnsupportedUrlScheme(scheme.to_owned())); + } + }; Ok(Self { - rpc_client: Rc::new(rpc_client), + rpc_client: Rc::new(client), }) } @@ -119,7 +138,7 @@ peg::parser!( #[derive(Clone, Trace)] pub struct LiveClient { #[trace(skip)] - real: Rc, + real: Rc>, #[trace(skip)] #[allow(clippy::type_complexity)] key_value_cache: Rc, Option>>>>, @@ -259,9 +278,9 @@ impl LiveClient { cache.insert(key.to_vec(), value.clone()); Ok(value) } - +// #[tracing::instrument(fields(indicatif.pb_show))] pub fn preload_storage(&self, keys: &[&Vec]) -> Result<()> { - let header_span = info_span!("preload_storage"); + let header_span = info_span!("preload_storage", indicatif.pb_show = true); header_span .pb_set_style(&ProgressStyle::with_template("{msg} {wide_bar} {pos}/{len}").unwrap()); header_span.pb_set_length(keys.len() as u64); @@ -273,7 +292,7 @@ impl LiveClient { let handle = Handle::current(); handle.block_on( futures::stream::iter( - keys.chunks(self.keys_chunk_size) + keys.chunks(10) .map(|slice| self.preload_storage_fallback(slice)), ) .buffer_unordered(self.max_workers) diff --git a/crates/chainql-core/src/client/rpc.rs b/crates/chainql-core/src/client/rpc.rs index c3dfe00..ea782d0 100644 --- a/crates/chainql-core/src/client/rpc.rs +++ b/crates/chainql-core/src/client/rpc.rs @@ -1,10 +1,14 @@ +use async_trait::async_trait; use serde::Deserialize; use thiserror::Error; #[derive(Debug, Error)] pub enum RpcError { - #[error("network error: {0}")] - Network(#[from] reqwest::Error), + #[error("reqwest error: {0}")] + Reqwest(#[from] reqwest::Error), + + #[error("jsonrpsee error: {0}")] + Jsonrpsee(#[from] jsonrpsee::core::ClientError), #[error("bad response: {0}")] BadResponse(String), @@ -20,7 +24,8 @@ pub struct QueryStorageResult { pub changes: Vec<(String, Option)>, } -pub trait Rpc { +#[async_trait] +pub trait RpcClient { async fn get_block_hash(&self, num: Option) -> Result>; async fn get_keys_paged( diff --git a/crates/chainql-core/src/client/rpc_http.rs b/crates/chainql-core/src/client/rpc_http.rs index db34a6d..24a440b 100644 --- a/crates/chainql-core/src/client/rpc_http.rs +++ b/crates/chainql-core/src/client/rpc_http.rs @@ -1,4 +1,4 @@ -use futures::FutureExt; +use async_trait::async_trait; use reqwest::StatusCode; use serde::{Deserialize, Serialize}; use serde_json::json; @@ -8,7 +8,7 @@ use tokio::{ time::{sleep, Duration, Instant}, }; -use crate::client::rpc::{QueryStorageResult, Result, Rpc, RpcError}; +use crate::client::rpc::{QueryStorageResult, Result, RpcClient, RpcError}; #[derive(Deserialize)] pub struct Response { @@ -37,7 +37,11 @@ impl HttpClient { }) } - async fn call(&self, method: &str, params: &impl Serialize) -> Result { + async fn call(&self, method: &'static str, params: P) -> Result + where + P: Serialize, + T: DeserializeOwned, + { self.rate_limiter.wait().await; let body = serde_json::json!({ @@ -58,7 +62,7 @@ impl HttpClient { || response.status() == StatusCode::GATEWAY_TIMEOUT { self.rate_limiter.request_limited().await; - return self.call(method, params).boxed_local().await; + return Box::pin(self.call(method, params)).await; } else { self.rate_limiter.request_succeeded().await; } @@ -90,7 +94,8 @@ impl HttpClient { } } -impl Rpc for HttpClient { +#[async_trait] +impl RpcClient for HttpClient { async fn get_block_hash(&self, num: Option) -> Result> { self.call( "chain_getBlockHash", diff --git a/crates/chainql-core/src/client/rpc_ws.rs b/crates/chainql-core/src/client/rpc_ws.rs index e69de29..16f8fc5 100644 --- a/crates/chainql-core/src/client/rpc_ws.rs +++ b/crates/chainql-core/src/client/rpc_ws.rs @@ -0,0 +1,102 @@ +use async_trait::async_trait; +use jsonrpsee::proc_macros::rpc; +use tokio::time::Duration; + +use crate::client::rpc::{QueryStorageResult, Result, RpcClient, RpcError}; + +#[rpc(client)] +pub trait SubstrateRpc { + #[method(name = "chain_getBlockHash")] + fn get_block_hash(&self, num: Option) -> RpcResult>; + + #[method(name = "state_getKeysPaged")] + fn get_keys_paged( + &self, + key: &String, + count: usize, + start_key: Option<&String>, + at: Option<&String>, + ) -> RpcResult>; + + #[method(name = "state_getStorage")] + fn get_storage(&self, key: String, at: Option) -> RpcResult>; + + #[method(name = "state_queryStorageAt")] + fn query_storage( + &self, + keys: Vec, + at: Option<&String>, + ) -> RpcResult>; + + #[method(name = "state_getMetadata")] + fn get_metadata(&self, at: Option<&String>) -> RpcResult; +} + +pub struct WsClient { + client: jsonrpsee::ws_client::WsClient, +} + +impl WsClient { + pub async fn new(url: reqwest::Url, timeout: Duration) -> Result { + Ok(Self { + client: jsonrpsee::ws_client::WsClientBuilder::default() + .request_timeout(timeout) + .max_request_size(256 * 1024 * 1024) + .max_response_size(1024 * 1024 * 1024) + .build(url.to_string()) + .await?, + }) + } +} + +fn convert_error(err: jsonrpsee::core::ClientError) -> RpcError { + match err { + jsonrpsee::core::ClientError::Call(err) => RpcError::Server { + code: err.code(), + message: err.message().to_owned(), + }, + _ => RpcError::Jsonrpsee(err), + } +} + +#[async_trait] +impl RpcClient for WsClient { + async fn get_block_hash(&self, num: Option) -> Result> { + self.client.get_block_hash(num).await.map_err(convert_error) + } + + async fn get_keys_paged( + &self, + key: &String, + count: usize, + start_key: Option<&String>, + at: Option<&String>, + ) -> Result> { + self.client + .get_keys_paged(key, count, start_key, at) + .await + .map_err(convert_error) + } + + async fn get_storage(&self, key: String, at: Option) -> Result> { + self.client + .get_storage(key, at) + .await + .map_err(convert_error) + } + + async fn query_storage( + &self, + keys: Vec, + at: Option<&String>, + ) -> Result> { + self.client + .query_storage(keys, at) + .await + .map_err(convert_error) + } + + async fn get_metadata(&self, at: Option<&String>) -> Result { + self.client.get_metadata(at).await.map_err(convert_error) + } +} From 99a168c11918470d72303311a2fb776128b8639f Mon Sep 17 00:00:00 2001 From: Valery Klachkov Date: Fri, 12 Sep 2025 22:28:38 +0200 Subject: [PATCH 6/8] Fix params in HTTP client --- crates/chainql-core/src/client/live.rs | 6 ++-- crates/chainql-core/src/client/rpc_http.rs | 37 +++------------------- 2 files changed, 8 insertions(+), 35 deletions(-) diff --git a/crates/chainql-core/src/client/live.rs b/crates/chainql-core/src/client/live.rs index 132f9d8..678ba3a 100644 --- a/crates/chainql-core/src/client/live.rs +++ b/crates/chainql-core/src/client/live.rs @@ -55,7 +55,7 @@ impl ClientShared { pub fn new(url: impl AsRef) -> Result { let url: Url = url.as_ref().parse()?; let timeout: Duration = Duration::from_secs(300); - + let client: Box = match url.scheme() { "http" | "https" => { let client = HttpClient::new(url, timeout)?; @@ -278,7 +278,7 @@ impl LiveClient { cache.insert(key.to_vec(), value.clone()); Ok(value) } -// #[tracing::instrument(fields(indicatif.pb_show))] + pub fn preload_storage(&self, keys: &[&Vec]) -> Result<()> { let header_span = info_span!("preload_storage", indicatif.pb_show = true); header_span @@ -292,7 +292,7 @@ impl LiveClient { let handle = Handle::current(); handle.block_on( futures::stream::iter( - keys.chunks(10) + keys.chunks(self.keys_chunk_size) .map(|slice| self.preload_storage_fallback(slice)), ) .buffer_unordered(self.max_workers) diff --git a/crates/chainql-core/src/client/rpc_http.rs b/crates/chainql-core/src/client/rpc_http.rs index 24a440b..a721408 100644 --- a/crates/chainql-core/src/client/rpc_http.rs +++ b/crates/chainql-core/src/client/rpc_http.rs @@ -97,13 +97,7 @@ impl HttpClient { #[async_trait] impl RpcClient for HttpClient { async fn get_block_hash(&self, num: Option) -> Result> { - self.call( - "chain_getBlockHash", - &json!({ - "num": num - }), - ) - .await + self.call("chain_getBlockHash", json!([num])).await } async fn get_keys_paged( @@ -113,27 +107,12 @@ impl RpcClient for HttpClient { start_key: Option<&String>, at: Option<&String>, ) -> Result> { - self.call( - "state_getKeysPaged", - &json!({ - "key": key, - "count": count, - "start_key": start_key, - "at": at - }), - ) - .await + self.call("state_getKeysPaged", json!([key, count, start_key, at])) + .await } async fn get_storage(&self, key: String, at: Option) -> Result> { - self.call( - "state_getStorage", - &json!({ - "key": key, - "at": at - }), - ) - .await + self.call("state_getStorage", json!([key, at])).await } async fn query_storage( @@ -152,13 +131,7 @@ impl RpcClient for HttpClient { } async fn get_metadata(&self, at: Option<&String>) -> Result { - self.call( - "state_getMetadata", - &json!({ - "at": at - }), - ) - .await + self.call("state_getMetadata", json!([at])).await } } From 967d1b2cdf95f00cd3a95c3b4ac54c2269944672 Mon Sep 17 00:00:00 2001 From: Valery Klachkov Date: Tue, 30 Sep 2025 08:55:46 +0200 Subject: [PATCH 7/8] Rename rps to rpm --- crates/chainql-core/src/client/rpc_http.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/crates/chainql-core/src/client/rpc_http.rs b/crates/chainql-core/src/client/rpc_http.rs index a721408..59170b8 100644 --- a/crates/chainql-core/src/client/rpc_http.rs +++ b/crates/chainql-core/src/client/rpc_http.rs @@ -138,7 +138,7 @@ impl RpcClient for HttpClient { struct RateLimiter(Mutex); struct RateLimiterState { - rps: u32, + rpm: u32, increase_param: u32, decrease_factor: f32, last_requested_at: Option, @@ -147,7 +147,7 @@ struct RateLimiterState { impl RateLimiter { fn new() -> Self { Self(Mutex::new(RateLimiterState { - rps: 1000, + rpm: 1000, increase_param: 50, decrease_factor: 0.8, last_requested_at: None, @@ -161,7 +161,7 @@ impl RateLimiter { let mut this = self.0.lock().await; if let Some(last_requested_at) = this.last_requested_at.replace(requested_at) { - (Duration::from_secs(60) / this.rps) + (Duration::from_secs(60) / this.rpm) .saturating_sub(requested_at - last_requested_at) } else { Duration::ZERO @@ -174,14 +174,14 @@ impl RateLimiter { async fn request_succeeded(&self) { let mut this = self.0.lock().await; - this.rps += this.increase_param; + this.rpm += this.increase_param; } async fn request_limited(&self) { let mut this = self.0.lock().await; - let new_rps = ((this.rps as f32) * this.decrease_factor).round() as u32; + let new_rps = ((this.rpm as f32) * this.decrease_factor).round() as u32; - this.rps = if new_rps > 0 { new_rps } else { 1 }; + this.rpm = if new_rps > 0 { new_rps } else { 1 }; } } From 3970ce00cde865bec5f17d2a5c3eadb08b7ac4ab Mon Sep 17 00:00:00 2001 From: Valery Klachkov Date: Tue, 30 Sep 2025 09:11:53 +0200 Subject: [PATCH 8/8] Use guard for rate limiter --- crates/chainql-core/src/client/rpc_http.rs | 52 +++++++++++++++++----- 1 file changed, 40 insertions(+), 12 deletions(-) diff --git a/crates/chainql-core/src/client/rpc_http.rs b/crates/chainql-core/src/client/rpc_http.rs index 59170b8..7d5cdf1 100644 --- a/crates/chainql-core/src/client/rpc_http.rs +++ b/crates/chainql-core/src/client/rpc_http.rs @@ -3,10 +3,8 @@ use reqwest::StatusCode; use serde::{Deserialize, Serialize}; use serde_json::json; use sp_runtime::DeserializeOwned; -use tokio::{ - sync::Mutex, - time::{sleep, Duration, Instant}, -}; +use std::sync::Mutex; +use tokio::time::{sleep, Duration, Instant}; use crate::client::rpc::{QueryStorageResult, Result, RpcClient, RpcError}; @@ -42,6 +40,8 @@ impl HttpClient { P: Serialize, T: DeserializeOwned, { + let mut rate_limiter_guard = self.rate_limiter.request_pending(); + self.rate_limiter.wait().await; let body = serde_json::json!({ @@ -61,12 +61,12 @@ impl HttpClient { if response.status() == StatusCode::TOO_MANY_REQUESTS || response.status() == StatusCode::GATEWAY_TIMEOUT { - self.rate_limiter.request_limited().await; + drop(rate_limiter_guard); return Box::pin(self.call(method, params)).await; - } else { - self.rate_limiter.request_succeeded().await; } + rate_limiter_guard.succeeded(); + if response.status() != StatusCode::OK { return Err(RpcError::BadResponse(format!( "unexpected status code {}", @@ -158,7 +158,7 @@ impl RateLimiter { let requested_at = Instant::now(); let sleep_duration = { - let mut this = self.0.lock().await; + let mut this = self.0.lock().expect("not poisoned"); if let Some(last_requested_at) = this.last_requested_at.replace(requested_at) { (Duration::from_secs(60) / this.rpm) @@ -171,17 +171,45 @@ impl RateLimiter { sleep(sleep_duration).await } - async fn request_succeeded(&self) { - let mut this = self.0.lock().await; + fn request_pending(&self) -> RateLimiterGuard<'_> { + RateLimiterGuard { + rate_limiter: self, + succeeded: false, + } + } + + fn request_succeeded(&self) { + let mut this = self.0.lock().expect("not poisoned"); this.rpm += this.increase_param; } - async fn request_limited(&self) { - let mut this = self.0.lock().await; + fn request_limited(&self) { + let mut this = self.0.lock().expect("not poisoned"); let new_rps = ((this.rpm as f32) * this.decrease_factor).round() as u32; this.rpm = if new_rps > 0 { new_rps } else { 1 }; } } + +struct RateLimiterGuard<'a> { + rate_limiter: &'a RateLimiter, + succeeded: bool, +} + +impl RateLimiterGuard<'_> { + fn succeeded(&mut self) { + self.succeeded = true; + } +} + +impl Drop for RateLimiterGuard<'_> { + fn drop(&mut self) { + if self.succeeded { + self.rate_limiter.request_succeeded(); + } else { + self.rate_limiter.request_limited(); + } + } +}