From 12c57c917469e1d5ea8dbc906d7cd8a6f8b64ae0 Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson Date: Mon, 27 May 2024 12:30:55 +0200 Subject: [PATCH 01/17] rpc: upgrade jsonrpsee v0.23 --- Cargo.lock | 367 ++++++++++++++---- Cargo.toml | 1 + bridges/relays/client-substrate/Cargo.toml | 2 +- .../client/relay-chain-interface/Cargo.toml | 2 +- .../relay-chain-rpc-interface/Cargo.toml | 2 +- .../src/light_client_worker.rs | 4 +- cumulus/polkadot-parachain/Cargo.toml | 2 +- cumulus/test/service/Cargo.toml | 2 +- polkadot/rpc/Cargo.toml | 2 +- substrate/bin/node/cli/Cargo.toml | 2 +- substrate/bin/node/rpc/Cargo.toml | 2 +- .../client/consensus/babe/rpc/Cargo.toml | 2 +- .../client/consensus/beefy/rpc/Cargo.toml | 2 +- .../client/consensus/grandpa/rpc/Cargo.toml | 2 +- .../client/consensus/manual-seal/Cargo.toml | 2 +- .../merkle-mountain-range/rpc/Cargo.toml | 2 +- substrate/client/rpc-api/Cargo.toml | 2 +- substrate/client/rpc-servers/Cargo.toml | 10 +- substrate/client/rpc-servers/src/lib.rs | 81 ++-- substrate/client/rpc-servers/src/utils.rs | 14 +- substrate/client/rpc-spec-v2/Cargo.toml | 4 +- .../client/rpc-spec-v2/src/chain_head/api.rs | 14 +- .../rpc-spec-v2/src/chain_head/chain_head.rs | 68 ++-- .../client/rpc-spec-v2/src/transaction/api.rs | 4 +- .../src/transaction/transaction_broadcast.rs | 18 +- substrate/client/rpc/Cargo.toml | 2 +- substrate/client/rpc/src/utils.rs | 2 +- substrate/client/service/Cargo.toml | 2 +- substrate/client/sync-state-rpc/Cargo.toml | 2 +- .../frame/transaction-payment/rpc/Cargo.toml | 2 +- .../frame/remote-externalities/Cargo.toml | 2 +- .../frame/remote-externalities/src/lib.rs | 4 +- substrate/utils/frame/rpc/client/Cargo.toml | 2 +- .../rpc/state-trie-migration-rpc/Cargo.toml | 2 +- substrate/utils/frame/rpc/support/Cargo.toml | 4 +- substrate/utils/frame/rpc/system/Cargo.toml | 2 +- templates/minimal/node/Cargo.toml | 2 +- templates/parachain/node/Cargo.toml | 2 +- templates/solochain/node/Cargo.toml | 2 +- 39 files changed, 428 insertions(+), 217 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1767245c6abf..4365b93e9c3c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1368,6 +1368,12 @@ version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + [[package]] name = "base64ct" version = "1.6.0" @@ -2366,9 +2372,9 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "bytes" -version = "1.4.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" [[package]] name = "bzip2-sys" @@ -2445,6 +2451,12 @@ dependencies = [ "libc", ] +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + [[package]] name = "cexpr" version = "0.6.0" @@ -6416,7 +6428,26 @@ dependencies = [ "futures-core", "futures-sink", "futures-util", - "http", + "http 0.2.9", + "indexmap 2.2.3", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "h2" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http 1.1.0", "indexmap 2.2.3", "slab", "tokio", @@ -6624,6 +6655,17 @@ dependencies = [ "itoa", ] +[[package]] +name = "http" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + [[package]] name = "http-body" version = "0.4.5" @@ -6631,15 +6673,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" dependencies = [ "bytes", - "http", + "http 0.2.9", "pin-project-lite 0.2.12", ] [[package]] -name = "http-range-header" -version = "0.3.1" +name = "http-body" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "add0ab9360ddbd88cfeb3bd9574a1d85cfdfa14db10b3e21d3700dbc4328758f" +checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +dependencies = [ + "bytes", + "http 1.1.0", +] + +[[package]] +name = "http-body-util" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" +dependencies = [ + "bytes", + "futures-core", + "http 1.1.0", + "http-body 1.0.0", + "pin-project-lite 0.2.12", +] [[package]] name = "httparse" @@ -6669,9 +6728,9 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2", - "http", - "http-body", + "h2 0.3.26", + "http 0.2.9", + "http-body 0.4.5", "httparse", "httpdate", "itoa", @@ -6683,6 +6742,27 @@ dependencies = [ "want", ] +[[package]] +name = "hyper" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "h2 0.4.5", + "http 1.1.0", + "http-body 1.0.0", + "httparse", + "httpdate", + "itoa", + "pin-project-lite 0.2.12", + "smallvec", + "tokio", + "want", +] + [[package]] name = "hyper-rustls" version = "0.24.1" @@ -6690,8 +6770,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d78e1e73ec14cf7375674f74d7dde185c8206fd9dea6fb6295e8a98098aaa97" dependencies = [ "futures-util", - "http", - "hyper", + "http 0.2.9", + "hyper 0.14.27", "log", "rustls 0.21.6", "rustls-native-certs 0.6.3", @@ -6699,6 +6779,44 @@ dependencies = [ "tokio-rustls 0.24.1", ] +[[package]] +name = "hyper-rustls" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "908bb38696d7a037a01ebcc68a00634112ac2bbf8ca74e30a2c3d2f4f021302b" +dependencies = [ + "futures-util", + "http 1.1.0", + "hyper 1.3.1", + "hyper-util", + "log", + "rustls 0.23.8", + "rustls-pki-types", + "tokio", + "tokio-rustls 0.26.0", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.1.0", + "http-body 1.0.0", + "hyper 1.3.1", + "pin-project-lite 0.2.12", + "socket2 0.5.6", + "tokio", + "tower", + "tower-service", + "tracing", +] + [[package]] name = "iana-time-zone" version = "0.1.57" @@ -6988,7 +7106,7 @@ dependencies = [ "encoding_rs", "event-listener", "futures-lite", - "http", + "http 0.2.9", "log", "mime", "once_cell", @@ -7025,6 +7143,26 @@ version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +[[package]] +name = "jni" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec" +dependencies = [ + "cesu8", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", +] + +[[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.26" @@ -7062,9 +7200,9 @@ dependencies = [ [[package]] name = "jsonrpsee" -version = "0.22.5" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfdb12a2381ea5b2e68c3469ec604a007b367778cdb14d09612c8069ebd616ad" +checksum = "67210bd846b2dca59dc73f34717d6e1589305d506cdd6f14c849115d08e40876" dependencies = [ "jsonrpsee-core", "jsonrpsee-http-client", @@ -7078,20 +7216,22 @@ dependencies = [ [[package]] name = "jsonrpsee-client-transport" -version = "0.22.5" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4978087a58c3ab02efc5b07c5e5e2803024536106fd5506f558db172c889b3aa" +checksum = "e4c171d64176ae8f57eec75bca9f9dda2b2f746314adef9160a5bbbb2a7c82cb" dependencies = [ + "base64 0.22.1", "futures-util", - "http", + "http 1.1.0", "jsonrpsee-core", "pin-project", - "rustls-native-certs 0.7.0", + "rustls 0.23.8", "rustls-pki-types", - "soketto", + "rustls-platform-verifier", + "soketto 0.8.0", "thiserror", "tokio", - "tokio-rustls 0.25.0", + "tokio-rustls 0.26.0", "tokio-util", "tracing", "url", @@ -7099,16 +7239,19 @@ dependencies = [ [[package]] name = "jsonrpsee-core" -version = "0.22.5" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4b257e1ec385e07b0255dde0b933f948b5c8b8c28d42afda9587c3a967b896d" +checksum = "5e966c12c8b6c1790ce67683c792cea9dd250860df49f6b64f1b1ff6c6946850" dependencies = [ "anyhow", "async-trait", "beef", + "bytes", "futures-timer", "futures-util", - "hyper", + "http 1.1.0", + "http-body 1.0.0", + "http-body-util", "jsonrpsee-types", "parking_lot 0.12.1", "pin-project", @@ -7124,15 +7267,20 @@ dependencies = [ [[package]] name = "jsonrpsee-http-client" -version = "0.22.5" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ccf93fc4a0bfe05d851d37d7c32b7f370fe94336b52a2f0efc5f1981895c2e5" +checksum = "bb0187f1969287e5890d84460fe9f6556d98231e70b06179d4416e5c8c47167d" dependencies = [ "async-trait", - "hyper", - "hyper-rustls", + "base64 0.22.1", + "http-body 1.0.0", + "hyper 1.3.1", + "hyper-rustls 0.27.1", + "hyper-util", "jsonrpsee-core", "jsonrpsee-types", + "rustls 0.23.8", + "rustls-platform-verifier", "serde", "serde_json", "thiserror", @@ -7144,11 +7292,11 @@ dependencies = [ [[package]] name = "jsonrpsee-proc-macros" -version = "0.22.5" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d0bb047e79a143b32ea03974a6bf59b62c2a4c5f5d42a381c907a8bbb3f75c0" +checksum = "9f7af1b5071dc1c61b06900f8f3e17f886b1b08e926166e575018643879f63b6" dependencies = [ - "heck 0.4.1", + "heck 0.5.0", "proc-macro-crate 3.1.0", "proc-macro2 1.0.82", "quote 1.0.35", @@ -7157,20 +7305,24 @@ dependencies = [ [[package]] name = "jsonrpsee-server" -version = "0.22.5" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12d8b6a9674422a8572e0b0abb12feeb3f2aeda86528c80d0350c2bd0923ab41" +checksum = "ba63ec742f5f9c4016ca4c443d04dc3ca56e240a26ebe6e56609a5109bd9d13f" dependencies = [ + "anyhow", "futures-util", - "http", - "hyper", + "http 1.1.0", + "http-body 1.0.0", + "http-body-util", + "hyper 1.3.1", + "hyper-util", "jsonrpsee-core", "jsonrpsee-types", "pin-project", "route-recognizer", "serde", "serde_json", - "soketto", + "soketto 0.8.0", "thiserror", "tokio", "tokio-stream", @@ -7181,12 +7333,13 @@ dependencies = [ [[package]] name = "jsonrpsee-types" -version = "0.22.5" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "150d6168405890a7a3231a3c74843f58b8959471f6df76078db2619ddee1d07d" +checksum = "328c33717b7bdc4f47cdf31c21d5449c5b713a800cb05cb767841ccf2944f9d9" dependencies = [ "anyhow", "beef", + "http 1.1.0", "serde", "serde_json", "thiserror", @@ -7194,11 +7347,11 @@ dependencies = [ [[package]] name = "jsonrpsee-ws-client" -version = "0.22.5" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58b9db2dfd5bb1194b0ce921504df9ceae210a345bc2f6c5a61432089bbab070" +checksum = "aeb22661e1c018eb503d5a47be2d39a176de832b047d2757fa86b3d2b34fc84e" dependencies = [ - "http", + "http 1.1.0", "jsonrpsee-client-transport", "jsonrpsee-core", "jsonrpsee-types", @@ -7780,7 +7933,7 @@ dependencies = [ "parking_lot 0.12.1", "quicksink", "rw-stream-sink", - "soketto", + "soketto 0.7.1", "url", "webpki-roots 0.22.6", ] @@ -13304,7 +13457,7 @@ dependencies = [ "bs58 0.5.0", "futures", "futures-timer", - "hyper", + "hyper 0.14.27", "log", "parity-scale-codec", "polkadot-primitives", @@ -15858,11 +16011,11 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "h2", - "http", - "http-body", - "hyper", - "hyper-rustls", + "h2 0.3.26", + "http 0.2.9", + "http-body 0.4.5", + "hyper 0.14.27", + "hyper-rustls 0.24.1", "ipnet", "js-sys", "log", @@ -16424,14 +16577,15 @@ dependencies = [ [[package]] name = "rustls" -version = "0.22.2" +version = "0.23.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e87c9956bd9807afa1f77e0f7594af32566e830e088a5576d27c5b6f30f49d41" +checksum = "79adb16721f56eb2d843e67676896a61ce7a0fa622dc18d3e372477a029d2740" dependencies = [ "log", + "once_cell", "ring 0.17.7", "rustls-pki-types", - "rustls-webpki 0.102.2", + "rustls-webpki 0.102.4", "subtle 2.5.0", "zeroize", ] @@ -16482,9 +16636,36 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.2.0" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" + +[[package]] +name = "rustls-platform-verifier" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5f0d26fa1ce3c790f9590868f0109289a044acb954525f933e2aa3b871c157d" +dependencies = [ + "core-foundation", + "core-foundation-sys", + "jni", + "log", + "once_cell", + "rustls 0.23.8", + "rustls-native-certs 0.7.0", + "rustls-platform-verifier-android", + "rustls-webpki 0.102.4", + "security-framework", + "security-framework-sys", + "webpki-roots 0.26.1", + "winapi", +] + +[[package]] +name = "rustls-platform-verifier-android" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a716eb65e3158e90e17cd93d855216e27bde02745ab842f2cab4a39dba1bacf" +checksum = "84e217e7fdc8466b5b35d30f8c0a30febd29173df4a3a0c2115d306b9c4117ad" [[package]] name = "rustls-webpki" @@ -16498,9 +16679,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.102.2" +version = "0.102.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610" +checksum = "ff448f7e92e913c4b7d4c6d8e4540a1724b319b4152b8aef6d4cf8339712b33e" dependencies = [ "ring 0.17.7", "rustls-pki-types", @@ -17585,8 +17766,8 @@ dependencies = [ "fnv", "futures", "futures-timer", - "hyper", - "hyper-rustls", + "hyper 0.14.27", + "hyper-rustls 0.24.1", "lazy_static", "libp2p", "log", @@ -17691,11 +17872,13 @@ dependencies = [ name = "sc-rpc-server" version = "11.0.0" dependencies = [ + "anyhow", "forwarded-header-value", "futures", "governor", - "http", - "hyper", + "http 1.1.0", + "hyper 1.3.1", + "hyper-util", "ip_network", "jsonrpsee", "log", @@ -18297,22 +18480,23 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.9.2" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +checksum = "770452e37cad93e0a50d5abc3990d2bc351c36d0328f86cefec2f2fb206eaef6" dependencies = [ "bitflags 1.3.2", "core-foundation", "core-foundation-sys", "libc", + "num-bigint", "security-framework-sys", ] [[package]] name = "security-framework-sys" -version = "2.9.1" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" dependencies = [ "core-foundation-sys", "libc", @@ -18802,9 +18986,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.2" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "smol" @@ -18879,7 +19063,7 @@ dependencies = [ "siphasher", "slab", "smallvec", - "soketto", + "soketto 0.7.1", "twox-hash", "wasmi", "x25519-dalek 2.0.0", @@ -19296,13 +19480,28 @@ dependencies = [ "bytes", "flate2", "futures", - "http", "httparse", "log", "rand 0.8.5", "sha-1 0.9.8", ] +[[package]] +name = "soketto" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37468c595637c10857701c990f93a40ce0e357cedb0953d1c26c8d8027f9bb53" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures", + "http 1.1.0", + "httparse", + "log", + "rand 0.8.5", + "sha1", +] + [[package]] name = "solochain-template-node" version = "0.0.0" @@ -20528,7 +20727,7 @@ dependencies = [ "scale-info", "serde", "serde_json", - "soketto", + "soketto 0.7.1", "staging-node-inspect", "substrate-cli-test-utils", "tempfile", @@ -20901,7 +21100,7 @@ dependencies = [ name = "substrate-prometheus-endpoint" version = "0.17.0" dependencies = [ - "hyper", + "hyper 0.14.27", "log", "prometheus", "thiserror", @@ -21777,11 +21976,11 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.25.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" +checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" dependencies = [ - "rustls 0.22.2", + "rustls 0.23.8", "rustls-pki-types", "tokio", ] @@ -21905,6 +22104,7 @@ dependencies = [ "futures-util", "pin-project", "pin-project-lite 0.2.12", + "tokio", "tower-layer", "tower-service", "tracing", @@ -21912,17 +22112,15 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.4.3" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ae70283aba8d2a8b411c695c437fe25b8b5e44e23e780662002fc72fb47a82" +checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" dependencies = [ "bitflags 2.4.0", "bytes", - "futures-core", - "futures-util", - "http", - "http-body", - "http-range-header", + "http 1.1.0", + "http-body 1.0.0", + "http-body-util", "pin-project-lite 0.2.12", "tower-layer", "tower-service", @@ -22255,7 +22453,7 @@ dependencies = [ "byteorder", "bytes", "data-encoding", - "http", + "http 0.2.9", "httparse", "log", "rand 0.8.5", @@ -23031,6 +23229,15 @@ version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14247bb57be4f377dfb94c72830b8ce8fc6beac03cf4bf7b9732eadd414123fc" +[[package]] +name = "webpki-roots" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3de34ae270483955a94f4b21bdaaeb83d508bb84a01435f393818edb0012009" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "westend-emulated-chain" version = "0.0.0" diff --git a/Cargo.toml b/Cargo.toml index d6099e420f91..5d9b525e7435 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -652,3 +652,4 @@ wasmi = { opt-level = 3 } x25519-dalek = { opt-level = 3 } yamux = { opt-level = 3 } zeroize = { opt-level = 3 } + diff --git a/bridges/relays/client-substrate/Cargo.toml b/bridges/relays/client-substrate/Cargo.toml index cb7eae4f340c..ea7e28c557bf 100644 --- a/bridges/relays/client-substrate/Cargo.toml +++ b/bridges/relays/client-substrate/Cargo.toml @@ -15,7 +15,7 @@ async-std = { version = "1.9.0", features = ["attributes"] } async-trait = "0.1.79" codec = { package = "parity-scale-codec", version = "3.6.12" } futures = "0.3.30" -jsonrpsee = { version = "0.22", features = ["macros", "ws-client"] } +jsonrpsee = { version = "0.23", features = ["macros", "ws-client"] } log = { workspace = true } num-traits = "0.2" rand = "0.8.5" diff --git a/cumulus/client/relay-chain-interface/Cargo.toml b/cumulus/client/relay-chain-interface/Cargo.toml index 5962c68bba7a..96b06a74b8d2 100644 --- a/cumulus/client/relay-chain-interface/Cargo.toml +++ b/cumulus/client/relay-chain-interface/Cargo.toml @@ -22,5 +22,5 @@ sc-client-api = { path = "../../../substrate/client/api" } futures = "0.3.28" async-trait = "0.1.79" thiserror = { workspace = true } -jsonrpsee-core = "0.22" +jsonrpsee-core = "0.23" parity-scale-codec = "3.6.12" diff --git a/cumulus/client/relay-chain-rpc-interface/Cargo.toml b/cumulus/client/relay-chain-rpc-interface/Cargo.toml index 2ec42ebca851..4b26f408c8a2 100644 --- a/cumulus/client/relay-chain-rpc-interface/Cargo.toml +++ b/cumulus/client/relay-chain-rpc-interface/Cargo.toml @@ -33,7 +33,7 @@ tokio-util = { version = "0.7.8", features = ["compat"] } futures = "0.3.28" futures-timer = "3.0.2" parity-scale-codec = "3.6.12" -jsonrpsee = { version = "0.22", features = ["ws-client"] } +jsonrpsee = { version = "0.23", features = ["ws-client"] } tracing = "0.1.37" async-trait = "0.1.79" url = "2.4.0" diff --git a/cumulus/client/relay-chain-rpc-interface/src/light_client_worker.rs b/cumulus/client/relay-chain-rpc-interface/src/light_client_worker.rs index 9a49b60281b3..2347dbb85f78 100644 --- a/cumulus/client/relay-chain-rpc-interface/src/light_client_worker.rs +++ b/cumulus/client/relay-chain-rpc-interface/src/light_client_worker.rs @@ -20,7 +20,7 @@ use futures::{channel::mpsc::Sender, prelude::*, stream::FuturesUnordered}; use jsonrpsee::core::client::{ - Client as JsonRpseeClient, ClientBuilder, ClientT, Error, ReceivedMessage, TransportReceiverT, + Client as JsonRpseeClient, ClientBuilder, ClientT, ReceivedMessage, TransportReceiverT, TransportSenderT, }; use smoldot_light::{ChainId, Client as SmoldotClient, JsonRpcResponses}; @@ -124,7 +124,7 @@ pub struct LightClientRpcWorker { } fn handle_notification( - maybe_header: Option>, + maybe_header: Option>, senders: &mut Vec>, ) -> Result<(), ()> { match maybe_header { diff --git a/cumulus/polkadot-parachain/Cargo.toml b/cumulus/polkadot-parachain/Cargo.toml index a22606edb6c5..4ad8623b5ef9 100644 --- a/cumulus/polkadot-parachain/Cargo.toml +++ b/cumulus/polkadot-parachain/Cargo.toml @@ -38,7 +38,7 @@ coretime-rococo-runtime = { path = "../parachains/runtimes/coretime/coretime-roc coretime-westend-runtime = { path = "../parachains/runtimes/coretime/coretime-westend" } bridge-hub-westend-runtime = { path = "../parachains/runtimes/bridge-hubs/bridge-hub-westend" } penpal-runtime = { path = "../parachains/runtimes/testing/penpal" } -jsonrpsee = { version = "0.22", features = ["server"] } +jsonrpsee = { version = "0.23", features = ["server"] } people-rococo-runtime = { path = "../parachains/runtimes/people/people-rococo" } people-westend-runtime = { path = "../parachains/runtimes/people/people-westend" } parachains-common = { path = "../parachains/common" } diff --git a/cumulus/test/service/Cargo.toml b/cumulus/test/service/Cargo.toml index 732d884528f8..c2e198c02d54 100644 --- a/cumulus/test/service/Cargo.toml +++ b/cumulus/test/service/Cargo.toml @@ -17,7 +17,7 @@ async-trait = "0.1.79" clap = { version = "4.5.3", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.6.12" } criterion = { version = "0.5.1", features = ["async_tokio"] } -jsonrpsee = { version = "0.22", features = ["server"] } +jsonrpsee = { version = "0.23", features = ["server"] } rand = "0.8.5" serde = { features = ["derive"], workspace = true, default-features = true } serde_json = { workspace = true, default-features = true } diff --git a/polkadot/rpc/Cargo.toml b/polkadot/rpc/Cargo.toml index 5af5e63b1753..405f391d93f4 100644 --- a/polkadot/rpc/Cargo.toml +++ b/polkadot/rpc/Cargo.toml @@ -10,7 +10,7 @@ description = "Polkadot specific RPC functionality." workspace = true [dependencies] -jsonrpsee = { version = "0.22", features = ["server"] } +jsonrpsee = { version = "0.23", features = ["server"] } polkadot-primitives = { path = "../primitives" } sc-client-api = { path = "../../substrate/client/api" } sp-blockchain = { path = "../../substrate/primitives/blockchain" } diff --git a/substrate/bin/node/cli/Cargo.toml b/substrate/bin/node/cli/Cargo.toml index 929cd6a29e38..e54ead255b15 100644 --- a/substrate/bin/node/cli/Cargo.toml +++ b/substrate/bin/node/cli/Cargo.toml @@ -41,7 +41,7 @@ array-bytes = "6.1" clap = { version = "4.5.3", features = ["derive"], optional = true } codec = { package = "parity-scale-codec", version = "3.6.12" } serde = { features = ["derive"], workspace = true, default-features = true } -jsonrpsee = { version = "0.22", features = ["server"] } +jsonrpsee = { version = "0.23", features = ["server"] } futures = "0.3.30" log = { workspace = true, default-features = true } rand = "0.8" diff --git a/substrate/bin/node/rpc/Cargo.toml b/substrate/bin/node/rpc/Cargo.toml index 894dbf0da85c..79020fe792ba 100644 --- a/substrate/bin/node/rpc/Cargo.toml +++ b/substrate/bin/node/rpc/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -jsonrpsee = { version = "0.22", features = ["server"] } +jsonrpsee = { version = "0.23", features = ["server"] } node-primitives = { path = "../primitives" } pallet-transaction-payment-rpc = { path = "../../../frame/transaction-payment/rpc" } mmr-rpc = { path = "../../../client/merkle-mountain-range/rpc" } diff --git a/substrate/client/consensus/babe/rpc/Cargo.toml b/substrate/client/consensus/babe/rpc/Cargo.toml index 4c755df541d7..aefdb782d7f0 100644 --- a/substrate/client/consensus/babe/rpc/Cargo.toml +++ b/substrate/client/consensus/babe/rpc/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -jsonrpsee = { version = "0.22.5", features = ["client-core", "macros", "server-core"] } +jsonrpsee = { version = "0.23", features = ["client-core", "macros", "server-core"] } futures = "0.3.30" serde = { features = ["derive"], workspace = true, default-features = true } thiserror = { workspace = true } diff --git a/substrate/client/consensus/beefy/rpc/Cargo.toml b/substrate/client/consensus/beefy/rpc/Cargo.toml index 07e46dbda156..3b7855213de7 100644 --- a/substrate/client/consensus/beefy/rpc/Cargo.toml +++ b/substrate/client/consensus/beefy/rpc/Cargo.toml @@ -14,7 +14,7 @@ workspace = true [dependencies] codec = { package = "parity-scale-codec", version = "3.6.12", features = ["derive"] } futures = "0.3.30" -jsonrpsee = { version = "0.22.5", features = ["client-core", "macros", "server-core"] } +jsonrpsee = { version = "0.23", features = ["client-core", "macros", "server-core"] } log = { workspace = true, default-features = true } parking_lot = "0.12.1" serde = { features = ["derive"], workspace = true, default-features = true } diff --git a/substrate/client/consensus/grandpa/rpc/Cargo.toml b/substrate/client/consensus/grandpa/rpc/Cargo.toml index d4e72baef3e7..9c2162593f85 100644 --- a/substrate/client/consensus/grandpa/rpc/Cargo.toml +++ b/substrate/client/consensus/grandpa/rpc/Cargo.toml @@ -15,7 +15,7 @@ workspace = true [dependencies] finality-grandpa = { version = "0.16.2", features = ["derive-codec"] } futures = "0.3.30" -jsonrpsee = { version = "0.22.5", features = ["client-core", "macros", "server-core"] } +jsonrpsee = { version = "0.23", features = ["client-core", "macros", "server-core"] } log = { workspace = true, default-features = true } parity-scale-codec = { version = "3.6.12", features = ["derive"] } serde = { features = ["derive"], workspace = true, default-features = true } diff --git a/substrate/client/consensus/manual-seal/Cargo.toml b/substrate/client/consensus/manual-seal/Cargo.toml index 33f5bf1f8c15..39fe100dcc10 100644 --- a/substrate/client/consensus/manual-seal/Cargo.toml +++ b/substrate/client/consensus/manual-seal/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -jsonrpsee = { version = "0.22.5", features = ["client-core", "macros", "server-core"] } +jsonrpsee = { version = "0.23", features = ["client-core", "macros", "server-core"] } assert_matches = "1.3.0" async-trait = "0.1.79" codec = { package = "parity-scale-codec", version = "3.6.12" } diff --git a/substrate/client/merkle-mountain-range/rpc/Cargo.toml b/substrate/client/merkle-mountain-range/rpc/Cargo.toml index 25e6e316a8be..c03787eb7463 100644 --- a/substrate/client/merkle-mountain-range/rpc/Cargo.toml +++ b/substrate/client/merkle-mountain-range/rpc/Cargo.toml @@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.12" } -jsonrpsee = { version = "0.22.5", features = ["client-core", "macros", "server-core"] } +jsonrpsee = { version = "0.23", features = ["client-core", "macros", "server-core"] } serde = { features = ["derive"], workspace = true, default-features = true } sp-api = { path = "../../../primitives/api" } sp-blockchain = { path = "../../../primitives/blockchain" } diff --git a/substrate/client/rpc-api/Cargo.toml b/substrate/client/rpc-api/Cargo.toml index d8f833e2b8d4..f7b8173de003 100644 --- a/substrate/client/rpc-api/Cargo.toml +++ b/substrate/client/rpc-api/Cargo.toml @@ -28,4 +28,4 @@ sp-core = { path = "../../primitives/core" } sp-rpc = { path = "../../primitives/rpc" } sp-runtime = { path = "../../primitives/runtime" } sp-version = { path = "../../primitives/version" } -jsonrpsee = { version = "0.22.5", features = ["client-core", "macros", "server-core"] } +jsonrpsee = { version = "0.23", features = ["client-core", "macros", "server-core"] } diff --git a/substrate/client/rpc-servers/Cargo.toml b/substrate/client/rpc-servers/Cargo.toml index 7837c852a1c9..e0d977afd442 100644 --- a/substrate/client/rpc-servers/Cargo.toml +++ b/substrate/client/rpc-servers/Cargo.toml @@ -16,16 +16,18 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] +anyhow = "1" forwarded-header-value = "0.1.1" futures = "0.3.30" governor = "0.6.0" -http = "0.2.8" -hyper = "0.14.27" +http = "1.1" +hyper = "1.3" +hyper-util = { version = "0.1", features = ["tokio", "service", "tokio", "server-auto"] } ip_network = "0.4.1" -jsonrpsee = { version = "0.22", features = ["server"] } +jsonrpsee = { version = "0.23", features = ["server"] } log = { workspace = true, default-features = true } prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus" } serde_json = { workspace = true, default-features = true } tokio = { version = "1.22.0", features = ["parking_lot"] } tower = { version = "0.4.13", features = ["util"] } -tower-http = { version = "0.4.0", features = ["cors"] } +tower-http = { version = "0.5.2", features = ["cors"] } diff --git a/substrate/client/rpc-servers/src/lib.rs b/substrate/client/rpc-servers/src/lib.rs index ba1fcf5e3677..47f9e85e4422 100644 --- a/substrate/client/rpc-servers/src/lib.rs +++ b/substrate/client/rpc-servers/src/lib.rs @@ -23,18 +23,12 @@ pub mod middleware; pub mod utils; -use std::{ - convert::Infallible, error::Error as StdError, net::SocketAddr, num::NonZeroU32, time::Duration, -}; +use std::{error::Error as StdError, net::SocketAddr, num::NonZeroU32, sync::Arc, time::Duration}; -use hyper::{ - server::conn::AddrStream, - service::{make_service_fn, service_fn}, -}; use jsonrpsee::{ server::{ - middleware::http::ProxyGetRequestLayer, stop_channel, ws, PingConfig, StopHandle, - TowerServiceBuilder, + middleware::http::ProxyGetRequestLayer, serve_with_graceful_shutdown, stop_channel, ws, + PingConfig, StopHandle, TowerServiceBuilder, }, Methods, RpcModule, }; @@ -99,6 +93,7 @@ struct PerConnection { metrics: Option, tokio_handle: tokio::runtime::Handle, service_builder: TowerServiceBuilder, + rate_limit_whitelisted_ips: Arc>, } /// Start RPC server listening on given address. @@ -126,8 +121,8 @@ where rate_limit_trust_proxy_headers, } = config; - let std_listener = TcpListener::bind(addrs.as_slice()).await?.into_std()?; - let local_addr = std_listener.local_addr().ok(); + let listener = TcpListener::bind(addrs.as_slice()).await?; + let local_addr = listener.local_addr().ok(); let host_filter = host_filtering(cors.is_some(), local_addr); let http_middleware = tower::ServiceBuilder::new() @@ -163,20 +158,38 @@ where methods: build_rpc_api(rpc_api).into(), service_builder: builder.to_service_builder(), metrics, - tokio_handle, - stop_handle: stop_handle.clone(), + tokio_handle: tokio_handle.clone(), + stop_handle, + rate_limit_whitelisted_ips: Arc::new(rate_limit_whitelisted_ips), }; - let make_service = make_service_fn(move |addr: &AddrStream| { - let cfg = cfg.clone(); - let rate_limit_whitelisted_ips = rate_limit_whitelisted_ips.clone(); - let ip = addr.remote_addr().ip(); - - async move { - let cfg = cfg.clone(); - let rate_limit_whitelisted_ips = rate_limit_whitelisted_ips.clone(); + tokio_handle.spawn(async move { + loop { + let (sock, remote_addr) = tokio::select! { + res = listener.accept() => { + match res { + Ok(s) => s, + Err(e) => { + log::debug!("Failed to accept ipv4 connection: {:?}", e); + continue; + } + } + } + _ = cfg.stop_handle.clone().shutdown() => break, + }; + + let ip = remote_addr.ip(); + let cfg2 = cfg.clone(); + let svc = tower::service_fn(move |req: http::Request| { + let PerConnection { + methods, + service_builder, + metrics, + tokio_handle, + stop_handle, + rate_limit_whitelisted_ips, + } = cfg2.clone(); - Ok::<_, Infallible>(service_fn(move |req| { let proxy_ip = if rate_limit_trust_proxy_headers { get_proxy_ip(&req) } else { None }; @@ -193,9 +206,6 @@ where rate_limit }; - let PerConnection { service_builder, metrics, tokio_handle, stop_handle, methods } = - cfg.clone(); - let is_websocket = ws::is_upgrade_request(&req); let transport_label = if is_websocket { "ws" } else { "http" }; @@ -215,7 +225,6 @@ where let rpc_middleware = RpcServiceBuilder::new().option_layer(middleware_layer.clone()); - let mut svc = service_builder.set_rpc_middleware(rpc_middleware).build(methods, stop_handle); @@ -232,17 +241,19 @@ where }); } - svc.call(req).await + // https://github.com/rust-lang/rust/issues/102211 the error type can't be inferred + // to be `Box` so we need to convert it to + // a concrete type as workaround. + svc.call(req).await.map_err(|e| anyhow::anyhow!("{:?}", e)) } - })) - } - }); - - let server = hyper::Server::from_tcp(std_listener)?.serve(make_service); + }); - tokio::spawn(async move { - let graceful = server.with_graceful_shutdown(async move { stop_handle.shutdown().await }); - let _ = graceful.await; + cfg.tokio_handle.spawn(serve_with_graceful_shutdown( + sock, + svc, + cfg.stop_handle.clone().shutdown(), + )); + } }); log::info!( diff --git a/substrate/client/rpc-servers/src/utils.rs b/substrate/client/rpc-servers/src/utils.rs index d99b8e637d9d..d9d943c7c1fb 100644 --- a/substrate/client/rpc-servers/src/utils.rs +++ b/substrate/client/rpc-servers/src/utils.rs @@ -25,10 +25,7 @@ use std::{ }; use forwarded_header_value::ForwardedHeaderValue; -use hyper::{ - header::{HeaderName, HeaderValue}, - Request, -}; +use http::header::{HeaderName, HeaderValue}; use jsonrpsee::{server::middleware::http::HostFilterLayer, RpcModule}; use tower_http::cors::{AllowOrigin, CorsLayer}; @@ -57,7 +54,7 @@ pub(crate) fn build_rpc_api(mut rpc_api: RpcModule) available_methods.sort(); rpc_api - .register_method("rpc_methods", move |_, _| { + .register_method("rpc_methods", move |_, _, _| { serde_json::json!({ "methods": available_methods, }) @@ -96,7 +93,7 @@ pub(crate) fn format_cors(maybe_cors: Option<&Vec>) -> String { /// 1. `Forwarded` header. /// 2. `X-Forwarded-For` header. /// 3. `X-Real-Ip`. -pub(crate) fn get_proxy_ip(req: &Request) -> Option { +pub(crate) fn get_proxy_ip(req: &http::Request) -> Option { if let Some(ip) = req .headers() .get(&FORWARDED) @@ -133,9 +130,10 @@ pub(crate) fn get_proxy_ip(req: &Request) -> Option { mod tests { use super::*; use hyper::header::HeaderValue; + use jsonrpsee::server::{HttpBody, HttpRequest}; - fn request() -> hyper::Request { - hyper::Request::builder().body(hyper::Body::empty()).unwrap() + fn request() -> http::Request { + HttpRequest::builder().body(HttpBody::empty()).unwrap() } #[test] diff --git a/substrate/client/rpc-spec-v2/Cargo.toml b/substrate/client/rpc-spec-v2/Cargo.toml index 8977c842d038..5fd03eb8c95d 100644 --- a/substrate/client/rpc-spec-v2/Cargo.toml +++ b/substrate/client/rpc-spec-v2/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -jsonrpsee = { version = "0.22.5", features = ["client-core", "macros", "server-core"] } +jsonrpsee = { version = "0.23", features = ["client-core", "macros", "server-core"] } # Internal chain structures for "chain_spec". sc-chain-spec = { path = "../chain-spec" } # Pool for submitting extrinsics required by "transaction" @@ -45,7 +45,7 @@ rand = "0.8.5" schnellru = "0.2.1" [dev-dependencies] -jsonrpsee = { version = "0.22", features = ["server", "ws-client"] } +jsonrpsee = { version = "0.23", features = ["server", "ws-client"] } serde_json = { workspace = true, default-features = true } tokio = { version = "1.22.0", features = ["macros"] } substrate-test-runtime-client = { path = "../../test-utils/runtime/client" } diff --git a/substrate/client/rpc-spec-v2/src/chain_head/api.rs b/substrate/client/rpc-spec-v2/src/chain_head/api.rs index 23cb0bbf5458..128d803521f6 100644 --- a/substrate/client/rpc-spec-v2/src/chain_head/api.rs +++ b/substrate/client/rpc-spec-v2/src/chain_head/api.rs @@ -54,7 +54,7 @@ pub trait ChainHeadApi { /// # Unstable /// /// This method is unstable and subject to change in the future. - #[method(name = "chainHead_v1_body", raw_method)] + #[method(name = "chainHead_v1_body", with_extensions)] async fn chain_head_unstable_body( &self, follow_subscription: String, @@ -73,7 +73,7 @@ pub trait ChainHeadApi { /// # Unstable /// /// This method is unstable and subject to change in the future. - #[method(name = "chainHead_v1_header", raw_method)] + #[method(name = "chainHead_v1_header", with_extensions)] async fn chain_head_unstable_header( &self, follow_subscription: String, @@ -85,7 +85,7 @@ pub trait ChainHeadApi { /// # Unstable /// /// This method is unstable and subject to change in the future. - #[method(name = "chainHead_v1_storage", raw_method)] + #[method(name = "chainHead_v1_storage", with_extensions)] async fn chain_head_unstable_storage( &self, follow_subscription: String, @@ -99,7 +99,7 @@ pub trait ChainHeadApi { /// # Unstable /// /// This method is unstable and subject to change in the future. - #[method(name = "chainHead_v1_call", raw_method)] + #[method(name = "chainHead_v1_call", with_extensions)] async fn chain_head_unstable_call( &self, follow_subscription: String, @@ -118,7 +118,7 @@ pub trait ChainHeadApi { /// # Unstable /// /// This method is unstable and subject to change in the future. - #[method(name = "chainHead_v1_unpin", raw_method)] + #[method(name = "chainHead_v1_unpin", with_extensions)] async fn chain_head_unstable_unpin( &self, follow_subscription: String, @@ -131,7 +131,7 @@ pub trait ChainHeadApi { /// # Unstable /// /// This method is unstable and subject to change in the future. - #[method(name = "chainHead_v1_continue", raw_method)] + #[method(name = "chainHead_v1_continue", with_extensions)] async fn chain_head_unstable_continue( &self, follow_subscription: String, @@ -145,7 +145,7 @@ pub trait ChainHeadApi { /// # Unstable /// /// This method is unstable and subject to change in the future. - #[method(name = "chainHead_v1_stopOperation", raw_method)] + #[method(name = "chainHead_v1_stopOperation", with_extensions)] async fn chain_head_unstable_stop_operation( &self, follow_subscription: String, diff --git a/substrate/client/rpc-spec-v2/src/chain_head/chain_head.rs b/substrate/client/rpc-spec-v2/src/chain_head/chain_head.rs index 6779180a4146..f0637c29a747 100644 --- a/substrate/client/rpc-spec-v2/src/chain_head/chain_head.rs +++ b/substrate/client/rpc-spec-v2/src/chain_head/chain_head.rs @@ -36,7 +36,7 @@ use crate::{ use codec::Encode; use futures::{channel::oneshot, future::FutureExt}; use jsonrpsee::{ - core::async_trait, server::ResponsePayload, types::SubscriptionId, ConnectionDetails, + core::async_trait, server::ResponsePayload, types::SubscriptionId, ConnectionId, Extensions, MethodResponseFuture, PendingSubscriptionSink, SubscriptionSink, }; use log::debug; @@ -207,7 +207,8 @@ where // The RAII `reserved_subscription` will clean up resources on drop: // - free the reserved subscription for the connection ID. // - remove the subscription ID from the subscription management. - let Some(mut reserved_subscription) = subscriptions.reserve_subscription(connection_id) + let Some(mut reserved_subscription) = + subscriptions.reserve_subscription(connection_id) else { pending.reject(ChainHeadRpcError::ReachedLimits).await; return @@ -251,14 +252,13 @@ where async fn chain_head_unstable_body( &self, - connection_details: ConnectionDetails, + ext: &Extensions, follow_subscription: String, hash: Block::Hash, ) -> ResponsePayload<'static, MethodResponse> { - if !self - .subscriptions - .contains_subscription(connection_details.id(), &follow_subscription) - { + let conn_id = *ext.get::().unwrap(); + + if !self.subscriptions.contains_subscription(conn_id, &follow_subscription) { // The spec says to return `LimitReached` if the follow subscription is invalid or // stale. return ResponsePayload::success(MethodResponse::LimitReached); @@ -335,14 +335,13 @@ where async fn chain_head_unstable_header( &self, - connection_details: ConnectionDetails, + ext: &Extensions, follow_subscription: String, hash: Block::Hash, ) -> Result, ChainHeadRpcError> { - if !self - .subscriptions - .contains_subscription(connection_details.id(), &follow_subscription) - { + let conn_id = *ext.get::().unwrap(); + + if !self.subscriptions.contains_subscription(conn_id, &follow_subscription) { return Ok(None); } @@ -371,16 +370,15 @@ where async fn chain_head_unstable_storage( &self, - connection_details: ConnectionDetails, + ext: &Extensions, follow_subscription: String, hash: Block::Hash, items: Vec>, child_trie: Option, ) -> ResponsePayload<'static, MethodResponse> { - if !self - .subscriptions - .contains_subscription(connection_details.id(), &follow_subscription) - { + let conn_id = *ext.get::().unwrap(); + + if !self.subscriptions.contains_subscription(conn_id, &follow_subscription) { // The spec says to return `LimitReached` if the follow subscription is invalid or // stale. return ResponsePayload::success(MethodResponse::LimitReached); @@ -452,7 +450,7 @@ where async fn chain_head_unstable_call( &self, - connection_details: ConnectionDetails, + ext: &Extensions, follow_subscription: String, hash: Block::Hash, function: String, @@ -463,10 +461,9 @@ where Err(err) => return ResponsePayload::error(err), }; - if !self - .subscriptions - .contains_subscription(connection_details.id(), &follow_subscription) - { + let conn_id = *ext.get::().unwrap(); + + if !self.subscriptions.contains_subscription(conn_id, &follow_subscription) { // The spec says to return `LimitReached` if the follow subscription is invalid or // stale. return ResponsePayload::success(MethodResponse::LimitReached); @@ -530,14 +527,13 @@ where async fn chain_head_unstable_unpin( &self, - connection_details: ConnectionDetails, + ext: &Extensions, follow_subscription: String, hash_or_hashes: ListOrValue, ) -> Result<(), ChainHeadRpcError> { - if !self - .subscriptions - .contains_subscription(connection_details.id(), &follow_subscription) - { + let conn_id = *ext.get::().unwrap(); + + if !self.subscriptions.contains_subscription(conn_id, &follow_subscription) { return Ok(()); } @@ -566,14 +562,13 @@ where async fn chain_head_unstable_continue( &self, - connection_details: ConnectionDetails, + ext: &Extensions, follow_subscription: String, operation_id: String, ) -> Result<(), ChainHeadRpcError> { - if !self - .subscriptions - .contains_subscription(connection_details.id(), &follow_subscription) - { + let conn_id = *ext.get::().unwrap(); + + if !self.subscriptions.contains_subscription(conn_id, &follow_subscription) { return Ok(()) } @@ -592,14 +587,13 @@ where async fn chain_head_unstable_stop_operation( &self, - connection_details: ConnectionDetails, + ext: &Extensions, follow_subscription: String, operation_id: String, ) -> Result<(), ChainHeadRpcError> { - if !self - .subscriptions - .contains_subscription(connection_details.id(), &follow_subscription) - { + let conn_id = *ext.get::().unwrap(); + + if !self.subscriptions.contains_subscription(conn_id, &follow_subscription) { return Ok(()) } diff --git a/substrate/client/rpc-spec-v2/src/transaction/api.rs b/substrate/client/rpc-spec-v2/src/transaction/api.rs index ed358922d53e..6af6f1678440 100644 --- a/substrate/client/rpc-spec-v2/src/transaction/api.rs +++ b/substrate/client/rpc-spec-v2/src/transaction/api.rs @@ -48,7 +48,7 @@ pub trait TransactionBroadcastApi { /// /// This method is unstable and subject to change in the future. - #[method(name = "transaction_v1_broadcast", raw_method)] + #[method(name = "transaction_v1_broadcast", with_extensions)] async fn broadcast(&self, bytes: Bytes) -> RpcResult>; /// Broadcast an extrinsic to the chain. @@ -56,6 +56,6 @@ pub trait TransactionBroadcastApi { /// # Unstable /// /// This method is unstable and subject to change in the future. - #[method(name = "transaction_v1_stop", raw_method)] + #[method(name = "transaction_v1_stop", with_extensions)] async fn stop_broadcast(&self, operation_id: String) -> Result<(), ErrorBroadcast>; } diff --git a/substrate/client/rpc-spec-v2/src/transaction/transaction_broadcast.rs b/substrate/client/rpc-spec-v2/src/transaction/transaction_broadcast.rs index 68c19010e31c..cb22107366c7 100644 --- a/substrate/client/rpc-spec-v2/src/transaction/transaction_broadcast.rs +++ b/substrate/client/rpc-spec-v2/src/transaction/transaction_broadcast.rs @@ -27,7 +27,7 @@ use futures::{FutureExt, Stream, StreamExt}; use futures_util::stream::AbortHandle; use jsonrpsee::{ core::{async_trait, RpcResult}, - ConnectionDetails, + ConnectionId, Extensions, }; use parking_lot::RwLock; use rand::{distributions::Alphanumeric, Rng}; @@ -121,19 +121,15 @@ where ::Hash: Unpin, Client: HeaderBackend + BlockchainEvents + Send + Sync + 'static, { - async fn broadcast( - &self, - connection_details: ConnectionDetails, - bytes: Bytes, - ) -> RpcResult> { + async fn broadcast(&self, ext: &Extensions, bytes: Bytes) -> RpcResult> { let pool = self.pool.clone(); + let conn_id = *ext.get::().unwrap(); // The unique ID of this operation. let id = self.generate_unique_id(); // Ensure that the connection has not reached the maximum number of active operations. - let Some(reserved_connection) = self.rpc_connections.reserve_space(connection_details.id()) - else { + let Some(reserved_connection) = self.rpc_connections.reserve_space(conn_id) else { return Ok(None) }; let Some(reserved_identifier) = reserved_connection.register(id.clone()) else { @@ -245,11 +241,13 @@ where async fn stop_broadcast( &self, - connection_details: ConnectionDetails, + ext: &Extensions, operation_id: String, ) -> Result<(), ErrorBroadcast> { + let conn_id = *ext.get::().unwrap(); + // The operation ID must correlate to the same connection ID. - if !self.rpc_connections.contains_identifier(connection_details.id(), &operation_id) { + if !self.rpc_connections.contains_identifier(conn_id, &operation_id) { return Err(ErrorBroadcast::InvalidOperationID) } diff --git a/substrate/client/rpc/Cargo.toml b/substrate/client/rpc/Cargo.toml index 7dd46b2ab4c3..e0f8775c43df 100644 --- a/substrate/client/rpc/Cargo.toml +++ b/substrate/client/rpc/Cargo.toml @@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.12" } futures = "0.3.30" -jsonrpsee = { version = "0.22", features = ["server"] } +jsonrpsee = { version = "0.23", features = ["server"] } log = { workspace = true, default-features = true } parking_lot = "0.12.1" serde_json = { workspace = true, default-features = true } diff --git a/substrate/client/rpc/src/utils.rs b/substrate/client/rpc/src/utils.rs index 3b5372615e73..e05260e18fd6 100644 --- a/substrate/client/rpc/src/utils.rs +++ b/substrate/client/rpc/src/utils.rs @@ -130,7 +130,7 @@ async fn inner_pipe_from_stream( "Subscription buffer limit={} exceeded for subscription={} conn_id={}; dropping subscription", buf.max_cap, sink.method_name(), - sink.connection_id() + sink.connection_id().0 ); return } diff --git a/substrate/client/service/Cargo.toml b/substrate/client/service/Cargo.toml index dfdd485f15c0..cf8c6b43597f 100644 --- a/substrate/client/service/Cargo.toml +++ b/substrate/client/service/Cargo.toml @@ -28,7 +28,7 @@ runtime-benchmarks = [ ] [dependencies] -jsonrpsee = { version = "0.22", features = ["server"] } +jsonrpsee = { version = "0.23", features = ["server"] } thiserror = { workspace = true } futures = "0.3.30" rand = "0.8.5" diff --git a/substrate/client/sync-state-rpc/Cargo.toml b/substrate/client/sync-state-rpc/Cargo.toml index d5bdc920f7c9..7bfbbec790ae 100644 --- a/substrate/client/sync-state-rpc/Cargo.toml +++ b/substrate/client/sync-state-rpc/Cargo.toml @@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.12" } -jsonrpsee = { version = "0.22.5", features = ["client-core", "macros", "server-core"] } +jsonrpsee = { version = "0.23", features = ["client-core", "macros", "server-core"] } serde = { features = ["derive"], workspace = true, default-features = true } serde_json = { workspace = true, default-features = true } thiserror = { workspace = true } diff --git a/substrate/frame/transaction-payment/rpc/Cargo.toml b/substrate/frame/transaction-payment/rpc/Cargo.toml index 2c9f814460f7..31f062837e74 100644 --- a/substrate/frame/transaction-payment/rpc/Cargo.toml +++ b/substrate/frame/transaction-payment/rpc/Cargo.toml @@ -17,7 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.12" } -jsonrpsee = { version = "0.22.5", features = ["client-core", "macros", "server-core"] } +jsonrpsee = { version = "0.23", features = ["client-core", "macros", "server-core"] } pallet-transaction-payment-rpc-runtime-api = { path = "runtime-api" } sp-api = { path = "../../../primitives/api" } sp-blockchain = { path = "../../../primitives/blockchain" } diff --git a/substrate/utils/frame/remote-externalities/Cargo.toml b/substrate/utils/frame/remote-externalities/Cargo.toml index 2911d5eef659..c7e7b97e2e37 100644 --- a/substrate/utils/frame/remote-externalities/Cargo.toml +++ b/substrate/utils/frame/remote-externalities/Cargo.toml @@ -15,7 +15,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -jsonrpsee = { version = "0.22", features = ["http-client"] } +jsonrpsee = { version = "0.23", features = ["http-client"] } codec = { package = "parity-scale-codec", version = "3.6.12" } log = { workspace = true, default-features = true } serde = { workspace = true, default-features = true } diff --git a/substrate/utils/frame/remote-externalities/src/lib.rs b/substrate/utils/frame/remote-externalities/src/lib.rs index 0ecb98f31343..f5e522535fa1 100644 --- a/substrate/utils/frame/remote-externalities/src/lib.rs +++ b/substrate/utils/frame/remote-externalities/src/lib.rs @@ -24,7 +24,7 @@ use codec::{Compact, Decode, Encode}; use indicatif::{ProgressBar, ProgressStyle}; use jsonrpsee::{ core::params::ArrayParams, - http_client::{HttpClient, HttpClientBuilder}, + http_client::HttpClient, }; use log::*; use serde::de::DeserializeOwned; @@ -190,7 +190,7 @@ impl Transport { } else { uri.clone() }; - let http_client = HttpClientBuilder::default() + let http_client = HttpClient::builder() .max_request_size(u32::MAX) .max_response_size(u32::MAX) .request_timeout(std::time::Duration::from_secs(60 * 5)) diff --git a/substrate/utils/frame/rpc/client/Cargo.toml b/substrate/utils/frame/rpc/client/Cargo.toml index 501bb95b2579..ff5e4a176573 100644 --- a/substrate/utils/frame/rpc/client/Cargo.toml +++ b/substrate/utils/frame/rpc/client/Cargo.toml @@ -15,7 +15,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -jsonrpsee = { version = "0.22", features = ["ws-client"] } +jsonrpsee = { version = "0.23", features = ["ws-client"] } sc-rpc-api = { path = "../../../../client/rpc-api" } async-trait = "0.1.79" serde = { workspace = true, default-features = true } diff --git a/substrate/utils/frame/rpc/state-trie-migration-rpc/Cargo.toml b/substrate/utils/frame/rpc/state-trie-migration-rpc/Cargo.toml index ee3bf5eb68d7..6664788edd67 100644 --- a/substrate/utils/frame/rpc/state-trie-migration-rpc/Cargo.toml +++ b/substrate/utils/frame/rpc/state-trie-migration-rpc/Cargo.toml @@ -24,7 +24,7 @@ sp-state-machine = { path = "../../../../primitives/state-machine" } sp-trie = { path = "../../../../primitives/trie" } trie-db = "0.29.0" -jsonrpsee = { version = "0.22.5", features = ["client-core", "macros", "server-core"] } +jsonrpsee = { version = "0.23", features = ["client-core", "macros", "server-core"] } # Substrate Dependencies sc-client-api = { path = "../../../../client/api" } diff --git a/substrate/utils/frame/rpc/support/Cargo.toml b/substrate/utils/frame/rpc/support/Cargo.toml index bf566f909ecb..41bc3068ba2c 100644 --- a/substrate/utils/frame/rpc/support/Cargo.toml +++ b/substrate/utils/frame/rpc/support/Cargo.toml @@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.12" } -jsonrpsee = { version = "0.22", features = ["jsonrpsee-types"] } +jsonrpsee = { version = "0.23", features = ["jsonrpsee-types"] } serde = { workspace = true, default-features = true } frame-support = { path = "../../../../frame/support" } sc-rpc-api = { path = "../../../../client/rpc-api" } @@ -24,7 +24,7 @@ sp-storage = { path = "../../../../primitives/storage" } [dev-dependencies] scale-info = "2.11.1" -jsonrpsee = { version = "0.22", features = ["jsonrpsee-types", "ws-client"] } +jsonrpsee = { version = "0.23", features = ["jsonrpsee-types", "ws-client"] } tokio = "1.37" sp-core = { path = "../../../../primitives/core" } sp-runtime = { path = "../../../../primitives/runtime" } diff --git a/substrate/utils/frame/rpc/system/Cargo.toml b/substrate/utils/frame/rpc/system/Cargo.toml index 6829d753ed71..2f698b5e71c5 100644 --- a/substrate/utils/frame/rpc/system/Cargo.toml +++ b/substrate/utils/frame/rpc/system/Cargo.toml @@ -17,7 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.12" } -jsonrpsee = { version = "0.22.5", features = ["client-core", "macros", "server-core"] } +jsonrpsee = { version = "0.23", features = ["client-core", "macros", "server-core"] } futures = "0.3.30" log = { workspace = true, default-features = true } frame-system-rpc-runtime-api = { path = "../../../../frame/system/rpc/runtime-api" } diff --git a/templates/minimal/node/Cargo.toml b/templates/minimal/node/Cargo.toml index 606fd0580356..f62d58e9fc1b 100644 --- a/templates/minimal/node/Cargo.toml +++ b/templates/minimal/node/Cargo.toml @@ -20,7 +20,7 @@ targets = ["x86_64-unknown-linux-gnu"] clap = { version = "4.5.3", features = ["derive"] } futures = { version = "0.3.30", features = ["thread-pool"] } futures-timer = "3.0.1" -jsonrpsee = { version = "0.22", features = ["server"] } +jsonrpsee = { version = "0.23", features = ["server"] } serde_json = { workspace = true, default-features = true } sc-cli = { path = "../../../substrate/client/cli" } diff --git a/templates/parachain/node/Cargo.toml b/templates/parachain/node/Cargo.toml index 6f7150829829..75e56b74fb57 100644 --- a/templates/parachain/node/Cargo.toml +++ b/templates/parachain/node/Cargo.toml @@ -21,7 +21,7 @@ clap = { version = "4.5.3", features = ["derive"] } log = { workspace = true, default-features = true } codec = { package = "parity-scale-codec", version = "3.6.12" } serde = { features = ["derive"], workspace = true, default-features = true } -jsonrpsee = { version = "0.22", features = ["server"] } +jsonrpsee = { version = "0.23", features = ["server"] } futures = "0.3.28" serde_json = { workspace = true, default-features = true } docify = "0.2.8" diff --git a/templates/solochain/node/Cargo.toml b/templates/solochain/node/Cargo.toml index 9332da3a6549..c8f12ff0dc12 100644 --- a/templates/solochain/node/Cargo.toml +++ b/templates/solochain/node/Cargo.toml @@ -21,7 +21,7 @@ targets = ["x86_64-unknown-linux-gnu"] clap = { version = "4.5.3", features = ["derive"] } futures = { version = "0.3.30", features = ["thread-pool"] } serde_json = { workspace = true, default-features = true } -jsonrpsee = { version = "0.22", features = ["server"] } +jsonrpsee = { version = "0.23", features = ["server"] } # substrate client sc-cli = { path = "../../../substrate/client/cli" } From 15691d6272a3de936037da6d36c1b9e7b837cc3e Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson Date: Fri, 7 Jun 2024 12:34:45 +0200 Subject: [PATCH 02/17] cleanup --- Cargo.toml | 1 - substrate/client/rpc-servers/src/lib.rs | 2 +- .../rpc-spec-v2/src/chain_head/chain_head.rs | 17 ++++++++--------- .../src/transaction/transaction_broadcast.rs | 4 ++-- .../utils/frame/remote-externalities/src/lib.rs | 5 +---- 5 files changed, 12 insertions(+), 17 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index c017b2bb4e03..2b2a1cdc17d5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -653,4 +653,3 @@ wasmi = { opt-level = 3 } x25519-dalek = { opt-level = 3 } yamux = { opt-level = 3 } zeroize = { opt-level = 3 } - diff --git a/substrate/client/rpc-servers/src/lib.rs b/substrate/client/rpc-servers/src/lib.rs index 47f9e85e4422..c5e5c2657e16 100644 --- a/substrate/client/rpc-servers/src/lib.rs +++ b/substrate/client/rpc-servers/src/lib.rs @@ -170,7 +170,7 @@ where match res { Ok(s) => s, Err(e) => { - log::debug!("Failed to accept ipv4 connection: {:?}", e); + log::debug!(target: "rpc", "Failed to accept ipv4 connection: {:?}", e); continue; } } diff --git a/substrate/client/rpc-spec-v2/src/chain_head/chain_head.rs b/substrate/client/rpc-spec-v2/src/chain_head/chain_head.rs index f0637c29a747..0e2fdbdaf05d 100644 --- a/substrate/client/rpc-spec-v2/src/chain_head/chain_head.rs +++ b/substrate/client/rpc-spec-v2/src/chain_head/chain_head.rs @@ -207,8 +207,7 @@ where // The RAII `reserved_subscription` will clean up resources on drop: // - free the reserved subscription for the connection ID. // - remove the subscription ID from the subscription management. - let Some(mut reserved_subscription) = - subscriptions.reserve_subscription(connection_id) + let Some(mut reserved_subscription) = subscriptions.reserve_subscription(connection_id) else { pending.reject(ChainHeadRpcError::ReachedLimits).await; return @@ -256,7 +255,7 @@ where follow_subscription: String, hash: Block::Hash, ) -> ResponsePayload<'static, MethodResponse> { - let conn_id = *ext.get::().unwrap(); + let conn_id = ext.get::().expect("ConnectionId is always set by jsonrpsee"); if !self.subscriptions.contains_subscription(conn_id, &follow_subscription) { // The spec says to return `LimitReached` if the follow subscription is invalid or @@ -339,7 +338,7 @@ where follow_subscription: String, hash: Block::Hash, ) -> Result, ChainHeadRpcError> { - let conn_id = *ext.get::().unwrap(); + let conn_id = ext.get::().expect("ConnectionId is always set by jsonrpsee"); if !self.subscriptions.contains_subscription(conn_id, &follow_subscription) { return Ok(None); @@ -376,7 +375,7 @@ where items: Vec>, child_trie: Option, ) -> ResponsePayload<'static, MethodResponse> { - let conn_id = *ext.get::().unwrap(); + let conn_id = ext.get::().expect("ConnectionId is always set by jsonrpsee"); if !self.subscriptions.contains_subscription(conn_id, &follow_subscription) { // The spec says to return `LimitReached` if the follow subscription is invalid or @@ -461,7 +460,7 @@ where Err(err) => return ResponsePayload::error(err), }; - let conn_id = *ext.get::().unwrap(); + let conn_id = ext.get::().expect("ConnectionId is always set by jsonrpsee"); if !self.subscriptions.contains_subscription(conn_id, &follow_subscription) { // The spec says to return `LimitReached` if the follow subscription is invalid or @@ -531,7 +530,7 @@ where follow_subscription: String, hash_or_hashes: ListOrValue, ) -> Result<(), ChainHeadRpcError> { - let conn_id = *ext.get::().unwrap(); + let conn_id = ext.get::().expect("ConnectionId is always set by jsonrpsee"); if !self.subscriptions.contains_subscription(conn_id, &follow_subscription) { return Ok(()); @@ -566,7 +565,7 @@ where follow_subscription: String, operation_id: String, ) -> Result<(), ChainHeadRpcError> { - let conn_id = *ext.get::().unwrap(); + let conn_id = ext.get::().expect("ConnectionId is always set by jsonrpsee"); if !self.subscriptions.contains_subscription(conn_id, &follow_subscription) { return Ok(()) @@ -591,7 +590,7 @@ where follow_subscription: String, operation_id: String, ) -> Result<(), ChainHeadRpcError> { - let conn_id = *ext.get::().unwrap(); + let conn_id = ext.get::().expect("ConnectionId is always set by jsonrpsee"); if !self.subscriptions.contains_subscription(conn_id, &follow_subscription) { return Ok(()) diff --git a/substrate/client/rpc-spec-v2/src/transaction/transaction_broadcast.rs b/substrate/client/rpc-spec-v2/src/transaction/transaction_broadcast.rs index cb22107366c7..d38faf0f4a18 100644 --- a/substrate/client/rpc-spec-v2/src/transaction/transaction_broadcast.rs +++ b/substrate/client/rpc-spec-v2/src/transaction/transaction_broadcast.rs @@ -123,7 +123,7 @@ where { async fn broadcast(&self, ext: &Extensions, bytes: Bytes) -> RpcResult> { let pool = self.pool.clone(); - let conn_id = *ext.get::().unwrap(); + let conn_id = ext.get::().expect("ConnectionId is always set by jsonrpsee"); // The unique ID of this operation. let id = self.generate_unique_id(); @@ -244,7 +244,7 @@ where ext: &Extensions, operation_id: String, ) -> Result<(), ErrorBroadcast> { - let conn_id = *ext.get::().unwrap(); + let conn_id = ext.get::().expect("ConnectionId is always set by jsonrpsee"); // The operation ID must correlate to the same connection ID. if !self.rpc_connections.contains_identifier(conn_id, &operation_id) { diff --git a/substrate/utils/frame/remote-externalities/src/lib.rs b/substrate/utils/frame/remote-externalities/src/lib.rs index f5e522535fa1..aff2b95c9da6 100644 --- a/substrate/utils/frame/remote-externalities/src/lib.rs +++ b/substrate/utils/frame/remote-externalities/src/lib.rs @@ -22,10 +22,7 @@ use codec::{Compact, Decode, Encode}; use indicatif::{ProgressBar, ProgressStyle}; -use jsonrpsee::{ - core::params::ArrayParams, - http_client::HttpClient, -}; +use jsonrpsee::{core::params::ArrayParams, http_client::HttpClient}; use log::*; use serde::de::DeserializeOwned; use sp_core::{ From f681f0e3e2dc4f47cbe988a5c3d495c3602381e6 Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson Date: Fri, 7 Jun 2024 12:46:57 +0200 Subject: [PATCH 03/17] make it compile --- .../rpc-spec-v2/src/chain_head/chain_head.rs | 14 +++++++------- .../src/transaction/transaction_broadcast.rs | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/substrate/client/rpc-spec-v2/src/chain_head/chain_head.rs b/substrate/client/rpc-spec-v2/src/chain_head/chain_head.rs index 0e2fdbdaf05d..86ead9bd2d76 100644 --- a/substrate/client/rpc-spec-v2/src/chain_head/chain_head.rs +++ b/substrate/client/rpc-spec-v2/src/chain_head/chain_head.rs @@ -255,7 +255,7 @@ where follow_subscription: String, hash: Block::Hash, ) -> ResponsePayload<'static, MethodResponse> { - let conn_id = ext.get::().expect("ConnectionId is always set by jsonrpsee"); + let conn_id = ext.get::().copied().expect("ConnectionId is always set by jsonrpsee"); if !self.subscriptions.contains_subscription(conn_id, &follow_subscription) { // The spec says to return `LimitReached` if the follow subscription is invalid or @@ -338,7 +338,7 @@ where follow_subscription: String, hash: Block::Hash, ) -> Result, ChainHeadRpcError> { - let conn_id = ext.get::().expect("ConnectionId is always set by jsonrpsee"); + let conn_id = ext.get::().copied().expect("ConnectionId is always set by jsonrpsee"); if !self.subscriptions.contains_subscription(conn_id, &follow_subscription) { return Ok(None); @@ -375,7 +375,7 @@ where items: Vec>, child_trie: Option, ) -> ResponsePayload<'static, MethodResponse> { - let conn_id = ext.get::().expect("ConnectionId is always set by jsonrpsee"); + let conn_id = ext.get::().copied().expect("ConnectionId is always set by jsonrpsee"); if !self.subscriptions.contains_subscription(conn_id, &follow_subscription) { // The spec says to return `LimitReached` if the follow subscription is invalid or @@ -460,7 +460,7 @@ where Err(err) => return ResponsePayload::error(err), }; - let conn_id = ext.get::().expect("ConnectionId is always set by jsonrpsee"); + let conn_id = ext.get::().copied().expect("ConnectionId is always set by jsonrpsee"); if !self.subscriptions.contains_subscription(conn_id, &follow_subscription) { // The spec says to return `LimitReached` if the follow subscription is invalid or @@ -530,7 +530,7 @@ where follow_subscription: String, hash_or_hashes: ListOrValue, ) -> Result<(), ChainHeadRpcError> { - let conn_id = ext.get::().expect("ConnectionId is always set by jsonrpsee"); + let conn_id = ext.get::().copied().expect("ConnectionId is always set by jsonrpsee"); if !self.subscriptions.contains_subscription(conn_id, &follow_subscription) { return Ok(()); @@ -565,7 +565,7 @@ where follow_subscription: String, operation_id: String, ) -> Result<(), ChainHeadRpcError> { - let conn_id = ext.get::().expect("ConnectionId is always set by jsonrpsee"); + let conn_id = ext.get::().copied().expect("ConnectionId is always set by jsonrpsee"); if !self.subscriptions.contains_subscription(conn_id, &follow_subscription) { return Ok(()) @@ -590,7 +590,7 @@ where follow_subscription: String, operation_id: String, ) -> Result<(), ChainHeadRpcError> { - let conn_id = ext.get::().expect("ConnectionId is always set by jsonrpsee"); + let conn_id = ext.get::().copied().expect("ConnectionId is always set by jsonrpsee"); if !self.subscriptions.contains_subscription(conn_id, &follow_subscription) { return Ok(()) diff --git a/substrate/client/rpc-spec-v2/src/transaction/transaction_broadcast.rs b/substrate/client/rpc-spec-v2/src/transaction/transaction_broadcast.rs index d38faf0f4a18..c44ea0926dca 100644 --- a/substrate/client/rpc-spec-v2/src/transaction/transaction_broadcast.rs +++ b/substrate/client/rpc-spec-v2/src/transaction/transaction_broadcast.rs @@ -123,7 +123,7 @@ where { async fn broadcast(&self, ext: &Extensions, bytes: Bytes) -> RpcResult> { let pool = self.pool.clone(); - let conn_id = ext.get::().expect("ConnectionId is always set by jsonrpsee"); + let conn_id = ext.get::().copied().expect("ConnectionId is always set by jsonrpsee"); // The unique ID of this operation. let id = self.generate_unique_id(); @@ -244,7 +244,7 @@ where ext: &Extensions, operation_id: String, ) -> Result<(), ErrorBroadcast> { - let conn_id = ext.get::().expect("ConnectionId is always set by jsonrpsee"); + let conn_id = ext.get::().copied().expect("ConnectionId is always set by jsonrpsee"); // The operation ID must correlate to the same connection ID. if !self.rpc_connections.contains_identifier(conn_id, &operation_id) { From bd74645a96dad2d1e78796c9306b37511d1edeff Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson Date: Fri, 7 Jun 2024 17:08:50 +0200 Subject: [PATCH 04/17] fix test build --- .../rpc-spec-v2/src/chain_head/chain_head.rs | 35 ++++++++++++--- .../src/chain_head/subscription/inner.rs | 15 ++++--- .../rpc-spec-v2/src/common/connections.rs | 45 ++++++++++--------- .../src/transaction/transaction_broadcast.rs | 10 ++++- substrate/client/rpc/src/utils.rs | 29 +++++++----- 5 files changed, 87 insertions(+), 47 deletions(-) diff --git a/substrate/client/rpc-spec-v2/src/chain_head/chain_head.rs b/substrate/client/rpc-spec-v2/src/chain_head/chain_head.rs index 86ead9bd2d76..0a3d2a4a9ee1 100644 --- a/substrate/client/rpc-spec-v2/src/chain_head/chain_head.rs +++ b/substrate/client/rpc-spec-v2/src/chain_head/chain_head.rs @@ -255,7 +255,10 @@ where follow_subscription: String, hash: Block::Hash, ) -> ResponsePayload<'static, MethodResponse> { - let conn_id = ext.get::().copied().expect("ConnectionId is always set by jsonrpsee"); + let conn_id = ext + .get::() + .copied() + .expect("ConnectionId is always set by jsonrpsee"); if !self.subscriptions.contains_subscription(conn_id, &follow_subscription) { // The spec says to return `LimitReached` if the follow subscription is invalid or @@ -338,7 +341,10 @@ where follow_subscription: String, hash: Block::Hash, ) -> Result, ChainHeadRpcError> { - let conn_id = ext.get::().copied().expect("ConnectionId is always set by jsonrpsee"); + let conn_id = ext + .get::() + .copied() + .expect("ConnectionId is always set by jsonrpsee"); if !self.subscriptions.contains_subscription(conn_id, &follow_subscription) { return Ok(None); @@ -375,7 +381,10 @@ where items: Vec>, child_trie: Option, ) -> ResponsePayload<'static, MethodResponse> { - let conn_id = ext.get::().copied().expect("ConnectionId is always set by jsonrpsee"); + let conn_id = ext + .get::() + .copied() + .expect("ConnectionId is always set by jsonrpsee"); if !self.subscriptions.contains_subscription(conn_id, &follow_subscription) { // The spec says to return `LimitReached` if the follow subscription is invalid or @@ -460,7 +469,10 @@ where Err(err) => return ResponsePayload::error(err), }; - let conn_id = ext.get::().copied().expect("ConnectionId is always set by jsonrpsee"); + let conn_id = ext + .get::() + .copied() + .expect("ConnectionId is always set by jsonrpsee"); if !self.subscriptions.contains_subscription(conn_id, &follow_subscription) { // The spec says to return `LimitReached` if the follow subscription is invalid or @@ -530,7 +542,10 @@ where follow_subscription: String, hash_or_hashes: ListOrValue, ) -> Result<(), ChainHeadRpcError> { - let conn_id = ext.get::().copied().expect("ConnectionId is always set by jsonrpsee"); + let conn_id = ext + .get::() + .copied() + .expect("ConnectionId is always set by jsonrpsee"); if !self.subscriptions.contains_subscription(conn_id, &follow_subscription) { return Ok(()); @@ -565,7 +580,10 @@ where follow_subscription: String, operation_id: String, ) -> Result<(), ChainHeadRpcError> { - let conn_id = ext.get::().copied().expect("ConnectionId is always set by jsonrpsee"); + let conn_id = ext + .get::() + .copied() + .expect("ConnectionId is always set by jsonrpsee"); if !self.subscriptions.contains_subscription(conn_id, &follow_subscription) { return Ok(()) @@ -590,7 +608,10 @@ where follow_subscription: String, operation_id: String, ) -> Result<(), ChainHeadRpcError> { - let conn_id = ext.get::().copied().expect("ConnectionId is always set by jsonrpsee"); + let conn_id = ext + .get::() + .copied() + .expect("ConnectionId is always set by jsonrpsee"); if !self.subscriptions.contains_subscription(conn_id, &follow_subscription) { return Ok(()) diff --git a/substrate/client/rpc-spec-v2/src/chain_head/subscription/inner.rs b/substrate/client/rpc-spec-v2/src/chain_head/subscription/inner.rs index a6edc344bc63..d4d616f54dc8 100644 --- a/substrate/client/rpc-spec-v2/src/chain_head/subscription/inner.rs +++ b/substrate/client/rpc-spec-v2/src/chain_head/subscription/inner.rs @@ -846,6 +846,7 @@ impl> SubscriptionsInner { #[cfg(test)] mod tests { use super::*; + use jsonrpsee::ConnectionId; use sc_block_builder::BlockBuilderBuilder; use sc_service::client::new_in_mem; use sp_consensus::BlockOrigin; @@ -1420,17 +1421,20 @@ mod tests { rpc_connections.clone(), ); - let reserved_sub_first = subscription_management.reserve_subscription(1).unwrap(); - let mut reserved_sub_second = subscription_management.reserve_subscription(1).unwrap(); + let reserved_sub_first = + subscription_management.reserve_subscription(ConnectionId(1)).unwrap(); + let mut reserved_sub_second = + subscription_management.reserve_subscription(ConnectionId(1)).unwrap(); // Subscriptions reserved but not yet populated. assert_eq!(subs.read().subs.len(), 0); // Cannot reserve anymore. - assert!(subscription_management.reserve_subscription(1).is_none()); + assert!(subscription_management.reserve_subscription(ConnectionId(1)).is_none()); // Drop the first subscription. drop(reserved_sub_first); // Space is freed-up for the rpc connections. - let mut reserved_sub_first = subscription_management.reserve_subscription(1).unwrap(); + let mut reserved_sub_first = + subscription_management.reserve_subscription(ConnectionId(1)).unwrap(); // Insert subscriptions. let _sub_data_first = @@ -1445,7 +1449,8 @@ mod tests { // Check that the subscription is removed. assert_eq!(subs.read().subs.len(), 1); // Space is freed-up for the rpc connections. - let reserved_sub_first = subscription_management.reserve_subscription(1).unwrap(); + let reserved_sub_first = + subscription_management.reserve_subscription(ConnectionId(1)).unwrap(); // Drop all subscriptions. drop(reserved_sub_first); diff --git a/substrate/client/rpc-spec-v2/src/common/connections.rs b/substrate/client/rpc-spec-v2/src/common/connections.rs index c16a80bf49db..f0c31d612ebd 100644 --- a/substrate/client/rpc-spec-v2/src/common/connections.rs +++ b/substrate/client/rpc-spec-v2/src/common/connections.rs @@ -195,68 +195,71 @@ mod tests { #[test] fn reserve_space() { let rpc_connections = RpcConnections::new(2); - let reserved = rpc_connections.reserve_space(1); + let conn_id = ConnectionId(1); + let reserved = rpc_connections.reserve_space(conn_id); + assert!(reserved.is_some()); - assert_eq!(1, rpc_connections.data.lock().get(&1).unwrap().num_identifiers); + assert_eq!(1, rpc_connections.data.lock().get(&conn_id).unwrap().num_identifiers); assert_eq!(rpc_connections.data.lock().len(), 1); let reserved = reserved.unwrap(); let registered = reserved.register("identifier1".to_string()).unwrap(); - assert!(rpc_connections.contains_identifier(1, "identifier1")); - assert_eq!(1, rpc_connections.data.lock().get(&1).unwrap().num_identifiers); + assert!(rpc_connections.contains_identifier(conn_id, "identifier1")); + assert_eq!(1, rpc_connections.data.lock().get(&conn_id).unwrap().num_identifiers); drop(registered); // Data is dropped. - assert!(rpc_connections.data.lock().get(&1).is_none()); + assert!(rpc_connections.data.lock().get(&conn_id).is_none()); assert!(rpc_connections.data.lock().is_empty()); // Checks can still happen. - assert!(!rpc_connections.contains_identifier(1, "identifier1")); + assert!(!rpc_connections.contains_identifier(conn_id, "identifier1")); } #[test] fn reserve_space_capacity_reached() { let rpc_connections = RpcConnections::new(2); + let conn_id = ConnectionId(1); // Reserve identifier for connection 1. - let reserved = rpc_connections.reserve_space(1); + let reserved = rpc_connections.reserve_space(conn_id); assert!(reserved.is_some()); - assert_eq!(1, rpc_connections.data.lock().get(&1).unwrap().num_identifiers); + assert_eq!(1, rpc_connections.data.lock().get(&conn_id).unwrap().num_identifiers); // Add identifier for connection 1. let reserved = reserved.unwrap(); let registered = reserved.register("identifier1".to_string()).unwrap(); - assert!(rpc_connections.contains_identifier(1, "identifier1")); - assert_eq!(1, rpc_connections.data.lock().get(&1).unwrap().num_identifiers); + assert!(rpc_connections.contains_identifier(conn_id, "identifier1")); + assert_eq!(1, rpc_connections.data.lock().get(&conn_id).unwrap().num_identifiers); // Reserve identifier for connection 1 again. - let reserved = rpc_connections.reserve_space(1); + let reserved = rpc_connections.reserve_space(conn_id); assert!(reserved.is_some()); - assert_eq!(2, rpc_connections.data.lock().get(&1).unwrap().num_identifiers); + assert_eq!(2, rpc_connections.data.lock().get(&conn_id).unwrap().num_identifiers); // Add identifier for connection 1 again. let reserved = reserved.unwrap(); let registered_second = reserved.register("identifier2".to_string()).unwrap(); - assert!(rpc_connections.contains_identifier(1, "identifier2")); - assert_eq!(2, rpc_connections.data.lock().get(&1).unwrap().num_identifiers); + assert!(rpc_connections.contains_identifier(conn_id, "identifier2")); + assert_eq!(2, rpc_connections.data.lock().get(&conn_id).unwrap().num_identifiers); // Cannot reserve more identifiers. - let reserved = rpc_connections.reserve_space(1); + let reserved = rpc_connections.reserve_space(conn_id); assert!(reserved.is_none()); // Drop the first identifier. drop(registered); - assert_eq!(1, rpc_connections.data.lock().get(&1).unwrap().num_identifiers); - assert!(rpc_connections.contains_identifier(1, "identifier2")); - assert!(!rpc_connections.contains_identifier(1, "identifier1")); + assert_eq!(1, rpc_connections.data.lock().get(&conn_id).unwrap().num_identifiers); + assert!(rpc_connections.contains_identifier(conn_id, "identifier2")); + assert!(!rpc_connections.contains_identifier(conn_id, "identifier1")); // Can reserve again after clearing the space. - let reserved = rpc_connections.reserve_space(1); + let reserved = rpc_connections.reserve_space(conn_id); assert!(reserved.is_some()); - assert_eq!(2, rpc_connections.data.lock().get(&1).unwrap().num_identifiers); + assert_eq!(2, rpc_connections.data.lock().get(&conn_id).unwrap().num_identifiers); // Ensure data is cleared. drop(reserved); drop(registered_second); - assert!(rpc_connections.data.lock().get(&1).is_none()); + assert!(rpc_connections.data.lock().get(&conn_id).is_none()); } } diff --git a/substrate/client/rpc-spec-v2/src/transaction/transaction_broadcast.rs b/substrate/client/rpc-spec-v2/src/transaction/transaction_broadcast.rs index c44ea0926dca..ea6592221bf4 100644 --- a/substrate/client/rpc-spec-v2/src/transaction/transaction_broadcast.rs +++ b/substrate/client/rpc-spec-v2/src/transaction/transaction_broadcast.rs @@ -123,7 +123,10 @@ where { async fn broadcast(&self, ext: &Extensions, bytes: Bytes) -> RpcResult> { let pool = self.pool.clone(); - let conn_id = ext.get::().copied().expect("ConnectionId is always set by jsonrpsee"); + let conn_id = ext + .get::() + .copied() + .expect("ConnectionId is always set by jsonrpsee"); // The unique ID of this operation. let id = self.generate_unique_id(); @@ -244,7 +247,10 @@ where ext: &Extensions, operation_id: String, ) -> Result<(), ErrorBroadcast> { - let conn_id = ext.get::().copied().expect("ConnectionId is always set by jsonrpsee"); + let conn_id = ext + .get::() + .copied() + .expect("ConnectionId is always set by jsonrpsee"); // The operation ID must correlate to the same connection ID. if !self.rpc_connections.contains_identifier(conn_id, &operation_id) { diff --git a/substrate/client/rpc/src/utils.rs b/substrate/client/rpc/src/utils.rs index e05260e18fd6..bc566ed37f23 100644 --- a/substrate/client/rpc/src/utils.rs +++ b/substrate/client/rpc/src/utils.rs @@ -189,7 +189,7 @@ mod tests { async fn subscribe() -> Subscription { let mut module = RpcModule::new(()); module - .register_subscription("sub", "my_sub", "unsub", |_, pending, _| async move { + .register_subscription("sub", "my_sub", "unsub", |_, pending, _, _| async move { let stream = futures::stream::iter([0; 16]); pipe_from_stream(pending, stream).await; Ok(()) @@ -217,7 +217,7 @@ mod tests { let mut module = RpcModule::new(tx); module - .register_subscription("sub", "my_sub", "unsub", |_, pending, ctx| async move { + .register_subscription("sub", "my_sub", "unsub", |_, pending, ctx, _| async move { let stream = futures::stream::iter([0; 32]); pipe_from_stream(pending, stream).await; _ = ctx.unbounded_send(()); @@ -239,16 +239,21 @@ mod tests { let mut module = RpcModule::new(notify_tx); module - .register_subscription("sub", "my_sub", "unsub", |_, pending, notify_tx| async move { - // emulate empty stream for simplicity: otherwise we need some mechanism - // to sync buffer and channel send operations - let stream = futures::stream::empty::<()>(); - // this should exit immediately - pipe_from_stream(pending, stream).await; - // notify that the `pipe_from_stream` has returned - notify_tx.notify_one(); - Ok(()) - }) + .register_subscription( + "sub", + "my_sub", + "unsub", + |_, pending, notify_tx, _| async move { + // emulate empty stream for simplicity: otherwise we need some mechanism + // to sync buffer and channel send operations + let stream = futures::stream::empty::<()>(); + // this should exit immediately + pipe_from_stream(pending, stream).await; + // notify that the `pipe_from_stream` has returned + notify_tx.notify_one(); + Ok(()) + }, + ) .unwrap(); module.subscribe("sub", EmptyServerParams::new(), 1).await.unwrap(); From 369db7e42d44475d4580e16b912c246e399252f5 Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson Date: Mon, 10 Jun 2024 17:41:49 +0200 Subject: [PATCH 05/17] jsonrpsee v0.23.1 --- Cargo.lock | 33 +++++++++---------- bridges/relays/client-substrate/Cargo.toml | 2 +- .../client/relay-chain-interface/Cargo.toml | 2 +- .../relay-chain-rpc-interface/Cargo.toml | 2 +- cumulus/polkadot-parachain/Cargo.toml | 2 +- cumulus/test/service/Cargo.toml | 2 +- polkadot/rpc/Cargo.toml | 2 +- substrate/bin/node/cli/Cargo.toml | 2 +- substrate/bin/node/rpc/Cargo.toml | 2 +- .../client/consensus/babe/rpc/Cargo.toml | 2 +- .../client/consensus/beefy/rpc/Cargo.toml | 2 +- .../client/consensus/grandpa/rpc/Cargo.toml | 2 +- .../client/consensus/manual-seal/Cargo.toml | 2 +- .../merkle-mountain-range/rpc/Cargo.toml | 2 +- substrate/client/rpc-api/Cargo.toml | 2 +- substrate/client/rpc-servers/Cargo.toml | 2 +- substrate/client/rpc-spec-v2/Cargo.toml | 4 +-- substrate/client/rpc/Cargo.toml | 2 +- substrate/client/service/Cargo.toml | 2 +- substrate/client/sync-state-rpc/Cargo.toml | 2 +- .../frame/transaction-payment/rpc/Cargo.toml | 2 +- .../frame/remote-externalities/Cargo.toml | 2 +- substrate/utils/frame/rpc/client/Cargo.toml | 2 +- .../rpc/state-trie-migration-rpc/Cargo.toml | 2 +- substrate/utils/frame/rpc/support/Cargo.toml | 4 +-- substrate/utils/frame/rpc/system/Cargo.toml | 2 +- templates/minimal/node/Cargo.toml | 2 +- templates/parachain/node/Cargo.toml | 2 +- templates/solochain/node/Cargo.toml | 2 +- 29 files changed, 46 insertions(+), 47 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7498e3607be0..2d7866990450 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7234,9 +7234,9 @@ dependencies = [ [[package]] name = "jsonrpsee" -version = "0.23.0" +version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67210bd846b2dca59dc73f34717d6e1589305d506cdd6f14c849115d08e40876" +checksum = "95a130d27083a4001b7b2d72a19f08786299550f76c9bd5307498dce2c2b20fa" dependencies = [ "jsonrpsee-core", "jsonrpsee-http-client", @@ -7250,9 +7250,9 @@ dependencies = [ [[package]] name = "jsonrpsee-client-transport" -version = "0.23.0" +version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4c171d64176ae8f57eec75bca9f9dda2b2f746314adef9160a5bbbb2a7c82cb" +checksum = "039db9fe25cd63b7221c3f8788c1ef4ea07987d40ec25a1e7d7a3c3e3e3fd130" dependencies = [ "base64 0.22.1", "futures-util", @@ -7273,9 +7273,9 @@ dependencies = [ [[package]] name = "jsonrpsee-core" -version = "0.23.0" +version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e966c12c8b6c1790ce67683c792cea9dd250860df49f6b64f1b1ff6c6946850" +checksum = "21545a9445fbd582840ff5160a9a3e12b8e6da582151cdb07bde9a1970ba3a24" dependencies = [ "anyhow", "async-trait", @@ -7301,9 +7301,9 @@ dependencies = [ [[package]] name = "jsonrpsee-http-client" -version = "0.23.0" +version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0187f1969287e5890d84460fe9f6556d98231e70b06179d4416e5c8c47167d" +checksum = "fb25cab482c8512c4f3323a5c90b95a3b8f7c90681a87bf7a68b942d52f08933" dependencies = [ "async-trait", "base64 0.22.1", @@ -7326,9 +7326,9 @@ dependencies = [ [[package]] name = "jsonrpsee-proc-macros" -version = "0.23.0" +version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7af1b5071dc1c61b06900f8f3e17f886b1b08e926166e575018643879f63b6" +checksum = "c18184cd09b386feb18085609e8bf77bdc942482bdd82777b433b8d015edf561" dependencies = [ "heck 0.5.0", "proc-macro-crate 3.1.0", @@ -7339,9 +7339,9 @@ dependencies = [ [[package]] name = "jsonrpsee-server" -version = "0.23.0" +version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba63ec742f5f9c4016ca4c443d04dc3ca56e240a26ebe6e56609a5109bd9d13f" +checksum = "810f63eff0f78fa8d413d678c0e55b702e2ea61d4587774c0db4ea2fc554ef92" dependencies = [ "anyhow", "futures-util", @@ -7367,11 +7367,10 @@ dependencies = [ [[package]] name = "jsonrpsee-types" -version = "0.23.0" +version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "328c33717b7bdc4f47cdf31c21d5449c5b713a800cb05cb767841ccf2944f9d9" +checksum = "f511b714bca46f9a3e97c0e0eb21d2c112e83e444d2db535b5ec7093f5836d73" dependencies = [ - "anyhow", "beef", "http 1.1.0", "serde", @@ -7381,9 +7380,9 @@ dependencies = [ [[package]] name = "jsonrpsee-ws-client" -version = "0.23.0" +version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aeb22661e1c018eb503d5a47be2d39a176de832b047d2757fa86b3d2b34fc84e" +checksum = "786c100eb67df2f2d863d231c2c6978bcf80ff4bf606ffc40e7e68ef562da7bf" dependencies = [ "http 1.1.0", "jsonrpsee-client-transport", diff --git a/bridges/relays/client-substrate/Cargo.toml b/bridges/relays/client-substrate/Cargo.toml index ea7e28c557bf..212059662268 100644 --- a/bridges/relays/client-substrate/Cargo.toml +++ b/bridges/relays/client-substrate/Cargo.toml @@ -15,7 +15,7 @@ async-std = { version = "1.9.0", features = ["attributes"] } async-trait = "0.1.79" codec = { package = "parity-scale-codec", version = "3.6.12" } futures = "0.3.30" -jsonrpsee = { version = "0.23", features = ["macros", "ws-client"] } +jsonrpsee = { version = "0.23.1", features = ["macros", "ws-client"] } log = { workspace = true } num-traits = "0.2" rand = "0.8.5" diff --git a/cumulus/client/relay-chain-interface/Cargo.toml b/cumulus/client/relay-chain-interface/Cargo.toml index 0866163d2e9b..f06216c010bc 100644 --- a/cumulus/client/relay-chain-interface/Cargo.toml +++ b/cumulus/client/relay-chain-interface/Cargo.toml @@ -22,5 +22,5 @@ sc-client-api = { path = "../../../substrate/client/api" } futures = "0.3.28" async-trait = "0.1.79" thiserror = { workspace = true } -jsonrpsee-core = "0.23" +jsonrpsee-core = "0.23.1" codec = { package = "parity-scale-codec", version = "3.6.12" } diff --git a/cumulus/client/relay-chain-rpc-interface/Cargo.toml b/cumulus/client/relay-chain-rpc-interface/Cargo.toml index 9975be433d9c..65d6b9e780cc 100644 --- a/cumulus/client/relay-chain-rpc-interface/Cargo.toml +++ b/cumulus/client/relay-chain-rpc-interface/Cargo.toml @@ -33,7 +33,7 @@ tokio-util = { version = "0.7.8", features = ["compat"] } futures = "0.3.28" futures-timer = "3.0.2" codec = { package = "parity-scale-codec", version = "3.6.12" } -jsonrpsee = { version = "0.23", features = ["ws-client"] } +jsonrpsee = { version = "0.23.1", features = ["ws-client"] } tracing = "0.1.37" async-trait = "0.1.79" url = "2.4.0" diff --git a/cumulus/polkadot-parachain/Cargo.toml b/cumulus/polkadot-parachain/Cargo.toml index 0cc641293747..ca12a5182a25 100644 --- a/cumulus/polkadot-parachain/Cargo.toml +++ b/cumulus/polkadot-parachain/Cargo.toml @@ -38,7 +38,7 @@ coretime-rococo-runtime = { path = "../parachains/runtimes/coretime/coretime-roc coretime-westend-runtime = { path = "../parachains/runtimes/coretime/coretime-westend" } bridge-hub-westend-runtime = { path = "../parachains/runtimes/bridge-hubs/bridge-hub-westend" } penpal-runtime = { path = "../parachains/runtimes/testing/penpal" } -jsonrpsee = { version = "0.23", features = ["server"] } +jsonrpsee = { version = "0.23.1", features = ["server"] } people-rococo-runtime = { path = "../parachains/runtimes/people/people-rococo" } people-westend-runtime = { path = "../parachains/runtimes/people/people-westend" } parachains-common = { path = "../parachains/common" } diff --git a/cumulus/test/service/Cargo.toml b/cumulus/test/service/Cargo.toml index c2e198c02d54..cb333f835587 100644 --- a/cumulus/test/service/Cargo.toml +++ b/cumulus/test/service/Cargo.toml @@ -17,7 +17,7 @@ async-trait = "0.1.79" clap = { version = "4.5.3", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.6.12" } criterion = { version = "0.5.1", features = ["async_tokio"] } -jsonrpsee = { version = "0.23", features = ["server"] } +jsonrpsee = { version = "0.23.1", features = ["server"] } rand = "0.8.5" serde = { features = ["derive"], workspace = true, default-features = true } serde_json = { workspace = true, default-features = true } diff --git a/polkadot/rpc/Cargo.toml b/polkadot/rpc/Cargo.toml index 0f67fa782f66..87d59205bbf7 100644 --- a/polkadot/rpc/Cargo.toml +++ b/polkadot/rpc/Cargo.toml @@ -10,7 +10,7 @@ description = "Polkadot specific RPC functionality." workspace = true [dependencies] -jsonrpsee = { version = "0.23", features = ["server"] } +jsonrpsee = { version = "0.23.1", features = ["server"] } polkadot-primitives = { path = "../primitives" } sc-client-api = { path = "../../substrate/client/api" } sp-blockchain = { path = "../../substrate/primitives/blockchain" } diff --git a/substrate/bin/node/cli/Cargo.toml b/substrate/bin/node/cli/Cargo.toml index e54ead255b15..eebd01e28676 100644 --- a/substrate/bin/node/cli/Cargo.toml +++ b/substrate/bin/node/cli/Cargo.toml @@ -41,7 +41,7 @@ array-bytes = "6.1" clap = { version = "4.5.3", features = ["derive"], optional = true } codec = { package = "parity-scale-codec", version = "3.6.12" } serde = { features = ["derive"], workspace = true, default-features = true } -jsonrpsee = { version = "0.23", features = ["server"] } +jsonrpsee = { version = "0.23.1", features = ["server"] } futures = "0.3.30" log = { workspace = true, default-features = true } rand = "0.8" diff --git a/substrate/bin/node/rpc/Cargo.toml b/substrate/bin/node/rpc/Cargo.toml index 431647d26a07..13678670f88a 100644 --- a/substrate/bin/node/rpc/Cargo.toml +++ b/substrate/bin/node/rpc/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -jsonrpsee = { version = "0.23", features = ["server"] } +jsonrpsee = { version = "0.23.1", features = ["server"] } node-primitives = { path = "../primitives" } pallet-transaction-payment-rpc = { path = "../../../frame/transaction-payment/rpc" } mmr-rpc = { path = "../../../client/merkle-mountain-range/rpc" } diff --git a/substrate/client/consensus/babe/rpc/Cargo.toml b/substrate/client/consensus/babe/rpc/Cargo.toml index aefdb782d7f0..8ee6ed8421c0 100644 --- a/substrate/client/consensus/babe/rpc/Cargo.toml +++ b/substrate/client/consensus/babe/rpc/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -jsonrpsee = { version = "0.23", features = ["client-core", "macros", "server-core"] } +jsonrpsee = { version = "0.23.1", features = ["client-core", "macros", "server-core"] } futures = "0.3.30" serde = { features = ["derive"], workspace = true, default-features = true } thiserror = { workspace = true } diff --git a/substrate/client/consensus/beefy/rpc/Cargo.toml b/substrate/client/consensus/beefy/rpc/Cargo.toml index 81cf6fb1d1d2..8f0fb5649ce1 100644 --- a/substrate/client/consensus/beefy/rpc/Cargo.toml +++ b/substrate/client/consensus/beefy/rpc/Cargo.toml @@ -14,7 +14,7 @@ workspace = true [dependencies] codec = { package = "parity-scale-codec", version = "3.6.12", features = ["derive"] } futures = "0.3.30" -jsonrpsee = { version = "0.23", features = ["client-core", "macros", "server-core"] } +jsonrpsee = { version = "0.23.1", features = ["client-core", "macros", "server-core"] } log = { workspace = true, default-features = true } parking_lot = "0.12.1" serde = { features = ["derive"], workspace = true, default-features = true } diff --git a/substrate/client/consensus/grandpa/rpc/Cargo.toml b/substrate/client/consensus/grandpa/rpc/Cargo.toml index 58a26ffab7a4..afea05ff70dd 100644 --- a/substrate/client/consensus/grandpa/rpc/Cargo.toml +++ b/substrate/client/consensus/grandpa/rpc/Cargo.toml @@ -15,7 +15,7 @@ workspace = true [dependencies] finality-grandpa = { version = "0.16.2", features = ["derive-codec"] } futures = "0.3.30" -jsonrpsee = { version = "0.23", features = ["client-core", "macros", "server-core"] } +jsonrpsee = { version = "0.23.1", features = ["client-core", "macros", "server-core"] } log = { workspace = true, default-features = true } codec = { package = "parity-scale-codec", version = "3.6.12", features = ["derive"] } serde = { features = ["derive"], workspace = true, default-features = true } diff --git a/substrate/client/consensus/manual-seal/Cargo.toml b/substrate/client/consensus/manual-seal/Cargo.toml index 39fe100dcc10..b1d156ee34ff 100644 --- a/substrate/client/consensus/manual-seal/Cargo.toml +++ b/substrate/client/consensus/manual-seal/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -jsonrpsee = { version = "0.23", features = ["client-core", "macros", "server-core"] } +jsonrpsee = { version = "0.23.1", features = ["client-core", "macros", "server-core"] } assert_matches = "1.3.0" async-trait = "0.1.79" codec = { package = "parity-scale-codec", version = "3.6.12" } diff --git a/substrate/client/merkle-mountain-range/rpc/Cargo.toml b/substrate/client/merkle-mountain-range/rpc/Cargo.toml index c03787eb7463..180696a51423 100644 --- a/substrate/client/merkle-mountain-range/rpc/Cargo.toml +++ b/substrate/client/merkle-mountain-range/rpc/Cargo.toml @@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.12" } -jsonrpsee = { version = "0.23", features = ["client-core", "macros", "server-core"] } +jsonrpsee = { version = "0.23.1", features = ["client-core", "macros", "server-core"] } serde = { features = ["derive"], workspace = true, default-features = true } sp-api = { path = "../../../primitives/api" } sp-blockchain = { path = "../../../primitives/blockchain" } diff --git a/substrate/client/rpc-api/Cargo.toml b/substrate/client/rpc-api/Cargo.toml index f7b8173de003..55d83c882f79 100644 --- a/substrate/client/rpc-api/Cargo.toml +++ b/substrate/client/rpc-api/Cargo.toml @@ -28,4 +28,4 @@ sp-core = { path = "../../primitives/core" } sp-rpc = { path = "../../primitives/rpc" } sp-runtime = { path = "../../primitives/runtime" } sp-version = { path = "../../primitives/version" } -jsonrpsee = { version = "0.23", features = ["client-core", "macros", "server-core"] } +jsonrpsee = { version = "0.23.1", features = ["client-core", "macros", "server-core"] } diff --git a/substrate/client/rpc-servers/Cargo.toml b/substrate/client/rpc-servers/Cargo.toml index e0d977afd442..b93a84e8bb17 100644 --- a/substrate/client/rpc-servers/Cargo.toml +++ b/substrate/client/rpc-servers/Cargo.toml @@ -24,7 +24,7 @@ http = "1.1" hyper = "1.3" hyper-util = { version = "0.1", features = ["tokio", "service", "tokio", "server-auto"] } ip_network = "0.4.1" -jsonrpsee = { version = "0.23", features = ["server"] } +jsonrpsee = { version = "0.23.1", features = ["server"] } log = { workspace = true, default-features = true } prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus" } serde_json = { workspace = true, default-features = true } diff --git a/substrate/client/rpc-spec-v2/Cargo.toml b/substrate/client/rpc-spec-v2/Cargo.toml index 5fd03eb8c95d..d6efce5ad5b6 100644 --- a/substrate/client/rpc-spec-v2/Cargo.toml +++ b/substrate/client/rpc-spec-v2/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -jsonrpsee = { version = "0.23", features = ["client-core", "macros", "server-core"] } +jsonrpsee = { version = "0.23.1", features = ["client-core", "macros", "server-core"] } # Internal chain structures for "chain_spec". sc-chain-spec = { path = "../chain-spec" } # Pool for submitting extrinsics required by "transaction" @@ -45,7 +45,7 @@ rand = "0.8.5" schnellru = "0.2.1" [dev-dependencies] -jsonrpsee = { version = "0.23", features = ["server", "ws-client"] } +jsonrpsee = { version = "0.23.1", features = ["server", "ws-client"] } serde_json = { workspace = true, default-features = true } tokio = { version = "1.22.0", features = ["macros"] } substrate-test-runtime-client = { path = "../../test-utils/runtime/client" } diff --git a/substrate/client/rpc/Cargo.toml b/substrate/client/rpc/Cargo.toml index e0f8775c43df..8edb95b22f14 100644 --- a/substrate/client/rpc/Cargo.toml +++ b/substrate/client/rpc/Cargo.toml @@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.12" } futures = "0.3.30" -jsonrpsee = { version = "0.23", features = ["server"] } +jsonrpsee = { version = "0.23.1", features = ["server"] } log = { workspace = true, default-features = true } parking_lot = "0.12.1" serde_json = { workspace = true, default-features = true } diff --git a/substrate/client/service/Cargo.toml b/substrate/client/service/Cargo.toml index cf8c6b43597f..c101454d813a 100644 --- a/substrate/client/service/Cargo.toml +++ b/substrate/client/service/Cargo.toml @@ -28,7 +28,7 @@ runtime-benchmarks = [ ] [dependencies] -jsonrpsee = { version = "0.23", features = ["server"] } +jsonrpsee = { version = "0.23.1", features = ["server"] } thiserror = { workspace = true } futures = "0.3.30" rand = "0.8.5" diff --git a/substrate/client/sync-state-rpc/Cargo.toml b/substrate/client/sync-state-rpc/Cargo.toml index 7bfbbec790ae..be630af8aa63 100644 --- a/substrate/client/sync-state-rpc/Cargo.toml +++ b/substrate/client/sync-state-rpc/Cargo.toml @@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.12" } -jsonrpsee = { version = "0.23", features = ["client-core", "macros", "server-core"] } +jsonrpsee = { version = "0.23.1", features = ["client-core", "macros", "server-core"] } serde = { features = ["derive"], workspace = true, default-features = true } serde_json = { workspace = true, default-features = true } thiserror = { workspace = true } diff --git a/substrate/frame/transaction-payment/rpc/Cargo.toml b/substrate/frame/transaction-payment/rpc/Cargo.toml index 31f062837e74..3a8f2e7f7851 100644 --- a/substrate/frame/transaction-payment/rpc/Cargo.toml +++ b/substrate/frame/transaction-payment/rpc/Cargo.toml @@ -17,7 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.12" } -jsonrpsee = { version = "0.23", features = ["client-core", "macros", "server-core"] } +jsonrpsee = { version = "0.23.1", features = ["client-core", "macros", "server-core"] } pallet-transaction-payment-rpc-runtime-api = { path = "runtime-api" } sp-api = { path = "../../../primitives/api" } sp-blockchain = { path = "../../../primitives/blockchain" } diff --git a/substrate/utils/frame/remote-externalities/Cargo.toml b/substrate/utils/frame/remote-externalities/Cargo.toml index c7e7b97e2e37..c6e4127d9276 100644 --- a/substrate/utils/frame/remote-externalities/Cargo.toml +++ b/substrate/utils/frame/remote-externalities/Cargo.toml @@ -15,7 +15,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -jsonrpsee = { version = "0.23", features = ["http-client"] } +jsonrpsee = { version = "0.23.1", features = ["http-client"] } codec = { package = "parity-scale-codec", version = "3.6.12" } log = { workspace = true, default-features = true } serde = { workspace = true, default-features = true } diff --git a/substrate/utils/frame/rpc/client/Cargo.toml b/substrate/utils/frame/rpc/client/Cargo.toml index ff5e4a176573..c75e8d85045d 100644 --- a/substrate/utils/frame/rpc/client/Cargo.toml +++ b/substrate/utils/frame/rpc/client/Cargo.toml @@ -15,7 +15,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -jsonrpsee = { version = "0.23", features = ["ws-client"] } +jsonrpsee = { version = "0.23.1", features = ["ws-client"] } sc-rpc-api = { path = "../../../../client/rpc-api" } async-trait = "0.1.79" serde = { workspace = true, default-features = true } diff --git a/substrate/utils/frame/rpc/state-trie-migration-rpc/Cargo.toml b/substrate/utils/frame/rpc/state-trie-migration-rpc/Cargo.toml index 6664788edd67..2ad6aef38eb3 100644 --- a/substrate/utils/frame/rpc/state-trie-migration-rpc/Cargo.toml +++ b/substrate/utils/frame/rpc/state-trie-migration-rpc/Cargo.toml @@ -24,7 +24,7 @@ sp-state-machine = { path = "../../../../primitives/state-machine" } sp-trie = { path = "../../../../primitives/trie" } trie-db = "0.29.0" -jsonrpsee = { version = "0.23", features = ["client-core", "macros", "server-core"] } +jsonrpsee = { version = "0.23.1", features = ["client-core", "macros", "server-core"] } # Substrate Dependencies sc-client-api = { path = "../../../../client/api" } diff --git a/substrate/utils/frame/rpc/support/Cargo.toml b/substrate/utils/frame/rpc/support/Cargo.toml index 41bc3068ba2c..6db1d8915cd0 100644 --- a/substrate/utils/frame/rpc/support/Cargo.toml +++ b/substrate/utils/frame/rpc/support/Cargo.toml @@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.12" } -jsonrpsee = { version = "0.23", features = ["jsonrpsee-types"] } +jsonrpsee = { version = "0.23.1", features = ["jsonrpsee-types"] } serde = { workspace = true, default-features = true } frame-support = { path = "../../../../frame/support" } sc-rpc-api = { path = "../../../../client/rpc-api" } @@ -24,7 +24,7 @@ sp-storage = { path = "../../../../primitives/storage" } [dev-dependencies] scale-info = "2.11.1" -jsonrpsee = { version = "0.23", features = ["jsonrpsee-types", "ws-client"] } +jsonrpsee = { version = "0.23.1", features = ["jsonrpsee-types", "ws-client"] } tokio = "1.37" sp-core = { path = "../../../../primitives/core" } sp-runtime = { path = "../../../../primitives/runtime" } diff --git a/substrate/utils/frame/rpc/system/Cargo.toml b/substrate/utils/frame/rpc/system/Cargo.toml index 001d26aa5924..43adc6efcd94 100644 --- a/substrate/utils/frame/rpc/system/Cargo.toml +++ b/substrate/utils/frame/rpc/system/Cargo.toml @@ -19,7 +19,7 @@ targets = ["x86_64-unknown-linux-gnu"] futures = "0.3.30" codec = { package = "parity-scale-codec", version = "3.6.12" } docify = "0.2.0" -jsonrpsee = { version = "0.23.0", features = [ +jsonrpsee = { version = "0.23.1", features = [ "client-core", "macros", "server-core", diff --git a/templates/minimal/node/Cargo.toml b/templates/minimal/node/Cargo.toml index a1510d6fb811..57cb44ec29b9 100644 --- a/templates/minimal/node/Cargo.toml +++ b/templates/minimal/node/Cargo.toml @@ -18,7 +18,7 @@ docify = "0.2.0" clap = { version = "4.5.3", features = ["derive"] } futures = { version = "0.3.30", features = ["thread-pool"] } futures-timer = "3.0.1" -jsonrpsee = { version = "0.23", features = ["server"] } +jsonrpsee = { version = "0.23.1", features = ["server"] } serde_json = { workspace = true, default-features = true } sc-cli = { path = "../../../substrate/client/cli" } diff --git a/templates/parachain/node/Cargo.toml b/templates/parachain/node/Cargo.toml index acff0bde0c40..bf4e3f8e5367 100644 --- a/templates/parachain/node/Cargo.toml +++ b/templates/parachain/node/Cargo.toml @@ -18,7 +18,7 @@ clap = { version = "4.5.3", features = ["derive"] } log = { workspace = true, default-features = true } codec = { package = "parity-scale-codec", version = "3.6.12" } serde = { features = ["derive"], workspace = true, default-features = true } -jsonrpsee = { version = "0.23", features = ["server"] } +jsonrpsee = { version = "0.23.1", features = ["server"] } futures = "0.3.28" serde_json = { workspace = true, default-features = true } docify = "0.2.8" diff --git a/templates/solochain/node/Cargo.toml b/templates/solochain/node/Cargo.toml index 2a0b8902c35e..b6815a2696b7 100644 --- a/templates/solochain/node/Cargo.toml +++ b/templates/solochain/node/Cargo.toml @@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"] clap = { version = "4.5.3", features = ["derive"] } futures = { version = "0.3.30", features = ["thread-pool"] } serde_json = { workspace = true, default-features = true } -jsonrpsee = { version = "0.23", features = ["server"] } +jsonrpsee = { version = "0.23.1", features = ["server"] } # substrate client sc-cli = { path = "../../../substrate/client/cli" } From a2418a2da7a3c73e7deb11d18297903952c0bd0e Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson Date: Wed, 12 Jun 2024 14:18:23 +0200 Subject: [PATCH 06/17] remove needless deps --- Cargo.lock | 2 -- substrate/client/rpc-servers/Cargo.toml | 2 -- substrate/client/rpc-servers/src/lib.rs | 3 ++- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7dc680498dc2..14109c0a2325 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17986,13 +17986,11 @@ dependencies = [ name = "sc-rpc-server" version = "11.0.0" dependencies = [ - "anyhow", "forwarded-header-value", "futures", "governor", "http 1.1.0", "hyper 1.3.1", - "hyper-util", "ip_network", "jsonrpsee", "log", diff --git a/substrate/client/rpc-servers/Cargo.toml b/substrate/client/rpc-servers/Cargo.toml index b93a84e8bb17..167d3a117a74 100644 --- a/substrate/client/rpc-servers/Cargo.toml +++ b/substrate/client/rpc-servers/Cargo.toml @@ -16,13 +16,11 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -anyhow = "1" forwarded-header-value = "0.1.1" futures = "0.3.30" governor = "0.6.0" http = "1.1" hyper = "1.3" -hyper-util = { version = "0.1", features = ["tokio", "service", "tokio", "server-auto"] } ip_network = "0.4.1" jsonrpsee = { version = "0.23.1", features = ["server"] } log = { workspace = true, default-features = true } diff --git a/substrate/client/rpc-servers/src/lib.rs b/substrate/client/rpc-servers/src/lib.rs index c5e5c2657e16..70bc82f3cda1 100644 --- a/substrate/client/rpc-servers/src/lib.rs +++ b/substrate/client/rpc-servers/src/lib.rs @@ -26,6 +26,7 @@ pub mod utils; use std::{error::Error as StdError, net::SocketAddr, num::NonZeroU32, sync::Arc, time::Duration}; use jsonrpsee::{ + core::BoxError, server::{ middleware::http::ProxyGetRequestLayer, serve_with_graceful_shutdown, stop_channel, ws, PingConfig, StopHandle, TowerServiceBuilder, @@ -244,7 +245,7 @@ where // https://github.com/rust-lang/rust/issues/102211 the error type can't be inferred // to be `Box` so we need to convert it to // a concrete type as workaround. - svc.call(req).await.map_err(|e| anyhow::anyhow!("{:?}", e)) + svc.call(req).await.map_err(|e| BoxError::from(e)) } }); From b19875990fb020afd8c36528f3819da4e453d992 Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson Date: Tue, 18 Jun 2024 19:03:31 +0200 Subject: [PATCH 07/17] log conn_data when subscriptions lagged --- .../client/consensus/beefy/rpc/src/lib.rs | 20 ++++++-- .../client/consensus/grandpa/rpc/src/lib.rs | 21 +++++++-- substrate/client/rpc-api/src/author/mod.rs | 1 + substrate/client/rpc-api/src/chain/mod.rs | 9 ++-- substrate/client/rpc-api/src/state/mod.rs | 2 + substrate/client/rpc-servers/src/lib.rs | 4 +- .../client/rpc-spec-v2/src/transaction/api.rs | 1 + .../src/transaction/transaction.rs | 22 +++++++-- substrate/client/rpc/src/author/mod.rs | 17 +++++-- substrate/client/rpc/src/chain/chain_full.rs | 14 ++++-- substrate/client/rpc/src/chain/mod.rs | 40 +++++++++++----- substrate/client/rpc/src/state/mod.rs | 30 +++++++++--- substrate/client/rpc/src/state/state_full.rs | 9 ++-- substrate/client/rpc/src/utils.rs | 47 ++++++++++++++----- 14 files changed, 178 insertions(+), 59 deletions(-) diff --git a/substrate/client/consensus/beefy/rpc/src/lib.rs b/substrate/client/consensus/beefy/rpc/src/lib.rs index 66102eeb35c8..2cda4e5d761b 100644 --- a/substrate/client/consensus/beefy/rpc/src/lib.rs +++ b/substrate/client/consensus/beefy/rpc/src/lib.rs @@ -24,7 +24,10 @@ use parking_lot::RwLock; use sp_consensus_beefy::AuthorityIdBound; use std::sync::Arc; -use sc_rpc::{utils::pipe_from_stream, SubscriptionTaskExecutor}; +use sc_rpc::{ + utils::{pipe_from_stream, ConnData}, + SubscriptionTaskExecutor, +}; use sp_application_crypto::RuntimeAppPublic; use sp_runtime::traits::Block as BlockT; @@ -33,7 +36,7 @@ use jsonrpsee::{ core::async_trait, proc_macros::rpc, types::{ErrorObject, ErrorObjectOwned}, - PendingSubscriptionSink, + ConnectionId, Extensions, PendingSubscriptionSink, }; use log::warn; @@ -87,6 +90,7 @@ pub trait BeefyApi { name = "beefy_subscribeJustifications" => "beefy_justifications", unsubscribe = "beefy_unsubscribeJustifications", item = Notification, + with_extensions )] fn subscribe_justifications(&self); @@ -139,13 +143,21 @@ where AuthorityId: AuthorityIdBound, ::Signature: Send + Sync, { - fn subscribe_justifications(&self, pending: PendingSubscriptionSink) { + fn subscribe_justifications(&self, pending: PendingSubscriptionSink, ext: &Extensions) { + let conn_id = *ext.get::().expect("ConnectionId is set"); + let ip_addr = *ext.get::().expect("IpAddr is set"); + + let conn_data = ConnData { conn_id, ip_addr, method: "beefy_subscribeJustifications" }; + let stream = self .finality_proof_stream .subscribe(100_000) .map(|vfp| notification::EncodedVersionedFinalityProof::new::(vfp)); - sc_rpc::utils::spawn_subscription_task(&self.executor, pipe_from_stream(pending, stream)); + sc_rpc::utils::spawn_subscription_task( + &self.executor, + pipe_from_stream(pending, stream, conn_data), + ); } async fn latest_finalized(&self) -> Result { diff --git a/substrate/client/consensus/grandpa/rpc/src/lib.rs b/substrate/client/consensus/grandpa/rpc/src/lib.rs index 430525019dfb..da7a1b2f012e 100644 --- a/substrate/client/consensus/grandpa/rpc/src/lib.rs +++ b/substrate/client/consensus/grandpa/rpc/src/lib.rs @@ -26,6 +26,7 @@ use std::sync::Arc; use jsonrpsee::{ core::{async_trait, server::PendingSubscriptionSink}, proc_macros::rpc, + ConnectionId, Extensions, }; mod error; @@ -38,7 +39,10 @@ use finality::{EncodedFinalityProof, RpcFinalityProofProvider}; use notification::JustificationNotification; use report::{ReportAuthoritySet, ReportVoterState, ReportedRoundStates}; use sc_consensus_grandpa::GrandpaJustificationStream; -use sc_rpc::{utils::pipe_from_stream, SubscriptionTaskExecutor}; +use sc_rpc::{ + utils::{pipe_from_stream, ConnData}, + SubscriptionTaskExecutor, +}; use sp_runtime::traits::{Block as BlockT, NumberFor}; /// Provides RPC methods for interacting with GRANDPA. @@ -54,7 +58,8 @@ pub trait GrandpaApi { #[subscription( name = "grandpa_subscribeJustifications" => "grandpa_justifications", unsubscribe = "grandpa_unsubscribeJustifications", - item = Notification + item = Notification, + with_extensions )] fn subscribe_justifications(&self); @@ -101,14 +106,22 @@ where ReportedRoundStates::from(&self.authority_set, &self.voter_state) } - fn subscribe_justifications(&self, pending: PendingSubscriptionSink) { + fn subscribe_justifications(&self, pending: PendingSubscriptionSink, ext: &Extensions) { + let conn_id = *ext.get::().expect("ConnectionId is set"); + let ip_addr = *ext.get::().expect("IpAddr is set"); + + let conn_data = ConnData { conn_id, ip_addr, method: "grandpa_subscribeJustifications" }; + let stream = self.justification_stream.subscribe(100_000).map( |x: sc_consensus_grandpa::GrandpaJustification| { JustificationNotification::from(x) }, ); - sc_rpc::utils::spawn_subscription_task(&self.executor, pipe_from_stream(pending, stream)); + sc_rpc::utils::spawn_subscription_task( + &self.executor, + pipe_from_stream(pending, stream, conn_data), + ); } async fn prove_finality( diff --git a/substrate/client/rpc-api/src/author/mod.rs b/substrate/client/rpc-api/src/author/mod.rs index cfc56f4130ab..419eb929b37c 100644 --- a/substrate/client/rpc-api/src/author/mod.rs +++ b/substrate/client/rpc-api/src/author/mod.rs @@ -74,6 +74,7 @@ pub trait AuthorApi { name = "author_submitAndWatchExtrinsic" => "author_extrinsicUpdate", unsubscribe = "author_unwatchExtrinsic", item = TransactionStatus, + with_extensions )] fn watch_extrinsic(&self, bytes: Bytes); } diff --git a/substrate/client/rpc-api/src/chain/mod.rs b/substrate/client/rpc-api/src/chain/mod.rs index e53c2bc5510a..508d73d001a9 100644 --- a/substrate/client/rpc-api/src/chain/mod.rs +++ b/substrate/client/rpc-api/src/chain/mod.rs @@ -51,7 +51,8 @@ pub trait ChainApi { #[subscription( name = "chain_subscribeAllHeads" => "chain_allHead", unsubscribe = "chain_unsubscribeAllHeads", - item = Header + item = Header, + with_extensions, )] fn subscribe_all_heads(&self); @@ -61,7 +62,8 @@ pub trait ChainApi { aliases = ["subscribe_newHead", "chain_subscribeNewHead"], unsubscribe = "chain_unsubscribeNewHeads", unsubscribe_aliases = ["unsubscribe_newHead", "chain_unsubscribeNewHead"], - item = Header + item = Header, + with_extensions )] fn subscribe_new_heads(&self); @@ -71,7 +73,8 @@ pub trait ChainApi { aliases = ["chain_subscribeFinalisedHeads"], unsubscribe = "chain_unsubscribeFinalizedHeads", unsubscribe_aliases = ["chain_unsubscribeFinalisedHeads"], - item = Header + item = Header, + with_extensions )] fn subscribe_finalized_heads(&self); } diff --git a/substrate/client/rpc-api/src/state/mod.rs b/substrate/client/rpc-api/src/state/mod.rs index e38e383c4c15..115a09cd1be4 100644 --- a/substrate/client/rpc-api/src/state/mod.rs +++ b/substrate/client/rpc-api/src/state/mod.rs @@ -128,6 +128,7 @@ pub trait StateApi { aliases = ["chain_subscribeRuntimeVersion"], unsubscribe_aliases = ["chain_unsubscribeRuntimeVersion"], item = RuntimeVersion, + with_extensions, )] fn subscribe_runtime_version(&self); @@ -136,6 +137,7 @@ pub trait StateApi { name = "state_subscribeStorage" => "state_storage", unsubscribe = "state_unsubscribeStorage", item = StorageChangeSet, + with_extensions )] fn subscribe_storage(&self, keys: Option>); diff --git a/substrate/client/rpc-servers/src/lib.rs b/substrate/client/rpc-servers/src/lib.rs index 70bc82f3cda1..e53f8fe6f830 100644 --- a/substrate/client/rpc-servers/src/lib.rs +++ b/substrate/client/rpc-servers/src/lib.rs @@ -181,7 +181,7 @@ where let ip = remote_addr.ip(); let cfg2 = cfg.clone(); - let svc = tower::service_fn(move |req: http::Request| { + let svc = tower::service_fn(move |mut req: http::Request| { let PerConnection { methods, service_builder, @@ -194,6 +194,8 @@ where let proxy_ip = if rate_limit_trust_proxy_headers { get_proxy_ip(&req) } else { None }; + req.extensions_mut().insert(proxy_ip.unwrap_or(ip)); + let rate_limit_cfg = if rate_limit_whitelisted_ips .iter() .any(|ips| ips.contains(proxy_ip.unwrap_or(ip))) diff --git a/substrate/client/rpc-spec-v2/src/transaction/api.rs b/substrate/client/rpc-spec-v2/src/transaction/api.rs index 6af6f1678440..ce7cdb63e760 100644 --- a/substrate/client/rpc-spec-v2/src/transaction/api.rs +++ b/substrate/client/rpc-spec-v2/src/transaction/api.rs @@ -36,6 +36,7 @@ pub trait TransactionApi { name = "transactionWatch_v1_submitAndWatch" => "transactionWatch_v1_watchEvent", unsubscribe = "transactionWatch_v1_unwatch", item = TransactionEvent, + with_extensions, )] fn submit_and_watch(&self, bytes: Bytes); } diff --git a/substrate/client/rpc-spec-v2/src/transaction/transaction.rs b/substrate/client/rpc-spec-v2/src/transaction/transaction.rs index 723440d1b111..81db10668c8c 100644 --- a/substrate/client/rpc-spec-v2/src/transaction/transaction.rs +++ b/substrate/client/rpc-spec-v2/src/transaction/transaction.rs @@ -29,7 +29,7 @@ use crate::{ use codec::Decode; use futures::{StreamExt, TryFutureExt}; -use jsonrpsee::{core::async_trait, PendingSubscriptionSink}; +use jsonrpsee::{core::async_trait, ConnectionId, Extensions, PendingSubscriptionSink}; use sc_rpc::utils::{pipe_from_stream, to_sub_message}; use sc_transaction_pool_api::{ error::IntoPoolError, BlockHash, TransactionFor, TransactionPool, TransactionSource, @@ -74,7 +74,16 @@ where ::Hash: Unpin, Client: HeaderBackend + Send + Sync + 'static, { - fn submit_and_watch(&self, pending: PendingSubscriptionSink, xt: Bytes) { + fn submit_and_watch(&self, pending: PendingSubscriptionSink, ext: &Extensions, xt: Bytes) { + let conn_id = *ext.get::().expect("ConnectionId is always set"); + let ip_addr = *ext.get::().expect("IpAddr is always set"); + + let conn_data = sc_rpc::utils::ConnData { + method: "transactionWatch_v1_submitAndWatch", + ip_addr, + conn_id, + }; + let client = self.client.clone(); let pool = self.pool.clone(); @@ -111,13 +120,18 @@ where match submit.await { Ok(stream) => { let stream = stream.filter_map(move |event| async move { handle_event(event) }); - pipe_from_stream(pending, stream.boxed()).await; + pipe_from_stream(pending, stream.boxed(), conn_data).await; }, Err(err) => { // We have not created an `Watcher` for the tx. Make sure the // error is still propagated as an event. let event: TransactionEvent<::Hash> = err.into(); - pipe_from_stream(pending, futures::stream::once(async { event }).boxed()).await; + pipe_from_stream( + pending, + futures::stream::once(async { event }).boxed(), + conn_data, + ) + .await; }, }; }; diff --git a/substrate/client/rpc/src/author/mod.rs b/substrate/client/rpc/src/author/mod.rs index 975f66406a6a..505638604eed 100644 --- a/substrate/client/rpc/src/author/mod.rs +++ b/substrate/client/rpc/src/author/mod.rs @@ -30,7 +30,9 @@ use crate::{ use codec::{Decode, Encode}; use futures::TryFutureExt; -use jsonrpsee::{core::async_trait, types::ErrorObject, PendingSubscriptionSink}; +use jsonrpsee::{ + core::async_trait, types::ErrorObject, ConnectionId, Extensions, PendingSubscriptionSink, +}; use sc_rpc_api::DenyUnsafe; use sc_transaction_pool_api::{ error::IntoPoolError, BlockHash, InPoolTransaction, TransactionFor, TransactionPool, @@ -177,7 +179,10 @@ where .collect()) } - fn watch_extrinsic(&self, pending: PendingSubscriptionSink, xt: Bytes) { + fn watch_extrinsic(&self, pending: PendingSubscriptionSink, ext: &Extensions, xt: Bytes) { + let conn_id = *ext.get::().expect("ConnectionId is set"); + let ip_addr = *ext.get::().expect("IpAddr is set"); + let best_block_hash = self.client.info().best_hash; let dxt = match TransactionFor::

::decode(&mut &xt[..]).map_err(|e| Error::from(e)) { Ok(dxt) => dxt, @@ -202,7 +207,13 @@ where }, }; - pipe_from_stream(pending, stream).await; + let conn_data = crate::utils::ConnData { + method: "author_submitAndWatchExtrinsic", + ip_addr, + conn_id, + }; + + pipe_from_stream(pending, stream, conn_data).await; }; spawn_subscription_task(&self.executor, fut); diff --git a/substrate/client/rpc/src/chain/chain_full.rs b/substrate/client/rpc/src/chain/chain_full.rs index 515c0f62c8ad..09df717b7aa1 100644 --- a/substrate/client/rpc/src/chain/chain_full.rs +++ b/substrate/client/rpc/src/chain/chain_full.rs @@ -20,7 +20,7 @@ use super::{client_err, ChainBackend, Error}; use crate::{ - utils::{pipe_from_stream, spawn_subscription_task}, + utils::{pipe_from_stream, spawn_subscription_task, ConnData}, SubscriptionTaskExecutor, }; use std::{marker::PhantomData, sync::Arc}; @@ -70,7 +70,7 @@ where self.client.block(self.unwrap_or_best(hash)).map_err(client_err) } - fn subscribe_all_heads(&self, pending: PendingSubscriptionSink) { + fn subscribe_all_heads(&self, pending: PendingSubscriptionSink, conn_data: ConnData) { subscribe_headers( &self.client, &self.executor, @@ -81,10 +81,11 @@ where .import_notification_stream() .map(|notification| notification.header) }, + conn_data, ) } - fn subscribe_new_heads(&self, pending: PendingSubscriptionSink) { + fn subscribe_new_heads(&self, pending: PendingSubscriptionSink, conn_data: ConnData) { subscribe_headers( &self.client, &self.executor, @@ -96,10 +97,11 @@ where .filter(|notification| future::ready(notification.is_new_best)) .map(|notification| notification.header) }, + conn_data, ) } - fn subscribe_finalized_heads(&self, pending: PendingSubscriptionSink) { + fn subscribe_finalized_heads(&self, pending: PendingSubscriptionSink, conn_data: ConnData) { subscribe_headers( &self.client, &self.executor, @@ -110,6 +112,7 @@ where .finality_notification_stream() .map(|notification| notification.header) }, + conn_data, ) } } @@ -121,6 +124,7 @@ fn subscribe_headers( pending: PendingSubscriptionSink, best_block_hash: G, stream: F, + conn_data: ConnData, ) where Block: BlockT + 'static, Block::Header: Unpin, @@ -143,5 +147,5 @@ fn subscribe_headers( // duplicates at the beginning of the stream though. let stream = stream::iter(maybe_header).chain(stream()); - spawn_subscription_task(executor, pipe_from_stream(pending, stream)); + spawn_subscription_task(executor, pipe_from_stream(pending, stream, conn_data)); } diff --git a/substrate/client/rpc/src/chain/mod.rs b/substrate/client/rpc/src/chain/mod.rs index 1c74db8642e6..4c806df02bd5 100644 --- a/substrate/client/rpc/src/chain/mod.rs +++ b/substrate/client/rpc/src/chain/mod.rs @@ -25,9 +25,9 @@ mod tests; use std::sync::Arc; -use crate::SubscriptionTaskExecutor; +use crate::{utils::ConnData, SubscriptionTaskExecutor}; -use jsonrpsee::{core::async_trait, PendingSubscriptionSink}; +use jsonrpsee::{core::async_trait, ConnectionId, Extensions, PendingSubscriptionSink}; use sc_client_api::BlockchainEvents; use sp_rpc::{list::ListOrValue, number::NumberOrHex}; use sp_runtime::{ @@ -92,13 +92,13 @@ where } /// All new head subscription - fn subscribe_all_heads(&self, pending: PendingSubscriptionSink); + fn subscribe_all_heads(&self, pending: PendingSubscriptionSink, conn_data: ConnData); /// New best head subscription - fn subscribe_new_heads(&self, pending: PendingSubscriptionSink); + fn subscribe_new_heads(&self, pending: PendingSubscriptionSink, conn_data: ConnData); /// Finalized head subscription - fn subscribe_finalized_heads(&self, pending: PendingSubscriptionSink); + fn subscribe_finalized_heads(&self, pending: PendingSubscriptionSink, conn_data: ConnData); } /// Create new state API that works on full node. @@ -158,16 +158,34 @@ where self.backend.finalized_head() } - fn subscribe_all_heads(&self, pending: PendingSubscriptionSink) { - self.backend.subscribe_all_heads(pending); + fn subscribe_all_heads(&self, pending: PendingSubscriptionSink, ext: &Extensions) { + let conn_id = *ext.get::().expect("ConnectionId is set"); + let ip_addr = *ext.get::().expect("IpAddr is set"); + + let conn_data = + crate::utils::ConnData { method: "chain_subscribeAllHeads", ip_addr, conn_id }; + + self.backend.subscribe_all_heads(pending, conn_data); } - fn subscribe_new_heads(&self, pending: PendingSubscriptionSink) { - self.backend.subscribe_new_heads(pending) + fn subscribe_new_heads(&self, pending: PendingSubscriptionSink, ext: &Extensions) { + let conn_id = *ext.get::().expect("ConnectionId is set"); + let ip_addr = *ext.get::().expect("IpAddr is set"); + + let conn_data = + crate::utils::ConnData { method: "chain_subscribeNewHeads", ip_addr, conn_id }; + + self.backend.subscribe_new_heads(pending, conn_data) } - fn subscribe_finalized_heads(&self, pending: PendingSubscriptionSink) { - self.backend.subscribe_finalized_heads(pending) + fn subscribe_finalized_heads(&self, pending: PendingSubscriptionSink, ext: &Extensions) { + let conn_id = *ext.get::().expect("ConnectionId is set"); + let ip_addr = *ext.get::().expect("IpAddr is set"); + + let conn_data = + crate::utils::ConnData { method: "chain_subscribeFinalizedHeads", ip_addr, conn_id }; + + self.backend.subscribe_finalized_heads(pending, conn_data) } } diff --git a/substrate/client/rpc/src/state/mod.rs b/substrate/client/rpc/src/state/mod.rs index c9a41e25eda8..1b28bfeefbc9 100644 --- a/substrate/client/rpc/src/state/mod.rs +++ b/substrate/client/rpc/src/state/mod.rs @@ -24,8 +24,8 @@ mod utils; #[cfg(test)] mod tests; -use crate::SubscriptionTaskExecutor; -use jsonrpsee::{core::async_trait, PendingSubscriptionSink}; +use crate::{utils::ConnData, SubscriptionTaskExecutor}; +use jsonrpsee::{core::async_trait, ConnectionId, Extensions, PendingSubscriptionSink}; use sc_client_api::{ Backend, BlockBackend, BlockchainEvents, ExecutorProvider, ProofProvider, StorageProvider, }; @@ -149,7 +149,7 @@ where ) -> Result; /// New runtime version subscription - fn subscribe_runtime_version(&self, pending: PendingSubscriptionSink); + fn subscribe_runtime_version(&self, pending: PendingSubscriptionSink, conn_data: ConnData); /// New storage subscription fn subscribe_storage( @@ -157,6 +157,7 @@ where pending: PendingSubscriptionSink, keys: Option>, deny_unsafe: DenyUnsafe, + conn_data: ConnData, ); } @@ -323,12 +324,27 @@ where .map_err(Into::into) } - fn subscribe_runtime_version(&self, pending: PendingSubscriptionSink) { - self.backend.subscribe_runtime_version(pending) + fn subscribe_runtime_version(&self, pending: PendingSubscriptionSink, ext: &Extensions) { + let conn_id = *ext.get::().expect("ConnectionId is set"); + let ip_addr = *ext.get::().expect("IpAddr is set"); + + let conn_data = ConnData { method: "state_subscribeRuntimeVersion", ip_addr, conn_id }; + + self.backend.subscribe_runtime_version(pending, conn_data) } - fn subscribe_storage(&self, pending: PendingSubscriptionSink, keys: Option>) { - self.backend.subscribe_storage(pending, keys, self.deny_unsafe) + fn subscribe_storage( + &self, + pending: PendingSubscriptionSink, + ext: &Extensions, + keys: Option>, + ) { + let conn_id = *ext.get::().expect("ConnectionId is set"); + let ip_addr = *ext.get::().expect("IpAddr is set"); + + let conn_data = ConnData { method: "state_subscribeStorage", ip_addr, conn_id }; + + self.backend.subscribe_storage(pending, keys, self.deny_unsafe, conn_data) } } diff --git a/substrate/client/rpc/src/state/state_full.rs b/substrate/client/rpc/src/state/state_full.rs index bda678c1b45e..19576d5404d4 100644 --- a/substrate/client/rpc/src/state/state_full.rs +++ b/substrate/client/rpc/src/state/state_full.rs @@ -26,7 +26,7 @@ use super::{ ChildStateBackend, StateBackend, }; use crate::{ - utils::{pipe_from_stream, spawn_subscription_task}, + utils::{pipe_from_stream, spawn_subscription_task, ConnData}, DenyUnsafe, SubscriptionTaskExecutor, }; @@ -371,7 +371,7 @@ where .map_err(client_err) } - fn subscribe_runtime_version(&self, pending: PendingSubscriptionSink) { + fn subscribe_runtime_version(&self, pending: PendingSubscriptionSink, conn_data: ConnData) { let initial = match self .block_or_best(None) .and_then(|block| self.client.runtime_version_at(block).map_err(Into::into)) @@ -405,7 +405,7 @@ where }); let stream = futures::stream::once(future::ready(initial)).chain(version_stream); - spawn_subscription_task(&self.executor, pipe_from_stream(pending, stream)); + spawn_subscription_task(&self.executor, pipe_from_stream(pending, stream, conn_data)); } fn subscribe_storage( @@ -413,6 +413,7 @@ where pending: PendingSubscriptionSink, keys: Option>, deny_unsafe: DenyUnsafe, + conn_data: ConnData, ) { if keys.is_none() { if let Err(err) = deny_unsafe.check_if_safe() { @@ -457,7 +458,7 @@ where .chain(storage_stream) .filter(|storage| future::ready(!storage.changes.is_empty())); - spawn_subscription_task(&self.executor, pipe_from_stream(pending, stream)); + spawn_subscription_task(&self.executor, pipe_from_stream(pending, stream, conn_data)); } fn trace_block( diff --git a/substrate/client/rpc/src/utils.rs b/substrate/client/rpc/src/utils.rs index bc566ed37f23..568a067d559c 100644 --- a/substrate/client/rpc/src/utils.rs +++ b/substrate/client/rpc/src/utils.rs @@ -23,7 +23,7 @@ use futures::{ future::{self, Either, Fuse, FusedFuture}, Future, FutureExt, Stream, StreamExt, }; -use jsonrpsee::{PendingSubscriptionSink, SubscriptionMessage, SubscriptionSink}; +use jsonrpsee::{ConnectionId, PendingSubscriptionSink, SubscriptionMessage, SubscriptionSink}; use sp_runtime::Serialize; use std::collections::VecDeque; @@ -55,6 +55,16 @@ impl BoundedVecDeque { } } +/// Connection data. +pub struct ConnData { + /// .. + pub method: &'static str, + /// .. + pub ip_addr: std::net::IpAddr, + /// .. + pub conn_id: ConnectionId, +} + /// Feed items to the subscription from the underlying stream. /// /// This is bounded because the underlying streams in substrate are @@ -62,8 +72,11 @@ impl BoundedVecDeque { /// cause the buffer to become very large and consume lots of memory. /// /// In such cases the subscription is dropped. -pub async fn pipe_from_stream(pending: PendingSubscriptionSink, mut stream: S) -where +pub async fn pipe_from_stream( + pending: PendingSubscriptionSink, + mut stream: S, + conn_data: ConnData, +) where S: Stream + Unpin + Send + 'static, T: Serialize + Send + 'static, { @@ -80,7 +93,7 @@ where Either::Left((Ok(sink), _)) => break sink, Either::Right((Some(msg), f)) => { if buf.push_back(msg).is_err() { - log::warn!(target: "rpc", "Subscription::accept failed buffer limit={} exceeded; dropping subscription", buf.max_cap); + log::warn!(target: "rpc", "Subscription::accept lagged dropping subscription=`{}`, peer={}", conn_data.method, conn_data.ip_addr); return } accept_fut = f; @@ -90,13 +103,14 @@ where } }; - inner_pipe_from_stream(sink, stream, buf).await + inner_pipe_from_stream(sink, stream, buf, conn_data).await } async fn inner_pipe_from_stream( sink: SubscriptionSink, mut stream: S, mut buf: BoundedVecDeque, + conn_data: ConnData, ) where S: Stream + Unpin + Send + 'static, T: Serialize + Send + 'static, @@ -127,10 +141,9 @@ async fn inner_pipe_from_stream( if buf.push_back(v).is_err() { log::warn!( target: "rpc", - "Subscription buffer limit={} exceeded for subscription={} conn_id={}; dropping subscription", - buf.max_cap, - sink.method_name(), - sink.connection_id().0 + "Subscription lagged dropping subscription `{}`, peer={}", + conn_data.method, + conn_data.ip_addr, ); return } @@ -182,16 +195,24 @@ pub fn spawn_subscription_task( #[cfg(test)] mod tests { - use super::pipe_from_stream; + use super::{pipe_from_stream, ConnData}; use futures::StreamExt; use jsonrpsee::{core::EmptyServerParams, RpcModule, Subscription}; + fn conn_data() -> ConnData { + super::ConnData { + method: "sub", + ip_addr: std::net::IpAddr::V4(std::net::Ipv4Addr::new(127, 0, 0, 1)), + conn_id: 0, + } + } + async fn subscribe() -> Subscription { let mut module = RpcModule::new(()); module .register_subscription("sub", "my_sub", "unsub", |_, pending, _, _| async move { let stream = futures::stream::iter([0; 16]); - pipe_from_stream(pending, stream).await; + pipe_from_stream(pending, stream, conn_data()).await; Ok(()) }) .unwrap(); @@ -219,7 +240,7 @@ mod tests { module .register_subscription("sub", "my_sub", "unsub", |_, pending, ctx, _| async move { let stream = futures::stream::iter([0; 32]); - pipe_from_stream(pending, stream).await; + pipe_from_stream(pending, stream, conn_data()).await; _ = ctx.unbounded_send(()); Ok(()) }) @@ -248,7 +269,7 @@ mod tests { // to sync buffer and channel send operations let stream = futures::stream::empty::<()>(); // this should exit immediately - pipe_from_stream(pending, stream).await; + pipe_from_stream(pending, stream, conn_data()).await; // notify that the `pipe_from_stream` has returned notify_tx.notify_one(); Ok(()) From c059759055522509f5b46302fef468ab2b89b08a Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson Date: Mon, 17 Jun 2024 18:23:16 +0200 Subject: [PATCH 08/17] rpc: add prometheous metrics dropped subscriptions --- Cargo.lock | 1 + polkadot/rpc/src/lib.rs | 4 + substrate/bin/node/rpc/src/lib.rs | 4 + .../client/consensus/beefy/rpc/src/lib.rs | 30 +++--- .../client/consensus/grandpa/rpc/src/lib.rs | 27 +++-- .../src/transaction/transaction.rs | 30 +++--- substrate/client/rpc/Cargo.toml | 1 + substrate/client/rpc/src/author/mod.rs | 22 +++-- substrate/client/rpc/src/chain/chain_full.rs | 24 +++-- substrate/client/rpc/src/chain/mod.rs | 62 +++++++----- substrate/client/rpc/src/lib.rs | 1 + substrate/client/rpc/src/state/mod.rs | 43 +++++--- substrate/client/rpc/src/state/state_full.rs | 16 +-- substrate/client/rpc/src/utils.rs | 98 ++++++++++++++----- substrate/client/service/src/builder.rs | 19 +++- 15 files changed, 255 insertions(+), 127 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5833f7c14e7c..b8172d89f579 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17964,6 +17964,7 @@ dependencies = [ "parity-scale-codec", "parking_lot 0.12.1", "pretty_assertions", + "prometheus", "sc-block-builder", "sc-chain-spec", "sc-client-api", diff --git a/polkadot/rpc/src/lib.rs b/polkadot/rpc/src/lib.rs index 7d678ada5ff5..3681fc821f3a 100644 --- a/polkadot/rpc/src/lib.rs +++ b/polkadot/rpc/src/lib.rs @@ -142,6 +142,8 @@ where let chain_name = chain_spec.name().to_string(); let genesis_hash = client.hash(0).ok().flatten().expect("Genesis block exists; qed"); let properties = chain_spec.properties(); + // TODO: This should be a shared metrics instance. + let metrics = sc_rpc::SubscriptionMetrics::disabled(); io.merge(ChainSpec::new(chain_name, genesis_hash, properties).into_rpc())?; io.merge(StateMigration::new(client.clone(), backend.clone(), deny_unsafe).into_rpc())?; @@ -167,6 +169,7 @@ where shared_voter_state, justification_stream, finality_provider, + metrics.clone(), ) .into_rpc(), )?; @@ -179,6 +182,7 @@ where beefy.beefy_finality_proof_stream, beefy.beefy_best_block_stream, beefy.subscription_executor, + metrics, )? .into_rpc(), )?; diff --git a/substrate/bin/node/rpc/src/lib.rs b/substrate/bin/node/rpc/src/lib.rs index 52cd7f9561d2..4ab3402e71b1 100644 --- a/substrate/bin/node/rpc/src/lib.rs +++ b/substrate/bin/node/rpc/src/lib.rs @@ -179,6 +179,8 @@ where let chain_name = chain_spec.name().to_string(); let genesis_hash = client.block_hash(0).ok().flatten().expect("Genesis block exists; qed"); let properties = chain_spec.properties(); + let metrics = sc_rpc::SubscriptionMetrics::disabled(); + io.merge(ChainSpec::new(chain_name, genesis_hash, properties).into_rpc())?; io.merge(System::new(client.clone(), pool, deny_unsafe).into_rpc())?; @@ -206,6 +208,7 @@ where shared_voter_state, justification_stream, finality_provider, + metrics.clone(), ) .into_rpc(), )?; @@ -231,6 +234,7 @@ where beefy.beefy_finality_proof_stream, beefy.beefy_best_block_stream, beefy.subscription_executor, + metrics, )? .into_rpc(), )?; diff --git a/substrate/client/consensus/beefy/rpc/src/lib.rs b/substrate/client/consensus/beefy/rpc/src/lib.rs index 2cda4e5d761b..3964cf0f4746 100644 --- a/substrate/client/consensus/beefy/rpc/src/lib.rs +++ b/substrate/client/consensus/beefy/rpc/src/lib.rs @@ -25,8 +25,7 @@ use sp_consensus_beefy::AuthorityIdBound; use std::sync::Arc; use sc_rpc::{ - utils::{pipe_from_stream, ConnData}, - SubscriptionTaskExecutor, + utils::pipe_from_stream, SubscriptionMetrics, SubscriptionParams, SubscriptionTaskExecutor, }; use sp_application_crypto::RuntimeAppPublic; use sp_runtime::traits::Block as BlockT; @@ -108,6 +107,7 @@ pub struct Beefy { finality_proof_stream: BeefyVersionedFinalityProofStream, beefy_best_block: Arc>>, executor: SubscriptionTaskExecutor, + metrics: SubscriptionMetrics, } impl Beefy @@ -120,6 +120,7 @@ where finality_proof_stream: BeefyVersionedFinalityProofStream, best_block_stream: BeefyBestBlockStream, executor: SubscriptionTaskExecutor, + metrics: SubscriptionMetrics, ) -> Result { let beefy_best_block = Arc::new(RwLock::new(None)); @@ -131,7 +132,7 @@ where }); executor.spawn("substrate-rpc-subscription", Some("rpc"), future.map(drop).boxed()); - Ok(Self { finality_proof_stream, beefy_best_block, executor }) + Ok(Self { finality_proof_stream, beefy_best_block, executor, metrics }) } } @@ -144,10 +145,12 @@ where ::Signature: Send + Sync, { fn subscribe_justifications(&self, pending: PendingSubscriptionSink, ext: &Extensions) { - let conn_id = *ext.get::().expect("ConnectionId is set"); - let ip_addr = *ext.get::().expect("IpAddr is set"); - - let conn_data = ConnData { conn_id, ip_addr, method: "beefy_subscribeJustifications" }; + let params = SubscriptionParams { + conn_id: *ext.get::().expect("ConnectionId is set"), + ip_addr: *ext.get::().expect("IpAddr is set"), + method: "beefy_subscribeJustifications", + metrics: self.metrics.clone(), + }; let stream = self .finality_proof_stream @@ -156,7 +159,7 @@ where sc_rpc::utils::spawn_subscription_task( &self.executor, - pipe_from_stream(pending, stream, conn_data), + pipe_from_stream(pending, stream, params), ); } @@ -175,6 +178,7 @@ mod tests { communication::notification::BeefyVersionedFinalityProofSender, justification::BeefyVersionedFinalityProof, }; + use sc_rpc::SubscriptionMetrics; use sp_consensus_beefy::{ecdsa_crypto, known_payloads, Payload, SignedCommitment}; use sp_runtime::traits::{BlakeTwo256, Hash}; use substrate_test_runtime_client::runtime::Block; @@ -196,9 +200,13 @@ mod tests { let (finality_proof_sender, finality_proof_stream) = BeefyVersionedFinalityProofStream::::channel(); - let handler = - Beefy::new(finality_proof_stream, best_block_stream, sc_rpc::testing::test_executor()) - .expect("Setting up the BEEFY RPC handler works"); + let handler = Beefy::new( + finality_proof_stream, + best_block_stream, + sc_rpc::testing::test_executor(), + Metrics::new(None), + ) + .expect("Setting up the BEEFY RPC handler works"); (handler.into_rpc(), finality_proof_sender) } diff --git a/substrate/client/consensus/grandpa/rpc/src/lib.rs b/substrate/client/consensus/grandpa/rpc/src/lib.rs index da7a1b2f012e..deeeb23e5292 100644 --- a/substrate/client/consensus/grandpa/rpc/src/lib.rs +++ b/substrate/client/consensus/grandpa/rpc/src/lib.rs @@ -40,8 +40,7 @@ use notification::JustificationNotification; use report::{ReportAuthoritySet, ReportVoterState, ReportedRoundStates}; use sc_consensus_grandpa::GrandpaJustificationStream; use sc_rpc::{ - utils::{pipe_from_stream, ConnData}, - SubscriptionTaskExecutor, + utils::pipe_from_stream, SubscriptionMetrics, SubscriptionParams, SubscriptionTaskExecutor, }; use sp_runtime::traits::{Block as BlockT, NumberFor}; @@ -76,6 +75,7 @@ pub struct Grandpa { voter_state: VoterState, justification_stream: GrandpaJustificationStream, finality_proof_provider: Arc, + metrics: SubscriptionMetrics, } impl Grandpa @@ -87,8 +87,16 @@ impl voter_state: VoterState, justification_stream: GrandpaJustificationStream, finality_proof_provider: Arc, + metrics: SubscriptionMetrics, ) -> Self { - Self { executor, authority_set, voter_state, justification_stream, finality_proof_provider } + Self { + executor, + authority_set, + voter_state, + justification_stream, + finality_proof_provider, + metrics, + } } } @@ -107,10 +115,12 @@ where } fn subscribe_justifications(&self, pending: PendingSubscriptionSink, ext: &Extensions) { - let conn_id = *ext.get::().expect("ConnectionId is set"); - let ip_addr = *ext.get::().expect("IpAddr is set"); - - let conn_data = ConnData { conn_id, ip_addr, method: "grandpa_subscribeJustifications" }; + let params = SubscriptionParams { + conn_id: *ext.get::().expect("ConnectionId is set"), + ip_addr: *ext.get::().expect("IpAddr is set"), + method: "grandpa_subscribeJustifications", + metrics: self.metrics.clone(), + }; let stream = self.justification_stream.subscribe(100_000).map( |x: sc_consensus_grandpa::GrandpaJustification| { @@ -120,7 +130,7 @@ where sc_rpc::utils::spawn_subscription_task( &self.executor, - pipe_from_stream(pending, stream, conn_data), + pipe_from_stream(pending, stream, params), ); } @@ -273,6 +283,7 @@ mod tests { voter_state, justification_stream, finality_proof_provider, + Metrics::empty(), ) .into_rpc(); diff --git a/substrate/client/rpc-spec-v2/src/transaction/transaction.rs b/substrate/client/rpc-spec-v2/src/transaction/transaction.rs index 81db10668c8c..96788fff970f 100644 --- a/substrate/client/rpc-spec-v2/src/transaction/transaction.rs +++ b/substrate/client/rpc-spec-v2/src/transaction/transaction.rs @@ -30,7 +30,10 @@ use crate::{ use codec::Decode; use futures::{StreamExt, TryFutureExt}; use jsonrpsee::{core::async_trait, ConnectionId, Extensions, PendingSubscriptionSink}; -use sc_rpc::utils::{pipe_from_stream, to_sub_message}; +use sc_rpc::{ + utils::{pipe_from_stream, to_sub_message}, + SubscriptionMetrics, SubscriptionParams, +}; use sc_transaction_pool_api::{ error::IntoPoolError, BlockHash, TransactionFor, TransactionPool, TransactionSource, TransactionStatus, @@ -50,12 +53,19 @@ pub struct Transaction { pool: Arc, /// Executor to spawn subscriptions. executor: SubscriptionTaskExecutor, + /// Subscription metrics. + metrics: SubscriptionMetrics, } impl Transaction { /// Creates a new [`Transaction`]. - pub fn new(client: Arc, pool: Arc, executor: SubscriptionTaskExecutor) -> Self { - Transaction { client, pool, executor } + pub fn new( + client: Arc, + pool: Arc, + executor: SubscriptionTaskExecutor, + metrics: SubscriptionMetrics, + ) -> Self { + Transaction { client, pool, executor, metrics } } } @@ -75,13 +85,11 @@ where Client: HeaderBackend + Send + Sync + 'static, { fn submit_and_watch(&self, pending: PendingSubscriptionSink, ext: &Extensions, xt: Bytes) { - let conn_id = *ext.get::().expect("ConnectionId is always set"); - let ip_addr = *ext.get::().expect("IpAddr is always set"); - - let conn_data = sc_rpc::utils::ConnData { + let params = SubscriptionParams { method: "transactionWatch_v1_submitAndWatch", - ip_addr, - conn_id, + ip_addr: *ext.get::().expect("IpAddr is always set"), + conn_id: *ext.get::().expect("ConnectionId is always set"), + metrics: self.metrics.clone(), }; let client = self.client.clone(); @@ -120,7 +128,7 @@ where match submit.await { Ok(stream) => { let stream = stream.filter_map(move |event| async move { handle_event(event) }); - pipe_from_stream(pending, stream.boxed(), conn_data).await; + pipe_from_stream(pending, stream.boxed(), params).await; }, Err(err) => { // We have not created an `Watcher` for the tx. Make sure the @@ -129,7 +137,7 @@ where pipe_from_stream( pending, futures::stream::once(async { event }).boxed(), - conn_data, + params, ) .await; }, diff --git a/substrate/client/rpc/Cargo.toml b/substrate/client/rpc/Cargo.toml index 8edb95b22f14..d7cc7091b1d3 100644 --- a/substrate/client/rpc/Cargo.toml +++ b/substrate/client/rpc/Cargo.toml @@ -40,6 +40,7 @@ sp-runtime = { path = "../../primitives/runtime" } sp-session = { path = "../../primitives/session" } sp-version = { path = "../../primitives/version" } sp-statement-store = { path = "../../primitives/statement-store" } +prometheus = { version = "0.13.0", default-features = false } tokio = "1.37" [dev-dependencies] diff --git a/substrate/client/rpc/src/author/mod.rs b/substrate/client/rpc/src/author/mod.rs index 505638604eed..6e7ce809fed2 100644 --- a/substrate/client/rpc/src/author/mod.rs +++ b/substrate/client/rpc/src/author/mod.rs @@ -25,7 +25,7 @@ use std::sync::Arc; use crate::{ utils::{pipe_from_stream, spawn_subscription_task}, - SubscriptionTaskExecutor, + SubscriptionMetrics, SubscriptionParams, SubscriptionTaskExecutor, }; use codec::{Decode, Encode}; @@ -61,6 +61,8 @@ pub struct Author { deny_unsafe: DenyUnsafe, /// Executor to spawn subscriptions. executor: SubscriptionTaskExecutor, + /// Subscription metrics. + subscription_metrics: SubscriptionMetrics, } impl Author { @@ -71,8 +73,9 @@ impl Author { keystore: KeystorePtr, deny_unsafe: DenyUnsafe, executor: SubscriptionTaskExecutor, + subscription_metrics: SubscriptionMetrics, ) -> Self { - Author { client, pool, keystore, deny_unsafe, executor } + Author { client, pool, keystore, deny_unsafe, executor, subscription_metrics } } } @@ -198,6 +201,13 @@ where .unwrap_or_else(|e| error::Error::Verification(Box::new(e))) }); + let params = SubscriptionParams { + method: "author_submitAndWatchExtrinsic", + ip_addr, + conn_id, + metrics: self.subscription_metrics.clone(), + }; + let fut = async move { let stream = match submit.await { Ok(stream) => stream, @@ -207,13 +217,7 @@ where }, }; - let conn_data = crate::utils::ConnData { - method: "author_submitAndWatchExtrinsic", - ip_addr, - conn_id, - }; - - pipe_from_stream(pending, stream, conn_data).await; + pipe_from_stream(pending, stream, params).await; }; spawn_subscription_task(&self.executor, fut); diff --git a/substrate/client/rpc/src/chain/chain_full.rs b/substrate/client/rpc/src/chain/chain_full.rs index 09df717b7aa1..5f9eee42c737 100644 --- a/substrate/client/rpc/src/chain/chain_full.rs +++ b/substrate/client/rpc/src/chain/chain_full.rs @@ -20,8 +20,8 @@ use super::{client_err, ChainBackend, Error}; use crate::{ - utils::{pipe_from_stream, spawn_subscription_task, ConnData}, - SubscriptionTaskExecutor, + utils::{pipe_from_stream, spawn_subscription_task}, + SubscriptionParams, SubscriptionTaskExecutor, }; use std::{marker::PhantomData, sync::Arc}; @@ -70,7 +70,7 @@ where self.client.block(self.unwrap_or_best(hash)).map_err(client_err) } - fn subscribe_all_heads(&self, pending: PendingSubscriptionSink, conn_data: ConnData) { + fn subscribe_all_heads(&self, pending: PendingSubscriptionSink, params: SubscriptionParams) { subscribe_headers( &self.client, &self.executor, @@ -81,11 +81,11 @@ where .import_notification_stream() .map(|notification| notification.header) }, - conn_data, + params, ) } - fn subscribe_new_heads(&self, pending: PendingSubscriptionSink, conn_data: ConnData) { + fn subscribe_new_heads(&self, pending: PendingSubscriptionSink, params: SubscriptionParams) { subscribe_headers( &self.client, &self.executor, @@ -97,11 +97,15 @@ where .filter(|notification| future::ready(notification.is_new_best)) .map(|notification| notification.header) }, - conn_data, + params, ) } - fn subscribe_finalized_heads(&self, pending: PendingSubscriptionSink, conn_data: ConnData) { + fn subscribe_finalized_heads( + &self, + pending: PendingSubscriptionSink, + params: SubscriptionParams, + ) { subscribe_headers( &self.client, &self.executor, @@ -112,7 +116,7 @@ where .finality_notification_stream() .map(|notification| notification.header) }, - conn_data, + params, ) } } @@ -124,7 +128,7 @@ fn subscribe_headers( pending: PendingSubscriptionSink, best_block_hash: G, stream: F, - conn_data: ConnData, + params: SubscriptionParams, ) where Block: BlockT + 'static, Block::Header: Unpin, @@ -147,5 +151,5 @@ fn subscribe_headers( // duplicates at the beginning of the stream though. let stream = stream::iter(maybe_header).chain(stream()); - spawn_subscription_task(executor, pipe_from_stream(pending, stream, conn_data)); + spawn_subscription_task(executor, pipe_from_stream(pending, stream, params)); } diff --git a/substrate/client/rpc/src/chain/mod.rs b/substrate/client/rpc/src/chain/mod.rs index 4c806df02bd5..f5a79ac43b9b 100644 --- a/substrate/client/rpc/src/chain/mod.rs +++ b/substrate/client/rpc/src/chain/mod.rs @@ -25,7 +25,7 @@ mod tests; use std::sync::Arc; -use crate::{utils::ConnData, SubscriptionTaskExecutor}; +use crate::{SubscriptionMetrics, SubscriptionParams, SubscriptionTaskExecutor}; use jsonrpsee::{core::async_trait, ConnectionId, Extensions, PendingSubscriptionSink}; use sc_client_api::BlockchainEvents; @@ -92,26 +92,33 @@ where } /// All new head subscription - fn subscribe_all_heads(&self, pending: PendingSubscriptionSink, conn_data: ConnData); + fn subscribe_all_heads(&self, pending: PendingSubscriptionSink, params: SubscriptionParams); /// New best head subscription - fn subscribe_new_heads(&self, pending: PendingSubscriptionSink, conn_data: ConnData); + fn subscribe_new_heads(&self, pending: PendingSubscriptionSink, params: SubscriptionParams); /// Finalized head subscription - fn subscribe_finalized_heads(&self, pending: PendingSubscriptionSink, conn_data: ConnData); + fn subscribe_finalized_heads( + &self, + pending: PendingSubscriptionSink, + params: SubscriptionParams, + ); } /// Create new state API that works on full node. pub fn new_full( client: Arc, executor: SubscriptionTaskExecutor, + subscription_metrics: SubscriptionMetrics, ) -> Chain where Block: BlockT + 'static, Block::Header: Unpin, Client: BlockBackend + HeaderBackend + BlockchainEvents + 'static, { - Chain { backend: Box::new(self::chain_full::FullChain::new(client, executor)) } + Chain { + backend: Box::new(self::chain_full::FullChain::new(client, executor, subscription_metrics)), + } } /// Chain API with subscriptions support. @@ -159,33 +166,36 @@ where } fn subscribe_all_heads(&self, pending: PendingSubscriptionSink, ext: &Extensions) { - let conn_id = *ext.get::().expect("ConnectionId is set"); - let ip_addr = *ext.get::().expect("IpAddr is set"); - - let conn_data = - crate::utils::ConnData { method: "chain_subscribeAllHeads", ip_addr, conn_id }; - - self.backend.subscribe_all_heads(pending, conn_data); + let params = SubscriptionParams { + method: "chain_subscribeAllHeads", + ip_addr: *ext.get::().expect("IpAddr is set"), + conn_id: *ext.get::().expect("ConnectionId is set"), + metrics: SubscriptionMetrics::disabled(), + }; + + self.backend.subscribe_all_heads(pending, params); } fn subscribe_new_heads(&self, pending: PendingSubscriptionSink, ext: &Extensions) { - let conn_id = *ext.get::().expect("ConnectionId is set"); - let ip_addr = *ext.get::().expect("IpAddr is set"); - - let conn_data = - crate::utils::ConnData { method: "chain_subscribeNewHeads", ip_addr, conn_id }; - - self.backend.subscribe_new_heads(pending, conn_data) + let params = SubscriptionParams { + method: "chain_subscribeNewHeads", + ip_addr: *ext.get::().expect("IpAddr is set"), + conn_id: *ext.get::().expect("ConnectionId is set"), + metrics: SubscriptionMetrics::disabled(), + }; + + self.backend.subscribe_new_heads(pending, params) } fn subscribe_finalized_heads(&self, pending: PendingSubscriptionSink, ext: &Extensions) { - let conn_id = *ext.get::().expect("ConnectionId is set"); - let ip_addr = *ext.get::().expect("IpAddr is set"); - - let conn_data = - crate::utils::ConnData { method: "chain_subscribeFinalizedHeads", ip_addr, conn_id }; - - self.backend.subscribe_finalized_heads(pending, conn_data) + let params = SubscriptionParams { + method: "chain_subscribeFinalizedHeads", + ip_addr: *ext.get::().expect("IpAddr is set"), + conn_id: *ext.get::().expect("ConnectionId is set"), + metrics: SubscriptionMetrics::disabled(), + }; + + self.backend.subscribe_finalized_heads(pending, params) } } diff --git a/substrate/client/rpc/src/lib.rs b/substrate/client/rpc/src/lib.rs index b40d0341e321..746c7198a20e 100644 --- a/substrate/client/rpc/src/lib.rs +++ b/substrate/client/rpc/src/lib.rs @@ -30,6 +30,7 @@ pub use jsonrpsee::core::{ traits::IdProvider as RpcSubscriptionIdProvider, }; pub use sc_rpc_api::DenyUnsafe; +pub use utils::{SubscriptionMetrics, SubscriptionParams}; pub mod author; pub mod chain; diff --git a/substrate/client/rpc/src/state/mod.rs b/substrate/client/rpc/src/state/mod.rs index 1b28bfeefbc9..361486a41336 100644 --- a/substrate/client/rpc/src/state/mod.rs +++ b/substrate/client/rpc/src/state/mod.rs @@ -24,7 +24,7 @@ mod utils; #[cfg(test)] mod tests; -use crate::{utils::ConnData, SubscriptionTaskExecutor}; +use crate::{SubscriptionMetrics, SubscriptionParams, SubscriptionTaskExecutor}; use jsonrpsee::{core::async_trait, ConnectionId, Extensions, PendingSubscriptionSink}; use sc_client_api::{ Backend, BlockBackend, BlockchainEvents, ExecutorProvider, ProofProvider, StorageProvider, @@ -149,7 +149,11 @@ where ) -> Result; /// New runtime version subscription - fn subscribe_runtime_version(&self, pending: PendingSubscriptionSink, conn_data: ConnData); + fn subscribe_runtime_version( + &self, + pending: PendingSubscriptionSink, + params: SubscriptionParams, + ); /// New storage subscription fn subscribe_storage( @@ -157,7 +161,7 @@ where pending: PendingSubscriptionSink, keys: Option>, deny_unsafe: DenyUnsafe, - conn_data: ConnData, + params: SubscriptionParams, ); } @@ -166,6 +170,7 @@ pub fn new_full( client: Arc, executor: SubscriptionTaskExecutor, deny_unsafe: DenyUnsafe, + metrics: SubscriptionMetrics, ) -> (State, ChildState) where Block: BlockT + 'static, @@ -188,7 +193,7 @@ where let child_backend = Box::new(self::state_full::FullState::new(client.clone(), executor.clone())); let backend = Box::new(self::state_full::FullState::new(client, executor)); - (State { backend, deny_unsafe }, ChildState { backend: child_backend }) + (State { backend, deny_unsafe, metrics }, ChildState { backend: child_backend }) } /// State API with subscriptions support. @@ -196,6 +201,8 @@ pub struct State { backend: Box>, /// Whether to deny unsafe calls deny_unsafe: DenyUnsafe, + /// Metrics for subscriptions + metrics: SubscriptionMetrics, } #[async_trait] @@ -325,12 +332,14 @@ where } fn subscribe_runtime_version(&self, pending: PendingSubscriptionSink, ext: &Extensions) { - let conn_id = *ext.get::().expect("ConnectionId is set"); - let ip_addr = *ext.get::().expect("IpAddr is set"); - - let conn_data = ConnData { method: "state_subscribeRuntimeVersion", ip_addr, conn_id }; - - self.backend.subscribe_runtime_version(pending, conn_data) + let params = SubscriptionParams { + method: "state_subscribeRuntimeVersion", + ip_addr: *ext.get::().expect("IpAddr is set"), + conn_id: *ext.get::().expect("ConnectionId is set"), + metrics: self.metrics.clone(), + }; + + self.backend.subscribe_runtime_version(pending, params) } fn subscribe_storage( @@ -339,12 +348,14 @@ where ext: &Extensions, keys: Option>, ) { - let conn_id = *ext.get::().expect("ConnectionId is set"); - let ip_addr = *ext.get::().expect("IpAddr is set"); - - let conn_data = ConnData { method: "state_subscribeStorage", ip_addr, conn_id }; - - self.backend.subscribe_storage(pending, keys, self.deny_unsafe, conn_data) + let params = SubscriptionParams { + method: "state_subscribeStorage", + ip_addr: *ext.get::().expect("IpAddr is set"), + conn_id: *ext.get::().expect("ConnectionId is set"), + metrics: self.metrics.clone(), + }; + + self.backend.subscribe_storage(pending, keys, self.deny_unsafe, params) } } diff --git a/substrate/client/rpc/src/state/state_full.rs b/substrate/client/rpc/src/state/state_full.rs index 19576d5404d4..e3a274716714 100644 --- a/substrate/client/rpc/src/state/state_full.rs +++ b/substrate/client/rpc/src/state/state_full.rs @@ -26,8 +26,8 @@ use super::{ ChildStateBackend, StateBackend, }; use crate::{ - utils::{pipe_from_stream, spawn_subscription_task, ConnData}, - DenyUnsafe, SubscriptionTaskExecutor, + utils::{pipe_from_stream, spawn_subscription_task}, + DenyUnsafe, SubscriptionMetrics, SubscriptionParams, SubscriptionTaskExecutor, }; use futures::{future, stream, StreamExt}; @@ -371,7 +371,11 @@ where .map_err(client_err) } - fn subscribe_runtime_version(&self, pending: PendingSubscriptionSink, conn_data: ConnData) { + fn subscribe_runtime_version( + &self, + pending: PendingSubscriptionSink, + params: SubscriptionParams, + ) { let initial = match self .block_or_best(None) .and_then(|block| self.client.runtime_version_at(block).map_err(Into::into)) @@ -405,7 +409,7 @@ where }); let stream = futures::stream::once(future::ready(initial)).chain(version_stream); - spawn_subscription_task(&self.executor, pipe_from_stream(pending, stream, conn_data)); + spawn_subscription_task(&self.executor, pipe_from_stream(pending, stream, params)); } fn subscribe_storage( @@ -413,7 +417,7 @@ where pending: PendingSubscriptionSink, keys: Option>, deny_unsafe: DenyUnsafe, - conn_data: ConnData, + params: SubscriptionParams, ) { if keys.is_none() { if let Err(err) = deny_unsafe.check_if_safe() { @@ -458,7 +462,7 @@ where .chain(storage_stream) .filter(|storage| future::ready(!storage.changes.is_empty())); - spawn_subscription_task(&self.executor, pipe_from_stream(pending, stream, conn_data)); + spawn_subscription_task(&self.executor, pipe_from_stream(pending, stream, params)); } fn trace_block( diff --git a/substrate/client/rpc/src/utils.rs b/substrate/client/rpc/src/utils.rs index 568a067d559c..7d5d178d2c39 100644 --- a/substrate/client/rpc/src/utils.rs +++ b/substrate/client/rpc/src/utils.rs @@ -25,10 +25,67 @@ use futures::{ }; use jsonrpsee::{ConnectionId, PendingSubscriptionSink, SubscriptionMessage, SubscriptionSink}; use sp_runtime::Serialize; -use std::collections::VecDeque; +use std::{collections::VecDeque, net::IpAddr}; const DEFAULT_BUF_SIZE: usize = 16; +/// Parameters for a subscription. +pub struct SubscriptionParams { + /// Connection id. + pub conn_id: ConnectionId, + /// Metrics. + pub metrics: SubscriptionMetrics, + /// Method name. + pub method: &'static str, + /// IP address of the peer. + pub ip_addr: std::net::IpAddr, +} + +#[derive(Debug, Clone)] +struct InnerMetrics { + dropped_subscriptions: prometheus::CounterVec, +} + +/// Metrics for dropped subscriptions. +#[derive(Debug, Clone)] +pub struct SubscriptionMetrics(Option); + +impl SubscriptionMetrics { + /// Create a new metrics instance. + pub fn new( + registry: Option, + ) -> Result> { + if let Some(registry) = registry { + let dropped_subscriptions = prometheus::CounterVec::new( + prometheus::Opts::new( + "substrate_rpc_dropped_subscriptions", + "Number of subscriptions that was closed pre-maturely by the server due to lagging", + ), + &["method", "peer"], + )?; + registry.register(Box::new(dropped_subscriptions.clone()))?; + Ok(Self(Some(InnerMetrics { dropped_subscriptions }))) + } else { + Ok(Self(None)) + } + } + + /// Create a new metrics instance that is disabled. + pub fn disabled() -> Self { + Self(None) + } + + /// Register that a subscription was dropped. + pub fn register_dropped(&self, method: &str, peer: IpAddr) { + if let Some(metrics) = &self.0 { + metrics + .dropped_subscriptions + .with_label_values(&[method, &peer.to_string()]) + .inc(); + } + } +} + /// A simple bounded VecDeque. struct BoundedVecDeque { inner: VecDeque, @@ -55,16 +112,6 @@ impl BoundedVecDeque { } } -/// Connection data. -pub struct ConnData { - /// .. - pub method: &'static str, - /// .. - pub ip_addr: std::net::IpAddr, - /// .. - pub conn_id: ConnectionId, -} - /// Feed items to the subscription from the underlying stream. /// /// This is bounded because the underlying streams in substrate are @@ -75,7 +122,7 @@ pub struct ConnData { pub async fn pipe_from_stream( pending: PendingSubscriptionSink, mut stream: S, - conn_data: ConnData, + params: SubscriptionParams, ) where S: Stream + Unpin + Send + 'static, T: Serialize + Send + 'static, @@ -93,7 +140,7 @@ pub async fn pipe_from_stream( Either::Left((Ok(sink), _)) => break sink, Either::Right((Some(msg), f)) => { if buf.push_back(msg).is_err() { - log::warn!(target: "rpc", "Subscription::accept lagged dropping subscription=`{}`, peer={}", conn_data.method, conn_data.ip_addr); + params.metrics.register_dropped(params.method, params.ip_addr); return } accept_fut = f; @@ -103,14 +150,14 @@ pub async fn pipe_from_stream( } }; - inner_pipe_from_stream(sink, stream, buf, conn_data).await + inner_pipe_from_stream(sink, stream, buf, params).await } async fn inner_pipe_from_stream( sink: SubscriptionSink, mut stream: S, mut buf: BoundedVecDeque, - conn_data: ConnData, + params: SubscriptionParams, ) where S: Stream + Unpin + Send + 'static, T: Serialize + Send + 'static, @@ -118,6 +165,7 @@ async fn inner_pipe_from_stream( let mut next_fut = Box::pin(Fuse::terminated()); let mut next_item = stream.next(); let closed = sink.closed(); + let SubscriptionParams { metrics, method, ip_addr, .. } = params; futures::pin_mut!(closed); @@ -139,12 +187,7 @@ async fn inner_pipe_from_stream( // New item from the stream Either::Right((Either::Right((Some(v), n)), c)) => { if buf.push_back(v).is_err() { - log::warn!( - target: "rpc", - "Subscription lagged dropping subscription `{}`, peer={}", - conn_data.method, - conn_data.ip_addr, - ); + metrics.register_dropped(method, ip_addr); return } @@ -195,15 +238,16 @@ pub fn spawn_subscription_task( #[cfg(test)] mod tests { - use super::{pipe_from_stream, ConnData}; + use super::pipe_from_stream; use futures::StreamExt; use jsonrpsee::{core::EmptyServerParams, RpcModule, Subscription}; - fn conn_data() -> ConnData { - super::ConnData { + fn sub_params() -> SubscriptionParams { + SubscriptionParams { method: "sub", ip_addr: std::net::IpAddr::V4(std::net::Ipv4Addr::new(127, 0, 0, 1)), conn_id: 0, + metrics: SubscriptionMetrics::disabled(), } } @@ -212,7 +256,7 @@ mod tests { module .register_subscription("sub", "my_sub", "unsub", |_, pending, _, _| async move { let stream = futures::stream::iter([0; 16]); - pipe_from_stream(pending, stream, conn_data()).await; + pipe_from_stream(pending, stream, sub_params()).await; Ok(()) }) .unwrap(); @@ -240,7 +284,7 @@ mod tests { module .register_subscription("sub", "my_sub", "unsub", |_, pending, ctx, _| async move { let stream = futures::stream::iter([0; 32]); - pipe_from_stream(pending, stream, conn_data()).await; + pipe_from_stream(pending, stream, sub_params()).await; _ = ctx.unbounded_send(()); Ok(()) }) @@ -269,7 +313,7 @@ mod tests { // to sync buffer and channel send operations let stream = futures::stream::empty::<()>(); // this should exit immediately - pipe_from_stream(pending, stream, conn_data()).await; + pipe_from_stream(pending, stream, sub_params()).await; // notify that the `pipe_from_stream` has returned notify_tx.notify_one(); Ok(()) diff --git a/substrate/client/service/src/builder.rs b/substrate/client/service/src/builder.rs index 06fc2ea3b304..14310f1e269c 100644 --- a/substrate/client/service/src/builder.rs +++ b/substrate/client/service/src/builder.rs @@ -491,6 +491,10 @@ where ); let rpc_id_provider = config.rpc_id_provider.take(); + let rpc_metrics = sc_rpc::SubscriptionMetrics::new( + config.prometheus_config.as_ref().map(|cfg| cfg.registry.clone()), + ) + .map_err(|e| Error::Application(e))?; // jsonrpsee RPC let gen_rpc_module = |deny_unsafe: DenyUnsafe| { @@ -504,6 +508,7 @@ where &config, backend.clone(), &*rpc_builder, + rpc_metrics.clone(), ) }; @@ -606,6 +611,7 @@ pub fn gen_rpc_module( config: &Configuration, backend: Arc, rpc_builder: &(dyn Fn(DenyUnsafe, SubscriptionTaskExecutor) -> Result, Error>), + metrics: sc_rpc::SubscriptionMetrics, ) -> Result, Error> where TBl: BlockT, @@ -639,9 +645,14 @@ where let task_executor = Arc::new(spawn_handle); let (chain, state, child_state) = { - let chain = sc_rpc::chain::new_full(client.clone(), task_executor.clone()).into_rpc(); - let (state, child_state) = - sc_rpc::state::new_full(client.clone(), task_executor.clone(), deny_unsafe); + let chain = sc_rpc::chain::new_full(client.clone(), task_executor.clone(), metrics.clone()) + .into_rpc(); + let (state, child_state) = sc_rpc::state::new_full( + client.clone(), + task_executor.clone(), + deny_unsafe, + metrics.clone(), + ); let state = state.into_rpc(); let child_state = child_state.into_rpc(); @@ -662,6 +673,7 @@ where client.clone(), transaction_pool.clone(), task_executor.clone(), + metrics.clone(), ) .into_rpc(); @@ -700,6 +712,7 @@ where keystore, deny_unsafe, task_executor.clone(), + metrics.clone(), ) .into_rpc(); From c4633496ced213917a4f208d63a4a2fc66325bc8 Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson Date: Wed, 19 Jun 2024 15:39:05 +0200 Subject: [PATCH 09/17] cleanup --- substrate/client/rpc/src/chain/mod.rs | 5 +---- substrate/client/rpc/src/utils.rs | 2 ++ substrate/client/service/src/builder.rs | 3 +-- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/substrate/client/rpc/src/chain/mod.rs b/substrate/client/rpc/src/chain/mod.rs index f5a79ac43b9b..c1bfd11d0440 100644 --- a/substrate/client/rpc/src/chain/mod.rs +++ b/substrate/client/rpc/src/chain/mod.rs @@ -109,16 +109,13 @@ where pub fn new_full( client: Arc, executor: SubscriptionTaskExecutor, - subscription_metrics: SubscriptionMetrics, ) -> Chain where Block: BlockT + 'static, Block::Header: Unpin, Client: BlockBackend + HeaderBackend + BlockchainEvents + 'static, { - Chain { - backend: Box::new(self::chain_full::FullChain::new(client, executor, subscription_metrics)), - } + Chain { backend: Box::new(self::chain_full::FullChain::new(client, executor)) } } /// Chain API with subscriptions support. diff --git a/substrate/client/rpc/src/utils.rs b/substrate/client/rpc/src/utils.rs index 7d5d178d2c39..2167ab0370d2 100644 --- a/substrate/client/rpc/src/utils.rs +++ b/substrate/client/rpc/src/utils.rs @@ -140,6 +140,7 @@ pub async fn pipe_from_stream( Either::Left((Ok(sink), _)) => break sink, Either::Right((Some(msg), f)) => { if buf.push_back(msg).is_err() { + log::trace!(target: "rpc", "Subscription::accept lagged, dropping subscription=`{}`, peer=`{}`", params.method, params.ip_addr); params.metrics.register_dropped(params.method, params.ip_addr); return } @@ -187,6 +188,7 @@ async fn inner_pipe_from_stream( // New item from the stream Either::Right((Either::Right((Some(v), n)), c)) => { if buf.push_back(v).is_err() { + log::trace!(target: "rpc", "Subscription lagged, dropping subscription=`{}`, peer=`{}`", params.method, params.ip_addr); metrics.register_dropped(method, ip_addr); return } diff --git a/substrate/client/service/src/builder.rs b/substrate/client/service/src/builder.rs index 14310f1e269c..64a7ca8b56f1 100644 --- a/substrate/client/service/src/builder.rs +++ b/substrate/client/service/src/builder.rs @@ -645,8 +645,7 @@ where let task_executor = Arc::new(spawn_handle); let (chain, state, child_state) = { - let chain = sc_rpc::chain::new_full(client.clone(), task_executor.clone(), metrics.clone()) - .into_rpc(); + let chain = sc_rpc::chain::new_full(client.clone(), task_executor.clone()).into_rpc(); let (state, child_state) = sc_rpc::state::new_full( client.clone(), task_executor.clone(), From c7be842f8a2e98e1503239666a007d14632009bf Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson Date: Wed, 19 Jun 2024 16:04:22 +0200 Subject: [PATCH 10/17] fix nit2 --- substrate/client/rpc/src/state/state_full.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/substrate/client/rpc/src/state/state_full.rs b/substrate/client/rpc/src/state/state_full.rs index e3a274716714..6da69d0786c8 100644 --- a/substrate/client/rpc/src/state/state_full.rs +++ b/substrate/client/rpc/src/state/state_full.rs @@ -27,7 +27,7 @@ use super::{ }; use crate::{ utils::{pipe_from_stream, spawn_subscription_task}, - DenyUnsafe, SubscriptionMetrics, SubscriptionParams, SubscriptionTaskExecutor, + DenyUnsafe, SubscriptionParams, SubscriptionTaskExecutor, }; use futures::{future, stream, StreamExt}; From c0bd2edac27e526e969ad25e22e5394ef461519b Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson Date: Wed, 19 Jun 2024 10:45:34 +0200 Subject: [PATCH 11/17] bridges: add `serde_json` dependency --- Cargo.lock | 1 + bridges/relays/client-substrate/Cargo.toml | 1 + 2 files changed, 2 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index b8172d89f579..755d65ab8e3b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -16089,6 +16089,7 @@ dependencies = [ "sc-rpc-api", "sc-transaction-pool-api", "scale-info", + "serde_json", "sp-consensus-grandpa", "sp-core", "sp-rpc", diff --git a/bridges/relays/client-substrate/Cargo.toml b/bridges/relays/client-substrate/Cargo.toml index cc40d8e74c3c..be5a71f8ced8 100644 --- a/bridges/relays/client-substrate/Cargo.toml +++ b/bridges/relays/client-substrate/Cargo.toml @@ -19,6 +19,7 @@ jsonrpsee = { version = "0.23.1", features = ["macros", "ws-client"] } log = { workspace = true } num-traits = "0.2" rand = "0.8.5" +serde_json = { workspace = true } scale-info = { version = "2.11.1", features = ["derive"] } tokio = { version = "1.37", features = ["rt-multi-thread"] } thiserror = { workspace = true } From d0ae05c36011626e6a196aa2050b14e10d513927 Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson Date: Wed, 19 Jun 2024 16:17:32 +0200 Subject: [PATCH 12/17] more nits --- bridges/relays/client-substrate/src/client/subscription.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/bridges/relays/client-substrate/src/client/subscription.rs b/bridges/relays/client-substrate/src/client/subscription.rs index 43a46573f987..9f08097cb583 100644 --- a/bridges/relays/client-substrate/src/client/subscription.rs +++ b/bridges/relays/client-substrate/src/client/subscription.rs @@ -21,7 +21,6 @@ use async_std::{ stream::StreamExt, }; use futures::{FutureExt, Stream}; -use jsonrpsee::core::ClientError; use sp_runtime::DeserializeOwned; use std::{ fmt::Debug, @@ -143,7 +142,7 @@ impl Subscription { /// Create new forwarded subscription. pub fn new_forwarded( desc: StreamDescription, - subscription: impl Stream> + Unpin + Send + 'static, + subscription: impl Stream> + Unpin + Send + 'static, ) -> Self { Self { desc: desc.clone(), From 06fd1ba2418208fffbd5ef890fe1510f5d922ea7 Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson Date: Thu, 20 Jun 2024 10:21:08 +0200 Subject: [PATCH 13/17] fix tests --- .../src/transaction/tests/setup.rs | 10 +++- substrate/client/rpc/src/author/tests.rs | 1 + substrate/client/rpc/src/state/tests.rs | 56 +++++++++++++++---- substrate/client/rpc/src/utils.rs | 6 +- 4 files changed, 56 insertions(+), 17 deletions(-) diff --git a/substrate/client/rpc-spec-v2/src/transaction/tests/setup.rs b/substrate/client/rpc-spec-v2/src/transaction/tests/setup.rs index 570174a3db64..ff9f542a8940 100644 --- a/substrate/client/rpc-spec-v2/src/transaction/tests/setup.rs +++ b/substrate/client/rpc-spec-v2/src/transaction/tests/setup.rs @@ -26,6 +26,7 @@ use crate::{ }; use futures::Future; use jsonrpsee::RpcModule; +use sc_rpc::SubscriptionMetrics; use sc_transaction_pool::*; use std::{pin::Pin, sync::Arc}; use substrate_test_runtime_client::{prelude::*, Client}; @@ -114,8 +115,13 @@ pub fn setup_api_tx() -> ( let client_mock = Arc::new(ChainHeadMockClient::new(client.clone())); let (task_executor, executor_recv) = TaskExecutorBroadcast::new(); - let tx_api = - RpcTransaction::new(client_mock.clone(), pool.clone(), Arc::new(task_executor)).into_rpc(); + let tx_api = RpcTransaction::new( + client_mock.clone(), + pool.clone(), + Arc::new(task_executor), + SubscriptionMetrics::disabled(), + ) + .into_rpc(); (api, pool, client_mock, tx_api, executor_recv, pool_state) } diff --git a/substrate/client/rpc/src/author/tests.rs b/substrate/client/rpc/src/author/tests.rs index 937870eb53fd..76e081b35b02 100644 --- a/substrate/client/rpc/src/author/tests.rs +++ b/substrate/client/rpc/src/author/tests.rs @@ -79,6 +79,7 @@ impl TestSetup { keystore: self.keystore.clone(), deny_unsafe: DenyUnsafe::No, executor: test_executor(), + subscription_metrics: SubscriptionMetrics::disabled(), } } diff --git a/substrate/client/rpc/src/state/tests.rs b/substrate/client/rpc/src/state/tests.rs index dd866e671c50..f9a42d358629 100644 --- a/substrate/client/rpc/src/state/tests.rs +++ b/substrate/client/rpc/src/state/tests.rs @@ -62,7 +62,12 @@ async fn should_return_storage() { .add_extra_storage(b":map:acc2".to_vec(), vec![1, 2, 3]) .build(); let genesis_hash = client.genesis_hash(); - let (client, child) = new_full(Arc::new(client), test_executor(), DenyUnsafe::No); + let (client, child) = new_full( + Arc::new(client), + test_executor(), + DenyUnsafe::No, + SubscriptionMetrics::disabled(), + ); let key = StorageKey(KEY.to_vec()); assert_eq!( @@ -110,7 +115,12 @@ async fn should_return_storage_entries() { .add_extra_child_storage(&child_info, KEY2.to_vec(), CHILD_VALUE2.to_vec()) .build(); let genesis_hash = client.genesis_hash(); - let (_client, child) = new_full(Arc::new(client), test_executor(), DenyUnsafe::No); + let (_client, child) = new_full( + Arc::new(client), + test_executor(), + DenyUnsafe::No, + SubscriptionMetrics::disabled(), + ); let keys = &[StorageKey(KEY1.to_vec()), StorageKey(KEY2.to_vec())]; assert_eq!( @@ -141,7 +151,8 @@ async fn should_return_child_storage() { .build(), ); let genesis_hash = client.genesis_hash(); - let (_client, child) = new_full(client, test_executor(), DenyUnsafe::No); + let (_client, child) = + new_full(client, test_executor(), DenyUnsafe::No, SubscriptionMetrics::disabled()); let child_key = prefixed_storage_key(); let key = StorageKey(b"key".to_vec()); @@ -172,7 +183,8 @@ async fn should_return_child_storage_entries() { .build(), ); let genesis_hash = client.genesis_hash(); - let (_client, child) = new_full(client, test_executor(), DenyUnsafe::No); + let (_client, child) = + new_full(client, test_executor(), DenyUnsafe::No, SubscriptionMetrics::disabled()); let child_key = prefixed_storage_key(); let keys = vec![StorageKey(b"key1".to_vec()), StorageKey(b"key2".to_vec())]; @@ -203,7 +215,8 @@ async fn should_return_child_storage_entries() { async fn should_call_contract() { let client = Arc::new(substrate_test_runtime_client::new()); let genesis_hash = client.genesis_hash(); - let (client, _child) = new_full(client, test_executor(), DenyUnsafe::No); + let (client, _child) = + new_full(client, test_executor(), DenyUnsafe::No, SubscriptionMetrics::disabled()); assert_matches!( client.call("balanceOf".into(), Bytes(vec![1, 2, 3]), Some(genesis_hash).into()), @@ -217,7 +230,12 @@ async fn should_notify_about_storage_changes() { let mut sub = { let mut client = Arc::new(substrate_test_runtime_client::new()); - let (api, _child) = new_full(client.clone(), test_executor(), DenyUnsafe::No); + let (api, _child) = new_full( + client.clone(), + test_executor(), + DenyUnsafe::No, + SubscriptionMetrics::disabled(), + ); let api_rpc = api.into_rpc(); let sub = api_rpc @@ -257,7 +275,12 @@ async fn should_send_initial_storage_changes_and_notifications() { let mut sub = { let mut client = Arc::new(substrate_test_runtime_client::new()); - let (api, _child) = new_full(client.clone(), test_executor(), DenyUnsafe::No); + let (api, _child) = new_full( + client.clone(), + test_executor(), + DenyUnsafe::No, + SubscriptionMetrics::disabled(), + ); let alice_balance_key = [ sp_crypto_hashing::twox_128(b"System"), @@ -305,7 +328,12 @@ async fn should_send_initial_storage_changes_and_notifications() { #[tokio::test] async fn should_query_storage() { async fn run_tests(mut client: Arc) { - let (api, _child) = new_full(client.clone(), test_executor(), DenyUnsafe::No); + let (api, _child) = new_full( + client.clone(), + test_executor(), + DenyUnsafe::No, + SubscriptionMetrics::disabled(), + ); let mut add_block = |index| { let mut builder = BlockBuilderBuilder::new(&*client) @@ -471,7 +499,8 @@ async fn should_query_storage() { #[tokio::test] async fn should_return_runtime_version() { let client = Arc::new(substrate_test_runtime_client::new()); - let (api, _child) = new_full(client.clone(), test_executor(), DenyUnsafe::No); + let (api, _child) = + new_full(client.clone(), test_executor(), DenyUnsafe::No, SubscriptionMetrics::disabled()); // it is basically json-encoded substrate_test_runtime_client::runtime::VERSION let result = "{\"specName\":\"test\",\"implName\":\"parity-test\",\"authoringVersion\":1,\ @@ -493,7 +522,8 @@ async fn should_return_runtime_version() { async fn should_notify_on_runtime_version_initially() { let mut sub = { let client = Arc::new(substrate_test_runtime_client::new()); - let (api, _child) = new_full(client, test_executor(), DenyUnsafe::No); + let (api, _child) = + new_full(client, test_executor(), DenyUnsafe::No, SubscriptionMetrics::disabled()); let api_rpc = api.into_rpc(); let sub = api_rpc @@ -521,7 +551,8 @@ async fn wildcard_storage_subscriptions_are_rpc_unsafe() { init_logger(); let client = Arc::new(substrate_test_runtime_client::new()); - let (api, _child) = new_full(client, test_executor(), DenyUnsafe::Yes); + let (api, _child) = + new_full(client, test_executor(), DenyUnsafe::Yes, SubscriptionMetrics::disabled()); let api_rpc = api.into_rpc(); let err = api_rpc.subscribe_unbounded("state_subscribeStorage", EmptyParams::new()).await; @@ -531,7 +562,8 @@ async fn wildcard_storage_subscriptions_are_rpc_unsafe() { #[tokio::test] async fn concrete_storage_subscriptions_are_rpc_safe() { let client = Arc::new(substrate_test_runtime_client::new()); - let (api, _child) = new_full(client, test_executor(), DenyUnsafe::Yes); + let (api, _child) = + new_full(client, test_executor(), DenyUnsafe::Yes, SubscriptionMetrics::disabled()); let api_rpc = api.into_rpc(); let key = StorageKey(STORAGE_KEY.to_vec()); diff --git a/substrate/client/rpc/src/utils.rs b/substrate/client/rpc/src/utils.rs index 2167ab0370d2..93e2bb4785f1 100644 --- a/substrate/client/rpc/src/utils.rs +++ b/substrate/client/rpc/src/utils.rs @@ -240,15 +240,15 @@ pub fn spawn_subscription_task( #[cfg(test)] mod tests { - use super::pipe_from_stream; + use super::{pipe_from_stream, SubscriptionMetrics, SubscriptionParams}; use futures::StreamExt; - use jsonrpsee::{core::EmptyServerParams, RpcModule, Subscription}; + use jsonrpsee::{core::EmptyServerParams, ConnectionId, RpcModule, Subscription}; fn sub_params() -> SubscriptionParams { SubscriptionParams { method: "sub", ip_addr: std::net::IpAddr::V4(std::net::Ipv4Addr::new(127, 0, 0, 1)), - conn_id: 0, + conn_id: ConnectionId(0), metrics: SubscriptionMetrics::disabled(), } } From 877fe59187c7ca0dbf97b5f23dc301731d882090 Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson Date: Thu, 20 Jun 2024 11:09:23 +0200 Subject: [PATCH 14/17] fix more tests --- substrate/client/consensus/beefy/rpc/src/lib.rs | 2 +- substrate/client/consensus/grandpa/rpc/src/lib.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/substrate/client/consensus/beefy/rpc/src/lib.rs b/substrate/client/consensus/beefy/rpc/src/lib.rs index 3964cf0f4746..710317859b2c 100644 --- a/substrate/client/consensus/beefy/rpc/src/lib.rs +++ b/substrate/client/consensus/beefy/rpc/src/lib.rs @@ -204,7 +204,7 @@ mod tests { finality_proof_stream, best_block_stream, sc_rpc::testing::test_executor(), - Metrics::new(None), + SubscriptionMetrics::disabled() ) .expect("Setting up the BEEFY RPC handler works"); diff --git a/substrate/client/consensus/grandpa/rpc/src/lib.rs b/substrate/client/consensus/grandpa/rpc/src/lib.rs index deeeb23e5292..845fe251c3a0 100644 --- a/substrate/client/consensus/grandpa/rpc/src/lib.rs +++ b/substrate/client/consensus/grandpa/rpc/src/lib.rs @@ -283,7 +283,7 @@ mod tests { voter_state, justification_stream, finality_proof_provider, - Metrics::empty(), + SubscriptionMetrics::disabled(), ) .into_rpc(); From a74655e39d1d807895f65bbd1a88ac771fc9a9d4 Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson Date: Fri, 21 Jun 2024 12:25:40 +0200 Subject: [PATCH 15/17] Update substrate/client/rpc/src/utils.rs --- substrate/client/rpc/src/utils.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/substrate/client/rpc/src/utils.rs b/substrate/client/rpc/src/utils.rs index 93e2bb4785f1..03a76854836f 100644 --- a/substrate/client/rpc/src/utils.rs +++ b/substrate/client/rpc/src/utils.rs @@ -140,7 +140,7 @@ pub async fn pipe_from_stream( Either::Left((Ok(sink), _)) => break sink, Either::Right((Some(msg), f)) => { if buf.push_back(msg).is_err() { - log::trace!(target: "rpc", "Subscription::accept lagged, dropping subscription=`{}`, peer=`{}`", params.method, params.ip_addr); + log::warn!(target: "rpc", "Subscription::accept lagged, dropping subscription=`{}`, peer=`{}`", params.method, params.ip_addr); params.metrics.register_dropped(params.method, params.ip_addr); return } From 8e1678fc43e2cc77d53f314dbaf06b75aac9f035 Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson Date: Fri, 21 Jun 2024 12:28:18 +0200 Subject: [PATCH 16/17] Update substrate/client/rpc/src/utils.rs --- substrate/client/rpc/src/utils.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/substrate/client/rpc/src/utils.rs b/substrate/client/rpc/src/utils.rs index 03a76854836f..58001f0262ca 100644 --- a/substrate/client/rpc/src/utils.rs +++ b/substrate/client/rpc/src/utils.rs @@ -188,7 +188,7 @@ async fn inner_pipe_from_stream( // New item from the stream Either::Right((Either::Right((Some(v), n)), c)) => { if buf.push_back(v).is_err() { - log::trace!(target: "rpc", "Subscription lagged, dropping subscription=`{}`, peer=`{}`", params.method, params.ip_addr); + log::warn!(target: "rpc", "Subscription lagged, dropping subscription=`{}`, peer=`{}`", params.method, params.ip_addr); metrics.register_dropped(method, ip_addr); return } From 81d555da98e31977ce0c81b3d6b66b92b66dcfa8 Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson Date: Wed, 26 Jun 2024 16:13:38 +0200 Subject: [PATCH 17/17] cargo fmt --- substrate/client/consensus/beefy/rpc/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/substrate/client/consensus/beefy/rpc/src/lib.rs b/substrate/client/consensus/beefy/rpc/src/lib.rs index 710317859b2c..6fde80378d89 100644 --- a/substrate/client/consensus/beefy/rpc/src/lib.rs +++ b/substrate/client/consensus/beefy/rpc/src/lib.rs @@ -204,7 +204,7 @@ mod tests { finality_proof_stream, best_block_stream, sc_rpc::testing::test_executor(), - SubscriptionMetrics::disabled() + SubscriptionMetrics::disabled(), ) .expect("Setting up the BEEFY RPC handler works");