安裝 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 程式的功能少於本頁面後續說明的編譯器存取方式。使用命令行編譯器 文件假設您使用的是全功能編譯器 solc。solcjs 的使用方式記錄在其自己的儲存庫中。
注意: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):
solidity(從來源碼建置),
solidity-bin(使用我們的獨立執行檔)。
Nix:
solc.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@4 和 brew install solidity@5。
如果您需要特定版本的 Solidity,可以直接從 Github 安裝 Homebrew formula。
複製您想要的版本的提交雜湊值,並在您的機器上檢出它。
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"
]
}
這表示:
您可以在同一目錄下找到名為solc-emscripten-wasm32-v0.7.4+commit.3f05b770.js的執行檔。請注意,該檔案可能是符號連結,如果您不是使用 git 下載它,或者您的檔案系統不支援符號連結,則需要自行解析它。
該執行檔也鏡像於 https://binaries.soliditylang.org/emscripten-wasm32/solc-emscripten-wasm32-v0.7.4+commit.3f05b770.js。在這種情況下,不需要 git,且符號連結會透明地解析,無論是提供檔案副本還是返回 HTTP 重新導向。
該檔案也可在 IPFS 上取得,位於QmTLs5MuLEWXQkths41HiACoXDiH8zxyqBHGFDRSzVE5CS。請注意,
urls陣列中項目的順序並非預先確定或保證的,使用者不應依賴它。您可以透過將其 keccak256 雜湊值與
0x300330ecd127756b824aa13e843cb1f43c473cb22eaf3750d5fb9c99279af8c3進行比較來驗證執行檔的完整性。該雜湊值可以在命令行上使用sha3sum提供的keccak256sum工具,或在 JavaScript 中使用ethereumjs-util 的 keccak256() 函式來計算。您也可以透過將其 sha256 雜湊值與
0x2b55ed5fec4d9625b6c7b3ab1abd2b7fb7dd2a9c68543bf0323db2c7e2d55af2進行比較來驗證執行檔的完整性。
警告
由於強烈的向後相容性要求,該儲存庫包含一些舊版元素,但在撰寫新工具時應避免使用它們:
如果您想要最佳效能,請使用
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.js和list.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++ 程式庫。 |
用於擷取來源碼的命令行工具。 |
|
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 程式碼庫:
先決條件 - macOS
對於 macOS 建置,請確保您已安裝最新版本的Xcode。其中包含Clang C++ 編譯器、Xcode IDE以及在 OS X 上建置 C++ 應用程式所需的其他 Apple 開發工具。如果您是首次安裝 Xcode,或剛安裝了新版本,則需要同意授權條款才能進行命令行建置:
sudo xcodebuild -license accept
我們的 OS X 建置腳本使用Homebrew套件管理器來安裝外部相依性。如果您想從頭開始,這裡是如何解除安裝 Homebrew的說明。
先決條件 - Windows
您需要安裝以下相依性來進行 Solidity 的 Windows 建置:
軟體 |
備註 |
|---|---|
C++ 編譯器 |
|
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
這將會把 boost 和 cmake 安裝到 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 求解器,即 z3、cvc5 和 Eldarica,但它們的存在僅在執行時期檢查,建置成功並不需要它們。
備註
Emscripten 建置需要 Z3,並且會改為靜態連結它。
版本字串詳解
Solidity 版本字串包含四個部分:
版本號
預先發行版標記,通常組態為
develop.YYYY.MM.DD、pre.N或nightly.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 標識符。
範例:
發行 0.4.0 版本。
從現在起,每夜建置版和預先發行版的版本為 0.4.1。
引入非重大變更 --> 版本不變。
引入重大變更 --> 版本遞增至 0.5.0。
發行 0.5.0 版本。
此行為與版本 pragma 搭配良好。