use crate::{traits::NodeInterface, Client, Prover, Validator};
use snarkos_account::Account;
use snarkos_node_router::messages::NodeType;
use snarkvm::prelude::{
block::Block,
store::helpers::{memory::ConsensusMemory, rocksdb::ConsensusDB},
Address,
Network,
PrivateKey,
ViewKey,
};
use aleo_std::StorageMode;
use anyhow::Result;
use std::{
net::SocketAddr,
sync::{atomic::AtomicBool, Arc},
};
pub enum Node<N: Network> {
Validator(Arc<Validator<N, ConsensusDB<N>>>),
Prover(Arc<Prover<N, ConsensusMemory<N>>>),
Client(Arc<Client<N, ConsensusDB<N>>>),
}
impl<N: Network> Node<N> {
pub async fn new_validator(
node_ip: SocketAddr,
bft_ip: Option<SocketAddr>,
rest_ip: Option<SocketAddr>,
rest_rps: u32,
account: Account<N>,
trusted_peers: &[SocketAddr],
trusted_validators: &[SocketAddr],
genesis: Block<N>,
cdn: Option<String>,
storage_mode: StorageMode,
allow_external_peers: bool,
dev_txs: bool,
shutdown: Arc<AtomicBool>,
) -> Result<Self> {
Ok(Self::Validator(Arc::new(
Validator::new(
node_ip,
bft_ip,
rest_ip,
rest_rps,
account,
trusted_peers,
trusted_validators,
genesis,
cdn,
storage_mode,
allow_external_peers,
dev_txs,
shutdown,
)
.await?,
)))
}
pub async fn new_prover(
node_ip: SocketAddr,
account: Account<N>,
trusted_peers: &[SocketAddr],
genesis: Block<N>,
storage_mode: StorageMode,
shutdown: Arc<AtomicBool>,
) -> Result<Self> {
Ok(Self::Prover(Arc::new(Prover::new(node_ip, account, trusted_peers, genesis, storage_mode, shutdown).await?)))
}
pub async fn new_client(
node_ip: SocketAddr,
rest_ip: Option<SocketAddr>,
rest_rps: u32,
account: Account<N>,
trusted_peers: &[SocketAddr],
genesis: Block<N>,
cdn: Option<String>,
storage_mode: StorageMode,
shutdown: Arc<AtomicBool>,
) -> Result<Self> {
Ok(Self::Client(Arc::new(
Client::new(node_ip, rest_ip, rest_rps, account, trusted_peers, genesis, cdn, storage_mode, shutdown)
.await?,
)))
}
pub fn node_type(&self) -> NodeType {
match self {
Self::Validator(validator) => validator.node_type(),
Self::Prover(prover) => prover.node_type(),
Self::Client(client) => client.node_type(),
}
}
pub fn private_key(&self) -> &PrivateKey<N> {
match self {
Self::Validator(node) => node.private_key(),
Self::Prover(node) => node.private_key(),
Self::Client(node) => node.private_key(),
}
}
pub fn view_key(&self) -> &ViewKey<N> {
match self {
Self::Validator(node) => node.view_key(),
Self::Prover(node) => node.view_key(),
Self::Client(node) => node.view_key(),
}
}
pub fn address(&self) -> Address<N> {
match self {
Self::Validator(node) => node.address(),
Self::Prover(node) => node.address(),
Self::Client(node) => node.address(),
}
}
pub fn is_dev(&self) -> bool {
match self {
Self::Validator(node) => node.is_dev(),
Self::Prover(node) => node.is_dev(),
Self::Client(node) => node.is_dev(),
}
}
}