20 个稳定版本

1.3.17 2021年10月25日
1.3.14 2021年8月23日
1.3.12 2021年7月30日
1.2.0 2021年2月28日
1.1.4 2020年8月27日

#18 in #peer-connection


2 crates 中使用

GPL-3.0 许可协议

2.5MB
11K SLoC

snarkos-network

Crates.io Authors License: GPL v3

snarkOS 网络协议建立了一个对等节点网络,通过积极交换交易和区块来维护账本活跃性。

概述

snarkOS 使用 TCP 连接来在网络中促进数据传输。snarkOS 上的网络使用 Rust 中的异步调用和 tokio.rs 构建。通过创建 Tokio 任务来处理新的连接并向主事件循环发送消息。

snarkOS 下载、验证并存储在成为网络上的活跃节点之前的有效区块和交易的历史。

节点发现

当节点第一次加入网络时,它需要填充网络中活跃节点的列表。为了启动节点发现,snarkOS 包含一套可选的专门“信标”节点。一旦连接,它们将提供一组初始的节点,包括同步提供者的地址。同步提供者将向节点提供链状态的初始同步。为了使用户具有灵活性,snarkOS 允许用户在配置文件中配置初始节点集,或者作为命令行标志的输入。

一旦节点连接到一个或多个节点,它可以扫描网络以发现更多节点。这个过程从向节点请求网络中更多连接的节点开始,使用 GetPeers 消息,然后尝试与每个新发现的节点建立连接。

成功后,snarkOS 将存储新的节点地址,以便将来无需使用信标即可直接与该节点连接。

连接到节点

节点连接使用 XX noise 握手。

节点之间的连接使用ping-pong协议维护,该协议定期转发Ping / Pong消息来验证节点是否仍然连接。snarkOS将更新其节点簿以考虑新连接的节点和断开的节点。

区块下载/同步

在节点可以参与网络之前,它必须将自己同步到账本的最新状态。无论节点是刚连接到网络还是有过时的状态,它都必须与它的节点同步,并下载其缺失的区块和交易。

snarkOS采用“先头信息”方法同步区块,其中节点先下载和验证每个区块头,然后再并行下载相应的完整区块。

当节点确定需要下载状态时,它选择一个节点作为同步节点并发送一个GetSync消息。该GetSync消息包含有关节点当前区块状态的信息,因此同步节点能够确定需要发送哪些区块头作为响应。

接收到GetSync消息后,同步节点通过Sync消息最多发送100个区块头。请求者随后验证这些头并通过发送GetBlock消息并行下载区块。下载完这些区块后,请求者发送另一个GetSync消息,并重复此过程,直到其链状态完全更新。

以下是同步协议的基本迭代

消息 发送者 接收者 数据
GetSync 节点 同步节点 1个或多个区块哈希
Sync 同步节点 节点 最多100个新区块头
GetBlocks 节点 任何节点 请求区块的头信息
区块 任何节点 节点 序列化的区块

交易广播

节点可以通过向其连接的节点发送一个Transaction消息来向网络广播交易。接收此交易的节点验证交易,并通过将其广播到其连接的节点进一步传播交易。该交易将继续通过网络传播,直到传播到网络中的每个连接节点。

区块广播

节点可以使用与广播交易相同的方式,通过Block消息广播一个区块。

区块

向节点发送一个区块。

消息名称

block

有效载荷

区块的字节序列化

GetBlocks

请求具有指定哈希的区块。

消息名称

getblocks

有效载荷

参数 类型 描述
block_hashes 数组 要请求的区块哈希列表

GetMemoryPool

请求节点的内存池交易。

消息名称

getmemorypool

有效载荷

GetPeers

请求节点连接的节点地址列表。

消息名称

getpeers

有效载荷

GetSync

请求了解指定区块定位器哈希。

消息名称

getsync

有效载荷

参数 类型 描述
block_locator_hashes 数组 描述请求者链状态的区块哈希列表

MemoryPool

GetMemoryPool请求的响应。

消息名称

memorypool

有效载荷

参数 类型 描述
transactions 数组 序列化的内存池交易列表

Peers

GetPeers请求的响应。

消息名称

peers

有效载荷

参数 类型 描述
addresses 数组 连接节点的监听地址列表

Ping

用于检查节点是否活跃并计算其RTT的消息。

消息名称

ping

有效载荷

参数 类型 描述
block_height 数字 链的当前高度

Pong

Ping请求的响应。

消息名称

pong

有效载荷

Sync

GetSync消息的响应。

消息名称

sync

有效载荷

参数 类型 描述
block_hashes 数组 要与请求者共享的区块哈希列表

SyncBlock

GetBlock 请求的响应。

消息名称

syncblock

有效载荷

参数 类型 描述
数据 字节数 请求区块的序列化字节数据

交易

由对等节点发送的交易。

消息名称

transaction

有效载荷

参数 类型 描述
数据 字节数 交易的序列化字节数据

版本

在握手过程中发送。

消息名称

version

有效载荷

参数 类型 描述
version 数字 网络协议的版本
listening_port 数字 节点的监听端口

贡献

如何更新此README

此README是在持续集成过程中自动生成的。要更新此README,请提交一个更新文档配置文件中相应Markdown文件的pull request。

依赖关系

~75MB
~845K SLoC