Solidity部署合约执行npm run test报JSON解析错误该如何解决?
错误根因
你收到的SyntaxError: Unexpected token o in JSON at position 1报错,本质是你对已经解析完成的JS对象执行了JSON.parse操作:当你给JSON.parse传入非JSON字符串的JS对象时,方法会默认先将对象转为"[object Object]"字符串,解析到第一个字符o时不符合JSON格式要求,直接抛出错误。
你的错误出在Inbox.test.js的部署逻辑里,完全搞反了ABI和字节码的传参位置,还多做了不必要的JSON解析:
// 错误写法 inbox = await new web3.eth.Contract(JSON.parse(evm)) .deploy({ data: abi, arguments: ['Hi there!'] }) .send({ from: accounts[0], gas: '1000000' })
修复方案
直接替换beforeEach里的部署逻辑为以下代码即可:
beforeEach(async () => { accounts = await web3.eth.getAccounts(); // 构造Contract实例第一个参数直接传ABI,不需要JSON.parse inbox = await new web3.eth.Contract(abi) // deploy的data参数传evm下的字节码内容 .deploy({ data: evm.bytecode.object, arguments: ['Hi there!'] }) .send({ from: accounts[0], gas: '1000000' }) })
修正点说明:
web3.eth.Contract构造函数第一个入参要求是合约ABI,你从compile.js导出的abi本身就是已经解析完成的JS数组,不需要额外调用JSON.parsedeploy配置的data字段要求传入合约编译后的字节码,对应编译输出里的evm.bytecode.object字段,你之前错误将ABI传给了这个参数- 你从
compile.js导出的evm本身就是JS对象,不需要再做JSON解析
额外校验点
如果修复后还有问题,可以确认下你安装的solc依赖版本和合约里声明的pragma solidity >=0.7.0 <0.9.0范围匹配,建议安装0.8.x版本的solc,避免编译输出结构不一致。
内容的提问来源于stack exchange,提问作者Lukas Luke Stateczny
相关产品推荐
相关产品推荐

