Как может работать контракт позже?

В моем приложении blockchain я хотел бы, чтобы событие срабатывало позднее, часами или даже через несколько дней после того, как приложение недавно получило транзакцию от пользователя. Как я могу создать «событие», которое будет запускаться через некоторое время?

75 голосов | спросил Jeff Coleman 20 Jpm1000000pmWed, 20 Jan 2016 20:25:05 +030016 2016, 20:25:05

4 ответа


74

Отказ от ответственности: я являюсь разработчиком службы буферизации Ethereum, и я непосредственно извлекаю выгоду из ее использования.

Lazy vs Eager Execution

Существует два основных способа разработки контракта, который будет вызываться позднее: ленивая оценка или нетерпеливая оценка .

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

Примером этого может быть договор о трастовом фонде, который останется заблокированным до 18-го дня рождения. Этот человек будет мотивирован на то, чтобы выполнить разгон этих средств в то время.

Более сложным примером является процентный контракт. Скажем, я депозит 1 ETH, и каждый месяц я получаю 1% процентов, составление.

Есть два способа сделать это:

  1. Ленький способ: когда я хочу снять свои деньги, я называю контракт, и он рассчитывает мой баланс на основе процентной ставки, моего последнего известного баланса и прошедшего времени.
  2. Искренний способ: я использую будильник Ethereum или какую-либо аналогичную услугу для вызова функции claimInterest() контракта, которая рассчитывает интерес этого месяца и дебетует мой баланс.

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

Нежелательная оценка полезна, когда переходы состояния

  1. Вычислительно дорого
    • Работа с большими наборами хранилищ, сортировка больших списков и т. д.
  2. Недетерминированные
    • Использует внешний вход, например, вызовы Oraclize.it
  3. Отсутствие стимулов
    • Согласование данных, различные неденежные контракты.
  4. Опираясь на другой контракт
    • Если контракт должен принимать входные данные или отправлять транзакции другому контракту

Планирование вызовов с буфером Ethereum

Служба будильника Ethereum поддерживает планирование контракта, который будет вызываться в указанном блоке в будущем. Основополагающий механизм - это, по сути, абстракция основанного на стимулах решения, которое позволяет произвольным учетным записям на основе частного ключа иметь стимул для выполнения вызовов по произвольным контрактам.

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

contract SchedulerAPI {
    function scheduleCall(address contractAddress,
                          bytes4 abiSignature,
                          uint targetBlock) public returns (address);
}

contract CallMeLater {
    // The address of the v0.6.0 Alarm Clock scheduler contract.
    address constant Scheduler = SchedulerAPI(0xe109ecb193841af9da3110c80fdd365d1c23be2a);

    function CallMeLater() {
        // Schedule a call to the `callback` function
        Scheduler.value(2 ether).scheduleCall(
            address(this),               // the address that should be called.
            bytes4(sha3("callback()")),  // 4-byte abi signature of callback fn
            block.number + 480,          // the block number to execute the call
        );
    }

    function callback() public {
        // whatever code you want executed.
    }
}

В приведенном выше примере показан контракт, в котором планируется, что вызов функции будет состоять из 480 блоков после того, как контракт будет создан для функции callback(). Часть планирования вызова обеспечивает достаточный эфир для оплаты будущих расходов на газ для выполнения вызова, а также для платежей, которые идут на исполнителя вызова и на себя.

Когда этот вызов запланирован, развертывается новый контракт, который управляет всеми деталями для выполнения вызова. Этот пример преднамеренно очень прост и не учитывает многие мелкозернистые параметры конфигурации, доступные для планирования вызовов (подробнее об этом ниже).

Исполнение

Для работы службы оповещения требуется учетная запись Ethereum на основе секретного ключа для выполнения вызова в указанное время. Это поведение мотивировано значением платежа, которое связано с каждым запланированным вызовом. Когда целевой блок происходит, исполнитель вызова полностью возмещается за свои расходы на газ, а также уплачивается с указанной суммы платежа за их обслуживание.

Этот процесс мониторинга службы сигнализации для предстоящих вызовов и их выполнения может быть выполнен с помощью Эфириума-будильник-клиент .

Конфигурируемые параметры для запланированных вызовов

  • contractAddress: какой адрес следует вызывать.
  • targetBlock: блок, по которому должен быть вызван контракт.
  • gracePeriod: количество блоков после targetBlock, в течение которых вызов может бытьвыполняется.
  • abiSignature: 4-байтная подпись функции, которая должна быть вызвана.
  • callData: данные вызова, которые должны быть переданы функции.
  • suggestedGas: значение газа, которое должно быть предоставлено при выполнении вызова.
  • basePayment: сумма, выплаченная исполнителю за вызов.
  • baseFee: сумма, выплаченная создателю службы сигнализации.

Затраты

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

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

Тестирование

Служба сигнализации доступна для тестирования в тестовой сети @ 0xb8da699d7fb01289d4ef718a55c3174971092bef. Я лично запускаю планировщик вызовов для выполнения вызовов, запланированных в тестовой сети.

Более подробную информацию об этом можно найти здесь: http://blog.ethereum-alarm-clock.com/blog/2016/1/16/the-alarm-service-is-now-available-on-the -testnet

Гарантия

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

Одним из способов оценки надежности сервиса является проверка договора Надежность Канарских островов . Это контракт, который постоянно перепланирует вызов себе каждые два часа. Каждый раз, когда происходит этот вызов, записывается «heartbeat» . Если какой-либо из этих вызовов пропущен, канарейка умирает . Транзакционный контракт, который был жив в течение 30 дней, указывает на то, что служба не пропустила вызов любого из 360 запланированных вызовов, которые он создал за эти 30 дней.

  

Обратите внимание, что это не означает, что не было пропущенных вызовов, но у самой канарейки не было никаких пропущенных звонков.

Защита

Как планировщик вызова функции, вы можете рассчитывать на следующее:

  • Ваш контракт будет вызываться с точными данными вызова, с которыми он был настроен.
  • Контракт не будет вызываться до или после окна блоков между целевым блоком и количеством блоков после указанного в льготный период.

Trustlessness

Служба сигнализации не предоставляет каких-либо специальных разрешений какой-либо стороне и является открытым исходным кодом на 100%.

Документация и другие ссылки

ответил Tomachi 20 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 20 Sep 2017 06:40:29 +0300 2017, 06:40:29
18

Вы могли бы использовать будильник Ethereum, как уже упоминалось ранее, но вы также можете изменить свой стиль программирования на парадигму «нужно вызвать, чтобы выполнить».

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

ответил linagee 20 Jpm1000000pmWed, 20 Jan 2016 20:33:01 +030016 2016, 20:33:01
13

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

Другой вариант - использовать Oraclize с пустым запросом:

/*
   Simple Alarm code.

   This contract will be called back automatically 1 day after its birth
*/

import "dev.oraclize.it/api.sol";

contract Alarm is usingOraclize {
    function Alarm() {
       oraclize_query(1*day, "URL", "");
    }

    function __callback(bytes32 myid, string result) {
        if (msg.sender != oraclize_cbAddress()) throw;
        // do something, 1 day after contract creation
    }
} 
ответил Thomas Bertani 21 Jpm1000000pmThu, 21 Jan 2016 17:56:16 +030016 2016, 17:56:16
4

Не существует формального способа планирования событий через сам протокол.

Однако кто-то уже написал Будильник Ethereum - соглашение, которое поддерживает планирование событий на более позднем этапе момент во времени. Он децентрализован, насколько я мог судить, кто-то может организовать запланированные мероприятия и заплатить за это.

ответил Maran 20 Jpm1000000pmWed, 20 Jan 2016 20:29:33 +030016 2016, 20:29:33

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132