比特币网络节点:如何分工?如何发现?......?

96
堂说区块链
0.1 2018.05.13 17:00* 字数 2738

本文实时同步发布在区块链原创技术公众号【堂说区块链】上,欢迎关注订阅。

推荐一个新的区块链领域优质内容输出平台:【币读www.biduDNA.com】

博主已在币读平台上首开专栏,区块链领域技术原创文章将同步首发在【币读】平台上;

币读专栏地址:https://www.bidudna.com/statics/topics?id=49


比特币网络

0.比特币网络简述

1)比特币采用了基于国际互联网(Internet)的P2P(peer-to-peer)网络架构(比特币的P2P网络下文会做详细介绍);

2)“比特币网络”是按照比特币P2P协议运行的一系列节点的集合;

除了比特币P2P协议之外,比特币网络中也包含其他协议(比如Stratum协议就被应用于挖矿节点通信&&比特币轻钱包等);

3)网关路由服务器(gateway)提供其他协议,并且基于P2P协议将这些协议接入到比特币网络中,并拓展到运行其他协议的各个节点。

1.P2P协议概述

P2P:对等计算机或对等网络。

P2P是一种分布式网络,网络的参与者共享他们所拥有的一部分硬件资源(处理能力、存储能力、网络连接能力、打印机等),这些共享资源需要由网络提供服务和内容,能被其它对等节点直接访问而无需经过中间实体。

在此网络中的参与者既是资源提供者,又是资源获取者,网络中的每个节点都是以【扁平】的拓扑结构相互连通。

P2P的特点:

1)无中央服务器,打破了C/S模式;2)用户之间互联并分享文件;3)非中心化

P2P网络常见的拓扑结构:

1)中心化拓扑(又叫星行拓扑) 2)半中心化拓扑  3)全分布式拓扑(网状/扁平)

区块链中的P2P拓扑结构采用的是全分布式拓扑结构

2.区块链中的P2P协议有什么不同?

P2P的网络协议应用有很多, 规模最大也最成功的领域就是文件分享领域:比如BitTorrent(比特流:是一种内容分发协议,由布拉姆·科恩自主开发);比如Napster;

比特币&以太坊等区块链实现了适合自己网络的定制化的P2P网络协议,与上述P2P协议稍有不同。

1)比特币的P2P网络是基于TCP协议构建的,主网默认通信端口8333;

2)以太坊的P2P网络是一个完全加密的网络,提供UDP和TCP两种连接方式(节点发现使用的UDP,节点间信息交互使用的是TCP),主网默认TCP通信端口30303,UDP端口30301;

区块链中的P2P协议,担负的职责有很多,比如节点发现与路由,比如节点交互等。

3.节点的功能有哪些?

一:由上我们知道,比特币网络的核心基础协议是P2P,比特币网络中的其他协议都是通过桥接服务器接入P2P网络,并且P2P网络中的节点都是对等的。

虽然,比特币网络中的节点是对等的,但是根据节点所承载的功能不同,不同节点在整个比特币网络中的分工也不同。

二:节点总共承载四个功能:

(1)挖矿:即部署了Stratum服务器的节点

(2)钱包:即转账交易功能

(3)路由

(4)区块链数据库:即Local存储区块链全部数据

如下图所示:

比特币网络节点

1)“网络路由”:功能是所有节点都具备的功能,也就是说不具备“网络路由功能的”节点不能称之为“比特币网络节点”;

2)”完整区块链“:指的是节点本地保存一份完整的并且最新的区块链全部数据。这样的节点,我们称之为“全节点”Full Node;

反之,有的节点只保存了部分的区块链数据(一般是运行SPV协议,本地保存区块头部SPV认证信息),这样的节点我们称之为“SPV节点”或者“轻量级节点”;

3)“挖矿”:指的是那些运行在特殊设备上,并且运行POW算法的节点,通过POW算法来互相竞争新区块的生成权;

4)“钱包”:用户的钱包也可以作为比特币网络的一个节点,比如BitCoin Core桌面钱包,以及SPV移动端轻量级钱包等。

4.节点的分类与分工

根据节点拥有上述四个功能中的多少来分类,比特币网络节点可以分为如下几种:

1)bitcoin core 比特币核心客户端

在比特币网络中,包含钱包,挖矿,完整的区块链数据,网络路由节点。


core

2)完整区块链节点

在比特币网络中,包含完整的区块链数据和网络路由节点;

full Node

3)独立矿工

本地拥有完整的区块链数据,无需实时与其他节点进行数据验证;拥有网络路由功能(所以可视为网络节点);运行POW挖矿算法;


独立矿工

4)SPV轻钱包

不存储区块链所有数据,只保存SPV认证所需的必要信息;包含网络路由节点。


SPV钱包

以上,即是网络节点的大致分类,而我们也知道,“矿工”这个角色对于维护比特币网络的安全,对全网交易的进行发挥着举足轻重的作用,那么,根据矿工接入P2P网络的方式来区分,又分为几种类型的“矿工”呢?

5.“矿工”的分类

1)独立矿工

上文已经描述。

2)Stratum矿工(运行Stratum服务器)

运行Stratum挖矿协议的矿工(非节点)属于Stratum主服务器的子服务器;

Stratum协议矿工

3)矿池协议矿工(运行Pool服务器)

运行矿池挖矿协议的矿工服务器,通过Pool协议与Pool矿池主服务器进行交互;

矿池组,只有PooL矿池主服务器与P2P网路链接,大致的网络拓扑图如下:


简易化“矿工”网路拓扑图

6.网络节点如何发现?

在一个中心化的拓扑结构中,任何加入的网络的新节点只要连接到中心节点即可;

但是,比特币中的P2P网络节点都属于“对等节点”,那么比特币网络如何在“去中心化”的拓扑结构下,动态维护网络节点的呢?

当一个新的网络节点启动之后,该节点需要快速的与任何一个保持活跃状态的对等节点完成通信,加入到比特币网络中参与协同运作;

由于比特币网络的拓扑结构是不基于物理地址的,所以相邻节点的概念与物理信息无关;在新节点连接时,可以随机选择网络中存在的比特币节点与之相连。

节点之间的通信过程

1)对等节点之间是使用TCP协议进行握手通信的,主网默认通信端口8333;

2)通信交互的信息为,新加入节点A运行的P2P协议版本信息Version,BestHeight等(BestHeight字段标示了一个节点当前的区块链高度),对等节点B接收到之后,会回复一个VersionAck信息。

3)对等节点B主动发起链接,发送本节点运行的P2P协议版本信息Version等,新加入节点A接收到之后,要恢复对等节点一个VersionAck信息。

4)新加入节点A发送一个getAddress()请求,要求对等节点B返回其已知的其他对等节点的IP地址列表。通过这种方式,新加入节点A可以找到需连接到的对等节点集合,并向网络发布它的消息以便其他节点查找。

5)新加入节点A,发送getBlocks()请求,对等节点B会返回B本地保存的顶端区块哈希值。如果节点A识别出它接收到的哈希值并不属于顶端区块,而是属于一个非顶端区块的旧区块,那么它就能推断出:其自身的本地区块链比其他对等节点的区块链更长。

6)拥有更长区块链的对等节点,会向全网广播出去,其他对等节点如果需要补充区块,则会向该拥有最长区块链的节点发起getdata()请求,获取全部数据;

Q&A:

1)以上过程为曾经加入过比特币网络中的FullNode节点 再次动态加入的过程,如果是一个新的FullNode节点呢?

那么它就不包含任何区块链信息,它只知道一个区块——静态植入在客户端软件中的创世区块。新节点需要下载从0号区块(创世区块)开始的数十万区块的全部内容,才能跟网络同步、并重建全区块链。

2)如果新加入的节点是一个SPV节点(轻量级节点)呢?

SPV节点使用的是一条getheaders消息,而不是getblocks消息来获得区块头。发出响应的对等节点将用一条headers消息发送多达2000个区块头。这一过程和全节点获取所有区块的过程没什么区别。

SPV节点还在与对等节点的连接上设置了布隆过滤器,用以过滤从对等节点发来的未来区块和交易数据流。任何目标交易都是通过一条getdata的请求来读取的。

以上,即时本期关于比特币P2P网络的所有内容,欢迎各位看官diss哦~~~

同时,欢迎订阅【堂说区块链】微信公众号~~~🤔

Web note ad 1