那些在Solidity中碰上的意外
本文最後更新於:2022年1月26日 晚上
背景
最近在學solidity,主要是用在以太坊的開發上
這是一個相對比較新的語言,很多套件都還處在快速更新期
所以在學習時很多資源其實多少都會跟不上最新的版本更新
常常會遇到奇怪的bug
因此想要整理一下我在學習的過程中遇到那些困難
又用了哪些方法來workaround
如果你覺得有更好的解法,務必隨時跟我反應
(可以直接用messanger敲我ヽ(✿゚▽゚)ノ,在「關於我」那邊)
這一個月會持續更新!
v1: 2022/01/25
1. VScode 似乎不能編譯最新版的solidity
一開始是用remix來寫最簡單的合約,
這個線上IDE在背後幫我們把編譯處理好了
不過要轉到本地的VScode上,最大的問題是編譯的版本問題
我自己的vscode有先安裝「Solidity」以及「Solidity Extended」這兩個插件來幫助編譯
但後來發現,「Solidity Extended」似乎會強制把編譯版本固定在0.4.17
所以我先把這個插件停用了,然後作了以下步驟就能順利更新成最新版本:
a. 下載最新版本的solidity
1 |
|
b. 把專案資料夾內的 .vscode資料夾打開,接著再打開裡面的settings.json
- 把版本換掉
- 注意要多加第二行的設定
1 |
|
應該會回復正常了,如果還有報錯:
c. 在報錯的 pragma solidity ....
上,按下滑鼠右鍵,選擇Change workspace compiler version(Remote),並選擇你想要的版本
資料來源:
How to fix Solidity version missmatch from Visual Studio Code - Ethereum Stack Exchange
2. Brownie + Ganache-cli套件安裝問題
a. Error: Cannot find module ‘ganache-cli’
一開始用yarn來安裝Ganache-cli,沒想到雖然看起來安裝正常(successfully installed),但是又都沒有安裝成功(ganache-cli –version找不到),後來還是重回npm的懷抱
node 安裝到最新版本(目前是v16.13.2)
nvm latest,注意要另外安裝
1 |
|
npm latest
1 |
|
資料來源:
[NodeJS] 透過 NVM 安裝與使用 Node.js | PJCHENder 未整理筆記
contract deployment - Error: Cannot find module ‘ganache-cli’ - Ethereum Stack Exchange
Brownie: Unable to launch local RPC client - Ethereum Stack Exchange
3. Brownie匯入github的外部合約,compile後出現報錯
首先是因為匯入的pragma
版本問題,需要確定這個外部合約使用的是什麼版本的solidity
我自己出錯的原因可能是因為這項:
When the compiler version is not explicitly declared, Brownie looks at the version pragma of each contract and uses the latest matching compiler version that has been installed.
我本地的電腦已經安裝了最新的v0.8.11,
但是嘗試過後發現,似乎無法利用問題1的解法(手動改變編譯版本)來解決
目前推測是因為在「沒有在brownie-config.yaml
中指定版本」的情況下,Brownie會直接選取已安裝的最新編譯器,也就是我的v0.8.11來進行編譯
解決辦法: brownie-config.yaml
中設定版本
1 |
|
其他學到的知識點:
Brownie可以處理多種版本的import,solidity不行
以v0.6編譯的合約,如果import進v0.8,solidity會報錯
以v0.6編譯的合約,import進以v0.8編譯的合約,solidity不會報錯
Brownie會先在interface的
pragma
config中找到最新的版本,優先順序是在brownie-config.yaml
之前的,所以本來的brownie-config.yaml
設置可能會被覆蓋同時,comment起來的
pragma
config還是會被編譯,這是Brownie的bug如果在
brownie-config.yaml
中設定明確的版本,整個合約都會用那個版本來編譯
資料來源:
Compiling Contracts — Brownie 1.17.2 documentation (eth-brownie.readthedocs.io)
brownie - v0.8 AggregatorV3Interface.sol , its available in @chainlink/contracts? - Stack Overflow
4. 安裝Truffle報錯
待解決…