1use crate::{Client, Prover, Validator, traits::NodeInterface};
17use snarkos_account::Account;
18use snarkos_node_router::messages::NodeType;
19use snarkvm::prelude::{
20 Address,
21 Network,
22 PrivateKey,
23 ViewKey,
24 block::Block,
25 store::helpers::{memory::ConsensusMemory, rocksdb::ConsensusDB},
26};
27
28use aleo_std::StorageMode;
29use anyhow::Result;
30use std::{
31 net::SocketAddr,
32 sync::{Arc, atomic::AtomicBool},
33};
34
35pub enum Node<N: Network> {
36 Validator(Arc<Validator<N, ConsensusDB<N>>>),
38 Prover(Arc<Prover<N, ConsensusMemory<N>>>),
40 Client(Arc<Client<N, ConsensusDB<N>>>),
42}
43
44impl<N: Network> Node<N> {
45 pub async fn new_validator(
47 node_ip: SocketAddr,
48 bft_ip: Option<SocketAddr>,
49 rest_ip: Option<SocketAddr>,
50 rest_rps: u32,
51 account: Account<N>,
52 trusted_peers: &[SocketAddr],
53 trusted_validators: &[SocketAddr],
54 genesis: Block<N>,
55 cdn: Option<String>,
56 storage_mode: StorageMode,
57 allow_external_peers: bool,
58 dev_txs: bool,
59 dev: Option<u16>,
60 shutdown: Arc<AtomicBool>,
61 ) -> Result<Self> {
62 Ok(Self::Validator(Arc::new(
63 Validator::new(
64 node_ip,
65 bft_ip,
66 rest_ip,
67 rest_rps,
68 account,
69 trusted_peers,
70 trusted_validators,
71 genesis,
72 cdn,
73 storage_mode,
74 allow_external_peers,
75 dev_txs,
76 dev,
77 shutdown,
78 )
79 .await?,
80 )))
81 }
82
83 pub async fn new_prover(
85 node_ip: SocketAddr,
86 account: Account<N>,
87 trusted_peers: &[SocketAddr],
88 genesis: Block<N>,
89 dev: Option<u16>,
90 shutdown: Arc<AtomicBool>,
91 ) -> Result<Self> {
92 Ok(Self::Prover(Arc::new(Prover::new(node_ip, account, trusted_peers, genesis, dev, shutdown).await?)))
93 }
94
95 pub async fn new_client(
97 node_ip: SocketAddr,
98 rest_ip: Option<SocketAddr>,
99 rest_rps: u32,
100 account: Account<N>,
101 trusted_peers: &[SocketAddr],
102 genesis: Block<N>,
103 cdn: Option<String>,
104 storage_mode: StorageMode,
105 rotate_external_peers: bool,
106 dev: Option<u16>,
107 shutdown: Arc<AtomicBool>,
108 ) -> Result<Self> {
109 Ok(Self::Client(Arc::new(
110 Client::new(
111 node_ip,
112 rest_ip,
113 rest_rps,
114 account,
115 trusted_peers,
116 genesis,
117 cdn,
118 storage_mode,
119 rotate_external_peers,
120 dev,
121 shutdown,
122 )
123 .await?,
124 )))
125 }
126
127 pub fn node_type(&self) -> NodeType {
129 match self {
130 Self::Validator(validator) => validator.node_type(),
131 Self::Prover(prover) => prover.node_type(),
132 Self::Client(client) => client.node_type(),
133 }
134 }
135
136 pub fn private_key(&self) -> &PrivateKey<N> {
138 match self {
139 Self::Validator(node) => node.private_key(),
140 Self::Prover(node) => node.private_key(),
141 Self::Client(node) => node.private_key(),
142 }
143 }
144
145 pub fn view_key(&self) -> &ViewKey<N> {
147 match self {
148 Self::Validator(node) => node.view_key(),
149 Self::Prover(node) => node.view_key(),
150 Self::Client(node) => node.view_key(),
151 }
152 }
153
154 pub fn address(&self) -> Address<N> {
156 match self {
157 Self::Validator(node) => node.address(),
158 Self::Prover(node) => node.address(),
159 Self::Client(node) => node.address(),
160 }
161 }
162
163 pub fn is_dev(&self) -> bool {
165 match self {
166 Self::Validator(node) => node.is_dev(),
167 Self::Prover(node) => node.is_dev(),
168 Self::Client(node) => node.is_dev(),
169 }
170 }
171}