Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

by blueplanet
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


課題

開発再開されました


結論

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

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

blueplanet
ブロックチェーンエンジニア
https://chainbow.io
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした