//! A command-line executable for generating the chain's genesis block. extern crate atty; #[macro_use] extern crate clap; extern crate serde_json; extern crate solana; extern crate solana_sdk; extern crate untrusted; use clap::{App, Arg}; use solana::fullnode::Config; use solana::ledger::LedgerWriter; use solana::mint::Mint; use solana_sdk::signature::KeypairUtil; use std::error; use std::fs::File; use std::path::Path; /** * Bootstrap leader gets two tokens: * - one token to create an instance of the vote_program with * - one second token to keep the node identity public key valid */ pub const BOOTSTRAP_LEADER_TOKENS: u64 = 2; fn main() -> Result<(), Box> { let matches = App::new("solana-genesis") .version(crate_version!()) .arg( Arg::with_name("num_tokens") .short("t") .long("num_tokens") .value_name("TOKENS") .takes_value(true) .required(true) .help("Number of tokens to create in the mint"), ).arg( Arg::with_name("mint") .short("m") .long("mint") .value_name("MINT") .takes_value(true) .required(true) .help("Path to file containing keys of the mint"), ).arg( Arg::with_name("bootstrap_leader") .short("b") .long("bootstrap_leader") .value_name("BOOTSTRAP LEADER") .takes_value(true) .required(true) .help("Path to file containing keys of the bootstrap leader"), ).arg( Arg::with_name("ledger") .short("l") .long("ledger") .value_name("DIR") .takes_value(true) .required(true) .help("Use directory as persistent ledger location"), ).get_matches(); // Parse the input leader configuration let file = File::open(Path::new(&matches.value_of("bootstrap_leader").unwrap())).unwrap(); let leader_config: Config = serde_json::from_reader(file).unwrap(); let leader_keypair = leader_config.keypair(); // Parse the input mint configuration let num_tokens = value_t_or_exit!(matches, "num_tokens", u64); let file = File::open(Path::new(&matches.value_of("mint").unwrap())).unwrap(); let pkcs8: Vec = serde_json::from_reader(&file)?; let mint = Mint::new_with_pkcs8( num_tokens, pkcs8, leader_keypair.pubkey(), BOOTSTRAP_LEADER_TOKENS, ); // Write the ledger entries let ledger_path = matches.value_of("ledger").unwrap(); let mut ledger_writer = LedgerWriter::open(&ledger_path, true)?; ledger_writer.write_entries(&mint.create_entries())?; Ok(()) }