tracing and vote test
This commit is contained in:
parent
8f72017bcc
commit
a7afbf4d25
@ -140,8 +140,6 @@ impl Tendermint {
|
||||
Err(err) => warn!(target: "poa", "timeout: Could not send a sealing message {}.", err),
|
||||
}
|
||||
}
|
||||
} else {
|
||||
warn!(target: "poa", "broadcast_message: Message could not be generated.");
|
||||
}
|
||||
}
|
||||
|
||||
@ -155,6 +153,7 @@ impl Tendermint {
|
||||
block_hash
|
||||
)
|
||||
} else {
|
||||
warn!(target: "poa", "generate_message: No AccountProvider available.");
|
||||
None
|
||||
}
|
||||
}
|
||||
@ -163,10 +162,12 @@ impl Tendermint {
|
||||
*self.step.write() = step;
|
||||
match step {
|
||||
Step::Propose => {
|
||||
trace!(target: "poa", "to_step: Transitioning to Propose.");
|
||||
*self.proposal.write() = None;
|
||||
self.update_sealing()
|
||||
},
|
||||
Step::Prevote => {
|
||||
trace!(target: "poa", "to_step: Transitioning to Prevote.");
|
||||
let block_hash = match *self.lock_change.read() {
|
||||
Some(ref m) if self.should_unlock(m.round) => self.proposal.read().clone(),
|
||||
Some(ref m) => m.block_hash,
|
||||
@ -175,6 +176,7 @@ impl Tendermint {
|
||||
self.broadcast_message(block_hash)
|
||||
},
|
||||
Step::Precommit => {
|
||||
trace!(target: "poa", "to_step: Transitioning to Precommit.");
|
||||
let block_hash = match *self.lock_change.read() {
|
||||
Some(ref m) if self.is_round(m) => {
|
||||
self.last_lock.store(m.round, AtomicOrdering::SeqCst);
|
||||
@ -185,6 +187,7 @@ impl Tendermint {
|
||||
self.broadcast_message(block_hash);
|
||||
},
|
||||
Step::Commit => {
|
||||
trace!(target: "poa", "to_step: Transitioning to Commit.");
|
||||
// Commit the block using a complete signature set.
|
||||
let round = self.round.load(AtomicOrdering::SeqCst);
|
||||
if let Some(seal) = self.votes.seal_signatures(self.height.load(AtomicOrdering::SeqCst), round, *self.proposal.read()) {
|
||||
@ -348,6 +351,7 @@ impl Engine for Tendermint {
|
||||
|
||||
// Check if the message is known.
|
||||
if self.votes.vote(message.clone(), sender).is_none() {
|
||||
trace!(target: "poa", "handle_message: Processing new authorized message: {:?}", &message);
|
||||
let is_newer_than_lock = match *self.lock_change.read() {
|
||||
Some(ref lock) => &message > lock,
|
||||
None => true,
|
||||
@ -355,6 +359,7 @@ impl Engine for Tendermint {
|
||||
if is_newer_than_lock
|
||||
&& message.step == Step::Prevote
|
||||
&& self.has_enough_aligned_votes(&message) {
|
||||
trace!(target: "poa", "handle_message: Lock change.");
|
||||
*self.lock_change.write() = Some(message.clone());
|
||||
}
|
||||
// Check if it can affect the step transition.
|
||||
@ -409,6 +414,7 @@ impl Engine for Tendermint {
|
||||
self.votes.vote(proposal, proposer);
|
||||
let block_info_hash = try!(message_info_rlp_from_header(header)).sha3();
|
||||
|
||||
// TODO: use addresses recovered during precommit vote
|
||||
let mut signature_count = 0;
|
||||
for rlp in UntrustedRlp::new(&header.seal()[2]).iter() {
|
||||
let signature: H520 = try!(rlp.as_val());
|
||||
@ -508,8 +514,8 @@ mod tests {
|
||||
(b, seal)
|
||||
}
|
||||
|
||||
fn vote_default<F>(engine: &Arc<Engine>, signer: F, height: usize, round: usize, step: Step) where F: FnOnce(H256) -> Option<H520> {
|
||||
let m = message_full_rlp(signer, height, round, step, Some(Default::default())).unwrap();
|
||||
fn vote<F>(engine: &Arc<Engine>, signer: F, height: usize, round: usize, step: Step, block_hash: Option<H256>) where F: FnOnce(H256) -> Option<H520> {
|
||||
let m = message_full_rlp(signer, height, round, step, block_hash).unwrap();
|
||||
engine.handle_message(UntrustedRlp::new(&m)).unwrap();
|
||||
}
|
||||
|
||||
@ -531,15 +537,13 @@ mod tests {
|
||||
addr
|
||||
}
|
||||
|
||||
struct TestIo;
|
||||
struct TestIo(ClientIoMessage);
|
||||
|
||||
impl IoHandler<ClientIoMessage> for TestIo {
|
||||
fn message(&self, _io: &IoContext<ClientIoMessage>, net_message: &ClientIoMessage) {
|
||||
match *net_message {
|
||||
ClientIoMessage::UpdateSealing => {},
|
||||
ClientIoMessage::SubmitSeal(ref block_hash, ref seal) => {},
|
||||
ClientIoMessage::BroadcastMessage(ref message) => {},
|
||||
_ => {} // ignore other messages
|
||||
let TestIo(ref expected) = *self;
|
||||
if net_message == expected {
|
||||
panic!()
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -655,31 +659,35 @@ mod tests {
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[should_panic]
|
||||
fn prevote_step() {
|
||||
::env_logger::init().unwrap();
|
||||
let (spec, tap) = setup();
|
||||
let engine = spec.engine.clone();
|
||||
let mut db_result = get_temp_state_db();
|
||||
let mut db = db_result.take();
|
||||
spec.ensure_db_good(&mut db).unwrap();
|
||||
|
||||
let io_service = IoService::<ClientIoMessage>::start().unwrap();
|
||||
io_service.register_handler(Arc::new(TestIo));
|
||||
engine.register_message_channel(io_service.channel());
|
||||
|
||||
let v0 = insert_and_unlock(&tap, "0");
|
||||
let v1 = insert_and_unlock(&tap, "1");
|
||||
|
||||
// Propose
|
||||
propose_default(&spec, v0.clone());
|
||||
let (b, seal) = propose_default(&spec, v0.clone());
|
||||
let proposal = Some(b.header().bare_hash());
|
||||
|
||||
let h = 0;
|
||||
// Register IoHandler that panics on correct message.
|
||||
let io_service = IoService::<ClientIoMessage>::start().unwrap();
|
||||
io_service.register_handler(Arc::new(TestIo(ClientIoMessage::SubmitSeal(Default::default(), seal)))).unwrap();
|
||||
engine.register_message_channel(io_service.channel());
|
||||
|
||||
let h = 1;
|
||||
let r = 0;
|
||||
|
||||
// Prevote.
|
||||
vote_default(&engine, |mh| tap.sign(v1, None, mh).ok().map(H520::from), h, r, Step::Prevote);
|
||||
vote(&engine, |mh| tap.sign(v1, None, mh).ok().map(H520::from), h, r, Step::Prevote, proposal);
|
||||
|
||||
vote_default(&engine, |mh| tap.sign(v0, None, mh).ok().map(H520::from), h, r, Step::Prevote);
|
||||
vote_default(&engine, |mh| tap.sign(v1, None, mh).ok().map(H520::from), h, r, Step::Prevote);
|
||||
vote(&engine, |mh| tap.sign(v0, None, mh).ok().map(H520::from), h, r, Step::Prevote, proposal);
|
||||
vote(&engine, |mh| tap.sign(v1, None, mh).ok().map(H520::from), h, r, Step::Prevote, proposal);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
Loading…
Reference in New Issue
Block a user