Skip to content

Commit a4d1dfb

Browse files
committed
wip
1 parent 116a493 commit a4d1dfb

File tree

16 files changed

+360
-230
lines changed

16 files changed

+360
-230
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,4 @@ crates/contracts/build/
4040
!crates/contracts/build/legacy/
4141

4242
**/.claude/settings.local.json
43+
.cargo/config.toml

Cargo.lock

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

crates/cli/src/shard.rs

Lines changed: 32 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@ use std::sync::Arc;
22
use std::time::Duration;
33

44
use anyhow::{Context, Result};
5-
pub use clap::Parser;
5+
pub use clap::{Args, Parser};
66
use katana_node::config::dev::DevConfig;
77
use katana_node::config::execution::ExecutionConfig;
88
use katana_node::config::metrics::MetricsConfig;
99
use katana_node::config::rpc::RpcConfig;
1010
use katana_node::shard::config::{
1111
ShardNodeConfig, DEFAULT_BLOCK_POLL_INTERVAL, DEFAULT_TIME_QUANTUM,
1212
};
13-
use katana_node::shard::ShardNode;
13+
use katana_node::shard::Node;
1414
use serde::{Deserialize, Serialize};
1515
use tracing::info;
1616
use url::Url;
@@ -34,46 +34,24 @@ pub struct ShardNodeArgs {
3434
#[arg(long = "base-chain-url", value_name = "URL")]
3535
pub base_chain_url: Url,
3636

37-
/// Number of shard worker threads.
38-
///
39-
/// Each worker runs on a dedicated OS thread and processes shards from the scheduler queue.
40-
/// Defaults to the number of available CPU cores.
41-
#[arg(long = "workers", value_name = "COUNT")]
42-
pub workers: Option<usize>,
43-
44-
/// Time quantum in milliseconds for worker preemption.
45-
///
46-
/// Controls how long a worker processes a single shard before yielding to allow other
47-
/// shards to be serviced.
48-
#[arg(long = "time-quantum", value_name = "MILLISECONDS")]
49-
#[arg(default_value_t = DEFAULT_TIME_QUANTUM.as_millis() as u64)]
50-
pub time_quantum_ms: u64,
51-
5237
/// Base chain block poll interval in seconds.
5338
///
5439
/// How frequently the shard node polls the base chain for new block context.
5540
#[arg(long = "block-poll-interval", value_name = "SECONDS")]
5641
#[arg(default_value_t = DEFAULT_BLOCK_POLL_INTERVAL.as_secs())]
5742
pub block_poll_interval_secs: u64,
5843

59-
/// Disable charging fee when executing transactions.
60-
#[arg(long = "no-fee")]
61-
pub no_fee: bool,
62-
63-
/// Disable account validation when executing transactions.
64-
///
65-
/// Skipping the transaction sender's account validation function.
66-
#[arg(long = "no-account-validation")]
67-
pub no_account_validation: bool,
44+
#[command(flatten)]
45+
pub scheduler: SchedulerOptions,
6846

6947
#[command(flatten)]
7048
pub logging: LoggingOptions,
7149

7250
#[command(flatten)]
73-
pub tracer: TracerOptions,
51+
pub dev: DevOptions,
7452

7553
#[command(flatten)]
76-
pub starknet: EnvironmentOptions,
54+
pub tracer: TracerOptions,
7755

7856
#[cfg(feature = "server")]
7957
#[command(flatten)]
@@ -102,7 +80,7 @@ impl ShardNodeArgs {
10280

10381
async fn start_node(&self) -> Result<()> {
10482
let config = self.config()?;
105-
let node = ShardNode::build(config).context("failed to build shard node")?;
83+
let node = Node::build(config).context("failed to build shard node")?;
10684

10785
if !self.silent {
10886
info!(target: LOG_TARGET, "Starting shard node");
@@ -132,29 +110,23 @@ impl ShardNodeArgs {
132110
let metrics = self.metrics_config();
133111

134112
let worker_count =
135-
self.workers.unwrap_or_else(katana_node::shard::config::default_worker_count);
113+
self.scheduler.workers.unwrap_or_else(katana_node::shard::config::default_worker_count);
136114

137115
Ok(ShardNodeConfig {
138116
chain,
139117
rpc,
140118
execution,
141119
dev,
142120
worker_count,
143-
time_quantum: Duration::from_millis(self.time_quantum_ms),
121+
time_quantum: Duration::from_millis(self.scheduler.time_quantum_ms),
144122
base_chain_url: self.base_chain_url.clone(),
145123
block_poll_interval: Duration::from_secs(self.block_poll_interval_secs),
146124
metrics,
147125
})
148126
}
149127

150128
fn chain_spec(&self) -> Arc<katana_chain_spec::ChainSpec> {
151-
let mut chain_spec = katana_chain_spec::dev::DEV_UNALLOCATED.clone();
152-
153-
if let Some(id) = self.starknet.chain_id {
154-
chain_spec.id = id;
155-
}
156-
157-
Arc::new(katana_chain_spec::ChainSpec::Dev(chain_spec))
129+
Arc::new(katana_chain_spec::ChainSpec::Dev(katana_chain_spec::dev::DEV_UNALLOCATED.clone()))
158130
}
159131

160132
fn rpc_config(&self) -> Result<RpcConfig> {
@@ -187,19 +159,13 @@ impl ShardNodeArgs {
187159
}
188160

189161
fn execution_config(&self) -> ExecutionConfig {
190-
ExecutionConfig {
191-
invocation_max_steps: self.starknet.invoke_max_steps,
192-
validation_max_steps: self.starknet.validate_max_steps,
193-
#[cfg(feature = "native")]
194-
compile_native: self.starknet.compile_native,
195-
..Default::default()
196-
}
162+
ExecutionConfig::default()
197163
}
198164

199165
fn dev_config(&self) -> DevConfig {
200166
DevConfig {
201-
fee: !self.no_fee,
202-
account_validation: !self.no_account_validation,
167+
fee: !self.dev.no_fee,
168+
account_validation: !self.dev.no_account_validation,
203169
fixed_gas_prices: None,
204170
}
205171
}
@@ -220,3 +186,22 @@ impl ShardNodeArgs {
220186
self.tracer.config()
221187
}
222188
}
189+
190+
#[derive(Debug, Args, Clone, Serialize, Deserialize, PartialEq)]
191+
#[command(next_help_heading = "Scheduler options")]
192+
pub struct SchedulerOptions {
193+
/// Number of shard worker threads.
194+
///
195+
/// Each worker runs on a dedicated OS thread and processes shards from the scheduler queue.
196+
/// Defaults to the number of available CPU cores.
197+
#[arg(long = "scheduler.workers", value_name = "COUNT")]
198+
pub workers: Option<usize>,
199+
200+
/// Time quantum in milliseconds for worker preemption.
201+
///
202+
/// Controls how long a worker processes a single shard before yielding to allow other
203+
/// shards to be serviced.
204+
#[arg(long = "scheduler.time-quantum", value_name = "MILLISECONDS")]
205+
#[arg(default_value_t = DEFAULT_TIME_QUANTUM.as_millis() as u64)]
206+
pub time_quantum_ms: u64,
207+
}

crates/node/sharding/src/block_context.rs

Lines changed: 0 additions & 98 deletions
This file was deleted.

crates/node/sharding/src/lib.rs

Lines changed: 4 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
pub mod block_context;
21
pub mod config;
32
pub mod exit;
43

@@ -13,22 +12,20 @@ use katana_executor::blockifier::BlockifierFactory;
1312
use katana_executor::{ExecutionFlags, ExecutorFactory};
1413
use katana_gas_price_oracle::GasPriceOracle;
1514
use katana_pool::TxPool;
16-
use katana_primitives::env::{BlockEnv, VersionedConstantsOverrides};
15+
use katana_primitives::env::VersionedConstantsOverrides;
1716
use katana_primitives::{ContractAddress, Felt};
1817
use katana_provider::DbProviderFactory;
1918
use katana_rpc_api::shard::ShardApiServer;
20-
use katana_rpc_client::starknet::Client as StarknetClient;
2119
use katana_rpc_server::shard::{ShardProvider, ShardRpc};
2220
use katana_rpc_server::starknet::{StarknetApi, StarknetApiConfig};
2321
use katana_rpc_server::{RpcServer, RpcServerHandle};
2422
use katana_sharding::manager::{LazyShardManager, ShardManager};
2523
use katana_sharding::runtime::{RuntimeHandle, ShardRuntime};
2624
use katana_sharding::types::NoPendingBlockProvider;
2725
use katana_tasks::TaskManager;
28-
use parking_lot::{Mutex, RwLock};
26+
use parking_lot::Mutex;
2927
use tracing::info;
3028

31-
use self::block_context::BlockContextListener;
3229
use self::config::ShardNodeConfig;
3330
use self::exit::ShardNodeStoppedFuture;
3431

@@ -41,7 +38,6 @@ pub struct Node {
4138
pub handle: RuntimeHandle,
4239
pub task_manager: TaskManager,
4340
pub rpc_server: RpcServer,
44-
pub block_context_listener: BlockContextListener,
4541
pub runtime: Mutex<Option<ShardRuntime>>,
4642
}
4743

@@ -97,39 +93,18 @@ impl Node {
9793
paymaster: None,
9894
};
9995

100-
// --- Build initial BlockEnv from genesis
101-
let genesis = config.chain.genesis();
102-
let block_env = Arc::new(RwLock::new(BlockEnv {
103-
number: genesis.number,
104-
timestamp: genesis.timestamp,
105-
sequencer_address: genesis.sequencer_address,
106-
l1_gas_prices: genesis.gas_prices.clone(),
107-
l2_gas_prices: genesis.gas_prices.clone(),
108-
l1_data_gas_prices: genesis.gas_prices.clone(),
109-
starknet_version: katana_primitives::version::CURRENT_STARKNET_VERSION,
110-
}));
111-
11296
// --- Build runtime (scheduler + workers)
113-
let runtime =
114-
ShardRuntime::new(config.worker_count, config.time_quantum, block_env.clone());
97+
let runtime = ShardRuntime::new(config.worker_count, config.time_quantum);
11598
let handle = runtime.handle();
11699

117-
// --- Build base chain client and block context listener
118-
let starknet_client = StarknetClient::new(config.base_chain_url.clone());
119-
let block_context_listener = BlockContextListener::new(
120-
starknet_client,
121-
block_env,
122-
config.chain.clone(),
123-
config.block_poll_interval,
124-
);
125-
126100
// --- Build shard manager
127101
let manager: Arc<dyn ShardManager> = Arc::new(LazyShardManager::new(
128102
config.chain.clone(),
129103
executor_factory,
130104
gas_oracle,
131105
starknet_api_config,
132106
task_spawner.clone(),
107+
config.base_chain_url.clone(),
133108
));
134109

135110
// --- Build RPC server with shard API
@@ -152,20 +127,11 @@ impl Node {
152127
handle,
153128
task_manager,
154129
rpc_server,
155-
block_context_listener,
156130
runtime: Mutex::new(Some(runtime)),
157131
})
158132
}
159133

160134
pub async fn launch(self) -> Result<LaunchedShardNode> {
161-
let listener = self.block_context_listener.clone();
162-
self.task_manager
163-
.task_spawner()
164-
.build_task()
165-
.graceful_shutdown()
166-
.name("Block context listener")
167-
.spawn(listener.run());
168-
169135
self.runtime.lock().as_mut().expect("runtime already taken").start();
170136

171137
let rpc = self.rpc_server.start(self.config.rpc.socket_addr()).await?;

crates/sharding/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,14 @@ katana-gas-price-oracle.workspace = true
1414
katana-pool.workspace = true
1515
katana-primitives.workspace = true
1616
katana-provider.workspace = true
17+
katana-rpc-client.workspace = true
1718
katana-rpc-server.workspace = true
1819
katana-rpc-types.workspace = true
1920
katana-rpc-api.workspace = true
2021
katana-tasks.workspace = true
2122

2223
anyhow.workspace = true
2324
parking_lot.workspace = true
25+
tokio.workspace = true
2426
tracing.workspace = true
27+
url.workspace = true

0 commit comments

Comments
 (0)