ETH2.0 Serenity中网络的详细介绍

ETH2.0 Serenity中网络的详细介绍

以太坊第四阶段Serenity中网络的概述

特别感谢Hsaio-Wei Wang、Kevin Mai-Hsuan Chia、John Adler的编辑和有价值的反馈。

在分片区块链中网络是一个难题,我们如何把分片区块链设计和构建成可扩展的安全点对点网络?截至本文撰写之时,尚未有分片区块链系统部署在生产中,因此,我们在如何设计此类P2P网络方面没有先例。这是目前以太坊2.0面临的一个设计问题。这篇文章的目的是让你加速在ETH2.0 P2P层上进行的研究,也许,可以开始为ethereum 2.0的这部分研究做出贡献。在本文中,我假设您熟悉当前的ETH2.0规范

ETH2.0网络需求

在深入研究当前正在考虑的想法和协议之前,我们首先需要了解serenity的p2p网络的需求是什么。

  • 一,网络中的节点需要能够轻松地同时订阅多个分片。这包括由信标链随机分配给分片的验证人节点,以及非验证节点,即不参与共识协议的节点,它们连接到不同的分片以满足其特定需求。
  • 二,网络中的节点需要能够在分片之间低延迟的跳转。由于验证器是随机分配给分片的,所以它们需要尽可能高效的在分片之间切换是很重要的。因此,节点需要能够尽快找到并连接到其他节点。
  • 三,我们需要考虑到很多数据是在分片网络和信标网络之间的传递。这些网络需要低延迟,以确保网络中的节点及时接收块、证明(attestations)等,达到有效地参与协议。这些网络也需要足够高的带宽来传输这些数据,即使块、证明等的大小相对恒定。带宽和延迟的大小也很难提前估计,但是来自brainbot的jannik初略了估算了带宽和延迟的大小。请注意,由于Phase 0规范发生了重大变化,这些估计已经过时。

当前设计

根据p2p网络的设计需要,这些是目前正在考虑的网络设计思想。这些想法是基于Ethereum Foundation和Protocol Labs的Libp2p团队之间的合作。Libp2p是构建可扩展peer-to-peer网络的模块化框架。虽然它目前还处于试验阶段,但在让开发人员更简单的使用p2p网络方面已经取得了很大进展。

一个高效的PubSub系统: GossipSub

网络中的节点使用称为发布-订阅(PubSub)的模式进行通信。在此框架中,发送消息的节点不向特定节点发送消息。相反,它们将这些消息分类为主题,并将消息发送到订阅这些主题的节点。发送这些消息的节点称为发布者,订阅主题的节点称为订阅者。因此,发布者不必知道他们要发布给谁,订阅者也不必知道主题的发布者是谁。这种发送和接收消息的框架使网络具有更大的可伸缩性和更动态的网络拓扑结构。

publish-subscribe框架在特定的libp2p中有不同的变体,其中一个在当前Serenity中考虑的称为GossipSub,它使用gossips高效地将消息路由到订阅者。GossipSub使用来自RandomsubMeshsub的思想以及gossipsub,以便在覆盖网络中有效地路由消息。Gossipsub和其他Pubsub变体的主要区别在于它如何发布消息。Gossipsub消息使用Meshsub发布,但metadata以gossiping的方式使用Randomsub发送到非mesh对等点。换言之,不在Meshsub创建的mesh中的对等方将能够获取主题mesh中消息的metadata,由于在该mesh中的对等节点已订阅同一主题,则其他节点无需直接订阅该主题。如果需要,这些对等点可以查询实际的消息。请注意,这会减少每个peer需要发送的消息量,从而降低由Gossipsub创建的覆盖mesh网络中每个对等点的网络复杂度。

在ETH2.0中,暂定有两种主题:全局主题和本地主题。全局主题将用于网络中所有节点都需要知道的消息,例如信标链消息和分片IDs。本地主题将用于与特定分片相关的消息,例如所有分片区块头头和分片交易。

使用Kademlia DHT节点路由

节点路由算法是指网络中的对等点如何决定通过哪些对等点路由消息。换句话说,节点ID如何映射到对等的IP地址和端口号。Kademlia DHT由于它的健壮性和Libp2p中实现的易用性且已在eth1.0中使用,正在考虑在ETH2.0中使用。对于Libp2p实现Kademlia的规范,可以阅读libp2p的Kademlia规范

节点发现使用Bootnodes和Kademlia DHT

为了在对等网络中进行有效的通信,对等点必须能够找到彼此。在ETH2.0中,将使用Bootnodes和kademlia dht的组合来帮助对等方找到彼此。

Bootnodes是当前eth1.0网络中使用的一种对等点发现机制,其中希望连接到网络的新对等点连接到网络中的一组预定对等点。这些对等点通常在客户机中硬编码并由客户机的开发人员选择。此过程有助于将新节点加入网络。kademlia在其规范中提供了这种引导机制。

一旦节点使用kademlia的引导机制加入网络,它就可以通过查询自己的k-bucket中最接近所需密钥的节点来发现新的节点。然后,这些被查询的节点启动相同的流程,并返回其结果中最接近所需键的节点列表。此过程将重复,直到没有查询到的节点返回与所需键最接近的节点列表。

Libp2p和Devp2p

您可能已经注意到,在当前p2p网络堆栈中,上文没有提到Devp2p。其主要原因是,由于文档有限,且自2014年提议以来缺乏更改,因此决定将以太坊从devp2p切换到libp2p。此外,libp2p的模块化设计使我们能够轻松构建分片所需的自定义网络功能。对于devp2p,我们不容易做到这一点。对于使用libp2p的优点的简短概述,您可以阅读Parity Technologies关于他们为什么在项目中使用libp2p的文章。

待解决问题

你应该对ETH2.0中的网络可能是什么有了一个很好的了解,也许,您希望开始解决问题。下面是一个开放的问题列表,你可以从中开始思考如何做出贡献。这份清单并不详尽,但它只是一个开始。

验证人隐私

验证人集合是以太坊网络的重要组成部分。它们保持协议运行并确保网络安全。攻击者可能想要识别验证人集合,以便以某种方式攻击以太坊网络。想要DDoS特定验证人节点的攻击者显然很难防止,但目标是首先使其很难识别验证人集合。理想情况下,我们有适当的机制,使得攻击者只能攻击所有可用节点的随机子集。Jannik有一个关于验证人隐私不同方面的头脑风暴问题

对于如何提高验证人的隐私性,有一些建议。然而,所有这些建议都处于集思广益阶段,没有任何具体的建议。有人建议使用当前的p2p级匿名解决方案,如Tor和/或I2p,Pegasys的工程师Nicolas Liochon分析了这些方法。你可以在这里读他的分析。要点是,将ETH2.0网络集成到tor或I2p网络中是合理的。我想指出,尝试将这些技术集成到其他加密货币中是有先例的,最著名的例子是Monero。您可以阅读所有关于Monero在构建KVRI的尝试,这里是I2P网络的C++实现。

讨论的另一种方法是基于蒲公英++。其基本思想是创建一个匿名图作为底层网络拓扑的子图,让消息沿着匿名图上伪随机生成的路径传播,然后将消息扩散到周围的节点。目前,Bitcoin CoreGrin网络正在考虑蒲公英++。这个提案建议使用蒲公英++协议的前两个步骤,然后在第三个步骤中,不再简单地将消息扩散到附近的对等点,而是像在常规Gossipsub中那样发布消息。你可以在这里阅读提案的细节。

聚合签名

签名聚合是ETH2.0的重要组成部分。它的主要用途是将来自认证者(验证人)的签名聚合为一个签名,以存储在证明(attestations)中。这就不需要存储来自证明者的所有签名。所使用的签名方案是BLS签名方案。使用BLS签名方案的主要优点是,只要生成了签名,就不再需要签名者来聚合签名。你可以在这里阅读更多关于BLS签名方案的细节。现在,我们如何在p2p网络中聚合这些签名呢?嗯,我们还不知道。PegaSys团队目前有一个名为Handel的提议。这篇论文还没有发表,但是github存储库是公开的,并且在斯坦福区块链会议上进行了讨论。然而,还没有决定。如果你知道怎么做,请联系。

节点发现

当前的节点发现设计对于Phase 0 的testnet阶段来说是很好的,但是对于一个生产的、分散的p2p网络来说不是最优的。节点发现的主要竞争者是discv5。一个版本的discv5部署在geth 1.5及更高版本中,但其他以太坊客户端不使用discv5。discv5的规范目前正在进行中,并且是非官方的。费利克斯·兰格(Felix Lange)有一份草稿,你可以在这里阅读。

有线协议(Wire Protocol)

有线协议是指设计具体实现。如果我们想让不同的客户端相互通信并且互操作,就需要一个有线协议。这是目前正在进行的工作,丹尼·瑞恩(Danny Ryan)已经发布了阶段0的最小wire API,一旦指定了特定的wire协议,就可以实现该api。后续阶段的wire API需要根据不同的需求来考虑分片。devcon4之前,在布拉格举行的工作组会议上,开发了ETH2.0的wire协议所需的需求列表。你可以在这里阅读细节。也许看看当前的eth1.0有线协议可以帮助设计ETH2.0的有线协议。

传输协议

当前的以太坊网络使用UDP来进行节点发现,而TCP用于所有p2p通信。具体来说,对于节点发现,它在UDP之上使用Kademlia-like的系统,在TCP之上构建自定义传输协议RLPX。在对等系统中,UDP是节点发现的常用选择。TCP的用途是向网络中的其他对等方发送大量的消息。这种方法常用于许多互联网应用,如游戏。但是,TCP有时可能会很慢,因为TCP需要确保数据包的顺序正确,并且需要等待对等方的响应。TCP具有内置的错误恢复功能,以便可靠地将数据包发送到网络中的对等方。

似乎以太坊中使用的传输协议还有改进的余地。也许,我们可以找到一个和UDP一样快,和TCP一样可靠的传输协议。这种协议的主要竞争者是谷歌在2012年提出的名为QUIC的实验性地传输。QUIC是一种基于UDP的传输协议,旨在提高通过internet发送数据包的性能。此外,QUIC还内置了加密功能。这意味着要阻止对等方之间的通信将更加困难。与TCP相比,使用QUIC的主要优点有两个。首先,QUIC需要一个包来建立连接,而不是TCP的三方握手。第二,它使用多路复用,使得多个数据流可以独立地到达其端点,在TCP中,如果数据流中发现错误,则连接可以被阻塞。本文讨论了在ETH2.0中使用QUIC比TCP的优势。PegaSys团队计划进行更多的研究,以确定其在ETH2.0中的可行性。为了使ETH2.0有一个可靠而快速的传输协议,可能有必要做一个分析,看看需要做哪些改进。

Kademlia DHT的替代方案

在斯坦福区块链会议之后的工作组会议期间,出现了一个共同的主题,即使用Kademlia DHT进行节点发现和节点路由。Kademlia DHT和变体已经在当前以太坊网络中使用,这是因为它的知名度。但是,这种广泛的使用使得以太坊网络容易受到一系列攻击,如eclipse攻击。此外,以太坊网络没有充分利用Kademlia的能力。事实上,以太坊并不需要Kademlia的内容发现功能。这些事实表明,我们应该探索对等路由和发现的非kademlia替代方案。

原文链接 https://medium.com/@mikerahqc/networking-in-serenity-eth2-0-8bbdb5bd6dd4

编辑于 2019-11-06

文章被以下专栏收录