1
- #![ allow( dead_code ) ] // TODO: Remove this!
1
+ #![ allow( clippy :: absurd_extreme_comparisons ) ]
2
2
3
3
use std:: collections:: HashMap ;
4
4
use std:: ops:: Add ;
@@ -20,6 +20,7 @@ use super::{
20
20
syscall_response:: { CallContractResponse , FailureReason , ResponseBody } ,
21
21
} ;
22
22
use crate :: definitions:: block_context:: BlockContext ;
23
+ use crate :: definitions:: constants:: BLOCK_HASH_CONTRACT_ADDRESS ;
23
24
use crate :: services:: api:: contract_classes:: compiled_class:: CompiledClass ;
24
25
use crate :: state:: BlockInfo ;
25
26
use crate :: transaction:: error:: TransactionError ;
@@ -435,33 +436,52 @@ impl<'a, T: State + StateReader> BusinessLogicSyscallHandler<'a, T> {
435
436
SyscallRequest :: GetBlockTimestamp ( req) => {
436
437
self . get_block_timestamp ( vm, req, remaining_gas)
437
438
}
438
- SyscallRequest :: GetBlockHash ( req) => Ok ( self . get_block_hash ( req, remaining_gas) ) ,
439
+ SyscallRequest :: GetBlockHash ( req) => self . get_block_hash ( vm , req, remaining_gas) ,
439
440
SyscallRequest :: ReplaceClass ( req) => self . replace_class ( vm, req, remaining_gas) ,
440
441
}
441
442
}
442
443
443
- fn get_block_hash ( & self , request : GetBlockHashRequest , remaining_gas : u128 ) -> SyscallResponse {
444
+ fn get_block_hash (
445
+ & mut self ,
446
+ vm : & mut VirtualMachine ,
447
+ request : GetBlockHashRequest ,
448
+ remaining_gas : u128 ,
449
+ ) -> Result < SyscallResponse , SyscallHandlerError > {
444
450
let block_number = request. block_number ;
445
451
let current_block_number = self . block_context . block_info . block_number ;
446
- let block_hash = if block_number < current_block_number - 1024
447
- || block_number > current_block_number - 10
448
- {
452
+
453
+ if block_number > current_block_number - 10 {
454
+ let out_of_range_felt = Felt252 :: from_bytes_be ( "Block number out of range" . as_bytes ( ) ) ;
455
+ let retdata_start =
456
+ self . allocate_segment ( vm, vec ! [ MaybeRelocatable :: from( out_of_range_felt) ] ) ?;
457
+ let failure = FailureReason {
458
+ retdata_start,
459
+ retdata_end : ( retdata_start + 1 ) ?,
460
+ } ;
461
+
462
+ return Ok ( SyscallResponse {
463
+ gas : remaining_gas,
464
+ body : Some ( ResponseBody :: Failure ( failure) ) ,
465
+ } ) ;
466
+ }
467
+
468
+ // FIXME: Update this after release.
469
+ const V_0_12_0_FIRST_BLOCK : u64 = 0 ;
470
+ let block_hash = if block_number < V_0_12_0_FIRST_BLOCK {
449
471
Felt252 :: zero ( )
450
472
} else {
451
- // Fetch hash from block header
452
- self . block_context
453
- . blocks ( )
454
- . get ( & block_number)
455
- . map ( |block| Felt252 :: from_bytes_be ( block. header . block_hash . 0 . bytes ( ) ) )
456
- . unwrap_or_default ( )
473
+ self . starknet_storage_state . state . get_storage_at ( & (
474
+ BLOCK_HASH_CONTRACT_ADDRESS . clone ( ) ,
475
+ Felt252 :: new ( block_number) . to_be_bytes ( ) ,
476
+ ) ) ?
457
477
} ;
458
478
459
- SyscallResponse {
479
+ Ok ( SyscallResponse {
460
480
gas : remaining_gas,
461
481
body : Some ( ResponseBody :: GetBlockHash ( GetBlockHashResponse {
462
482
block_hash,
463
483
} ) ) ,
464
- }
484
+ } )
465
485
}
466
486
467
487
pub ( crate ) fn post_run (
0 commit comments