main.rs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. use clap::Parser;
  2. use darkfi::{
  3. crypto::{
  4. address::Address,
  5. keypair::{Keypair, SecretKey},
  6. },
  7. Error, Result,
  8. };
  9. use rand::rngs::OsRng;
  10. use rayon::prelude::*;
  11. use serde_json::json;
  12. #[derive(Parser)]
  13. #[clap(version)]
  14. struct Args {
  15. /// Prefix to search (must start with 1)
  16. prefix: String,
  17. }
  18. struct DrkAddr {
  19. pub secret: SecretKey,
  20. pub address: String,
  21. }
  22. impl DrkAddr {
  23. pub fn new() -> Self {
  24. let kp = Keypair::random(&mut OsRng);
  25. let addr = Address::from(kp.public);
  26. Self { secret: kp.secret, address: format!("{}", addr) }
  27. }
  28. pub fn starts_with(&self, prefix: &str, is_case_sensitive: bool) -> bool {
  29. if is_case_sensitive {
  30. self.address.starts_with(prefix)
  31. } else {
  32. self.address.to_lowercase().starts_with(prefix.to_lowercase().as_str())
  33. }
  34. }
  35. }
  36. fn main() -> Result<()> {
  37. let args = Args::parse();
  38. if !args.prefix.starts_with('1') {
  39. return Err(Error::ParseFailed("Address prefix must start with '1'"))
  40. }
  41. let is_case_sensitive = false;
  42. // Check if prefix is valid base58
  43. match bs58::decode(args.prefix.clone()).into_vec() {
  44. Ok(_) => {}
  45. Err(_) => return Err(Error::ParseFailed("Invalid base58 for prefix")),
  46. };
  47. // Threadpool
  48. let num_threads = num_cpus::get();
  49. let rayon_pool = rayon::ThreadPoolBuilder::new()
  50. .num_threads(num_threads)
  51. .build()
  52. .expect("Unable to create threadpool");
  53. let drkaddr: DrkAddr = rayon_pool.install(|| {
  54. rayon::iter::repeat(DrkAddr::new)
  55. .map(|create| create())
  56. .find_any(|address| address.starts_with(&args.prefix, is_case_sensitive))
  57. .expect("Failed to find an address match")
  58. });
  59. let result = json!({
  60. "secret_key": format!("{:?}", drkaddr.secret.0),
  61. "address": drkaddr.address,
  62. });
  63. println!("{}", result);
  64. Ok(())
  65. }