Skip to main content
节点加入网络,得回答两个问题:怎么走到这条链现在所在的位置,走到之后又怎么待在那儿。状态同步把两个问题都回答了,而且中间的取舍摆在明面上,不藏着。

追赶的两种模式

引导(bootstrapping)——从零走到当前版本——有两条根本不同的路子。 重放历史。从创世往前推,要么把每笔交易重新执行一遍,要么套用执行当年产出的输出。这样得到的节点持有完整历史:每个版本、每份证明、每笔交易。代价是慢,而且这条链每多跑一天就更慢。 下载当前状态。跳过历史,直接取最新版本上的状态键和值,对照已提交的根验一遍。节点花零头的时间就追上了当下,但对这条链怎么走到这一步一无所知。
新节点
引导模式
重放历史从创世开始重新执行,或套用已存的输出慢,而且这条链每多跑一天就更慢
下载当前状态最新版本上的键与值,对照已提交的根验证花零头的时间就追上当下
当前版本此后持续同步
两条路并不等价下载当前状态的节点提供不了历史查询,也答不出某个仓位是怎么走到今天这一步的。给索引器或审计供数据的节点,恰恰需要它跳过的那段历史。
重放这条路里还有一层选择——重新执行交易、套用已存的输出,或者让节点每一步自己挑快的那种。重新执行校验更强,因为它是把结果重新算出来,而不是信一份记下来的结果;套用输出则更快。混合模式之所以存在,是因为哪一种更对,要看节点落后多少。
这是运维决定,不是可以不假思索就接受的默认值。下载当前状态的节点提供不了历史查询,也答不出某个仓位是怎么走到今天这一步的——它手上没有历史可读。给索引器或审计流程供数据的节点,恰恰需要它跳过的那段历史。

保持在当前版本

到了当前版本,节点靠消费陆续到达的已提交区块跟上进度——同样可以选执行交易或套用输出,验证强度和速度之间还是那套取舍。 和引导不同:这里的差距小而恒定,不像引导那样又大、又要慢慢追平。节点落后到一定程度就退回引导路径,不再逐块去补一个不知道多大的缺口。

数据如何流动

同步不是一个节点向另一个节点要一段区块。它被拆成若干层,这样没有哪个对等节点会变成依赖,也没有哪个单点故障能让进度停下来。 有一个推论值得记住:正在同步的节点并不信任对等节点。每个数据块到达时都带着一份证明,对的是网络已提交的根;哪个对等节点给的数据对不上,就被拒掉,而不是被相信。挑对等节点是性能决定,不是信任决定。

验证

状态同步里,没有任何东西是凭发送方是谁就被接受的。 状态值对照已提交的状态根来验,交易和输出对照累加器来验。节点引导完成时,它的状态根和验证者法定人数签下的那个一致——快速路径之所以安全,靠的就是这一点:下载当前状态跳过的是历史,不是验证。

后续阅读

存储与证明

使同步可验证的那些结构。

运行节点

节点角色,以及运营节点该找谁问。

网络拓扑

正在同步的对等节点在和哪一层节点通信。

索引器

历史能回答而当前状态无法回答的问题。