Blockchain
Ethereum

イーサリアムのノードをAPIとして提供してくれるinfura.ioを使ってみる

課題

  • 一般的に、イーサリアムのブロックチェーンと通信するためには、自分で何らかのサーバーにイーサリアムのクライアントを入れて、常に最新のブロックチェーンのデータを同期しておく必要がある。
  • 本番で使う場合は、おそらく稼働率などを保証するため、ちゃんと複数ノードにする必要があったりする
  • https://infura.io は、その課題を解決してくれるサービスである。

使ってみる

コントラクトのデプロイ周り

  • 参考記事のまんまですが、 truffle を使ってデプロイする場合、truffle.js で設定できる
// ROPSTEN_MNEMONICとINFURA_ACCESS_TOKEN環境変数は事前時設定されている前提
// HDはどの言葉の略語だろう。。。
var HDWalletProvider = require("truffle-hdwallet-provider");
var mnemonic = process.env.ROPSTEN_MNEMONIC;
var accessToken = process.env.INFURA_ACCESS_TOKEN;

module.exports = {
  networks: {
    ropsten: {
      provider: function() {
        return new HDWalletProvider(
          mnemonic,
          "https://ropsten.infura.io/" + accessToken
        );
      },
      network_id: 3,
      gas: 500000
    }   
  }
};

自分のアカウントから送金する

  • ユースケースで言うと
    • Slack上で動くボットを実装したい
    • @bot send to 0xBA333d667eECA936b02B614fDD805028E5B2C38A 5のように叩かれると送金したい
  • 自分でノード運用する場合は、unlockAccount実行してから、sendTransactionすればよいが、ノードが自分で運用してセキュリティ問題がないことが前提である
  • https://infura.io の場合は、その前提がないので、上記で行けない
  • 解決方法: sendRawTransactionリンク先のコードのまんまですが、下記の感じで、トランザクションデータをサインしてから、sendRawTransactionを使う
var Tx = require('ethereumjs-tx');
var privateKey = new Buffer('e331b6d69882b4cb4ea581d88e0b604039a3de5967688d3dcffdd2270c0fd109', 'hex')

var rawTx = {
  nonce: '0x00',
  gasPrice: '0x09184e72a000', 
  gasLimit: '0x2710',
  to: '0x0000000000000000000000000000000000000000', 
  value: '0x00', 
  data: '0x7f7465737432000000000000000000000000000000000000000000000000000000600057'
}

var tx = new Tx(rawTx);
tx.sign(privateKey);

var serializedTx = tx.serialize();

//console.log(serializedTx.toString('hex'));
//f889808609184e72a00082271094000000000000000000000000000000000000000080a47f74657374320000000000000000000000000000000000000000000000000000006000571ca08a8bbf888cfa37bbf0bb965423625641fc956967b81d12e23709cead01446075a01ce999b56a8a88504be365442ea61239198e23d1fce7d00fcfc5cd3b44b7215f

web3.eth.sendRawTransaction('0x' + serializedTx.toString('hex'), function(err, hash) {
  if (!err)
    console.log(hash); // "0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385"
});

まとめ

  • トランザクションさえセキュアで送信できれば、他の処理はたぶん問題ないと思われるので、運用が面倒と思うなら、 infura.io を使うのは良いと思います。

参考記事