use sha2::{Sha256, Digest};
use rs_merkle::{MerkleTree, algorithms};
pub type Keypair = ed25519_dalek::Keypair;
pub type SecretKey = ed25519_dalek::SecretKey;
pub type PublicKey = ed25519_dalek::PublicKey;
pub type Signature = ed25519_dalek::Signature;
pub type SignatureBytes = [u8; 64];
pub use ed25519_dalek::Signer;
pub use ed25519_dalek::Verifier;
pub type PublicAddress = [u8; 32];
pub fn contract_address(signer: &PublicAddress, nonce: u64) -> PublicAddress {
let mut hasher = Sha256::new();
let mut pre_image = Vec::new();
pre_image.extend(signer);
pre_image.extend(nonce.to_le_bytes().to_vec());
hasher.update(pre_image);
hasher.finalize().into()
}
pub type Sha256Hash = [u8; 32];
pub fn sha256<T: AsRef<[u8]>>(data: T) -> Sha256Hash {
let mut ret = Sha256::new();
ret.update(data);
ret.finalize().into()
}
pub fn merkle_root<O: AsRef<[I]>, I: AsRef<[u8]>>(data: O) -> Sha256Hash {
if data.as_ref().is_empty() {
return [0; 32]
}
let prehashed_leaves: Vec<[u8; 32]> = data
.as_ref()
.iter()
.map(sha256)
.collect();
let merkle_tree = MerkleTree::<algorithms::Sha256>::from_leaves(&prehashed_leaves);
merkle_tree.root().unwrap()
}
pub type BloomFilter = [u8; 256];