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

Posted

技术标签:

【中文标题】代码未在 nodejs 中编译,抛出意外错误(Web3.js)【英文标题】:Code not compiling in nodejs,throws out an unexpected error(Web3.js) 【发布时间】:2019-04-23 19:40:31 【问题描述】:

我试过关注这个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"]'

【问题讨论】:

你最好去 repo 那里打开一个问题。 (我假设你已经检查了打开的问题) 嘿@Izio,我确实打开了一个问题,但看起来开发人员几天不活跃。快速帮助将不胜感激。谢谢 code 变量是什么?如果是一些 sol 文件,那么您是如何阅读的? 另外,既然编译是由 Solidity 完成的,你为什么不 google google.com/…. 编译函数采用不同的参数,具体取决于您拥有的版本。确保检查文档github.com/ethereum/solc-js#readme 【参考方案1】:

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

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

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

compiledCode = solc.compile(code, 1);

【讨论】:

指定合约数量,给出一个AssertionError【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

我发现,如果您根据 Solidity 文档将输入信息转换为 JSON 格式,那么无论编译器如何,您都可以使用。在编译“字符串化”文件(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);

【讨论】:

这对我有用:它可能需要更多的代码,但不需要弄乱编译器版本。【参考方案5】:

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

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

【讨论】:

这是错误消息的实际解决方案。合同中的 Solc 版本和我们的 pragma 声明应该相同,或者至少兼容【参考方案6】:

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

npm install --save solc@0.4.17 (指定版本)

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

【讨论】:

以上是关于代码未在 nodejs 中编译,抛出意外错误(Web3.js)的主要内容,如果未能解决你的问题,请参考以下文章

SQL 编译错误:位置 6 处的语法错误第 2 行意外'R'

模式在本地处理预期错误,重新抛出意外错误

Jest Enzyme 测试抛出意外的令牌错误

活动作业抛出意外错误

GCP Flex 模板错误:未在 envsetup 文件中设置 py 选项...错误等待容器:意外 EOF

从服务器抛出的自定义错误未在客户端的 HttpErrorResponse 中返回