@@ -25,7 +25,9 @@ use monad_rpc::{
2525use serde:: de:: DeserializeOwned ;
2626use 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 >
2931where
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 }
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