作者:SICKWORM
发布时间:2018年9月9日
网络来源:https://sickworm.com/?p=409
当你的交易因为交易费用过低而迟迟不能被节点确认,而又没有被节点抛弃的时候,你可能需要交易重发这个功能。而交易重发实际上就是,将保存在节点交易内存池中的你的交易(因为还没被确认)替换成新的交易。
BTC交易重发的三种方法:
- Opt-In Replace-by-Fee,简称 Opt-In RBF 或 RBF。将更高手续费用的交易提交到节点,也是本文着重介绍的方法。具体规范:BIP125
- CPFP,Child Pays for Parent。使用未确认交易的输出,并给予较高手续费。此时节点如果要打包这个子交易,则必须将其低手续费的父交易也一并打包。具体策略应该是一系列交易的平均手续费(未确认)
- double pay,制造双花。连接上没有收录你的交易的节点,使用原来交易的输入构建新的交易,并广播出去。由于两笔交易是冲突的,所以节点只会收录其中一笔交易。最后然后祈祷该交易被收录。
各方案比较
Opt-In Replace-by-Fee 比 CPFP 费用消费低,CPFP 需要多消耗一笔交易费用的钱;
CPFP 不需要节点支持 BIP125 也可以使用,Opt-In Replace-by-Fee 需要足够多的节点支持,交易才容易被成功收录(BIP 125 已发布2年多,其实不用担心此问题);
double pay 又麻烦成功率又低,不到万不得已不使用。
Opt-In Replace-by-Fee 实现指南(参考 BIP125)
交易需声明为可替换交易,声明方式分两种
- 显式声明:至少一个input的nSequence小于0xffffffff-1(不是小于等于)
- 继承声明:没有显式声明可替换的交易,但如果他们的前置交易可替换且没有被确认,那该交易也是可替换的
实现细节:(Bitcoin Core 0.12.0)
- 交易需要声明为可替换交易
- 可替换交易没有包含新的,未曾出现过在内存池中的,未确认inputs(未确认input的意思是其前置output所在的交易未确认)
- 新替换交易的交易费用比待替换交易费用高
- 新替换交易费用必须比节点的min relay fee高
- 待替换交易的子交易(即使用了该交易的任意outputs,该交易替换后它们将被从内存池中移出)数量不可超过100条
测试站点
使用 https://www.blockchain.com/btc/pushtx 测试通过。
测试点:
- 降低手续费,不提高手续费(应失败)
- 提高一点点手续费(应成功)
- 提高手续费到比找零utxo还大的值(此时会引入新utxo)(应成功)
ETH交易重发
相比 BTC,ETH 的交易重发就简单多了。只需要发布同一个 nonce 的交易,旧交易就会被替换掉。当然手续费要比以前高,矿工可不干无用功。