取消比特币交易

7

我正在编写一款比特币应用程序,并希望实现“取消”功能。Reddit上到处都是参考资料,如果少于3个确认已发生,则从技术上讲可以停止支付。可能只有一两分钟的时间,但仍然可以停止。

我找不到比特币API文档中任何参考资料来演示如何完成此操作。

我知道某种替代币使用有意的60分钟间隔进行确认,正是出于这个原因。

有人知道这是如何完成的吗?


可能值得提出一个新问题,但我认为这可能与此相关:在某些情况下,我会向某人发送一些狗狗币,几秒钟后关闭客户端,然后想知道为什么对方告诉我他们几个小时后仍未收到任何东西 - 直到我重新打开客户端。通过实验,我了解到我必须保持客户端打开并让其空闲,直到至少收到一个确认,然后才能关闭。为什么会这样?这可能是一种“取消”交易的方式吗? - Joe Pineda
如果我尝试发送一些比特币,然后尝试发送给其他人“相同的”比特币,矿工应该将此情况视为双重支付尝试,并拒绝至少一个交易。如果有一种方法可以在第一次确认之前广播这样的冲突交易,导致所有矿工都拒绝两个交易,那可能是我能想到的最简单的实现“取消付款”功能的方法。 - Joe Pineda
3个回答

14

如何取消尚未广播的比特币交易?

... 这个问题吗?

当然可以。 我建议在比特币应用程序中选择这种方法,向用户显示一个确认屏幕,其中包含有关交易的信息和一些按钮,如取消确认。@nahtnam提出了60分钟的延迟时间,这太长了,因为您可能会失去互联网连接或希望交易尽快出现在区块链中。

... 这个问题呢?

也许可以... 要取消这样的交易,您需要自己创建一个块,将原始交易的输入移动到您自己的一个地址。(有效地使原始交易无效) 但是,目前创建一个块的成本为数千美元,而且找到一个块是不保证的。

另一个可能性是广播另一个交易,其输入与原始交易相同,并将输出定位到您自己的一个地址/钱包。为了激励矿工将此交易包括在内,而不是原始交易,您需要增加交易费。但是,一些客户端可能不会将这样的双重花费交易中继到矿工,而一些矿工可能会拒绝双重花费交易并包括原始的那个(他们首先收到的)。(参见Bitpay在前10000笔交易中没有遇到过双重支付取消未确认的交易by@theymos(bitcoin.stackexchange))

有一些技巧可以通过创建所谓的“非标准”交易来隐藏您的初始交易,以避免矿工发现。或者,该交易可以包含非常低的手续费,使得矿工因经济原因拒绝处理它。(参考链接:Bitcoin开发邮件列表中的未确认交易被双花的重大损失petertodd在Reddit上的双重支付) 但这会让您的交易看起来可疑,并且如果收件人仔细查看它,他们很可能要求您等待一个或多个确认。

最后,如果在原始交易上设置了一个标记来指示可替代性,那么也有可能进行替换。您可以通过在替换交易中包括相同的一个或多个输入来替换原始交易。同时,您必须支付更高的费用。但是,并非所有矿工都遵守此标记,某些矿工仍可能包括您的初始交易。(参考链接:BIP 125:选择性全额替换信号)

......它是否包含在一个或多个块中?

不,非常不可能。您需要控制相当数量的哈希功率,从初始交易发生前的块重新构建区块链,并以height =(当前公共区块链高度)+1的块结束,因此“您拥有的确认越多,就越难、更昂贵、更不可靠地进行这样的攻击。”。(参考链接:@DannyHamilton (Bitcointalk))

中本聪(Satoshi Nakamoto)的比特币白皮书解释了当您控制超过50%的哈希算力时,这总是可能的,并且如果您控制少于50%的哈希算力,则可能性小于1但大于0。请参见《比特币:一个点对点的电子现金系统》。 尽管如此,如果您控制着相当数量的哈希算力,您很可能会有动机不破坏比特币的信任,从而撤消交易并间接损害挖矿的收入流。

3

不,无法停止比特币交易。这就是比特币与众不同的地方。除了让接收者将其退回给您外,没有反转交易的方法。

另外,你仍然可以有一个取消功能。你可以在发送交易之前设置60分钟的延迟,在这个间隙中,有人可以取消,但正如我之前提到的,已经到达区块链的交易是无法停止的。


1
实际上,你是错误的。是的,有一种方法可以拯救一个损坏的传输。尽管重新启动钱包和耐心通常可以解决问题。“如何停止/撤销1个或更少确认的比特币交易”运行bitcoind并使用-zapwallettxes将过期的tx或传输放回您的钱包中。干杯! - brad
@brad 谢谢。我会再深入研究一下。 - nahtnam
从理论上讲并不是不可能的,你只需要创建一个双重支付,并提供比原始交易更多的工作证明,以便网络接受你的区块链分支。我认为在大多数交易中没有什么好的理由这样做,除非你的目标是自己承担损失来造成破坏,因为赚取比特币很可能比尝试撤销某些交易更好,除非该交易包含大量比特币并且撤销付款提供的回报超过了挖掘创建撤销所需的回报。 - Waldo Alvarez
@brad,1个确认的交易无法被收回,除非你控制了+50%的哈希算力或者在链分裂和双重花费之前发生在错误的一侧,并在协调之前将其双重花费(这种情况非常罕见,在比特币0.8中出现过一个漏洞/分裂)。如果启用了RFB,则可以收回未确认的tx,并在第一次确认之前向自己提交更高费用的tx。没有RFB,你可能会很幸运,在高负载时期间,你的tx会在一段时间后消失,或者你设法让一个非RFB的双重花费被接受。 - Thomas Guyot-Sionnest

-1

在进行比特币支付之前,制定好策略。检查付款方和收款方的比特币地址是否正确(使用复制和粘贴功能)。检查产品/服务和金额的详细信息是否正确。检查您是否拥有正确的私钥详细信息。预计至少等待24小时以进行确认。这样可以让矿工验证交易。然后通过将您的私钥详细信息插入Google搜索或检查比特币软件的交易详细信息来检查您的比特币账户,以确保交易已正确完成。 取消交易是复杂且昂贵的。因此,在发送之前,请反复检查。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接