diff --git a/src/accountant_skel.rs b/src/accountant_skel.rs index 4abc8c208e..32296cd09f 100644 --- a/src/accountant_skel.rs +++ b/src/accountant_skel.rs @@ -1,6 +1,7 @@ use std::io; use accountant::Accountant; use event::{Event, PublicKey, Signature}; +use log::{Entry, Sha256Hash}; use std::net::UdpSocket; use bincode::{deserialize, serialize}; @@ -19,8 +20,8 @@ pub enum Request { GetBalance { key: PublicKey, }, - Wait { - sig: Signature, + GetEntries { + last_id: Option, }, } @@ -28,6 +29,7 @@ pub enum Request { pub enum Response { Balance { key: PublicKey, val: u64 }, Confirmed { sig: Signature }, + Entries { entries: Vec> }, } impl AccountantSkel { @@ -53,7 +55,7 @@ impl AccountantSkel { let val = self.obj.get_balance(&key).unwrap(); Some(Response::Balance { key, val }) } - Request::Wait { sig } => Some(Response::Confirmed { sig }), + Request::GetEntries { .. } => Some(Response::Entries { entries: vec![] }), } } diff --git a/src/accountant_stub.rs b/src/accountant_stub.rs index 6d5929f688..cbb5b336b3 100644 --- a/src/accountant_stub.rs +++ b/src/accountant_stub.rs @@ -5,13 +5,15 @@ use std::net::UdpSocket; use std::io; use bincode::{deserialize, serialize}; -use event::{get_pubkey, sign_transaction_data, PublicKey, Signature}; +use event::{get_pubkey, get_signature, sign_transaction_data, PublicKey, Signature}; +use log::{Entry, Sha256Hash}; use ring::signature::Ed25519KeyPair; use accountant_skel::{Request, Response}; pub struct AccountantStub { pub addr: String, pub socket: UdpSocket, + pub last_id: Option, } impl AccountantStub { @@ -19,11 +21,12 @@ impl AccountantStub { AccountantStub { addr: addr.to_string(), socket, + last_id: None, } } pub fn transfer_signed( - self: &Self, + &self, from: PublicKey, to: PublicKey, val: u64, @@ -35,7 +38,7 @@ impl AccountantStub { } pub fn transfer( - self: &Self, + &self, n: u64, keypair: &Ed25519KeyPair, to: PublicKey, @@ -45,7 +48,7 @@ impl AccountantStub { self.transfer_signed(from, to, n, sig).map(|_| sig) } - pub fn get_balance(self: &Self, pubkey: &PublicKey) -> io::Result { + pub fn get_balance(&self, pubkey: &PublicKey) -> io::Result { let req = Request::GetBalance { key: *pubkey }; let data = serialize(&req).expect("serialize GetBalance"); self.socket.send_to(&data, &self.addr)?; @@ -59,17 +62,28 @@ impl AccountantStub { Ok(0) } - pub fn wait_on_signature(self: &Self, wait_sig: &Signature) -> io::Result<()> { - let req = Request::Wait { sig: *wait_sig }; + pub fn wait_on_signature(&mut self, wait_sig: &Signature) -> io::Result<()> { + let req = Request::GetEntries { + last_id: self.last_id, + }; let data = serialize(&req).unwrap(); self.socket.send_to(&data, &self.addr).map(|_| ())?; let mut buf = vec![0u8; 1024]; self.socket.recv_from(&mut buf)?; let resp = deserialize(&buf).expect("deserialize signature"); - if let Response::Confirmed { sig } = resp { - assert_eq!(sig, *wait_sig); + if let Response::Entries { entries } = resp { + for Entry { id, event, .. } in entries { + self.last_id = Some(id); + if let Some(sig) = get_signature(&event) { + if sig == *wait_sig { + return Ok(()); + } + } + } } + + // TODO: Loop until we found it. Ok(()) } } @@ -95,7 +109,7 @@ mod tests { sleep(Duration::from_millis(30)); let socket = UdpSocket::bind(send_addr).unwrap(); - let acc = AccountantStub::new(addr, socket); + let mut acc = AccountantStub::new(addr, socket); let sig = acc.transfer(500, &alice.get_keypair(), bob_pubkey).unwrap(); acc.wait_on_signature(&sig).unwrap(); assert_eq!(acc.get_balance(&bob_pubkey).unwrap(), 1_500); diff --git a/src/bin/client-demo.rs b/src/bin/client-demo.rs index 7cd4220b3a..3b93ad7780 100644 --- a/src/bin/client-demo.rs +++ b/src/bin/client-demo.rs @@ -28,7 +28,7 @@ fn main() { sleep(Duration::from_millis(30)); let socket = UdpSocket::bind(send_addr).unwrap(); - let acc = AccountantStub::new(addr, socket); + let mut acc = AccountantStub::new(addr, socket); let alice_pubkey = get_pubkey(&alice_keypair); let one = 1; println!("Signing transactions...");