У меня возникла ошибка при компиляции. Вместо этого используйте "constructor(...) { ... }"

Я следил за лекцией на Udemy. Но у меня ошибка

вот мой 'Inbox/contracts/Inbox.sol'

pragma solidity ^0.4.17;
contract Inbox {
    string public message;

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

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

и вот файл «Inbox/compile.js»

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');

console.log(solc.compile(source, 1));

и после того, как я скомпилирую этот файл на терминале

узел compile.js

получил ошибку, как показано ниже

  errors: 
           [ ':6:5: Warning: Defining constructors as functions with the same name 
as the contract is deprecated. Use "constructor(...) { ... }" 
    instead.\n    function Inbox(string initialMessage) public {\n    ^ 
    (Relevant source part starts here and spans across multiple lines).\n' ],

Я использую мак. Одна вещь, которую я сделал иначе, чем лекция, была «npm init» в другой папке вместо папки «Входящие», и я скопировал и вставил все созданные файлы в папку «Входящие».

Мирг ответ близок. Но Алант прав, не ставьте ключевое слово функции перед ключевым словом конструктора.
в предыдущей версии солидность была правильной. Недавно он был изменен, и мой пост обновлен.

Ответы (4)

Это должно быть предупреждение, а не ошибка. В любом случае, используя этот синтаксис

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

устарело в новой версии Solidity. Вы должны использовать constructorвместо имени контракта

constructor(string initialMessage) public {
    message = initialMessage;
}

это будет компилироваться без предупреждений

Кроме того, если вы делаете это, убедитесь, что вы изменили первую строку на pragma solidity ^0.4.22;, иначе, если кто-то попытается скомпилировать ваш контракт, используя старый компилятор, он не будет работать должным образом.
Но если вы измените имя функции конструктора с theContractName на конструктор, то как вы можете развернуть этот контракт из другого контракта??? Как исправить этот код после изменения имени функции-конструктора: address addr = new theContractName(..); ???
так же, как и раньше, просто создайте новый экземпляр сnew

Просто используйте конструктор() должно быть хорошо.

constructor(string initialMessage) public {
    message = initialMessage;
}

Если вы используете конструктор функций(...)... , я думаю, вы получите следующее предупреждение:

Предупреждение: эта функция называется «конструктор», но не является конструктором контракта. Если вы хотите, чтобы это был конструктор, используйте "constructor(...) { ... }" без ключевого слова "function" для его определения.

Я лично просто изменил компилятор, чтобы решить проблему. Вместо компилятора версии 4.17+ используйте компилятор версии 4.17. Надеюсь, это помогло:

Не забудьте добавить memoryили storageобъявить такие параметры, как строка в конструкторе

 constructor(string memory initialMessage) {
        message = initialMessage;
    }