forked from ProvableHQ/snarkOS
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlib.rs
162 lines (138 loc) · 5.03 KB
/
lib.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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
// Copyright (C) 2019-2022 Aleo Systems Inc.
// This file is part of the snarkOS library.
// The snarkOS library is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// The snarkOS library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with the snarkOS library. If not, see <https://www.gnu.org/licenses/>.
#![forbid(unsafe_code)]
#![recursion_limit = "256"]
#[macro_use]
extern crate async_trait;
#[macro_use]
extern crate tracing;
mod beacon;
pub use beacon::*;
mod client;
pub use client::*;
mod prover;
pub use prover::*;
mod validator;
pub use validator::*;
mod helpers;
mod traits;
pub use traits::*;
pub use snarkos_node_messages::NodeType;
use snarkos_account::Account;
use snarkos_node_store::ConsensusDB;
use snarkvm::prelude::{Address, Block, ConsensusMemory, Network, PrivateKey, ViewKey};
use anyhow::Result;
use std::{net::SocketAddr, sync::Arc};
pub enum Node<N: Network> {
/// A beacon is a full node, capable of producing blocks.
Beacon(Arc<Beacon<N, ConsensusDB<N>>>),
/// A validator is a full node, capable of validating blocks.
Validator(Arc<Validator<N, ConsensusDB<N>>>),
/// A prover is a full node, capable of producing proofs for consensus.
Prover(Arc<Prover<N, ConsensusMemory<N>>>),
/// A client node is a full node, capable of querying with the network.
Client(Arc<Client<N, ConsensusMemory<N>>>),
}
impl<N: Network> Node<N> {
/// Initializes a new beacon node.
pub async fn new_beacon(
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::Beacon(Arc::new(Beacon::new(node_ip, rest_ip, account, trusted_peers, genesis, cdn, dev).await?)))
}
/// Initializes a new validator node.
pub async fn new_validator(
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::Validator(Arc::new(
Validator::new(node_ip, rest_ip, account, trusted_peers, genesis, cdn, dev).await?,
)))
}
/// Initializes a new prover node.
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?)))
}
/// Initializes a new client node.
pub async fn new_client(
node_ip: SocketAddr,
account: Account<N>,
trusted_peers: &[SocketAddr],
genesis: Block<N>,
dev: Option<u16>,
) -> Result<Self> {
Ok(Self::Client(Arc::new(Client::new(node_ip, account, trusted_peers, genesis, dev).await?)))
}
/// Returns the node type.
pub fn node_type(&self) -> NodeType {
match self {
Self::Beacon(beacon) => beacon.node_type(),
Self::Validator(validator) => validator.node_type(),
Self::Prover(prover) => prover.node_type(),
Self::Client(client) => client.node_type(),
}
}
/// Returns the account private key of the node.
pub fn private_key(&self) -> &PrivateKey<N> {
match self {
Self::Beacon(node) => node.private_key(),
Self::Validator(node) => node.private_key(),
Self::Prover(node) => node.private_key(),
Self::Client(node) => node.private_key(),
}
}
/// Returns the account view key of the node.
pub fn view_key(&self) -> &ViewKey<N> {
match self {
Self::Beacon(node) => node.view_key(),
Self::Validator(node) => node.view_key(),
Self::Prover(node) => node.view_key(),
Self::Client(node) => node.view_key(),
}
}
/// Returns the account address of the node.
pub fn address(&self) -> Address<N> {
match self {
Self::Beacon(node) => node.address(),
Self::Validator(node) => node.address(),
Self::Prover(node) => node.address(),
Self::Client(node) => node.address(),
}
}
/// Returns `true` if the node is in development mode.
pub fn is_dev(&self) -> bool {
match self {
Self::Beacon(node) => node.is_dev(),
Self::Validator(node) => node.is_dev(),
Self::Prover(node) => node.is_dev(),
Self::Client(node) => node.is_dev(),
}
}
}