diff --git a/examples/producer.rs b/examples/producer.rs deleted file mode 100644 index 108bc25..0000000 --- a/examples/producer.rs +++ /dev/null @@ -1,222 +0,0 @@ -use zcash_mmr::{NodeData, Tree, EntryLink, Entry}; -use std::io::Write; - -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(); - - loop { - - if peak_pos > vec.len() { - // left child, -2^h - peak_pos = peak_pos - (1<, + tree: Tree, + cursor: usize, + leaf_cursor: usize, +} + +impl Iterator for NodeDataIterator { + type Item = NodeData; + + fn next(&mut self) -> Option { + let result = if self.cursor == 1 { + self.leaf_cursor = 2; + Some(leaf(1)) + } else if self.cursor == 2 { + self.leaf_cursor = 3; + Some(leaf(2)) + } else if self.cursor == 3 { + Some(self.tree.root_node().expect("always exists").data().clone()) + } else if self.return_stack.len() > 0 { + self.return_stack.pop() + } else { + for n_append in + self.tree.append_leaf(leaf(self.leaf_cursor as u32)) + .expect("full tree cannot fail").into_iter().rev() + { + self.return_stack.push(self.tree.resolve_link(n_append).expect("just pushed").data().clone()) + } + self.leaf_cursor += 1; + self.return_stack.pop() + }; + + self.cursor += 1; + result + } +} + +impl NodeDataIterator { + pub fn new() -> Self { + let mut root: Entry = NodeData::combine(&leaf(1), &leaf(2)).into(); + root.update_siblings(EntryLink::Stored(0), EntryLink::Stored(1)); + let tree = + Tree::new( + 3, + vec![(2, root)], + vec![(0, leaf(1).into()), (1, leaf(2).into())] + ); + + NodeDataIterator { + return_stack: Vec::new(), + tree, + cursor: 1, + leaf_cursor: 1, + } + } +} + +fn leaf(height: u32) -> NodeData { + NodeData { + consensus_branch_id: 0, + subtree_commitment: [0u8; 32], + start_time: height*10+1, + end_time: (height+1)*10, + start_target: 100 + height*10, + end_target: 100 + (height+1)*10, + start_sapling_root: [0u8; 32], + end_sapling_root: [0u8; 32], + subtree_total_work: 0.into(), + start_height: height as u64, + end_height: height as u64, + shielded_tx: 5 + height as u64, + } +} diff --git a/examples/write.rs b/examples/write.rs new file mode 100644 index 0000000..f51e2a7 --- /dev/null +++ b/examples/write.rs @@ -0,0 +1,41 @@ +#[path= "producer/share.rs"] +mod share; + +// Test data generator +// $ cargo run --example writer -- 16 nodes.dat +// or +// $ cargo run --example writer -- 16 +// to preview + +fn main() { + let mut args = std::env::args().skip(1); + + let (number, out_file) = match args.next() { + None => { eprintln!("writer []"); std::process::exit(1); }, + Some(number) => { + (number.parse::().expect("invalid number"), args.next()) + } + }; + + let iterator = share::NodeDataIterator::new().take(number); + + if let Some(out_file_path) = out_file { + use std::io::Write; + + let mut buf = Vec::new(); + + for node in iterator{ + node.write(&mut buf).expect("Failed to write data"); + } + + let mut file = std::fs::File::create(&out_file_path) + .expect("Failed to create output file"); + + file.write_all(&buf[..]) + .expect("Failed to write data to file"); + } else { + for n in iterator { + println!("{:?}", n); + } + } +} \ No newline at end of file