Web3js

無法使用 web3.js 和 ganache-cli 部署契約

  • June 12, 2019

我正在使用該solc模組來編譯 Solidity 合約。編譯步驟看起來工作正常,但是,當我嘗試將合約部署到 Ganache 網路(在 Mocha 測試中)時,promise 永遠不會解決。這是我已經檢查過的內容:

1)將超時時間增加到 3 分鐘 - 仍然沒有

2)另一個使用await的promise,它正確解決了,所以我不認為這是一個帶有promise的Mocha配置問題

estimateGas3)估計的氣體 - 根據功能,我應該有足夠的

  1. 將所有版本(web3、solc、ganache-cli)更新到最新版本

這是compile.js程式碼:

const path = require('path');
const fs = require('fs');
const solc = require('solc');

const contractPath = path.resolve(__dirname, 'MyContract.sol');
const source = fs.readFileSync(contractPath, 'utf8');

let jsonContractSource = JSON.stringify({
   language: 'Solidity',
   sources: {
     'Task': {
         content: source,
      },
   },
   settings: { 
       outputSelection: {
           '*': {
               '*': ['abi',"evm.bytecode"],   
            // here point out the output of the compiled result
           },
       },
   },
});


module.exports = JSON.parse(solc.compile(jsonContractSource)).contracts.Task.MyContract;

和測試文件:

const ganache = require('ganache-cli');
const Web3 = require('web3');
const provider = ganache.provider()
const web3 = new Web3(provider);
const { abi, evm } = require('../../contracts/compile');

let accounts;
let myContract;

before(async function() {

   accounts = await web3.eth.getAccounts()

   myContract = await new web3.eth.Contract(abi)
       .deploy({data: "0x" + evm.bytecode.object, arguments: []})
       .send({from: accounts[0], gas: 5000000});

   console.log("finished")

});

編輯:另一件事 - 我能夠使用 Remix 將契約部署到 Ganache 網路,所以我認為問題與 ganache-cli 無關。

找到了答案。事實證明,對於 Ganache,web3 選項並不是完全可選的:

我不得不改變:

const provider = ganache.provider()
const web3 = new Web3(provider);

到:

const provider = ganache.provider()
const OPTIONS = {
 defaultBlock: "latest",
 transactionConfirmationBlocks: 1,
 transactionBlockTimeout: 5
};
const web3 = new Web3(provider, null, OPTIONS);

我相信,如果沒有it零件,那麼before零件就不會被執行。

您可以通過添加到腳本來驗證這一點,例如:

it("test", async function() {
   console.log("test");
});

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