引介 | 为什么 ETH2.0 要选择 libp2p ?

Ajian   |     |   2266 次阅读

如果你有持续关注 PolkadotEthereum 2.0Substrate 的开发近况,你应该听说过 libp2p 。Libp2p 是一个便于使用者开发去中心化点对点应用的网络框架,它原先是 IPFS 的网络协议延申,如今已自成一家。

愿景

所有的分布式点对点网络,都会面临一系列不同于传统网络的挑战。Libp2p 是个通用工具包,有了它,开发者就可以在分布式应用上使用可插拔的网络。

与传统网络最大的不同在于,分布式计算不适用“ 客户端/服务器 ”这种模式。典型的 客户端/服务器 ”是:在你的家用网络中,每台设备都有个私有 IP ;当你向服务器请求数据时,路由器会用家里的公用 IP 替换掉设备的私有 IP ,同时记下应该向哪一台设备返回数据。

假设你的设备都扮演客户端的角色,那一切正常;但如果今天你的路由器收到来自外部世界的请求,又该如何?这条请求信息不是你发出请求的响应——它本身就是请求,而且请求发送方认为你就是台服务器。当你的其中一台设备开始扮演服务器的角色时,路由器却懵了。它搞不清楚究竟是哪一台设备在扮演服务器——这就是 NAT 穿透问题,而 libp2p 工具能够帮助我们解决。

为了因应在客户端也需要充当节点(服务器)的场景,节点间不可避免地需要与许多硬件、操作系统及通讯协议发生交互,Libp2p 也负责处理对等网络通信及握手协议。加密和安全性是 WEB3 设计的基础,libp2p 支持非加密传输协议( e.g. TCP、UDP)及加密传输协议( e.g. TLS、 Noise )

许多网络协议的发展在 90 年代停滞不前,而后面对许多安全漏洞的出现,产生了越来越多的补丁包。这也是 libp2p 为什么要模块化的原因,你可以在 libp2p 上更新任何你想添加的东西,同时保证后向兼容性。

模块化

Libp2p 从一开始就设计得非常模块化,因此能够部署在不同的点对点网络上。我们通常会以一组 IP 地址及通信端口来描述传统的点对点应用,但 libp2p 使用多重地址的概念。举例来说:

  • /ip4/90.46.231.22/udp/25000 —— 节点 IP 地址是 90.46.231.22 ,且在 25000 端口上监听 UDP 协议。

  • */ip6/fe80::0202:b3ff:fe1e:8329/udp/1567/*quic —— 应该在 UDP 端口 1567 上使用 QUIC 协议传输信息。

  • /dnsaddr/example.com/tcp/80/ws —— 在 TCP 端口 80 上使用 WebSocket 协议,同时以 DNS 服务器解析域名 example.com

事实上,使用多重地址的想法就是为了让 libp2p 能够扩展新的协议(就像上面那个使用 QUIC 的例子一样),因此使用 libp2p 的项目不要求支持所有协议。后续我们希望,比如,将蓝牙通讯加到传输协议中。

Libp2p 模块化的第二个原因主要是针对协议协商过程。一旦两个节点建立通信, libp2p 就只需处理用于连接的协议了。

虽然 libp2p 鼓励节点支持一组通用的协议,但就技术角度出发,这不是必须的。模块化能让 libp2p 工具面对新的协议、想法,及部署新的协议版本时,轻松地支援旧的版本,不需要增加技术负债。

主要的 libp2p 协议

虽然 libp2p 没有强制要求节点需要支持哪些协议,但仍然鼓励节点兼容常用的几种,包括:

  • secio —— 负责加密通讯。

  • mplexyamux —— 在 secio 之上的负责多路径复用的协议。

多路径复用是将多个独立数据流聚合在单个连接通道的过程。就像你熟悉的,你的公寓可能只有一条同轴电缆或光纤电缆,但能够满足你和室友想在 Netflix 看不同电影的需求。数据以多路径复用的方式传进你家,并经过反向编译传递给正确的设备。

一旦我们有能力做到这些事,只要我们想要,就能几乎无限地创建子数据流,并使用许多不同种类的协议。这些协议包括:

  • identify —— 获得节点信息:包含节点所监听的多路径,及节点识别我们的多路径信息;这与 STUN 协议 所做的事类似。

  • ping —— ping 远端服务,确保服务仍在响应。

  • kademlia —— 发现节点及分布式记录存储。

  • floodsubgossipsub —— 两种消息发布/订阅协议。

  • 当然, 也包含用户想要自定义的协议。

在 Substrate 工具中,每个项目都能自定义网络协议。 举例来说,BBQ Birch 测试网使用的协议称为 bbq ,而 Polkadot 使用的协议称为 dot

Libp2p 的全球布局

推荐使用 libp2p 的另一个原因是它被去中心化项目所采用。Libp2p 在 IPFS 早期时就提供支持,并且将继续支持多个新兴项目,如 Filecoin 、以太坊 2.0 (可能)、 Agoric,当然还有 Substrate 和 Polkadot 。多个项目共用同个网络协议的优势在于:节点性能能够在多个网络中共享。让我们接着看 relay 协议的例子。

在去中心化场景下,我们总是希望节点能够直接与其他节点进行通信。然而实际上,许多节点是无法访问的,因为它们可能存在 NAT 穿透问题,或使用的平台不允许外部访问。

为了解决这个问题, libp2p 提供了一种名为 relay 的协议,允许节点充当另外两个节点的 proxy 代理。所有的通信都经过加密,并且经过远程身份认证,所以代理服务不会遭遇中间人攻击( man-in-the-middle )。

因为越来越多的项目使用 libp2p 作为他们的网络协议,所以他们都能受惠于 relay 节点,进而达到资源共享。

在过去,当公司在推出一款应用时,只需要关注应用的体验和逻辑——而不需要重新发明 TCP/IP 协议。Libp2p 设计的初衷就是为了支持未来的去中心化网络协议,它的宗旨是让开发者进行应用程序开发时,能确保他们的服务是可达且可用的。Libp2p 在 Rust 、JavaScript 和 Go 语言上完成实现,在 Java, Haskell 和 Python 上的开发也正快速地推进中!

在此查看 Rust code : libp2p/rust-libp2p

如果你愿意尽一份心力,请查阅贡献指南


原文链接: https://medium.com/paritytech/why-libp2p-13085ed0c9c8
作者: tomaka
翻译&校对: IAN LIU & 阿剑


你可能还会喜欢:

Devcon 4 | Serenity 中的 P2P 网络

 
0 人喜欢