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

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

交互模型

盗用官网的一张图

这幅图描绘了最基本的比特币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比较占用带宽等原因修改成了先要区块头,确定没有了这个区块头再要区块。过程基本类似,这里不再赘述。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏落花落雨不落叶

canvas画简单电路图

60911
来自专栏java 成神之路

使用 NIO 实现 echo 服务器

4607
来自专栏Ceph对象存储方案

Luminous版本PG 分布调优

Luminous版本开始新增的balancer模块在PG分布优化方面效果非常明显,操作也非常简便,强烈推荐各位在集群上线之前进行这一操作,能够极大的提升整个集群...

3105
来自专栏杨龙飞前端

scrollto 到指定位置

2494
来自专栏闻道于事

js登录滑动验证,不滑动无法登陆

js的判断这里是根据滑块的位置进行判断,应该是用一个flag判断 <%@ page language="java" contentType="text/html...

6768
来自专栏C#

DotNet加密方式解析--非对称加密

    新年新气象,也希望新年可以挣大钱。不管今年年底会不会跟去年一样,满怀抱负却又壮志未酬。(不过没事,我已为各位卜上一卦,卦象显示各位都能挣钱...)...

4848
来自专栏Golang语言社区

【Golang语言社区】GO1.9 map并发安全测试

var m sync.Map //全局 func maintest() { // 第一个 YongHuomap := make(map[st...

4708
来自专栏我和未来有约会

Silverlight第三方控件专题

这里我收集整理了目前网上silverlight第三方控件的专题,若果有所遗漏请告知我一下。 名称 简介 截图 telerik 商 RadC...

4005
来自专栏魂祭心

原 canvas绘制clock

4054
来自专栏张善友的专栏

Mix 10 上的asp.net mvc 2的相关Session

Beyond File | New Company: From Cheesy Sample to Social Platform Scott Hansel...

2547

扫码关注云+社区