刚写了一篇区块链同步的文章,发现里面有一些DAO分叉的代码绕不过去,需要专门写一篇来简单介绍一下这次以太坊历史上著名的分叉事件。
在p2p(6)那一节末尾我们涉及到了BlockChainSync::syncPeer()
函数,实际上到这里已经进入了另外一个重要模块:区块链同步模块,这个模块算是P2P模块交互模块。
RLP是一种特殊的二进制编码解码方式,以太坊里数据包都是采用这种方式编码的,和传统的结构相比,RLP编码更节省空间,提高网络传输效率,缺点就是不太直观,这种编码解码原理介绍在下面这边文章里讲得很好,还附有python的实现代码:RLP编码和解码。但是在本文里我们来看看在C++里的实现。
我们再来深入了解一下Host类里节点和本节点是怎么交互的,在上一节可以看到节点到了Host类后,会调用Host::connect
来连接对方,我们可以看下connect()
函数实现代码:
整个以太坊p2p代码分为两部分,一部分是基于UDP的节点发现协议,另一部分是基于TCP的传输协议,我们先来看第一部分。
这部分主要代码在libp2p\NodeTable.h
文件中。
我们在C++中常用的表示整形的类型有int, long, unsigned long, int64_t等等,这些类型的长度为32位,64位,一般的情况下就能满足我们的需要了,但是在以太坊里这样的精度类型就显得捉襟见肘了,比如以太坊中常用的货币单位为Wei,而以太币1Ether=10的18次方Wei,这是一个非常大的数,普通的数据类型显然不能用了,我们需要更大的数。
Update your browser to view this website correctly. Update my browser now