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