调用solc.compile编译读取的.sol文件报JSON语法错误如何解决
问题根因
这是新旧版本solc-js接口不兼容导致的错误,也是跟着旧版Solidity课程操作最容易踩的坑:
- 课程里用的v0.4.x及更老版本的solc,
solc.compile()方法支持直接传入Solidity源码字符串完成编译 - 你安装的最新版solc(v0.5.0及以上)修改了接口规则,
compile方法只接受符合Solidity官方标准JSON输入格式的序列化字符串
你直接把读取到的裸源码字符串传入方法,编译器会默认把传入内容当JSON解析,源码开头的pragma字符不符合JSON语法,直接触发第一行第一列的JSON解析错误。
修复方法
按照新版接口要求调整编译入参即可,不需要修改你的Solidity合约文件,具体操作:
- 保留你之前读取合约内容得到的
sourceCode变量不用动 - 替换原来直接传
sourceCode给solc.compile()的写法,先构造标准输入结构,再序列化后传入,参考代码:
// 构造新版solc要求的标准输入对象 const compileInput = { language: "Solidity", sources: { "Greetings.sol": { content: sourceCode } }, settings: { outputSelection: { "*": { "*": ["abi", "evm.bytecode.object"] // 按需配置要输出的编译产物,这里选了最常用的abi和部署字节码 } } } } // 序列化输入后调用编译,再把返回的JSON结果解析成对象 const compiledCode = JSON.parse(solc.compile(JSON.stringify(compileInput)))
- 编译完成后检查
compiledCode.errors数组:如果存在severity为error的条目,根据提示修正合约即可;如果只有warning级别的提示可以直接忽略,从返回结果里就能拿到合约的ABI、字节码等后续部署需要的内容。
注意:Windows环境下读文件带出的
\r\n换行符不会影响solc编译,不需要额外做换行符替换;你当前写的Greetings.sol合约语法、版本声明都是正确的,不需要修改合约内容。
内容的提问来源于stack exchange,提问作者verpas
相关产品推荐
相关产品推荐

