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
// Copyright (C) 2019-2021 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/>.

// Compilation
#![allow(clippy::module_inception)]
#![warn(unused_extern_crates)]
#![forbid(unsafe_code)]
// Documentation
// todo: readd in Rust 1.54
// #![doc = include_str!("../documentation/concepts/network_server.md")]

#[macro_use]
extern crate derivative;
#[macro_use]
extern crate tracing;

pub use config::*;
pub use drop_join::*;
pub use errors::*;
pub use inbound::*;
pub use message::*;
pub use node::*;
pub use peers::*;
pub use snarkos_metrics::stats::*;
pub use sync::*;

pub mod config;
mod drop_join;
pub mod errors;
pub mod inbound;
pub mod message;
pub mod node;
pub mod peers;
pub mod sync;

/// The maximum number of block hashes that can be requested or provided in a single batch.
pub const MAX_BLOCK_SYNC_COUNT: u32 = 64;
/// The maximum amount of time allowed to process a single batch of sync blocks. It should be aligned
/// with `MAX_BLOCK_SYNC_COUNT`.
pub const BLOCK_SYNC_EXPIRATION_SECS: u8 = 30;

/// The noise handshake pattern.
pub const HANDSHAKE_PATTERN: &str = "Noise_XXpsk3_25519_ChaChaPoly_SHA256";
/// The pre-shared key for the noise handshake.
pub const HANDSHAKE_PSK: &[u8] = b"b765e427e836e0029a1e2a22ba60c52a"; // the PSK must be 32B
/// The spec-compliant size of the noise buffer.
pub const NOISE_BUF_LEN: usize = 65535;
/// The spec-compliant size of the noise tag field.
pub const NOISE_TAG_LEN: usize = 16;

/// The maximum amount of time in which a handshake with a bootnode can conclude before dropping the
/// connection; it should be no greater than the `peer_sync_interval`.
pub const HANDSHAKE_BOOTNODE_TIMEOUT_SECS: u8 = 10;
/// The maximum amount of time in which a handshake with a regular node can conclude before dropping the
/// connection; it should be no greater than the `peer_sync_interval`.
pub const HANDSHAKE_PEER_TIMEOUT_SECS: u8 = 5;
/// The amount of time after which a peer will be considered inactive an disconnected from if they have
/// not sent any messages in the meantime.
pub const MAX_PEER_INACTIVITY_SECS: u8 = 30;

/// The maximum size of a message that can be transmitted in the network.
pub const MAX_MESSAGE_SIZE: usize = 8 * 1024 * 1024; // 8MiB
/// The maximum number of peers shared at once in response to a `GetPeers` message.
pub const SHARED_PEER_COUNT: usize = 25;

/// The depth of the common inbound channel.
pub const INBOUND_CHANNEL_DEPTH: usize = 16 * 1024;
/// The depth of the per-connection outbound channels.
pub const OUTBOUND_CHANNEL_DEPTH: usize = 1024;

/// The version of the network protocol; it can be incremented in order to force users to update.
/// FIXME: probably doesn't need to be a u64, could also be more informative than just a number
// TODO (raychu86): Establish a formal node version.
pub const PROTOCOL_VERSION: u64 = 2;

pub(crate) type Sender = tokio::sync::mpsc::Sender<Message>;

pub(crate) type Receiver = tokio::sync::mpsc::Receiver<Message>;