diff options
| author | Santo Cariotti <santo@dcariotti.me> | 2025-06-16 14:34:48 +0000 |
|---|---|---|
| committer | Santo Cariotti <santo@dcariotti.me> | 2025-06-16 14:34:48 +0000 |
| commit | c97f558c45b4f40b352cb6a0edf3aa9f4b0474f2 (patch) | |
| tree | 2dbb1a0c533a01925925694c4cfb4c9fa5cca066 /src/proof.rs | |
| parent | 481e019242fa6d487b56c7d6832bd6bea8fc7321 (diff) | |
Move proof tests and fix lifetime
Diffstat (limited to 'src/proof.rs')
| -rw-r--r-- | src/proof.rs | 51 |
1 files changed, 42 insertions, 9 deletions
diff --git a/src/proof.rs b/src/proof.rs index 8f338d7..d2d1c0f 100644 --- a/src/proof.rs +++ b/src/proof.rs @@ -58,21 +58,18 @@ pub trait Proofer { T: AsRef<[u8]>; } -pub struct DefaultProofer { - hasher: Box<dyn Hasher>, +pub struct DefaultProofer<'a> { + hasher: &'a dyn Hasher, leaves: Vec<Node>, } -impl DefaultProofer { - pub fn new<H: Hasher + 'static>(hasher: H, leaves: Vec<Node>) -> Self { - Self { - hasher: Box::new(hasher), - leaves, - } +impl<'a> DefaultProofer<'a> { + pub fn new(hasher: &'a dyn Hasher, leaves: Vec<Node>) -> Self { + Self { hasher, leaves } } } -impl Proofer for DefaultProofer { +impl Proofer for DefaultProofer<'_> { fn generate(&self, index: usize) -> Option<MerkleProof> { if index >= self.leaves.len() { return None; @@ -148,3 +145,39 @@ impl Proofer for DefaultProofer { current_hash == root_hash } } + +#[cfg(test)] +mod tests { + use crate::{hasher::*, merkletree::MerkleTree}; + + use super::*; + + #[test] + fn test_proof_generation_and_verification_dummy() { + let hasher = DummyHasher; + let data = vec!["a", "b", "c", "d"]; + let tree = MerkleTree::new(hasher.clone(), data.clone()); + let proofer = DefaultProofer::new(&hasher, tree.leaves()); + + for (index, item) in data.iter().enumerate() { + let proof = proofer.generate(index).unwrap(); + + assert!(proofer.verify(&proof, item, tree.root().hash(), &hasher)); + } + } + + #[test] + #[cfg(feature = "sha256")] + fn test_proof_generation_and_verification_sha256() { + let hasher = SHA256Hasher::new(); + let data = vec!["a", "b", "c", "d"]; + let tree = MerkleTree::new(hasher.clone(), data.clone()); + let proofer = DefaultProofer::new(&hasher, tree.leaves().clone()); + + for (index, item) in data.iter().enumerate() { + let proof = proofer.generate(index).unwrap(); + + assert!(proofer.verify(&proof, item, tree.root().hash(), &hasher)); + } + } +} |
