RemixIDEを使ったOraclize

# tr;dr

Ethereumのスマートコントラクト上でOraclizeを使いたい。
基本的にはチュートリアル通りで動くっぽいがやっぱりfunctionのデバッグがしたい！
普段solidityはRemixIDEで書いているので、IDE上でデプロイされたOraclizeを使ったfunctionの実行までをまとめる。
なんか適当にやるとバージョンとかの関係でうまくくいかなかった、、、
ググるとバージョンサポートが追い付いてないみたいな記事もあったので、とりあえず確認できた方法をメモ書きする。



## Oraclize

スマートコントラクト上にインターネットの情報を取り込むためのライブラリ（？）
ブロックチェーン上にはデータが永続化されるため、スマートコントラクトに正しいデータを取り込むのは不正のされていない真正性のあるデータを取り込む必要がある。
OraclizeではライブラリからRESTapiを実行してそのレスポンス結果をスマートコントラクト上に取り込むことができる。

（どうもOraclizeProvableという名前に変わったんですかね？ライブラリそのものの名前はOraclizeのままですが、、、）

http://provable.xyz/
https://docs.provable.xyz/#home


# Tools

## remix-ide
https://github.com/ethereum/remix-ide

Atomとかいろいろ使ったんですがスマートコントラクトのデバッグをやるにはRemixが一番便利という感想です。
getho使ってたんですがサービス終わってしまうそうで、、残念、、、
Atomとかのエディタで直接できるのがうれしいんですが、使い方が悪いのかあまり安定せず、、、
Remix、ブラウザエディタだと侮っていたのですが、localhostで展開できるIDEの物があったのでこっちを最近は使っています。
ローカル・テストネットにも簡単にコンパイル・デプロイので便利です。

## Repository

https://github.com/provable-things/ethereum-examples

このリポジトリでサンプル作ってくれるので、これを流用します。


#デバッグするまで



まずhttps://github.com/provable-things/ethereum-examples をクローンします。

```
git clone https://github.com/provable-things/ethereum-examples.git
```


youtubeにリクエストするサンプルがあるのでまずそれに従います。
Instructionsに従ってtestまでとりあえず通しましょう。

https://github.com/provable-things/ethereum-examples/tree/master/solidity/truffle-examples/youtube-views


```
cd ethereum-examples/solidity/truffle-examples/youtube-views && npm install
npx truffle develop
(別ターミナルで)
npx ethereum-bridge -a 9 -H 127.0.0.1 -p 9545 --dev
(truffle developしたターミナルで)
test
```

こんな感じでテスト通ればおｋ
https://github.com/provable-things/ethereum-examples/blob/master/solidity/truffle-examples/youtube-views/youtube-views-tests.jpg

---

ではここから好きにリクエストするようデバッグしてきましょう。
youtube-viewsのディレクトリをRemixIDEで開きましょう。

"Connect to localhost"で行けます。

contracts/YoutubeViews.solの中にupdate関数があり、oraclize_queryに書いているURLにリクエストできます。
レスポンス単位でhtml、json指定いろいろできるようです。
https://docs.provable.xyz/#ethereum-quick-start

ひとまずGitHubにリクエストして、レスポンスをコントラクトに書きましょう。
https://api.github.com/users/[ユーザーID]
このURLにリクエストするとユーザー情報のJSONが返ってくるので、ユーザーIDの"login"を取得するように修正します。

```
pragma solidity >= 0.5.0 < 0.6.0;

import "./oraclizeAPI.sol";

contract YoutubeViews is usingOraclize {

    string public viewsCount;

    event LogYoutubeViewCount(string views);
    event LogNewOraclizeQuery(string description);

    constructor()
        public
    {
        update(); // Update views on contract creation...
    }

    function __callback(
        bytes32 _myid,
        string memory _result
    )
        public
    {
        require(msg.sender == oraclize_cbAddress());
        viewsCount = _result;
        emit LogYoutubeViewCount(viewsCount);
        // Do something with viewsCount, like tipping the author if viewsCount > X?
    }

    function update()
        public
        payable
    {
        emit LogNewOraclizeQuery("Oraclize query was sent, standing by for the answer...");
        oraclize_query("URL", 'json(https://api.github.com/users/[自分のIDを指定しする]).login');
    }
}

```



RemixIDEでコンパイル・デプロイして、、、と思ったんですがどうもいい感じに動かないですね、、、
ローカルで直接コンパイル・デプロイした後、RemixIDEをローカルに接続、デプロイしたコントラクトにアクセスしてデバッグしましょう。

```
truffle(develop)> compile
truffle(develop)> migrate
```

migrateが終わるとcontractaddressがわかるのでコピーします。

```
   Deploying 'YoutubeViews'
   ------------------------
   > transaction hash:    0xae586a445b3dbb9871a8f0e8c01775d959f4ee84eca6cc5f449faad47ea6b818
   > Blocks: 0            Seconds: 0
   > contract address:    0x3Eb157dc17B371bD3ab08043C07F7B32aB7943C0
   > account:             0x626A52D9b5F9F050fc73b143f4a99D11F3BeF170
   > balance:             99.95846674
   > gas used:            1749721
   > gas price:           20 gwei
   > value sent:          0 ETH
   > total cost:          0.03499442 ETH

```

RemixIDEをローカルで起動したままのRPCに接続します。

Environmentから「Web3Provider」を選択し、
<img width="1440" alt="スクリーンショット 2019-07-14 11.31.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114040/94f99830-f349-3ab3-0abd-bc279d92fd0f.png">

さっきローカルで起動したlocalhost:9545を指定します。
<img width="1440" alt="スクリーンショット 2019-07-14 11.31.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114040/736c964e-673d-c014-624e-09732a35b7b0.png">


先ほどコピーしたコントラクトアドレスをAtAddressに入力して接続します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114040/535f2842-9e36-3690-b224-e839cb48c387.png)


成功するとDeployedContractsに出てきます。
oraclizeのfunctionはデプロイ時に実行されているので、
viewsCountから指定したログインIDが確認できればおｋです。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114040/111ae372-f5f5-a8da-ba04-6b13850fd49e.png)



# まとめ

OraclizeのRemixIDEを使ったデバッグについて書きました。
直接Remix上でもコンパイル・。デプロイできるんですが、あんまり安定せず、、、
他にもやり方あれば教えてください。

というか皆さんコントラクトのデバッグはどんな感じでやってるんですかね、、、