Bitcoreでビットコイン・アドレスを生成する

2015年4月14日

bitcore

 

 

Bitcoreライブラリーでビットコイン・アドレスを生成してみた。そして生成したアドレスに実際にコインを送るなどして、どのように残高が変化しているのかを観察した。またbitcore-exploresを利用してその残高を抽出してみた。

 

 

 

Bitcoreとは


 

BitcoreBitPayにより提供されているオープンソースのJavaScriptライブラリーで、ビットコインネットワークと繋がりアプリを構築することができる。つまり何十ギガもあるBitcoind(デーモン)をインストールせずにビットコインを利用するアプリケーションを作ることができる。同じようなライブラリーとしてBitcoinJなどがある。

 

 

 

ビットコイン・アドレス


 

■ビットコイン・アドレスについて

 

ビットコイン・アドレスは、1もしくは3で始まる27から34個の英数字でなっている。プログラミングによるアドレスの生成法を大まかに説明すると(1)秘密鍵(private key)を生成する(2)その秘密鍵から公開鍵(public key)を生成する(3)そしてその公開鍵からアドレスを生成する、という手順を踏む。Bitcoreを利用すればアルゴリズムを気にせずにアドレスを生成することができる。

 

アドレス自体はオフラインでも生成することができる。生成したアドレスにコインを送ればブロックチェーンに取り込まれ、ビットコインネットワークに認証される。ちなみにビットコイン・アドレスの生成パターンは2^256通りで事実上かぶることはありえない(10進数で10^77。観測可能な宇宙の原子数は10^80程)。

 

 

■Bitcoreでアドレスを生成する

 

開発環境

Mac OS 10.9.5(ターミナルを使用)
node v0.12.2(あらかじめnodeをセットしておくことが前提
npm 2.7.4
Bitcore v0.11

 

Bitcoreはnpmでインストールする。

 

npm install bitcore

 

アドレスを生成するプレイグランドでも試すことができる)。

 

 

以上でアドレスをランダムに生成することができる。

以下は私の生成したアドレスの一例。

>address
<Address: 1H6hjJTDrcHCqgJuqUt5CS1nnxAyCnmCzR, type: pubkeyhash, network: livenet>

 

尚、privateKeyの値(秘密鍵)はしっかりとコピーし保存しておく。この値さえ知っていれば、後でアドレス(公開鍵)を復元したり、MultiBit等の外部のウォレットにアドレスを移行することができる。

 

>privateKey

<PrivateKey: 1faea444b3e74f758b93a1×××××××××××××××891e663aef51c1d7a8ae58aac, network: livenet>

 

※上記のPrivateKeyの×部分は加工してある。

 

 

もちろん生成したばかりのアドレスはBLOCKCHAIN infoで検索しても、取引件数(No. Transactions)はゼロとなっている。

 

bitcore150413-01

 

 

■上記のアドレスにコインを送る

 

 手順

あらかじめビットコインを保有している以下のアドレス

13KanTEmqZ4QQb4ddqKCNeNzGfbeDqL72K

から先程生成したアドレス
1H6hjJTDrcHCqgJuqUt5CS1nnxAyCnmCzR
に0.0004BTC送った。

 

再度BLOCKCHAIN infoで検索し見ると、最終残高(Final Balance)が0.0004BTCになっているのが分かる(下記画像)。

 

bitcore150413-02

 

Transactionsの部分に注目してみると分かるように

13KanTEmqZ4QQb4ddqKCNeNzGfbeDqL72K から

1H6hjJTDrcHCqgJuqUt5CS1nnxAyCnmCzR にコインが移動しているのが分かる(手数料「Fee」込みでトータル0.0005BTC移動している)。

 

アドレスの横に(Unspent)と表示されているが、これは受け取った分のコインがアドレスと紐づいている(まだ使われていない)ことを示す。

 

 

次にコインを半分(0.0002BTC)だけ前のアドレスに送ってみた。

 

 手順

1H6hjJTDrcHCqgJuqUt5CS1nnxAyCnmCzR

から

13KanTEmqZ4QQb4ddqKCNeNzGfbeDqL72K
に0.0002BTC送った。

 

 1H6Hj〜アドレスの情報(←クリック)

bitcore150413-03

 

すると先程の(Unspent)0.0004BTCは(Spent)に変わっているのが分かる(画像1部分)。これははじめに送られた0.0004BTCのコインが既にアドレスと紐づいていないことを示す。

 

そして新しく生成されたトランザクションの 13Kan〜 にはしっかりと0.0002BTC送られていることが分かる(画像2部分)。その下に 1H6hj〜(Unspent)0.0001BTCと表示されているのは(画像3部分)、トランザクションは相手に指定した分だけコインを送るのではなく、おつりとして自分自身のアドレスに送り返す仕組みであることが示されている。計算としては以下の通りだ(今回は手数料Feeがかかっている)。

 

0.0004BTC − 0.0002BTC(相手に送った量)−0.0001BTC(手数料Fee)

= 0.0001BTC(自分に送り返した量、すなわち今の残高Unspent

 

このようにアドレス情報を探ってみると、過去のトランザクションによって生じた(Unspent)や(Spent)の量が刻々と記録されているのが分かる。上記の例では1H6hj〜アドレスに紐づく(Unspent)は一つしかないがビットコインの最終残高はそのアドレスの(Unspent)を全て足した量となる

 

 

 

bitcore-exploresでUTXOs(Unspent)を得る


 

bitcore-exploresはトランザクションのUTXOs、つまりまだ利用されていないUnspent(上述では「コインがアドレスと紐づいている」と表現している)を抽出することのできる機能を持ったモジュールで、BLOCKCHAIN infoinsightのような機能を実現することができる。

 

npmでインストールする。

 

npm install bitcore-explorers –save

 

生成したアドレス1H6hj〜のUTXOsを抽出する。

 

上記を実行すると以下のようなログが表示される。アドレス1H6hj〜にはUTXOs(UnspentOutput)としてb31bfb7da〜のトランザクションがあり、10000satisi(0.0001BTC)分のコインがあることがわかる。

 

UTXOs[0].satoshis

等で抽出できる。

 

https://blockchain.info/address/1H6hjJTDrcHCqgJuqUt5CS1nnxAyCnmCzR

https://insight.bitpay.com/address/1H6hjJTDrcHCqgJuqUt5CS1nnxAyCnmCzR

 

以上

 

 

参照


 

暗号通貨(Bitcoin, Monacoin)のプロトコルを理解する: 公開鍵と秘密鍵
http://qiita.com/monapay/items/f708f61f2ad102b548f8

 

技術者向けビットコイン講座 第2回 ビットコインアドレスと秘密鍵のフォーマット
http://btcnews.jp/btc-address-privkey-format/ 

 

Keys, Addresses, Wallets

https://github.com/aantonop/bitcoinbook/blob/develop/ch04.asciidoc

 

ビットコインアドレスは重複するのか?
http://agora-web.jp/archives/1591232.html

 

トランザクションの出力、入力

http://qiita.com/hshimo/items/0494f6855b565ce060fd#トランザクションの出力入力

 

How to get a list of utxos for an address?

https://labs.bitpay.com/t/how-to-get-a-list-of-utxos-for-an-address/347

 

Bitcoreを利用したサービス。ローカルにコードを落として利用することができる。秘密鍵さえ持っていれば、いつでもこのようなツールで残高表示やコインを他のアドレスへ送信することができる。

Offline Wallet | Bitcoin

 

Copyright © 2017 アクト・オブ・リーディング All Rights Reserved.  プライバシーポリシー