verify work and skip timestamp verification on testnet

This commit is contained in:
debris 2016-12-02 12:01:30 +01:00
parent e5027ea844
commit b3c9c30edb
2 changed files with 30 additions and 3 deletions

View File

@ -252,11 +252,12 @@ impl ChainVerifier {
// check if block timestamp is not far in the future // check if block timestamp is not far in the future
if utils::age(header.time) < -BLOCK_MAX_FUTURE { if utils::age(header.time) < -BLOCK_MAX_FUTURE {
return Err(Error::Timestamp); return Err(Error::FuturisticTimestamp);
} }
if let Some(median_timestamp) = self.median_timestamp(block_header_provider, header) { if let Some(median_timestamp) = self.median_timestamp(block_header_provider, header) {
if median_timestamp >= header.time { // TODO: make timestamp validation on testnet work...
if self.network != Magic::Testnet && median_timestamp >= header.time {
trace!( trace!(
target: "verification", "median timestamp verification failed, median: {}, current: {}", target: "verification", "median timestamp verification failed, median: {}, current: {}",
median_timestamp, median_timestamp,
@ -375,6 +376,28 @@ impl ChainVerifier {
else { None } else { None }
} }
fn work_required_testnet(&self, header: &chain::BlockHeader, height: u32) -> u32 {
let mut bits = BTreeSet::new();
let mut block_ref = header.previous_header_hash.clone().into();
// TODO: optimize it, so it does not make 11 redundant queries each time
for _ in 0..11 {
let previous_header = match self.store.block_header(block_ref) {
Some(h) => h,
None => { break; }
};
bits.insert(previous_header.nbits);
block_ref = previous_header.previous_header_hash.into();
}
for (index, bit) in bits.into_iter().enumerate() {
if bit != self.network.max_nbits() || utils::is_retarget_height(height - index as u32) {
return bit;
}
}
self.network.max_nbits()
}
fn work_required(&self, block: &db::IndexedBlock, height: u32) -> Option<u32> { fn work_required(&self, block: &db::IndexedBlock, height: u32) -> Option<u32> {
if height == 0 { if height == 0 {
return None; return None;
@ -396,7 +419,9 @@ impl ChainVerifier {
return Some(utils::work_required_retarget(self.network.max_nbits(), retarget_timestamp, last_timestamp, last_nbits)); return Some(utils::work_required_retarget(self.network.max_nbits(), retarget_timestamp, last_timestamp, last_nbits));
} }
// TODO: if.testnet if let Magic::Testnet = self.network {
return Some(self.work_required_testnet(block.header(), height));
}
Some(previous_header.nbits) Some(previous_header.nbits)
} }

View File

@ -40,6 +40,8 @@ pub enum Error {
Empty, Empty,
/// Invalid proof-of-work (Block hash does not satisfy nBits) /// Invalid proof-of-work (Block hash does not satisfy nBits)
Pow, Pow,
/// Futuristic timestamp
FuturisticTimestamp,
/// Invalid timestamp /// Invalid timestamp
Timestamp, Timestamp,
/// First transaction is not a coinbase transaction /// First transaction is not a coinbase transaction