以太坊Solidity开发使用solc编译合约时的多类报错问题求助
Solidity合约编译脚本常见报错排查方案
你在实操中通过Node.js内置path、fs模块定位读取contracts目录下的inbox.sol合约源码,引入solc模块开展编译工作,当前无JavaScript、TypeScript开发经验,使用的Node.js版本为6.14.8,项目package.json配置的solc依赖版本为^0.8.0,实操过程中遇到的三类报错对应排查和解决方法如下:
一、编辑器弹出ts(7016) 缺少solc模块TypeScript声明提示
- 报错本质:属于编辑器TypeScript语法检查的提示,不是脚本运行时错误。因为项目没有安装solc对应的TypeScript类型声明文件,编辑器无法识别solc模块导出的接口结构,就会把引入的solc模块隐式标记为any类型,触发ts(7016)提示。
- 解决方法:
- 执行
npm install @types/solc --save-dev安装匹配的TypeScript声明文件,安装完成后重启编辑器的TS服务即可消除提示 - 该提示不影响脚本实际运行,不需要为了消除提示修改业务编译代码
- 执行
二、执行node compile.js抛出TypeError: Cannot read property 'compile' of undefined运行时错误
注意:多次卸载、重装solc依赖无法解决这类问题,本质是环境与模块的版本适配问题,不是solc包本身安装损坏
- 报错原因:
- 当前使用的Node.js版本为6.14.8,属于已停止维护的老旧版本,而solc 0.5.x及以上版本要求Node.js最低版本不低于10.16.0,低版本Node加载高版本solc时会出现模块导出结构不匹配的问题,获取到的solc实例为空对象,自然找不到
compile方法 - 教程中写的直接通过
require('solc')获取带compile方法实例的写法,只适配低版本solc,高版本solc的模块导出结构已变更,直接调用顶层的compile属性自然会报未定义错误
- 当前使用的Node.js版本为6.14.8,属于已停止维护的老旧版本,而solc 0.5.x及以上版本要求Node.js最低版本不低于10.16.0,低版本Node加载高版本solc时会出现模块导出结构不匹配的问题,获取到的solc实例为空对象,自然找不到
- 解决方法:
- 优先升级Node.js到长期维护版本(至少16.x以上),淘汰6.14.8的老旧版本,从环境层面解决兼容性问题
- 匹配solc版本调整引入逻辑:如果使用0.4.17版本的solc,直接require获取实例的写法是可用的;如果使用0.8.x版本的solc,需要按照对应版本的接口说明,通过初始化方法获取可操作的编译实例,不要直接读顶层的compile属性
- 调试时可在脚本中打印引入的solc对象结构,确认存在可调用的编译方法后再开展后续编译逻辑
三、切换solc版本后触发AssertionError [ERR_ASSERTION]: Invalid callback object specified断言错误
- 报错原因:solc从0.6.x版本开始调整了编译接口的入参要求,旧版本无回调的编译调用方式已被废弃,新版本要求编译时必须传入合规的回调对象,用来处理合约中的import依赖、外部资源拉取等逻辑。如果直接沿用旧教程的调用参数,没有传入合规的回调对象,就会触发内置的断言校验失败。
- 解决方法:
- 如果是跟随基于solc 0.4.17编写的教程实操,不要直接升级到最新版solc,安装时通过
npm install solc@0.4.17 --save-exact锁定与教程完全一致的版本,不要使用带范围的^0.8.0配置,避免自动拉取高版本带来的接口不兼容 - 如果必须使用高版本solc,按照对应版本的接口要求传入合规的回调对象,实现合约依赖的解析逻辑,不要沿用旧的无回调编译写法
- 如果是跟随基于solc 0.4.17编写的教程实操,不要直接升级到最新版solc,安装时通过
通用排查注意事项
- 对和强绑定教程配套的工具类库,尽量通过
--save-exact锁定完全一致的版本,不要依赖版本范围规则自动升级,减少接口变更带来的报错 - 安装依赖前先核对Node.js版本与工具库的最低版本要求,不要在低版本Node上强行运行高版本Node工具
- 编辑器弹出的TS语法提示类报错大多不影响脚本实际运行,不要一看到语法提示就修改核心业务逻辑
内容的提问来源于stack exchange,提问作者Hana Ali
相关产品推荐
相关产品推荐

