Posted at

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

More than 1 year has passed since last update.


自己紹介


  • 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



課題

開発再開されました



結論


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



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