Skip to content

Commit f0652e1

Browse files
starknet_os: split out FullOsOutputs parsing logic (#10359)
1 parent 079ed26 commit f0652e1

File tree

3 files changed

+48
-27
lines changed

3 files changed

+48
-27
lines changed

crates/starknet_os/src/hints/hint_implementation/aggregator/implementation.rs

Lines changed: 6 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,15 @@ use cairo_vm::hint_processor::builtin_hint_processor::hint_utils::{
33
insert_value_from_var_name,
44
insert_value_into_ap,
55
};
6-
use cairo_vm::hint_processor::hint_processor_utils::felt_to_usize;
76
use starknet_types_core::felt::Felt;
87

98
use crate::hint_processor::aggregator_hint_processor::{AggregatorHintProcessor, DataAvailability};
109
use crate::hint_processor::common_hint_processor::CommonHintProcessor;
1110
use crate::hints::error::{OsHintError, OsHintResult};
12-
use crate::hints::hint_implementation::aggregator::utils::FullOsOutputs;
11+
use crate::hints::hint_implementation::aggregator::utils::FullOsOutputsData;
1312
use crate::hints::hint_implementation::output::load_public_keys_into_memory;
1413
use crate::hints::types::HintArgs;
1514
use crate::hints::vars::Ids;
16-
use crate::io::os_output::{wrap_missing, FullOsOutput, OsOutput};
1715
use crate::io::os_output_types::TryFromOutputIter;
1816
use crate::vm_utils::LoadIntoVmMemory;
1917

@@ -51,32 +49,13 @@ pub(crate) fn get_os_output_for_inner_blocks(
5149
.take()
5250
.ok_or(OsHintError::AggregatorBootloaderInputAlreadyConsumed)?
5351
.into_iter();
54-
let n_outputs = wrap_missing(bootloader_iter.next(), "n_output")?;
55-
let n_outputs_usize = felt_to_usize(&n_outputs)?;
56-
assert!(n_outputs_usize > 0, "No tasks found in the bootloader output.");
57-
58-
let mut program_hash: Option<Felt> = None;
59-
let mut outputs = FullOsOutputs(Vec::<FullOsOutput>::with_capacity(n_outputs_usize));
60-
for _ in 0..n_outputs_usize {
61-
wrap_missing(bootloader_iter.next(), "output_size")?;
62-
let current_output_program_hash = wrap_missing(bootloader_iter.next(), "program_hash")?;
63-
assert_eq!(
64-
program_hash.get_or_insert(current_output_program_hash),
65-
&current_output_program_hash
66-
);
67-
// Regardless of encryption mode: OS outputs that reach the aggregator are never encrypted.
68-
// No need to pass any decryption data here.
69-
outputs.0.push(OsOutput::try_from_output_iter(&mut bootloader_iter, None)?.try_into()?);
70-
}
7152

72-
insert_value_from_var_name(
73-
Ids::OsProgramHash.into(),
74-
program_hash.expect("n_outputs > 0 but program hash wasn't initialized."),
75-
vm,
76-
ids_data,
77-
ap_tracking,
78-
)?;
53+
// Regardless of encryption mode: OS outputs that reach the aggregator are never
54+
// encrypted. No need to pass any decryption data here.
55+
let FullOsOutputsData { outputs, n_outputs, program_hash } =
56+
FullOsOutputsData::try_from_output_iter(&mut bootloader_iter, None)?;
7957

58+
insert_value_from_var_name(Ids::OsProgramHash.into(), program_hash, vm, ids_data, ap_tracking)?;
8059
insert_value_from_var_name(Ids::NTasks.into(), n_outputs, vm, ids_data, ap_tracking)?;
8160

8261
let os_output_ptr = get_ptr_from_var_name(Ids::OsOutputs.into(), vm, ids_data, ap_tracking)?;

crates/starknet_os/src/hints/hint_implementation/aggregator/utils.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use std::collections::hash_map::Entry;
22
use std::collections::HashMap;
33

4+
use cairo_vm::hint_processor::hint_processor_utils::felt_to_usize;
45
use cairo_vm::types::errors::math_errors::MathError;
56
use cairo_vm::types::relocatable::{MaybeRelocatable, Relocatable};
67
use cairo_vm::vm::vm_core::VirtualMachine;
@@ -10,15 +11,19 @@ use starknet_types_core::felt::Felt;
1011

1112
use crate::hint_processor::state_update_pointers::{StateEntryPtr, StoragePtr};
1213
use crate::io::os_output::{
14+
wrap_missing,
1315
FullOsOutput,
1416
MessageToL2,
17+
OsOutput,
18+
OsOutputError,
1519
MESSAGE_TO_L1_CONST_FIELD_SIZE,
1620
MESSAGE_TO_L2_CONST_FIELD_SIZE,
1721
};
1822
use crate::io::os_output_types::{
1923
FullCompiledClassHashUpdate,
2024
FullContractChanges,
2125
FullContractStorageUpdate,
26+
TryFromOutputIter,
2227
};
2328
use crate::vm_utils::{LoadIntoVmMemory, VmUtilsResult};
2429

@@ -300,3 +305,37 @@ impl LoadIntoVmMemory for FullOsOutputs {
300305
Ok(os_output_ptr)
301306
}
302307
}
308+
309+
pub struct FullOsOutputsData {
310+
pub outputs: FullOsOutputs,
311+
pub n_outputs: usize,
312+
pub program_hash: Felt,
313+
}
314+
315+
impl TryFromOutputIter for FullOsOutputsData {
316+
fn try_from_output_iter<It: Iterator<Item = Felt>>(
317+
iter: &mut It,
318+
private_keys: Option<&Vec<Felt>>,
319+
) -> Result<Self, OsOutputError> {
320+
let n_outputs = wrap_missing(iter.next(), "n_output")?;
321+
let n_outputs_usize = felt_to_usize(&n_outputs)?;
322+
assert!(n_outputs_usize > 0, "No tasks found in the bootloader output.");
323+
324+
let mut program_hash: Option<Felt> = None;
325+
let mut outputs = FullOsOutputs(Vec::<FullOsOutput>::with_capacity(n_outputs_usize));
326+
for _ in 0..n_outputs_usize {
327+
wrap_missing(iter.next(), "output_size")?;
328+
let current_output_program_hash = wrap_missing(iter.next(), "program_hash")?;
329+
assert_eq!(
330+
program_hash.get_or_insert(current_output_program_hash),
331+
&current_output_program_hash
332+
);
333+
outputs.0.push(OsOutput::try_from_output_iter(iter, private_keys)?.try_into()?);
334+
}
335+
Ok(Self {
336+
outputs,
337+
n_outputs: n_outputs_usize,
338+
program_hash: program_hash.expect("n_outputs > 0 but program hash wasn't initialized."),
339+
})
340+
}
341+
}

crates/starknet_os/src/io/os_output.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use std::sync::LazyLock;
22

33
use cairo_vm::types::builtin_name::BuiltinName;
4+
use cairo_vm::types::errors::math_errors::MathError;
45
use cairo_vm::types::relocatable::{MaybeRelocatable, Relocatable};
56
use cairo_vm::vm::errors::memory_errors::MemoryError;
67
use cairo_vm::vm::errors::vm_errors::VirtualMachineError;
@@ -38,6 +39,8 @@ pub static STARKNET_OS_CONFIG_HASH_VERSION: LazyLock<Felt> = LazyLock::new(|| {
3839

3940
#[derive(Debug, thiserror::Error)]
4041
pub enum OsOutputError {
42+
#[error(transparent)]
43+
Math(#[from] MathError),
4144
#[error("Missing expected field: {0}.")]
4245
MissingFieldInOutput(String),
4346
#[error("Invalid output in field: {value_name}. Val: {val}. Error: {message}")]

0 commit comments

Comments
 (0)