区块链范畴,链神探很专心P2P网络
假如咱们简略来看 P2P 技能,它的应用范畴现已十分广泛了,从流媒体到点对点通讯、从文件同享到协同处理,多种范畴都有它的身影呈现。
相同的,P2P 的网络协议也有许多,比较常见的有 BitTorrent、ED2K、Gnutella、Tor 等,也就是咱们常说的 BT 东西和电驴。
比特币、以太坊等很多数字钱银都完结了归于自己的 P2P 网络协议,可是这种形式并不同于以上评论的 P2P 网络协议,所以咱们今日评论的要点首要是区块链技能的 P2P 技能,也就是比特币和以太坊的 P2P 网络。
除掉少量支撑 UDP 协议的区块链项目外,绝大部分的区块链项目所运用的底层网络协议依然是 TCP/IP 协议。
所以从网络协议的视点来看,区块链其实是根据 TCP/IP 网络协议的,这与 HTTP 协议、SMTP 协议是处在同一层,也就是应用层。
在“区块链的常见误区”这篇文章中,咱们提到了“区块链是否会推翻互联网”这一说法,假如要是仔细剖析的话,它推翻的层面其实最多只到 HTTP 协议,不能再多了。
以 HTTP 协议为代表的、与效劳端的交互形式在区块链上被彻底打破了,变更为彻底的点对点拓扑结构,这也是以太坊提出的 Web3.0 的由来。
比特币的 P2P 网络是一个十分复杂的结构,考虑到矿池内部的挖矿交互协议与轻节点。咱们仅仅评论全节点这种场景下的 P2P 网络发现与路由。
比特币的 P2P 网络根据 TCP 构建,主网默许通讯端口为 8333。
以太坊的 P2P 网络则与比特币不太相同,以太坊 P2P 网络是一个彻底加密的网络,供给 UDP 和 TCP 两种衔接方法,主网默许 TCP 通讯端口是 30303,引荐的 UDP 发现端口为 30301。
P2P 网络拓扑结构有许多种,有些是中心化拓扑,有些是半中心化拓扑,有些是全分布式拓扑结构。
比特币全节点组成的网络是一种全分布式的拓扑结构,节点与节点之间的传输进程更挨近“泛洪算法”,即:买卖从某个节点发生,接着播送到挨近节点,挨近节点一传十十传百,直至传播到全网。
全节点与 SPV 简化付出验证客户端之间的交互形式,更挨近半中心化的拓扑结构,也就是 SPV 节点能够随机挑选一个全节点进行衔接,这个全节点会成为 SPV 节点的署理,协助 SPV 节点播送买卖。
节点发现是任何区块链节点接入区块链 P2P 网络的第一步。 这与你孤身一人去生疏当地旅行相同,假如没有地图和导航,那你只能拽邻近的人问路,“拽邻近的人问路”的这个动作就能够了解成节点发现。
节点发现可分为初始节点发现,和发动后节点发现。初始节点发现就是说你的全节点是刚下载的,第一次运转,什么节点数据都没有。发动后发现表明正在运转的钱包现已能跟从网络动态保护可用节点。
在比特币网络中,初始节点发现一共有两种方法。
第一种叫做 DNS-seed,又称 DNS 种子节点,DNS 就是中心化域名查询效劳,比特币的社区保护者会保护一些域名。
比方 seed.bitcoin.sipa.be 这个域名就是由比特币的中心开发者 Sipa 保护的,假如咱们经过 nslookup 会发现大约二十多个 A 纪录的 IPv4 主机地址。
咱们经过 nc 指令测验衔接域名下的某个主机的 8333 端口会发现衔接成功,运转结构如下。
第二种方法就是,代码中硬编码( hard-code )了一些地址,这些地址咱们称之为种子节点(seed-node),当一切的种子节点悉数失效时,全节点会测验衔接这些种子节点。
用在以太坊中,思路也大致相同,也是在代码中硬编码(hard-code)了一些种子节点做相似的作业。
在 Bitcoin 的网络中,一个节点能够将自己保护的对等节点列表 (peer list) 发送给挨近节点,所以在初始节点发现之后,你的节点要做的第一件工作就是向对方要列表:“快把你的节点列表给我仿制一份。”
所以在每次需求发送协议音讯的时分,它会花费固定的时刻测验和已存的节点列表中的节点树立链接,假如有任何一个节点在超时之前能够衔接上,就不用去 DNS seed 获取地址,一般来说,这种可能性很小,尤其是全节点数目十分多的情况下。
而在以太坊网络中,也会保护相似的一个节点列表 (NodeTable),可是这个节点列表与比特币的简略保护不同,它采用了 P2P 网络协议中一个老练的算法,叫做 Kademlia 网络,简称 KAD 网络。
它运用了 DHT 来定位资源,全称 Distributed Hash Table,中文名为分布式哈希表。KAD 网络会保护一个路由表,用于快速定位方针节点。因为 KAD 网络根据 UDP 通讯协议,所以以太坊节点的节点发现是根据 UDP 的,假如找到节点今后,数据交互又会切换到 TCP 协议上。
公有区块链面对的网络环境是十分敞开的,任何人只需下载好钱包,翻开运转就进入了这个 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,这种区块同步的方法比较简略粗犷,就是从其他节点获取区块有必要是完好的。第一种计划供给了较好的交互进程,减轻了网络担负。这两种同步方法会直接体现在节点交互协议上,他们运用的指令逻辑彻底不同。