区块链2026年6月30日5 分钟阅读

理解 BEEF:比特币交易验证的“证明材料包”

BEEF(Background Evaluation Extended Format)是一种将交易、祖先交易和 Merkle 证明打包在一起的数据格式。它让接收方可以独立完成 SPV 验证,而不依赖完整链数据。本文介绍 BEEF 的动机、结构、验证逻辑及其在 BSV 技术栈中的位置。

林知衡

林知衡

technical_editor

分享

先讲结论

如果你做过比特币开发,一定知道:验证一笔交易时,不能只看这笔交易本身。接收方需要确认它花费的 UTXO 真实存在、属于哪笔父交易、父交易是否已被区块链确认。

BEEF(Background Evaluation Extended Format)正是为这个场景设计的。它把一笔或多笔交易、它们的祖先交易、以及对应的 Merkle 路径(BUMP)打包成一个自包含的数据包。接收方拿到 BEEF 后,可以沿着依赖链一路验证到已被区块证明锚定的交易,而不必自己漫无目的地查询历史。

本文基于 BRC-62 和实际 SDK 的行为,说明 BEEF 的动机、可验证的结构,以及它在 SPV 钱包、Overlay 网络和高频支付场景中的重要性。

理解 BEEF:比特币交易验证的“证明材料包” 文章封面

背景:为什么单笔交易不够

假设 Alice 向 Bob 发送一笔交易 TxBTxBTxA 的某个 output 作为 input 花掉。

Bob 要确认这笔付款可靠,至少需要知道:

  • TxA 是否真的存在,并已被网络接受;
  • TxA 的 output 是否的确被 TxB 花费;
  • TxB 的签名和脚本是否有效;
  • TxA 是否已被某个区块包含,并处于最长链中。

如果只给 Bob 一段 TxB 的原始 hex,他无法回答上面的任何问题。传统做法是让 Bob 自己查询完整的区块数据或依赖全节点 API,这会带来额外的信任假设和网络开销。

BEEF 的思路是:发送方在构造交易时,就应该把验证所需的祖先交易和 Merkle 证明一并打包,随当前交易发给对方。这样接收方就能以 SPV 的方式独立完成验证。

BEEF 的基本结构

根据 BRC-62,BEEF 是交易和证明的复合格式。其概念结构如下:

TEXT
1version -- 格式版本号
2nBUMPs -- BUMP 数量
3BUMP list -- 一个或多个 BSV Unified Merkle Path
4nTransactions -- 交易数量
5transaction list -- 原始交易数据
6tx → BUMP index -- 标记某笔交易由哪个 BUMP 证明
  • version:用于区分格式版本,保证解析器可以正确升级。
  • BUMP list:遵循 BRC-74 的 BSV Unified Merkle Path 格式,提供从交易到区块 Merkle 根的可验证路径。
  • transaction list:标准序列化的比特币交易。
  • 关联映射:指定某笔交易对应的 BUMP 索引,从而确定该交易是否具备区块证明。

这种设计让接收方既能解析每一笔交易的字段,也能找到它们对应的 Merkle 证明,形成一个完整的验证链条。

为什么要包含祖先交易

一笔交易的验证必须向上追溯其 input 来源。

假设 TxBTxA 的 output,TxA 又花 Tx0 的 output。如果 TxA 还没有被包含进区块,那么仅凭 TxA 的 Merkle 证明是不够的——因为它本身还未上链。这时接收方必须继续追溯到 Tx0,直到找到一个带有有效区块证明的祖先交易为止。

所以 BEEF 天然支持交易 DAG(有向无环图),而不是只包含孤立的交易。典型结构如下:

TEXT
1已挖矿祖先交易 + BUMP
2 └─ 子交易
3 └─ 孙交易
4 └─ 当前待评估交易

接收方顺着依赖箭头向上验证,直到找到一个已经锚定在区块中的祖先,然后向下验证脚本、金额和引用关系。整个过程无需访问区块链全节点。

BEEF 的验证过程

BRC-62 描述的验证步骤可以概括为:

  1. 解析所有 BUMP,获得 Merkle 路径数组。
  2. 解析每一笔 raw transaction,计算其 txid。
  3. 对与 BUMP 关联的交易,用 BUMP 和 txid 计算 Merkle root。
  4. 向本地区块头服务(如 ChainTracker)查询这些 Merkle root 是否属于最长链的合法区块头。
  5. 对没有直接 BUMP 的交易,检查其 input 是否引用了已验证有效的父交易。
  6. 执行输入脚本与输出脚本的解锁验证。
  7. 检查 amount 守恒和 fee 的合理性。
  8. 最终返回目标交易是否有效。

关键点在于:这不是简单地检查“交易是否在某个块里”,而是以多条交易组成的链为单位,逐级验证依赖关系的正确性,直至遇到已经由工作量证明锚定的根交易。

SDK 中的 Beef 类

BSV TypeScript SDK 提供了 Beef 类来操作 BEEF。其主要方法包括:

  • mergeBump(bump):合并一个 BUMP。
  • mergeRawTx(rawTx) / mergeTransaction(tx):合并原始交易。
  • findBump(txid):根据 txid 查找对应的 BUMP。
  • verify(chainTracker):对 BEEF 内的所有交易和证明执行上述验证流程。
  • toBinary() / toHex():序列化为二进制或十六进制字符串。
  • fromBinary() / fromString():从二进制或字符串反序列化。

Transaction 类也提供了便捷方法:

  • toBEEF():将一笔交易及其相关上下文导出为 BEEF。
  • fromBEEF(beef, targetTxid):从 BEEF 中提取特定交易对象。
  • fromAtomicBEEF():处理原子化版本的 BEEF。

一个典型的概念验证示例:

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)

实际项目需要根据 SDK 当前版本和链状态调整代码,但概念是稳定的:BEEF 就是一个可验证的交易有效性资料包。

BEEF vs. Raw Transaction

特性Raw TransactionBEEF
包含内容单笔交易数据多笔交易、BUMP、依赖映射
验证自足性低,需要外部查询高,内含必要祖先和证明
适用场景推送给矿工或全节点SPV 点对点支付、Overlay 服务
依赖关系隐式(input 指向 txid)显式(直接携带父交易)

简单说,Raw Transaction 只告诉你“这笔交易是什么”,而 BEEF 告诉你“这笔交易是如何被证明的”。

BEEF 与 BUMP 的分工

  • BUMP(BSV Unified Merkle Path)是一个单独的 Merkle 路径格式,告诉你怎么从 txid 算到 Merkle root。
  • BEEF 是一种容器,可以包含一个或多个 BUMP,并把它们和对应的交易绑定在一起。

举例:一个简单的 BEEF 可能包含:

  • 一个 BUMP,证明父交易 TxA 已存在于区块链中;
  • TxA 的完整交易数据;
  • 当前付款交易 TxB

接收方先通过 BUMP 验证 TxA 是否被区块包含且处于最长链,然后验证 TxB 是否正确引用了 TxA 的 output,最后执行脚本验证。BUMP 负责 Merkle 证明,BEEF 负责把交易和证明组织在一起。

为什么 BEEF 很重要

在没有 BEEF 以前,应用之间交换交易时,通常只能发送 raw transaction,接收方必须:

  • 自己去网络查询父交易;
  • 自行寻找 Merkle 证明路径;
  • 访问公共区块头服务确认链上状态。

这不但增加了延迟和网络依赖,还可能因为查询不到历史交易而验证失败。

BEEF 将验证所需的所有材料一次性交给对方,让支付方承担工作量,为接收方提供完整的本地验证能力。这对微支付、移动钱包间的直接支付、SPV Wallet、Overlay 服务以及高频交易场景意义重大。

总结优点:

  • 减少网络往返次数。
  • 降低对全节点 API 的信任依赖。
  • 让轻客户端也能进行独立的安全验证。
  • 为复杂的交易链(如连续微支付通道)提供可验证的上下文。

BEEF 不能做什么

理解 BEEF 的能力边界同样重要:

  • 不保证最终确认:BEEF 只能证明所携带的祖先交易在某一时刻被区块包含,但不能阻止该分支被重组废弃(链重组风险)。
  • 不替代链选择:判断哪条链是最长链仍需外部区块头服务。
  • 不消除双花风险:对于尚未确认的交易,BEEF 不能保证不会有另一笔花费相同 input 的交易并行存在。
  • 不验证业务语义:脚本验证通过不等于交易遵循了应用层的业务规则。
  • 不能把无效交易变有效:它只是一个格式,不改变比特币网络的共识规则。

简单来说,BEEF 是一个高效、标准化的证据打包格式,而不是一种新的信任模型。

在 BSV 技术栈中的坐标

在 BSV 技术栈的学习路线中,BEEF 处于交易交换层和 SPV 验证层之间:

TEXT
1钱包 / 应用创建交易
2
3构造 BEEF(内置祖先和证明)
4
5发送给接收方
6
7接收方解析 BEEF
8
9结合区块头服务验证 Merkle root
10
11逐笔验证交易依赖和脚本
12
13决定是否接受交易

理解 BEEF 可以为后续学习 SPV 钱包(阶段 11)、Overlay 网络(阶段 13)以及真实应用架构(阶段 17)打好扎实的基础。

新手常见误解

  • “BEEF 就是增强版交易 hex”:不,它是包含交易、BUMP 和相关映射的复合格式。
  • “BEEF 就是 BUMP”:BUMP 是 Merkle 路径,BEEF 是容纳 BUMP 和交易的容器。
  • “BEEF 是一个完整区块”:它仅携带验证所必需的最小交易和 proofs,不是完整区块数据。
  • “有了 BEEF 就不需要验证脚本”:交易脚本仍然必须逐个验证,BEEF 只是提供了上下文。
  • “BEEF 可以独自证明最长链”:还需要区块头服务或 ChainTracker 来确认 Merkle root 位于有效链中。

参考与延伸阅读

通过 BEEF,点对点支付和轻量级验证终于有了一个标准化的、自包含的证据格式,这将成为下一代 SPV 应用的重要基础。

推荐文章