安裝 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 (version 3.21.3+) |
跨平台建置檔案產生器。 |
Boost (version 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++ 編譯器 |
|
Visual Studio 2022 (Optional) |
C++ 編譯器和開發環境。 |
Boost(版本 1.77+) |
C++ 程式庫。 |
If you already have one IDE and only need the compiler and libraries, you could install Visual Studio 2022 Build Tools.
Visual Studio 2022 provides both IDE and necessary compiler and libraries. So if you have not got an IDE and prefer to develop Solidity, Visual Studio 2022 may be a choice for you to get everything setup easily.
Here is the list of components that should be installed in Visual Studio 2022 Build Tools or Visual Studio 2022:
Visual Studio C++ 核心功能
VC++ 2022 v143 toolset (x86,x64)
Windows Universal CRT SDK
Windows 10 or 11 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 17 2022" ..
如果您想使用 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 搭配良好。