本文探讨了 Aptos 区块链状态同步的演进,提出了一系列创新技术以实现高吞吐量和低延迟的区块链数据同步。通过优化协议,Aptos 已经实现了每秒超过 10,000 笔的交易同步速度,并朝着每秒 100,000 笔交易的目标迈进,显著提升了区块链的性能和用户体验。
达到每秒超过 100,000 笔交易的路径,延迟低于一秒
作者 Joshua Lind
摘要:Aptos 区块链利用多种新颖技术确保高吞吐量、低延迟、已验证的状态同步。在 Aptos,节点今天可以以低于一秒的延迟验证和同步超过 10,000 笔交易(TPS),而且我们已经在朝着 100,000+ TPS 的目标前进。
状态同步(或状态 sync)是区块链设计中一个重要但常常被忽视的方面。在本文中,我们讨论了 Aptos 状态同步的演变,并呈现了最新状态同步协议设计背后的几个关键见解。我们进一步探讨了如何最近将状态同步的吞吐量提高了 10 倍,延迟减少了 3 倍,并继续为更快速、更高效的区块链同步铺平道路。
如今大多数区块链都是层次化结构,网络的核心有一组活跃的验证者。验证者通过执行交易、产生区块并达成共识来扩展区块链。网络中其余的节点(例如,完整节点和客户端)则复制由验证者生成的区块链数据(例如,区块和交易)。状态同步是允许非验证者节点分发、验证和持久化这些区块链数据的协议,并确保生态系统中的所有节点保持同步。请参见下面的图表了解 Aptos 的工作方式。
Aptos 生态系统(概述)
在评估区块链时,状态同步很少被提及:它通常是白皮书中专注于更有趣主题的脚注。然而,状态同步对区块链的性能、安全性和用户体验有着显著影响。请考虑以下几点:
为了更好地理解状态同步,我们首先介绍一个通用的区块链执行模型。虽然该模型专门针对 Aptos 区块链,但可以推广到其他区块链。
我们将 Aptos 区块链建模为一个简单的版本数据库,其中每个版本 V 都有一个唯一的区块链状态 Sⱽ,包含所有链上账户和资源。一个事务 T 可以由 Aptos 虚拟机(VM)在状态 Sⱽ 上执行,以生成表示对状态 Sⱽ 的所有状态修改的状态增量 Dᵀᵥ,如果 T 被提交。当 Dᵀᵥ 被应用到 Sⱽ 时(即,我们认为 T 已提交),会产生一个新版本 V+1 和新的区块链状态 Sⱽ⁺¹。我们将第一状态称为基元状态 S⁰。下面的图表展示了事务执行和状态增量应用。
事务执行和状态增量应用(模型)
有了通用模型,我们现在可以定义状态同步的几个基本目标**:
接下来,我们介绍构建状态同步协议所需的一组基础构建模块。为简洁起见,我们在下面提供每个构建模块的总结,并将技术细节推迟到未来的工作中(这些都可以是单独的博客文章!):
利用上面提出的模型和构建模块,我们现在可以展示一种简单的状态同步协议。该协议是 Aptos 原协议(即,state sync v1
)的简化版本。
该协议的工作流程如下:(i)Alice
(同步节点)识别出最高的本地持久化区块链版本 V 和状态 Sⱽ。如果不存在,Alice
使用创世状态,即 S⁰;(ii)Alice
随机选择一个节点 Bob
,请求验证者已提交的任何新的顺序交易;(iii)如果 Alice
收到来自 Bob
的响应,Alice
将验证新交易 (T⁰ 到 Tᴺ) 并执行它们以生成状态增量(D⁰ᵥ 到 Dᵀᵥ ₊ₙ);(iv)Alice
随后将新的状态增量和新交易应用于存储,将区块链的本地状态从 Sⱽ 更新为 Sⱽ⁺¹⁺ᴺ。Alice
无限重复这循环。该协议的伪代码如下:
状态同步 v1(伪代码)
我们在 Aptos 实现了该协议,并在 devnet 上进行了基准测试和分析。我们注意到的一些关键观察包括:
~1.2k TPS
。然而,由于 Alice
顺序请求数据并且必须等待节点的响应,因此吞吐量受网络延迟显著影响。鉴于我们在 devnet 中观察到的平均网络往返时延(RTT)为 150ms
,这不是一个最佳方案。Alice
接收到要同步的新交易集时,我们发现 55%
的 CPU 时间用于执行这些交易,而 40%
的时间用于验证数据、将状态增量应用于存储,并持久化新交易。其余的 5%
用于消息处理、序列化和其他任务。Alice
接收新交易的平均延迟为 ~900 ms
,这主要是因为 Alice
在请求数据时随机选择节点,并没有考虑网络拓扑:靠近验证者的节点会更快地接收到新交易。Alice
从创世状态开始重放和同步所有交易。如果 Alice
距离最新状态较远,她必须等待很长时间才能执行有用操作(这可能需要几个小时甚至几天!)。Alice
在等待数据时花费长时间,而无所事事。因此,显著增加了同步时间。Alice
必须重新执行所有交易;(ii)存储使用高,因为 Alice
必须持久化从创世以来的所有交易和区块链状态;(iii)网络使用高,因为 Alice
必须通过网络接收自创世以来的所有交易。这自动增加了高成本和资源需求,降低了异构性。Alice
同步新数据时,网络中的其他节点也在从她那里进行同步。随着请求数据的节点数量增加,存储和 CPU 需要处理这些请求的附加读取负载增加。然而,Alice
处理这些请求时执行的许多计算是无用的,因为节点通常会请求相同的数据。针对上述简单协议,我们可以进行多项修改以帮助解决其局限性。首先,我们扩展协议以支持另外 2 种同步模式:
55%
; (ii) 不需要使用 Aptos VM,从而大大简化状态增量同步的实现。结果,节点现在可以通过下载每个交易 T 和状态增量 Dᵀᵥ 并将其应用于存储来生成新的状态 Sⱽ⁺¹。我们注意到这会增加网络使用(约 2.5x
)。接下来,我们实现了一系列通用优化和其他功能,以改进性能和可扩展性:
我们实现了这些修改,并产生了新的状态同步协议(即,state sync v2
)。我们在 devnet 上对其进行了基准测试并获得了以下观察结果:
~4.5k TPS
,其主要原因是管道化和数据预取(即,该协议现在能够充分利用 CPU)。在同步状态增量时,协议的吞吐量超出了 10K TPS
,这进一步得益于避免交易执行。在这两种情况下,吞吐量不再受网络延迟影响。Alice
接收到新交易的平均延迟为 ~300 ms
,这是由于数据预取和更高效的节点选择:更有响应且靠近验证者的节点更频繁地被联系。20
个同步节点时,我们看到每个请求的缓存命中率为 70%-80%
。而在 60
个节点时,缓存命中率为 93%-98%
。这额外使用了 ~150 MB
的 RAM 来维持缓存。虽然我们已经将吞吐量提高了 10 倍,延迟减少了 3 倍,但我们意识到仍有更多工作要做。特别是如果我们想匹配 Block-STM,并使 Aptos 成为所有人的第一层!
那么,我们将如何达到这一目标?好吧,我们已经开始了下一个状态同步目标:100k+ TPS!虽然我们计划将细节留到未来的博客文章中,但我们确实想向非常渴望的读者提供一些提示:
~45K TPS
的吞吐量,然后便饱和了带宽。如果我们想扩展,这就是个问题。幸运的是,我们已经意识到节点使用低效的序列化格式分发数据,并通过使用现成的压缩技术,我们可以将传输的数据量减少超过 10x
。下次见!
如果你像我们一样,对设计算法、将其付诸实践并对 Web3 的未来产生实际影响充满热情,请联系—我们在 Aptos 正在扩招。 正在招聘
- 原文链接: medium.com/aptoslabs/the...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!