# Dragonfly：从 AMM 交易处理效率来看 L1 公链究竟谁「快」

By [Foresight News](https://paragraph.com/@foresight-news) · 2022-03-03

---

**提前关注不迷路：**

Twitter：[@Foresight\_News](https://twitter.com/Foresight_News?utm_campaign=Foresight%20News%20%E7%B2%BE%E9%80%89&utm_medium=email&utm_source=Revue%20newsletter)

Telegram：[t.me/foresightnews](http://t.me/foresightnews?utm_campaign=Foresight%20News%20%E7%B2%BE%E9%80%89&utm_medium=email&utm_source=Revue%20newsletter)

Discord：[discord.gg/psH3bhRt](http://discord.gg/psH3bhRt?utm_campaign=Foresight%20News%20%E7%B2%BE%E9%80%89&utm_medium=email&utm_source=Revue%20newsletter)

![](https://storage.googleapis.com/papyrus_images/f189fed614d21f6cdf59b955dea69095142f310563cfe70ec343c4db87edc5f2.jpg)

> _相比于单纯的 TPS 数据，以 AMM 交易合约为基准来测试 Layer 1 公链性能更具公允性。_

**撰文：GM，Dragonfly Capital 研究员**

**编译：iambabywhale.eth**

多链格局已经成为了现实。以太坊缺乏可扩展性导致众多应用及流量迁移至新一代的 Layer 1 公链。这些新公链大多兼容 EVM，也使得其与以太坊钱包和开发工具兼容，但这其中选择从头重建堆栈的 Solana 是一个例外。Solana 一直被市场认为是最快的区块链，那么问题来了：Solana 究竟比 EVM 兼容链要快多少？

![](https://storage.googleapis.com/papyrus_images/7ff29129881da8d9e6124ebeb24c255d533e5dc8c6d602504c6c8ac03257a41b.png)

在回答这个问题之前，首先我们需要确定一个衡量基准。新公链总是喜欢宣称自己的性能比以太坊高出多少多少，你会看到乱七八糟的数字、匆忙赶制的图表以及比较主观的 TPS 数据。而这些通常来自于营销材料的 TPS 数据，几乎都是胡说八道。

大多 Layer 1 公链本身公布的 TPS 测试基准几乎都是基于简单的转账 —— 即将代币从一个账户转移到另一个账户。简单的转账很便宜，所以就会产生很高的 TPS，但事实是没有哪个区块链会在代币转账上出现瓶颈，而且简单转账并不能真实地反应用户使用该公链的情况。除此之外，这些数据很多时候来源于开发者网络或测试网络而不是主网，总之我并不关心这条链理论上能做到什么程度，我只关心当下实际的情况。

实际上，对公链 TPS 的测试没有一个统一的基准，但所有与「基准」相关的事似乎都是很混乱的，充满了误导性营销、欺诈以及单纯为了满足「基准」这样的情况。

所以，我们究竟应该如何衡量 Layer 1 公链的表现呢？

这个问题有些棘手，因为性能包含了多个维度。

首先，性能始终需要与去中心化进行权衡。高度中心化的测试网和开发者网络相比主网可能可以产生很高的数据，于是很多主网通过牺牲去中心化程度「挤压」出了更高的性能。

但是假设我们忽略去中心化，只关注性能，依然难以对区块链性能进行测试，因为大多数新公链的数据可视性都很差。

7 年以来，以太坊被人们深入研究和理解，而相比之下大多数新公链的链上工具很少且数据可视性差，同时它们也在不断发展，可能在你阅读这篇文章的时候，这些基准已经过时了。

此外，基准总是很随意却又陷阱重重，你最好的选择就是去以一个有价值的东西作为衡量基准，然后尽可能谨慎地确认你的结果。这就是我们尝试去做的事情。

我们所谓的性能包括两个方面，吞吐量和延迟。

你可以将区块链性能可视化，例如流过管道的水，交易就是水，你希望大量交易同时流过管道，但管道的长度决定了延迟，也就是说如果一个交易需要很长时间才能被执行，哪怕被执行之后可以立刻被确认，也是不理想的。

![](https://storage.googleapis.com/papyrus_images/2ba49855ffb4a656500c014e4475f8b3bcb5e74a66d8c63f6802fb8fcc18f8cf.png)

延迟可以细分为区块时间（两个相邻区块的出块间隔）和最终确认时间（区块确定不会被回滚的时间），这两个变量很容易衡量。

但是要实际测量吞吐量，你需要一个基准的测量单位即「做什么的」吞吐量。

我们没有使用代币转账，而是使用以太坊上 Gas 消耗最高的产品之一：Uniswap V2，将其作为基准。如果你使用 Uniswap V2 上代币交易类型的交易来填满区块，每秒可以有多少笔交易被确认？

![](https://storage.googleapis.com/papyrus_images/c850eaea5886b05ac8295b6526a2df5c7bcfc666098a2cf644c742293a1f3943.png)

我们选择这个基准的原因是：1）它简单且易于测量；2）每个区块链上都运行这一个 Uniswap V2 风格的 AMM；3）它是常见的智能合约使用模式的典型。

对于大多数具有 Gas 模型的区块链，该方案的实操难度并不高：首先找到区块 Gas 上限和出块时间，推导出链的 Gas / 秒吞吐量。然后找到一个 Uniswap V2 风格的 AMM 并进行等价的 SwapETHforTokens 交易，获得每笔交易消耗的 Gas 数据，使用第一个数据除以第二个数据就能得出如果其区块被类似的 AMM 交易填满，可以实现每秒多少笔交易。

这并不是一个完美的基准，因为它没有考虑并行交易（Uniswap 在同一个池子里的交易是线性的），并且它也不能代表所有使用方式。但智能合约的使用是符合幂律分布的，并且最常用的 DApp 往往是 AMM。因此在一组基准测试中，我们认为该方案有助于全面了解性能。

事不宜迟，我们挨个来看：

![](https://storage.googleapis.com/papyrus_images/22722b9514382cc4ab077806e842815166ee0e7f1a1e1eaa789c6edab4b35c3d.png)

Uniswap V2 每秒交易量：平均 9.19，最大 18.38（因为 EIP-1559）

平均出块时间：13.2 秒（PoW，所以出块时间满足泊松分布）

最终确认时间：66 秒（大约的时间，以太坊区块无法完全被最终确认）

假设和方法：在与 EIP-1559 达成平衡的 1500 万 Gas 的上限下，以太坊每秒可进行 9.19 次交易；在 3000 万 Gas 上限下，可以实现每秒 18.38 次交易（但如果保持这个状态，费用将成倍增加），我们使用 swapExactETHForTokens 交易作为基准。假设矿工可以用 Uniswap 交易完美地填充 1500 万 Gas 上限的区块，每笔交易花费 123658Gas，这意味着我们可以将 1500 万 / 123658 数学公式: $ \\approx $121.3 个交易放入单个区块，假设每 13.2 秒出一个块，就意味着以太坊每秒可以处理 121.3/13.2 数学公式: $ \\approx $9.19 次 Uniswap V2 交易。

我们将对列表中的其他 EVM 兼容链使用类似的计算方式。

（注意：我们忽略了使用 Rollup 方案的情况，因为所有的 Layer 1 智能合约都可以添加 Rollup。）

![](https://storage.googleapis.com/papyrus_images/3833069f3f5cc5ba2bae0738db9f8bdce5fae7613e19ecd9ee9ba4ebe71fc752.png)

[Ubeswap](https://ubeswap.org/) 每秒交易：平均 24.93，最大 49.86（由于 EIP-1559）

平均出块时间：[5s](https://explorer.celo.org/)

完成时间：[5 秒](https://blockdaemon.com/docs/protocol-documentation/celo/how-celo-staking-works/)（Celo 使用 PBFT 机制的协议，可立即完成区块）

假设：[本次](https://explorer.celo.org/tx/0x73bb5889f9c4656b00d0577a841cdc3cdca2fa326c115acb0d6ebb29ee3e13d8/token-transfers)交易具有代表性，目标 Gas 1000 万，Gas 上限为 2000 万。

![](https://storage.googleapis.com/papyrus_images/ee4586482255a71e4722bba3c81fdf44462a59fca7a4c332f8a3077634efa60d.png)

Quickswap 每秒交易：平均 47.67，最大 [95.33](https://quickswap.exchange/#/swap)（由于 EIP-1559）

平均出块时间：[2.5s](https://polygonscan.com/chart/blocktime)

最终完成时间：Polygon 有两种完成交易的概念

1.  概率：这类似于大多数以太坊风格的区块链，其中规范链取决于完成的最多工作（最重）。在 Polygon 的案例中，Bor 层（即区块生产者层）的最终确定性取决于[难度较高的分叉](https://docs.polygon.technology/docs/contribute/bor/consensus/#resolving-forks)。
    
2.  可证明：这类似于 Tendermint/IBFT，在规范链上的绝对多数签名。通过检查点在 [Heimdall 层](https://docs.polygon.technology/docs/contribute/heimdall/checkpoint/)（这是 Polygon 的验证器管理和状态同步层）上进行。这些检查点被提交给以太坊。
    

重组和分叉可以发生在 Bor 层，但不能发生在 Heimdall 层。检查点是 Bor 链状态的快照。一旦一个块被包含在一个提交的检查点中，它就不能被重新组织（除非 数学公式: $ \\geq $1/3 的验证器节点是不诚实的）。检查点大约每 25 分钟被[提交一次](https://etherscan.io/address/0x86e4dc95c7fbdbf52e33d563bbdb00823894c287#events)。

假设：本次交易具有代表性，目标 Gas 1500 万，Gas 上限为 3000 万。

![](https://storage.googleapis.com/papyrus_images/ca0cc8c97dce5ed6986a188f13b4075ab04a369e15113ec98add08045dffad00.png)

[Trader Joe](https://traderjoexyz.com/#/home) 平均每秒交易 31.65 次，但由于其弹性出块时间，在最大吞吐量下， [Avalanche C](https://snowtrace.io/block/5175978) 链可以处理足够多的 Gas 以达到每秒 175.68 次交易。但是，将吞吐量维持在该水平会导致费用成倍增加。

平均出块时间：平均 [2 秒](https://snowtrace.io/chart/blocktime)（Avalanche 是一种具有[弹性出块时间的协议](https://support.avax.network/en/articles/5106526-measuring-time-in-smart-contracts)：只要支付足够的最低费用，就可以随时产生区块。Avalanche C 链曾有过[在 1 秒内产生超过 10 个区块](https://snowtrace.io/block/3058443)的阶段。)

最终完成时间：出块后约 1.75 秒。

**假设**：本次交易具有代表性，当前 Gas 上限为 800 万。

Avalanche 相对难以比较，因为它的区块生产机制与以太坊和 PoS 链很不一样。Avalanche 以最大吞吐量执行的操作与以平均吞吐量执行的操作之间存在很大差异（像以太坊这样已经实现 EIP-1559 的链的平均吞吐量是其平均吞吐量的 2 倍）。

![](https://storage.googleapis.com/papyrus_images/403e3ae930bf5012cf459762766961af16766ed10f3cd36204cb15846729cd3a.png)

[PancakeSwap](https://pancakeswap.finance/) 每秒交易次数：194.60（币安智能链不使用 EIP-1559，所以这是一个固定数字）

平均出块时间：[3s](https://bscscan.com/chart/blocktime)

最终完成时间：[75s](https://docs.binance.org/smart-chain/guides/concepts/consensus.html#security-and-finality)

**假设**：本次交易具有代表性，当前 Gas 上限为 8000 万。

以上就是各个 EVM 兼容链的基准测试。由于所有的 EVM 链都使用相同的 Gas 模型，我们可以将 Gas / 秒视为吞吐量的基准。下图中实心条表示目标吞吐量，空心条表示吞吐量的上限。

![](https://storage.googleapis.com/papyrus_images/b522521345416ef248fbe8e810fb3caf9cdac6f0c5ca66809bfe402a18dd71f7.png)

由此看来 EVM 性能的天花板就是 BSC（现改名为 BNB Chain），但如果你需要更高性能的智能合约，EVM 可能就不适用了。

![](https://storage.googleapis.com/papyrus_images/37fe90021d47f8586afbc2a682c6a05fef92a14de3f9c355ee7b105406e3d242.png)

Solana 每秒交易次数：273.34

出块时间：590 毫秒

最终确认时间：13 秒（Solana 实现了一种更快的「[optimistic confirmations](https://mobile.twitter.com/aeyakovenko/status/1386100005732192268)」模式，只需要作恶的验证者不超过大约 4.7%，大部分 DApp 都接受这个阈值）

下面解释一下我们如何计算这些数值，这次有点复杂。

我们首先想为 Solana 找到一个等效的「Gas 上限」。你在区块浏览器上找不到任何这样的数值。我们首先询问了一些我们认识的 Solana 开发人员，但似乎没有人确切知道是否存在这样的限制。于是我们卷起袖子踏上了一探究竟的旅途。

我们首先了解到 Solana 确实有类似 Gas 的东西，称为计算单元 (CU)，这里是他的定义。从我们与验证者的对话来看，大多数人似乎认为 Solana 验证是「争分夺秒地在区块时间内打包尽可能多的交易」，但实际的限制是每个区块只能包含 [4800 万个 CU](https://github.com/solana-labs/solana/blob/05f04a22b75fc0fa4879186017c2fdc250c57929/runtime/src/block_cost_limits.rs#L56)。

其次，只有有限数量的 CU 可在单个块中写入单个帐户。这个限制是为了防止过多的交易写入同一个账户，从而减少一个块的并行性 —— 尽管这正是在大规模拥堵期间发生的事情，例如在流行的 IDO 期间，当所有交易都在为使用单个合约竞争时。

每个帐户的限制为 [12M](https://github.com/solana-labs/solana/blob/186bb19965998ff8128b864e212127aa1b267e4b/runtime/src/block_cost_limits.rs#L61)。如果您遵循这个 12M 帐户 CU 限制、主网上 590 毫秒的[区块时间](https://explorer.solana.com/)以及每笔在 Orca 上的交易成本为 [74,408 CU](https://explorer.solana.com/tx/44yDxg5AydfCdEA5KSxTV2jfGc5r8tG4he7WnXJBLPVJPsCRmZxYWxvUrS1BwgBytkRivzbfKAj5QHRBfZ9yDvhk?cluster=devnet)，我们得出的理论限制为 273.34 交换 / 秒。

这个数字似乎低于预期！为了让我们相信这个数字，我们希望通过经验验证这种方法。

为了确认我们正确地测量了它的性能，我们决定直接对 Solana 进行垃圾邮件攻击测试。出于显而易见的原因，我们不想向主网发送垃圾邮件，因此我们针对 Solana 开发网。请注意，Solana 的开发网运行在较小的集群上，因此比主网具有更快的出块时间（[380 毫秒](https://imgur.com/mteaxIC)），与主网相比，这将提高其性能。给定 380 毫秒的阻塞时间，我们应该期望开发网每秒确认 424.40 笔交易。

我们在开发者网络上向 Orca SOL-ORCA 交易对发送垃圾邮件，以查看我们可以在单个区块中进行多少 Orca 交易，然后推断为最大吞吐量。

![](https://storage.googleapis.com/papyrus_images/23716117d646c5b9a545cca326eac45791bbaa6589ac7992818272baf28dfdf3.png)

我们设法达到的最高数据是单个区块中的 184 次交易。假设出块时间为 380 毫秒，我们得出在开发者网络上 484.21 笔交易 / 秒的数据。（请注意，出块时间并不准确，因此这些数字存在一些偏差。如果您在我们进行最多交易的 3 个区块中取平均值，它看起来更像是每秒 381 次交易，这似乎更合理）。这似乎证实了我们的分析方法是正确的（约 10-15% 的增量），因此这意味着 Solana 的主网可能在 AMM 上执行大约 273 次交易 / 秒。

当然这只是一次测试运行的结果，[这是我们的代码](https://github.com/gengmoqi/solana-orca) —— 我们希望您也尝试一下并与我们分享您的结果。

这里我们隐去了大量细节，如果没有我们在 Blockdaemon 的朋友的帮助，这一切都是不可能实现的。如果您想了解执行此操作所需的详细信息（以及更深入地了解 Solana 内部结构），请查看[第 2 部分](https://medium.com/dragonfly-research/spamming-solana-a-trip-report-d05e0455a3ba)，我们将在其中介绍技术细节。

可能你看到这些的时候会疑惑，Solana 的 TPS 不是 3000 吗？

区块浏览器衡量 Solana 的 TPS 的方式可能会产生误导 —— 它将内部共识消息视为交易，这是其他区块链所没有的。Solana 大约 [80% 的吞吐量](https://dune.xyz/queries/396417/756581)是共识消息。减去这些，TPS 数值约为 600，其中大部分是在 Serum 上非常低成本的交易。但就算各种其他的合约，Solana 在性能上依然有着很大的优势。

![](https://storage.googleapis.com/papyrus_images/7f9ec60a6b3983f6f9d7df8262c1bedfe63f54115c83a8e68e320d25e0a8b71f.png)

**那么这一切的结论是什么？**

首先，不要觉得这些数据都是对的，可以自己算一算。

其次，请记住，所有这些区块链都是在发展的。它们不断被优化，技术也在迅速发展，而任何基准都是「即时快照」。我们希望看到更多独立组织创建标准化基准，本文提出的基准已经是我们能想到最好的方案了。

第三，请注意，这些区块链之间的性能差异并不像宣传的那么大。以太坊和最好的链之间的性能差异大约是 10-25 倍，而不是 100 倍或 1000 倍。没有人能从线性化的虚拟机事务​​中获得如此出色的性能。未来可能需要更多的工作和优化。

第四，如果你想要真正的高性能，你必须放弃 EVM。我们在这里只对 Solana 进行了基准测试，但还有其他非 EVM Layer 1 公链，例如 NEAR 和 Terra，它们也实现了更高的性能。但与 Solana 一样，他们无法从围绕 EVM 建立的工具和生态系统中受益。（尽管 NEAR 拥有与 EVM 兼容的 Aurora ，并且其他 Layer 1 公链也正在尝试开发类似的虚拟化 EVM 实例。）

第五，用户现在对非以太坊 Layer 1 的性能并不那么敏感。他们更关心生态系统的整体实力、良好的用户体验和低费用。这些区块链目前没有在性能上竞争，因为实际上它们的容量上限都没有被触及，除非在罕见的峰值期间，例如 IDO 或市场崩溃。

我们预计所有主要 Layer 1 公链的性能都会随着时间的推移而提高，因为开发团队会花费越来越多的时间来调整典型使用方式的性能。这些区块链中的每一个在早期都没有得到很好的优化。

但总的来说，我的印象是：以太坊是智能合约操作系统的 MS-DOS。但是当前的区块链时代将我们带入了 Windows 95 时代。

![](https://storage.googleapis.com/papyrus_images/24f35d2607fa69ac187b923e40f7b894cbbe6523d1fc33a116dd41d555a415cc.png)

下一代区块链展现出了明显的进步，但离被主流接受还有很长的一段路要走。

_披露：Dragonfly Capital 可能持有本文中提及资产的仓位。_

> 原文链接：
> 
> [https://medium.com/dragonfly-research/the-amm-test-a-no-bs-look-at-l1-performance-4c8c2129d581](https://medium.com/dragonfly-research/the-amm-test-a-no-bs-look-at-l1-performance-4c8c2129d581)

---

*Originally published on [Foresight News](https://paragraph.com/@foresight-news/dragonfly-amm-l1)*
