Libp2p是未来的WEB协议

[复制链接]
10139 |0
发表于 2019-3-3 17:13:00 | 显示全部楼层 |阅读模式


来源:头等仓
作者:阿俊

如果您一直关注Polkadot,Ethereum 2.0或Substrate的开发进展,您可能听说过libp2p。Libp2p是一个网络框架,允许用户编写分散的对等应用程序。最初是IPFS的网络协议,但现在已成为一流项目。
作为Polkadot开发过程的一部分,我们创建了用Rust编写的libp2p实现,目的是在Polkadot和Substrate中使用它。 虽然还不完全成熟,但它已经非常强大并且成功地为当前的测试网提供功能。

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




目标

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

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

如果您的所有设备都是客户端,那么工作就是正常的,但是当外部世界的请求出现在您的路由器上时呢?它不是对请求的响应,而是请求本身,因此请求者认为您是服务器。您的一台设备充当服务器,但您的路由器却不知道哪一台。这是一个称为NAT遍历的问题,libp2p提供了帮助处理它的工具。

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

许多Web协议都停留在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意味着我们应该在UDP端口1567之上使用带有IPv6地址的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 testnet使用的协议命名为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正在快速发展。

谢谢阅读。

d2b1fmypxxd.png

d2b1fmypxxd.png
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

热门版块
快速回复 返回顶部 返回列表