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

Code not compiling in nodejs,throws out an unexpected error(Web3.js)

我试着按照这个 repo:-

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

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 文件的编码类型。

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

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

compiledCode = solc.compile(code, 1);

我找到答案是因为npm版本冲突。确保您拥有 solc.Refer 这个 repo

的正确版本

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

我发现如果您根据 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);

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

例如,如果您的合同使用 pragma solidity ^0.4.18;,那么您应该使用 npm install solc@0.4.18.

安装相同版本的 solc

我也遇到了同样的问题。下载并检查是否安装了正确版本的 solc 版本,否则它会给你 error.I 没有指定要下载的版本,它下载了默认版本。

npm install --save solc@0.4.17 (specify the version)

"'{"errors":[{"component":"general","formattedMessage":"* 第 1 行,第 1\n 列语法错误:值,需要对象或数组。\n* 第 1 行,第 2\n 列 JSON 值后的额外非空白。\n","message":"* 第 1 行,第 1\n 列语法错误:需要值、对象或数组。\n* 第 1 行,列 2\n JSON 值后的额外非空白。\n","severity":"error", "type":"JSONError"}]}'"