【发布时间】:2019-02-03 22:11:42
【问题描述】:
我正在尝试为我的 Solidity 合约开发一些测试。我在这里有一个compile.js 脚本:
const path = require('path');
const solc = require('solc');
const fs = require('fs-extra');
const buildPath = path.resolve(__dirname, 'build');
fs.removeSync(buildPath);
const campaignPath = path.resolve(__dirname, 'contracts', 'Campaign.sol');
const source = fs.readFileSync(campaignPath, 'utf-8');
const output = solc.compile(source, 1).contracts;
fs.ensureDirSync(buildPath);
for (let contract in output) {
fs.outputJsonSync(
path.resolve(buildPath, contract.replace(':', '') + '.json'),
output[contract]
);
}
这个 EventEmitter 内存泄漏的罪魁祸首可能在这段代码中的某个地方吗?我以前从未遇到过这个错误。运行第一次测试时出现错误,这是我的测试文件:
const assert = require('assert');
const ganache = require('ganache-cli');
const Web3 = require('web3');
const web3 = new Web3(ganache.provider());
const compiledFactory = require('../ethereum/build/CampaignFactory.json');
const compiledCampaign = require('../ethereum/build/Campaign.json');
let accounts;
let factory;
let campaignAddress;
let campaign;
beforeEach(async () => {
accounts = await web3.eth.getAccounts();
factory = await new web3.eth.Contract(JSON.parse(compiledFactory.interface))
.deploy({ data: compiledFactory.bytecode })
.send({ from: accounts[0], gas: '1000000' });
await factory.methods.createCampaign('100').send({
from: accounts[0],
gas: '1000000'
});
[campaignAddress] = await factory.methods.getDeployedCampaigns().call();
campaign = new web3.eth.Contract(
JSON.parse(compiledCampaign.interface),
campaignAddress
);
});
describe('Campaigns', () => {
it('deploys a factory and a campaign', () => {
assert.ok(factory.options.address);
assert.ok(campaign.options.address);
});
});
在 EventEmitter 内存泄漏之后我得到的第二个错误是我的 getDeployedCampaigns() 不是一个函数,但如果你在这里查看 Campaign.sol 文件,它显然是:
pragma solidity ^0.4.17;
contract CampaignFactory {
address[] public deployedCampaigns;
function createCampaign(uint minimum) public {
address newCampaign = new Campaign(minimum, msg.sender);
deployedCampaigns.push(newCampaign);
}
function getDeployedCampaigns() public view returns (address[]) {
return deployedCampaigns;
}
}
【问题讨论】:
-
不知道这个 Solidity 东西编译成什么,但显然
getDeployedCampaigns将是函数,而getDeployedCampaigns()(调用,带括号)将是一个数组,对吧? (或者至少是一个类似 promise 的对象,Function.call()可能会对它产生奇怪的影响?) -
尝试查看这个问题的内存泄漏错误:stackoverflow.com/questions/9768444/…。修复此问题后,我们可以查看 web3 错误。
-
@StockOverflaw
getDeployedCampaigns().call()是从 web3 调用 solidty 函数的正确方法,如 web3 文档页面所述:web3js.readthedocs.io/en/1.0/…。但是.call()部分应该有参数,但我认为这与非函数错误无关。