Skip to content

Commit 78fb37d

Browse files
feat(starknet_gateway): state reader get compiled classes from class manager
This commit also includes the removal of deprecated_get_compiled_class from state sync component which was blocked until the changes in this commit were introduced.
1 parent 071a24b commit 78fb37d

File tree

6 files changed

+55
-169
lines changed

6 files changed

+55
-169
lines changed

crates/starknet_gateway/src/gateway.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,10 @@ pub fn create_gateway(
171171
mempool_client: SharedMempoolClient,
172172
class_manager_client: SharedClassManagerClient,
173173
) -> Gateway {
174-
let state_reader_factory = Arc::new(SyncStateReaderFactory { shared_state_sync_client });
174+
let state_reader_factory = Arc::new(SyncStateReaderFactory {
175+
shared_state_sync_client,
176+
class_manager_client: class_manager_client.clone(),
177+
});
175178

176179
let transaction_converter =
177180
TransactionConverter::new(class_manager_client, config.chain_info.chain_id.clone());

crates/starknet_gateway/src/sync_state_reader.rs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use starknet_api::contract_class::ContractClass;
77
use starknet_api::core::{ClassHash, CompiledClassHash, ContractAddress, Nonce};
88
use starknet_api::data_availability::L1DataAvailabilityMode;
99
use starknet_api::state::StorageKey;
10+
use starknet_class_manager_types::SharedClassManagerClient;
1011
use starknet_state_sync_types::communication::{
1112
SharedStateSyncClient,
1213
StateSyncClientError,
@@ -20,14 +21,16 @@ use crate::state_reader::{MempoolStateReader, StateReaderFactory};
2021
pub(crate) struct SyncStateReader {
2122
block_number: BlockNumber,
2223
state_sync_client: SharedStateSyncClient,
24+
class_manager_client: SharedClassManagerClient,
2325
}
2426

2527
impl SyncStateReader {
2628
pub fn from_number(
2729
state_sync_client: SharedStateSyncClient,
30+
class_manager_client: SharedClassManagerClient,
2831
block_number: BlockNumber,
2932
) -> Self {
30-
Self { block_number, state_sync_client }
33+
Self { block_number, state_sync_client, class_manager_client }
3134
}
3235
}
3336

@@ -99,10 +102,8 @@ impl BlockifierStateReader for SyncStateReader {
99102
}
100103

101104
fn get_compiled_class(&self, class_hash: ClassHash) -> StateResult<RunnableCompiledClass> {
102-
let contract_class = block_on(
103-
self.state_sync_client.get_compiled_class_deprecated(self.block_number, class_hash),
104-
)
105-
.map_err(|e| StateError::StateReadError(e.to_string()))?;
105+
let contract_class = block_on(self.class_manager_client.get_executable(class_hash))
106+
.map_err(|e| StateError::StateReadError(e.to_string()))?;
106107

107108
match contract_class {
108109
ContractClass::V1(casm_contract_class) => {
@@ -134,6 +135,7 @@ impl BlockifierStateReader for SyncStateReader {
134135

135136
pub struct SyncStateReaderFactory {
136137
pub shared_state_sync_client: SharedStateSyncClient,
138+
pub class_manager_client: SharedClassManagerClient,
137139
}
138140

139141
impl StateReaderFactory for SyncStateReaderFactory {
@@ -146,11 +148,16 @@ impl StateReaderFactory for SyncStateReaderFactory {
146148

147149
Ok(Box::new(SyncStateReader::from_number(
148150
self.shared_state_sync_client.clone(),
151+
self.class_manager_client.clone(),
149152
latest_block_number,
150153
)))
151154
}
152155

153156
fn get_state_reader(&self, block_number: BlockNumber) -> Box<dyn MempoolStateReader> {
154-
Box::new(SyncStateReader::from_number(self.shared_state_sync_client.clone(), block_number))
157+
Box::new(SyncStateReader::from_number(
158+
self.shared_state_sync_client.clone(),
159+
self.class_manager_client.clone(),
160+
block_number,
161+
))
155162
}
156163
}

crates/starknet_gateway/src/sync_state_reader_test.rs

Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ use starknet_api::contract_class::{ContractClass, SierraVersion};
1919
use starknet_api::core::SequencerContractAddress;
2020
use starknet_api::data_availability::L1DataAvailabilityMode;
2121
use starknet_api::{class_hash, contract_address, felt, nonce, storage_key};
22+
use starknet_class_manager_types::MockClassManagerClient;
2223
use starknet_state_sync_types::communication::MockStateSyncClient;
2324
use starknet_state_sync_types::state_sync_types::SyncBlock;
2425

@@ -27,6 +28,7 @@ use crate::sync_state_reader::SyncStateReader;
2728
#[tokio::test]
2829
async fn test_get_block_info() {
2930
let mut mock_state_sync_client = MockStateSyncClient::new();
31+
let mock_class_manager_client = MockClassManagerClient::new();
3032
let block_number = BlockNumber(1);
3133
let block_timestamp = BlockTimestamp(2);
3234
let sequencer_address = contract_address!("0x3");
@@ -55,8 +57,11 @@ async fn test_get_block_info() {
5557
},
5658
);
5759

58-
let state_sync_reader =
59-
SyncStateReader::from_number(Arc::new(mock_state_sync_client), block_number);
60+
let state_sync_reader = SyncStateReader::from_number(
61+
Arc::new(mock_state_sync_client),
62+
Arc::new(mock_class_manager_client),
63+
block_number,
64+
);
6065
let result = state_sync_reader.get_block_info().unwrap();
6166

6267
assert_eq!(
@@ -92,6 +97,7 @@ async fn test_get_block_info() {
9297
#[tokio::test]
9398
async fn test_get_storage_at() {
9499
let mut mock_state_sync_client = MockStateSyncClient::new();
100+
let mock_class_manager_client = MockClassManagerClient::new();
95101
let block_number = BlockNumber(1);
96102
let contract_address = contract_address!("0x2");
97103
let storage_key = storage_key!("0x3");
@@ -106,8 +112,11 @@ async fn test_get_storage_at() {
106112
)
107113
.returning(move |_, _, _| Ok(value));
108114

109-
let state_sync_reader =
110-
SyncStateReader::from_number(Arc::new(mock_state_sync_client), block_number);
115+
let state_sync_reader = SyncStateReader::from_number(
116+
Arc::new(mock_state_sync_client),
117+
Arc::new(mock_class_manager_client),
118+
block_number,
119+
);
111120

112121
let result = state_sync_reader.get_storage_at(contract_address, storage_key).unwrap();
113122
assert_eq!(result, value);
@@ -116,6 +125,7 @@ async fn test_get_storage_at() {
116125
#[tokio::test]
117126
async fn test_get_nonce_at() {
118127
let mut mock_state_sync_client = MockStateSyncClient::new();
128+
let mock_class_manager_client = MockClassManagerClient::new();
119129
let block_number = BlockNumber(1);
120130
let contract_address = contract_address!("0x2");
121131
let expected_result = nonce!(0x3);
@@ -126,8 +136,11 @@ async fn test_get_nonce_at() {
126136
.with(predicate::eq(block_number), predicate::eq(contract_address))
127137
.returning(move |_, _| Ok(expected_result));
128138

129-
let state_sync_reader =
130-
SyncStateReader::from_number(Arc::new(mock_state_sync_client), block_number);
139+
let state_sync_reader = SyncStateReader::from_number(
140+
Arc::new(mock_state_sync_client),
141+
Arc::new(mock_class_manager_client),
142+
block_number,
143+
);
131144

132145
let result = state_sync_reader.get_nonce_at(contract_address).unwrap();
133146
assert_eq!(result, expected_result);
@@ -136,6 +149,7 @@ async fn test_get_nonce_at() {
136149
#[tokio::test]
137150
async fn test_get_class_hash_at() {
138151
let mut mock_state_sync_client = MockStateSyncClient::new();
152+
let mock_class_manager_client = MockClassManagerClient::new();
139153
let block_number = BlockNumber(1);
140154
let contract_address = contract_address!("0x2");
141155
let expected_result = class_hash!("0x3");
@@ -146,16 +160,20 @@ async fn test_get_class_hash_at() {
146160
.with(predicate::eq(block_number), predicate::eq(contract_address))
147161
.returning(move |_, _| Ok(expected_result));
148162

149-
let state_sync_reader =
150-
SyncStateReader::from_number(Arc::new(mock_state_sync_client), block_number);
163+
let state_sync_reader = SyncStateReader::from_number(
164+
Arc::new(mock_state_sync_client),
165+
Arc::new(mock_class_manager_client),
166+
block_number,
167+
);
151168

152169
let result = state_sync_reader.get_class_hash_at(contract_address).unwrap();
153170
assert_eq!(result, expected_result);
154171
}
155172

156173
#[tokio::test]
157174
async fn test_get_compiled_class() {
158-
let mut mock_state_sync_client = MockStateSyncClient::new();
175+
let mock_state_sync_client = MockStateSyncClient::new();
176+
let mut mock_class_manager_client = MockClassManagerClient::new();
159177
let block_number = BlockNumber(1);
160178
let class_hash = class_hash!("0x2");
161179
let casm_contract_class = CasmContractClass {
@@ -169,16 +187,19 @@ async fn test_get_compiled_class() {
169187
};
170188
let expected_result = casm_contract_class.clone();
171189

172-
mock_state_sync_client
173-
.expect_get_compiled_class_deprecated()
190+
mock_class_manager_client
191+
.expect_get_executable()
174192
.times(1)
175-
.with(predicate::eq(block_number), predicate::eq(class_hash))
176-
.returning(move |_, _| {
193+
.with(predicate::eq(class_hash))
194+
.returning(move |_| {
177195
Ok(ContractClass::V1((casm_contract_class.clone(), SierraVersion::default())))
178196
});
179197

180-
let state_sync_reader =
181-
SyncStateReader::from_number(Arc::new(mock_state_sync_client), block_number);
198+
let state_sync_reader = SyncStateReader::from_number(
199+
Arc::new(mock_state_sync_client),
200+
Arc::new(mock_class_manager_client),
201+
block_number,
202+
);
182203

183204
let result = state_sync_reader.get_compiled_class(class_hash).unwrap();
184205
assert_eq!(

crates/starknet_state_sync/src/lib.rs

Lines changed: 0 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,11 @@ use async_trait::async_trait;
99
use futures::channel::mpsc::{channel, Sender};
1010
use futures::SinkExt;
1111
use papyrus_storage::body::BodyStorageReader;
12-
use papyrus_storage::compiled_class::CasmStorageReader;
1312
use papyrus_storage::db::TransactionKind;
1413
use papyrus_storage::header::HeaderStorageReader;
1514
use papyrus_storage::state::{StateReader, StateStorageReader};
1615
use papyrus_storage::{StorageReader, StorageTxn};
1716
use starknet_api::block::BlockNumber;
18-
use starknet_api::contract_class::{ContractClass, SierraVersion};
1917
use starknet_api::core::{ClassHash, ContractAddress, Nonce, BLOCK_HASH_TABLE_ADDRESS};
2018
use starknet_api::state::{StateNumber, StorageKey};
2119
use starknet_class_manager_types::SharedClassManagerClient;
@@ -73,11 +71,6 @@ impl ComponentRequestHandler<StateSyncRequest, StateSyncResponse> for StateSync
7371
self.get_class_hash_at(block_number, contract_address),
7472
)
7573
}
76-
StateSyncRequest::GetCompiledClassDeprecated(block_number, class_hash) => {
77-
StateSyncResponse::GetCompiledClassDeprecated(
78-
self.get_compiled_class_deprecated(block_number, class_hash),
79-
)
80-
}
8174
StateSyncRequest::GetLatestBlockNumber() => {
8275
StateSyncResponse::GetLatestBlockNumber(self.get_latest_block_number())
8376
}
@@ -160,42 +153,6 @@ impl StateSync {
160153
Ok(class_hash)
161154
}
162155

163-
fn get_compiled_class_deprecated(
164-
&self,
165-
block_number: BlockNumber,
166-
class_hash: ClassHash,
167-
) -> StateSyncResult<ContractClass> {
168-
let txn = self.storage_reader.begin_ro_txn()?;
169-
verify_synced_up_to(&txn, block_number)?;
170-
171-
let state_reader = txn.get_state_reader()?;
172-
173-
// Check if this class exists in the Cairo1 classes table.
174-
if let Some(class_definition_block_number) =
175-
state_reader.get_class_definition_block_number(&class_hash)?
176-
{
177-
if class_definition_block_number > block_number {
178-
return Err(StateSyncError::ClassNotFound(class_hash));
179-
}
180-
181-
let (option_casm, option_sierra) = txn.get_casm_and_sierra(&class_hash)?;
182-
183-
// Check if both options are `Some`. If not, since we verified the block number is
184-
// smaller than the casm marker, we return that the class doesnt exist.
185-
let (casm, sierra) =
186-
option_casm.zip(option_sierra).ok_or(StateSyncError::ClassNotFound(class_hash))?;
187-
let sierra_version = SierraVersion::extract_from_program(&sierra.sierra_program)?;
188-
return Ok(ContractClass::V1((casm, sierra_version)));
189-
}
190-
191-
// Check if this class exists in the Cairo0 classes table.
192-
let state_number = StateNumber::unchecked_right_after_block(block_number);
193-
let deprecated_compiled_contract_class = state_reader
194-
.get_deprecated_class_definition_at(state_number, &class_hash)?
195-
.ok_or(StateSyncError::ClassNotFound(class_hash))?;
196-
Ok(ContractClass::V0(deprecated_compiled_contract_class))
197-
}
198-
199156
fn get_latest_block_number(&self) -> StateSyncResult<Option<BlockNumber>> {
200157
let txn = self.storage_reader.begin_ro_txn()?;
201158
let latest_block_number = latest_synced_block(&txn)?;

crates/starknet_state_sync/src/test.rs

Lines changed: 2 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,15 @@
1-
use cairo_lang_starknet_classes::casm_contract_class::CasmContractClass;
21
use futures::channel::mpsc::channel;
32
use indexmap::IndexMap;
43
use papyrus_storage::body::BodyStorageWriter;
5-
use papyrus_storage::class::ClassStorageWriter;
6-
use papyrus_storage::compiled_class::CasmStorageWriter;
74
use papyrus_storage::header::HeaderStorageWriter;
85
use papyrus_storage::state::StateStorageWriter;
96
use papyrus_storage::test_utils::get_test_storage;
107
use papyrus_storage::StorageWriter;
118
use papyrus_test_utils::{get_rng, get_test_block, get_test_state_diff, GetTestInstance};
129
use rand_chacha::rand_core::RngCore;
1310
use starknet_api::block::{Block, BlockHeader, BlockNumber};
14-
use starknet_api::contract_class::{ContractClass, SierraVersion};
15-
use starknet_api::core::{ClassHash, CompiledClassHash, ContractAddress, Nonce};
16-
use starknet_api::deprecated_contract_class::ContractClass as DeprecatedContractClass;
17-
use starknet_api::state::{SierraContractClass, StorageKey, ThinStateDiff};
11+
use starknet_api::core::{ClassHash, ContractAddress, Nonce};
12+
use starknet_api::state::{StorageKey, ThinStateDiff};
1813
use starknet_sequencer_infra::component_definitions::ComponentRequestHandler;
1914
use starknet_state_sync_types::communication::{StateSyncRequest, StateSyncResponse};
2015
use starknet_state_sync_types::errors::StateSyncError;
@@ -188,63 +183,6 @@ async fn get_class_hash_at() {
188183
assert_eq!(class_hash, expected_class_hash);
189184
}
190185

191-
#[tokio::test]
192-
async fn test_get_compiled_class_deprecated() {
193-
let (state_sync, mut storage_writer) = setup();
194-
195-
let mut rng = get_rng();
196-
let cairo1_class_hash = ClassHash(Felt::from(rng.next_u64()));
197-
let cairo1_contract_class = CasmContractClass::get_test_instance(&mut rng);
198-
let sierra_contract_class = SierraContractClass::default();
199-
let cairo0_class_hash = ClassHash(Felt::from(rng.next_u64()));
200-
let cairo0_contract_class = DeprecatedContractClass::get_test_instance(&mut get_rng());
201-
let block_number = BlockNumber(0);
202-
203-
storage_writer
204-
.begin_rw_txn()
205-
.unwrap()
206-
.append_state_diff(
207-
block_number,
208-
starknet_api::state::ThinStateDiff {
209-
declared_classes: IndexMap::from([(
210-
cairo1_class_hash,
211-
CompiledClassHash::default(),
212-
)]),
213-
deprecated_declared_classes: vec![cairo0_class_hash],
214-
..Default::default()
215-
},
216-
)
217-
.unwrap()
218-
.append_casm(&cairo1_class_hash, &cairo1_contract_class)
219-
.unwrap()
220-
.append_classes(
221-
block_number,
222-
&[(cairo1_class_hash, &sierra_contract_class)],
223-
&[(cairo0_class_hash, &cairo0_contract_class)],
224-
)
225-
.unwrap()
226-
.append_body(block_number, Default::default())
227-
.unwrap()
228-
.commit()
229-
.unwrap();
230-
231-
// Verify the cairo1 class was written and is returned correctly.
232-
let contract_class_v1 =
233-
state_sync.get_compiled_class_deprecated(block_number, cairo1_class_hash).unwrap();
234-
let sierra_version =
235-
SierraVersion::extract_from_program(&sierra_contract_class.sierra_program).unwrap();
236-
assert_eq!(contract_class_v1, ContractClass::V1((cairo1_contract_class, sierra_version)));
237-
238-
// Verify the cairo0 class was written and is returned correctly.
239-
let contract_class_v0 =
240-
state_sync.get_compiled_class_deprecated(block_number, cairo0_class_hash).unwrap();
241-
assert_eq!(contract_class_v0, ContractClass::V0(cairo0_contract_class));
242-
243-
let other_class_hash = ClassHash::get_test_instance(&mut rng);
244-
let result = state_sync.get_compiled_class_deprecated(block_number, other_class_hash);
245-
assert_eq!(result, Err(StateSyncError::ClassNotFound(other_class_hash)));
246-
}
247-
248186
// Verify we get None/BlockNotFound when trying to call read methods with a block number that does
249187
// not exist.
250188
#[tokio::test]
@@ -299,21 +237,6 @@ async fn test_block_not_found() {
299237
get_class_hash_at_result,
300238
Err(StateSyncError::BlockNotFound(non_existing_block_number))
301239
);
302-
303-
let response = state_sync
304-
.handle_request(StateSyncRequest::GetCompiledClassDeprecated(
305-
non_existing_block_number,
306-
Default::default(),
307-
))
308-
.await;
309-
let StateSyncResponse::GetCompiledClassDeprecated(get_compiled_class_result) = response else {
310-
panic!("Expected StateSyncResponse::GetCompiledClassDeprecated(_), but got {:?}", response);
311-
};
312-
313-
assert_eq!(
314-
get_compiled_class_result,
315-
Err(StateSyncError::BlockNotFound(non_existing_block_number))
316-
);
317240
}
318241

319242
#[tokio::test]

0 commit comments

Comments
 (0)