【问题标题】:npm solc: AssertionError [ERR_ASSERTION]: Invalid callback specifiednpm solc:AssertionError [ERR_ASSERTION]:指定的回调无效
【发布时间】: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 成功。

标签: node.js npm ethereum solidity


【解决方案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】:

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

              1. 卸载 solc:

                npm 卸载 solc

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

              课程中使用的版本:

              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
                        

                        【讨论】:

                          猜你喜欢
                          • 2021-12-23
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2019-05-05
                          • 1970-01-01
                          • 2015-08-13
                          • 1970-01-01
                          相关资源
                          最近更新 更多