news 2026/7/4 8:16:39

go ethereum之p2p

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
go ethereum之p2p

简介

p2p是以太坊节点网络层的骨架,夹在底层 TCP/UDP 和应用协议(eth、snap、les)之间,管三件事:节点发现(谁在线)、连接管理(怎么连上、怎么断)、消息多路复用(连上了跑什么协议)

重要结构

主要有

  • Server
  • Peer:表示一个连接

Server结构定义为

typeServerstruct{// Config fields may not be modified while the server is running.Config// Hooks for testing. These are useful because we can inhibit// the whole protocol stack.newTransportfunc(net.Conn,*ecdsa.PublicKey)transport newPeerHookfunc(*Peer)listenFuncfunc(network,addrstring)(net.Listener,error)lock sync.Mutex// protects runningrunningboollistener net.Listener ourHandshake*protoHandshake loopWG sync.WaitGroup// loop, listenLooppeerFeed event.Feed log log.Logger nodedb*enode.DB localnode*enode.LocalNode discv4*discover.UDPv4 discv5*discover.UDPv5 discmix*enode.FairMix dialsched*dialScheduler// This is read by the NAT port mapping loop.portMappingRegisterchan*portMapping// Channels into the run loop.quitchanstruct{}addtrustedchan*enode.Node removetrustedchan*enode.Node peerOpchanpeerOpFunc peerOpDonechanstruct{}delpeerchanpeerDrop checkpointPostHandshakechan*conn checkpointAddPeerchan*conn// State of run loop and listenLoop.inboundHistory expHeap}

Config:p2p服务端配置
listener:监听器,接受连接
discv4,discv5,discmix:节点发现
dialsched:向外连接
peerOp:对接操作
localnode:结点的ENR

Peer结构定义为

typePeerstruct{rw*conn runningmap[string]*protoRW log log.Logger created mclock.AbsTime wg sync.WaitGroup protoErrchanerrorclosedchanstruct{}pingRecvchanstruct{}discchanDiscReason// events receives message send / receive events if setevents*event.Feed testPipe*MsgPipeRW// for testing}

启动

通过Start启动p2p,主要作以下事项

  • setupLocalNode:创建dev2p handshake和localnode
  • setupPortMapping:开启端口映射循环,根据NAT配置执行不同的协程
  • setupListening:开启监听协程listenLoop处理外部连接
  • setupDiscovery:开启节点发现,根据配置开启发现服务discv4,discv5
  • setupDialScheduler:开启拨号调度器dialScheduler,开启两个协程readNodesloop
  • srv.run():处理通道事件,如新连接等
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/4 8:15:28

第二次小学期作业

Xshell 和 Xftp 使用教程 Xshell 是一款SSH客户端,用于远程连接并管理Linux服务器。使用步骤: 安装与启动:下载安装Xshell并启动。新建会话:点击“文件” -> “新建”。填写连接信息:在“连接”中,协议选…

作者头像 李华
网站建设 2026/7/1 1:45:42

书法资源合集

萝卜练字 小学生硬笔书法课 文件大小: 44.3GB内容特色: 44.3GB高清视频逐字示范,小学生硬笔书法全流程训练适用人群: 小学生、家长、书法启蒙教师核心价值: 掌握正确握笔与笔画结构,快速提升书写工整度下载链接: https://pan.quark.cn/s/77888772fddb …

作者头像 李华
网站建设 2026/7/1 1:44:53

为什么不该用 Double 表示金额及解决方案合集 - Java(45)

比如 0.1 0.2 并不等于 0.3,而是等于 0.30000000000000004——这也一度成为程序员圈子里的经典梗。所以用浮点数表示金额这种需要精确计算的数值,是会出现精度丢失问题的。double a 0.1; double b 0.2; System.out.println(a b); // 输出: 0.30000000000000004 System.out…

作者头像 李华
网站建设 2026/7/1 1:44:42

面向切面编程和面向对象编程的区别,两者有冲突吗?

面向切面编程(AOP)和面向对象编程(OOP)是两种不同的编程范式,它们各自解决不同类型的问题,并且通常可以互补使用而不是冲突。OOP 关注的是对象和它们的交互,强调的是数据和行为的封装。 AOP关注…

作者头像 李华
网站建设 2026/7/1 1:44:18

乳牙蛀了不用管?避开护牙误区,科学守护孩子恒牙健康

乳牙蛀了不用管?避开护牙误区,科学守护孩子恒牙健康“孩子才几岁,乳牙迟早要换,蛀了也不用在意。” 这是儿童口腔科普中最常遇到的认知误区。很多家长觉得乳牙是 “临时牙齿”,不需要费心护理,却忽略了乳牙…

作者头像 李华
网站建设 2026/7/1 1:42:56

什么是线程池?

说说工作中线程池的应用 可以讲在拼团中怎么用的。 3、说一下线程池的工作流程 线程池刚创建时,里面没有一个线程。任务队列是作为参数传进来的(因为可以选择)。当调用excute()方法添加一个任务时,线程池会做如下判断&#xff1a…

作者头像 李华