use zcash_mmr::{Entry, EntryLink, NodeData, Tree}; #[path= "lib/shared.rs"] mod share; fn draft(into: &mut Vec<(u32, Entry)>, vec: &Vec, peak_pos: usize, h: u32) { let node_data = vec[peak_pos-1].clone(); let peak: Entry = match h { 0 => node_data.into(), _ => Entry::new( node_data, EntryLink::Stored((peak_pos - (1 << h) - 1) as u32), EntryLink::Stored((peak_pos - 2) as u32), ), }; println!("Entry #{}: {}", into.len(), peak); into.push(((peak_pos-1) as u32, peak)); } fn prepare_tree(vec: &Vec) -> Tree { assert!(vec.len() > 0); // integer log2 of (vec.len()+1), -1 let mut h = (32 - ((vec.len()+1) as u32).leading_zeros() - 1)-1; let mut peak_pos = (1 << (h+1)) - 1; let mut nodes = Vec::new(); // used later let mut last_peak_pos = 0; let mut last_peak_h = 0; loop { if peak_pos > vec.len() { // left child, -2^h peak_pos = peak_pos - (1< 0 { let left_pos = peak_pos - (1< { eprintln!("writer []"); std::process::exit(1); }, Some(number) => { number.parse::().expect("invalid number") } }; let long_vec = share::NodeDataIterator::new().take(number) .collect::>(); let now = std::time::Instant::now(); let tree = prepare_tree(&long_vec); let elapsed = now.elapsed(); println!("Tree final root: {}-{}", tree.root_node().expect("root").data().start_height, tree.root_node().expect("root").data().end_height, ); println!("Prepare tree of {} length: {} ns / {} mcs / {} ms", number, elapsed.as_nanos(), elapsed.as_micros(), elapsed.as_millis() ); }