### コマンドライン引数の書き方
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