以太坊中更快的区块/blob传播 - 网络

本文提出了一种在P2P网络中广播和传输以太坊区块和blob的新方法,该方法使用随机线性网络编码(RLNC)。实验表明,相比于当前Gossipsub的实现,该方法在理论上可以使用5%的带宽和57%的网络跳数来分发区块,从而减少消息的延迟

以太坊中更快的区块/blob 传播

感谢 @n1shantd, @ppopth 和 Ben Berger 对本文的讨论和反馈,以及 @dankrad 的许多有用的讨论。

摘要

我们建议改变在 P2P 网络中广播和传输区块和 blob 的方式,通过使用随机线性网络编码。我们表明,理论上,我们可以使用当前 gossipsub 实现所需带宽的 5% 和网络跳数(因此每个消息的延迟减半)的 57% 来分发区块。我们提供了计算开销的具体基准。

介绍

当前用于分发区块的 gossipsub 机制大致如下。提议者在所有对等节点中选择一个随机子集(称为其 Mesh),大小为 D=8,并将区块广播给它们。每个接收到区块的对等节点都会执行一些非常初步的验证:主要是签名验证,但最重要的是不包括状态转换或执行交易。经过这种快速验证后,对等节点将其区块重新广播到另外 D 个对等节点。这种设计有两个直接后果:

  • 每次跳转都会增加至少以下延迟:一个完整的区块从一个对等节点传输到下一个对等节点(包括网络 ping 延迟,基本上与带宽无关,加上完整区块的传输,受带宽限制)。
  • 对等节点不必要地将完整区块广播给已经接收到完整区块的其他对等节点。

我们建议在广播级别使用 随机线性网络编码 (RLNC)。通过这种编码,提议者会将区块拆分为 N 个块(例如,对于下面的所有模拟,N=10),并且不会将完整区块发送给大约 8 个对等节点,而是将单个块发送给大约 40 个对等节点(不是原始块之一,而是它们的随机线性组合,请参阅下面的隐私注意事项)。对等节点仍然需要下载完整的区块,或者更确切地说 N 个块,但它们可以从不同的对等节点并行获取它们。在他们收到这 N 个块后,每个块都是组成原始块的原始块的随机线性组合,对等节点需要求解线性方程组以恢复完整的块。

概念验证 实现 高亮显示了以下数字

  • 提出区块需要额外的 26 毫秒,这是受 CPU 限制的,并且可以在现代笔记本电脑 (Apple M4 Pro) 上完全并行化到小于 2 毫秒
  • 验证每个块需要 2.6 毫秒。
  • 解码完整区块需要 1.4 毫秒。
  • 使用 10 个块和 D=40,每个节点发送的数据量是当前 gossipsub 的一半,并且网络在一半的时间内广播 100KB 的区块,并且随着区块大小的增加,好处也会增加。

协议

有关网络编码的深入介绍,我们请读者参考 op. cit.这本教科书。我们在此提及上述概念验证基准测试的最小实现细节。在区块传播(约 110KB)的情况下,延迟或网络跳数主导传播时间,而在完整 DAS 中像 blob 这样的大消息的情况下,带宽主导传播时间。

我们考虑素数特征的有限域 \mathbb{F}_p。在上面的示例中,我们选择由 curve25519-dalek rust crate 实现的 Ristretto 标量基域。提议者获取一个区块(这是一个不透明的字节切片),并将其解释为 \mathbb{F}_p 中的元素向量。在撰写本文时,一个典型的以太坊区块约为 B = 110KB,鉴于每个 Ristretto 标量需要不到 32 字节来编码,一个区块大约需要 B/32 = 3520 个 \mathbb{F}_p 元素。分成 N=10 个块,每个块可以看作是 \mathbb{F}_p^{M} 中的一个向量,其中 M \sim 352。因此,该区块被视为 N 个向量 v_i \in \mathbb{F}^M_p, i=1,...,N。提议者随机选择 D\sim 40 个对等节点的子集。对于每个这样的对等节点,它将发送一个 \mathbb{F}_p^M 向量以及一些额外的信息来验证消息并防止网络上的 DOS。我们解释提议者

提议者

我们将使用 Pedersen 对 Ristretto 椭圆曲线 E 的承诺,由上述 rust crate 实现。我们假设我们已经随机选择了一个由足够元素 G_j \in E, j = 1, ..., K 组成的受信任设置,其中 K \gg M。我们为 \mathbb{F}_p^M 选择一个标准基 \{e_j\}_{j=1}^M。因此,每个向量 v_i 都可以唯一定义地写成

v_i = \sum_{j=1}^M a_{ij} e_j,

对于某些标量 a_{ij} \in \mathbb{F}_p。对于每个向量 v_i,我们都有一个 Pedersen 承诺

C_i = \sum_{j=1}^M a_{ij}G_j \in E.

最后,对于大小为 D \sim 40 的子集中的每个对等节点,提议者均匀随机地选择一组标量 b_i, i=1, ...,N 并将以下信息发送给该对等节点

  1. 向量 v = \sum_{i=1}^N b_i v_i \in \mathbb{F}_p^M。大小为 32M 字节,是消息的内容。
  2. N 个承诺 C_i, i=1,...,N。这是 32N 字节。
  3. N 个系数 b_i, i=1, ...,N。这是 32N 字节。
  4. 对 N 个承诺 C_1 || C_2 || ... || C_N 的哈希的 BLS 签名,这是 96 字节。

一个签名消息是上面元素 1-4 的集合。我们看到在每个消息上作为 sidecar 发送了 64N \sim 640 个额外字节。

接收对等节点

当对等节点收到如上一节所述的消息时,验证过程如下

  • 它验证提案者的签名对于接收承诺的哈希是否有效。
  • 它写入接收向量 v = \sum_{j=1}^M a_j e_j,然后计算 Pedersen 承诺 C = \sum_{j=1}^M a_j G_j。
  • 接收到的系数 b_i 声称 v = \sum_{i=1}^N b_i v_i。对等节点计算 C'= \sum_{i=1}^N b_i C_i,然后验证 C = C'。

对等节点跟踪他们收到的消息,假设它们是向量 w_i, i = 1,...,L,对于 L < N。它们生成一个子空间 W \subset \mathbb{F}_p^M。当它们收到 v 时,它们首先检查该向量是否在 W 中。如果是,则它们会丢弃它,因为该向量已经是先前向量的线性组合。该协议的关键在于,这非常不可能发生(对于上面的数字,这种情况发生的概率远小于 2^{-256})。因此,当节点收到 N 条消息时,它知道可以从消息 w_i, i=1,...,N 中恢复原始 v_i,从而恢复区块。

另请注意,只需要一个签名验证,所有传入消息都具有相同的承诺 C_i 和对同一组承诺的相同签名,因此对等节点可以缓存第一次有效验证的结果。

发送对等节点

对等节点可以在收到一个块后立即将块发送给其他对等节点。假设一个节点持有 w_i, i=1,...,L,其中 L \leq N,如上一节所述。节点还会跟踪它们收到的标量系数,因此它们知道它们持有的块满足

w_i = \sum_{j=1}^N b_{ij} v_j \quad \forall i,

对于一些标量 b_{ij} \in \mathbb{F}_p,它们保存在其内部状态中。最后,节点还保留完整的承诺 C_i 和提案者的签名,它们在验证它们收到的第一个块时已对其进行验证。

节点发送消息的过程如下。

  • 它们随机选择 L 个标量 \alpha_i \in \mathbb{F}_p, i=1,...,L。
  • 它们形成块 w = \sum_{i=1}^L \alpha_i w_i。
  • 它们通过以下方式形成 N 个标量 a_j, i=1,...,N

a_j = \sum_{i=1}^L \alpha_i b_{ij}, \quad \forall j=1,...,N.

它们发送的消息包括块 w、系数 a_j 和来自提案者的承诺 C_i 以及签名。

基准

该协议有一些与 gossipsub 共同的组件,例如提案者需要创建一个 BLS 签名,而验证者需要检查一个 BLS 签名。我们在此记录除了通常的 gossipsub 操作之外还需要执行的操作的基准。这些是协议对节点的 CPU 开销。基准测试已在 Macbook M4 Pro 笔记本电脑和 Intel i7-8550U CPU @ 1.80GHz 上进行。

这些基准测试的参数是 N=10,用于块的数量,并且认为总块大小为 118.75KB。所有基准测试都是单线程的,并且都可以并行化

提案者

提案者需要执行 N 个 Pedersen 承诺。基准测试结果如下

定时 模型
[25.588 ms 25.646 ms 25.715 ms] 苹果
[46.7ms 47.640 ms 48.667 ms] 英特尔

节点

接收节点需要计算每个块 1 个 Pedersen 承诺,并执行提案者提供的承诺的相应线性组合。这些的定时如下

定时 模型
[2.6817 ms 2.6983 ms 2.7193 ms] 苹果
[4.9479 ms 5.1023 ms 5.2832 ms] 英特尔

发送新块时,节点需要执行其可用块的线性组合。这些的定时如下

定时 模型
[246.67 µs 247.85 µs 249.46 µs] 苹果
[616.97 µs 627.94 µs 640.59 µs] 英特尔

在收到 N 个块后解码完整的块时,节点需要求解一个线性方程组。定时如下

定时 模型
[2.5280 ms 2.5328 ms 2.5382 ms] 苹果
[5.1208 ms 5.1421 ms 5.1705 ms] 英特尔

总体 CPU 开销。

在 Apple M4 上,提案者的总体开销是 26 毫秒单线程,而对于接收节点,则是 29.6 毫秒单线程。这两个过程都可以完全并行化。在提案者的情况下,它可以并行计算每个承诺,并且在接收节点的情况下,这些是自然并行事件,因为节点正在从不同的对等节点并行接收块。在 Apple M4 上并行运行这些过程会导致提案者方面为 2.6 毫秒,接收对等节点为 2.7 毫秒。对于实际应用,与涉及的网络延迟相比,将这些开销视为零是合理的。

优化

一些尚未实现的过早优化包括在块到来时反转线性系统,尽管上面引用的概念验证确实将传入的系数矩阵保持为阶梯形式。最重要的是,消息的随机系数不需要像 Ristretto 字段那样大的字段。像 \mathbb{F}_{257} 这样的小素数域就足够了。但是,由于 Pedersen 承诺发生在 Ristretto 曲线中,因此我们被迫在更大的字段中执行标量运算。这些基准测试的实现为线性组合选择小系数,并且这些系数在每次跳转时都会增长。通过正确地控制和选择随机系数,我们或许能够将线性系统的系数(以及因此在发送块时的带宽开销)限制为用例如 4 个字节而不是 32 个字节进行编码。

执行此类优化的最简单方法是在 \mathbb{F}_q 上定义的椭圆曲线上工作,其中 q = p^r 对于一些小素数 p。这样,系数可以在子字段 \mathbb{F}_p \subset \mathbb{F}_q 上选择。

隐私考虑 上面链接的 PoC 中的实现在于每个节点(包括提案者)选择小系数来合成其线性变换。这允许接收具有小系数的块的对等节点识别该块的提案者。要么采用上述优化来通过执行像 Bareiss 扩展这样的算法来保持所有系数较小,要么我们应该允许提案者从字段 \mathbb{F}_p 中选择随机系数。

模拟

我们在一些简化假设下执行了区块传播的模拟,如下所示。

  • 我们选择一个随机网络,该网络被建模为具有 10000 个节点的有向图,每个节点都有 D 个对等节点可以向其发送消息。D 在本文中称为 Mesh 大小,并且选择的范围从 3 到 80 不等。
  • 对等节点是在完整的节点集上随机且均匀地选择的。
  • 每个连接都以相同的 X MBps 带宽选择(通常在以太坊中假定为 X=20,但我们可以将此数字作为参数)
  • 每次网络跳转都会产生 L 毫秒的额外常量延迟(通常测量为 L=70,但我们可以将此数字作为参数)
  • 假设消息大小总大小为 B KB。
  • 对于使用 RLNC 的模拟,我们使用 N=10 个块来划分该块。
  • 每次节点将消息发送给由于冗余而被丢弃的对等节点(例如,该对等节点已经具有完整的块)时,我们都会将消息的大小记录为 浪费的带宽

Gossipsub

我们使用对等节点数 D=6 发送消息。我们获得网络平均需要 7 次跳转才能将完整块传播到 99% 的网络,从而导致总传播时间为

T_{\mathrm{gossipsub, D=6}} = 7 \cdot (L + B/X),

以毫秒为单位。

gossipsub-total-theorical\ gossipsub-total-theorical1712×982 70.6 KB

当 D=8 时,结果相似

T_{\mathrm{gossipsub, D=8}} = 6 \cdot (L + B/X),

对于 D=6,浪费的带宽为 94,060 \cdot B,对于 D=8,浪费的带宽为 100,297 \cdot B。

对于较低的 B 值(如当前的以太坊块),延迟会主导传播,而对于较大的值(例如在对等 DAS 之后传播 blob),带宽将成为主要因素。

RLNC

每个对等节点一个块

通过随机线性网络编码,我们可以使用不同的策略。我们模拟了一个系统,其中每个节点只会将一个块发送到其大小为 D 的网格中的所有对等节点,这样我们可以保证产生的延迟与 gossipsub 中相同:每次跳转的单个延迟成本为 L 毫秒。这要求网格大小明显大于 N(块数)。请注意,对于 gossipsub 的网格大小为 D_{gossipsub}(例如,当前以太坊中为 8),我们需要设置 D_{RLNC} = D_{gossipsub} \cdot N 以消耗每个节点相同的带宽,对于当前值,这将为 80。

使用比此带宽一半更保守的值,即 D=40,我们获得

T_{RLNC, D=40} = 4 \cdot \left(L + \frac{B}{10 X} \right),

浪费的带宽为 29,917\cdot B。假设与今天相同的带宽,我们通过 D=80 获得出色的

T_{RLNC, D=80} = 3 \cdot \left(L + \frac{B}{10 X} \right),

浪费的带宽为 28,124\cdot B,这是 gossipsub 中相应浪费带宽的 28%。

差异

对于每个节点发送的相同带宽,我们看到传播时间的不同之处在于将延迟分为两部分(有 3 次跳转与 6 次跳转),并通过每单位时间消耗十分之一的带宽来更快地传播块。此外,由于多余消息而浪费的带宽将减少到 gossipsub 浪费消息的 28%。对于传播时间和浪费的带宽,获得了类似的结果,但每个节点发送的带宽减少了一半。

在较低的块大小端,延迟占主导地位,并且 3 次跳转与 gossipsub 上的 6 次跳转占据了大部分差异,在较高的块大小端,带宽性能占主导地位。对于更大的块大小,RLNC 中的 CPU 开销会变得更糟,但考虑到传输时间的数量级,这些可以忽略不计。

rlnc-gossipsub\ rlnc-gossipsub1712×982 87.7 KB

每个对等节点多个块

在生产环境中,使用每个对等节点单个块的方法,具有较高带宽的节点可以选择向更多对等节点广播。在节点级别,这可以通过简单地向所有当前对等节点广播来实现,而节点运营商只需通过配置标志来选择对等节点的数量。另一种方法是允许节点依次将多个块发送到单个对等节点。这些模拟的结果与上述完全相同,但 D 远低于预期。例如,对于 D=6,在每个对等节点发送单个块的情况下,永远不会广播完整块。模拟需要 10 次跳转才能广播完整的块。当 D=10 时,跳转次数减少到 9。

结论、遗漏和进一步工作

我们的结果表明,如果我们使用 RLNC 而不是当前的路由协议,预计区块传播时间和每个节点的带宽使用率都会有相当大的改善。区块/blob 大小越大或每次跳转的延迟成本越短,这些好处就越明显。该协议的实现需要对当前的架构进行重大更改,并且可能需要一种全新的发布/订阅机制。为了证明这一点是合理的,我们可能需要实现完整的网络堆栈以在 Shadow 下进行模拟。另一种方法是实现 Reed-Solomon 纠删码和路由,类似于我们对 Peer-DAS 所做的那样。应该很容易将上述模拟扩展到这种情况,但 op. cit 已经包含许多这样的比较。

  • 原文链接: ethresear.ch/t/faster-bl...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
以太坊中文
以太坊中文
以太坊中文, 用中文传播以太坊的最新进展