Skip to content

Commit f1c567a

Browse files
committed
wip
1 parent 30a6fe0 commit f1c567a

File tree

10 files changed

+233
-145
lines changed

10 files changed

+233
-145
lines changed

crates/core/src/backend/mod.rs

Lines changed: 31 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -178,9 +178,9 @@ where
178178
l1_data_gas_prices: block_env.l1_data_gas_prices.clone(),
179179
};
180180

181-
let provider = self.storage.provider_mut();
181+
let provider_mut = self.storage.provider_mut();
182182
let block = commit_block(
183-
provider,
183+
&provider_mut,
184184
partial_header,
185185
transactions,
186186
&receipts,
@@ -194,10 +194,12 @@ where
194194
// TODO: maybe should change the arguments for insert_block_with_states_and_receipts to
195195
// accept ReceiptWithTxHash instead to avoid this conversion.
196196
let receipts = receipts.into_iter().map(|r| r.receipt).collect::<Vec<_>>();
197-
self.store_block(block, execution_output.states, receipts, traces)?;
197+
store_block(&provider_mut, block, execution_output.states, receipts, traces)?;
198198

199199
info!(target: LOG_TARGET, %block_number, %tx_count, "Block mined.");
200200

201+
provider_mut.commit()?;
202+
201203
Ok(MinedBlockOutcome {
202204
block_hash,
203205
block_number,
@@ -206,28 +208,6 @@ where
206208
})
207209
}
208210

209-
fn store_block(
210-
&self,
211-
block: SealedBlockWithStatus,
212-
states: StateUpdatesWithClasses,
213-
receipts: Vec<Receipt>,
214-
traces: Vec<TypedTransactionExecutionInfo>,
215-
) -> Result<(), BlockProductionError> {
216-
// Validate that all declared classes have their corresponding class artifacts
217-
if let Err(missing) = states.validate_classes() {
218-
return Err(BlockProductionError::InconsistentState(format!(
219-
"missing class artifacts for declared classes: {:#?}",
220-
missing,
221-
)));
222-
}
223-
224-
let provider_mut = self.storage.provider_mut();
225-
provider_mut.insert_block_with_states_and_receipts(block, states, receipts, traces)?;
226-
provider_mut.commit()?;
227-
228-
Ok(())
229-
}
230-
231211
pub fn mine_empty_block(
232212
&self,
233213
block_env: &BlockEnv,
@@ -349,8 +329,10 @@ where
349329

350330
info!("Genesis has already been initialized");
351331
} else {
332+
let provider_mut = self.storage.provider_mut();
333+
352334
let block = commit_genesis_block(
353-
self.storage.provider_mut(),
335+
&provider_mut,
354336
header,
355337
transactions,
356338
&receipts,
@@ -362,8 +344,9 @@ where
362344
// TODO: maybe should change the arguments for insert_block_with_states_and_receipts to
363345
// accept ReceiptWithTxHash instead to avoid this conversion.
364346
let receipts = receipts.into_iter().map(|r| r.receipt).collect::<Vec<_>>();
365-
self.store_block(block, output.states, receipts, traces)?;
347+
store_block(&provider_mut, block, output.states, receipts, traces)?;
366348

349+
provider_mut.commit()?;
367350
info!("Genesis initialized");
368351
}
369352

@@ -558,6 +541,25 @@ impl<'a, P: TrieWriter> UncommittedBlock<'a, P> {
558541
}
559542
}
560543

544+
fn store_block(
545+
provider_mut: &impl BlockWriter,
546+
block: SealedBlockWithStatus,
547+
states: StateUpdatesWithClasses,
548+
receipts: Vec<Receipt>,
549+
traces: Vec<TypedTransactionExecutionInfo>,
550+
) -> Result<(), BlockProductionError> {
551+
// Validate that all declared classes have their corresponding class artifacts
552+
if let Err(missing) = states.validate_classes() {
553+
return Err(BlockProductionError::InconsistentState(format!(
554+
"missing class artifacts for declared classes: {:#?}",
555+
missing,
556+
)));
557+
}
558+
559+
provider_mut.insert_block_with_states_and_receipts(block, states, receipts, traces)?;
560+
Ok(())
561+
}
562+
561563
// TODO: create a dedicated struct for this contract.
562564
// https://docs.starknet.io/architecture-and-concepts/network-architecture/starknet-state/#address_0x1
563565
fn update_block_hash_registry_contract(
@@ -587,8 +589,8 @@ fn update_block_hash_registry_contract(
587589
Ok(())
588590
}
589591

590-
fn commit_block(
591-
provider: impl ProviderRW,
592+
fn commit_block<P: BlockHashProvider + TrieWriter>(
593+
provider: P,
592594
header: PartialHeader,
593595
transactions: Vec<TxWithHash>,
594596
receipts: &[ReceiptWithTxHash],

crates/core/src/service/block_producer.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -694,7 +694,7 @@ where
694694

695695
// TODO: don't use the previous block env, we should create on based on the current state of
696696
// the l1 (to determine the proper gas prices)
697-
let latest_num = provider.latest_number()?;
697+
let latest_num = dbg!(provider.latest_number()?);
698698
let mut block_env = provider.block_env_at(BlockHashOrNumber::Num(latest_num))?.unwrap();
699699
backend.update_block_env(&mut block_env);
700700

crates/node/src/lib.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,9 @@ where
172172
chain_spec: config.chain.clone(),
173173
});
174174

175+
println!("initializing genesis");
175176
backend.init_genesis(config.forking.is_some()).context("failed to initialize genesis")?;
177+
println!("genesis initialized");
176178

177179
// --- build block producer
178180

@@ -306,6 +308,8 @@ where
306308
None
307309
};
308310

311+
println!("node built");
312+
309313
Ok(Node {
310314
provider,
311315
pool,
@@ -419,6 +423,7 @@ impl Node<ForkProviderFactory> {
419423

420424
block.header.l1_da_mode = forked_block.l1_da_mode;
421425

426+
println!("ohayo");
422427
Self::build_with_provider(provider_factory, config)
423428
}
424429
}

crates/rpc/rpc-server/tests/forking.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use katana_rpc_types::{
1414
BlockNumberResponse, EventFilter, GetBlockWithReceiptsResponse, GetBlockWithTxHashesResponse,
1515
MaybePreConfirmedBlock,
1616
};
17+
use katana_utils::node::ForkTestNode;
1718
use katana_utils::TestNode;
1819
use url::Url;
1920

@@ -36,12 +37,12 @@ type LocalTestVector = Vec<((BlockNumber, BlockHash), TxHash)>;
3637
/// a single transaction.
3738
///
3839
/// The returned [`TestVector`] is a list of all the locally created blocks and transactions.
39-
async fn setup_test_inner(no_mining: bool) -> (TestNode, StarknetClient, LocalTestVector) {
40+
async fn setup_test_inner(no_mining: bool) -> (ForkTestNode, StarknetClient, LocalTestVector) {
4041
let mut config = katana_utils::node::test_config();
4142
config.sequencing.no_mining = no_mining;
4243
config.forking = Some(forking_cfg());
4344

44-
let sequencer = TestNode::new_with_config(config).await;
45+
let sequencer = TestNode::new_forked_with_config(config).await;
4546
let provider = sequencer.starknet_rpc_client();
4647

4748
let mut txs_vector: LocalTestVector = Vec::new();
@@ -72,7 +73,7 @@ async fn setup_test_inner(no_mining: bool) -> (TestNode, StarknetClient, LocalTe
7273
let block_num = (FORK_BLOCK_NUMBER + 1) + i; // plus 1 because fork genesis is FORK_BLOCK_NUMBER + 1
7374

7475
let block_id = BlockIdOrTag::Number(block_num);
75-
let block = provider.get_block_with_tx_hashes(block_id).await.unwrap();
76+
let block = provider.get_block_with_tx_hashes(dbg!(block_id)).await.unwrap();
7677
let block_hash = match block {
7778
GetBlockWithTxHashesResponse::Block(b) => {
7879
assert_eq!(b.transactions.len(), 1);
@@ -89,11 +90,11 @@ async fn setup_test_inner(no_mining: bool) -> (TestNode, StarknetClient, LocalTe
8990
(sequencer, provider, txs_vector)
9091
}
9192

92-
async fn setup_test() -> (TestNode, StarknetClient, LocalTestVector) {
93+
async fn setup_test() -> (ForkTestNode, StarknetClient, LocalTestVector) {
9394
setup_test_inner(false).await
9495
}
9596

96-
async fn setup_test_pending() -> (TestNode, StarknetClient, LocalTestVector) {
97+
async fn setup_test_pending() -> (ForkTestNode, StarknetClient, LocalTestVector) {
9798
setup_test_inner(true).await
9899
}
99100

crates/storage/provider/provider/src/lib.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -106,23 +106,22 @@ impl Debug for ForkProviderFactory {
106106
}
107107

108108
impl ProviderFactory for ForkProviderFactory {
109-
type Provider =
110-
ForkedProvider<<katana_db::Db as Database>::Tx, <katana_db::Db as Database>::TxMut>;
109+
type Provider = ForkedProvider<<katana_db::Db as Database>::Tx>;
111110

112-
type ProviderMut =
113-
ForkedProvider<<katana_db::Db as Database>::TxMut, <katana_db::Db as Database>::TxMut>;
111+
type ProviderMut = ForkedProvider<<katana_db::Db as Database>::TxMut>;
114112

115113
fn provider(&self) -> Self::Provider {
116114
ForkedProvider::new(
117115
self.local_factory.provider(),
118-
ForkedDb::new(self.backend.clone(), self.block_id, self.fork_factory.provider_mut()),
116+
ForkedDb::new(self.backend.clone(), self.block_id, self.fork_factory.clone()),
119117
)
120118
}
121119

122120
fn provider_mut(&self) -> Self::ProviderMut {
121+
dbg!("creating provider_mut");
123122
ForkedProvider::new(
124123
self.local_factory.provider_mut(),
125-
ForkedDb::new(self.backend.clone(), self.block_id, self.fork_factory.provider_mut()),
124+
ForkedDb::new(self.backend.clone(), self.block_id, self.fork_factory.clone()),
126125
)
127126
}
128127
}

0 commit comments

Comments
 (0)