Skip to content

Commit 01a8de8

Browse files
bootloader config: make applicative bootloader hash a list
1 parent 60e6ced commit 01a8de8

File tree

4 files changed

+61
-25
lines changed

4 files changed

+61
-25
lines changed

.github/workflows/upload_artifacts_workflow.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ name: Upload-Artifacts
33
on:
44
push:
55
branches:
6-
- noamp/applicative_bootloader_hints_extract_hash_func
6+
- noamp/app_bl_hash_list_in_bl_cfg
77

88
jobs:
99
artifacts-push:

crates/cairo-program-runner-lib/src/hints/bootloader_hints.rs

Lines changed: 46 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -158,12 +158,19 @@ pub fn load_bootloader_config(
158158
.map(|h| Box::new(MaybeRelocatable::from(h)) as Box<dyn Any>)
159159
.collect();
160160

161+
let supported_applicative_bootloader_hashes: Vec<Box<dyn Any>> = config
162+
.applicative_bootloader_program_hash_list
163+
.iter()
164+
.map(|h| Box::new(MaybeRelocatable::from(h)) as Box<dyn Any>)
165+
.collect();
166+
161167
let args: Vec<Box<dyn Any>> = vec![
162168
maybe_relocatable_box!(config.supported_simple_bootloader_hash_list.len()),
163169
any_box!(supported_simple_bootloader_hashes),
164170
maybe_relocatable_box!(config.supported_cairo_verifier_program_hashes.len()),
165171
any_box!(supported_verifier_hashes),
166-
maybe_relocatable_box!(config.applicative_bootloader_program_hash),
172+
maybe_relocatable_box!(config.applicative_bootloader_program_hash_list.len()),
173+
any_box!(supported_applicative_bootloader_hashes),
167174
];
168175

169176
// Store the args in the VM memory
@@ -316,14 +323,14 @@ pub fn compute_and_configure_fact_topologies(
316323
let output_builtin = vm.get_output_builtin_mut()?;
317324

318325
let bootloader_input: BootloaderInput = exec_scopes.get(vars::BOOTLOADER_INPUT)?;
319-
let applicative_bootloader_program_hash = bootloader_input
326+
let applicative_bootloader_program_hash_list = bootloader_input
320327
.bootloader_config
321-
.applicative_bootloader_program_hash;
328+
.applicative_bootloader_program_hash_list;
322329

323330
let plain_fact_topologies = compute_fact_topologies(
324331
&packed_outputs,
325332
&fact_topologies,
326-
applicative_bootloader_program_hash,
333+
applicative_bootloader_program_hash_list,
327334
)
328335
.map_err(Into::<HintError>::into)?;
329336

@@ -520,7 +527,7 @@ mod tests {
520527
Felt252::from(1234),
521528
Felt252::from(5678),
522529
],
523-
applicative_bootloader_program_hash: Felt252::from(2222),
530+
applicative_bootloader_program_hash_list: vec![Felt252::from(2222)],
524531
supported_cairo_verifier_program_hashes: vec![
525532
Felt252::from(3333),
526533
Felt252::from(4444),
@@ -699,7 +706,7 @@ mod tests {
699706
let config_segment = vm
700707
.segments
701708
.memory
702-
.get_continuous_range(bootloader_config_segment, 5)
709+
.get_continuous_range(bootloader_config_segment, 6)
703710
.unwrap();
704711

705712
let simple_bootloader_hash_list_segment_len = match &config_segment[0] {
@@ -722,7 +729,16 @@ mod tests {
722729
"Expected a relocatable value for cairo_verifier_program_hashes_segment_addr"
723730
),
724731
};
725-
let applicative_bootloader_program_hash = &config_segment[4];
732+
let applicative_bootloader_program_hashes_segment_len = match &config_segment[4] {
733+
MaybeRelocatable::Int(x) => (*x).to_usize().unwrap(),
734+
_ => {
735+
panic!("Expected an integer for applicative_bootloader_program_hashes_segment_len")
736+
}
737+
};
738+
let applicative_bootloader_program_hashes_segment_addr = match &config_segment[5] {
739+
MaybeRelocatable::RelocatableValue(relocatable) => relocatable,
740+
_ => panic!("Expected a relocatable value for applicative_bootloader_program_hashes_segment_addr"),
741+
};
726742

727743
// Assert that the simple bootloader hash list segment length matches the expected length
728744
assert!(matches!(
@@ -766,11 +782,29 @@ mod tests {
766782
);
767783
}
768784

785+
// Assert that the applicative bootloader program hashes segment length matches the expected
786+
// length
787+
assert!(matches!(
788+
applicative_bootloader_program_hashes_segment_len,
789+
x if x == config.applicative_bootloader_program_hash_list.len()
790+
));
769791
// Assert that the applicative bootloader program hash matches the expected value
770-
assert!(
771-
matches!(applicative_bootloader_program_hash, MaybeRelocatable::Int(x) if *x ==
772-
config.applicative_bootloader_program_hash)
773-
);
792+
let applicative_bootloader_program_hashes_segment = vm
793+
.segments
794+
.memory
795+
.get_continuous_range(
796+
*applicative_bootloader_program_hashes_segment_addr,
797+
applicative_bootloader_program_hashes_segment_len,
798+
)
799+
.unwrap();
800+
for (i, hash) in applicative_bootloader_program_hashes_segment
801+
.iter()
802+
.enumerate()
803+
{
804+
assert!(
805+
matches!(hash, MaybeRelocatable::Int(x) if *x == config.applicative_bootloader_program_hash_list[i])
806+
);
807+
}
774808
}
775809

776810
#[rstest]
@@ -951,7 +985,7 @@ mod tests {
951985
bootloader_config: BootloaderConfig {
952986
supported_simple_bootloader_hash_list: vec![Felt252::from(1234)],
953987
supported_cairo_verifier_program_hashes: Default::default(),
954-
applicative_bootloader_program_hash: Felt252::from(2222),
988+
applicative_bootloader_program_hash_list: vec![Felt252::from(2222)],
955989
},
956990
packed_outputs: packed_outputs.clone(),
957991
};

crates/cairo-program-runner-lib/src/hints/fact_topologies.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ impl From<WriteFactTopologiesError> for HintError {
154154
pub fn compute_fact_topologies(
155155
packed_outputs: &Vec<PackedOutput>,
156156
fact_topologies: &Vec<FactTopology>,
157-
applicative_bootloader_program_hash: Felt252,
157+
applicative_bootloader_program_hash_list: Vec<Felt252>,
158158
) -> Result<Vec<FactTopology>, FactTopologyError> {
159159
if packed_outputs.len() != fact_topologies.len() {
160160
return Err(FactTopologyError::WrongNumberOfFactTopologies(
@@ -172,7 +172,7 @@ pub fn compute_fact_topologies(
172172
}
173173
PackedOutput::Composite(composite_packed_output) => {
174174
let subtask_plain_fact_topologies = composite_packed_output
175-
.get_plain_fact_topologies(applicative_bootloader_program_hash)
175+
.get_plain_fact_topologies(applicative_bootloader_program_hash_list.clone())
176176
.map_err(|e| {
177177
FactTopologyError::CompositePackedParsingFailed(
178178
format!("{e:?}").into_boxed_str(),
@@ -493,11 +493,11 @@ mod tests {
493493
packed_outputs: Vec<PackedOutput>,
494494
fact_topologies: Vec<FactTopology>,
495495
) {
496-
let applicative_bootloader_program_hash = Felt252::from(1234);
496+
let applicative_bootloader_program_hash_list = vec![Felt252::from(1234)];
497497
let plain_fact_topologies = compute_fact_topologies(
498498
&packed_outputs,
499499
&fact_topologies,
500-
applicative_bootloader_program_hash,
500+
applicative_bootloader_program_hash_list,
501501
)
502502
.expect("Failed to compute fact topologies");
503503
for (topology, plain_topology) in std::iter::zip(&fact_topologies, plain_fact_topologies) {
@@ -536,11 +536,11 @@ mod tests {
536536
tree_structure: vec![], // Not used for composite, but required by API
537537
page_sizes: vec![],
538538
}];
539-
let applicative_bootloader_program_hash = Felt252::from(1234);
539+
let applicative_bootloader_program_hash_list = vec![Felt252::from(1234)];
540540
let result = compute_fact_topologies(
541541
&packed_outputs,
542542
&fact_topologies,
543-
applicative_bootloader_program_hash,
543+
applicative_bootloader_program_hash_list,
544544
)
545545
.expect("Composite packed output should be supported and return subtask fact topologies");
546546

@@ -562,11 +562,11 @@ mod tests {
562562
fn test_compute_fact_topologies_arg_len_mismatch() {
563563
let packed_outputs = vec![PackedOutput::Plain];
564564
let fact_topologies = vec![];
565-
let applicative_bootloader_program_hash = Felt252::from(1234);
565+
let applicative_bootloader_program_hash_list = vec![Felt252::from(1234)];
566566
let result = compute_fact_topologies(
567567
&packed_outputs,
568568
&fact_topologies,
569-
applicative_bootloader_program_hash,
569+
applicative_bootloader_program_hash_list,
570570
);
571571
assert!(
572572
matches!(result, Err(FactTopologyError::WrongNumberOfFactTopologies(n_outputs, n_topologies)) if n_outputs == packed_outputs.len() && n_topologies == fact_topologies.len())

crates/cairo-program-runner-lib/src/hints/types.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ pub(crate) type ProgramIdentifiers = HashMap<String, Identifier>;
3030
#[derive(Deserialize, Debug, Clone)]
3131
pub struct BootloaderConfig {
3232
pub supported_simple_bootloader_hash_list: Vec<Felt252>,
33-
pub applicative_bootloader_program_hash: Felt252,
33+
pub applicative_bootloader_program_hash_list: Vec<Felt252>,
3434
pub supported_cairo_verifier_program_hashes: Vec<Felt252>,
3535
}
3636

@@ -72,7 +72,7 @@ impl CompositePackedOutput {
7272
/// * Returns an error if the sum of subtask sizes does not match the length of `outputs`.
7373
pub fn get_plain_fact_topologies(
7474
&self,
75-
applicative_bootloader_program_hash: Felt252,
75+
applicative_bootloader_program_hash_list: Vec<Felt252>,
7676
) -> Result<Vec<FactTopology>, String> {
7777
let mut subtasks_fact_topologies = Vec::new();
7878

@@ -111,7 +111,7 @@ impl CompositePackedOutput {
111111
// Handle subtask if it is of type `PackedOutput::Plain`
112112
if let PackedOutput::Plain = subtask {
113113
// If the program hash matches the app. bootloader hash, adjust the page sizes
114-
if *program_hash == applicative_bootloader_program_hash {
114+
if applicative_bootloader_program_hash_list.contains(program_hash) {
115115
let mut page_sizes = self.fact_topologies[index].page_sizes.clone();
116116
if let Some(first_page_size) = page_sizes.get_mut(0) {
117117
*first_page_size -= applicative_bootloader_header_size;
@@ -128,7 +128,9 @@ impl CompositePackedOutput {
128128
// Handle subtask recursively if it is of type `PackedOutput::Composite`
129129
else if let PackedOutput::Composite(composite) = subtask {
130130
subtasks_fact_topologies.extend(
131-
composite.get_plain_fact_topologies(applicative_bootloader_program_hash)?,
131+
composite.get_plain_fact_topologies(
132+
applicative_bootloader_program_hash_list.clone(),
133+
)?,
132134
);
133135
} else {
134136
return Err("Unsupported subtask type".to_string());

0 commit comments

Comments
 (0)