首页 > 编程知识 正文

区块链(区块链核心技术:P2P网络)

时间:2023-05-06 03:28:11 阅读:121228 作者:425

P2P技术的应用领域已经非常广泛,从流媒体到点对点通信,从文件共享到协作处理,各个领域都出现了它的身影。 同样,还有很多P2P的网络协议。 常见的有字节、ED2K、Gnutella、Tor等。 也就是常说的BT工具和电驴。

比特币、以太网等很多数字货币实现了自己的P2P网络协议,但这种模式与上面讨论的P2P网络协议不同,因此本文主要介绍区块链技术的P2P网络技术,即比特币

因为区块链的P2P网络技术知识很多,所以主要提取其中的4个内容进行解说。 区块链的网络连接和拓扑、节点发现、局域网透明和节点交互协议。

网络连接和拓扑1 .除了少数支持网络连接UDP协议的区块链项目外,大多数区块链项目所使用的基本网络协议仍然是TCP协议。 因此,从网络协议的角度来看,区块链实际上基于TCP/IP网络协议,它与HTTP协议、SMTP协议位于同一层,即APP应用层。

比特币P2P网络结构非常复杂,考虑的是矿池内部的开采交互协议和写节点。 我们只讨论在全节点这种情况下P2P网络的发现和路由。 比特币的P2P网络基于TCP构建,主网络的默认通信端口为8333以太网的P2P网络与比特币差别不大。 以太网P2P网络是一个完全加密的网络,提供UDP和TCP两种连接方式。 主网络的默认TCP通信端口为30303,推荐的UDP发现端口为30301。

2 .拓扑P2P网络拓扑包括多种类型:中心化拓扑、半中心化拓扑和全分布式拓扑。 由比特币所有节点组成的网络是全分布式拓扑,节点与节点之间的传输过程接近于“泛洪算法”。 也就是说,交易从一个节点发生,接着被广播到相邻节点,从相邻节点10次传播1次,100次传播1次,整个网上。

所有节点和简单性能验证(SPV )客户端之间的交互模型接近半中心拓扑。 也就是说,SPV节点可以随机选择一个所有节点并与其连接,所有节点成为SPV节点的代理,并且帮助SPV节点广播事务。

节点发现是任何区块链节点接入区块链P2P网络的第一步。 这就像一个人去陌生的地方旅行,没有地图和导航,只能拉着附近的人问路。 “拉着附近的人问路”的行为可以理解为节点发现。

节点发现分为初始节点发现和启动后节点发现。 初始节点发现是指你的所有节点刚刚下载,第一次运行,没有任何节点数据。 启动后的节点发现,运行中的wallet可以跟随网络动态维护可用节点。

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

第一个称为DNS-seed,也称为DNS种子节点。 DNS是一个中心域名查询服务,比特币社区维护者维护几个域名。 例如,seed.bitcoin.Sipa.be域名由比特币核心开发者sipa维护。 通过nslookup发现约20个以上a记录的IPv4主机地址。 如果使用nc命令尝试连接到域名下主机上的8333端口,则连接成功,结果如下:

admin @ admin~NC-nvv 149.202.179.358333 found 0关联基础1连接33601: flags=82连接, preferredoutifen0src 192.168.1.104端口62125 dst 149.202.179.35端口8333 rankinfonotavailabletcpauxinfoavailableconnectionection 在代码中硬编码了几个地址,这些地址被称为种子节点(seed-node ),如果所有DNS-seed节点都被禁用,则所有节点都将被称为这些种子节点

2 .启动后,节点在Bitcoin的网络中发现,一个节点可以将自己维护的对等节点列表(peer list )发送给邻居节点,所以发现初始节点后,你节点做的第一件事就是向对方请求列表“请快点复制你的节点列表。 ”

因此,每次需要发送协议消息时,都会定期尝试与节点列表中的节点建立链接。 如果在超时之前存在可以连接的节点,则不需要在DNS seed中获取地址。

以太网也维护类似的“节点列表”(NodeTable ),但与维护比特币不同,它是一个称为Kademlia网络(简称KAD网络)的P2P网络协议使用DHT搜索资源。 全名为分布式哈希表,中文名称为分布式哈希表。

KAD网络维护路由表,以便快速定位目标节点。 因为KAD

网络基于 UDP 通信协议,所以以太坊节点的节点发现是基于 UDP 的,如果找到节点以后,数据交互又会切换到 TCP 协议上。

3. 黑名单

公有区块链面临的网络环境是非常开放的,任何人只要下载好钱包,打开运行就进入了这个 P2P 网络,这也会带来被攻击的可能。所以在比特币的代码中,你可以手动将你认为可疑的节点加入黑名单,同时去配置可信的节点。

局域网穿透

前面我们说到了区块链的 P2P 网络结构是一种全分布式的拓扑结构。但是,如今我们的网络环境是由局域网和互联网组成的。也就是说,拼搏的小馒头在局域网运行一个区块链节点,在公网是发现不了的,公网上的节点只能被动接受连接,并不能主动发起连接。如果这个局域网是你可以控制的,那么只需要在 VPC 网络中配置路由,将公网 IP 和端口映射到局域网中你的 IP 和端口即可。

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

NAT 技术非常常见,这里使用的是源 NAT,简而言之就是替换 TCP 报文中的源地址并映射到内网地址。UPnP 是通用即插即用(Universal Plug and Play)的缩写,它主要用于设备的智能互联互通,所有在网络上的设备马上就能知道有新设备加入。

这些设备彼此之间能互相通信,更能直接使用或者控制它,一切都不需要人工设置。比特币和以太坊均使用了 UPnP 协议作为局域网穿透工具,只要局域网中的路由设备支持 NAT 网关功能、支持 UPnP 协议,即可将你的区块链节点自动映射到公网上。

节点交互协议

一旦节点建立连接以后,节点之间的交互是遵循一些特定的命令,这些命令写在消息的头部,消息体写的则是消息内容。命令分为两种,一种是请求命令,一种是数据交互命令。节点连接完成要做的第一件事情叫做握手操作。这一点在比特币和以太坊上的流程是差不多的,就是相互问候一下,提供一些简要信息。比如先交换一下版本号,看看是否兼容。只是以太坊为握手过程提供了对称加密,而比特币没有。

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

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

我们说区块链最重要的功能就是同步区块链,而同步区块恰巧是最考验 P2P 网络能力的。区块同步方式分为两种,第一种叫做 HeaderFirst,它提供了区块头先同步,同步完成以后再从其他节点获得区块体。第二种叫做 BlockFirst,这种区块同步的方式比较简单粗暴,就是从其他节点获取区块必须是完整的。第一种方案提供了较好的交互过程,减轻了网络负担。这两种同步方式会直接体现在节点交互协议上,他们使用的命令逻辑完全不同。

总结

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

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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。