【发布时间】:2018-03-17 17:01:13
【问题描述】:
区块验证节点运行区块中所有交易后的AFAIK,改变状态(UTXO列表)
让我们假设在某个时刻节点意识到它在错误的链上并且有更长的可用链,它之前分叉了一些块。
它是如何进行切换的?我想它应该反向运行所有事务,直到分叉碰巧恢复状态,而不是从更长的链重播块中的所有事务?
谢谢!
【问题讨论】:
标签: blockchain
区块验证节点运行区块中所有交易后的AFAIK,改变状态(UTXO列表)
让我们假设在某个时刻节点意识到它在错误的链上并且有更长的可用链,它之前分叉了一些块。
它是如何进行切换的?我想它应该反向运行所有事务,直到分叉碰巧恢复状态,而不是从更长的链重播块中的所有事务?
谢谢!
【问题讨论】:
标签: blockchain
每个节点都从网络接收单个交易以及单个块。 它还在本地保留最新的区块链。 对于它接收到的每个新交易,节点都会对其进行验证,如果有效,则将其传播给其对等方。 对于节点接收到的每个块,它都会对其进行验证。验证包括几个步骤,其中: 1. 检查区块是否指向区块链中最近的区块(它是前一个区块) 2. 区块中包含的所有交易都是有效的。
分叉是一种临时情况,当有 2 个有效块(或更多)几乎同时到达一个节点时,可能会发生这种情况,因此节点不知道哪个是正确的。它将第一个作为主链添加到其本地区块链中,并将第二个作为分叉链(也在本地)保持,直到下一个节点到达,并添加到两者之一。当它发生时 - 选择较长的链作为主区块链(在该节点!),第二条作为侧链保留。 所有这样的侧链都会在节点的内存中保存一段时间,直到可以确定它们不再相关(因为它们比主链短了几个块),然后删除。
【讨论】:
我不知道为什么你有任何东西都必须“回滚”的画面。是的,它正在回滚,但根本不需要对事务进行计算。原因如下:
当节点 A 有 N+5 个区块而节点 B 有 N+2 个区块时,节点 B 所要做的就是丢弃这两个额外的区块并从 A 中取出 5 个新区块。
就是这样!是的,它实际上是在回滚,但不需要反向运行,因为删除块实际上等同于反转事务。
请记住,事务是定向的,因此它们只在一个时间方向上发生。含义:对于有效区块,区块编号 N 中的每个非币基交易必须在每个先前的区块中都有一些历史记录,因此区块编号 N 依赖该历史记录,但反之则不然。之前的区块不依赖于区块编号 N,因此删除 N 不会使它们失效。
【讨论】: