【问题标题】:How blockchain node behaves upon receiving a new block when previous block wasn't acquired?没有获取前一个块时,区块链节点在接收到新块时如何表现?
【发布时间】:2018-03-17 16:56:16
【问题描述】:

块验证的 AFAIK 部分是检查它是否包含有效的前一个块哈希。但是让我们想象一下,由于某种原因(网络故障等),前一个区块从未到达。节点不会丢弃所有以下块吗?

我想知道这个问题是如何解决的?节点是否通过请求对等方定期检查整个链?这具体是如何实现的?

谢谢!

【问题讨论】:

    标签: p2p blockchain bitcoin ethereum consensus


    【解决方案1】:

    我假设您不是在谈论采矿。所以:

    一个节点会在请求块 N+1 之前请求块号 N。是的,如果块号 N 不存在,大部分块 N+1 将被丢弃,但这无关紧要。因为并不是一个节点仅仅通过作为接收端来获得块。它可以联系它周围的所有其他节点,并询问块号N。如果所有这些节点都没有块号N,那么它就不存在了!

    请注意,在更广泛的范围内,每个节点都向其对等节点询问节点编号 N,并验证此块是否遵循协议规则。这是共识的一部分。

    如果我们谈论的是采矿,情况就不同了。你可以想象两个相互竞争的矿工创建区块。如果矿工没有区块 N,他将继续尝试挖掘该区块。如果他在挖出区块 N 后收到区块,矿工将忽略它,我们在区块链中有一个临时分叉,有两个分支,区块 N+1 将有两个不同的版本。现在决定哪个分支存活的基本上是挖掘速度更快的分支。一个任意的共识规则是较长的链总是正确的链。当存在更长的链时,所有矿工都同意这条链是正确的。

    之所以可行,是因为在比特币中挖掘一个区块的概率在 10 分钟内(或一般的区块时间)足够宽。

    下图可以看作是随着时间的推移挖掘一个块的概率(以比特币为单位)。

    这就是为什么在很短的时间内创建区块链是错误的。因为如果时间很短(比如 10 秒),在区块链稳定之前会有大量的分叉。

    【讨论】:

    • 谢谢,我知道挖矿是如何工作的,对同步部分很感兴趣,你解释得很好。无论如何,你知道当节点切换到另一个链时究竟会发生什么吗?它是否通过反向运行事务来回滚事务以同步状态? (我在这里问过stackoverflow.com/questions/49339544/…
    • @eugenekr 我在那里回答了。
    猜你喜欢
    • 2017-07-10
    • 2021-07-05
    • 2022-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多