取消比特币交易

Posted

技术标签:

【中文标题】取消比特币交易【英文标题】:Canceling a Bitcoin transaction 【发布时间】:2014-01-22 15:39:44 【问题描述】:

我正在编写一个比特币应用程序并希望实现一个“取消”功能。 reddit 上到处都是参考,如果发生了 3 次以下的确认,从技术上讲,可以停止付款。也许只有一两分钟可用,但仍然如此。 我在比特币 api 文档中找不到任何参考来演示如何做到这一点。 我知道一个山寨币出于这个原因故意使用 60 分钟的间隔来确认。

有人知道这是怎么做到的吗?

【问题讨论】:

可能值得提出自己的问题,但认为这可能是相关的:在我身上发生过几次,我会向某人发送一些狗狗币,几秒钟后关闭客户端,然后想知道为什么另一个人一直告诉我,几个小时后他们没有收到任何东西——直到我重新打开客户。通过实验,我了解到我必须保持打开客户端并让它闲置,直到收到至少一个确认,然后才能关闭它。为什么会这样?这可能是一种“取消”交易的方式吗? 如果我尝试发送一些比特币,然后尝试发送其他人相同比特币,矿工应该将这种情况视为双花尝试并拒绝至少一个的交易。如果有办法在第一次确认之前广播这样一个冲突的交易,这会导致 both 反式。被所有矿工拒绝,这可能是我能想到的实现“取消支付”功能的最简单方法。 【参考方案1】:

是否可以取消比特币交易...

...哪个还没有播出?

是的,显然这是可能的。我建议您在您的比特币应用程序中选择此方法,向用户显示几秒钟的确认屏幕,其中包含有关交易的信息以及一些按钮,上面写着cancelconfirm。 @nahtnam 建议延迟 60 分钟,这太过分了,考虑到您可能会失去互联网访问权限或希望交易尽快出现在区块链中。

...哪个已经播出了?

也许...要取消这样的交易,您需要自己创建一个区块,将原始交易的输入移动到您自己的地址之一。 (实际上使原始交易无效。)但是,到目前为止,创建一个区块的成本几千美元,并且不能保证找到一个区块

另一种可能性是广播另一笔交易,采用与原始交易相同的输入,并将输出定位到您自己的地址/钱包之一。为了激励矿工包含此交易而不是原始交易,您增加了交易费用。但是,一些客户可能不会将这种双花交易转发给矿工,而一些矿工可能会拒绝双花交易并包含原始交易(他们首先收到的交易)。 (参考Bitpay encountered zero double spent in the first 10000 transactions. 和Cancelling an unconfirmed transaction by @theymos (bitcoin.stackexchange))

有一些技巧可以通过创建所谓的“非标准”交易来向矿工隐藏您的初始交易。或者,交易可能包括非常低的费用,让矿工出于经济原因拒绝它。 (c.f. Significant losses by double-spending unconfirmed transactions (bitcoin-dev mailing list) 和 Double-spending by @petertodd (Reddit))但是,如果接收者仔细观察,这会使您的交易看起来很可疑,并且他们很可能会要求您等到它得到一个或多个确认。

最后,如果您在原始交易上设置一个标志以指示可替换性,也是可能的。然后,您可以通过在替换事务中包含相同(一个或多个)输入来用另一个替换原始事务。此外,您必须支付更高的费用。但是,并非所有矿工都尊重此标志,有些可能仍包括您的初始交易。 (参考BIP 125: Opt-in Full Replace-by-Fee Signaling)

...哪个包含在一个或多个块中?

不,几乎不可能。你需要控制大量的散列能力来创建一个分叉,方法是从原始交易发生之前的区块开始重建区块链,并在用height = (current public blockchain height) + 1 阻止。因此,“你拥有的确认越多,这样的攻击就越困难、昂贵和不可靠。” Source: @DannyHamilton (Bitcointalk) Satoshi Nakamoto 的比特币论文解释说,当你控制超过 50% 的散列能力时,这总是可能的,如果你控制的散列能力低于 50%,则概率小于 1 但大于 0。见Bitcoin: A Peer-to-Peer Electronic Cash System。 但是,如果您控制了大量的哈希算力,您可能会受到激励,不会通过撤销交易和间接损害您的挖矿收入流来破坏对比特币的信任。

【讨论】:

【参考方案2】:

在进行比特币支付之前制定策略。检查付款人和收件人的比特币地址是否正确(使用复制和粘贴工具)。检查产品/服务的详细信息和金额是否正确。检查您是否拥有正确的私钥详细信息。预计至少要等待 24 小时才能确认。这让矿工有时间验证交易。然后通过将您的私钥详细信息插入谷歌搜索来检查您的比特币帐户以确保交易正确完成,或者检查您的比特币软件以获取交易详细信息。 取消交易既复杂又昂贵。因此,在您付款之前,请在发送前检查、检查并再次检查。

【讨论】:

【参考方案3】:

没有。停止比特币交易是不可能的。这就是让比特币如此不同的原因。除了让接收方将其发回给您之外,没有其他方法可以撤销交易。

另一方面,您仍然可以使用取消功能。您可以在发送交易之前设置 60 分钟的延迟,在此期间,有人可以取消,但正如我之前提到的,没有办法停止已经到达区块链的交易。

【讨论】:

其实你错了。是的,有一种方法可以挽救中断的传输。尽管重新启动钱包并耐心等待通常可以解决问题。 “如何通过 1 个或更少的确认来停止/撤销比特币交易” 运行 bitcoind 并使用 -zapwallettxes 这会将陈旧的 tx 或传输放回您的钱包。干杯! @brad 谢谢。我会再调查一下。 理论上不是不可能的,你只需要创建一个双花并提供比原始交易更多的工作证明,这样网络就会分叉你的区块链。我认为大多数交易没有任何充分的理由这样做,除非可能是为了自费造成损害,因为赚取比特币可能比尝试撤销某些交易更好,除非该交易包含大量比特币并撤销支付提供的不仅仅是挖矿来创造逆转。 @brad,1+ 确认交易不能被回收,除非你控制 +50% 的哈希算力,或者它发生在链分裂和双花的错误一侧另一方面是在和解之前(非常不可能,曾经在比特币 0.8 中出现错误/分裂)。如果未确认的 tx 启用了 RFB,并且您在将其包含在块中之前(在第一次确认之前)向自己提交了更高费用的 tx,则可以回收它。如果没有 RFB,您可能会很幸运,并且您的 tx 在大量积压期间一段时间后会下降,或者您无论如何都设法接受了非 RFB 的双花。

以上是关于取消比特币交易的主要内容,如果未能解决你的问题,请参考以下文章

区块链比特币学习 - 1 - 交易

比特币交易平台

一起学习比特币白皮书--交易--比特币长什么样子?

比特币交易UTXO

比特币交易UTXO

区块链比特币学习 - 5 -创币交易