Solc

如何使用 Solidity 編譯器的 0.6.x 版生成 Natspec 文件

  • November 29, 2021

我正在嘗試執行 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.solcontains import "@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 卷連接的並行文件系統這一事實經常讓使用者感到困惑,這就是為什麼我再次推薦使用靜態二進製文件的原因——它會使處理路徑更加直接。

引用自:https://ethereum.stackexchange.com/questions/106619