我在编写简单合约时也遇到了最新的solc(0.5.2版本)和0.4.25的错误
我尝试了以下步骤
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)
答案 0 :(得分:0)
您使用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)}`);
}
如果您使用的是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
的末尾。所以一定要检查一下。