Solidity hints. Часть 14
На этих выходных жара настолько разошлась, что город ввел веерные отключения света по всем районам, и несколько вышек, которые отвечают за интернет в моем ЖК просто "полетели"... Выходные я провел на мобильном интернете, который едва тянул, чтобы отправить сообщение в мессенджеры. Никогда бы не подумал, что буду скучать контенту, в котором "и так ничего нет"...
А мы продолжаем изучать нюансы Solidity и сегодня на очереди следующие пункты из репо Chinmaya:
21. Without a payable keyword in function declaration, it will auto reject all ether sent to it. It will revert.
что в переводе:
Без ключевого модификатора payable в функции, она не сможет принимать Эфир и будет откатывать транзакцию.
Вообще, удивительно, что при таком легком правиле, которое учится на самых первых уроках по Solidity, даже профессиональные протоколы могут упускать это из виду.
Вы можете сами зайти на сайт с подбором багов из контестов - Solodit - и ввести в поиск missing payable. На данный момент там 67 багов по этой теме...
Чаще всего разработчики забывают установить этот модификатор во внешних вызовах между контрактами. Например, из одного контракта мы отправляем Эфир в другой, там в функции делаем расчеты с msg.value, но забываем payable.
Тут единственное, что можно порекомендовать проверять наличие payable в функциях, где есть обработка msg.value, а также отслеживать движение Эфира и токенов между контрактами. Так мы сможете обнаружить и другие возможные баги.
22. Modifiers can also be defined in libraries but their use is limited to functions of the same library
что в переводе:
Модификаторы также можно создавать и в библиотеках, но они могут быть использованы только для функций в этих библиотеках.
Вообще библиотеки такая странная штука в Solidity, что она порой вызывает недоумение и у опытных разработчиков.
Библиотеки не могут хранить Эфир, не имеют своего storage, а то как они работают с вашим контрактом при наличии internal / external функций и говорить не стоит...
А тут еще и модификаторы подоспели.
В целом, тут указывается на то, что если в библиотеке был установлен модификатор, который используется в нескольких функциях, то использовать его в функциях протокола нельзя. Если я правильно помню, компилятор даже не даст собрать контракт с этой ошибкой, поэтому пофиксить ее можно будет еще на этапе разработки.
#modifier #payable #library
Post #1150
956
- 👍 3