LoginSignup
32
26

More than 5 years have passed since last update.

INFURA.IOを利用してみる

Posted at

やること

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の発生が確認され、表示されなくなります。

感想

すごい便利(語彙

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

32
26
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
32
26