From 0946d22fd926c256346ce29a96d9359f7ccff9d0 Mon Sep 17 00:00:00 2001 From: Hatter Jiang Date: Sun, 19 Apr 2020 23:16:36 +0800 Subject: [PATCH] make btc address --- btc-address/Cargo.lock | 8 +++++++ btc-address/Cargo.toml | 2 ++ btc-address/src/main.rs | 50 +++++++++++++++++++++++++++++++++++------ 3 files changed, 53 insertions(+), 7 deletions(-) diff --git a/btc-address/Cargo.lock b/btc-address/Cargo.lock index b72f76f..4687d42 100644 --- a/btc-address/Cargo.lock +++ b/btc-address/Cargo.lock @@ -33,10 +33,18 @@ dependencies = [ "byte-tools", ] +[[package]] +name = "bs58" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b170cd256a3f9fa6b9edae3e44a7dfdfc77e8124dbc3e2612d75f9c3e2396dae" + [[package]] name = "btc-address" version = "0.1.0" dependencies = [ + "bs58", + "digest", "hex", "rand", "ripemd160", diff --git a/btc-address/Cargo.toml b/btc-address/Cargo.toml index aa04dcb..7184eb4 100644 --- a/btc-address/Cargo.toml +++ b/btc-address/Cargo.toml @@ -8,10 +8,12 @@ edition = "2018" [dependencies] hex = "0.4" +bs58 = "0.3.0" secp256k1 = { version = "0.17.2", features = ["rand"] } rand = "0.6" # elliptic-curve = "0.3.0" # k256 = "0.1.0" +digest = "0.8.1" ripemd160 = "0.8.0" sha2 = "0.8.1" diff --git a/btc-address/src/main.rs b/btc-address/src/main.rs index 5f4a705..12a43eb 100644 --- a/btc-address/src/main.rs +++ b/btc-address/src/main.rs @@ -1,14 +1,50 @@ use rand::rngs::OsRng; -use secp256k1::Secp256k1; +use secp256k1::{Secp256k1, key::PublicKey, }; +use sha2::Sha256; +use ripemd160::Ripemd160; +use digest::{ Input, FixedOutput, }; fn main() { - println!("Hello, world!"); - let secp = Secp256k1::new(); let mut rng = OsRng::new().expect("OsRng"); - let (secret_key, public_key) = secp.generate_keypair(&mut rng); - println!("{}", secret_key); - println!("{}", public_key); - println!("{}", hex::encode(public_key.serialize_uncompressed().to_vec())); + for i in 0..1_000_000 { + let (secret_key, public_key) = secp.generate_keypair(&mut rng); + + let s = make_btc_address(&public_key); + + if i > 0 && i % 10000 == 0 { + println!("> {}", i); + } + if s.starts_with("100") { + println!("{}", s); + println!("{}", secret_key); + } + } +} + +fn make_btc_address(public_key: &PublicKey) -> String { + let public_key_bytes = public_key.serialize_uncompressed().to_vec(); + let riphemd160_sha256_pub_key = calc_ripemd160(&calc_sha256(&public_key_bytes)); + + let mut btc_addr = Vec::::with_capacity(25); + btc_addr.push(0x00 as u8); + btc_addr.extend_from_slice(&riphemd160_sha256_pub_key); + + let chcksum = &calc_sha256(&calc_sha256(&btc_addr))[0..4]; + btc_addr.extend_from_slice(chcksum); + + bs58::encode(&btc_addr).into_string() +} + +fn calc_sha256(i: &[u8]) -> Vec { + let mut hasher = Sha256::default(); + hasher.input(&i); + hasher.fixed_result().to_vec() +} + +fn calc_ripemd160(i: &[u8]) -> Vec { + let mut hasher = Ripemd160::default(); + hasher.input(&i); + hasher.fixed_result().to_vec() }