安裝 Solidity 編譯器

版本控制

Solidity 版本遵循語義化版本控制。此外,主版本號為 0 的修補層級版本(即 0.x.y)不會包含重大變更。這表示使用 0.x.y 版本編譯的程式碼,預期可以使用 0.x.z(其中 z > y)編譯。

除了正式版本外,我們還提供預先發行版每夜開發建置,以便開發者試用即將推出的功能並提供早期回饋。請注意,此類建置包含開發分支中的最新程式碼,不保證與正式版本具有相同的品質。儘管我們盡了最大努力,它們仍可能包含未記錄和/或有問題的變更,這些變更不會成為實際版本的一部分。它們不適用於正式環境。

部署合約時,您應使用最新發行的 Solidity 版本。這是因為重大變更以及新功能和錯誤修復會定期引入。我們目前使用 0.x 版本號來表示這種快速變更的步調

Remix

我們推薦使用 Remix 來處理小型合約以及快速學習 Solidity。

在線上存取 Remix,您無需安裝任何東西。如果您想在沒有網際網路連線的情況下使用它,請從發行版頁面下載 Remix Desktop。Remix 也是在不安裝多個 Solidity 版本的情況下測試每夜建置版的便利選項。

本頁面的其他選項詳細說明如何在您的電腦上安裝命令行 Solidity 編譯器軟體。如果您正在處理較大型的合約,或需要更多編譯選項,請選擇命令行編譯器。

npm / Node.js

使用 npm 是安裝 solcjs``(一種 Solidity 編譯器)的便利且可攜的方式。``solcjs 程式的功能少於本頁面後續說明的編譯器存取方式。使用命令行編譯器 文件假設您使用的是全功能編譯器 solcsolcjs 的使用方式記錄在其自己的儲存庫中。

注意:solc-js 專案是使用 Emscripten 從 C++ solc 衍生而來的,這表示兩者使用相同的編譯器來源碼。solc-js 可以直接在 JavaScript 專案中使用(例如 Remix)。請參考 solc-js 儲存庫以取得相關說明。

npm install --global solc

備註

命令行執行檔名稱為 solcjs

solcjs 的命令行選項與 solc 不相容,期望 solc 行為的工具(例如 geth)將無法與 solcjs 搭配使用。

Docker

Solidity 建置的 Docker 映像檔可透過 ghcr.io 上 argotorg 組織的solc映像檔取得。使用 stable 標記取得最新發行版本,使用 nightly 標記取得 develop 分支中可能不穩定的變更。

Docker 映像檔會執行編譯器執行檔,因此您可以將所有編譯器參數傳遞給它。例如,以下命令會拉取 solc 映像檔的穩定版本(如果您尚未擁有),並在新的容器中執行它,傳遞 --help 參數。

docker run ghcr.io/argotorg/solc:stable --help

備註

特定的編譯器版本可透過 Docker 映像檔標記來支援,例如 ghcr.io/argotorg/solc:0.8.23。我們在此將使用 stable 標記,而非特定版本標記,以確保使用者預設取得最新版本,避免版本過期的問題。

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

docker run \
    --volume "/tmp/some/local/path/:/sources/" \
    ghcr.io/argotorg/solc:stable \
        /sources/Contract.sol \
        --abi \
        --bin \
        --output-dir /sources/output/

您也可以使用標準 JSON 介面(在搭配工具使用編譯器時建議使用)。使用此介面時,只要 JSON 輸入是自包含的(即不參考任何需要由匯入回呼載入的外部檔案),就不需要掛載任何目錄。

docker run ghcr.io/argotorg/solc:stable --standard-json < input.json > output.json

Linux 套件

我們提供編譯器的獨立執行檔,應該可以在大多數發行版上執行,無需額外的安裝步驟。

最高至 0.8.30 版本的 Ubuntu 套件可在ethereum/ethereum PPA中取得。然而,我們已停止此發行方式,後續版本將不會新增到該處。

一些 Linux 發行版提供自己的套件。這些套件並非由我們直接維護,但通常由各自的套件維護者保持更新。

一些發行版也提供了由社群維護的非官方建置和安裝編譯器的腳本:

  • Arch Linux / (AUR):

  • Nix:

備註

請注意,這些腳本由使用者製作和維護,並未經過發行版維護者的任何審查。使用時請謹慎小心。

還有snap 套件,然而它目前未被維護。它可以在所有支援的 Linux 發行版中安裝。要安裝最新穩定版的 solc:

sudo snap install solc

如果您想協助測試包含最新變更的 Solidity 開發版本,請使用以下命令:

sudo snap install solc --edge

備註

solc snap 使用嚴格限制模式。這是 snap 套件最安全的模式,但它有一些限制,例如只能存取 /home/media 目錄中的檔案。如需更多資訊,請前往揭開 Snap 限制的神秘面紗

macOS 套件

我們透過 Homebrew 以從來源碼建置的版本發行 Solidity 編譯器。目前不支援預先建置的 bottle。

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

要安裝最新的 0.4.x / 0.5.x 版 Solidity,您也可以分別使用 brew install solidity@4brew install solidity@5

如果您需要特定版本的 Solidity,可以直接從 Github 安裝 Homebrew formula。

檢視GitHub 上的 solidity.rb 提交記錄

複製您想要的版本的提交雜湊值,並在您的機器上檢出它。

git clone https://github.com/ethereum/homebrew-ethereum.git
cd homebrew-ethereum
git checkout <your-hash-goes-here>

使用 brew 安裝它:

brew unlink solidity
# 例如:安裝 0.4.8
brew install solidity.rb

靜態執行檔

我們在solc-bin維護了一個儲存庫,其中包含所有支援平台的過去和當前編譯器版本的靜態建置。這也是您可以找到每夜建置版的位置。

該儲存庫不僅是終端使用者快速輕鬆取得即用執行檔的方式,也旨在對第三方工具友好:

  • 內容會鏡像到 https://binaries.soliditylang.org,可以在無需任何驗證、速率限制或使用 git 的情況下,透過 HTTPS 輕鬆下載。

  • 內容以正確的 Content-Type 標頭和寬鬆的 CORS 組態提供,以便瀏覽器中執行的工具可以直接載入。

  • 執行檔不需要安裝或解壓縮(較舊的 Windows 建置除外,它們會與必要的 DLL 捆綁在一起)。

  • 我們力求高度的向後相容性。檔案一旦新增,就不會在未提供舊位置的符號連結/重新導向的情況下被移除或移動。它們也不會被原地修改,且應始終與原始校驗和相符。唯一的例外是那些破損或無法使用的檔案,若保持原樣可能弊大於利。

  • 檔案同時透過 HTTP 和 HTTPS 提供。只要您以安全的方式取得檔案清單(透過 git、HTTPS、IPFS 或僅在本機快取),並在下載後驗證執行檔的雜湊值,就不需要對執行檔本身使用 HTTPS。

相同的執行檔在多數情況下也可在GitHub 上的 Solidity 發行版頁面取得。區別在於我們通常不會更新 GitHub 發行版頁面上的舊版本。這表示如果命名慣例變更,我們不會重新命名它們,也不會為發行時不支援的平台新增建置。這些只會在 solc-bin 中發生。

solc-bin 儲存庫包含多個頂層目錄,每個目錄代表一個平台。每個目錄都包含一個 list.json 檔案,列出可用的執行檔。例如,在 emscripten-wasm32/list.json 中,您會找到關於 0.7.4 版本的以下資訊:

{
  "path": "solc-emscripten-wasm32-v0.7.4+commit.3f05b770.js",
  "version": "0.7.4",
  "build": "commit.3f05b770",
  "longVersion": "0.7.4+commit.3f05b770",
  "keccak256": "0x300330ecd127756b824aa13e843cb1f43c473cb22eaf3750d5fb9c99279af8c3",
  "sha256": "0x2b55ed5fec4d9625b6c7b3ab1abd2b7fb7dd2a9c68543bf0323db2c7e2d55af2",
  "urls": [
    "dweb:/ipfs/QmTLs5MuLEWXQkths41HiACoXDiH8zxyqBHGFDRSzVE5CS"
  ]
}

這表示:

警告

由於強烈的向後相容性要求,該儲存庫包含一些舊版元素,但在撰寫新工具時應避免使用它們:

  • 如果您想要最佳效能,請使用 emscripten-wasm32/``(並以 ``emscripten-asmjs/ 作為備用)而不是 bin/。在 0.6.1 版之前,我們僅提供 asm.js 執行檔。從 0.6.2 開始,我們切換到效能更好的WebAssembly 建置。我們已為 wasm 重新建置了較舊的版本,但原始的 asm.js 檔案仍保留在 bin/ 中。新的檔案必須放在單獨的目錄中以避免名稱衝突。

  • 如果您想確定下載的是 wasm 還是 asm.js 執行檔,請使用 emscripten-asmjs/emscripten-wasm32/``而不是 ``bin/wasm/ 目錄。

  • 使用 list.json 而不是 list.jslist.txt。JSON 清單格式包含了舊格式的所有資訊,甚至更多。

警告

  • solc-bin.ethereum.org 網域已不再支援。今後,我們建議仍在使用它作為 Solidity 執行檔來源的任何工具,切換到 binaries.soliditylang.org。

警告

執行檔也可在 https://argotorg.github.io/solc-bin/ 取得,但該頁面在 0.7.2 版本發行後即停止更新,不會收到任何平台的新版本或每夜建置版,且不提供新的目錄結構,包括非 emscripten 建置。

如果您正在使用它,請切換到 https://binaries.soliditylang.org,它是一個可直接替換的方案。這使我們能夠以透明的方式變更底層託管並最大限度地減少中斷。與我們無法控制的 argotorg.github.io 網域不同,binaries.soliditylang.org 保證能長期正常運作並維持相同的 URL 結構。

從來源碼建置

先決條件 - 所有作業系統

以下是所有 Solidity 建置的相依性:

軟體

備註

CMake(Windows 上為 3.21.3+,其他為 3.13+)

跨平台建置檔案產生器。

Boost(Windows 上為 1.77+,其他為 1.83+)

C++ 程式庫。

Git

用於擷取來源碼的命令行工具。

z3(版本 4.8.16+,選用)

用於 SMT 檢查器。

備註

0.5.10 之前的 Solidity 版本可能無法正確連結 Boost 1.70+ 版本。一個可能的解決方法是在執行 cmake 命令組態 Solidity 之前,暫時重新命名 <Boost 安裝路徑>/lib/cmake/Boost-1.70.0

從 0.5.10 開始,連結 Boost 1.70+ 應該無需手動介入即可運作。

備註

預設的建置組態需要特定的 Z3 版本(程式碼最後更新時的最新版本)。Z3 版本之間引入的變更通常會導致返回略有不同(但仍然有效)的結果。我們的 SMT 測試不考慮這些差異,並且在使用與撰寫時不同的版本時可能會失敗。這並不表示使用不同版本的建置是有缺陷的。如果您將 -DSTRICT_Z3_VERSION=OFF 選項傳遞給 CMake,則可以使用滿足上表要求的任何版本進行建置。然而,如果您這樣做,請記得將 --no-smt 選項傳遞給 ``scripts/tests.sh``以跳過 SMT 測試。

備註

預設情況下,建置以嚴格模式執行,這會啟用額外的警告並告訴編譯器將所有警告視為錯誤。這強制開發者在警告出現時立即修復,以免累積成「待修復」的問題。如果您只對建立發行版本感興趣,且不打算修改來源碼來處理此類警告,可以將 -DPEDANTIC=OFF 選項傳遞給 CMake 來停用此模式。不建議在一般使用中這樣做,但在使用我們未測試過的工具鏈,或嘗試使用較新工具建置較舊版本時可能是必要的。如果您遇到此類警告,請考慮回報它們

最低編譯器版本

以下 C++ 編譯器及其最低版本可以建置 Solidity 程式碼庫:

  • GCC,版本 13.3+

  • Clang,版本 18.1.3+

  • MSVC,版本 2019+

先決條件 - macOS

對於 macOS 建置,請確保您已安裝最新版本的Xcode。其中包含Clang C++ 編譯器Xcode IDE以及在 OS X 上建置 C++ 應用程式所需的其他 Apple 開發工具。如果您是首次安裝 Xcode,或剛安裝了新版本,則需要同意授權條款才能進行命令行建置:

sudo xcodebuild -license accept

我們的 OS X 建置腳本使用Homebrew套件管理器來安裝外部相依性。如果您想從頭開始,這裡是如何解除安裝 Homebrew的說明。

先決條件 - Windows

您需要安裝以下相依性來進行 Solidity 的 Windows 建置:

軟體

備註

Visual Studio 2019 Build Tools

C++ 編譯器

Visual Studio 2019(選用)

C++ 編譯器和開發環境。

Boost(版本 1.77+)

C++ 程式庫。

如果您已經有一個 IDE,只需要編譯器和程式庫,可以安裝 Visual Studio 2019 Build Tools。

Visual Studio 2019 同時提供 IDE 以及必要的編譯器和程式庫。因此,如果您還沒有 IDE 並且偏好開發 Solidity,Visual Studio 2019 可能是讓您輕鬆組態一切的好選擇。

以下是在 Visual Studio 2019 Build Tools 或 Visual Studio 2019 中應安裝的組件清單:

  • Visual Studio C++ 核心功能

  • VC++ 2019 v141 工具組 (x86,x64)

  • Windows Universal CRT SDK

  • Windows 8.1 SDK

  • C++/CLI 支援

我們有一個輔助腳本,您可以使用它來安裝所有必要的外部相依性:

scripts\install_deps.ps1

這將會把 boostcmake 安裝到 deps 子目錄中。

複製儲存庫

要複製來源碼,請執行以下命令:

git clone --recursive https://github.com/argotorg/solidity.git
cd solidity

如果您想協助開發 Solidity,您應該 fork Solidity 並將您的個人 fork 新增為第二個遠端:

git remote add personal git@github.com:[username]/solidity.git

備註

此方法將產生預先發行版建置,導致此類編譯器產生的每個位元組碼中都會設定一個旗標。如果您想重新建置已發行的 Solidity 編譯器,請使用 GitHub 發行版頁面上的來源碼 tarball:

https://github.com/argotorg/solidity/releases/download/v0.X.Y/solidity_0.X.Y.tar.gz

(不是 GitHub 提供的「Source code」)。

命令行建置

在建置之前,請務必安裝外部相依性(請參閱上方)。

Solidity 專案使用 CMake 來組態建置。您可能想安裝ccache來加速重複建置,CMake 會自動偵測到它。在 Linux、macOS 和其他 Unix 系統上建置 Solidity 非常相似:

mkdir build
cd build
cmake .. && make

或在 Linux 和 macOS 上更簡單地,您可以執行:

#note: this will install binaries solc and soltest at usr/local/bin
./scripts/build.sh

警告

BSD 建置應該可以運作,但未經 Solidity 團隊測試。

對於 Windows:

mkdir build
cd build
cmake -G "Visual Studio 16 2019" ..

如果您想使用 scripts\install_deps.ps1 安裝的 boost 版本,您還需要將 -DBoost_ROOT="deps/boost" -DBoost_INCLUDE_DIR="deps/boost/include"``和 ``-DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded 作為參數傳遞給 cmake 呼叫。

這應該會在該建置目錄中建立 solidity.sln。按兩下該檔案應該會啟動 Visual Studio。我們建議建置 Release 組態,但所有其他組態也都可以運作。

或者,您可以在命令行上為 Windows 建置,如下所示:

cmake --build . --config Release

CMake 組態選項

如果您想了解有哪些 CMake 組態選項可用,請執行 cmake .. -LH

SMT 求解器

Solidity 可以選擇性地使用 SMT 求解器,即 z3cvc5Eldarica,但它們的存在僅在執行時期檢查,建置成功並不需要它們。

備註

Emscripten 建置需要 Z3,並且會改為靜態連結它。

版本字串詳解

Solidity 版本字串包含四個部分:

  • 版本號

  • 預先發行版標記,通常組態為 develop.YYYY.MM.DDpre.Nnightly.YYYY.MM.DD

  • 提交,格式為 commit.GITHASH

  • 平台,包含任意數量的項目,含有關於平台和編譯器的詳細資訊

如果有本機修改,提交將會以 .mod 作為後綴。

這些部分依照 SemVer 的要求組合,其中 Solidity 預先發行版標記等同於 SemVer 預先發行版,而 Solidity 提交和平台組合構成 SemVer 建置中繼資料。

範例:

  • 發行版:0.4.8+commit.60cc1668.Emscripten.clang

  • 預先發行版:0.4.9-pre.3+commit.fb60450bc.Emscripten.clang

  • 每夜建置版:0.4.9-nightly.2017.1.17+commit.6ecb4aa3.Emscripten.clang

關於版本控制的重要資訊

發行版本後,修補版本層級會遞增,因為我們假設後續只有修補層級的變更。當變更合併時,版本應根據 SemVer 和變更的嚴重性進行遞增。最後,發行版始終使用當前建置的版本,但不含 prerelease 標識符。

範例:

  1. 發行 0.4.0 版本。

  2. 從現在起,每夜建置版和預先發行版的版本為 0.4.1。

  3. 引入非重大變更 --> 版本不變。

  4. 引入重大變更 --> 版本遞增至 0.5.0。

  5. 發行 0.5.0 版本。

此行為與版本 pragma 搭配良好。