Skip to content

Commit 586b07b

Browse files
apollo_starknet_os_program: fix blake program hash calcuation (#12452)
1 parent 08ae27b commit 586b07b

File tree

8 files changed

+33
-11
lines changed

8 files changed

+33
-11
lines changed

Cargo.lock

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

crates/apollo_starknet_os_program/src/cairo/starkware/starknet/core/os/constants.cairo

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ const STORED_BLOCK_HASH_BUFFER = 10;
6666

6767
// Allowed virtual OS program hashes for client-side proving.
6868
const ALLOWED_VIRTUAL_OS_PROGRAM_HASHES_0 = (
69-
0x07be1eac4e70041bf0bf257c7637e5aad6cdaa5592989f7d5e6d8c0533cf4a4c
69+
0x06972cfa5c07f702981678547574e239a24ad8bb53cc081ad738ccb10839fd1a
7070
);
7171
const ALLOWED_VIRTUAL_OS_PROGRAM_HASHES_LEN = 1;
7272

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
2-
"os": "0x221e3c8fe84ea158c77a9ce2af5fbd9fd89882ea0e8f170c367ca475266bae6",
3-
"virtual_os": "0x7be1eac4e70041bf0bf257c7637e5aad6cdaa5592989f7d5e6d8c0533cf4a4c",
2+
"os": "0x6b7d04178224185274857ed833d776c184bd4b43aae7471157a50a3036d3e9c",
3+
"virtual_os": "0x6972cfa5c07f702981678547574e239a24ad8bb53cc081ad738ccb10839fd1a",
44
"aggregator": "0x4a50066445fdceb87b7ed1211dbff1f544ad4fa879a678a79355ed812dea346",
55
"aggregator_with_prefix": "0x5af6c0904619be30798f335358f96ba742a8f23c7b0df1080d0c24e2224c6f6"
66
}

crates/apollo_starknet_os_program/src/program_hash.rs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,34 @@ fn compute_program_hash(program: &Program) -> Result<Felt, ProgramHashError> {
4949
}
5050

5151
/// Computes the program hash using Blake2s.
52+
/// Hashes the full program header (bootloader_version, main, n_builtins, builtins) followed by
53+
/// program data, matching the bootloader's Cairo implementation.
54+
// TODO(Avi): Move this function to cairo_vm and share logic with compute_program_hash_chain.
5255
pub fn compute_program_hash_blake(program: &Program) -> Result<Felt, ProgramHashError> {
5356
let stripped_program = program.get_stripped_program()?;
57+
58+
let builtin_list: Vec<Felt> = stripped_program
59+
.builtins
60+
.iter()
61+
.map(|b| Felt::from_bytes_be_slice(b.to_str().as_bytes()))
62+
.collect();
63+
64+
let program_header = vec![
65+
Felt::from(BOOTLOADER_VERSION),
66+
Felt::from(stripped_program.main),
67+
Felt::from(stripped_program.builtins.len()),
68+
];
69+
5470
let program_data: Vec<Felt> = stripped_program
5571
.data
5672
.iter()
5773
.map(|entry| entry.get_int_ref().copied().expect("Program data must contain felts."))
5874
.collect();
59-
Ok(Blake2Felt252::encode_felt252_data_and_calc_blake_hash(&program_data))
75+
76+
let data_chain: Vec<Felt> =
77+
program_header.into_iter().chain(builtin_list).chain(program_data).collect();
78+
79+
Ok(Blake2Felt252::encode_felt252_data_and_calc_blake_hash(&data_chain))
6080
}
6181

6282
pub fn compute_os_program_hash() -> Result<Felt, ProgramHashError> {

crates/blockifier/resources/blockifier_versioned_constants_0_14_2.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@
6767
"segment_arena_cells": false,
6868
"os_constants": {
6969
"allowed_virtual_os_program_hashes": [
70-
"0x7be1eac4e70041bf0bf257c7637e5aad6cdaa5592989f7d5e6d8c0533cf4a4c"
70+
"0x6972cfa5c07f702981678547574e239a24ad8bb53cc081ad738ccb10839fd1a"
7171
],
7272
"constructor_entry_point_selector": "0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194",
7373
"default_entry_point_selector": "0x0",
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
~ /archival_data_gas_costs/gas_per_proof/0: 1000000000
22
~ /enable_casm_hash_migration: false
33
~ /gateway/max_proof_size: 600000
4-
+ /os_constants/allowed_virtual_os_program_hashes/0: "0x7be1eac4e70041bf0bf257c7637e5aad6cdaa5592989f7d5e6d8c0533cf4a4c"
4+
+ /os_constants/allowed_virtual_os_program_hashes/0: "0x6972cfa5c07f702981678547574e239a24ad8bb53cc081ad738ccb10839fd1a"
55
~ /os_constants/builtin_gas_costs/blake: 3334

crates/starknet_os_runner/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ tracing-subscriber = { workspace = true, features = ["env-filter"] }
4343
url.workspace = true
4444

4545
[dev-dependencies]
46-
apollo_starknet_os_program.workspace = true
4746
blockifier = { workspace = true, features = ["testing"] }
4847
blockifier_test_utils.workspace = true
4948
rstest.workspace = true

crates/starknet_os_runner/src/proving/prover_test.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
use std::fs;
22

3-
use apollo_starknet_os_program::program_hash::compute_program_hash_blake;
43
use apollo_transaction_converter::proof_verification::stwo_verify;
54
use apollo_transaction_converter::transaction_converter::BOOTLOADER_PROGRAM_HASH;
65
use apollo_transaction_converter::ProgramOutput;
76
use cairo_vm::types::program::Program;
87
use cairo_vm::vm::runners::cairo_pie::CairoPie;
8+
use starknet_types_core::felt::Felt;
9+
use starknet_types_core::hash::Blake2Felt252;
910

1011
use crate::proving::prover::{prove, resolve_resource_path, BOOTLOADER_FILE};
1112

@@ -64,8 +65,11 @@ fn test_simple_bootloader_program_hash_matches_expected() {
6465
let program_bytes = fs::read(&bootloader_path).expect("Failed to read bootloader file");
6566
let program =
6667
Program::from_bytes(&program_bytes, Some("main")).expect("Failed to load bootloader");
67-
let program_hash =
68-
compute_program_hash_blake(&program).expect("Failed to compute program hash");
68+
let program_data: Vec<Felt> = program
69+
.iter_data()
70+
.map(|entry| entry.get_int_ref().copied().expect("Program data must contain felts."))
71+
.collect();
72+
let program_hash = Blake2Felt252::encode_felt252_data_and_calc_blake_hash(&program_data);
6973
assert_eq!(
7074
program_hash, BOOTLOADER_PROGRAM_HASH,
7175
"Bootloader program hash does not match expected"

0 commit comments

Comments
 (0)