Update rand & hbbft.
This commit is contained in:
parent
161b31f583
commit
94546b0e2c
|
@ -22,7 +22,6 @@ no-simd = ["hbbft/no-simd"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
# env_logger = "*"
|
|
||||||
env_logger = "0.5"
|
env_logger = "0.5"
|
||||||
clap = "2"
|
clap = "2"
|
||||||
failure = "0.1"
|
failure = "0.1"
|
||||||
|
@ -35,7 +34,7 @@ num-bigint = "*"
|
||||||
colored = "*"
|
colored = "*"
|
||||||
itertools = "*"
|
itertools = "*"
|
||||||
pairing = "*"
|
pairing = "*"
|
||||||
rand = "0.4.2"
|
rand = "0.6"
|
||||||
serde = "1"
|
serde = "1"
|
||||||
serde_bytes = "~0.10.4"
|
serde_bytes = "~0.10.4"
|
||||||
serde_derive = "1"
|
serde_derive = "1"
|
||||||
|
@ -58,8 +57,7 @@ version = "*"
|
||||||
# git = "https://github.com/c0gent/hbbft"
|
# git = "https://github.com/c0gent/hbbft"
|
||||||
git = "https://github.com/poanetwork/hbbft"
|
git = "https://github.com/poanetwork/hbbft"
|
||||||
# branch = "master"
|
# branch = "master"
|
||||||
rev = "ceb416a6"
|
rev = "d4a7b19"
|
||||||
# rev = "d4a7b19adb7021efcefdf735f6dd2c45cce0a1d2"
|
|
||||||
# path = "../hbbft"
|
# path = "../hbbft"
|
||||||
|
|
||||||
[profile.release]
|
[profile.release]
|
||||||
|
|
|
@ -11,7 +11,7 @@ extern crate serde_derive;
|
||||||
use chrono::Local;
|
use chrono::Local;
|
||||||
use clap::{App, Arg, ArgMatches};
|
use clap::{App, Arg, ArgMatches};
|
||||||
use hydrabadger::{Blockchain, Config, Hydrabadger, MiningError, Uid};
|
use hydrabadger::{Blockchain, Config, Hydrabadger, MiningError, Uid};
|
||||||
use rand::Rng;
|
use rand::{Rng, distributions::Standard};
|
||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
use std::env;
|
use std::env;
|
||||||
use std::io::Write;
|
use std::io::Write;
|
||||||
|
@ -97,7 +97,7 @@ pub struct Transaction(pub Vec<u8>);
|
||||||
|
|
||||||
impl Transaction {
|
impl Transaction {
|
||||||
fn random(len: usize) -> Transaction {
|
fn random(len: usize) -> Transaction {
|
||||||
Transaction(rand::thread_rng().gen_iter().take(len).collect())
|
Transaction(rand::thread_rng().sample_iter(&Standard).take(len).collect())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@ use futures::{
|
||||||
};
|
};
|
||||||
use hbbft::crypto::{PublicKey, SecretKey};
|
use hbbft::crypto::{PublicKey, SecretKey};
|
||||||
use parking_lot::{Mutex, RwLock, RwLockReadGuard, RwLockWriteGuard};
|
use parking_lot::{Mutex, RwLock, RwLockReadGuard, RwLockWriteGuard};
|
||||||
use rand::{self, Rand};
|
use rand::{self, Rng};
|
||||||
use std::{
|
use std::{
|
||||||
collections::HashSet,
|
collections::HashSet,
|
||||||
net::SocketAddr,
|
net::SocketAddr,
|
||||||
|
@ -81,7 +81,6 @@ impl Default for Config {
|
||||||
/// Shared all over the place.
|
/// Shared all over the place.
|
||||||
struct Inner<C: Contribution, N: NodeId> {
|
struct Inner<C: Contribution, N: NodeId> {
|
||||||
/// Node nid:
|
/// Node nid:
|
||||||
// nid: Uid,
|
|
||||||
nid: N,
|
nid: N,
|
||||||
/// Incoming connection socket.
|
/// Incoming connection socket.
|
||||||
addr: InAddr,
|
addr: InAddr,
|
||||||
|
@ -123,8 +122,7 @@ pub struct Hydrabadger<C: Contribution, N: NodeId> {
|
||||||
impl<C: Contribution, N: NodeId + DeserializeOwned + 'static> Hydrabadger<C, N> {
|
impl<C: Contribution, N: NodeId + DeserializeOwned + 'static> Hydrabadger<C, N> {
|
||||||
/// Returns a new Hydrabadger node.
|
/// Returns a new Hydrabadger node.
|
||||||
pub fn new(addr: SocketAddr, cfg: Config, nid: N) -> Self {
|
pub fn new(addr: SocketAddr, cfg: Config, nid: N) -> Self {
|
||||||
// let nid = Uid::new();
|
let secret_key: SecretKey = rand::rngs::OsRng::new().expect("Unable to create rng").gen();
|
||||||
let secret_key = SecretKey::rand(&mut rand::OsRng::new().expect("Unable to create rng"));
|
|
||||||
|
|
||||||
let (peer_internal_tx, peer_internal_rx) = mpsc::unbounded();
|
let (peer_internal_tx, peer_internal_rx) = mpsc::unbounded();
|
||||||
let (batch_tx, batch_rx) = mpsc::unbounded();
|
let (batch_tx, batch_rx) = mpsc::unbounded();
|
||||||
|
|
|
@ -10,7 +10,7 @@ use hbbft::{
|
||||||
crypto::{PublicKey, SecretKey},
|
crypto::{PublicKey, SecretKey},
|
||||||
sync_key_gen::{Ack, AckOutcome, Part, PartOutcome, SyncKeyGen},
|
sync_key_gen::{Ack, AckOutcome, Part, PartOutcome, SyncKeyGen},
|
||||||
};
|
};
|
||||||
use rand;
|
use rand::{self, FromEntropy};
|
||||||
use std::collections::BTreeMap;
|
use std::collections::BTreeMap;
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Hash)]
|
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Hash)]
|
||||||
|
@ -184,21 +184,21 @@ impl<N: NodeId> Machine<N> {
|
||||||
let pk = local_sk.public_key();
|
let pk = local_sk.public_key();
|
||||||
public_keys.insert(local_nid.clone(), pk);
|
public_keys.insert(local_nid.clone(), pk);
|
||||||
|
|
||||||
let mut rng = rand::OsRng::new().expect("Creating OS Rng has failed");
|
let mut rng = rand::rngs::StdRng::from_entropy();
|
||||||
|
|
||||||
let (mut sync_key_gen, opt_part) = SyncKeyGen::new(
|
let (mut sync_key_gen, opt_part) = SyncKeyGen::new(
|
||||||
&mut rng,
|
|
||||||
local_nid.clone(),
|
local_nid.clone(),
|
||||||
local_sk,
|
local_sk,
|
||||||
public_keys.clone(),
|
public_keys.clone(),
|
||||||
threshold,
|
threshold,
|
||||||
|
&mut rng,
|
||||||
)
|
)
|
||||||
.map_err(Error::SyncKeyGenNew)?;
|
.map_err(Error::SyncKeyGenNew)?;
|
||||||
part = opt_part.expect("This node is not a validator (somehow)!");
|
part = opt_part.expect("This node is not a validator (somehow)!");
|
||||||
|
|
||||||
trace!("KEY GENERATION: Handling our own `Part`...");
|
trace!("KEY GENERATION: Handling our own `Part`...");
|
||||||
ack = match sync_key_gen
|
ack = match sync_key_gen
|
||||||
.handle_part(&mut rng, &local_nid, part.clone())
|
.handle_part(&local_nid, part.clone(), &mut rng)
|
||||||
.expect("Handling our own Part has failed")
|
.expect("Handling our own Part has failed")
|
||||||
{
|
{
|
||||||
PartOutcome::Valid(Some(ack)) => ack,
|
PartOutcome::Valid(Some(ack)) => ack,
|
||||||
|
@ -294,9 +294,9 @@ impl<N: NodeId> Machine<N> {
|
||||||
} => {
|
} => {
|
||||||
// TODO: Move this match block into a function somewhere for re-use:
|
// TODO: Move this match block into a function somewhere for re-use:
|
||||||
trace!("KEY GENERATION: Handling part from '{:?}'...", src_nid);
|
trace!("KEY GENERATION: Handling part from '{:?}'...", src_nid);
|
||||||
let mut rng = rand::OsRng::new().expect("Creating OS Rng has failed");
|
let mut rng = rand::rngs::OsRng::new().expect("Creating OS Rng has failed");
|
||||||
let skg = sync_key_gen.as_mut().unwrap();
|
let skg = sync_key_gen.as_mut().unwrap();
|
||||||
let ack = match skg.handle_part(&mut rng, src_nid, part) {
|
let ack = match skg.handle_part(src_nid, part, &mut rng) {
|
||||||
Ok(PartOutcome::Valid(Some(ack))) => ack,
|
Ok(PartOutcome::Valid(Some(ack))) => ack,
|
||||||
Ok(PartOutcome::Invalid(faults)) => panic!(
|
Ok(PartOutcome::Invalid(faults)) => panic!(
|
||||||
"Invalid part \
|
"Invalid part \
|
||||||
|
|
|
@ -3,7 +3,6 @@ mod hydrabadger;
|
||||||
pub mod key_gen;
|
pub mod key_gen;
|
||||||
mod state;
|
mod state;
|
||||||
|
|
||||||
use rand::Rand;
|
|
||||||
use self::handler::Handler;
|
use self::handler::Handler;
|
||||||
use self::state::{State, StateMachine};
|
use self::state::{State, StateMachine};
|
||||||
use crate::{Change, Message};
|
use crate::{Change, Message};
|
||||||
|
@ -19,7 +18,7 @@ pub const WIRE_MESSAGE_RETRY_MAX: usize = 10;
|
||||||
|
|
||||||
/// A HoneyBadger input or message.
|
/// A HoneyBadger input or message.
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub enum InputOrMessage<T, N: Ord + Rand> {
|
pub enum InputOrMessage<T, N: Ord> {
|
||||||
Change(Change<N>),
|
Change(Change<N>),
|
||||||
Contribution(T),
|
Contribution(T),
|
||||||
Message(N, Message<N>),
|
Message(N, Message<N>),
|
||||||
|
|
|
@ -15,7 +15,7 @@ use hbbft::{
|
||||||
sync_key_gen::Ack,
|
sync_key_gen::Ack,
|
||||||
NetworkInfo,
|
NetworkInfo,
|
||||||
};
|
};
|
||||||
use rand::StdRng;
|
use rand::{rngs::StdRng, FromEntropy};
|
||||||
use std::sync::{
|
use std::sync::{
|
||||||
atomic::{AtomicUsize, Ordering},
|
atomic::{AtomicUsize, Ordering},
|
||||||
Arc,
|
Arc,
|
||||||
|
@ -209,7 +209,7 @@ impl<C: Contribution, N: NodeId> StateMachine<C, N> {
|
||||||
ref mut iom_queue, ..
|
ref mut iom_queue, ..
|
||||||
} => {
|
} => {
|
||||||
let (dhb, dhb_step) =
|
let (dhb, dhb_step) =
|
||||||
DynamicHoneyBadger::new_joining(local_nid, local_sk, jp, StdRng::new()?)?;
|
DynamicHoneyBadger::new_joining(local_nid, local_sk, jp, &mut StdRng::from_entropy())?;
|
||||||
step_queue.push(dhb_step);
|
step_queue.push(dhb_step);
|
||||||
|
|
||||||
iom_queue_ret = iom_queue.take().unwrap();
|
iom_queue_ret = iom_queue.take().unwrap();
|
||||||
|
@ -461,12 +461,13 @@ impl<C: Contribution, N: NodeId> StateMachine<C, N> {
|
||||||
match self.state {
|
match self.state {
|
||||||
State::Observer { ref mut dhb, .. } | State::Validator { ref mut dhb, .. } => {
|
State::Observer { ref mut dhb, .. } | State::Validator { ref mut dhb, .. } => {
|
||||||
trace!("State::handle_iom: Handling: {:?}", iom);
|
trace!("State::handle_iom: Handling: {:?}", iom);
|
||||||
|
let mut rng = StdRng::from_entropy();
|
||||||
let step_opt = Some({
|
let step_opt = Some({
|
||||||
let dhb = dhb.as_mut().unwrap();
|
let dhb = dhb.as_mut().unwrap();
|
||||||
match iom {
|
match iom {
|
||||||
InputOrMessage::Contribution(contrib) => dhb.propose(contrib),
|
InputOrMessage::Contribution(contrib) => dhb.propose(contrib, &mut rng),
|
||||||
InputOrMessage::Change(change) => dhb.vote_for(change),
|
InputOrMessage::Change(change) => dhb.vote_for(change),
|
||||||
InputOrMessage::Message(src_nid, msg) => dhb.handle_message(&src_nid, msg),
|
InputOrMessage::Message(src_nid, msg) => dhb.handle_message(&src_nid, msg, &mut rng),
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
21
src/lib.rs
21
src/lib.rs
|
@ -24,7 +24,6 @@ extern crate log;
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate failure;
|
extern crate failure;
|
||||||
extern crate crossbeam;
|
extern crate crossbeam;
|
||||||
// #[macro_use] extern crate crossbeam_channel;
|
|
||||||
extern crate chrono;
|
extern crate chrono;
|
||||||
extern crate crypto;
|
extern crate crypto;
|
||||||
extern crate num_bigint;
|
extern crate num_bigint;
|
||||||
|
@ -68,9 +67,9 @@ use hbbft::{
|
||||||
Change as DhbChange, DynamicHoneyBadger, JoinPlan, Message as DhbMessage,
|
Change as DhbChange, DynamicHoneyBadger, JoinPlan, Message as DhbMessage,
|
||||||
},
|
},
|
||||||
sync_key_gen::{Ack, Part},
|
sync_key_gen::{Ack, Part},
|
||||||
Contribution as HbbftContribution, DaStep as MessagingStep, NodeIdT,
|
Contribution as HbbftContribution, CpStep as MessagingStep, NodeIdT,
|
||||||
};
|
};
|
||||||
use rand::{Rand, Rng};
|
use rand::{distributions::{Standard, Distribution}, Rng};
|
||||||
use serde::{de::DeserializeOwned, Serialize};
|
use serde::{de::DeserializeOwned, Serialize};
|
||||||
use std::{
|
use std::{
|
||||||
collections::BTreeMap,
|
collections::BTreeMap,
|
||||||
|
@ -137,9 +136,9 @@ impl<C> Contribution for C where
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait NodeId: NodeIdT + Serialize + DeserializeOwned + Rand + 'static {}
|
pub trait NodeId: NodeIdT + Serialize + DeserializeOwned + 'static {}
|
||||||
|
|
||||||
impl<N> NodeId for N where N: NodeIdT + Serialize + DeserializeOwned + Rand + 'static {}
|
impl<N> NodeId for N where N: NodeIdT + Serialize + DeserializeOwned + 'static {}
|
||||||
|
|
||||||
/// A unique identifier.
|
/// A unique identifier.
|
||||||
#[derive(Clone, Copy, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize, Deserialize)]
|
#[derive(Clone, Copy, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize, Deserialize)]
|
||||||
|
@ -152,8 +151,8 @@ impl Uid {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Rand for Uid {
|
impl Distribution<Uid> for Standard {
|
||||||
fn rand<R: Rng>(_rng: &mut R) -> Uid {
|
fn sample<R: Rng + ?Sized>(&self, _rng: &mut R) -> Uid {
|
||||||
Uid::new()
|
Uid::new()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -220,7 +219,7 @@ type ActiveNetworkInfo<N> = (Vec<NetworkNodeInfo<N>>, PublicKeySet, BTreeMap<N,
|
||||||
|
|
||||||
/// The current state of the network.
|
/// The current state of the network.
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
pub enum NetworkState<N: Ord + Rand> {
|
pub enum NetworkState<N: Ord> {
|
||||||
None,
|
None,
|
||||||
Unknown(Vec<NetworkNodeInfo<N>>),
|
Unknown(Vec<NetworkNodeInfo<N>>),
|
||||||
AwaitingMorePeersForKeyGeneration(Vec<NetworkNodeInfo<N>>),
|
AwaitingMorePeersForKeyGeneration(Vec<NetworkNodeInfo<N>>),
|
||||||
|
@ -233,7 +232,7 @@ pub enum NetworkState<N: Ord + Rand> {
|
||||||
/// [`Message`](enum.WireMessageKind.html#variant.Message) variants are among
|
/// [`Message`](enum.WireMessageKind.html#variant.Message) variants are among
|
||||||
/// those verified.
|
/// those verified.
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
pub enum WireMessageKind<C, N: Ord + Rand> {
|
pub enum WireMessageKind<C, N: Ord> {
|
||||||
HelloFromValidator(N, InAddr, PublicKey, NetworkState<N>),
|
HelloFromValidator(N, InAddr, PublicKey, NetworkState<N>),
|
||||||
HelloRequestChangeAdd(N, InAddr, PublicKey),
|
HelloRequestChangeAdd(N, InAddr, PublicKey),
|
||||||
WelcomeReceivedChangeAdd(N, PublicKey, NetworkState<N>),
|
WelcomeReceivedChangeAdd(N, PublicKey, NetworkState<N>),
|
||||||
|
@ -257,7 +256,7 @@ pub enum WireMessageKind<C, N: Ord + Rand> {
|
||||||
|
|
||||||
/// Messages sent over the network between nodes.
|
/// Messages sent over the network between nodes.
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
pub struct WireMessage<C, N: Ord + Rand> {
|
pub struct WireMessage<C, N: Ord> {
|
||||||
kind: WireMessageKind<C, N>,
|
kind: WireMessageKind<C, N>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -304,12 +303,10 @@ impl<C: Contribution, N: NodeId> WireMessage<C, N> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn key_gen_part(instance_id: key_gen::InstanceId, part: Part) -> WireMessage<C, N> {
|
pub fn key_gen_part(instance_id: key_gen::InstanceId, part: Part) -> WireMessage<C, N> {
|
||||||
// WireMessageKind::KeyGenPart(part).into()
|
|
||||||
WireMessage::key_gen(instance_id, key_gen::Message::part(part))
|
WireMessage::key_gen(instance_id, key_gen::Message::part(part))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn key_gen_ack(instance_id: key_gen::InstanceId, ack: Ack) -> WireMessage<C, N> {
|
pub fn key_gen_ack(instance_id: key_gen::InstanceId, ack: Ack) -> WireMessage<C, N> {
|
||||||
// WireMessageKind::KeyGenAck(outcome).into()
|
|
||||||
WireMessage::key_gen(instance_id, key_gen::Message::ack(ack))
|
WireMessage::key_gen(instance_id, key_gen::Message::ack(ack))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue