More keygen

This commit is contained in:
Greg Fitzgerald
2018-07-12 16:02:14 -06:00
committed by Greg Fitzgerald
parent b5006b8f2b
commit cea29ed772
4 changed files with 23 additions and 98 deletions

View File

@ -12,7 +12,6 @@ use solana::crdt::{Crdt, NodeInfo};
use solana::drone::DroneRequest; use solana::drone::DroneRequest;
use solana::fullnode::Config; use solana::fullnode::Config;
use solana::hash::Hash; use solana::hash::Hash;
use solana::mint::Mint;
use solana::nat::{udp_public_bind, udp_random_bind}; use solana::nat::{udp_public_bind, udp_random_bind};
use solana::ncp::Ncp; use solana::ncp::Ncp;
use solana::service::Service; use solana::service::Service;
@ -163,20 +162,13 @@ fn main() {
.takes_value(true) .takes_value(true)
.help("/path/to/leader.json"), .help("/path/to/leader.json"),
) )
.arg(
Arg::with_name("mint")
.short("m")
.long("mint")
.value_name("PATH")
.takes_value(true)
.help("/path/to/mint.json"),
)
.arg( .arg(
Arg::with_name("keypair") Arg::with_name("keypair")
.short("k") .short("k")
.long("keypair") .long("keypair")
.value_name("PATH") .value_name("PATH")
.takes_value(true) .takes_value(true)
.default_value("~/.config/solana/id.json")
.help("/path/to/id.json"), .help("/path/to/id.json"),
) )
.arg( .arg(
@ -213,13 +205,7 @@ fn main() {
leader = NodeInfo::new_leader(&server_addr); leader = NodeInfo::new_leader(&server_addr);
}; };
let id = if let Some(m) = matches.value_of("keypair") { let id = read_keypair(matches.value_of("keypair").unwrap()).expect("client keypair");
read_keypair(m).expect("client keypair")
} else if let Some(m) = matches.value_of("mint") {
read_mint(m).expect("client mint").keypair()
} else {
read_keypair("~/.config/solana/id.json").expect("default keypair")
};
if let Some(t) = matches.value_of("threads") { if let Some(t) = matches.value_of("threads") {
threads = t.to_string().parse().expect("integer"); threads = t.to_string().parse().expect("integer");
@ -441,12 +427,6 @@ fn read_leader(path: &str) -> Config {
serde_json::from_reader(file).unwrap_or_else(|_| panic!("failed to parse {}", path)) serde_json::from_reader(file).unwrap_or_else(|_| panic!("failed to parse {}", path))
} }
fn read_mint(path: &str) -> Result<Mint, Box<error::Error>> {
let file = File::open(path.to_string())?;
let mint = serde_json::from_reader(file)?;
Ok(mint)
}
fn request_airdrop( fn request_airdrop(
drone_addr: &SocketAddr, drone_addr: &SocketAddr,
id: &KeyPair, id: &KeyPair,

View File

@ -12,11 +12,9 @@ use clap::{App, Arg};
use solana::crdt::NodeInfo; use solana::crdt::NodeInfo;
use solana::drone::{Drone, DroneRequest}; use solana::drone::{Drone, DroneRequest};
use solana::fullnode::Config; use solana::fullnode::Config;
use solana::mint::Mint; use solana::signature::read_keypair;
use std::error;
use std::fs::File; use std::fs::File;
use std::net::{IpAddr, Ipv4Addr, SocketAddr}; use std::net::{IpAddr, Ipv4Addr, SocketAddr};
use std::process::exit;
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex};
use std::thread; use std::thread;
use tokio::net::TcpListener; use tokio::net::TcpListener;
@ -35,11 +33,12 @@ fn main() {
.help("/path/to/leader.json"), .help("/path/to/leader.json"),
) )
.arg( .arg(
Arg::with_name("mint") Arg::with_name("keypair")
.short("m") .short("k")
.long("mint") .long("keypair")
.value_name("PATH") .value_name("PATH")
.takes_value(true) .takes_value(true)
.required(true)
.help("/path/to/mint.json"), .help("/path/to/mint.json"),
) )
.arg( .arg(
@ -68,13 +67,9 @@ fn main() {
leader = NodeInfo::new_leader(&server_addr); leader = NodeInfo::new_leader(&server_addr);
}; };
let mint: Mint; let mint_keypair =
if let Some(m) = matches.value_of("mint") { read_keypair(matches.value_of("keypair").expect("keypair")).expect("client keypair");
mint = read_mint(m).expect("client mint");
} else {
eprintln!("No mint found!");
exit(1);
};
let time_slice: Option<u64>; let time_slice: Option<u64>;
if let Some(t) = matches.value_of("time") { if let Some(t) = matches.value_of("time") {
time_slice = Some(t.to_string().parse().expect("integer")); time_slice = Some(t.to_string().parse().expect("integer"));
@ -88,8 +83,6 @@ fn main() {
request_cap = None; request_cap = None;
} }
let mint_keypair = mint.keypair();
let drone_addr: SocketAddr = "0.0.0.0:9900".parse().unwrap(); let drone_addr: SocketAddr = "0.0.0.0:9900".parse().unwrap();
let drone = Arc::new(Mutex::new(Drone::new( let drone = Arc::new(Mutex::new(Drone::new(
@ -152,9 +145,3 @@ fn read_leader(path: &str) -> Config {
let file = File::open(path).unwrap_or_else(|_| panic!("file not found: {}", path)); let file = File::open(path).unwrap_or_else(|_| panic!("file not found: {}", path));
serde_json::from_reader(file).unwrap_or_else(|_| panic!("failed to parse {}", path)) serde_json::from_reader(file).unwrap_or_else(|_| panic!("failed to parse {}", path))
} }
fn read_mint(path: &str) -> Result<Mint, Box<error::Error>> {
let file = File::open(path.to_string())?;
let mint = serde_json::from_reader(file)?;
Ok(mint)
}

View File

@ -1,29 +0,0 @@
extern crate atty;
extern crate serde_json;
extern crate solana;
use atty::{is, Stream};
use solana::mint::Mint;
use std::io;
use std::process::exit;
fn main() {
let mut input_text = String::new();
if is(Stream::Stdin) {
eprintln!("nothing found on stdin, expected a token number");
exit(1);
}
io::stdin().read_line(&mut input_text).unwrap();
let trimmed = input_text.trim();
let tokens = trimmed.parse::<i64>().unwrap_or_else(|e| {
eprintln!("{}", e);
exit(1);
});
let mint = Mint::new(tokens);
let serialized = serde_json::to_string(&mint).unwrap_or_else(|e| {
eprintln!("failed to serialize: {}", e);
exit(1);
});
println!("{}", serialized);
}

View File

@ -11,8 +11,7 @@ use clap::{App, Arg, SubCommand};
use solana::crdt::NodeInfo; use solana::crdt::NodeInfo;
use solana::drone::DroneRequest; use solana::drone::DroneRequest;
use solana::fullnode::Config; use solana::fullnode::Config;
use solana::mint::Mint; use solana::signature::{read_keypair, KeyPair, KeyPairUtil, PublicKey, Signature};
use solana::signature::{PublicKey, Signature};
use solana::thin_client::ThinClient; use solana::thin_client::ThinClient;
use std::error; use std::error;
use std::fmt; use std::fmt;
@ -20,7 +19,6 @@ use std::fs::File;
use std::io; use std::io;
use std::io::prelude::*; use std::io::prelude::*;
use std::net::{IpAddr, Ipv4Addr, SocketAddr, TcpStream, UdpSocket}; use std::net::{IpAddr, Ipv4Addr, SocketAddr, TcpStream, UdpSocket};
use std::process::exit;
use std::thread::sleep; use std::thread::sleep;
use std::time::Duration; use std::time::Duration;
@ -57,7 +55,7 @@ impl error::Error for WalletError {
struct WalletConfig { struct WalletConfig {
leader: NodeInfo, leader: NodeInfo,
id: Mint, id: KeyPair,
drone_addr: SocketAddr, drone_addr: SocketAddr,
command: WalletCommand, command: WalletCommand,
} }
@ -67,7 +65,7 @@ impl Default for WalletConfig {
let default_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), 8000); let default_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), 8000);
WalletConfig { WalletConfig {
leader: NodeInfo::new_leader(&default_addr), leader: NodeInfo::new_leader(&default_addr),
id: Mint::new(0), id: KeyPair::new(),
drone_addr: default_addr, drone_addr: default_addr,
command: WalletCommand::Balance, command: WalletCommand::Balance,
} }
@ -85,12 +83,13 @@ fn parse_args() -> Result<WalletConfig, Box<error::Error>> {
.help("/path/to/leader.json"), .help("/path/to/leader.json"),
) )
.arg( .arg(
Arg::with_name("mint") Arg::with_name("keypair")
.short("m") .short("k")
.long("mint") .long("keypair")
.value_name("PATH") .value_name("PATH")
.takes_value(true) .takes_value(true)
.help("/path/to/mint.json"), .default_value("~/.config/solana/id.json")
.help("/path/to/id.json"),
) )
.subcommand( .subcommand(
SubCommand::with_name("airdrop") SubCommand::with_name("airdrop")
@ -149,13 +148,7 @@ fn parse_args() -> Result<WalletConfig, Box<error::Error>> {
leader = NodeInfo::new_leader(&server_addr); leader = NodeInfo::new_leader(&server_addr);
}; };
let id: Mint; let id = read_keypair(matches.value_of("keypair").unwrap()).expect("client keypair");
if let Some(m) = matches.value_of("mint") {
id = read_mint(m)?;
} else {
eprintln!("No mint found!");
exit(1);
};
let mut drone_addr = leader.contact_info.tpu; let mut drone_addr = leader.contact_info.tpu;
drone_addr.set_port(9900); drone_addr.set_port(9900);
@ -165,7 +158,7 @@ fn parse_args() -> Result<WalletConfig, Box<error::Error>> {
let tokens = if airdrop_matches.is_present("tokens") { let tokens = if airdrop_matches.is_present("tokens") {
airdrop_matches.value_of("tokens").unwrap().parse()? airdrop_matches.value_of("tokens").unwrap().parse()?
} else { } else {
id.tokens 100
}; };
Ok(WalletCommand::AirDrop(tokens)) Ok(WalletCommand::AirDrop(tokens))
} }
@ -187,7 +180,7 @@ fn parse_args() -> Result<WalletConfig, Box<error::Error>> {
let tokens = if pay_matches.is_present("tokens") { let tokens = if pay_matches.is_present("tokens") {
pay_matches.value_of("tokens").unwrap().parse()? pay_matches.value_of("tokens").unwrap().parse()?
} else { } else {
id.tokens 10
}; };
Ok(WalletCommand::Pay(tokens, to)) Ok(WalletCommand::Pay(tokens, to))
@ -264,7 +257,7 @@ fn process_command(
// If client has positive balance, spend tokens in {balance} number of transactions // If client has positive balance, spend tokens in {balance} number of transactions
WalletCommand::Pay(tokens, to) => { WalletCommand::Pay(tokens, to) => {
let last_id = client.get_last_id(); let last_id = client.get_last_id();
let sig = client.transfer(tokens, &config.id.keypair(), to, &last_id)?; let sig = client.transfer(tokens, &config.id, to, &last_id)?;
println!("{}", bs58::encode(sig).into_string()); println!("{}", bs58::encode(sig).into_string());
} }
// Confirm the last client transaction by signature // Confirm the last client transaction by signature
@ -295,12 +288,6 @@ fn read_leader(path: &str) -> Config {
serde_json::from_reader(file).unwrap_or_else(|_| panic!("failed to parse {}", path)) serde_json::from_reader(file).unwrap_or_else(|_| panic!("failed to parse {}", path))
} }
fn read_mint(path: &str) -> Result<Mint, Box<error::Error>> {
let file = File::open(path.to_string())?;
let mint = serde_json::from_reader(file)?;
Ok(mint)
}
fn mk_client(r: &NodeInfo) -> io::Result<ThinClient> { fn mk_client(r: &NodeInfo) -> io::Result<ThinClient> {
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();
@ -318,7 +305,7 @@ fn mk_client(r: &NodeInfo) -> io::Result<ThinClient> {
fn request_airdrop( fn request_airdrop(
drone_addr: &SocketAddr, drone_addr: &SocketAddr,
id: &Mint, id: &KeyPair,
tokens: u64, tokens: u64,
) -> Result<(), Box<error::Error>> { ) -> Result<(), Box<error::Error>> {
let mut stream = TcpStream::connect(drone_addr)?; let mut stream = TcpStream::connect(drone_addr)?;