在这篇文章中,我们将探讨Turbine,Solana的区块传播协议,它解决了区块链可扩展性的三难问题,其灵感来自BitTorrent。
可扩展性三难问题
区块链技术中的可扩展性三难问题是关于带宽的。在今天的大多数区块链网络中,鉴于每个节点有固定的带宽,增加节点数量将增加将所有数据传播到所有节点所需的时间。这是一个大问题。
然而,有无数的机会可以优化数据的传播方式。有许多新颖的数据传播技术,每一种都是为特定的应用而优化。例如,BitTorrent是为使用TCP向大群人提供大文件而优化的,而MediaFLO则是为物理层的数据传播而优化的协议,以提高无线网络上组播的效率。
有了这个背景,让我们跳到Turbine,Solana的区块传播协议,来解释Solana网络如何传播数据以解决区块链的可扩展性三难问题。
Turbine
高性能区块链的挑战之一是网络如何将大量的数据传播给大量的对等(peer)节点。让我们考虑一下,例如,一个由20,000个验证者组成的网络。领导者需要将一个128MB的区块(约50万个交易@250字节/交易)传输给所有2万个验证者。一个简单的实现是要求领导者与每个验证者有一个独特的连接,并将整个128MB的数据传输20000次。根本没有足够的带宽来容纳这么多的连接。
我们对这个问题的解决方案,即Turbine,在很大程度上借鉴了BitTorrent的做法--尽管两者之间有一些主要的技术细节区别。Turbine针对数据流传输进行了优化,仅使用UDP传输数据,并在领导者(区块生产者)传输数据时,实现了每个数据包在网络中的随机路径。领导者将数据块分成大小不超过64KB的数据包。对于一个128MB的块,领导者产生2,000个64KB的数据包,并将每个数据包传输到不同的验证器。
反过来,每个验证者将数据包重传给一组对等节点(peer),我们称之为邻域(neighborhood)。你可以把网络想象成一棵邻域树,让网络的增长远远超过1000个验证者。
每个邻域负责将其一部分数据传输给它下面的每个邻域。
如果每个邻域由200个节点组成,一个3级网络,从根部的一个领导者开始,可以在两跳中达到40,000个验证者--或者假设每个网络链接平均为100毫秒,则大约200毫秒。
我们在这项技术上面临的挑战是安全性。例如:恶意节点可以选择不转发数据,或者转发不正确的数据。为了处理恶意节点,领导者生成了Reed-Solomon擦除码。擦除码允许每个验证者在没有收到所有数据包的情况下重建整个块。
如果领导者将该区块33%的数据包作为擦除码传输,那么网络可以放弃任何33%的数据包而不丢失该区块。领导者甚至可以根据网络条件动态地调整这个数字。这些决定是由领导者从以前的区块中观察到的丢包率做出的。
并非所有的验证者都是平等的。最重要的验证者是那些拥有最多利益的验证者。因此,我们相应地确定传播的优先次序。根据不同的验证者质押(Stake)的权重来选择算法构建了一个树,使质押较多的验证者在邻域更接近领导者。每个验证者都独立计算相同的树。虽然擦除码可以修复故障,但恶意节点有可能在树中定位,从而诱发高于其综合质押数量大小的故障,特别是当与拒绝服务攻击(DoS)相结合时。
我们如何处理这种日蚀攻击(eclipse attack)?Turbine的扇出算法使用基于数据包数字签名的随机源为每个数据包生成一棵质押加权树。由于每个数据包采取不同的路径,而且路径是事先不知道的,所以领域级的日蚀攻击需要几乎完全控制网络才可能发生。