Skip to content

Commit ae0ad3a

Browse files
committed
wip
1 parent 479c2fe commit ae0ad3a

File tree

27 files changed

+264
-180
lines changed

27 files changed

+264
-180
lines changed

crates/chain-spec/tests/rollup.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ use katana_primitives::contract::Nonce;
1919
use katana_primitives::transaction::TxType;
2020
use katana_primitives::Felt;
2121
use katana_provider::api::state::StateFactoryProvider;
22-
use katana_provider::providers::db::DbProvider;
2322
use katana_provider::{DbProviderFactory, ProviderFactory};
2423
use url::Url;
2524

crates/core/src/backend/mod.rs

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,17 @@ use tracing::info;
3434

3535
pub mod storage;
3636

37-
use self::storage::Blockchain;
37+
use crate::backend::storage::GenericStorageProvider;
3838
use crate::env::BlockContextGenerator;
3939
use crate::service::block_producer::{BlockProductionError, MinedBlockOutcome};
4040
use crate::utils::get_current_timestamp;
4141

4242
pub(crate) const LOG_TARGET: &str = "katana::core::backend";
4343

44-
#[derive(Debug)]
4544
pub struct Backend<EF> {
4645
pub chain_spec: Arc<ChainSpec>,
4746
/// stores all block related data in memory
48-
pub blockchain: Blockchain,
47+
pub storage: GenericStorageProvider,
4948
/// The block context generator.
5049
pub block_context_generator: RwLock<BlockContextGenerator>,
5150

@@ -54,15 +53,27 @@ pub struct Backend<EF> {
5453
pub gas_oracle: GasPriceOracle,
5554
}
5655

56+
impl<EF> std::fmt::Debug for Backend<EF> {
57+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
58+
f.debug_struct("Backend")
59+
.field("chain_spec", &self.chain_spec)
60+
.field("storage", &"..")
61+
.field("block_context_generator", &self.block_context_generator)
62+
.field("executor_factory", &"Arc<EF>")
63+
.field("gas_oracle", &self.gas_oracle)
64+
.finish()
65+
}
66+
}
67+
5768
impl<EF> Backend<EF> {
5869
pub fn new(
5970
chain_spec: Arc<ChainSpec>,
60-
blockchain: Blockchain,
71+
storage: GenericStorageProvider,
6172
gas_oracle: GasPriceOracle,
6273
executor_factory: EF,
6374
) -> Self {
6475
Self {
65-
blockchain,
76+
storage,
6677
chain_spec,
6778
gas_oracle,
6879
executor_factory: Arc::new(executor_factory),
@@ -110,7 +121,7 @@ impl<EF: ExecutorFactory> Backend<EF> {
110121
BlockHash::ZERO
111122
} else {
112123
let parent_block_num = block_env.number - 1;
113-
self.blockchain
124+
self.storage
114125
.provider()
115126
.block_hash_by_num(parent_block_num)?
116127
.expect("qed; missing block hash for parent block")
@@ -129,7 +140,7 @@ impl<EF: ExecutorFactory> Backend<EF> {
129140
l1_data_gas_prices: block_env.l1_data_gas_prices.clone(),
130141
};
131142

132-
let provider = self.blockchain.provider();
143+
let provider = self.storage.provider_mut();
133144
let block = commit_block(
134145
provider,
135146
partial_header,
@@ -172,8 +183,8 @@ impl<EF: ExecutorFactory> Backend<EF> {
172183
)));
173184
}
174185

175-
self.blockchain
176-
.provider()
186+
self.storage
187+
.provider_mut()
177188
.insert_block_with_states_and_receipts(block, states, receipts, traces)?;
178189
Ok(())
179190
}
@@ -217,7 +228,7 @@ impl<EF: ExecutorFactory> Backend<EF> {
217228
&self,
218229
chain_spec: &katana_chain_spec::dev::ChainSpec,
219230
) -> anyhow::Result<()> {
220-
let provider = self.blockchain.provider();
231+
let provider = self.storage.provider();
221232

222233
// check whether the genesis block has been initialized
223234
let local_hash = provider.block_hash_by_num(chain_spec.genesis.number)?;
@@ -275,7 +286,7 @@ impl<EF: ExecutorFactory> Backend<EF> {
275286
&self,
276287
chain_spec: &katana_chain_spec::rollup::ChainSpec,
277288
) -> anyhow::Result<()> {
278-
let provider = self.blockchain.provider();
289+
let provider = self.storage.provider();
279290

280291
let block = chain_spec.block();
281292
let header = block.header.clone();
@@ -323,7 +334,7 @@ impl<EF: ExecutorFactory> Backend<EF> {
323334
info!("Genesis has already been initialized");
324335
} else {
325336
let block = commit_genesis_block(
326-
self.blockchain.provider(),
337+
self.storage.provider_mut(),
327338
header,
328339
transactions,
329340
&receipts,

crates/core/src/backend/storage.rs

Lines changed: 97 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
use std::sync::Arc;
2+
13
use anyhow::{bail, Context, Result};
24
use katana_primitives::block::{
35
BlockHashOrNumber, BlockIdOrTag, BlockNumber, FinalityStatus, GasPrices, Header, SealedBlock,
46
SealedBlockWithStatus,
57
};
6-
use katana_provider::api::block::{BlockProvider, BlockWriter};
8+
use katana_provider::api::block::{BlockIdReader, BlockProvider, BlockWriter};
79
use katana_provider::api::contract::ContractClassWriter;
810
use katana_provider::api::env::BlockEnvProvider;
911
use katana_provider::api::stage::StageCheckpointProvider;
@@ -14,8 +16,7 @@ use katana_provider::api::transaction::{
1416
TransactionsProviderExt,
1517
};
1618
use katana_provider::api::trie::TrieWriter;
17-
use katana_provider::providers::db::DbProvider;
18-
use katana_provider::providers::fork::ForkedProvider;
19+
use katana_provider::{DbProviderFactory, ForkProviderFactory, ProviderFactory};
1920
use katana_rpc_client::starknet::Client as StarknetClient;
2021
use katana_rpc_client::HttpClientBuilder;
2122
use katana_rpc_types::GetBlockWithTxHashesResponse;
@@ -24,79 +25,39 @@ use starknet::core::utils::parse_cairo_short_string;
2425
use tracing::info;
2526
use url::Url;
2627

27-
pub trait DatabaseRO:
28-
BlockProvider
29-
+ TransactionProvider
30-
+ TransactionStatusProvider
31-
+ TransactionTraceProvider
32-
+ TransactionsProviderExt
33-
+ ReceiptProvider
34-
+ StateUpdateProvider
35-
+ StateFactoryProvider
36-
+ BlockEnvProvider
37-
+ 'static
38-
+ Send
39-
+ Sync
40-
+ core::fmt::Debug
41-
{
42-
}
43-
44-
pub trait DatabaseRW:
45-
DatabaseRO + BlockWriter + StateWriter + ContractClassWriter + TrieWriter + StageCheckpointProvider
46-
{
47-
}
48-
49-
impl<T> DatabaseRO for T where
50-
T: BlockProvider
51-
+ TransactionProvider
52-
+ TransactionStatusProvider
53-
+ TransactionTraceProvider
54-
+ TransactionsProviderExt
55-
+ ReceiptProvider
56-
+ StateUpdateProvider
57-
+ StateFactoryProvider
58-
+ BlockEnvProvider
59-
+ 'static
60-
+ Send
61-
+ Sync
62-
+ core::fmt::Debug
63-
{
64-
}
65-
66-
impl<T> DatabaseRW for T where
67-
T: DatabaseRO
68-
+ BlockWriter
69-
+ StateWriter
70-
+ ContractClassWriter
71-
+ TrieWriter
72-
+ StageCheckpointProvider
73-
{
74-
}
28+
pub type GenericStorageProvider =
29+
Arc<dyn ProviderFactory<Provider = Box<dyn DatabaseRO>, ProviderMut = Box<dyn DatabaseRW>>>;
7530

7631
#[derive(Debug, Clone)]
77-
pub struct Blockchain {
78-
inner: BlockchainProvider<Box<dyn DatabaseRW>>,
32+
pub struct StorageProvider<P> {
33+
provider_factory: P,
7934
}
8035

81-
impl Blockchain {
82-
pub fn new(provider: impl DatabaseRW) -> Self {
83-
Self { inner: BlockchainProvider::new(Box::new(provider)) }
36+
impl<P: ProviderFactory> StorageProvider<P> {
37+
pub fn new(provider_factory: P) -> Self {
38+
Self { provider_factory }
8439
}
40+
}
8541

86-
/// Creates a new [Blockchain] from a database at `path` and `genesis` state.
42+
impl StorageProvider<DbProviderFactory<katana_db::Db>> {
8743
pub fn new_with_db(db: katana_db::Db) -> Self {
88-
Self::new(DbProvider::new(db))
44+
Self::new(DbProviderFactory::new(db))
45+
}
46+
47+
pub fn new_in_memory() -> Self {
48+
Self::new(DbProviderFactory::new_in_memory())
8949
}
50+
}
9051

52+
impl StorageProvider<ForkProviderFactory<katana_db::Db>> {
9153
/// Builds a new blockchain with a forked block.
92-
pub async fn new_from_forked(
54+
pub async fn new_forked(
9355
db: katana_db::Db,
94-
fork_url: Url,
56+
client: StarknetClient,
9557
fork_block: Option<BlockHashOrNumber>,
9658
chain: &mut katana_chain_spec::dev::ChainSpec,
9759
) -> Result<(Self, BlockNumber)> {
98-
let provider = StarknetClient::new(HttpClientBuilder::new().build(fork_url)?);
99-
let chain_id = provider.chain_id().await.context("failed to fetch forked network id")?;
60+
let chain_id = client.chain_id().await.context("failed to fetch forked network id")?;
10061

10162
// if the id is not in ASCII encoding, we display the chain id as is in hex.
10263
let parsed_id = match parse_cairo_short_string(&chain_id) {
@@ -109,13 +70,13 @@ impl Blockchain {
10970
let block_id = if let Some(id) = fork_block {
11071
id
11172
} else {
112-
let res = provider.block_number().await?;
73+
let res = client.block_number().await?;
11374
BlockHashOrNumber::Num(res.block_number)
11475
};
11576

11677
info!(chain = %parsed_id, block = %block_id, "Forking chain.");
11778

118-
let block = provider
79+
let block = client
11980
.get_block_with_tx_hashes(BlockIdOrTag::from(block_id))
12081
.await
12182
.context("failed to fetch forked block")?;
@@ -145,15 +106,15 @@ impl Blockchain {
145106

146107
// TODO: convert this to block number instead of BlockHashOrNumber so that it is easier to
147108
// check if the requested block is within the supported range or not.
148-
let database = ForkedProvider::new(db, block_num, provider.clone());
109+
let provider_factory = ForkProviderFactory::new(db, block_num, client.clone());
149110

150111
// initialize parent fork block
151112
//
152113
// NOTE: this is just a workaround for allowing forked genesis block to be initialize using
153114
// `Backend::do_mine_block`.
154115
{
155116
let parent_block_id = BlockIdOrTag::from(forked_block.parent_hash);
156-
let parent_block = provider.get_block_with_tx_hashes(parent_block_id).await?;
117+
let parent_block = client.get_block_with_tx_hashes(parent_block_id).await?;
157118

158119
let GetBlockWithTxHashesResponse::Block(parent_block) = parent_block else {
159120
bail!("parent block is a preconfirmed block");
@@ -175,7 +136,8 @@ impl Blockchain {
175136
status: FinalityStatus::AcceptedOnL2,
176137
};
177138

178-
database
139+
provider_factory
140+
.provider_mut()
179141
.insert_block_with_states_and_receipts(
180142
parent_block,
181143
Default::default(),
@@ -201,10 +163,75 @@ impl Blockchain {
201163

202164
block.header.l1_da_mode = forked_block.l1_da_mode;
203165

204-
Ok((Self::new(database), block_num))
166+
Ok((Self::new(provider_factory), block_num))
205167
}
168+
}
206169

207-
pub fn provider(&self) -> &BlockchainProvider<Box<dyn Database>> {
208-
&self.inner
170+
impl<P> ProviderFactory for StorageProvider<P>
171+
where
172+
P: ProviderFactory,
173+
<P as ProviderFactory>::Provider: DatabaseRO,
174+
<P as ProviderFactory>::ProviderMut: DatabaseRW,
175+
{
176+
type Provider = Box<dyn DatabaseRO>;
177+
type ProviderMut = Box<dyn DatabaseRW>;
178+
179+
fn provider(&self) -> Self::Provider {
180+
Box::new(self.provider_factory.provider_mut())
181+
}
182+
183+
fn provider_mut(&self) -> Self::ProviderMut {
184+
Box::new(self.provider_factory.provider_mut())
209185
}
210186
}
187+
188+
pub trait DatabaseRO:
189+
BlockIdReader
190+
+ BlockProvider
191+
+ TransactionProvider
192+
+ TransactionStatusProvider
193+
+ TransactionTraceProvider
194+
+ TransactionsProviderExt
195+
+ ReceiptProvider
196+
+ StateUpdateProvider
197+
+ StateFactoryProvider
198+
+ BlockEnvProvider
199+
+ 'static
200+
+ Send
201+
+ Sync
202+
+ core::fmt::Debug
203+
{
204+
}
205+
206+
pub trait DatabaseRW:
207+
DatabaseRO + BlockWriter + StateWriter + ContractClassWriter + TrieWriter + StageCheckpointProvider
208+
{
209+
}
210+
211+
impl<T> DatabaseRO for T where
212+
T: BlockProvider
213+
+ BlockIdReader
214+
+ TransactionProvider
215+
+ TransactionStatusProvider
216+
+ TransactionTraceProvider
217+
+ TransactionsProviderExt
218+
+ ReceiptProvider
219+
+ StateUpdateProvider
220+
+ StateFactoryProvider
221+
+ BlockEnvProvider
222+
+ 'static
223+
+ Send
224+
+ Sync
225+
+ core::fmt::Debug
226+
{
227+
}
228+
229+
impl<T> DatabaseRW for T where
230+
T: DatabaseRO
231+
+ BlockWriter
232+
+ StateWriter
233+
+ ContractClassWriter
234+
+ TrieWriter
235+
+ StageCheckpointProvider
236+
{
237+
}

0 commit comments

Comments
 (0)