spl_concurrent_merkle_tree/
node.rs1use solana_program::keccak::hashv;
2
3pub type Node = [u8; 32];
5
6pub const EMPTY: Node = [0_u8; 32];
8
9pub fn empty_node(level: u32) -> Node {
11 empty_node_cached::<0>(level, &[])
12}
13
14pub fn empty_node_cached<const N: usize>(level: u32, cache: &[Node; N]) -> Node {
16 let mut data = EMPTY;
17 if level != 0 {
18 let target = (level - 1) as usize;
19 let lower_empty = if target < cache.len() && cache[target] != EMPTY {
20 cache[target]
21 } else {
22 empty_node(target as u32)
23 };
24 let hash = hashv(&[lower_empty.as_ref(), lower_empty.as_ref()]);
25 data.copy_from_slice(hash.as_ref());
26 }
27 data
28}