区块链特辑 :https://blog.csdn.net/fusan2004/article/details/80879343,欢迎查阅,原创作品,转载请标明!
从这篇开始,我们将会围绕着以太坊和eos的源码对一个区块链平台系统的不同组成展开进一步的源码级分析,之所以选择P2P开始我们的征程,主要有两个原因,一是我们部门目前正在进行内部区块链平台的开发,我本人正好负责了其中p2p及网络部分的研发任务,二是p2p作为区块链底层通信的重要组成部分,对于无论公链还是联盟链都有着极其重要的作用,但是p2p网络和其他组件的耦合度恰恰是最少的,从p2p网络开始,有利于我们熟悉以太坊的代码风格,较少的耦合也使得代码的阅读更加流畅自然。
为了更好更清晰的让大家了解p2p的源码,我本来打算用类图和流程图的方式来介绍,但是从我画出的类图来看,源码很复杂,过多的类图其实并不能很好的诠释代码的细节,因此我计划后面无论介绍哪一部分,可大致分为以下几个部分来说明:
- 类型或类说明,这部分单独拎出来介绍主要是因为很庞杂,如果没有一个快速检索的地方,后面介绍代码的时候需要来回查看,降低了效率
- 重点环节说明,至少会将主干流程完整的按照代码走一遍,可能涉及很多代码,如果只是说函数名走完流程的话,其实是丧失了很多细节,而且也无法体会作者的创新独到之处
- 整体结构分析及总结,这一点与我们分析各个部件来完成整个项目的了解如出一辙,对不同类、不同环节了解清楚之后,会自然而然对整个架构设计有了进一步的了解,由点及面,然后再从宏观角度去审视,可以感受到不一样的风景
我们查看的以太坊源码为c++版本的,关于p2p相关的文件均保存在cpp-ethereum中libp2p目录下,下面我们将会把该目录下重要的类或类型的代码贴到下方,并添加说明,便于大家后期检索。
首先从Common.h文件开始:
using NodeID = h512; // 固定长度hash,h表示哈希,512表示长度
using CapDesc = std::pair<std::string, u256>; // p2p上层功能描述类型,一个数据对
using CapDescSet = std::set<CapDesc>; // 描述集合
using CapDescs = std::vector<CapDesc>; // 描述列表
enum PacketType // 消息包的类型
{
HelloPacket = 0, // hello包
DisconnectPacket, // 断开连接
PingPacket, // ping
PongPacket, // pong, ping的回应
GetPeersPacket, // 获取其他peers的请求
PeersPacket, // 回复peers
UserPacket = 0x10 // 自定义
};
enum DisconnectReason // 断开连接的原因
{
DisconnectRequested = 0, // 请求断开
TCPError, // tcp错误
BadProtocol, // 协议版本不对
UselessPeer, // 无效peer&