Pay to Public Key Hash

Ty Everett (ty@projectbabbage.com)

Abstract

The Pay-to-Public-Key-Hash (P2PKH) output script is a commonly used script in the Bitcoin network that allows users to send funds to a specific Bitcoin address. This standard provides a detailed specification of the P2PKH output script, providing detail on the operations performed, and giving examples for serialized Bitcoin addresses.

Motivation

The P2PKH output script is used to ensure that only the owner of a specific Bitcoin address can spend the funds sent to that address. This is achieved by requiring the spender to provide a valid signature that corresponds to the public key associated with the address. The P2PKH output script is widely used in the Bitcoin network and is the most common output script used in transactions.

Specification

The P2PKH output script is defined as follows:

OP_DUP OP_HASH160 <PubKeyHash> OP_EQUALVERIFY OP_CHECKSIG

Where:

  • OP_DUP duplicates the top stack item.

  • OP_HASH160 computes the RIPEMD160 hash of the SHA256 hash of the top stack item.

  • <PubKeyHash> is the RIPEMD160 hash of the SHA256 hash of the public key associated with the Bitcoin address.

  • OP_EQUALVERIFY checks if the top two stack items are equal and removes them if they are.

  • OP_CHECKSIG verifies that the signature provided by the spender is valid for the public key associated with the address.

Serialization Format (Base58)

The P2PKH output script is serialized using Base58 encoding. The serialized format is as follows:

[Version Byte][PubKeyHash][Checksum]

Where:

  • [Version Byte] is a single byte that identifies the network and the script type. The value of the version byte is 0x00 for the mainnet and 0x6F for the testnet.

  • [PubKeyHash] is a 20-byte RIPEMD160 hash of the SHA256 hash of the public key associated with the Bitcoin address.

  • [Checksum] is a 4-byte checksum computed using the first four bytes of the double-SHA256 hash of the serialized script.

Examples

P2PKH Bitcoin addresses for mainnet always start with a 1 because the [Version Byte] is 0x00. On testnet, they will always start with either m or, less often, n, because the [Version Byte] is 0x6F.

Mainnet example P2PKH address: 1PyWzkfKrq1kakvLTeaCdAL8y8UJAcZAqU

Testnet example P2PKH address: mineSVDRCrSg2gzBRsY4Swb5QHFgdnGkis

How it Works

When a user creates a new Bitcoin address, a public key and a corresponding private key are generated. The public key is then hashed, first with SHA256 and then the result is hashed again using the RIPEMD160 algorithm to obtain a 20-byte hash value, which is the PubKeyHash used in the P2PKH output script.

To send funds to a P2PKH address, the sender creates a transaction that includes an output with the P2PKH output script and the address's PubKeyHash. To spend the funds, the recipient must provide a valid signature that corresponds to the public key associated with the address. The signature is verified using the OP_CHECKSIG opcode in the output script.

Implementations

The P2PKH output script is implemented in most Bitcoin wallets and is widely used in the Bitcoin network. There are also many libraries available that provide functions for creating and validating P2PKH transactions.

Last updated