2
2
//! event log to record transactions. Its users can deposit funds and
3
3
//! transfer funds to other users.
4
4
5
- use log:: { verify_entry , Event , PublicKey , Sha256Hash } ;
5
+ use log:: { Event , PublicKey , Sha256Hash , Signature } ;
6
6
use historian:: Historian ;
7
7
use ring:: signature:: Ed25519KeyPair ;
8
8
use std:: sync:: mpsc:: { RecvError , SendError } ;
@@ -24,8 +24,8 @@ impl Accountant {
24
24
}
25
25
}
26
26
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 {
29
29
Event :: Claim { key, data, .. } => {
30
30
if self . balances . contains_key ( & key) {
31
31
if let Some ( x) = self . balances . get_mut ( & key) {
@@ -52,39 +52,76 @@ impl Accountant {
52
52
}
53
53
54
54
pub fn sync ( self : & mut Self ) {
55
+ let mut entries = vec ! [ ] ;
55
56
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 ;
60
66
}
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)
61
80
}
62
81
63
82
pub fn deposit (
64
83
self : & Self ,
65
84
n : u64 ,
66
85
keypair : & Ed25519KeyPair ,
67
86
) -> 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
+ } ;
70
111
self . historian . sender . send ( event)
71
112
}
72
113
73
114
pub fn transfer (
74
115
self : & mut Self ,
75
116
n : u64 ,
76
117
keypair : & Ed25519KeyPair ,
77
- pubkey : PublicKey ,
118
+ to : PublicKey ,
78
119
) -> Result < ( ) , SendError < Event < u64 > > > {
79
- use log:: transfer_hash;
80
- use generic_array:: GenericArray ;
120
+ use log:: { get_pubkey, sign_transaction_data} ;
81
121
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)
88
125
}
89
126
90
127
pub fn get_balance ( self : & mut Self , pubkey : & PublicKey ) -> Result < u64 , RecvError > {
@@ -98,9 +135,8 @@ mod tests {
98
135
use super :: * ;
99
136
use std:: thread:: sleep;
100
137
use std:: time:: Duration ;
101
- use log:: generate_keypair;
138
+ use log:: { generate_keypair, get_pubkey } ;
102
139
use historian:: ExitReason ;
103
- use generic_array:: GenericArray ;
104
140
105
141
#[ test]
106
142
fn test_accountant ( ) {
@@ -112,7 +148,7 @@ mod tests {
112
148
acc. deposit ( 1_000 , & bob_keypair) . unwrap ( ) ;
113
149
114
150
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) ;
116
152
acc. transfer ( 500 , & alice_keypair, bob_pubkey) . unwrap ( ) ;
117
153
118
154
sleep ( Duration :: from_millis ( 30 ) ) ;
@@ -135,11 +171,11 @@ mod tests {
135
171
acc. deposit ( 1_000 , & bob_keypair) . unwrap ( ) ;
136
172
137
173
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) ;
139
175
acc. transfer ( 10_001 , & alice_keypair, bob_pubkey) . unwrap ( ) ;
140
176
141
177
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) ;
143
179
assert_eq ! ( acc. get_balance( & alice_pubkey) . unwrap( ) , 10_000 ) ;
144
180
assert_eq ! ( acc. get_balance( & bob_pubkey) . unwrap( ) , 1_000 ) ;
145
181
@@ -151,14 +187,14 @@ mod tests {
151
187
}
152
188
153
189
#[ test]
154
- fn test_mulitple_claims ( ) {
190
+ fn test_multiple_claims ( ) {
155
191
let zero = Sha256Hash :: default ( ) ;
156
192
let mut acc = Accountant :: new ( & zero, Some ( 2 ) ) ;
157
193
let keypair = generate_keypair ( ) ;
158
194
acc. deposit ( 1 , & keypair) . unwrap ( ) ;
159
195
acc. deposit ( 2 , & keypair) . unwrap ( ) ;
160
196
161
- let pubkey = GenericArray :: clone_from_slice ( keypair. public_key_bytes ( ) ) ;
197
+ let pubkey = get_pubkey ( & keypair) ;
162
198
sleep ( Duration :: from_millis ( 30 ) ) ;
163
199
assert_eq ! ( acc. get_balance( & pubkey) . unwrap( ) , 3 ) ;
164
200
@@ -178,7 +214,7 @@ mod tests {
178
214
acc. deposit ( 10_000 , & alice_keypair) . unwrap ( ) ;
179
215
180
216
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) ;
182
218
acc. transfer ( 500 , & alice_keypair, bob_pubkey) . unwrap ( ) ;
183
219
184
220
sleep ( Duration :: from_millis ( 30 ) ) ;
0 commit comments