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

Posted

技术标签:

【中文标题】npm solc:AssertionError [ERR_ASSERTION]:指定的回调无效【英文标题】:npm solc: AssertionError [ERR_ASSERTION]: Invalid callback specified 【发布时间】:2019-04-20 13:06:00 【问题描述】:

我正在尝试使用 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)

请帮忙。

【问题讨论】:

你确定这个错误来自solc。你能调试一下,看看你到底是从哪里得到错误的吗? 我猜有一个错误。安装 solc@0.4.25 成功。 【参考方案1】:

你使用的 Solidity 版本和你使用的 Solidity 编译器(solc)应该是一样的。

如果 pragma solidity^0.4.17 那么 solc-->version = 0.4.17

【讨论】:

【参考方案2】:

基本上,这是一个版本问题。某些代码语法会在每次更新时发生变化。您不需要“文件系统”和“路径”库。 要解决此问题,请尝试以下代码:

const solc = require('solc');

var input = 
    language: 'Solidity',
    sources: 
        'hello.sol': 
            content: 'contract hello  function f() public   '
        
    ,
    settings: 
        outputSelection: 
            '*': 
                '*': ['*']
            
        
    
;

var output = JSON.parse(solc.compile(JSON.stringify(input)));
console.log(output);

从中,您将获得字节码。

【讨论】:

【参考方案3】:

记得检查solidity版本和solc版本。他们应该是平等的。

【讨论】:

【参考方案4】:

solc0.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];
    

【讨论】:

【参考方案5】:

我通过在 cmd 中添加“npm install --save solc@0.4.25”修复了该错误。错误是solidity版本。你需要安装旧版本的solidity来执行编译脚本

【讨论】:

【参考方案6】:

卸载solidity编译器

使用 - npm uninstall solc

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

使用 - npm install solc@0.4.17

【讨论】:

【参考方案7】:

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

    卸载 solc:

    npm 卸载 solc

    重新安装两个版本之一:

课程中使用的版本:

npm install --save solc@0.4.17

不会破解的最新版本:

npm install --save solc@0.4.25

来源 - Udemy - 以太坊和 Solidity 完整的开发者指南

【讨论】:

但继续前进【参考方案8】:

如果您使用的是最新版本,即。 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))));

【讨论】:

【参考方案9】:

这通常是您安装的solidity 编译器与您在solidity 合约文件中使用的solidity 编译器版本之间的断言错误。 如果你正在使用

npm install --save solc@0.4.25

要在你的 mac 中安装 solc,请在你的 solidity 文件中使用相同版本的 pragma,如下所示

pragma solidity^0.4.25

【讨论】:

【参考方案10】:

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

pragma solidity ^0.4.17

那么你必须像这样安装 0.4.17 solidity 编译器版本:

npm install solc@0.4.17

在命令提示符或终端中。

【讨论】:

【参考方案11】:

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

【讨论】:

【参考方案12】:

这是因为安装solc包时安装的solidity编译器和solidity文件中提到的编译器版本不匹配,尝试解决这个问题

安装:

npm install solc@0.4.25

在solidity文件中使用:

pragma solidity^0.4.25;

【讨论】:

【参考方案13】:

您使用的是哪个版本的 solc?

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

npm uninstall solc
npm install solc@0.4.25

【讨论】:

以上是关于npm solc:AssertionError [ERR_ASSERTION]:指定的回调无效的主要内容,如果未能解决你的问题,请参考以下文章

(2022年最新版本)Linux下基于ganache(v6.12.2)的简单投票DAPP(web3@1.7.1)(Node.js: v16.14.0.)(solc:‘0.8.12+commit)

智能合约编译步骤及错误解决

Mac安装升级solc编译器

简单投票DApp

java部署和调用智能合约

solc 编译Solidity