Skip to content

Commit 270bc8a

Browse files
authored
Add sierra validation for native (#3714)
**Stack**: - #3717 - #3714⚠️ *Part of a stack created by [spr](https://github.com/ejoffe/spr). Do not merge manually using the UI - doing so may have unexpected results.*
1 parent 0992170 commit 270bc8a

File tree

4 files changed

+29
-7
lines changed

4 files changed

+29
-7
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.

crates/native-api/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ version.workspace = true
44
edition.workspace = true
55

66
[dependencies]
7+
thiserror.workspace = true
78
starknet_api.workspace = true
89
cairo-lang-starknet-classes.workspace = true
910
cairo-native.workspace = true

crates/native-api/src/lib.rs

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,31 @@ use cairo_lang_starknet_classes::contract_class::ContractClass;
77
use cairo_native::executor::AotContractExecutor;
88
use starknet_api::contract_class::SierraVersion;
99

10+
#[derive(Debug, thiserror::Error)]
11+
pub enum NativeCompilationError {
12+
#[error("Unsupported Sierra version {0}. cairo-native requires version 1.7.0 or later.")]
13+
UnsupportedSierraVersion(String),
14+
}
15+
1016
/// Compiles a given Sierra [`ContractClass`] into an [`AotContractExecutor`] for `cairo-native` execution.
11-
#[must_use]
12-
pub fn compile_contract_class(contract_class: &ContractClass) -> AotContractExecutor {
17+
pub fn compile_contract_class(
18+
contract_class: &ContractClass,
19+
) -> Result<AotContractExecutor, NativeCompilationError> {
20+
let sierra_version = extract_sierra_version(contract_class);
21+
check_sierra_version(&sierra_version)?;
22+
1323
let sierra_program = contract_class
1424
.extract_sierra_program()
1525
.expect("extraction should succeed");
1626

17-
let sierra_version = extract_sierra_version(contract_class);
18-
19-
AotContractExecutor::new(
27+
Ok(AotContractExecutor::new(
2028
&sierra_program,
2129
&contract_class.entry_points_by_type,
2230
sierra_version.clone().into(),
2331
cairo_native::OptLevel::Default,
2432
None,
2533
)
26-
.expect("compilation should succeed")
34+
.expect("compilation should succeed"))
2735
}
2836

2937
/// Extracts the Sierra version from the given [`ContractClass`].
@@ -38,3 +46,15 @@ fn extract_sierra_version(contract_class: &ContractClass) -> SierraVersion {
3846
SierraVersion::extract_from_program(&sierra_version_values)
3947
.expect("version extraction should succeed")
4048
}
49+
50+
/// Checks if the given Sierra version is supported by `cairo-native`.
51+
fn check_sierra_version(sierra_version: &SierraVersion) -> Result<(), NativeCompilationError> {
52+
let minimal_supported_version = SierraVersion::new(1, 7, 0);
53+
if sierra_version < &minimal_supported_version {
54+
Err(NativeCompilationError::UnsupportedSierraVersion(
55+
sierra_version.to_string(),
56+
))
57+
} else {
58+
Ok(())
59+
}
60+
}

crates/scarb-api/src/artifacts.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ impl StarknetArtifactsFiles {
110110
Ok(if self.compile_native {
111111
Some(native_api::compile_contract_class(&serde_json::from_str(
112112
sierra,
113-
)?))
113+
)?)?)
114114
} else {
115115
None
116116
})

0 commit comments

Comments
 (0)