Skip to content

Commit 68832f2

Browse files
blockifier_reexecution: use apollo sierra compile to casm
1 parent cb82f8d commit 68832f2

File tree

3 files changed

+26
-35
lines changed

3 files changed

+26
-35
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,6 +9,9 @@ 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
14+
apollo_sierra_compilation_config.workspace = true
1215
apollo_gateway.workspace = true
1316
apollo_gateway_config.workspace = true
1417
apollo_rpc_execution.workspace = true

crates/blockifier_reexecution/src/state_reader/compile.rs

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

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

9+
use apollo_compile_to_casm::{create_sierra_compiler, SierraCompiler};
10+
use apollo_compile_to_casm_types::RawClass;
811
use apollo_gateway::errors::serde_err_to_state_err;
12+
use apollo_sierra_compilation_config::config::SierraCompilationConfig;
13+
use blockifier::state::errors::StateError;
914
use blockifier::state::state_api::StateResult;
10-
use cairo_lang_starknet_classes::contract_class::ContractEntryPoints;
11-
use cairo_lang_utils::bigint::BigUintAsHex;
1215
use flate2::bufread;
13-
use serde::Deserialize;
1416
use starknet_api::contract_class::{ContractClass, EntryPointType, SierraVersion};
1517
use starknet_api::core::EntryPointSelector;
1618
use starknet_api::deprecated_contract_class::{
@@ -20,19 +22,16 @@ use starknet_api::deprecated_contract_class::{
2022
Program,
2123
};
2224
use starknet_api::hash::StarkHash;
25+
use starknet_api::state::SierraContractClass;
2326
use starknet_core::types::{
2427
CompressedLegacyContractClass,
2528
FlattenedSierraClass,
2629
LegacyContractEntryPoint,
2730
LegacyEntryPointsByType,
2831
};
2932

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-
}
33+
static SIERRA_COMPILER: LazyLock<SierraCompiler> =
34+
LazyLock::new(|| create_sierra_compiler(SierraCompilationConfig::default()));
3635

3736
/// Maps `LegacyEntryPointsByType` to a `HashMap` where each `EntryPointType`
3837
/// is associated with a vector of `EntryPoint`. Converts selectors and offsets
@@ -77,33 +76,19 @@ pub fn decode_reader(bytes: Vec<u8>) -> io::Result<String> {
7776
pub fn sierra_to_versioned_contract_class_v1(
7877
sierra: FlattenedSierraClass,
7978
) -> 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();
79+
let serde_value = serde_json::to_value(&sierra).map_err(serde_err_to_state_err)?;
80+
let sierra_contract: SierraContractClass =
81+
serde_json::from_value(serde_value).map_err(serde_err_to_state_err)?;
82+
let sierra_version = SierraVersion::extract_from_program(&sierra_contract.sierra_program)
83+
.map_err(StateError::from)?;
84+
let raw_class = RawClass::try_from(sierra_contract.clone()).map_err(serde_err_to_state_err)?;
85+
let (raw_executable_class, _) = SIERRA_COMPILER
86+
.compile(raw_class)
87+
.map_err(|err| StateError::StateReadError(format!("Failed to compile Sierra: {err}")))?;
88+
let contract_class: ContractClass = serde_json::from_value(raw_executable_class.into_value())
89+
.map_err(serde_err_to_state_err)?;
9690

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))
91+
Ok((contract_class, sierra_version))
10792
}
10893

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

0 commit comments

Comments
 (0)