waves_logo Docs
  • O Ride
    O Ride
  • Начало работы
    Начало работы
  • Основы синтаксиса
    • Директивы
      Директивы
    • Определение
      Определение
    • Выражение
      Выражение
    • Переменная
      Переменная
    • Функция
      Функция
    • Исключение
      Исключение
    • Комментарий
      Комментарий
    Основы синтаксиса
  • Типы скриптов
    • dApp-скрипт
      • Аннотации
        Аннотации
      • Вызываемая функция
        Вызываемая функция
      • Функция-верификатор
        Функция-верификатор
      dApp-скрипт
    • Скрипт аккаунта
      Скрипт аккаунта
    • Скрипт ассета
      Скрипт ассета
    Типы скриптов
  • Стандартная библиотека
    Стандартная библиотека
  • Типы данных
    • Any
      Any
    • BigInt
      BigInt
    • Boolean
      Boolean
    • ByteVector
      ByteVector
    • Int
      Int
    • String
      String
    • Unit
      Unit
    • List
      List
    • Кортеж
      Кортеж
    • Объединение
      Объединение
    Типы данных
  • Структуры
    • Действия скрипта
      • BinaryEntry
        BinaryEntry
      • BooleanEntry
        BooleanEntry
      • Burn
        Burn
      • DeleteEntry
        DeleteEntry
      • IntegerEntry
        IntegerEntry
      • Issue
        Issue
      • Lease
        Lease
      • LeaseCancel
        LeaseCancel
      • Reissue
        Reissue
      • ScriptTransfer
        ScriptTransfer
      • SponsorFee
        SponsorFee
      • StringEntry
        StringEntry
      Действия скрипта
    • Общие структуры
      • Address
        Address
      • Alias
        Alias
      • Asset
        Asset
      • AssetPair
        AssetPair
      • AttachedPayment
        AttachedPayment
      • BalanceDetails
        BalanceDetails
      • BlockInfo
        BlockInfo
      • Invocation
        Invocation
      • Order
        Order
      • Transfer
        Transfer
      Общие структуры
    • Структуры транзакций
      • BurnTransaction
        BurnTransaction
      • CreateAliasTransaction
        CreateAliasTransaction
      • DataTransaction
        DataTransaction
      • ExchangeTransaction
        ExchangeTransaction
      • GenesisTransaction
        GenesisTransaction
      • InvokeScriptTransaction
        InvokeScriptTransaction
      • IssueTransaction
        IssueTransaction
      • LeaseCancelTransaction
        LeaseCancelTransaction
      • LeaseTransaction
        LeaseTransaction
      • MassTransferTransaction
        MassTransferTransaction
      • ReissueTransaction
        ReissueTransaction
      • SetAssetScriptTransaction
        SetAssetScriptTransaction
      • SetScriptTransaction
        SetScriptTransaction
      • SponsorFeeTransaction
        SponsorFeeTransaction
      • TransferTransaction
        TransferTransaction
      • UpdateAssetInfoTransaction
        UpdateAssetInfoTransaction
      Структуры транзакций
    Структуры
  • Встроенные переменные
    Встроенные переменные
  • Встроенные функции
    • Математические функции
      Математические функции
    • Функции блокчейна
      Функции блокчейна
    • Функции верификации
      Функции верификации
    • Функции вызова dApp из dApp
      Функции вызова dApp из dApp
    • Функции декодирования
      Функции декодирования
    • Функции исключения
      Функции исключения
    • Функции кодирования
      Функции кодирования
    • Функции конвертации
      Функции конвертации
    • Функции массива байтов
      Функции массива байтов
    • Функции объединения
      Функции объединения
    • Функции списка
      Функции списка
    • Функции строки
      Функции строки
    • Функции транзакции данных
      Функции транзакции данных
    • Функции хеширования
      Функции хеширования
    • Функции хранилища данных аккаунта
      Функции хранилища данных аккаунта
    Встроенные функции
  • Операторы
    Операторы
  • match-case: сопоставление с шаблоном
    match-case: сопоставление с шаблоном
  • Итерации: FOLD<N>
    Итерации: FOLD<N>
  • Вызов dApp из dApp
    Вызов dApp из dApp
  • Ограничения
    • Сложность
      Сложность
    • Вес данных
      Вес данных
    Ограничения
  • Предыдущие версии
    • Версия 5
      • Вызываемая функция
        Вызываемая функция
      • Типы данных
        • Any
          Any
        • BigInt
          BigInt
        • Boolean
          Boolean
        • ByteVector
          ByteVector
        • Int
          Int
        • String
          String
        • Unit
          Unit
        • List
          List
        • Кортеж
          Кортеж
        • Объединение
          Объединение
        Типы данных
      • Структуры
        • Действия скрипта
          • BinaryEntry
            BinaryEntry
          • BooleanEntry
            BooleanEntry
          • Burn
            Burn
          • DeleteEntry
            DeleteEntry
          • IntegerEntry
            IntegerEntry
          • Issue
            Issue
          • Lease
            Lease
          • LeaseCancel
            LeaseCancel
          • Reissue
            Reissue
          • ScriptTransfer
            ScriptTransfer
          • SponsorFee
            SponsorFee
          • StringEntry
            StringEntry
          Действия скрипта
        • Общие структуры
          • Address
            Address
          • Alias
            Alias
          • Asset
            Asset
          • AssetPair
            AssetPair
          • AttachedPayment
            AttachedPayment
          • BalanceDetails
            BalanceDetails
          • BlockInfo
            BlockInfo
          • Invocation
            Invocation
          • Order
            Order
          • Transfer
            Transfer
          Общие структуры
        • Структуры транзакций
          • BurnTransaction
            BurnTransaction
          • CreateAliasTransaction
            CreateAliasTransaction
          • DataTransaction
            DataTransaction
          • ExchangeTransaction
            ExchangeTransaction
          • GenesisTransaction
            GenesisTransaction
          • InvokeScriptTransaction
            InvokeScriptTransaction
          • IssueTransaction
            IssueTransaction
          • LeaseCancelTransaction
            LeaseCancelTransaction
          • LeaseTransaction
            LeaseTransaction
          • MassTransferTransaction
            MassTransferTransaction
          • ReissueTransaction
            ReissueTransaction
          • SetAssetScriptTransaction
            SetAssetScriptTransaction
          • SetScriptTransaction
            SetScriptTransaction
          • SponsorFeeTransaction
            SponsorFeeTransaction
          • TransferTransaction
            TransferTransaction
          • UpdateAssetInfoTransaction
            UpdateAssetInfoTransaction
          Структуры транзакций
        Структуры
      • Встроенные переменные
        Встроенные переменные
      • Встроенные функции
        • Математические функции
          Математические функции
        • Функции блокчейна
          Функции блокчейна
        • Функции верификации
          Функции верификации
        • Функции вызова dApp из dApp
          Функции вызова dApp из dApp
        • Функции декодирования
          Функции декодирования
        • Функции исключения
          Функции исключения
        • Функции кодирования
          Функции кодирования
        • Функции конвертации
          Функции конвертации
        • Функции массива байтов
          Функции массива байтов
        • Функции объединения
          Функции объединения
        • Функции списка
          Функции списка
        • Функции строки
          Функции строки
        • Функции транзакции данных
          Функции транзакции данных
        • Функции хеширования
          Функции хеширования
        • Функции хранилища данных аккаунта
          Функции хранилища данных аккаунта
        Встроенные функции
      • Operators
        Operators
      • Limitations
        • Вес данных
          Вес данных
        Limitations
      Версия 5
    • Версии 4 и 3
      • Вызываемая функция
        Вызываемая функция
      • Типы данных
        • Boolean
          Boolean
        • ByteVector
          ByteVector
        • Int
          Int
        • String
          String
        • Unit
          Unit
        • List
          List
        • Кортеж
          Кортеж
        • Объединение
          Объединение
        Типы данных
      • Структуры
        • Действия скрипта
          • BinaryEntry (v4)
            BinaryEntry (v4)
          • BooleanEntry (v4)
            BooleanEntry (v4)
          • Burn (v4)
            Burn (v4)
          • DataEntry (v3)
            DataEntry (v3)
          • DeleteEntry (v4)
            DeleteEntry (v4)
          • IntegerEntry (v4)
            IntegerEntry (v4)
          • Issue (v4)
            Issue (v4)
          • Reissue (v4)
            Reissue (v4)
          • ScriptTransfer (v3 and v4)
            ScriptTransfer (v3 and v4)
          • SponsorFee (v4)
            SponsorFee (v4)
          • StringEntry (v4)
            StringEntry (v4)
          Действия скрипта
        • Результаты скрипта (v3)
          • ScriptResult
            ScriptResult
          • TransferSet
            TransferSet
          • WriteSet
            WriteSet
          Результаты скрипта (v3)
        • Общие структуры
          • Address
            Address
          • Alias
            Alias
          • Asset
            Asset
          • AssetPair
            AssetPair
          • AttachedPayment
            AttachedPayment
          • BalanceDetails
            BalanceDetails
          • BlockInfo
            BlockInfo
          • Invocation
            Invocation
          • Order
            Order
          • Transfer
            Transfer
          Общие структуры
        • Структуры транзакций
          • BurnTransaction
            BurnTransaction
          • CreateAliasTransaction
            CreateAliasTransaction
          • DataTransaction
            DataTransaction
          • ExchangeTransaction
            ExchangeTransaction
          • GenesisTransaction
            GenesisTransaction
          • InvokeScriptTransaction
            InvokeScriptTransaction
          • IssueTransaction
            IssueTransaction
          • LeaseCancelTransaction
            LeaseCancelTransaction
          • LeaseTransaction
            LeaseTransaction
          • MassTransferTransaction
            MassTransferTransaction
          • ReissueTransaction
            ReissueTransaction
          • SetAssetScriptTransaction
            SetAssetScriptTransaction
          • SetScriptTransaction
            SetScriptTransaction
          • [en] SponsorFeeTransaction
            [en] SponsorFeeTransaction
          • TransferTransaction
            TransferTransaction
          • UpdateAssetInfoTransaction
            UpdateAssetInfoTransaction
          Структуры транзакций
        Структуры
      • Встроенные переменные
        Встроенные переменные
      • Встроенные функции
        • Функции хранилища данных аккаунта
          Функции хранилища данных аккаунта
        • Функции блокчейна
          Функции блокчейна
        • Функции массива байтов
          Функции массива байтов
        • Функции конвертации
          Функции конвертации
        • Функции транзакции данных
          Функции транзакции данных
        • Функции декодирования
          Функции декодирования
        • Функции кодирования
          Функции кодирования
        • Функции исключения
          Функции исключения
        • Функции хеширования
          Функции хеширования
        • Функции списка
          Функции списка
        • Математические функции
          Математические функции
        • Функции строки
          Функции строки
        • Функции объединения
          Функции объединения
        • Функции верификации
          Функции верификации
        Встроенные функции
      • Операторы
        Операторы
      • Ограничения
        • Вес данных
          Вес данных
        Ограничения
      Версии 4 и 3
    Предыдущие версии
  • Подключение библиотек
    Подключение библиотек
  • Компоненты Ride
    Компоненты Ride
      • English
      • Русский
      On this page
        • invoke
          • Ограничение повторных вызовов
          • Параметры
          • Пример
        • reentrantInvoke
      waves_logo Docs

          # [Ride v5] Функции вызова dApp из dApp

          ⚠️ Это документация Стандартной библиотеки версии 5. Рекомендуем использовать версию 6. Перейти к версии 6

          Название Описание Сложность
          invoke Вызывает вызываемую функцию dApp, c ограничением на повторные вызовы исходного dApp 75
          reentrantInvoke Вызывает вызываемую функцию dApp, без ограничения на повторные вызовы исходного dApp 75

          # invoke

          Вызывает вызываемую функцию dApp, с ограничением на повторные вызовы.

          invoke(dApp: Address|Alias, function: String, arguments: List[Any], payments: List[AttachedPayments]): Any
          

          Any означает любой допустимый тип. Извлечь из него конкретный тип можно с помощью оператора match ... case, см. пример.

          Функция invoke может использоваться только вызываемой функцией dApp-скрипта, но не функцией-верификатором, скриптом аккаунта или скриптом ассета.

          С помощью функции invoke вызываемая функция может вызвать вызываемую функцию другого dApp или того же самого dApp, в том числе сама себя, а затем использовать результаты вызова в дальнейших вычислениях. Подробнее в разделе Вызов dApp из dApp.

          💡 Чтобы гарантировать порядок выполнения вызываемых функций и применения действий скрипта, присвойте возвращаемое значение invoke нетерпеливой переменной.

          Вызов может содержать платежи, которые будут переведены с баланса исходного dApp на баланс вызываемого. Платежи запрещены, если dApp вызывает сам себя.

          Если токен в платеже является смарт-ассетом, то скрипт ассета верифицирует вызов invoke как InvokeScriptTransaction с полями:

          • dApp, payments, function, args — значения, указанные в функции invoke;
          • sender, senderPublicKey — параметры dApp, который вызвал функцию;
          • id, timestamp, fee, feeAssetId — как в транзакции вызова скрипта;
          • version = 0.

          Если скрипт ассета отклоняет действие, то транзакция, которая вызвала скрипт dApp, либо отбрасывается, либо сохраняется на блокчейне как неуспешная, см. раздел Валидация транзакций.

          # Ограничение повторных вызовов

          Стек вызовов, порожденный функцией invoke, не должен содержать вызовы исходного dApp после вызова другого dApp.

          Пусть исходный dApp A вызывает dApp B c помощью функции invoke. Независимо от того, какую функцию использует dApp B — invoke или reentrantInvoke, следующие последовательности вызовов завершатся ошибкой:

          → dApp A
             → dapp B
                 → dApp A
          
          → dApp A
             → dapp B
                → dApp C
                   → dApp A
          

          Следующие последовательности вызовов допустимы:

          → dApp A
             → dapp A
                → dapp A
          
          → dApp N
             → dapp A
             → dApp A
          
          → dapp N
             → dapp A
                → dapp B
             → dapp B
                → dapp A
                → dapp C
          

          # Параметры

          Параметр Описание
          dApp: Address|Alias Адрес или псевдоним dApp, функция которого вызывается
          function: String|Unit Имя вызываемой функции. unit — вызов функции по умолчанию
          arguments: List[Any] Параметры вызываемой функции
          payments: List[AttachedPayment] Платежи в пользу вызываемого dApp, не более 10

          # Пример

          Пользователь с помощью транзакции вызова скрипта вызывает функцию foo dApp1.

          Функция foo вызывает функцию bar dApp2, передавая число a и прикладывая платеж 1 XTN.

          Функция bar переводит dApp1 1 WAVES и возвращает удвоенное число a.

          Функция foo записывает в хранилище данных dApp1:

          • значение, возвращенное функцией bar.
          • новый баланс dApp2 (уменьшенный на 1 WAVES, переведенный функцией bar).

          dApp1:

          {-# STDLIB_VERSION 5 #-}
          {-# CONTENT_TYPE DAPP #-}
          {-# SCRIPT_TYPE ACCOUNT #-}
          
          @Callable(i)
          func foo(dapp2: String, a: Int, key1: String, key2: String) = {
             strict res = invoke(addressFromStringValue(dapp2),"bar",[a],[AttachedPayment(base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p',1000000)])
             match res {
               case r : Int => 
                (
                   [
                     IntegerEntry(key1, r),
                     IntegerEntry(key2, wavesBalance(addressFromStringValue(dapp2)).regular)
                   ],
                   unit
                )
               case _ => throw("Incorrect invoke result") 
             }
          }
          

          dApp2:

          {-# STDLIB_VERSION 5 #-}
          {-# CONTENT_TYPE DAPP #-}
          {-# SCRIPT_TYPE ACCOUNT #-}
          
          @Callable(i)
          func bar(a: Int) = {
             (
                [
                   ScriptTransfer(i.caller, 100000000, unit)
                ],
                a*2
             )
          }
          

          # reentrantInvoke

          Вызывает вызываемую функцию dApp. Отличается от функции invoke только отсутствием ограничения на повторные вызовы исходного dApp, который использовал reentrantInvoke.

          Однако, если исходный dApp был вызван повторно и на этот раз использовал функцию invoke, то в этом стеке вызовов нельзя вызвать исходный dApp еще раз.

          Например, последовательность вызовов

          → dApp A
             → dapp B
                → dApp A
                   → dApp C
                      → dApp A
          
          • допустима, если dApp A вызывает и dApp B, и dApp С с помощью функции reentrantInvoke;
          • завершается ошибкой, если dApp A вызывает dApp B с помощью функции reentrantInvoke, а dApp С — с помощью функции invoke.
          reentrantInvoke(dApp: Address|Alias, function: String, arguments: List[Any], payments: List[AttachedPayments]): Any
          
          Функции верификации
          Функции декодирования
          Функции верификации
          Функции декодирования