区块链中P2P介绍

p2p是什么

为什么区块链需要P2P

比特币、以太坊、超级账本和EOS的P2P对比

P2P是什么

P2P作为区块链网络中去中心化的标识

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

优势

可在网络的中央及边缘区域共享内容和资源。在客户端/服务器网络中,通常只能在网络的中央区域共享内

由对等方组成的网络易于扩展,而且比单台服务器更加可靠。单台服务器会受制于单点故障,或者会在网络使用率偏高时,形为瓶颈。

由对等方组成的网络可共享处理器,整合计算资源以执行分布式计算任务,而不只是单纯依赖一台计算机,如一台超级计算机。

用户可直接访问对等计算机上的共享资源。网络中的对等方可直接在本地存储器上共享文件,而不必在中央服务器上进行共享。

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种消息

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,并将解析后的信息交给另一个循环处理,这个循环处理负责控制消息的向上递交和收发控制

节点发现的流程:

邻居初始化

当一个节点启动后,它会首先向配置的静态节点发起连接,发起连接的过程称为Dial,此时的Dial需要知道IP地址,如果不知道需要有一个解析IP的过程(根据ID来解析)

建立连接,下面两个都成功则加入table中:

秘钥链接和确认

上层协议确认

探活检测(Revalidate)

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

更新邻居关系

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

EOS

gossip 区块链_区块链中的P2P相关推荐

  1. 问道区块链_区块链学习_v1.0.0_持续更新。。。

    本系列内容参考图 创建 共识网络 调用 部署 挖矿 消耗 编写 超级链组件 节点 多节点 账号 智能合约 合约账号 燃料耗品代币 开发者 区块 尊重原创,转载请注明出处https://blog.csd ...

  2. 开源 区块链_区块链将如何影响开源

    开源 区块链 中本聪(Satoshi Nakamoto)十年前以比特币起家的时候,已经找到了很多追随者,并成为去中心化运动. 对于某些人来说,区块链技术是一种宗教,它将对人类产生与互联网相同的影响. ...

  3. ctf 区块链_区块链科普002:什么是区块?白话通俗讲解区块是什么意思?

    原标题:区块链科普002:什么是区块?白话通俗讲解区块是什么意思? 八宝饭区块链科普:什么是区块 区块链的价值已经获得多方认可,各项行业应用都在探索尝试,因此形成了基于不同底层架构.针对不同行业应用的 ...

  4. gossip 区块链_区块链技术创新生态 Gossiptoken黑马横空出世

    当今数据革命 互联网的出现引发了巨大的数据革命.科学技术的发展为人类带来了无限的可能性,但也给数据存储带来了前所未有的压力. 集中式数据存储的成本因其较长的部署周期,变化快速,大量基础设施资本投资,高 ...

  5. gossip 区块链_区块链教程Fabric1.0源代码分析流言算法Gossip服务端一兄弟连区块链教程-阿里云开发者社区...

    区块链教程Fabric1.0源代码分析流言算法Gossip服务端一,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁.回归理性,表面上看相关人才需求与身价似乎正在回落.但事实上,正是初期泡沫的渐退 ...

  6. 开源 区块链_区块链如何补充开源

    开源 区块链 大教堂和集市是一个经典的开源故事,由Eric Steven Raymond于20年前撰写. 在故事中,埃里克(Eric)描述了一种新的革命性软件开发模型,该模型在没有(或很少有)中央管理 ...

  7. 健康医疗 区块链_区块链如何帮助重新发明医疗保健

    健康医疗 区块链 This article was originally published on Blockchain Review. Thank you for supporting the pa ...

  8. 以太坊搭建联盟链_区块链知识普及:什么是以太坊

    以太坊(Ethereum)是下一代密码学账本,可以支持众多的高级功能,包括用户发行货币,智能协议,去中心化的交易和设立去中心化自治组织(DAOs)或去中心化自治公司(DACs).以太坊并不是把每一单个 ...

  9. js原型和原型链_理解JS中的原型和原型链

    导读:JavaScript中(JS)的原型和原型链是web前端开发面试中经常被问到的问题:同时,如果我们能很好的理解JS中的原型和原型链,对于控制台输出的很多信息我们也能更好的理解,而原型链也是实现继 ...

最新文章

  1. SVN可以拉项目但是提交时提示没有权限
  2. makefile中的函数
  3. import Vue form 'vue’的意思
  4. C语言符号位补码要变吗,补码与符号位取反
  5. oracle 自定义 聚合函数
  6. c语言程序设计 a b,用C语言编程时,a+=b 和 a=a+b 真的完全等价吗?
  7. del服务器如何收系统日志,利用Rsyslog集中收集系统日志和用户操作记录以及相关处理方法...
  8. C++中STL-set的用法
  9. 昇腾 AI 成就了一群玩船模的大学生——创新,有“模”有 Young
  10. 当 Messaging 遇上 Jepsen
  11. HDU2020 绝对值排序【入门】
  12. 一个核函数把低维空间映射到高维空间的例子
  13. Win10喇叭图标出现红叉提示“未安装任何音频输出设备“
  14. 几个简单的小功能,能提高微信群活跃度?
  15. w ndows10更改浏览器,Win10系统默认浏览器怎么修改
  16. Python用最简单的代码画出一箭穿心
  17. 计算某天是某年的第多少天
  18. EXCEL表格-VLOOKUP多对一结果匹配方法(通配符)
  19. mfc opengl 三维地形图_深圳pmax巨影三维扫描仪
  20. 火车头9.2 内容分页采集

热门文章

  1. net自带二进制序列化,XML序列化和ProtoBuf序列化的压缩对比
  2. 选择软路由的七大理由
  3. 电子政务项目风险管理(上)
  4. project设置6天工作制日历
  5. hadoop临时文件 jar包_hadoop之Mapper/reducer源码分析之二
  6. stringwriter_Java StringWriter getBuffer()方法与示例
  7. Java ClassLoader findResources()方法与示例
  8. python常用语法和示例_C语言切换案例教程,语法,示例和规则
  9. springboot公共模块打包_解决SpringBoot多模块发布时99%的问题?
  10. html怎样让列表向下移动,Html无序列表ul控件实现行上下移动.