From 40c50aef509918d451027e7d72321c0071a5fa5d Mon Sep 17 00:00:00 2001 From: Robert Kelly Date: Wed, 9 May 2018 00:03:05 -0400 Subject: [PATCH] deterministic random wallet generationg --- src/bin/client-demo.rs | 17 ++++++++++++++--- src/bin/genesis-demo.rs | 17 ++++++++++++++--- src/bin/mint-demo.rs | 14 +------------- src/mint.rs | 2 +- src/signature.rs | 31 +++++++++++++++++++++++++++++++ 5 files changed, 61 insertions(+), 20 deletions(-) diff --git a/src/bin/client-demo.rs b/src/bin/client-demo.rs index 013e029300..bc895d5755 100644 --- a/src/bin/client-demo.rs +++ b/src/bin/client-demo.rs @@ -11,7 +11,7 @@ use getopts::Options; use isatty::stdin_isatty; use rayon::prelude::*; use solana::mint::MintDemo; -use solana::signature::{KeyPair, KeyPairUtil}; +use solana::signature::{GenKeys, KeyPair, KeyPairUtil}; use solana::thin_client::ThinClient; use solana::transaction::Transaction; use std::env; @@ -93,9 +93,20 @@ fn main() { let last_id = acc.get_last_id().wait().unwrap(); println!("Got last ID {:?}", last_id); + let rnd = GenKeys::new(demo.mint.keypair().public_key_bytes()); + let tokens_per_user = 1_000; + + let users: Vec<_> = (0..demo.num_accounts) + .into_par_iter() + .map(|_| { + let pkcs8 = rnd.new_key(); + (pkcs8, tokens_per_user) + }) + .collect(); + println!("Creating keypairs..."); - let txs = demo.users.len() / 2; - let keypairs: Vec<_> = demo.users + let txs = users.len() / 2; + let keypairs: Vec<_> = users .into_par_iter() .map(|(pkcs8, _)| KeyPair::from_pkcs8(Input::from(&pkcs8)).unwrap()) .collect(); diff --git a/src/bin/genesis-demo.rs b/src/bin/genesis-demo.rs index 68c10b9928..dd9ef3b717 100644 --- a/src/bin/genesis-demo.rs +++ b/src/bin/genesis-demo.rs @@ -11,7 +11,7 @@ use solana::accountant::MAX_ENTRY_IDS; use solana::entry::{create_entry, next_tick}; use solana::event::Event; use solana::mint::MintDemo; -use solana::signature::{KeyPair, KeyPairUtil}; +use solana::signature::{GenKeys, KeyPair, KeyPairUtil}; use solana::transaction::Transaction; use std::io::{stdin, Read}; use std::process::exit; @@ -36,12 +36,23 @@ fn main() { exit(1); }); - let num_accounts = demo.users.len(); + let rnd = GenKeys::new(demo.mint.keypair().public_key_bytes()); + let tokens_per_user = 1_000; + + let users: Vec<_> = (0..demo.num_accounts) + .into_iter() + .map(|_| { + let pkcs8 = rnd.new_key(); + (pkcs8, tokens_per_user) + }) + .collect(); + + let num_accounts = users.len(); let last_id = demo.mint.last_id(); let mint_keypair = demo.mint.keypair(); eprintln!("Signing {} transactions...", num_accounts); - let events: Vec<_> = demo.users + let events: Vec<_> = users .into_par_iter() .map(|(pkcs8, tokens)| { let rando = KeyPair::from_pkcs8(Input::from(&pkcs8)).unwrap(); diff --git a/src/bin/mint-demo.rs b/src/bin/mint-demo.rs index 1127ce19b5..0054c21f66 100644 --- a/src/bin/mint-demo.rs +++ b/src/bin/mint-demo.rs @@ -3,10 +3,7 @@ extern crate ring; extern crate serde_json; extern crate solana; -use rayon::prelude::*; -use ring::rand::SystemRandom; use solana::mint::{Mint, MintDemo}; -use solana::signature::KeyPair; use std::io; fn main() { @@ -18,16 +15,7 @@ fn main() { let mint = Mint::new(tokens); let tokens_per_user = 1_000; let num_accounts = tokens / tokens_per_user; - let rnd = SystemRandom::new(); - let users: Vec<_> = (0..num_accounts) - .into_par_iter() - .map(|_| { - let pkcs8 = KeyPair::generate_pkcs8(&rnd).unwrap().to_vec(); - (pkcs8, tokens_per_user) - }) - .collect(); - - let demo = MintDemo { mint, users }; + let demo = MintDemo { mint, num_accounts }; println!("{}", serde_json::to_string(&demo).unwrap()); } diff --git a/src/mint.rs b/src/mint.rs index 754cacaa41..86511aa4a6 100644 --- a/src/mint.rs +++ b/src/mint.rs @@ -61,7 +61,7 @@ impl Mint { #[derive(Serialize, Deserialize, Debug)] pub struct MintDemo { pub mint: Mint, - pub users: Vec<(Vec, i64)>, + pub num_accounts: i64, } #[cfg(test)] diff --git a/src/signature.rs b/src/signature.rs index 1b01e14ef5..d7f2bb0cfb 100644 --- a/src/signature.rs +++ b/src/signature.rs @@ -2,8 +2,13 @@ use generic_array::typenum::{U32, U64}; use generic_array::GenericArray; +use rand::{ChaChaRng, Rng, SeedableRng}; +use ring::error::Unspecified; +use ring::rand::SecureRandom; use ring::signature::Ed25519KeyPair; use ring::{rand, signature}; +use std::mem; +use std::sync::RwLock; use untrusted; pub type KeyPair = Ed25519KeyPair; @@ -41,3 +46,29 @@ impl SignatureUtil for GenericArray { signature::verify(&signature::ED25519, peer_public_key, msg, sig).is_ok() } } + +pub struct GenKeys { + generator: RwLock, +} + +impl GenKeys { + pub fn new(seed_values: &[u8]) -> GenKeys { + let seed: &[u8] = &seed_values[..]; + let rng: ChaChaRng = SeedableRng::from_seed(unsafe { mem::transmute(seed) }); + GenKeys { + generator: RwLock::new(rng), + } + } + + pub fn new_key(&self) -> Vec { + KeyPair::generate_pkcs8(self).unwrap().to_vec() + } +} + +impl SecureRandom for GenKeys { + fn fill(&self, dest: &mut [u8]) -> Result<(), Unspecified> { + let mut rng = self.generator.write().unwrap(); + rng.fill_bytes(dest); + Ok(()) + } +}