From bd4f9d65a2f23815dbbf88317e6b2984eb562f97 Mon Sep 17 00:00:00 2001 From: Bohdan Ohorodnii Date: Wed, 23 Oct 2024 19:21:00 +0300 Subject: [PATCH] feat(blockifier): add support for `sha256_process_block` syscall --- .../src/execution/native/syscall_handler.rs | 23 +++++++++++++++---- .../syscalls/syscall_tests/sha256.rs | 6 ++++- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/crates/blockifier/src/execution/native/syscall_handler.rs b/crates/blockifier/src/execution/native/syscall_handler.rs index 8dde577c95..db759c151b 100644 --- a/crates/blockifier/src/execution/native/syscall_handler.rs +++ b/crates/blockifier/src/execution/native/syscall_handler.rs @@ -313,10 +313,25 @@ impl<'state> StarknetSyscallHandler for &mut NativeSyscallHandler<'state> { fn sha256_process_block( &mut self, - _prev_state: &mut [u32; 8], - _current_block: &[u32; 16], - _remaining_gas: &mut u128, + prev_state: &mut [u32; 8], + current_block: &[u32; 16], + remaining_gas: &mut u128, ) -> SyscallResult<()> { - todo!("Implement sha256_process_block syscall."); + self.substract_syscall_gas_cost( + remaining_gas, + SyscallSelector::Sha256ProcessBlock, + self.context.gas_costs().sha256_process_block_gas_cost, + )?; + + let data_as_bytes = sha2::digest::generic_array::GenericArray::from_exact_iter( + current_block.iter().flat_map(|x| x.to_be_bytes()), + ) + .expect( + "u32.to_be_bytes() returns 4 bytes, and data.len() == 16. So data contains 64 bytes.", + ); + + sha2::compress256(prev_state, &[data_as_bytes]); + + Ok(()) } } diff --git a/crates/blockifier/src/execution/syscalls/syscall_tests/sha256.rs b/crates/blockifier/src/execution/syscalls/syscall_tests/sha256.rs index 8c6595f7db..4708c3fc56 100644 --- a/crates/blockifier/src/execution/syscalls/syscall_tests/sha256.rs +++ b/crates/blockifier/src/execution/syscalls/syscall_tests/sha256.rs @@ -11,6 +11,10 @@ use crate::test_utils::initial_test_state::test_state; use crate::test_utils::{trivial_external_entry_point_new, CairoVersion, BALANCE}; #[test_case(FeatureContract::TestContract(CairoVersion::Cairo1), 881625; "VM")] +#[cfg_attr( + feature = "cairo_native", + test_case(FeatureContract::TestContract(CairoVersion::Native), 891625; "Native") +)] fn test_sha256(test_contract: FeatureContract, gas_consumed: u64) { let chain_info = &ChainInfo::create_for_testing(); let mut state = test_state(chain_info, BALANCE, &[(test_contract, 1)]); @@ -22,7 +26,7 @@ fn test_sha256(test_contract: FeatureContract, gas_consumed: u64) { ..trivial_external_entry_point_new(test_contract) }; - assert_eq!( + pretty_assertions::assert_eq!( entry_point_call.execute_directly(&mut state).unwrap().execution, CallExecution { gas_consumed, ..CallExecution::from_retdata(retdata![]) } );