INFURA.IOを利用してみる

# やること
Ethereum系の開発で、
いちいちgethを使って環境を作るのは大変なので(chaindata重すぎ！)、
infura.ioを使って、開発環境にGethをインストールすることなく
Ethereumブロックチェーンにアクセスしてみよう。というトピックです。というか作業メモ。

# infura.ioとは
https://infura.io/
![1.png](https://qiita-image-store.s3.amazonaws.com/0/254378/492f84a2-b615-b90a-035f-a559411f3e40.png)


「Truffle」でおなじみのCONSENSYSさんが、
開発をしていてなんだか安心のEthereumノードホスティングサービスです。

MEW(myEtherWallet)でもノードリストにでてきます。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/254378/e8168ab5-278c-10ac-423e-0848c96b4374.png)


# 環境と前提
Ubuntu 16.04.4 LTS（Vagrant）
npmが動く。
ropstenアカウントを作成済みで、テスト用ETHとmnemonicを取得済みである。

# APIキーを取得
早速はじめてみます。
infura.ioを利用するにはまず、APIキーを取得する必要があるようです。
これは簡単に取得できるので、詳しい手順は省きます。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/254378/bc177ac7-f5e3-cba8-f23f-15d15438fb5e.png)


無事、APIキーを取得できました。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/254378/6c0c7861-8305-258e-5a78-f845a681e55c.png)

# APIを叩いてみる
JSON-RPCの各メソッドが叩けるようです。
https://infura.io/docs

今回はそのまま、eth_blockNumberメソッドを叩いてみます

```
$ curl -X POST
  -H "Content-Type: application/json"
  --data '{"jsonrpc": "2.0", "id": 1, "method": "eth_blockNumber", "params": []}'
  "https://mainnet.infura.io/W1ghsxXnKCVpPuksKSeB"
```
※`W1ghsxXnKCVpPuksKSeB`の部分は公式のサンプルキーですので、取得したAPIキーに読み替えてください。

レスポンスはというと・・・

```
{"jsonrpc":"2.0","id":1,"result":"0x5847bb"}
```
とれた！

resultをHexadecimal to Decimalすると、
`5785545`

この記事を書いている今現在のlatest Blockは
<img width="544" alt="6.png" src="https://qiita-image-store.s3.amazonaws.com/0/254378/947498b4-672f-2ac2-1833-73292dc4b56a.png">

時間差で少し進んでしまいましたが、
ちゃんとeth_blockNumberが取れました。

REST-LIKE APIも用意されています。

```
https://api.infura.io/v1/jsonrpc/mainnet/eth_blockNumber?token=W1ghsxXnKCVpPuksKSeB
```

# Contractをデプロイしてみる
続けて、Truffleとinfura.ioを使って適当なERC20トークンコントラクトをデプロイしてみます

# Truffleのインストール

```
$ npm install -g truffle
```

# truffleプロジェクトを立ち上げる

```
$ mkdir infura_test
$ cd infura_test/
$ truffle init
```
![5.png](https://qiita-image-store.s3.amazonaws.com/0/254378/73ade080-976f-9383-414c-3085df09e882.png)

truffleプロジェクトが作成されました。

# パッケージのインストール
定番となっているzeppelin-solidityを使い、簡単にシンプルなERC20トークンを作成します。
また、truffle-hdwallet-providerを使って、truffleから自分のEthereumアカウントを利用してinfura.ioを利用できるようにします。

```
$ npm i zeppelin-solidity
$ npm i truffle-hdwallet-provider
```

# ERC20トークンを作成
先ほど作成したTruffleプロジェクトの`contracts/`内にトークンコントラクトのソースを置きます。今回は何の変哲も無いただのERC20です。

```solidity:SToken.sol
pragma solidity ^0.4.18;
import "../node_modules/zeppelin-solidity/contracts/token/ERC20/StandardToken.sol";

contract SToken is StandardToken {
    string public name = "SToken";
    string public symbol = "ST";
    uint public decimals = 18;

    constructor(uint initialSupply) public {
        totalSupply_ = initialSupply;
        balances[msg.sender] = initialSupply;
    }
}
```
設置したら、コンパイルしましょう。

```
$ truffle compile
Compiling ./contracts/Migrations.sol...
Compiling ./contracts/SToken.sol...
Compiling ./node_modules/zeppelin-solidity/contracts/math/SafeMath.sol...
Compiling ./node_modules/zeppelin-solidity/contracts/token/ERC20/BasicToken.sol...
Compiling ./node_modules/zeppelin-solidity/contracts/token/ERC20/ERC20.sol...
Compiling ./node_modules/zeppelin-solidity/contracts/token/ERC20/ERC20Basic.sol...
Compiling ./node_modules/zeppelin-solidity/contracts/token/ERC20/StandardToken.sol...
Writing artifacts to ./build/contracts
```
依存と継承が解決され、`./build/contracts`へコンパイルされました。
コンパイル後は同名のjsonファイルが作成され、この中にはABIやbytecode等の重要な情報が含まれています。引数をとらないコントラクトの場合、このbytecodeだけあれば手動でデプロイできたりします。
(ソースコードを修正した場合、再度コンパイルをする必要があります)

# migrate
`migrations/`配下にmigrationファイルを作成し、
デプロイ実行処理を書きます。

```javascript:2_deploy_token.js
const SToken = artifacts.require('./SToken.sol')

module.exports = (deployer) => {
  let initialSupply = 1000000
  deployer.deploy(SToken, initialSupply, {
      gas: 2000000
  })
}
```

# デプロイ設定
truffle.jsを編集し、HDWalletProviderを利用してropstenへ繋ぐ設定を書きます。

```javascript:truffle.js
var HDWalletProvider = require("truffle-hdwallet-provider");
var mnemonic = "**********";

module.exports = {
  networks: {
    ropsten: {
      provider: function() {
        return new HDWalletProvider(
          mnemonic,
          "https://ropsten.infura.io/**********"
        );
      },
      network_id: 3,
      gas: 500000
    }   
  }
};
```
**********の部分はそれぞれ自分のmnemonicとAPIキーに読み変えてください。
ソースコードに書くのではく、設定ファイルを用意して読み込むのが望ましいと思います。

# デプロイ
```
$ truffle migrate --network ropsten
Using network 'ropsten'.

Running migration: 1_initial_migration.js
  Deploying Migrations...
  ... 0x5aa1fdae04625a349b4957d4c644d31f3dad48e770c045f22ed67f807f669a35
  Migrations: 0x011aedfbd31ca75f897b312f224e9cce6d88f7bd
Saving successful migration to network...
  ... 0x539388e4a59bf76ffe65b929a0f9d6fa2fae0172b5bfe250e494b14c26a98afd
Saving artifacts...
Running migration: 2_deploy_token.js
  Deploying SToken...
  ... 0xa7600ab2501974882fd5ab21295e1f5810c992de6df57eacf514698da5076761
  SToken: 0x34271a6b25c50c954642fc73529d79cccbaea9e2
Saving successful migration to network...
  ... 0x3101e8a6cc51d91b16000242923d5b88ed9716d56104d56ec0c4fb2be81bd61c
Saving artifacts...
```
少し時間がかかりましたが、デプロイに成功した模様です。

早速ropstenのEtherscanでデプロイされたトークンをチェックしましょう
https://ropsten.etherscan.io/token-search

![7.png](https://qiita-image-store.s3.amazonaws.com/0/254378/75ed1141-c9a5-b809-a026-aa257f6fc8e1.png)

いけてた！



※Sorry! We were unable to locate any valid Token Transfer Events~
みたいに言われてるところは、一度でもtokenを送金したりすればToken Transfer Eventsの発生が確認され、表示されなくなります。

# 感想
すごい便利（語彙

案件全部これでいいんじゃないの。。。とか思いたくなりますが、
自前でノードを持たざるを得ないケースも多いかも。。。