区块链中的P2P

区块链中P2P介绍

  • p2p是什么
  • 为何区块链须要P2P
  • 比特币、以太坊、超级帐本和EOS的P2P对比

P2P是什么

P2P做为区块链网络中去中心化的标识
P2P全称对等式网络(peer-to-peer),又称点对点技术,是无中心服务器、依靠用户群(peers)交换信息的互联网体系;与有中心服务器的中央网络系统不一样,对等网络的每一个用户端既是一个节点,也有服务器的功能,任何一个节点没法直接找到其余节点,必须依靠其户群进行信息交流。

优点node

  1. 可在网络的中央及边缘区域共享内容和资源。在客户端/服务器网络中,一般只能在网络的中央区域共享内
  2. 由对等方组成的网络易于扩展,并且比单台服务器更加可靠。单台服务器会受制于单点故障,或者会在网络使用率偏高时,形为瓶颈。
  3. 由对等方组成的网络可共享处理器,整合计算资源以执行分布式计算任务,而不仅是单纯依赖一台计算机,如一台超级计算机。
  4. 用户可直接访问对等计算机上的共享资源。网络中的对等方可直接在本地存储器上共享文件,而没必要在中央服务器上进行共享。

p2p网络的三个特性安全

  • 离散性:构成系统的节点并无任何中央式的协调机制。
  • 伸缩性:即便有成千上万个节点,系统仍然应该十分有效率。
  • 容错性:即便节点不断地加入、离开或是中止工做,系统仍然必须达到必定的可靠度。

为何区块链会选择P2P做为网络基础

上面介绍P2P的时候说过,他是无中心服务器的,中心服务器就意味着,当受到攻击的时候,中心服务器一旦宕机,整个网络和服务就会出现问题。而P2P网络的优点在于,每一个节点既是客户端又是服务端,因此当受到攻击时,任何一台机器垮掉,也不会影响总体的服务。
区块链的核心是去中心化,这和P2P网络的观念不约而同,因此选择P2P的理由也就很充分。

经过区块链技术学习P2P

首先看一下P2P的总体技术点:服务器

  • 首先是如何发现peers,在P2P网络中,发现节点是最开始、最重要和最难的一部分;
  • 节点之间创建连接;发现节点以后,就要进行握手连接,肯定节点之间的通讯协议等
  • 节点之间的通讯;连接创建以后,就能够正常的进行通讯了;

以上三点解决以后,基本就能够实现一个简单的P2P网络。若是想要实现一个比较完整的P2P网络,固然还有不少的细节须要考虑,好比说,节点发现协议,快速定位节点,安全性,节点的加入和退出机制,节点的心跳保活等。咱们主要介绍的是DHT分布式哈希表的知识点;网络

比特币、以太坊、超级帐本和EOS都使用了DHT的具体实现;分布式

链类型 使用的P2P协议
区块链 Gossip协议
超级帐本 Gossip协议
以太坊 Kademlia协议
EOS 本身实现的P2P协议 (待研究)

比特币学习

  • 节点发现
      新节点启动后,想要参与协同运做,必须发现其余的比特币节点,也就是至少须要发现一个比特币网络中的节点,并创建联系。

   新节点找到对等体的方法:
   - 种子节点:使用多个DNS服务器(比特币节点专用)来解析比特币节点的IP。
   - 节点引荐:若是不知道DNS,则必须知道至少一个比特币节点的IP。区块链

  • 节点连接
    节点向peer节点发送version消息开始握手,peer节点须要检验版本,秘钥等数据,验证经过,会返回verack消息。
    握手消息完成,节点发送包含本身IP地址和addr的消息给peer节点,对等节点收到,继续向它的对等节点发出addr消息,这样新节点的IP地址就会在P2P网络中广播出去(Gossip协议的Rumor-Mongering);

由于网络中,节点能够随时加入和离开,因此全部的节点必须在一个节点退出的时候,寻找新节点,而且在其余节点启动的时候,对其进行帮组。线程

超级帐本

以太坊
以太坊使用的是kademlia协议,简称Kad协议,具体的Kad协议在其余的文章中介绍。本文咱们只须要知道Kad使用UDP进行节点间消息通讯,每一个节点根据与邻居节点距离之间的距离(NodeID的差距),分别放到不一样的桶(bucket)中,且有4种消息ip

  • ping - 用于探测其余节点是否还存在
  • store - 接收者受到后,将信息中key/value对存储在本节点
  • findnode - 接受者向发送者返回 k 个它知道的与目标结点距离最近的节点
  • findvalue - 和findnode 差很少,区别是若是接收者本地存在与目标结点对应的value,那么就回复这个值给发送者。

以太坊中的P2P网络是比较完整的,很值得学习,有发现、子协议和Nat映射等模块。咱们主要讲解的是发现模块;
总体结构:资源

结构名 做用
Server 本地客户端服务
Node 节点的信息
table 存储peer节点的结构
udp 底层节点的通信协议
Server

当本地启动一个客户端,并配置好静态peer节点的配置信息以后,启动的Server会进行三个操做

  • 主动发现邻居
  • ECDH密钥创建,确认身份并进行身份验证
  • 连接已经创建,确认生层交换协议,并运行这些协议
Node

Node节点惟一的表示网络中的一个以太坊节点,而且Node节点有以下的信息:

  • IP地址
  • 链接使用的UDP/TCP端口号
  • ID:以太坊网络中惟一标识一个节点,本质上是一个椭圆曲线公钥(PublicKey),与Server的PrivateKey对应。一个节点的IP地址不必定是固定的,但ID是惟一的。
  • 用于节点间的距离计算的sha
table

Table主要用来管理与本节点与其余节点的链接的创建更新删除:

  • bucket - 全部peer按与本节点的距离远近放在不一样的桶(bucket)中
  • refreshReq - 更新Table请求通道

Table会循环的监控并对peer节点进行刷新

  • 定时(30s)启动Peer刷新过程的定时器
  • 接收其余线程投递到Table的刷新Peer链接的通知,当收到该通知时启动更新
  • 定时从新检查以链接节点的有效性的定时器
udp

udp的底层接受数据包循环,负责接收其余节点的packet,并将解析后的信息交给另外一个循环处理,这个循环处理负责控制消息的向上递交和收发控制

节点发现的流程:

  • 邻居初始化

    1. 当一个节点启动后,它会首先向配置的静态节点发起链接,发起链接的过程称为Dial,此时的Dial须要知道IP地址,若是不知道须要有一个解析IP的过程(根据ID来解析)
    2. 创建链接,下面两个都成功则加入table中:

      1. 秘钥连接和确认
      2. 上层协议确认
  • 探活检测(Revalidate)

    • 有效性检测就是利用ping消息进行探活操做。Table启动了一个定时器(0~10s),按期随机选择一个bucket,向其末尾的节点发送ping消息,若是对方回应了pong,则探活成功。
  • 更新邻居关系

    • 按期(定时器超时)或不按期(收到refreshReq)地进行更新邻居关系(发现新邻居),二者都调用doRefresh()方法,该方法对在网络上查找离自身和三个随机节点最近的若干个节点。
EOS
相关文章
相关标签/搜索