Git Product home page Git Product logo

nostr_vanity_npub's Introduction

Nostr Vanity npub Generator

Python-based brute-force search for a given vanity npub target.

Example 1

python3 vanity_npub.py h0dl

Searches for an npub that starts with:

npub1 h0dl 023acd...

On success, it will print:

371,748 | 37.2s | npub1h0dl0dkjp884wz3wd30ucvfvdfvfdzp626hlvp68v0lfngnscdjsuy8yqm

        ****************************************************************************
        Private key: nsec1uu85rpk7sw2u2vrr6s9vlyvt4u58tcnluelm48a3fuytytvt4lnsa7pe0e
        ****************************************************************************

This reports the number of npubs it brute-force generated in order to find one with a matching prefix, the elapsed time in seconds, the successful npub, and its associated private key/nsec.

Example 2

Search for "h0dl" at the beginning or the end of the npub:

python3 vanity_npub.py -e h0dl
> 1,026,042 | 103.0s | npub1y3ukxwznzysahdpnhrzgntal8kvmmd7uhx3k6klzzvaemm6nmwdse9h0dl

Example 3

Search for "h0dl" or "sat0shi":

# Exits on whichever one it finds first
python3 vanity_npub.py h0dl,sat0shi

Example 4

Spend a lot of time searching for "nakam0t0", but along the way note any "h0dler" or "h0rnet" bonus matches:

python3 vanity_npub.py nakam0t0 -b h0dler,h0rnet

Usage

usage: vanity_npub.py [-h] [-b BONUS_TARGETS] [-e] [-j NUM_JOBS] targets

********************** Nostr vanity pubkey generator **********************

Search for `target` in an npub such that:

        npub1[target]acd023...

positional arguments:
  targets               The string(s) you're looking for (comma-separated, no spaces)

optional arguments:
  -h, --help            show this help message and exit
  -b BONUS_TARGETS, --bonus_targets BONUS_TARGETS
                        Additional targets to search for, but does not end execution when found (comma-separated, no spaces)
  -e, --include-end     Also search the end of the npub
  -j NUM_JOBS, --jobs NUM_JOBS
                        Number of threads (default: 2)

Limitations

npubs can only include characters from the bech32 list:

023456789acdefghjklmnpqrstuvwxyz

You'll get an error if you enter a vanity target that includes an unsupported character.

python vanity_npub.py bitcoin
> ERROR: "b" is not a valid character (not in the bech32 charset)
>         bech32 chars: 023456789acdefghjklmnpqrstuvwxyz

Search is exponential!

I can't do the probability math, but searching for a target string that's 6-chars long is exponentially harder than finding one that's 5-chars long. And then a target string that's 7-chars long is exponentially harder than 6. And so on.

At 8 or 9+ characters you're going to need a considerable amount of work to yield a match. Days? Weeks?

Search is random!

You may have found a 5-character npub in 200s but the exact same 5-character target could take you 10x longer on the next run. It's just like bitcoin mining; the probabilities are one thing but there are no guarantees about your luck in any given run.

Also note that you can stop a vanity npub search and restart it later. You're not wasting any work; it'll just keep searching new random npubs when you resume.

Performance

A 5-char vanity target could easily take tens of millions of tries. 6-char targets are in the hundreds of millions of tries. The script outputs an update at each million npubs tried so you can get a sense of your machine's guessing rate.

It's also to your advantage to add additional targets or bonus_targets. You're already doing the work to generate a random npub so you may as well check it for more than one possible match. Each extra term only adds minimal additional effort.

The biggest speed gain is to just open multiple terminal sessions and run an instance of vanity_npub.py in each one. Each instance will add more burden on the CPU but they don't seem to impact each others' performance much, as long as your CPU isn't completely slammed.

The built-in attempt to leverage multithreading using the -j command line option yielded only modest gains. Perhaps future improvements could make this more effective.

M1 Macbook Pro showed no benefit from multithreading (j=1 or j=2) at around 104s/mil tries. Slowed down beyond j=2.

# -j 1 or -j 2
1876.9s: Tried 18,000,000 npubs so far
1981.2s: Tried 19,000,000 npubs so far (105s / mil)
2085.5s: Tried 20,000,000 npubs so far (104s / mil)
2189.9s: Tried 21,000,000 npubs so far (104s / mil)

An older 8-core Ryzen 7 ran slightly faster at j=2 at around 160s/mil. Slowed down beyond j=2.

Is this secure?

Quick version: No, you shouldn't blindly trust any private key generator you found online.

Long version: Assuming the pk calcs are trustworthy, it won't matter if two people search for the same vanity prefix. For example:

python3 vanity_npub.py hfsp
> 365,386 | 36.3s | npub1hfspw0hcddc9k058ap4frvsexlykqzw3k2cun9430hxdvg8z9evqp5wfc8
>
>         ****************************************************************************
>         Private key: nsec1d7smkrh9z8pn28lv6vm5ad736ms44wx84z405hsph6q7v3vqju0qqum9ak
>         ****************************************************************************

python3 vanity_npub.py hfsp
> 792,574 | 80.0s | npub1hfsp4ue6z0ykvjg99df6s2nvw7xzw9677wx70ydhdqegatf0qkcs4yqht7
>
>         ****************************************************************************
>         Private key: nsec1949kx7knea9tcug9906u0l787vkxuha0yymh0vuu9x8xqmqvalaqk6lutn
>         ****************************************************************************

The npub is 58-characters long (not including the "npub1" prefix). That is more than enough randomness to make it effectively impossible for any two people to yield the exact same complete npub when searching for the same vanity prefix.


Installation

Requires:

  • python3.6+
  • git

Clone this repo:

git clone https://github.com/kdmukai/nostr_vanity_npub.git
cd nostr_vanity_npub

Clone the python-nostr dependency:

git clone https://github.com/jeffthibault/python-nostr.git
pip install -e python-nostr

nostr_vanity_npub's People

Contributors

kdmukai avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

nostr_vanity_npub's Issues

Use GNU parallel to speed up

Example command:

parallel --halt now,success=1 -u -N0 python vanity_npub.py -j1 TARGET ::: {0..$(nproc)}

Explanation:

  • --halt now,success=1: stop all commands as soon as one of them returned success
  • -u: do not group output by commands
  • -N0: the command takes 0 argument (essentially, run the same command X times)
  • ::: {0..$(nproc)}: generate # of commands matches # of CPUs

Private key sometimes fails to print

The private key sometimes fails to print when the script finds a matching public key. This does not seem to happen with bonus keys. Printing the private key from within the thread before the exit event is called fixed the issue for me. I'd guess the process somehow exits before the private key is printed.

image

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.