Turbine :Solana 的块传播协议,解决可扩展性的三难困境 | Solanas 8 Innovations

在本篇文章中,我们将探讨 Solana 的块传播协议 Turbine。其设计受到 BitTorrent 的启发,解决了区块链可扩展性面临的三难困境。

可扩展性三难困境

区块链技术的可扩展性三难困境全与带宽有关。在如今的大多数区块链网络中,假设每个节点拥有固定大小的带宽,增加节点数会导致将所有数据传播到所有节点所需的时间增加。这是一个大问题。

但是,我们有多种方法来优化数据的传播方式。有多种新的数据传播技术可供使用,每种都针对特定应用进行了优化。例如,BitTorrent 经过了优化,可更好地使用 TCP 向大用户群组提供大文件,而我参与的 MediaFLO 项目是一个针对物理层数据传播而优化的协议,可以提高通过无线网络进行多播的效率。

在这种背景下,我们再来看下 Solana 的块传播协议 Turbine,了解下 Solana 网络通过何种数据传播方式解决了区块链可扩展性面临的三难困境。

Turbine

高性能区块链面临的一个挑战是网络如何将大量数据传播到大量的对等节点。例如,假设一个网络中包含 20,000 个验证者。领导者需要将一个 128 MB 的块(约 500,000 个交易,每个交易大约 250 字节)传输给所有 20,000 个验证者。最笨拙的实现方法需要领导者与各个验证者建立一个唯一连接,并将这 128 MB 数据完整传输 20,000 次。但是,没有足够的带宽来处理如此多的连接。

我们用于解决此问题的方案 Turbine 借鉴了 BitTorrent 的诸多优点,但这二者在一些主要技术细节方面存在不同。Turbine 针对流处理作出了优化,仅使用 UDP 传输数据,在领导者(块生产者)流式处理数据时通过网络对每个包实现一个随机路径。领导者将块拆分成最大为 64KB 的数据包。对于一个 128MB 的块,领导者生成 2,000 个 64KB 的数据包,并将每个包传输到不同的验证者。

反过来,每个验证者将数据包重新传输给一组我们称之为”邻居”的对等节点。你可以将网络设想为一个邻居树,这使网络可增长至超过 1,000 个验证者的规模:

每个邻居负责将其一部分数据传输给其下一级的每个邻居。

如果每个邻居由 200 个节点组成,那么一个三级网络(始于根部的一个领导者)在 2 跳内(假设每个网络链接平均为 100 毫秒,则需要大约 200 毫秒)可达到 40,000 个验证器。

此技术面临的一个挑战是安全性。例如,对抗节点可以选择不重播数据或者选择重播不正确的数据。为了处理对抗节点,领导者生成 Reed-Solomon 纠删码[1]。纠删码使每个验证者可以重构整个块而无需接收所有数据包。

如果领导者将 33% 的块数据包作为纠删码传输,网络可以丢弃任意 33% 的数据包而不丢失块。领导者甚至可以基于网络状况动态调整此百分比数字。这些决定是领导者根据观察到的先前块的丢包率作出的。

创建的验证者并不都是平等的,最重要的验证者是那些权益最大的验证者。我们会据此相应确定传播的优先级别。权益加权选择算法在构造树时,会将权益更高的验证者置于更靠近领导者的邻居节点中。每个验证者独立计算相同的树。虽然纠删码可以修复故障,但是对抗节点可将自身定位在树中,从而造成比其组合权益更大的故障,尤其是在同时发生拒绝服务攻击的时候。

如何处理此类日蚀攻击[2]?我们的扇出算法基于数据包的数字签名使用随机源为每个数据包生成一个权益加权树。由于每个数据包使用不同的路径,且路径不可提前获知,因此邻居级别的日蚀攻击需要几乎完全的网络控制。