use enprot::merkle::{self, MerkleTree};
fn main() -> enprot::Result<()> {
let leaves: Vec<Vec<u8>> = (0..7).map(|i| format!("leaf-{}", i).into_bytes()).collect();
let tree = MerkleTree::from_leaves(&leaves)?;
let root = tree.root()?;
println!("Merkle tree with {} leaves", tree.leaf_count());
println!("Root: {}", root);
let proof = tree.proof(3)?;
println!("\nProof for leaf 3:");
println!(" leaf hash: {}", proof.leaf.to_hex());
println!(" steps: {}", proof.steps.len());
let ok = merkle::verify_proof(&root, &proof)?;
println!(" verification: {}", if ok { "VALID" } else { "INVALID" });
let mut tampered = proof.clone();
tampered.leaf = merkle::hash_leaf(b"wrong")?;
let ok_tampered = merkle::verify_proof(&root, &tampered)?;
println!(
"\nTampered proof: {}",
if ok_tampered { "VALID" } else { "INVALID" }
);
Ok(())
}