# Функция-верификатор
Функция-верификатор — функция dApp-скрипта, которая отвечает за верификацию транзакций и ордеров, отправляемых с аккаунта dApp (то есть работает аналогично скрипту аккаунта).
У dApp-скрипта может быть только одна функция-верификатор. Она помечается аннотацией @Verifier(tx)
, где tx: Transaction|Order
— текущая проверяемая транзакция или ордер.
Функция-верификатор не имеет аргументов.
Возможными результатами выполнения функции являются:
true
(отправка разрешена),false
(отправка запрещена),- ошибка (отправка запрещена).
Если в dApp нет функции-верификатора, то выполняется верификация по умолчанию, то есть проверка, что первое подтверждение в массиве proofs
содержит подпись аккаунта-отправителя. Следующая функция полностью соответствует реализации по умолчанию:
@Verifier(tx)
func verify() = {
sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
}
Если функция-верификатор определена, выполняется только проверка этой функцией, подтверждения дополнительно не проверяются.
⚠️ Если сложность функции-верификатора превышает порог сложности отправителя, минимальная комиссия за транзакцию, отправляемую с аккаунта dApp, увеличивается на 0,004 WAVES. (До активации фичи № 16 “Ride V5, dApp-to-dApp invocations” дополнительная комиссия требовалась независимо от наличия и сложности функции-верификатора.)
# Данные, доступные функции-верификатору
Поля текущей верифицируемой транзакции/ордера, в том числе подтверждения (
proofs
). Переменная, имя которой указано в аннотации функции-верификатора, содержит эту транзакцию или ордер. Набор полей зависит от типа транзакции/ордера, см. разделы Структуры транзакций, Order.Данные блокчейна.
⚠️ Данные блокчейна доступны только при проверке транзакции и недоступны при проверке ордера (
case t: Order
).
# Пример
dApp с приведенной ниже функцией-верификатором разрешает только транзакции перевода с количеством токена менее 100. Отправка транзакций другого типа и ордеров запрещена. Задать правила верификации в зависимости от типа транзакции (или ордера) можно с помощью оператора match.
@Verifier(tx)
func verify() = {
match tx {
case ttx:TransferTransaction => ttx.amount < 100 && sigVerify(ttx.bodyBytes, ttx.proofs[0], ttx.senderPublicKey)
case _ => false
}
}