比特币交易长时间不被确认会不会被退回?

96
闪电HSL
2017.06.05 22:17* 字数 2263

第0章引言

现在比特币区块非常拥堵,经常会遇到长时间得不到确认的交易。这些交易得不到确认会被怎么处理,会退回到用户的钱包吗?会丢币吗?

第1章比特币交易生命周期

比特币交易首先是由私钥拥有者通过签名构造而来,当然这个是由软件来完成,用户能够看到的只不过是在图形界面的钱包里填入相应的金额,并且输入密码,实际的构造交易的过程由钱包完成。

交易构造完成后钱包就会向P2P网络广播这笔交易。

在比特币网络中,每一个节点(往往是完整节点)会接受并验证这笔交易,如果验证合法了,节点就会继续转发,如果不合法节点就会丢弃这笔交易。

最终这笔交易会被一个挖矿节点收到,并验证,如果这个挖矿节点挖到区块后,并且这笔交易的手续费足够吸引这个节点去打包进区块,那这笔交易就会被打包进区块。因此就得到了一个确认,这个矿工也拿走了相应的手续费。

这个挖矿节点打包后,会把区块广播给其他节点。其他节点验证并广播这个区块。

如果这个区块得到更多的挖矿节点的验证确认,那就得到了更多的确认。这样这笔交易就被记录到了比特币区块链,并成为了比特币账本的一部分。如果得到6个确认后,我们就认为它永远不可变了。

第2章矿工节点会嫌弃低手续费的交易

上述交易的生命周期中,节点(主要指普通完整节点,即非挖矿节点)验证交易的合法性往往只会验证你的签名和地址是否合法。只要合法,节点就会帮你广播转发。

最新的bitcoin core节点会还会把内存池收到的交易按手续费高低进行排名,如果排名太靠后,就会被挤出内存池。就不帮你广播了。但老节点都不会嫌弃低手续费的,只会按时间顺序进内存池,先来先进,满了就不管其他的了。而且其他客户端,比如BU客户端也有自己的排序规则。有些节点的规则还包含超过72小时没确认,就踢出内存池。反正全网是不统一的。

但挖矿节点因为可以拿交易里的手续费,所以一定会嫌弃那些低手续费的交易。挖矿节点会按交易的手续费从高到低排队,优先打包那些手续费高的,如果手续费太低,过了一定时间,比如三天,还没有轮到它的话,挖矿节点一般会把这样的低手续费交易从自己的内存池里删除掉。

挖矿矿节点是典型的只认钱,不认人的。

这就是为什么当你手续费付的少了,就得不到确认的原因,因为挖矿节点嫌弃你的交易。

那你的交易被矿池删除了后会怎么样呢?交易会退回到你的钱包吗?

答案是不会的。

任何节点删了你的交易,它们并不会通知你的钱包,所以你的钱包不可能知道“你的交易被退回”这回事。

另外你的交易往往会依然还存在其他非挖矿节点的内存池中,特别是那些老旧的,没有更新按手续费排序功能的老旧节点,除非它们也把你的交易删了。这些节点还会继续帮你广播,你的交易又有可能会被挖矿节点接受,然后再被它们轮奸一遍后发现你手续费太低而删除。

所以你的钱包发出去的交易,如果因为手续费太低,迟迟得不到确认,除非你主动做出查找,否则永远不会自动自己回到你钱包来。

第3章怎么办?

首先我们必须知道的是,如果你交易迟迟得不到确认,肯定不可能自动回到你的钱包上显示你发送交易之前的余额。

而且全网一定会有节点接受并继续帮你的交易进行广播,所以你的交易会像鬼魂一样一直在网络中游荡,而且会一直被挖矿节点抛弃而又接受,又再抛弃。直到全网节点的内存池被逐步清空,手续费降低,你的交易才有可能被确认。

最正确的办法就是把你的txid发给一家矿池,并且额外给矿池一些钱,叫他帮你添加到下一个区块当中。这就是我们常见的“交易加速处理服务”。

第4章如果使用"rescan"和"zapwallettxes"命令找回你的交易

如果你的交易很多天没有得到确认,而且还不想去加速,可以尝试使用以下办法找回来。

首先第一步你得知道以下知识,

全网绝大多数挖矿节点的内存池(就是接受并存储交易的地方)设定的上限是300M,也有更大的,并且会按手续费高低把交易进行排序,如果你的交易的排序跌出了300M之外,那你连内存池都进不去。但目前全网有两家公司的内存池人为调大了,就是支持零确认的区块链浏览器公司,blockchain.info和btc.com。

你先去这两个区块链浏览器查询你的交易,直接用你交易的目标地址去查就好。如果查不到txid,那就说明这两个区块链浏览器公司的节点的内存池也把你的交易踢出了内存池。这种情况下,说明全网绝大多数节点都把你的交易踢出了内存池。因为就它们两家的内存池最大嘛。

好了,这种情况下,你就有可能能找回你的交易。

原理是将你交易从自己的节点的历史交易数据里删除,然后重新扫描下载区块链数据,就可以找回你的交易。

一般的SPV钱包会提供“重置交易”功能,这个功能会清空你钱包的所有的交易历史,在重新下载区块数据和接受其他节点广播给你的相应的未确认的交易。如果你的交易没有被打包,并且其他节点的内存池又找不到你这笔交易,那这个功能就能够找回你的余额。

如果你用的是完整节点,比如bitcoin,那先使用“zapwallettxes”命令,将自己的交易历史删除,然后使用“rescan”扫描区块链,就会同步你的交易记录,如果你的交易没有被打包进区块,并且被各大节点都排除出内存池的话,也可以找回自己的这笔低手续费交易之前的余额。

但是,如果上面说的btc.com和blockchain.info两家公司的区块链浏览器能查到你的交易,那不好意思,你的交易之前的余额是找不回来的。只能去加速处理。

另外如果你用的是RBF交易,那还可以使用追加手续费的方式再发一笔更高手续费的交易来勾引矿工确认你之前的交易,接收方也可以使用CPFP功能来勾引矿工。

要额外声明的是,如果你在使用“rescan”命令重新下载区块链和相应的未确认交易时,刚好碰到那些老旧节点内存池里还保存了你的交易,并且发送给你,那你还得来一遍。

第5章结束语

区块链根本不应该被满负荷运行。

(如果您觉得好,欢迎关注我的公众号:闪电HSL,也欢迎加我微信号:13116885)


日记本
Web note ad 1