BSV 交易手续费如何计算:输入总额减去输出总额

BSV 交易手续费不是独立字段,而是输入总额减去输出总额。理解这个规则有助于正确处理找零、估算费用、管理 UTXO,并避免把余额误作为手续费。

林知衡

林知衡

technical_editor

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

在 BSV 交易中,手续费不是一个单独写在交易里的字段。它来自一个简单但非常关键的规则:

TEXT
1fee = sum(inputs) - sum(outputs)

也就是说,交易的所有输入金额减去所有输出金额,差额就是手续费。矿工通过这部分差额获得交易处理费用。

这个规则看似简单,但对手动构造交易、管理 UTXO、估算费用和排查交易失败都非常重要。尤其是忘记创建找零 output 时,可能会把原本属于自己的余额全部变成手续费。

一句话理解:手续费来自输入输出差额

BSV 采用 UTXO 模型。交易会消耗旧的输出作为 input,再创建新的 output。

在这个模型里,并没有一个字段专门写着:

TEXT
1fee = 5 satoshis

手续费是通过金额差额隐含表达的:

TEXT
1手续费 = 输入总额 - 输出总额

只要输入总额大于输出总额,剩下没有被分配到任何 output 的金额,就会被视为矿工可获得的手续费。

手续费如何计算

假设一笔交易有两个 input:

  • input 1:1000 satoshis
  • input 2:500 satoshis

输入总额为:

TEXT
11000 + 500 = 1500 satoshis

这笔交易创建两个 output:

  • output 0:给收款人 600 satoshis
  • output 1:找零 895 satoshis

输出总额为:

TEXT
1600 + 895 = 1495 satoshis

那么手续费就是:

TEXT
11500 - 1495 = 5 satoshis

交易本身不会额外保存一个“手续费字段”。矿工和节点可以通过输入输出金额直接计算出这笔交易支付了多少费用。

为什么采用这种设计

在 UTXO 模型中,input 的作用是消耗已有的 UTXO,output 的作用是创建新的 UTXO。

如果一笔交易消耗了 1500 satoshis 的旧输出,却只创建了 1495 satoshis 的新输出,那么少掉的 5 satoshis 并没有被分配给任何接收方。协议会把这部分差额视为交易手续费。

这种设计有几个特点:

  • 不需要额外的手续费字段。
  • 手续费与交易结构直接绑定。
  • 任何人都可以通过输入输出金额验证费用。
  • 手续费计算与 UTXO 消耗、找零创建天然结合。

因此,只要你手动构造交易,就必须明确每个 input 的金额、每个 output 的金额,以及最后留下多少差额作为手续费。

忘记找零 output 的后果

忘记找零是手动构造交易时最常见、也最严重的错误之一。

假设你有一个金额为 100000 satoshis 的 UTXO,想给别人支付 1000 satoshis。

如果你只创建一个 output:

TEXT
1output:给收款人 1000 satoshis

那么交易手续费会变成:

TEXT
1100000 - 1000 = 99000 satoshis

也就是说,剩下的 99000 satoshis 不会自动回到你的钱包,而是全部成为手续费。

你原本可能只想支付 2 satoshis 手续费,但由于没有创建找零 output,整个未分配余额都会被协议视为费用。

钱包通常会自动处理找零,包括选择 inputs、创建收款 output、创建找零 output 和估算手续费。但如果你在代码中手动构造交易,就必须显式创建找零 output,并确保输出总额与预期手续费匹配。

手续费和交易大小的关系

手续费通常与交易大小有关。交易越大,需要支付的费用可能越多。

影响交易大小的因素包括:

  • input 数量
  • output 数量
  • 脚本长度
  • OP_RETURN 数据大小
  • 签名数量
  • 是否包含额外证明或背景数据

因此,转账金额小并不意味着交易体积一定小。

例如,一笔只转出很少金额的交易,如果包含大量 inputs,或者携带较大的 OP_RETURN 数据,也可能成为一笔体积较大的交易。矿工和交易处理服务通常会结合费率、交易大小和自身策略判断是否接受交易。

对于大交易,可以参考 BSV TypeScript SDK 的 Large Transactions guide:

https://bsv-blockchain.github.io/ts-sdk/guides/large-transactions/

BSV 的低费不等于零费

BSV 强调低费用,目标是支持微支付和高频数据交易。但低费并不等于零费,也不意味着可以无限制提交垃圾数据。

开发者仍然需要考虑:

  • 最低可接受费用
  • dust output
  • 交易大小
  • 矿工 policy
  • 服务商 API 限制
  • 大批量交易的总成本

低费用是 BSV 的重要优势之一,但它需要工程上的费用估算和 UTXO 管理配合。对于生产应用来说,费用不是可以忽略的细节,而是交易构造、广播和运营成本的一部分。

手续费与矿工激励

矿工处理交易、打包区块,需要获得经济激励。

在 Bitcoin/BSV 中,矿工收入主要来自两部分:

  • 区块补贴
  • 交易手续费

随着区块补贴长期下降,交易手续费会变得越来越重要。

BSV 的经济模型强调低费高量:单笔交易手续费可以很低,但如果交易数量足够大,总手续费仍然可以支撑交易处理者的收入。

因此,低手续费并不是取消激励,而是把经济模型建立在更高交易量和更低单笔成本之上。

SDK 与钱包如何处理费用

使用 @bsv/sdk 或钱包接口时,很多费用细节通常会被自动处理。

钱包或 SDK 相关工具通常会完成:

  • 选择 inputs
  • 创建收款 outputs
  • 创建找零 output
  • 估算手续费
  • 签名交易

但自动处理并不意味着开发者可以完全不了解费用机制。生产应用仍然可能遇到以下问题:

  • 费用估算失败
  • 交易过大
  • 余额足够但 UTXO 不合适
  • 服务返回费用不足
  • 重试时产生重复交易

理解“手续费 = 输入总额 - 输出总额”有助于开发者排查这些问题。例如,当服务提示费用不足时,可以检查交易大小、input/output 金额、找零设置以及使用的费率是否符合矿工或服务商策略。

ARC 相关实现可参考:

https://github.com/bitcoin-sv/arc

新手常见误解

下面这些误解在交易构造和调试中很常见:

  • 手续费不是交易里的独立 output。
  • 手续费等于输入总额减输出总额。
  • 忘记找零会让剩余金额全部变成手续费。
  • 低费不等于零费。
  • 转账金额小不代表交易体积小。
  • 多 input 交易可能需要更多手续费。
  • 钱包自动估费不代表永远不会出错。

实践建议

如果你正在手动构造 BSV 交易,建议始终检查以下事项:

  1. 明确所有 input 的金额。

  2. 明确所有收款 output 的金额。

  3. 显式创建找零 output。

  4. 用公式计算实际手续费:

    TEXT
    1fee = sum(inputs) - sum(outputs)
  5. 检查交易大小是否符合预期。

  6. 确认费用满足矿工或交易处理服务的 policy。

  7. 对大批量交易进行总成本估算。

只要掌握这个核心规则,BSV 交易中的费用问题就会清晰很多:钱不是“额外扣掉”的,而是在输入输出之间没有被重新分配的那部分,成为了手续费。

参考资料

推荐文章