Skip to content

Commit f7ae062

Browse files
committed
Execute simple_package on native
1 parent a566fdb commit f7ae062

File tree

8 files changed

+90
-3
lines changed

8 files changed

+90
-3
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ license-file = "LICENSE"
3232
blockifier = { git = "https://github.com/cptartur/sequencer.git", branch = "main-v0.14.0-fork", features = ["testing", "tracing", "cairo_native"] }
3333
bigdecimal = "0.4.8"
3434
starknet_api = { git = "https://github.com/cptartur/sequencer.git", branch = "main-v0.14.0-fork" }
35+
cairo-native = { git = "https://github.com/lambdaclass/cairo_native.git", rev = "d7f8352657a4c1228b227807b90aea10f97f746d" }
3536
cairo-lang-casm = { version = "2.12.0", features = ["serde"] }
3637
cairo-lang-sierra = "2.12.0"
3738
cairo-lang-utils = "2.12.0"

crates/cheatnet/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ shared.workspace = true
4444
rand.workspace = true
4545
foundry-ui = { path = "../foundry-ui" }
4646
scarb-oracle-hint-service.workspace = true
47+
cairo-native.workspace = true
4748

4849
[dev-dependencies]
4950
ctor.workspace = true

crates/cheatnet/src/runtime_extensions/call_to_blockifier_runtime_extension/execution/entry_point.rs

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@ use crate::runtime_extensions::call_to_blockifier_runtime_extension::execution::
33
use crate::runtime_extensions::call_to_blockifier_runtime_extension::rpc::{AddressOrClassHash, CallResult};
44
use crate::runtime_extensions::call_to_blockifier_runtime_extension::CheatnetState;
55
use crate::runtime_extensions::common::{get_relocated_vm_trace, get_syscalls_gas_consumed, sum_syscall_usage};
6+
use crate::runtime_extensions::forge_runtime_extension::{get_nested_calls_syscalls_sierra_gas, get_nested_calls_syscalls_vm_resources};
67
use crate::state::CheatStatus;
78
use blockifier::execution::call_info::{CallExecution, Retdata, StorageAccessTracker};
8-
use crate::runtime_extensions::forge_runtime_extension::{get_nested_calls_syscalls_sierra_gas, get_nested_calls_syscalls_vm_resources};
99
use blockifier::execution::contract_class::{RunnableCompiledClass, TrackedResource};
1010

11+
use crate::runtime_extensions::native::execution::execute_entry_point_call_native;
1112
use blockifier::execution::entry_point::{EntryPointRevertInfo, ExecutableCallEntryPoint};
1213
use blockifier::execution::stack_trace::{
1314
Cairo1RevertHeader, extract_trailing_cairo1_revert_trace,
@@ -174,7 +175,27 @@ pub fn execute_call_entry_point(
174175
cheatnet_state,
175176
context,
176177
),
177-
RunnableCompiledClass::V1Native(_) => todo!(),
178+
RunnableCompiledClass::V1Native(native_compiled_class_v1) => {
179+
// if context.tracked_resource_stack.last() == Some(&TrackedResource::CairoSteps) {
180+
// // We cannot run native with cairo steps as the tracked resources (it's a vm
181+
// // resouorce).
182+
// panic!("We want to test execution of native entry only");
183+
// // execute_entry_point_call_cairo1(
184+
// // call,
185+
// // compiled_class.casm(),
186+
// // state,
187+
// // context,
188+
// // )
189+
// } else {
190+
println!("Executing native entry point");
191+
execute_entry_point_call_native(
192+
entry_point.clone(),
193+
native_compiled_class_v1,
194+
state,
195+
cheatnet_state,
196+
context,
197+
)
198+
} // }
178199
};
179200
context
180201
.tracked_resource_stack

crates/cheatnet/src/runtime_extensions/forge_runtime_extension/cheatcodes/declare.rs

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,14 @@ use crate::runtime_extensions::forge_runtime_extension::{
55
};
66
use anyhow::{Context, Result};
77
use blockifier::execution::contract_class::{CompiledClassV1, RunnableCompiledClass};
8+
use blockifier::execution::native::contract_class::NativeCompiledClassV1;
89
use blockifier::state::{errors::StateError, state_api::State};
10+
use cairo_lang_starknet_classes::contract_class::ContractClass;
11+
use cairo_native::executor::AotContractExecutor;
912
use conversions::IntoConv;
1013
use conversions::serde::serialize::CairoSerialize;
1114
use starknet::core::types::contract::SierraClass;
15+
use starknet_api::contract_class::SierraVersion;
1216
use starknet_api::core::{ClassHash, CompiledClassHash};
1317

1418
#[derive(CairoSerialize)]
@@ -27,12 +31,41 @@ pub fn declare(
2731
.with_context(|| format!("Failed to get contract artifact for name = {contract_name}."))
2832
.map_err(EnhancedHintError::from)?;
2933

34+
let sierra_contract_class: ContractClass =
35+
serde_json::from_str(&contract_artifact.sierra).unwrap();
36+
37+
let sierra_program = sierra_contract_class
38+
.extract_sierra_program()
39+
.expect("Cannot extract sierra program from sierra contract class");
40+
41+
let sierra_version_values = sierra_contract_class
42+
.sierra_program
43+
.iter()
44+
.take(3)
45+
.map(|x| x.value.clone())
46+
.collect::<Vec<_>>();
47+
48+
let sierra_version = SierraVersion::extract_from_program(&sierra_version_values)
49+
.expect("Cannot extract sierra version from sierra program");
50+
51+
let executor = AotContractExecutor::new(
52+
&sierra_program,
53+
&sierra_contract_class.entry_points_by_type,
54+
sierra_version.clone().into(),
55+
cairo_native::OptLevel::Default,
56+
// `stats` - Passing a [cairo_native::statistics::Statistics] object enables collecting
57+
// compilation statistics.
58+
None,
59+
)
60+
.expect("Cannot compile sierra into native");
61+
3062
let contract_class = CompiledClassV1::try_from_json_string(
3163
&contract_artifact.casm,
3264
get_current_sierra_version(),
3365
)
3466
.expect("Failed to read contract class from json");
35-
let contract_class = RunnableCompiledClass::V1(contract_class);
67+
let contract_class = NativeCompiledClassV1::new(executor, contract_class);
68+
let contract_class = RunnableCompiledClass::V1Native(contract_class);
3669

3770
let class_hash = *contracts_data
3871
.get_class_hash(contract_name)

crates/cheatnet/src/runtime_extensions/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ pub mod common;
44
pub mod deprecated_cheatable_starknet_extension;
55
pub mod forge_config_extension;
66
pub mod forge_runtime_extension;
7+
mod native;
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
use crate::runtime_extensions::call_to_blockifier_runtime_extension::execution::entry_point::{
2+
CallInfoWithExecutionData, ContractClassEntryPointExecutionResult,
3+
};
4+
use crate::state::CheatnetState;
5+
use blockifier::execution::entry_point::{EntryPointExecutionContext, ExecutableCallEntryPoint};
6+
use blockifier::execution::native::contract_class::NativeCompiledClassV1;
7+
use blockifier::execution::native::entry_point_execution::execute_entry_point_call;
8+
use blockifier::state::state_api::State;
9+
use std::default::Default;
10+
11+
pub(crate) fn execute_entry_point_call_native(
12+
call: ExecutableCallEntryPoint,
13+
native_compiled_class_v1: NativeCompiledClassV1,
14+
state: &mut dyn State,
15+
cheatnet_state: &mut CheatnetState, // Added parameter
16+
context: &mut EntryPointExecutionContext,
17+
) -> ContractClassEntryPointExecutionResult {
18+
// TODO error handling
19+
let call_info = execute_entry_point_call(call, native_compiled_class_v1, state, context)
20+
.expect("Native execution failed");
21+
22+
Ok(CallInfoWithExecutionData {
23+
call_info,
24+
syscall_usage_vm_resources: Default::default(),
25+
syscall_usage_sierra_gas: Default::default(),
26+
vm_trace: None,
27+
})
28+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
pub mod execution;

0 commit comments

Comments
 (0)