PycoinでBitcoin Testnetに接続


## Pycoinとは
BitcoinやAltcoinネットワークとやり取りができるPythonライブラリです。
Bitcoinネットワークに接続するにはBitcoin Coreをインストールするのが一般的かと思いますが、けっこう面倒です。Pycoinを使うと簡単にBitcoinネットワークに接続できます。
KUとTXという便利なコマンドラインツールもあり、本記事ではこのコマンドラインツールを使う方法と、環境変数を設定してBitcoin Testnetに接続する方法を紹介します。

PycoinはBitcoinだけでなく、LitecoinやDogecoin、Dashなど比較的に有名なAltcoinやその他聞いたことないようなコインも扱えます。
Python2.7と3.3以降に対応しています。
https://github.com/richardkiss/pycoin

## 環境構築
pipでインストールできます。
venvなどで仮想環境を構築してインストールしましょう。

```
$ pip install pycoin
```


## Testnetとは
Bitcoinの開発には普通Testnetが利用されます。
開発に本物のBTCを使うわけもなく、本番はMainnetと呼ばれますが、開発者用にTestnetが構築されています。

こちらの記事が詳しいです。
Bitcoinを使ったアプリケーションのテスト環境
http://techmedia-think.hatenablog.com/entry/2015/05/10/123243

Testnet上のコインは価値を持たず、Faucetでもらうことができます。
https://tpfaucet.appspot.com/

Testnetはここから確認できます。
https://testnet.blockexplorer.com/

## KUとTX
PycoinにはKUとTXという便利なコマンドラインツールがあります。
https://github.com/richardkiss/pycoin/blob/master/COMMAND-LINE-TOOLS.md

KUは"key utility"で開発者のRichard Kissいわく、Keyを操作するための「スイスアーミーナイフ」のようなものらしいです。それだけ便利ってことですかね。

TXは人間が読みやすいようにトランザクションを確認したり、操作するためのツールです。

サンプルコードにもある、ku createを打ち込んでみましょう。
HDウォレットの標準的な規格ともいえるBIP32のkeyがランダムに発行されます。

```
$ ku create
warning: can't open gpg, can't use as entropy source

input                        : create
network                      : Bitcoin mainnet
netcode                      : BTC
wallet key                   : xprv9s21ZrQH143K2K5pPUoMrx8g8B3xSeJuAAXtt7XP6Gs1w9WWCRibNaMiEUjN9j\
                                 YpXaejADY9GGE3KyKX4oztPCt7bCZwVTw8fuyr7rPcVp3
public version               : xpub661MyMwAqRbcEoAHVWLNE65QgCtSr72kXPTVgVvzecPzowqejy2qvNgC5mofRo\
                                 PR2QT7xC4XY9pxtP2H3EoLbB2urCPgvD6FBMm1LXEBope
tree depth                   : 0
fingerprint                  : 9a087148
parent f'print               : 00000000
child index                  : 0
chain code                   : 1980c24d0593ce4a42f3dae1991cb7617f8cbac03df219a796be5392775ff361
private key                  : yes
secret exponent              : 62147175208710988790827765505072286205595207768729086914666605171876233295603
 hex                         : 89660dfd51eb4720adb856375cb0273222b6aaccf34d48ec3abbcc3e865936f3
wif                          : L1po7g8b8xtn7w7ukg8Gv6j3sEQykCS2NcWwLRZD1tDAUMMVYJ5Y
 uncompressed                : 5JroFCatgsGovgT2z2AMNYf5GutCVpT4V1LvYb7PfGEBJdEbts1
public pair x                : 68090829527568288081052782941849647349285350892240776672153772254112346326898
public pair y                : 51301029354091858472661926463670541630631183134816042193916222104982852838049
 x as hex                    : 968a0b34e401a041c684d7a675857ad7b9b1ed1936d056e43b01ac6a0180c772
 y as hex                    : 716b5a882afdc55f901d07dfe5c769106dead6710a70858e51fe51a15039a2a1
y parity                     : odd
key pair as sec              : 03968a0b34e401a041c684d7a675857ad7b9b1ed1936d056e43b01ac6a0180c772
 uncompressed                : 04968a0b34e401a041c684d7a675857ad7b9b1ed1936d056e43b01ac6a0180c772\
                                 716b5a882afdc55f901d07dfe5c769106dead6710a70858e51fe51a15039a2a1
hash160                      : 9a087148075e0ae4cd68fd4019e63f2df521572c
 uncompressed                : 017773ac09011e42b64ede8701f67a15056455ed
Bitcoin address              : 1F3TB8yLpkDxRZ8jsX9o7FPCF99VDcZsg5
Bitcoin address uncompressed : 18kmrPFEDGxXiUjr5GYsw2TxCzqqUiZ5F
Bitcoin segwit address       : p2y8WmmTAGv9XjWT8bjjyuZemZFrUz5xA7oY
```

## コマンドラインからTestnetに接続
引数に -nをとることでネットワーク名を指定できます。
BitcoinのTestnetを指定する場合は-nXTNです。

```
ku -nXTN 1

input                        : 1
network                      : Bitcoin testnet3
netcode                      : XTN
secret exponent              : 1
 hex                         : 1
wif                          : cMahea7zqjxrtgAbB7LSGbcQUr1uX1ojuat9jZodMN87JcbXMTcA
 uncompressed                : 91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgwmaKkrx
public pair x                : 55066263022277343669578718895168534326250603453777594175500187360389116729240
public pair y                : 32670510020758816978083085130507043184471273380659243275938904335757337482424
 x as hex                    : 79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798
 y as hex                    : 483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8
y parity                     : even
key pair as sec              : 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798
 uncompressed                : 0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798\
                                 483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8
hash160                      : 751e76e8199196d454941c45d1b3a323f1433bd6
 uncompressed                : 91b24bf9f5288532960ac687abb035127b1d28a5
Bitcoin address              : mrCDrCybB6J1vRfbwM5hemdJz73FwDBC8r
Bitcoin address uncompressed : mtoKs9V381UAhUia3d7Vb9GNak8Qvmcsme
Bitcoin segwit address       : QWz8QvrJz5QmWegmBv9tXP447AdU7JQtyakg
```

## 環境変数を設定してTestnetに接続
コマンドラインからでなく、もちろんファイルから実行する場合などにもネットワークを指定することができます。

基本的に何も指定しない場合はBitcoin Mainnetに繋がります。

うっかりMainnetでやっちゃった！みたいなのも嫌なので、自端末に環境変数を設定してデフォルトでネットワークを指定する方法を紹介します。

今回はBitcoin Testnetをデフォルトにします。

環境変数の設定を設定します。指定できるネットコードはnetworksのall.pylegacy_network.pyに書かれています。

```
$ export PYCOIN_DEFAULT_NETCODE="XTN"
```
確認しましょう。

```sample.py
from pycoin.networks import default

default_netcode = default._netcode_for_env()
print(default_netcode)
```
これを実行して指定したnetcodeが表示されていれば大丈夫です。

Keyの作成など、netcodeを引数にとることがあるので、そのときに指定すればOKですね。
Testnetで試してMainnetにも反映させるぞ！ってときに環境変数の設定を変えるだけでいいので、便利だと思いました。

簡単ですが、PycoinでBitcoin Testnetに接続する方法を紹介しました。
次回はTestnetでKeyを作ってトランザクションを作成してビットコインをやりとりしたいと思います。