Skip to content

Instantly share code, notes, and snippets.

@t4sk
Created January 13, 2017 23:50
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save t4sk/ed5bbf8ad84ef097ff2d36caa6b73936 to your computer and use it in GitHub Desktop.
Save t4sk/ed5bbf8ad84ef097ff2d36caa6b73936 to your computer and use it in GitHub Desktop.
How to create bitcoin address

How to create bitcoin address

0. Overview

Address = base58 encode ([version byte][public key hash][checksum])

version byte = 00 (for P2PKH on mainnet)

public key hash = RIPEMD160(SHA256(public key))

checksum = first 4 bytes of SHA256(SHA256(public key hash))

1. Get public key

In bitcoin-qt console

> getnewaddress
n2Yk5FXvoeR1kDrvaQPxfro6yTaW6tPMMq

> validateaddress n2Yk5FXvoeR1kDrvaQPxfro6yTaW6tPMMq
{
  ...
  "pubkey": "02b9d1cc0b793b03b9f64d022e9c67d5f32670b03f636abf0b3147b34123d13990",
  ...
}

In shell terminal

> export PUB_KEY=02b9d1cc0b793b03b9f64d022e9c67d5f32670b03f636abf0b3147b34123d13990

2. Get public key hash (RIPEMD160(SHA256(PUB_KEY)))

> echo $PUB_KEY -n | xxd -r -p | openssl dgst -sha256 -binary | openssl dgst -rmd160
e6b145a3908a4d6616b13c1109717add8672c900

> export PUB_KEY_HASH=e6b145a3908a4d6616b13c1109717add8672c900

4. Add version byte

Add version byte in front of PUB_KEY_HASH (6f for regtest)

> export VER=6f

> echo ${VER}${PUB_KEY_HASH}
6fe6b145a3908a4d6616b13c1109717add8672c900
Network Script Version Byte (Hex)
mainnet P2PKH 00
testnet P2PKH 6f
regtest P2PKH 6f

5. Compute checksum (Double SHA256)

> echo ${VER}${PUB_KEY_HASH} -n | xxd -r -p | openssl dgst -sha256 -binary | openssl dgst -sha256
02335f08b8fe4ddad263a50b7a33c5d38ea1cbd8fd2056a1320a3ddece541711

Take the first 4 bytes of the double SHA256 hash

02335f08

> export CHECKSUM=02335f08

6. Append checksum

> echo ${VER}${PUB_KEY_HASH}${CHECKSUM}
6fe6b145a3908a4d6616b13c1109717add8672c90002335f08

7. Convert to base58 (base58 encoder)

n2Yk5FXvoeR1kDrvaQPxfro6yTaW6tPMMq

8. Verify (Optional)

In bitcoin-qt console

> validateaddress n2Yk5FXvoeR1kDrvaQPxfro6yTaW6tPMMq
{
  ...
  "pubkey": "02b9d1cc0b793b03b9f64d022e9c67d5f32670b03f636abf0b3147b34123d13990",
  ...
}

The public key from step 1 should match pubkey

References

Technical background of version 1 Bitcoin addresses - Bitcoin Wiki

Address Conversion - Bitcoin.org

Mastering Bitcoin

Bitcoin Base58 Encoder

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment