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

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

交互模型

盗用官网的一张图

这幅图描绘了最基本的比特币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 条评论
登录 后参与评论

相关文章

来自专栏封碎

android监听文件和目录的创建删除移动等事件 博客分类: Android AndroidLinuxOSAccess

      android.os下的FileObserver类是一个用于监听文件访问、创建、修改、删除、移动等操作的监听器,基于linux的inotify。 F...

1943
来自专栏区块链技术专栏

EOSIO 智能合约数据库演练

对于数据库,最重要的功能就是查询,如果没有查询功能,数据库里的数据就不能呈现,也就没有意义。查询数据库主要分为两方面,一方面是主键查询,一方面是通过二级索引查询...

4967
来自专栏木子墨的前端日常

nginx反向代理跨域基本配置与常见误区

最近公司前后端分离,前端独立提供页面和静态服务很自然的就想到了用nginx去做静态服务器。同时由于跨域了,就想利用nginx的反向代理去处理一下跨域,但是在解决...

2282
来自专栏酷玩时刻

前端后台以及游戏中使用google-protobuf详解

protoBuf是一种灵活高效的独立于语言平台的结构化数据表示方法,与XML相比,protoBuf更小更快更简单。你可以用定义自己protoBuf的数据结构,用...

2762
来自专栏gaoqin31

设计模式之 策略模式

定义 :封装了一些列算法,它们之前可以相互替换,此模式使得算法的改变,不会影响到使用它们的客户端

1343
来自专栏程序猿DD

分布式消息队列 RocketMQ 源码分析 —— Message 顺序发送与消费

? 本文主要基于 RocketMQ 4.0.x 正式版 1. 概述 2. Producer 顺序发送 3. Consumer 严格顺序消费 3.1 获得(锁定...

7488
来自专栏安富莱嵌入式技术分享

【RL-TCPnet网络教程】第39章 RL-TCPnet之TFTP服务器

本章节为大家讲解RL-TCPnet的TFTP服务器应用,学习本章节前,务必要优先学习第38章的TFTP基础知识。有了这些基础知识之后,再搞本章节会有事半功倍的效...

1763
来自专栏Seebug漏洞平台

利用 phar 拓展 php 反序列化漏洞攻击面

通常我们在利用反序列化漏洞的时候,只能将序列化后的字符串传入unserialize(),随着代码安全性越来越高,利用难度也越来越大。但在不久前的Black Ha...

1705
来自专栏Ryan Miao

Linux 学习笔记

Linux学习笔记 请切换web视图查看,表格比较大,方法:视图》》web板式视图 博客园不能粘贴图片吗  http://wenku.baidu.com/vie...

6389
来自专栏比原链

Bytom矿池接入协议指南

Gitee地址:https://gitee.com/BytomBlockchain/bytom

1285

扫码关注云+社区

领取腾讯云代金券