以太坊源码分析---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)_第1张图片

下面是start

以太坊源码分析---go-ethereum之p2p通信分析(2)_第2张图片

 

那现在进入到p2p模块中

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

以太坊源码分析---go-ethereum之p2p通信分析(2)_第3张图片

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

 以太坊源码分析---go-ethereum之p2p通信分析(2)_第4张图片


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

下面分别介绍

 

Listen部分

以太坊源码分析---go-ethereum之p2p通信分析(2)_第5张图片

继续跟踪

以太坊源码分析---go-ethereum之p2p通信分析(2)_第6张图片

 

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

很简单的chan的应用

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

以太坊源码分析---go-ethereum之p2p通信分析(2)_第7张图片

以太坊源码分析---go-ethereum之p2p通信分析(2)_第8张图片 

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

先看下两个函数的原型doEncHandshakedoProtoHandshake

以太坊源码分析---go-ethereum之p2p通信分析(2)_第9张图片
586 行, := & conn { fd fd transport srv . newTransport ( fd ) flags flags cont make ( chan  error )}

 

我们看下srv


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

 

以太坊源码分析---go-ethereum之p2p通信分析(2)_第10张图片

 

那么就知道了

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


 

真正的处理函数在这里

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

以太坊源码分析---go-ethereum之p2p通信分析(2)_第11张图片

 

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

以太坊源码分析---go-ethereum之p2p通信分析(2)_第12张图片

 

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

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

我们看下

以太坊源码分析---go-ethereum之p2p通信分析(2)_第13张图片
在函数 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

以太坊源码分析---go-ethereum之p2p通信分析(2)_第14张图片


以太坊源码分析---go-ethereum之p2p通信分析(2)_第15张图片

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

以太坊源码分析---go-ethereum之p2p通信分析(2)_第16张图片

上面才是重点。Addpeer

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

以太坊源码分析---go-ethereum之p2p通信分析(2)_第17张图片

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

 

继续跟踪

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

以太坊源码分析---go-ethereum之p2p通信分析(2)_第18张图片

 

继续

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

以太坊源码分析---go-ethereum之p2p通信分析(2)_第19张图片

 

重点三个地方,慢慢来看

以太坊源码分析---go-ethereum之p2p通信分析(2)_第20张图片

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

继续

以太坊源码分析---go-ethereum之p2p通信分析(2)_第21张图片

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

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

以太坊源码分析---go-ethereum之p2p通信分析(2)_第22张图片

 

重点是在p.running

我们回过头去看看

以太坊源码分析---go-ethereum之p2p通信分析(2)_第23张图片

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

 

 

回到

以太坊源码分析---go-ethereum之p2p通信分析(2)_第24张图片
以太坊源码分析---go-ethereum之p2p通信分析(2)_第25张图片

这个很简单,定时的pingpong

以太坊源码分析---go-ethereum之p2p通信分析(2)_第26张图片

 

我们看看最初的run在哪里

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

ProtocolManager初始化Protocols的时候

以太坊源码分析---go-ethereum之p2p通信分析(2)_第27张图片

 

 

 

龚浩华

月牙寂 道长

QQ 29185807

20180301


你可能感兴趣的:(golang,区块链,以太坊)