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

Posted

技术标签:

【中文标题】无效的 asm.js:stdlib 的无效成员【英文标题】:Invalid asm.js: Invalid member of stdlib 【发布时间】:2019-05-17 16:11:54 【问题描述】:

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

【问题讨论】:

抛出一些代码让我更好地了解。 请在How can I ask a question 之后添加一些详细信息。谢谢 【参考方案1】:

我建议您选择较新版本的 solc 编译器(例如,检查 Remix 以查看哪个版本适用于您的代码)。检查您的 Solidity 代码的pragma 语句中的版本是否与您使用 node 安装的 solc 版本相同。检查 solc 版本中的示例用法并复制 JS 代码。我用的是 0.7.4 https://libraries.io/npm/solc/0.7.4

之后,您需要调整编译脚本以将 ABI 和字节码返回到您的测试中。名称必须完全匹配。在这里,我以 JSON 格式返回值,因此我不必在测试文件中使用 JSON.parse(interface)。请注意,字节码只是 HEX 值,因此我返回 contract.evm.bytecode.object。通过您的合同名称更改 Lottery(如果您有多个合同,您想查看文档或尝试 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);
    );
);

【讨论】:

【参考方案2】:

我通过删除当前目录中的“node-modules”文件夹,然后从终端重新安装模块,解决了 stdlib 的无效成员和“部署合同”问题的“before each”钩子:

npm install --save ganache-cli mocha web3@1.0.0-beta.37 solc@0.4.17

如果您的计算机上安装了 anaconda,您应该在安装这些模块之前使用 conda deactivate 命令。我在互联网上找不到解决方案,希望这也能帮助您解决问题...

【讨论】:

【参考方案3】:

发生这种情况的原因有很多。如果您使用的是 remix ide,那么默认情况下 asm 在 chrome 中被禁用,这可能是一个问题。您可能会以某种不兼容的方式使用旧的 Solidity 编译器。您的代码本身可能存在问题。除非您提供代码的所有细节,您使用的环境(如 IDE 和操作系统等),否则任何人都只能猜测最大值。

【讨论】:

以上是关于无效的 asm.js:stdlib 的无效成员的主要内容,如果未能解决你的问题,请参考以下文章

MySQL:向函数 st_geometryfromtext 提供的 GIS 数据无效

QtCreator:`clang:-stdlib=libc++ 的无效部署目标(需要 OS X 10.7 或更高版本)`

Linq 错误:“where”条件无效。实体成员正在调用无效的属性或方法

Openssl,无效参数'候选者是:int BN_set_word(bignum_st *,?)'

NoSuchMethodError:null 上的无效成员:'length'

NoSuchMethodError:null 上的无效成员:'_get'