Move verify into methods
A little overly-coupled to Serialize, but makes the code a lot tighter
This commit is contained in:
parent
4fcd9e3bd6
commit
b019416518
|
@ -4,8 +4,7 @@
|
||||||
|
|
||||||
use log::{Entry, Sha256Hash};
|
use log::{Entry, Sha256Hash};
|
||||||
use event::Event;
|
use event::Event;
|
||||||
use transaction::{get_pubkey, sign_transaction_data, verify_transaction, PublicKey, Signature,
|
use transaction::{get_pubkey, sign_transaction_data, PublicKey, Signature, Transaction};
|
||||||
Transaction};
|
|
||||||
use genesis::Genesis;
|
use genesis::Genesis;
|
||||||
use historian::{reserve_signature, Historian};
|
use historian::{reserve_signature, Historian};
|
||||||
use ring::signature::Ed25519KeyPair;
|
use ring::signature::Ed25519KeyPair;
|
||||||
|
@ -78,7 +77,7 @@ impl Accountant {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn process_transaction(self: &mut Self, tr: Transaction<i64>) -> Result<()> {
|
pub fn process_transaction(self: &mut Self, tr: Transaction<i64>) -> Result<()> {
|
||||||
if !verify_transaction(&tr) {
|
if !tr.verify() {
|
||||||
return Err(AccountingError::InvalidTransfer);
|
return Err(AccountingError::InvalidTransfer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,6 @@
|
||||||
use std::net::UdpSocket;
|
use std::net::UdpSocket;
|
||||||
use std::io;
|
use std::io;
|
||||||
use bincode::{deserialize, serialize};
|
use bincode::{deserialize, serialize};
|
||||||
use event::get_signature;
|
|
||||||
use transaction::{get_pubkey, sign_transaction_data, PublicKey, Signature, Transaction};
|
use transaction::{get_pubkey, sign_transaction_data, PublicKey, Signature, Transaction};
|
||||||
use log::{Entry, Sha256Hash};
|
use log::{Entry, Sha256Hash};
|
||||||
use ring::signature::Ed25519KeyPair;
|
use ring::signature::Ed25519KeyPair;
|
||||||
|
@ -109,7 +108,7 @@ impl AccountantStub {
|
||||||
if let Response::Entries { entries } = resp {
|
if let Response::Entries { entries } = resp {
|
||||||
for Entry { id, event, .. } in entries {
|
for Entry { id, event, .. } in entries {
|
||||||
self.last_id = Some(id);
|
self.last_id = Some(id);
|
||||||
if let Some(sig) = get_signature(&event) {
|
if let Some(sig) = event.get_signature() {
|
||||||
if sig == *wait_sig {
|
if sig == *wait_sig {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@ extern crate serde_json;
|
||||||
extern crate silk;
|
extern crate silk;
|
||||||
|
|
||||||
use silk::accountant_stub::AccountantStub;
|
use silk::accountant_stub::AccountantStub;
|
||||||
use silk::event::{verify_event, Event};
|
use silk::event::Event;
|
||||||
use silk::transaction::{generate_keypair, get_pubkey, sign_transaction_data, Transaction};
|
use silk::transaction::{generate_keypair, get_pubkey, sign_transaction_data, Transaction};
|
||||||
use silk::genesis::Genesis;
|
use silk::genesis::Genesis;
|
||||||
use std::time::Instant;
|
use std::time::Instant;
|
||||||
|
@ -55,7 +55,7 @@ fn main() {
|
||||||
last_id,
|
last_id,
|
||||||
sig: s,
|
sig: s,
|
||||||
});
|
});
|
||||||
assert!(verify_event(&e));
|
assert!(e.verify());
|
||||||
}
|
}
|
||||||
let duration = now.elapsed();
|
let duration = now.elapsed();
|
||||||
let ns = duration.as_secs() * 1_000_000_000 + duration.subsec_nanos() as u64;
|
let ns = duration.as_secs() * 1_000_000_000 + duration.subsec_nanos() as u64;
|
||||||
|
|
28
src/event.rs
28
src/event.rs
|
@ -1,6 +1,6 @@
|
||||||
//! The `event` crate provides the data structures for log events.
|
//! The `event` crate provides the data structures for log events.
|
||||||
|
|
||||||
use transaction::{verify_transaction, PublicKey, Signature, Transaction};
|
use transaction::{PublicKey, Signature, Transaction};
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
use log::Sha256Hash;
|
use log::Sha256Hash;
|
||||||
|
|
||||||
|
@ -15,22 +15,22 @@ pub enum Event<T> {
|
||||||
Transaction(Transaction<T>),
|
Transaction(Transaction<T>),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T> Event<T> {
|
impl<T: Serialize> Event<T> {
|
||||||
pub fn new_claim(to: PublicKey, data: T, last_id: Sha256Hash, sig: Signature) -> Self {
|
pub fn new_claim(to: PublicKey, data: T, last_id: Sha256Hash, sig: Signature) -> Self {
|
||||||
Event::Transaction(Transaction::new_claim(to, data, last_id, sig))
|
Event::Transaction(Transaction::new_claim(to, data, last_id, sig))
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
pub fn get_signature<T>(event: &Event<T>) -> Option<Signature> {
|
pub fn get_signature(&self) -> Option<Signature> {
|
||||||
match *event {
|
match *self {
|
||||||
Event::Tick => None,
|
Event::Tick => None,
|
||||||
Event::Transaction(ref tr) => Some(tr.sig),
|
Event::Transaction(ref tr) => Some(tr.sig),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn verify_event<T: Serialize>(event: &Event<T>) -> bool {
|
pub fn verify(&self) -> bool {
|
||||||
match *event {
|
match *self {
|
||||||
Event::Tick => true,
|
Event::Tick => true,
|
||||||
Event::Transaction(ref tr) => verify_transaction(tr),
|
Event::Transaction(ref tr) => tr.verify(),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
use generic_array::GenericArray;
|
use generic_array::GenericArray;
|
||||||
use generic_array::typenum::U32;
|
use generic_array::typenum::U32;
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
use event::{get_signature, verify_event, Event};
|
use event::Event;
|
||||||
use sha2::{Digest, Sha256};
|
use sha2::{Digest, Sha256};
|
||||||
use rayon::prelude::*;
|
use rayon::prelude::*;
|
||||||
|
|
||||||
|
@ -64,7 +64,7 @@ pub fn next_hash<T: Serialize>(
|
||||||
event: &Event<T>,
|
event: &Event<T>,
|
||||||
) -> Sha256Hash {
|
) -> Sha256Hash {
|
||||||
let mut id = *start_hash;
|
let mut id = *start_hash;
|
||||||
let sig = get_signature(event);
|
let sig = event.get_signature();
|
||||||
let start_index = if sig.is_some() { 1 } else { 0 };
|
let start_index = if sig.is_some() { 1 } else { 0 };
|
||||||
for _ in start_index..num_hashes {
|
for _ in start_index..num_hashes {
|
||||||
id = hash(&id);
|
id = hash(&id);
|
||||||
|
@ -81,7 +81,7 @@ pub fn create_entry<T: Serialize>(
|
||||||
cur_hashes: u64,
|
cur_hashes: u64,
|
||||||
event: Event<T>,
|
event: Event<T>,
|
||||||
) -> Entry<T> {
|
) -> Entry<T> {
|
||||||
let sig = get_signature(&event);
|
let sig = event.get_signature();
|
||||||
let num_hashes = cur_hashes + if sig.is_some() { 1 } else { 0 };
|
let num_hashes = cur_hashes + if sig.is_some() { 1 } else { 0 };
|
||||||
let id = next_hash(start_hash, 0, &event);
|
let id = next_hash(start_hash, 0, &event);
|
||||||
Entry {
|
Entry {
|
||||||
|
@ -116,7 +116,7 @@ pub fn next_tick<T: Serialize>(start_hash: &Sha256Hash, num_hashes: u64) -> Entr
|
||||||
/// Verifies self.id is the result of hashing a 'start_hash' 'self.num_hashes' times.
|
/// Verifies self.id is the result of hashing a 'start_hash' 'self.num_hashes' times.
|
||||||
/// If the event is not a Tick, then hash that as well.
|
/// If the event is not a Tick, then hash that as well.
|
||||||
pub fn verify_entry<T: Serialize>(entry: &Entry<T>, start_hash: &Sha256Hash) -> bool {
|
pub fn verify_entry<T: Serialize>(entry: &Entry<T>, start_hash: &Sha256Hash) -> bool {
|
||||||
if !verify_event(&entry.event) {
|
if !entry.event.verify() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
entry.id == next_hash(start_hash, entry.num_hashes, &entry.event)
|
entry.id == next_hash(start_hash, entry.num_hashes, &entry.event)
|
||||||
|
|
|
@ -93,6 +93,6 @@ mod tests {
|
||||||
zero,
|
zero,
|
||||||
sig,
|
sig,
|
||||||
);
|
);
|
||||||
assert!(!verify_event(&event0));
|
assert!(!event0.verify());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,7 +21,7 @@ pub struct Transaction<T> {
|
||||||
pub sig: Signature,
|
pub sig: Signature,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T> Transaction<T> {
|
impl<T: Serialize> Transaction<T> {
|
||||||
pub fn new_claim(to: PublicKey, data: T, last_id: Sha256Hash, sig: Signature) -> Self {
|
pub fn new_claim(to: PublicKey, data: T, last_id: Sha256Hash, sig: Signature) -> Self {
|
||||||
Transaction {
|
Transaction {
|
||||||
from: to,
|
from: to,
|
||||||
|
@ -31,6 +31,11 @@ impl<T> Transaction<T> {
|
||||||
sig,
|
sig,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn verify(&self) -> bool {
|
||||||
|
let sign_data = serialize(&(&self.from, &self.to, &self.data, &self.last_id)).unwrap();
|
||||||
|
verify_signature(&self.from, &sign_data, &self.sig)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return a new ED25519 keypair
|
/// Return a new ED25519 keypair
|
||||||
|
@ -79,11 +84,6 @@ pub fn verify_signature(peer_public_key_bytes: &[u8], msg_bytes: &[u8], sig_byte
|
||||||
signature::verify(&signature::ED25519, peer_public_key, msg, sig).is_ok()
|
signature::verify(&signature::ED25519, peer_public_key, msg, sig).is_ok()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn verify_transaction<T: Serialize>(tr: &Transaction<T>) -> bool {
|
|
||||||
let sign_data = serialize(&(&tr.from, &tr.to, &tr.data, &tr.last_id)).unwrap();
|
|
||||||
verify_signature(&tr.from, &sign_data, &tr.sig)
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
Loading…
Reference in New Issue