【区块链安全 | 第十二篇】安装 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.solcjssolc 不兼容 ,其命令行选项不同,因此一些工具(如 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.通过 keccak256sha256 哈希值校验文件完整性:

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.jslist.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
相关推荐
AORO_BEIDOU1 小时前
卫星电话究竟是“锦上添花”?还是“刚需之选”?
科技·安全·智能手机·信息与通信
Doris Liu.7 小时前
如何检测代码注入(Part 2)
windows·python·安全·网络安全·网络攻击模型
秋说9 小时前
【区块链安全 | 第八篇】多签机制及恶意多签
安全·区块链
68岁扶墙肾透9 小时前
Java安全-FastJson反序列化分析
java·安全·web安全·网络安全·网络攻击模型·安全架构·fastjson
sma2mmm10 小时前
微前端实现方案对比Qiankun VS npm组件
前端·前端框架·npm
月起星九10 小时前
为什么package.json里的npm和npm -v版本不一致?
前端·npm·node.js
CryptoPP12 小时前
基于WebSocket的金融数据实时推送系统架构设计对接多国金融数据API
websocket·网络协议·金融·系统架构·区块链
nington0112 小时前
为Splunk登录开启OTP二次验证,增强访问安全
安全
浪子小院13 小时前
区块链技术之分布式数字身份:构建数字世界的信任基石
区块链
智联视频超融合平台14 小时前
视频联网平台智慧运维系统:智能时代的城市视觉中枢
运维·网络协议·安全·音视频·智慧城市·视频编解码