Skip to content

Commit 6f587d2

Browse files
feat(starknet_os): os_logger: implement ResourceCounter::new
1 parent f7f26d0 commit 6f587d2

File tree

2 files changed

+130
-0
lines changed

2 files changed

+130
-0
lines changed

crates/starknet_os/src/hint_processor/os_logger.rs

Lines changed: 116 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,101 @@ 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(true, &mut builtin_ptrs_dict, ids_data, vm, ap_tracking, os_program)?;
190+
Self::insert_builtins(
191+
false,
192+
&mut builtin_ptrs_dict,
193+
ids_data,
194+
vm,
195+
ap_tracking,
196+
os_program,
197+
)?;
198+
199+
Ok(builtin_ptrs_dict)
200+
}
201+
202+
fn insert_builtins(
203+
selectable: bool,
204+
builtin_ptrs_dict: &mut HashMap<BuiltinName, Relocatable>,
205+
ids_data: &HashMap<String, HintReference>,
206+
vm: &VirtualMachine,
207+
ap_tracking: &ApTracking,
208+
os_program: &Program,
209+
) -> OsLoggerResult<()> {
210+
let (inner_field_name, inner_struct) = if selectable {
211+
("selectable", CairoStruct::SelectableBuiltins)
212+
} else {
213+
("non_selectable", CairoStruct::NonSelectableBuiltins)
214+
};
215+
216+
// We want all pointers except `segment_arena` and `sha256`.
217+
let inner_struct_name: &str = inner_struct.into();
218+
let inner_members = os_program
219+
.get_identifier(inner_struct_name)
220+
.ok_or(OsLoggerError::InnerBuiltinPtrsIdentifierMissing(inner_struct_name.into()))?
221+
.members
222+
.as_ref()
223+
.ok_or(OsLoggerError::MissingMembers(inner_struct_name.into()))?;
224+
225+
for member_name in inner_members.keys() {
226+
if member_name == "segment_arena" || member_name == "sha256" {
227+
continue;
228+
}
229+
let member_ptr = get_address_of_nested_fields(
230+
ids_data,
231+
Ids::BuiltinPtrs,
232+
CairoStruct::BuiltinPointersPtr,
233+
vm,
234+
ap_tracking,
235+
&[inner_field_name, member_name.as_str()],
236+
os_program,
237+
)
238+
.map_err(OsLoggerError::BuiltinPtrs)?;
239+
builtin_ptrs_dict.insert(
240+
BuiltinName::from_str(member_name)
241+
.ok_or(OsLoggerError::UnknownBuiltin(member_name.clone()))?,
242+
member_ptr,
243+
);
244+
}
245+
Ok(())
246+
}
247+
}

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)