スマートコントラクトの定時実行を調べてみた

自己紹介

  • Hi-Ether ID: blueplanet
  • 魚 振江(ぎょ しんこう)
  • Ruby on Rails フリーランス
  • 2017年
    • 5月頃から仮想通貨の取引所システムの改修
    • 10月頃からブロックチェーンの勉強

自己紹介


今日話したいこと

  • イーサリアム上定時実行仕組みがない!!!
  • スマートコントラクトの解決案 ethereum-alarm-clock
  • 課題

イーサリアム上定時実行仕組みがない!!!

イーサリアムというか、ブロックチェーンのDAPP開発は、意外に制限あるよね


イーサリアム上定時実行仕組みがない!!!

contract PackedArray {
  uint[] public arrays;

  function push(uint[] _args) public {
      arrays = _args;
  }

  function remove(uint index) public {
      PackedArray(this).pack(arrays, index);
  }

  function pack(uint256[] _arrays, uint256 _deleteIndex) external {
      uint256 length = _arrays.length;
      uint256[] memory copy = new uint256[](length - 1);
      assembly {
          //find array data pos;
          let freep := mload(0x40)
          mstore(0x40, add(freep, 0x20))
          calldatacopy(freep, 0x4, 0x20)

          // array data first 32 byte is length. so slide to array body pos; 
          let arrayDataPos := add(mload(freep), 0x20)
          let size := mul(0x20, _deleteIndex)
          // method sig 4byte.
          calldatacopy(add(copy, 0x20), add(0x04, arrayDataPos), size)
          let afterpos := add(add(copy, 0x20), size)
          let alldatasize := mul(0x20, length)
          let aftersize := sub(alldatasize, add(size, 0x20))
          let afterindexPos := add(add(arrayDataPos, size), 0x20)
          calldatacopy(afterpos, add(0x04, afterindexPos), aftersize)
      }

      arrays = copy;
  }
}

:fearful: :fearful: :fearful:


イーサリアム上定時実行仕組みがない!!!


イーサリアム上定時実行仕組みがない!!!

  • 今までの定時実行は、サーバー・マシン上でのスケジューラに任せている
  • ブロックチェーンの論理上、定時実行の仕組みが難しい

イーサリアム上定時実行仕組みがない!!!

イーサリアムに限っているお話し

  • すべての処理は、トランザクションから始まる
    • 定時実行の場合、トランザクションを送信する送信元がない
  • P2Pネットワークのノードがいつでも参加・退出できる
    • 定時実行の場合、任せられる実行者がいない

スマートコントラクトの解決案


スマートコントラクトの解決案

下記のトランザクションを作成しておけば、指定した時間帯で実行してくれる

import 'contracts/Interface/SchedulerInterface.sol';

...
SchedulerInterface scheduler = SchedulerInterface(0xTODO);
uint lockedUntil = block.number + _numBlocks;

scheduler.schedule.value(2 ether)(
    myContractAddress,      // 呼び出されたいスマートコントラクトアドレス
    "",                     // 関数のパラメータデータ
    [
        2000000,            // 取引と一緒に送付されるガスの量。
        0,                  // 送信するガス量
        255,                // 実行ウインドウのサイズ
        lockedUntil,        // 開始ブロック番号
        30000000000 wei,    // GAS price
        12345 wei,          // 取引に含まれる寄付
        224455 wei,         // 取引に含まれる支払い
        20000 wei           // 請求者がデポジットとして送信しなければならない必要額。
    ]
);
...

構成

  1. 実行したいパラメータで TransactionRequestスマートコントラクトをブロックチェーンに登録しておく
  2. EAC(Ethereum Alarm Clock)クライアントを実行しているノードは TransactionRequestスマートコントラクトをスキャンし、指定された時間帯にてトランザクションを発行してくれる
    • イーサリアムのノードと関係なし
  3. 実際実行されたら、実行してくれた EAC クライアントに報酬と実行に使ったGASを返す

構成

npm i -g eac.js
eac.js -c

構成

スクリーンショット 2018-02-02 17.00.00.png


構成

eac.png


課題

  • 現状はテストネット上しか稼働してない

課題

  • 開発が止まっていた

スクリーンショット 2018-02-02 12.32.40.png


課題

開発再開されました


結論

  • まだライブネットで使えないですが、これからする

ご清聴ありがとうございました!

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.