主流的公链种网络构建和数据分发过程。

名称定义

共识节点:参与共识并生成新区块后扩展区块链的节点,又称之为验证节点

全节点:不参与共识,但是会跟踪和验证账本数据并存储完整区块链数据的节点。

Aptos

Near

near.org/developers

SUI

节点发现以及入网过程

节点启动时有一个配置文件 fullnode.yaml 文件,该文件中指定节点进入 Testnet 还是 Mainnet。配置文件中还指定了种子节点的信息。例如如果进入主网时种子节点的信息为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
p2p-config:
seed-peers:
- address: /dns/icn-00.mainnet.sui.io/udp/8084
peer-id: 303f1f35afc9a6f82f8d21724f44e1245f4d8eca0806713a07c525dadda95a66
- address: /dns/icn-01.mainnet.sui.io/udp/8084
peer-id: cb7ce193cf7a41e9cc2f99e65dd1487b6314a57c74be42cc8c9225b203301812
- address: /dns/mel-00.mainnet.sui.io/udp/8084
peer-id: d32b55bdf1737ec415df8c88b3bf91e194b59ee3127e3f38ea46fd88ba2e7849
- address: /dns/mel-01.mainnet.sui.io/udp/8084
peer-id: bbf3be337fc16614a1953da83db729abfdc40596e197f36fe408574f7c9b780e
- address: /dns/ewr-00.mainnet.sui.io/udp/8084
peer-id: c7bf6cb93ca8fdda655c47ebb85ace28e6931464564332bf63e27e90199c50ee
- address: /dns/ewr-01.mainnet.sui.io/udp/8084
peer-id: 3227f8a05f0faa1a197c075d31135a366a1c6f3d4872cb8af66c14dea3e0eb66
- address: /dns/sjc-00.mainnet.sui.io/udp/8084
peer-id: 6f0b25087cd6b2fd2e4329bcf308ac95a37c49277dd7286b72470c124809db5b
- address: /dns/sjc-01.mainnet.sui.io/udp/8084
peer-id: af1d5d8468b3612ac2b6ff3ca91e99a71390dbe5b83dea9f6ae2da708d689227
- address: /dns/lhr-00.mainnet.sui.io/udp/8084
peer-id: c619a5e0f8f36eac45118c1f8bda28f0f508e2839042781f1d4a9818043f732c
- address: /dns/lhr-01.mainnet.sui.io/udp/8084
peer-id: 53dcedf250f73b1ec83250614498947db00d17c0181020fcdb7b6db12afbc175

SUI 中全节点入网时,每个从 seed 节点处获取网络中的节点,然后从中随机选择一些节点建立连接,基于这种方式进入网络。

数据同步

文件源码位置:sui/crates/sui-network/src/state_sync/mod.rs at main · MystenLabs/sui · GitHub

数据类型:checkpoint 、transactions。

当共识层的 validator 产生一个 checkpoint 之后,调用 send_checkpoint 方法将最新状态发送给其他节点。

其他节点收到新的 checkpoint 之后,存储该信息后调用 spawn_notify_peers_of_checkpoint 函数将该信息通知给其他节点。通知的内容为 PeerStateSyncInfo,其结构如下。可以发现其中只包含 checkpoint 的摘要,最低的区块高度和最高的区块高度,但是并不包含 checkpoint 本身。

1
2
3
4
5
6
7
8
9
10
11
12
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
struct PeerStateSyncInfo {
/// The digest of the Peer's genesis checkpoint.
genesis_checkpoint_digest: CheckpointDigest,
/// Indicates if this Peer is on the same chain as us.
on_same_chain_as_us: bool,
/// Highest checkpoint sequence number we know of for this Peer.
height: CheckpointSequenceNumber,
/// lowest available checkpoint watermark for this Peer.
/// This defaults to 0 for now.
lowest: CheckpointSequenceNumber,
}

当一个节点收到其他节点最新 checkpoint 的消息时,检查其高度是否高于自身,如果高于自身高度,则开启状态同步过程。

此外,每个节点定期与邻居同步最新的 checkpoint 消息,如果发现自身落后,则请求区块。

Solana

Reference: Synchronization | Solana Docs