Test Mode

All Guides

Understanding BIP-127: Bitcoin Proof of Reserves

A standard shape for proving reserve UTXOs without spending them.

Contents

What is BIP-127?

BIP-127 is an application-layer Bitcoin proposal for simple proof-of-reserves transactions. It is for custodians, exchanges, treasury desks, and lenders who need evidence that a set of Bitcoin UTXOs was under control at a stated point in time.

It is different from BIP-137 and BIP-322. Those standards prove control of an address by signing a message. BIP-127 packages reserve evidence around transaction inputs.

The proposal is marked Draft in the Bitcoin BIPs repository. That matters. It is useful, but implementations should keep the format explicit and avoid pretending it is consensus validation.

The proof transaction

A BIP-127 proof is shaped like a Bitcoin transaction, but it is built so it cannot be mined. The first input is a commitment input. Its previous transaction id is not a real UTXO. It is the SHA-256 hash of this string:

Proof-of-Reserves: <commitment message>

That commitment ties the proof to the issuer and context. It prevents someone from copying another company's proof and presenting it as their own.

Input 0 is the commitment input.

Remaining inputs reference reserve UTXOs.

The transaction has one output.

The output value equals the proven input total, with no miner fee.

The proof file

The BIP also defines a protobuf proof file. The file can hold more than one final proof transaction, the commitment message, the block hash for validation, and metadata about the outputs used in the proof.

This extra layer is important for real businesses. Large reserve sets can be spread across many wallets and many UTXOs. One proof file gives auditors a single object to inspect.

  • network_magic states the network.
  • message is the commitment message.
  • block_hash fixes the block at which the proof should be evaluated.
  • final_proofs carries the proof transactions and output metadata.

Mainnet and testnet

The BIP-127 proof file records the Bitcoin network with a network magic value. The specification names mainnet and testnet:

0xD9B4BEF9 for mainnet

0x0709110B for testnet

VerifyBTC production mode is for mainnet. VerifyBTC test mode uses test-network addresses and test-network proof metadata. Tests cover both paths.

What it does not prove

BIP-127 proves control of reserve inputs at a point in time. It does not prove liabilities. It does not prove that no other party has a claim on the same coins. It does not prevent coins from moving after the proof is made.

For lending and custody workflows, treat it as one layer: strong evidence of reserve control. Pair it with liability statements, policy controls, and recurring verification.

For single-address ownership checks, use BIP-137 or BIP-322. For reserve sets, use BIP-127.