Solidity 编译器是什么?

  • Alchemy
  • 发布于 2022-10-05 11:25
  • 阅读 13

本文介绍了Solidity编译器的作用,即将Solidity代码转换为EVM可以理解和执行的字节码的过程。文章详细阐述了solc和solc.js两种编译器的区别与安装方法,包括使用npm、Docker和二进制包等多种方式。此外,还介绍了Solidity反编译器,它可以将编译后的EVM代码转换回类似Solidity的源代码,并列举了几种常用的反编译器工具。

Daniel Idowu 撰写

Brady Werkheiser headshot

Brady Werkheiser 审核

发布于 2022 年 10 月 4 日,阅读时长 5 分钟


用 Solidity 编写智能合约 的以太坊开发者必须通过编译器运行他们的代码,以便 以太坊虚拟机 (EVM) 可以理解并执行适当的命令。Solidity 编译器将代码转换为字节指令的集合。

Solidity 是以太坊的编程语言,以太坊是市值第二大的加密货币。Solidity 是一种高级编程语言,专门用于实施智能合约。此外,Solidity 是一种面向合约和面向对象的语言,具有静态类型的对象。

在本文中,我们将引导你了解 Solidity 编译器、如何安装 Solidity 编译器、Solidity 编译器工具,甚至还会介绍公开提供的反编译器。

什么是 Solidity 编译器?

有两种 Solidity 编译器:solcsolc.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 compilerSolidity 编译器 - 来源: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 格式表示。

The ABI and Bytecode are available.ABI 和字节码可用。

如何安装 Solidity 编译器

学习 Solidity 时,你可能需要安装 Solidity 编译器。安装 Solidity 编译器有多种便捷方式。一种简单的方法是使用 Remix,你可以在线使用它。但是,这专为小型合约设计,并且编译选项很少。

对于较大的合约,你可以使用 npm/Node.js、Docker、Linus、MacOS 软件包以及静态二进制文件安装 Solidity 编译器。

方法 1:使用 npm/Node.js 安装

Solidity 编译器(也称为 solc)可以使用 npm 安装。以下命令将安装 solcjs 程序并使其在整个系统中可用。

npm install -g solc

你现在可以通过运行以下命令来测试你的 Solidity 编译器。

solcjs --version

你现在可以使用 solcjs,它比标准的 Solidity 编译器功能少,但会为你提供一个良好的起点。

方法 2:使用 Docker 安装

要开始使用 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

方法 3:使用二进制包安装(MacOS、Linux)

MacOS 安装

我们可以使用 Homebrew 在 MacOS 上安装 Solidity。这为我们提供了从源代码构建的 macOS 软件包,我们只需要按照安装说明进行操作即可。

brew update
brew upgrade
brew tap ethereum/ethereum
brew install solidity

执行完成后,我们可以通过运行以下命令来验证是否已成功安装 Solidity。

solcjs --version

你应该收到如下输出:

MacOS solidity installationMacOS solidity 安装

Linux 安装

安装 Linux 软件包是一个非常简单的过程,只需几个步骤即可完成。首先,将存储库添加到我们的存储库列表中。

sudo add-apt-repository ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install solc

然后更新软件包列表并安装 solc。如果我们想使用每晚构建版本而不是最新的稳定版本,我们应该将存储库条目更改为 ethereum/ethereum-dev。

编译示例 Solidity 智能合约

以下代码使用我们上面提供的示例合约。

//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 允许你升级你的合约以反映重大语言更改。 虽然它不会也不能为每个重大版本进行所有必要的调整,但它仍然支持那些原本需要大量繁琐的手动调整的调整。

solidity-upgrade 如何工作?

solidity-upgrade 基于 libsolidity,可以解析、编译和分析你的源文件,以便找到适用的源升级。源升级被认为是你的源代码的微小文本修改。它们应用于提供的源文件的内存副本。

升级分为两个阶段:

第一阶段

首先,由于在解析源文件期间无法在该级别升级源代码,因此会收集错误,并且可以通过提供 —verbose 标志来记录这些错误。目前没有可用的源升级。

第二阶段

在第二阶段,所有源文件都被编译,并且所有激活的升级分析模块都与编译一起运行。默认情况下,所有可用的模块都处于激活状态。

编译问题可能会从 solidity-upgrade 中出现,源更新可能会修复这些问题。如果没有问题,则没有报告源升级,并且你已完成。如果发生问题并且 升级模块 报告了源升级,则会应用第一个报告的源升级,并为所有提供的源文件启动重新编译。

什么是 Solidity 反编译器?

Solidity 反编译器是一种将编译后的智能合约 EVM 代码作为输入并将其反编译为类似 Solidity 的源代码的工具。 反编译器有助于验证和理解合约的行为。

Solidity 反编译器在调试原始代码不可用的智能合约时非常有用。但是,反编译 EVM 字节码背后的技术仍在开发中,因为一些可用的反编译器仅部分反编译复杂的合约,并且反编译版本中经常缺少许多底层代码。

以太坊虚拟机 (EVM) 反编译器

以下是流行的 Solidity 反编译器列表:

1. Ethervm.io

Ethervm.io 是一个免费的在线反编译器,可将以太坊合约字节码反编译为更易于阅读的类似 Solidity 的代码。

开始使用: https://ethervm.io/decompile

2. JEB 反编译器

JEB 反编译器提供特定的功能,例如代码分析,以确定在无法访问 ABI 的情况下确定方法。JEB 已成为安全审核员、漏洞研究人员和逆向工程师调查在 Ethereum 平台上运行的不透明智能合约的首选工具。

开始使用: https://www.pnfsoftware.com/jeb/manual/ethereum/

3. Etherscan 在线反编译器

Etherscan 在线反编译器 是 Ethereum 虚拟机 (EVM) 的反编译器,它从运行时字节码中提取信息并以更易于人阅读的格式呈现。

4. Nick Johnson 的 Evemedis

Evemedis 是一个 EVM 反汇编程序。它对字节码执行静态分析,以便提供比原始 EVM 操作更高级别的抽象。

开始使用: https://github.com/Arachnid/evmdis

5. Decurity

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 编译器
  • 编译示例 Solidity 智能合约
  • 什么是 Solidity 反编译器?
  • 最后的想法

分享:

Overview cards background graphic

相关概述

Featured content card overlay\ \ 学习 Solidity\ \ Solidity 中的 selfdestruct 是什么?\ \ 它是什么、如何工作以及如何开始 Featured content card overlay\ \ 学习 Solidity\ \ 学习 Solidity 开发的 7 个最佳课程 (2025)\ \ 探索学习 Solidity 开发的最佳免费和付费课程 Featured content card overlay\ \ 学习 Solidity\ \ 什么是 Solidity 数组?\ \ 你的 Solidity 数组入门指南 - 函数、声明和故障排除

Desktop section background image

构建区块链魔法

Alchemy 将功能最强大的 web3 开发人员产品和工具与资源、社区和传奇支持相结合。

获取你的 API 密钥

  • 原文链接: alchemy.com/overviews/so...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Alchemy
Alchemy
江湖只有他的大名,没有他的介绍。