(node:7894)V8:/var/www/html/testeth/node_modules/solc/soljson.js:3无效的asm.js:stdlib的无效成员
我正在根据ganache-cli简单合同进行测试部署,但它显示了警告。请帮助解决该问题。在“ index.sol”的代码下面
pragma solidity ^0.4.17;
contract testalk{
string public message;
function testalk(string initialMsg) public {
message = initialMsg;
}
function setMessage(string nwMsg) public {
message = nwMsg;
}
}
我正在使用“ mocha”和ganache-cli提供程序对其进行测试,如下所示:-
const assert = require('assert');
const ganache = require('ganache-cli');
const Web3 = require('web3');
const web3 = new Web3(ganache.provider());
const { interface, bytecode} = require('../compile');
require('events').EventEmitter.defaultMaxListeners = 15;
let accounts;
let testeth;
beforeEach( async ()=>{
accounts = await web3.eth.getAccounts();
testeth = await new web3.eth.Contract(JSON.parse(interface))
.deploy({data: bytecode, arguments: ['Hi Alok!']})
.send({gas: '1000000',from: accounts['0']});
});
describe("testalk",() => {
it('deploy a contract', () =>{
assert.ok(testeth.options.address);
});
it('get the message', async () => {
const message = await testeth.methods.message().call();
assert.equal('Hi Alok!', message);
//console.log(message);
})
it('get the message', async () => {
await testeth.methods.setMessage("Bye Alok!").send({from: accounts[0], gas: '1000000'});
const message = await testeth.methods.message().call();
console.log(message);
});
});
我正在使用Ubuntu和nodejs。
答案 0 :(得分:0)
由于多种原因,这可能发生。如果您使用的是remix ide,则默认情况下,chrome中的asm被禁用,这可能是一个问题。您可能以某种不兼容的方式使用旧版的Solidity编译器。您的代码本身可能存在问题。除非您提供代码的所有详细信息,使用的环境(如IDE和操作系统等),否则任何人都只能猜测最大值。
答案 1 :(得分:0)
我已经解决了stdlib的无效成员,并通过删除当前目录中的“ node-modules”文件夹,然后从终端重新安装了模块,来解决“ deploys a contract”问题的“ before each”钩子的问题:
npm install --save ganache-cli mocha web3@1.0.0-beta.37 solc@0.4.17
如果您的计算机上安装了anaconda,则应在安装这些模块之前通过使用以下命令停用它:
conda deactivate
命令。我在互联网上找不到解决方案,希望这也能帮助您解决问题...
答案 2 :(得分:0)
我建议您选择较新版本的solc编译器(例如,检查Remix以查看哪个版本适用于您的代码)。检查您的Solidity代码的pragma
句子中的版本是否与您通过node安装的solc版本相同。检查solc发行版中的样本用法并复制JS代码。我使用0.7.4 https://libraries.io/npm/solc/0.7.4
此后,您需要调整编译脚本以将ABI和字节码返回到您的测试。名称必须完全匹配。在这里,我以JSON格式返回值,因此不必在测试文件中使用JSON.parse(interface)
。请注意,字节码只是十六进制值,因此我要返回contract.evm.bytecode.object
。通过合同名称更改彩票(如果您有多个合同,则要检查文档或尝试for循环)。
const path = require('path');
const fs = require('fs');
const solc = require('solc');
const lotteryPath = path.resolve(__dirname, 'contracts', 'Lottery.sol');
const source = fs.readFileSync(lotteryPath, 'utf8')
var input = {
language: 'Solidity',
sources: {
'test.sol': {
content: source
}
},
settings: {
outputSelection: {
'*': {
'*': ['*']
}
}
}
};
var output = JSON.parse(solc.compile(JSON.stringify(input)));
var contract = output.contracts['test.sol'].Lottery;
var bytecode = contract.evm.bytecode.object;
var interface = contract.abi;
module.exports = {interface, bytecode};
我的测试文件变化不大,但是这里是:
const assert = require('assert');
const ganache = require('ganache-cli');
const Web3 = require('web3');
const web3 = new Web3(ganache.provider());
const { interface, bytecode } = require('../compile');
let lottery;
let accounts;
beforeEach(async () => {
accounts = await web3.eth.getAccounts();
lottery = await new web3.eth.Contract(interface)
.deploy({ data: bytecode })
.send({ from: accounts[0], gas: '6000000' });
});
describe('Lottery Contract', () => {
it('deploys a contract', () => {
assert.ok(lottery.options.address);
});
});