やること
Ethereum系の開発で、
いちいちgethを使って環境を作るのは大変なので(chaindata重すぎ!)、
infura.ioを使って、開発環境にGethをインストールすることなく
Ethereumブロックチェーンにアクセスしてみよう。というトピックです。というか作業メモ。
infura.ioとは
「Truffle」でおなじみのCONSENSYSさんが、
開発をしていてなんだか安心のEthereumノードホスティングサービスです。
MEW(myEtherWallet)でもノードリストにでてきます。
環境と前提
Ubuntu 16.04.4 LTS(Vagrant)
npmが動く。
ropstenアカウントを作成済みで、テスト用ETHとmnemonicを取得済みである。
APIキーを取得
早速はじめてみます。
infura.ioを利用するにはまず、APIキーを取得する必要があるようです。
これは簡単に取得できるので、詳しい手順は省きます。
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
時間差で少し進んでしまいましたが、
ちゃんと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
truffleプロジェクトが作成されました。
パッケージのインストール
定番となっているzeppelin-solidityを使い、簡単にシンプルなERC20トークンを作成します。
また、truffle-hdwallet-providerを使って、truffleから自分のEthereumアカウントを利用してinfura.ioを利用できるようにします。
$ npm i zeppelin-solidity
$ npm i truffle-hdwallet-provider
ERC20トークンを作成
先ほど作成したTruffleプロジェクトのcontracts/
内にトークンコントラクトのソースを置きます。今回は何の変哲も無いただのERC20です。
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ファイルを作成し、
デプロイ実行処理を書きます。
const SToken = artifacts.require('./SToken.sol')
module.exports = (deployer) => {
let initialSupply = 1000000
deployer.deploy(SToken, initialSupply, {
gas: 2000000
})
}
デプロイ設定
truffle.jsを編集し、HDWalletProviderを利用してropstenへ繋ぐ設定を書きます。
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
いけてた!
※Sorry! We were unable to locate any valid Token Transfer Events~
みたいに言われてるところは、一度でもtokenを送金したりすればToken Transfer Eventsの発生が確認され、表示されなくなります。
感想
すごい便利(語彙
案件全部これでいいんじゃないの。。。とか思いたくなりますが、
自前でノードを持たざるを得ないケースも多いかも。。。