以太坊源码分析---go-ethereum之p2p通信分析(2)

本文QQ空间链接:http://user.qzone.qq.com/29185807/blog/1519899372

本文csdn博客链接:http://blog.csdn.net/screscent/article/details/79416318


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

 

先回顾下p2p的初始化

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

函数

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

 

以太坊源码分析---go-ethereum之p2p通信分析(2)

下面是start

以太坊源码分析---go-ethereum之p2p通信分析(2)

 

那现在进入到p2p模块中

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

以太坊源码分析---go-ethereum之p2p通信分析(2)

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

 以太坊源码分析---go-ethereum之p2p通信分析(2)


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

下面分别介绍

 

Listen部分

以太坊源码分析---go-ethereum之p2p通信分析(2)

继续跟踪

以太坊源码分析---go-ethereum之p2p通信分析(2)

 

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

很简单的chan的应用

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

以太坊源码分析---go-ethereum之p2p通信分析(2)

以太坊源码分析---go-ethereum之p2p通信分析(2) 

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

先看下两个函数的原型doEncHandshakedoProtoHandshake

以太坊源码分析---go-ethereum之p2p通信分析(2)
586行,:= &conn{fdfdtransportsrv.newTransport(fd)flagsflagscontmake(chan error)}

 

我们看下srv

以太坊源码分析---go-ethereum之p2p通信分析(2)
然后我们回到func (srv *ServerStart() (err error) {

 

以太坊源码分析---go-ethereum之p2p通信分析(2)

 

那么就知道了

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

以太坊源码分析---go-ethereum之p2p通信分析(2)

 

真正的处理函数在这里

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

以太坊源码分析---go-ethereum之p2p通信分析(2)

 

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

以太坊源码分析---go-ethereum之p2p通信分析(2)

 

好的回到func (srv *ServersetupConn(fd net.Connflags connFlagdialDest *discover.Node) {

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

我们看下

以太坊源码分析---go-ethereum之p2p通信分析(2)
在函数func (srv *ServersetupConn(fd net.Connflags connFlagdialDest *discover.Node) {

 

 

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

 

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

 

分别传递的是两个chansrv.posthandshaksrv.addpee  

 

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

 

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

以太坊源码分析---go-ethereum之p2p通信分析(2)


以太坊源码分析---go-ethereum之p2p通信分析(2)

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

以太坊源码分析---go-ethereum之p2p通信分析(2)

上面才是重点。Addpeer

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

以太坊源码分析---go-ethereum之p2p通信分析(2)

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

 

继续跟踪

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

以太坊源码分析---go-ethereum之p2p通信分析(2)

 

继续

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

以太坊源码分析---go-ethereum之p2p通信分析(2)

 

重点三个地方,慢慢来看

以太坊源码分析---go-ethereum之p2p通信分析(2)

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

继续

以太坊源码分析---go-ethereum之p2p通信分析(2)

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

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

以太坊源码分析---go-ethereum之p2p通信分析(2)

 

重点是在p.running

我们回过头去看看

以太坊源码分析---go-ethereum之p2p通信分析(2)

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

 

 

回到

以太坊源码分析---go-ethereum之p2p通信分析(2)
以太坊源码分析---go-ethereum之p2p通信分析(2)

这个很简单,定时的pingpong

以太坊源码分析---go-ethereum之p2p通信分析(2)

 

我们看看最初的run在哪里

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

ProtocolManager初始化Protocols的时候

以太坊源码分析---go-ethereum之p2p通信分析(2)

 

 

 

龚浩华

月牙寂 道长

QQ 29185807

20180301

以太坊源码分析---go-ethereum之p2p通信分析(2)