主页 > imtoken冷钱包安全吗 > 9.4 迅雷链P2P

9.4 迅雷链P2P

imtoken冷钱包安全吗 2023-08-17 05:12:59

目前的区块链技术模型主要由自下而上的数据层、网络层、共识层、激励层、合约层和应用层组成。 网络层主要包括P2P联网机制、数据传播和数据验证机制等。 迅雷作为以P2P下载起家的公司,将迅雷P2P协议应用到迅雷链上,可以说是赋予了迅雷链得天独厚的优势。 下面主要介绍迅雷链的P2P网络是如何组成的,并介绍比特币和以太坊的P2P网络。

9.1 P2P 网络模型

P2P网络不同于传统的客户端/服务器(client/server)结构。 P2P网络中的每个节点既可以是客户端也可以是服务器,因此不适合使用HTTP协议进行节点间的通信。 直接使用Socket进行网络编程,协议使用TCP或UDP协议。

P2P主要有四种不同的网络模型,也代表了P2P技术的四个发展阶段——集中式、纯分布式、混合式和结构化模型。

集中

即有一个中心节点存储所有其他节点的索引信息,索引信息一般包括节点IP地址、端口、节点资源等。 集中式路由的优点是结构简单,易于实现。 但缺点也很明显。 由于中心节点需要存储所有节点的路由信息​​,当节点规模扩大时,容易出现性能瓶颈,同时也存在单点故障问题。

enter image description here

图 9-1 集中模型

纯分布式

去除中心节点,在P2P节点之间建立随机网络,即新加入的节点与P2P网络中的某个节点随机建立连接通道,从而形成随机拓扑。 新节点加入网络的方式有很多种。 最简单的就是随机选择一个已经存在的节点建立邻居关系。 新节点与邻居节点建立连接后,需要向全网广播,让全网知道该节点的存在。 全网广播方式是节点先向邻居节点广播,邻居节点收到广播报文后,继续向自己的邻居节点广播,以此类推,广播到全网。 这种广播方法也称为泛洪机制。 纯分布式结构不存在集中式结构的单点性能瓶颈和单点故障问题,具有良好的扩展性,但是泛洪机制引入了新的问题。 第一,容易形成泛洪循环,比如节点A发送的消息从节点B发送到节点C,然后节点C广播给节点A,这样就形成了循环; 另一个棘手的问题是响应消息风暴问题。 如果节点A要请求的资源被很多节点拥有,那么在短时间内,大量的节点会同时向节点A发送响应消息,这可能会使节点A瞬间瘫痪。

enter image description here

图 9-2 纯分布式模型

混合型

混合型实际上是集中式和分布式结构的混合体。 网络中有多个超级节点组成分布式网络,每个超级节点有多个普通节点与其组成局部中心化网络。 当一个新的普通节点加入时,首先选择一个超级节点进行通信,超级节点再向新加入的节点推送其他超级节点的列表,由加入的节点根据具体情况决定选择哪个超级节点作为父节点。到列表中超级节点的状态。 这种结构的泛洪广播只发生在超级节点之间,可以避免大规模泛洪的问题。

enter image description here

图 9-3 混合模型

结构化P2P网络

它也是一种分布式网络结构,但又不同于纯分布式结构。 纯分布式网络是随机网络,而结构化网络是将所有的节点按照一定的结构有序组织起来,比如组成环形网络或者树形网络。 结构化网络的具体实现一般基于DHT(Distributed Hash Table,分布式哈希表)算法思想。

9.2 比特币 P2P

比特币网络是一个纯粹的分布式 P2P 网络。 当节点第一次启动时,程序不知道整个网络中任何活跃节点的IP地址。 为了发现这些 IP 地址,程序会请求一个或多个 DNS 地址(也称为 DNS 种子或种子节点),这些 DNS 地址被硬编码到 Bitcoin Core 中,这些域名由比特币社区维护者维护。 比特币程序通过向远程节点发送版本信息来表明它已经成功连接到一个节点。 该消息将包含节点、区块和当前时间的版本信息。 远程节点会返回自己的版本信息,然后两个节点都会互相发送verack信息,表示连接已经建立。 一旦连接建立,该节点将向远程节点发送getaddr和addr消息,以收集比特币网络上更多的节点信息,并继续与这些节点建立P2P连接。 默认情况下,一个节点会连接8个Other节点(chain out),最多允许125个chain-in节点连接进来,对于连接成功的节点,这些节点信息(ip\port等)会保存到本地数据库。

enter image description here

图 9-4 部分比特币源代码

上图中部分比特币源码,其中seed.bitcoin.sipa.be、dnsseed.bluematt.me等为DNS种子节点地址。

9.3 以太坊 P2P

以太坊网络是一个结构化的 P2P 网络。 以太坊的P2P网络主要由两部分组成:连接节点进行数据传输的TCP网络和节点间广播进行节点发现的UDP网络。

9.3.1 UDP网络

以太坊中的每个节点都维护着一张路由表。 该表由称为 K 个桶的数据构成。 K个桶相当于内存数据,记录节点NodeId、距离、ip:port等信息。 以太坊 K 桶根据与目标节点的距离进行排序。 总共有256K个桶,每个K桶包含16个节点。 节点启动时,会先生成一个随机ID,然后使用Kademlia算法从K桶中的已知节点中找到最接近随机ID的16个节点信息(ip:port等)。 对于第一个启动节点,由于K桶中没有节点信息,需要将硬编码的种子节点添加到K桶中,使用Kademlia算法从中找到距离随机ID最近的16个节点种子节点。 搜索成功后,将成功获取的节点保存在DB和K桶中,并且这些节点必须是可ping通的(节点可以通过发送UDP ping包来检测是否可以正常连接到目的地),这样节点下次重启后,会先将DB中存储的历史节点添加到K桶中,将最多30个历史节点信息添加到K桶中,并将种子节点添加到K桶中,将这些节点添加到K桶中在K桶中发送相关信息的目的是更新本节点的K桶数据,同时让对端节点记录本节点的节点信息。 以太坊中每个节点的K-bucket会每小时定时更新,udp通信失败过多的节点会及时从K-bucket和DB(数据库)中删除。

关于 Kademlia 算法

Kademlia 使用一个称为 K buckets 的概念来存储其他(相邻)节点的状态信息。 对于一个 160 位的节点 ID,有 16 万个桶。 对于每个K个bucket i,它会在[2^(i-1), 2^(i)]区间内存储到自己的距离,每个K个bucket存储k个其他节点的信息。 在以太坊的实现中,k 的值为 16。

表9-1 每个K桶存储的信息 K桶存储的距离范围 K桶存储的距离范围

1个

[2^0,2^1)]

1个

2个

[2^1,2^2)]

2-3

3个

[2^2,2^3)]

4-7

一世

[2^(i-1),2^i)]

/

Kademlia算法需要解决的是如何根据目标ID找到目标地址或者找到距离ID最近的目标节点地址。 在对等网络中,当一个节点想要查询其他节点的信息时,只能依赖两条信息:目标节点ID和当前节点维护的路由表。 其查询的核心思想是:逐级迭代,渐进式搜索。 基本流程如下:

enter image description here

图9-5摘自原论文,基本描述了查询过程 9.3.2 TCP网络

以太坊中的每个节点在启动时,都会尝试通过UPNP或者NAT-PMP的方式将本地的内网地址和端口映射到外网地址和端口,并通过TCP监听映射后的外网地址和端口。 以太坊中的每个节点将作为 TCP 客户端主动连接最多 13 个节点。 13个节点有的是通过读取配置文件得到的静态节点(比如种子节点),有的是K桶中随机选择的节点。 以太坊保证本地节点和每个终端节点之间最多只能建立一个连接。 例如,节点A作为客户端连接到B后,B不会再作为客户端与A建立连接。 TCP连接建立后,本节点会与对端节点协商获得一个公钥。 获取密钥成功后,会向对端发送握手请求,请求交换本端和对端的信息。 这些信息主要包括本地ID、协议版本等,通过协议版本与接收到的ID信息进行匹配来确认是否继续。 与对等方保持 TCP 连接。 以上操作完成后,本端向对端发送数据时,必须用之前得到的对称密钥进行加密,而对端发送给本端的数据也需要用对称密钥进行解密.

9.4 迅雷链P2P

ThunderChain 网络也是一个结构化的 P2P 网络。 该网络由多个种子节点和优客云节点组成。 种子节点和优客云节点共同负责记账和出块。 种子节点主要由性能和存储空间较好的服务器组成,由迅雷和迅雷联盟链相关公司共同维护。 ThunderChain万科云节点是在全网所有万科云设备中选出的网络最好、存储空间最大的节点。 Oneke Cloud节点与种子节点之间的连接主要通过TCP协议建立,Oneke Cloud与Oneke Cloud之间的网络连接主要通过UPNP和P2P穿透协议实现。 UPNP映射成功的节点,连接方式为TCP连接; P2P穿透成功的节点,连接方式为UDP+TCP连接。 目前,P2P的连接渗透率约为96%。 针对P2P穿透成功的UDP连接,迅雷实现了一套基于UDP协议的可靠传输,网络传输包支持模糊协议。

迅雷链网络中的每个记账节点也会记录一个路由表。 节点首次启动时,需要连接到硬编码的种子节点,并将该节点的相关信息传递给种子节点,并从种子节点获取其他优客云节点的信息通过 Kademlia 算法的网络。 然后尝试通过迅雷P2P协议连接这些节点,并将连接成功的节点信息保存在本地路由表和DB中。 对于心跳超时或接收消息失败次数超过一定次数的节点,会及时从路由表和DB中删除。 节点下次重启时,会从DB中随机选择几个记账节点尝试建立连接,并定时刷新本地路由表。 当该节点成功连接到网络中的其他节点时,它会比较该节点与网络中其他节点的区块高度是否相同。 如果相同,则进入共识区块生成阶段。 如果它们不同,将随机选择具有相关区块高度的节点进行快速同步。 ,直到同步高度与所有网络节点间的最大区块高度相同,则进入共识出块阶段。 当节点通过共识算法检测到恶意节点时,会与恶意节点断开连接比特币9.4,并从路由表和DB中删除该节点的信息,并向其他节点询问该节点是否为恶意节点。 如果2/ 3 共识,则对恶意节点进行惩罚,下次启动时不接受恶意节点的请求连接。

enter image description here

图 9-6 ThunderChain 节点发现的主要流程

如图9-6所示,迅雷链在节点1和节点3之间添加P2PServer,P2PServer主要用于处理节点1和节点3之间P2P消息的转发,从而达到节点1和节点之间P2P穿透的目的3、其中P2PServer服务可以部署在公网服务器上,也可以部署在链上全网所有节点上。

因此比特币9.4,与比特币和以太坊网络相比,ThunderChain网络节点采用种子节点和Oneke Cloud节点的组合,并且对于Oneke Cloud节点之间的连接,增加了P2P渗透协议,从而增加了Oneke Cloud节点的数量. 节点间的连接率间接降低了种子节点的连接压力,避免了种子节点的过度中心化。 而且对于网络中的恶意节点,可以通过共识算法及时发现并做出相应的惩罚,保证下次不再接受恶意节点的网络数据包,从而保证正常节点的网络安全。