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

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

---
## 自己紹介
- [[翻訳]どうやってデジタル世界で信頼の自動化を実現できる？ - Qiita](https://qiita.com/blueplanet/items/6ef1af9277c7752fa0cc)
- [一人で「イーサリアム・スマートコントラクト」 Advent Calendar 2017 - Qiita](https://qiita.com/advent-calendar/2017/ethereum-smart-contract)

---

## 今日話したいこと
- **イーサリアム上定時実行仕組みがない！！！**
- スマートコントラクトの解決案 [ethereum-alarm-clock](https://github.com/ethereum-alarm-clock/ethereum-alarm-clock)
- 課題

---
## イーサリアム上定時実行仕組みがない！！！
イーサリアムというか、ブロックチェーンのDAPP開発は、意外に制限あるよね

---
## イーサリアム上定時実行仕組みがない！！！
```javascript
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ネットワークのノードがいつでも参加・退出できる
    - 定時実行の場合、任せられる実行者がいない

---
## スマートコントラクトの解決案
- [github.com/ethereum-alarm-clock/ethereum-alarm-clock](https://github.com/ethereum-alarm-clock/ethereum-alarm-clock)

---
## スマートコントラクトの解決案
下記のトランザクションを作成しておけば、指定した時間帯で実行してくれる

```javascript
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](https://qiita-image-store.s3.amazonaws.com/0/4777/7002a170-9997-f5d8-b1da-6c7c03b65254.png)

---
## 構成
![eac.png](https://qiita-image-store.s3.amazonaws.com/0/4777/d5b299a7-3b4c-b4b9-5c3b-28768f83e050.png)

---

## 課題
- 現状はテストネット上しか稼働してない

---

## 課題
- 開発が止まっていた

![スクリーンショット 2018-02-02 12.32.40.png](https://qiita-image-store.s3.amazonaws.com/0/4777/188c4c3b-631b-1844-b443-81ec8a28ecc5.png)

---
## 課題
開発再開されました

- [Ethereum Alarm Clock Reboot – Piper Merriam – Medium](https://medium.com/@pipermerriam/ethereum-alarm-clock-reboot-bcfa9106a0d5)

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

---
# ご清聴ありがとうございました！