|
|
|
|
@@ -254,8 +254,8 @@ impl Engine for AuthorityRound {
|
|
|
|
|
|
|
|
|
|
/// Check if the signature belongs to the correct proposer.
|
|
|
|
|
fn verify_block_unordered(&self, header: &Header, _block: Option<&[u8]>) -> Result<(), Error> {
|
|
|
|
|
let header_step = try!(header_step(header));
|
|
|
|
|
// Give one step slack if step is lagging, double vote is still not possible.
|
|
|
|
|
let header_step = try!(header_step(header));
|
|
|
|
|
// Give one step slack if step is lagging, double vote is still not possible.
|
|
|
|
|
if header_step <= self.step() + 1 {
|
|
|
|
|
let proposer_signature = try!(header_signature(header));
|
|
|
|
|
let ok_sig = try!(verify_address(self.step_proposer(header_step), &proposer_signature, &header.bare_hash()));
|
|
|
|
|
@@ -417,13 +417,13 @@ mod tests {
|
|
|
|
|
let engine = Spec::new_test_round().engine;
|
|
|
|
|
|
|
|
|
|
let signature = tap.sign(addr, Some("0".into()), header.bare_hash()).unwrap();
|
|
|
|
|
let mut step = UNIX_EPOCH.elapsed().unwrap().as_secs();
|
|
|
|
|
let time = UNIX_EPOCH.elapsed().unwrap().as_secs();
|
|
|
|
|
// Two authorities.
|
|
|
|
|
let mut step = time - time % 2;
|
|
|
|
|
header.set_seal(vec![encode(&step).to_vec(), encode(&(&*signature as &[u8])).to_vec()]);
|
|
|
|
|
let first_ok = engine.verify_block_seal(&header).is_ok();
|
|
|
|
|
assert!(engine.verify_block_seal(&header).is_err());
|
|
|
|
|
step = step + 1;
|
|
|
|
|
header.set_seal(vec![encode(&step).to_vec(), encode(&(&*signature as &[u8])).to_vec()]);
|
|
|
|
|
let second_ok = engine.verify_block_seal(&header).is_ok();
|
|
|
|
|
|
|
|
|
|
assert!(first_ok ^ second_ok);
|
|
|
|
|
assert!(engine.verify_block_seal(&header).is_ok());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|