Код, не компилируемый в nodejs, выдает неожиданную ошибку (Web3.js) - PullRequest
0 голосов
/ 21 ноября 2018

Я пытался следовать этому 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"}]}'

Ответы [ 4 ]

0 голосов
/ 24 февраля 2019

Я обнаружил, что если вы вводите свои входные данные в формат JSON для документов Solidity, то вы хороши независимо от компилятора.Перед компиляцией "stringify" файла (JSON.stringify).После того, как файл скомпилирован, объект будет в строковой форме, поэтому вы можете проанализировать его (JSON.parse), чтобы работать с ним оттуда.Вот пример кода с console.log () контракта в форме JSON, чтобы вы могли увидеть, с чем вы работаете.

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);
0 голосов
/ 02 декабря 2018

Я узнал, что ответ был из-за конфликтов версий npm.Убедитесь, что у вас правильная версия solc.Refer это репо

0 голосов
/ 16 декабря 2018

Я нашел другое решение.В моем случае проблема заключалась в том, что File.sol представлял собой умный контракт на необработанную твердость, но вы должны поместить Compiler Standard Input JSON в solc.compile().Это работает для Солидности 0.5.1.В этот поток - это весь мой процесс шаг за шагом до отправки транзакции.

0 голосов
/ 21 ноября 2018

Вы должны указать, какой тип кодировки используется для файла солидности.

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

и указать количество контрактов, которые вы собираетесь скомпилировать.

compiledCode = solc.compile(code, 1);
...