hydrabadger/src/lib.rs

579 lines
17 KiB
Rust
Raw Permalink Normal View History

2018-08-04 18:54:30 -07:00
#![cfg_attr(feature = "nightly", feature(alloc_system))]
2018-09-10 12:07:53 -07:00
#![cfg_attr(feature = "nightly", feature(proc_macro))]
2018-12-07 08:44:48 -08:00
#![cfg_attr(
feature = "cargo-clippy",
allow(
large_enum_variant,
new_without_default_derive,
expect_fun_call,
or_fun_call,
useless_format,
cyclomatic_complexity,
needless_pass_by_value,
module_inception,
match_bool
)
)]
2018-06-30 12:00:23 -07:00
2018-08-04 18:54:30 -07:00
#[cfg(feature = "nightly")]
extern crate alloc_system;
2018-06-30 12:00:23 -07:00
extern crate clap;
2018-07-02 19:36:12 -07:00
extern crate env_logger;
2018-08-04 18:54:30 -07:00
#[macro_use]
extern crate log;
#[macro_use]
extern crate failure;
2018-07-02 19:36:12 -07:00
extern crate chrono;
2019-08-13 00:38:55 -07:00
extern crate crossbeam;
2018-09-28 06:13:31 -07:00
extern crate crypto;
2018-07-02 19:36:12 -07:00
extern crate num_bigint;
2018-09-28 06:13:31 -07:00
extern crate num_traits;
2018-08-04 18:54:30 -07:00
#[macro_use]
extern crate futures;
2018-09-28 06:13:31 -07:00
extern crate byteorder;
extern crate bytes;
extern crate rand;
2018-07-02 19:36:12 -07:00
extern crate tokio;
extern crate tokio_codec;
extern crate tokio_io;
extern crate uuid;
2018-08-04 18:54:30 -07:00
#[macro_use]
extern crate serde_derive;
extern crate bincode;
2018-07-12 15:32:39 -07:00
extern crate clear_on_drop;
2018-12-09 11:14:44 -08:00
pub extern crate hbbft;
2018-09-28 06:13:31 -07:00
extern crate parking_lot;
extern crate serde;
extern crate serde_bytes;
extern crate tokio_serde_bincode;
2018-06-30 12:00:23 -07:00
2018-08-04 18:54:30 -07:00
#[cfg(feature = "nightly")]
use alloc_system::System;
2018-07-28 15:43:13 -07:00
2018-08-04 18:54:30 -07:00
#[cfg(feature = "nightly")]
#[global_allocator]
static A: System = System;
2018-07-28 15:43:13 -07:00
// pub mod network;
2018-07-02 19:36:12 -07:00
pub mod blockchain;
2018-09-28 06:13:31 -07:00
pub mod hydrabadger;
2018-07-17 14:06:23 -07:00
pub mod peer;
2018-07-02 19:36:12 -07:00
2018-09-28 06:13:31 -07:00
use bytes::{Bytes, BytesMut};
use futures::{sync::mpsc, AsyncSink, StartSend};
2018-12-07 08:44:48 -08:00
use hbbft::{
crypto::{PublicKey, PublicKeySet, SecretKey, Signature},
dynamic_honey_badger::{
Change as DhbChange, DynamicHoneyBadger, JoinPlan, Message as DhbMessage,
},
sync_key_gen::{Ack, Part},
2019-01-22 09:50:16 -08:00
Contribution as HbbftContribution, CpStep as MessagingStep, NodeIdT,
2018-12-07 08:44:48 -08:00
};
2019-08-13 00:38:55 -07:00
use rand::{
distributions::{Distribution, Standard},
Rng,
};
2018-09-28 06:13:31 -07:00
use serde::{de::DeserializeOwned, Serialize};
2018-07-20 19:07:49 -07:00
use std::{
collections::BTreeMap,
fmt::{self, Debug},
marker::PhantomData,
2018-09-28 06:13:31 -07:00
net::SocketAddr,
ops::Deref,
2018-07-20 19:07:49 -07:00
};
2018-12-07 08:44:48 -08:00
use tokio::{
codec::{Framed, LengthDelimitedCodec},
io,
net::TcpStream,
prelude::*,
2018-07-20 19:07:49 -07:00
};
2018-12-07 08:44:48 -08:00
use uuid::Uuid;
2018-07-20 19:07:49 -07:00
2018-12-07 08:44:48 -08:00
pub use crate::blockchain::{Blockchain, MiningError};
pub use crate::hydrabadger::{Config, Hydrabadger, HydrabadgerWeak};
// TODO: Create a separate, library-wide error type.
2018-12-07 08:44:48 -08:00
pub use crate::hydrabadger::key_gen;
pub use crate::hydrabadger::Error;
pub use crate::hydrabadger::StateDsct;
pub use hbbft::dynamic_honey_badger::Batch;
2018-07-20 19:07:49 -07:00
/// Transmit half of the wire message channel.
// TODO: Use a bounded tx/rx (find a sensible upper bound):
2018-12-13 20:19:19 -08:00
type WireTx<C, N> = mpsc::UnboundedSender<WireMessage<C, N>>;
2018-07-20 19:07:49 -07:00
/// Receive half of the wire message channel.
// TODO: Use a bounded tx/rx (find a sensible upper bound):
2018-12-13 20:19:19 -08:00
type WireRx<C, N> = mpsc::UnboundedReceiver<WireMessage<C, N>>;
2018-07-20 19:07:49 -07:00
/// Transmit half of the internal message channel.
// TODO: Use a bounded tx/rx (find a sensible upper bound):
2018-12-13 20:19:19 -08:00
type InternalTx<C, N> = mpsc::UnboundedSender<InternalMessage<C, N>>;
2018-07-20 19:07:49 -07:00
/// Receive half of the internal message channel.
// TODO: Use a bounded tx/rx (find a sensible upper bound):
2018-12-13 20:19:19 -08:00
type InternalRx<C, N> = mpsc::UnboundedReceiver<InternalMessage<C, N>>;
2018-07-20 19:07:49 -07:00
2018-10-02 09:47:11 -07:00
/// Transmit half of the batch output channel.
// TODO: Use a bounded tx/rx (find a sensible upper bound):
2018-12-13 20:19:19 -08:00
type BatchTx<C, N> = mpsc::UnboundedSender<Batch<C, N>>;
2018-10-02 09:47:11 -07:00
/// Receive half of the batch output channel.
// TODO: Use a bounded tx/rx (find a sensible upper bound):
2018-12-13 20:19:19 -08:00
pub type BatchRx<C, N> = mpsc::UnboundedReceiver<Batch<C, N>>;
2018-10-02 09:47:11 -07:00
/// Transmit half of the epoch number output channel.
// TODO: Use a bounded tx/rx (find a sensible upper bound):
type EpochTx = mpsc::UnboundedSender<u64>;
/// Receive half of the epoch number output channel.
// TODO: Use a bounded tx/rx (find a sensible upper bound):
pub type EpochRx = mpsc::UnboundedReceiver<u64>;
2018-09-28 06:13:31 -07:00
pub trait Contribution:
HbbftContribution + Clone + Debug + Serialize + DeserializeOwned + 'static
2018-12-07 08:44:48 -08:00
{
}
2018-09-28 06:13:31 -07:00
impl<C> Contribution for C where
C: HbbftContribution + Clone + Debug + Serialize + DeserializeOwned + 'static
2018-12-07 08:44:48 -08:00
{
}
2018-07-20 19:07:49 -07:00
2019-01-22 09:50:16 -08:00
pub trait NodeId: NodeIdT + Serialize + DeserializeOwned + 'static {}
2018-12-13 20:19:19 -08:00
2019-01-22 09:50:16 -08:00
impl<N> NodeId for N where N: NodeIdT + Serialize + DeserializeOwned + 'static {}
2018-12-13 20:19:19 -08:00
2018-07-20 19:07:49 -07:00
/// A unique identifier.
#[derive(Clone, Copy, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize, Deserialize)]
pub struct Uid(pub(crate) Uuid);
impl Uid {
/// Returns a new, random `Uid`.
2019-08-13 00:38:55 -07:00
pub fn new() -> Self {
Self::default()
}
}
impl Default for Uid {
fn default() -> Self {
Self(Uuid::new_v4())
2018-07-20 19:07:49 -07:00
}
}
2019-01-22 09:50:16 -08:00
impl Distribution<Uid> for Standard {
fn sample<R: Rng + ?Sized>(&self, _rng: &mut R) -> Uid {
2018-07-20 19:07:49 -07:00
Uid::new()
}
}
impl fmt::Display for Uid {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
fmt::LowerHex::fmt(&self.0, f)
}
}
impl fmt::Debug for Uid {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
fmt::LowerHex::fmt(&self.0, f)
}
}
2019-01-21 18:09:30 -08:00
pub type Message<N> = DhbMessage<N>;
pub type Step<C, N> = MessagingStep<DynamicHoneyBadger<C, N>>;
pub type Change<N> = DhbChange<N>;
2018-07-20 19:07:49 -07:00
/// A peer's incoming (listening) address.
#[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq, Hash)]
pub struct InAddr(pub SocketAddr);
impl Deref for InAddr {
type Target = SocketAddr;
fn deref(&self) -> &SocketAddr {
&self.0
}
}
impl fmt::Display for InAddr {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "InAddr({})", self.0)
}
}
/// An internal address used to respond to a connected peer.
#[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq, Hash)]
pub struct OutAddr(pub SocketAddr);
impl Deref for OutAddr {
type Target = SocketAddr;
fn deref(&self) -> &SocketAddr {
&self.0
}
}
impl fmt::Display for OutAddr {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "OutAddr({})", self.0)
}
}
/// Nodes of the network.
#[derive(Clone, Debug, Serialize, Deserialize)]
2018-12-13 20:19:19 -08:00
pub struct NetworkNodeInfo<N> {
pub(crate) nid: N,
2018-07-20 19:07:49 -07:00
pub(crate) in_addr: InAddr,
pub(crate) pk: PublicKey,
}
2019-08-13 00:38:55 -07:00
type ActiveNetworkInfo<N> = (
Vec<NetworkNodeInfo<N>>,
PublicKeySet,
BTreeMap<N, PublicKey>,
);
2018-07-20 19:07:49 -07:00
/// The current state of the network.
#[derive(Clone, Debug, Serialize, Deserialize)]
2019-01-22 09:50:16 -08:00
pub enum NetworkState<N: Ord> {
2018-07-20 19:07:49 -07:00
None,
2018-12-13 20:19:19 -08:00
Unknown(Vec<NetworkNodeInfo<N>>),
AwaitingMorePeersForKeyGeneration(Vec<NetworkNodeInfo<N>>),
GeneratingKeys(Vec<NetworkNodeInfo<N>>, BTreeMap<N, PublicKey>),
Active(ActiveNetworkInfo<N>),
2018-07-20 19:07:49 -07:00
}
/// Messages sent over the network between nodes.
///
2018-11-19 12:10:47 -08:00
/// [`Message`](enum.WireMessageKind.html#variant.Message) variants are among
/// those verified.
2018-07-20 19:07:49 -07:00
#[derive(Clone, Debug, Serialize, Deserialize)]
2019-01-22 09:50:16 -08:00
pub enum WireMessageKind<C, N: Ord> {
2018-12-13 20:19:19 -08:00
HelloFromValidator(N, InAddr, PublicKey, NetworkState<N>),
HelloRequestChangeAdd(N, InAddr, PublicKey),
WelcomeReceivedChangeAdd(N, PublicKey, NetworkState<N>),
2018-07-20 19:07:49 -07:00
RequestNetworkState,
2018-12-13 20:19:19 -08:00
NetworkState(NetworkState<N>),
2018-07-20 19:07:49 -07:00
Goodbye,
#[serde(with = "serde_bytes")]
// TODO(c0gent): Remove.
2018-07-20 19:07:49 -07:00
Bytes(Bytes),
/// A Honey Badger message.
///
/// All received messages are verified against the senders public key
/// using an attached signature.
2018-12-13 20:19:19 -08:00
Message(N, Message<N>),
// TODO(c0gent): Remove.
2018-12-13 20:19:19 -08:00
Transaction(N, C),
2018-11-26 17:37:25 -08:00
/// Messages used during synchronous key generation.
KeyGen(key_gen::InstanceId, key_gen::Message),
2018-12-13 20:19:19 -08:00
JoinPlan(JoinPlan<N>),
2018-07-20 19:07:49 -07:00
}
/// Messages sent over the network between nodes.
#[derive(Clone, Debug, Serialize, Deserialize)]
2019-01-22 09:50:16 -08:00
pub struct WireMessage<C, N: Ord> {
2018-12-13 20:19:19 -08:00
kind: WireMessageKind<C, N>,
2018-07-20 19:07:49 -07:00
}
2018-12-13 20:19:19 -08:00
impl<C: Contribution, N: NodeId> WireMessage<C, N> {
2018-09-28 06:13:31 -07:00
pub fn hello_from_validator(
2018-12-13 20:19:19 -08:00
src_uid: N,
2018-09-28 06:13:31 -07:00
in_addr: InAddr,
pk: PublicKey,
2018-12-13 20:19:19 -08:00
net_state: NetworkState<N>,
) -> WireMessage<C, N> {
2018-07-23 12:01:13 -07:00
WireMessageKind::HelloFromValidator(src_uid, in_addr, pk, net_state).into()
2018-07-20 19:07:49 -07:00
}
/// Returns a `HelloRequestChangeAdd` variant.
2018-09-28 06:13:31 -07:00
pub fn hello_request_change_add(
2018-12-13 20:19:19 -08:00
src_uid: N,
2018-09-28 06:13:31 -07:00
in_addr: InAddr,
pk: PublicKey,
2018-12-13 20:19:19 -08:00
) -> WireMessage<C, N> {
2018-11-19 12:10:47 -08:00
WireMessageKind::HelloRequestChangeAdd(src_uid, in_addr, pk).into()
2018-07-20 19:07:49 -07:00
}
/// Returns a `WelcomeReceivedChangeAdd` variant.
2018-09-28 06:13:31 -07:00
pub fn welcome_received_change_add(
2018-12-13 20:19:19 -08:00
src_uid: N,
2018-09-28 06:13:31 -07:00
pk: PublicKey,
2018-12-13 20:19:19 -08:00
net_state: NetworkState<N>,
) -> WireMessage<C, N> {
2018-11-19 12:10:47 -08:00
WireMessageKind::WelcomeReceivedChangeAdd(src_uid, pk, net_state).into()
2018-07-20 19:07:49 -07:00
}
2018-07-23 12:34:08 -07:00
/// Returns an `Input` variant.
2018-12-13 20:19:19 -08:00
pub fn transaction(src_uid: N, txn: C) -> WireMessage<C, N> {
2018-11-19 12:10:47 -08:00
WireMessageKind::Transaction(src_uid, txn).into()
2018-07-23 12:34:08 -07:00
}
/// Returns a `Message` variant.
2018-12-13 20:19:19 -08:00
pub fn message(src_uid: N, msg: Message<N>) -> WireMessage<C, N> {
2018-11-19 12:10:47 -08:00
WireMessageKind::Message(src_uid, msg).into()
}
2018-12-13 20:19:19 -08:00
pub fn key_gen(instance_id: key_gen::InstanceId, msg: key_gen::Message) -> WireMessage<C, N> {
WireMessageKind::KeyGen(instance_id, msg).into()
2018-11-26 17:37:25 -08:00
}
2018-12-13 20:19:19 -08:00
pub fn key_gen_part(instance_id: key_gen::InstanceId, part: Part) -> WireMessage<C, N> {
WireMessage::key_gen(instance_id, key_gen::Message::part(part))
2018-07-20 19:07:49 -07:00
}
2018-12-13 20:19:19 -08:00
pub fn key_gen_ack(instance_id: key_gen::InstanceId, ack: Ack) -> WireMessage<C, N> {
WireMessage::key_gen(instance_id, key_gen::Message::ack(ack))
2018-07-20 19:07:49 -07:00
}
2018-12-13 20:19:19 -08:00
pub fn join_plan(jp: JoinPlan<N>) -> WireMessage<C, N> {
WireMessageKind::JoinPlan(jp).into()
2018-07-20 19:07:49 -07:00
}
/// Returns the wire message kind.
2018-12-13 20:19:19 -08:00
pub fn kind(&self) -> &WireMessageKind<C, N> {
2018-07-20 19:07:49 -07:00
&self.kind
}
/// Consumes this `WireMessage` into its kind.
2018-12-13 20:19:19 -08:00
pub fn into_kind(self) -> WireMessageKind<C, N> {
2018-07-20 19:07:49 -07:00
self.kind
}
}
2018-12-13 20:19:19 -08:00
impl<C: Contribution, N: NodeId> From<WireMessageKind<C, N>> for WireMessage<C, N> {
fn from(kind: WireMessageKind<C, N>) -> WireMessage<C, N> {
2018-07-20 19:07:49 -07:00
WireMessage { kind }
}
}
2018-11-14 05:13:01 -08:00
/// A serialized `WireMessage` signed by the sender.
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct SignedWireMessage {
message: Vec<u8>,
sig: Signature,
}
2018-07-20 19:07:49 -07:00
/// A stream/sink of `WireMessage`s connected to a socket.
2018-12-13 20:19:19 -08:00
pub struct WireMessages<C: Contribution, N: NodeId> {
framed: Framed<TcpStream, LengthDelimitedCodec>,
2018-11-19 12:10:47 -08:00
local_sk: SecretKey,
peer_pk: Option<PublicKey>,
2018-12-13 20:19:19 -08:00
_c: PhantomData<C>,
_n: PhantomData<N>,
2018-07-20 19:07:49 -07:00
}
2018-12-13 20:19:19 -08:00
impl<C: Contribution, N: NodeId + DeserializeOwned> WireMessages<C, N> {
pub fn new(socket: TcpStream, local_sk: SecretKey) -> WireMessages<C, N> {
2018-07-20 19:07:49 -07:00
WireMessages {
framed: Framed::new(socket, LengthDelimitedCodec::new()),
2018-11-19 12:10:47 -08:00
local_sk,
peer_pk: None,
2018-12-13 20:19:19 -08:00
_c: PhantomData,
_n: PhantomData,
2018-07-20 19:07:49 -07:00
}
}
2018-11-19 12:10:47 -08:00
pub fn set_peer_public_key(&mut self, peer_pk: PublicKey) {
assert!(self.peer_pk.map(|pk| pk == peer_pk).unwrap_or(true));
self.peer_pk = Some(peer_pk);
}
2018-07-20 19:07:49 -07:00
pub fn socket(&self) -> &TcpStream {
self.framed.get_ref()
}
2018-12-13 20:19:19 -08:00
pub fn send_msg(&mut self, msg: WireMessage<C, N>) -> Result<(), Error> {
2018-07-20 19:07:49 -07:00
self.start_send(msg)?;
let _ = self.poll_complete()?;
Ok(())
}
}
2018-12-13 20:19:19 -08:00
impl<C: Contribution, N: NodeId + DeserializeOwned> Stream for WireMessages<C, N> {
type Item = WireMessage<C, N>;
2018-07-20 19:07:49 -07:00
type Error = Error;
fn poll(&mut self) -> Poll<Option<Self::Item>, Self::Error> {
match try_ready!(self.framed.poll()) {
Some(frame) => {
2018-11-14 05:13:01 -08:00
let s_msg: SignedWireMessage =
bincode::deserialize(&frame.freeze()).map_err(Error::Serde)?;
2018-12-13 20:19:19 -08:00
let msg: WireMessage<C, N> =
2018-11-14 05:13:01 -08:00
bincode::deserialize(&s_msg.message).map_err(Error::Serde)?;
2018-11-19 12:10:47 -08:00
// Verify signature for certain variants.
match msg.kind {
2018-12-07 08:44:48 -08:00
WireMessageKind::Message(..) | WireMessageKind::KeyGen(..) => {
let peer_pk = self
.peer_pk
.ok_or(Error::VerificationMessageReceivedUnknownPeer)?;
2018-11-19 12:10:47 -08:00
if !peer_pk.verify(&s_msg.sig, &s_msg.message) {
return Err(Error::InvalidSignature);
}
2018-11-14 05:13:01 -08:00
}
2018-11-19 12:10:47 -08:00
_ => {}
2018-11-14 05:13:01 -08:00
}
2018-11-14 05:13:01 -08:00
Ok(Async::Ready(Some(msg)))
2018-07-20 19:07:49 -07:00
}
2018-09-28 06:13:31 -07:00
None => Ok(Async::Ready(None)),
2018-07-20 19:07:49 -07:00
}
}
}
2018-12-13 20:19:19 -08:00
impl<C: Contribution, N: NodeId + Serialize> Sink for WireMessages<C, N> {
type SinkItem = WireMessage<C, N>;
2018-07-20 19:07:49 -07:00
type SinkError = Error;
fn start_send(&mut self, item: Self::SinkItem) -> StartSend<Self::SinkItem, Self::SinkError> {
// TODO: Reuse buffer:
let mut serialized = BytesMut::new();
2018-08-03 06:35:15 -07:00
2018-11-14 05:13:01 -08:00
let message = bincode::serialize(&item).map_err(Error::Serde)?;
2018-11-19 12:10:47 -08:00
let sig = self.local_sk.sign(&message);
2018-11-14 05:13:01 -08:00
match bincode::serialize(&SignedWireMessage { message, sig }) {
2018-07-20 19:07:49 -07:00
Ok(s) => serialized.extend_from_slice(&s),
Err(err) => return Err(Error::Io(io::Error::new(io::ErrorKind::Other, err))),
}
match self.framed.start_send(serialized.freeze()) {
2018-07-20 19:07:49 -07:00
Ok(async_sink) => match async_sink {
AsyncSink::Ready => Ok(AsyncSink::Ready),
AsyncSink::NotReady(_) => Ok(AsyncSink::NotReady(item)),
},
2018-09-28 06:13:31 -07:00
Err(err) => Err(Error::Io(err)),
2018-07-20 19:07:49 -07:00
}
}
fn poll_complete(&mut self) -> Poll<(), Self::SinkError> {
self.framed.poll_complete().map_err(Error::from)
}
fn close(&mut self) -> Poll<(), Self::SinkError> {
self.framed.close().map_err(Error::from)
}
}
/// A message between internal threads/tasks.
#[derive(Clone, Debug)]
2018-12-13 20:19:19 -08:00
pub enum InternalMessageKind<C: Contribution, N: NodeId> {
Wire(WireMessage<C, N>),
HbMessage(Message<N>),
HbContribution(C),
HbChange(Change<N>),
2018-07-20 19:07:49 -07:00
PeerDisconnect,
NewIncomingConnection(InAddr, PublicKey, bool),
2018-07-20 19:07:49 -07:00
NewOutgoingConnection,
NewKeyGenInstance(mpsc::UnboundedSender<key_gen::Message>),
2018-07-20 19:07:49 -07:00
}
/// A message between internal threads/tasks.
#[derive(Clone, Debug)]
2018-12-13 20:19:19 -08:00
pub struct InternalMessage<C: Contribution, N: NodeId> {
src_uid: Option<N>,
2018-07-20 19:07:49 -07:00
src_addr: OutAddr,
2018-12-13 20:19:19 -08:00
kind: InternalMessageKind<C, N>,
2018-07-20 19:07:49 -07:00
}
2018-12-13 20:19:19 -08:00
impl<C: Contribution, N: NodeId> InternalMessage<C, N> {
2018-09-28 06:13:31 -07:00
pub fn new(
2018-12-13 20:19:19 -08:00
src_uid: Option<N>,
2018-09-28 06:13:31 -07:00
src_addr: OutAddr,
2018-12-13 20:19:19 -08:00
kind: InternalMessageKind<C, N>,
) -> InternalMessage<C, N> {
2018-09-28 06:13:31 -07:00
InternalMessage {
src_uid,
src_addr,
kind,
}
2018-07-20 19:07:49 -07:00
}
/// Returns a new `InternalMessage` without a uid.
2019-08-13 00:38:55 -07:00
pub fn new_without_uid(
src_addr: OutAddr,
kind: InternalMessageKind<C, N>,
) -> InternalMessage<C, N> {
2018-07-20 19:07:49 -07:00
InternalMessage::new(None, src_addr, kind)
}
2018-09-28 06:13:31 -07:00
pub fn wire(
2018-12-13 20:19:19 -08:00
src_uid: Option<N>,
2018-09-28 06:13:31 -07:00
src_addr: OutAddr,
2018-12-13 20:19:19 -08:00
wire_message: WireMessage<C, N>,
) -> InternalMessage<C, N> {
2018-07-20 19:07:49 -07:00
InternalMessage::new(src_uid, src_addr, InternalMessageKind::Wire(wire_message))
}
2018-12-13 20:19:19 -08:00
pub fn hb_message(src_uid: N, src_addr: OutAddr, msg: Message<N>) -> InternalMessage<C, N> {
2018-07-20 19:07:49 -07:00
InternalMessage::new(Some(src_uid), src_addr, InternalMessageKind::HbMessage(msg))
}
2018-12-13 20:19:19 -08:00
pub fn hb_contribution(src_uid: N, src_addr: OutAddr, contrib: C) -> InternalMessage<C, N> {
2018-12-07 08:44:48 -08:00
InternalMessage::new(
Some(src_uid),
src_addr,
InternalMessageKind::HbContribution(contrib),
)
}
2018-12-13 20:19:19 -08:00
pub fn hb_vote(src_uid: N, src_addr: OutAddr, change: Change<N>) -> InternalMessage<C, N> {
2018-12-07 08:44:48 -08:00
InternalMessage::new(
Some(src_uid),
src_addr,
InternalMessageKind::HbChange(change),
)
2018-07-20 19:07:49 -07:00
}
2018-12-13 20:19:19 -08:00
pub fn peer_disconnect(src_uid: N, src_addr: OutAddr) -> InternalMessage<C, N> {
2018-07-20 19:07:49 -07:00
InternalMessage::new(Some(src_uid), src_addr, InternalMessageKind::PeerDisconnect)
}
2018-09-28 06:13:31 -07:00
pub fn new_incoming_connection(
2018-12-13 20:19:19 -08:00
src_uid: N,
2018-09-28 06:13:31 -07:00
src_addr: OutAddr,
src_in_addr: InAddr,
src_pk: PublicKey,
request_change_add: bool,
2018-12-13 20:19:19 -08:00
) -> InternalMessage<C, N> {
2018-09-28 06:13:31 -07:00
InternalMessage::new(
Some(src_uid),
src_addr,
InternalMessageKind::NewIncomingConnection(src_in_addr, src_pk, request_change_add),
)
2018-07-20 19:07:49 -07:00
}
2018-12-07 08:44:48 -08:00
pub fn new_key_gen_instance(
2018-12-13 20:19:19 -08:00
src_uid: N,
2018-12-07 08:44:48 -08:00
src_addr: OutAddr,
tx: mpsc::UnboundedSender<key_gen::Message>,
2018-12-13 20:19:19 -08:00
) -> InternalMessage<C, N> {
2018-12-07 08:44:48 -08:00
InternalMessage::new(
Some(src_uid),
src_addr,
InternalMessageKind::NewKeyGenInstance(tx),
)
}
2018-12-13 20:19:19 -08:00
pub fn new_outgoing_connection(src_addr: OutAddr) -> InternalMessage<C, N> {
2018-07-20 19:07:49 -07:00
InternalMessage::new_without_uid(src_addr, InternalMessageKind::NewOutgoingConnection)
}
/// Returns the source unique identifier this message was received in.
2018-12-13 20:19:19 -08:00
pub fn src_uid(&self) -> Option<&N> {
2018-07-20 19:07:49 -07:00
self.src_uid.as_ref()
}
/// Returns the source socket this message was received on.
pub fn src_addr(&self) -> &OutAddr {
&self.src_addr
}
/// Returns the internal message kind.
2018-12-13 20:19:19 -08:00
pub fn kind(&self) -> &InternalMessageKind<C, N> {
2018-07-20 19:07:49 -07:00
&self.kind
}
/// Consumes this `InternalMessage` into its parts.
2018-12-13 20:19:19 -08:00
pub fn into_parts(self) -> (Option<N>, OutAddr, InternalMessageKind<C, N>) {
2018-07-20 19:07:49 -07:00
(self.src_uid, self.src_addr, self.kind)
}
}