}
}
}
pub fn hash_node(left: &Hash, right: &Hash, is_root: bool) -> Hash {
let mut state = node_state(left, right, is_root);
params::permute(&mut state);
state_digest(&state)
}
#[inline]
fn node_state(left: &Hash, right: &Hash, is_root: bool) -> [Goldilocks; WIDTH] {
let left_elems = bytes_to_cv(left.as_bytes());
let right_elems = bytes_to_cv(right.as_bytes());
let mut state = [Goldilocks::new(0); WIDTH];
let mut flags = FLAG_PARENT;
if is_root {
flags |= FLAG_ROOT;
}
state[CAPACITY_FLAGS_IDX] = Goldilocks::new(flags);
for i in 0..OUTPUT_ELEMENTS {
state[i] += left_elems[i];
}
for i in 0..OUTPUT_ELEMENTS {
state[OUTPUT_ELEMENTS + i] += right_elems[i];
}
state
}
#[inline]
fn state_digest(state: &[Goldilocks; WIDTH]) -> Hash {
let output: [Goldilocks; OUTPUT_ELEMENTS] = state[..OUTPUT_ELEMENTS].try_into().unwrap();
Hash::from_bytes(hash_to_bytes(&output))
}