内存池
目录
内存池概述
什么是内存池
内存池(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:
- 费率太低,矿工优先考虑高费率的
- 网络拥堵,需要等待
- 超过 72 小时,可能被删除
Q2: 如何加快交易?
A:
- 使用 RBF 提高费用
- 使用 CPFP(子交易支付父交易费用)
- 等待网络拥堵缓解
Q3: Mempool 大小会一直增长吗?
A:
- 不会,设置有上限(默认 300 MB)
- 一旦达到,低费率交易被驱逐
- 打包出块后自动清除
Q4: 不同节点的 mempool 一样吗?
A:
- 通常不同
- 取决于各自连接的节点
- 取决于最小费率设置
- 最终收敛(大部分相同)
Q5: 是否可以查询其他节点的 mempool?
A:
- 可以使用 getmempool 命令(如果节点允许)
- 但节点可能禁用这个 RPC
- 无法查看完整的全网 mempool
