ITADN
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈

solar

Crates.io Downloads MIT License Apache-2.0 License Actions Status Telegram Chat

极速、模块化且对贡献者友好的 Solidity 编译器,使用 Rust 编写。

Solar cover

特性与目标

[!CAUTION] Solar 正处于积极开发阶段,功能尚不完整。 请使用它来加速您的开发工作流和工具链。 请勿在生产环境中使用。

  • ⚡ 即时编译和低内存占用(基准测试)
  • 🔍 富有表现力且实用的诊断信息
  • 🧩 模块化、基于库的架构
  • 💻 简单且易于修改的代码库
  • 🔄 兼容最新 Solidity 语言破坏性版本(0.8.*)

终端截图,显示 Solar 使用 hyperfine 生成 ABI 的速度比 solc 快 40 倍

快速开始

Solar 可通过命令行界面使用,或作为 Rust 库使用。

库的使用

您可以通过在 Cargo.toml 中添加以下内容,将 Solar 添加到您的 Rust 项目中:

[dependencies]
solar = { version = "=0.1.8", package = "solar-compiler", default-features = false }

或通过 CLI:

cargo add "solar-compiler@=0.1.8" --rename solar --no-default-features

你可以在 examples 目录中查看将 Solar 作为库使用的示例。

二进制文件使用

macOS、Linux 和 Windows 的预构建二进制文件可在 releases page 上获取,并可通过以下命令安装:

  • 在 macOS 和 Linux 上:
    curl -LsSf https://paradigm.xyz/solar/install.sh | sh
  • 在 Windows 上:
    powershell -c "irm https://paradigm.xyz/solar/install.ps1 | iex"
  • 对于特定版本:
    curl -LsSf https://paradigm.xyz/solar/v0.1.8/install.sh | sh
    powershell -c "irm https://paradigm.xyz/solar/v0.1.8/install.ps1 | iex"

你也可以使用 cargo binstall

  • 最新版本:
    cargo binstall solar-compiler
  • 对于特定版本:
    cargo binstall solar-compiler@0.1.8

或者从源代码构建 Solar:

  • 从 crates.io:
    cargo install solar-compiler --locked
  • 从 GitHub:
    cargo install --git https://github.com/paradigmxyz/solar --locked
  • 从 Git 检出:
    git clone https://github.com/paradigmxyz/solar
    cd solar
    cargo install --locked --path crates/solar

安装完成后,查看可用选项:

solar -h

以下是几个示例:

# Compile a single file and emit ABI to stdout.
solar Counter.sol --emit abi

# Compile a contract through standard input (`-` file).
echo "contract C {}" | solar -
solar - <<EOF
contract HelloWorld {
    function helloWorld() external pure returns (string memory) {
        return "Hello, World!";
    }
}
EOF

# Compile a file with a Foundry project's remappings.
solar $(forge re) src/Contract.sol

编辑器集成

VS Code 和 Zed 的编辑器集成位于 editors/。它们通过从本地系统启动 solar lsp 来提供 Solidity 语言支持,或者对于 Zed,当 PATH 上不可用时,下载已发布的二进制文件。

C API、WASM 和 JavaScript 用法

solar-capi crate 通过一个兼容 Solidity 的 C API 暴露编译器。 相同的 ABI 也是 WebAssembly 构建和兼容 soljson 的 JavaScript 包装器所使用的边界。

C 头文件是 ABI 的权威来源: crates/capi/include/libsolc.h。该 API 接受 Standard JSON 输入并返回 Standard JSON 输出,与 Solidity 的 libsolc 和原始 soljson.js 构建所使用的接口相匹配。与 Solidity 一样,客户端代码通过头文件中描述的 C API 显式管理内存。

Solidity 将 JavaScript 编译器构建分发为 soljson.js 文件。现代 构建是通过 JavaScript 包装器加载的 WebAssembly 模块,wasm 字节以 Module.wasmBinary 形式提供。JavaScript 包 solc-js 然后在该原始模块之上构建更高级别的 API。

此仓库在发布中将 wasm 分发作为 solar-wasm.tar.gz 提供。 该归档包含:

  • soljson.js:一个打包的、兼容 soljson 的 JavaScript 文件,内嵌了 wasm。
  • solar.wasm:原始的 WebAssembly 模块。
  • soljson-wrapper.js:用于自行加载 solar.wasm 的 JavaScript 包装器。

使用 wasm 和 JavaScript 分发有两种方式:

  1. 从发布版本中下载 solar-wasm.tar.gz 并解压所需的文件。 使用 soljson.js 以获取与 solc-js 兼容性最高的路径,或者在需要控制 wasm 加载时使用 solar.wasm 配合 soljson-wrapper.js

  2. 从源代码构建相同的文件:

rustup target add wasm32-unknown-unknown
scripts/wasm/dist-wasm.sh

这会在 target/dist/ 下生成相同的文件。该脚本使用一个已导出、可增长的 WebAssembly 表进行构建,以便安装 JavaScript 回调,然后将 wasm 字节打包到 soljson.js 中。

直接使用打包后的 soljson.js

const solar = require("./soljson.js");

const output = solar.compile(JSON.stringify({
  language: "Solidity",
  sources: {
    "A.sol": { content: 'import "B.sol"; contract A is B {}' },
  },
  settings: { outputSelection: { "*": { "*": ["abi"] } } },
}), {
  import(path) {
    if (path === "B.sol") {
      return { contents: "contract B {}" };
    }
    return { error: `source not found: ${path}` };
  },
});

对于自定义 wasm 加载,请使用发布归档中的 soljson-wrapper.js 或 从源码构建的 crates/capi/soljson.js

在 Node 中,通过打包文件所使用的相同 Module.wasmBinary 钩子加载独立的 wasm 字节:

const fs = require("node:fs");

globalThis.Module = {
  wasmBinary: fs.readFileSync("./solar.wasm"),
};
const solar = require("./soljson-wrapper.js");
delete globalThis.Module;

const output = solar.compile(JSON.stringify({
  language: "Solidity",
  sources: {
    "A.sol": { content: 'import "B.sol"; contract A is B {}' },
  },
  settings: { outputSelection: { "*": { "*": ["abi"] } } },
}), {
  import(path) {
    if (path === "B.sol") {
      return { contents: "contract B {}" };
    }
    return { error: `source not found: ${path}` };
  },
});

在浏览器中,提供 solar.wasmsoljson-wrapper.js,获取 wasm 字节, 分配 globalThis.Module = { wasmBinary },然后加载包装脚本。

该包装器暴露了 solc-js 风格的 Standard JSON 编译入口点以及 元数据辅助函数。旧的低级 solc-js 入口点被有意设置为 null

路线图

你可以在 固定的 GitHub issue 中找到更详细的列表。

  • 前端
    • 词法分析
    • 解析
    • 语义分析
      • 符号解析
      • 类型检查
      • 静态分析
  • 中端
  • 后端

Semver 兼容性

Solar 的版本控制跟踪的是二进制的兼容性,而不是 API。 如果将其用作库,请务必使用 = 版本要求运算符来固定版本。

支持的 Rust 版本 (MSRV)

Solar 始终致力于保持与最新稳定版 Rust 的同步。

最低支持 Rust 版本 (MSRV) 可能会随时更新,以便我们可以利用 Rust 中的新特性和改进。

贡献

欢迎并高度赞赏贡献。要开始,请查看 贡献指南

支持

遇到问题?请查看 GitHub 上的现有 issue, 或者随时 打开一个新的

你也可以在 Telegram 上寻求帮助。

许可证

根据 Apache License, Version 2.0MIT license 任选其一授权。
除非您明确另有说明,否则您有意提交以纳入这些 crate 的任何贡献, 如 Apache-2.0 许可证所定义, 将按上述方式双重授权,不附加任何额外条款或条件。