From c8cbb08ae3e7d90074fc97afb07531c49c1e019b Mon Sep 17 00:00:00 2001 From: Alfredo Garcia Date: Wed, 8 Jul 2020 07:58:20 -0300 Subject: [PATCH] check equihash solution covers the block header (#607) --- zebra-consensus/src/verify/block.rs | 34 +++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/zebra-consensus/src/verify/block.rs b/zebra-consensus/src/verify/block.rs index a2791d2a..434ae1fe 100644 --- a/zebra-consensus/src/verify/block.rs +++ b/zebra-consensus/src/verify/block.rs @@ -94,6 +94,7 @@ where let now = Utc::now(); node_time_check(block.header.time, now)?; + block.header.is_equihash_solution_valid()?; // `Tower::Buffer` requires a 1:1 relationship between `poll()`s // and `call()`s, because it reserves a buffer slot in each @@ -471,4 +472,37 @@ mod tests { Ok(()) } + + #[tokio::test] + #[spandoc::spandoc] + async fn header_solution() -> Result<(), Report> { + install_tracing(); + + // Service variables + let state_service = Box::new(zebra_state::in_memory::init()); + let mut block_verifier = super::init(state_service); + let ready_verifier_service = block_verifier.ready_and().await.map_err(|e| eyre!(e))?; + + // Get a valid block + let mut block = + Block::zcash_deserialize(&zebra_test::vectors::BLOCK_MAINNET_415000_BYTES[..]) + .expect("block test vector should deserialize"); + + // This should be ok + ready_verifier_service + .call(Arc::new(block.clone())) + .await + .map_err(|e| eyre!(e))?; + + // Change nonce to something invalid + block.header.nonce = [0; 32]; + + // Error: invalid equihash solution for BlockHeader + ready_verifier_service + .call(Arc::new(block.clone())) + .await + .expect_err("expected the equihash solution to be invalid"); + + Ok(()) + } }