|
|
@@ -156,6 +156,7 @@ pub fn validate_block(
|
|
|
block: &BlockInfo,
|
|
|
previous: &BlockInfo,
|
|
|
module: &mut PoWModule,
|
|
|
+ is_new: bool,
|
|
|
) -> Result<()> {
|
|
|
// Check block version (1)
|
|
|
if block.header.version != block_version(block.header.height) {
|
|
|
@@ -173,7 +174,12 @@ pub fn validate_block(
|
|
|
}
|
|
|
|
|
|
// Check timestamp validity (4)
|
|
|
- if !module.verify_timestamp_by_median(block.header.timestamp) {
|
|
|
+ let valid = if is_new {
|
|
|
+ module.verify_current_timestamp(block.header.timestamp)?
|
|
|
+ } else {
|
|
|
+ module.verify_timestamp_by_median(block.header.timestamp)
|
|
|
+ };
|
|
|
+ if !valid {
|
|
|
return Err(Error::BlockIsInvalid(block.hash().as_string()))
|
|
|
}
|
|
|
|
|
|
@@ -204,7 +210,7 @@ pub fn validate_blockchain(
|
|
|
for (index, block) in blocks[1..].iter().enumerate() {
|
|
|
let full_blocks = blockchain.get_blocks_by_hash(&[blocks[index].1, block.1])?;
|
|
|
let full_block = &full_blocks[1];
|
|
|
- validate_block(full_block, &full_blocks[0], &mut module)?;
|
|
|
+ validate_block(full_block, &full_blocks[0], &mut module, false)?;
|
|
|
// Update PoW module
|
|
|
module.append(&full_block.header, &module.next_difficulty()?)?;
|
|
|
}
|
|
|
@@ -222,6 +228,7 @@ pub async fn verify_block(
|
|
|
module: &mut PoWModule,
|
|
|
block: &BlockInfo,
|
|
|
previous: &BlockInfo,
|
|
|
+ is_new: bool,
|
|
|
verify_fees: bool,
|
|
|
) -> Result<()> {
|
|
|
let block_hash = block.hash();
|
|
|
@@ -233,7 +240,7 @@ pub async fn verify_block(
|
|
|
}
|
|
|
|
|
|
// Validate block, using its previous
|
|
|
- validate_block(block, previous, module)?;
|
|
|
+ validate_block(block, previous, module, is_new)?;
|
|
|
|
|
|
// Verify transactions vector contains at least one(producers) transaction
|
|
|
if block.txs.is_empty() {
|
|
|
@@ -1108,6 +1115,7 @@ async fn apply_transactions(
|
|
|
pub async fn verify_proposal(
|
|
|
consensus: &Consensus,
|
|
|
proposal: &Proposal,
|
|
|
+ is_new: bool,
|
|
|
verify_fees: bool,
|
|
|
) -> Result<(Fork, Option<usize>)> {
|
|
|
// Check if proposal hash matches actual one (1)
|
|
|
@@ -1133,6 +1141,7 @@ pub async fn verify_proposal(
|
|
|
&mut fork.module,
|
|
|
&proposal.block,
|
|
|
&previous,
|
|
|
+ is_new,
|
|
|
verify_fees,
|
|
|
)
|
|
|
.await
|
|
|
@@ -1178,6 +1187,7 @@ pub async fn verify_fork_proposal(
|
|
|
&mut fork.module,
|
|
|
&proposal.block,
|
|
|
&previous,
|
|
|
+ false,
|
|
|
verify_fees,
|
|
|
)
|
|
|
.await
|