云破天 -索拉纳的水平缩放状态架构

Solana是稳定高效运作最佳的公链。 在 Solana Testnet 的当前迭代中,由 200 个物理上不同的节点组成的网络支持使用 GPU 运行时每秒超过 50,000 个事务的持续吞吐量。 实现这一点需要实现多项优化和新技术,其结果是网络容量的突破,标志着区块链开发进入一个新阶段。

有 7 项关键创新使索拉纳网络成为可能:

在本博客文章中,我们将介绍云中断,索拉纳的水平缩放状态体系结构

概述:RAM、SSD 和线程

在不进行分片的情况下缩放区块链时,仅扩展计算是不够的。 用于跟踪帐户的内存在大小和访问速度方面迅速成为瓶颈。 例如:人们普遍认为,许多现代链使用的本地数据库引擎 LevelDB 在一台计算机上不能支持大约 5,000 TPS。 这是因为虚拟机无法通过数据库抽象利用对帐户状态的并发读取和写入访问。

一个天真的解决方案是维护 RAM 中的全局状态。 但是,期望消费者级计算机有足够的 RAM 来存储全局状态是不合理的。 下一个选项是使用 SSD。 虽然 SSD 将每字节成本降低 30 倍或更多,但它们比 RAM 慢 1000 倍。 下面是最新的三星SSD的数据表,这是市场上最快的SSD之一。

三星 SSD 数据表

单笔交易需要读取 2 个帐户并写入 1。 帐户密钥是加密公钥,是完全随机的,没有真正的数据区域。 用户的钱包将有许多帐户地址,并且每个地址的位与任何其他地址完全无关。 由于帐户之间没有局部性,因此我们不可能将它们放在内存中,以便它们彼此可能彼此接近。

每秒最多 15,000 个唯一读取,使用单个 SSD 实现帐户数据库的天真单线程实现将每秒最多支持 7,500 个事务。 现代 SSD 支持 32 个并发线程,因此可以支持每秒 370,000 次读取,或每秒大约 185,000 个事务。

云破天

索拉纳的指导设计原则是设计软件,使其摆脱硬件,允许100个利用率。

组织帐户数据库,以便在 32 个线程之间进行并发读取和写入是一项挑战。 像LevelDB这样的香草开源数据库会导致瓶颈,因为它们在区块链设置中不能针对这一特定挑战进行优化。 索拉纳不使用传统的数据库来解决这些问题。 相反,我们使用操作系统使用的几个机制。

首先,我们利用内存映射的文件。 内存映射文件是字节映射到进程的虚拟地址空间的文件。 映射文件后,它就像任何其他内存一样。 内核可能将缓存的内存中的部分或没有保留,但物理内存量受磁盘大小(而不是 RAM)的限制。 读取和写入显然仍受磁盘性能的约束。

第二个重要的设计注意事项是顺序操作比随机操作快得多。 这不仅适用于 SSD,也适用于整个虚拟内存堆栈。 CPU 擅长预取按顺序访问的内存,操作系统则擅长处理顺序页面错误。 为了利用此行为,我们大致如下地分解帐户数据结构:

  1. 帐户和分叉的索引存储在 RAM 中。
  2. 帐户存储在内存映射文件中,大小高达 4MB。
  3. 每个内存映射仅存储来自单个建议的分叉的帐户。
  4. 地图随机分布于可用的 SSD 上。
  5. 使用写入时复制语义。
  6. 写入被追加到同一分叉的随机内存映射中。
  7. 每次写入完成后,索引都会更新。

由于帐户更新是写入时复制的,并追加到随机 SSD 中,因此 Solana 会收到跨多个 SSD 进行顺序写入和跨多个 SSD 进行水平缩放的好处。 读取仍然是随机访问,但由于任何给定的分叉状态更新都分布在许多 SSD 中,因此读取结果最终也是水平缩放的。

云中断还会执行某种形式的垃圾回收。 由于分叉在回滚后最终完成,帐户更新,旧的无效帐户将被垃圾回收,内存被放弃。

此体系结构至少还有一个巨大好处:可以使用跨 SSD 水平缩放的顺序读取来计算任何给定分叉的状态更新的 Merkle 根。 此方法的缺点是数据失去通用性。 由于这是一个自定义数据结构,具有自定义布局,因此无法使用通用数据库抽象来查询和操作数据。 我们必须从一开始建造一切。 幸运的是,现在做到了。

基准云突破

当”帐户”数据库处于 RAM 中时,我们看到吞吐量与 RAM 访问时间匹配,同时随可用内核数进行扩展。 在 1000 万个帐户中,数据库不再适合 RAM。 但是,在单个 SSD 上,我们仍看到每秒读取或写入的性能接近 100 万次。

了解更多关于SOL 之旅– 索拉纳的激励测试网活动。

Solana 利用云中断,以及历史证明、管道 VM 和塔式 BFT 等创新技术,共同创建了世界上第一个 Web 级区块链。 索拉纳的测试网今天就直播了。 你可以在https://testnet.solana.com看到它。 出于成本目的,我们只运行少量节点。 但是,我们已经在许多实例上将其拆分为 AWS、GCE 和 Azure 上的 23 个数据中心的 200 多个物理上不同的节点(不在共享硬件上),以便进行基准测试。

运行时现在运行正常,开发人员现在可以在测试上部署代码。 开发人员现在可以在 C 中构建智能合约,我们正在积极开发 Rust 工具链。 锈将是索拉纳智能合约开发的主要语言。 Rust 工具链作为索拉纳 Javascript SDK 的一部分公开提供,我们正在进一步迭代软件开发工具包。

索拉纳将很快推出一个公共测试版激励验证器,通过Tour de SOL运行节点,类似于宇宙的赌注游戏,挑战广大公众测试索拉纳网络的极限,同时赚取令牌这样做。