区块链

手动指定交易输出,掌握 BSV 应用设计的关键一步

理解比特币交易输出(output)的机制,从手动构造交易开始。本文介绍输出的类型、找零规则、索引顺序及常见误区,帮助你从“会发交易”进阶到“会设计 BSV 应用”。

林知衡

林知衡

technical_editor

发布于 2026年6月18日2 分钟阅读

一句话理解

手动指定 output,就是明确决定这笔交易要创建哪些新 UTXO、每个 output 放多少 satoshis,以及用什么 locking script 锁住它。

如果说 input 是“花掉旧 UTXO”,那么 output 就是“创造新 UTXO”。比特币交易的本质就是这个循环:花掉旧 UTXO,创建新 UTXO。

手动指定交易输出,掌握 BSV 应用设计的关键一步 文章封面

output 决定交易的结果

一个 output 至少包含两个核心元素:

  • satoshis:这个 output 携带多少 BSV 最小单位。
  • locking script:表示未来谁能花这个 output,或这个 output 是否只是承载数据。

一笔交易可以有多个 outputs。例如:

Code
1input:
2 花掉一个 1000 satoshis 的 UTXO
3
4outputs:
5 output 0: 300 satoshis 给收款人
6 output 1: 600 satoshis 找零给自己
7 output 2: 0 satoshis OP_RETURN 数据
8 fee: 100 satoshis

注意,手续费不是一个 output。手续费是 input 总额减 output 总额后的差额。

常见 output 类型

1. 普通支付 output

普通支付通常使用 P2PKH 或类似脚本。它表达的是:未来花费者必须提供对应公钥和有效签名。

TypeScript
1tx.addOutput({
2 lockingScript: new P2PKH().lock(recipientAddress),
3 satoshis: 100
4})

2. 找零 output

当 input 金额大于目标 outputs 和手续费时,剩余金额通常要回到自己控制的地址。可以使用 change: true 标记找零输出,让 SDK 在计算费用后填充找零金额。

TypeScript
1tx.addOutput({
2 lockingScript: new P2PKH().lock(myAddress),
3 change: true
4})

3. 数据 output

数据输出常见形式是 OP_RETURN。它不是为了未来花费,而是为了记录数据。

TypeScript
1tx.addOutput({
2 lockingScript: Script.fromASM('OP_RETURN 48656c6c6f20425356'),
3 satoshis: 0
4})

4. 应用协议 output

应用可以在 output 中放入符合某种协议的数据或脚本,例如 token 状态、凭证、订单、供应链事件。关键不是“能放进去”,而是要有可解析、可验证的协议格式。

output index 很重要

一个交易里的 output 有顺序。第一个是 index 0,第二个是 index 1。

未来要花某个 output 时,input 必须引用:

Code
1txid + output index

所以 output 的顺序会进入后续交易引用关系。

如果应用协议要求某个数据在第 0 个 output、某个 token 状态在第 1 个 output,就不能随意打乱顺序。钱包或 SDK 的 output randomization 功能在隐私场景有价值,但协议场景要谨慎使用。

手动 output 的完整流程

低层构造交易时,常见顺序是:

  1. 创建 Transaction
  2. 添加一个或多个 inputs
  3. 添加目标 outputs
  4. 添加找零 output
  5. 计算 fee
  6. 签名
  7. 序列化或广播

对应到 SDK 概念:

TypeScript
1const tx = new Transaction()
2
3tx.addInput({
4 sourceTransaction,
5 sourceOutputIndex: 0,
6 unlockingScriptTemplate: new P2PKH().unlock(privateKey)
7})
8
9tx.addOutput({
10 lockingScript: new P2PKH().lock(recipientAddress),
11 satoshis: 100
12})
13
14tx.addOutput({
15 lockingScript: new P2PKH().lock(myAddress),
16 change: true
17})
18
19await tx.fee()
20await tx.sign()

这比直接使用 createAction() 要繁琐,但它让交易结果的形成过程完全透明。

找零 output 不能漏

手动构造交易时,一个严重错误是忘记找零。

假设 input 是 10000 satoshis,你只创建一个 100 satoshis 的输出。如果没有找零,剩下 9900 satoshis 不会自动回到你账户里,而会变成手续费。

简化公式:

Code
1fee = inputs 总额 - outputs 总额

所以 outputs 写少了,手续费就会异常变高。

在 BSV 技术栈里的位置

BSV 应用的业务语义经常体现在 outputs 里。

  • 付款应用:关注收款 output 和找零 output。
  • 数据应用:关注 OP_RETURN output 的协议字段。
  • Token 应用:关注代表资产状态的可花费 output。
  • Overlay 服务:可能会根据 output 的脚本、数据格式和协议标识来索引应用数据。

因此,手动理解 outputs 是从“会发交易”进入“会设计 BSV 应用”的关键一步。

新手常见误解

  • output 不是备注字段,它是交易的核心结果。
  • 找零 output 不是可选细节,忘记找零会造成异常高额手续费。
  • OP_RETURN 数据 output 和 P2PKH 支付 output 不是同一类东西。
  • output index 从 0 开始,未来引用 output 时必须指定正确 index。
  • 输出顺序可能影响应用协议解析,不是所有场景都适合随机排序。

参考来源

推荐文章