Skip to content

Commit 8985c8c

Browse files
committed
Make RPC deserialize benchmarks skip invalid params
1 parent ea354a2 commit 8985c8c

File tree

1 file changed

+58
-29
lines changed

1 file changed

+58
-29
lines changed

monad-rpc/benches/deserialize.rs

Lines changed: 58 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@ use monad_rpc::{
2525
use serde::de::DeserializeOwned;
2626
use serde_json::Value;
2727

28-
fn deserialize<T>(body: &Bytes) -> Result<ResponseWrapper<()>, JsonRpcError>
28+
fn deserialize<const DESERIALIZE_TO_T: bool, T>(
29+
body: &Bytes,
30+
) -> Result<ResponseWrapper<()>, JsonRpcError>
2931
where
3032
T: DeserializeOwned,
3133
{
@@ -38,11 +40,16 @@ where
3840

3941
let params = request.params.clone();
4042

41-
let parsed_params: T = serde_json::from_value(params).invalid_params()?;
43+
if DESERIALIZE_TO_T {
44+
let parsed_params: T = serde_json::from_value(params).invalid_params()?;
45+
46+
black_box(parsed_params);
47+
} else {
48+
black_box(params);
49+
}
4250

4351
black_box(request);
4452
black_box(json_request);
45-
black_box(parsed_params);
4653

4754
Ok(ResponseWrapper::Single(()))
4855
}
@@ -59,7 +66,7 @@ where
5966
}
6067
}
6168

62-
fn bench_deserialize<T, M>(
69+
fn bench_deserialize<const DESERIALIZE_TO_T: bool, T, M>(
6370
g: &mut BenchmarkGroup<'_, M>,
6471
name: &'static str,
6572
body: &Bytes,
@@ -71,7 +78,7 @@ fn bench_deserialize<T, M>(
7178
g.throughput(Throughput::Bytes(body.len() as u64));
7279
g.bench_function(name, |b| {
7380
b.iter(|| {
74-
let result = black_box(deserialize::<T>(black_box(body)));
81+
let result = black_box(deserialize::<DESERIALIZE_TO_T, T>(black_box(body)));
7582

7683
assert_eq!(result, expected);
7784
});
@@ -99,14 +106,14 @@ fn bench(c: &mut Criterion) {
99106
"id": 0
100107
});
101108

102-
bench_deserialize::<MonadEthCallParams, _>(
109+
bench_deserialize::<true, MonadEthCallParams, _>(
103110
&mut g,
104111
"eth_call",
105112
&Bytes::from_owner(serde_json::to_string(&eth_call_request).unwrap()),
106113
Ok(ResponseWrapper::Single(())),
107114
);
108115

109-
bench_deserialize::<MonadEthCallParams, _>(
116+
bench_deserialize::<true, MonadEthCallParams, _>(
110117
&mut g,
111118
"eth_call-batch",
112119
&Bytes::from_owner(
@@ -143,71 +150,93 @@ fn bench(c: &mut Criterion) {
143150
});
144151
assert!(attack_large_dict.is_object());
145152

146-
bench_deserialize::<MonadEthCallParams, _>(
153+
bench_deserialize::<false, (), _>(
147154
&mut g,
148155
"attack_large_id_array",
149156
&Bytes::from_owner(
150157
serde_json::to_string(&serde_json::json!({
151158
"jsonrpc": "2.0",
152-
"method": "eth_call",
153-
"params": eth_call_params,
159+
"method": "some_method",
160+
"params": [],
154161
"id": attack_large_array
155162
}))
156163
.unwrap(),
157164
),
158165
Err(JsonRpcError::parse_error()),
159166
);
160167

161-
bench_deserialize::<MonadEthCallParams, _>(
168+
bench_deserialize::<false, (), _>(
162169
&mut g,
163170
"attack_large_id_dict",
164171
&Bytes::from_owner(
165172
serde_json::to_string(&serde_json::json!({
166173
"jsonrpc": "2.0",
167-
"method": "eth_call",
168-
"params": eth_call_params,
174+
"method": "some_method",
175+
"params": [],
169176
"id": attack_large_dict
170177
}))
171178
.unwrap(),
172179
),
173180
Err(JsonRpcError::parse_error()),
174181
);
175182

176-
bench_deserialize::<MonadEthCallParams, _>(
183+
bench_deserialize::<false, (), _>(
184+
&mut g,
185+
"attack_large_payload_array_without_params",
186+
&Bytes::from_owner(
187+
serde_json::to_string(&serde_json::json!({
188+
"jsonrpc": "2.0",
189+
"method": "some_method_that_doesnt_parse_params",
190+
"params": attack_large_array,
191+
"id": 0
192+
}))
193+
.unwrap(),
194+
),
195+
Ok(ResponseWrapper::Single(())),
196+
);
197+
198+
bench_deserialize::<false, (), _>(
199+
&mut g,
200+
"attack_large_payload_dict_without_params",
201+
&Bytes::from_owner(
202+
serde_json::to_string(&serde_json::json!({
203+
"jsonrpc": "2.0",
204+
"method": "some_method_that_doesnt_parse_params",
205+
"params": attack_large_dict,
206+
"id": 0
207+
}))
208+
.unwrap(),
209+
),
210+
Ok(ResponseWrapper::Single(())),
211+
);
212+
213+
bench_deserialize::<true, (), _>(
177214
&mut g,
178-
"attack_large_payload_array",
215+
"attack_large_payload_array_with_params",
179216
&Bytes::from_owner(
180217
serde_json::to_string(&serde_json::json!({
181218
"jsonrpc": "2.0",
182-
"method": "eth_call",
219+
"method": "some_method_that_parses_params",
183220
"params": attack_large_array,
184221
"id": 0
185222
}))
186223
.unwrap(),
187224
),
188-
Err(JsonRpcError {
189-
code: -32602,
190-
message: "Invalid params".to_string(),
191-
data: None,
192-
}),
225+
Err(JsonRpcError::invalid_params()),
193226
);
194-
bench_deserialize::<MonadEthCallParams, _>(
227+
bench_deserialize::<true, (), _>(
195228
&mut g,
196-
"attack_large_payload_dict",
229+
"attack_large_payload_dict_with_params",
197230
&Bytes::from_owner(
198231
serde_json::to_string(&serde_json::json!({
199232
"jsonrpc": "2.0",
200-
"method": "eth_call",
233+
"method": "some_method_that_parses_params",
201234
"params": attack_large_dict,
202235
"id": 0
203236
}))
204237
.unwrap(),
205238
),
206-
Err(JsonRpcError {
207-
code: -32602,
208-
message: "Invalid params".to_string(),
209-
data: None,
210-
}),
239+
Err(JsonRpcError::invalid_params()),
211240
);
212241
}
213242

0 commit comments

Comments
 (0)