use snarkos::{initialize_logger, Node};
use anyhow::Result;
use structopt::StructOpt;
use tokio::runtime;
fn main() -> Result<()> {
if num_cpus::get() < 16 {
eprintln!("\nWARNING - Your machine must have at least 16-cores to run a node.\n");
}
let node = Node::from_args();
if !node.display {
initialize_logger(node.verbosity, None);
}
let (num_tokio_worker_threads, max_tokio_blocking_threads) = if !node.sync {
((num_cpus::get() / 8 * 2).max(1), num_cpus::get())
} else {
(num_cpus::get(), 512) };
let runtime = runtime::Builder::new_multi_thread()
.enable_all()
.thread_stack_size(8 * 1024 * 1024)
.worker_threads(num_tokio_worker_threads)
.max_blocking_threads(max_tokio_blocking_threads)
.build()?;
let num_rayon_cores_global = if !node.sync {
(num_cpus::get() / 8 * 5).max(1)
} else {
num_cpus::get()
};
rayon::ThreadPoolBuilder::new()
.stack_size(8 * 1024 * 1024)
.num_threads(num_rayon_cores_global)
.build_global()
.unwrap();
runtime.block_on(async move {
node.start().await.expect("Failed to start the node");
});
Ok(())
}