diff --git a/crates/apollo_starknet_os_program/src/cairo/starkware/starknet/core/os/execution/execution_constraints.cairo b/crates/apollo_starknet_os_program/src/cairo/starkware/starknet/core/os/execution/execution_constraints.cairo index e228f32b8e5..9c2fa07c6a2 100644 --- a/crates/apollo_starknet_os_program/src/cairo/starkware/starknet/core/os/execution/execution_constraints.cairo +++ b/crates/apollo_starknet_os_program/src/cairo/starkware/starknet/core/os/execution/execution_constraints.cairo @@ -11,7 +11,8 @@ from starkware.starknet.core.os.constants import ( ) from starkware.starknet.core.os.execution.syscall_impls import read_block_hash_from_storage from starkware.starknet.core.os.virtual_os_output import ( - PROOF_VERSION, + PROOF_VERSION_V0, + PROOF_VERSION_V1, VIRTUAL_OS_OUTPUT_VERSION, VIRTUAL_SNOS, ProofHeader, @@ -46,14 +47,15 @@ func check_proof_facts{range_check_ptr, contract_state_changes: DictAccess*}( assert_le(ProofHeader.SIZE + VirtualOsOutputHeader.SIZE, proof_facts_size); // Validate the proof header. + static_assert ProofHeader.SIZE == 3; let proof_header = cast(proof_facts, ProofHeader*); + assert proof_header.proof_variant = VIRTUAL_SNOS; assert is_program_hash_allowed(proof_header.program_hash) = TRUE; - // Proof version and variant are for future compatibility. - assert [proof_header] = ProofHeader( - proof_version=PROOF_VERSION, - proof_variant=VIRTUAL_SNOS, - program_hash=proof_header.program_hash, - ); + // Proof version may be V0 (legacy) or V1 (current). + with_attr error_message("Unsupported proof version") { + tempvar proof_version = proof_header.proof_version; + assert (proof_version - PROOF_VERSION_V0) * (proof_version - PROOF_VERSION_V1) = 0; + } // Validate the virtual OS output header. let os_output_header = cast(&proof_facts[ProofHeader.SIZE], VirtualOsOutputHeader*); diff --git a/crates/apollo_starknet_os_program/src/cairo/starkware/starknet/core/os/virtual_os_output.cairo b/crates/apollo_starknet_os_program/src/cairo/starkware/starknet/core/os/virtual_os_output.cairo index 91c76c60f86..3a3b59b490e 100644 --- a/crates/apollo_starknet_os_program/src/cairo/starkware/starknet/core/os/virtual_os_output.cairo +++ b/crates/apollo_starknet_os_program/src/cairo/starkware/starknet/core/os/virtual_os_output.cairo @@ -2,7 +2,10 @@ const VIRTUAL_SNOS = 'VIRTUAL_SNOS'; // Marker indicating proof facts format version 0. -const PROOF_VERSION = 'PROOF0'; +const PROOF_VERSION_V0 = 'PROOF0'; + +// Marker indicating proof facts format version 1. +const PROOF_VERSION_V1 = 'PROOF1'; // The version of the virtual OS output. // diff --git a/crates/apollo_starknet_os_program/src/program_hash.json b/crates/apollo_starknet_os_program/src/program_hash.json index 92413dfcd93..ad006ea8087 100644 --- a/crates/apollo_starknet_os_program/src/program_hash.json +++ b/crates/apollo_starknet_os_program/src/program_hash.json @@ -1,5 +1,5 @@ { - "os": "0x10e4d1fd519f4675b021671fb866ec60fc0522f65273f587255414d0e5d5b23", + "os": "0x2a4b5650b64c1a13a4d2754353ddd85d4b970766063220253a4f96643ba23f6", "virtual_os": "0x39f55918423cade9e95a6a52286b56bed1c5c9b6fe39aa00301361457a3c604", "aggregator": "0x700786d51b3854af43d8e12180380bda3029be6c1767e007858de6ca2edac40", "aggregator_with_prefix": "0xe08d300e3f5996e43d6d7cc5a20068e0e58cf1309089f2348317ac580f6c1f" diff --git a/crates/apollo_starknet_os_program/src/virtual_os_test.rs b/crates/apollo_starknet_os_program/src/virtual_os_test.rs index 20d2737ca31..3e446bdaa78 100644 --- a/crates/apollo_starknet_os_program/src/virtual_os_test.rs +++ b/crates/apollo_starknet_os_program/src/virtual_os_test.rs @@ -19,7 +19,7 @@ fn test_virtual_os_swapped_files() { #[test] fn test_program_bytecode_lengths() { expect![[r#" - 15660 + 15663 "#]] .assert_debug_eq(&OS_PROGRAM.data_len()); expect![[r#" diff --git a/crates/starknet_os/src/constants_test.rs b/crates/starknet_os/src/constants_test.rs index e5a15281586..b5fa56e4b61 100644 --- a/crates/starknet_os/src/constants_test.rs +++ b/crates/starknet_os/src/constants_test.rs @@ -10,6 +10,7 @@ use starknet_api::core::{ }; use starknet_api::transaction::fields::{ PROOF_VERSION_V0, + PROOF_VERSION_V1, VIRTUAL_OS_OUTPUT_VERSION, VIRTUAL_SNOS, }; @@ -82,10 +83,12 @@ fn test_virtual_snos() { assert_eq!(Const::VirtualSnos.fetch_from_os_program().unwrap(), VIRTUAL_SNOS); } -/// Asserts that the Rust PROOF_VERSION_V0 constant matches the Cairo constant. +/// Asserts that the Rust PROOF_VERSION_V0 and PROOF_VERSION_V1 constants match their Cairo +/// counterparts. #[test] fn test_proof_version() { - assert_eq!(Const::ProofVersion.fetch_from_os_program().unwrap(), PROOF_VERSION_V0); + assert_eq!(Const::ProofVersionV0.fetch_from_os_program().unwrap(), PROOF_VERSION_V0); + assert_eq!(Const::ProofVersionV1.fetch_from_os_program().unwrap(), PROOF_VERSION_V1); } /// Asserts that the Rust STARKNET_OS_CONFIG_HASH_VERSION constant matches the Cairo constant. diff --git a/crates/starknet_os/src/hints/vars.rs b/crates/starknet_os/src/hints/vars.rs index 17906ac9a16..e7cfcabd6d9 100644 --- a/crates/starknet_os/src/hints/vars.rs +++ b/crates/starknet_os/src/hints/vars.rs @@ -369,7 +369,8 @@ define_string_enum! { "starkware.starknet.core.os.virtual_os_output.VIRTUAL_OS_OUTPUT_VERSION" ), (VirtualSnos, "starkware.starknet.core.os.virtual_os_output.VIRTUAL_SNOS"), - (ProofVersion, "starkware.starknet.core.os.virtual_os_output.PROOF_VERSION"), + (ProofVersionV0, "starkware.starknet.core.os.virtual_os_output.PROOF_VERSION_V0"), + (ProofVersionV1, "starkware.starknet.core.os.virtual_os_output.PROOF_VERSION_V1"), } }