Skip to content

Commit

Permalink
feat(starknet_os): integrate patricia hints
Browse files Browse the repository at this point in the history
  • Loading branch information
dorimedini-starkware committed Jan 28, 2025
1 parent 0aba07e commit 5dd99d8
Show file tree
Hide file tree
Showing 3 changed files with 201 additions and 1 deletion.
1 change: 1 addition & 0 deletions crates/starknet_os/src/hints.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,6 @@ pub mod kzg;
pub mod math;
pub mod os;
pub mod output;
pub mod patricia;
pub mod stateless_compression;
pub mod types;
92 changes: 91 additions & 1 deletion crates/starknet_os/src/hints/enum_definition.rs
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,18 @@ use crate::hints::output::{
set_state_updates_start,
set_tree_structure,
};
use crate::hints::patricia::{
assert_case_is_right,
build_descent_map,
height_is_zero_or_len_node_preimage_is_two,
is_case_right,
prepare_preimage_validation_non_deterministic_hashes,
set_ap_to_descend,
set_bit,
set_siblings,
split_descend,
write_case_not_left_to_ap,
};
use crate::hints::stateless_compression::{
compression_hint,
dictionary_from_bucket,
Expand Down Expand Up @@ -1080,7 +1092,85 @@ else:
SetNUpdatesSmall,
set_n_updates_small,
indoc! {r#"ids.is_n_updates_small = ids.n_actual_updates < ids.N_UPDATES_SMALL_PACKING_BOUND"#}
)
),
(SetSiblings, set_siblings, "memory[ids.siblings], ids.word = descend"),
(IsCaseRight, is_case_right, "memory[ap] = int(case == 'right') ^ ids.bit"),
(SetBit, set_bit, "ids.bit = (ids.edge.path >> ids.new_length) & 1"),
(
SetApToDescend,
set_ap_to_descend,
indoc! {r#"
descend = descent_map.get((ids.height, ids.path))
memory[ap] = 0 if descend is None else 1"#
}
),
(AssertCaseIsRight, assert_case_is_right, "assert case == 'right'"),
(
WriteCaseNotLeftToAp,
write_case_not_left_to_ap,
indoc! {r#"
memory[ap] = int(case != 'left')"#
}
),
(SplitDescend, split_descend, "ids.length, ids.word = descend"),
(
HeightIsZeroOrLenNodePreimageIsTwo,
height_is_zero_or_len_node_preimage_is_two,
"memory[ap] = 1 if ids.height == 0 or len(preimage[ids.node]) == 2 else 0"
),
(
PreparePreimageValidationNonDeterministicHashes,
prepare_preimage_validation_non_deterministic_hashes,
indoc! {r#"
from starkware.python.merkle_tree import decode_node
left_child, right_child, case = decode_node(node)
left_hash, right_hash = preimage[ids.node]
# Fill non deterministic hashes.
hash_ptr = ids.current_hash.address_
memory[hash_ptr + ids.HashBuiltin.x] = left_hash
memory[hash_ptr + ids.HashBuiltin.y] = right_hash
if __patricia_skip_validation_runner:
# Skip validation of the preimage dict to speed up the VM. When this flag is set,
# mistakes in the preimage dict will be discovered only in the prover.
__patricia_skip_validation_runner.verified_addresses.add(
hash_ptr + ids.HashBuiltin.result)
memory[ap] = int(case != 'both')"#
}
),
(
BuildDescentMap,
build_descent_map,
indoc! {r#"
from starkware.cairo.common.patricia_utils import canonic, patricia_guess_descents
from starkware.python.merkle_tree import build_update_tree
# Build modifications list.
modifications = []
DictAccess_key = ids.DictAccess.key
DictAccess_new_value = ids.DictAccess.new_value
DictAccess_SIZE = ids.DictAccess.SIZE
for i in range(ids.n_updates):
curr_update_ptr = ids.update_ptr.address_ + i * DictAccess_SIZE
modifications.append((
memory[curr_update_ptr + DictAccess_key],
memory[curr_update_ptr + DictAccess_new_value]))
node = build_update_tree(ids.height, modifications)
descent_map = patricia_guess_descents(
ids.height, node, preimage, ids.prev_root, ids.new_root)
del modifications
__patricia_skip_validation_runner = globals().get(
'__patricia_skip_validation_runner')
common_args = dict(
preimage=preimage, descent_map=descent_map,
__patricia_skip_validation_runner=__patricia_skip_validation_runner)
common_args['common_args'] = common_args"#
}
),
);

define_hint_extension_enum!(
Expand Down
109 changes: 109 additions & 0 deletions crates/starknet_os/src/hints/patricia.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
use std::collections::HashMap;

use cairo_vm::hint_processor::hint_processor_definition::HintReference;
use cairo_vm::serde::deserialize_program::ApTracking;
use cairo_vm::types::exec_scope::ExecutionScopes;
use cairo_vm::vm::vm_core::VirtualMachine;
use starknet_types_core::felt::Felt;

use crate::hints::error::HintResult;

pub fn set_siblings(
_vm: &mut VirtualMachine,
_exec_scopes: &mut ExecutionScopes,
_ids_data: &HashMap<String, HintReference>,
_ap_tracking: &ApTracking,
_constants: &HashMap<String, Felt>,
) -> HintResult {
todo!()
}

pub fn is_case_right(
_vm: &mut VirtualMachine,
_exec_scopes: &mut ExecutionScopes,
_ids_data: &HashMap<String, HintReference>,
_ap_tracking: &ApTracking,
_constants: &HashMap<String, Felt>,
) -> HintResult {
todo!()
}

pub fn set_bit(
_vm: &mut VirtualMachine,
_exec_scopes: &mut ExecutionScopes,
_ids_data: &HashMap<String, HintReference>,
_ap_tracking: &ApTracking,
_constants: &HashMap<String, Felt>,
) -> HintResult {
todo!()
}

pub fn set_ap_to_descend(
_vm: &mut VirtualMachine,
_exec_scopes: &mut ExecutionScopes,
_ids_data: &HashMap<String, HintReference>,
_ap_tracking: &ApTracking,
_constants: &HashMap<String, Felt>,
) -> HintResult {
todo!()
}

pub fn assert_case_is_right(
_vm: &mut VirtualMachine,
_exec_scopes: &mut ExecutionScopes,
_ids_data: &HashMap<String, HintReference>,
_ap_tracking: &ApTracking,
_constants: &HashMap<String, Felt>,
) -> HintResult {
todo!()
}

pub fn write_case_not_left_to_ap(
_vm: &mut VirtualMachine,
_exec_scopes: &mut ExecutionScopes,
_ids_data: &HashMap<String, HintReference>,
_ap_tracking: &ApTracking,
_constants: &HashMap<String, Felt>,
) -> HintResult {
todo!()
}

pub fn split_descend(
_vm: &mut VirtualMachine,
_exec_scopes: &mut ExecutionScopes,
_ids_data: &HashMap<String, HintReference>,
_ap_tracking: &ApTracking,
_constants: &HashMap<String, Felt>,
) -> HintResult {
todo!()
}

pub fn height_is_zero_or_len_node_preimage_is_two(
_vm: &mut VirtualMachine,
_exec_scopes: &mut ExecutionScopes,
_ids_data: &HashMap<String, HintReference>,
_ap_tracking: &ApTracking,
_constants: &HashMap<String, Felt>,
) -> HintResult {
todo!()
}

pub fn prepare_preimage_validation_non_deterministic_hashes(
_vm: &mut VirtualMachine,
_exec_scopes: &mut ExecutionScopes,
_ids_data: &HashMap<String, HintReference>,
_ap_tracking: &ApTracking,
_constants: &HashMap<String, Felt>,
) -> HintResult {
todo!()
}

pub fn build_descent_map(
_vm: &mut VirtualMachine,
_exec_scopes: &mut ExecutionScopes,
_ids_data: &HashMap<String, HintReference>,
_ap_tracking: &ApTracking,
_constants: &HashMap<String, Felt>,
) -> HintResult {
todo!()
}

0 comments on commit 5dd99d8

Please sign in to comment.