Skip to content

Commit 0c801e7

Browse files
feat(starknet_batcher): use transaction converter to infer executable from mempool internal tx
1 parent 835245d commit 0c801e7

File tree

8 files changed

+82
-8
lines changed

8 files changed

+82
-8
lines changed

Cargo.lock

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

crates/starknet_api/src/test_utils/invoke.rs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,13 @@ use crate::executable_transaction::{
66
AccountTransaction,
77
InvokeTransaction as ExecutableInvokeTransaction,
88
};
9-
use crate::rpc_transaction::{RpcInvokeTransaction, RpcInvokeTransactionV3, RpcTransaction};
9+
use crate::rpc_transaction::{
10+
InternalRpcTransaction,
11+
InternalRpcTransactionWithoutTxHash,
12+
RpcInvokeTransaction,
13+
RpcInvokeTransactionV3,
14+
RpcTransaction,
15+
};
1016
use crate::transaction::constants::EXECUTE_ENTRY_POINT_NAME;
1117
use crate::transaction::fields::{
1218
AccountDeploymentData,
@@ -149,3 +155,17 @@ pub fn rpc_invoke_tx(invoke_args: InvokeTxArgs) -> RpcTransaction {
149155
account_deployment_data: invoke_args.account_deployment_data,
150156
}))
151157
}
158+
159+
pub fn internal_invoke_tx(invoke_args: InvokeTxArgs) -> InternalRpcTransaction {
160+
if invoke_args.version != TransactionVersion::THREE {
161+
panic!("Unsupported transaction version: {:?}.", invoke_args.version);
162+
}
163+
let tx_hash = invoke_args.tx_hash;
164+
let RpcTransaction::Invoke(tx) = rpc_invoke_tx(invoke_args) else {
165+
panic!("Expected RpcTransaction::Invoke");
166+
};
167+
168+
let invoke_tx = InternalRpcTransactionWithoutTxHash::Invoke(tx);
169+
170+
InternalRpcTransaction { tx: invoke_tx, tx_hash }
171+
}

crates/starknet_batcher/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ workspace = true
1212
async-trait.workspace = true
1313
blockifier.workspace = true
1414
chrono.workspace = true
15+
futures.workspace = true
1516
indexmap.workspace = true
1617
metrics.workspace = true
1718
papyrus_config.workspace = true
@@ -20,6 +21,7 @@ papyrus_storage.workspace = true
2021
serde.workspace = true
2122
starknet_api.workspace = true
2223
starknet_batcher_types.workspace = true
24+
starknet_class_manager_types.workspace = true
2325
starknet_l1_provider_types.workspace = true
2426
starknet_mempool_types.workspace = true
2527
starknet_sequencer_infra.workspace = true

crates/starknet_batcher/src/batcher.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ use starknet_batcher_types::batcher_types::{
3131
ValidateBlockInput,
3232
};
3333
use starknet_batcher_types::errors::BatcherError;
34+
use starknet_class_manager_types::transaction_converter::TransactionConverter;
35+
use starknet_class_manager_types::SharedClassManagerClient;
3436
use starknet_l1_provider_types::SharedL1ProviderClient;
3537
use starknet_mempool_types::communication::SharedMempoolClient;
3638
use starknet_mempool_types::mempool_types::CommitBlockArgs;
@@ -68,6 +70,7 @@ pub struct Batcher {
6870
pub storage_writer: Box<dyn BatcherStorageWriterTrait>,
6971
pub l1_provider_client: SharedL1ProviderClient,
7072
pub mempool_client: SharedMempoolClient,
73+
pub transaction_converter: TransactionConverter,
7174

7275
// Used to create block builders.
7376
// Using the factory pattern to allow for easier testing.
@@ -103,6 +106,7 @@ impl Batcher {
103106
storage_writer: Box<dyn BatcherStorageWriterTrait>,
104107
l1_provider_client: SharedL1ProviderClient,
105108
mempool_client: SharedMempoolClient,
109+
transaction_converter: TransactionConverter,
106110
block_builder_factory: Box<dyn BlockBuilderFactoryTrait>,
107111
) -> Self {
108112
let storage_height = storage_reader
@@ -115,6 +119,7 @@ impl Batcher {
115119
storage_writer,
116120
l1_provider_client,
117121
mempool_client,
122+
transaction_converter,
118123
block_builder_factory,
119124
active_height: None,
120125
active_proposal: Arc::new(Mutex::new(None)),
@@ -165,6 +170,7 @@ impl Batcher {
165170
let tx_provider = ProposeTransactionProvider::new(
166171
self.mempool_client.clone(),
167172
self.l1_provider_client.clone(),
173+
self.transaction_converter.clone(),
168174
self.config.max_l1_handler_txs_per_block_proposal,
169175
propose_block_input.block_info.block_number,
170176
);
@@ -615,6 +621,7 @@ pub fn create_batcher(
615621
config: BatcherConfig,
616622
mempool_client: SharedMempoolClient,
617623
l1_provider_client: SharedL1ProviderClient,
624+
class_manager_client: SharedClassManagerClient,
618625
) -> Batcher {
619626
let (storage_reader, storage_writer) = papyrus_storage::open_storage(config.storage.clone())
620627
.expect("Failed to open batcher's storage");
@@ -628,12 +635,18 @@ pub fn create_batcher(
628635
});
629636
let storage_reader = Arc::new(storage_reader);
630637
let storage_writer = Box::new(storage_writer);
638+
let transaction_converter = TransactionConverter::new(
639+
class_manager_client,
640+
config.block_builder_config.chain_info.chain_id.clone(),
641+
);
642+
631643
Batcher::new(
632644
config,
633645
storage_reader,
634646
storage_writer,
635647
l1_provider_client,
636648
mempool_client,
649+
transaction_converter,
637650
block_builder_factory,
638651
)
639652
}

crates/starknet_batcher/src/batcher_test.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use metrics_exporter_prometheus::PrometheusBuilder;
88
use mockall::predicate::eq;
99
use rstest::rstest;
1010
use starknet_api::block::{BlockHeaderWithoutHash, BlockInfo, BlockNumber};
11-
use starknet_api::core::{ContractAddress, Nonce};
11+
use starknet_api::core::{ChainId, ContractAddress, Nonce};
1212
use starknet_api::executable_transaction::Transaction;
1313
use starknet_api::state::ThinStateDiff;
1414
use starknet_api::transaction::TransactionHash;
@@ -31,6 +31,8 @@ use starknet_batcher_types::batcher_types::{
3131
ValidateBlockInput,
3232
};
3333
use starknet_batcher_types::errors::BatcherError;
34+
use starknet_class_manager_types::transaction_converter::TransactionConverter;
35+
use starknet_class_manager_types::{EmptyClassManagerClient, SharedClassManagerClient};
3436
use starknet_infra_utils::metrics::parse_numeric_metric;
3537
use starknet_l1_provider_types::MockL1ProviderClient;
3638
use starknet_mempool_types::communication::MockMempoolClient;
@@ -85,6 +87,7 @@ struct MockDependencies {
8587
mempool_client: MockMempoolClient,
8688
l1_provider_client: MockL1ProviderClient,
8789
block_builder_factory: MockBlockBuilderFactoryTrait,
90+
class_manager_client: SharedClassManagerClient,
8891
}
8992

9093
impl Default for MockDependencies {
@@ -97,6 +100,8 @@ impl Default for MockDependencies {
97100
l1_provider_client: MockL1ProviderClient::new(),
98101
mempool_client: MockMempoolClient::new(),
99102
block_builder_factory: MockBlockBuilderFactoryTrait::new(),
103+
// TODO(noamsp): use MockClassManagerClient
104+
class_manager_client: Arc::new(EmptyClassManagerClient),
100105
}
101106
}
102107
}
@@ -108,6 +113,10 @@ fn create_batcher(mock_dependencies: MockDependencies) -> Batcher {
108113
Box::new(mock_dependencies.storage_writer),
109114
Arc::new(mock_dependencies.l1_provider_client),
110115
Arc::new(mock_dependencies.mempool_client),
116+
TransactionConverter::new(
117+
mock_dependencies.class_manager_client,
118+
ChainId::create_for_testing(),
119+
),
111120
Box::new(mock_dependencies.block_builder_factory),
112121
)
113122
}

crates/starknet_batcher/src/transaction_provider.rs

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,17 @@ use std::cmp::min;
22
use std::vec;
33

44
use async_trait::async_trait;
5+
use futures::future::try_join_all;
56
#[cfg(test)]
67
use mockall::automock;
78
use starknet_api::block::BlockNumber;
89
use starknet_api::executable_transaction::Transaction;
910
use starknet_api::transaction::TransactionHash;
11+
use starknet_class_manager_types::transaction_converter::{
12+
TransactionConverter,
13+
TransactionConverterError,
14+
TransactionConverterTrait,
15+
};
1016
use starknet_l1_provider_types::errors::L1ProviderClientError;
1117
use starknet_l1_provider_types::{SharedL1ProviderClient, ValidationStatus as L1ValidationStatus};
1218
use starknet_mempool_types::communication::{MempoolClientError, SharedMempoolClient};
@@ -22,6 +28,8 @@ pub enum TransactionProviderError {
2228
L1HandlerTransactionValidationFailed(TransactionHash),
2329
#[error(transparent)]
2430
L1ProviderError(#[from] L1ProviderClientError),
31+
#[error(transparent)]
32+
TransactionConverterError(#[from] TransactionConverterError),
2533
}
2634

2735
#[derive(Debug, PartialEq)]
@@ -40,6 +48,7 @@ pub trait TransactionProvider: Send {
4048
pub struct ProposeTransactionProvider {
4149
pub mempool_client: SharedMempoolClient,
4250
pub l1_provider_client: SharedL1ProviderClient,
51+
pub transaction_converter: TransactionConverter,
4352
pub max_l1_handler_txs_per_block: usize,
4453
pub height: BlockNumber,
4554
phase: TxProviderPhase,
@@ -57,12 +66,14 @@ impl ProposeTransactionProvider {
5766
pub fn new(
5867
mempool_client: SharedMempoolClient,
5968
l1_provider_client: SharedL1ProviderClient,
69+
transaction_converter: TransactionConverter,
6070
max_l1_handler_txs_per_block: usize,
6171
height: BlockNumber,
6272
) -> Self {
6373
Self {
6474
mempool_client,
6575
l1_provider_client,
76+
transaction_converter,
6677
max_l1_handler_txs_per_block,
6778
height,
6879
phase: TxProviderPhase::L1,
@@ -87,13 +98,17 @@ impl ProposeTransactionProvider {
8798
&mut self,
8899
n_txs: usize,
89100
) -> TransactionProviderResult<Vec<Transaction>> {
90-
Ok(self
101+
let txs_futures = self
91102
.mempool_client
92103
.get_txs(n_txs)
93104
.await?
94105
.into_iter()
95-
.map(Transaction::Account)
96-
.collect())
106+
.map(|tx| self.transaction_converter.convert_internal_rpc_tx_to_executable_tx(tx));
107+
108+
let converted_txs =
109+
try_join_all(txs_futures).await?.into_iter().map(Transaction::Account).collect();
110+
111+
Ok(converted_txs)
97112
}
98113
}
99114

crates/starknet_batcher/src/transaction_provider_test.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,12 @@ use assert_matches::assert_matches;
44
use mockall::predicate::eq;
55
use rstest::{fixture, rstest};
66
use starknet_api::block::BlockNumber;
7+
use starknet_api::core::ChainId;
78
use starknet_api::executable_transaction::{L1HandlerTransaction, Transaction};
8-
use starknet_api::test_utils::invoke::{executable_invoke_tx, InvokeTxArgs};
9+
use starknet_api::test_utils::invoke::{executable_invoke_tx, internal_invoke_tx, InvokeTxArgs};
910
use starknet_api::tx_hash;
11+
use starknet_class_manager_types::transaction_converter::TransactionConverter;
12+
use starknet_class_manager_types::{EmptyClassManagerClient, SharedClassManagerClient};
1013
use starknet_l1_provider_types::{MockL1ProviderClient, ValidationStatus as L1ValidationStatus};
1114
use starknet_mempool_types::communication::MockMempoolClient;
1215

@@ -28,6 +31,7 @@ struct MockDependencies {
2831
l1_provider_client: MockL1ProviderClient,
2932
tx_sender: tokio::sync::mpsc::Sender<Transaction>,
3033
tx_receiver: tokio::sync::mpsc::Receiver<Transaction>,
34+
class_manager_client: SharedClassManagerClient,
3135
}
3236

3337
impl MockDependencies {
@@ -40,7 +44,7 @@ impl MockDependencies {
4044

4145
fn expect_get_mempool_txs(&mut self, n_to_request: usize) {
4246
self.mempool_client.expect_get_txs().with(eq(n_to_request)).returning(move |n_requested| {
43-
Ok(vec![executable_invoke_tx(InvokeTxArgs::default()); n_requested])
47+
Ok(vec![internal_invoke_tx(InvokeTxArgs::default()); n_requested])
4448
});
4549
}
4650

@@ -61,6 +65,7 @@ impl MockDependencies {
6165
ProposeTransactionProvider::new(
6266
Arc::new(self.mempool_client),
6367
Arc::new(self.l1_provider_client),
68+
TransactionConverter::new(self.class_manager_client, ChainId::create_for_testing()),
6469
MAX_L1_HANDLER_TXS_PER_BLOCK,
6570
HEIGHT,
6671
)
@@ -85,6 +90,8 @@ fn mock_dependencies(
8590
l1_provider_client: MockL1ProviderClient::new(),
8691
tx_sender,
8792
tx_receiver,
93+
// TODO(noamsp): use MockClassManagerClient
94+
class_manager_client: Arc::new(EmptyClassManagerClient),
8895
}
8996
}
9097

crates/starknet_sequencer_node/src/components.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,14 @@ pub fn create_node_components(
5555
let l1_provider_client = clients
5656
.get_l1_provider_shared_client()
5757
.expect("L1 Provider Client should be available");
58-
Some(create_batcher(config.batcher_config.clone(), mempool_client, l1_provider_client))
58+
// TODO(noamsp): Remove this and use the real client instead once implemented.
59+
let class_manager_client = Arc::new(EmptyClassManagerClient);
60+
Some(create_batcher(
61+
config.batcher_config.clone(),
62+
mempool_client,
63+
l1_provider_client,
64+
class_manager_client,
65+
))
5966
}
6067
ReactiveComponentExecutionMode::Disabled | ReactiveComponentExecutionMode::Remote => None,
6168
};

0 commit comments

Comments
 (0)