Skip to content

Commit 93efef7

Browse files
committed
wip
1 parent 49cd84d commit 93efef7

File tree

15 files changed

+602
-1048
lines changed

15 files changed

+602
-1048
lines changed

crates/core/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ katana-gas-price-oracle.workspace = true
1414
katana-metrics.workspace = true
1515
katana-pool.workspace = true
1616
katana-primitives = { workspace = true, features = [ "arbitrary" ] }
17-
katana-provider = { workspace = true, features = [ "fork", "in-memory" ] }
17+
katana-provider.workspace = true
1818
katana-rpc-client.workspace = true
1919
katana-rpc-types.workspace = true
2020
katana-tasks.workspace = true

crates/core/src/backend/storage.rs

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,50 +25,55 @@ use starknet::core::utils::parse_cairo_short_string;
2525
use tracing::info;
2626
use url::Url;
2727

28-
pub trait Database:
28+
pub trait DatabaseRO:
2929
BlockProvider
30-
+ BlockWriter
3130
+ TransactionProvider
3231
+ TransactionStatusProvider
3332
+ TransactionTraceProvider
3433
+ TransactionsProviderExt
3534
+ ReceiptProvider
3635
+ StateUpdateProvider
37-
+ StateWriter
38-
+ ContractClassWriter
3936
+ StateFactoryProvider
4037
+ BlockEnvProvider
41-
+ TrieWriter
42-
+ StageCheckpointProvider
4338
+ 'static
4439
+ Send
4540
+ Sync
4641
+ core::fmt::Debug
4742
{
4843
}
4944

50-
impl<T> Database for T where
45+
pub trait DatabaseRW:
46+
DatabaseRO + BlockWriter + StateWriter + ContractClassWriter + TrieWriter + StageCheckpointProvider
47+
{
48+
}
49+
50+
impl<T> DatabaseRO for T where
5151
T: BlockProvider
52-
+ BlockWriter
5352
+ TransactionProvider
5453
+ TransactionStatusProvider
5554
+ TransactionTraceProvider
5655
+ TransactionsProviderExt
5756
+ ReceiptProvider
5857
+ StateUpdateProvider
59-
+ StateWriter
60-
+ ContractClassWriter
6158
+ StateFactoryProvider
6259
+ BlockEnvProvider
63-
+ TrieWriter
64-
+ StageCheckpointProvider
6560
+ 'static
6661
+ Send
6762
+ Sync
6863
+ core::fmt::Debug
6964
{
7065
}
7166

67+
impl<T> DatabaseRW for T where
68+
T: DatabaseRO
69+
+ BlockWriter
70+
+ StateWriter
71+
+ ContractClassWriter
72+
+ TrieWriter
73+
+ StageCheckpointProvider
74+
{
75+
}
76+
7277
#[derive(Debug, Clone)]
7378
pub struct Blockchain {
7479
inner: BlockchainProvider<Box<dyn Database>>,

crates/rpc/rpc-server/src/starknet/mod.rs

Lines changed: 37 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use std::future::Future;
55
use std::sync::Arc;
66

77
use katana_chain_spec::ChainSpec;
8-
use katana_core::backend::storage::Database;
8+
use katana_core::backend::storage::{Database, DatabaseRO, DatabaseRW};
99
use katana_core::utils::get_current_timestamp;
1010
use katana_gas_price_oracle::GasPriceOracle;
1111
use katana_pool::TransactionPool;
@@ -24,7 +24,7 @@ use katana_provider::api::transaction::{
2424
ReceiptProvider, TransactionProvider, TransactionStatusProvider, TransactionsProviderExt,
2525
};
2626
use katana_provider::api::ProviderError;
27-
use katana_provider::BlockchainProvider;
27+
use katana_provider::{BlockchainProvider, ProviderFactory};
2828
use katana_rpc_api::error::starknet::{
2929
CompilationErrorData, PageSizeTooBigData, ProofLimitExceededData, StarknetApiError,
3030
};
@@ -77,24 +77,27 @@ pub type StarknetApiResult<T> = Result<T, StarknetApiError>;
7777
/// [write](katana_rpc_api::starknet::StarknetWriteApi), and
7878
/// [trace](katana_rpc_api::starknet::StarknetTraceApi) APIs.
7979
#[derive(Debug)]
80-
pub struct StarknetApi<Pool, PP>
80+
pub struct StarknetApi<Pool, PP, S>
8181
where
8282
Pool: TransactionPool,
8383
PP: PendingBlockProvider,
84+
S: ProviderFactory,
8485
{
85-
inner: Arc<StarknetApiInner<Pool, PP>>,
86+
inner: Arc<StarknetApiInner<Pool, PP, S>>,
8687
}
8788

8889
#[derive(Debug)]
89-
struct StarknetApiInner<Pool, PP>
90+
struct StarknetApiInner<Pool, PP, S>
9091
where
9192
Pool: TransactionPool,
9293
PP: PendingBlockProvider,
94+
S: ProviderFactory,
9395
{
9496
pool: Pool,
9597
chain_spec: Arc<ChainSpec>,
9698
gas_oracle: GasPriceOracle,
9799
storage: BlockchainProvider<Box<dyn Database>>,
100+
storage2: S,
98101
forked_client: Option<ForkedClient>,
99102
task_spawner: TaskSpawner,
100103
estimate_fee_permit: Permits,
@@ -106,6 +109,7 @@ impl<Pool, PP> StarknetApi<Pool, PP>
106109
where
107110
Pool: TransactionPool,
108111
PP: PendingBlockProvider,
112+
S: ProviderFactory,
109113
{
110114
pub fn pool(&self) -> &Pool {
111115
&self.inner.pool
@@ -115,6 +119,10 @@ where
115119
&self.inner.storage
116120
}
117121

122+
pub fn storage2(&self) -> &S {
123+
&self.inner.storage
124+
}
125+
118126
pub fn forked_client(&self) -> Option<&ForkedClient> {
119127
self.inner.forked_client.as_ref()
120128
}
@@ -128,10 +136,13 @@ where
128136
}
129137
}
130138

131-
impl<Pool, PP> StarknetApi<Pool, PP>
139+
impl<Pool, PP, S> StarknetApi<Pool, PP, S>
132140
where
133141
Pool: TransactionPool + 'static,
134142
PP: PendingBlockProvider,
143+
S: ProviderFactory,
144+
<S as ProviderFactory>::Provider: DatabaseRO,
145+
<S as ProviderFactory>::ProviderMut: DatabaseRW,
135146
{
136147
#[allow(clippy::too_many_arguments)]
137148
pub fn new(
@@ -286,7 +297,7 @@ where
286297
}
287298

288299
pub fn state(&self, block_id: &BlockIdOrTag) -> StarknetApiResult<Box<dyn StateProvider>> {
289-
let provider = &self.inner.storage;
300+
let provider = self.inner.storage2.provider();
290301

291302
let state = match block_id {
292303
BlockIdOrTag::PreConfirmed => {
@@ -309,7 +320,7 @@ where
309320
}
310321

311322
fn block_env_at(&self, block_id: &BlockIdOrTag) -> StarknetApiResult<BlockEnv> {
312-
let provider = &self.inner.storage;
323+
let provider = self.inner.storage2.provider();
313324

314325
let env = match block_id {
315326
BlockIdOrTag::PreConfirmed => {
@@ -361,7 +372,7 @@ where
361372
}
362373

363374
fn block_hash_and_number(&self) -> StarknetApiResult<BlockHashAndNumberResponse> {
364-
let provider = &self.inner.storage;
375+
let provider = self.inner.storage2.provider();
365376
let hash = provider.latest_hash()?;
366377
let number = provider.latest_number()?;
367378
Ok(BlockHashAndNumberResponse::new(hash, number))
@@ -458,7 +469,7 @@ where
458469
pub async fn block_tx_count(&self, block_id: BlockIdOrTag) -> StarknetApiResult<u64> {
459470
let count = self
460471
.on_io_blocking_task(move |this| {
461-
let provider = &this.inner.storage;
472+
let provider = this.storage2().provider();
462473

463474
let block_id: BlockHashOrNumber = match block_id {
464475
BlockIdOrTag::L1Accepted => return Ok(None),
@@ -494,7 +505,7 @@ where
494505

495506
async fn latest_block_number(&self) -> StarknetApiResult<BlockNumberResponse> {
496507
self.on_io_blocking_task(move |this| {
497-
let block_number = this.inner.storage.latest_number()?;
508+
let block_number = this.storage2().provider().latest_number()?;
498509
Ok(BlockNumberResponse { block_number })
499510
})
500511
.await?
@@ -534,7 +545,7 @@ where
534545
let tx = if BlockIdOrTag::PreConfirmed == block_id {
535546
this.inner.pending_block_provider.get_pending_transaction_by_index(index)?
536547
} else {
537-
let provider = &this.inner.storage;
548+
let provider = this.storage2().provider();
538549

539550
let block_num = provider
540551
.convert_block_id(block_id)?
@@ -590,7 +601,7 @@ where
590601
{
591602
StarknetApiResult::Ok(pending_receipt)
592603
} else {
593-
let provider = &this.inner.storage;
604+
let provider = this.storage2().provider();
594605
StarknetApiResult::Ok(ReceiptBuilder::new(hash, provider).build()?)
595606
}
596607
})
@@ -608,7 +619,7 @@ where
608619
async fn transaction_status(&self, hash: TxHash) -> StarknetApiResult<TxStatus> {
609620
let status = self
610621
.on_io_blocking_task(move |this| {
611-
let provider = &this.inner.storage;
622+
let provider = this.storage2().provider();
612623
let status = provider.transaction_status(hash)?;
613624

614625
if let Some(status) = status {
@@ -663,7 +674,7 @@ where
663674
) -> StarknetApiResult<MaybePreConfirmedBlock> {
664675
let block = self
665676
.on_io_blocking_task(move |this| {
666-
let provider = &this.inner.storage;
677+
let provider = this.storage2().provider();
667678

668679
if BlockIdOrTag::PreConfirmed == block_id {
669680
if let Some(block) =
@@ -700,7 +711,7 @@ where
700711
) -> StarknetApiResult<GetBlockWithReceiptsResponse> {
701712
let block = self
702713
.on_io_blocking_task(move |this| {
703-
let provider = &this.inner.storage;
714+
let provider = this.storage2().provider();
704715

705716
if BlockIdOrTag::PreConfirmed == block_id {
706717
if let Some(block) =
@@ -737,7 +748,7 @@ where
737748
) -> StarknetApiResult<GetBlockWithTxHashesResponse> {
738749
let block = self
739750
.on_io_blocking_task(move |this| {
740-
let provider = &this.inner.storage;
751+
let provider = this.storage2().provider();
741752

742753
if BlockIdOrTag::PreConfirmed == block_id {
743754
if let Some(block) =
@@ -771,7 +782,7 @@ where
771782
pub async fn state_update(&self, block_id: BlockIdOrTag) -> StarknetApiResult<StateUpdate> {
772783
let state_update = self
773784
.on_io_blocking_task(move |this| {
774-
let provider = &this.inner.storage;
785+
let provider = this.storage2().provider();
775786

776787
let block_id = match block_id {
777788
BlockIdOrTag::Number(num) => BlockHashOrNumber::Num(num),
@@ -1125,7 +1136,7 @@ where
11251136
contracts_storage_keys: Option<Vec<ContractStorageKeys>>,
11261137
) -> StarknetApiResult<GetStorageProofResponse> {
11271138
self.on_io_blocking_task(move |this| {
1128-
let provider = &this.inner.storage;
1139+
let provider = this.storage2().provider();
11291140

11301141
let Some(block_num) = provider.convert_block_id(block_id)? else {
11311142
return Err(StarknetApiError::BlockNotFound);
@@ -1213,14 +1224,17 @@ where
12131224
// `StarknetApiExt` Implementations
12141225
/////////////////////////////////////////////////////
12151226

1216-
impl<Pool, PP> StarknetApi<Pool, PP>
1227+
impl<Pool, PP, S> StarknetApi<Pool, PP, S>
12171228
where
12181229
Pool: TransactionPool + 'static,
12191230
PP: PendingBlockProvider,
1231+
S: ProviderFactory,
1232+
<S as ProviderFactory>::Provider: DatabaseRO,
1233+
<S as ProviderFactory>::ProviderMut: DatabaseRW,
12201234
{
12211235
async fn blocks(&self, request: GetBlocksRequest) -> StarknetApiResult<GetBlocksResponse> {
12221236
self.on_io_blocking_task(move |this| {
1223-
let provider = &this.inner.storage;
1237+
let provider = this.storage2().provider();
12241238

12251239
// Parse continuation token to get starting point
12261240
let start_from = if let Some(token_str) = request.result_page_request.continuation_token
@@ -1296,7 +1310,7 @@ where
12961310
request: GetTransactionsRequest,
12971311
) -> StarknetApiResult<GetTransactionsResponse> {
12981312
self.on_io_blocking_task(move |this| {
1299-
let provider = &this.inner.storage;
1313+
let provider = this.storage2().provider();
13001314

13011315
// Resolve the starting point for this query.
13021316
let start_from = if let Some(token_str) = request.result_page_request.continuation_token
@@ -1366,7 +1380,7 @@ where
13661380

13671381
async fn total_transactions(&self) -> StarknetApiResult<TxNumber> {
13681382
self.on_io_blocking_task(move |this| {
1369-
let provider = &this.inner.storage;
1383+
let provider = this.storage2().provider();
13701384
let total = provider.total_transactions()? as TxNumber;
13711385
Ok(total)
13721386
})

crates/storage/db/src/abstraction/transaction.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use crate::error::DatabaseError;
44
use crate::tables::{DupSort, Table};
55

66
/// Trait for read-only transaction type.
7-
pub trait DbTx {
7+
pub trait DbTx: Clone + Send + Sync + 'static {
88
/// The cursor type.
99
type Cursor<T: Table>: DbCursor<T>;
1010

crates/storage/db/src/mdbx/tx.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
//! Transaction wrapper for libmdbx-sys.
22
33
use std::str::FromStr;
4+
use std::sync::Arc;
45

56
use libmdbx::ffi::DBI;
67
use libmdbx::{TransactionKind, WriteFlags, RW};
@@ -28,13 +29,13 @@ pub struct Tx<K: TransactionKind> {
2829
/// Libmdbx-sys transaction.
2930
pub(super) inner: libmdbx::Transaction<K>,
3031
/// Database table handle cache.
31-
db_handles: RwLock<[Option<DBI>; NUM_TABLES]>,
32+
db_handles: Arc<RwLock<[Option<DBI>; NUM_TABLES]>>,
3233
}
3334

3435
impl<K: TransactionKind> Tx<K> {
3536
/// Creates new `Tx` object with a `RO` or `RW` transaction.
3637
pub fn new(inner: libmdbx::Transaction<K>) -> Self {
37-
Self { inner, db_handles: RwLock::new([None; NUM_TABLES]) }
38+
Self { inner, db_handles: Default::default() }
3839
}
3940

4041
pub fn get_dbi<T: Table>(&self) -> Result<DBI, DatabaseError> {
@@ -58,6 +59,12 @@ impl<K: TransactionKind> Tx<K> {
5859
}
5960
}
6061

62+
impl<K: TransactionKind> Clone for Tx<K> {
63+
fn clone(&self) -> Self {
64+
Self { inner: self.inner.clone(), db_handles: self.db_handles.clone() }
65+
}
66+
}
67+
6168
impl<K: TransactionKind> DbTx for Tx<K> {
6269
type Cursor<T: Table> = Cursor<K, T>;
6370
type DupCursor<T: DupSort> = Self::Cursor<T>;

crates/storage/provider/provider/Cargo.toml

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,14 @@ starknet-types-core.workspace = true
2626
thiserror.workspace = true
2727
tracing.workspace = true
2828

29-
# fork provider deps
30-
futures = { workspace = true, optional = true }
31-
tokio = { workspace = true, optional = true }
29+
# fork provider only deps
30+
futures.workspace = true
31+
tokio.workspace = true
3232

3333
alloy-primitives = { workspace = true, optional = true }
3434
serde_json.workspace = true
3535

3636
[features]
37-
fork = [ "dep:futures", "dep:tokio" ]
38-
in-memory = [ ]
3937
test-utils = [ "dep:alloy-primitives", "dep:katana-chain-spec" ]
4038

4139
[dev-dependencies]

0 commit comments

Comments
 (0)