diff --git a/Cargo.toml b/Cargo.toml index 002157c158..5f6b3e2eb8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -56,6 +56,8 @@ starknet = { workspace = true } base64 = { version = "0.21.0", default-features = false, features = ["alloc"] } flate2 = "1.0.25" serde_json_pythonic = { git = "https://github.com/xJonathanLEI/serde_json_pythonic", tag = "v0.1.2"} +phf = { version = "0.11", default-features = false } +phf_macros = "0.11" [dev-dependencies] assert_matches = "1.5.0" @@ -65,3 +67,6 @@ coverage-helper = "0.1.0" path = "bench/internals.rs" name = "internals" harness = false + +[build-dependencies] +phf_codegen = "0.11" diff --git a/src/syscalls/deprecated_syscall_handler.rs b/src/syscalls/deprecated_syscall_handler.rs index d131d5ff16..0f5856f2cf 100644 --- a/src/syscalls/deprecated_syscall_handler.rs +++ b/src/syscalls/deprecated_syscall_handler.rs @@ -1,6 +1,5 @@ use super::{ - deprecated_business_logic_syscall_handler::DeprecatedBLSyscallHandler, hint_code::*, - other_syscalls, syscall_handler::HintProcessorPostRun, + deprecated_business_logic_syscall_handler::DeprecatedBLSyscallHandler, syscall_handler::HintProcessorPostRun, }; use crate::{state::state_api::StateReader, syscalls::syscall_handler_errors::SyscallHandlerError}; use cairo_vm::{ @@ -21,6 +20,48 @@ use cairo_vm::{ vm::{errors::hint_errors::HintError, vm_core::VirtualMachine}, }; use std::{any::Any, collections::HashMap}; +use phf_macros::phf_map; + +enum SyscallHandler { + NotImplemented, + EmitEvent, + GetBlockNumber, + GetBlockTimestamp, + GetCallerAddress, + GetSequencerAddress, + LibraryCall, + LibraryCallL1Handler, + CallContract, + StorageRead, + StorageWrite, + SendMessageToL1, + GetTxSignature, + GetTxInfo, + GetContractAddress, + DelegateCall, + DelegateCallL1Handler, + ReplaceClass, +} +static HINT_CODES: phf::Map<&'static str, SyscallHandler> = phf_map! { + "DEPLOY" => SyscallHandler::NotImplemented, + "EMIT_EVENT_CODE" => SyscallHandler::EmitEvent, + "GET_BLOCK_NUMBER" => SyscallHandler::GetBlockNumber, + "GET_BLOCK_TIMESTAM" => SyscallHandler::GetBlockTimestamp, + "GET_CALLER_ADDRESS" => SyscallHandler::GetCallerAddress, + "GET_SEQUENCER_ADDRESS" => SyscallHandler::GetSequencerAddress, + "LIBRARY_CALL" => SyscallHandler::LibraryCall, + "LIBRARY_CALL_L1_HANDLER" => SyscallHandler::LibraryCallL1Handler, + "CALL_CONTRACT" => SyscallHandler::CallContract, + "STORAGE_READ" => SyscallHandler::StorageRead, + "STORAGE_WRITE" => SyscallHandler::StorageWrite, + "SEND_MESSAGE_TO_L1" => SyscallHandler::SendMessageToL1, + "GET_TX_SIGNATURE" => SyscallHandler::GetTxSignature, + "GET_TX_INFO" => SyscallHandler::GetTxInfo, + "GET_CONTRACT_ADDRESS" => SyscallHandler::GetContractAddress, + "DELEGATE_CALL" => SyscallHandler::DelegateCall, + "DELEGATE_L1_HANDLER" => SyscallHandler::DelegateCallL1Handler, + "REPLACE_CLASS" => SyscallHandler::ReplaceClass, +}; /// Definition of the deprecated syscall hint processor with associated structs pub(crate) struct DeprecatedSyscallHintProcessor<'a, S: StateReader> { @@ -67,90 +108,75 @@ impl<'a, S: StateReader> DeprecatedSyscallHintProcessor<'a, S> { vm: &mut VirtualMachine, _exec_scopes: &mut ExecutionScopes, hint_data: &Box, - constants: &HashMap, + _constants: &HashMap, ) -> Result<(), SyscallHandlerError> { // Match against specific syscall hint codes and call the appropriate handler let hint_data = hint_data - .downcast_ref::() - .ok_or(SyscallHandlerError::WrongHintData)?; - - match hint_data.code.as_str() { - ADDR_BOUND_PRIME => other_syscalls::addr_bound_prime(vm, hint_data, constants), - ADDR_IS_250 => other_syscalls::addr_is_250(vm, hint_data), - DEPLOY => { - let syscall_ptr = get_syscall_ptr(vm, &hint_data.ids_data, &hint_data.ap_tracking)?; - self.syscall_handler.deploy(vm, syscall_ptr) - } - EMIT_EVENT_CODE => { - let syscall_ptr = get_syscall_ptr(vm, &hint_data.ids_data, &hint_data.ap_tracking)?; - self.syscall_handler.emit_event(vm, syscall_ptr) - } - GET_BLOCK_NUMBER => { - let syscall_ptr = get_syscall_ptr(vm, &hint_data.ids_data, &hint_data.ap_tracking)?; - self.syscall_handler.get_block_number(vm, syscall_ptr) - } - GET_BLOCK_TIMESTAMP => { - let syscall_ptr = get_syscall_ptr(vm, &hint_data.ids_data, &hint_data.ap_tracking)?; - self.syscall_handler.get_block_timestamp(vm, syscall_ptr) - } - GET_CALLER_ADDRESS => { - let syscall_ptr = get_syscall_ptr(vm, &hint_data.ids_data, &hint_data.ap_tracking)?; - self.syscall_handler.get_caller_address(vm, syscall_ptr) - } - GET_SEQUENCER_ADDRESS => { - let syscall_ptr = get_syscall_ptr(vm, &hint_data.ids_data, &hint_data.ap_tracking)?; - self.syscall_handler.get_sequencer_address(vm, syscall_ptr) - } - LIBRARY_CALL => { - let syscall_ptr = get_syscall_ptr(vm, &hint_data.ids_data, &hint_data.ap_tracking)?; - self.syscall_handler.library_call(vm, syscall_ptr) - } - LIBRARY_CALL_L1_HANDLER => { - let syscall_ptr = get_syscall_ptr(vm, &hint_data.ids_data, &hint_data.ap_tracking)?; - self.syscall_handler - .library_call_l1_handler(vm, syscall_ptr) - } - CALL_CONTRACT => { - let syscall_ptr = get_syscall_ptr(vm, &hint_data.ids_data, &hint_data.ap_tracking)?; - self.syscall_handler.call_contract(vm, syscall_ptr) + .downcast_ref::() + .ok_or(SyscallHandlerError::WrongHintData)?; + + let hint_code = &hint_data.code; + if let Some(syscall) = HINT_CODES.get(hint_code) { + let syscall_ptr = get_syscall_ptr(vm, &hint_data.ids_data, &hint_data.ap_tracking)?; + match syscall { + SyscallHandler::NotImplemented => { + SyscallHandlerError::NotImplemented(hint_data.code.clone()); + }, + SyscallHandler::EmitEvent => { + self.syscall_handler.emit_event(vm, syscall_ptr)?; + }, + SyscallHandler::GetBlockNumber => { + self.syscall_handler.get_block_number(vm, syscall_ptr)?; + }, + SyscallHandler::GetBlockTimestamp => { + self.syscall_handler.get_block_timestamp(vm, syscall_ptr)?; + }, + SyscallHandler::GetCallerAddress => { + self.syscall_handler.get_caller_address(vm, syscall_ptr)?; + }, + SyscallHandler::GetSequencerAddress => { + self.syscall_handler.get_sequencer_address(vm, syscall_ptr)?; + }, + SyscallHandler::LibraryCall => { + self.syscall_handler.library_call(vm, syscall_ptr)?; + }, + SyscallHandler::LibraryCallL1Handler => { + self.syscall_handler.library_call_l1_handler(vm, syscall_ptr)?; + }, + SyscallHandler::CallContract => { + self.syscall_handler.call_contract(vm, syscall_ptr)?; + }, + SyscallHandler::StorageRead => { + self.syscall_handler.storage_read(vm, syscall_ptr)?; + }, + SyscallHandler::StorageWrite => { + self.syscall_handler.storage_write(vm, syscall_ptr)?; + }, + SyscallHandler::SendMessageToL1 => { + self.syscall_handler.send_message_to_l1(vm, syscall_ptr)?; + }, + SyscallHandler::GetTxSignature => { + self.syscall_handler.get_tx_signature(vm, syscall_ptr)?; + }, + SyscallHandler::GetTxInfo => { + self.syscall_handler.get_tx_info(vm, syscall_ptr)?; + }, + SyscallHandler::GetContractAddress => { + self.syscall_handler.get_contract_address(vm, syscall_ptr)?; + }, + SyscallHandler::DelegateCall => { + self.syscall_handler.delegate_call(vm, syscall_ptr)?; + }, + SyscallHandler::DelegateCallL1Handler => { + self.syscall_handler.delegate_l1_handler(vm, syscall_ptr)?; + }, + SyscallHandler::ReplaceClass => { + self.syscall_handler.replace_class(vm, syscall_ptr)?; + }, } - STORAGE_READ => { - let syscall_ptr = get_syscall_ptr(vm, &hint_data.ids_data, &hint_data.ap_tracking)?; - self.syscall_handler.storage_read(vm, syscall_ptr) - } - STORAGE_WRITE => { - let syscall_ptr = get_syscall_ptr(vm, &hint_data.ids_data, &hint_data.ap_tracking)?; - self.syscall_handler.storage_write(vm, syscall_ptr) - } - SEND_MESSAGE_TO_L1 => { - let syscall_ptr = get_syscall_ptr(vm, &hint_data.ids_data, &hint_data.ap_tracking)?; - self.syscall_handler.send_message_to_l1(vm, syscall_ptr) - } - GET_TX_SIGNATURE => { - let syscall_ptr = get_syscall_ptr(vm, &hint_data.ids_data, &hint_data.ap_tracking)?; - self.syscall_handler.get_tx_signature(vm, syscall_ptr) - } - GET_TX_INFO => { - let syscall_ptr = get_syscall_ptr(vm, &hint_data.ids_data, &hint_data.ap_tracking)?; - self.syscall_handler.get_tx_info(vm, syscall_ptr) - } - GET_CONTRACT_ADDRESS => { - let syscall_ptr = get_syscall_ptr(vm, &hint_data.ids_data, &hint_data.ap_tracking)?; - self.syscall_handler.get_contract_address(vm, syscall_ptr) - } - DELEGATE_CALL => { - let syscall_ptr = get_syscall_ptr(vm, &hint_data.ids_data, &hint_data.ap_tracking)?; - self.syscall_handler.delegate_call(vm, syscall_ptr) - } - DELEGATE_L1_HANDLER => { - let syscall_ptr = get_syscall_ptr(vm, &hint_data.ids_data, &hint_data.ap_tracking)?; - self.syscall_handler.delegate_l1_handler(vm, syscall_ptr) - } - REPLACE_CLASS => { - let syscall_ptr = get_syscall_ptr(vm, &hint_data.ids_data, &hint_data.ap_tracking)?; - self.syscall_handler.replace_class(vm, syscall_ptr) - } - _ => Err(SyscallHandlerError::NotImplemented(hint_data.code.clone())), + Ok(()) + } else { + Err(SyscallHandlerError::NotImplemented(hint_data.code.clone())) } } } @@ -1206,4 +1232,4 @@ mod tests { assert_eq!(result_call_info.retdata, vec![260.into()]); assert_eq!(result_call_info.storage_read_values, vec![250.into()]); } -} +} \ No newline at end of file