代码没有在nodejs中编译,会抛出一个意外错误(Web3.js)



我试着遵循这个回购:-

但是我在编译代码时遇到了以下错误:-

code = fs.readFileSync('Voting.sol').toString()
solc = require('solc')
compiledCode = solc.compile(code)

它抛出了这个错误:-

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

我发现,如果您根据solidity文档将输入信息放入JSON格式,那么无论编译器如何,您都是好的。在编译"stringify"之前,文件(JSON.stringfy(。编译文件后,对象将以字符串形式存在,因此您可能需要解析它(JSON.parse(以从那里使用它。这里有一个代码示例,带有JSON形式的console.log((,这样您就可以看到正在使用的内容。

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 solcInput = {
language: "Solidity",
sources: { 
contract: {
content: source
}
},
settings: {
optimizer: {
enabled: true
},
evmVersion: "byzantium",
outputSelection: {
"*": {
"": [
"legacyAST",
"ast"
],
"*": [
"abi",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.gasEstimates"
]
},
}
}
};
solcInput = JSON.stringify(solcInput);
var contractObject = solc.compile(solcInput);
contractObject = JSON.parse(contractObject);
console.log(contractObject);

solc的版本和您的合约应该是相同的。

例如,如果您的合同使用pragma solidity ^0.4.18;,那么您应该使用npm install solc@0.4.18安装相同版本的solc。

我也面临同样的问题。下载并检查是否安装了solc版本的正确版本,否则会出现错误。我没有指定要下载的版本,它下载了默认版本。

npm安装-保存solc@0.4.17(指定版本(

"'{"errors":[{"component":"general","formattedMessage":"*第1行,第1列\n语法错误:需要值、对象或数组。\n*第1列,第2列\n JSON值后有多余的非空白。\n","message":"*Line 1,Column 1\n语法错误:应该值、对象和数组

您必须指定solidity文件使用的编码类型。

code = fs.readFileSync('Voting.sol', 'utf8');

并且您必须指定要编译的合同数量。

compiledCode = solc.compile(code, 1);

我发现答案是因为npm版本冲突。确保您拥有正确版本的solc。参考本回购

我找到了另一个解决方案。在我的案例中,问题是File.sol是原始的solidity智能合约,但您需要将Compiler Standard Input JSON放入solc.compile()中。这适用于Solidity 0.5.1。在这个线程中是我一步一步直到事务发送的整个过程。

相关内容

最新更新