From 3d21a7a3aa834a21c712051bb6f96b25a8c52819 Mon Sep 17 00:00:00 2001 From: meship-starkware Date: Tue, 23 Jul 2024 13:40:10 +0300 Subject: [PATCH] fix(execution): forbid calling cairo0 contract with cairo1 only builtins --- .../deprecated_entry_point_execution.rs | 17 +++++++++++++++++ crates/blockifier/src/execution/errors.rs | 2 ++ crates/papyrus_monitoring_gateway/src/lib.rs | 2 +- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/crates/blockifier/src/execution/deprecated_entry_point_execution.rs b/crates/blockifier/src/execution/deprecated_entry_point_execution.rs index 878c2e276b..fbb526db7a 100644 --- a/crates/blockifier/src/execution/deprecated_entry_point_execution.rs +++ b/crates/blockifier/src/execution/deprecated_entry_point_execution.rs @@ -1,3 +1,5 @@ +use std::collections::HashSet; + use cairo_vm::types::builtin_name::BuiltinName; use cairo_vm::types::layout_name::LayoutName; use cairo_vm::types::relocatable::{MaybeRelocatable, Relocatable}; @@ -29,6 +31,15 @@ pub struct VmExecutionContext<'a> { pub entry_point_pc: usize, } +pub const CAIRO0_BUILTINS_NAMES: [BuiltinName; 6] = [ + BuiltinName::range_check, + BuiltinName::pedersen, + BuiltinName::ecdsa, + BuiltinName::bitwise, + BuiltinName::ec_op, + BuiltinName::poseidon, +]; + /// Executes a specific call to a contract entry point and returns its output. pub fn execute_entry_point_call( call: CallEntryPoint, @@ -73,6 +84,12 @@ pub fn initialize_execution_context<'a>( ) -> Result, PreExecutionError> { // Resolve initial PC from EP indicator. let entry_point_pc = resolve_entry_point_pc(call, &contract_class)?; + let program_builtins_set: HashSet = + HashSet::from_iter(contract_class.program.iter_builtins().copied()); + let cairo0_builtins_set = HashSet::from_iter(CAIRO0_BUILTINS_NAMES.iter().copied()); + if !program_builtins_set.is_subset(&cairo0_builtins_set) { + return Err(PreExecutionError::UnsupportedCairo0Builtin); + } // Instantiate Cairo runner. let proof_mode = false; diff --git a/crates/blockifier/src/execution/errors.rs b/crates/blockifier/src/execution/errors.rs index 1fa6a1d5b2..147d8e5b6c 100644 --- a/crates/blockifier/src/execution/errors.rs +++ b/crates/blockifier/src/execution/errors.rs @@ -42,6 +42,8 @@ pub enum PreExecutionError { StateError(#[from] StateError), #[error("Requested contract address {:#064x} is not deployed.", .0.key())] UninitializedStorageAddress(ContractAddress), + #[error("Called an unsupported builtin inside a Cairo0 contract.")] + UnsupportedCairo0Builtin, } impl From for PreExecutionError { diff --git a/crates/papyrus_monitoring_gateway/src/lib.rs b/crates/papyrus_monitoring_gateway/src/lib.rs index 823b2044f2..1f7e068c91 100644 --- a/crates/papyrus_monitoring_gateway/src/lib.rs +++ b/crates/papyrus_monitoring_gateway/src/lib.rs @@ -313,7 +313,7 @@ async fn node_config_by_secret( async fn metrics(prometheus_handle: Option) -> Response { match prometheus_handle { Some(handle) => { - Collector::default().prefix(PROCESS_METRICS_PREFIX).collect(); + Collector::new(PROCESS_METRICS_PREFIX).collect(); handle.render().into_response() } None => StatusCode::METHOD_NOT_ALLOWED.into_response(),