20 个稳定版本
1.3.17 | 2021年10月25日 |
---|---|
1.3.14 | 2021年8月23日 |
1.3.12 |
|
1.2.0 | 2021年2月28日 |
1.1.4 | 2020年8月27日 |
#18 in #peer-connection
在 2 crates 中使用
2.5MB
11K SLoC
snarkos-network
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