比特币源码分析之六:网络
交互模型
盗用官网的一张图
这幅图描绘了最基本的比特币p2p网络的数据协议,本文就针对这张图进行讲解
消息类型
消息都有一个公共的头结构如下(代码在Protocol.h CMessageHeader类中)
其中pchCommand代表了消息的类型,是一个字符串,下文用消息ID代表
图中有几个类别的消息
1、Getheaders消息
消息ID:NetMsgType::GETHEADERS
重要字段:
Locator 代表了本节点有的区块头的hash列表(可以看做一个需要区块的起始)
hashStop 代表了需要区块的hash停止位置
作用:
从别的节点中同步区块,locator和hashstop分别代表了需要区块的起始和结束位置,但是locator之所以是一个hash列表,是因为有可能出现分叉的情况(而且大概率出现这种情况),发个列表过去,对方好找到两条链的分叉点,从这里开始发送。
2、Headers消息
消息ID:NetMsgType::HEADERS
重要字段:
Count 代表了包含区块头的多少
Headers 一个区块头的列表
作用:
主要是用于回复Getheaders消息,把本地的区块头发送给对方
3、Getblocks消息
消息ID:NetMsgType::GETBLOCKS
重要字段:
Locator
hashStop
这两个字段和Getheaders相同
作用:
从别的节点获取区块,和Getheaders唯一区别就是一个是获取整个区块内容一个是只获取头,最初比特币只有Getblocks,考虑到比较笨重又有可能引发带宽并发等问题,修改成了Getheaders消息主导。
4、Mempool消息
一个交易池消息,暂时先不介绍,等讲解到交易池时这个就不言自明了
5、Inv消息
消息ID:NetMsgType::INV
重要字段:
本消息是一个inv列表而inv有这两个字段
Type 代表是tx还是block
Hash 代表tx或者block的hash
作用:
主要是回复GetBlock或者tx消息,告诉对方我有这些tx或者block,你来取吧(通过Getheaders 或者Getdata)
6、Getdata消息
消息ID:NetMsgType::GETDATA
重要字段:
还是一个inv消息里列表
作用:
Inv消息对方告诉我:我有这些数据,你来取吧
收到Inv消息后后发送GetData消息回答对方:我要你有的数据中的这些,你给我吧
对方收到GetData消息开始给我发送数据如Tx消息,block消息
7、Tx消息
消息ID: NetMsgType::TX
重要字段:
Tx代表交易数据
作用:
发送/接受 传输的tx数据,主要是响应GetData消息
8、Block消息
消息ID:NetMsgType::TX
重要字段:
Block 代表区块数据
作用:
发送/接受 传输的block数据,主要是响应GetData消息
9、Merkleblock消息
一种节省block传输带宽的机制,由于原理相对比较复杂,不是本篇重点后续介绍,在这里可以理解为和Block消息功能一样,只是数据量更小。
10、Notfound消息
没有找到消息,表示你要的数据我没有,不过多介绍,回复GetData
交互过程
最初版本的比特别数据传输过程如下图
之后由于block比较占用带宽等原因修改成了先要区块头,确定没有了这个区块头再要区块。过程基本类似,这里不再赘述。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。