7 点讲透 Solana 成为首个 Web 规模区块链的野心
Solana 创建于 2017 年,当时它的创始人 Anatoly Yakovenko 在寻求一种让去中心化的节点网络与单个节点的性能匹配的方法。还没有主流区块链能够接近于实现这一特性。于是实现这一点成为了 Solana 的目标。
原文标题:《7 Innovations that Make Solana the First Web-Scale Blockchain》
作者:Anatoly Yakovenko
译者:詹涓
比特币和以太坊等工作量证明 (Proof of Work) 系统支持大约每秒 10 笔事务 (TPS)。以实用拜占庭容错 (PBFT) 为基础的权益证明 (PoS) 系统,如 Tendermint,当节点数在 100-200 个时,可支持大约 1,000 TPS。Solana 是一个类似于 PBFT 的 PoS 区块链,在当前的测试网迭代中以超过 200 个节点支持高达 50,000 TPS,使其成为性能最好的区块链和世界上第一个 Web 规模的去中心化网络。
自 Solana 成立以来,由来自高通、英特尔、网景和谷歌的技术先驱组成的 Solana 团队一直致力于构建这些突破性性能标准所需的技术。
为了创建一个去中心化、无许可,并且可以匹配单个节点性能的网络,Solana 团队开发了以下 7 项关键技术:
• 历史证明 (POH) :共识之前的时序;
• Tower BFT: PBFT 的 PoH 优化版本;
• Turbine :区块传播协议;
• Gulf Stream :快速事务转发协议;
• Pipeline 虚拟机:并行智能合约运行时;
• Cloudbreak :水平缩放的帐户数据库;
• 复制器 (Replicators) :分布式账本存储
在本文中,我们将简要地解释以上每项技术。如果您想要深入了解,可以点击上面的链接,内有我们提供的详细说明。
历史证明
如果区块链网络作为一个整体要匹配单个节点的性能,这意味着带宽不能成为瓶颈,而计算才是。为了实现这一点,我们需要首先对网络中的节点通信进行优化。
无线蜂窝网络与基于区块链的网络有着许多相似之处,长期以来无线蜂窝网络一直致力于优化网络通信。从规模上看,没有哪一个无线发射塔有足够的带宽让每部手机都能分到自己的无线频率用于传输,因此电信公司需要「多址技术」来在同一频率里挤进多个电话呼叫。
时分多址 (TDMA) 是实现蜂窝网络大规模可扩展性的主要技术之一。TDMA 指定发射塔将每个无线电频率划分为时间段,并将这些时间段分配给每个电话呼叫。通过这种方式,蜂窝塔为网络提供了一个全局可用的时钟。这极大地提高了有限带宽的可伸缩性,允许每个频率支持多个同步数据通道,并减少来自多个手机在同一频率上同时广播的干扰。
当前基于区块链的网络则面临着时钟问题。每当一个新的区块生成时,他们的时钟就会「滴答」一次。对于以太坊来说,这种情况每 15 秒发生一次,因此一个区块中只能塞入这么多的信息。对于基于区块链的网络,与 TDMA 类似的时钟机制应当具有时小于秒的粒度,并且得到所有验证节点的同意,这样它们就可以更有效地处理事务。
Solana 的核心创新是「历史证明」(Proof of History, POH),这是一个全局可用、免许可的时间来源,可以在达成共识之前在网络中运行。POH 不是一个共识协议,也不是抗女巫攻击机制。应该说,POH 是时序问题的一个解决方案。
其他区块链要求验证者相互通信以确认时间已经过去,而每个 Solana 验证者通过将时间编码为一个简单的 SHA-256 序列哈希可验证延迟函数 (VDF) 来维护自己的时钟。Solana 使用 VDF 并不是为了随机性;相反,验证者使用 VDF 是为了维护自己的时钟。因为每个验证者都维护自己的时钟,所以选择领导者 (leader) 在先,进行一个完整的纪元在后。就像 Tendermint 一样,一个纪元的时间表可以持续数千个区块。然而,与 Tendermint 不同的是,网络从不等待失败的节点。每个验证者运行 VDF 以证明它已经获得了传输区块和验证者的时间段 (slot)。每个验证者都会因为这样做而得到补偿,正如区块生产者会因为生成区块而获得奖励一样。
有了历史证明,领导者继续轮换,不管网络状况如何,网络作为一个整体都在前进。这意味着网络永远不会停止,可以在没有任何验证者相互通信的情况下决定轮换验证者。这是一个微妙而深刻的转变,没有其他区块链拥有类似的机制。在其他所有区块链中,验证者必须通过通信才能做出决策,可是在 Solana 中,领导者的轮换决策是异步调用的。
这一核心创新打开了全面提升的设计空间。除了提供用于时间戳的时钟之外,POH 还使得 Solana 能够优化网络上可用的区块时间 (800ms)、区块传播 (log200(n)、吞吐量 (50K-80=K TPS) 和分类帐存储 (pb)。
Tower BFT
在历史证明的基础上,Solana 运行 Tower Consensus,这是一种类似 PBFT 的共识算法,专门设计为可以充分利用已同步的时钟。但是与 PBFT 不同,Tower Consensus 倾向于活性而非一致性。与 PBFT 同样的是,节点会成倍增加超时时间以达成协议,但由于区块链账本也是一个免信任的时间源,节点可以观察和检查网络
想象你置身在一个孤岛上,一个瓶子漂了过来,里头装着一个 U 盘。在 U 盘里存着一个 Solana 帐本。如果你只查看帐本本身,你将看到每个节点都可以计算当前验证者的数量、每个验证者的状态——以及关键的一点,每个验证者向网络中的任何区块提交的超时时间。仅仅是根据数据结构,不需要任何对等网络消息,验证者就可以做出投票决定,网络可以据此达成共识。
Turbine
由于 Solana 共识层不依赖于对等网络消息,它能够独立于共识去优化区块在网络中传输的方式。Solana 的区块传播技术被称为 Turbine,它主要是从 BitTorrent 那里「偷师」。当一个区块被流化时,它与擦除码一起被分解成小数据包,然后在一大组随机的对等点上散开。扇出 200 个数据包,网络的第二层可以覆盖 40,000 个验证者。因此,验证者能够传播对最终性具有 log200(n) 影响的区块。对于所有实际用途,如果每个连接都是 100 ms,那么对于一个拥有 40,000 个节点的网络,复制可以在 400 ms 内完成,实现最终性只需 500 ms。
扇出机制必须能抗故障。因此,验证者使用里德-所罗门编码 (Reed-Solomon) 以纠删代码编码数据,提供一定程度的容错。
Gulf Stream
在高性能网络中,内存池管理是一种新的问题,不过对于其他区块链来说并不是那么迫在眉睫。Gulf Stream 通过推送事务缓存和转发到网络边缘来发挥作用。由于每个验证者都知道 Solana 架构中即将轮值的领导者的顺序,客户端和验证者会提前将事务转发给预期的领导者。这样便于验证者提前执行事务,减少确认时间,更快地切换领导者,并减少来自未确认事务池对于验证者的内存压力。
客户端(如钱包)签署引用特定区块哈希的事务。客户端选择一个最近才被网络完全确认的区块哈希。区块大约每 800 ms 被提议 (propose) 一次,并且需要一个指数级增长的超时来展开每一个新增区块。使用我们的默认超时曲线,在最坏的情况下,一个完全确认的区块哈希为 32 个区块时长。假设区块时间为 800 ms,则相当于 25.6 秒。
一旦事务被转发到任何验证者,验证者就会将其转发给即将到来的领导者之一。客户端可以订阅来自验证者的事务确认。客户端知道区块哈希在有限的时间内过期,或者事务由网络确认。这便于客户端签署保证执行或失败的事务。一旦网络超过回滚点,使得事务所引用的区块哈希过期,客户端就可以确切知道事务已经是无效的,并且永远不会在链上执行。
Pipeline 虚拟机
我们构建了 Pipeline 虚拟机 (VM),以充分利用 Solana 的高性能网络,这是一个超级并行的事务处理引擎,旨在横向扩展到 GPU 和 SSD。请注意一点:所有其他区块链都是单线程计算机。Solana 是唯一一个在单个分片中支持并行事务执行(而不仅仅是签名验证)的区块链。
这个问题的解决方案很大程度上借鉴了名为「散点-聚集」的操作系统驱动程序技术。事务预先指定它们在执行时将读取和写入的状态。运行时能够找到在一个区块中发生的所有非重叠状态转换函数,并并行地执行它们(即所谓并行执行),同时优化跨 RAID 0 SSD 数组调度对状态的读写。
尽管 Pipeline 本身是一个调度事务的虚拟机,但 Pipeline 实际上并不在虚拟机中执行事务。相反,Pipeline 将事务传递给本地硬件上,直接使用一种业界验证过的,被称为伯克利包过滤 (Berkeley Packet Filter, BPF) 的字节码来执行。这种字节码是为高性能包过滤器设计的,自 1990 年代早期就已经进行了优化,并已部署到全球数百万个交换机的生产环境中,以便在一个 40 千兆比特的网络上每秒处理 6,000 万个数据包。
每次英伟达 (Nvidia) 将 SIMD 可用线程的数量增加一倍,我们的网络的计算能力就会增长一倍。事实上,所有其他单线程计算机区块链都无法以这种方式扩展。
使用同样针对 WASM 的编译器 LLVM,我们为开发人员提供了一组很棒的工具,可以用 C/ C 和 Rust 语言编写高性能智能合约,并在 GPU 上执行。虽然 Solana 没有使用 WASM,但是只需要少量修改,开发人员就可以将为 WASM 编译器编写的 C 和 Rust 代码在 Solana 编译器中重新编译。因此,开发人员可以轻而易举地从其他主流 WASM 链(如 Dfinity、EOS、Polkadot 和 以太坊 2.0)迁移他们的应用程序。
以太坊曾因其软件架构出现过一些漏洞。举两个相关的例子:
Multiple parity hacks through Delegate Call
The DAO rentrancy bug through 「call」
通过委托调用导致多个 Parity 钱包攻击
通过「调用」导致 DAO 重入漏洞
编写安全的 Solidity 代码是完全可能的,就像可以用 C 语言编写复杂的软件而不需要内存保护一样。但是,只要不安全行为易于添加且难以检测,验证复杂软件行为的难度就会几何级增长。Solana 和 Libra 团队都很早就认识到这个问题,并开发了在不同模块之间保持严格状态分离的架构。
Move 语言引入了资源 (Resources) 和脚本 (Scripts) 作为高阶概念。两者都可以很自然地适应 Solana Pipeline 运行时以及我们的本地程序设计。我们的目标是支持将 Move 作为第一层语言,这样资源就可以像原生 Solana 程序一样运行,并且可以通过 Move 或我们自己的原生 Rust ABI 进行开发和组合,而不会对性能或安全性造成任何影响。
Cloudbreak — — 水平伸缩内存
光是可伸缩计算还不够。用于追踪帐户的内存很快就会在大小和访问速度方面成为瓶颈。比方说,一般认为,许多现代区块链使用的本地数据库引擎 LevelDB 不能支持超过 5,000 TPS。
一个略天真的解决方案是在 RAM 中维持全局状态。然而,指望消费级计算机拥有足够的 RAM 来存储全局状态,这也不太合理。对于 Solana,我们设计了 Cloudbreak,这是一种状态架构,它针对分散在 SSD RAID 0 配置中的并发读写进行了优化。每个新增磁盘都增加了链上程序可用的存储容量,并增加了在执行时可执行的并发读写程序次数。
与我们的事务设计相结合,这个架构支持事务的提前 (Ahead Of Time, AOT) 执行。一旦验证者观察到事务,Pipeline 虚拟机就可以开始从磁盘预取所有帐户并准备运行时执行。验证者和区块生产者甚至可以在将事务编码到区块之前开始执行事务,这便于我们进一步优化区块时间和确认延迟。
复制器
以 1GBPS 的速度,区块链网络每年将为账本生成 4 PB 的数据。存储数据将很快成为主要的中心化向量,这与区块链实现的目的背道而驰。
在 Solana 上,存储的数据从验证者下载到称为复制器 (Replicator) 的节点网络。复制器不参与共识。状态历史被分割成许多部分,并执行纠删代码。复制器存储状态的一小部分。每隔一段时间,网络就会要求复制器证明它们还在存储其应该存储的数据。Solana 使用的复制证明 (PoRep) 理念主要借鉴自 Filecoin。
我们能够使用历史证明——达成共识之前的时钟——来优化 PoReps 的创建方式。复制器节点不参与共识,使用 PoH 生成轻量级的证明,通过这种证明可以复制分类账的各个部分,而且验证者能够跨 GPU 批量验证它们。
复制器可以是轻量级节点(例如笔记本电脑)。通过纠删代码,复制器网络可以提供超过 AWS 或 GCE 所希望提供的任何数据的可用性保证。
小结
由于这 7 项重大创新,Solana 网络是一个快如闪电的快速分布式账本技术,而且将永远保持运行。它不会因为共识而放缓。此外,该系统优化了数据传播,大量利用并行 GPU 进行事务处理,并且不会因为大量链上历史数据存储而对验证者造成负担。
Solana 软件设计的指导原则是不应妨碍硬件,方便硬件以最大容量运行。因此,Solana 可以自然地扩展带宽、SSD 和 GPU 内核。它是唯一实现上述目标的区块链,正是通过以上创新,得以令 Solana 在全球 200 个物理上不同的节点网络上实现 50,000 TPS。
网络状态
Solana 的测试网现已上线。可以点击 testnet.solana.com 查看。出于成本考虑,我们只运行少数几个节点。但是,我们已经在许多实例上将它扩展到超过 200 个不同的物理节点(不在共享硬件上),这些节点跨越了 AWS、GCE 和 Azure 上的 23 个数据中心,以进行基准测试。
目前网络运行正常,开发人员现在就可以在测试网上部署代码。他们可以用 C 语言构建智能合约,我们还在积极地开发 Rust 工具链。Rust 将成为 Solana 智能合约开发的旗舰语言。作为 Solana Javascript SDK 的一部分,Rust 工具链是公开可用的,我们正在进一步迭代软件开发工具包。
Solana 将很快推出一个公开测试版,鼓励验证者通过 Tour de SOL 运行节点——类似于 Cosmos 的 Game of Stakes 竞赛——这向公众提出了一个挑战,即在获得代币的同时测试 Solana 网络的极限。