22//! event log to record transactions. Its users can deposit funds and
33//! transfer funds to other users.
44
5- use log:: { verify_entry , Event , PublicKey , Sha256Hash } ;
5+ use log:: { Event , PublicKey , Sha256Hash , Signature } ;
66use historian:: Historian ;
77use ring:: signature:: Ed25519KeyPair ;
88use std:: sync:: mpsc:: { RecvError , SendError } ;
@@ -24,8 +24,8 @@ impl Accountant {
2424 }
2525 }
2626
27- pub fn process_event ( self : & mut Self , event : Event < u64 > ) {
28- match event {
27+ pub fn process_event ( self : & mut Self , event : & Event < u64 > ) {
28+ match * event {
2929 Event :: Claim { key, data, .. } => {
3030 if self . balances . contains_key ( & key) {
3131 if let Some ( x) = self . balances . get_mut ( & key) {
@@ -52,39 +52,76 @@ impl Accountant {
5252 }
5353
5454 pub fn sync ( self : & mut Self ) {
55+ let mut entries = vec ! [ ] ;
5556 while let Ok ( entry) = self . historian . receiver . try_recv ( ) {
56- assert ! ( verify_entry( & entry, & self . end_hash) ) ;
57- self . end_hash = entry. end_hash ;
58-
59- self . process_event ( entry. event ) ;
57+ entries. push ( entry) ;
58+ }
59+ // TODO: Does this cause the historian's channel to get blocked?
60+ //use log::verify_slice_u64;
61+ //println!("accountant: verifying {} entries...", entries.len());
62+ //assert!(verify_slice_u64(&entries, &self.end_hash));
63+ //println!("accountant: Done verifying {} entries.", entries.len());
64+ if let Some ( last_entry) = entries. last ( ) {
65+ self . end_hash = last_entry. end_hash ;
6066 }
67+ for e in & entries {
68+ self . process_event ( & e. event ) ;
69+ }
70+ }
71+
72+ pub fn deposit_signed (
73+ self : & Self ,
74+ key : PublicKey ,
75+ data : u64 ,
76+ sig : Signature ,
77+ ) -> Result < ( ) , SendError < Event < u64 > > > {
78+ let event = Event :: Claim { key, data, sig } ;
79+ self . historian . sender . send ( event)
6180 }
6281
6382 pub fn deposit (
6483 self : & Self ,
6584 n : u64 ,
6685 keypair : & Ed25519KeyPair ,
6786 ) -> Result < ( ) , SendError < Event < u64 > > > {
68- use log:: sign_hash;
69- let event = sign_hash ( n, & keypair) ;
87+ use log:: { get_pubkey, sign_serialized} ;
88+ let key = get_pubkey ( keypair) ;
89+ let sig = sign_serialized ( & n, keypair) ;
90+ self . deposit_signed ( key, n, sig)
91+ }
92+
93+ pub fn transfer_signed (
94+ self : & mut Self ,
95+ from : PublicKey ,
96+ to : PublicKey ,
97+ data : u64 ,
98+ sig : Signature ,
99+ ) -> Result < ( ) , SendError < Event < u64 > > > {
100+ if self . get_balance ( & from) . unwrap ( ) < data {
101+ // TODO: Replace the SendError result with a custom one.
102+ println ! ( "Error: Insufficient funds" ) ;
103+ return Ok ( ( ) ) ;
104+ }
105+ let event = Event :: Transaction {
106+ from,
107+ to,
108+ data,
109+ sig,
110+ } ;
70111 self . historian . sender . send ( event)
71112 }
72113
73114 pub fn transfer (
74115 self : & mut Self ,
75116 n : u64 ,
76117 keypair : & Ed25519KeyPair ,
77- pubkey : PublicKey ,
118+ to : PublicKey ,
78119 ) -> Result < ( ) , SendError < Event < u64 > > > {
79- use log:: transfer_hash;
80- use generic_array:: GenericArray ;
120+ use log:: { get_pubkey, sign_transaction_data} ;
81121
82- let sender_pubkey = GenericArray :: clone_from_slice ( keypair. public_key_bytes ( ) ) ;
83- if self . get_balance ( & sender_pubkey) . unwrap ( ) >= n {
84- let event = transfer_hash ( n, keypair, pubkey) ;
85- return self . historian . sender . send ( event) ;
86- }
87- Ok ( ( ) )
122+ let from = get_pubkey ( keypair) ;
123+ let sig = sign_transaction_data ( & n, keypair, & to) ;
124+ self . transfer_signed ( from, to, n, sig)
88125 }
89126
90127 pub fn get_balance ( self : & mut Self , pubkey : & PublicKey ) -> Result < u64 , RecvError > {
@@ -98,9 +135,8 @@ mod tests {
98135 use super :: * ;
99136 use std:: thread:: sleep;
100137 use std:: time:: Duration ;
101- use log:: generate_keypair;
138+ use log:: { generate_keypair, get_pubkey } ;
102139 use historian:: ExitReason ;
103- use generic_array:: GenericArray ;
104140
105141 #[ test]
106142 fn test_accountant ( ) {
@@ -112,7 +148,7 @@ mod tests {
112148 acc. deposit ( 1_000 , & bob_keypair) . unwrap ( ) ;
113149
114150 sleep ( Duration :: from_millis ( 30 ) ) ;
115- let bob_pubkey = GenericArray :: clone_from_slice ( bob_keypair. public_key_bytes ( ) ) ;
151+ let bob_pubkey = get_pubkey ( & bob_keypair) ;
116152 acc. transfer ( 500 , & alice_keypair, bob_pubkey) . unwrap ( ) ;
117153
118154 sleep ( Duration :: from_millis ( 30 ) ) ;
@@ -135,11 +171,11 @@ mod tests {
135171 acc. deposit ( 1_000 , & bob_keypair) . unwrap ( ) ;
136172
137173 sleep ( Duration :: from_millis ( 30 ) ) ;
138- let bob_pubkey = GenericArray :: clone_from_slice ( bob_keypair. public_key_bytes ( ) ) ;
174+ let bob_pubkey = get_pubkey ( & bob_keypair) ;
139175 acc. transfer ( 10_001 , & alice_keypair, bob_pubkey) . unwrap ( ) ;
140176
141177 sleep ( Duration :: from_millis ( 30 ) ) ;
142- let alice_pubkey = GenericArray :: clone_from_slice ( alice_keypair. public_key_bytes ( ) ) ;
178+ let alice_pubkey = get_pubkey ( & alice_keypair) ;
143179 assert_eq ! ( acc. get_balance( & alice_pubkey) . unwrap( ) , 10_000 ) ;
144180 assert_eq ! ( acc. get_balance( & bob_pubkey) . unwrap( ) , 1_000 ) ;
145181
@@ -151,14 +187,14 @@ mod tests {
151187 }
152188
153189 #[ test]
154- fn test_mulitple_claims ( ) {
190+ fn test_multiple_claims ( ) {
155191 let zero = Sha256Hash :: default ( ) ;
156192 let mut acc = Accountant :: new ( & zero, Some ( 2 ) ) ;
157193 let keypair = generate_keypair ( ) ;
158194 acc. deposit ( 1 , & keypair) . unwrap ( ) ;
159195 acc. deposit ( 2 , & keypair) . unwrap ( ) ;
160196
161- let pubkey = GenericArray :: clone_from_slice ( keypair. public_key_bytes ( ) ) ;
197+ let pubkey = get_pubkey ( & keypair) ;
162198 sleep ( Duration :: from_millis ( 30 ) ) ;
163199 assert_eq ! ( acc. get_balance( & pubkey) . unwrap( ) , 3 ) ;
164200
@@ -178,7 +214,7 @@ mod tests {
178214 acc. deposit ( 10_000 , & alice_keypair) . unwrap ( ) ;
179215
180216 sleep ( Duration :: from_millis ( 30 ) ) ;
181- let bob_pubkey = GenericArray :: clone_from_slice ( bob_keypair. public_key_bytes ( ) ) ;
217+ let bob_pubkey = get_pubkey ( & bob_keypair) ;
182218 acc. transfer ( 500 , & alice_keypair, bob_pubkey) . unwrap ( ) ;
183219
184220 sleep ( Duration :: from_millis ( 30 ) ) ;
0 commit comments