From 98ef602a2e99dbc1a4745c46f5df2ec515f6aff7 Mon Sep 17 00:00:00 2001 From: fannyguthmann Date: Thu, 31 Aug 2023 12:07:05 +0300 Subject: [PATCH] add phf_map problem with the HintProcessorData string --- Cargo.lock | 56 +++++++- Cargo.toml | 8 ++ src/lib.rs | 1 + src/syscalls/deprecated_syscall_handler.rs | 152 ++++++++++++--------- 4 files changed, 153 insertions(+), 64 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 787d2cf04..1d0107832 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2639,6 +2639,48 @@ dependencies = [ "indexmap 1.9.3", ] +[[package]] +name = "phf" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +dependencies = [ + "phf_shared 0.11.2", +] + +[[package]] +name = "phf_codegen" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a" +dependencies = [ + "phf_generator", + "phf_shared 0.11.2", +] + +[[package]] +name = "phf_generator" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +dependencies = [ + "phf_shared 0.11.2", + "rand", +] + +[[package]] +name = "phf_macros" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" +dependencies = [ + "phf_generator", + "phf_shared 0.11.2", + "proc-macro2", + "quote", + "syn 2.0.28", +] + [[package]] name = "phf_shared" version = "0.10.0" @@ -2648,6 +2690,15 @@ dependencies = [ "siphasher", ] +[[package]] +name = "phf_shared" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +dependencies = [ + "siphasher", +] + [[package]] name = "pico-args" version = "0.5.0" @@ -3624,6 +3675,9 @@ dependencies = [ "num-integer", "num-traits 0.2.16", "once_cell", + "phf", + "phf_codegen", + "phf_macros", "serde", "serde_json", "serde_json_pythonic 0.1.2 (git+https://github.com/xJonathanLEI/serde_json_pythonic?tag=v0.1.2)", @@ -3649,7 +3703,7 @@ dependencies = [ "new_debug_unreachable", "once_cell", "parking_lot 0.12.1", - "phf_shared", + "phf_shared 0.10.0", "precomputed-hash", ] diff --git a/Cargo.toml b/Cargo.toml index 5f6b3e2eb..176ddd670 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -56,7 +56,11 @@ 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"} +<<<<<<< HEAD phf = { version = "0.11", default-features = false } +======= +phf = "0.11" +>>>>>>> 94d1dc6 (add phf_map problem with the HintProcessorData string) phf_macros = "0.11" [dev-dependencies] @@ -69,4 +73,8 @@ name = "internals" harness = false [build-dependencies] +<<<<<<< HEAD phf_codegen = "0.11" +======= +phf_codegen = "0.11" +>>>>>>> 94d1dc6 (add phf_map problem with the HintProcessorData string) diff --git a/src/lib.rs b/src/lib.rs index 6dc8c24fa..5ee7ec961 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -25,6 +25,7 @@ use utils::Address; #[cfg(test)] #[macro_use] extern crate assert_matches; +extern crate phf_macros; // Re-exports pub use crate::services::api::contract_classes::deprecated_contract_class::{ diff --git a/src/syscalls/deprecated_syscall_handler.rs b/src/syscalls/deprecated_syscall_handler.rs index 0f5856f2c..72e9de514 100644 --- a/src/syscalls/deprecated_syscall_handler.rs +++ b/src/syscalls/deprecated_syscall_handler.rs @@ -1,5 +1,6 @@ use super::{ - deprecated_business_logic_syscall_handler::DeprecatedBLSyscallHandler, syscall_handler::HintProcessorPostRun, + deprecated_business_logic_syscall_handler::DeprecatedBLSyscallHandler, + other_syscalls, syscall_handler::HintProcessorPostRun, }; use crate::{state::state_api::StateReader, syscalls::syscall_handler_errors::SyscallHandlerError}; use cairo_vm::{ @@ -23,7 +24,7 @@ use std::{any::Any, collections::HashMap}; use phf_macros::phf_map; enum SyscallHandler { - NotImplemented, + Deploy, EmitEvent, GetBlockNumber, GetBlockTimestamp, @@ -41,9 +42,13 @@ enum SyscallHandler { DelegateCall, DelegateCallL1Handler, ReplaceClass, + //Normal hint + AddrBoundPrime, + AddrIs250, } + static HINT_CODES: phf::Map<&'static str, SyscallHandler> = phf_map! { - "DEPLOY" => SyscallHandler::NotImplemented, + "DEPLOY" => SyscallHandler::Deploy, "EMIT_EVENT_CODE" => SyscallHandler::EmitEvent, "GET_BLOCK_NUMBER" => SyscallHandler::GetBlockNumber, "GET_BLOCK_TIMESTAM" => SyscallHandler::GetBlockTimestamp, @@ -61,6 +66,8 @@ static HINT_CODES: phf::Map<&'static str, SyscallHandler> = phf_map! { "DELEGATE_CALL" => SyscallHandler::DelegateCall, "DELEGATE_L1_HANDLER" => SyscallHandler::DelegateCallL1Handler, "REPLACE_CLASS" => SyscallHandler::ReplaceClass, + "ADDRBOUNDPRIME" => SyscallHandler::AddrBoundPrime, + "ADDRIS250" => SyscallHandler::AddrIs250, }; /// Definition of the deprecated syscall hint processor with associated structs @@ -108,7 +115,7 @@ 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 @@ -117,67 +124,86 @@ impl<'a, S: StateReader> DeprecatedSyscallHintProcessor<'a, S> { 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)?; - }, - } - Ok(()) - } else { - Err(SyscallHandlerError::NotImplemented(hint_data.code.clone())) + SyscallHandler::AddrBoundPrime => other_syscalls::addr_bound_prime(vm, hint_data, constants), + SyscallHandler::AddrIs250 => other_syscalls::addr_is_250(vm, hint_data), + SyscallHandler::Deploy => Ok({ + let syscall_ptr = get_syscall_ptr(vm, &hint_data.ids_data, &hint_data.ap_tracking)?; + self.syscall_handler.deploy(vm, syscall_ptr)?; + }), + SyscallHandler::EmitEvent => Ok({ + let syscall_ptr = get_syscall_ptr(vm, &hint_data.ids_data, &hint_data.ap_tracking)?; + self.syscall_handler.emit_event(vm, syscall_ptr)?; + }), + SyscallHandler::GetBlockNumber => Ok({ + let syscall_ptr = get_syscall_ptr(vm, &hint_data.ids_data, &hint_data.ap_tracking)?; + self.syscall_handler.get_block_number(vm, syscall_ptr)?; + }), + SyscallHandler::GetBlockTimestamp => Ok({ + let syscall_ptr = get_syscall_ptr(vm, &hint_data.ids_data, &hint_data.ap_tracking)?; + self.syscall_handler.get_block_timestamp(vm, syscall_ptr)?; + }), + SyscallHandler::GetCallerAddress => Ok({ + let syscall_ptr = get_syscall_ptr(vm, &hint_data.ids_data, &hint_data.ap_tracking)?; + self.syscall_handler.get_caller_address(vm, syscall_ptr)?; + }), + SyscallHandler::GetSequencerAddress => Ok({ + let syscall_ptr = get_syscall_ptr(vm, &hint_data.ids_data, &hint_data.ap_tracking)?; + self.syscall_handler.get_sequencer_address(vm, syscall_ptr)?; + }), + SyscallHandler::LibraryCall => Ok({ + let syscall_ptr = get_syscall_ptr(vm, &hint_data.ids_data, &hint_data.ap_tracking)?; + self.syscall_handler.library_call(vm, syscall_ptr)?; + }), + SyscallHandler::LibraryCallL1Handler => Ok({ + 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)?; + }), + SyscallHandler::CallContract => Ok({ + let syscall_ptr = get_syscall_ptr(vm, &hint_data.ids_data, &hint_data.ap_tracking)?; + self.syscall_handler.call_contract(vm, syscall_ptr)?; + }), + SyscallHandler::StorageRead => Ok({ + let syscall_ptr = get_syscall_ptr(vm, &hint_data.ids_data, &hint_data.ap_tracking)?; + self.syscall_handler.storage_read(vm, syscall_ptr)?; + }), + SyscallHandler::StorageWrite => Ok({ + let syscall_ptr = get_syscall_ptr(vm, &hint_data.ids_data, &hint_data.ap_tracking)?; + self.syscall_handler.storage_write(vm, syscall_ptr)?; + }), + SyscallHandler::SendMessageToL1 => Ok({ + 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)?; + }), + SyscallHandler::GetTxSignature => Ok({ + let syscall_ptr = get_syscall_ptr(vm, &hint_data.ids_data, &hint_data.ap_tracking)?; + self.syscall_handler.get_tx_signature(vm, syscall_ptr)?; + }), + SyscallHandler::GetTxInfo => Ok({ + let syscall_ptr = get_syscall_ptr(vm, &hint_data.ids_data, &hint_data.ap_tracking)?; + self.syscall_handler.get_tx_info(vm, syscall_ptr)?; + }), + SyscallHandler::GetContractAddress => Ok({ + let syscall_ptr = get_syscall_ptr(vm, &hint_data.ids_data, &hint_data.ap_tracking)?; + self.syscall_handler.get_contract_address(vm, syscall_ptr)?; + }), + SyscallHandler::DelegateCall => Ok({ + let syscall_ptr = get_syscall_ptr(vm, &hint_data.ids_data, &hint_data.ap_tracking)?; + self.syscall_handler.delegate_call(vm, syscall_ptr)?; + }), + SyscallHandler::DelegateCallL1Handler => Ok({ + let syscall_ptr = get_syscall_ptr(vm, &hint_data.ids_data, &hint_data.ap_tracking)?; + self.syscall_handler.delegate_l1_handler(vm, syscall_ptr)?; + }), + SyscallHandler::ReplaceClass => Ok({ + let syscall_ptr = get_syscall_ptr(vm, &hint_data.ids_data, &hint_data.ap_tracking)?; + self.syscall_handler.replace_class(vm, syscall_ptr)?; + }), } + } else { + // Make sure to return a Result type here + return Err(SyscallHandlerError::NotImplemented(hint_data.code.clone())); + } } }