diff --git a/bit-address-rs/Cargo.lock b/bit-address-rs/Cargo.lock new file mode 100644 index 0000000..b008285 --- /dev/null +++ b/bit-address-rs/Cargo.lock @@ -0,0 +1,218 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "bit-address-rs" +version = "0.1.0" +dependencies = [ + "bs58", + "digest", + "hex", + "num_cpus", + "rand", + "ripemd", + "secp256k1", + "sha2", +] + +[[package]] +name = "block-buffer" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bs58" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" + +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cpufeatures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "digest" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "generic-array" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "hermit-abi" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" +dependencies = [ + "libc", +] + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "libc" +version = "0.2.139" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" + +[[package]] +name = "num_cpus" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "ripemd" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" +dependencies = [ + "digest", +] + +[[package]] +name = "secp256k1" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4124a35fe33ae14259c490fd70fa199a32b9ce9502f2ee6bc4f81ec06fa65894" +dependencies = [ + "rand", + "secp256k1-sys", +] + +[[package]] +name = "secp256k1-sys" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "642a62736682fdd8c71da0eb273e453c8ac74e33b9fb310e22ba5b03ec7651ff" +dependencies = [ + "cc", +] + +[[package]] +name = "sha2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "typenum" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" diff --git a/bit-address-rs/Cargo.toml b/bit-address-rs/Cargo.toml new file mode 100644 index 0000000..38da592 --- /dev/null +++ b/bit-address-rs/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "bit-address-rs" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +bs58 = "0.4.0" +digest = "0.10.6" +hex = "0.4.3" +num_cpus = "1.15.0" +rand = "0.8.5" +ripemd = "0.1.3" +secp256k1 = { version = "0.26.0", features = ["rand"] } +sha2 = "0.10.6" diff --git a/bit-address-rs/src/main.rs b/bit-address-rs/src/main.rs new file mode 100644 index 0000000..d65f95f --- /dev/null +++ b/bit-address-rs/src/main.rs @@ -0,0 +1,117 @@ +#!/usr/bin/env runrs + +//! ```cargo +//! [dependencies] +//! bs58 = "0.4.0" +//! digest = "0.10.6" +//! hex = "0.4.3" +//! num_cpus = "1.15.0" +//! rand = "0.8.5" +//! ripemd = "0.1.3" +//! secp256k1 = { version = "0.26.0", features = ["rand"] } +//! sha2 = "0.10.6" +//! ``` + +use std::{sync::{Arc, Mutex}, thread}; + +use digest::{Digest}; +use rand::rngs::OsRng; +use ripemd::Ripemd160; +use secp256k1::{PublicKey, Secp256k1}; +use sha2::Sha256; + +fn main() { + let args = std::env::args(); + if args.len() <= 1 { + println!("[ERROR] Need at least one argument, e.g. 1Hatter 1UTF8 ..."); + return; + } + let continue_on_found = std::env::var("CONTINUE_ON_FOUND") + .map(|c| c.to_lowercase()) + .map(|c| c == "1" || c == "true" || c == "yes" || c == "on") + .unwrap_or_else(|_| false); + let prefixes: Vec = args.skip(1).collect(); + println!("Prefixes: {:?}", prefixes); + if continue_on_found { + println!("CONTINUE_ON_FOUND is ON"); + } else { + println!("CONTINUE_ON_FOUND is OFF"); + } + let loop_count = std::env::var("LOOP_COUNT") + .map(|c| c.parse::()) + .unwrap_or_else(|_| Ok(10_000_000_u64)) + .unwrap_or_else(|_| 10_000_000_u64); + println!("LOOP_COUNT={}", loop_count); + let num_of_vcpus = num_cpus::get(); + let num_of_phycpus = num_cpus::get_physical(); + println!("You have {} vCPUs, from {} phyCPUs", num_of_vcpus, num_of_phycpus); + let concurrent_count = std::env::var("CONCURRENT_COUNT") + .map(|c| c.parse::()) + .unwrap_or_else(|_| Ok(num_of_phycpus as u64)) + .unwrap_or_else(|_| 1_u64); + println!("CONCURRENT_COUNT={}", concurrent_count); + let stop_flag = Arc::new(Mutex::new(false)); + let mut handles = vec![]; + for ind in 0..concurrent_count { + println!("- Running task {} of {}", ind, concurrent_count); + let the_stop_flag = Arc::clone(&stop_flag); + let prefixes = prefixes.clone(); + let child = thread::spawn(move || { + run_one_task(prefixes, continue_on_found, loop_count, ind, the_stop_flag); + }); + handles.push(child); + } + while let Some(h) = handles.pop() { + h.join().unwrap(); + } + println!("Finished!"); +} + +fn run_one_task(prefixes: Vec, continue_on_found: bool, loop_count: u64, ind: u64, the_stop_flag: Arc>) { + let secp = Secp256k1::new(); + let mut rng = OsRng::default(); + for i in 0..loop_count { + let (secret_key, public_key) = secp.generate_keypair(&mut rng); + let s = make_btc_address(&public_key); + if i % 1_000 == 0 { + if *the_stop_flag.lock().unwrap() { + return; + } + if i > 0 && i % 100_000 == 0 { + println!("> {} - {}", ind, i); + } + } + if prefixes.iter().any(|p| s.starts_with(p)) { + println!(">> {}\n{}", s, secret_key.display_secret()); + if !continue_on_found { + *the_stop_flag.lock().unwrap() = true; + break; + } + } + } +} + +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 checksum = &calc_sha256(&calc_sha256(&btc_addr))[0..4]; + btc_addr.extend_from_slice(checksum); + bs58::encode(&btc_addr).into_string() +} + +#[inline] +fn calc_sha256(i: &[u8]) -> Vec { + let mut hasher = Sha256::default(); + hasher.update(i); + hasher.finalize().to_vec() +} + +#[inline] +fn calc_ripemd160(i: &[u8]) -> Vec { + let mut hasher = Ripemd160::default(); + hasher.update(i); + hasher.finalize().to_vec() +} diff --git a/file-meta.txt b/file-meta.txt index 3e67100..a7071c0 100644 --- a/file-meta.txt +++ b/file-meta.txt @@ -1,3 +1,4 @@ +bit-address-rs commit-msg-rs decrypt-rs makepassword-rs