Node.js
Bitcoin
Blockchain
bitcore

[Node.js]ブロックチェーンアドレスを生成してみた - 上級編 -

More than 1 year has passed since last update.

実行環境

  • MacOS Sierra (10.12.6)
  • npm (5.3.0)
  • Node.js (8.2.1)

はじめに

前回、前々回とブロックチェーンアドレスを生成する過程について思うがままに書いてきましたが、今回はより踏み込んだ内容にしていきたいと思います!

本題

  1. 必要なライブラリを追加します。

    npm install bitcore-explorers --save
    npm install async
    

    ここでは前回の記事を読んでいて、同じ環境になっている前提で話を進めますので、もし今回の記事通りにコードを書いても動かないという方はぜひそちらも参考にしてください。

  2. 生成したアドレスが未使用であるかどうかチェックしてみたいと思います。

    server.js
    // ライブラリの読み込み
    var async = require('async');
    
    var bitcore = require('bitcore-lib');
    var Mnemonic = require('bitcore-mnemonic');
    var explorers = require('bitcore-explorers');
    
    // 親秘密鍵までの生成
    var code = new Mnemonic();
    var master_pri = code.toHDPrivateKey();
    
    // アドレスの生成と未使用チェック. 未使用アドレスが3つ見つかればそれらを配列にして出力
    var insight = new explorers.Insight();
    var address_array = new Array();
    var i = 0
    var count = 3;
    
    async.whilst(
      function () {return count > 0;},
      function (callback) {
        async.waterfall([
          function (callback) {
            var address = master_pri.derive("m/44'/0'/0'/0/" + i).privateKey.toAddress().toString();
            callback(null, address);
          },
          function (val, callback) {
            insight.address(val, function (err, info) {
              if (err) throw err;
              var txs = info['transactionIds'];
              if (txs.length == 0) {
                address_array.push(val);
                count--;
              }
              callback(null);
            });
          }
        ],
        function (err) {
          if (err) throw err;
          i++;
          callback(null);
        });
      },
      function (err) {
        if(err) throw err;
        console.log(address_array);
      }
    );
    

    上記のソースコードを実行すると、以下のようなエラーが表示されるかもしれません。

    Error: More than one instance of bitcore-lib found. Please make sure to require bitcore-lib and check that submodules do not also include their own bitcore-lib dependency.
    

    "bitcore-explorers"にも"bitcore-lib"ライブラリがサブライブラリとして入っており、別途"bitcore-lib"ライブラリを既にインストールしている場合、どちらを使えば良いか分からないと怒られているようです。

    npm list
    

    これを実行すると作業ディレクトリのNodeパッケージ一覧が表示されると思います。
    "bitcore-explorers"に付いてくる"bitcore-lib"のバージョンが古いので、こちらを削除することにします。
    "bitcore-explorers"の"package.json"の"bitocre-lib"のバージョンを「0.13.7」から「0.14.0」に編集します。
    上書き保存をしたら、古いバージョンの方の"bitcore-lib"ライブラリを全て削除し、以下のコマンドを叩きます。

    npm dedupe
    

    これで、新しいバージョンの方の"bitcore-lib"が選択されるはずです。私はこれで動きました。

    ちなみに"testnet"のアドレスを未使用かどうかチェックしたいという方は、以下のように記述すると動作します。

    var insight = new explorers.Insight('testnet');
    


  3. 任意のアドレスの残高を確認する。
    相手が間違った金額を送金してしまい、再び同じアドレスに対して残金を送金した場合、一つのアドレスに対して2つのトランザクションが存在することになり、結局総額いくら受け取ったのか分からないという事があるかもしれません。

    そんな時にも先ほどの"bitcore-explorers"は役立ちます。

    insight.address("Blockchain address...", function (err, info) {
      if (err) throw err;
      console.log(info);
    });
    

    先ほどでは、infoの中の「transactionIds」のみに着目して、未使用かどうか判断していましたが、info自体にはもっと多くの情報が載っています。

    試しに実行してみました。その結果が以下の出力になります。

    AddressInfo {
      address: <Address: 3GBxE2imur81Bh6Y3hxPpiFh5Wq1XvZiue, type: scripthash, network: livenet>,
      balance: 237409612,
      totalReceived: 52080552711,
      totalSent: 51843143099,
      unconfirmedBalance: 0,
      transactionIds: 
       [ '6e76d222b82e2569fff38d0ce6015b6192028a8e37e5615b18a862b56ab67941',
         '2dcbb77d511c540de174d3eb33527fc008339ec21415046f472a5e94c472a916',
         '3bc40054b260ebb695eef3d414bc8c98a9edf7013c290e7405c2d94113dab277',
         'f90b7f72fe3089331af00dbecdff1e69c23efa4ab14ddf9977dfedbf3571c09f',
         '62d9d0cf96df9942d5711dc45ec01def4225f2613952ef283e139623008377fa',
         ... 900 more items ] }
    

    今回の目的である、アドレスを一つの口座と見立てての残高は「balance」を見れば分かります。単位は"Satoshi"ですので、換算すると「2.37409612 BTC」となります。

    その他にも、総受金額「totalReceived」や総送金額「totalSent」などを見ることもできます。

    これを見ると分かるように、請求案件毎にアドレスを新しくしていかないと、個人情報にも成り得る「口座残高」や「送受金件数」が丸見えとなってしまいます。これらが公開されている事がブロックチェーンの良いところでもあるので、アドレスはなるべく使い回ししないことをオススメします。

終わりに

少しブロクチェーンについて興味が湧いた!面白そう!と思った方がいましたら、ぜひコメント下さい(^^)

参考サイト