npm solc:AssertionError [ERR_ASSERTION]:指定了无效的回调

时间:2018-11-17 16:29:39

标签: node.js npm ethereum solidity

我正在尝试使用npm solc编译Solidity智能合约。我尝试遵循不同的示例。 链接到示例:https://medium.com/coinmonks/how-to-compile-a-solidity-smart-contract-using-node-js-51ea7c6bf440

我写了如下代码:

const path = require('path');
const fs = require('fs');
const solc = require('solc');



const helloPath = path.resolve(__dirname, 'contracts', 'hello.sol');
console.log("First" + helloPath);
const source = fs.readFileSync(helloPath, 'UTF-8');
console.log("Second" + source);
console.log(solc.compile(source, 1));

运行以上代码时出现以下错误。

AssertionError [ERR_ASSERTION]: Invalid callback specified.
    at wrapCallback (C:\Users\mouazzamj058\solc_example\node_modules\solc\wrapper.js:16:5)
    at runWithReadCallback (C:\Users\mouazzamj058\solc_example\node_modules\solc\wrapper.js:37:42)
    at compileStandard (C:\Users\mouazzamj058\solc_example\node_modules\solc\wrapper.js:78:14)
    at Object.compileStandardWrapper (C:\Users\mouazzamj058\solc_example\node_modules\solc\wrapper.js:85:14)
    at Object.<anonymous> (C:\Users\mouazzamj058\solc_example\example.js:4:19)
    at Module._compile (module.js:652:30)
    at Object.Module._extensions..js (module.js:663:10)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)

请帮助。

10 个答案:

答案 0 :(得分:13)

您正在使用哪个版本的solc?

Solc前几天发布了一个破坏版本,与此错误有关。

npm uninstall solc
npm install solc@0.4.25

答案 1 :(得分:2)

这是由于在solc软件包安装期间安装的solidity编译器版本与solidity文件中提到的编译器版本不匹配。要解决此问题,请尝试

安装:

npm install solc@0.4.25

在solidity文件中使用:

pragma solidity ^ 0.4.25;

答案 2 :(得分:2)

如果您使用的是最新版本。 0.5.9编译代码的方式有所变化。

const path = require('path');
const fs = require('fs');
const solc = require('solc');



const helloPath = path.resolve(__dirname, 'contracts', 'hello.sol');
const source = fs.readFileSync(helloPath, 'UTF-8');

var input = {
    language: 'Solidity',
    sources: {
        'hello.sol' : {
            content: source
        }
    },
    settings: {
        outputSelection: {
            '*': {
                '*': [ '*' ]
            }
        }
    }
}; 
console.log(JSON.parse(solc.compile(JSON.stringify(input))));

答案 3 :(得分:1)

这是因为Solidity编译器的版本不匹配。请注意或验证您要使用的Solidity编译器版本。例如:如果您在

中进行工作
pragma solidity ^0.4.17

然后,您必须安装0.4.17稳定性编译器版本,如下所示:

npm install solc@0.4.17

在命令提示符或终端上。

答案 4 :(得分:0)

首先在Remix中检查代码,然后检查编译器版本

答案 5 :(得分:0)

这通常是已安装的Solidity编译器与Solidity合同文件中使用的Solidity编译器版本之间的断言错误。 如果您使用

  

npm install --save solc@0.4.25

然后在您的Mac中安装solc,请在您的Solidity文件中使用相同版本的编译指示,如下所示:

  

pragma solidity ^ 0.4.25

答案 6 :(得分:0)

如果您看到这样的错误。您必须执行以下两个步骤。

  1. 卸载solc:

    npm卸载软件

  2. 重新安装以下两个版本之一:

课程中使用的版本:

!is.logical(...)

不会中断的最新版本:

npm install --save solc@0.4.17

源-Udemy-以太坊和团结完整的开发人员指南

答案 7 :(得分:0)

  • 强大的编译器

  • 使用- npm卸载软件

  • 然后安装所需版本的Solidity编译器

  • 使用- npm install solc@0.4.17

答案 8 :(得分:0)

我通过在cmd中添加“ npm install --save solc@0.4.25”解决了该错误。错误是实体版本。您需要安装旧版本的solidity才能执行编译脚本

答案 9 :(得分:0)

solc 0.7.1


function compileContract() {
    let voterSOl = fs.readFileSync('./contracts/voter.sol' , 'utf8')
    let complierInput = {
        language: 'Solidity',
        sources:
        {
            'voter.sol': 
            {
                content: voterSOl
            }
        },
        settings:
        {
            optimizer:
            {
                enabled: true
            },
            outputSelection:
            {
                '*':{
                    '*':['*']
                }
            }
        }
    };
    console.log('compiling contract');
    let compiledContract = JSON.parse(solc.compile(JSON.stringify(complierInput)));
    console.log('Contract Compiled');
    for (let contractName in compiledContract.contracts['voter.sol']) {
        console.log(contractName , compiledContract.contracts['voter.sol'][contractName].abi);      
        let abi = compiledContract.contracts['voter.sol'][contractName].abi;
        fs.writeFileSync(`./contracts/bin/${contractName}_abi.json` , JSON.stringify(abi));
        return compiledContract.contracts['voter.sol'][contractName];
    }
}