### コマンドライン引数の書き方
fn main() { let command_name = std::env::args().nth(0).unwrap_or("CLI".to_string()); let name = std::env::args().nth(1).unwrap_or("World".to_string()); println!("Hello {} via {}!", name, command_name); }
$ cargo run
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.04s
Running `target/debug/ruscal`
Hello World via target/debug/ruscal!
### 上記を応用する
fn main() { let args = App::parse(); match args.command { Command::Getnewaddress => getnewaddress(), } } fn getnewaddress() { address::get_address(); }
use p256::{ ecdsa::{SigningKey}, pkcs8::EncodePrivateKey, PublicKey,SecretKey}; use rand_core::{OsRng}; use std::{fs::File, io::Write, path::Path}; use ripemd::{Ripemd160}; use sha2::{Digest, Sha256}; pub fn get_address() { init_secret(); let contents = std::fs::read_to_string("./config/tmp.pem") .expect("something went wrong reading the file"); let secret_pem = contents.trim(); let secret_key = secret_pem.parse::<SecretKey>().unwrap(); let _private_key_serialized = hex::encode(&secret_key.to_bytes()); let public_key = secret_key.public_key(); let _public_key_serialized = hex::encode(&public_key.to_sec1_bytes()); let address = create_address(&public_key); println!("{}", address); } pub fn init_secret() { let path = Path::new("./config/tmp.pem"); if path.is_file() { // println!("The private key, public key, and address have already been created."); } else { let secret_key = SigningKey::random(&mut OsRng); let secret_key_serialized = secret_key .to_pkcs8_pem(Default::default()) .unwrap() .to_string(); let mut file = File::create("./config/tmp.pem").expect("file not found."); writeln!(file, "{}", secret_key_serialized).expect("can not write."); println!("created a private key."); } } pub fn create_address(public_key: &PublicKey) -> String { let vk = public_key.to_sec1_bytes(); let mut hasher = Sha256::new(); hasher.update(vk); let hashed_sha256 = hasher.finalize(); let mut hasher = Ripemd160::new(); hasher.update(hashed_sha256); let account_id = hasher.finalize(); let mut payload = account_id.to_vec(); payload.insert(0, 0x00); let mut hasher = Sha256::new(); hasher.update(&payload); let hash = hasher.finalize(); let mut hasher = Sha256::new(); hasher.update(hash); let checksum = hasher.finalize(); payload.append(&mut checksum[0..4].to_vec()); const ALPHABET: &str = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; let address = base_x::encode(ALPHABET, &payload); return address; }
$ cargo run getnewaddress
Compiling ruscal v0.1.0 (/home/vagrant/dev/rust/api)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.92s
Running `target/debug/ruscal getnewaddress`
1BnpTXdSbSgMZwWYq7cdU3LPSw1g4YhyHZ