主页 > imtoken钱包官方网站 > 区块链底层网络技术P2P网络分析

区块链底层网络技术P2P网络分析

imtoken钱包官方网站 2023-05-26 07:53:36

最近很火的区块链技术,大家应该都不陌生了。 然而,很多人只了解区块链技术的一些概念,对其底层的一些技术实现原理可能不是很熟悉。 本文将为您介绍区块链底层使用的通信网络技术以及网络中节点间的通信协议。

区块链底层网络技术采用点对点网络,简称P2P网络。 这是一种分布式网络通信技术,也称为“点对点网络”。 不同于传统的客户端/服务器(C/S)结构,P2P网络中的节点之间没有主从之分区块链作为比特币的底层技术,地位平等,每个节点可以是服务器,也可以是客户端。

P2P网络根据其路由查询结构可分为集中式、纯分布式、混合式和结构化四种类型。 这四种类型也代表了P2P网络技术发展的四个阶段。

其中,比特币采用的是混合起源,而如今大多数公链采用的是结构化类型。 在结构化网络的具体实现中,大多采用DHT(Distributed Hash Table,分布式哈希表)算法的思想。 基于DHT算法思想的具体实现方案包括Chord、Pastry、CAN和Kademlia等算法。 其中,Kademlia算法是以太坊网络使用的算法,我们将在本文中详细介绍。

比特币网络

最早使用区块链技术的是比特币。 正如我们前面提到的,比特币网络的结构是一个混合网络。

比特币网络节点具有四大功能,即:钱包、挖矿、区块链数据库、网络路由。 这四个功能并不是比特币的所有节点都具备的。 不同类型的节点只包含部分功能。 只有比特币核心(Bitcoin Core)节点包含所有这四种功能。

节点的类型根据其所包含的功能而有所不同,但所有节点都会包含路由功能,因为所有节点都必须参与校验和广播(传播交易和区块信息),发现并维护与其他节点的连接。 连接。

区块链作为比特币的底层技术_比特币交易链区块拥堵_哈比特币区块链

此外,一些节点包含一个完整的区块链数据库,其中包含所有交易数据。 这样的节点被称为“全区块链节点”。 全节点可以独立验证所有交易。

也有一些节点只包含部分区块链数据,一般只包含区块头。 此类节点通过“简单支付验证(SPV)”方式完成对交易的验证。 这样的节点被称为“SPV 节点”或“轻量级节点”。

矿工节点通过在特殊设备上运行工作量证明算法(挖矿)相互竞争产生新的区块。

部分矿工节点为全节点,称为“独立矿工(Solo Miner)”,部分矿工节点需要依赖矿池服务器维护的全节点进行挖矿工作,此类矿工称为“矿池矿工”。 (Pool Miner)”,矿池矿工和矿池服务器组成一个矿池(Mining Pool),是一个本地的中心化网络,他们通过特殊的矿池协议进行通信。

目前主流的矿池协议是Stratum协议。 钱包功能一般是帮助用户查询余额、管理公私钥对、发起交易等。 在比特币网络中,除了比特币核心钱包是全节点外,大部分钱包都是轻量级节点。

一个包含各种节点的比特币扩展网络,在不同节点之间运行比特币主网协议、Stratum网络协议等矿池网络协议,如下图所示:

区块链作为比特币的底层技术_哈比特币区块链_比特币交易链区块拥堵

以太网络

作为以区块链为底层技术的新一代平台,以太坊在很多方面与比特币有相似之处。 它的节点也有四个功能:钱包、挖矿、区块链数据库和路由。 也是因为节点包含不同的功能,它们根据功能分为不同的类型,除了主网之外,还有很多扩展网络。 但是,与比特币不同的是它的底层网络结构。 比特币主网的P2P网络是非结构化的,而以太坊使用的P2P网络是结构化的,其P2P网络是通过Kademlia(简称Kad)算法实现的。 Kad算法作为一种DHT(分布式哈希表)技术,可以实现在分布式环境下快速准确地路由和定位数据的功能。 下面重点介绍一下Kad算法的基本内容。

Kad算法作为分布式数据存储和路由发现算法,以其简单、灵活、安全等优点被以太坊作为底层P2P网络的主要算法。 下面我们将通过一个例子来说明Kad算法的主要内容及其运行过程。

问题描述和场景假设

我们假设这样一个场景:有几本书供学生分享,为了公平起见,每人保留几本。 如果你想看其他书,你需要向保留这本书的学生借。 那么问题来了,我们怎样才能找到保存这本书的学生呢? 如果一一询问,效率显然是极低的。 把这个问题放到一个P2P网络中,如果一个节点需要某种资源,它是如何获得这个资源的呢? 如何快速找到存储资源的节点?

节点信息

比特币交易链区块拥堵_哈比特币区块链_区块链作为比特币的底层技术

就像我们对学校里的每个学生都有一个唯一的标识一样,在Kad算法中为每个节点设置了几个属性来唯一标识一个节点,即:节点ID、IP地址、端口号。 在我们的示例中,节点 ID 对应学生 ID,IP 地址和端口号对应学生的联系信息(电话号码或家庭住址)。

每个学生(节点)手头都有以下信息:

· 分配给它的书籍信息(分配给节点的资源信息)。 这里的信息指的是书名的哈希值和书的内容(对于节点资源,理解为资源的索引和资源的内容,以“核心价值”)。

· 一个通讯录,里面存储了若干条记录,每条记录是一本书的书名和存储这本书的学生的学号和联系方式的哈希值(一个路由表,每个路由项存储一个资源的索引以及存储资源的节点信息,在Kad算法中,这个路由表被称为“K-bucket”,后面会详细介绍“K-bucket”)。 值得注意的是,这里每个学生只存储了一部分同学的联系方式(节点的路由表只存储了一部分节点的信息)。

资源存储和查找

那么问题来了,我们应该如何给每个同学分发书籍(给节点分配资源)?

区块链作为比特币的底层技术_哈比特币区块链_比特币交易链区块拥堵

在Kad算法中,它是这样做的:对每一本书的书名进行哈希计算,得到书名的哈希值作为书的索引,然后建立书的索引和节点ID之间的映射。 如果一本书的哈希值是000110,那么这本书会分配给学号为000110的学生。(这需要哈希算法的取值范围和节点ID的取值范围一致。在以太坊中,节点ID为256位二进制。由于以太坊使用的哈希算法为sha-3,结果长度为256位二进制)

那么这里有人会问了,万一某个学生联系不上(节点掉线或者退网),那么他保存的书籍(资源)是不是真的拿不到了? 为了解决这个问题,Kad算法采用的方法是将这本书存放在几个学号最接近000110的学生手中,这样学号为000111、000101的学生也会有这本书(节点中是将相同的资源存储在离目标节点ID最近的节点上)。

当你需要找这本书的时候,只需要对书名进行哈希运算就可以知道你要找哪(几)位同学的联系方式(对于节点中的资源,我们只需要计算资源索引即可知道要查找哪个或哪些节点)。

节点定位

现在我们知道要联系哪些学生来获取书籍,下一个问题是如何找到他们的联系信息。 这里介绍一下Kad算法中的路由表——“K-bucket”。 K-bucket作为路由表,存储了节点的路由信息​​,但它不同于一般的路由表。 在K-Bucket中,节点按照距离进行分类,如图3所示,这里提到节点之间的距离。 我们先来看看kad算法中是如何计算两个节点之间的距离的。

Kad算法中节点间的距离是一个逻辑距离,通过节点ID的异或计算得到。 当目标节点到当前节点的距离在[2(i-1), 2i)以内时,该节点被归类为“K-bucket i”。 例如,节点 ID 为 000111 的节点与节点 ID 为 000110 和 000011 的节点之间的距离计算为:000111 Å 000110 = 000001(十进制 1),000111 Å 000011 = 000100(十进制 4)。 然后根据上面的算法,在节点ID为000111的K-bucket中,节点ID为000110的节点被分配到“K-bucket 1”,节点ID为000011的节点被分配到“K-bucket 3”中.

哈比特币区块链_区块链作为比特币的底层技术_比特币交易链区块拥堵

区块链的底层网络技术P2P网络解析

实际上,这种使用异或来计算距离的方法,相当于将整个网络拓扑结构组织成一棵二叉前缀树,如图4所示。这里所有的节点都分布在二叉前缀树的叶子节点上,这种组织形式相当于根据其节点ID的每一位对节点距离进行分类。

以图中编号为110的节点为例,因为节点000、001、010是第三个(从右往左数)与110不同的节点,所以这三个节点被分配到110的“K-bucket 3”中”区块链作为比特币的底层技术,节点ID为100和101的节点与110不同,因为是第二个(从右往左数),所以这两个节点被分配到110的“K-bucket 2”,最终的节点ID为111的节点与110不同,因为它是第一个(从右往左数),所以被安排在110的“K桶1”中。

回到以太坊,上面提到每个节点ID都是256位长,所以以太坊节点的K-bucket size分配是256行,每行最多可以存储16个节点的路由信息​​。

通过前面的内容,我们已经知道了查找另一个学生联系方式的方法(节点间距离的计算)和每个学生存储的通讯录结构(节点中K-bucket的存储结构)。 那我们就找本书看看Kad算法中是如何找到某个节点的。

学号为000111的学生A想找一本名为《西游记》的书(节点ID为000111的节点想找一个特定的资源),他首先通过计算书名的哈希值得到这本书index(资源索引),经过计算,《西游记》的hash值为001011,则知道这本书在学号为001011的同学B手里。然后,同学A计算距离学生查找自己的通讯录(节点计算目标节点与自身的距离,检查K桶中是否有目标节点),异或计算后:000111 & 001011 = 001100(十进制12),后计算发现距离12位于区间[23, 24),于是A同学到通讯录第4行查找是否有B同学的联系方式:

· 如果是——直接联系B向他借书;

· 如果没有——就找同在4号线的同学C联系他,让C用同样的方法在他的通讯录里查一下有没有B的联系方式。这里这样做是因为C同学的学号第四位(从右往左数)必须和B同学的学号第四位相同,所以按道理C同学和B同学的距离一定大于学生A. 接近。 那么就会出现两种情况: