费用计算
目录
费用概念
什么是交易费用
定义:
交易费用 = 输入总值 - 输出总值
例子:
输入:5 BTC
输出 1:2 BTC(支付)
输出 2:2.99 BTC(找零)
费用:5 - 2 - 2.99 = 0.01 BTC
用途:
1. 激励矿工
2. 防止垃圾交易(DoS 防护)
3. 优先级机制费用的两个角度
钱包角度:
"我需要支付多少费用来打包我的交易?"
→ 根据网络情况估计
→ 平衡速度和成本
矿工角度:
"我应该选择哪些交易放入区块?"
→ 选择费率最高的交易
→ 最大化区块收益费率计算
费率的定义
费率:单位大小的费用
公式:
fee_rate = total_fee / tx_size
单位:
sat/B:聪每字节
sat/vB:聪每虚拟字节(考虑 SegWit)
BTC/kB:(已弃用)
示例:
交易 250 字节
费用 0.001 BTC = 100,000 聪
费率 = 100,000 sat / 250 B = 400 sat/B虚拟字节(vByte)
概念:
考虑 SegWit 的加权字节大小
计算:
vBytes = (base_size × 3 + total_size) / 4
其中:
base_size = 不包括见证数据的大小
total_size = 完整交易大小
示例:
传统交易(250 字节):vBytes = 250
SegWit 交易:
基础:180 字节
见证:75 字节
总计:255 字节
vBytes = (180 × 3 + 255) / 4 = 197 vBytes
优势:
可比较传统和 SegWit 交易
SegWit 实际上更便宜(字节更少)费用估计
费率参考
市场费率(实时变化):
低速(可能 1-12 小时):
低需求:1-10 sat/B
适合:不急的转账
常规速度(约 30 分钟):
中等需求:25-50 sat/B
适合:一般日常交易
快速(约 10 分钟):
高需求:50-150 sat/B
适合:需要快速确认
极速(约 1-3 分钟):
非常高需求:150-300+ sat/B
适合:紧急交易
查询方式:
1. Mempool.space
2. Bitcoinfees.earn.com
3. 本地 bitcoind estimatefee费用估计器
公式:
estimated_fee = estimated_fee_rate × tx_size
例子:
估计费率:50 sat/B
预计交易大小:250 字节
估计费用 = 50 × 250 = 12,500 sat = 0.000125 BTC
对于找零:
额外输出增加 34 字节
额外费用 = 50 × 34 = 1,700 sat
精确计算需要在交易完全构造后交易大小
大小计算公式
基本开销(所有交易):
版本号(4)+ 输入计数(1)+ 输出计数(1)+ 锁定时间(4)
= 10 字节
每个输入(P2PKH):
前一 TXID(32)+ Vout(4)+ 脚本长度(1)+ 签名(72)+ 公钥(33)+ 序列(4)
= 146 字节
每个输出(P2PKH):
金额(8)+ 脚本长度(1)+ 脚本(25)
= 34 字节
总大小 = 10 + 输入数 × 146 + 输出数 × 34
简化:
1 输入 1 输出:约 190 字节
1 输入 2 输出:约 225 字节
2 输入 1 输出:约 340 字节SegWit 优化
SegWit v0 (P2WPKH):
每个输入:约 105 字节(减少 27%)
节省:41 字节/输入
使用 SegWit 的优势:
1. 交易更小
2. 相同费率下费用更低
3. 更快的交易传播
示例对比:
传统 P2PKH(1 输入 2 输出):225 字节
SegWit(1 输入 2 输出):141 vBytes
以 50 sat/B 计算:
传统:225 × 50 = 11,250 sat
SegWit:141 × 50 = 7,050 sat
节省:36%优化费用
减小交易大小
1. 使用压缩公钥
压缩:33 字节
未压缩:65 字节
节省:32 字节/输入
2. 使用 SegWit
减少约 25-30% 的大小
3. 合并输入
减少多笔小额交易
定期整理
4. 使用 P2SH 或 P2WSH
对于复杂脚本更高效
5. 避免 OP_RETURN
数据交易往往很大批量处理
概念:
一笔交易中向多个接收人转账
优势:
共享交易开销
每个额外输出只增加 34 字节
例子:
发送给 100 个人
单独方式:
100 笔交易 × 225 字节 = 22,500 字节
100 笔交易 × 11,250 sat = 1,125,000 sat
批量方式:
1 笔交易(多输出):10 + 146 + 3400 = 3,556 字节
1 笔交易:3,556 × 50 = 177,800 sat
节省:84%!Coin Join
概念:
多个用户的输入/输出混合在一个交易中
优势:
提高隐私性
降低平均费率
例子:
5 个用户各有 1 BTC,各要发送 0.2 BTC
分开:5 × 225 字节 = 1,125 字节
合并:1 × (10 + 5×146 + 10×34) = 800 字节
节省:29%
额外好处:隐私改进动态调整
RBF(Replace-by-Fee)
场景:
交易发送后,发现费用太低,迟迟未确认
解决方案:
创建新交易,使用相同输入,更高费用
RBF 条件:
1. 原交易 RBF 信号(序列 < 0xFFFFFFFF)
2. 新交易费用 > 旧交易费用 + 新增费用
3. 新交易不被其他原因拒绝
实现(Bitcoin Core):
$ bitcoin-cli sendrawtransaction <new_tx>
系统检测到冲突,替换旧交易CPFP(Child-Pays-For-Parent)
场景:
父交易费用低,子交易需要快速确认
解决方案:
创建高费率的子交易
矿工为了收父交易的费用,也会打包父交易
机制:
1. 父交易:低费
2. 子交易:花费父交易的输出,高费
3. 矿工:为了收子交易高费,也收父交易低费
4. 两个都被确认
通常不推荐:
因为父交易如果 RBF 信号被禁用,无法调整实际例子
例子 1:标准转账
场景:
Alice 发送 1 BTC 给 Bob
钱包中有一个 2 BTC 的 UTXO
网络费率:50 sat/B
预估步骤:
1. 交易结构
输入:1 个(P2PKH)= 146 字节
输出:2 个(支付 + 找零)= 68 字节
开销:10 字节
总计:10 + 146 + 68 = 224 字节
2. 费用计算
费率 × 大小 = 50 × 224 = 11,200 sat ≈ 0.000112 BTC
3. 构造交易
输入:2 BTC
支付:1 BTC
找零:2 - 1 - 0.000112 = 0.999888 BTC
费用:0.000112 BTC
4. 广播
发送到网络,等待确认例子 2:低费率调整
场景:
交易发送 1 小时未确认
想加快速度
当前:
交易大小:224 字节
当前费率:30 sat/B
当前费用:6,720 sat
新网络费率:80 sat/B
RBF 步骤:
1. 计算所需费用
新费用 = 224 × 80 = 17,920 sat
额外费用 = 17,920 - 6,720 = 11,200 sat
2. 创建 RBF 交易
使用相同输入
调整找零:
找零 = 2 - 1 - 0.000179 = 0.999821 BTC
3. 广播
网络检测冲突,替换旧交易
新交易以 80 sat/B 优先级在内存池中常见问题
Q1: 最低费用是多少?
A:
- 网络不强制最小费用
- 标准中继最小:1 sat/B
- 实际推荐:10-50 sat/B
Q2: 为什么费用会波动?
A:
- 取决于网络拥堵程度
- 比特币使用量增加 → 费用上升
- 使用量减少 → 费用下降
Q3: 使用 SegWit 真的能省钱吗?
A:
- 是的,约节省 25-35%
- 但需要钱包支持
- 现在大多数钱包都支持
Q4: 如何预测未来的费率?
A:
- 短期(几小时):看内存池大小
- 中期(几天):观察历史趋势
- 长期(几月):很难预测
Q5: 交易不被确认怎么办?
A:
- 等待(可能数小时)
- 使用 RBF 提高费用
- 最后手段:钱包/交易所可能有"加速"功能
