如何使用 Solidity 編譯器的 0.6.x 版生成 Natspec 文件
我正在嘗試執行
solc --userdoc --devdoc myContract.sol
以生成natspec。但是,編譯器抱怨合約有不同的編譯指示版本。事實上,契約雜注是在^0.6.0
,我也使用外部契約介面@chainlink/contracts/src/v0.6/ChainlinkClient.sol
。當我
solc
在我的 ubuntu 機器上安裝時,sudo snap install solc
它會安裝一些(錯誤的)版本,但我看不到如何更改安裝版本或在版本之間切換。我 pip 安裝了
https://github.com/crytic/solc-select
承諾完成這項工作的 python 包。但是當我執行時,solc --version
我仍然有不兼容的版本,我的契約無法在其上編譯。當我使用 docker 圖像時
sudo docker run -v $HOME/myProject/contracts:/contracts ethereum/solc:0.6.12 -o /contracts/output --abi --bin /contracts/myContract.sol
我得到錯誤:
Error: Source "@chainlink/contracts/src/v0.6/ChainlinkClient.sol" not found: File outside of allowed directories.
此處也報告了此問題,但這似乎是一個我不應該進入的兔子洞。
上次我查看了使用 solc 和 docker的官方 Solidity 文件頁面上的說明。
例如編譯
/ethereum/test.sol
並將輸出保留在/ethereum/build
.docker run -v /ethereum:/sources ethereum/solc:0.5.16 --abi --bin /sources/test.sol -o /sources/build
您可以從solc-bin獲取適用於任何受支持平台的任何版本的編譯器。編譯器是一個靜態編譯的二進製文件,所以通過 Docker 執行它真的沒有多大意義,除非你真的很喜歡這種方式來輕鬆下載它。無論如何,二進製文件是 docker 映像中唯一的文件。
要下載並執行 0.6.x:
curl -OL https://binaries.soliditylang.org/linux-amd64/solc-linux-amd64-v0.6.12+commit.27d51765 chmod +x solc-linux-amd64-v0.6.12+commit.27d51765 ./solc-linux-amd64-v0.6.12+commit.27d51765 --userdoc --devdoc myContract.sol
如果
myContract.sol
containsimport "@chainlink/contracts/src/v0.6/ChainlinkClient.sol"
,您還需要確保編譯器可以找到該文件。在 0.8.8+ 中,您可以通過 npm 安裝 chainlink 並簡單地添加--include-path node_modules/
到solc
命令中。該選項在 0.6.x 上不可用,解決方法是在項目目錄中創建指向它的符號連結ln -s node_modules/@chainlink/ @chainlink
或者,或者,使用導入重新映射(但請注意,重新映射會影響契約元數據):
./solc-linux-amd64-v0.6.12+commit.27d51765 @chainlink/=node_modules/@chainlink/ --userdoc --devdoc myContract.sol
當我
solc
在我的 ubuntu 機器上安裝時,sudo snap install solc
它會安裝一些(錯誤的)版本,但我看不到如何更改安裝版本或在版本之間切換。snap 包由社區盡最大努力維護,不幸的是現在已經過時(#11940)。我真的建議改用靜態二進製文件。
當我使用 docker 圖像時
sudo docker run -v $HOME/myProject/contracts:/contracts ethereum/solc:0.6.12 -o /contracts/output --abi --bin /contracts/myContract.sol
,我收到錯誤:Error: Source "@chainlink/contracts/src/v0.6/ChainlinkClient.sol" not found: File outside of allowed directories.
.編譯器將拒絕從您的項目目錄之外導入文件,除非您明確告訴它可以。您可以使用
--allow-paths
選項來執行此操作。這應該包含您安裝 chainlink 的目錄。請注意,如果您使用 Docker 中的 solc,它應該是容器文件系統中的目錄,而不是本地文件系統中的目錄。有兩個通過 Docker 卷連接的並行文件系統這一事實經常讓使用者感到困惑,這就是為什麼我再次推薦使用靜態二進製文件的原因——它會使處理路徑更加直接。