若您对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上播放不同的电影。必须对数据进行多路复用以传输到您的家中,并对其进行多路分解以到达正确的设备。一旦我们有能力做到这一点,我们就可以免费使用几乎任意数量的协议打开任意数量的子流。这些协议包括:
- determinism,使我们能够获得一个节点,包括它监听的multiaddresses和它看到我们的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迅速发展。
标签: 数字货币