【问题标题】:How exactly blockchain node switches to another chain?区块链节点究竟是如何切换到另一条链的?
【发布时间】:2018-03-17 17:01:13
【问题描述】:

区块验证节点运行区块中所有交易后的AFAIK,改变状态(UTXO列表)

让我们假设在某个时刻节点意识到它在错误的链上并且有更长的可用链,它之前分叉了一些块。

它是如何进行切换的?我想它应该反向运行所有事务,直到分叉碰巧恢复状态,而不是从更长的链重播块中的所有事务?

谢谢!

【问题讨论】:

    标签: blockchain


    【解决方案1】:

    每个节点都从网络接收单个交易以及单个块。 它还在本地保留最新的区块链。 对于它接收到的每个新交易,节点都会对其进行验证,如果有效,则将其传播给其对等方。 对于节点接收到的每个块,它都会对其进行验证。验证包括几个步骤,其中: 1. 检查区块是否指向区块链中最近的区块(它是前一个区块) 2. 区块中包含的所有交易都是有效的。

    分叉是一种临时情况,当有 2 个有效块(或更多)几乎同时到达一个节点时,可能会发生这种情况,因此节点不知道哪个是正确的。它将第一个作为主链添加到其本地区块链中,并将第二个作为分叉链(也在本地)保持,直到下一个节点到达,并添加到两者之一。当它发生时 - 选择较长的链作为主区块链(在该节点!),第二条作为侧链保留。 所有这样的侧链都会在节点的内存中保存一段时间,直到可以确定它们不再相关(因为它们比主链短了几个块),然后删除。

    【讨论】:

    • 我想知道切换链是如何与节点状态相关的。当添加区块时,节点应该运行区块中的所有交易,改变自己的状态(比特币中的 UTXO 列表)。当节点切换到另一条链时,它如何恢复状态?
    • 这里有一个很好的演示解释:bitcoin.stackexchange.com/questions/22997/…
    • “恢复状态”是指在切换到侧链时重新计算 UTXO。请记住,侧链只是与当前主链增量的几个块,因此更新的 UTXO(和“余额”)的计算仅对这些增量块进行。
    • 正确,那么这个重新计算是如何实现的呢?节点是否为当前链中的每个块反向运行事务,直到它到达发生分叉的块?
    【解决方案2】:

    我不知道为什么你有任何东西都必须“回滚”的画面。是的,它正在回滚,但根本不需要对事务进行计算。原因如下:

    当节点 A 有 N+5 个区块而节点 B 有 N+2 个区块时,节点 B 所要做的就是丢弃这两个额外的区块并从 A 中取出 5 个新区块

    就是这样!是的,它实际上是在回滚,但不需要反向运行,因为删除块实际上等同于反转事务。

    请记住,事务是定向的,因此它们只在一个时间方向上发生。含义:对于有效区块,区块编号 N 中的每个非币基交易必须在每个先前的区块中都有一些历史记录,因此区块编号 N 依赖该历史记录,但反之则不然。之前的区块不依赖于区块编号 N,因此删除 N 不会使它们失效。

    【讨论】:

    • 我考虑“回滚”的原因是 UTXO 列表(状态或余额列表)。据我了解,添加块后,块中的交易被执行并改变状态(余额改变)。所以我想,当节点返回几个块时,它应该以某种方式恢复状态,使其与添加这两个块并运行来自它们的事务之前的状态相同。
    • @eugenekr 没有保存在区块链上的状态。有“增量”,即从这里获取并放入那里的交易。所以要知道一个地址的余额,你实际上必须扫描整个区块链。
    • 我松散地使用了“平衡”这个词。我的理解是有一张 UTXO 表,即未使用的交易输出。事务运行后,这张表不可避免地会发生变化。在运行事务节点之前检查它是否使用表中存在的 UTXO,否则它是无效的。至少这是它在比特币中的实现方式。
    • @eugenekr 该表是通过扫描区块链构建的。一个地址可以有多个UTXO,所以余额基本上是所有这些的总和。这仍然不代表最后一个区块有状态,但它有一组可以移除的UTXO,没问题。
    • @eugenekr 我不相信区块链上存在这样的表,原因有很多,包括这是可以通过扫描区块链提取的冗余信息,我以前从未听说过.即使我假设它存在(它不存在),那么通过一些数学推理你会发现这不会改变任何东西,因为如果添加一个块不会影响以前的交易,那么也会删除它不会影响他们。状态是区块浏览器必须处理的事情,而不是区块链。
    猜你喜欢
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    • 2014-12-16
    • 2021-10-16
    • 1970-01-01
    相关资源
    最近更新 更多