无效的asm.js:stdlib的无效成员

时间:2018-12-17 09:57:27

标签: solidity

(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。

3 个答案:

答案 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);
    });
});