Skip to content

Commit 0d7ef4c

Browse files
committed
apollo_committer,starknet_committer: use blockifier's AccessedKeys
1 parent 2d7d8df commit 0d7ef4c

9 files changed

Lines changed: 72 additions & 109 deletions

File tree

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/apollo_committer/src/committer.rs

Lines changed: 9 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,32 +3,27 @@ use std::error::Error;
33
use std::path::PathBuf;
44

55
use apollo_committer_config::config::{ApolloStorage, CommitterConfig};
6-
#[cfg(feature = "os_input")]
7-
use apollo_committer_types::committer_types::{
8-
AccessedKeys,
9-
ReadPathsAndCommitBlockRequest,
10-
ReadPathsAndCommitBlockResponse,
11-
};
126
use apollo_committer_types::committer_types::{
137
CommitBlockRequest,
148
CommitBlockResponse,
159
RevertBlockRequest,
1610
RevertBlockResponse,
1711
};
12+
#[cfg(feature = "os_input")]
13+
use apollo_committer_types::committer_types::{
14+
ReadPathsAndCommitBlockRequest,
15+
ReadPathsAndCommitBlockResponse,
16+
};
1817
use apollo_committer_types::errors::{CommitterError, CommitterResult};
1918
use apollo_infra::component_definitions::{default_component_start_fn, ComponentStarter};
2019
use async_trait::async_trait;
2120
use starknet_api::block::BlockNumber;
2221
use starknet_api::block_hash::state_diff_hash::calculate_state_diff_hash;
23-
#[cfg(feature = "os_input")]
24-
use starknet_api::core::ContractAddress;
2522
use starknet_api::core::{GlobalRoot, StateDiffCommitment};
2623
use starknet_api::hash::PoseidonHash;
2724
use starknet_api::state::ThinStateDiff;
2825
use starknet_committer::block_committer::commit::commit_block;
2926
use starknet_committer::block_committer::input::Input;
30-
#[cfg(feature = "os_input")]
31-
use starknet_committer::block_committer::input::StarknetStorageKey;
3227
use starknet_committer::block_committer::measurements_util::{
3328
Action,
3429
BlockDurations,
@@ -59,7 +54,7 @@ use starknet_committer::db::serde_db_utils::{
5954
use starknet_committer::forest::deleted_nodes::DeletedNodes;
6055
use starknet_committer::forest::filled_forest::FilledForest;
6156
#[cfg(feature = "os_input")]
62-
use starknet_committer::patricia_merkle_tree::tree::{LeavesRequest, SortedLeavesRequest};
57+
use starknet_committer::patricia_merkle_tree::tree::LeavesRequest;
6358
#[cfg(feature = "os_input")]
6459
use starknet_patricia_storage::errors::SerializationError;
6560
use starknet_patricia_storage::map_storage::CachedStorage;
@@ -512,29 +507,16 @@ where
512507
&mut self,
513508
ReadPathsAndCommitBlockRequest {
514509
commit: CommitBlockRequest { state_diff, state_diff_commitment, height },
515-
accessed_keys: AccessedKeys { storage_keys, accessed_contracts, accessed_class_hashes },
510+
accessed_keys,
516511
}: ReadPathsAndCommitBlockRequest,
517512
) -> CommitterResult<ReadPathsAndCommitBlockResponse> {
518-
let class_hashes: Vec<_> = accessed_class_hashes.iter().copied().collect();
519-
let contract_addresses: Vec<_> = accessed_contracts.iter().copied().collect();
520-
let contract_storage_keys = storage_keys.iter().fold(
521-
HashMap::<ContractAddress, Vec<StarknetStorageKey>>::new(),
522-
|mut accumulator, (address, key)| {
523-
accumulator.entry(*address).or_default().push(StarknetStorageKey(*key));
524-
accumulator
525-
},
526-
);
527-
let mut leaves_request = LeavesRequest::from_accessed_leaves(
528-
&class_hashes,
529-
&contract_addresses,
530-
&contract_storage_keys,
531-
);
513+
let mut leaves_request = LeavesRequest::from(&accessed_keys);
532514
info!(
533515
"read_paths_and_commit_block: height {height}, accessed keys len {}, state diff len {}",
534516
leaves_request.total_leaf_count(),
535517
state_diff.len(),
536518
);
537-
let sorted_leaves: SortedLeavesRequest<'_> = (&mut leaves_request).into();
519+
let sorted_leaves = leaves_request.sorted();
538520
let digest = accessed_keys_digest(&sorted_leaves);
539521

540522
match self.commit_or_load(&state_diff, state_diff_commitment, height).await? {

crates/blockifier/src/state/accessed_keys.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@ use starknet_api::block::BlockNumber;
77
use starknet_api::core::{ClassHash, ContractAddress, BLOCK_HASH_TABLE_ADDRESS};
88
use starknet_api::state::StorageKey;
99

10-
#[cfg(any(feature = "testing", test))]
11-
use super::cached_state::StateChangesKeys;
12-
use super::cached_state::{CommitmentStateDiff, StorageEntry};
10+
use super::cached_state::{CommitmentStateDiff, StateChangesKeys, StorageEntry};
1311
use super::stateful_compression::predicted_alias_storage_entries;
1412
use crate::blockifier_versioned_constants::VersionedConstants;
1513
use crate::transaction::objects::TransactionExecutionInfo;
@@ -47,6 +45,19 @@ impl From<AccessedKeys> for StateChangesKeys {
4745
}
4846
}
4947

48+
impl From<StateChangesKeys> for AccessedKeys {
49+
fn from(state_changes_keys: StateChangesKeys) -> Self {
50+
Self {
51+
storage_keys: state_changes_keys.storage_keys.into_iter().collect(),
52+
accessed_contracts: state_changes_keys.modified_contracts.into_iter().collect(),
53+
accessed_class_hashes: state_changes_keys
54+
.compiled_class_hash_keys
55+
.into_iter()
56+
.collect(),
57+
}
58+
}
59+
}
60+
5061
impl AccessedKeys {
5162
/// Builds the [`AccessedKeys`] the OS needs to read at the execution of a block.
5263
pub fn new<'a>(

crates/starknet_committer/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ apollo_config.workspace = true
1515
async-trait.workspace = true
1616
bincode = { workspace = true, optional = true }
1717
blake2 = { workspace = true, optional = true }
18+
blockifier.workspace = true
1819
derive_more = { workspace = true, features = ["as_ref", "from", "into"] }
1920
digest = { workspace = true, optional = true }
2021
ethnum.workspace = true

crates/starknet_committer/src/patricia_merkle_tree/tree.rs

Lines changed: 36 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use std::collections::HashMap;
22

3-
use starknet_api::core::{ClassHash, ContractAddress};
3+
use blockifier::state::accessed_keys::AccessedKeys;
4+
use starknet_api::core::ContractAddress;
45
use starknet_api::hash::HashOutput;
56
use starknet_patricia::patricia_merkle_tree::original_skeleton_tree::config::OriginalSkeletonTreeConfig;
67
use starknet_patricia::patricia_merkle_tree::traversal::TraversalResult;
@@ -52,7 +53,7 @@ impl OriginalSkeletonTreeConfig for OriginalSkeletonTrieConfig {
5253
}
5354

5455
/// Requested trie leaves for Patricia witness collection (classes trie, contracts trie, and
55-
/// per-contract storage leaves). Built via [`LeavesRequest::from_accessed_leaves`].
56+
/// per-contract storage leaves). Built via [`From`] from [`AccessedKeys`].
5657
#[derive(Clone)]
5758
pub struct LeavesRequest {
5859
pub class_leaf_indices: Vec<NodeIndex>,
@@ -67,31 +68,35 @@ pub struct SortedLeavesRequest<'a> {
6768
pub storage_sorted: HashMap<NodeIndex, SortedLeafIndices<'a>>,
6869
}
6970

70-
impl LeavesRequest {
71-
/// Builds index buffers expected by [`fetch_all_patricia_paths`].
72-
pub fn from_accessed_leaves(
73-
class_hashes: &[ClassHash],
74-
contract_addresses: &[ContractAddress],
75-
contract_storage_keys: &HashMap<ContractAddress, Vec<StarknetStorageKey>>,
76-
) -> Self {
77-
let contract_leaf_indices: Vec<NodeIndex> =
78-
contract_addresses.iter().map(contract_address_into_node_index).collect();
79-
let contract_storage_leaf_indices: HashMap<NodeIndex, Vec<NodeIndex>> =
80-
contract_storage_keys
81-
.iter()
82-
.map(|(address, keys)| {
83-
let node_index = contract_address_into_node_index(address);
84-
let leaf_indices: Vec<_> = keys.iter().map(NodeIndex::from).collect();
85-
(node_index, leaf_indices)
86-
})
87-
.collect();
71+
impl From<&AccessedKeys> for LeavesRequest {
72+
fn from(accessed_keys: &AccessedKeys) -> Self {
73+
let contract_storage_leaf_indices: HashMap<NodeIndex, Vec<NodeIndex>> = accessed_keys
74+
.storage_keys
75+
.iter()
76+
.fold(HashMap::new(), |mut accumulator, (address, key)| {
77+
accumulator
78+
.entry(contract_address_into_node_index(address))
79+
.or_default()
80+
.push(NodeIndex::from(&StarknetStorageKey(*key)));
81+
accumulator
82+
});
8883
Self {
89-
class_leaf_indices: class_hashes.iter().map(class_hash_into_node_index).collect(),
90-
contract_leaf_indices,
84+
class_leaf_indices: accessed_keys
85+
.accessed_class_hashes
86+
.iter()
87+
.map(class_hash_into_node_index)
88+
.collect(),
89+
contract_leaf_indices: accessed_keys
90+
.accessed_contracts
91+
.iter()
92+
.map(contract_address_into_node_index)
93+
.collect(),
9194
contract_storage_leaf_indices,
9295
}
9396
}
97+
}
9498

99+
impl LeavesRequest {
95100
/// Total number of trie leaves requested (classes, contracts, and storage slots).
96101
pub fn total_leaf_count(&self) -> usize {
97102
self.class_leaf_indices.len()
@@ -101,18 +106,17 @@ impl LeavesRequest {
101106
.values()
102107
.fold(0, |count, leaf_indices| count + leaf_indices.len())
103108
}
104-
}
105109

106-
impl<'a> From<&'a mut LeavesRequest> for SortedLeavesRequest<'a> {
107-
fn from(leaves_request: &'a mut LeavesRequest) -> Self {
108-
let class_sorted = SortedLeafIndices::new(&mut leaves_request.class_leaf_indices);
109-
let contract_sorted = SortedLeafIndices::new(&mut leaves_request.contract_leaf_indices);
110-
let storage_sorted: HashMap<_, _> = leaves_request
110+
/// Sorts leaf indices in place and returns borrowed views for Patricia traversal.
111+
pub fn sorted(&mut self) -> SortedLeavesRequest<'_> {
112+
let class_sorted = SortedLeafIndices::new(&mut self.class_leaf_indices);
113+
let contract_sorted = SortedLeafIndices::new(&mut self.contract_leaf_indices);
114+
let storage_sorted: HashMap<_, _> = self
111115
.contract_storage_leaf_indices
112116
.iter_mut()
113117
.map(|(address, leaf_indices)| (*address, SortedLeafIndices::new(leaf_indices)))
114118
.collect();
115-
Self { class_sorted, contract_sorted, storage_sorted }
119+
SortedLeavesRequest { class_sorted, contract_sorted, storage_sorted }
116120
}
117121
}
118122

@@ -241,18 +245,12 @@ pub async fn fetch_previous_and_new_patricia_paths(
241245
storage: &mut impl ReadOnlyStorage,
242246
classes_trie_root_hashes: RootHashes,
243247
contracts_trie_root_hashes: RootHashes,
244-
class_hashes: &[ClassHash],
245-
contract_addresses: &[ContractAddress],
246-
contract_storage_keys: &HashMap<ContractAddress, Vec<StarknetStorageKey>>,
248+
accessed_keys: &AccessedKeys,
247249
) -> TraversalResult<StarknetForestProofs> {
248-
let mut leaves_request = LeavesRequest::from_accessed_leaves(
249-
class_hashes,
250-
contract_addresses,
251-
contract_storage_keys,
252-
);
250+
let mut leaves_request = LeavesRequest::from(accessed_keys);
253251

254252
let SortedLeavesRequest { class_sorted, contract_sorted, storage_sorted } =
255-
SortedLeavesRequest::from(&mut leaves_request);
253+
leaves_request.sorted();
256254
let prev_proofs = fetch_all_patricia_paths::<FactsNodeLayout>(
257255
storage,
258256
classes_trie_root_hashes.previous_root_hash,

crates/starknet_os/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,6 @@ expect-test.workspace = true
8181
itertools.workspace = true
8282
num-bigint.workspace = true
8383
rstest.workspace = true
84-
starknet_committer.workspace = true
8584
starknet_patricia = { workspace = true, features = ["testing"] }
8685
tempfile.workspace = true
8786
tokio = { workspace = true, features = ["rt-multi-thread"] }

crates/starknet_os/src/commitment_infos.rs

Lines changed: 7 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
use std::collections::HashMap;
22

3-
use blockifier::state::cached_state::StateChangesKeys;
4-
use starknet_api::core::{ClassHash, ContractAddress};
3+
use blockifier::state::accessed_keys::AccessedKeys;
4+
use starknet_api::core::ContractAddress;
55
use starknet_api::hash::{HashOutput, StateRoots};
66
use starknet_committer::block_committer::input::{
77
contract_address_into_node_index,
88
try_node_index_into_contract_address,
9-
StarknetStorageKey,
109
};
1110
use starknet_committer::db::facts_db::create_facts_tree::get_leaves;
1211
use starknet_committer::patricia_merkle_tree::leaf::leaf_impl::ContractState;
1312
use starknet_committer::patricia_merkle_tree::tree::fetch_previous_and_new_patricia_paths;
14-
use starknet_committer::patricia_merkle_tree::types::{RootHashes, StarknetForestProofs};
13+
use starknet_committer::patricia_merkle_tree::types::RootHashes;
1514
use starknet_patricia::patricia_merkle_tree::node_data::inner_node::flatten_preimages;
1615
use starknet_patricia::patricia_merkle_tree::original_skeleton_tree::errors::OriginalSkeletonTreeError;
1716
use starknet_patricia::patricia_merkle_tree::traversal::TraversalError;
@@ -74,10 +73,10 @@ impl StateCommitmentInfos {
7473
previous_state_roots: &StateRoots,
7574
new_state_roots: &StateRoots,
7675
commitments: &mut MapStorage,
77-
initial_reads_keys: &StateChangesKeys,
76+
accessed_keys: &AccessedKeys,
7877
) -> Result<Self, CommitmentInfosError> {
7978
let addresses: Vec<ContractAddress> =
80-
initial_reads_keys.modified_contracts.iter().copied().collect();
79+
accessed_keys.accessed_contracts.iter().copied().collect();
8180

8281
let previous_storage_roots = get_storage_roots(
8382
&addresses,
@@ -89,8 +88,7 @@ impl StateCommitmentInfos {
8988
get_storage_roots(&addresses, new_state_roots.contracts_trie_root_hash, commitments)
9089
.await?;
9190

92-
let storage_proofs = fetch_storage_proofs_from_state_changes_keys(
93-
initial_reads_keys,
91+
let storage_proofs = fetch_previous_and_new_patricia_paths(
9492
commitments,
9593
RootHashes {
9694
previous_root_hash: previous_state_roots.classes_trie_root_hash,
@@ -100,6 +98,7 @@ impl StateCommitmentInfos {
10098
previous_root_hash: previous_state_roots.contracts_trie_root_hash,
10199
new_root_hash: new_state_roots.contracts_trie_root_hash,
102100
},
101+
accessed_keys,
103102
)
104103
.await?;
105104

@@ -172,32 +171,3 @@ async fn get_storage_roots(
172171
})
173172
.collect()
174173
}
175-
176-
async fn fetch_storage_proofs_from_state_changes_keys(
177-
initial_reads_keys: &StateChangesKeys,
178-
storage: &mut MapStorage,
179-
classes_trie_root_hashes: RootHashes,
180-
contracts_trie_root_hashes: RootHashes,
181-
) -> Result<StarknetForestProofs, CommitmentInfosError> {
182-
let class_hashes: Vec<ClassHash> =
183-
initial_reads_keys.compiled_class_hash_keys.iter().cloned().collect();
184-
let contract_addresses =
185-
&initial_reads_keys.modified_contracts.iter().cloned().collect::<Vec<_>>();
186-
let contract_storage_keys = initial_reads_keys.storage_keys.iter().fold(
187-
HashMap::<ContractAddress, Vec<StarknetStorageKey>>::new(),
188-
|mut acc, (address, key)| {
189-
acc.entry(*address).or_default().push(StarknetStorageKey(*key));
190-
acc
191-
},
192-
);
193-
194-
Ok(fetch_previous_and_new_patricia_paths(
195-
storage,
196-
classes_trie_root_hashes,
197-
contracts_trie_root_hashes,
198-
&class_hashes,
199-
contract_addresses,
200-
&contract_storage_keys,
201-
)
202-
.await?)
203-
}

crates/starknet_os_flow_tests/src/test_manager.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -944,7 +944,7 @@ impl<S: FlowTestState> TestBuilder<S> {
944944
&previous_state_roots,
945945
&new_state_roots,
946946
&mut map_storage,
947-
&accessed_keys.into(),
947+
&accessed_keys,
948948
)
949949
.await
950950
.unwrap();

crates/starknet_transaction_prover/src/running/storage_proofs.rs

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

33
use async_trait::async_trait;
4+
use blockifier::state::accessed_keys::AccessedKeys;
45
use blockifier::state::cached_state::StateMaps;
56
use indexmap::IndexMap;
67
use serde::{Deserialize, Serialize};
@@ -343,15 +344,15 @@ impl RpcStorageProofsProvider {
343344
let mut map_storage: MapStorage = facts_db.consume_storage();
344345

345346
// Get extended initial reads keys.
346-
let initial_reads_keys = extended_initial_reads.keys();
347+
let accessed_keys: AccessedKeys = extended_initial_reads.keys().into();
347348

348349
// TODO(Aviv): Try to undertand if we can create classes trie commitment info
349350
// without the compiled class hashes.
350351
let mut commitment_infos = StateCommitmentInfos::new(
351352
&previous_state_roots,
352353
&new_roots,
353354
&mut map_storage,
354-
&initial_reads_keys,
355+
&accessed_keys,
355356
)
356357
.await
357358
.map_err(|e| ProofProviderError::BlockCommitmentError(e.to_string()))?;

0 commit comments

Comments
 (0)