Bitcoin 交易手续费计算器
Bitcoin 手续费等于交易的虚拟大小乘以你为它支付的费率。输入交易的输入和输出数量,选择地址类型,并设定 sat/vB 费率,结果会随你的输入实时更新。
- 固定开销(version、计数器、locktime)
- 10.5 vB
- 1 × 每个输入 68 vB
- 68 vB
- 2 × 每个输出 31 vB
- 62 vB
序列化交易的虚拟大小。见证数据只按其字节长度的四分之一计入,所以 SegWit 输入的 vByte 数会小于其原始字节数。
你为每个 vByte 出的价。矿工按这个费率对内存池排序,因此决定确认速度的是费率本身,而不是总手续费。
每花费一枚币,就会给交易增加一个完整的输入。持有很多小额 UTXO 的钱包,为同样金额的付款要支付比只持有一个大额 UTXO 更多的手续费。
在你自己的代码中发送 Bitcoin
7 天免费试用,无需信用卡,无需 KYC。
比特币交易手续费是如何计算的
手续费是两个数字的乘积:手续费 = 大小(以 vByte 计) × 费率(以 sat/vB 计)。整个公式就是这样。本页其余内容都在讲大小从何而来,因为费率是你自己选的,而大小则是交易本身强加给你的。
公式里完全没有出现的是转账金额。一笔转出 0.001 BTC 的交易和一笔转出 50 BTC 的交易,只要结构相同,费用就完全一样。比特币收取的是区块空间的费用,而不是价值的费用,这也是为什么建立在它之上的支付通道,行为和按比例收费的通道完全不同。
费率是一种出价。矿工会用手头 sat/vB 最高的交易填满下一个区块,因此费率决定了你在队列中的位置,而大小决定了这个位置要花你多少钱。给一笔大额交易提高费率,绝对成本会很高;同样的费率用在一笔小额交易上则很便宜。两者会在同一时间被确认。
为什么用 vByte 而不是字节
在 SegWit 之前,一个区块的序列化交易数据上限是 1 MB,每个字节的权重都一样。SegWit 用一个 400 万权重单位的上限取代了这个上限,并让交易的两个部分拥有不同的权重:基础数据(除见证数据外的所有内容)每字节计 4 个权重单位,见证数据每字节计 1 个。虚拟大小是权重除以 4,因此 vsize = (基础字节数 × 3 + 总字节数) / 4。
这带来的实际效果是:签名被移进了见证部分,而签名正是一个输入的主要体积所在。传统的 P2PKH 输入把签名和公钥放在 scriptSig 中,这属于按全权重计的基础数据,约合 148 vB。P2WPKH 输入把相同的内容放进见证部分,只按四分之一权重计算,约合 68 vB。链上传输的字节数几乎没变,变的是它们占用区块的比例。
由于见证折扣要除以 4,虚拟大小经常会出现小数。SegWit 的标记位和标志位一共是两个见证字节,正好是半个 vByte。计算器会把总数向上取整到下一个整数 vByte,这与节点报告 vsize 时的做法一致。
按地址类型划分的输入与输出大小
以下是计算器使用的单签名估算值。最旧和最新的地址类型之间,输入大小相差近三倍;输出的变化要小得多,而 Taproot 输出是三者中最大的。
| 类型 | 前缀 | 输入 | 输出 |
|---|---|---|---|
| 传统(P2PKH) | 1… |
约 148 vB | 34 vB |
| SegWit(P2WPKH) | bc1q… |
约 68 vB | 31 vB |
| Taproot(P2TR) | bc1p… |
约 57.5 vB | 43 vB |
在输入和输出之外,还有一份固定开销:版本号、输入和输出计数器,以及锁定时间。传统交易为 10 vB,一旦算上 SegWit 的标记位和标志位则约为 10.5 vB。Taproot 的输入数字之所以是 57.5 vB 而不是整数,是因为一个 Schnorr 签名是 64 字节,除以 4 之后正好落在半个 vByte 上。
示例演算
以实际中最常见的结构为例:一个输入、两个输出,其中第二个输出是你自己的找零地址。
全部使用传统地址:10 + 148 + 2 × 34 = 226 vB。按 10 sat/vB 计算,手续费为 2,260 sat,即 0.00002260 BTC。
全部使用 SegWit:10.5 + 68 + 2 × 31 = 140.5 vB,向上取整为 141。同样的费率下,这是 1,410 sat,对同一笔付款而言减少了约 38%。这部分节省几乎全部来自输入。
全部使用 Taproot:10.5 + 57.5 + 2 × 43 = 154 vB,即 1,540 sat。在这种结构下,Taproot 反而不如 SegWit,因为它的每个输出要多花 12 vB,而它的输入只省了 10.5 vB。把结构反过来,排名也会反过来:两个输入、一个输出时,Taproot 是 169 vB,而 SegWit 是 178 vB。Taproot 在你花费大量币时才划算,而不是在你创建大量输出时。
再看一次归集操作。把二十个 P2WPKH 输入合并成一个输出:10.5 + 20 × 68 + 31 = 1,401.5 vB,取整为 1,402。按 3 sat/vB 计算,费用为 4,206 sat。同一个钱包,如果只是用其中一个输入做一笔普通付款,大约只需 423 sat。用十倍的体积换十分之一的费率,这就是归集操作要做的取舍,而这只有在内存池空闲时才划算。
四个例子中贯穿着同一个规律:输入数量是主导项。一个收到过一百笔小额付款的钱包持有一百个 UTXO,无论每一个的价值多小,花掉它们都要付出一百个输入的成本。在费率低于某个水平时,花掉一个 UTXO 的成本甚至会超过它本身的价值。
这个估算没有覆盖到的情况
以上数字假设的是单签名花费,并且所有输入和输出使用统一的地址类型。以下三点会让实际数字发生变化:
签名长度并不固定。DER 编码的 ECDSA 签名通常是 71 或 72 字节,偶尔是 70 字节,因此每个传统或 P2WPKH 输入都可能与估算值相差一个字节。Schnorr 签名固定为 64 字节,这也是为什么 Taproot 花费是唯一一种大小能被提前精确预测的类型。
混合类型很常见。钱包经常会花费一个传统输入,然后转给一个 bech32 地址,找零也用 bech32。用表格中各自对应的行分别计算,再加上一次性的开销即可;这个计算器对所有部分统一使用同一种类型,这对单钱包交易来说是正确的模型,对其他情况则只是一种近似。
多签名和脚本花费完全是另一类情况。一个 2-of-3 的 P2WSH 输入体积是单签名输入的好几倍,而 Taproot 的脚本路径花费还要在见证部分携带脚本和控制块。这两种情况本页都没有覆盖。
用代码读取手续费并支付
手续费估算只有配上实时费率才有用,而费率来自内存池,不是来自公式。Chaingateway 的比特币接口帮你处理了费率的问题:POST /api/v2/bitcoin/transactions 接受 speed 参数,取值为 fast、medium 或 slow,并据此选择手续费,此外还有一个 subtractfee 标志,会把手续费从转账金额中扣除,而不是额外加在上面。这个标志的重要性超出表面:它决定了收款方收到的究竟是发票上写的确切金额,还是略少一些的金额。
完整的接口列表,包括区块、钱包和交易 Webhook,见 比特币 API 页面。其他计算器和参考工具汇总在 工具页面下。
常见问题
Bitcoin 交易手续费是怎么计算的?
大小(以 vByte 计)乘以费率(以 satoshi/vByte 计)。一笔 141 vB 的交易,按 10 sat/vB 计算,需要支付 1,410 sat。你发送的金额从不参与这个计算。
什么是 vByte?
自 SegWit 以来,区块大小就是按这种虚拟字节单位计量的。一笔交易的权重,基础数据按每字节 4 个单位计算,见证数据按每字节 1 个单位计算,vsize 就是这个权重除以 4。因此见证字节的成本只是基础字节的四分之一。
一笔典型的 Bitcoin 交易有多大?
以一个输入、两个输出为例:全 legacy 格式约 226 vB,全 SegWit 格式约 141 vB,全 Taproot 格式约 154 vB。每多一个输入,会按类型不同分别增加 148、68 或 57.5 vB,这也是输入数量对手续费影响最大的原因。
我发送的金额会影响手续费吗?
不会。Bitcoin 收取的是区块空间的费用。只要两笔交易的输入和输出数量相同、地址类型也相同,发送 0.001 BTC 和发送 50 BTC 的手续费是一样的。
为什么输入越多,交易费用越高?
你花费的每一枚币都是一个独立的输入,各自携带自己的签名,而签名占了输入大小的大部分。花费十个小额 UTXO 就要付十个输入的成本。这也是钱包倾向于在网络空闲、sat/vB 费率较低时合并 UTXO 的原因——那时把它们合并成一笔大额交易更划算。
sat/vB 是什么意思?
即每虚拟字节的 satoshi 数,是你为区块空间出的价。1 satoshi 等于 0.00000001 BTC,即 100,000,000 sat 等于 1 BTC。矿工按这个费率对内存池排序,因此决定确认速度的是费率本身,而不是总手续费。
Taproot 比 SegWit 便宜吗?
只有在交易以输入为主时才更便宜。一个 P2TR 输入约为 57.5 vB,而 P2WPKH 输入约为 68 vB;但 P2TR 输出为 43 vB,P2WPKH 输出只有 31 vB。一个输入、两个输出的组合,Taproot 是 154 vB,SegWit 是 141 vB;而两个输入、一个输出的组合则反过来,分别是 169 vB 和 178 vB。
为什么我的钱包显示的手续费和这里略有不同?
通常有三个原因。ECDSA 签名的长度在 70 到 72 字节之间波动,因此每个 legacy 或 P2WPKH 输入的估算可能相差一个字节。钱包也常常在输入、付款输出和找零输出之间混用不同的地址类型。此外,钱包会根据自己观察到的内存池状况选择费率,而这个计算器使用的是你手动输入的费率。