Я изучаю Solidity. Насколько мне известно, для обработки ошибок рекомендуется использовать «require». Но я хотел бы информировать пользователей о типах ошибок, которые они совершают, например, аргумент недействителен или находится вне допустимого диапазона и т. д.
Вопрос : Как написать сообщение об ошибке в функциях обработки ошибок типа «require»?
Кроме того, мне нужно знать, имеет ли смысл иметь такие сообщения об ошибках в контракте?
Он включен с тех пор 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 (тестовый пример)
Надеюсь это поможет.
По состоянию на 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 и требовать
require()
оператор — очень полезно при разработке.Были введены строки причины ошибки для возврата и требования. Подробнее: https://medium.com/secureblocks/solidity-0-4-22-enhancements-94d2b9b8b6fe .
Я компилировал свой код с твердостью ^ 0.4.24, и мне пришлось удалить сообщения об ошибках require()
, поскольку, когда я пытался развернуть свой контракт web3.eth.Contract().deploy.send()
, я получал « Код контракта не может быть сохранен, пожалуйста, проверьте свой лимит газа. ' ошибка.
Киберакция