【区块链安全 | 第十二篇】安装 Solidity 编译器(npm | docker | Linux | macOS)

文章目录

    • 版本管理
    • [Remix 编译器](#Remix 编译器)
    • 其他安装方式
      • [1. 使用 npm / Node.js 安装](#1. 使用 npm / Node.js 安装)
      • [2. 使用 Docker 安装](#2. 使用 Docker 安装)
          • [在本机编译 Solidity 文件](#在本机编译 Solidity 文件)
          • [使用标准 JSON 接口(推荐)](#使用标准 JSON 接口(推荐))
      • [3. 使用 Linux 包管理器安装](#3. 使用 Linux 包管理器安装)
          • [Ubuntu(PPA 源)](#Ubuntu(PPA 源))
          • [Arch Linux](#Arch Linux)
          • [Snap 包(不推荐)](#Snap 包(不推荐))
      • [4. macOS 上的 Solidity 安装](#4. macOS 上的 Solidity 安装)
      • [4.1 通过 Homebrew 安装](#4.1 通过 Homebrew 安装)
        • [4.2 安装旧版本(0.4.x / 0.5.x)](#4.2 安装旧版本(0.4.x / 0.5.x))
        • [4.3 安装特定版本](#4.3 安装特定版本)
      • [5. Solidity 静态二进制文件](#5. Solidity 静态二进制文件)
      • [6. 从源码构建编译器](#6. 从源码构建编译器)

版本管理

Solidity 版本遵循 语义化版本控制(Semantic Versioning)。此外,在主版本号为 0(即 0.x.y)的情况下,补丁级别的发布不会引入破坏性更改。这意味着可以预期使用版本 0.x.y 编译的代码,在 0.x.z(z > y)的情况下仍然可以编译。

除了正式发布的版本,官方还提供每夜构建版本(nightly builds),让开发者能够提前尝试新功能并提供反馈。不过,这些每夜构建包含开发分支中的最新代码,并不保证始终可用,这些版本可能包含未记录或已损坏的更改,最终可能不会出现在正式版本中。因此,每夜构建版本不适用于生产环境。

在部署合约时,建议使用最新发布的 Solidity 版本。因为 Solidity 仍在快速发展,新版本会定期引入破坏性更改、新功能和错误修复。目前 Solidity 仍使用 0.x 版本号来反映这一快速变化。

Remix 编译器

对于小型合约 和快速学习 Solidity ,推荐使用 Remix。

我们可以直接在线访问 Remix,无需安装任何软件。如果希望在离线环境 下使用 Remix,可以访问 Remix 离线版本 并按照页面上的说明进行操作。

Remix 也是测试每夜构建版本的便捷选项,且无需安装多个 Solidity 版本。

其他安装方式

1. 使用 npm / Node.js 安装

如果想要一种便捷且可移植 的方式来安装 Solidity 编译器,可以使用 npm 安装 solcjs:

bash 复制代码
npm install --global solc

注意 :

1.安装后,命令行可执行文件名称是 solcjs,而不是 solc。

2.solcjs 与 solc 不兼容 ,其命令行选项不同,因此一些工具(如 geth)无法与 solcjs 兼容。

3.solc-js 是从 C++ 版本的 solc 通过 Emscripten 转译得到的,两者使用相同的编译器源码。

4.solc-js 适用于 JavaScript 项目(例如 Remix)。

5.更多信息可参考 solc-js 仓库:

bash 复制代码
https://github.com/ethereum/solc-js

2. 使用 Docker 安装

Solidity 编译器的 Docker 镜像可以从 ethereum/solc 获取。

要使用最新稳定版,可以运行以下命令:

bash 复制代码
docker run ethereum/solc:stable --help

注意 :

1.可以使用特定版本 的 Docker 镜像,例如 ethereum/solc:0.8.23。

2.建议使用 stable 标签,以确保获取的是最新的稳定版本,避免使用过时的版本。

使用 Docker 进行 Solidity 编译可以有以下两种方式。

在本机编译 Solidity 文件

可以通过挂载本地文件夹的方式,使用 Docker 进行 Solidity 编译,例如:

bash 复制代码
docker run \
    --volume "/tmp/some/local/path/:/sources/" \
    ethereum/solc:stable \
        /sources/Contract.sol \
        --abi \
        --bin \
        --output-dir /sources/output/
使用标准 JSON 接口(推荐)

在工具链中使用 Solidity 编译器时,使用 JSON 接口:

bash 复制代码
docker run ethereum/solc:stable --standard-json < input.json > output.json

这样可以避免挂载本地目录,只要 JSON 输入是自包含的(不依赖外部文件)。

3. 使用 Linux 包管理器安装

可以在 Solidity 官方发布页下载二进制文件

bash 复制代码
https://github.com/ethereum/solidity/releases
Ubuntu(PPA 源)

要安装最新稳定版本的 solc,可以运行:

bash 复制代码
sudo add-apt-repository ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install solc

要安装每夜构建版本(开发版),可以运行:

bash 复制代码
sudo add-apt-repository ppa:ethereum/ethereum
sudo add-apt-repository ppa:ethereum/ethereum-dev
sudo apt-get update
sudo apt-get install solc

注意 :某些 Linux 发行版维护了自己的 Solidity 包,这些包通常由维护者保持更新,但不是官方维护的。

Arch Linux

Arch Linux 的 AUR(Arch User Repository)提供了两个 Solidity 相关的包:

  • solidity(开发版)
  • solidity-bin(二进制版本)

注意 :AUR 包是用户贡献的非官方包,请谨慎使用。

Snap 包(不推荐)

目前 Solidity 提供了 solc 的 Snap 包,但该 Snap 包未被维护。

可以运行:

bash 复制代码
sudo snap install solc

要安装最新的开发版,可以运行:

bash 复制代码
sudo snap install solc --edge

注意 :Snap 使用**严格封闭(strict confinement)**模式,这种模式虽然更安全,但存在一些限制,比如只能访问 /home 和 /media 目录。

更多信息请参考 Snap 官方文档:

bash 复制代码
https://snapcraft.io/docs/security-policy-and-sandboxing

4. macOS 上的 Solidity 安装

我们通过 Homebrew 分发 Solidity 编译器,目前仅支持从源代码构建 ,不提供预编译的二进制文件(bottles)。

4.1 通过 Homebrew 安装

更新 Homebrew:

bash 复制代码
brew update
brew upgrade

然后添加 Ethereum 的 Homebrew 仓库并安装 Solidity:

bash 复制代码
brew tap ethereum/ethereum
brew install solidity

// 如果需要安装旧版本或特定版本 则阅读 4.2 和 4.3 的内容,否则跳过。
4.2 安装旧版本(0.4.x / 0.5.x)

如果你需要 Solidity 0.4.x 或 0.5.x 版本,可以使用以下命令:

bash 复制代码
brew install solidity@4  # 安装 0.4.x 版本
brew install solidity@5  # 安装 0.5.x 版本
4.3 安装特定版本

如果你需要特定版本的 Solidity,可以直接从 GitHub 下载 Homebrew 配方(Formula)。

步骤如下

1.查看 Solidity 版本历史

在 GitHub 上查看 `solidity.rb` 的提交记录,找到你需要的版本的提交哈希值(commit hash)。

bash 复制代码
https://github.com/ethereum/homebrew-ethereum/commits/master

2.克隆 Homebrew Ethereum 仓库并切换到指定版本

bash 复制代码
git clone https://github.com/ethereum/homebrew-ethereum.git
cd homebrew-ethereum
git checkout <你的提交哈希值>

3.安装特定版本

bash 复制代码
brew unlink solidity  # 先卸载当前版本
brew install solidity.rb  # 安装特定版本

5. Solidity 静态二进制文件

官方维护了一个静态编译版本存储库solc-bin:

bash 复制代码
https://binaries.soliditylang.org

其中包含所有支持的平台的历史版本和当前版本编译器。该存储库也提供每夜构建版本(nightly builds)。

特点

1.直接下载可用,无需额外安装或解压(部分旧版 Windows 需要 DLL 文件)。

2.支持第三方工具,内容通过 https://binaries.soliditylang.org 镜像,支持 HTTP 和 HTTPS。

3.高向后兼容性,文件一旦添加不会删除或移动,除非是损坏文件。

4.提供多种下载方式:

  • HTTPS 下载:https://binaries.soliditylang.org/
  • IPFS 下载,实现去中心化存储,如 dweb:/ipfs/QmTLs5MuLEWXQkths41HiACoXDiH8zxyqBHGFDRSzVE5CS

示例:获取 Solidity 0.7.4 版本的二进制文件

json 复制代码
{
  "path": "solc-emscripten-wasm32-v0.7.4+commit.3f05b770.js",
  "version": "0.7.4",
  "build": "commit.3f05b770",
  "longVersion": "0.7.4+commit.3f05b770",
  "keccak256": "0x300330ecd127756b824aa13e843cb1f43c473cb22eaf3750d5fb9c99279af8c3",
  "sha256": "0x2b55ed5fec4d9625b6c7b3ab1abd2b7fb7dd2a9c68543bf0323db2c7e2d55af2",
  "urls": [
    "dweb:/ipfs/QmTLs5MuLEWXQkths41HiACoXDiH8zxyqBHGFDRSzVE5CS"
  ]
}

说明

1.下载地址为:

bash 复制代码
https://binaries.soliditylang.org/emscripten-wasm32/solc-emscripten-wasm32-v0.7.4+commit.3f05b770.js

2.通过 keccak256 或 sha256 哈希值校验文件完整性:

bash 复制代码
keccak256sum solc-emscripten-wasm32-v0.7.4+commit.3f05b770.js
sha256sum solc-emscripten-wasm32-v0.7.4+commit.3f05b770.js

避免使用以下过时路径:

  • bin/ 目录:应使用 emscripten-wasm32/(WebAssembly 性能更佳)。
  • wasm/ 目录:应使用 emscripten-asmjs/ 或 emscripten-wasm32/。
  • list.js 和 list.txt:应使用 list.json 获取完整信息。

同时,https://ethereum.github.io/solc-bin/ 站点已停止更新。该站点在 Solidity 0.7.2 版本后停止维护,不再提供新版本或每夜构建。可以使用 https://binaries.soliditylang.org

6. 从源码构建编译器

安装教程:

bash 复制代码
https://docs.soliditylang.org/en/latest/installing-solidity.html#building-from-source
相关推荐
mennekes2 小时前
临时用电线路标识:插头颜色、钟面标识配套规范
运维·网络·科技·安全·制造
是真的小外套5 小时前
网络安全实战第7期:Hydra爆破SSH实战
安全·web安全·ssh
jimmyleeee6 小时前
Agent安全之七:当智能体之间开始“互相信任”------深入理解 OWASP ASI07 不安全的智能体间通信
人工智能·安全
卓豪终端管理7 小时前
终端零信任落地实践:应用控制与权限管理的五层管控体系
安全·web安全
深蓝AI7 小时前
一个版本号失守:Claude Code 2.1.313 扩展后门事件,开发者机器如何变成别人的 SSH 入口
安全·程序员
金海星科技7 小时前
从“装摄像头“到“用摄像头管安全“:船舶智能监控的范式变化
安全
jimmyleeee7 小时前
Agent安全之六:(ASI06)记忆与上下文投毒——当 AI 把“昨天的错误”当成“今天的真理”
网络·人工智能·安全
QYR-分析8 小时前
7.0% 年增!新能源汽车 EPB 电机赛道升温,安全执行件的博弈正在底盘上演
安全·汽车
福建佰胜张工9 小时前
深度解析 Allen-Bradley 150-B135NBDA 智能电机控制器:选型、参数与工业应用
运维·数据库·单片机·嵌入式硬件·安全·自动化
智慧光迅AINOPOL10 小时前
POF光电复合缆多业务承载原理
网络·安全·智能路由器