-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathmain.rs
60 lines (50 loc) · 1.78 KB
/
main.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
use std::sync::Arc;
use stratus::config::StratusConfig;
use stratus::eth::rpc::serve_rpc;
use stratus::GlobalServices;
use stratus::GlobalState;
#[cfg(all(not(target_env = "msvc"), any(feature = "jemalloc", feature = "jeprof")))]
use tikv_jemallocator::Jemalloc;
#[cfg(all(not(target_env = "msvc"), any(feature = "jemalloc", feature = "jeprof")))]
#[global_allocator]
static GLOBAL: Jemalloc = Jemalloc;
fn main() -> anyhow::Result<()> {
let global_services = GlobalServices::<StratusConfig>::init();
GlobalState::initialize_node_mode(&global_services.config);
global_services.runtime.block_on(run(global_services.config))
}
async fn run(config: StratusConfig) -> anyhow::Result<()> {
// Init services
let storage = config.storage.init()?;
// Init miner
let miner = config.miner.init(Arc::clone(&storage)).await?;
// Init executor
let executor = config.executor.init(Arc::clone(&storage), Arc::clone(&miner));
// Init importer
let consensus = if let Some(importer_config) = &config.importer {
tracing::info!(?importer_config, "creating importer");
let kafka_connector = config.kafka_config.as_ref().map(|inner| inner.init()).transpose()?;
importer_config
.init(Arc::clone(&executor), Arc::clone(&miner), Arc::clone(&storage), kafka_connector)
.await?
} else {
tracing::info!("no importer config, skipping importer");
None
};
// Init RPC server
serve_rpc(
// Services
Arc::clone(&storage),
executor,
miner,
consensus,
// Config
config.clone(),
config.rpc_server,
config.executor.executor_chain_id.into(),
)
.await?;
// Explicitly block the `main` thread to drop the storage.
drop(storage);
Ok(())
}