跳至內容
0%

什麼是 Solidity 編譯器?

發布於 2022年10月4日閱讀時間 2 分鐘

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),這是兩個程式模組之間的介面,通常存在於作業系統與使用者程式之間。

Solidity compiler 將原始碼轉換成 bytecode 和 ABI 的示意圖
Solidity compiler - 來源:Intellipat

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

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

我們會使用 Remix(一個熱門的線上 Ethereum IDE)來編譯這段程式碼,因此不需要在本機安裝任何工具。

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

Remix IDE compiler 面板,箭頭指向 ABI 和 bytecode 輸出
ABI 和 Bytecode 已可使用。

如何安裝 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 已成功安裝。

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

終端機輸出畫面,顯示在 macOS 上成功安裝 Solidity compiler
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 課程

Background gradient

打造區塊鏈魔法

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