Solidity: Как мы можем написать сообщение об ошибке в «require»?

Я изучаю Solidity. Насколько мне известно, для обработки ошибок рекомендуется использовать «require». Но я хотел бы информировать пользователей о типах ошибок, которые они совершают, например, аргумент недействителен или находится вне допустимого диапазона и т. д.

Вопрос : Как написать сообщение об ошибке в функциях обработки ошибок типа «require»?


Кроме того, мне нужно знать, имеет ли смысл иметь такие сообщения об ошибках в контракте?

Предложите принять ответ, чтобы заработать репутацию и вознаградить за полезные ответы.

Ответы (6)

Он включен с тех пор Solidity 0.4.22. Существует объединенная ветвь , добавляющая эту функцию в веху.

В документации указано

Есть два других способа запуска исключений: Функцию возврата можно использовать для отметки ошибки и отмены текущего вызова. В будущем можно будет также включить сведения об ошибке в вызов возврата. Ключевое слово throw также можно использовать как альтернативу revert().

Раньше использовалось вот так

require(
    msg.sender == _account
);

А в Solidity 0.4.22и новее его можно использовать так

require(
    msg.sender == _account,
    "Sender not authorized."
);

Добавление причины в качестве второго параметра

Хотя где ты это видишь?

Вы можете использовать Events для регистрации сообщений об ошибках. Нет ничего похожего на оператор печати по прочности, поэтому вы не можете напрямую сообщать пользователям о сообщениях об ошибках. Однако События работают аналогично журналам на других языках, что помогает регистрировать такие случаи и уведомлять об ошибках.

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

Вы можете увидеть реализацию здесь, в этом репо -

Код контракта — https://github.com/Imaginea/lms/blob/master/contracts/MembersLibrary.sol#L27.

Примечание. Доступ к этим кодам состояния также можно получить из ответа, как показано здесь —

https://github.com/Imaginea/lms/blob/master/test/testOrganisation.js#L45 (тестовый пример)

Надеюсь это поможет.

Спасибо за ответ! Я заметил, что в вашем коде вы получаете дробное (плавающее) значение. Подскажите, как это сделать в Solidity?
Я не делал, надо будет узнать. Я вернусь к вам по этому поводу.
@Sanchit Не могли бы вы столкнуться с проблемой, когда вы не можете сгенерировать событие ошибки, потому что у вас недостаточно газа? Я считаю, что стипендии недостаточно, чтобы покрыть генерацию события, если я правильно понял.
К сожалению, обе эти ссылки уже не работают.
Imaginea была приобретена другой компанией, поэтому все ссылки на их Github org исчезли. Пожалуйста, перейдите по ссылкам, используя мой форк - github.com/inovizz/lms

По состоянию на 5 ноября 2017 года это еще невозможно.

Следите за:

https://github.com/ethereum/solidity/issues/1686 Строка причины поддержки в возврате (и, возможно, require/assert)

Когда это будет реализовано, синтаксис вроде require(x>0, "positive number needed");будет работать.

Лучший способ вернуть сообщение об ошибке — инициировать событие на основе результата или вернуть строку. Обычная причина использования require вместо assert заключается в том, что в случае сбоя запроса он возместит оставшийся газ и отменит все изменения. С другой стороны, assert израсходует весь оставшийся газ, прежде чем отменить все изменения. Небольшое редактирование, которое нужно добавить, - это рекомендация добавить сообщение об отклонении в требование, это необязательно, начиная с версии 0.5.8, но компиляторы и реактивные мозги помечают предупреждение, если вы этого не сделаете, и это может стать обязательным в будущем синтаксис останется тем же.

assert(myAmount < __someValue);

require(myAmount < __someValue,"Insufficient funds to allow transfer");

И это довольно хорошее описание, чтобы помочь вам: Как использовать Assert и требовать

Спасибо за редактирование @savard, я дислектик, и иногда это сложно, нажмите «Отправить», прежде чем искать красные подчеркивания. Я бы добавил, что в запросе теперь рекомендуется размещать текстовое сообщение об отклонении в качестве последнего параметра требования! require(myAmount < __someValue, "Сумма должна быть меньше некоторого значения");
Не беспокойтесь @Cyberience, все понятно. Я не дислектик, но с грамматикой у меня тоже проблемы. Кроме того, было бы неплохо добавить возможность добавления сообщения об ошибке в require()оператор — очень полезно при разработке.

Были введены строки причины ошибки для возврата и требования. Подробнее: https://medium.com/secureblocks/solidity-0-4-22-enhancements-94d2b9b8b6fe .

Я предполагаю, что все еще невозможно поймать их на стороне клиента, например web3.js ( github.com/ethereum/web3.js/issues/1707 )
Да. Но ремикс начал показывать причину. Надеюсь, скоро он будет доступен и для web3.

Я компилировал свой код с твердостью ^ 0.4.24, и мне пришлось удалить сообщения об ошибках require(), поскольку, когда я пытался развернуть свой контракт web3.eth.Contract().deploy.send(), я получал « Код контракта не может быть сохранен, пожалуйста, проверьте свой лимит газа. ' ошибка.