Skip to main content

Turbine Solana Block Propagation Protocol Solves the Scalability Trilemma

· 7 min read
Davirain

在这篇文章中,我们将探讨 Turbine,这是 Solana 的区块传播协议(受 BitTorrent 启发),它解决了区块链可扩展性的难题。

可扩展性的困境

区块链技术中的可扩展性三难困境都与带宽有关。在当今的大多数区块链网络中,给定每个节点的固定带宽量,增加节点数将增加将所有数据传播到所有节点所需的时间。这是一个大问题。

然而,有无数的机会来优化数据的传播方式。有许多新颖的数据传播技术,每种技术都针对特定应用进行了优化。例如,BitTorrent 经过优化,可使用 TCP 向大量人员提供大型文件,而我参与的项目 MediaFLO 是一种针对物理层数据传播进行优化的协议,以提高无线网络上的多播效率。

在此背景下,让我们进入 Solana 的区块传播协议 Turbine,来解释 Solana 网络如何传播数据来解决区块链可扩展性三难困境。

Turbine 涡轮

高性能区块链面临的挑战之一是网络如何将大量数据传播到大量节点。例如,让我们考虑一个由 20,000 个验证者组成的网络。领导者需要向所有 20,000 个验证者传输一个 128 MB 的区块(大约 500,000 个交易 @ 250 字节/交易)。简单的实现将要求领导者与每个验证者建立唯一的连接,并传输完整的 128 MB 20,000 次。根本没有足够的带宽来容纳这么多的连接。

我们针对这个问题的解决方案 Turbine 大量借鉴了 BitTorrent,尽管两者在一些主要技术细节上有所区别。 Turbine 针对流式传输进行了优化,仅使用 UDP 传输数据,并在领导者(区块生产者)流式传输数据时通过网络实现每个数据包的随机路径。领导者将块分成大小最大为 64KB 的数据包。对于 128MB 的块,领导者会生成 2,000 个 64KB 数据包,并将每个数据包传输到不同的验证器。

反过来,每个验证器将数据包重新传输给一组我们称为邻居的对等点。您可以将网络可视化为邻域树,从而使网络能够增长到远远超过 1,000 个验证者:

每个邻域负责将其部分数据传输到其下面的每个邻域。

如果每个邻域由 200 个节点组成,则从根部的单个领导者开始的 3 级网络可以在 2 跳内达到 40,000 个验证者——或者假设每个网络链路平均为 100 毫秒,大约需要 200 毫秒。

我们使用这项技术面临的挑战是安全性。例如:敌对节点可以选择不重播数据,或者重播不正确的数据。为了处理对抗性节点,领导者生成里德-所罗门擦除码。纠删码允许每个验证器在不接收所有数据包的情况下重建整个块。

如果领导者将块的 33% 的数据包作为纠删码传输,那么网络可以丢弃任意 33% 的数据包而不会丢失该块。领导者甚至可以根据网络状况动态调整这个数字。这些决定是根据领导者在之前区块中观察到的数据包丢失率来做出的。

并非所有验证器都是生而平等的。最重要的验证者是那些拥有最多股份的验证者。因此,我们相应地优先考虑传播。权益加权选择算法构建树,使得较高权益的验证者位于更接近领导者的邻域。每个验证器独立地计算同一棵树。虽然纠删码可以修复故障,但敌对节点有可能将自己定位在树中,从而引发高于其组合权益大小的故障,尤其是与拒绝服务攻击相结合时。

我们该如何应对这种日食攻击呢?我们的扇出算法使用基于数据包数字签名的随机源为每个数据包生成一个权益加权树。由于每个数据包采用不同的路径,并且路径事先未知,因此邻域级 Eclipse 攻击将需要几乎完全控制网络。

对于一个级别,该技术可以扩展到 200 到 1,000 个节点之间。支持 1 Gbps 的网卡每秒可传输一百万个数据包。如果网络连接允许,单个验证器可以在一秒钟内向 1,000 台机器发送最多 64 KB 的数据包。