# Скрипт ассета
Скрипт ассета позволяет верифицировать транзакции с участием ассета (токена), то есть разрешать или запрещать транзакцию в зависимости от выполнения заданных условий.
Ассет с прикрепленным к нему скриптом называется смарт-ассетом. О создании и использовании смарт-ассетов читайте в разделе Смарт-ассет.
⚠️ Обратите внимание:
- Cкрипт ассета может верифицировать только транзакции, но не ордера.
- Если токен выпущен без скрипта, то скрипт нельзя добавить позже.
- Удалить скрипт и сделать смарт-ассет обычным ассетом невозможно.
- Смарт-ассет нельзя сделать спонсорским.
# Формат скрипта ассета
Код скрипта состоит из следующих частей:
# Директивы
Скрипт ассета начинается с директив:
{-# STDLIB_VERSION 8 #-}
{-# CONTENT_TYPE EXPRESSION #-}
{-# SCRIPT_TYPE ASSET #-}
Приведенные директивы сообщают компилятору, что:
- в скрипте используется Стандартная библиотека версии 8;
- скрипт завершается логическим выражением;
- скрипт будет привязан к ассету.
# Вспомогательные определения
После директив можно определить вспомогательные переменные и функции.
Пример:
let someConstant = 42
func doSomething() = {
height + someConstant
}
# Логическое выражение
Выражение проверяет транзакции с участием ассета на соответствие заданным условиям. Если условия не соблюдаются, транзакция будет отклонена. Возможными результатами вычисления выражения являются:
true
— транзакция разрешена,false
— транзакция отклонена,- ошибка — транзакция отклонена.
С помощью оператора match ... case можно настроить разные условия в зависимости от типа транзакции. Например, следующее выражение запрещает изменение скрипта ассета и разрешает остальные транзакции:
match tx {
case t : SetAssetScriptTransaction => false
case _ => true
}
# Неуспешные транзакции
Если скрипт ассета отклонил транзакцию обмена при ее добавлении в блок (при условии что она прошла проверку подписи отправителя или проверку скриптом аккаунта), она сохраняется на блокчейне с атрибутом "applicationStatus": "script_execution_failed"
. С отправителя транзакции (матчера) взимается комиссия. Других изменений в балансах транзакция не влечет, в частности, комиссия матчера с отправителей ордеров не взимается.
Если скрипт ассета отклонил транзакцию вызова скрипта при ее добавлении в блок (при условии что она прошла проверку подписи отправителя или проверку скриптом аккаунта, а сложность вычислений, выполненных dApp-скриптом, превысила порог для сохранения неуспешных транзакций), она сохраняется на блокчейне с атрибутом "applicationStatus": "script_execution_failed"
. С отправителя транзакции взимается комиссия. Других изменений на блокчейне транзакция не влечет.
Подробнее о валидации транзакций
Подробнее о работе с неуспешными транзакциями
# Данные, доступные скрипту ассета
Для проверок могут быть использованы следующие параметры:
- Данные блокчейна: текущая высота, балансы аккаунтов, записи в хранилищах данных аккаунтов, параметры токенов и др.
- Поля текущей верифицируемой транзакции, за исключением подтверждений (
proofs
). Встроенная переменнаяtx
содержит эту транзакцию. Набор полей зависит от типа транзакции, см. разделы Структуры транзакций.
# Примеры
Примеры скриптов ассетов можно найти:
- в разделе Смарт-ассет;
- в Waves IDE: Library → smart-assets.