Skip to content

Commit a2ea4e1

Browse files
authored
starknet_committer: add utility that returns sorted leaf indices (#13992)
1 parent fd6bc34 commit a2ea4e1

1 file changed

Lines changed: 73 additions & 30 deletions

File tree

  • crates/starknet_committer/src/patricia_merkle_tree

crates/starknet_committer/src/patricia_merkle_tree/tree.rs

Lines changed: 73 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ use starknet_api::core::{ClassHash, ContractAddress};
44
use starknet_api::hash::HashOutput;
55
use starknet_patricia::patricia_merkle_tree::original_skeleton_tree::config::OriginalSkeletonTreeConfig;
66
use starknet_patricia::patricia_merkle_tree::traversal::TraversalResult;
7-
use starknet_patricia::patricia_merkle_tree::types::{NodeIndex, SortedLeafIndices};
7+
use starknet_patricia::patricia_merkle_tree::types::NodeIndex;
8+
pub use starknet_patricia::patricia_merkle_tree::types::SortedLeafIndices;
89
use starknet_patricia_storage::db_object::EmptyKeyContext;
910
use starknet_patricia_storage::storage_trait::ReadOnlyStorage;
1011

@@ -50,10 +51,64 @@ impl OriginalSkeletonTreeConfig for OriginalSkeletonTrieConfig {
5051
}
5152
}
5253

54+
/// Requested trie leaves for Patricia witness collection (classes trie, contracts trie, and
55+
/// per-contract storage leaves). Built via [`LeavesRequest::from_accessed_leaves`].
56+
#[derive(Clone)]
57+
pub struct LeavesRequest {
58+
pub class_leaf_indices: Vec<NodeIndex>,
59+
pub contract_leaf_indices: Vec<NodeIndex>,
60+
pub contract_storage_leaf_indices: HashMap<NodeIndex, Vec<NodeIndex>>,
61+
}
62+
63+
pub struct SortedLeavesRequest<'a> {
64+
pub class_sorted: SortedLeafIndices<'a>,
65+
pub contract_sorted: SortedLeafIndices<'a>,
66+
pub storage_sorted: HashMap<NodeIndex, SortedLeafIndices<'a>>,
67+
}
68+
69+
impl LeavesRequest {
70+
/// Builds index buffers expected by [`fetch_all_patricia_paths`].
71+
pub fn from_accessed_leaves(
72+
class_hashes: &[ClassHash],
73+
contract_addresses: &[ContractAddress],
74+
contract_storage_keys: &HashMap<ContractAddress, Vec<StarknetStorageKey>>,
75+
) -> Self {
76+
let contract_leaf_indices: Vec<NodeIndex> =
77+
contract_addresses.iter().map(contract_address_into_node_index).collect();
78+
let contract_storage_leaf_indices: HashMap<NodeIndex, Vec<NodeIndex>> =
79+
contract_storage_keys
80+
.iter()
81+
.map(|(address, keys)| {
82+
let node_index = contract_address_into_node_index(address);
83+
let leaf_indices: Vec<_> = keys.iter().map(NodeIndex::from).collect();
84+
(node_index, leaf_indices)
85+
})
86+
.collect();
87+
Self {
88+
class_leaf_indices: class_hashes.iter().map(class_hash_into_node_index).collect(),
89+
contract_leaf_indices,
90+
contract_storage_leaf_indices,
91+
}
92+
}
93+
}
94+
95+
impl<'a> From<&'a mut LeavesRequest> for SortedLeavesRequest<'a> {
96+
fn from(leaves_request: &'a mut LeavesRequest) -> Self {
97+
let class_sorted = SortedLeafIndices::new(&mut leaves_request.class_leaf_indices);
98+
let contract_sorted = SortedLeafIndices::new(&mut leaves_request.contract_leaf_indices);
99+
let storage_sorted: HashMap<_, _> = leaves_request
100+
.contract_storage_leaf_indices
101+
.iter_mut()
102+
.map(|(address, leaf_indices)| (*address, SortedLeafIndices::new(leaf_indices)))
103+
.collect();
104+
Self { class_sorted, contract_sorted, storage_sorted }
105+
}
106+
}
107+
53108
/// Fetch all tries patricia paths given the modified leaves.
54109
/// Fetch the leaves in the contracts trie only, to be able to get the storage root hashes.
55-
/// Assumption: `contract_sorted_leaf_indices` contains all `contract_storage_sorted_leaf_indices`
56-
/// keys.
110+
/// Assumption: `contract_sorted_leaf_indices` lists every contract that appears in
111+
/// `contract_storage_sorted_leaf_indices`.
57112
pub async fn fetch_all_patricia_paths<Layout>(
58113
storage: &mut impl ReadOnlyStorage,
59114
classes_trie_root_hash: HashOutput,
@@ -179,43 +234,31 @@ pub async fn fetch_previous_and_new_patricia_paths(
179234
contract_addresses: &[ContractAddress],
180235
contract_storage_keys: &HashMap<ContractAddress, Vec<StarknetStorageKey>>,
181236
) -> TraversalResult<StarknetForestProofs> {
182-
let mut class_leaf_indices: Vec<NodeIndex> =
183-
class_hashes.iter().map(class_hash_into_node_index).collect();
184-
let class_sorted_leaf_indices = SortedLeafIndices::new(&mut class_leaf_indices);
185-
186-
let mut contract_leaf_indices: Vec<NodeIndex> =
187-
contract_addresses.iter().map(contract_address_into_node_index).collect();
188-
let contract_sorted_leaf_indices = SortedLeafIndices::new(&mut contract_leaf_indices);
189-
190-
let mut contract_storage_leaf_indices: HashMap<NodeIndex, Vec<NodeIndex>> =
191-
contract_storage_keys
192-
.iter()
193-
.map(|(address, keys)| {
194-
let node_index = contract_address_into_node_index(address);
195-
let leaf_indices: Vec<_> = keys.iter().map(NodeIndex::from).collect();
196-
(node_index, leaf_indices)
197-
})
198-
.collect();
199-
let contract_storage_sorted_leaf_indices = &contract_storage_leaf_indices
200-
.iter_mut()
201-
.map(|(address, leaf_indices)| (*address, SortedLeafIndices::new(leaf_indices)))
202-
.collect();
237+
let mut leaves_request = LeavesRequest::from_accessed_leaves(
238+
class_hashes,
239+
contract_addresses,
240+
contract_storage_keys,
241+
);
242+
243+
let SortedLeavesRequest { class_sorted, contract_sorted, storage_sorted } =
244+
SortedLeavesRequest::from(&mut leaves_request);
203245
let prev_proofs = fetch_all_patricia_paths::<FactsNodeLayout>(
204246
storage,
205247
classes_trie_root_hashes.previous_root_hash,
206248
contracts_trie_root_hashes.previous_root_hash,
207-
class_sorted_leaf_indices,
208-
contract_sorted_leaf_indices,
209-
contract_storage_sorted_leaf_indices,
249+
class_sorted,
250+
contract_sorted,
251+
&storage_sorted,
210252
)
211253
.await?;
254+
212255
let new_proofs = fetch_all_patricia_paths::<FactsNodeLayout>(
213256
storage,
214257
classes_trie_root_hashes.new_root_hash,
215258
contracts_trie_root_hashes.new_root_hash,
216-
class_sorted_leaf_indices,
217-
contract_sorted_leaf_indices,
218-
contract_storage_sorted_leaf_indices,
259+
class_sorted,
260+
contract_sorted,
261+
&storage_sorted,
219262
)
220263
.await?;
221264

0 commit comments

Comments
 (0)