Go-Ethereum

松露測試在 ganache-cli 和本地 geth 之間得到不同的結果

  • March 13, 2019

當我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...10x0...2(2 個帳戶)解鎖帳戶。

預設(如果您未指定任何內容)是0x0...1直通0x0...a(10 個帳戶)。

GETH 不這樣做,因此您必須在執行任何 Truffle 測試之前自己解鎖帳戶,方法是為這些測試中使用的每個帳戶向 GETH 發送一個“解鎖帳戶”命令。

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