В документации Solidity модификаторы определяются следующим образом: Модификаторы можно использовать для изменения поведения функций декларативным способом. Из этого определения можно понять, что модификатор направлен на изменение поведения функции, к которой он присоединен. Например, автоматическая проверка условий перед выполнением функции (для этого модификаторы в основном и используются). Модификаторы уменьшают избыточность кода. Вы можете повторно использовать один и тот же модификатор в нескольких функциях, если вы проверяете одно и то же условие в смарт-контракте. Основное применение модификаторов - автоматическая проверка условия перед выполнением функции. Если функция не удовлетворяет требованию модификатора, возникает исключение, и выполнение функции прекращается. Модификаторы могут быть созданы (объявлены) следующим образом: Вы можете написать модификатор с аргументами или без них. Если модификатор не имеет аргумента, можно опустить круглые скобки (). Давайте начнем с базовых примеров, приведенных ниже. Символ _; называется подстановочным знаком. Он объединяет код функции с кодом модификатора. Другими словами, тело функции (к которой присоединен модификатор) будет вставлено туда, где в определении модификатора появляется специальный символ _;. Используя термины документации Solidity, этот символ "возвращает поток выполнения к исходному коду функции". Модификатор должен содержать символ _; в своем теле. Это обязательно. Вместо _; будет подставлена функция, поэтому выполнение функции зависит от того места, где вы укажите этот символ: до, посредине или после основного кода модификатора. Как показано в примере выше, вы можете поместить символ _; в начало, середину или конец тела модификатора. На практике наиболее безопасной схемой использования является размещение _; в конце. В этом сценарии модификатор служит для последовательной проверки условий, то есть для того, чтобы сначала проверить условие, а затем продолжить выполнение функции. Приведенный ниже код демонстрирует это на примере: Модификаторы также могут принимать аргументы. Как и в случае с функцией, перед именем модификатора нужно передать тип переменной и её имя в круглых скобках. Используя приведенный выше пример, вы можете убедиться, что пользователь (или смарт-контракт), вызывающий одну из ваших функций смарт-контракта, отправил несколько eth для оплаты требуемого сбора. Давайте проиллюстрируем это на простом примере. Вы хотите, чтобы каждый пользователь, желающий забрать свои деньги, хранящиеся в смарт-контракте, платил минимальную сбор в размере 2,5 % eth в пользу смарт-контракта. Модификатор с аргументами может исполнить такое поведение. Иной пример: нужно проверить, что функцию может вызывать только определенный адрес. Все аргументы вводимые в функцию можно использовать в модификаторе. К одной функции можно применить несколько модификаторов. Это можно сделать следующим образом: Модификаторы будут выполняться в том порядке, в котором они определены, то есть слева направо. Так, в приведенном выше примере функция будет проверять следующие условия перед запуском: onlyBy(...) : является ли адрес, вызывающий смарт-контракт, владельцем? onlyAfter(...) : является ли вызывающий владельцем смарт-контракта более 6 недель? Как и функции, модификаторы, определенные в одном смарт-контракте, могут быть переопределены другими смарт-контрактами, которые являются производными от него. Как следует из документации Solidity: Модификаторы являются наследуемыми свойствами смарт-контрактов и могут быть переопределены производными смарт-контрактами. Поэтому символы, введенные в модификатор, не видны в функции (поскольку модификатор может измениться, если он будет переопределен в производном смарт-контракте). Если ваш смарт-контракт содержит переменную типа enum, вы можете проверить значение, которое она содержит, передав один из доступных вариантов в качестве аргумента модификатору. Можно использовать модификатор для проверки того, что функция может быть вызвана и выполнена только по определенному адресу. Или вместо того чтобы ограничивать вызов функции только одним определенным пользователем, мы можем дать это право запуска функции нескольким заранее определенным пользователям. Еще один отличный вариант использования модификаторов - проверка вводимых данных. Ниже приведены некоторые примеры, основанные на различных типах данных. Мир блокчейна не допускает ошибок. Если eth или другие ценности были случайно отправлены не по адресу, то тут нет кого-то, к которому можно обратиться с претензиями, поскольку нет банка или центрального органа, контролирующего транзакции. Однако вы можете подготовить свой смарт-контракт к непредвиденным ситуациям, сказав ему, что делать, когда пользователи ведут себя странно и шлют в ваши функции eth. Ваш смарт-контракт может взимать сборы с пользователей, которые хотят вызвать определенную функцию вашего смарт-контакта. Мы уже видели, как модификатор может быть использован для возврата eth, отправленных случайно на смарт-контракт. Но как насчет случая, когда пользователь отправляет больше eth, чем следовало бы? Пример реализации выглядит следующим образом. Модификатор может быть использован для сложных образцов проектирования. К ним относится образец проектирования - Машина состояний. Посмотрите на модификатор ReentrancyGuard из набора OpenZeppelin. SUSHISWAP приводит отличный пример модификатора, который позволяет только внешним учетным записям (т.е. пользователям) требовать вознаграждения по своему смарт-контракту. В результате это не позволяет другим смарт-контрактам вызывать функцию, к которой прикреплен модификатор. Этот модификатор дополняет предыдущий, который проверял, принадлежит ли address человеку или является смарт-контрактом. А этот модификатор проверяет есть ли по адресу код кода, используя опкод extcodesize(...) через assembly. Если есть, то это смарт-контракт. Модификаторы позволяют снизить избыточность кода. При этом при помощи модификаторов можно создавать композицию чистых функций. Какие самые интересные модификаторы вы писали или находили? Поделитесь в ответах. Учебник по Solidity. Всё о модификаторах Учебник по Solidity. Все об адресах Веб3 исследования и эксклюзивная разработка