Skip to content

Commit ee7469a

Browse files
blockifier_reexecution: use apollo sierra compile to casm
1 parent 6083539 commit ee7469a

File tree

3 files changed

+41
-38
lines changed

3 files changed

+41
-38
lines changed

Cargo.lock

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

crates/blockifier_reexecution/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,12 @@ license.workspace = true
99
blockifier_regression_https_testing = []
1010

1111
[dependencies]
12+
apollo_compile_to_casm.workspace = true
13+
apollo_compile_to_casm_types.workspace = true
1214
apollo_gateway.workspace = true
1315
apollo_gateway_config.workspace = true
1416
apollo_rpc_execution.workspace = true
17+
apollo_sierra_compilation_config.workspace = true
1518
assert_matches.workspace = true
1619
blockifier = { workspace = true, features = ["reexecution"] }
1720
cairo-lang-starknet-classes.workspace = true

crates/blockifier_reexecution/src/state_reader/compile.rs

Lines changed: 35 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,16 @@
44

55
use std::collections::HashMap;
66
use std::io::{self, Read};
7+
use std::sync::LazyLock;
78

8-
use apollo_gateway::errors::serde_err_to_state_err;
9+
use apollo_compile_to_casm::{create_sierra_compiler, SierraCompiler};
10+
use apollo_compile_to_casm_types::RawClass;
11+
use apollo_sierra_compilation_config::config::{
12+
SierraCompilationConfig,
13+
DEFAULT_MAX_BYTECODE_SIZE,
14+
};
915
use blockifier::state::state_api::StateResult;
10-
use cairo_lang_starknet_classes::contract_class::ContractEntryPoints;
11-
use cairo_lang_utils::bigint::BigUintAsHex;
1216
use flate2::bufread;
13-
use serde::Deserialize;
1417
use starknet_api::contract_class::{ContractClass, EntryPointType, SierraVersion};
1518
use starknet_api::core::EntryPointSelector;
1619
use starknet_api::deprecated_contract_class::{
@@ -20,19 +23,20 @@ use starknet_api::deprecated_contract_class::{
2023
Program,
2124
};
2225
use starknet_api::hash::StarkHash;
26+
use starknet_api::state::SierraContractClass;
2327
use starknet_core::types::{
2428
CompressedLegacyContractClass,
2529
FlattenedSierraClass,
2630
LegacyContractEntryPoint,
2731
LegacyEntryPointsByType,
2832
};
2933

30-
#[derive(Debug, Deserialize)]
31-
pub struct MiddleSierraContractClass {
32-
pub sierra_program: Vec<BigUintAsHex>,
33-
pub contract_class_version: String,
34-
pub entry_points_by_type: ContractEntryPoints,
35-
}
34+
static SIERRA_COMPILER: LazyLock<SierraCompiler> = LazyLock::new(|| {
35+
create_sierra_compiler(SierraCompilationConfig {
36+
max_bytecode_size: 10 * DEFAULT_MAX_BYTECODE_SIZE,
37+
..Default::default()
38+
})
39+
});
3640

3741
/// Maps `LegacyEntryPointsByType` to a `HashMap` where each `EntryPointType`
3842
/// is associated with a vector of `EntryPoint`. Converts selectors and offsets
@@ -73,37 +77,30 @@ pub fn decode_reader(bytes: Vec<u8>) -> io::Result<String> {
7377
}
7478

7579
/// Compile a FlattenedSierraClass to a versioned ContractClass V1 (casm) using
76-
/// cairo_lang_starknet_classes.
80+
/// apollo_compile_to_casm.
7781
pub fn sierra_to_versioned_contract_class_v1(
78-
sierra: FlattenedSierraClass,
82+
flattened_sierra: FlattenedSierraClass,
7983
) -> StateResult<(ContractClass, SierraVersion)> {
80-
let middle_sierra: MiddleSierraContractClass = {
81-
let v = serde_json::to_value(sierra).map_err(serde_err_to_state_err);
82-
serde_json::from_value(v?).map_err(serde_err_to_state_err)?
83-
};
84-
let sierra = cairo_lang_starknet_classes::contract_class::ContractClass {
85-
sierra_program: middle_sierra.sierra_program,
86-
contract_class_version: middle_sierra.contract_class_version,
87-
entry_points_by_type: middle_sierra.entry_points_by_type,
88-
sierra_program_debug_info: None,
89-
abi: None,
90-
};
91-
92-
let sierra_program_values =
93-
sierra.sierra_program.iter().take(3).map(|felt| felt.value.clone()).collect::<Vec<_>>();
94-
95-
let sierra_version = SierraVersion::extract_from_program(&sierra_program_values).unwrap();
84+
let serde_value = serde_json::to_value(&flattened_sierra)
85+
.unwrap_or_else(|err| panic!("Failed to serialize flattened Sierra: {err}"));
86+
let sierra_contract: SierraContractClass =
87+
serde_json::from_value(serde_value).unwrap_or_else(|err| {
88+
panic!(
89+
"Failed to deserialize SierraContractClass: {err} for flattened_sierra: \
90+
{flattened_sierra:?}"
91+
);
92+
});
93+
let sierra_version = SierraVersion::extract_from_program(&sierra_contract.sierra_program)
94+
.unwrap_or_else(|err| panic!("Failed to extract Sierra version: {err}"));
95+
let raw_class = RawClass::try_from(sierra_contract)
96+
.unwrap_or_else(|err| panic!("Failed to convert SierraContractClass into RawClass: {err}"));
97+
let (raw_executable_class, _) = SIERRA_COMPILER
98+
.compile(raw_class)
99+
.unwrap_or_else(|err| panic!("Failed to compile Sierra to Casm: {err}"));
100+
let contract_class: ContractClass = serde_json::from_value(raw_executable_class.into_value())
101+
.unwrap_or_else(|err| panic!("Failed to deserialize ContractClass: {err}"));
96102

97-
let casm =
98-
cairo_lang_starknet_classes::casm_contract_class::CasmContractClass::from_contract_class(
99-
sierra,
100-
false,
101-
usize::MAX,
102-
)
103-
// TODO(Aviv): Reconsider the unwrap.
104-
.unwrap();
105-
// TODO(AVIV): return only ContractClass.
106-
Ok((ContractClass::V1((casm, sierra_version.clone())), sierra_version))
103+
Ok((contract_class, sierra_version))
107104
}
108105

109106
/// Compile a CompressedLegacyContractClass to a ContractClass V0 using cairo_lang_starknet_classes.

0 commit comments

Comments
 (0)