diff --git a/Cargo.lock b/Cargo.lock index 6a83b3a82bc..fb0b4f85cde 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1132,6 +1132,7 @@ dependencies = [ "async-trait", "mockall", "serde", + "starknet-types-core", "starknet_api", "starknet_committer", "strum", @@ -12559,7 +12560,10 @@ dependencies = [ "apollo_config", "async-recursion", "async-trait", + "bincode 1.3.3", + "blake2", "derive_more", + "digest 0.10.7", "ethnum", "expect-test", "hex", diff --git a/crates/apollo_committer/Cargo.toml b/crates/apollo_committer/Cargo.toml index e2f536c9cec..fce52d7cbc3 100644 --- a/crates/apollo_committer/Cargo.toml +++ b/crates/apollo_committer/Cargo.toml @@ -8,6 +8,7 @@ description = "State root commitment computation component for the Starknet sequ [features] testing = [] +os_input = ["apollo_committer_types/os_input"] [dependencies] apollo_committer_config.workspace = true @@ -16,7 +17,7 @@ apollo_infra.workspace = true apollo_metrics.workspace = true async-trait.workspace = true starknet_api.workspace = true -starknet_committer.workspace = true +starknet_committer = { workspace = true, features = ["os_input"] } starknet_patricia_storage = { workspace = true, features = ["rocksdb_storage"] } tracing.workspace = true diff --git a/crates/apollo_committer/src/communication.rs b/crates/apollo_committer/src/communication.rs index 4c8c44cf4d8..a4020ba572d 100644 --- a/crates/apollo_committer/src/communication.rs +++ b/crates/apollo_committer/src/communication.rs @@ -2,7 +2,15 @@ use apollo_committer_types::communication::{CommitterRequest, CommitterResponse} use apollo_infra::component_definitions::ComponentRequestHandler; use apollo_infra::component_server::{LocalComponentServer, RemoteComponentServer}; use async_trait::async_trait; -use starknet_committer::db::forest_trait::ForestStorageWithEmptyReadContext; +#[cfg(feature = "os_input")] +use starknet_committer::db::forest_trait::ForestStorageWithWitnesses; +#[cfg(not(feature = "os_input"))] +use starknet_committer::db::forest_trait::{ + ForestStorageWithEmptyReadContext, + ForestWriterWithMetadataAndWitnesses, +}; +#[cfg(feature = "os_input")] +use starknet_patricia_storage::storage_trait::ImmutableReadOnlyStorage; use crate::committer::{ApolloCommitter, Committer, StorageConstructor}; @@ -10,9 +18,12 @@ pub type LocalCommitterServer = LocalComponentServer; pub type RemoteCommitterServer = RemoteComponentServer; +#[cfg(not(feature = "os_input"))] #[async_trait] -impl> - ComponentRequestHandler for Committer +impl ComponentRequestHandler + for Committer +where + ForestDB: ForestStorageWithEmptyReadContext + ForestWriterWithMetadataAndWitnesses, { async fn handle_request(&mut self, request: CommitterRequest) -> CommitterResponse { match request { @@ -25,3 +36,28 @@ impl ComponentRequestHandler + for Committer +where + S: StorageConstructor + ImmutableReadOnlyStorage + 'static, + ForestDB: ForestStorageWithWitnesses, +{ + async fn handle_request(&mut self, request: CommitterRequest) -> CommitterResponse { + match request { + CommitterRequest::CommitBlock(commit_block_request) => { + CommitterResponse::CommitBlock(self.commit_block(commit_block_request).await) + } + CommitterRequest::RevertBlock(revert_block_request) => { + CommitterResponse::RevertBlock(self.revert_block(revert_block_request).await) + } + CommitterRequest::ReadPathsAndCommitBlock(req) => { + CommitterResponse::ReadPathsAndCommitBlock( + self.read_paths_and_commit_block(req).await, + ) + } + } + } +} diff --git a/crates/apollo_committer_types/src/communication.rs b/crates/apollo_committer_types/src/communication.rs index c18aacfbed7..9b1f1af30a4 100644 --- a/crates/apollo_committer_types/src/communication.rs +++ b/crates/apollo_committer_types/src/communication.rs @@ -21,6 +21,8 @@ use crate::committer_types::{ RevertBlockRequest, RevertBlockResponse, }; +#[cfg(feature = "os_input")] +use crate::committer_types::{ReadPathsAndCommitBlockRequest, ReadPathsAndCommitBlockResponse}; use crate::errors::{CommitterClientError, CommitterClientResult, CommitterResult}; pub type LocalCommitterClient = LocalComponentClient; @@ -43,6 +45,14 @@ pub trait CommitterClient: Send + Sync { &self, input: RevertBlockRequest, ) -> CommitterClientResult; + + #[cfg(feature = "os_input")] + /// Applies the state diff, collects merged Patricia witnesses for OS input, and persists replay + /// data (digest + payload). + async fn read_paths_and_commit_block( + &self, + input: ReadPathsAndCommitBlockRequest, + ) -> CommitterClientResult; } #[derive(Serialize, Deserialize, Clone, AsRefStr, EnumDiscriminants)] @@ -54,6 +64,8 @@ pub trait CommitterClient: Send + Sync { pub enum CommitterRequest { CommitBlock(CommitBlockRequest), RevertBlock(RevertBlockRequest), + #[cfg(feature = "os_input")] + ReadPathsAndCommitBlock(ReadPathsAndCommitBlockRequest), } impl_debug_for_infra_requests_and_responses!(CommitterRequest); @@ -64,6 +76,8 @@ impl PrioritizedRequest for CommitterRequest {} pub enum CommitterResponse { CommitBlock(CommitterResult), RevertBlock(CommitterResult), + #[cfg(feature = "os_input")] + ReadPathsAndCommitBlock(CommitterResult), } impl_debug_for_infra_requests_and_responses!(CommitterResponse); @@ -109,4 +123,21 @@ where Direct ) } + + #[cfg(feature = "os_input")] + async fn read_paths_and_commit_block( + &self, + input: ReadPathsAndCommitBlockRequest, + ) -> CommitterClientResult { + let request = CommitterRequest::ReadPathsAndCommitBlock(input); + handle_all_response_variants!( + self, + request, + CommitterResponse, + ReadPathsAndCommitBlock, + CommitterClientError, + CommitterError, + Direct + ) + } }