合约编译solc.compile()时报错‘{“errors”:[{“component”:“general”,“formattedMessag

1.首先编译脚本是:

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

const contractPath = path.resolve(__dirname,'../contracts','Voting.sol');
const contractSource = fs.readFileSync(contractPath,'utf-8');
let compileResult = solc.compile(contractSource);

console.log(compileResult);
~                           

此时输出 compileResult会报错:

‘{“errors”:[{“component”:“general”,“formattedMessage”:"* Line 1, Column 2\n Syntax error: value, object or array expected.\n* Line 1, Column 3\n Extra non-whitespace after JSON value.\n",“message”:"* Line 1, Column 2\n Syntax error: value, object or array expected.\n* Line 1, Column 3\n Extra non-whitespace after JSON value.\n",“severity”:“error”,“type”:“JSONError”}]}’

应将:

let compileResult = solc.compile(contractSource);

改为:

let compileResult = solc.compile(contractSource,1);

1代表:打开solc工具里面的优化器

然后继续编译输出comileResult时候又报错:

Uncaught AssertionError [ERR_ASSERTION]: Invalid callback object specified.
    at runWithCallbacks (/simple_voting_dapp/node_modules/solc/wrapper.js:97:7)
    at compileStandard (/simple_voting_dapp/node_modules/solc/wrapper.js:207:14)
    at Object.compileStandardWrapper [as compile] (/simple_voting_dapp/node_modules/solc/wrapper.js:214:14)
    at repl:1:25
    at Script.runInThisContext (vm.js:120:20)
    at REPLServer.defaultEval (repl.js:433:29)
    at bound (domain.js:426:14)
    at REPLServer.runBound [as eval] (domain.js:439:12)
    at REPLServer.onLine (repl.js:760:10)
    at REPLServer.emit (events.js:327:22)
    at REPLServer.EventEmitter.emit (domain.js:482:12)
    at REPLServer.Interface._onLine (readline.js:329:10)
    at REPLServer.Interface._line (readline.js:658:8)
    at REPLServer.Interface._ttyWrite (readline.js:999:14)
    at REPLServer.self._ttyWrite (repl.js:851:9)
    at ReadStream.onkeypress (readline.js:205:10) {
  generatedMessage: false,
  code: 'ERR_ASSERTION',
  actual: false,
  expected: true,
  operator: '=='
}
  • 查询了资料说solidity合约的编译版本要和solc编译版本一致,我试了一试 ,将solc版本改为0.4.22,同时将solidity版本改为>=0.4.22 <0.7.0 ,最后编译通过了,得到了compileResult.

但是此方法终究治标不治本啊,对于新版本的solc和solidity的编译版本如何是好?

正确的解决办法:

也可以查看:ethereum/solc-js: Javascript bindings for the Solidity compiler (github.com)https://github.com/ethereum/solc-js#readme

将编译的脚本改为:

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

const contractPath = path.resolve(__dirname,'../contracts','Voting.sol');
const contractSource = fs.readFileSync(contractPath,'utf-8');

var input = {
  language: 'Solidity',
  sources: {
    'Voting.sol': {
      content: contractSource
    }
  },
  settings: {
    outputSelection: {
      '*': {
        '*': ['*']
      }
    }
  }
};

var compileResult = JSON.parse(solc.compile(JSON.stringify(input)));

console.log(compileResult);

最终成功!!!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_47450271

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值