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

npm solc: AssertionError [ERR_ASSERTION]: Invalid callback specified

我正在尝试使用 npm solc 编译 solidity 智能合约。我试图遵循不同的例子。 Link 例如: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发布了一个破解版,这个错误与那个有关。

npm uninstall solc
npm install solc@0.4.25

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

安装:

npm 安装 solc@0.4.25

在 solidity 文件中使用:

pragma solidity^0.4.25;

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

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

工作
pragma solidity ^0.4.17

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

npm install solc@0.4.17

在命令提示符或终端中。

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

npm install --save solc@0.4.25

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

pragma solidity^0.4.25

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

如果您看到类似 this.You 的错误,必须执行以下两个步骤。

  1. 卸载 solc:

    npm 卸载 solc

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

课程中使用的版本:

npm install --save solc@0.4.17

不会破解的最新版本:

npm install --save solc@0.4.25

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

  • unistall solidity 编译器

  • 使用 - npm uninstall solc

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

  • 使用-npm install solc@0.4.17

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

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];
    }
}

记得检查solidity版本和solc版本。它们应该相等。

基本上是版本问题。一些代码语法会在每次更新时发生变化。您不需要 'filesystem' 和 'path' 库。 要解决此问题,请尝试以下代码:

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);

由此,您将获得字节码。

您使用的 Solidity 版本和您使用的 solidity 编译器 (solc) 应该相同。

If pragma solidity^0.4.17 then solc-->version = 0.4.17