BlockchainJun 30, 20267 min read

Understanding BEEF: A ‘Proof Bundle’ for Bitcoin Transaction Verification

BEEF (Background Evaluation Extended Format) is a data format that bundles transactions, their ancestor transactions, and Merkle proofs together. It enables receivers to independently perform SPV validation without relying on full chain data. This article introduces BEEF’s motivation, structure, validation logic, and its place in the BSV tech stack.

Ethan Lin

Ethan Lin

technical_editor

Share

Conclusion First

If you’ve done Bitcoin development, you know that verifying a transaction isn’t just about checking the transaction itself. The receiver needs to confirm that the UTXO it spends actually exists, which parent transaction it belongs to, and whether that parent has been confirmed by the blockchain.

BEEF (Background Evaluation Extended Format) is designed for exactly this scenario. It packages one or more transactions, their ancestor transactions, and the corresponding Merkle paths (BUMPs) into a self-contained data bundle. Once the receiver gets a BEEF, they can trace back along the dependency chain all the way to transactions that are anchored by block proofs—without having to blindly search for historical data themselves.

Based on BRC-62 and the behavior of actual SDKs, this article explains the motivation behind BEEF, its verifiable structure, and its importance in SPV wallets, Overlay networks, and high-frequency payment scenarios.

Understanding BEEF: A ‘Proof Bundle’ for Bitcoin Transaction Verification article cover

Background: Why a Single Transaction Isn’t Enough

Suppose Alice sends Bob a transaction TxB. TxB spends an output from TxA as an input.

For Bob to trust this payment, he needs to know at least:

  • that TxA really exists and has been accepted by the network;
  • that TxA’s output is indeed spent by TxB;
  • that TxB’s signatures and scripts are valid;
  • that TxA has been included in some block on the longest valid chain.

If Bob only receives the raw hex of TxB, he can’t answer any of the above. Traditionally, he would need to query full block data or rely on a full-node API—introducing additional trust assumptions and network overhead.

BEEF’s approach: when constructing a transaction, the sender should include the verification materials—ancestor transactions and Merkle proofs—right alongside the current transaction. This way, the receiver can independently complete SPV verification.

Basic Structure of BEEF

Per BRC-62, BEEF is a composite format of transactions and proofs. Its conceptual structure:

TEXT
1version -- format version number
2nBUMPs -- number of BUMPs
3BUMP list -- one or more BSV Unified Merkle Paths
4nTransactions -- number of transactions
5transaction list -- raw transaction data
6tx → BUMP index -- marks which BUMP proves a given transaction
  • version: Distinguishes the format version so parsers can upgrade correctly.
  • BUMP list: Follows the BRC-74 BSV Unified Merkle Path format, providing a verifiable path from the transaction to the block’s Merkle root.
  • transaction list: Standard serialized Bitcoin transactions.
  • Association mapping: Specifies the BUMP index for a transaction, determining whether it has a block proof.

This design lets the receiver parse each transaction’s fields and find the corresponding Merkle proof, forming a complete verification chain.

Why Include Ancestor Transactions

Verifying a transaction requires tracing back the source of its inputs.

Suppose TxB spends an output of TxA, and TxA spends an output of Tx0. If TxA hasn’t been included in a block yet, just a Merkle proof for TxA isn’t sufficient—because it’s not yet on-chain. The receiver must then continue tracing to Tx0 until finding an ancestor transaction with a valid block proof.

BEEF natively supports a transaction DAG (Directed Acyclic Graph), not just isolated transactions. A typical structure:

TEXT
1mined ancestor transaction + BUMP
2 └─ child transaction
3 └─ grandchild transaction
4 └─ current transaction to evaluate

The receiver follows the dependency arrows upward until reaching an ancestor already anchored in a block, then validates scripts, amounts, and references downward. There’s no need to contact a Bitcoin full node during this process.

BEEF Verification Process

The verification steps described by BRC-62 can be summarized as:

  1. Parse all BUMPs to obtain an array of Merkle paths.
  2. Parse each raw transaction and compute its txid.
  3. For transactions linked to a BUMP, use the BUMP and txid to compute the Merkle root.
  4. Check with a local block header service (like a ChainTracker) whether these Merkle roots belong to valid block headers on the longest chain.
  5. For transactions without direct BUMPs, check whether their inputs reference parent transactions that have been verified as valid.
  6. Perform script unlocking verification for inputs against outputs.
  7. Check amount conservation and reasonable fees.
  8. Finally, return whether the target transaction is valid.

The key point: this isn’t simply checking “is this transaction in a block.” Rather, it validates a whole chain of transactions step by step, verifying the correctness of dependencies until hitting a root transaction anchored by proof-of-work.

The Beef Class in the SDK

The BSV TypeScript SDK provides a Beef class for working with BEEF. Its main methods include:

  • mergeBump(bump): Merge a BUMP.
  • mergeRawTx(rawTx) / mergeTransaction(tx): Merge a raw transaction.
  • findBump(txid): Find the BUMP for a given txid.
  • verify(chainTracker): Run the validation process described above for all transactions and proofs inside the BEEF.
  • toBinary() / toHex(): Serialize to a binary or hex string.
  • fromBinary() / fromString(): Deserialize from binary or string.

The Transaction class also provides convenience methods:

  • toBEEF(): Export a transaction and its related context as BEEF.
  • fromBEEF(beef, targetTxid): Extract a specific transaction object from BEEF.
  • fromAtomicBEEF(): Process an atomic version of BEEF.

A typical conceptual example:

TypeScript
1import { Beef, Transaction, WhatsOnChain } from '@bsv/sdk'
2
3const beef = Beef.fromString(beefHex, 'hex')
4const chainTracker = new WhatsOnChain('main')
5const ok = await beef.verify(chainTracker)
6
7const tx = Transaction.fromBEEF(beef.toBinary(), targetTxid)

In real projects, you’ll need to adjust the code to the current SDK version and chain state, but the concept remains stable: BEEF is a verifiable transaction-validity bundle.

BEEF vs. Raw Transaction

FeatureRaw TransactionBEEF
ContentsSingle transaction dataMultiple transactions, BUMPs, dependency mapping
Self-sufficiency for verificationLow, requires external queriesHigh, contains necessary ancestors and proofs
Typical useSubmitting to miners or full nodesSPV peer-to-peer payments, Overlay services
DependenciesImplicit (inputs point to txids)Explicit (parent transactions carried directly)

Simply put, a raw transaction tells you “what this transaction is,” while BEEF tells you “how this transaction is proven.”

Division of Labor: BEEF and BUMP

  • BUMP (BSV Unified Merkle Path) is a standalone Merkle path format that tells you how to go from a txid to a Merkle root.
  • BEEF is a container that can hold one or more BUMPs and bind them to the corresponding transactions.

Example: a simple BEEF might contain:

  • one BUMP proving that parent transaction TxA exists on the blockchain;
  • the full transaction data for TxA;
  • the current payment transaction TxB.

The receiver first uses the BUMP to verify that TxA is included in a block on the longest chain, then verifies that TxB correctly references TxA’s output, and finally performs script validation. BUMP handles the Merkle proof; BEEF organizes transactions and proofs together.

Why BEEF Matters

Before BEEF, when applications exchanged transactions, they usually only sent raw transactions. The receiver had to:

  • query the network for parent transactions themselves;
  • find Merkle proof paths on their own;
  • contact a public block header service to confirm on-chain state.

This added latency, network dependencies, and potential verification failures when historical transactions couldn’t be found.

BEEF hands over all verification materials at once, making the payer bear the workload and giving the receiver full local verification capability. This is highly significant for micropayments, direct wallet-to-wallet payments, SPV Wallets, Overlay services, and high-frequency trading scenarios.

Benefits summary:

  • Fewer network round trips.
  • Reduced trust reliance on full-node APIs.
  • Light clients can perform independent security verification.
  • Provides verifiable context for complex transaction chains (e.g., continuous micropayment channels).

What BEEF Cannot Do

Understanding the limits of BEEF is equally important:

  • Does not guarantee final confirmation: BEEF only proves that the carried ancestor transactions were included in a block at some point. It cannot prevent that branch from being reorganized away (chain reorganization risk).
  • Does not replace chain selection: Determining which chain is the longest still requires an external block header service.
  • Does not eliminate double-spend risk: For unconfirmed transactions, BEEF cannot guarantee that another transaction spending the same input doesn’t exist in parallel.
  • Does not validate business semantics: Script-level pass doesn’t mean the transaction follows application-layer business rules.
  • Cannot make an invalid transaction valid: It is only a format; it doesn’t change Bitcoin’s consensus rules.

In short, BEEF is an efficient, standardized proof-packaging format, not a new trust model.

BEEF in the BSV Tech Stack

In the BSV tech stack learning path, BEEF sits between the transaction exchange layer and the SPV verification layer:

TEXT
1Wallet / App creates transaction
2
3Construct BEEF (with built-in ancestors and proofs)
4
5Send to receiver
6
7Receiver parses BEEF
8
9Combines with block header service to verify Merkle root
10
11Validates each transaction’s dependencies and scripts
12
13Decides whether to accept the transaction

Understanding BEEF lays a solid foundation for later study of SPV wallets (phase 11), Overlay networks (phase 13), and real-world application architectures (phase 17).

Common Beginner Misconceptions

  • “BEEF is just an enhanced transaction hex”: No, it’s a composite format containing transactions, BUMPs, and related mapping.
  • “BEEF is BUMP”: BUMP is a Merkle path; BEEF is a container that holds BUMPs and transactions.
  • “BEEF is a full block”: It carries only the minimal transactions and proofs necessary for validation, not complete block data.
  • “With BEEF, you don’t need to verify scripts”: Transaction scripts must still be verified one by one; BEEF just provides context.
  • “BEEF can prove the longest chain on its own”: You still need a block header service or ChainTracker to confirm that the Merkle root belongs to a valid chain.

References & Further Reading

With BEEF, peer-to-peer payments and lightweight validation finally have a standardized, self-contained evidence format—an important building block for the next generation of SPV applications.

Recommended articles