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

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

交互模型

盗用官网的一张图

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

相关文章

来自专栏xingoo, 一个梦想做发明家的程序员

JavaMelody监控spring、struts

前言  前面讲过了Javamelody的基本配置,如何使用Javamelody来监控JDBC以及SQL。   这里继续讲解一下如何监控struts和sp...

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

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

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

1453
来自专栏散尽浮华

linux运维中的命令梳理(四)

----------管理命令---------- ps命令:查看进程 要对系统中进程进行监测控制,查看状态,内存,CPU的使用情况,使用命令:/bin/ps (...

6398
来自专栏小白课代表

不止是防撤回,今天要让你的QQ更好用。

安装及其简单,首先解压从课代表这里下载的压缩文件,如果某些杀软误报,请添加信任,当然,可能只有某数字卫士会误报。

2232
来自专栏比原链

Bytom矿池接入协议指南

531
来自专栏酷玩时刻

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

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

2122
来自专栏有趣的Python

19- vue django restful framework 打造生鲜超市 -支付宝支付源码解读

Django2.0.2(Django-rest-framework)以及前端vue开发的前后端分离的商城网站 线上演示地址: http://vueshop.mt...

5125
来自专栏友弟技术工作室

Truffle - 以太坊Solidity编程语言开发框架1. Truffle简介2. Truffle客户端3. 创建一个工程4. 编译合约5. 移植6. 构建应用7. 合约交互8. 测试合约9. 控

Truffle是一个世界级的开发环境,测试框架,以太坊的资源管理通道,致力于让以太坊上的开发变得简单,Truffle有以下:

1144
来自专栏用户2442861的专栏

深入剖析Socket实现

http://blog.csdn.net/zapldy/article/details/5813984

912
来自专栏程序猿DD

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

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

6388

扫码关注云+社区