From 954e82fb3c20ac7332e3590961ab7666a620f5c1 Mon Sep 17 00:00:00 2001 From: Noam Spiegelstein Date: Mon, 16 Dec 2024 17:48:04 +0200 Subject: [PATCH] feat(starknet_state_sync): implement sync state reader get nonce at --- .../starknet_gateway/src/sync_state_reader.rs | 7 +++- crates/starknet_state_sync/src/lib.rs | 22 +++++++++- .../src/communication.rs | 41 ++++++++++++++++++- 3 files changed, 65 insertions(+), 5 deletions(-) diff --git a/crates/starknet_gateway/src/sync_state_reader.rs b/crates/starknet_gateway/src/sync_state_reader.rs index 08997f7a1b5..15fa79172b1 100644 --- a/crates/starknet_gateway/src/sync_state_reader.rs +++ b/crates/starknet_gateway/src/sync_state_reader.rs @@ -45,8 +45,11 @@ impl BlockifierStateReader for SyncStateReader { Ok(res.unwrap_or_default()) } - fn get_nonce_at(&self, _contract_address: ContractAddress) -> StateResult { - todo!() + fn get_nonce_at(&self, contract_address: ContractAddress) -> StateResult { + let res = + block_on(self.state_sync_client.get_nonce_at(self.block_number, contract_address))?; + + Ok(res.unwrap_or_default()) } fn get_compiled_class(&self, _class_hash: ClassHash) -> StateResult { diff --git a/crates/starknet_state_sync/src/lib.rs b/crates/starknet_state_sync/src/lib.rs index 2ca386f3e98..2b152b7b9ca 100644 --- a/crates/starknet_state_sync/src/lib.rs +++ b/crates/starknet_state_sync/src/lib.rs @@ -7,7 +7,7 @@ use papyrus_storage::db::TransactionKind; use papyrus_storage::state::StateStorageReader; use papyrus_storage::{StorageReader, StorageTxn}; use starknet_api::block::BlockNumber; -use starknet_api::core::{ContractAddress, BLOCK_HASH_TABLE_ADDRESS}; +use starknet_api::core::{ContractAddress, Nonce, BLOCK_HASH_TABLE_ADDRESS}; use starknet_api::state::{StateNumber, StorageKey}; use starknet_sequencer_infra::component_definitions::{ComponentRequestHandler, ComponentStarter}; use starknet_sequencer_infra::component_server::{LocalComponentServer, RemoteComponentServer}; @@ -51,6 +51,9 @@ impl ComponentRequestHandler for StateSync storage_key, )) } + StateSyncRequest::GetNonceAt(block_number, contract_address) => { + StateSyncResponse::GetNonceAt(self.get_nonce_at(block_number, contract_address)) + } } } } @@ -97,6 +100,23 @@ impl StateSync { Ok(Some(res)) } + + fn get_nonce_at( + &self, + block_number: BlockNumber, + contract_address: ContractAddress, + ) -> StateSyncResult> { + let txn = self.storage_reader.begin_ro_txn()?; + verify_block_number(&txn, block_number)?; + + let state_number = StateNumber::unchecked_right_after_block(block_number); + let state_reader = txn.get_state_reader()?; + let res = state_reader + .get_nonce_at(state_number, &contract_address)? + .ok_or(StateSyncError::ContractAddressNotFoundError(contract_address))?; + + Ok(Some(res)) + } } fn verify_block_number( diff --git a/crates/starknet_state_sync_types/src/communication.rs b/crates/starknet_state_sync_types/src/communication.rs index 7b7ff5dad08..ecf14c7cc5d 100644 --- a/crates/starknet_state_sync_types/src/communication.rs +++ b/crates/starknet_state_sync_types/src/communication.rs @@ -4,7 +4,7 @@ use async_trait::async_trait; use papyrus_proc_macros::handle_response_variants; use serde::{Deserialize, Serialize}; use starknet_api::block::BlockNumber; -use starknet_api::core::ContractAddress; +use starknet_api::core::{ContractAddress, Nonce}; use starknet_api::state::StorageKey; use starknet_sequencer_infra::component_client::{ ClientError, @@ -44,7 +44,12 @@ pub trait StateSyncClient: Send + Sync { storage_key: StorageKey, ) -> StateSyncClientResult>; - // TODO: Add get_nonce_at for StateSyncReader + async fn get_nonce_at( + &self, + block_number: BlockNumber, + contract_address: ContractAddress, + ) -> StateSyncClientResult>; + // TODO: Add get_compiled_class for StateSyncReader // TODO: Add get_class_hash_at for StateSyncReader // TODO: Add get_compiled_class_hash for StateSyncReader @@ -73,6 +78,7 @@ pub enum StateSyncRequest { GetBlock(BlockNumber), AddNewBlock(BlockNumber, SyncBlock), GetStorageAt(BlockNumber, ContractAddress, StorageKey), + GetNonceAt(BlockNumber, ContractAddress), } #[derive(Clone, Debug, Serialize, Deserialize)] @@ -80,6 +86,7 @@ pub enum StateSyncResponse { GetBlock(StateSyncResult>), AddNewBlock(StateSyncResult<()>), GetStorageAt(StateSyncResult>), + GetNonceAt(StateSyncResult>), } #[async_trait] @@ -123,6 +130,21 @@ impl StateSyncClient for LocalStateSyncClient { StateSyncError ) } + + async fn get_nonce_at( + &self, + block_number: BlockNumber, + contract_address: ContractAddress, + ) -> StateSyncClientResult> { + let request = StateSyncRequest::GetNonceAt(block_number, contract_address); + let response = self.send(request).await; + handle_response_variants!( + StateSyncResponse, + GetNonceAt, + StateSyncClientError, + StateSyncError + ) + } } #[async_trait] @@ -166,4 +188,19 @@ impl StateSyncClient for RemoteStateSyncClient { StateSyncError ) } + + async fn get_nonce_at( + &self, + block_number: BlockNumber, + contract_address: ContractAddress, + ) -> StateSyncClientResult> { + let request = StateSyncRequest::GetNonceAt(block_number, contract_address); + let response = self.send(request).await; + handle_response_variants!( + StateSyncResponse, + GetNonceAt, + StateSyncClientError, + StateSyncError + ) + } }