Skip to content

Commit 49a464c

Browse files
committed
fix tests
1 parent e12004f commit 49a464c

File tree

23 files changed

+274
-349
lines changed

23 files changed

+274
-349
lines changed

Cargo.lock

Lines changed: 0 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bin/katana/tests/db_prune.rs

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,18 @@ use anyhow::{anyhow, Context, Result};
44
use clap::Parser;
55
use fixtures::{db, TempDb};
66
use katana::cli::Cli;
7-
use katana_db::abstraction::Database;
87
use katana_primitives::Felt;
98
use katana_provider::api::block::BlockNumberProvider;
109
use katana_provider::api::state::{StateFactoryProvider, StateRootProvider};
11-
use katana_provider::providers::db::DbProvider;
10+
use katana_provider::ProviderFactory;
1211
use rstest::*;
1312

1413
mod fixtures;
1514

1615
/// Verify that historical state roots can be retrieved for specific blocks
1716
/// Returns Ok(()) if the state root can be retrieved, Err if it cannot
18-
fn historical_roots<Db: Database>(
19-
provider: &DbProvider<Db>,
17+
fn historical_roots(
18+
provider: impl StateFactoryProvider,
2019
block_number: u64,
2120
) -> Result<(Felt, Felt)> {
2221
let historical = provider
@@ -33,7 +32,7 @@ fn historical_roots<Db: Database>(
3332
}
3433

3534
/// Get the current state roots (classes and contracts)
36-
fn latest_roots<Db: Database>(provider: &DbProvider<Db>) -> Result<(Felt, Felt)> {
35+
fn latest_roots(provider: impl StateFactoryProvider) -> Result<(Felt, Felt)> {
3736
let state_provider = provider.latest().context("failed to get latest state provider")?;
3837
let classes_root = state_provider.classes_root().context("failed to get classes root")?;
3938
let contracts_root = state_provider.contracts_root().context("failed to get contracts root")?;
@@ -42,7 +41,9 @@ fn latest_roots<Db: Database>(provider: &DbProvider<Db>) -> Result<(Felt, Felt)>
4241

4342
#[rstest]
4443
fn prune_latest_removes_all_history(db: TempDb) {
45-
let provider = db.provider_ro();
44+
let provider_factory = db.provider_factory();
45+
let provider = provider_factory.provider();
46+
4647
let latest_block = provider.latest_number().unwrap();
4748

4849
for num in 1..=latest_block {
@@ -52,13 +53,16 @@ fn prune_latest_removes_all_history(db: TempDb) {
5253
}
5354

5455
let (initial_classes_root, initial_contracts_root) = latest_roots(&provider).unwrap();
56+
5557
drop(provider);
58+
drop(provider_factory);
5659

5760
// Will prune all historical tries (blocks < 15)
5861
let path = db.path_str();
5962
Cli::parse_from(["katana", "db", "prune", "--path", path, "--latest", "-y"]).run().unwrap();
6063

61-
let provider = db.provider_ro();
64+
let provider_factory = db.provider_factory();
65+
let provider = provider_factory.provider();
6266

6367
// Verify historical states (0 -> 14) are no longer accessible (ie zero)
6468
for num in 0..=14u64 {
@@ -85,7 +89,9 @@ fn prune_latest_removes_all_history(db: TempDb) {
8589

8690
#[rstest]
8791
fn prune_keep_last_n_blocks(db: TempDb) {
88-
let provider = db.provider_ro();
92+
let provider_factory = db.provider_factory();
93+
let provider = provider_factory.provider();
94+
8995
let latest_block = provider.latest_number().unwrap();
9096

9197
// block -> (classes root, contracts root)
@@ -99,15 +105,19 @@ fn prune_keep_last_n_blocks(db: TempDb) {
99105
}
100106

101107
let (initial_classes_root, initial_contracts_root) = latest_roots(&provider).unwrap();
108+
102109
drop(provider);
110+
drop(provider_factory);
103111

104112
let keep_last_n = 3;
105113
let path = db.path_str();
106114
Cli::parse_from(["katana", "db", "prune", "--path", path, "--keep-last", "3", "-y"])
107115
.run()
108116
.unwrap();
109117

110-
let provider = db.provider_ro();
118+
let provider_factory = db.provider_factory();
119+
let provider = provider_factory.provider();
120+
111121
let (final_classes_root, final_contracts_root) = latest_roots(&provider).unwrap();
112122

113123
// pruned blocks (ie blocks before the cuttoff point) should be zero
@@ -141,7 +151,9 @@ fn prune_keep_last_n_blocks(db: TempDb) {
141151

142152
#[rstest]
143153
fn prune_keep_last_n_blocks_exceeds_available(db: TempDb) {
144-
let provider = db.provider_ro();
154+
let provider_factory = db.provider_factory();
155+
let provider = provider_factory.provider();
156+
145157
let latest_block = provider.latest_number().unwrap();
146158

147159
// block -> (classes root, contracts root)
@@ -156,7 +168,9 @@ fn prune_keep_last_n_blocks_exceeds_available(db: TempDb) {
156168
}
157169

158170
let (initial_classes_root, initial_contracts_root) = latest_roots(&provider).unwrap();
171+
159172
drop(provider);
173+
drop(provider_factory);
160174

161175
// Request to keep more blocks than are available
162176
let keep_last_n = latest_block + 10;
@@ -176,7 +190,9 @@ fn prune_keep_last_n_blocks_exceeds_available(db: TempDb) {
176190
.run()
177191
.unwrap();
178192

179-
let provider = db.provider_ro();
193+
let provider_factory = db.provider_factory();
194+
let provider = provider_factory.provider();
195+
180196
let (final_classes_root, final_contracts_root) = latest_roots(&provider).unwrap();
181197

182198
// Verify that NO pruning occurred - all historical states should still be accessible

bin/katana/tests/fixtures.rs

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use katana_primitives::contract::{ContractAddress, Nonce, StorageKey, StorageVal
66
use katana_primitives::state::{StateUpdates, StateUpdatesWithClasses};
77
use katana_provider::api::block::BlockWriter;
88
use katana_provider::api::trie::TrieWriter;
9-
use katana_provider::providers::db::DbProvider;
9+
use katana_provider::{DbProviderFactory, MutableProvider, ProviderFactory};
1010
use katana_utils::arbitrary;
1111
use rstest::*;
1212
use tempfile::TempDir;
@@ -23,25 +23,17 @@ impl TempDb {
2323
Self { temp_dir }
2424
}
2525

26-
pub fn provider_ro(&self) -> DbProvider {
27-
DbProvider::new(self.open_ro())
26+
pub fn provider_factory(&self) -> DbProviderFactory {
27+
DbProviderFactory::new(self.open_rw())
2828
}
2929

30-
pub fn provider_rw(&self) -> DbProvider {
31-
DbProvider::new(self.open_rw())
32-
}
33-
34-
fn open_ro(&self) -> katana_db::Db {
35-
katana::cli::db::open_db_ro(self.path_str()).unwrap()
30+
pub fn path_str(&self) -> &str {
31+
self.temp_dir.path().to_str().unwrap()
3632
}
3733

3834
fn open_rw(&self) -> katana_db::Db {
3935
katana::cli::db::open_db_rw(self.path_str()).unwrap()
4036
}
41-
42-
pub fn path_str(&self) -> &str {
43-
self.temp_dir.path().to_str().unwrap()
44-
}
4537
}
4638

4739
impl Default for TempDb {
@@ -66,7 +58,8 @@ pub fn db() -> TempDb {
6658

6759
/// Populate database with test data using the TrieWriter trait
6860
fn populate_db(db: &TempDb) {
69-
let provider = db.provider_rw();
61+
let provider_factory = db.provider_factory();
62+
let provider = provider_factory.provider_mut();
7063

7164
for num in 0..=15u64 {
7265
let mut classes = BTreeMap::new();
@@ -137,4 +130,6 @@ fn populate_db(db: &TempDb) {
137130
)
138131
.unwrap();
139132
}
133+
134+
provider.commit().expect("failed to commit");
140135
}

crates/core/Cargo.toml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,12 @@ version.workspace = true
88

99
[dependencies]
1010
katana-chain-spec.workspace = true
11-
katana-db.workspace = true
1211
katana-executor.workspace = true
1312
katana-gas-price-oracle.workspace = true
1413
katana-metrics.workspace = true
1514
katana-pool.workspace = true
1615
katana-primitives = { workspace = true, features = [ "arbitrary" ] }
1716
katana-provider.workspace = true
18-
katana-rpc-client.workspace = true
1917
katana-rpc-types.workspace = true
2018
katana-tasks.workspace = true
2119
katana-trie.workspace = true

crates/core/benches/commit.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use katana_primitives::state::StateUpdates;
1010
use katana_primitives::transaction::TxWithHash;
1111
use katana_primitives::{ContractAddress, Felt};
1212
use katana_provider::providers::db::DbProvider;
13+
use katana_provider::DbProviderFactory;
1314
use pprof::criterion::{Output, PProfProfiler};
1415

1516
struct BlockConfig {
@@ -42,11 +43,11 @@ const BIG_BLOCK_CONFIG: BlockConfig = BlockConfig {
4243
nb_of_contracts: 100,
4344
};
4445

45-
fn commit(block: UncommittedBlock<'_, DbProvider>) {
46+
fn commit(block: UncommittedBlock<'_, DbProviderFactory>) {
4647
let _ = block.commit();
4748
}
4849

49-
fn commit_parallel(block: UncommittedBlock<'_, DbProvider>) {
50+
fn commit_parallel(block: UncommittedBlock<'_, DbProviderFactory>) {
5051
let _ = block.commit_parallel();
5152
}
5253

crates/core/src/backend/storage.rs

Lines changed: 1 addition & 134 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
1-
use std::sync::Arc;
2-
3-
use anyhow::{bail, Context, Result};
4-
use katana_primitives::block::{BlockHashOrNumber, BlockIdOrTag, GasPrices};
51
use katana_provider::api::block::{BlockIdReader, BlockProvider, BlockWriter};
62
use katana_provider::api::contract::ContractClassWriter;
73
use katana_provider::api::env::BlockEnvProvider;
@@ -13,136 +9,7 @@ use katana_provider::api::transaction::{
139
TransactionsProviderExt,
1410
};
1511
use katana_provider::api::trie::TrieWriter;
16-
use katana_provider::{DbProviderFactory, ForkProviderFactory, MutableProvider, ProviderFactory};
17-
use katana_rpc_client::starknet::Client as StarknetClient;
18-
use katana_rpc_types::GetBlockWithTxHashesResponse;
19-
use num_traits::ToPrimitive;
20-
use starknet::core::utils::parse_cairo_short_string;
21-
use tracing::info;
22-
use url::Url;
23-
24-
pub type GenericStorageProvider =
25-
Arc<dyn ProviderFactory<Provider = Box<dyn DatabaseRO>, ProviderMut = Box<dyn DatabaseRW>>>;
26-
27-
#[derive(Debug, Clone)]
28-
pub struct StorageProvider<P> {
29-
provider_factory: P,
30-
}
31-
32-
impl<P: ProviderFactory> StorageProvider<P> {
33-
pub fn new(provider_factory: P) -> Self {
34-
Self { provider_factory }
35-
}
36-
}
37-
38-
impl StorageProvider<DbProviderFactory<katana_db::Db>> {
39-
pub fn new_with_db(db: katana_db::Db) -> Self {
40-
Self::new(DbProviderFactory::new(db))
41-
}
42-
43-
pub fn new_in_memory() -> Self {
44-
Self::new(DbProviderFactory::new_in_memory())
45-
}
46-
}
47-
48-
impl StorageProvider<ForkProviderFactory> {
49-
/// Builds a new blockchain with a forked block.
50-
pub async fn new_forked(
51-
db: katana_db::Db,
52-
fork_url: Url,
53-
fork_block: Option<BlockHashOrNumber>,
54-
chain: &mut katana_chain_spec::dev::ChainSpec,
55-
) -> Result<Self> {
56-
let client = StarknetClient::new(fork_url);
57-
let chain_id = client.chain_id().await.context("failed to fetch forked network id")?;
58-
59-
// if the id is not in ASCII encoding, we display the chain id as is in hex.
60-
let parsed_id = match parse_cairo_short_string(&chain_id) {
61-
Ok(id) => id,
62-
Err(_) => format!("{chain_id:#x}"),
63-
};
64-
65-
// If the fork block number is not specified, we use the latest accepted block on the forked
66-
// network.
67-
let block_id = if let Some(id) = fork_block {
68-
id
69-
} else {
70-
let res = client.block_number().await?;
71-
BlockHashOrNumber::Num(res.block_number)
72-
};
73-
74-
info!(chain = %parsed_id, block = %block_id, "Forking chain.");
75-
76-
let block = client
77-
.get_block_with_tx_hashes(BlockIdOrTag::from(block_id))
78-
.await
79-
.context("failed to fetch forked block")?;
80-
81-
let GetBlockWithTxHashesResponse::Block(forked_block) = block else {
82-
bail!("forking a pending block is not allowed")
83-
};
84-
85-
let block_num = forked_block.block_number;
86-
let genesis_block_num = block_num + 1;
87-
88-
chain.id = chain_id.into();
89-
90-
// adjust the genesis to match the forked block
91-
chain.genesis.timestamp = forked_block.timestamp;
92-
chain.genesis.number = genesis_block_num;
93-
chain.genesis.state_root = Default::default();
94-
chain.genesis.parent_hash = forked_block.parent_hash;
95-
chain.genesis.sequencer_address = forked_block.sequencer_address;
96-
97-
// TODO: remove gas price from genesis
98-
let eth_l1_gas_price =
99-
forked_block.l1_gas_price.price_in_wei.to_u128().expect("should fit in u128");
100-
let strk_l1_gas_price =
101-
forked_block.l1_gas_price.price_in_fri.to_u128().expect("should fit in u128");
102-
chain.genesis.gas_prices =
103-
unsafe { GasPrices::new_unchecked(eth_l1_gas_price, strk_l1_gas_price) };
104-
105-
// TODO: convert this to block number instead of BlockHashOrNumber so that it is easier to
106-
// check if the requested block is within the supported range or not.
107-
let provider_factory = ForkProviderFactory::new(db, block_num, client.clone());
108-
109-
// update the genesis block with the forked block's data
110-
// we dont update the `l1_gas_price` bcs its already done when we set the `gas_prices` in
111-
// genesis. this flow is kinda flawed, we should probably refactor it out of the
112-
// genesis.
113-
let mut block = chain.block();
114-
115-
let eth_l1_data_gas_price =
116-
forked_block.l1_data_gas_price.price_in_wei.to_u128().expect("should fit in u128");
117-
let strk_l1_data_gas_price =
118-
forked_block.l1_data_gas_price.price_in_fri.to_u128().expect("should fit in u128");
119-
120-
block.header.l1_data_gas_prices =
121-
unsafe { GasPrices::new_unchecked(eth_l1_data_gas_price, strk_l1_data_gas_price) };
122-
123-
block.header.l1_da_mode = forked_block.l1_da_mode;
124-
125-
Ok(Self::new(provider_factory))
126-
}
127-
}
128-
129-
// impl<P> ProviderFactory for StorageProvider<P>
130-
// where
131-
// P: ProviderFactory,
132-
// <P as ProviderFactory>::Provider: DatabaseRO,
133-
// <P as ProviderFactory>::ProviderMut: DatabaseRW,
134-
// {
135-
// type Provider = Box<dyn DatabaseRO>;
136-
// type ProviderMut = Box<dyn DatabaseRW>;
137-
138-
// fn provider(&self) -> Self::Provider {
139-
// Box::new(self.provider_factory.provider_mut())
140-
// }
141-
142-
// fn provider_mut(&self) -> Self::ProviderMut {
143-
// Box::new(self.provider_factory.provider_mut())
144-
// }
145-
// }
12+
use katana_provider::MutableProvider;
14613

14714
pub trait DatabaseRO:
14815
BlockIdReader

crates/core/src/service/block_producer_tests.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@ use katana_provider::DbProviderFactory;
99

1010
use super::*;
1111

12-
fn test_backend() -> Arc<Backend<NoopExecutorFactory>> {
12+
fn test_backend() -> Arc<Backend<NoopExecutorFactory, DbProviderFactory>> {
1313
let chain_spec = Arc::new(ChainSpec::dev());
1414
let executor_factory = NoopExecutorFactory::new();
15-
let blockchain = Blockchain::new(DbProviderFactory::new_in_memory());
15+
let storage = DbProviderFactory::new_in_memory();
1616
let gas_oracle = GasPriceOracle::create_for_testing();
17-
let backend = Arc::new(Backend::new(chain_spec, blockchain, gas_oracle, executor_factory));
17+
let backend = Arc::new(Backend::new(chain_spec, storage, gas_oracle, executor_factory));
1818
backend.init_genesis(false).expect("failed to initialize genesis");
1919
backend
2020
}

0 commit comments

Comments
 (0)