Go-Ethereum
松露測試在 ganache-cli 和本地 geth 之間得到不同的結果
當我
truffle test
在 ganache-cli 上執行時,它會通過測試,但是當我在本地 geth 節點上執行相同的 truffle test commnad 時,它會失敗並invalid address
在以地址為參數的方法中說錯誤(即使參數地址沒有問題)。但是,當我將合約部署到本地 geth 節點並呼叫出現錯誤的方法時,沒有問題。
這是 truffle.js 設置:
module.exports = { networks: { development: { host: 'localhost', port: 8545, network_id: '*', gasPrice: 0, gas: 6600000, }, }, compilers: { solc: { version: '0.4.25', }, settings: { optimizer: { enables: true, runs: 200, }, }, }, };
版本
Truffle v4.1.14 (core: 4.1.14) Solidity v0.4.24 (solc-js) geth (docker) ethereum/client-go:release-1.8 Ganache CLI v6.3.0 (ganache-core: 2.4.0)
問題 #1:
此配置僅從 Truffle v5.x 開始有效:
compilers: { solc: { version: '0.4.25', }, settings: { optimizer: { enables: true, runs: 200, }, }, },
在 Truffle v4.x 或更早版本上,您應該將其更改為:
solc: { optimizer: { enabled: true, runs: 200 }, },
是的,你不能在這裡配置 solc 版本,這意味著你一定會繼續使用 solc v0.4.24(這是 Truffle v4.1.14 所依賴的)。安裝 Truffle 後有一些方法可以更改編譯器版本,你可以在這個網站上找到,但我建議你直接升級到 Truffle v4.1.15(它依賴於 solc v0.4.25)。您也可以升級到 Truffle v5.x,但這會隨後將您的 solc 從 v0.4.x 升級到 v0.5.x,並將您的 web3 從 v0.x 升級到 v1.x,每個都引入了 API 中斷更改,這將使您修復程式碼中的許多損壞的東西(Solidity 和 Javascript)。
問題 #2:
當 Ganache 啟動時,它會自動解鎖命令行中指定的帳戶。
例如:
ganache-cli --port=8545 --gasPrice=20000000000 --gasLimit=8000000 --account=0x0000000000000000000000000000000000000000000000000000000000000001,1000000 --account=0x0000000000000000000000000000000000000000000000000000000000000002,1000000
將使用私鑰
0x0...1
和0x0...2
(2 個帳戶)解鎖帳戶。預設(如果您未指定任何內容)是
0x0...1
直通0x0...a
(10 個帳戶)。GETH 不這樣做,因此您必須在執行任何 Truffle 測試之前自己解鎖帳戶,方法是為這些測試中使用的每個帳戶向 GETH 發送一個“解鎖帳戶”命令。