More keygen
This commit is contained in:
committed by
Greg Fitzgerald
parent
b5006b8f2b
commit
cea29ed772
@ -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,
|
||||||
|
@ -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)
|
|
||||||
}
|
|
||||||
|
@ -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);
|
|
||||||
}
|
|
@ -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)?;
|
||||||
|
Reference in New Issue
Block a user