Skip to content

内存池

目录

  1. 内存池概述
  2. 交易生命周期
  3. 优先级机制
  4. 内存池管理
  5. 内存池查询
  6. 常见问题

内存池概述

什么是内存池

内存池(Memory Pool / Mempool):
  比特币节点中的交易等待队列
  
特点:
  1. 临时存储未确认交易
  2. 内存中保存(不持久化)
  3. 每个节点独立维护
  4. 大小可配置

内存池的角色

对矿工:
  选择高费率交易打包
  最大化收益

对用户:
  看到交易在传播
  预估确认时间

对网络:
  交易验证的第一道关
  防止双花传播

交易生命周期

交易进入内存池

条件:
  ✓ 格式有效
  ✓ 签名有效
  ✓ UTXO 存在未被花费
  ✓ 费用足够(>= minrelay fee)
  ✓ 不与内存池中其他交易冲突

验证顺序(快速失败):
  1. 大小检查(快速)
  2. 基本语法(快速)
  3. 签名验证(较慢)
  4. UTXO 检查(较慢)

交易在内存池中的阶段

1. 未确认
   刚进入内存池
   等待被打包

2. 已支付
   被打包进一个区块
   获得 1 个确认
   自动从 mempool 移除

3. 冲突/替换
   (如果使用 RBF)
   新交易替换旧交易

4. 超时
   (如果长时间未确认)
   自动从 mempool 删除
   默认:72 小时

交易确认时间

影响因素:
  1. 费率:高费率优先
  2. 大小:小交易优先(相对)
  3. 网络拥堵:拥堵时等待长
  4. 优先级:年长的 UTXO 优先

典型时间:
  低费率(1-2 sat/B):数小时到数天
  正常费率(50-100 sat/B):10-30 分钟
  高费率(>100 sat/B):1-10 分钟
  极高费率(>300 sat/B):1-3 分钟

优先级机制

费率优先级

矿工选择策略:
  按费率从高到低选择
  填满区块或虚拟区块大小(SegWit)

示例(区块大小 1 MB):

mempool 状态:
  TX1:100 sat/B,2000 字节(200,000 sat)
  TX2:80 sat/B,1500 字节(120,000 sat)
  TX3:60 sat/B,2000 字节(120,000 sat)
  TX4:40 sat/B,2500 字节(100,000 sat)

选择顺序:
  1. TX1:2000 字节,200,000 sat
  2. TX2:1500 字节,120,000 sat
  3. TX3:2000 字节,120,000 sat
  (已用 5500 字节,还有 494,500 字节)
  4. TX4 可能被选或被跳过(取决于具体实现)

内存池费率曲线

不同优先级的费率:

高位(0-25%):
  最高费率
  下一个区块

标准位(25-75%):
  中等费率
  5-10 个区块内

低位(75-100%):
  低费率
  可能长时间等待或被驱逐

内存池管理

内存池大小限制

默认配置:
  maxmempool:300 MB
  可通过 -maxmempool 配置

超限时的驱逐:
  当内存池超过限制
  驱逐最低费率的交易
  直到大小回到目标

风险:
  低费率交易可能被驱逐
  即使有效也不会被打包

交易超时

默认 TTL(生存时间):
  72 小时(259,200 秒)
  超过此时间,交易自动删除

配置:
  -mempoolexpiry 参数
  单位:分钟

影响:
  长时间未确认的交易会消失
  需要重新发送

最小中继费率

默认值:1 sat/vB

目的:
  防止 mempool 被垃圾交易填满
  保护节点资源

配置:
  -minrelaytxfee 参数

特例:
  高优先级交易可能免费中继
  Coinbase 交易不受限制

内存池查询

查询方法

使用 Bitcoin Core RPC:

getmempoolinfo:
  获取 mempool 统计信息
  
  返回:
  {
    "size": 1024,              // 交易数
    "bytes": 500000,           // 总大小
    "usage": 2000000,          // 内存使用
    "maxmempool": 314572800,   // 最大限制
    "mempoolminfee": 1.0e-05,  // 最小费率
    "minrelaytxfee": 1.0e-05
  }

查看特定交易

getmempoolentry <txid>:
  查询特定交易在 mempool 中的状态
  
  返回:
  {
    "vsize": 226,              // 虚拟大小
    "fee": 0.001,              // 费用
    "modifiedfee": 0.001,      // 考虑祖先费用的修改费用
    "time": 1234567890,        // 进入时间
    "height": 100000,          // 当前区块高度
    "descendantcount": 0,      // 后代数
    "ancestorcount": 0,        // 祖先数
    "weight": 904              // 权重(SegWit)
  }

可视化工具

Mempool.space:
  网页界面查看 mempool
  显示费率分布
  预估确认时间

Bitcoin Core GUI:
  内置 mempool 查看器
  显示交易信息

Command line:
  bitcoin-cli getmempoolinfo
  bitcoin-cli getrawmempool

常见问题

Q1: 为什么我的交易还在 mempool 中?

A:

  1. 费率太低,矿工优先考虑高费率的
  2. 网络拥堵,需要等待
  3. 超过 72 小时,可能被删除

Q2: 如何加快交易?

A:

  1. 使用 RBF 提高费用
  2. 使用 CPFP(子交易支付父交易费用)
  3. 等待网络拥堵缓解

Q3: Mempool 大小会一直增长吗?

A:

  • 不会,设置有上限(默认 300 MB)
  • 一旦达到,低费率交易被驱逐
  • 打包出块后自动清除

Q4: 不同节点的 mempool 一样吗?

A:

  • 通常不同
  • 取决于各自连接的节点
  • 取决于最小费率设置
  • 最终收敛(大部分相同)

Q5: 是否可以查询其他节点的 mempool?

A:

  • 可以使用 getmempool 命令(如果节点允许)
  • 但节点可能禁用这个 RPC
  • 无法查看完整的全网 mempool