zoukankan      html  css  js  c++  java
  • 以太坊网络服务分析

    网络分层

    以太坊所有网络功能如下图所示:

    所有网络功能建立在以太网的传输层之上,TCP 及 UDP 均有应用。

    会话层

    会话层主要包括 Peer 管理,NodeTable 管理和 RPC 协议,本文着重介绍 Peer 管理,

    NodeTable 请参考《P2P 网络及邻居节点发现机制》。

    涉及到会话层的关键代码:

      源文件 类描述 主要方法
      Server.go Type Server struct Server 是网络功能的基本类,所有功能均封装为 server,并进行启动。 Start:启动 server Run: 运行具体任. 务, 包括创建 Peers map, peer 拨号,peer 添加, 删除处理。Startlistening : 监 听 TCP 端口。 AddPeer: 添 加 peer RemovePeer : 移 除 Peer |
      Peer.go Type Peer struct Peer 类提供各种Peer 的操作方法 NewPeer:生成一个新的 peer Run:peer 链接建立后继续进行应用层通信,并启动协议处理。 startProtocols:启动应 用层 eth 协议。 |
      Dial.go Type Dialer struct Dialer 类,即拨号类,拨号即节 点向邻居节点发起 Peer 通信 Dial:实现一次拨号 |
      Table.go Type Table struct 邻居节点及 K 桶相关类 |
      Udp.go   提供 Kad 协议相关方法及 Peer 握手相关方法 |

    Peer 介绍

    Peer 指通过了通信握手的邻居节点,只有邻居节点才能变为 Peer,只有 Peer 列表中的节点,才能进行正常的通信。

    Peer 管理

    Peers 在代码中以 map 的结构存在,由 server 运行方法 run 创建,并在 run 方法中进行添加和删除维护。Pees 最大默认数量为 25(node/defaults.go 定义)

    Peer 动态添加删除流程

    Peer 添加分为两种:被动添加和主动添加。

    1) 被动添加指其他节点发起握手,流程如下:

    2) 每当当前 peers 有变动时,如添加,删除,或者一次 dial 任务完成,则会执行一次主动握手流程如下,其中要进行 Dial(拨号,即握手通信)的节点有以下几部分组成:

    • 静态节点,系统启动时配置文件写入
    • nodeTable 中随机选取(当前 needDynDials 的二分之一,needDynDials 的值为(s.MaxPeer+1)/2=13)
    • loobbuf 中的节点(discovery task 中的邻居节点)
    • lookbuf 中的节点 Peer 数量不足时,会强制进行一次 nodetable 刷新,刷新到的node 写入lookuf.

    3) Peer 删除有三种方式: RPC 命令删除,一次应用层通信完成自动删除,通信过程读写错误。

    Peer 握手机制

    参考《以太坊底层技术研究:Peer 握手机制》

    表示层:RLP 编码

    以太坊所相关有网络上 x 发送的数据均遵循 RLP 编码,参考《RLP 机制分析》

    应用层:Eth 协议

    Peer握手成功后,即可进行应用层通信,协议数据包如下表所示:

      序号 分类 描述
      1 Code 数据包命令分类 |
      2 Size Payload大小 |
      3 Payload 负载数据 |
      4 ReceivedAt 接受到数据包的时间,接受端节点赋值 |

    ETH协议应用层包括如下命令:

      序号 分类 描述
      1 StatusMsg = 0x00 Handshake 使用,握 手成功后不再发送 |
      2 NewBlockHashesMsg = 0x01 新区块哈希(广播) |
      3 TxMsg = 0x02 交易信息(广播数据) |
      4 GetBlockHeadersMsg = 0x03 获取去块头信息 |
      5 BlockHeadersMsg = 0x04 获取区块头信息响应 |
      6 GetBlockBodiesMsg = 0x05 获取区块信息 |
      7 BlockBodiesMsg = 0x06 获取区块信息相应 |
      8 NewBlockMsg = 0x07 新块信息(广播数据) |
      9 GetNodeDataMsg = 0x0d 获取节点数据 |
      10 NodeDataMsg = 0x0e 获取节点数据响应 |
      11 GetReceiptsMsg = 0x0f 获取收据信息 |
      12 ReceiptsMsg = 0x10 获取收据信息响应 |
  • 相关阅读:
    Spring(一)Spring的基本应用
    flask摘记
    python摘记
    String Algorithm
    leetcode -- hard part
    leetcode -- medium part
    leetcodo--Easy part
    unix网络编程
    SQL
    计算机网络知识
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13313390.html
Copyright © 2011-2022 走看看