From 0f258c1bb9160a833bda8bd8578d9385446fda8d Mon Sep 17 00:00:00 2001 From: Xavek Date: Tue, 6 Aug 2024 21:32:35 +0545 Subject: [PATCH 1/3] impl proof of work validate func --- src/validation.cairo | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/validation.cairo b/src/validation.cairo index 68bf7eb8..363d48aa 100644 --- a/src/validation.cairo +++ b/src/validation.cairo @@ -30,8 +30,14 @@ fn validate_prev_block_hash(self: @ChainState, block: @Block) -> Result<(), Byte } fn validate_proof_of_work(self: @ChainState, block: @Block) -> Result<(), ByteArray> { - // TODO: implement - Result::Ok(()) + let target_u256: u256 = block.header.bits.clone().into(); + if block.header.prev_block_hash.clone() <= target_u256 { + Result::Ok(()) + } else { + Result::Err( + "Insufficient proof of work. Expected block hash {block.header.prev_block_hash} to be less than or equal to target {block.header.bits}." + ) + } } fn validate_target(self: @ChainState, block: @Block) -> Result<(), ByteArray> { From 75b4a44961093d46af9303983c570756f5d564bd Mon Sep 17 00:00:00 2001 From: Xavek Date: Wed, 7 Aug 2024 19:03:39 +0545 Subject: [PATCH 2/3] address review comments --- src/validation.cairo | 41 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/src/validation.cairo b/src/validation.cairo index 363d48aa..834ed93a 100644 --- a/src/validation.cairo +++ b/src/validation.cairo @@ -4,7 +4,7 @@ use super::state::{Block, ChainState}; impl BlockValidatorImpl of BlockValidator { fn validate_and_apply(self: ChainState, block: Block) -> Result { validate_prev_block_hash(@self, @block)?; - validate_proof_of_work(@self, @block)?; + validate_proof_of_work(@0_u256, @block)?; validate_target(@self, @block)?; validate_timestamp(@self, @block)?; @@ -29,9 +29,8 @@ fn validate_prev_block_hash(self: @ChainState, block: @Block) -> Result<(), Byte } } -fn validate_proof_of_work(self: @ChainState, block: @Block) -> Result<(), ByteArray> { - let target_u256: u256 = block.header.bits.clone().into(); - if block.header.prev_block_hash.clone() <= target_u256 { +fn validate_proof_of_work(target: @u256, block: @Block) -> Result<(), ByteArray> { + if block.header.prev_block_hash <= target { Result::Ok(()) } else { Result::Err( @@ -78,7 +77,7 @@ fn validate_merkle_root(self: @ChainState, block: @Block) -> Result<(), ByteArra #[cfg(test)] mod tests { - use super::{validate_target, validate_timestamp}; + use super::{validate_target, validate_timestamp, validate_proof_of_work}; use super::{Block, ChainState}; use super::super::state::{Header, Transaction, TxIn, TxOut}; @@ -144,4 +143,36 @@ mod tests { let result = validate_timestamp(@chain_state, @block); assert!(result.is_err(), "Median time is greater than block's timestamp"); } + + #[test] + fn test_validate_proof_of_work() { + let mut block = Block { + header: Header { + version: 1, prev_block_hash: 1, merkle_root_hash: 1, time: 12, bits: 1, nonce: 1, + }, + txs: ArrayTrait::new().span(), + }; + + // target is less than prev block hash + let result = validate_proof_of_work(@0_u256, @block); + assert!(result.is_err(), "Expect target less than prev block hash"); + + // target is greater than prev block hash + let result = validate_proof_of_work(@2_u256, @block); + assert!(result.is_ok(), "Expect target gt prev block hash"); + + // target is equal to prev block hash + let result = validate_proof_of_work(@1_u256, @block); + assert!(result.is_ok(), "Expect target equal to prev block hash"); + + // block prev block hash is greater than target + block.header.prev_block_hash = 2; + let result = validate_proof_of_work(@1_u256, @block); + assert!(result.is_err(), "Expect prev block hash gt target"); + + // block prev block hash is less than target + block.header.prev_block_hash = 9; + let result = validate_proof_of_work(@10_u256, @block); + assert!(result.is_ok(), "Expect prev block hash lt target"); + } } From 045e3994b885ba811d445a433522232179c54bd8 Mon Sep 17 00:00:00 2001 From: Xavek Date: Wed, 7 Aug 2024 20:40:06 +0545 Subject: [PATCH 3/3] address review minor comment --- src/validation.cairo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/validation.cairo b/src/validation.cairo index 834ed93a..c7605886 100644 --- a/src/validation.cairo +++ b/src/validation.cairo @@ -34,7 +34,7 @@ fn validate_proof_of_work(target: @u256, block: @Block) -> Result<(), ByteArray> Result::Ok(()) } else { Result::Err( - "Insufficient proof of work. Expected block hash {block.header.prev_block_hash} to be less than or equal to target {block.header.bits}." + "Insufficient proof of work. Expected block hash {block.header.prev_block_hash} to be less than or equal to {target}." ) } }