当未获取前一个块时,区块链节点在接收到新块时如何表现?
How blockchain node behaves upon receiving a new block when previous block wasn't acquired?
据我所知,块验证的一部分是检查它是否包含有效的先前块哈希。但是让我们想象一下,由于某种原因(网络故障等),前一个块从未到达。节点不会丢弃以下所有块吗?
请问这个问题是怎么解决的?节点是否通过请求同行定期检查整个链?具体是如何实现的?
谢谢!
我假设你不是在谈论采矿。所以:
节点在请求区块 N+1 之前会先请求区块编号 N。是的,如果块号 N 不存在,大部分块 N+1 将被丢弃,但这无关紧要。因为并不是节点只有作为接收端才能获得区块。它可以联系它周围的所有其他节点,并请求块号 N。如果所有这些节点都没有块号 N,那么它不存在!
请注意,在更广泛的范围内,每个节点都向其对等节点询问节点编号 N,并验证该块是否遵循协议规则。这是共识的一部分。
如果我们谈论挖矿,情况就不同了。你可以想象两个相互竞争的矿工创建区块。如果矿工没有区块 N,他将继续尝试开采该区块。如果他在开采后收到区块编号 N,矿工就会忽略它,我们在区块链中有一个临时分叉,有两个分支,区块 N+1 将有两个不同的版本。现在决定哪个分支存活下来的基本上是开采速度更快的分支。一个任意的共识规则是较长的链总是正确的链。当存在更长的链时,所有矿工都同意这条链是正确的。
之所以可行,是因为在比特币中,挖出区块的概率超过 10 分钟(或一般的区块时间)。
下图可以看作是随着时间的推移(以比特币计)挖出一个区块的概率。
这就是为什么用很短的时间创建区块链是错误的。因为如果时间很短(比如10秒),在区块链稳定之前会有大量的分叉。
据我所知,块验证的一部分是检查它是否包含有效的先前块哈希。但是让我们想象一下,由于某种原因(网络故障等),前一个块从未到达。节点不会丢弃以下所有块吗?
请问这个问题是怎么解决的?节点是否通过请求同行定期检查整个链?具体是如何实现的?
谢谢!
我假设你不是在谈论采矿。所以:
节点在请求区块 N+1 之前会先请求区块编号 N。是的,如果块号 N 不存在,大部分块 N+1 将被丢弃,但这无关紧要。因为并不是节点只有作为接收端才能获得区块。它可以联系它周围的所有其他节点,并请求块号 N。如果所有这些节点都没有块号 N,那么它不存在!
请注意,在更广泛的范围内,每个节点都向其对等节点询问节点编号 N,并验证该块是否遵循协议规则。这是共识的一部分。
如果我们谈论挖矿,情况就不同了。你可以想象两个相互竞争的矿工创建区块。如果矿工没有区块 N,他将继续尝试开采该区块。如果他在开采后收到区块编号 N,矿工就会忽略它,我们在区块链中有一个临时分叉,有两个分支,区块 N+1 将有两个不同的版本。现在决定哪个分支存活下来的基本上是开采速度更快的分支。一个任意的共识规则是较长的链总是正确的链。当存在更长的链时,所有矿工都同意这条链是正确的。
之所以可行,是因为在比特币中,挖出区块的概率超过 10 分钟(或一般的区块时间)。
下图可以看作是随着时间的推移(以比特币计)挖出一个区块的概率。
这就是为什么用很短的时间创建区块链是错误的。因为如果时间很短(比如10秒),在区块链稳定之前会有大量的分叉。