Add poll_for_signature
This commit is contained in:
0
src/bin/client-demo.rs
Executable file → Normal file
0
src/bin/client-demo.rs
Executable file → Normal file
@ -96,7 +96,6 @@ impl Drone {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn send_airdrop(&mut self, req: DroneRequest) -> Result<Signature, io::Error> {
|
pub fn send_airdrop(&mut self, req: DroneRequest) -> Result<Signature, io::Error> {
|
||||||
let tx: Transaction;
|
|
||||||
let request_amount: u64;
|
let request_amount: u64;
|
||||||
let requests_socket = UdpSocket::bind("0.0.0.0:0").unwrap();
|
let requests_socket = UdpSocket::bind("0.0.0.0:0").unwrap();
|
||||||
let transactions_socket = UdpSocket::bind("0.0.0.0:0").unwrap();
|
let transactions_socket = UdpSocket::bind("0.0.0.0:0").unwrap();
|
||||||
@ -109,7 +108,7 @@ impl Drone {
|
|||||||
);
|
);
|
||||||
let last_id = client.get_last_id();
|
let last_id = client.get_last_id();
|
||||||
|
|
||||||
match req {
|
let tx = match req {
|
||||||
DroneRequest::GetAirdrop {
|
DroneRequest::GetAirdrop {
|
||||||
airdrop_request_amount,
|
airdrop_request_amount,
|
||||||
client_public_key,
|
client_public_key,
|
||||||
@ -119,14 +118,14 @@ impl Drone {
|
|||||||
airdrop_request_amount, client_public_key
|
airdrop_request_amount, client_public_key
|
||||||
);
|
);
|
||||||
request_amount = airdrop_request_amount;
|
request_amount = airdrop_request_amount;
|
||||||
tx = Transaction::new(
|
Transaction::new(
|
||||||
&self.mint_keypair,
|
&self.mint_keypair,
|
||||||
client_public_key,
|
client_public_key,
|
||||||
airdrop_request_amount as i64,
|
airdrop_request_amount as i64,
|
||||||
last_id,
|
last_id,
|
||||||
);
|
)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
};
|
||||||
if self.check_request_limit(request_amount) {
|
if self.check_request_limit(request_amount) {
|
||||||
self.request_current += request_amount;
|
self.request_current += request_amount;
|
||||||
metrics::submit(
|
metrics::submit(
|
||||||
|
@ -217,6 +217,19 @@ impl ThinClient {
|
|||||||
balance
|
balance
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Poll the server to confirm a transaction.
|
||||||
|
pub fn poll_for_signature(&mut self, sig: &Signature) -> io::Result<()> {
|
||||||
|
let now = Instant::now();
|
||||||
|
while !self.check_signature(sig) {
|
||||||
|
if now.elapsed().as_secs() > 1 {
|
||||||
|
// TODO: Return a better error.
|
||||||
|
return Err(io::Error::new(io::ErrorKind::Other, "signature not found"));
|
||||||
|
}
|
||||||
|
sleep(Duration::from_millis(100));
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
/// Check a signature in the bank. This method blocks
|
/// Check a signature in the bank. This method blocks
|
||||||
/// until the server sends a response.
|
/// until the server sends a response.
|
||||||
pub fn check_signature(&mut self, sig: &Signature) -> bool {
|
pub fn check_signature(&mut self, sig: &Signature) -> bool {
|
||||||
@ -304,10 +317,11 @@ mod tests {
|
|||||||
transactions_socket,
|
transactions_socket,
|
||||||
);
|
);
|
||||||
let last_id = client.get_last_id();
|
let last_id = client.get_last_id();
|
||||||
let _sig = client
|
let sig = client
|
||||||
.transfer(500, &alice.keypair(), bob_pubkey, &last_id)
|
.transfer(500, &alice.keypair(), bob_pubkey, &last_id)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let balance = client.poll_get_balance(&bob_pubkey);
|
client.poll_for_signature(&sig).unwrap();
|
||||||
|
let balance = client.get_balance(&bob_pubkey);
|
||||||
assert_eq!(balance.unwrap(), 500);
|
assert_eq!(balance.unwrap(), 500);
|
||||||
exit.store(true, Ordering::Relaxed);
|
exit.store(true, Ordering::Relaxed);
|
||||||
server.join().unwrap();
|
server.join().unwrap();
|
||||||
@ -361,9 +375,10 @@ mod tests {
|
|||||||
contract.tokens = 502;
|
contract.tokens = 502;
|
||||||
contract.plan = Plan::Budget(Budget::new_payment(502, bob_pubkey));
|
contract.plan = Plan::Budget(Budget::new_payment(502, bob_pubkey));
|
||||||
}
|
}
|
||||||
let _sig = client.transfer_signed(&tr2).unwrap();
|
let sig = client.transfer_signed(&tr2).unwrap();
|
||||||
|
client.poll_for_signature(&sig).unwrap();
|
||||||
|
|
||||||
let balance = client.poll_get_balance(&bob_pubkey);
|
let balance = client.get_balance(&bob_pubkey);
|
||||||
assert_eq!(balance.unwrap(), 500);
|
assert_eq!(balance.unwrap(), 500);
|
||||||
exit.store(true, Ordering::Relaxed);
|
exit.store(true, Ordering::Relaxed);
|
||||||
server.join().unwrap();
|
server.join().unwrap();
|
||||||
|
Reference in New Issue
Block a user