查看原文
其他

Parity:我们为什么选择 Libp2p

Pierre Krieger PolkaWorld 2020-02-20

加入 www.polkaworld.org 社区,共建 Web 3.0!

如果你一直在关注 Polkadot、以太坊 2.0 或 Substrate 的开发,则可能听说过 libp2p。Libp2p 是一个网络框架,它让你可以编写去中心化对等应用程序(peer-to-peer applications)。此协议最初是 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 上播放不同的电影。这时必须对数据进行多路复用以传输到你的家中,并对其进行多路分解以到达正确的设备。


一旦我们有能力做到这一点,我们几乎可以免费使用所需的各种协议打开所需的子流。这些协议包括:


  • 识别,从而可以获取有关节点的信息,包括它正在侦听的多地址,以及它将我们看作的多地址,类似于 STUN 协议所做的。

  • ping,可以对遥控器进行 ping 以确定其是否仍然有效。

  • kademlia,用于对等发现和分布式记录存储。

  • Floodsub 和 gossipsub,这是两个 pub-sub 协议。

  • 还有更多,当然包括你希望创建的任何自定义协议。


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



libp2p 的全球视野


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


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


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


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


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


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


你可以在此处找到 Rust 代码:libp2p / rust-libp2p。


如果你想贡献,可以从查看贡献指南开始:

https://github.com/ipfs/community/blob/master/CONTRIBUTING.md


原文:https://www.parity.io/why-libp2p/

翻译:PolkaWorld 社区


更多内容:


Gavin 的 Kusama 有问必答

总结|关于波卡和 Substrate 的一切

Rust 2020


扫码关注公众号,回复 “1” 加入波卡群

关注 PolkaWorld

发现 Web 3.0 时代新机遇


点个 “在看” 再走吧

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存