diff --git a/src/bin/genesis-block.rs b/src/bin/genesis-block.rs index d72c7c9045..5a7f19a1ca 100644 --- a/src/bin/genesis-block.rs +++ b/src/bin/genesis-block.rs @@ -5,23 +5,12 @@ extern crate serde_json; extern crate silk; use silk::genesis::Genesis; -use silk::log::{hash, verify_slice_u64}; -use silk::logger::Logger; -use std::sync::mpsc::sync_channel; +use silk::log::{create_entries, hash, verify_slice_u64}; use std::io::stdin; fn main() { let gen: Genesis = serde_json::from_reader(stdin()).unwrap(); - - let (_sender, event_receiver) = sync_channel(100); - let (entry_sender, receiver) = sync_channel(100); - let mut logger = Logger::new(event_receiver, entry_sender, hash(&gen.pkcs8)); - for tx in gen.create_events() { - logger.log_event(tx).unwrap(); - } - drop(logger.sender); - - let entries = receiver.iter().collect::>(); + let entries = create_entries(&hash(&gen.pkcs8), gen.create_events()); verify_slice_u64(&entries, &entries[0].id); println!("["); let len = entries.len(); diff --git a/src/log.rs b/src/log.rs index 68a437d6b1..8762d289d0 100644 --- a/src/log.rs +++ b/src/log.rs @@ -19,7 +19,6 @@ use serde::Serialize; use event::{get_signature, verify_event, Event}; use sha2::{Digest, Sha256}; use rayon::prelude::*; -use std::iter; pub type Sha256Hash = GenericArray; @@ -77,32 +76,41 @@ pub fn next_hash( } /// Creates the next Entry 'num_hashes' after 'start_hash'. -pub fn next_entry( +pub fn create_entry( start_hash: &Sha256Hash, - num_hashes: u64, + cur_hashes: u64, event: Event, ) -> Entry { + let sig = get_signature(&event); + let num_hashes = cur_hashes + if sig.is_some() { 1 } else { 0 }; + let id = next_hash(start_hash, 0, &event); Entry { num_hashes, - id: next_hash(start_hash, num_hashes, &event), + id, event, } } /// Creates the next Tick Entry 'num_hashes' after 'start_hash'. -pub fn next_entry_mut( +pub fn create_entry_mut( start_hash: &mut Sha256Hash, - num_hashes: u64, + cur_hashes: &mut u64, event: Event, ) -> Entry { - let entry = next_entry(start_hash, num_hashes, event); + let entry = create_entry(start_hash, *cur_hashes, event); *start_hash = entry.id; + *cur_hashes = 0; entry } /// Creates the next Tick Entry 'num_hashes' after 'start_hash'. pub fn next_tick(start_hash: &Sha256Hash, num_hashes: u64) -> Entry { - next_entry(start_hash, num_hashes, Event::Tick) + let event = Event::Tick; + Entry { + num_hashes, + id: next_hash(start_hash, num_hashes, &event), + event, + } } /// Verifies self.id is the result of hashing a 'start_hash' 'self.num_hashes' times. @@ -137,27 +145,25 @@ pub fn verify_slice_seq(events: &[Entry], start_hash: &Sha256Ha pub fn create_entries( start_hash: &Sha256Hash, - num_hashes: u64, events: Vec>, ) -> Vec> { let mut id = *start_hash; events .into_iter() - .map(|event| next_entry_mut(&mut id, num_hashes, event)) + .map(|event| create_entry_mut(&mut id, &mut 0, event)) .collect() } /// Create a vector of Ticks of length 'len' from 'start_hash' hash and 'num_hashes'. -pub fn create_ticks( - start_hash: &Sha256Hash, - num_hashes: u64, - len: usize, -) -> Vec> { +pub fn next_ticks(start_hash: &Sha256Hash, num_hashes: u64, len: usize) -> Vec> { let mut id = *start_hash; - iter::repeat(Event::Tick) - .take(len) - .map(|event| next_entry_mut(&mut id, num_hashes, event)) - .collect() + let mut ticks = vec![]; + for _ in 0..len { + let entry = next_tick(&id, num_hashes); + id = entry.id; + ticks.push(entry); + } + ticks } #[cfg(test)] @@ -187,9 +193,9 @@ mod tests { assert!(verify_slice(&vec![], &zero)); // base case assert!(verify_slice(&vec![Entry::new_tick(0, &zero)], &zero)); // singleton case 1 assert!(!verify_slice(&vec![Entry::new_tick(0, &zero)], &one)); // singleton case 2, bad - assert!(verify_slice(&create_ticks(&zero, 0, 2), &zero)); // inductive step + assert!(verify_slice(&next_ticks(&zero, 0, 2), &zero)); // inductive step - let mut bad_ticks = create_ticks(&zero, 0, 2); + let mut bad_ticks = next_ticks(&zero, 0, 2); bad_ticks[1].id = one; assert!(!verify_slice(&bad_ticks, &zero)); // inductive step, bad } @@ -214,7 +220,7 @@ mod tests { let event0 = Event::new_claim(get_pubkey(&keypair), zero, sign_claim_data(&zero, &keypair)); let event1 = Event::new_claim(get_pubkey(&keypair), one, sign_claim_data(&one, &keypair)); let events = vec![event0, event1]; - let mut entries = create_entries(&zero, 0, events); + let mut entries = create_entries(&zero, events); assert!(verify_slice(&entries, &zero)); // Next, swap two events and ensure verification fails. @@ -231,7 +237,7 @@ mod tests { let data = hash(b"hello, world"); let event0 = Event::new_claim(get_pubkey(&keypair), data, sign_claim_data(&data, &keypair)); let zero = Sha256Hash::default(); - let entries = create_entries(&zero, 0, vec![event0]); + let entries = create_entries(&zero, vec![event0]); assert!(verify_slice(&entries, &zero)); } @@ -244,7 +250,7 @@ mod tests { sign_claim_data(&hash(b"hello, world"), &keypair), ); let zero = Sha256Hash::default(); - let entries = create_entries(&zero, 0, vec![event0]); + let entries = create_entries(&zero, vec![event0]); assert!(!verify_slice(&entries, &zero)); } @@ -261,7 +267,7 @@ mod tests { sig: sign_transaction_data(&data, &keypair0, &pubkey1), }; let zero = Sha256Hash::default(); - let entries = create_entries(&zero, 0, vec![event0]); + let entries = create_entries(&zero, vec![event0]); assert!(verify_slice(&entries, &zero)); } @@ -278,7 +284,7 @@ mod tests { sig: sign_transaction_data(&data, &keypair0, &pubkey1), }; let zero = Sha256Hash::default(); - let entries = create_entries(&zero, 0, vec![event0]); + let entries = create_entries(&zero, vec![event0]); assert!(!verify_slice(&entries, &zero)); } @@ -296,7 +302,7 @@ mod tests { sig: sign_transaction_data(&data, &keypair0, &pubkey1), }; let zero = Sha256Hash::default(); - let entries = create_entries(&zero, 0, vec![event0]); + let entries = create_entries(&zero, vec![event0]); assert!(!verify_slice(&entries, &zero)); } } @@ -310,7 +316,7 @@ mod bench { #[bench] fn event_bench(bencher: &mut Bencher) { let start_hash = Default::default(); - let events = create_ticks(&start_hash, 10_000, 8); + let events = next_ticks(&start_hash, 10_000, 8); bencher.iter(|| { assert!(verify_slice(&events, &start_hash)); }); @@ -319,7 +325,7 @@ mod bench { #[bench] fn event_bench_seq(bencher: &mut Bencher) { let start_hash = Default::default(); - let events = create_ticks(&start_hash, 10_000, 8); + let events = next_ticks(&start_hash, 10_000, 8); bencher.iter(|| { assert!(verify_slice_seq(&events, &start_hash)); }); diff --git a/src/logger.rs b/src/logger.rs index ae54dd1821..c06300e23b 100644 --- a/src/logger.rs +++ b/src/logger.rs @@ -8,7 +8,7 @@ use std::collections::HashSet; use std::sync::mpsc::{Receiver, SyncSender, TryRecvError}; use std::time::{Duration, Instant}; -use log::{extend_and_hash, Entry, Sha256Hash}; +use log::{create_entry_mut, Entry, Sha256Hash}; use event::{get_signature, verify_event, Event, Signature}; use serde::Serialize; use std::fmt::Debug; @@ -59,19 +59,10 @@ impl Logger { } pub fn log_event(&mut self, event: Event) -> Result<(), (Entry, ExitReason)> { - if let Some(sig) = get_signature(&event) { - self.last_id = extend_and_hash(&self.last_id, &sig); - self.num_hashes += 1; - } - let entry = Entry { - id: self.last_id, - num_hashes: self.num_hashes, - event, - }; + let entry = create_entry_mut(&mut self.last_id, &mut self.num_hashes, event); if let Err(_) = self.sender.send(entry.clone()) { return Err((entry, ExitReason::SendDisconnected)); } - self.num_hashes = 0; Ok(()) }