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 anyhow::Result;
use std::{net::SocketAddr, sync::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,
rest_ip: Option<SocketAddr>,
bft_ip: Option<SocketAddr>,
account: Account<N>,
trusted_peers: &[SocketAddr],
trusted_validators: &[SocketAddr],
genesis: Block<N>,
cdn: Option<String>,
dev: Option<u16>,
) -> Result<Self> {
Ok(Self::Validator(Arc::new(
Validator::new(node_ip, rest_ip, bft_ip, account, trusted_peers, trusted_validators, genesis, cdn, dev)
.await?,
)))
}
pub async fn new_prover(
node_ip: SocketAddr,
account: Account<N>,
trusted_peers: &[SocketAddr],
genesis: Block<N>,
dev: Option<u16>,
) -> Result<Self> {
Ok(Self::Prover(Arc::new(Prover::new(node_ip, account, trusted_peers, genesis, dev).await?)))
}
pub async fn new_client(
node_ip: SocketAddr,
rest_ip: Option<SocketAddr>,
account: Account<N>,
trusted_peers: &[SocketAddr],
genesis: Block<N>,
cdn: Option<String>,
dev: Option<u16>,
) -> Result<Self> {
Ok(Self::Client(Arc::new(Client::new(node_ip, rest_ip, account, trusted_peers, genesis, cdn, dev).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(),
}
}
}