基于tutk方案的p2p源码_以太坊源码分析—p2p节点发现与协议运行

前言p2p(peer to peer)负责以太坊底层节点间的通信,主要包括底层节点发现(discover)和上层协议运行两大部分。节点发现节点发现功能主要涉及 Server Table udp 这几个数据结构,它们有独自的事件响应循环,节点发现功能便是它们互相协作完成的。其中,每个以太坊客户端启动后都会在本地运行一个Server,并将网络拓扑中相邻的节点视为Node,而Table是Node的容...
摘要由CSDN通过智能技术生成

前言

p2p(peer to peer)负责以太坊底层节点间的通信,主要包括底层节点发现(discover)和上层协议运行两大部分。

节点发现

节点发现功能主要涉及 Server Table udp 这几个数据结构,它们有独自的事件响应循环,节点发现功能便是它们互相协作完成的。其中,每个以太坊客户端启动后都会在本地运行一个Server,并将网络拓扑中相邻的节点视为Node,而Table是Node的容器,udp则是负责维持底层的连接。这些结构的关系如下图

Server

p2p/server.go

type Server struct {

PrivateKey *ecdsa.PrivateKey

Protocols []protocol

StaticNodes[] *discover.Node

newTransport func(net.Conn) transport

ntab disvocerTable

ourHandshake *protoHandshake

addpeer chan *conn

......

}

PrivateKey - 本节点的私钥,用于与其他节点建立时的握手协商

Protocols - 支持的所有上层协议

StaticNodes - 预设的静态Peer,节点启动时会首先去向它们发起连接,建立邻居关系

newTransport - 下层传输层实现,定义握手过程中的数据加密解密方式,默认的传输层实现是用newRLPX()创建的rlpx,这不是本文的重点

ntab - 典型实现是Table,所有peer以Node的形式存放在Table

ourHandshake - 与其他节点建立连接时的握手信息,包含本地节点的版本号以及支持的上层协议

addpeer - 连接握手完成后,连接过程通过这个通道通知Server

Server.listenLoop()

Server的监听循环,启动底层监听socket,当收到连接请求时,Accept后调用setupConn()开始连接建立过程

Server.run()

Server的主要事件处理和功能实现循环

进行主动的节点发现,详见之后的节点发现部分

posthandshake channel 接收已经完成第一阶段的连接,这些连接的身份已经被确认,但还需要验证

addpeer channel 接收已经完成第二阶段的连接,这些连接已经验证,调用runPeer()运行本节点与Peer连接上的协议

Node

Node唯一表示网络上的一个节点

p2p/discover/node.go

type Node struct { <

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值