什麼是 Solidity 編譯器?
作者 Daniel Idowu
Ethereum 開發者使用 Solidity 撰寫智慧合約時,必須將程式碼透過編譯器編譯,Ethereum Virtual Machine (EVM) 才能理解並執行對應的指令。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) 所使用的位元組碼。位元組碼是 Solidity 程式碼「翻譯」後得到的資訊,內容是二進位電腦指令。
在 Ethereum 中,部署到區塊鏈上的正是這份位元組碼。編譯過程還會產生 ABI (Application Binary Interface),這是兩個程式模組之間的介面,通常存在於作業系統與使用者程式之間。

合約會被編譯成在 EVM 上執行的位元組碼。這份位元組碼會被部署到區塊鏈上,並儲存在某個位址。之後它會公開,讓任何人都可以與之互動。位址用來識別已部署的合約實例,並保有用於維持合約內部狀態的持久性儲存空間。Ether 是 Ethereum 的原生加密貨幣,可作為價值儲存工具、用來支付在區塊鏈上執行智慧合約的費用,也是給維護 Ethereum 網路安全的礦工的獎勵。
以下是一個合約如何編譯的簡單範例。
我們會使用 Remix(一個熱門的線上 Ethereum IDE)來編譯這段程式碼,因此不需要在本機安裝任何工具。
從下方圖片中可以看到,圖片底部的粉紅色與紫色箭頭分別指向 ABI 與位元組碼。ABI 是以 JSON 格式呈現的。

如何安裝 Solidity 編譯器
在學習 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 已成功安裝。
你應該會得到類似以下的輸出結果:

Linux 安裝
安裝 Linux 套件是相當簡單的流程,只需幾個步驟即可完成。首先,將此套件庫加入我們的套件庫清單中。
接著更新套件清單並安裝 solc。如果我們想使用 nightly 建置版本而非最新的穩定版本,應將套件庫項目改為 ethereum/ethereum-dev。
編譯範例 Solidity 智慧合約
以下程式碼使用上面提供的範例合約。
要編譯合約,我們可以執行以下程式碼。
若要使用特定的 EVM 版本來編譯我們的合約,可以按照以下方式設定版本。
什麼是 Solidity-upgrade?
solidity-upgrade 可以讓你升級合約,以反映具破壞性的語言變更。 雖然它無法針對每個具破壞性的發行版本做出所有必要調整,但它仍支援其中一些調整項目,否則這些調整將需要大量繁瑣的手動處理。
Solidity-upgrade 如何運作?
Solidity-upgrade 是以 libsolidity 為基礎,可以解析、編譯並分析你的原始碼檔案,以找出適用的原始碼升級項目。原始碼升級被視為對原始碼的小幅文字修改,會套用到提供的原始碼檔案的記憶體副本上。
升級分為兩個階段:
第一階段
首先,由於在解析原始碼檔案的階段無法在該層級升級原始碼,此時會蒐集錯誤,並可透過加上 —verbose 旗標來記錄。目前這個階段沒有可用的原始碼升級項目。
第二階段
在第二階段中,所有原始碼都會被編譯,而所有已啟用的升級分析模組也會在編譯的同時執行。預設情況下,所有可用的模組都會被啟用。
solidity-upgrade 可能會出現編譯問題,而原始碼升級有可能修正這些問題。如果沒有任何問題,代表沒有回報任何原始碼升級項目,此時流程就已完成。如果出現問題,且升級模組回報了原始碼升級項目,系統會套用第一個回報的原始碼升級,並針對所有提供的原始碼檔案重新啟動編譯。
什麼是 Solidity 反編譯器?
Solidity 反編譯器是一種工具,它以編譯後的智慧合約 EVM 程式碼作為輸入,並將其反編譯成類似 Solidity 的原始碼。 這個反編譯器有助於驗證與理解合約的行為。
在原始程式碼不可得的情況下,Solidity 反編譯器對於除錯智慧合約相當有用。不過,反編譯 EVM 位元組碼背後的技術仍在發展中,目前有些反編譯器只能部分反編譯複雜的合約,反編譯後的版本經常缺少大量底層程式碼。
Ethereum virtual machine (EVM) 反編譯器
以下是幾款熱門的 Solidity 反編譯器:
1. Ethervm.io
Ethervm.io 是一款免費的線上反編譯器,可以將 Ethereum 合約位元組碼反編譯成較易讀、類似 Solidity 的程式碼。
開始使用: https://ethervm.io/decompile
2. JEB decompiler
JEB decompiler 提供特定功能,例如在沒有 ABI 可用的情況下,透過程式碼分析來判斷方法。JEB 已成為安全稽核人員、漏洞研究人員以及調查 Ethereum 平台上不透明智慧合約的逆向工程師的首選工具。
開始使用:https://www.pnfsoftware.com/jeb/manual/ethereum/
3. Etherscan online decompiler
Etherscan online decompiler 是一款針對 Ethereum Virtual Machine (EVM) 的反編譯器,能從 Runtime 位元組碼中擷取資訊,並以更易讀的格式呈現。
4. Evemedis by nick johnson
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 課程。
相關總覽

打造區塊鏈魔法
Alchemy 結合最強大的 Web3 開發者產品與工具,並提供資源、社群與卓越的支援。


