以太坊C++源码解析(五)区块链同步(3)

经过前面的铺垫,现在我们可以来看看BlockChainSync::onPeerBlockHeaders()这个函数的实现了,这个函数是EthereumPeer接收到BlockHeadersPacket包时被调用的,用来处理接收到的区块头。
这个函数有点长,还是一段一段来看吧。

以太坊C++源码解析(五)区块链同步(2)

区块链同步的核心类是BlockChainSync,在继续深入了解同步流程之前,我们还是先来了解一下这个类有哪些重要成员吧。

以太坊C++源码解析(六)以太坊The DAO分叉

刚写了一篇区块链同步的文章,发现里面有一些DAO分叉的代码绕不过去,需要专门写一篇来简单介绍一下这次以太坊历史上著名的分叉事件。

以太坊C++源码解析(五)区块链同步(1)

在p2p(6)那一节末尾我们涉及到了BlockChainSync::syncPeer()函数,实际上到这里已经进入了另外一个重要模块:区块链同步模块,这个模块算是P2P模块交互模块。

以太坊C++源码解析(三)p2p(6)

上一节中留了一个悬念,那就是在Session类中我们没有找到有意义的处理代码,这部分代码隐藏在哪里呢?

答案其实在上上节的末尾中

以太坊C++源码解析(四)RLPStream类

RLP是一种特殊的二进制编码解码方式,以太坊里数据包都是采用这种方式编码的,和传统的结构相比,RLP编码更节省空间,提高网络传输效率,缺点就是不太直观,这种编码解码原理介绍在下面这边文章里讲得很好,还附有python的实现代码:RLP编码和解码。但是在本文里我们来看看在C++里的实现。

以太坊C++源码解析(三)p2p(5)

Session类

我们终于到了关键地方,Session类代码位于libp2p\Session.h中 ,这个类代表的是socket通讯中的连接,这才是真正处理通讯协议的地方!

以太坊C++源码解析(三)p2p(4)

从Host类到Session类

上一节我们跟踪到了Host::startPeerSession()函数里,现在我们来深入这个函数看个究竟。

以太坊C++源码解析(三)p2p(3)

我们再来深入了解一下Host类里节点和本节点是怎么交互的,在上一节可以看到节点到了Host类后,会调用Host::connect来连接对方,我们可以看下connect()函数实现代码:

以太坊C++源码解析(三)p2p(2)

K桶的实现

这里借用一下别人的图:
k桶
可以看到这个就是一个二维数组,可以简单定义为:int bucket[256][16]其中第一维是从0-255表示距离,第二维记录16个节点。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×