Skip to content

费用计算

目录

  1. 费用概念
  2. 费率计算
  3. 费用估计
  4. 交易大小
  5. 优化费用
  6. 动态调整
  7. 实际例子
  8. 常见问题

费用概念

什么是交易费用

定义:
  交易费用 = 输入总值 - 输出总值

例子:
  输入: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:

  1. 等待(可能数小时)
  2. 使用 RBF 提高费用
  3. 最后手段:钱包/交易所可能有"加速"功能