summaryrefslogtreecommitdiffstats
path: root/src/proof.rs
diff options
context:
space:
mode:
authorSanto Cariotti <santo@dcariotti.me>2025-06-16 14:34:48 +0000
committerSanto Cariotti <santo@dcariotti.me>2025-06-16 14:34:48 +0000
commitc97f558c45b4f40b352cb6a0edf3aa9f4b0474f2 (patch)
tree2dbb1a0c533a01925925694c4cfb4c9fa5cca066 /src/proof.rs
parent481e019242fa6d487b56c7d6832bd6bea8fc7321 (diff)
Move proof tests and fix lifetime
Diffstat (limited to 'src/proof.rs')
-rw-r--r--src/proof.rs51
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));
+ }
+ }
+}