【发布时间】:2018-03-17 16:56:16
【问题描述】:
块验证的 AFAIK 部分是检查它是否包含有效的前一个块哈希。但是让我们想象一下,由于某种原因(网络故障等),前一个区块从未到达。节点不会丢弃所有以下块吗?
我想知道这个问题是如何解决的?节点是否通过请求对等方定期检查整个链?这具体是如何实现的?
谢谢!
【问题讨论】:
标签: p2p blockchain bitcoin ethereum consensus
块验证的 AFAIK 部分是检查它是否包含有效的前一个块哈希。但是让我们想象一下,由于某种原因(网络故障等),前一个区块从未到达。节点不会丢弃所有以下块吗?
我想知道这个问题是如何解决的?节点是否通过请求对等方定期检查整个链?这具体是如何实现的?
谢谢!
【问题讨论】:
标签: p2p blockchain bitcoin ethereum consensus
我假设您不是在谈论采矿。所以:
一个节点会在请求块 N+1 之前请求块号 N。是的,如果块号 N 不存在,大部分块 N+1 将被丢弃,但这无关紧要。因为并不是一个节点仅仅通过作为接收端来获得块。它可以联系它周围的所有其他节点,并询问块号N。如果所有这些节点都没有块号N,那么它就不存在了!
请注意,在更广泛的范围内,每个节点都向其对等节点询问节点编号 N,并验证此块是否遵循协议规则。这是共识的一部分。
如果我们谈论的是采矿,情况就不同了。你可以想象两个相互竞争的矿工创建区块。如果矿工没有区块 N,他将继续尝试挖掘该区块。如果他在挖出区块 N 后收到区块,矿工将忽略它,我们在区块链中有一个临时分叉,有两个分支,区块 N+1 将有两个不同的版本。现在决定哪个分支存活的基本上是挖掘速度更快的分支。一个任意的共识规则是较长的链总是正确的链。当存在更长的链时,所有矿工都同意这条链是正确的。
之所以可行,是因为在比特币中挖掘一个区块的概率在 10 分钟内(或一般的区块时间)足够宽。
下图可以看作是随着时间的推移挖掘一个块的概率(以比特币为单位)。
这就是为什么在很短的时间内创建区块链是错误的。因为如果时间很短(比如 10 秒),在区块链稳定之前会有大量的分叉。
【讨论】: