Skip to content

Commit bc76f31

Browse files
feat(starknet_os): os_logger: implement ResourceCounter::new (#5279)
1 parent 6eec4c7 commit bc76f31

File tree

2 files changed

+135
-0
lines changed

2 files changed

+135
-0
lines changed

crates/starknet_os/src/hint_processor/os_logger.rs

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,33 @@ use std::collections::HashMap;
22

33
use blockifier::execution::syscalls::SyscallSelector;
44
use blockifier::transaction::transaction_types::TransactionType;
5+
use cairo_vm::hint_processor::hint_processor_definition::HintReference;
6+
use cairo_vm::serde::deserialize_program::ApTracking;
7+
use cairo_vm::types::builtin_name::BuiltinName;
8+
use cairo_vm::types::program::Program;
9+
use cairo_vm::types::relocatable::Relocatable;
510
use cairo_vm::vm::runners::cairo_runner::ExecutionResources;
11+
use cairo_vm::vm::vm_core::VirtualMachine;
612
use starknet_api::transaction::TransactionHash;
713

14+
use crate::hints::error::OsHintError;
15+
use crate::hints::vars::{CairoStruct, Ids};
16+
use crate::vm_utils::get_address_of_nested_fields;
17+
818
#[derive(Debug, thiserror::Error)]
919
pub enum OsLoggerError {
20+
#[error("Failed to build builtin pointer map: {0}.")]
21+
BuiltinPtrs(OsHintError),
1022
#[error("SyscallTrace should be finalized only once.")]
1123
DoubleFinalize,
24+
#[error("Failed to fetch identifier data for struct {0}.")]
25+
InnerBuiltinPtrsIdentifierMissing(String),
26+
#[error("The `members` field is None in identifier data for struct {0}.")]
27+
MissingMembers(String),
1228
#[error("SyscallTrace should be finalized before accessing resources.")]
1329
ResourceAccessBeforeFinalize,
30+
#[error("{0}")]
31+
UnknownBuiltin(String),
1432
}
1533

1634
pub type OsLoggerResult<T> = Result<T, OsLoggerError>;
@@ -129,3 +147,106 @@ impl TryFrom<OsTransactionTrace> for String {
129147
))
130148
}
131149
}
150+
151+
#[allow(dead_code)]
152+
pub struct ResourceCounter {
153+
n_steps: usize,
154+
range_check_ptr: Relocatable,
155+
builtin_ptrs_dict: HashMap<BuiltinName, Relocatable>,
156+
}
157+
158+
impl ResourceCounter {
159+
#[allow(dead_code)]
160+
pub(crate) fn new(
161+
n_steps: usize,
162+
range_check_ptr: Relocatable,
163+
ids_data: &HashMap<String, HintReference>,
164+
vm: &VirtualMachine,
165+
ap_tracking: &ApTracking,
166+
os_program: &Program,
167+
) -> OsLoggerResult<Self> {
168+
Ok(Self {
169+
n_steps,
170+
range_check_ptr,
171+
builtin_ptrs_dict: Self::build_builtin_ptrs_dict(
172+
ids_data,
173+
vm,
174+
ap_tracking,
175+
os_program,
176+
)?,
177+
})
178+
}
179+
180+
fn build_builtin_ptrs_dict(
181+
ids_data: &HashMap<String, HintReference>,
182+
vm: &VirtualMachine,
183+
ap_tracking: &ApTracking,
184+
os_program: &Program,
185+
) -> OsLoggerResult<HashMap<BuiltinName, Relocatable>> {
186+
let mut builtin_ptrs_dict: HashMap<BuiltinName, Relocatable> = HashMap::new();
187+
188+
// The `BuiltinPointers` struct has two fields: selectable and non-selectable builtins.
189+
Self::insert_builtins(
190+
"selectable",
191+
CairoStruct::SelectableBuiltins,
192+
&mut builtin_ptrs_dict,
193+
ids_data,
194+
vm,
195+
ap_tracking,
196+
os_program,
197+
)?;
198+
Self::insert_builtins(
199+
"non_selectable",
200+
CairoStruct::NonSelectableBuiltins,
201+
&mut builtin_ptrs_dict,
202+
ids_data,
203+
vm,
204+
ap_tracking,
205+
os_program,
206+
)?;
207+
208+
Ok(builtin_ptrs_dict)
209+
}
210+
211+
fn insert_builtins(
212+
inner_field_name: &str,
213+
inner_field_type: CairoStruct,
214+
builtin_ptrs_dict: &mut HashMap<BuiltinName, Relocatable>,
215+
ids_data: &HashMap<String, HintReference>,
216+
vm: &VirtualMachine,
217+
ap_tracking: &ApTracking,
218+
os_program: &Program,
219+
) -> OsLoggerResult<()> {
220+
// We want all pointers except `segment_arena` and `sha256`.
221+
let excluded_builtins = ["segment_arena", "sha256"];
222+
let inner_struct_name: &str = inner_field_type.into();
223+
let inner_members = os_program
224+
.get_identifier(inner_struct_name)
225+
.ok_or(OsLoggerError::InnerBuiltinPtrsIdentifierMissing(inner_struct_name.into()))?
226+
.members
227+
.as_ref()
228+
.ok_or(OsLoggerError::MissingMembers(inner_struct_name.into()))?;
229+
230+
for member_name in inner_members.keys() {
231+
if excluded_builtins.contains(&member_name.as_str()) {
232+
continue;
233+
}
234+
let member_ptr = get_address_of_nested_fields(
235+
ids_data,
236+
Ids::BuiltinPtrs,
237+
CairoStruct::BuiltinPointersPtr,
238+
vm,
239+
ap_tracking,
240+
&[inner_field_name, member_name.as_str()],
241+
os_program,
242+
)
243+
.map_err(OsLoggerError::BuiltinPtrs)?;
244+
builtin_ptrs_dict.insert(
245+
BuiltinName::from_str(member_name)
246+
.ok_or_else(|| OsLoggerError::UnknownBuiltin(member_name.clone()))?,
247+
member_ptr,
248+
);
249+
}
250+
Ok(())
251+
}
252+
}

crates/starknet_os/src/hints/vars.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ pub enum Ids {
8282
Bit,
8383
BucketIndex,
8484
BuiltinCosts,
85+
BuiltinPtrs,
8586
CompiledClass,
8687
CompiledClassFact,
8788
CompressedDst,
@@ -141,6 +142,7 @@ impl From<Ids> for &'static str {
141142
Ids::Bit => "bit",
142143
Ids::BucketIndex => "bucket_index",
143144
Ids::BuiltinCosts => "builtin_costs",
145+
Ids::BuiltinPtrs => "builtin_ptrs",
144146
Ids::CompiledClass => "compiled_class",
145147
Ids::CompiledClassFact => "compiled_class_fact",
146148
Ids::CompressedDst => "compressed_dst",
@@ -285,6 +287,7 @@ impl Const {
285287
#[derive(Copy, Clone)]
286288
pub enum CairoStruct {
287289
BigInt3,
290+
BuiltinPointersPtr,
288291
CompiledClass,
289292
CompiledClassEntryPoint,
290293
CompiledClassFact,
@@ -294,8 +297,10 @@ pub enum CairoStruct {
294297
DictAccess,
295298
ExecutionContext,
296299
NodeEdge,
300+
NonSelectableBuiltins,
297301
OsStateUpdate,
298302
ResourceBounds,
303+
SelectableBuiltins,
299304
StateEntry,
300305
StorageReadPtr,
301306
StorageReadRequestPtr,
@@ -308,6 +313,9 @@ impl From<CairoStruct> for &'static str {
308313
CairoStruct::BigInt3 => {
309314
"starkware.starknet.core.os.data_availability.bls_field.BigInt3"
310315
}
316+
CairoStruct::BuiltinPointersPtr => {
317+
"starkware.starknet.core.os.builtins.BuiltinPointers*"
318+
}
311319
CairoStruct::CompiledClass => {
312320
"starkware.starknet.core.os.contract_class.compiled_class.CompiledClass"
313321
}
@@ -334,8 +342,14 @@ impl From<CairoStruct> for &'static str {
334342
"starkware.starknet.core.os.execution.execute_entry_point.ExecutionContext"
335343
}
336344
CairoStruct::NodeEdge => "starkware.cairo.common.patricia_utils.NodeEdge",
345+
CairoStruct::NonSelectableBuiltins => {
346+
"starkware.starknet.core.os.builtins.NonSelectableBuiltins"
347+
}
337348
CairoStruct::OsStateUpdate => "starkware.starknet.core.os.state.state.OsStateUpdate",
338349
CairoStruct::ResourceBounds => "starkware.starknet.common.new_syscalls.ResourceBounds",
350+
CairoStruct::SelectableBuiltins => {
351+
"starkware.starknet.core.os.builtins.SelectableBuiltins"
352+
}
339353
CairoStruct::StateEntry => "starkware.starknet.core.os.state.state.StateEntry",
340354
CairoStruct::StorageReadPtr => "starkware.starknet.common.syscalls.StorageRead*",
341355
CairoStruct::StorageReadRequestPtr => {

0 commit comments

Comments
 (0)