以太坊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个节点。

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

整个以太坊p2p代码分为两部分,一部分是基于UDP的节点发现协议,另一部分是基于TCP的传输协议,我们先来看第一部分。
这部分主要代码在libp2p\NodeTable.h文件中。

以太坊C++源码解析(二)大数据类型

我们在C++中常用的表示整形的类型有int, long, unsigned long, int64_t等等,这些类型的长度为32位,64位,一般的情况下就能满足我们的需要了,但是在以太坊里这样的精度类型就显得捉襟见肘了,比如以太坊中常用的货币单位为Wei,而以太币1Ether=10的18次方Wei,这是一个非常大的数,普通的数据类型显然不能用了,我们需要更大的数。

Your browser is out-of-date!

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

×