Migrate solana-client-demo to use drone
This commit is contained in:
committed by
Greg Fitzgerald
parent
f54615b4e3
commit
4701540cc9
@ -14,10 +14,19 @@ rsync_leader_url=$(rsync_url "$leader")
|
|||||||
|
|
||||||
set -ex
|
set -ex
|
||||||
mkdir -p "$SOLANA_CONFIG_CLIENT_DIR"
|
mkdir -p "$SOLANA_CONFIG_CLIENT_DIR"
|
||||||
|
if [[ ! -r "$SOLANA_CONFIG_CLIENT_DIR"/leader.json ]]; then
|
||||||
|
(
|
||||||
|
set -x
|
||||||
$rsync -vPz "$rsync_leader_url"/config/leader.json "$SOLANA_CONFIG_CLIENT_DIR"/
|
$rsync -vPz "$rsync_leader_url"/config/leader.json "$SOLANA_CONFIG_CLIENT_DIR"/
|
||||||
$rsync -vPz "$rsync_leader_url"/config-private/mint.json "$SOLANA_CONFIG_CLIENT_DIR"/
|
)
|
||||||
|
fi
|
||||||
|
|
||||||
|
client_json="$SOLANA_CONFIG_CLIENT_DIR"/client.json
|
||||||
|
if [[ ! -r $client_json ]]; then
|
||||||
|
$solana_mint <<<0 > "$client_json"
|
||||||
|
fi
|
||||||
|
|
||||||
# shellcheck disable=SC2086 # $solana_client_demo should not be quoted
|
# shellcheck disable=SC2086 # $solana_client_demo should not be quoted
|
||||||
exec $solana_client_demo \
|
exec $solana_client_demo \
|
||||||
-n "$count" -l "$SOLANA_CONFIG_CLIENT_DIR"/leader.json \
|
-n "$count" -l "$SOLANA_CONFIG_CLIENT_DIR"/leader.json \
|
||||||
< "$SOLANA_CONFIG_CLIENT_DIR"/mint.json
|
< "$SOLANA_CONFIG_CLIENT_DIR"/client.json
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
extern crate atty;
|
extern crate atty;
|
||||||
|
extern crate bincode;
|
||||||
extern crate env_logger;
|
extern crate env_logger;
|
||||||
extern crate getopts;
|
extern crate getopts;
|
||||||
extern crate rayon;
|
extern crate rayon;
|
||||||
@ -6,9 +7,11 @@ extern crate serde_json;
|
|||||||
extern crate solana;
|
extern crate solana;
|
||||||
|
|
||||||
use atty::{is, Stream};
|
use atty::{is, Stream};
|
||||||
|
use bincode::serialize;
|
||||||
use getopts::Options;
|
use getopts::Options;
|
||||||
use rayon::prelude::*;
|
use rayon::prelude::*;
|
||||||
use solana::crdt::{Crdt, ReplicatedData};
|
use solana::crdt::{Crdt, ReplicatedData};
|
||||||
|
use solana::drone::DroneRequest;
|
||||||
use solana::hash::Hash;
|
use solana::hash::Hash;
|
||||||
use solana::mint::Mint;
|
use solana::mint::Mint;
|
||||||
use solana::nat::{udp_public_bind, udp_random_bind};
|
use solana::nat::{udp_public_bind, udp_random_bind};
|
||||||
@ -20,9 +23,10 @@ use solana::thin_client::ThinClient;
|
|||||||
use solana::timing::{duration_as_ms, duration_as_s};
|
use solana::timing::{duration_as_ms, duration_as_s};
|
||||||
use solana::transaction::Transaction;
|
use solana::transaction::Transaction;
|
||||||
use std::env;
|
use std::env;
|
||||||
|
use std::error;
|
||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
use std::io::{stdin, Read};
|
use std::io::{stdin, Read, Write};
|
||||||
use std::net::{IpAddr, Ipv4Addr, SocketAddr, UdpSocket};
|
use std::net::{IpAddr, Ipv4Addr, SocketAddr, TcpStream, UdpSocket};
|
||||||
use std::process::exit;
|
use std::process::exit;
|
||||||
use std::sync::atomic::{AtomicBool, Ordering};
|
use std::sync::atomic::{AtomicBool, Ordering};
|
||||||
use std::sync::{Arc, RwLock};
|
use std::sync::{Arc, RwLock};
|
||||||
@ -84,18 +88,19 @@ fn sample_tx_count(
|
|||||||
fn generate_and_send_txs(
|
fn generate_and_send_txs(
|
||||||
client: &mut ThinClient,
|
client: &mut ThinClient,
|
||||||
tx_clients: &Vec<ThinClient>,
|
tx_clients: &Vec<ThinClient>,
|
||||||
mint: &Mint,
|
id: &Mint,
|
||||||
keypairs: &Vec<KeyPair>,
|
keypairs: &Vec<KeyPair>,
|
||||||
leader: &ReplicatedData,
|
leader: &ReplicatedData,
|
||||||
txs: i64,
|
txs: i64,
|
||||||
last_id: &mut Hash,
|
last_id: &mut Hash,
|
||||||
threads: usize,
|
threads: usize,
|
||||||
) {
|
) {
|
||||||
println!("Signing transactions... {}", keypairs.len(),);
|
println!("Signing transactions... {}", txs,);
|
||||||
let signing_start = Instant::now();
|
let signing_start = Instant::now();
|
||||||
|
|
||||||
let transactions: Vec<_> = keypairs
|
let transactions: Vec<_> = keypairs
|
||||||
.par_iter()
|
.par_iter()
|
||||||
.map(|keypair| Transaction::new(&mint.keypair(), keypair.pubkey(), 1, *last_id))
|
.map(|keypair| Transaction::new(&id.keypair(), keypair.pubkey(), 1, *last_id))
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
let duration = signing_start.elapsed();
|
let duration = signing_start.elapsed();
|
||||||
@ -176,7 +181,7 @@ fn main() {
|
|||||||
if matches.opt_present("h") {
|
if matches.opt_present("h") {
|
||||||
let program = args[0].clone();
|
let program = args[0].clone();
|
||||||
print_usage(&program, opts);
|
print_usage(&program, opts);
|
||||||
return;
|
exit(1);
|
||||||
}
|
}
|
||||||
if matches.opt_present("t") {
|
if matches.opt_present("t") {
|
||||||
threads = matches.opt_str("t").unwrap().parse().expect("integer");
|
threads = matches.opt_str("t").unwrap().parse().expect("integer");
|
||||||
@ -195,6 +200,9 @@ fn main() {
|
|||||||
ReplicatedData::new_leader(&server_addr)
|
ReplicatedData::new_leader(&server_addr)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let mut drone_addr = leader.transactions_addr.clone();
|
||||||
|
drone_addr.set_port(9900);
|
||||||
|
|
||||||
let signal = Arc::new(AtomicBool::new(false));
|
let signal = Arc::new(AtomicBool::new(false));
|
||||||
let mut c_threads = vec![];
|
let mut c_threads = vec![];
|
||||||
let validators = converge(&leader, signal.clone(), num_nodes, &mut c_threads);
|
let validators = converge(&leader, signal.clone(), num_nodes, &mut c_threads);
|
||||||
@ -213,22 +221,36 @@ fn main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
println!("Parsing stdin...");
|
println!("Parsing stdin...");
|
||||||
let mint: Mint = serde_json::from_str(&buffer).unwrap_or_else(|e| {
|
let id: Mint = serde_json::from_str(&buffer).unwrap_or_else(|e| {
|
||||||
eprintln!("failed to parse json: {}", e);
|
eprintln!("failed to parse json: {}", e);
|
||||||
exit(1);
|
exit(1);
|
||||||
});
|
});
|
||||||
let mut client = mk_client(&leader);
|
let mut client = mk_client(&leader);
|
||||||
|
|
||||||
|
let starting_balance = client.poll_get_balance(&id.pubkey()).unwrap();
|
||||||
|
|
||||||
|
let txs: i64 = 500_000;
|
||||||
|
println!("Airdropping {:?} tokens", txs);
|
||||||
|
let _airdrop = request_airdrop(&drone_addr, &id, txs as u64).unwrap();
|
||||||
|
// TODO: return airdrop Result from Drone
|
||||||
|
sleep(Duration::from_millis(100));
|
||||||
|
let balance = client.poll_get_balance(&id.pubkey()).unwrap();
|
||||||
|
println!("Your balance is: {:?}", balance);
|
||||||
|
|
||||||
|
if balance < txs || (starting_balance == balance) {
|
||||||
|
println!("TPS airdrop limit reached; wait 60sec to retry");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
println!("Get last ID...");
|
println!("Get last ID...");
|
||||||
let mut last_id = client.get_last_id();
|
let mut last_id = client.get_last_id();
|
||||||
println!("Got last ID {:?}", last_id);
|
println!("Got last ID {:?}", last_id);
|
||||||
|
|
||||||
let mut seed = [0u8; 32];
|
let mut seed = [0u8; 32];
|
||||||
seed.copy_from_slice(&mint.keypair().public_key_bytes()[..32]);
|
seed.copy_from_slice(&id.keypair().public_key_bytes()[..32]);
|
||||||
let rnd = GenKeys::new(seed);
|
let rnd = GenKeys::new(seed);
|
||||||
|
|
||||||
println!("Creating keypairs...");
|
println!("Creating keypairs...");
|
||||||
let txs = 500_000;
|
|
||||||
let keypairs = rnd.gen_n_keypairs(txs);
|
let keypairs = rnd.gen_n_keypairs(txs);
|
||||||
|
|
||||||
let first_count = client.transaction_count();
|
let first_count = client.transaction_count();
|
||||||
@ -263,7 +285,7 @@ fn main() {
|
|||||||
generate_and_send_txs(
|
generate_and_send_txs(
|
||||||
&mut client,
|
&mut client,
|
||||||
&clients,
|
&clients,
|
||||||
&mint,
|
&id,
|
||||||
&keypairs,
|
&keypairs,
|
||||||
&leader,
|
&leader,
|
||||||
txs,
|
txs,
|
||||||
@ -382,3 +404,20 @@ fn read_leader(path: String) -> ReplicatedData {
|
|||||||
let file = File::open(path.clone()).expect(&format!("file not found: {}", path));
|
let file = File::open(path.clone()).expect(&format!("file not found: {}", path));
|
||||||
serde_json::from_reader(file).expect(&format!("failed to parse {}", path))
|
serde_json::from_reader(file).expect(&format!("failed to parse {}", path))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn request_airdrop(
|
||||||
|
drone_addr: &SocketAddr,
|
||||||
|
id: &Mint,
|
||||||
|
tokens: u64,
|
||||||
|
) -> Result<(), Box<error::Error>> {
|
||||||
|
let mut stream = TcpStream::connect(drone_addr)?;
|
||||||
|
let req = DroneRequest::GetAirdrop {
|
||||||
|
airdrop_request_amount: tokens,
|
||||||
|
client_public_key: id.pubkey(),
|
||||||
|
tps_demo: true,
|
||||||
|
};
|
||||||
|
let tx = serialize(&req).expect("serialize drone request");
|
||||||
|
stream.write_all(&tx).unwrap();
|
||||||
|
// TODO: add timeout to this function, in case of unresponsive drone
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user