LoginSignup
17
25

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-12-18

課題

  • 一般的に、イーサリアムのブロックチェーンと通信するためには、自分で何らかのサーバーにイーサリアムのクライアントを入れて、常に最新のブロックチェーンのデータを同期しておく必要がある。
  • 本番で使う場合は、おそらく稼働率などを保証するため、ちゃんと複数ノードにする必要があったりする
  • 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 を使うのは良いと思います。

参考記事

17
25
2

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
17
25