essential_hash/
address_impl.rsuse crate::Address;
use essential_types::{
contract::Contract,
predicate::Predicate,
solution::{Solution, SolutionData},
Block, ContentAddress,
};
use sha2::Digest;
impl Address for Block {
fn content_address(&self) -> ContentAddress {
crate::block_addr::from_block(self)
}
}
impl Address for Predicate {
fn content_address(&self) -> ContentAddress {
let Ok(header) = self.encoded_header() else {
return ContentAddress([0; 32]);
};
let mut hasher = <sha2::Sha256 as Digest>::new();
hasher.update(header.fixed_size_header.0);
hasher.update(header.lens);
for item in self.programs() {
hasher.update(item);
}
ContentAddress(hasher.finalize().into())
}
}
impl Address for Contract {
fn content_address(&self) -> ContentAddress {
crate::contract_addr::from_contract(self)
}
}
impl Address for SolutionData {
fn content_address(&self) -> ContentAddress {
ContentAddress(crate::hash(self))
}
}
impl Address for Solution {
fn content_address(&self) -> ContentAddress {
crate::solution_addr::from_solution(self)
}
}