什么是 raw transaction:BSV 交易序列化、TXID 与签名的基础

raw transaction 是交易按协议规则序列化后的原始字节表示,通常以十六进制字符串展示。它关系到 TXID、签名、广播和调试,是理解 BSV 交易底层机制的关键概念。

林知衡

林知衡

technical_editor

发布于 2026年5月26日10 分钟阅读

在 BSV 开发中,**raw transaction(原始交易)**指交易按照协议规则序列化之后得到的原始字节表示,通常用十六进制字符串展示。

一句话理解:你在代码里看到的交易对象,最终必须被序列化成确定的字节数据,才能计算 TXID、生成签名,并广播到网络。

为什么需要 raw transaction

开发者在代码中通常更习惯处理结构化对象,例如:

TEXT
1inputs: [...]
2outputs: [...]
3fee: ...

这种形式适合人阅读和程序组织逻辑,但区块链网络并不会传输这类“带字段名”的对象。网络传输和节点处理的是按协议规则排列的字节。

raw transaction 就是这段字节序列的十六进制表示。

一笔交易的序列化数据通常包含:

  • 版本(version)
  • input 数量
  • 每个 input 的 outpoint
  • 每个 input 的解锁脚本(unlocking script)
  • 每个 input 的 sequence
  • output 数量
  • 每个 output 的金额
  • 每个 output 的锁定脚本(locking script)
  • locktime

不同交易格式和协议升级细节可能存在差异,但核心要求不变:交易必须有确定的序列化表示。只有这样,不同节点和工具才能对同一笔交易得到一致的解析、签名验证和交易标识。

raw transaction 与 TXID 的关系

TXID 通常由交易的序列化数据计算而来。可以粗略理解为:

TEXT
1交易字段 -> 序列化 -> raw transaction bytes -> double SHA-256 -> TXID

也就是说,TXID 依赖底层字节数据。如果序列化结果发生变化,TXID 也可能变化。

这就是为什么交易字段顺序、字节编码、script 内容和签名数据都很重要。即使从业务角度看像是“同一笔付款”,只要底层字节不同,它就可能是一笔不同的交易。

raw transaction 与签名的关系

交易签名同样依赖交易的序列化形式。

在签名时,钱包或 SDK 会按照协议规则构造待签名的数据摘要。这个摘要来自交易内容,以及被花费 output 的相关信息。

因此,如果你手动修改 raw transaction 中的 output 金额、脚本或 input 引用,原来的签名很可能失效。签名不是独立附着在交易之外的装饰性字段,而是与具体交易内容绑定。

所以,raw transaction 不是可以随意拼接或手改的字符串。构造和修改交易时,应使用 SDK 或钱包提供的序列化与签名逻辑。

如何查看 raw transaction

区块浏览器、钱包工具或 SDK 通常都可以查看一笔交易的 raw transaction。

在学习阶段,建议用两种方式观察同一笔交易:

  1. 人类可读视图:查看 inputs、outputs、fee、脚本等解析后的字段。
  2. raw transaction 十六进制:查看真实的网络编码形式。

这样可以逐渐建立一个重要认知:区块浏览器页面展示的是解析结果,而链上真正保存、传播和验证的是序列化后的交易数据。

raw transaction 不是 JSON

这是新手很容易混淆的地方。

JSON 是应用层常用的数据格式,字段名清楚,便于人阅读和调试。但 Bitcoin/BSV 交易序列化不是 JSON,而是一种紧凑的二进制协议格式。

因此,下面这种理解是错误的:

JavaScript
1const rawTx = JSON.stringify(transactionObject)

把交易对象做 JSON.stringify 并不会得到 raw transaction。正确做法是使用 BSV SDK、钱包或符合协议的序列化逻辑,把交易编码成协议规定的字节格式。

raw transaction 常见调试场景

日常开发中,你通常不需要手写 raw transaction。但当交易构造、签名或广播出现问题时,raw transaction 是非常关键的排查材料。

常见场景包括:

  • TXID 与预期不一致
  • 签名验证失败
  • input 引用错误
  • output 金额或脚本错误
  • 手续费异常
  • 交易广播被拒绝
  • endian 显示造成混淆
  • SDK 与服务返回结果不一致

在这些问题中,结构化对象或页面展示可能不足以定位原因。raw transaction 能让你回到字节层面确认:这笔交易到底是什么。

BSV 开发中的实践建议

对于新手开发者,建议优先使用官方 SDK 或成熟钱包来构造 raw transaction,不要手写序列化逻辑。

但你仍然需要理解 raw transaction 的存在,因为:

  • 广播接口通常提交的是 raw tx
  • ARC 等服务处理的是实际交易数据
  • 区块链保存的是交易字节
  • TXID 和签名都依赖序列化结果
  • SPV 证明最终也要绑定到具体交易

理解 raw transaction,可以帮助你从“会调用 SDK”进一步提升到“能解释 SDK 做了什么”。这对于排查签名、广播、脚本和交易结构问题尤其重要。

新手常见误解

可以用以下几点快速检查自己的理解:

  • raw transaction 不是 JSON
  • raw transaction 不是区块浏览器页面
  • 修改交易字段可能影响 TXID 和签名
  • 复制 raw tx 时要确认网络、状态和来源
  • 手写 raw tx 容易出错,应优先使用 SDK
  • 调试底层问题时,raw tx 是最重要的材料之一

参考资料

推荐文章