waves_logo Docs
  • Обзор
    Обзор
  • Практические руководства
    • Получение данных из блокчейна
      Получение данных из блокчейна
    • Создание и отправка транзакций
      Создание и отправка транзакций
    • Токенизация
      Токенизация
    • Распространение токена (airdrop)
      Распространение токена (airdrop)
    • Прием платежей
      Прием платежей
    • Обмен токенов
      Обмен токенов
    • Простое голосование
      Простое голосование
    • Список как аргумент
      Список как аргумент
    Практические руководства
  • Смарт-контракты Waves
    Смарт-контракты Waves
  • dApp
    • Создание и запуск dApp
      Создание и запуск dApp
    dApp
  • Cмарт-аккаунт
    • Создание смарт-аккаунта
      Создание смарт-аккаунта
    • [en] Creating and deploying a script manually
      [en] Creating and deploying a script manually
    • [en] Video tutorials
      [en] Video tutorials
    Cмарт-аккаунт
  • Cмарт-ассет
    Cмарт-ассет
  • Инструменты разработчика
    • Waves IDE
      Waves IDE
    • Расширение для VS Code
      Расширение для VS Code
    • Surfboard
      Surfboard
    • Ride REPL
      Ride REPL
    Инструменты разработчика
  • Signer ◆
    Signer ◆
  • Waves API
    • Data Service API
      Data Service API
    • Node REST API 🡥
      Node REST API 🡥
    • Node gRPC Server 🡥
      Node gRPC Server 🡥
    • Blockchain Updates 🡥
      Blockchain Updates 🡥
    Waves API
  • Клиентские библиотеки
    • Waves C#
      • Установка SDK
        Установка SDK
      • Запуск кода
        • Отправка транзакций
          Отправка транзакций
        • Использование криптографических утилит
          Использование криптографических утилит
        • Взаимодействие с нодой
          Взаимодействие с нодой
        • Развертывание смарт-контрактов
          Развертывание смарт-контрактов
        Запуск кода
      Waves C#
    • Gowaves
      • Установка SDK
        Установка SDK
      Gowaves
    • WavesJ
      • Установка SDK
        Установка SDK
      WavesJ
    • Ts-lib-crypto
      • Установка SDK
        Установка SDK
      Ts-lib-crypto
    • Waves-PHP
      • Установка SDK
        Установка SDK
      Waves-PHP
    • Waves-python
      • Установка SDK
        Установка SDK
      Waves-python
    • Waves-rust
      • Установка SDK
        Установка SDK
      Waves-rust
    Клиентские библиотеки
      • English
      • Русский
      On this page
        • Прикрепление скрипта аккаунта к аккаунту
        • Структура скрипта аккаунта
        • Выражение
        • Смарт-аккаунты и трейдинг
        • Примеры скриптов смарт-аккаунтов
        • Комиссии смарт-аккаунтов
        • Статьи в блоге Waves Tech
      waves_logo Docs

          # Что такое смарт-аккаунт

          Функциональность обычного аккаунта позволяет лишь удостовериться, что выпущенная с него транзакция в действительности была отправлена с этого аккаунта.

          К аккаунту можно прикрепить скрипт аккаунта, и тогда он будет уметь гораздо большее, а именно — проверять исходящие транзакции на соответствие условиям, указанным в скрипте. Аккаунт с прикрепленным к нему скриптом называется смарт-аккаунтом. Со смарт-аккаунта могут быть отправлены только те транзакции, которые прошли валидацию. Например, владелец аккаунта может установить правило, согласно которому транзакции могут отправляться с адреса только в том случае, если высота блокчейна превышает N. Другой пример — можно разрешить отправку транзакций только определённого типа. Либо вообще отменить какую-либо проверку, установив правило, согласно которому все транзакции, отправляемые с адреса, должны считаться валидными.

          Для проверок могут быть использованы следующие параметры:

          • Подтверждения или подпись транзакции.
          • Текущая высота блокчейна.
          • Произвольные данные, существующие в блокчейне, например, данные оракулов.

          # Прикрепление скрипта аккаунта к аккаунту

          Как мы уже упоминали выше, аккаунт без скрипта валидирует транзакции при помощи механизма валидации транзакции. Работа этого механизма эквивалентна работе следующего скрипта:

          sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPk)
          

          Чтобы прикрепить собственный скрипт к аккаунту, необходимо отправить с него транзакцию установки скрипта. К аккаунту можно прикрепить только один скрипт. "Открепить" скрипт от смарт-аккаунта или заместить старый скрипт аккаунта новым можно только если старый скрипт не запрещает это. Для "открепления" или замены скрипта требуется отправить новую транзакцию установки скрипта. Комиссия за транзакцию установки скрипта составляет 0.01 WAVES.

          # Структура скрипта аккаунта

          # Директива

          Директива должна размещаться в самом начале скрипта. Рассмотрим пример директивы:

          {-# STDLIB_VERSION 8 #-}
          {-# CONTENT_TYPE EXPRESSION #-}
          {-# SCRIPT_TYPE ACCOUNT #-}
          

          Приведенная директива состоит из трёх аннотаций и сообщает компилятору следующую информацию:

          • в скрипте используется версия 6 библиотеки стандартных функций,
          • типом содержимого данного скрипта является Expression,
          • типом переменной this будет Address.

          # Выражение

          Выражение проверяет отправляемые аккаунтом транзакции на соответствие заданным условиям. Если условия не соблюдаются, транзакция не будет отправлена. Возможными результатами выполнения выражения являются

          • true (транзакция разрешена),
          • false (транзакция запрещена),
          • ошибка.

          # Смарт-аккаунты и трейдинг

          Смарт-аккаунты позволяют устанавливать правила (ограничения) не только для транзакций, но и для торговых операций, выполняемых с аккаунта. Примеры этих правил рассматриваются ниже.

          # Примеры скриптов смарт-аккаунтов

          # Покупка или продажа только BTC

          Аккаунт с приведенным ниже скриптом может совершать сделки купли-продажи только в отношении BTC:

          let cooperPubKey = base58'BVqYXrapgJP9atQccdBPAgJPwHDKkh6A8'
          let BTCId = base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS'
          match tx {
             case o: Order =>
                sigVerify(o.bodyBytes, o.proofs[0], cooperPubKey ) && (o.assetPair.priceAsset == BTCId || o.assetPair.amountAsset == BTCId)
             case _ => sigVerify(tx.bodyBytes, tx.proofs[0], cooperPubKey )
          }
          

          # Покупка заданного ассета

          Приведенный ниже скрипт разрешает совершать с аккаунта покупки

          • только заданного ассета
          • только по заданной цене
          • только за WAVES
          let myAssetId = base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS'
          let cooperPubKey = base58'BVqYXrapgJP9atQccdBPAgJPwHDKkh6A8'
           
          match tx {
             case o: Order =>
                sigVerify(o.bodyBytes, o.proofs[0], cooperPubKey ) && o.assetPair.priceAsset == null && o.assetPair.amountAsset == myAssetId && o.price == 500000 && o.amount == 1000 && o.orderType == Buy
             case _ => sigVerify(tx.bodyBytes, tx.proofs[0], cooperPubKey )
          }
          

          # Комиссии смарт-аккаунтов

          Если сложность скрипта аккаунта больше порога сложности отправителя, то минимальная комиссия за каждую транзакцию, отправленную со смарт-аккаунта, увеличивается на 0,004 WAVES.

          # Статьи в блоге Waves Tech

          • The Hitchhiker’s Guide to Waves Smart Contracts. Part 1 (14 сентября 2018)
          • The Hitchhiker’s Guide to Waves Smart Contracts. Part 2 (18 сентября 2018)
          • Stateful Smart Accounts. Part 1 (17 сентября 2018)
          • Stateful Smart Accounts. Part 2 (3 октября 2018)
          • Применение смарт-аккаунтов Waves: от аукционов до бонусных программ (1 мартa 2019)
          • Применение смарт-аккаунтов и смарт-ассетов Waves в финансовых инструментах (15 мартa 2019)
          Создание и запуск dApp
          Создание смарт-аккаунта
          Создание и запуск dApp
          Создание смарт-аккаунта