博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
以太坊源码分析---go-ethereum之p2p通信分析(2)
阅读量:4030 次
发布时间:2019-05-24

本文共 1874 字,大约阅读时间需要 6 分钟。

本文QQ空间链接:


本文csdn博客链接:

上一篇分析了p2p模块的初始化与start

 继续上一篇分析。

 

先回顾下p2p的初始化

github.com/ethereum/go-ethereum/eth/backend.go

函数

func New(config *Config) (*Ethereumerror) {

 


下面是start


 

那现在进入到p2p模块中

github.com/ethereum/go-ethereum/p2p/server.go


p2p模块中,大部分的数据是通过chan来进行传输的。以上有7chan

 


上面是关键地方,两个入口。

下面分别介绍

 

Listen部分


继续跟踪


 

这里面有slots,是用来做数量限制的。用了一个带缓冲区的chan,先讲token放进去,然后先取出token,接收一个链接,当链接ok了后,将token放回去。

很简单的chan的应用

那么逻辑还是很清晰的,我们继续跟踪



 

这里面的东西就比较多了。一个一个来

先看下两个函数的原型doEncHandshakedoProtoHandshake


586
行,
:= &
conn
{
fd
fd
transport
srv
.
newTransport
(
fd
)
flags
flags
cont
make
(
chan 
error
)}

 

我们看下srv


然后我们回到
func 
(
srv 
*
Server
Start
() (
err 
error
) {

 


 

那么就知道了

github.com/ethereum/go-ethereum/p2p/rlpx.go


 

真正的处理函数在这里

github.com/ethereum/go-ethereum/p2p/rlpx.go


 

github.com/ethereum/go-ethereum/p2p/rlpx.go


 

好的回到
func 
(
srv 
*
Server
setupConn
(
fd 
net
.
Conn
flags 
connFlag
dialDest 
*
discover
.
Node
) {

github.com/ethereum/go-ethereum/p2p/server.go

我们看下


在函数
func 
(
srv 
*
Server
setupConn
(
fd 
net
.
Conn
flags 
connFlag
dialDest 
*
discover
.
Node
) {

 

 

if 
err 
:= 
srv
.
checkpoint
(
c
srv
.
posthandshake
)
err 
!= 
nil 
{

 

if 
err 
:= 
srv
.
checkpoint
(
c
srv
.
addpeer
)
err 
!= 
nil 
{

 

分别传递的是两个
chan
srv
.
posthandshak
srv
.
addpee
 
 

 

好的,到这里listen的处理就完了。下面我们看如何通过chanrun进行配合工作的。

 

github.com/ethereum/go-ethereum/p2p/server.go



上面的重点到了,通过chan的传送,把数据传到run中,处理


上面才是重点。Addpeer

github.com/ethereum/go-ethereum/p2p/peer.go


传入的参数,protocolsrv.Protocols。这个我们在第一篇文章中有说到。

 

继续跟踪

github.com/ethereum/go-ethereum/p2p/server.go


 

继续

github.com/ethereum/go-ethereum/p2p/peer.go


 

重点三个地方,慢慢来看


很简单的读信息,然后进行处理

继续


上面的重点处理都在default中,这个就是最上层的入口

好的重点来了。跟踪进去,完了,好像看不懂


 

重点是在p.running

我们回过头去看看


我们知道初始化peer的时候,传送的是srv.Protocols。这个在第一篇文章有介绍了,

 

 

回到



这个很简单,定时的pingpong


 

我们看看最初的run在哪里

github.com/ethereum/go-ethereum/eth/handler.go

ProtocolManager初始化Protocols的时候


 

 

 

龚浩华

月牙寂 道长

QQ 29185807

20180301

你可能感兴趣的文章
用find命令查找最近修改过的文件
查看>>
Android2.1消息应用(Messaging)源码学习笔记
查看>>
在android上运行native可执行程序
查看>>
Phone双模修改涉及文件列表
查看>>
android UI小知识点
查看>>
Android之TelephonyManager类的方法详解
查看>>
android raw读取超过1M文件的方法
查看>>
ubuntu下SVN服务器安装配置
查看>>
MPMoviePlayerViewController和MPMoviePlayerController的使用
查看>>
CocoaPods实践之制作篇
查看>>
[Mac]Mac 操作系统 常见技巧
查看>>
苹果Swift编程语言入门教程【中文版】
查看>>
捕鱼忍者(ninja fishing)之游戏指南+游戏攻略+游戏体验
查看>>
iphone开发基础之objective-c学习
查看>>
iphone开发之SDK研究(待续)
查看>>
计算机网络复习要点
查看>>
Variable property attributes or Modifiers in iOS
查看>>
NSNotificationCenter 用法总结
查看>>
C primer plus 基础总结(一)
查看>>
剑指offer算法题分析与整理(一)
查看>>