diff --git a/src/accountant.rs b/src/accountant.rs index b99396569..08864f7c8 100644 --- a/src/accountant.rs +++ b/src/accountant.rs @@ -3,7 +3,7 @@ //! transfer funds to other users. use log::{Entry, Sha256Hash}; -use event::{get_pubkey, sign_transaction_data, verify_event, Event, PublicKey, Signature}; +use event::{get_pubkey, sign_transaction_data, verify_event, Event, PublicKey, Signature, Transfer}; use genesis::Genesis; use historian::{reserve_signature, Historian}; use ring::signature::Ed25519KeyPair; @@ -79,7 +79,7 @@ impl Accountant { return Err(AccountingError::InvalidEvent); } - if let Event::Transaction { from, data, .. } = event { + if let Event::Transaction(Transfer { from, data, .. }) = event { if self.get_balance(&from).unwrap_or(0) < data { return Err(AccountingError::InsufficientFunds); } @@ -102,7 +102,7 @@ impl Accountant { return Err(AccountingError::InvalidEvent); } - if let Event::Transaction { from, to, data, .. } = *event { + if let Event::Transaction(Transfer { from, to, data, .. }) = *event { if !Self::is_deposit(allow_deposits, &from, &to) { if let Some(x) = self.balances.get_mut(&from) { *x -= data; @@ -129,13 +129,13 @@ impl Accountant { let from = get_pubkey(keypair); let last_id = self.last_id; let sig = sign_transaction_data(&n, keypair, &to, &last_id); - let event = Event::Transaction { + let event = Event::Transaction(Transfer { from, to, data: n, last_id, sig, - }; + }); self.process_event(event).map(|_| sig) } diff --git a/src/accountant_skel.rs b/src/accountant_skel.rs index 069b5cd85..004f627af 100644 --- a/src/accountant_skel.rs +++ b/src/accountant_skel.rs @@ -1,6 +1,6 @@ use std::io; use accountant::Accountant; -use event::{Event, PublicKey, Signature}; +use event::{Event, PublicKey, Signature, Transfer}; use log::{Entry, Sha256Hash}; use std::net::UdpSocket; use bincode::{deserialize, serialize}; @@ -50,13 +50,13 @@ impl AccountantSkel { last_id, sig, } => { - let event = Event::Transaction { + let event = Event::Transaction(Transfer { from, to, data: val, last_id, sig, - }; + }); if let Err(err) = self.acc.process_event(event) { eprintln!("Transfer error: {:?}", err); } diff --git a/src/bin/client-demo.rs b/src/bin/client-demo.rs index b54331a4c..5e66d0c87 100644 --- a/src/bin/client-demo.rs +++ b/src/bin/client-demo.rs @@ -2,7 +2,8 @@ extern crate serde_json; extern crate silk; use silk::accountant_stub::AccountantStub; -use silk::event::{generate_keypair, get_pubkey, sign_transaction_data, verify_event, Event}; +use silk::event::{generate_keypair, get_pubkey, sign_transaction_data, verify_event, Event, + Transfer}; use silk::genesis::Genesis; use std::time::Instant; use std::net::UdpSocket; @@ -47,13 +48,13 @@ fn main() { println!("Verify signatures..."); let now = Instant::now(); for &(k, s) in &sigs { - let e = Event::Transaction { + let e = Event::Transaction(Transfer { from: alice_pubkey, to: k, data: one, last_id, sig: s, - }; + }); assert!(verify_event(&e)); } let duration = now.elapsed(); diff --git a/src/event.rs b/src/event.rs index 1b1fd2f38..26d5d1bc7 100644 --- a/src/event.rs +++ b/src/event.rs @@ -25,6 +25,15 @@ use log::Sha256Hash; pub type PublicKey = GenericArray; pub type Signature = GenericArray; +#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)] +pub struct Transfer { + pub from: PublicKey, + pub to: PublicKey, + pub data: T, + pub last_id: Sha256Hash, + pub sig: Signature, +} + /// When 'event' is Tick, the event represents a simple clock tick, and exists for the /// sole purpose of improving the performance of event log verification. A tick can /// be generated in 'num_hashes' hashes and verified in 'num_hashes' hashes. By logging @@ -33,24 +42,19 @@ pub type Signature = GenericArray; #[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)] pub enum Event { Tick, - Transaction { - from: PublicKey, - to: PublicKey, - data: T, - last_id: Sha256Hash, - sig: Signature, - }, + Transaction(Transfer), } impl Event { pub fn new_claim(to: PublicKey, data: T, last_id: Sha256Hash, sig: Signature) -> Self { - Event::Transaction { + let transfer = Transfer { from: to, to, data, last_id, sig, - } + }; + Event::Transaction(transfer) } } @@ -103,18 +107,18 @@ pub fn verify_signature(peer_public_key_bytes: &[u8], msg_bytes: &[u8], sig_byte pub fn get_signature(event: &Event) -> Option { match *event { Event::Tick => None, - Event::Transaction { sig, .. } => Some(sig), + Event::Transaction(Transfer { sig, .. }) => Some(sig), } } pub fn verify_event(event: &Event) -> bool { - if let Event::Transaction { + if let Event::Transaction(Transfer { from, to, ref data, last_id, sig, - } = *event + }) = *event { let sign_data = serialize(&(&from, &to, &data, &last_id)).unwrap(); if !verify_signature(&from, &sign_data, &sig) { diff --git a/src/genesis.rs b/src/genesis.rs index a30f35883..2d8be7c2b 100644 --- a/src/genesis.rs +++ b/src/genesis.rs @@ -1,6 +1,6 @@ //! A library for generating the chain's genesis block. -use event::{generate_keypair, get_pubkey, sign_transaction_data, Event, PublicKey}; +use event::{generate_keypair, get_pubkey, sign_transaction_data, Event, PublicKey, Transfer}; use log::{create_entries, hash, Entry, Sha256Hash}; use ring::rand::SystemRandom; use ring::signature::Ed25519KeyPair; @@ -56,13 +56,13 @@ impl Genesis { let last_id = self.get_seed(); let from = self.get_pubkey(); let sig = sign_transaction_data(&data, &self.get_keypair(), to, &last_id); - Event::Transaction { + Event::Transaction(Transfer { from, to: *to, data, last_id, sig, - } + }) } pub fn create_events(&self) -> Vec> { @@ -93,7 +93,7 @@ mod tests { fn test_create_events() { let mut events = Genesis::new(100, vec![]).create_events().into_iter(); assert_eq!(events.next().unwrap(), Event::Tick); - if let Event::Transaction { from, to, .. } = events.next().unwrap() { + if let Event::Transaction(Transfer { from, to, .. }) = events.next().unwrap() { assert_eq!(from, to); } else { assert!(false); diff --git a/src/log.rs b/src/log.rs index 8d133b5b3..6dc20792c 100644 --- a/src/log.rs +++ b/src/log.rs @@ -169,7 +169,7 @@ pub fn next_ticks(start_hash: &Sha256Hash, num_hashes: u64, len: usize) -> Vec