Автоматизация задач интеллектуального контракта: использование хранителей и релен для планирования транзакций

Автоматизация задач интеллектуального контракта: использование хранителей и релен для планирования транзакций

18 июня 2025 г.

Смарт -контракты Ethereum не работают по графику самим самим - в EVM нет родной «работы Cron». Умные контракты не являются самостоятельными, то есть, они требуют внешнего стимула (транзакция из аккаунта, принадлежащей внешней собственности, Oracle или другого контракта), чтобы вызвать их функции. Это представляет собой проблему для зависимых от времени действий, таких как передача токенов или повторяющиеся платежи: как вы выполняете функцию в будущем или на повторяющемся интервале, если кто-то вручную не отправляет транзакцию?

В этом уроке я буду обсуждать два из самых популярных децентрализованных инструментов автоматизации для Ethereum, которые решают эту проблему: Automation (хранители) и сеть Gelato. Оба полагаются на сети с нецелесообразными бот-сети или «ретрансляторы», чтобы отслеживать условия и запустить функции контракта по графику, устраняя необходимость в централизованных серверах Cron. Я продемонстрирую, как автоматизировать простой выпуск токенов с использованием литейного завода, показывая как подход хранителей цепей, так и подход Gelato. Попутно я расскажу, как работает каждое решение, как интегрировать их с вашими контрактами на прочность, а также ключевые различия в опыте затрат, UX и разработчиков.

Задача: планирование действий в цепочке

В отличие от традиционных серверов, блокчейны не позволяют программе планировать будущие вызовы. Любые изменения состояния должны быть инициированы транзакцией. В то время как разработчики ранее опирались на централизованные сценарии или ручное вызов функций с интервалами, это подрывное к децентрализации и может быть ненадежным. Например, если у вас есть договор о передаче токенов, который должен выпустить токены бенефициару после периода времени, какое -то лицо или организация должны вызватьrelease()функционируйте во время разблокировки или после. Опасно полагаться на человеческую или централизованную работу Cron, чтобы сделать это - они могут забыть или пойти в автономном режиме, и это вводит единственную точку отказа.

Децентрализованные инструменты автоматизации решают это, используя сети агентов с нецелесообразными (ботами), которые следят за условиями и выполняют транзакции от вашего имени. Автоматизация цепочки (ранее хранители цепочки) и сеть Gelato являются двумя примерами таких услуг. Они управляют надежными децентрализованными бот -сети, которые могут при необходимости звонить по вашему контракту, либо по графикам времени, либо на произвольной логике. По сути, они являются «службой Cron» для Ethereum, но в плане доверия:

  • Автоматизация цепочки (хранители). Использует сеть децентрализованных узлов цепной связи для мониторинга условий контракта (черезcheckUpkeepфункция, которую вы предоставляете) и вызываетperformUpkeepФункция для выполнения, когда условия становятся истинными. Узлы хранителя представляют собой цепочку и инициируют транзакции, когда ваши заранее определенные условия выполняются. Ваш интеллектуальный контракт имеет логику, когда нужно выполнить, и сеть Cheaplink позаботится о том, чтобы называть его в то время, если он финансируется.
  • Сеть мороженого. Предоставляет сеть ретрансляционных ботов, которые могут быть проинструктированы для вызова любой контрактной функции в определенное время или интервалы, или когда определенные условия выполняются. Боты Gelato также запускаются вне цепочки и отправляют транзакции для выполнения вашей задачи в цепочке, когда график или запуск требований. Gelato предлагает простую в использовании услугу «Ops», в которой вы просто регистрируете задачу (с задержкой по времени или графику, похожим на Cron, или своему собственному разрешению на заказ), и их сеть будет продолжать называть вашу функцию в соответствии с инструкциями.

Оба решения устраняют необходимость запускать собственные боты или серверы. Давайте теперь рассмотрим реальное использование, чтобы увидеть, как использовать каждый.

Пример варианта использования: контракт с выпуском токена с задержкой времени

Чтобы быть конкретным, давайте посмотрим на пример сценария передачи токенов: токен ERC-20 наделен контрактом и должен быть отправлен бенефициару после конкретной метки времени. Мы хотим, чтобы этот релиз произошел автоматически, когда придет время.

Во -первых, мы напишем простой контракт с дилитией, реализующий эту логику TimeLock. Тогда мы покажем, как автоматизировать егоrelease()функционируйте с цепными хранителями и с мороженым.

Контракт на прочность -TokenTimelock.sol:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

// Minimal ERC20 interface for token transfer
interface IERC20 {
    function transfer(address to, uint256 amount) external returns (bool);
}

contract TokenTimelock {
    IERC20 public immutable token;
    address public immutable beneficiary;
    uint256 public immutable releaseTime;
    bool public released;

    constructor(IERC20 tokenAddress, address beneficiaryAddress, uint256 releaseTimestamp) {
        token = tokenAddress;
        beneficiary = beneficiaryAddress;
        releaseTime = releaseTimestamp;
        released = false;
    }

    function release() public {
        require(!released, "Already released");
        require(block.timestamp >= releaseTime, "Not yet unlocked");
        released = true;
        // Transfer all tokens held by this contract to the beneficiary
        uint256 amount = tokenBalance();
        require(token.transfer(beneficiary, amount), "Token transfer failed");
    }

    function tokenBalance() public view returns (uint256) {
        return token.balanceOf(address(this));
    }
}

В этом договоре мы указываем токен для освобождения, бенефициара иreleaseTime(как временная метка Unix). Аrelease()метод будет успешным только послеreleaseTimeПрошел. Когда его называют, он отмечает состояние как выпущенное и передает полный баланс токена бенефициару.

Мы предполагаем, что сам контракт держит токены, может быть, потому, что кто -то развернул его токены, чтобы оставить.

Тестирование TimeLock.С помощью литейного завода мы просто пишем тест, который продвигает время, а затем вызываетrelease()Чтобы проверить все это работает. Например, с чит -кодами Foundry, мы можем просто тестировать путешествие во времени: звонокvm.warp(block.timestamp + 100)Чтобы продвинуть метку времени блокчейна на 100 секунд в тесте. Это позволяет утверждатьrelease()терпит неудачу до метки времени и преуспевает позже. В действительности, однако, кто позвонитrelease()в нужное момент? Вот где вступает автоматизация.

Хранители цепочки (теперь автоматизация цепочки) предоставляют децентрализованные боты с цепью, которые будут следить за вашим контрактом и вызовут функцию в нужное время. Чтобы использовать автоматизацию цепочки, вам необходимо заключить контрактХранитель совместимоРеализуя две функции:checkUpkeepиperformUpkeepПолем Узлы цепной линии будут звонитьcheckUpkeepВ каждом блоке (или в указанном интервале), чтобы увидеть, выполнены ли ваши условия, и возвращается ли ониtrue, они инициируют транзакцию в цепочке вperformUpkeepПолем

Давайте изменим нашеTokenTimelockКонтракт на интеграцию с автоматизацией цепочки Link:

import "@chainlink/contracts/src/v0.8/interfaces/KeeperCompatibleInterface.sol";

contract TokenTimelock is KeeperCompatibleInterface { 
    // ... (previous state variables and constructor)

    // Implement Chainlink Keepers interface:
    function checkUpkeep(bytes calldata /* checkData */) external view override returns (bool upkeepNeeded, bytes memory /* performData */) {
        upkeepNeeded = (!released && block.timestamp >= releaseTime);
    }

    function performUpkeep(bytes calldata /* performData */) external override {
        // Revalidate the condition on-chain to be safe
        if (!released && block.timestamp >= releaseTime) {
            release();  // call the release function
        }
    }
}

Мы импортируем цепьKeeperCompatibleInterface(Часть библиотеки контракта CANELINK) и реализовать ее. ВcheckUpkeep, мы просто вернемся, если жетоны еще не были выпущены, а текущее время прошлоreleaseTimeПолем ВperformUpkeep, мы включаем проверку безопасности, чтобы убедиться, что условие все еще сохраняется, а затем вызываетrelease()функция Узлы Chainlink будут моделироватьcheckUpkeepОтказ от цепочки и, когда он вернется, один из узлов отправит транзакцию на звонокperformUpkeepна цепочке.

Перевернять состояние вperformUpkeepэто рекомендуемая лучшая практика для обращения с краями или условиями гонки.

Развертывание контракта.Вы можете развернуть этот контракт в тестовую сеть с помощью Foundry (например, используяforge scriptилиforge create) Обязательно финансируйте контракт с токенами, которые необходимо выпустить (так что у него есть баланс для отправки). После развертывания обратите внимание на адрес контракта.

Зарегистрирование содержания.Далее вам нужно зарегистрировать свой контракт с автоматизацией Cheaplink, чтобы сеть Keepers знала об этом. Перейдите в приложение для автоматизации Cheathlink (панель панели цепочки Keeplink) и зарегистрируйтеновое обслуживание:

  1. Определить целевой договор. Выберите тип триггера. В нашем случае, поскольку сам контракт проверяется на условие времени, мы можем использовать триггер на основе времени (например, расписание для периодического запуска) или просто «пользовательскую логику». Cheathlink теперь даже имеет вариант планирования в стиле Cron для обслуживания. Вы можете, например, выбрать Cron и ввести выражение, подобное*/5 * * * *Так что он пытается каждые 5 минут. Или вы можете упомянуть Cron на основе времени, близкий к дате релиза. Предоставить развернутуюTokenTimelockАдрес контракта и Abi. Это говорит сети позвонить в ваш контракт.
  2. Функция и вход. При использовании планировщика заданий автоматизации для триггеров времени вы напрямую указываетеrelease()функционируйте как цель для вызова по расписанию. Однако, поскольку наш контракт использует интерфейс Keeper, стандартный поток заключается в том, что сеть Cheanlink будет вызоватьсяcheckUpkeep/performUpkeepПолем Когда вы находитесь в Keepers UI, после добавления ABI, как правило, вы выбираете функции содержания. За какое -то время на новом пользовательском интерфейсе вы можете просто позвонитьperformUpkeepв обычном интервале.На заднем плане узлы цепной связи будут продолжать звонитьcheckUpkeepЧтобы подтвердитьupkeepNeededверно перед актерским мастерством.В качестве упрощения рассмотрите функцию автоматизировать как нашуcheckUpkeepусловие в расписании.
  3. Расписание. Если вы используете триггер Cron, введите выражение расписания, когда запускать чеки. Для единовременного прогона в будущем у вас может не быть встроенной единовременной опции-один простой способ-планировать частые проверки (например, каждые X минут) на ближайшее время, чтобы один из них поймал это условие как истинное.Пользовательский интерфейс Pcheduler работы по автоматизации Chainlink появился в 2022 году, чтобы упростить планирование на основе времени.Для нашего случая, какcheckUpkeepБудет ложным до времени разблокировки, вы можете запланировать его, например, каждые 15 минут. В то время, когда будет выполнено, следующая проверка станет верной и запустит содержание.
  4. Подробные детали. Откажитесь от своего имени и укажите лимит газа (сколько газа вы ожидаетеperformUpkeepиспользовать). Укажите первоначальный баланс - вам нужно будет финансировать с помощью токенов ссылок, чтобы заплатить за автоматический сбор за обслуживание.Автоматизация цепочки требует финансирования обслуживания в ссылке. Узлы используют это, чтобы заплатить за газ и взять плату.Испытания могут иметь тестовую ссылку, предоставленную из крана. На Mainnet вы получите и внесете реальную ссылку. Наконец, зарегистрируйте содержание.

После регистрации децентрализованная сеть хранителя Chainlink вступает во владение. Узлы автоматически начнут проверять ваш контракт. КогдаreleaseTimeпроходит,checkUpkeepначнет возвращать True, и транзакция будет отправлена ​​на звонокperformUpkeepкоторый в свою очередь выполняетrelease()Полем Ваш бенефициар должен получить токены вскоре после запланированного времени без какого -либо ручного вмешательства.

Тестирование с литейным заводом

Поведение цепочки с цепью трудно полностью воспроизвести локально, но вы можете имитировать его в тестах. Например, вызовcheckUpkeepВ тесте в литейном заводе, чтобы он первоначально возвращался ложным, используйтеvm.warpпродвигать время за пределамиreleaseTime, затем позвонитьcheckUpkeepСнова, чтобы увидеть, что вернется. Вы также можете позвонитьperformUpkeep(илиrelease()) непосредственно в испытании после того, как время деформации, чтобы обеспечить эффект. На практике, в реальной сети, узлы Chainlink называют их для вас в подходящее время.

Примечание.Есть что -то, что вы должны помнить, а это безопасность - нашаrelease()Функция публичная, поэтому любой может назвать это, когда придет время. Как правило, это нормально (чистый эффект - это то же самое передачу для бенефициара), и он позволяет хранителям цепей (даже невинного пользователя) инициировать выплату. Если вы действительно просто хотели, чтобы реестр Cheathlink вызвал его, добавьте контроль доступа кperformUpkeep(Адрес реестра хранителей известен по сети). Но в целом, объявление функции публичной с надлежащей проверкой времени в порядке, потому что ее нельзя вызывать дважды или раньше. Кроме того, убедитесь, что договор имеет достаточный предел газа в регистрации технического обслуживания, чтобы покрыть передачу токена.

Автоматизация с сетью Gelato (Gelato Ops)

Gelato Network предлагает эквивалентный продукт, но другой опыт работы модели и разработчиков. Функция Gelato Automate (OPS) позволяет автоматизировать вызовы для функций контракта через их веб -интерфейс или код. Вам не нужно разыгрывать свой контракт на автоматизацию на основе триггеров на основе времени-любая внешняя функция является адресной. Это делает Gelato очень удобным для автоматизации живых контрактов. Сеть ботов Gelato выполнит задачу в соответствии с вашим установленным графиком или условием в качестве децентрализованного реленер.

Для нашегоTokenTimelockПример, поскольку он уже имеет общедоступнуюrelease()Функция, заправленная, мы можем использовать мороженое для вызоваrelease()сразу послеreleaseTimeистекает.

Использование приборной панели Gelato Ops:

  1. Установите мороженое. Перейдите на панель панели Gelato Ops (app.gelato.network) и войдите в систему, используя свой кошелек Web3. Выберите сеть (Ethereum Mainnet или Testnet), где у вас есть контракт. Gelato работает с многочисленными EVM-совместимыми сетями, такими как Che Chainlink.

  2. Финансирование для исполнения. Задачи на мороженое требуют оплаты газа (и небольшой платы), чтобы стимулировать исполнителей. Gelato поддерживает два режима оплаты: вы можете предварительно финансировать баланс мороженого с помощью ETH (или другого токена), которые будут использоваться ботами Gelato для выполнения ваших транзакций, или вы можете использовать модель «оплаты за задачу» (модель Gelato вызывает эту модель 1 Balance/Syncfee), где бот взимает крошечную плату, которую ваш контракт или спонсор платит при выполнении задачи. Перейдите к приборной панели и перейдите в раздел фондов и предопределите некоторые ETH, если вы планируете предоплатить. За одноразовые операции вы можете просто заплатить за исполнение вместо того, чтобы внести много изначально.

  3. Создать задачу. Нажмите «Создать задачу» (или аналогичную ссылку в Gelato Ops). Вас попросят:

    1. Целевой адрес контракта. ТвойTokenTimelockадрес контракта.

    2. Аби Вставьте Abi Json договора. Это позволяет пользовательскому интерфейсу показывать доступные функции.

    3. Функция для автоматизации. Выберитеrelease()Функция из списка функций ABI.

    4. Расписание/триггер. Выберите триггер для запуска. Gelato предлагает несколько различных типов триггеров. Для простого времени на основе времени у вас есть пара вариантов:

      1. Временный интервал: например, "Каждый 1 час" или "каждый день в 00:00". Это похоже на повторное расписание. Если одноразовая релиз является нашей целью, повторный интервал не будет работать, если мы сами не остановим задачу после ее запуска.
      2. Cron (запланированный Advanced): Gelato также предоставляет объект Cron Expressions или определенное время. Вы можете запланировать Cron на то время, когда вы хотите освободить. Если у вас есть знания о времени разблокировки, создайте Cron на эту минуту/час.Убедитесь, что Cron написан во время UTC и в правильном формате.
      3. Условно (резолювер). Gelato также позволяет пользовательскому логическому триггеру, используя контракт с разрешением. Это похоже на разделение Che Chainlink. Вы можете развернуть простой контракт с разрешением с таким методом, какbool ready = (block.timestamp >= releaseTime && !released)а затем используйте это в качестве условия. Но в нашем случае, посколькуrelease()Вернутся, если не будет готова, мы можем просто полагаться на время.
    5. Для удобства, если прогон должен быть выполнен один раз, вы можете выбрать триггер Cron для времени разблокировки, или вы можете установить фиксированный интервал (скажем, каждые 5 минут) и иметь переключатель для начала в определенное время. У I Gelato UI есть флажок «Стартовой» сразу » - если вы очистите эту галочку, вы можете установить время начала для задания. Исправить это время начала до вашегоreleaseTime(или чуть позже, чтобы быть в безопасности). Если использовать интервал времени, например, 5 минут, также установите задачу для выполнения после одного запуска (если пользовательский интерфейс позволит вам) или намеревается отменить ее вручную. В большинстве ситуаций разработчики просто создают задачу за короткое время до целевого времени, а затем отменяют ее вручную после одного запуска.

  4. Детали задачи. Выберите метод оплаты для задачи. Если вы финансировали свой баланс на шаге 2, используйте баланс в качестве оплаты. В качестве альтернативы, выберите Automatic (вычет), если вы хотите, чтобы Gelato вычитала плату из самой задачи (это может потребовать, чтобы ваш контракт имел ETH или указанный токен, указанный для уплаты комиссии). Дайте задаче имя для ваших записей.

  5. Создать и подтвердить. Нажмите «Создать задачу» и подтвердите появляющуюся транзакцию (если есть). При инициализации Gelato просит вас разрешить добавление автоматического контракта Gelato в качестве спонсора средств (особенно при использовании платежей ERC-20) или другого разрешения. Если все настроено, теперь вы должны увидеть новую задачу, указанную в панели инструментов вместе со статусом.

Повернув задачу мороженого, боты мороженого позаботятся о мониторинге. В назначенное время (или период) Gelato позвонитrelease()по вашему контракту. Потому что наш контрактrelease()будет эффективным только послеreleaseTimeСамая первая попытка в или после времени разблокировки будет успешной и переместит токены. Если мы установим его как одноразовый крон или если мы вручную убьем работу после этого, дальнейшие вызовы не будут выполнены. Если мы сделаем это повторяющейся задачей, последующие звонки просто увидятreleased = trueи, скорее всего, ничего не сделает (возможно, верните или просто тратит газ), поэтому лучше отменить или дроссель. Монитория мониторинга Gelato позволяет отменить задачи, так как (в отличие от Healto Happects). Задачи Gelato не могут быть изменены после создания (вам придется отменить и создать одну заново для изменений).

Разрешить контрактные звонки (при необходимости).Нашrelease()Функция была публичной и не ограничивала, кто может это назвать (кроме проверки времени). Это полезно, потому что нам не нужно белостное мороженое - любой, кто звонит его после времени, просто выполнит передачу бенефициару. Если бы вместо этого у нашей функции был владелец или конкретный вызывающий абонент, который она требует, нам нужно было бы разрешить Igelato называть его. Gelato может обрабатывать такие сценарии либо с использованием выделенного адреса исполнителя мороженого, либо путем инициирования прокси, который вы одобряете. Но для большинства сценариев TimeLock, то, как только будут выполнены требования, допустимо и даже желательно (любой тип хранителя может инициировать ее, как только требования будут выполнены).

Мониторинг.На панели мониторинга могила будет отображаться журналы выполнения. После прошедшего времени вы можете увидеть транзакцию с адреса исполнителя Gelato к вашему контракту. Вы можете проверить на EthersCan, чтоrelease()были вызваны и токены были перенесены. Gelato также предлагает интеграции уведомлений (например, на Discord/Telegram), чтобы предупредить вас, если задача не удалась или когда ваш баланс низкий.

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

  • Интеграционные усилия. Chainlink требует, чтобы вы внедрили свой умный контракт черезcheckUpkeep/performUpkeepИнтерфейс (или используйте их новый планировщик без кодов для простых вызовов на основе времени). Это означает написание дополнительного кода и развертывание пользовательского контракта, совместимого с хранителями. Желато, однако, может автоматизировать любую существующую функцию контракта без необходимости модификаций кода - вы просто определяете задачу, ссылаясь на функцию. Это делает архитектуру Gelato чрезвычайно интуитивной для использования для модернизации автоматизации. Gelato, однако, также включает в себя расширенную функцию для использования контрактов Resolver, если вы хотите, чтобы логика сложных условий, разведенная от логики выполнения.
  • Оплата и стоимость. Работы для автоматизации цепочки вознаграждены в токенах ссылок. Вам необходимо финансировать ссылку (ERC-677 на Ethereum) в реестре Keeper, чтобы финансировать ваше обслуживание. Это вводит зависимость и управление токеном ссылки (и на неэфирных цепях, ссылка должна быть соединена, поскольку она не является изначально в этих сетях). Задачи на мороженое оплачиваются в USDC. Вы можете выбрать предоплату или оплату за выполнение. Gelato даже не взимает с вас дополнительную плату за протокол в верхней части газа - вы в значительной степени просто платите газ за транзакцию и, возможно, небольшую премию исполнителю, и вы даже можете вычтеться из самой задачи. С Chainlink вы платите газ и небольшую премию в сети из вашего депозита ссылки. Оба являются довольно недорогими на практике для больших задач, хотя мороженое проще, если вы предпочитаете платить газ с самим USDC.
  • Надежность и децентрализация. Сеть Keeplince's Keepers очень децентрализована и построена на тех же надежных операторах узлов, которые питают оракулы цепного строки. У него хороший послужной список (с момента запуска Mainnet) хранители цепочки использовались более 100 проектами). Igelato также децентрализовано, с сетью исполнителей (хотя с первых дней у него был белый набор операторов узлов, он движется к децентрализации без разрешений. Оба ищут высокую надежность со отступами, чтобы гарантировать, что транзакции проходят. бонус.
  • Опыт разработчика (UX & Tooling). Chainlink имеет приличную документацию и довольно простую регистрацию пользовательского интерфейса. Тем не менее, настройка хранителя действительно требует развертывания нового кода контракта, если ваш контракт изначально не был разработан для него. Тестирование можно провести путем моделированияcheckUpkeepв среде разработчика. UX Gelato очень гостеприимно-панель Gelato Ops-это панель без кода, где вы указываете на планирование контрактных вызовов. Это идеально подходит для быстрой автоматизации или для нетехнических разработчиков. Gelato также предлагает SDK и даже помощь в программных задачах непосредственно в отношении прочности (Gelato также имеет контракт API для планирования задач из других контрактов). Chainlink также признала необходимость в простоте использования, введя пользовательский интерфейс планировщика автоматизации заданий, который также позволяет запланировать вызовы на основе времени без написания логики проверки (по существу сходившись на более прямом подходе планирования для простых случаев). С точки зрения сообщества и поддержки, оба являются активными: Cheaplink очень широко используется и поддерживается, а документация Gelato также является прочной.
  • Гибкость триггеров. Модель Chainlink сияет для триггеров на основе условий, которые включают данные в цепочке-вы кодируете условие вcheckUpkeepПолем Например, «если мой баланс контракта падает ниже x» или «если Oracle Price превышает y». Gelato может выполнять аналогичную логику, используя контракты с разрешением, но моделирование OFF-цепь Cheatlink подходит для газа (так как вас только заряжаютсяcheckUpkeepвызовы после их выполнения). Для ванильного планирования, оба, оба будут выполнять работу так же хорошо. Крон и интервальные триггеры Gelato, а также планирование Cron Cainlink идентичны. Преимущество Gelato заключается в том, что у вас могут быть условия и действия в качестве двух разных контрактов, если это необходимо (Resolver и Executor), которые могут избежать изменения исходных контрактов.

В целом, Automation Chainlink является отличным выбором, если вам требуется очень децентрализованное решение и вы не против ввести свой интерфейс с вашим контрактом (или уже развернут его). Он тщательно протестирован и широко используется в производстве. Gelato обладает очень простой в использовании и универсальной платформой для автоматизации, которая идеально подходит для планирования вызовов по уже существующим контрактам или когда вы хотите автоматизировать между несколькими цепями с одним инструментом. Многие разработчики даже используют и то, и другое, в зависимости от контекста-например, от цепочки для критического обслуживания условий в цепочке, и Gelato для более простых запланированных задач или интегрированных рабочих процессов, не цепных.

Заключение

Как разработчик, использующий литейный завод, вы можете интегрировать эти услуги и даже проверить логику на основе времени, моделируя время в тестах на кучу. При развертывании в живых сетях сильная подъем мониторинга и исполнения обрабатывается децентрализованной инфраструктурой, а не с помощью собственных сценариев. Инструменты автоматизации, такие как цепь и мороженое, повышают безопасность и UX, удалив зависимость от ручных триггеров. Они позволяют использовать варианты использования от периодических выплат вознаграждений, чтобы перерастать токены, выполнять сделки, когда условия встречаются, все без вмешательства человека.


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE