坚固性 - 部署合约时,我得到"SyntaxError: Unexpected token o in JSON at position 1"



我刚开始学习solidity,但我无法成功部署合同。当我npm run test时,我得到:SyntaxError: Unexpected token o in JSON at position 1

我的合同Inbox.sol:

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
contract Inbox {
string public message;
constructor(string memory initialMessage) {
message = initialMessage;
}
function setMessage(string memory newMessage) public {
message = newMessage;
}
}

我的编译器compile.js:

const path = require('path');
const fs = require('fs');
const solc = require('solc');
const inboxPath = path.resolve(__dirname, 'contracts', 'Inbox.sol');
const source = fs.readFileSync(inboxPath, 'utf8');
var input = {
language: 'Solidity',
sources: {
'Inbox.sol' : {
content: source
}
},
settings: {
outputSelection: {
'*': {
'*': [ '*' ]
}
}
}
}; 
var output = JSON.parse(solc.compile(JSON.stringify(input)))
module.exports = output.contracts["Inbox.sol"]["Inbox"];

我的摩卡测试Inbox.test.js:

const assert = require('assert');
const ganache = require('ganache-cli');
const Web3 = require('web3');
const web3 = new Web3(ganache.provider());
const { abi, evm } = require('../compile.js')
var accounts;
var inbox;
beforeEach(async () => {
accounts = await web3.eth.getAccounts();
inbox = await new web3.eth.Contract(JSON.parse(evm))
.deploy({ data: abi, arguments: ['Hi there!'] })
.send({ from: accounts[0], gas: '1000000' })
})
describe('Inbox Contract', ()=> {
it('Can test', ()=> {
console.log(inbox)
})
})

我不确定JSON的哪一部分是错误的,因为它无法正确解析它。当我在Inbox.test.js中登录abi时,我会得到这个:

Inbox Contract
[ { inputs: [ [Object] ],
stateMutability: 'nonpayable',
type: 'constructor' },
{ inputs: [],
name: 'message',
outputs: [ [Object] ],
stateMutability: 'view',
type: 'function' },
{ inputs: [ [Object] ],
name: 'setMessage',
outputs: [],
stateMutability: 'nonpayable',
type: 'function' } ]

记录evm给了我一个很大的代码块,我不会在这里粘贴。

在版本pragma solidity ^0.8.9中,我的工作代码看起来像这个

Inbox.sol

pragma solidity ^0.8.9;
contract Inbox {
string public message;

constructor(string memory initialMessage) {
message = initialMessage;
}

function setMessage(string memory newMessage) public {
message = newMessage;
}
}

compile.js

const path = require('path');
const fs = require('fs');
const solc = require('solc');
const inboxPath = path.resolve(__dirname, 'contracts', 'Inbox.sol');
const source = fs.readFileSync(inboxPath, 'utf8');
const input = {
language: 'Solidity',
sources: {
'Inbox.sol': {
content: source,
},
},
settings: {
outputSelection: {
'*': {
'*': ['*'],
},
},
},
};
module.exports = JSON.parse(solc.compile(JSON.stringify(input))).contracts['Inbox.sol'].Inbox;

收件箱测试.js

const assert = require('assert');
const ganache = require('ganache-cli');
const Web3 = require('web3');
const web3 = new Web3(ganache.provider());
const { abi, evm } = require('../compile');
let accounts;
let inbox;
beforeEach(async () => {
// Get a list of all accounts
accounts = await web3.eth.getAccounts();
inbox = await new web3.eth.Contract(abi)
.deploy({
data: evm.bytecode.object,
arguments: ['Hi there!'],
})
.send({ from: accounts[0], gas: '1000000' });
});
describe('Inbox', () => {
it('deploys a contract', () => {
console.log(inbox);
});
});

在您的Inbox.test.js文件中,我可以看到您在部署合同时传递了错误的参数。您需要在创建新合同时传递interface (abi)数据,并在deploy()函数中将bytecode作为data对象传递

代码应该如下所示:

inbox = await new web3.eth.Contract(abi)
.deploy({ data: evm.bytecode.object, arguments: ['Hi there!'] })
.send({ from: accounts[0], gas: '1000000' })


此外,请检查solidity编译器版本。转到您的package.json文件。在dependencies对象下,您将找到solc版本。在这里,请确保solidity版本与您在Inbox.sol文件中使用的版本相同

如果版本不同,请使用npm安装正确的版本在我的情况下,我在solidity文件中使用了^0.8.8。所以我运行以下命令:

npm install solc@0.8.8

您可以在这里查看我的相关答案:SyntaxError:JSON中位置1处的意外标记o。在Solidity版本^0.8.7 中

相关内容