如何通过源代码编译来安装 Solidity 编译器?

428 阅读7分钟

在这篇文章中,我们将生产,即从源代码中编译一个 Solidity 编译器。平台编译并不是普通计算机用户明确地经常做的操作,如果有的话。然而,在一些不寻常的情况下,我们需要特定的软件的(以前的)版本,或者它应该在我们的异国环境中运行,等等。

不管是什么原因,在编译Solidity编译器之前,我们将通过列出和解释每个软件的先决条件。

更有甚者,我们将按照详细的步骤来安装所有的先决条件,在安装后检查它们的状态,最后执行主要的节目:编译Solidity编译器(通过遵循一个较短和一个较长的方法)。

这是安装 Solidity 编译器的第三种方式。

我们不能保证这将在您的机器上工作。请自行承担风险。我们只分享对我们有效的方法,但由于对许多外部(第三方)库的依赖,运行这些命令会带来安全风险。

如果有疑问,我们建议你使用前面提到的教程。

编译 Solidity 编译器的先决条件

这里是最后一个方法,即从源代码构建 Solidity 编译器。在我们继续进行之前,我们必须检查我们是否满足先决条件(为了文章的需要,在 Ubuntu 20.04 上)。

  1. Cmake v3.13+,一个跨平台的构建文件生成器。
  2. Boost v1.65+,C++库。
  3. Git;一个用于检索源代码的命令行工具。
  4. z3 v4.8+,一个用于SMT检查器的SMT解算器(可选)。
  5. cvc4,一个用于SMT检查器的SMT解算器(可选)。
  6. ccache, 加快了C/C++的重复构建。
  7. python,用于z3源代码编译。

有很多新的元素和术语,让我们来探讨一下它们是什么,以及它们在编译我们的Solidity编译器中的作用是什么。

💡 注意:我们将假设我们所使用的Solidity编译器在 以上,以避免在链接过程中出现错误。0.5.10

ℹ 信息。链接是链接过程中的一个阶段,链接器将编译器产生的对象文件,生成一个库或一个可执行文件。

ℹ 信息:"CMake是一个开源的、跨平台的工具系列,旨在构建、测试和打包软件。CMake用于使用简单的平台和独立于编译器的配置文件来控制软件的编译过程......"

Cmake是一套工具,使我们能够从源代码中生成我们的Solidity编译器。

ℹ 信息:Boost是一个组织,也是一个C++同行评议库的集合,通过提供对各种算法、数据结构和更多有用设施的支持,大大简化了开发。我们必须安装Boost C++库,因为Solidity编译器的源代码依赖于它。我特意选择了 "依赖 "这个词,因为它在描述源代码的层次结构时通常使用。

ℹ 信息"Git是一个用于源代码管理的DevOps工具。它是一个免费和开源的分布式版本控制系统,用于有效地处理小到非常大的项目。Git用于跟踪源代码的变化,使多个开发人员能够共同进行非线性开发"

Git是我们下载Solidity编译器源代码的首选工具。

下面的几个信息块目前来说是比较技术性的。我也用更简单、更笼统的话语做了解释,以方便我们理解。

ℹ 信息:*"Solidity实现了一种基于SMT(Satisfiability Modulo Theories)和Horn解决的形式化验证方法。SMTChecker模块自动尝试证明代码满足require和assert语句所给出的规范。

更简单地说,形式化验证是一个过程,在这个过程中,我们从数学上检查一个系统的行为,即一个代码语句是否满足一个特定的属性,即一个条件。

我们将在下面的文章中进一步探讨SMTChecker的主题。在那之前,就把它看成是检查钥匙是否适合锁。

ℹ 信息:Z3定理检验器是微软的一个跨平台SMT求解器。在此,我们只需从实用的角度来看待它:它是一个支持SMT检查的工具,更多的细节可能过于技术化和多余。

ℹ 信息CVC4是"......一个高效的开源自动定理检验器,用于可满足性模数理论(SMT)问题。它可以用来证明大量内置逻辑理论及其组合中的一阶公式的有效性(或二者的可满足性)。"

CVC4也是一个支持SMT检查的工具。

安装先决条件

由于我们已经涵盖了基础知识,让我们检查并安装 (install 命令) 或升级 (upgrade 命令) 先决条件。

步骤1:安装cmake并检查版本

安装cmake工具

$ sudo apt install -y cmake

检查已安装的版本。

$ cmake – version
cmake version 3.16.3

第2步:安装Boost库。

安装boost 库。

$ sudo apt install -y libboost-all-dev

检查已安装的版本;dpkg 是Debian/Ubuntu的数据包管理器,grep 是一个搜索工具,它将过滤出包含搜索条件的行。

管道符号 "|" 将一个命令的输出发送到另一个命令中;在命令行中粘贴命令时要检查引号符号。

$ dpkg -s libboost-dev | grep "Version"
Version: 1.71.0.0ubuntu2

第3步:安装Git

安装Git源代码控制软件。

$ sudo apt install -y git

检查已安装的版本。

$ git – version
git version 2.25.1

第4步:安装Python并检查版本

安装Python。

$ sudo apt install -y python

检查已安装的版本。

$ python – version
Python 2.7.18

第5步:安装z3 SMT检查工具

安装z3 SMT检查器工具。

$ sudo apt install -y z3 libz3-dev

检查已安装的版本。

$ z3 – version
Z3 version 4.8.7 - 64 bit

构建过程将报告无法运行与4.8.17以外的z3版本的几个测试。这不是强制性的运行测试,但如果我们想运行,我们首先要删除以前的版本,并从其源文件编译z3。

🛑 警告:z3的编译在时间和机器性能方面的代价是非常大的!

删除已安装的z3。

$ sudo apt remove -y z3

从Git仓库中下载并解压z3。

$ cd ~ && wget \
https://github.com/Z3Prover/z3/archive/refs/tags/z3-4.8.17.zip \
&& unzip z3-4.8.17.zip

预安装程序生成构建文件。

$ cd z3-z3-4.8.17 && python scripts/mk_make.py

使用构建文件,编译源代码并安装z3。

$ cd build && make && sudo make install

检查z3的版本。

$ z3 –-version
Z3 version 4.8.17 - 64 bit

只是一些小的内务工作。

$ cd ~ && rm -rf z3-z3-4.8.17 z3-4.8.17.zip

现在我们已经配备了z3 v4.8.17,我们可以继续进行其余的安装。

安装CVC4 SMT检查工具。

$ sudo apt install -y cvc4 libcvc4-dev

检查已安装的版本;head命令将输出(列表)限制在顶部-n 行。

$ cvc4 – version | head -n 1

这就是CVC4的1.6版

安装ccache ,这是一个快速的C/C++编译器缓存工具,对加速重复构建很有用。

$ sudo apt install -y ccache

检查已安装的版本。

$ ccache – version | grep "version" | head -n 1
ccache version 3.7.7

编译 Solidity 编译器

现在我们可以开始获取和编译 Solidity 编译器了。对于我们的任务,有一种较长和较短的方法。我们将先做一个较长的方法。

从Git仓库获取Solidity编译器的源代码;--recursive flag初始化克隆模块内的所有子模块,使用它们的默认设置。

$ git clone – recursive https://github.com/ethereum/solidity.git && cd solidity

💡 注意:如果我们想在没有SMT检查器的情况下进行Solidity编译器的编译,步骤2.的语法是:

# disables only Z3 SMT Solver.
cmake .. -DUSE_Z3=OFF

# disables only CVC4 SMT Solver.
cmake .. -DUSE_CVC4=OFF

# disables both Z3 and CVC4
cmake .. -DUSE_CVC4=OFF -DUSE_Z3=OFF

创建构建目录,下降到其中,创建构建文件,使用构建文件并开始编译。

mkdir build && cd build && cmake .. && make

Solidity编译器的编译在我的机器上花了将近1小时45分钟。

安装Solidity编译器的网址是usr/local/bin

cd solc && make install

而现在,我们将做一个更短的方法。

运行脚本~/solidity/scripts/build.sh ,它将在usr/local/bin 安装二进制文件solc 和 soltest 。

无论哪种方法都会使solc 全局可用。

$ solc – version
solc, the solidity compiler commandline interface
Version: 0.8.17-develop.2022.8.26+commit.f802eafc.Linux.g++

让我们运行我们的经典例子,检查编译器是否按计划工作。

$ solc ~/solidity_src/1_Storage.sol – abi – bin -o ~/solidity_src/output
Compiler run successful. Artifact(s) can be found in directory "~/solidity_src/output".

结论

在这篇文章中,我们展示了如何准备环境和编译 Solidity 编译器。

首先,我们列出并解释了编译 Solidity 编译器所需的软件先决条件。在某些情况下,我们达到了完整的解释,而在其他情况下,我们只是做了一个简单的介绍,并宣布了整个主题,例如在Satisfiability Modulo Theorem, SMT的情况下。

其次,我们按照第一步的教程安装了先决条件。在写这篇文章的时候,所有的例子都经过了检查和验证,所以我预计我们能够顺利地按照这些例子来做。我们还得出结论,编译过程在某些情况下会花费大量的时间;在我的机器上编译z3 SMT求解器花了将近40分钟。

第三,我们按照一个循序渐进的教程编译了一个Solidity编译器。我对每个命令的例子进行了解释,以扩大我们的学习过程,甚至在Solidity的严格范围之外,扩大到Linux(就我们需要的范围而言)。最后,当编译结束时,我们确认我们自己编译的Solidity编译器至少和我们简单下载或安装的预编译状态的编译器一样有魅力。