---
title: "什麼是 Solidity 編譯器？"
description: "了解 Solidity 編譯器的運作方式及使用方法"
---

# 什麼是 Solidity 編譯器？

Ethereum 開發者[使用 Solidity 撰寫智慧合約](https://docs.soliditylang.org/en/v0.8.16/using-the-compiler.html#compiler-tools)時，必須將程式碼透過編譯器編譯，**Ethereum Virtual Machine \(EVM\)** 才能理解並執行對應的指令。[Solidity](https://www.alchemy.com/overviews/solidity) 編譯器會將程式碼轉換為一組位元組指令。

Solidity 是 Ethereum 的程式語言，而 Ethereum 是市值第二大的加密貨幣。Solidity 是專為實作智慧合約而設計的高階程式語言。此外，Solidity 是一種以合約為導向、物件導向且具有靜態型別物件的語言。

在這篇文章中，我們會介紹 Solidity 編譯器、如何安裝 Solidity 編譯器、Solidity 編譯器工具，以及目前公開可用的反編譯器。

## **什麼是 Solidity 編譯器？**

Solidity 編譯器有兩種：**solc** 與衍生自 solc 的 **solc.js**。實際的 Solidity 編譯器 solc 是以 C\+\+ 撰寫，在本文撰寫時版本為 0.8.16。solc.js 使用 Emscripten 將 C\+\+ 程式碼編譯成 JavaScript。每個版本的 solc 都會編譯出對應的 JavaScript 版本。

Solidity 檔案是透過名為 solcjs 的 Node.js 函式庫與命令列工具來組建的。它只使用 JavaScript 進行編譯，而非 solc 命令列編譯器，因此安裝上比 solc 更簡單。

在智慧合約可以部署之前，必須先編譯成 [EVM \(Ethereum Virtual Machine\)](https://www.alchemy.com/overviews/what-is-the-ethereum-virtual-machine-evm) 所使用的位元組碼。位元組碼是 Solidity 程式碼「翻譯」後得到的資訊，內容是二進位電腦指令。

在 Ethereum 中，部署到區塊鏈上的正是這份位元組碼。編譯過程還會產生 [ABI \(Application Binary Interface\)](https://www.alchemy.com/overviews/solidity-abi)，這是兩個程式模組之間的介面，通常存在於作業系統與使用者程式之間。

<ImageBlock
  src="https://media.alchemy.com/1704186026-solidity-compiler.png"
  alt="Solidity compiler 將原始碼轉換成 bytecode 和 ABI 的示意圖"
  width={456}
  height={414}
  caption="Solidity compiler - 來源：Intellipat"
/>

合約會被編譯成在 EVM 上執行的位元組碼。這份位元組碼會被部署到區塊鏈上，並儲存在某個位址。之後它會公開，讓任何人都可以與之互動。位址用來識別已部署的合約實例，並保有用於維持合約內部狀態的持久性儲存空間。Ether 是 Ethereum 的原生加密貨幣，可作為價值儲存工具、用來支付在區塊鏈上執行智慧合約的費用，也是給維護 Ethereum 網路安全的礦工的獎勵。

以下是一個合約如何編譯的簡單範例。

我們會使用 Remix（一個[熱門的線上 Ethereum IDE](https://www.alchemy.com/overviews/solidity-ide)）來編譯這段程式碼，因此不需要在本機安裝任何工具。

從下方圖片中可以看到，圖片底部的粉紅色與紫色箭頭分別指向 ABI 與位元組碼。ABI 是以 JSON 格式呈現的。

<ImageBlock
  src="https://media.alchemy.com/1704186197-solidity-compiler-abi-bytecode.jpg"
  alt="Remix IDE compiler 面板，箭頭指向 ABI 和 bytecode 輸出"
  width={730}
  height={1252}
  caption="ABI 和 Bytecode 已可使用。"
/>

## **如何安裝 Solidity 編譯器**

在[學習 Solidity](https://www.alchemy.com/overviews/learn-solidity) 的過程中，你可能會想要安裝 Solidity 編譯器。安裝 Solidity 編譯器有多種便利的方式。一個簡單的方法是使用 Remix，你可以選擇線上使用它。不過，它是為小型合約設計的，編譯選項也不多。

對於較大型的合約，你可以透過 npm/Node.js、Docker、Linux、MacOS 套件，或靜態二進位檔案來安裝 Solidity 編譯器。

### **方法一：使用 npm/node.js 安裝**

Solidity 編譯器（也就是 solc）可以透過 npm 安裝。以下指令會安裝 solcjs 程式，並讓系統各處都可以使用它。

現在你可以執行以下指令來測試你的 Solidity 編譯器。

現在你已經可以使用 solcjs 了，它的功能比標準 Solidity 編譯器少，但可以提供一個不錯的起點。

### **方法二：使用 Docker 安裝**

要開始進行 Solidity 程式開發，你可以下載 Docker 映像檔並使用它。由於 Docker 映像檔會執行編譯器執行檔，你可以傳入任何編譯器參數。

以下是拉取 Solidity Docker 映像檔的指令。

下載 Docker 映像檔後，執行以下指令來驗證它。

若要在主機上使用 Docker 映像檔編譯 Solidity 檔案，請掛載一個本機資料夾作為輸入與輸出，並指定要編譯的合約。

### **方法三：使用二進位套件安裝 \(MacOS、linux\)**

#### MacOS 安裝

我們可以使用 Homebrew 在 MacOS 上安裝 Solidity。這會提供由原始碼建置的 macOS 套件，我們只需要按照安裝指示操作即可。

執行完成後，我們可以執行以下指令來確認 Solidity 已成功安裝。

你應該會得到類似以下的輸出結果：

<ImageBlock
  src="https://media.alchemy.com/1704186340-macos-solidity-installation.png"
  alt="終端機輸出畫面，顯示在 macOS 上成功安裝 Solidity compiler"
  width={1116}
  height={128}
  caption="MacOS 安裝 solidity"
/>

#### Linux 安裝

安裝 Linux 套件是相當簡單的流程，只需幾個步驟即可完成。首先，將此套件庫加入我們的套件庫清單中。

接著更新套件清單並安裝 solc。如果我們想使用 nightly 建置版本而非最新的穩定版本，應將套件庫項目改為 ethereum/ethereum-dev。

## 編譯範例 Solidity 智慧合約

以下程式碼使用上面提供的範例合約。

要編譯合約，我們可以執行以下程式碼。

若要使用特定的 EVM 版本來編譯我們的合約，可以按照以下方式設定版本。

### **什麼是 Solidity-upgrade？**

**solidity-upgrade 可以讓你升級合約，以反映具破壞性的語言變更。** 雖然它無法針對每個具破壞性的發行版本做出所有必要調整，但它仍支援其中一些調整項目，否則這些調整將需要大量繁瑣的手動處理。

### Solidity-upgrade 如何運作？

Solidity-upgrade 是以 _libsolidity_ 為基礎，可以解析、編譯並分析你的原始碼檔案，以找出適用的原始碼升級項目。原始碼升級被視為對原始碼的小幅文字修改，會套用到提供的原始碼檔案的記憶體副本上。

升級分為兩個階段：

#### **第一階段**

首先，由於在解析原始碼檔案的階段無法在該層級升級原始碼，此時會蒐集錯誤，並可透過加上 —verbose 旗標來記錄。目前這個階段沒有可用的原始碼升級項目。

#### **第二階段**

在第二階段中，所有原始碼都會被編譯，而所有已啟用的升級分析模組也會在編譯的同時執行。預設情況下，所有可用的模組都會被啟用。

solidity-upgrade 可能會出現編譯問題，而原始碼升級有可能修正這些問題。如果沒有任何問題，代表沒有回報任何原始碼升級項目，此時流程就已完成。如果出現問題，且[升級模組](https://docs.soliditylang.org/en/v0.8.16/using-the-compiler.html#compiler-tools)回報了原始碼升級項目，系統會套用第一個回報的原始碼升級，並針對所有提供的原始碼檔案重新啟動編譯。

## **什麼是 Solidity 反編譯器？**

**Solidity 反編譯器是一種工具，它以編譯後的智慧合約 EVM 程式碼作為輸入，並將其反編譯成類似 Solidity 的原始碼。** 這個反編譯器有助於驗證與理解合約的行為。

在原始程式碼不可得的情況下，Solidity 反編譯器對於除錯智慧合約相當有用。不過，反編譯 EVM 位元組碼背後的技術仍在發展中，目前有些反編譯器只能部分反編譯複雜的合約，反編譯後的版本經常缺少大量底層程式碼。

### **Ethereum virtual machine \(EVM\) 反編譯器**

以下是幾款熱門的 Solidity 反編譯器：

#### **1. Ethervm.io**

[Ethervm.io](https://www.alchemy.com/dapps/ethervm-decompiler) 是一款免費的線上反編譯器，可以將 Ethereum 合約位元組碼反編譯成較易讀、類似 Solidity 的程式碼。

**開始使用：** [https://ethervm.io/decompile](https://www.ethervm.io/decompile)

#### **2. JEB decompiler**

JEB decompiler 提供特定功能，例如在沒有 ABI 可用的情況下，透過程式碼分析來判斷方法。JEB 已成為安全稽核人員、漏洞研究人員以及調查 Ethereum 平台上不透明智慧合約的逆向工程師的首選工具。

開始使用：[https://www.pnfsoftware.com/jeb/manual/ethereum/](https://etherscan.io/bytecode-decompiler)

#### 3. Etherscan online decompiler

[Etherscan online decompiler](https://etherscan.io/bytecode-decompiler) 是一款針對 Ethereum Virtual Machine \(EVM\) 的反編譯器，能從 Runtime 位元組碼中擷取資訊，並以更易讀的格式呈現。

#### **4. Evemedis by nick johnson**

Evemedis 是一款 EVM 反組譯器。它會對位元組碼進行靜態分析，以提供比原始 EVM 操作更高層次的抽象化呈現。

開始使用：[https://github.com/Arachnid/evmdis](https://github.com/Arachnid/evmdis)

#### **5. Decurity**

Decurity 是一款 ABI 反編譯器，實作了簡單的工具，用於還原 EVM 智慧合約的 ABI，包括函式名稱。

開始使用：[https://github.com/Decurity/abi-decompiler](https://github.com/Decurity/abi-decompiler)

## **結語**

現在你已經了解什麼是 Solidity 編譯器、如何安裝它們，以及如何編譯一個簡單的合約。Solidity 文件中還有更多關於 Solidity 編譯器的資訊。

如果你剛[開始學習 Solidity](https://www.alchemy.com/overviews/learn-solidity)，可以報名參加 Alchemy University 為期 7 週的 Solidity 開發者訓練營，透過免費、互動且完整的線上課程，[掌握 Ethereum 開發的基礎知識](https://www.alchemy.com/university/courses/ethereum?a=8e8f08e668)。如果你在開發方面完全是新手，Alchemy University 的 [**3 週 JavaScript 速成課程**](https://www.alchemy.com/university/courses/js?a=8e8f08e668) 是開始 Ethereum 訓練營之前很好的先修課程。如果你已經掌握基礎，想要深入鑽研，歡迎參考 [Alchemy 全新的 Solidity 課程](https://www.alchemy.com/university/courses/solidity?a=8e8f08e668)。
