Просмотр исходного кода

bin: Implement vanity address search tool as threadpool experiment.

parazyd 4 лет назад
Родитель
Сommit
c89db12c71
5 измененных файлов с 132 добавлено и 22 удалено
  1. 2 1
      .gitignore
  2. 33 20
      Cargo.lock
  3. 2 1
      Cargo.toml
  4. 16 0
      bin/vanityaddr/Cargo.toml
  5. 79 0
      bin/vanityaddr/src/main.rs

+ 2 - 1
.gitignore

@@ -1,5 +1,6 @@
 *.pyc
 *.pyc
 *.sage.py
 *.sage.py
+.vscode/
 
 
 /target/*
 /target/*
 /proof/*.bin
 /proof/*.bin
@@ -11,4 +12,4 @@
 /gatewayd
 /gatewayd
 /ircd
 /ircd
 /map
 /map
-.vscode/
+/vanityaddr

+ 33 - 20
Cargo.lock

@@ -792,7 +792,7 @@ dependencies = [
  "async-trait",
  "async-trait",
  "bdk",
  "bdk",
  "bitcoin",
  "bitcoin",
- "clap 3.0.7",
+ "clap 3.1.6",
  "darkfi",
  "darkfi",
  "easy-parallel",
  "easy-parallel",
  "futures",
  "futures",
@@ -897,9 +897,9 @@ dependencies = [
 
 
 [[package]]
 [[package]]
 name = "clap"
 name = "clap"
-version = "3.0.7"
+version = "3.1.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "12e8611f9ae4e068fa3e56931fded356ff745e70987ff76924a6e0ab1c8ef2e3"
+checksum = "d8c93436c21e4698bacadf42917db28b23017027a4deccb35dbe47a7e7840123"
 dependencies = [
 dependencies = [
  "atty",
  "atty",
  "bitflags",
  "bitflags",
@@ -909,14 +909,14 @@ dependencies = [
  "os_str_bytes",
  "os_str_bytes",
  "strsim 0.10.0",
  "strsim 0.10.0",
  "termcolor",
  "termcolor",
- "textwrap 0.14.2",
+ "textwrap 0.15.0",
 ]
 ]
 
 
 [[package]]
 [[package]]
 name = "clap_derive"
 name = "clap_derive"
-version = "3.0.6"
+version = "3.1.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "517358c28fcef6607bf6f76108e02afad7e82297d132a6b846dcc1fc3efcd153"
+checksum = "da95d038ede1a964ce99f49cbe27a7fb538d1da595e4b4f70b8c8f338d17bf16"
 dependencies = [
 dependencies = [
  "heck 0.4.0",
  "heck 0.4.0",
  "proc-macro-error",
  "proc-macro-error",
@@ -1346,7 +1346,7 @@ dependencies = [
  "async-executor",
  "async-executor",
  "async-std",
  "async-std",
  "async-trait",
  "async-trait",
- "clap 3.0.7",
+ "clap 3.1.6",
  "darkfi",
  "darkfi",
  "easy-parallel",
  "easy-parallel",
  "futures",
  "futures",
@@ -1392,7 +1392,7 @@ dependencies = [
  "blake2b_simd 1.0.0",
  "blake2b_simd 1.0.0",
  "bs58",
  "bs58",
  "bytes",
  "bytes",
- "clap 3.0.7",
+ "clap 3.1.6",
  "crypto_api_chachapoly",
  "crypto_api_chachapoly",
  "dirs 4.0.0",
  "dirs 4.0.0",
  "fast-socks5",
  "fast-socks5",
@@ -1437,7 +1437,7 @@ dependencies = [
  "async-executor",
  "async-executor",
  "async-std",
  "async-std",
  "async-trait",
  "async-trait",
- "clap 3.0.7",
+ "clap 3.1.6",
  "darkfi",
  "darkfi",
  "easy-parallel",
  "easy-parallel",
  "log",
  "log",
@@ -1674,7 +1674,7 @@ version = "0.3.0"
 dependencies = [
 dependencies = [
  "async-channel",
  "async-channel",
  "async-std",
  "async-std",
- "clap 3.0.7",
+ "clap 3.1.6",
  "darkfi",
  "darkfi",
  "easy-parallel",
  "easy-parallel",
  "log",
  "log",
@@ -1700,7 +1700,7 @@ name = "drk"
 version = "0.3.0"
 version = "0.3.0"
 dependencies = [
 dependencies = [
  "async-std",
  "async-std",
- "clap 3.0.7",
+ "clap 3.1.6",
  "darkfi",
  "darkfi",
  "log",
  "log",
  "prettytable-rs",
  "prettytable-rs",
@@ -2206,7 +2206,7 @@ dependencies = [
  "async-channel",
  "async-channel",
  "async-executor",
  "async-executor",
  "async-std",
  "async-std",
- "clap 3.0.7",
+ "clap 3.1.6",
  "darkfi",
  "darkfi",
  "easy-parallel",
  "easy-parallel",
  "log",
  "log",
@@ -2651,7 +2651,7 @@ dependencies = [
  "async-executor",
  "async-executor",
  "async-std",
  "async-std",
  "async-trait",
  "async-trait",
- "clap 3.0.7",
+ "clap 3.1.6",
  "darkfi",
  "darkfi",
  "easy-parallel",
  "easy-parallel",
  "futures",
  "futures",
@@ -4208,9 +4208,9 @@ dependencies = [
 
 
 [[package]]
 [[package]]
 name = "serde_json"
 name = "serde_json"
-version = "1.0.75"
+version = "1.0.79"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c059c05b48c5c0067d4b4b2b4f0732dd65feb52daf7e0ea09cd87e7dadc1af79"
+checksum = "8e8d9fa5c3b304765ce1fd9c4c8a3de2c8db365a5b91be52f186efc675681d95"
 dependencies = [
 dependencies = [
  "itoa 1.0.1",
  "itoa 1.0.1",
  "ryu",
  "ryu",
@@ -5282,7 +5282,7 @@ dependencies = [
  "async-std",
  "async-std",
  "async-trait",
  "async-trait",
  "chrono",
  "chrono",
- "clap 3.0.7",
+ "clap 3.1.6",
  "darkfi",
  "darkfi",
  "easy-parallel",
  "easy-parallel",
  "futures",
  "futures",
@@ -5303,7 +5303,7 @@ dependencies = [
  "async-std",
  "async-std",
  "async-trait",
  "async-trait",
  "chrono",
  "chrono",
- "clap 3.0.7",
+ "clap 3.1.6",
  "darkfi",
  "darkfi",
  "futures",
  "futures",
  "log",
  "log",
@@ -5382,9 +5382,9 @@ dependencies = [
 
 
 [[package]]
 [[package]]
 name = "textwrap"
 name = "textwrap"
-version = "0.14.2"
+version = "0.15.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0066c8d12af8b5acd21e00547c3797fde4e8677254a7ee429176ccebbe93dd80"
+checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb"
 
 
 [[package]]
 [[package]]
 name = "thiserror"
 name = "thiserror"
@@ -5719,6 +5719,19 @@ dependencies = [
  "version_check",
  "version_check",
 ]
 ]
 
 
+[[package]]
+name = "vanityaddr"
+version = "0.3.0"
+dependencies = [
+ "bs58",
+ "clap 3.1.6",
+ "darkfi",
+ "num_cpus",
+ "rand 0.8.5",
+ "rayon",
+ "serde_json",
+]
+
 [[package]]
 [[package]]
 name = "vcpkg"
 name = "vcpkg"
 version = "0.2.15"
 version = "0.2.15"
@@ -6071,7 +6084,7 @@ dependencies = [
 name = "zkas"
 name = "zkas"
 version = "0.3.0"
 version = "0.3.0"
 dependencies = [
 dependencies = [
- "clap 3.0.7",
+ "clap 3.1.6",
  "darkfi",
  "darkfi",
 ]
 ]
 
 

+ 2 - 1
Cargo.toml

@@ -23,7 +23,8 @@ members = [
     "bin/daod",
     "bin/daod",
     "bin/dao-cli",
     "bin/dao-cli",
     "bin/taud",
     "bin/taud",
-    "bin/tau-cli"
+    "bin/tau-cli",
+    "bin/vanityaddr",
 ]
 ]
 
 
 [dependencies]
 [dependencies]

+ 16 - 0
bin/vanityaddr/Cargo.toml

@@ -0,0 +1,16 @@
+[package]
+name = "vanityaddr"
+version = "0.3.0"
+edition = "2021"
+
+[dependencies]
+clap = {version = "3.1.6", features = ["derive"]}
+bs58 = "0.4.0"
+num_cpus = "1.13.1"
+rand = "0.8.5"
+rayon = "1.5.1"
+serde_json = "1.0.79"
+
+[dependencies.darkfi]
+path = "../../"
+features = ["crypto", "util"]

+ 79 - 0
bin/vanityaddr/src/main.rs

@@ -0,0 +1,79 @@
+use clap::Parser;
+use darkfi::{
+    crypto::{
+        address::Address,
+        keypair::{Keypair, SecretKey},
+    },
+    Error, Result,
+};
+use rand::rngs::OsRng;
+use rayon::prelude::*;
+use serde_json::json;
+
+#[derive(Parser)]
+#[clap(version)]
+struct Args {
+    /// Prefix to search (must start with 1)
+    prefix: String,
+}
+
+struct DrkAddr {
+    pub secret: SecretKey,
+    pub address: String,
+}
+
+impl DrkAddr {
+    pub fn new() -> Self {
+        let kp = Keypair::random(&mut OsRng);
+        let addr = Address::from(kp.public);
+
+        Self { secret: kp.secret, address: format!("{}", addr) }
+    }
+
+    pub fn starts_with(&self, prefix: &str, is_case_sensitive: bool) -> bool {
+        if is_case_sensitive {
+            self.address.starts_with(prefix)
+        } else {
+            self.address.to_lowercase().starts_with(prefix.to_lowercase().as_str())
+        }
+    }
+}
+
+fn main() -> Result<()> {
+    let args = Args::parse();
+
+    if args.prefix.chars().next() != Some('1') {
+        return Err(Error::ParseFailed("Address prefix must start with '1'"))
+    }
+
+    let is_case_sensitive = false;
+
+    // Check if prefix is valid base58
+    match bs58::decode(args.prefix.clone()).into_vec() {
+        Ok(_) => {}
+        Err(_) => return Err(Error::ParseFailed("Invalid base58 for prefix")),
+    };
+
+    // Threadpool
+    let num_threads = num_cpus::get();
+    let rayon_pool = rayon::ThreadPoolBuilder::new()
+        .num_threads(num_threads)
+        .build()
+        .expect("Unable to create threadpool");
+
+    let drkaddr: DrkAddr = rayon_pool.install(|| {
+        rayon::iter::repeat(DrkAddr::new)
+            .map(|create| create())
+            .find_any(|address| address.starts_with(&args.prefix, is_case_sensitive))
+            .expect("Failed to find an address match")
+    });
+
+    let result = json!({
+        "secret_key": format!("{:?}", drkaddr.secret.0),
+        "address": drkaddr.address,
+    });
+
+    println!("{}", result);
+
+    Ok(())
+}