use crate::{
node_label::{hash_label, NodeLabel},
storage::types::AkdValue,
EMPTY_LABEL, EMPTY_VALUE,
};
use std::collections::HashSet;
use winter_crypto::{Digest, Hasher};
pub(crate) fn build_prefixes_set(labels: &[NodeLabel]) -> HashSet<NodeLabel> {
let mut prefixes_set = HashSet::new();
for label in labels {
for len in 0..(label.get_len() + 1) {
prefixes_set.insert(label.get_prefix(len));
}
}
prefixes_set
}
pub(crate) fn build_lookup_prefixes_set(labels: &[NodeLabel]) -> HashSet<NodeLabel> {
let mut lookup_prefixes_set = HashSet::new();
for label in labels {
lookup_prefixes_set.insert(*label);
for len in 0..(label.get_len() + 1) {
lookup_prefixes_set.insert(label.get_prefix(len));
lookup_prefixes_set.insert(label.get_sibling_prefix(len));
}
}
lookup_prefixes_set
}
pub(crate) fn empty_node_hash<H: Hasher>() -> H::Digest {
H::merge(&[H::hash(&EMPTY_VALUE), hash_label::<H>(EMPTY_LABEL)])
}
pub(crate) fn empty_node_hash_no_label<H: Hasher>() -> H::Digest {
H::hash(&EMPTY_VALUE)
}
pub(crate) fn i2osp_array(input: &[u8]) -> Vec<u8> {
[&(input.len() as u64).to_be_bytes(), input].concat()
}
pub(crate) fn get_commitment_proof<H: Hasher>(
commitment_key: &[u8],
label: &NodeLabel,
value: &AkdValue,
) -> H::Digest {
H::hash(&[commitment_key, &label.label_val, &i2osp_array(value)].concat())
}
pub(crate) fn commit_value<H: Hasher>(
commitment_key: &[u8],
label: &NodeLabel,
value: &AkdValue,
) -> H::Digest {
let proof = get_commitment_proof::<H>(commitment_key, label, value);
H::hash(&[i2osp_array(value), i2osp_array(&proof.as_bytes())].concat())
}
pub(crate) fn bind_commitment<H: Hasher>(value: &AkdValue, proof: &[u8]) -> H::Digest {
H::hash(&[i2osp_array(value), i2osp_array(proof)].concat())
}