LoginSignup
10
5

More than 5 years have passed since last update.

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

Posted at
1 / 21

自己紹介

  • 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


課題

開発再開されました


結論

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

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

10
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
5