How to Generate a Custom Bitcoin Review
How to Generate a Custom Bitcoin
medium.com
How to Generate a Custom Bitcoin Address on Ubuntu with an AMD GPU: My Hands-on Review, Guide, and FAQ
Ever wished your Bitcoin address started with your initials or brand—like 1COOL… or bc1qbest…—and wondered if it’s actually safe and worth the effort?
I went hands-on to find out. I tested the well-known approach inspired by Jameson Lopp’s write-up on my own Ubuntu rigs with AMD GPUs, cleaned up the rough edges, and built a simple, no-drama workflow you can follow. My goal: help you get a legit vanity address without tripping over outdated tools, flaky drivers, or risky security shortcuts.
You’ll get a clear plan, realistic expectations, and safety steps that protect your keys. I’ll also show you what’s possible versus what’s pure fantasy so you don’t waste days chasing an impossible prefix.
Quick spoiler: yes, you can get a great-looking address. Yes, security can be airtight. And yes, AMD on Ubuntu can be smooth—if you set it up the right way, once.
The common pains people hit
If you’ve tried this before, you’ve probably seen some of these:
- Confusing toolchains: Abandoned repos, forks with different flags, and build errors that send you down rabbit holes.
- AMD driver headaches: ROCm vs AMDGPU, OpenCL ICD files, kernel mismatches—one wrong step and the GPU “vanishes.”
- Wild speed claims: Screenshots promising instant 8–10 character wins that don’t hold up on real hardware.
- Security risks: Online generators, compromised machines, and “helpful” scripts that leak keys.
- Wallet friction: You land an address but your wallet hates the format, or you can’t cleanly import watch-only.
- Bech32 vs Taproot confusion: Lowercase rules, checksums, and uneven tool support for bc1q vs bc1p.
- Heat and power: Long runs that turn into space heaters if you don’t plan for cooling and costs.
What I promise in this guide
- A plain-English plan for generating a custom Bitcoin address—what “custom” actually means and what it doesn’t.
- Tools that still work today, the flags that matter, and how to avoid stale forks.
- Ubuntu + AMD setup that sticks: the clean path so your GPU shows up reliably every time.
- Realistic performance expectations: how prefix length affects search time, and when a GPU actually helps.
- Security steps that are worth it: offline generation, safe storage, and quick checks to confirm you own the address.
- Clear troubleshooting if something doesn’t build, run, or import on the first try.
Who this is for and what you’ll get
- If you’re a beginner (and can follow a few terminal commands), you’re covered with an easy workflow and a safety checklist.
- If you’re a tinkerer, you’ll get pattern tips, speed planning, and ways to push longer prefixes without wasting days.
- You’ll walk away with:
- A predictable setup on Ubuntu + AMD GPU that actually recognizes your hardware
- A short list of trusted tools and how to run them safely
- Practical speed estimates so you pick achievable patterns
- Steps to verify outputs and keep private keys locked down
If you’ve been thinking, “Is this really safe?” or “How long will a bc1qbrand prefix take on my GPU?”—you’re asking the right questions. I’ll answer them as we go and keep you out of the traps I see in forums and Discords every week.
Ready to set yourself up for a win before you press “go”? Up next, I’ll explain what “custom” actually means for Bitcoin addresses—and why some patterns are possible while others aren’t. Which prefix are you aiming for?
What a “custom” Bitcoin address really means
A “custom” or vanity address isn’t you picking the whole thing. You’re choosing a starting pattern you like, and the rest is still random because it must encode a valid keypair. Think of it like a personalized license plate: you get “STACK” at the start, but the car is still a real, safe car under the hood. The search tool churns through keys until one encodes to an address that begins with your pattern—and only then do you get a private key that actually matches it.
“Don’t trust—verify.” A cool prefix is fun, but the cryptography underneath stays the boss.
Address types and prefixes
Different Bitcoin address formats have different starting characters and different alphabets. Your vanity idea needs to fit the format you choose:
- P2PKH (legacy): starts with 1 (Base58Check)
Example: 1Elite… or 1HODL… - P2SH (legacy multisig and scripts): starts with 3 (Base58Check)
Example: 3SAFE… - bech32 SegWit (v0): starts with bc1q (bech32 alphabet, lowercase by convention)
Example: bc1qstack… - Taproot (SegWit v1): starts with bc1p (bech32m alphabet, lowercase by convention)
Example: bc1pzen7…
Wallet and exchange support is strongest for bc1q and still very good for 1 and 3. bc1p (Taproot) is widely supported now, but always confirm your wallet recognizes it before you commit to a long run.
Pattern rules that actually work
Your pattern has to respect the address alphabet and casing rules. If it doesn’t, no amount of GPU time will make it appear.
- Base58 (for 1… and 3…): allowed characters are
123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
There is no 0 (zero), no uppercase O, no uppercase I, and no lowercase l.
Reference: Base58Check - bech32 / bech32m (for bc1q… and bc1p…): data part uses the 32‑char set:
qpzry9x8gf2tvdw0s3jn54khce6mua7l (lowercase; no mixed case)
Addresses must be all lowercase (or all uppercase) and include a checksum at the end.
BIP‑0173 (bech32) • BIP‑0350 (bech32m)
Realistic examples you can actually search for:
- 1ELITE… (uppercase L is fine in Base58; lowercase l is not)
- 3SAFE…
- bc1qstack… (all letters are in the bech32 set)
- bc1pzen7… (numbers like 7 are fine in bech32; 1 only appears as the separator “bc1”)
Patterns that won’t work (and why):
- 1COOL… (uppercase O isn’t allowed in Base58; use lowercase o and avoid lowercase l)
- 3zero… (Base58 has no zero “0”)
- bc1qBitcoin… (bech32 can’t mix case, and letters like i and o aren’t in the bech32 set)
- bc1qlove… (o is not in the bech32 set)
Checksum note: while you can freely pick a start pattern that follows the alphabet rules, the address’s checksum means you can’t also demand an arbitrary end pattern. That last chunk is constrained by the math.
The math in simple terms
Every extra character multiplies the search space. That’s why short patterns are quick and long ones become a power bill.
- Base58 (1… / 3…): each chosen character is a 1 in 58 shot.
2 chars ≈ 58² = 3,364 tries; 4 chars ≈ 58⁴ ≈ 11.3M; 5 chars ≈ 58⁵ ≈ 656M. - bech32 (bc1q… / bc1p…): each chosen character is a 1 in 32 shot.
4 chars ≈ 32⁴ = 1,048,576; 6 chars ≈ 32⁶ = 1,073,741,824; 7 chars ≈ 32⁷ ≈ 34.36B.
The search is embarrassingly parallel, so GPUs help a lot as the pattern grows. But the curve is exponential—add one more character and your expected time often explodes by ~32x or ~58x depending on format.
Picking the right format for your vanity idea
Match your idea to the format that makes it readable, supported, and possible in a sane amount of time:
- Want maximum compatibility and shorter search times? Use bc1q patterns. The alphabet is friendly, and most modern wallets prefer SegWit addresses.
- Want Taproot features or future-forward branding? Pick bc1p—just make sure your wallet supports it end-to-end.
- Want uppercase aesthetics or classic vibes? Go with 1 or 3. Watch out for Base58 traps: avoid 0 (zero), O, I, and lowercase l.
- Keep it short and pronounceable. 4–6 characters is the sweet spot for most people. Longer strings climb fast in cost and time.
- Design around the alphabet.
- Base58-friendly examples: 1HODL…, 3SAFE…, 1EL1TE… (use 1 instead of lowercase l)
- bech32-friendly examples: bc1qstack…, bc1qcash…, bc1pmath5…
- Avoid lookalikes. Even when allowed, characters like 1 can be misread as lowercase L in some fonts. If you’re sharing screenshots, pick clean shapes.
If you love a word that isn’t bech32-friendly (like “bitcoin” with i and o), tweak it into something the alphabet accepts: bc1qbtc, bc1qbitcn, or something more creative like bc1qstack. It will save you hours.
Pro tip: bech32 addresses must be all lowercase or all uppercase—stick to lowercase to match Bitcoin Core and most wallets. Mixed case invalidates the checksum, and tools will refuse it (by design).
You’ve got the creative side down. Ready to turn that idea into a working setup without breaking your drivers or your security model? What if I showed you the exact Ubuntu + AMD stack that actually builds and sees your GPU the first time… without the usual pain points?
What you need: OS, GPU, tools, and a safe setup
I’ve seen more people lose hours to flaky drivers and half-baked toolchains than to the actual vanity search. Let’s get the foundation solid so your GPU spends time finding your prefix, not fighting your OS.
“Amateurs talk strategy. Professionals talk logistics.” Get the environment right, and the rest feels easy.
Ubuntu and AMD driver basics
Pick a stable base, then confirm the GPU actually shows up before you build anything.
- Use an LTS release: Ubuntu 22.04 LTS or 24.04 LTS. Fresh installs avoid weird OpenCL conflicts from old experiments. Grab the ISO from ubuntu.com.
- Install AMDGPU + OpenCL the right way:
- Recommended (most predictable): AMD’s official package with OpenCL enabled. Follow AMD’s guide for your Ubuntu version and GPU generation (support matrix here: ROCm/AMDGPU requirements). During install, include OpenCL (ROCr/legacy) components.
- Alternative: Mesa + OpenCL from Ubuntu repos can work for some cards, but performance and compatibility vary. If you value your time, stick to AMD’s installer.
- Secure Boot heads-up: If you use Secure Boot, unsigned kernel modules can fail silently. Either enroll the module key when prompted or disable Secure Boot in BIOS. Symptoms of failure: clinfo shows no devices, or OpenCL apps crash immediately.
- Base packages you’ll want on day one:
sudo apt update && sudo apt install -y build-essential git cmake pkg-config clinfo ocl-icd-opencl-dev opencl-headers libssl-dev
- Confirm the GPU is visible:
lspci | grep -i 'vga|3d'
— you should see your AMD card listed.
- Confirm OpenCL is alive:
clinfo | grep -E 'Platform Name|Device Name'
— you want at least one OpenCL platform and your GPU as a device. With AMD’s ROCm stack, /opt/rocm/bin/rocminfo
is another sanity check.
- Fix permissions so OpenCL apps can talk to the GPU:
sudo usermod -aG video,render $USER && sudo reboot
If clinfo still shows no devices after this, don’t brute-force it. Revisit the AMD installer logs, check the supported GPU list for your model, and make sure you didn’t mix package sources.
Tools that still work today
Some repos are abandoned, others are still maintained. Here’s what’s been reliable for me on Ubuntu with AMD hardware:
- oclvanitygen-ng (OpenCL): My go-to for AMD GPUs. It’s the OpenCL-powered fork of the classic vanitygen/oclvanitygen and is rock solid for 1… (P2PKH) and 3… (P2SH) patterns. Some forks add SegWit/bech32 support—check the README of the fork you clone to confirm the exact address types and flags.
- VanitySearch: Blazing fast and actively maintained. It shines with NVIDIA (CUDA), but the CPU build works well on any machine. On AMD, I keep it as a fallback CPU option if OpenCL gives me attitude. Recent releases often include better support for modern address types—again, confirm in the repo.
- CPU-only backups: If your GPU refuses to play nice, you can still generate short prefixes quickly on CPU using VanitySearch or classic vanitygen builds. For short patterns, the time difference is negligible and your stress level drops to zero.
Tip: Before committing to a long run, I clone both tools and do quick test patterns. A 30-second sanity run tells you if something’s off without wasting an evening.
Hardware considerations
VRAM is not your bottleneck here; it’s all about raw integer throughput and sustained clocks.
- What tends to perform well: RDNA2/RDNA3 desktop cards (e.g., 6800/6900/6950, 7800/7900 series), older Vega 56/64, Radeon VII. These keep high clocks under load and have mature OpenCL paths.
- Laptops struggle: Thin-and-light laptops throttle under sustained integer workloads. Expect 5–20x slower searches compared to their desktop counterparts with the “same” silicon.
- Thermals matter: If your card is sitting at 85–90°C, you’re leaving performance on the table. A small fan curve tweak and a dust clean can cut hours off a long search.
- Power draw is real: A single desktop GPU can pull 150–350W during a search. If you’re sensitive to noise or heat, plan runs for cooler hours and keep the case airflow clean.
- Stability > speed: A mild undervolt or power limit often improves sustained performance by avoiding throttle cycles. On AMD,
rocm-smi
(oramdgpu-smi
depending on stack) helps you monitor temps and clocks.
Small emotional truth: I used to obsess over squeezing another 5% speed. These days, I chase consistency. Finishing a 6-hour run without a crash beats shaving 20 minutes and rebooting twice.
Safety-first environment
If you generate keys on a messy, online daily driver, you’re handing risk a megaphone. I prefer boring, repeatable steps that make failure unlikely.
- Offline (or airgapped) generation: At minimum, pull the network cable or disable Wi‑Fi before you run the search and until you’ve secured the outputs. Best case: a separate box that never touches the internet.
- Fresh OS install on a spare SSD: It’s cheap insurance. Install Ubuntu LTS, AMD drivers, your toolchain, then stop. No browsers, no random packages. If you must keep notes, use a plaintext file locally.
- Use a clean, temporary user:
sudo adduser vanity
— log into this user only for the generation run. It limits cross-contamination with your daily apps.
- Turn off background sync: Disable auto-updates, cloud clients, crash reporters. You don’t want anything snapshotting your screen or filesystem while keys exist.
- Prepare an encrypted outlet: Before you generate, create a LUKS or VeraCrypt container on a removable USB. Store your private key/WIF results there, not on the main disk. Consider writing the final key to paper or steel as a secondary backup.
- Keep terminal sessions resilient: Use
tmux
orscreen
so a stray window close doesn’t kill your run mid-search. - Verify first, move later: You’ll validate the resulting address on a separate, clean device. For transfers, use a freshly formatted USB or QR—never email yourself a private key, ever.
There’s a moment when the tool finally prints your shiny custom address. Your heart jumps. Breathe. Take the extra two minutes to store it safely while you’re calm. Future-you will thank you.
Ready to see the exact steps, from picking a format to running the search and verifying the result? In the next section, I walk through the whole flow so you can go from zero to your first test prefix without guesswork.
How the process works (simple workflow)
“Slow is smooth, and smooth is fast.” — take two minutes to plan, and you’ll save hours of heat and fan noise.
The workflow at a glance
I keep it simple and repeatable. Here’s the high-level flow I actually use when hunting a prefix:
- Install GPU drivers and confirm the card is visible to OpenCL/ROCm.
- Build your tool from a current repo (VanitySearch or oclvanitygen-ng). Run its help and a quick benchmark to ensure it’s using the GPU.
- Pick your address type (1… / 3… / bc1q… / bc1p…) and your target pattern(s). Keep a short test pattern handy for validation.
- Estimate time based on the benchmark speed and the alphabet size (Base58 or Bech32). If it looks insane, shorten the pattern.
- Start a short test run with a 2–3 character pattern to confirm the tool outputs and files look right.
- Kick off the real run with your actual pattern(s). Watch the k/s or M/s figure to make sure GPU acceleration is active.
- When you get a hit, note the address and key outputs, then verify the pair matches on an offline box.
- Store the keys safely and back them up. I’ll walk you through smarter key handling in the next section.
Typical commands are short and sweet. As a mental model:
- Benchmark: run the binary with its benchmark flag (or a tiny pattern) to confirm GPU speed is reported.
- Vanity run: call the tool with your address type and pattern, plus an output file for hits.
Note: flags differ a bit by version; always check the tool’s README or --help.
Estimating time before hitting “go”
Two inputs decide how long this takes: your speed (keys per second) and the alphabet of the address type. The math is simple probability:
- Base58 (1… and 3…) has 58 characters. A prefix of length n appears, on average, once every 58ⁿ keys.
- Bech32 (bc1q…) and Bech32m (bc1p…) use a 32-character set. A prefix of length n appears once every 32ⁿ keys.
So your expected time is simply:
Time ≈ (AlphabetSize)^n / KeysPerSecond
Quick examples using conservative, round numbers:
- Base58, 7 characters: 58⁷ ≈ 2.22e12. If your benchmark shows 200,000,000 keys/s, expect ≈ 3.1 hours.
- Base58, 8 characters: 58⁸ ≈ 1.29e14 → at 200M/s ≈ 7.5 days.
- Bech32, 8 characters after “bc1q”: 32⁸ ≈ 1.10e12 → at 200M/s ≈ 1.5 hours.
- Bech32, 10 characters after “bc1q”: 32¹⁰ ≈ 1.10e15 → at 200M/s ≈ 63 days.
Three tips that actually help:
- Run a benchmark first. Most tools print “X keys/s” in the first few seconds—use that number, not a guess.
- Use multiple patterns separated by spaces to multiply your chance of a hit: e.g., bc1qbest bc1qbeta bc1qbee.
- Avoid mixed case in bech32—it’s lowercase only, so “Cool” isn’t a valid prefix there.
If you want to check the bech32 alphabet and checksum rules, they’re documented in BIP-173. Taproot addresses use bech32m (checksum tweak), defined in BIP-350.
Understanding outputs
When the tool finds your pattern, you’ll see something like:
- Address: the actual vanity address (e.g., 1COOLaz3… or bc1qbest9…).
- Private key: usually in WIF (Wallet Import Format). It starts with 5 (uncompressed) or K/L (compressed).
- Public key: 33-byte compressed key (starts with 02/03) or 65-byte uncompressed (starts with 04), depending on tool settings.
- Script / Redeem info: for P2SH or SegWit, some tools also print the redeem/witness details.
- Output file: a text file (you specify it) with the hit, so you don’t lose it if the terminal closes.
Good habits at this stage:
- Verify the keypair offline using a second tool (e.g., Bitcoin Core’s getaddressinfo on a non-networked box) to confirm the address matches the private key.
- Label the format in your notes: “P2PKH / compressed / WIF K…” or “bc1q / P2WPKH.” Future-you will thank present-you.
- Expect raw keys, not seeds. Vanity tools typically output raw private keys, not a BIP39 seed phrase. If you want a seed-controlled wallet, you’ll build the vanity address differently—outside the scope of this quick workflow.
Some builds support BIP38 encryption for the private key (password-protected WIF). If you enable it, keep the passphrase safe and test decryption offline before you rely on it.
Bech32 and Taproot specifics
SegWit and Taproot vanity prefixes are clean and readable, but there are a few specifics to keep straight:
- bc1q… addresses are bech32 (SegWit v0). Character set is qpzry9x8gf2tvdw0s3jn54khce6mua7l — all lowercase.
- bc1p… addresses are Taproot (SegWit v1) and use bech32m checksums. Tools must explicitly support it.
- Case matters: bech32/bech32m are lowercase-only. “BEST” won’t match; “best” will.
- Realistic lengths on a mid/high-tier GPU:
- bc1q + 6–8 chars: minutes to a few hours.
- bc1q + 9–10 chars: days to weeks.
- bc1p + 6–8 chars: similar math to bc1q, but only if the tool supports bech32m correctly.
- Prefixes go after the HRP (“bc”) and version (“1q” or “1p”). You pattern-match starting right after bc1q or bc1p.
Example patterns I’ve used or seen finish in a reasonable window:
- bc1qbest, bc1qbuild, bc1qcoffee (7–9 chars after bc1q)
- bc1popen, bc1palpha (6–8 chars after bc1p; verify your tool’s bech32m support first)
For Taproot’s behavior and signing rules, the background lives in BIP-341, while the address encoding tweak is in BIP-350. You don’t need to read them to run the tool, but they’re handy when double-checking what your wallet supports.
One last thing before you rev the fans: the most beautiful vanity prefix means nothing if the key handling is sloppy. Want my dead-simple way to keep those keys safe without slowing you down? You’re going to like what’s next — how careful do you really need to be, and what’s the one mistake that burns people the most?
Security best practices you shouldn’t skip
“Keys are forever; software can be patched. Protect the key.”
I love the fun of getting a great prefix, but I’m ruthless about one thing: the private key must never leak. Below is the exact playbook I use and recommend. It’s fast, realistic, and it doesn’t rely on luck.
Generate offline and verify on another device
Rule one: generate on a machine that has never touched the internet during the session. A live Linux USB is perfect. My one-evening protocol:
- Prep two USB sticks: one bootable Ubuntu LTS (live session), one “tools” USB with the generator source/release and its checksums/signatures downloaded in advance.
- Boot Ubuntu live with networking disabled: unplug Ethernet, toggle Wi‑Fi off from the BIOS or kill-switch. Don’t reconnect until you shut down for good.
- Verify what you run: check SHA256 sums and signatures for the generator on the offline machine. If a project provides PGP signatures, use them. If not, verify hashes against the release page you printed.
- Generate the vanity pair offline: run the tool, let the GPU grind, and when it lands on your prefix, record the outputs.
- Export only the address as a QR: keep the private key entirely offline. Use a QR tool offline to create a code for the address. Save it to the “tools” USB or snap it with an offline-only camera.
- Verify on a second device: on a separate computer that can go online, import the address as watch-only in your wallet and check it matches the one you printed. The private key never leaves the airgapped session.
Why so strict? History shows weak or sloppy key generation gets punished. In 2022, attackers exploited the Profanity vanity tool’s poor randomness on Ethereum, leading to massive losses (Wintermute reported a ~$160M hit). Different chain, same lesson: randomness and isolation matter. Earlier, a 2015 Black Hat talk introduced Brainflayer, which cracked human-made “brainwallets” at scale; funds were drained quickly because people took shortcuts. Don’t be that cautionary tale.
Key handling and backups
Once you have the winning address and its private key, the next threat isn’t hackers—it’s you misplacing it. Here’s a simple, robust plan:
- Follow 3‑2‑1: keep 3 copies, on 2 different media, with 1 copy offsite. Example I’ve used:
- Metal backup of the private key (or encrypted WIF) in a home safe.
- Encrypted USB in a separate location.
- Paper copy sealed, labeled, and stored offsite (safety deposit box).
- Encrypt at rest: if you store any digital copy, lock it. Use a modern tool like age, GPG, or a LUKS/VeraCrypt container. Keep the passphrase memorable to you and unguessable to others. No screenshots. No phone photos.
- Label safely: avoid writing “Bitcoin private key” on envelopes. Use neutral labels and a code only you understand.
- Consider Shamir as an option: splitting a secret into shares (e.g., 2-of-3) reduces single-point theft risk, but only if you’re comfortable with recovery procedures. Complexity is a risk too—practice a full restore before you fund the address.
- Test your backups: schedule a dry-run decrypt/restore on a spare machine every 6–12 months. Hardware fails and humans forget.
One more thing I never do: paste private keys into random apps or websites. It’s not about trust—it’s about minimizing surface area. Every paste is a potential leak.
Watch-only wallets and first test send
The safest path after generation is “look, don’t touch” until you’re sure everything matches.
- Import as watch-only: wallets like Sparrow or Bitcoin Core support this. In Bitcoin Core, you can use importaddress for a single address so you can monitor without exposing the key.
- Send a tiny test first: a few thousand sats is enough. Wait for 1–2 confirmations. Watch-only should reflect the incoming funds. This proves the address is valid and watch-only tracking is set up correctly.
- Move carefully to real value: only after the test confirms do I send the intended amount. If it’s long-term value, consider sweeping received funds to a hardware wallet you control after they arrive, while keeping the vanity address for public tipping or low-risk use. It’s a style choice with a trade-off: brand vs. operational security.
- Privacy note: vanity addresses are memorable by design, which also makes them recognizable. If privacy matters, use it sparingly and rotate addresses for routine transactions.
Red flags and scams
Vanity brings out the hustlers. Here’s how I avoid the mess:
- Never share a private key or seed phrase. No legitimate provider needs them. Full stop.
- Avoid “online generators.” Web pages that claim to make you a key in-browser are a minefield. Even if the code is open, you can’t easily verify what’s actually served to you.
- If you ever pay for help, use split-key only: you generate your own public key offline, the provider finds an added key component, and you combine results offline to get the final private key. They never learn your full key. Reputable tools document this process; ask for exact steps before you agree.
- Ask for receipts that are hard to fake:
- They only request a public key or descriptor, not secrets.
- They can show reproducible builds or sign releases with a known PGP key.
- They’re okay with you verifying everything offline before paying.
- Cloud GPU = red flag: keys and randomness are too precious to trust to someone else’s computer. Also, their terms usually forbid crypto workloads, and you pay to leak risk.
- Remember the cautionary tales: the 2022 Profanity incident (Ethereum) proved weak randomness ruins vanity schemes; the 2015 Brainflayer work showed human-generated secrets get harvested. Good tools and good ops are non-negotiable.
The whole point of a custom address is to have fun without stress. Keep the key offline, encrypt what you must store, and test your recovery path before any serious funding. Now, the natural question: how long will your GPU grind to hit that perfect prefix, and when does it become unrealistic? I’ve got real numbers and comfort thresholds next—curious where your card lands?
Speed, costs, and realistic expectations
“Hope is not a strategy. Plan your prefix around your hardware, not your wishes.”
I love a good vanity win as much as anyone, but the clock, your power bill, and the laws of probability don’t care about our enthusiasm. Here’s the real-world picture so you can pick a prefix that looks great and finishes before your patience (or temps) run out.
What your GPU can actually crack
The two big drivers are your search rate (keys per second) and the alphabet size of the address format:
- Base58 (1…/3…): each extra character multiplies work by 58×
- Bech32 (bc1q…/bc1p…): each extra character multiplies work by 32× (lowercase only)
A simple median-time rule of thumb I use:
- Median time ≈ 0.69 × (base^n) / rate
- base = 58 for 1…/3… and 32 for bc1q…/bc1p…
- n = number of characters in your desired prefix after the fixed start (“1”, “3”, or “bc1q/p”)
- rate = your measured keys per second (run a quick benchmark in your tool)
Ballpark GPU rates I keep seeing on Ubuntu with AMD and current tools (VanitySearch/OpenCL or oclvanitygen-ng)—do a quick benchmark on your box before committing:
- RX 580: ~200–350 Mkeys/s
- RX 5700 XT: ~800–1,200 Mkeys/s
- RX 6700 XT: ~1.0–1.5 Gkeys/s
- RX 6800 / 6900 XT: ~1.6–2.5 Gkeys/s
- RX 7900 XT / XTX: ~3.0–5.0 Gkeys/s
What that feels like in practice at ~1 Gkey/s (median times):
- Base58 (1…)
- 6-char prefix (e.g., 1cryptoX): ~26 seconds
- 7-char: ~25 minutes
- 8-char: ~24 hours
- 9-char: ~2 months
- 10-char: ~9–10 years
- Bech32 (bc1q…)
- 8-char after “bc1q” (e.g., bc1qcoolxx): ~13 minutes
- 9-char: ~7 hours
- 10-char: ~9 days
- 11-char: ~9–10 months
Two takeaways I keep repeating:
- Bech32 buys you more “look” per character. If you want longer words, bc1q is your friend.
- Don’t chase 9–10 chars on base58 unless you enjoy multi-month runs (or have a farm).
Power, heat, and noise
GPUs are great heaters that happen to do math. Expect:
- Power draw: 150–350 W per card while searching
- Daily cost (24h):
- At 250 W and $0.15/kWh ≈ $0.90/day
- At 300 W and $0.30/kWh ≈ $2.16/day
- Temps: Keep core under ~75°C, VRAM ideally under ~90°C
- Noise: 35–50 dBA is common; it’ll dominate a quiet room
Easy wins I use for comfort and efficiency:
- Undervolt: 10–25% less power for a small speed hit (sometimes none)
- Power limit: cap at 80–90% to tame thermals without gutting performance
- Aggressive fan curve + dust-free intakes: steady temps, fewer throttles
- Open case or side panel off if safe—airflow is king
- Schedule runs overnight: cooler ambient and fewer interruptions
Watch efficiency, not just speed: Mkeys/s per watt tells you how expensive each character is going to be. If you save 20% power for 5% less speed, you win twice.
When GPU isn’t worth it
You don’t always need the big guns:
- Short prefixes:
- Bech32: up to 6–7 chars past “bc1q” is snappy even on a decent CPU
- Base58: up to 4–5 chars after “1” or “3” is fine on CPU
- Bad thermals or loud environment: the energy and noise tax outweighs the time saved
- Tight budget on electricity: cap your power or stick to CPU for shorter runs
On a modern 8–16 core CPU, I usually see 30–150 Mkeys/s. That’s plenty for quick 1–5 character goals or for testing patterns before a long GPU session.
Cloud GPU warning
This is where I draw a hard line. Generating keys on a cloud GPU is a privacy and cost booby trap.
- Key exposure risk: the host can snapshot RAM or disk; you can’t verify what the hypervisor sees
- Hidden persistence: “ephemeral” volumes and logs aren’t always wiped the way you expect
- Cost creep: $0.40–$3.00/hour looks cheap until your 9–10 char chase runs all week
- Terms of service: some providers block crypto-related workloads or throttle you without notice
If you ever outsource, use a split-key workflow with a reputable provider so they never see a spendable private key. But if you’re generating a standard vanity address for yourself, keep it local and offline. Fast is fun—safe is mandatory.
Seeing lower speed than the numbers above or your rig is throttling mid-run? Fans screaming, temps spiking, or the tool reporting weird rates? I’ve got a short list of fixes and sanity checks that save hours—want me to walk you through the quickest ones next?
Troubleshooting: quick fixes to common problems
“Luck favors the prepared.” When a vanity run hits a wall, 90% of the fixes are simple sanity checks. Here’s the checklist I actually use when a build won’t cooperate, the GPU is missing, or performance falls off a cliff.
GPU not detected or tool won’t build
If the tool can’t see your AMD card or compilation fails, walk through these in order:
- Confirm the kernel sees your GPU: Run lspci or lshw and make sure the amdgpu driver is bound. If you see “VGA compatible controller: Advanced Micro Devices” but no “Kernel driver in use: amdgpu,” the driver didn’t load cleanly.
- Check ROCm/OpenCL is actually installed: clinfo should list an AMD platform and devices, and rocminfo should enumerate your card. If either command errors or shows 0 devices, your OpenCL stack isn’t ready.
- Match ROCm to Ubuntu: ROCm versions are picky. Use the combo that AMD lists as supported for your Ubuntu LTS and GPU generation. If you upgraded Ubuntu recently, reinstall the matching ROCm/OpenCL. See AMD’s support matrix on ROCm docs.
- Install the usual missing build deps: build-essential, cmake, git, pkg-config, opencl-headers, ocl-icd-opencl-dev, and often libssl-dev. If the compiler complains about OpenCL headers or ICDs, you’re missing opencl-headers or ocl-icd-opencl-dev.
- Pick a known-good release commit: If the latest master won’t build, grab the latest tagged release or the commit recommended in the tool’s Issues page. This avoids chasing transient breakages.
- Multi-GPU quirk: If integrated graphics is “GPU 0,” select your discrete AMD device explicitly in the tool options. Some tools default to device 0 and quietly run on the wrong GPU.
Real example: On a fresh Ubuntu 22.04 box, clinfo showed only “Portable Computing Language (POCL).” Installing ocl-icd-opencl-dev and AMD’s OpenCL runtime, then rebooting, replaced POCL with “AMD Accelerated Parallel Processing” and the card appeared instantly in the vanity tool.
Performance lower than expected
When the numbers don’t match what others report, it’s usually power, heat, or a pattern choice that’s kneecapping you:
- Thermal throttling: If the GPU creeps past ~85–90°C, clocks drop and throughput tanks. Watch temps with rocm-smi or sensors and bump fan curves or improve case airflow. I’ve seen a 5700 XT jump from ~1.1 Mkey/s to ~1.6 Mkey/s just by keeping it under 80°C.
- Power limits: Some cards ship with conservative power caps. Verify current power draw and clocks with rocm-smi. A modest power increase (within safe limits) or ensuring max performance state is engaged can unlock a big chunk of speed.
- Background load: Close browsers, video streams, and anything hitting the GPU. If Xorg/Wayland is using the same card for display, you’ll often get better numbers by running headless or moving the display to a different GPU.
- Worksize/intensity sweet spot: Tools expose parameters like worksize, batch size, or threads. Try halving and doubling these values. Many RDNA/GCN cards like medium work sizes; too large can cause slower kernels or instability.
- OpenCL memory env vars: On older stacks, setting GPU_MAX_ALLOC_PERCENT=100 and GPU_SINGLE_ALLOC_PERCENT=100 before launching can prevent allocation choking. If your tool warns about failing to allocate buffers, this helps.
- Pattern strategy: Bech32 is lowercase only. If you search mixed case or impossible characters, you’re wasting cycles. Also consider a list of several acceptable prefixes rather than a single ultra-long one; tools that accept a pattern file can massively improve time-to-first-hit.
Backed by testing: AMD’s own documentation shows that once the GPU hits thermal limits, the GFXCLK drops to stay within TjMax, which directly lowers throughput. Keeping the card cool is free performance. See AMD’s notes in the ROCm documentation and your card’s specifications.
Invalid address or wallet import issues
You found a match but the wallet throws errors, or the resulting address isn’t what you expected. Nine times out of ten it’s a format mismatch:
- Network mismatch: bc1… is mainnet; tb1… is testnet. Some tools default to mainnet; some require an explicit network flag. Make sure your wallet network matches the generated address’s HRP (“bc” vs “tb”).
- Address type mismatch: Generating a legacy 1… address and importing as SegWit won’t work. Likewise, producing a bc1p (Taproot) key and trying to import it as bc1q (P2WPKH) will fail.
- Compressed vs uncompressed keys: A WIF from an uncompressed key yields a different 1… address than a compressed key. Ensure the compression setting in your tool matches what you plan to use in the wallet.
- Wallet feature support: Not every wallet accepts raw WIF for bc1q or bc1p. For full control, use Bitcoin Core with descriptors:
- SegWit P2WPKH: wpkh(your_privkey)
- Taproot P2TR: tr(your_privkey)
If your wallet can’t import descriptors, create a watch-only entry using the address and keep the private key offline.
- Checksum confusion in bech32: Bech32 has constraints; not all character sequences are valid. If you forced an impossible pattern, you’ll never get a hit. Keep patterns realistic and lowercase.
Quick sanity step: After a hit, independently recompute the address from the private key on an offline machine using a second tool or a hardware wallet developer kit. It takes 30 seconds and kills doubt.
Stability and crashes
Kernel panics, OpenCL crashes, or random exits usually point to drivers, overly aggressive settings, or out-of-range workloads:
- Driver resets in dmesg: If you see “amdgpu: GPU reset,” roll back to a known-stable AMDGPU/ROCm version for your card and Ubuntu. Newer isn’t always better for OpenCL stability.
- Reduce workload: Lower the tool’s intensity/worksize, reduce thread count, or split large pattern lists into smaller files. Err on the side of stability for long overnight runs.
- Avoid undervolt extremes: Stable undervolts for gaming can crash under constant compute. Return to stock volts/clocks to test. Then tune gently.
- VRAM errors: If you suspect flaky VRAM (artifacts, sporadic OpenCL faults), lock memory clocks to a lower state or increase fan speed. Persistent VRAM faults under load are a red flag for hardware health.
- Filesystem and temp paths: Some tools write checkpoints or logs. Make sure the output path is writable and not on a flaky USB stick that cuts out mid-run.
“Fast is fine, but accuracy is everything.” Speed means nothing if you end up with an unusable address or a corrupted key file. If something looks off, stop and verify.
PSA mini-checklist:
- clinfo shows your AMD device
- Temps under 80–85°C during full load
- Pattern file uses valid characters (lowercase for bech32)
- Compression setting consistent from generation to import
- Wallet supports the address type (legacy, SegWit, Taproot)
- Independent verification of address from private key, offline
Still stuck, or just tired of wrestling with drivers? There is a safe way to let someone else do the heavy lifting without ever exposing your private key. Want the exact playbook I use when outsourcing a vanity prefix and the red flags that tell me to walk away?
Alternatives, services, and a few trusted resources
Paying someone to generate it for you (safely)
I get it—sometimes you just want the result without wrestling with drivers and kernels. You can hire a provider to grind a vanity address for you without ever exposing your private key. The only acceptable way to do that is a split‑key process.
Here’s the plain-English version of split‑key:
- You keep a secret key that never leaves your offline machine.
- You derive a public “intermediate” blob from that key and send only that blob to the provider.
- The provider searches on their hardware and finds an “offset” that produces your target prefix when combined with your intermediate data.
- They send you the offset (no private keys), plus the matching address.
- You combine the offset with your secret key offline to get the final private key and verify the address yourself.
Golden rule: never share your private key or seed phrase. If a provider asks, the job is over.
What I always demand from a provider:
- Split-key only. They must support a documented split‑key scheme (VanitySearch/vanitygen style). No exceptions.
- Open-source tooling, version pinned. Ask for the exact commit/release they’ll use so you can reproduce the combination step locally. Reproducibility matters.
- Proof Bundle. They should return: the found address, their offset/partial, a transcript showing the pattern and tool version, and a signed message from the address they found (so you know the parts actually match).
- Your verification step. You should be able to combine their partial and your secret offline and get the identical address. If not, don’t send payment.
- Payment safety. Use escrow or milestone payments (e.g., partial fee for a verifiable hit, remainder after you combine and confirm).
Real-world tip: reputable providers will happily explain their split‑key flow before they start. If they get evasive or promise “instant” long prefixes at bargain prices, walk away. The math won’t bend for anyone.
CPU-only route and hybrid strategies
If your AMD stack is being stubborn or you’re only after a modest prefix, a CPU can be enough—and you won’t be battling GPU drivers.
- When CPU is perfectly fine: short bech32 patterns (think 3–5 characters after bc1q) are often reachable in minutes to a few hours on a modern desktop CPU. Longer than that gets slow fast.
- Pattern bouquet = faster wins: search for several acceptable patterns at once to multiply your odds per second. For example, instead of only “bc1qbest…”, run a list like bc1qbest, bc1qbeta, bc1qbean, bc1qbuzz. Hitting any of them is a win.
- Hybrid split: let the CPU chew on a batch of short “nice-to-have” patterns while your GPU (or a friend’s machine) hunts a longer primary pattern. You might land a shorter vanity you actually like sooner than expected.
- Design tricks that look great without brutal search time:
- Use repeated letters or simple shapes: bc1qqqq…, bc1qxx…, 1ABBA….
- Avoid characters that confuse the eye. Base58 excludes lookalikes like 0/O/I/l; bech32 is lowercase only, which helps readability.
- Short but brandable beats ultra-long every time—especially if you care about actually getting it this week.
If you want rough expectations before you try, check measured speeds from tool authors and independent testers. They show why CPUs shine for short patterns and why GPUs take over once you add characters. I reference a solid walkthrough below that includes speed notes and practical gotchas.
Further reading I trust
I leaned on these to sanity‑check tools and methods, and they’re where I send friends who want the straight story:
- Jameson Lopp’s walkthrough (Ubuntu + AMD GPU) — clear steps, good speed context, and the exact flow most people still follow.
- VanitySearch (GitHub) — fast, actively maintained, supports split‑key and modern address types.
- oclvanitygen‑ng / vanitygen‑plus (GitHub) — the GPU‑accelerated branch of the classic toolchain that many still prefer.
Thinking about hiring help but still unsure how to prove you own the final vanity address, or whether a recognizable prefix hurts privacy? I’ve got quick, no‑nonsense answers queued up next—want them?
FAQ: everything you need to know before you start
Is a vanity Bitcoin address safe?
Yes—if you generate it yourself, offline, with reputable tools, and store the private key properly. The prefix doesn’t weaken the underlying cryptography; you’re still using the same ECDSA (or Schnorr for Taproot) security that protects all Bitcoin. The real risks are human and operational: compromised machines, shady generators, or sloppy key handling.
- Use offline generation (airgapped is best) and verify tool signatures or build from source.
- Avoid web generators. History is full of key theft from “convenient” sites and weak RNGs. If you’re curious, check the classic talk on cracking brainwallets by Ryan Castellucci (DEF CON 23) as a cautionary tale.
- Back up your private key encrypted. Never paste it into random software.
For the curious: Bech32 (SegWit) is defined in BIP-173, Taproot in BIP-340/341/342. The prefix doesn’t alter the cryptographic guarantees.
Does using a custom prefix hurt privacy?
A little, yes. A distinctive prefix makes your address more memorable on-chain. That’s the point—but it also makes activity easier to spot. If privacy matters:
- Use the vanity address sparingly (tips, public donations, branding) and rotate addresses for normal use.
- Practice coin control and avoid address reuse in general. The Bitcoin Wiki’s Privacy page explains why reuse harms you.
- Consider using a separate wallet just for the vanity address.
“Vanity is for humans, privacy is for your coins.”
Can I pick any characters and any length?
No—format rules matter, and longer patterns explode the search time.
- P2PKH (starts with 1) and P2SH (starts with 3) use Base58Check. The alphabet excludes 0, O, I, l. Valid example: 1Boat.... Invalid example: 1COIN... (uppercase O not allowed).
- Bech32 (bc1q) is lowercase and uses a 32-char set: qpzry9x8gf2tvdw0s3jn54khce6mua7l. No uppercase. No “1” after bc1. bc1qbest... is fine; bc1qBest... is not.
- Taproot (bc1p) uses bech32m; same lowercase charset rules apply.
- Each extra character makes it exponentially harder: roughly ×58 per char for Base58 and ×32 per char for Bech32. That’s why bech32 prefixes are generally faster to find at the same length.
Practical tip: If you want something longer, go with bc1q or bc1p. They’re easier per character than Base58. Keep it readable and avoid confusing lookalikes.
What about Taproot (bc1p) and SegWit (bc1q)?
Most up-to-date tools support bc1q (SegWit). bc1p (Taproot) requires bech32m support (BIP-350), which some tools added later or only in certain builds. Always check the repo and recent issues before you commit to a long run. Do a short test first to confirm your pattern matches and your wallet will accept the address.
Can I do this on Windows or macOS?
Yes, but expect different setup pain.
- Windows: Works with the right AMD driver stack and OpenCL/CUDA builds. It’s fine, just pay attention to driver versions and tool instructions.
- macOS: OpenCL support is limited on newer Macs, and discrete AMD GPUs are uncommon. You might be stuck with CPU speeds, which are fine for short prefixes.
- Linux (Ubuntu) + AMD: This combo is predictable for GPU acceleration (ROCm/AMDGPU). That’s why I use it for serious runs.
How do I prove I own the vanity address?
You’ve got two clean options:
- Sign a message with the private key and share the signature. This is the classic approach but note that some wallets don’t sign messages for SegWit/Taproot in the legacy format. Look for wallets supporting BIP-322 (generic message signing) for bc1q/bc1p.
- Spend a small test output from your vanity address to a fresh address you control. It’s public and universally verifiable.
I usually sign a message offline first. If someone needs public proof, I send a tiny on-chain spend.
Will a vanity address break compatibility with wallets and exchanges?
No, as long as you stick to standard formats:
- 1... and 3... work everywhere.
- bc1q... is widely supported now, but a few older services still lag. If an exchange looks ancient, test with a small amount first.
- bc1p... (Taproot) is increasingly supported, but some services are still catching up. Again—test first.
What if I want a really long prefix?
Set expectations. The search gets brutal past a certain length. For the same number of characters, bech32 is far more feasible than Base58—but both grow fast. My rule:
- Bech32 (bc1q/bc1p): 6–8 characters is realistic on a decent GPU. More than that becomes a “leave it running for days” job.
- Base58 (1/3): Keep it shorter or switch to bech32 for longer phrases.
- Trick: Combine two shorter patterns (e.g., bc1qcat...xbt...) instead of chasing one long prefix. It looks great and is far more realistic.
If you want detailed math and example runs, Lopp’s write-up is still a great sanity check: his benchmark-driven guide helps estimate time before you burn power.
Can I pause and resume a long search?
Most tools don’t “resume” in a traditional sense because the search is random. But you can stop and start as needed without hurting your odds in the long run. If uptime matters, set up a stable environment and keep the machine cool to avoid crashes.
What happens if two people find the same vanity address?
That would require generating the same private key—a practical impossibility with proper tools. The space is astronomically large. The only time you see collisions is when someone uses a flawed generator or weak “brainwallet” style secrets. Don’t do that.
Wrap-up: what to do next
Here’s the quick path I recommend:
- Pick a realistic prefix and address type (bc1q/bc1p if you want longer flair).
- Set up a clean Ubuntu environment with proper AMD drivers.
- Run a short test first to confirm tool support and wallet import.
- Generate offline, verify outputs on a separate device, and back up keys securely.
- Fund it only after a small test send and message-sign check.
If you hit a snag, check the troubleshooting tips or ping me on Cryptolinks. I’m happy to help you get it across the finish line.