比特币网络如何防止同一笔交易被多次包含在一个区块中

假设网络中有多个矿工可以访问用户提交的相同事务。比特币网络如何防止将同一笔交易意外地包含到不同的区块链区块中?我在想,如果多个矿工同时(非常接近地)成功地挖掘出新的块,那么一个块中包含的某些事务的通知可能不会很快传播到其他事务。这种竞争条件是否会导致区块链中出现一些问题,或者允许这种情况发生,然后忽略重复交易?
比特币核心
货币
分享
改进这个问题
跟随
昨天问
爱德华
11133青铜徽章
新贡献者
添加评论
2个答案
2
首先,让我们讨论一下如果一个块确实包含一个已经包含在链中的事务,会发生什么:
所有完整节点验证所有块,并且不接受包含任何无效事务的块。如果事务被重复,则意味着它的输入已经被第一个实例使用了。因此,第二次消费将被视为双倍消费,并被视为无效,这意味着第二次消费所包含的整个区块都是无效的。因此,整个块将被网络忽略。
这意味着矿工们有强烈的动机不这么做。他们怎么做其实并不重要,但如果他们冒着两次包含交易的风险,如果他们赢了,他们将失去该区块的全部奖励(补贴+费用)。
事实证明,它不需要太多来阻止它,而且可以说,对于现有的软件来说,包含重复项要比不包含重复项困难得多。回想一下,每个块都需要包含其父块的哈希。这意味着矿工需要先被告知父块,然后才能看到它。在已知前一个块之前,不能构造新的块tenplate(带有事务选择)。因为在无效块上构建也是无效的,所以当新的父块出现时,软件也会验证它。作为一个副作用,它知道自己的事务,从而知道后继块允许包含什么(当然不包括重复项,但也不包括其他形式的双重支出)。
在实践中有时会有一种捷径。当发现一个新的块时,矿工可能比验证节点学习和处理整个块更快地了解到它的存在。在这种情况下,矿工可以指示散列程序临时切换到在空块的顶部进行挖掘(这当然是有效的)。当新的父级被完全处理后,散列程序将获得一个升级的模板,其中包含实际事务。这可能是危险的,并且在BIP66激活时,在无效的块上生成了大量的空块。
分享
改进这个答案
跟随
昨天回答的
彼得·维尔
64.2k88金徽章140140银徽章209209铜徽章
添加评论
2
矿工们向比特币网络附近的几个节点提交新的区块。节点包括钱包和矿工。每个节点检查块时都遵循一组称为比特币共识规则的规则。如果这些块符合这些规则,它们将被传递到附近的其他节点,并很快到达整个网络。
其中一条规则是,交易不能花费已经花费的钱。这叫做双重消费。
两个相似的块可能同时产生,两组不同的节点首先看到其中的一个或另一个。这称为区块链分叉。最终,其他矿工将成功地在其中的一个或另一个上创建新的区块,其中一个将拥有更大数量的称为“功”的指标。节点然后放弃较弱的fork并接受较强的fork。
还有其他一些问题进一步涉及到这一点:
叉子
如果两个矿工同时开采下一个区块会怎么样?
区块链分叉解析何时发生?
迄今为止孤立的最长区块链分支是什么?
区块链如何防止在“短叉”期间花钱?
双倍消费
什么是双倍消费?
第一次看到它能阻止双重攻击吗?
分享
改进这个答案
跟随
15小时前编辑的
昨天回答的
红砂砖
980222金徽章1515银徽章3333铜徽章
1
谢谢你解释叉子,因为这也是我想知道的。如果同时生成两个对节点组似乎有效的有效块怎么办。我还有一个问题。如果fork发生了,那么遗留在废弃分支中的事务怎么办?是否需要重新提交?答案可能在您提供的链接上,但我稍后会研究这些链接。谢谢!–爱德华昨天
1
@Eduard,不,这些事务不需要由它们的原始创建者重新提交。我相信他们只是被放回内存池,然后会被一个矿工添加到一个新的区块

sskoo.com11_thumb

发表评论

邮箱地址不会被公开。 必填项已用*标注