返回资讯中心
外部精选
软件工程
#开发者实时流

Solar v0.3 发布:用 Rust 写的 Solidity 编译器,构建速度提升 100 倍

来源标题:Solar: 100× Faster Solidity

Paradigm 团队发布用 Rust 编写的 Solidity 编译器 Solar v0.3,这是首个能生成 EVM 字节码的版本,并已集成进 Forge。官方称在 via-IR 模式下,对六个真实项目构建平均比 solc 快 100 倍、最高 159 倍,生成的合约运行省 5% gas、部署成本低 26%、体积小 29%。同时推出 forge lsp,把 Solar 的分析能力带入任意编辑器。

Hacker News 最新torutofu2026/11/3 · 3 天前21 分钟阅读

以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。

作者:DaniPopes、djtodoro、Georgios Konstantopoulos

两年前,我们推出了 Solar ☀️,一个快速、模块化的 Solidity 前端。此后,我们添加了一个完整的优化编译器,其中间端带有类型系统、对 Solidity 建模,后端则对 EVM 建模。今天我们发布 Solar v0.3——我们用 Rust 编写的 Solidity 编译器,也是第一个能生成 EVM 字节码的版本。它随 Forge 一同发布,带来了:

构建速度提升 100 倍:在启用 via-IR 的情况下,Solar 构建六个真实世界的 Solidity 项目,平均比 solc 快 100 倍,最高快 159 倍。 默认生成更便宜的合约:Solar 生成的代码运行所需 gas 少 5%,部署成本低 26%,体积比 solc 小 29%。平均而言,它也胜过了我们测试过的所有其他 Solidity 编译器。 安全代码胜过汇编:用普通、带检查的 Solidity 重写 Solady(不借助内联汇编或 unchecked 数学),再用 Solar 编译,比原始版本用 solc 编译少消耗 19% 的 gas。 Forge 中的语言服务器:forge lsp 将 Solar 的分析能力带到任何编辑器中。

编译是智能合约开发的内层循环:forge build 和 forge test 都要等待它完成。启用 solc 的 via-IR 流水线以获得更便宜的代码时,每次构建往往要花几十秒。正如我们在发布 Solar 时所说,solc 已成为 Foundry 的瓶颈。

我们用 Solar 和 solc 的 via-IR 流水线编译了六个真实世界的项目:

Zoom solc 0.8.38,Solar 位于提交 0303bb7d。Solar 使用默认的八个线程,solc 使用一个线程。

启用 via-IR 时,solc 在 Uniswap v4 core 和 Seaport 上因“Stack too deep”而失败。Solar 在 0.35 秒内编译完 Uniswap v4;在我们测试的五个编译器中,只有 Solar 能用 via-IR 构建 Seaport。

在各项目自身的设置下(其中许多使用 solc 更快的 legacy 流水线),Solar 平均快 30 倍以上,所需内存约为 solc 的三分之一。在单线程而非默认八线程的情况下,Solar 仍比启用 via-IR 的 solc 快 19 倍,在各项目自身设置下快 7 倍。

我们构建了一套基准测试套件,使用了来自 OpenZeppelin、Solady、Aave、Arbitrum、Maple、Tempo 等项目的合约。该套件用每个编译器编译这些合约,并将其部署到本地节点,然后对每个构建重放相同的交易,并检查结果是否一致。

在各项目自身的编译器设置下,Solar 在所有这些工作负载上都胜过 solc:

Zoom 计算密集型代码的 gas 降幅最大。固定的交易成本限制了简单代币调用的 gas 节省。用 Solar 编译的合约部署成本也低约四分之一。

Solar 生成的代码执行的 opcode 也比 solc 少,其中 JUMP 指令只有其十分之一,因此 EVM 实现运行它的速度更快。在 evm2 解释器中,相同的调用消耗的 CPU 周期也更少:

Zoom 开发者常常手动优化代码以绕开编译器的局限。Solar 会自动处理其中许多优化。Matter Labs 的 solx 发布文章中的第一个例子是一个阶乘函数,它在每次循环迭代中都写入存储:

contract FactorialStorage { uint256 public result; function computeFactorial(uint256 n) external { result = 1; for (uint256 i = 2; i <= n; ++i) { result *= i; }

在那篇文章中,solx 需要借助 unchecked 数学才能把存储写入移出循环。Solar 在保留所有溢出检查的情况下做到了这一点:它把 result 留在栈上,只在最后写入一次存储,因为 revert 无论如何都会撤销此前的写入。

Zoom Solar 与其他编译器相比如何?

我们很高兴看到更多团队投资于 Solidity 编译器。slang-solx 最初是 Matter Labs 的 solx,现在由 Hardhat 背后的团队 Nomic Foundation 维护。Nomic 还在基于他们自己的前端 Slang 重写它,我们测试了该重写的十月预览版。oksolc 是 solc 到 Zig 的移植。在相同的输入和设置下,Solar 构建整个项目的速度比它们都快,其代码运行和部署的成本也更低:

Zoom 版本:solc 0.8.38、slang-solx 0.1.8、Slang 预览版(构建 5e6ec5e1)、oksolc 0.2.2,Solar 位于提交 0303bb7d。

这里我们对所有编译器使用了相同的设置,并启用了 via-IR。对于为 solc 的 legacy 流水线构建的项目,via-IR 生成的代码更昂贵。这就解释了为什么 solc 的 gas 和部署数据与早先的结果不同。slang-solx 在一项工作负载上胜过了 Solar,Slang 预览版则在三项上胜出。

完整结果在我们的基准测试套件中。

如今,最便宜的 Solidity 依赖内联汇编和 unchecked 数学。像 Solady 这样的库通过手工优化来节省 gas,但汇编跳过了编译器的检查,一个错误就可能让用户损失资金。我们认为这项工作应该由编译器来完成。

为了验证这一想法,我们用普通、带检查的 Solidity 重写了 Solady(safe Solady)。汇编和 unchecked 仅保留在标记为待审查的小函数中,用于完成 Solidity 无法表达的操作,例如读取原始存储槽或向上冒泡 revert。这次重写保留了 Solady 暴露的每一个函数。

随后我们对两个版本运行了 Solady 自己的测试套件,结果完全相同。用 Solar 编译后,safe Solady 在几乎每一项测试中都比用 solc 编译的原始版本更便宜:

Zoom Solar 是如何构建的?

与 rustc 和 LLVM 一样,Solar 通过若干中间表示(IR)逐层降低代码:

Zoom MIR 是你合约的带类型视图,它仍然知道什么是 mapping、什么是带检查的加法,因此可以消除冗余检查,并让值远离存储和内存。EVM IR 则贴近机器层,处理栈、区块布局和窥孔重写。把每项优化放在它所属的层级,使编译器保持小巧且易于测试。

(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →