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)}`);
}