Using an AWS GPU instance to generate vanity Bitcoin addresses

This blogpost is a short tutorial on how to efficiently generate vanity Bitcoin addresses on AWS' GPU instance and the resulting performance.

The next CTF, namely the ASIS Cyber Security Contest, requires you to provide a Bitcoin address during the registration if you want to claim a prize.

Custom Bitcoin addresses

During our team's preparation meetup we thought that it would be a cool idea to have our team's name legofan in it. Luckily there's a tool called vanitygen which generates Bitcoin addresses until a specific pattern is found.

For example, this will generate an address with the prefix Hi.

$> vanitygen 1Hi
Difficulty: 1330
Pattern: 1Hi                                                                   
Address: 1His8MJwroVeW4Hsg9u2kdtVKijEaJV1vo
Privkey: 5JDiU6JxwbBgPtW2RhrmPAwSMT7Z1qKz1ZHAvfKmTrLEd3t3rxb

However, the longer the prefix is, the longer (exponential!) it takes for the process to finish.

We first started out with our laptops, then some dedicated servers or big VMs and finally tried AWS' g2.8xlarge GPU instance. Skip to the performace section for some numbers.

g2.8xlarge setup

The g2.8xlarge comes with 32 CPUs, 60GB of RAM and 4 Nvidia GRID K520 cards.

You probably want to rent a so called Spot instance, because these are usually up to 90% cheaper.

Manson's blog gives a detailed description on how to request a spot instance. However, make sure to choose a custom AMI with the ID ami-c79b7eac in step 4, because it comes with all Nvidia/cuda drivers preconfigured and a g2.8xlarge instance in step 5.
You can follow his steps until point 11, but everything else will be already installed.

After logging in using SSH (username is ubuntu), we need to install some dependencies:

$> sudo apt-get install vim git libcurl3-dev libssl-dev libpcre-dev opencl-dev screen

Now we can compile the oclvanitygen tool:

$> git clone https://github.com/samr7/vanitygen.git
$> cd vanitygen
$> make all

Running the tool without any parameters except for the pattern should show you all available GPUs:

$> ./oclvanitygen 1Test
Difficulty: 264104224
Available OpenCL platforms:
0: [NVIDIA Corporation] NVIDIA CUDA
  0: [NVIDIA Corporation] GRID K520
  1: [NVIDIA Corporation] GRID K520
  2: [NVIDIA Corporation] GRID K520
  3: [NVIDIA Corporation] GRID K520

The tool can't handle all four GPUs concurrently, so for each GPU 0,1,2,3 you run:

$> screen -S gpu$id 
$> ./oclvanitygen -p 0 -d $id -i $pat

where:

  • $id is 0, 1, 2, or 3
  • $pat is the desired pattern

You can exit a screen by hitting Ctrl+A+D and enter it again by using screen -r gpu$id. In other words: You run the tool four times - Once per GPU.

Performance

Vanitygen can either run as a multicore CPU program ( vanitygen) or use the power of GPUs using opencl ( oclvanitygen).

Here are some numbers:

  • 2 Cores @ Core i5-2430M @ 2.4Ghz: ~660 KH/s
  • 20 Cores @ Xeon E5-2650L v3 @ 1.80GHz: ~3 MH/s
  • 32 Cores @ Xeon E5-2670 @ 2.60GHz: ~ 5 MH/s
  • 1 GPU @ Nvidia GRID K520: ~ 23 MH/s

The pattern was four combinations of a 8 characters long, case-insensitive prefix:

$> cat pat
1legofan
1l3gofan
1legof4n
1l3gof4n

$> ./oclvanitygen -p 0 -d 0 -i -f pat

I let the GPU instance running for about 55 minutes and it has found 13 matching addresses and that costed me around $2.

-=-