@@ -179,18 +179,100 @@ impl<'a, E: EthSpec> TryFrom<ExecutionPayloadRef<'a, E>> for NewPayloadRequest<'
179
179
180
180
#[ cfg( test) ]
181
181
mod test {
182
- use crate :: NewPayloadRequest ;
183
- use types:: { BeaconBlock , MainnetEthSpec } ;
182
+ use crate :: versioned_hashes:: Error as VersionedHashError ;
183
+ use crate :: { Error , NewPayloadRequest } ;
184
+ use state_processing:: per_block_processing:: deneb:: kzg_commitment_to_versioned_hash;
185
+ use types:: { BeaconBlock , ExecPayload , ExecutionBlockHash , Hash256 , MainnetEthSpec } ;
184
186
185
187
#[ test]
186
- fn test_optimistic_sync_verifications ( ) {
188
+ fn test_optimistic_sync_verifications_valid_block ( ) {
187
189
let beacon_block = get_valid_beacon_block ( ) ;
188
190
let new_payload_request = NewPayloadRequest :: try_from ( beacon_block. to_ref ( ) )
189
191
. expect ( "should create new payload request" ) ;
190
192
191
- assert ! ( new_payload_request
192
- . perform_optimistic_sync_verifications( )
193
- . is_ok( ) ) ;
193
+ assert ! (
194
+ new_payload_request
195
+ . perform_optimistic_sync_verifications( )
196
+ . is_ok( ) ,
197
+ "validations should pass"
198
+ ) ;
199
+ }
200
+
201
+ #[ test]
202
+ fn test_optimistic_sync_verifications_bad_block_hash ( ) {
203
+ let mut beacon_block = get_valid_beacon_block ( ) ;
204
+ let correct_block_hash = beacon_block
205
+ . body ( )
206
+ . execution_payload ( )
207
+ . expect ( "should get payload" )
208
+ . block_hash ( ) ;
209
+ let invalid_block_hash = ExecutionBlockHash ( Hash256 :: repeat_byte ( 0x42 ) ) ;
210
+
211
+ // now mutate the block hash
212
+ beacon_block
213
+ . body_mut ( )
214
+ . execution_payload_deneb_mut ( )
215
+ . expect ( "should get payload" )
216
+ . execution_payload
217
+ . block_hash = invalid_block_hash;
218
+
219
+ let new_payload_request = NewPayloadRequest :: try_from ( beacon_block. to_ref ( ) )
220
+ . expect ( "should create new payload request" ) ;
221
+ let verification_result = new_payload_request. perform_optimistic_sync_verifications ( ) ;
222
+ println ! ( "verification_result: {:?}" , verification_result) ;
223
+ let got_expected_result = match verification_result {
224
+ Err ( Error :: BlockHashMismatch {
225
+ computed, payload, ..
226
+ } ) => computed == correct_block_hash && payload == invalid_block_hash,
227
+ _ => false ,
228
+ } ;
229
+ assert ! ( got_expected_result, "should return expected error" ) ;
230
+ }
231
+
232
+ #[ test]
233
+ fn test_optimistic_sync_verifications_bad_versioned_hashes ( ) {
234
+ let mut beacon_block = get_valid_beacon_block ( ) ;
235
+
236
+ let mut commitments: Vec < _ > = beacon_block
237
+ . body ( )
238
+ . blob_kzg_commitments ( )
239
+ . expect ( "should get commitments" )
240
+ . clone ( )
241
+ . into ( ) ;
242
+
243
+ let correct_versioned_hash = kzg_commitment_to_versioned_hash (
244
+ commitments. last ( ) . expect ( "should get last commitment" ) ,
245
+ ) ;
246
+
247
+ // mutate the last commitment
248
+ commitments
249
+ . last_mut ( )
250
+ . expect ( "should get last commitment" )
251
+ . 0 [ 0 ] = 0x42 ;
252
+
253
+ // calculate versioned hash from mutated commitment
254
+ let bad_versioned_hash = kzg_commitment_to_versioned_hash (
255
+ commitments. last ( ) . expect ( "should get last commitment" ) ,
256
+ ) ;
257
+
258
+ * beacon_block
259
+ . body_mut ( )
260
+ . blob_kzg_commitments_mut ( )
261
+ . expect ( "should get commitments" ) = commitments. into ( ) ;
262
+
263
+ let new_payload_request = NewPayloadRequest :: try_from ( beacon_block. to_ref ( ) )
264
+ . expect ( "should create new payload request" ) ;
265
+ let verification_result = new_payload_request. perform_optimistic_sync_verifications ( ) ;
266
+ println ! ( "verification_result: {:?}" , verification_result) ;
267
+
268
+ let got_expected_result = match verification_result {
269
+ Err ( Error :: VerifyingVersionedHashes ( VersionedHashError :: VersionHashMismatch {
270
+ expected,
271
+ found,
272
+ } ) ) => expected == bad_versioned_hash && found == correct_versioned_hash,
273
+ _ => false ,
274
+ } ;
275
+ assert ! ( got_expected_result, "should return expected error" ) ;
194
276
}
195
277
196
278
fn get_valid_beacon_block ( ) -> BeaconBlock < MainnetEthSpec > {
0 commit comments