extern crate core_cbc_casper;
mod common;
use common::binary::*;
use std::collections::HashSet;
use core_cbc_casper::estimator::Estimator;
use core_cbc_casper::justification::{Justification, LatestMessages, LatestMessagesHonest};
use core_cbc_casper::message::Message;
use core_cbc_casper::validator;
#[test]
fn equal_weight() {
let validators: Vec<u32> = (0..4).collect();
let weights = [1.0, 1.0, 1.0, 1.0];
let validators_weights = validator::Weights::new(
validators
.iter()
.cloned()
.zip(weights.iter().cloned())
.collect(),
);
let validator_state = validator::State::new(
validators_weights.clone(),
0.0,
LatestMessages::empty(),
1.0,
HashSet::new(),
);
let m0 = Message::new(validators[0], Justification::empty(), BoolWrapper(false));
let m1 = Message::new(validators[1], Justification::empty(), BoolWrapper(true));
let m2 = Message::new(validators[2], Justification::empty(), BoolWrapper(false));
let mut validator_state_clone = validator_state.clone();
validator_state_clone.update(&[&m0, &m1]);
let m3 = Message::from_validator_state(validators[0], &validator_state_clone).unwrap();
assert_eq!(
BoolWrapper::estimate(
&LatestMessagesHonest::from_latest_messages(
&LatestMessages::from(&Justification::empty()),
validator_state.equivocators()
),
&validators_weights,
)
.unwrap(),
BoolWrapper(true)
);
let mut j0 = Justification::from_messages(vec![m0, m1], &mut validator_state.clone());
assert_eq!(
j0.make_estimate(validator_state.equivocators(), &validators_weights)
.unwrap(),
BoolWrapper(true)
);
j0.faulty_insert(&m2, &mut validator_state.clone());
assert_eq!(
j0.make_estimate(validator_state.equivocators(), &validators_weights)
.unwrap(),
BoolWrapper(false)
);
j0.faulty_insert(&m3, &mut validator_state.clone());
assert_eq!(
j0.make_estimate(validator_state.equivocators(), &validators_weights)
.unwrap(),
BoolWrapper(true)
);
}
#[test]
fn vote_swaying() {
let validators: Vec<u32> = (0..5).collect();
let weights = [1.0, 1.0, 1.0, 1.0, 1.0];
let validators_weights = validator::Weights::new(
validators
.iter()
.cloned()
.zip(weights.iter().cloned())
.collect(),
);
let validator_state = validator::State::new(
validators_weights.clone(),
0.0,
LatestMessages::empty(),
1.0,
HashSet::new(),
);
let m0 = Message::new(validators[0], Justification::empty(), BoolWrapper(false));
let m1 = Message::new(validators[1], Justification::empty(), BoolWrapper(true));
let m2 = Message::new(validators[2], Justification::empty(), BoolWrapper(true));
let m3 = Message::new(validators[3], Justification::empty(), BoolWrapper(false));
let m4 = Message::new(validators[4], Justification::empty(), BoolWrapper(false));
let mut j0 = Justification::from_messages(
vec![m0.clone(), m1.clone(), m2.clone(), m3, m4],
&mut validator_state.clone(),
);
assert_eq!(
j0.make_estimate(validator_state.equivocators(), &validators_weights)
.unwrap(),
BoolWrapper(false)
);
let mut validator_state_clone = validator_state.clone();
validator_state_clone.update(&[&m0, &m1, &m2]);
let m5 = Message::from_validator_state(validators[0], &validator_state_clone).unwrap();
j0.faulty_insert(&m5, &mut validator_state.clone());
assert_eq!(
j0.make_estimate(validator_state.equivocators(), &validators_weights)
.unwrap(),
BoolWrapper(true)
);
}