本文介绍了Solidity编译器的作用,即将Solidity代码转换为EVM可以理解和执行的字节码的过程。文章详细阐述了solc和solc.js两种编译器的区别与安装方法,包括使用npm、Docker和二进制包等多种方式。此外,还介绍了Solidity反编译器,它可以将编译后的EVM代码转换回类似Solidity的源代码,并列举了几种常用的反编译器工具。
由 Daniel Idowu 撰写
由 Brady Werkheiser 审核
发布于 2022 年 10 月 4 日,阅读时长 5 分钟
在 用 Solidity 编写智能合约 的以太坊开发者必须通过编译器运行他们的代码,以便 以太坊虚拟机 (EVM) 可以理解并执行适当的命令。Solidity 编译器将代码转换为字节指令的集合。
Solidity 是以太坊的编程语言,以太坊是市值第二大的加密货币。Solidity 是一种高级编程语言,专门用于实施智能合约。此外,Solidity 是一种面向合约和面向对象的语言,具有静态类型的对象。
在本文中,我们将引导你了解 Solidity 编译器、如何安装 Solidity 编译器、Solidity 编译器工具,甚至还会介绍公开提供的反编译器。
有两种 Solidity 编译器:solc 和 solc.js,后者是从 solc 派生的。实际的 Solidity 编译器 solc 是用 C++ 编写的,在本文撰写时版本为 0.8.16。Solc.js 使用 Emscripten 将 C++ 代码编译为 JavaScript。Solc 的每个版本都会被编译成 JavaScript。
Solidity 文件是使用名为 solcjs 的 Node.js 库和命令行工具组装的。它仅使用 JavaScript 进行编译,而不是 solc 命令行编译器,因此比 solc 更容易安装。
在部署智能合约之前,必须将其编译为 EVM(以太坊虚拟机) 的字节码。字节码是 Solidity 代码“翻译”成的形式,它包含二进制计算机指令。
在以太坊中,字节码是被部署到区块链上的内容。编译还会生成一个 ABI (应用程序二进制接口),它是两个程序模块之间的接口,通常是操作系统和用户程序之间的接口。
Solidity 编译器 - 来源:Intellipat
合约被编译成在 EVM 上执行的字节码。此字节码被部署到区块链并保存在一个地址。然后它被公开,任何人都可以与之交互。地址标识已部署的合约实例,该实例还保存持久存储以维护合约的内部状态。以太币(Ethereum 的原生加密货币)用作价值存储、用于在区块链上执行智能合约的支付方式以及对维护 Ethereum 网络安全的矿工的奖励。
以下是如何编译合约的快速示例。
我们将使用 Remix(一种 流行的在线 Ethereum IDE)编译此代码,因此我们无需在本地计算机上安装任何工具。
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Greeter {
string greeting;
constructor(string memory _greeting) {
greeting = _greeting;
}
function greet() public view returns (string memory) {
return greeting;
}
function setGreeting(string memory _greeting) public {
greeting = _greeting;
}
}
从下面的图片中,你应该注意到图片底部的粉色和紫色箭头分别指向 ABI 和字节码。ABI 以 JSON 格式表示。
ABI 和字节码可用。
在 学习 Solidity 时,你可能需要安装 Solidity 编译器。安装 Solidity 编译器有多种便捷方式。一种简单的方法是使用 Remix,你可以在线使用它。但是,这专为小型合约设计,并且编译选项很少。
对于较大的合约,你可以使用 npm/Node.js、Docker、Linus、MacOS 软件包以及静态二进制文件安装 Solidity 编译器。
Solidity 编译器(也称为 solc)可以使用 npm 安装。以下命令将安装 solcjs 程序并使其在整个系统中可用。
npm install -g solc
你现在可以通过运行以下命令来测试你的 Solidity 编译器。
solcjs --version
你现在可以使用 solcjs,它比标准的 Solidity 编译器功能少,但会为你提供一个良好的起点。
要开始使用 Solidity 编程,你可以下载 Docker 镜像并使用它。由于 Docker 镜像运行编译器可执行文件,因此你可以将任何编译器参数传递给它。
拉取 Solidity Docker 镜像的命令如下。
docker pull ethereum/solc
下载 Docker 镜像后,运行以下命令进行验证。
docker run ethereum/solc:stable -version
若要使用 Docker 镜像在主机上编译 Solidity 文件,请装载本地文件夹以进行输入和输出,并指定要编译的合约。
docker run -v /local/path:/sources ethereum/solc:stable -o /sources/output --abi --bin /sources/Contract.sol
我们可以使用 Homebrew 在 MacOS 上安装 Solidity。这为我们提供了从源代码构建的 macOS 软件包,我们只需要按照安装说明进行操作即可。
brew update
brew upgrade
brew tap ethereum/ethereum
brew install solidity
执行完成后,我们可以通过运行以下命令来验证是否已成功安装 Solidity。
solcjs --version
你应该收到如下输出:
MacOS solidity 安装
安装 Linux 软件包是一个非常简单的过程,只需几个步骤即可完成。首先,将存储库添加到我们的存储库列表中。
sudo add-apt-repository ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install solc
然后更新软件包列表并安装 solc。如果我们想使用每晚构建版本而不是最新的稳定版本,我们应该将存储库条目更改为 ethereum/ethereum-dev。
以下代码使用我们上面提供的示例合约。
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Greeter {
string greeting;
constructor(string memory _greeting) {
greeting = _greeting;
}
function greet() public view returns (string memory) {
return greeting;
}
function setGreeting(string memory _greeting) public {
greeting = _greeting;
}
}
要编译合约,我们可以运行以下代码。
solc Greeter.sol
要使用特定的 EVM 版本来编译我们的合约,我们可以按如下方式设置版本。
solc --evm-version [EVM-VERSION] contract.sol
solidity-upgrade 允许你升级你的合约以反映重大语言更改。 虽然它不会也不能为每个重大版本进行所有必要的调整,但它仍然支持那些原本需要大量繁琐的手动调整的调整。
solidity-upgrade 基于 libsolidity,可以解析、编译和分析你的源文件,以便找到适用的源升级。源升级被认为是你的源代码的微小文本修改。它们应用于提供的源文件的内存副本。
升级分为两个阶段:
首先,由于在解析源文件期间无法在该级别升级源代码,因此会收集错误,并且可以通过提供 —verbose 标志来记录这些错误。目前没有可用的源升级。
在第二阶段,所有源文件都被编译,并且所有激活的升级分析模块都与编译一起运行。默认情况下,所有可用的模块都处于激活状态。
编译问题可能会从 solidity-upgrade 中出现,源更新可能会修复这些问题。如果没有问题,则没有报告源升级,并且你已完成。如果发生问题并且 升级模块 报告了源升级,则会应用第一个报告的源升级,并为所有提供的源文件启动重新编译。
Solidity 反编译器是一种将编译后的智能合约 EVM 代码作为输入并将其反编译为类似 Solidity 的源代码的工具。 反编译器有助于验证和理解合约的行为。
Solidity 反编译器在调试原始代码不可用的智能合约时非常有用。但是,反编译 EVM 字节码背后的技术仍在开发中,因为一些可用的反编译器仅部分反编译复杂的合约,并且反编译版本中经常缺少许多底层代码。
以下是流行的 Solidity 反编译器列表:
Ethervm.io 是一个免费的在线反编译器,可将以太坊合约字节码反编译为更易于阅读的类似 Solidity 的代码。
开始使用: https://ethervm.io/decompile
JEB 反编译器提供特定的功能,例如代码分析,以确定在无法访问 ABI 的情况下确定方法。JEB 已成为安全审核员、漏洞研究人员和逆向工程师调查在 Ethereum 平台上运行的不透明智能合约的首选工具。
开始使用: https://www.pnfsoftware.com/jeb/manual/ethereum/
Etherscan 在线反编译器 是 Ethereum 虚拟机 (EVM) 的反编译器,它从运行时字节码中提取信息并以更易于人阅读的格式呈现。
Evemedis 是一个 EVM 反汇编程序。它对字节码执行静态分析,以便提供比原始 EVM 操作更高级别的抽象。
开始使用: https://github.com/Arachnid/evmdis
Decurity 是一个 ABI 反编译器,它实现了用于恢复 EVM 智能合约 ABI(包括函数名称)的简单工具。
开始使用: https://github.com/Decurity/abi-decompiler
现在你了解了什么是 Solidity 编译器,如何安装它们以及如何编译一个简单的合约。Solidity 文档包含有关 Solidity 编译器的更多信息。
如果你只是 开始学习 Solidity,请在 Alchemy University 为期 7 周的 Solidity 开发人员训练营中获得一席之地,以在一个免费、互动和全面的在线课程中 掌握 Ethereum 的基础知识。如果开发人员通常是开发新手,Alchemy University 的 3 周 JavaScript 速成课程 是开始 Ethereum 训练营之前的一个很好的先决条件。如果你已经掌握了基础知识并想深入研究,请查看 Alchemy 的新 Solidity 课程
Supercharged | Alchemy | Substack
注册 Alchemy University 并开始免费学习 Solidity 开发 立即注册
📚 目录
分享:
\
\
学习 Solidity\
\
Solidity 中的 selfdestruct 是什么?\
\
它是什么、如何工作以及如何开始
\
\
学习 Solidity\
\
学习 Solidity 开发的 7 个最佳课程 (2025)\
\
探索学习 Solidity 开发的最佳免费和付费课程
\
\
学习 Solidity\
\
什么是 Solidity 数组?\
\
你的 Solidity 数组入门指南 - 函数、声明和故障排除
Alchemy 将功能最强大的 web3 开发人员产品和工具与资源、社区和传奇支持相结合。
- 原文链接: alchemy.com/overviews/so...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!