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

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

Repository

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

デバッグするまで

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

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

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

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

こんな感じでテスト通ればおk
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」を選択し、

さっきローカルで起動したlocalhost:9545を指定します。

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

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

まとめ

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

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