feat: add bit-address-rs
This commit is contained in:
218
bit-address-rs/Cargo.lock
generated
Normal file
218
bit-address-rs/Cargo.lock
generated
Normal file
@@ -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"
|
||||||
16
bit-address-rs/Cargo.toml
Normal file
16
bit-address-rs/Cargo.toml
Normal file
@@ -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"
|
||||||
117
bit-address-rs/src/main.rs
Normal file
117
bit-address-rs/src/main.rs
Normal file
@@ -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<String> = 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::<u64>())
|
||||||
|
.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::<u64>())
|
||||||
|
.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<String>, continue_on_found: bool, loop_count: u64, ind: u64, the_stop_flag: Arc<Mutex<bool>>) {
|
||||||
|
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::<u8>::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<u8> {
|
||||||
|
let mut hasher = Sha256::default();
|
||||||
|
hasher.update(i);
|
||||||
|
hasher.finalize().to_vec()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn calc_ripemd160(i: &[u8]) -> Vec<u8> {
|
||||||
|
let mut hasher = Ripemd160::default();
|
||||||
|
hasher.update(i);
|
||||||
|
hasher.finalize().to_vec()
|
||||||
|
}
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
bit-address-rs
|
||||||
commit-msg-rs
|
commit-msg-rs
|
||||||
decrypt-rs
|
decrypt-rs
|
||||||
makepassword-rs
|
makepassword-rs
|
||||||
|
|||||||
Reference in New Issue
Block a user