use anchor_lang::solana_program::keccak::{hashv, Hash};
pub fn create_node(vals: &[&[u8]]) -> Hash {
hashv(vals)
}
/// Returns true if a `leaf` can be proved to be a part of a Merkle tree
/// defined by `root`. For this, a `proof` must be provided, containing
/// sibling hashes on the branch from the leaf to the root of the tree. Each
/// pair of leaves and each pair of pre-images are assumed to be sorted.
pub fn verify_merkle(proof: Vec<[u8; 32]>, root: [u8; 32], leaf: [u8; 32]) -> bool {
let mut computed_hash = leaf;
for proof_element in proof.into_iter() {
if computed_hash <= proof_element {
// Hash(current computed hash + current element of the proof)
computed_hash = hashv(&[&[0x01], &computed_hash, &proof_element]).0;
} else {
// Hash(current element of the proof + current computed hash)
computed_hash = hashv(&[&[0x01], &proof_element, &computed_hash]).0;
}
}
// Check if the computed hash (root) is equal to the provided root
computed_hash == root
}