代码未在 nodejs 中编译,抛出意外错误(Web3.js)

abh*_*yak 6 node.js blockchain solidity web3js

我尝试遵循此repo :-

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

code = fs.readFileSync('Voting.sol').toString()
solc = require('solc')
compiledCode = solc.compile(code)
Run Code Online (Sandbox Code Playgroud)

它抛出了这个错误:-

'{"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"}]}'
Run Code Online (Sandbox Code Playgroud)

小智 7

我发现,如果您按照 Solidity 文档将输入信息放入 JSON 格式,那么无论编译器如何,您都很好。在编译“stringify”文件(JSON.stringify)之前。文件编译后,对象将采用字符串形式,因此您可能需要解析它 (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);
Run Code Online (Sandbox Code Playgroud)

  • 这对我来说很有效:可能需要更多代码,但不需要搞乱编译器版本。 (2认同)

小智 6

solc 的版本和你的合约应该是一样的。

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


abh*_*yak 0

我发现答案是因为 npm 版本冲突。确保您拥有正确版本的 solc。请参阅此存储库