Skip to content

Commit 64f6b28

Browse files
Bumped jsonrpsee to v0.22 and added rpc limiter from upstream (#14)
1 parent 25d51bb commit 64f6b28

File tree

52 files changed

+931
-444
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+931
-444
lines changed

Cargo.lock

+215-74
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cumulus/client/relay-chain-interface/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,5 @@ sc-client-api = { path = "../../../substrate/client/api" }
2222
futures = "0.3.28"
2323
async-trait = "0.1.74"
2424
thiserror = "1.0.48"
25-
jsonrpsee-core = "0.20.3"
25+
jsonrpsee-core = "0.22"
2626
parity-scale-codec = "3.6.4"

cumulus/client/relay-chain-rpc-interface/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ tokio-util = { version = "0.7.8", features = ["compat"] }
3333
futures = "0.3.28"
3434
futures-timer = "3.0.2"
3535
parity-scale-codec = "3.6.4"
36-
jsonrpsee = { version = "0.20.3", features = ["ws-client"] }
36+
jsonrpsee = { version = "0.22", features = ["ws-client"] }
3737
tracing = "0.1.37"
3838
async-trait = "0.1.74"
3939
url = "2.4.0"

cumulus/client/relay-chain-rpc-interface/src/light_client_worker.rs

+3-6
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,9 @@
1919
//! we treat the light-client as a normal JsonRPC target.
2020
2121
use futures::{channel::mpsc::Sender, prelude::*, stream::FuturesUnordered};
22-
use jsonrpsee::core::{
23-
client::{
24-
Client as JsonRpseeClient, ClientBuilder, ClientT, ReceivedMessage, TransportReceiverT,
25-
TransportSenderT,
26-
},
27-
Error,
22+
use jsonrpsee::core::client::{
23+
Client as JsonRpseeClient, ClientBuilder, ClientT, Error, ReceivedMessage, TransportReceiverT,
24+
TransportSenderT,
2825
};
2926
use smoldot_light::{ChainId, Client as SmoldotClient, JsonRpcResponses};
3027
use std::{num::NonZeroU32, sync::Arc};

cumulus/client/relay-chain-rpc-interface/src/reconnecting_ws_client.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ use jsonrpsee::{
2727
core::{
2828
client::{Client as JsonRpcClient, ClientT, Subscription},
2929
params::ArrayParams,
30-
Error as JsonRpseeError, JsonValue,
30+
ClientError as JsonRpseeError, JsonValue,
3131
},
3232
ws_client::WsClientBuilder,
3333
};

cumulus/client/relay-chain-rpc-interface/src/rpc_client.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use futures::channel::{
1919
oneshot::Sender as OneshotSender,
2020
};
2121
use jsonrpsee::{
22-
core::{params::ArrayParams, Error as JsonRpseeError},
22+
core::{params::ArrayParams, ClientError as JsonRpseeError},
2323
rpc_params,
2424
};
2525
use serde::de::DeserializeOwned;

cumulus/parachain-template/node/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ clap = { version = "4.4.18", features = ["derive"] }
1818
log = "0.4.20"
1919
codec = { package = "parity-scale-codec", version = "3.0.0" }
2020
serde = { version = "1.0.195", features = ["derive"] }
21-
jsonrpsee = { version = "0.20.3", features = ["server"] }
21+
jsonrpsee = { version = "0.22", features = ["server"] }
2222
futures = "0.3.28"
2323
serde_json = "1.0.111"
2424

cumulus/polkadot-parachain/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ coretime-rococo-runtime = { path = "../parachains/runtimes/coretime/coretime-roc
3838
coretime-westend-runtime = { path = "../parachains/runtimes/coretime/coretime-westend" }
3939
bridge-hub-westend-runtime = { path = "../parachains/runtimes/bridge-hubs/bridge-hub-westend" }
4040
penpal-runtime = { path = "../parachains/runtimes/testing/penpal" }
41-
jsonrpsee = { version = "0.20.3", features = ["server"] }
41+
jsonrpsee = { version = "0.22", features = ["server"] }
4242
people-rococo-runtime = { path = "../parachains/runtimes/people/people-rococo" }
4343
people-westend-runtime = { path = "../parachains/runtimes/people/people-westend" }
4444
parachains-common = { path = "../parachains/common" }

cumulus/test/service/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ async-trait = "0.1.74"
1717
clap = { version = "4.4.18", features = ["derive"] }
1818
codec = { package = "parity-scale-codec", version = "3.0.0" }
1919
criterion = { version = "0.5.1", features = ["async_tokio"] }
20-
jsonrpsee = { version = "0.20.3", features = ["server"] }
20+
jsonrpsee = { version = "0.22", features = ["server"] }
2121
rand = "0.8.5"
2222
serde = { version = "1.0.195", features = ["derive"] }
2323
serde_json = "1.0.111"

polkadot/rpc/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ description = "Polkadot specific RPC functionality."
1010
workspace = true
1111

1212
[dependencies]
13-
jsonrpsee = { version = "0.20.3", features = ["server"] }
13+
jsonrpsee = { version = "0.22", features = ["server"] }
1414
polkadot-primitives = { path = "../primitives" }
1515
sc-client-api = { path = "../../substrate/client/api" }
1616
sp-blockchain = { path = "../../substrate/primitives/blockchain" }

substrate/bin/minimal/node/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ name = "minimal-node"
2323
clap = { version = "4.4.18", features = ["derive"] }
2424
futures = { version = "0.3.21", features = ["thread-pool"] }
2525
futures-timer = "3.0.1"
26-
jsonrpsee = { version = "0.20.3", features = ["server"] }
26+
jsonrpsee = { version = "0.22", features = ["server"] }
2727
serde_json = "1.0.111"
2828

2929
sc-cli = { path = "../../../client/cli" }

substrate/bin/node-template/node/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ frame-system = { path = "../../../frame/system" }
4848
pallet-transaction-payment = { path = "../../../frame/transaction-payment", default-features = false }
4949

5050
# These dependencies are used for the node template's RPCs
51-
jsonrpsee = { version = "0.20.3", features = ["server"] }
51+
jsonrpsee = { version = "0.22", features = ["server"] }
5252
sp-api = { path = "../../../primitives/api" }
5353
sc-rpc-api = { path = "../../../client/rpc-api" }
5454
sp-blockchain = { path = "../../../primitives/blockchain" }

substrate/bin/node/cli/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ array-bytes = "6.1"
4444
clap = { version = "4.4.18", features = ["derive"], optional = true }
4545
codec = { package = "parity-scale-codec", version = "3.6.1" }
4646
serde = { version = "1.0.195", features = ["derive"] }
47-
jsonrpsee = { version = "0.20.3", features = ["server"] }
47+
jsonrpsee = { version = "0.22", features = ["server"] }
4848
futures = "0.3.21"
4949
log = "0.4.17"
5050
rand = "0.8"

substrate/bin/node/cli/benches/block_production.rs

+1
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ fn new_node(tokio_handle: Handle) -> node_cli::service::NewFullBase {
8484
rpc_max_subs_per_conn: Default::default(),
8585
rpc_port: 9944,
8686
rpc_message_buffer_capacity: Default::default(),
87+
rpc_rate_limit: None,
8788
prometheus_config: None,
8889
telemetry_endpoints: None,
8990
default_heap_pages: None,

substrate/bin/node/cli/benches/transaction_pool.rs

+1
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ fn new_node(tokio_handle: Handle) -> node_cli::service::NewFullBase {
8080
rpc_max_subs_per_conn: Default::default(),
8181
rpc_port: 9944,
8282
rpc_message_buffer_capacity: Default::default(),
83+
rpc_rate_limit: None,
8384
prometheus_config: None,
8485
telemetry_endpoints: None,
8586
default_heap_pages: None,

substrate/bin/node/rpc/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ workspace = true
1616
targets = ["x86_64-unknown-linux-gnu"]
1717

1818
[dependencies]
19-
jsonrpsee = { version = "0.20.3", features = ["server"] }
19+
jsonrpsee = { version = "0.22", features = ["server"] }
2020
node-primitives = { path = "../primitives" }
2121
pallet-transaction-payment-rpc = { path = "../../../frame/transaction-payment/rpc" }
2222
mmr-rpc = { path = "../../../client/merkle-mountain-range/rpc" }

substrate/client/cli/src/commands/run_cmd.rs

+17-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,10 @@ use sc_service::{
3434
ChainSpec, Role,
3535
};
3636
use sc_telemetry::TelemetryEndpoints;
37-
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
37+
use std::{
38+
net::{IpAddr, Ipv4Addr, SocketAddr},
39+
num::NonZeroU32,
40+
};
3841

3942
/// The `run` command used to run a node.
4043
#[derive(Debug, Clone, Parser)]
@@ -82,6 +85,15 @@ pub struct RunCmd {
8285
)]
8386
pub rpc_methods: RpcMethods,
8487

88+
/// RPC rate limiting (calls/minute) for each connection.
89+
///
90+
/// This is disabled by default.
91+
///
92+
/// For example `--rpc-rate-limit 10` will maximum allow
93+
/// 10 calls per minute per connection.
94+
#[arg(long)]
95+
pub rpc_rate_limit: Option<NonZeroU32>,
96+
8597
/// Set the maximum RPC request payload size for both HTTP and WS in megabytes.
8698
#[arg(long, default_value_t = RPC_DEFAULT_MAX_REQUEST_SIZE_MB)]
8799
pub rpc_max_request_size: u32,
@@ -399,6 +411,10 @@ impl CliConfiguration for RunCmd {
399411
Ok(self.rpc_max_subscriptions_per_connection)
400412
}
401413

414+
fn rpc_rate_limit(&self) -> Result<Option<NonZeroU32>> {
415+
Ok(self.rpc_rate_limit)
416+
}
417+
402418
fn transaction_pool(&self, is_dev: bool) -> Result<TransactionPoolOptions> {
403419
Ok(self.pool_config.transaction_pool(is_dev))
404420
}

substrate/client/cli/src/config.rs

+11-4
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ use sc_service::{
3333
BlocksPruning, ChainSpec, TracingReceiver,
3434
};
3535
use sc_tracing::logging::LoggerBuilder;
36-
use std::{net::SocketAddr, path::PathBuf};
36+
use std::{net::SocketAddr, num::NonZeroU32, path::PathBuf};
3737

3838
/// The maximum number of characters for a node name.
3939
pub(crate) const NODE_NAME_MAX_LENGTH: usize = 64;
@@ -338,6 +338,11 @@ pub trait CliConfiguration<DCV: DefaultConfigurationValues = ()>: Sized {
338338
Ok(RPC_DEFAULT_MESSAGE_CAPACITY_PER_CONN)
339339
}
340340

341+
/// Rate limit calls per minute.
342+
fn rpc_rate_limit(&self) -> Result<Option<NonZeroU32>> {
343+
Ok(None)
344+
}
345+
341346
/// Get the prometheus configuration (`None` if disabled)
342347
///
343348
/// By default this is `None`.
@@ -510,6 +515,7 @@ pub trait CliConfiguration<DCV: DefaultConfigurationValues = ()>: Sized {
510515
rpc_max_subs_per_conn: self.rpc_max_subscriptions_per_connection()?,
511516
rpc_port: DCV::rpc_listen_port(),
512517
rpc_message_buffer_capacity: self.rpc_buffer_capacity_per_connection()?,
518+
rpc_rate_limit: self.rpc_rate_limit()?,
513519
prometheus_config: self
514520
.prometheus_config(DCV::prometheus_listen_port(), &chain_spec)?,
515521
telemetry_endpoints,
@@ -615,14 +621,15 @@ pub trait CliConfiguration<DCV: DefaultConfigurationValues = ()>: Sized {
615621
logger.init()?;
616622

617623
match fdlimit::raise_fd_limit() {
618-
Ok(fdlimit::Outcome::LimitRaised { to, .. }) =>
624+
Ok(fdlimit::Outcome::LimitRaised { to, .. }) => {
619625
if to < RECOMMENDED_OPEN_FILE_DESCRIPTOR_LIMIT {
620626
warn!(
621627
"Low open file descriptor limit configured for the process. \
622628
Current value: {:?}, recommended value: {:?}.",
623629
to, RECOMMENDED_OPEN_FILE_DESCRIPTOR_LIMIT,
624630
);
625-
},
631+
}
632+
},
626633
Ok(fdlimit::Outcome::Unsupported) => {
627634
// Unsupported platform (non-Linux)
628635
},
@@ -648,7 +655,7 @@ pub fn generate_node_name() -> String {
648655
let count = node_name.chars().count();
649656

650657
if count < NODE_NAME_MAX_LENGTH {
651-
return node_name
658+
return node_name;
652659
}
653660
}
654661
}

substrate/client/cli/src/runner.rs

+1
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,7 @@ mod tests {
270270
rpc_id_provider: Default::default(),
271271
rpc_max_subs_per_conn: Default::default(),
272272
rpc_message_buffer_capacity: Default::default(),
273+
rpc_rate_limit: None,
273274
rpc_port: 9944,
274275
prometheus_config: None,
275276
telemetry_endpoints: None,

substrate/client/consensus/babe/rpc/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ workspace = true
1616
targets = ["x86_64-unknown-linux-gnu"]
1717

1818
[dependencies]
19-
jsonrpsee = { version = "0.20.3", features = ["client-core", "macros", "server"] }
19+
jsonrpsee = { version = "0.22", features = ["client-core", "macros", "server"] }
2020
futures = "0.3.21"
2121
serde = { version = "1.0.195", features = ["derive"] }
2222
thiserror = "1.0"

substrate/client/consensus/babe/rpc/src/lib.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ mod tests {
260260
let (response, _) = api.raw_json_request(request, 1).await.unwrap();
261261
let expected = r#"{"jsonrpc":"2.0","result":{"5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY":{"primary":[0],"secondary":[1,2,4],"secondary_vrf":[]}},"id":1}"#;
262262

263-
assert_eq!(&response.result, expected);
263+
assert_eq!(response, expected);
264264
}
265265

266266
#[tokio::test]
@@ -272,6 +272,6 @@ mod tests {
272272
let (response, _) = api.raw_json_request(request, 1).await.unwrap();
273273
let expected = r#"{"jsonrpc":"2.0","error":{"code":-32601,"message":"RPC call is unsafe to be called externally"},"id":1}"#;
274274

275-
assert_eq!(&response.result, expected);
275+
assert_eq!(response, expected);
276276
}
277277
}

substrate/client/consensus/beefy/rpc/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ workspace = true
1414
[dependencies]
1515
codec = { package = "parity-scale-codec", version = "3.6.1", features = ["derive"] }
1616
futures = "0.3.21"
17-
jsonrpsee = { version = "0.20.3", features = ["client-core", "macros", "server"] }
17+
jsonrpsee = { version = "0.22", features = ["client-core", "macros", "server"] }
1818
log = "0.4"
1919
parking_lot = "0.12.1"
2020
serde = { version = "1.0.195", features = ["derive"] }

substrate/client/consensus/beefy/rpc/src/lib.rs

+7-9
Original file line numberDiff line numberDiff line change
@@ -184,10 +184,10 @@ mod tests {
184184
async fn uninitialized_rpc_handler() {
185185
let (rpc, _) = setup_io_handler();
186186
let request = r#"{"jsonrpc":"2.0","method":"beefy_getFinalizedHead","params":[],"id":1}"#;
187-
let expected_response = r#"{"jsonrpc":"2.0","error":{"code":1,"message":"BEEFY RPC endpoint not ready"},"id":1}"#.to_string();
187+
let expected_response = r#"{"jsonrpc":"2.0","error":{"code":1,"message":"BEEFY RPC endpoint not ready"},"id":1}"#;
188188
let (response, _) = rpc.raw_json_request(&request, 1).await.unwrap();
189189

190-
assert_eq!(expected_response, response.result);
190+
assert_eq!(expected_response, response);
191191
}
192192

193193
#[tokio::test]
@@ -205,20 +205,18 @@ mod tests {
205205
\"jsonrpc\":\"2.0\",\
206206
\"result\":\"0x2f0039e93a27221fcf657fb877a1d4f60307106113e885096cb44a461cd0afbf\",\
207207
\"id\":1\
208-
}"
209-
.to_string();
208+
}";
210209
let not_ready = "{\
211210
\"jsonrpc\":\"2.0\",\
212211
\"error\":{\"code\":1,\"message\":\"BEEFY RPC endpoint not ready\"},\
213212
\"id\":1\
214-
}"
215-
.to_string();
213+
}";
216214

217215
let deadline = std::time::Instant::now() + std::time::Duration::from_secs(2);
218216
while std::time::Instant::now() < deadline {
219217
let (response, _) = io.raw_json_request(request, 1).await.expect("RPC requests work");
220-
if response.result != not_ready {
221-
assert_eq!(response.result, expected);
218+
if response != not_ready {
219+
assert_eq!(response, expected);
222220
// Success
223221
return
224222
}
@@ -249,7 +247,7 @@ mod tests {
249247
.unwrap();
250248
let expected = r#"{"jsonrpc":"2.0","result":false,"id":1}"#;
251249

252-
assert_eq!(response.result, expected);
250+
assert_eq!(response, expected);
253251
}
254252

255253
fn create_finality_proof() -> BeefyVersionedFinalityProof<Block> {

substrate/client/consensus/grandpa/rpc/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ workspace = true
1515
[dependencies]
1616
finality-grandpa = { version = "0.16.2", features = ["derive-codec"] }
1717
futures = "0.3.16"
18-
jsonrpsee = { version = "0.20.3", features = ["client-core", "macros", "server"] }
18+
jsonrpsee = { version = "0.22", features = ["client-core", "macros", "server"] }
1919
log = "0.4.8"
2020
parity-scale-codec = { version = "3.6.1", features = ["derive"] }
2121
serde = { version = "1.0.195", features = ["derive"] }

substrate/client/consensus/grandpa/rpc/src/lib.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ mod tests {
273273
let request = r#"{"jsonrpc":"2.0","method":"grandpa_roundState","params":[],"id":0}"#;
274274
let (response, _) = rpc.raw_json_request(&request, 1).await.unwrap();
275275

276-
assert_eq!(expected_response, response.result);
276+
assert_eq!(expected_response, response);
277277
}
278278

279279
#[tokio::test]
@@ -295,7 +295,7 @@ mod tests {
295295

296296
let request = r#"{"jsonrpc":"2.0","method":"grandpa_roundState","params":[],"id":0}"#;
297297
let (response, _) = rpc.raw_json_request(&request, 1).await.unwrap();
298-
assert_eq!(expected_response, response.result);
298+
assert_eq!(expected_response, response);
299299
}
300300

301301
#[tokio::test]
@@ -317,7 +317,7 @@ mod tests {
317317
.unwrap();
318318
let expected = r#"{"jsonrpc":"2.0","result":false,"id":1}"#;
319319

320-
assert_eq!(response.result, expected);
320+
assert_eq!(response, expected);
321321
}
322322

323323
fn create_justification() -> GrandpaJustification<Block> {

substrate/client/consensus/manual-seal/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ workspace = true
1616
targets = ["x86_64-unknown-linux-gnu"]
1717

1818
[dependencies]
19-
jsonrpsee = { version = "0.20.3", features = ["client-core", "macros", "server"] }
19+
jsonrpsee = { version = "0.22", features = ["client-core", "macros", "server"] }
2020
assert_matches = "1.3.0"
2121
async-trait = "0.1.74"
2222
codec = { package = "parity-scale-codec", version = "3.6.1" }

substrate/client/merkle-mountain-range/rpc/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"]
1616

1717
[dependencies]
1818
codec = { package = "parity-scale-codec", version = "3.6.1" }
19-
jsonrpsee = { version = "0.20.3", features = ["client-core", "macros", "server"] }
19+
jsonrpsee = { version = "0.22", features = ["client-core", "macros", "server"] }
2020
serde = { version = "1.0.195", features = ["derive"] }
2121
sp-api = { path = "../../../primitives/api" }
2222
sp-blockchain = { path = "../../../primitives/blockchain" }

substrate/client/rpc-api/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,4 @@ sp-core = { path = "../../primitives/core" }
2828
sp-rpc = { path = "../../primitives/rpc" }
2929
sp-runtime = { path = "../../primitives/runtime" }
3030
sp-version = { path = "../../primitives/version" }
31-
jsonrpsee = { version = "0.20.3", features = ["client-core", "macros", "server"] }
31+
jsonrpsee = { version = "0.22", features = ["client-core", "macros", "server"] }

substrate/client/rpc-servers/Cargo.toml

+5-1
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,15 @@ workspace = true
1616
targets = ["x86_64-unknown-linux-gnu"]
1717

1818
[dependencies]
19-
jsonrpsee = { version = "0.20.3", features = ["server"] }
19+
jsonrpsee = { version = "0.22", features = ["server"] }
2020
log = "0.4.17"
2121
serde_json = "1.0.111"
2222
tokio = { version = "1.22.0", features = ["parking_lot"] }
2323
prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus" }
2424
tower-http = { version = "0.4.0", features = ["cors"] }
2525
tower = { version = "0.4.13", features = ["util"] }
2626
http = "0.2.8"
27+
hyper = "0.14.27"
28+
futures = "0.3.29"
29+
pin-project = "1.1.3"
30+
governor = "0.6.0"

0 commit comments

Comments
 (0)