Ethereum
truffle
ropsten
infura.io

INFURA.IOを利用してみる

やること

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

infura.ioとは

https://infura.io/
1.png

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

MEW(myEtherWallet)でもノードリストにでてきます。
2.png

環境と前提

Ubuntu 16.04.4 LTS(Vagrant)
npmが動く。
ropstenアカウントを作成済みで、テスト用ETHとmnemonicを取得済みである。

APIキーを取得

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

4.png

無事、APIキーを取得できました。
3.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は
6.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

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

パッケージのインストール

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

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

ERC20トークンを作成

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

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ファイルを作成し、
デプロイ実行処理を書きます。

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へ繋ぐ設定を書きます。

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

いけてた!

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

感想

すごい便利(語彙

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