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))
In bitcoin-qt console
> getnewaddress
n2Yk5FXvoeR1kDrvaQPxfro6yTaW6tPMMq
> validateaddress n2Yk5FXvoeR1kDrvaQPxfro6yTaW6tPMMq
{
...
"pubkey": "02b9d1cc0b793b03b9f64d022e9c67d5f32670b03f636abf0b3147b34123d13990",
...
}
In shell terminal
> export PUB_KEY=02b9d1cc0b793b03b9f64d022e9c67d5f32670b03f636abf0b3147b34123d13990
> echo $PUB_KEY -n | xxd -r -p | openssl dgst -sha256 -binary | openssl dgst -rmd160
e6b145a3908a4d6616b13c1109717add8672c900
> export PUB_KEY_HASH=e6b145a3908a4d6616b13c1109717add8672c900
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 |
> 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
> echo ${VER}${PUB_KEY_HASH}${CHECKSUM}
6fe6b145a3908a4d6616b13c1109717add8672c90002335f08
7. Convert to base58 (base58 encoder)
n2Yk5FXvoeR1kDrvaQPxfro6yTaW6tPMMq
In bitcoin-qt console
> validateaddress n2Yk5FXvoeR1kDrvaQPxfro6yTaW6tPMMq
{
...
"pubkey": "02b9d1cc0b793b03b9f64d022e9c67d5f32670b03f636abf0b3147b34123d13990",
...
}
The public key from step 1 should match pubkey
Technical background of version 1 Bitcoin addresses - Bitcoin Wiki