Bitcoreでビットコインを送金してみる

#はじめに
bitcoinの送金を試して見たので自分用の覚書です^^
基本的な方法は、
https://www.npmjs.com/package/bitcore
こちらをご参照ください。

#手順
bitcoinのアドレスを作成
↓
送金(トランザクション作成 + ブロードキャスト)

#使用したライブラリなど
https://www.npmjs.com/package/bitcore

#実際に送金してみよう
##インストール
(環境) CentOS6.5
###1.nvmをインストール
```
$ git clone git://github.com/creationix/nvm.git ~/.nvm
$ source ~/.nvm/nvm.sh
$ nvm --version
0.33.2
$ nvm install 5.5.0
$ node -v
v5.5.0
$ npm -v
3.3.12
$ npm install bitcore
$ npm install bitcore-explorers

#bash_profileに記載しておく
vim ~/.bash_profile
source ~/.nvm/nvm.sh
nvm use "v5.5.0"
```
###アドレスの作成
```get_address.js
var bitcore = require('bitcore-lib');
var privateKey = new bitcore.PrivateKey();
var address = privateKey.toAddress();
console.log(privateKey);
console.log(address);
```

##実行
```
$ node get_address.js
```

アドレスを2つ作成して、送金元(a_address)と送金先(b_address)にする。

(memo)
一度残高が無いことを確認しておく(bitコインのアドレスはget_address.jsで取得したアドレス)
https://www.blocktrail.com/BTC/address/15SDWjGH32d1NhTzQ54asN8zqu92KS8ciR

###送金
```send_coin.js
var bitcore = require('bitcore-lib');
var explorers = require('bitcore-explorers');
var Transaction = bitcore.Transaction;
var insight = new explorers.Insight();
//送金元
var a_address = '';
//送金先
var b_address = '';
//送金元の秘密鍵
var privateKey = new bitcore.PrivateKey('');

insight.getUnspentUtxos(a_address, function(err, utxos) {
    if (err) {
        console.log(err);
    } else {
        console.log(utxos);
		var transaction = new Transaction()
		.fee(10000)//手数料(0.0001BTC = 10000satoshi)
		.from(utxos)
		.to(b_address,10000) //送金先アドレス、送金金額(0.0001BTC = 10000satoshi)
		.change(a_address) //お釣りの送金先アドレス
		.sign(privateKey)
		;
        insight.broadcast(transaction, function(err, returnedTxId) {
            if (err) {
                console.log(err);
            } else {
                console.log(returnedTxId);
            }
        });
    }
});
```

##memo
###utxosとは？
unspent transaction outputの略。
特定の所有者にロックされている分割のできないビットコインの固まりのこと。

###change(お釣り)に指定するアドレスはa_addressのこと？
ビットコインの送金は毎回異なるアドレスを使うことが推奨されているため、
changeには送金先とは異なるアドレスを指定するのが望ましい。
(1つのアドレスが漏洩しただけで、他の取引が知られてしまうと情報漏洩のリスクにつながる)
https://en.bitcoin.it/wiki/Address_reuse

###手数料feeの指定は必要？送金金額によって変更するか？
トランザクション手数料はデータサイズによって計算されるので、送金金額は関係ない。
手数料の金額によって、マイナーが処理する優先順位となるので、手数料のないトランザクションは、
トランザクションプールからブロックへの取り込みが遅れてしまうか処理されない可能性がある。

##履歴と残高の確認

```get_utxos.js
var explorers = require('bitcore-explorers');
var client = new explorers.Insight();
var address = '';

client.getUnspentUtxos(address,function(err,utxos){
        if(err){
                console.log("error");
        }
        else{
                console.log(
                        utxos.map(function(v){ return {
                            txid: v.txId,
                            vout: v.outputIndex,
                            scriptPubKey: v.script,
                            satoshis: v.satoshis,
                        }}));
        }
});
```

##結果
```
address_aの履歴 | 残高 : 0.0008 BTC
-------------------------------------------
address_0 -----> address_a 0.001 BTC　(0.001BTCを振り込んでおいた)
address_a -----> address_b 0.0001 BTC (address_bに送金する)
address_a -----> address_a 0.0008 BTC (お釣り)
```
```
address_bの履歴 | 残高 : 0.0001 BTC
-------------------------------------------
address_a -----> address_b 0.0001 BTC (address_aから送金されてきた)
```

#(参考)
残高や取引の履歴確認
https://www.blocktrail.com/BTC
Bitcoreの機能を試す
https://bitcore.io/playground/#/units
webクラウドのウォレット
https://blockchain.info/wallet
android版のウォレット
https://play.google.com/store/apps/details?id=piuk.blockchain.android
ドキュメントなど
https://www.slideshare.net/YukiAkiyama/bitcoin-x-javascript
http://noumenon-th.net/webstrategy/2015/04/14/bitcore/
http://noumenon-th.net/webstrategy/2015/04/21/bitcore-2/

(おまけ)
ちょうどホットな話題として、ランサムウェアの送金先にビットコインがつかわれたとのことで、まとめのリンクを載せておきます。

世界各地で発生したランサムウェア WannaCry の感染事案についてまとめてみた
http://d.hatena.ne.jp/Kango/20170513/1494700355