第10讲 | 深入区块链技术(二):P2P网络

  在上一篇文章中,我大致讲解了一下区块链技术的几个核心要素。P2P网络协议、分布式一致性算法(共识机制)、加密签名算法、账户与存储模型。今天我们就来看看区块链技术的第一个核心要素:P2P网络。

  如果我们简单来看P2P技术,它的应用领域已经非常广泛了,从流媒体到点对点通讯、从文件共享到协同处理,多种领域都有它的身影出现。

  同样的,P2P的网络协议也有很多,比较常见的有BitTorrent、ED2K、Gnutella、Tor等,也就是我们常说的BT工具和电驴。

  比特币、以太坊等众多数字货币都实现了属于自己的P2P网络协议,但是这种模式并不同于以上讨论的P2P网络协议,所以我们今天讨论的重点主要是区块链技术的P2P技术,也就是比特币和以太坊的P2P网络。

  由于区块链的P2P网络技术知识繁多,我们主要提炼其中的四个内容进行讲解:区块链的网络连接与拓扑结构、节点发现、局域网穿透与节点交互协议。

  希望读完本篇可以让你对目前成熟的区块链P2P网络的拓扑结构以及运行原理有个大体的认知。

网络连接与拓扑结构

  1.网络连接

  除去少数支持UDP协议的区块链项目外,绝大部分的区块链项目所使用的底层网络协议依然是TCP/IP协议。

  所以从网络协议的角度来看,区块链其实是基于TCP/IP网络协议的,这与HTTP协议、SMTP协议是处在同一层,也就是应用层。

  在“区块链的常见误区”这篇文章中,我们提到了“区块链是否会颠覆互联网”这一说法,如果要是认真分析的话,它颠覆的层面其实最多只到HTTP协议,不能再多了。

  以HTTP协议为代表的、与服务端的交互模式在区块链上被彻底打破了,变更为完全的点对点拓扑结构,这也是以太坊提出的Web3.0的由来。

  比特币的P2P网络是一个非常复杂的结构,考虑到矿池内部的挖矿交互协议与轻节点。我们仅仅讨论全节点这种场景下的P2P网络发现与路由。

  比特币的P2P网络基于TCP构建,主网默认通信端口为8333。

  以太坊的P2P网络则与比特币不太相同,以太坊P2P网络是一个完全加密的网络,提供UDP和TCP两种连接方式,主网默认TCP通信端口是30303,推荐的UDP发现端口为30301。

  2.拓扑结构

  P2P网络拓扑结构有很多种,有些是中心化拓扑,有些是半中心化拓扑,有些是全分布式拓扑结构。

  比特币全节点组成的网络是一种全分布式的拓扑结构,节点与节点之间的传输过程更接近“泛洪算法”,即:交易从某个节点产生,接着广播到临近节点,临近节点一传十十传百,直至传播到全网。

  

  (比特币全球节点图,图来自网络)

  全节点与SPV简化支付验证客户端之间的交互模式,更接近半中心化的拓扑结构,也就是SPV节点可以随机选择一个全节点进行连接,这个全节点会成为SPV节点的代理,帮助SPV节点广播交易。

节点发现

  节点发现是任何区块链节点接入区块链P2P网络的第一步。这与你孤身一人去陌生地方旅游一样,如果没有地图和导航,那你只能拽附近的人问路,“拽附近的人问路”的这个动作就可以理解成节点发现。

  节点发现可分为初始节点发现,和启动后节点发现。初始节点发现就是说你的全节点是刚下载的,第一次运行,什么节点数据都没有。启动后发现表示正在运行的钱包已经能跟随网络动态维护可用节点。

  1.初始节点发现

  在比特币网络中,初始节点发现一共有两种方式。

  第一种叫做DNS-seed,又称DNS种子节点,DNS就是中心化域名查询服务,比特币的社区维护者会维护一些域名。

  比如seed.bitcoin.sipa.be这个域名就是由比特币的核心开发者Sipa维护的,如果我们通过nslookup会发现大约二十多个A纪录的IPv4主机地址。

  我们通过nc命令尝试连接域名下的某个主机的8333端口会发现连接成功,运行结构如下。

 1 ? [email protected]  ~  nc -nvv 149.202.179.35 8333
 2 found 0 associations
 3 found 1 connections:
 4      1: flags=82<CONNECTED,PREFERRED>
 5  outif en0
 6  src 192.168.1.104 port 62125
 7  dst 149.202.179.35 port 8333
 8  rank info not available
 9  TCP aux info available
10 Connection to 149.202.179.35 port 8333 [tcp/*] succeeded!

  好的,到目前为止我们已经手动做了一遍初始节点发现的工作,这些操作是由比特币的代码完成的。

  第二种方式就是,代码中硬编码( hard-code )了一些地址,这些地址我们称之为种子节点(seed-node),当所有的种子节点全部失效时,全节点会尝试连接这些种子节点。

  用在以太坊中,思路也大致相同,也是在代码中硬编码(hard-code)了一些种子节点做类似的工作。

  2.启动后节点发现

  在Bitcoin 的网络中,一个节点可以将自己维护的对等节点列表(peer list)发送给临近节点,所以在初始节点发现之后,你的节点要做的第一件事情就是向对方要列表:“快把你的节点列表给我复制一份。”

  所以在每次需要发送协议消息的时候,它会花费固定的时间尝试和已存的节点列表中的节点建立链接,如果有任何一个节点在超时之前可以连接上,就不用去DNS seed 获取地址,一般来说,这种可能性很小,尤其是全节点数目非常多的情况下。

  而在以太坊网络中,也会维护类似的一个节点列表(NodeTable),但是这个节点列表与比特币的简单维护不同,它采用了P2P网络协议中一个成熟的算法,叫做Kademlia网络,简称KAD网络。

  它使用了DHT来定位资源,全称Distributed Hash Table,中文名为分布式哈希表。KAD网络会维护一个路由表,用于快速定位目标节点。由于KAD网络基于UDP通信协议,所以以太坊节点的节点发现是基于UDP的,如果找到节点以后,数据交互又会切换到TCP协议上。

  3.黑名单与长连接

  公有区块链面临的网络环境是非常开放的,任何人只要下载好钱包,打开运行就进入了这个P2P网络,这也会带来被攻击的可能。

  所以在比特币的代码中,会有一段去控制逻辑,你可以手动将你认为可疑的节点移除并加入禁止列表,同时去配置可信的节点。当然,以上并不属于客户端的标准协议的一部分,任何人都可以实现属于自己的P2P网络层。

  以太坊上有针对账户进行的黑名单处理,但是这属于业务层。我没有找到很详尽的资料,所以你有兴趣的话,可以自己尝试一下。

  不过总的来说,黑名单我们也可以通过操作系统的防火墙去处理,这并不算一个特别棘手的问题。

局域网穿透

  前面我们说到了区块链的P2P网络结构是一种全分布式的拓扑结构。但是,如今我们的网络环境是由局域网和互联网组成的。也就是说,当你在局域网运行一个区块链节点,在公网是发现不了的,公网上的节点只能被动接受连接,并不能主动发起连接。

  如果这个局域网是你可以控制的,那么很好说,咱们只需要在VPC网络中配置路由,将公网IP和端口映射到局域网中你的IP和端口即可。

  这个条件是非常苛刻的,那么到底有没有一种方案可以自行建立映射呢?答案是:有,就是NAT技术和UPnP协议。

  NAT技术非常常见,这里使用的是源NAT,简而言之就是替换TCP报文中的源地址并映射到内网地址。

  UPnP是通用即插即用(Universal Plug and Play)的缩写,它主要用于设备的智能互联互通,所有在网络上的设备马上就能知道有新设备加入。

  这些设备彼此之间能互相通信,更能直接使用或者控制它,一切都不需要人工设置。有关UPnP的资料比较多,这里就不赘述了,你可以自行搜索相关的信息。

  比特币和以太坊均使用了UPnP协议作为局域网穿透工具,只要局域网中的路由设备支持NAT网关功能、支持UPnP协议,即可将你的区块链节点自动映射到公网上。

节点交互协议

  一旦节点建立连接以后,节点之间的交互是遵循一些特定的命令,这些命令写在消息的头部,消息体写的则是消息内容。

  命令分为两种,一种是请求命令,一种是数据交互命令。

  节点连接完成要做的第一件事情叫做握手操作。这一点在比特币和以太坊上的流程是差不多的,就是相互问候一下,提供一些简要信息。

  比如先交换一下版本号,看看是否兼容。只是以太坊为握手过程提供了对称加密,而比特币没有。

  握手完毕之后,无论交互什么信息,都是需要保持长连接的,在比特币上有PING/PONG这两种类型的消息,这很明显就是用于保持节点之间长连接的心跳而设计的;而在以太坊的设计中,将PING/PONG协议移到了节点发现的过程中。

  请求命令一般分为发起者请求,比如比特币中的 getaddr 命令是为了获取对方的可用节点列表,inv命令则提供了数据传输,消息体中会包含一个数据向量。

  我们说区块链最重要的功能就是同步区块链,而同步区块恰巧是最考验P2P网络能力的。区块同步方式分为两种,第一种叫做HeaderFirst,它提供了区块头先同步,同步完成以后再从其他节点获得区块体。

  第二种叫做BlockFirst,这种区块同步的方式比较简单粗暴,就是从其他节点获取区块必须是完整的。第一种方案提供了较好的交互过程,减轻了网络负担。这两种同步方式会直接体现在节点交互协议上,他们使用的命令逻辑完全不同。

总结

  今天我与你分享了区块链的P2P网络结构与节点交互过程,一般P2P网络技术要解决两个主要问题,第一是资源定位,第二是资源获取,这一篇文章也是主要围绕这两点展开,其中节点发现和局域网穿透是属于资源定位问题,节点交互协议是属于资源获取问题。

  在这一篇文章中,我仅以比特币和以太坊为例进行分享,虽然区块链项目比较多,但是他们要做的事情大多是类似的,比如以太坊是改进版的实现,而比特币使用了简单版实现。

  P2P网络模块作为所有区块链的最底层模块,直接决定了整个区块链网络的稳定性。区块链网络是一个网状分布式的结构,与互联网结构有点相似,那么,亲爱的读者,我们是不是可以设计一个节点爬虫,去爬全网节点呢?你可以给我留言,我们一起讨论。

  感谢你的收听,我们下次再见。

--------文章来自《极客时间》深入浅出区块链专栏

原文地址:https://www.cnblogs.com/sueyyyy/p/9710474.html

时间: 2024-10-12 22:23:08

第10讲 | 深入区块链技术(二):P2P网络的相关文章

第14讲 | 深入区块链技术(六):DPoS共识机制

上一篇文章里,我们讲解了PoS共识机制,这一篇我们来分享PoS的一个扩展机制,这个机制在业界也非常的流行,它叫做DPoS共识机制.DPoS全称是Delegated Proof of Stake,中文翻译过来是代理权益证明. 从BM开始聊起的故事 我们聊DPoS时,为什么要从BM聊起呢, 其实,这和聊比特币绕不开中本聪一样,DPoS是BM一手创造的.DPoS不是独立提出的共识算法,而是直接被BM应用到比特股项目中,在稳定运行了3年多后,又接着被BM构造成可复用的区块链工具箱:石墨烯. 虽然应用得很

第13讲 | 深入区块链技术(五):PoS共识机制

上一篇我们讲到了PoW共识机制,这一篇我们就来分享另外一种共识机制,PoS共识机制. PoS全称是Proof of Stake,中文翻译为权益证明.这一篇我们会将PoS与PoW对比讲解,帮助你加深理解. PoS的由来 PoS最早出现在点点币的创始人Sunny King的白皮书中,它的目的就是为了解决使用PoW挖矿出现大量资源浪费的问题.PoS共识机制一经提出就引起了广泛关注,Sunny King 也基于PoW的基础框架实现了第一代PoS区块链:点点币. PoW的具体实现有很多版本,但它们大多只是

区块链技术公司谈并不是所有手机都叫区块链手机

本文由彭利编辑有问题联系微信2398788267)看手机是否利用了区块链技术要讲清楚该款产品用的是什么共识机制,有多少个节点,是公有链.联盟链还是私有链,这才是关键,什么都没有,则称不上是区块链,那么什么叫做公有链.联盟链还是私有链,公有链注重匿名性与去中心化,联盟链则是开放程度介于公有链和私有链之间的区块链.私有链是完全中心化的区块链,私有链的各个节点的写入权限收归内部控制,读取权限可视需求选择性对外开放,私有链及联盟链注重高效率公有链是完全去中心化的区块链,任何个体或者团体都可以发送区块链交

区块链扫盲:区块链技术初探(二)

?5. 共识机制 区块链是一种去中心化的分布式账本系统,由于点对点网络下存在较高的网络延迟,各个节点所观察到的事务先后顺序不可能完全一致.因此区块链系统需要设计一种机制对在差不多时间内发生的事务的先后顺序进行共识.这种对一个时间窗口内的事务的先后顺序达成共识的算法被称为"共识机制". 5.1区块链和分布式系统容错的相同点 (1) Append only. (2) 强调序列化(时间有序). (3) 少数服从多数原则. (4) 分离覆盖的问题:即长链覆盖短链区块,多节点覆盖少数节点. 5.

第22讲 | 国内区块链项目技术一览

区块链的深入技术篇写到了现在,我们已经一起看过了很多国外区块链项目的技术逻辑.实际上,国内的优质区块链项目其实也不少,并且势头很足,不容小觑. 我在前面的文章中介绍过国内的几个区块链项目,不过仅从发展的角度做了一个简要概述,并没有进行深入探讨,今天我们就重点来看一看这些项目的设计思路与技术特点. 小蚁NEO 1.简介 我们以前讲到过,NEO的前身是小蚁,小蚁最早在2015年发起,它在2017年中正式更名为NEO. NEO项目一共经历过两次ICO,第一次ICO是项目创立,第二次ICO是项目更名后的

龙爱量子区块链技术是互联网经济一次隆重转型和华丽升级

--中国区块链技术专家 殷秀君 各位,我叫殷秀君,因为我信仰区块链,所以给自己取了一个名字,一个网名叫因子,因果的因,有因必有果.现在,我用10分钟解读一下龙爱量子是如何应用区块链的,就这个问题我谈一谈自己的理解. 中国现在的经济事实上远远没有走出某一个境界,而大众创新.万众创业势在必为,但老百姓的生意其实也没有找到真正的出路,那么科技创新所引发的商业创新能不能解决我们的问题呢? 这个过程就是以量子科技为起点的,这属于科技创新一个很好的起点,这个起点由林跃庆董事长带着大家,带着各位家人找到了全世

什么是“区块链”技术

简单谈谈究竟什么是“区块链”技术 今年9月,13家顶级银行,包括汇丰银行.德意志银行等,已经加入了一个由金融技术公司R3领导的组织.R3公司将会利用区块链技术作为框架.宣布加入的13家银行是:花旗银行.美国银行.摩根斯坦利.德国商业银行.法国兴业银行.瑞典北欧斯安银行.纽约梅隆银行.三菱UFJ金融集团.澳大利亚国民银行.加拿大皇家银行和多伦多道明银行.由此总计22家银行加入财团.此前,另外9个银行已经签署了R3的初创协议,这代表着首次,银行之间对于如何利用区块链——支撑比特币的技术——用于金融层

专访京东孙海波:大牛架构师养成记及电商供应链中区块链技术的应用(转)

http://geek.csdn.net/news/detail/237595 编者按:每个人的成长曲线不同,有的人在研究生之时就已有相当知名的产品和框架,从而在接下来的工作中一路顺风顺水,有的人缺需要经历一个又一个的坑才能成长,不管是前者的聪明高效,还是后者的笨鸟先飞,他们都是在迈着脚步不断地向前.不妨,我们停下脚步看下一些同行,以激励自己更好地前行.CSDN与你相约SDCC 2017之区块链技术实战线上峰会. 2017年9月23日,SDCC 2017之区块链技术实战线上峰会即将强势来袭,本次

区块链技术与数据库技术

区块链技术与数据库技术 IBM是最早介入区块链研发的国际大公司之一,例如去年大家熟知的IBM和三星的区块链合作项目以及Linux/IBM联合项目.作为IBM区块链技术中国区的负责人和专利评审委员会的联合主席,我和团队也在去年10月就提交并获得区块链的美国专利.这是中国人获取的第一个区块链国际专利.紧接着12月,我们组织了IBM全球Fintech峰会及内部闭门会议,邀请IBM全球13大研究院在区块链相关领域的院士, DE, VP和CTO齐聚上海进行为期2天的研讨.讨论的结果是公司在今年迅速将区块链