Decouple timestamp open-block-assignment/verification to Engine (#8305)

This commit is contained in:
Wei Tang
2018-04-05 16:11:21 +08:00
committed by André Silva
parent 811d165458
commit ff0ce70169
6 changed files with 33 additions and 15 deletions

View File

@@ -25,7 +25,7 @@ use std::collections::HashSet;
use std::time::{SystemTime, UNIX_EPOCH};
use bytes::Bytes;
use ethereum_types::{H256, U256};
use ethereum_types::H256;
use hash::keccak;
use heapsize::HeapSizeOf;
use rlp::UntrustedRlp;
@@ -127,7 +127,7 @@ pub struct FullFamilyParams<'a, C: BlockInfo + CallContract + 'a> {
/// Phase 3 verification. Check block information against parent and uncles.
pub fn verify_block_family<C: BlockInfo + CallContract>(header: &Header, parent: &Header, engine: &EthEngine, do_full: Option<FullFamilyParams<C>>) -> Result<(), Error> {
// TODO: verify timestamp
verify_parent(&header, &parent, engine.params().gas_limit_bound_divisor)?;
verify_parent(&header, &parent, engine)?;
engine.verify_block_family(&header, &parent)?;
let params = match do_full {
@@ -225,7 +225,7 @@ fn verify_uncles(header: &Header, bytes: &[u8], bc: &BlockProvider, engine: &Eth
}
let uncle_parent = uncle_parent.decode();
verify_parent(&uncle, &uncle_parent, engine.params().gas_limit_bound_divisor)?;
verify_parent(&uncle, &uncle_parent, engine)?;
engine.verify_block_family(&uncle, &uncle_parent)?;
verified.insert(uncle.hash());
}
@@ -303,11 +303,13 @@ pub fn verify_header_params(header: &Header, engine: &EthEngine, is_full: bool)
}
/// Check header parameters agains parent header.
fn verify_parent(header: &Header, parent: &Header, gas_limit_divisor: U256) -> Result<(), Error> {
fn verify_parent(header: &Header, parent: &Header, engine: &EthEngine) -> Result<(), Error> {
let gas_limit_divisor = engine.params().gas_limit_bound_divisor;
if !header.parent_hash().is_zero() && &parent.hash() != header.parent_hash() {
return Err(From::from(BlockError::InvalidParentHash(Mismatch { expected: parent.hash(), found: header.parent_hash().clone() })))
}
if header.timestamp() <= parent.timestamp() {
if !engine.is_timestamp_valid(header.timestamp(), parent.timestamp()) {
return Err(From::from(BlockError::InvalidTimestamp(OutOfBounds { max: None, min: Some(parent.timestamp() + 1), found: header.timestamp() })))
}
if header.number() != parent.number() + 1 {