Skip to content

Commit b46768a

Browse files
committed
apollo_committer: add new request handler
1 parent d79b8b1 commit b46768a

4 files changed

Lines changed: 89 additions & 23 deletions

File tree

crates/apollo_committer/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ license.workspace = true
77
description = "State root commitment computation component for the Starknet sequencer."
88

99
[features]
10-
testing = []
1110
os_input = ["apollo_committer_types/os_input", "starknet_committer/os_input"]
11+
testing = []
1212

1313
[dependencies]
1414
apollo_committer_config.workspace = true
@@ -17,7 +17,7 @@ apollo_infra.workspace = true
1717
apollo_metrics.workspace = true
1818
async-trait.workspace = true
1919
starknet_api.workspace = true
20-
starknet_committer.workspace = true
20+
starknet_committer = { workspace = true, features = ["os_input"] }
2121
starknet_patricia_storage = { workspace = true, features = ["rocksdb_storage"] }
2222
tracing.workspace = true
2323

crates/apollo_committer/src/communication.rs

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,27 @@ use apollo_committer_types::communication::{CommitterRequest, CommitterResponse}
22
use apollo_infra::component_definitions::ComponentRequestHandler;
33
use apollo_infra::component_server::{LocalComponentServer, RemoteComponentServer};
44
use async_trait::async_trait;
5+
#[cfg(feature = "os_input")]
6+
use starknet_committer::db::forest_trait::forest_trait_witnesses::ForestStorageWithWitnesses;
7+
#[cfg(not(feature = "os_input"))]
8+
use starknet_committer::db::forest_trait::forest_trait_witnesses::ForestWriterWithMetadataAndWitnesses;
9+
#[cfg(not(feature = "os_input"))]
510
use starknet_committer::db::forest_trait::ForestStorageWithEmptyReadContext;
11+
#[cfg(feature = "os_input")]
12+
use starknet_patricia_storage::storage_trait::ImmutableReadOnlyStorage;
613

714
use crate::committer::{ApolloCommitter, Committer, StorageConstructor};
815

916
pub type LocalCommitterServer =
1017
LocalComponentServer<ApolloCommitter, CommitterRequest, CommitterResponse>;
1118
pub type RemoteCommitterServer = RemoteComponentServer<CommitterRequest, CommitterResponse>;
1219

20+
#[cfg(not(feature = "os_input"))]
1321
#[async_trait]
14-
impl<S: StorageConstructor, ForestDB: ForestStorageWithEmptyReadContext<Storage = S>>
15-
ComponentRequestHandler<CommitterRequest, CommitterResponse> for Committer<S, ForestDB>
22+
impl<S: StorageConstructor, ForestDB> ComponentRequestHandler<CommitterRequest, CommitterResponse>
23+
for Committer<S, ForestDB>
24+
where
25+
ForestDB: ForestStorageWithEmptyReadContext<Storage = S> + ForestWriterWithMetadataAndWitnesses,
1626
{
1727
async fn handle_request(&mut self, request: CommitterRequest) -> CommitterResponse {
1828
match request {
@@ -25,3 +35,28 @@ impl<S: StorageConstructor, ForestDB: ForestStorageWithEmptyReadContext<Storage
2535
}
2636
}
2737
}
38+
39+
#[cfg(feature = "os_input")]
40+
#[async_trait]
41+
impl<S, ForestDB> ComponentRequestHandler<CommitterRequest, CommitterResponse>
42+
for Committer<S, ForestDB>
43+
where
44+
S: StorageConstructor + ImmutableReadOnlyStorage + 'static,
45+
ForestDB: ForestStorageWithWitnesses<Storage = S>,
46+
{
47+
async fn handle_request(&mut self, request: CommitterRequest) -> CommitterResponse {
48+
match request {
49+
CommitterRequest::CommitBlock(commit_block_request) => {
50+
CommitterResponse::CommitBlock(self.commit_block(commit_block_request).await)
51+
}
52+
CommitterRequest::RevertBlock(revert_block_request) => {
53+
CommitterResponse::RevertBlock(self.revert_block(revert_block_request).await)
54+
}
55+
CommitterRequest::ReadPathsAndCommitBlock(req) => {
56+
CommitterResponse::ReadPathsAndCommitBlock(
57+
self.read_paths_and_commit_block(req).await,
58+
)
59+
}
60+
}
61+
}
62+
}

crates/apollo_committer/src/request_paths_and_commit_block_tests.rs

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
use std::collections::HashMap;
1+
use std::collections::{BTreeSet, HashMap};
22

33
use apollo_committer_types::committer_types::{
4+
AccessedKeys,
45
CommitBlockRequest,
56
ReadPathsAndCommitBlockRequest,
67
RevertBlockRequest,
@@ -13,16 +14,12 @@ use starknet_api::hash::HashOutput;
1314
use starknet_api::state::ThinStateDiff;
1415
use starknet_committer::block_committer::input::{
1516
contract_address_into_node_index,
16-
AccessedKeys,
1717
StarknetStorageKey,
1818
StarknetStorageValue,
1919
};
2020
use starknet_committer::db::facts_db::db::{FactDbFilledNode, FactsNodeLayout};
21-
use starknet_committer::db::forest_trait::{
22-
EmptyInitialReadContext,
23-
ForestReader,
24-
ForestReaderWithWitnesses,
25-
};
21+
use starknet_committer::db::forest_trait::forest_trait_witnesses::ForestReaderWithWitnesses;
22+
use starknet_committer::db::forest_trait::{EmptyInitialReadContext, ForestReader};
2623
use starknet_committer::db::index_db::IndexDbReadContext;
2724
use starknet_committer::db::trie_traversal::fetch_patricia_paths;
2825
use starknet_committer::hash_function::hash::TreeHashFunctionImpl;
@@ -80,12 +77,12 @@ fn accessed_storage_key_2() -> StarknetStorageKey {
8077

8178
fn accessed_keys() -> AccessedKeys {
8279
AccessedKeys {
83-
class_hashes: vec![accessed_class_hash()],
84-
contract_addresses: vec![accessed_contract_1(), accessed_contract_2()],
85-
contract_storage_keys: HashMap::from([
86-
(accessed_contract_1(), vec![accessed_storage_key_1()]),
87-
(accessed_contract_2(), vec![accessed_storage_key_2()]),
80+
storage_keys: BTreeSet::from([
81+
(accessed_contract_1(), accessed_storage_key_1().0),
82+
(accessed_contract_2(), accessed_storage_key_2().0),
8883
]),
84+
accessed_contracts: BTreeSet::from([accessed_contract_1(), accessed_contract_2()]),
85+
accessed_class_hashes: BTreeSet::from([accessed_class_hash()]),
8986
}
9087
}
9188

@@ -447,7 +444,7 @@ async fn verify_witness_patricia_paths(
447444
let contract_root_hashes = [HashOutput::ROOT_OF_EMPTY_TREE, contracts_trie_root];
448445

449446
let mut class_leaf_indices: Vec<NodeIndex> =
450-
accessed_keys.class_hashes.iter().map(class_hash_into_node_index).collect();
447+
accessed_keys.accessed_class_hashes.iter().map(class_hash_into_node_index).collect();
451448
verify_preimage_map_paths_exist::<CommitterCompiledClassHash>(
452449
&patricia_proofs.classes_trie_proof,
453450
&class_root_hashes,
@@ -458,7 +455,7 @@ async fn verify_witness_patricia_paths(
458455
.await;
459456

460457
let mut contract_leaf_indices: Vec<NodeIndex> =
461-
accessed_keys.contract_addresses.iter().map(contract_address_into_node_index).collect();
458+
accessed_keys.accessed_contracts.iter().map(contract_address_into_node_index).collect();
462459
verify_preimage_map_paths_exist::<ContractState>(
463460
&patricia_proofs.contracts_trie_proof.nodes,
464461
&contract_root_hashes,
@@ -471,7 +468,7 @@ async fn verify_witness_patricia_paths(
471468
)
472469
.await;
473470

474-
for contract_address in &accessed_keys.contract_addresses {
471+
for contract_address in &accessed_keys.accessed_contracts {
475472
let storage_proof = patricia_proofs
476473
.contracts_trie_storage_proofs
477474
.get(contract_address)
@@ -481,10 +478,13 @@ async fn verify_witness_patricia_paths(
481478
.leaves
482479
.get(contract_address)
483480
.unwrap_or_else(|| panic!("missing contracts trie leaf for {contract_address:?}"));
484-
let storage_keys = accessed_keys
485-
.contract_storage_keys
486-
.get(contract_address)
487-
.unwrap_or_else(|| panic!("missing accessed storage keys for {contract_address:?}"));
481+
let storage_keys: Vec<_> = accessed_keys
482+
.storage_keys
483+
.iter()
484+
.filter(|(address, _)| address == contract_address)
485+
.map(|(_, key)| StarknetStorageKey(*key))
486+
.collect();
487+
assert!(!storage_keys.is_empty(), "missing accessed storage keys for {contract_address:?}");
488488
let mut storage_leaf_indices: Vec<NodeIndex> =
489489
storage_keys.iter().map(NodeIndex::from).collect();
490490
let storage_root_hashes =

crates/apollo_committer_types/src/communication.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ use crate::committer_types::{
2121
RevertBlockRequest,
2222
RevertBlockResponse,
2323
};
24+
#[cfg(feature = "os_input")]
25+
use crate::committer_types::{ReadPathsAndCommitBlockRequest, ReadPathsAndCommitBlockResponse};
2426
use crate::errors::{CommitterClientError, CommitterClientResult, CommitterResult};
2527

2628
pub type LocalCommitterClient = LocalComponentClient<CommitterRequest, CommitterResponse>;
@@ -43,6 +45,14 @@ pub trait CommitterClient: Send + Sync {
4345
&self,
4446
input: RevertBlockRequest,
4547
) -> CommitterClientResult<RevertBlockResponse>;
48+
49+
#[cfg(feature = "os_input")]
50+
/// Applies the state diff, collects merged Patricia witnesses for OS input, and persists replay
51+
/// data (digest + payload).
52+
async fn read_paths_and_commit_block(
53+
&self,
54+
input: ReadPathsAndCommitBlockRequest,
55+
) -> CommitterClientResult<ReadPathsAndCommitBlockResponse>;
4656
}
4757

4858
#[derive(Serialize, Deserialize, Clone, AsRefStr, EnumDiscriminants)]
@@ -54,6 +64,8 @@ pub trait CommitterClient: Send + Sync {
5464
pub enum CommitterRequest {
5565
CommitBlock(CommitBlockRequest),
5666
RevertBlock(RevertBlockRequest),
67+
#[cfg(feature = "os_input")]
68+
ReadPathsAndCommitBlock(ReadPathsAndCommitBlockRequest),
5769
}
5870

5971
impl_debug_for_infra_requests_and_responses!(CommitterRequest);
@@ -64,6 +76,8 @@ impl PrioritizedRequest for CommitterRequest {}
6476
pub enum CommitterResponse {
6577
CommitBlock(CommitterResult<CommitBlockResponse>),
6678
RevertBlock(CommitterResult<RevertBlockResponse>),
79+
#[cfg(feature = "os_input")]
80+
ReadPathsAndCommitBlock(CommitterResult<ReadPathsAndCommitBlockResponse>),
6781
}
6882

6983
impl_debug_for_infra_requests_and_responses!(CommitterResponse);
@@ -109,4 +123,21 @@ where
109123
Direct
110124
)
111125
}
126+
127+
#[cfg(feature = "os_input")]
128+
async fn read_paths_and_commit_block(
129+
&self,
130+
input: ReadPathsAndCommitBlockRequest,
131+
) -> CommitterClientResult<ReadPathsAndCommitBlockResponse> {
132+
let request = CommitterRequest::ReadPathsAndCommitBlock(input);
133+
handle_all_response_variants!(
134+
self,
135+
request,
136+
CommitterResponse,
137+
ReadPathsAndCommitBlock,
138+
CommitterClientError,
139+
CommitterError,
140+
Direct
141+
)
142+
}
112143
}

0 commit comments

Comments
 (0)