为什么 ETH2.0 要选择 libp2p ?

如果你有持续关注 Polkadot 、 Ethereum 2.0 或 Substrate 的开发近况,你应该听说过 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 —— 负责加密通讯。

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

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

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

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

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

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

  • floodsub 和 gossipsub —— 两种消息发布/订阅协议。

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

在 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

猜你喜欢

转载自blog.csdn.net/shangsongwww/article/details/89428696