块验证后的AFAIK节点运行块中的所有事务,更改状态(UTXO列表)
让我们想象一下,在某些时候,节点意识到它在错误的链上并且有更长的链可用,它之前分叉了一些块。
如何切换?我想它应该反向运行所有事务,直到fork发生恢复状态,然后从较长链中重放块中的所有事务?
谢谢!
答案 0 :(得分:0)
每个节点接收单个事务以及来自网络的各个块。 它还在本地保留最新的区块链。 对于它接收的每个新事务,节点验证它,如果有效,则传播到它的对等体。 对于节点接收的每个块,它验证它。验证包括几个步骤,其中包括: 1.检查块是否指向区块链中的最新块(它在前面的块中) 2.该区块中包含的所有交易均有效。
fork是临时情况,当有2个有效块(或更多)同时到达某个节点时,可能会出现这种情况,因此该节点不知道哪个是正确的。它将第一个添加到其本地区块链中作为主链,并将第二个作为叉链(也在本地)保留,直到下一个节点到达,并添加到其中一个中。当它发生时 - 选择较长的链作为主要的区块链(在该节点!),第二个链保持为侧链。 所有这些侧链都保留在节点的内存中一段时间,直到它可以确定它们不再相关(因为它们比几个块的主区块链短),然后被移除。
答案 1 :(得分:0)
我不知道为什么你会有任何事情需要"回滚"。是的,它正在回滚,但根本不需要进行交易计算。这就是原因:
当节点A具有N + 5个块并且节点B具有N + 2个块时,则所有节点B必须做的是丢弃这些额外的两个块并从A 中取出5个新块。 / p>
这就是全部!是的,它实际上是回滚,但没有必要反向运行,因为丢弃块实际上等同于逆转事务。
请记住,交易是针对性的,所以它们只在一个方向上发生。含义:对于有效块,块编号N中的每个非coinbase事务必须在每个先前块中具有一些历史记录,因此块编号N 依赖于该历史记录,但反之则不然。以前的块不依赖于块号N,因此丢弃N不会使它们无效。