如果您一直在关注Polkadot,Ethereum 2.0或Substrate的开发,则可能听说过libp2p。Libp2p是一个网络框架,使您可以编写分散的对等应用程序。最初是IPFS的网络协议,此后已被提取成为自己的一流项目。

作为Polkadot开发过程的一部分,我们创建了自己的用Rust编写的libp2p实现,目的是在Polkadot和Substrate中使用它。尽管还不完全成熟,但它已经相当强大并且可以成功地驱动当前的测试网。

那么libp2p是什么,为什么我们选择它作为Polkadot和Substrate的网络层

目标

所有分布式对等网络都面临着一系列不同于传统网络的挑战。Libp2p是一个通用工具包,因此开发人员可以在其分布式应用程序中使用即插即用网络。

分布式计算的根本转变是“客户端/服务器”范式不再成立。让我们看一下家用路由器的功能。家庭网络中的每个设备都有一个专用IP地址。当您从服务器请求数据时,路由器会将设备的专用地址替换为家庭的公共IP地址,并记住将响应发送到哪个设备。

如果您所有的设备都是客户端,那会很好,但是当路由器发出外部请求时该怎么办它不是对请求的响应,而是请求,因此请求者认为您是服务器。您的一台设备充当服务器,但是路由器不知道哪台设备。这是一个称为NAT遍历的问题,并且libp2p提供了有助于处理它的工具。

Libp2p还处理对等点发现和握手协议。在客户端也充当服务器的世界中,节点之间不可避免地会有各种硬件,操作系统和通信协议。加密和安全性是Web3设计的基础,而libp2p既支持未加密的协议(例如TCP,UDP)又支持加密的协议(例如TLS,Noise)。

许多网络协议都停留在90年代,随着安全漏洞的突破,越来越多的补丁被添加进来。这就是libp2p模块化的地方。Libp2p的设计使您可以升级所需的任何元素,同时保持向后兼容。

模块化

Libp2p从一开始就被设计为非常模块化的,因此可以在许多不同的对等项目中实施。而在传统的对等网络的应用程序节点由一个IP地址和端口组合称为,libp2p使用的概念多地址代替。一些例子:

/ip4/90.46.231.22/udp/25000表示IP地址为90.46.231.22且正在UDP端口25000上侦听的节点。 / ip6 / fe80 :: 0202:b3ff:fe1e:8329 / udp / 1567 /quic表示我们应该在具有IPv6地址的UDP端口1567上使用QUIC协议。 /dnsaddr/example.com/tcp/80/ws意味着我们应该在TCP端口80上使用WebSocket协议,并使用DNS解析主机名example.com。

并非所有使用libp2p的项目都需要支持所有协议。实际上,存在多地址的概念是为了使使用新协议扩展libp2p成为可能(例如,过去使用QUIC进行的扩展)。例如,将来我们可能会添加蓝牙作为传输协议。

libp2p模块化的第二个主要方面是其协议协商过程。一旦建立了两个对等方之间的连接,libp2p唯一要处理的就是协商在该连接上使用的协议。

尽管鼓励节点支持一组特定的通用协议,但从技术上讲,它们都不是强制性的。这样就可以轻松地尝试新协议或新想法,并在不增加技术负担的情况下仍支持旧版本的同时部署新版本的协议。

主要的libp2p协议

尽管没有强制性协议,但实际上鼓励节点支持最普遍支持的协议。这包括:

secio,负责加密通信。 mplex或yamux,是secio之上负责多路复用的协议。

复用是将多个单独的数据流组合到一个连接中的过程。例如,您可能有一根同轴电缆或光纤电缆进入您的公寓,但是您和您的室友都想在Netflix上播放不同的电影。必须对数据进行多路复用以传输到您的家中,并对其进行多路分解以到达正确的设备。

一旦我们有能力做到这一点,我们就可以免费使用几乎任意数量的协议打开任意数量的子流。这些协议包括:

确定,这使得它能够获得约一个节点,包括它监听的multiaddresses和它看到我们的多地址,类似于信息STUN协议一样。 ping,它使能够对遥控器执行ping以确定其是否仍在运行。 kademlia,用于对等发现和分布式记录存储。 Floodsub和gossipsub,这是两个发布订阅协议。 还有更多,当然包括希望创建的任何自定义协议。

在Substrate的上下文中,每个项目都可以定义自己的网络协议。例如,BBQ Birch测试网使用的协议名为bbq,而Polkadot使用的协议称为dot。

libp2p的全球视野

使用libp2p的另一个原因是它参与了分散项目。它从一开始就为IPFS提供支持,并将为多个新兴项目提供支持,例如Filecoin,可能是Ethereum 2.0,Agoric,当然还有Substrate和Polkadot。

具有多个项目共享相同的网络协议具有很大的优势:它使节点可以跨多个网络共享其功能。举个例子,让我们以中继协议为例。

在分散的环境中,您通常希望节点直接相互连接。但是,实际上,许多节点是不可访问的,因为它们位于NAT之后或使用不允许传入连接的平台。

为了解决此问题,libp2p提供了一个名为Relay的协议,该协议允许一个节点充当其他两个节点之间的代理。所有通信都经过加密,并且验证了远程服务器的身份,因此代理不能充当中间人。

通过让多个项目将libp2p用作其网络堆栈,它们都将能够从相同的中继节点中受益,从而共享资源。

Libp2p已被设计为支持未来分散化的网络协议。当公司启动传统应用程序时,他们只关注应用程序的经验和逻辑-他们不需要重新发明TCP / IP。那是libp2p的最终目标:允许应用程序开发人员在知道自己的服务可以访问和可用的情况下开发应用程序。随着Rust,JavaScript和Go的实现以及Java,Haskell和Python的开发,libp2p迅速发展。