当一个完整的节点接收到一个新挖掘的新块时,我们似乎很难验证块中包含的所有事务。由于我们已经是当前的世界状态,所以我们只需应用新块中的所有Txs,并根据来自新块的状态根检查生成的stateRoot。如果它是相同的,那么我们确定新的块是有效的(假设pow部分是好的)
了解检查特定事务的包含/排除也很简单,我们如何检查旧块中包含的事务是否有效?
我之所以问这个问题,是因为它似乎是为了验证旧事务,那么我们就不能访问旧世界状态(只有stateRoot,除非我们获得了附加快照,但这并不是Ethereum的默认行为吗?)
编辑:理解Ethereum总是确保当前状态和即将到来的事务是有效的(正如上面提到的那样是可行的),我想问的是更多地与基于Ethereum的sidechains (或者更具体地说是广义等离子体侧链)相关。
因此,当世界状态已经发生变化时,我们可能需要在将来验证一个相对较旧的事务。我想了解是否有必要保留很多世界状态的完整快照才能实现这一点。或者stateRoot就够了?
发布于 2018-12-11 15:24:36
ethereum客户端在同步这些块时对它们进行验证。如果它是一个完全同步的节点,它通常会验证它接收到的每个块。否则,它会进行或多或少的检查,这取决于它在哪个同步模式下启动(完全、快速、轻巧)。这个答案提供了有关同步模式的更多细节。
一旦完全同步,客户端就知道前面的所有块都是有效的,因此不需要再次检查它们的有效性。
ethereum客户端可以使用很少的使用梅克尔树的信息来检查事务是否位于特定的块中。这个线程描述ethereum是如何使用这些merkle树的.
PS:十个街区前的tx不是很旧,只是2.5分钟前
https://ethereum.stackexchange.com/questions/63933
复制相似问题