前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >比特币源码分析之六:网络

比特币源码分析之六:网络

原创
作者头像
qudamahcui
发布2018-06-29 11:54:03
1.1K0
发布2018-06-29 11:54:03
举报

比特币源码分析之六:网络

交互模型

盗用官网的一张图

这幅图描绘了最基本的比特币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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档