Web3js
無法使用 web3.js 和 ganache-cli 部署契約
我正在使用該
solc
模組來編譯 Solidity 合約。編譯步驟看起來工作正常,但是,當我嘗試將合約部署到 Ganache 網路(在 Mocha 測試中)時,promise 永遠不會解決。這是我已經檢查過的內容:1)將超時時間增加到 3 分鐘 - 仍然沒有
2)另一個使用await的promise,它正確解決了,所以我不認為這是一個帶有promise的Mocha配置問題
estimateGas
3)估計的氣體 - 根據功能,我應該有足夠的
- 將所有版本(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"); });