牢固性:ParserError:预期的编译指示,导入指令或合同/接口/库定义

时间:2018-12-27 07:36:24

标签: node.js ethereum solidity

我在编写简单合约时也遇到了最新的solc(0.5.2版本)和0.4.25的错误

我尝试了以下步骤

  1. 未安装的Solc:npm卸载solc
  2. 已安装的目标版本:npm install --save solc@0.4.25
  3. node 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) 

4 个答案:

答案 0 :(得分:0)

solc <= v0.4.25

您使用Solidity / solc v0.4.25 的主要问题是构造函数定义。

您当前将构造函数定义为:

function Inbox(string passedName) public

但是,在Solidity中已弃用了与合同同名的定义构造函数。尝试改用constructor关键字定义构造函数。

 constructor(string passedName) public

如果您使用的是solc v0.4.25 ,请参阅documentation,以了解如何将输入正确传递给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

更多,请参阅latest documentation,以了解最新的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)}`);
}

答案 1 :(得分:0)

您似乎没有正确使用solc-js。请参阅文档:https://github.com/ethereum/solc-js

具体来说,您需要构造一个输入对象,然后对其进行字符串化并将其传递给solc.compile()

答案 2 :(得分:0)

问题在于您尚未以UTF-8编码保存合同。 解决您可以在文本编辑器中打开合同文件并将其另存为UTF8的问题 (您可以在VS代码中轻松完成此操作)

答案 3 :(得分:0)

这不是您的情况,但我将把此解决方案留给可能需要此解决方案的人。忘记分号';'时出现此错误。在第一行 class Customer(models.Model): title = models.CharField(max_length=200, null=True, choices=TITLE) first_name = models.CharField(max_length=200, null=True) middle_name = models.CharField(max_length=200, blank=True,default='') last_name = models.CharField(max_length=200, null=True) phone = models.CharField(max_length=200, null=True) country = CountryField() birth_year = models.CharField(max_length=4, null=True) gender = models.CharField(max_length=200, null=True, choices=GENDER) email = models.CharField(max_length=200, null=True) password = models.CharField(max_length=200, null=True) status = models.CharField(max_length=200, null=True,choices=STATUS) date_created = models.DateTimeField(auto_now=True, null=True) profile_pic = models.ImageField(null=True, blank=True, default='images/default.png') role = models.CharField(max_length=200, null=True, choices=ROLE) last_purchase = models.DateTimeField(blank=True, null=True) def __str__(self): return self.first_name 的末尾。所以一定要检查一下。