Solidity: ParserError: Ожидаемая прагма, директива импорта или определение контракта / интерфейса / библиотеки - PullRequest
0 голосов
/ 27 декабря 2018

Я получаю сообщение об ошибке как с последней версией solc (версия 0.5.2), так и с 0.4.25, когда пишу простой контракт

Я попытался выполнить следующие шаги

  1. Удаление Solc: npm uninstall solc
  2. Установленная целевая версия: npm install --save solc@0.4.25
  3. узел compile.js (приведенный ниже код)

      { contracts: {},
      errors:
       [ ':1:1: ParserError: Expected pragma, import directive or contract
     /interface/library definition.\nD:\\RND\\BlockChain\\contracts\\Inbox.sol\n^\n' ],sourceList: [ '' ],sources: {} }
    

Compile.js

const path  = require('path');
const fs = require('fs');
const solc = require('solc');
const inPath = path.resolve(__dirname,'contracts','Inbox.sol');
const src =  fs.readFileSync(inPath,'UTF-8');
const res = solc.compile(inPath, 1);

console.log(res);

Inbox.sol

pragma solidity ^0.4.25;

contract Inbox {
    string  message;


    function Inbox(string passedName) public {
        message = passedName;
    } 

    function setMessage(string newMsg) public {
        message = newMsg;
    }

    function getMessage() public view returns(string){
        return message;
    }
}

Кодхорошо работал на Remix , для версии 0.5.2 я добавил тег памяти, чтобы он компилировался на Remix.

ex:   function setMessage(string **memory** newMsg) 

Ответы [ 2 ]

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

Вы неправильно используете solc-js.Пожалуйста, ознакомьтесь с документацией: https://github.com/ethereum/solc-js

В частности, вам нужно создать входной объект, а затем его преобразовать в строку и передать в solc.compile().

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

solc <= v0.4.25 </h2> Ваша основная проблема с использованием Solidity / solc v0.4.25 - это определение вашего конструктора. В настоящее время ваш конструктор определен как: function Inbox(string passedName) public Однако определение конструкторов с тем же именем, что и у контракта, не поддерживается в Solidity.Попробуйте определить конструктор с помощью ключевого слова constructor. constructor(string passedName) public Если вы используете solc v0.4.25 , обратитесь к документации , чтобыпонять, как правильно передать ввод в функцию compile.См. Мою ссылку ниже: const input = { 'Inbox.sol': fs.readFileSync(path.resolve(__dirname, 'contracts', 'Inbox.sol'), 'utf8') } const output= solc.compile({sources: input}, 1); if(output.errors) { output.errors.forEach(err => { console.log(err); }); } else { const bytecode = output.contracts['Inbox.sol:Inbox'].bytecode; const abi = output.contracts['Inbox.sol:Inbox'].interface; console.log(`bytecode: ${bytecode}`); console.log(`abi: ${JSON.stringify(JSON.parse(abi), null, 2)}`); } solc> = v0.5.0

Если вы используете Solidity / solc v0.5.2 , вам также необходимо исправитьconstructor определение.Кроме того, вам нужно будет добавить ключевое слово memory к каждому function, который возвращает или принимает тип string.

Например:

function setMessage(string newMsg) public

должен быть объявлен как:

function setMessage(string memory newMsg) public

Далее, пожалуйста, ознакомьтесь с последней документацией , чтобы понятьразличия между последним компилятором Solidity и более старой версией.Смотрите мою ссылку ниже, чтобы узнать, как определить вход для функции compile с использованием новейшего компилятора:

const input = { 
    language: "Solidity",
    sources: {
        "Inbox.sol": {
            content: fs.readFileSync(path.resolve(__dirname, "contracts", "Inbox.sol"), "utf8") 
        }
    },
    settings: {
        outputSelection: {
            "*": {
                "*": [ "abi", "evm.bytecode" ]
            }
        }
    }
}
const output = JSON.parse(solc.compile(JSON.stringify(input)));

if(output.errors) {
    output.errors.forEach(err => {
        console.log(err.formattedMessage);
    });
} else {
    const bytecode = output.contracts['Inbox.sol'].Inbox.evm.bytecode.object;
    const abi = output.contracts['Inbox.sol'].Inbox.abi;
    console.log(`bytecode: ${bytecode}`);
    console.log(`abi: ${JSON.stringify(abi, null, 2)}`);
}
...