7f6ae4c2f5
* Pre-allocated tree hash caches * Add SmallVec to tree hash cache * Avoid allocation for validator.pubkey * Avoid iterator which seems to be doing heap alloc * Add more smallvecs * MOAR SMALLVEC * Move non-test code to Hash256 tree hash * Fix byte ordering error * Add incomplete but working merkle stream impl * Fix zero hash error * Add zero hash fn * Add MerkleStream comments * Add smallvec, tidy * Integrate into tree hash derive * Update ssz_types tree hash * Don't heap alloc for mix in length * Add byte-level streaming to MerkleStream * Avoid recursion in write method * Update BLS to MerkleStream * Fix some not-compiling tests * Remove debug profiling * Remove code duplication * Move beacon state tree hash to new hasher * Fix failing tests * Update comments * Add some fast-paths to tree_hash::merkle_root * Remove unncessary test * Rename MerkleStream -> MerkleHasher * Rename new_with_leaf_count -> with_leaves * Tidy * Remove NonZeroUsize * Remove todo * Update smallvec
45 lines
1.4 KiB
Rust
45 lines
1.4 KiB
Rust
use int_to_bytes::int_to_fixed_bytes32;
|
|
use merkle_proof::MerkleTree;
|
|
use rayon::prelude::*;
|
|
use tree_hash::TreeHash;
|
|
use types::{ChainSpec, Deposit, DepositData, Hash256};
|
|
|
|
/// Accepts the genesis block validator `DepositData` list and produces a list of `Deposit`, with
|
|
/// proofs.
|
|
pub fn genesis_deposits(
|
|
deposit_data: Vec<DepositData>,
|
|
spec: &ChainSpec,
|
|
) -> Result<Vec<Deposit>, String> {
|
|
let deposit_root_leaves = deposit_data
|
|
.par_iter()
|
|
.map(|data| data.tree_hash_root())
|
|
.collect::<Vec<_>>();
|
|
|
|
let mut proofs = vec![];
|
|
let depth = spec.deposit_contract_tree_depth as usize;
|
|
let mut tree = MerkleTree::create(&[], depth);
|
|
for (i, deposit_leaf) in deposit_root_leaves.iter().enumerate() {
|
|
if tree.push_leaf(*deposit_leaf, depth).is_err() {
|
|
return Err(String::from("Failed to push leaf"));
|
|
}
|
|
|
|
let (_, mut proof) = tree.generate_proof(i, depth);
|
|
proof.push(Hash256::from_slice(&int_to_fixed_bytes32((i + 1) as u64)));
|
|
|
|
assert_eq!(
|
|
proof.len(),
|
|
depth + 1,
|
|
"Deposit proof should be correct len"
|
|
);
|
|
|
|
proofs.push(proof);
|
|
}
|
|
|
|
Ok(deposit_data
|
|
.into_iter()
|
|
.zip(proofs.into_iter())
|
|
.map(|(data, proof)| (data, proof.into()))
|
|
.map(|(data, proof)| Deposit { proof, data })
|
|
.collect())
|
|
}
|