bitcoindのregtestで送金を行うチュートリアル

#はじめに
bitcoindのチュートリアルに当たるものがなさそうなので自分で作ってみた。
ローカルに２つのノード立てて、aliceとbobの二者間で送金を行うシミュレーションをする。
regtestで複数のノードを建てたい人にも必見。
bitcoindのインストール方法は記事を書いている人がすでにたくさんいるので省略する。


使うターミナルは最低4つ。
それぞれ`$`の前にbob1、bob2、alice1、alice2と明示化している。


#環境
私の環境は以下の通り。
PC:Thinkpad X1 Carbon
OS:Ubuntu 18.04 LTS

私の環境がubunutuなのでディレクトリのPATHなどがLinux仕様になっているかもしれないが、自分の環境に合わせたパスを調べればMacやWindowsでもできるはずだ。

# regtestとは
regtestはローカルで使うtest環境でbtcdで言うsimnetに近い。
testnetとは違いローカルでblockchainを作るため、マイニングされるのを待つ必要は無い。
regtestを使うために`bitcoin.conf`に

```
regtest=1
```

を追加する。



# 準備

先ずはalice用、bob用の作業ディレクトリを作り、それぞれに`bitoin.conf`を作成する

```
cd ~
mkdir dev
cd dev
mkdir alice bob

cd alice
vim bitcoin.conf

cd ../bob
vim bitcoin.conf
```

bitcoin.confの中身はこんな感じ。

```bitcoin.conf
regtest=1
txindex=1
server=1
rpcuser=kek
rpcpassword=kek
```


# aliceのノードを起動

```
alice1 $ cd ~/dev
alice1 $ bitcoind -regtest -conf=/home/{PCのユーザー名}/dev/alice/bitcoin.conf -datadir=./alice/ -rpcport=10001 -port=10011
```

- `-regtest`: regtestモードで起動。
- `-conf`: bitcoin.confの場所。
- `-datadir`: ノードの情報を記録するディレクトリの場所。コマンド入力後`~/dev/alice`にregtestというディレクトリが作成されているはず。
- `-rpcport`: JSON-RPCのconnectionを受け付けるport番号。デフォルトでtestnetは18332、mainnetは8322となっている。


詳しくは`bitcoin -help`で確認できる。

`-conf`はフルパスで指定しないとエラーになることがある。
**オプションは順番が違うとエラーが出ることがあるので是非注意して頂きたい。**
以後チュートリアル中はこのターミナルを開いたまま放置する。



# bobのノードを起動&aliceのノードに接続

新しいターミナルを開く。私のオススメは`alice1`のターミナルに新しいタブを開くこと。

```
bob1 $ cd ~/dev
bob1 $ bitcoind -regtest -conf=/home/{PCのユーザー名}/dev/bob/bitcoin.conf -datadir=./bob -rpcport=10002 -listen=0 -connect=127.0.0.1:10011
```

基本的には同じだがbobの場合aliceのノードに接続するため`-connect`オプションでaliceのhost:portを指定している。





#aliceのノードでマイニング

Aliceのノードでbobに送金するためのコインを生み出す。
Alice用に新しいターミナルを開くいて、まずは自分のWalletのアドレスを確認。

```
alice2 $ bitcoin-cli -regtest -conf=/home/{PCのユーザー名}/dev/alice/bitcoin.conf -datadir=. -rpcport=10001 getnewaddress
```
するとハッシュ値が表示されるはずだ。それがaliceのWalletのアドレスだ。
次にマイニングを行うために以下のコマンドを打つ。

```
alice2 $ bitcoin-cli -regtest -conf=/home/{PCのユーザー名}/dev/alice/bitcoin.conf -datadir=. generatetoaddress 101 <aliceのWalletのアドレス>
```

すると配列形式でハッシュ値が101個表示されるはずだ。

**--------------注意-------------**
ビットコインのgenereteのために`generatetoaddress`を用いた。
古いバージョンでは
`bitcoin-cli -regtest setgenerate true 101`や`bitcoin-cli -regtest generate 101`を使っていたが、これらのgenerete方法は最近完全に削除され`generatetoaddress`を使うことが推奨されている。
**----------------------------------**



balanceを確認する。

```
alice2 $ bitcoin-cli -regtest -conf=/home/{PCのユーザー名}/dev/Alice/bitcoin.conf -datadir=. -rpcport=10001 getbalance
50.00000000
```
Aliceのwalletに50BTC入っているのが確認できた


#bobのアドレスを確認 & aliceで送金
別ターミナルを開きbobのセッティングを行っていく。

```
bob2 $ bitcoin-cli -regtest -conf=/home/{PCのユーザー名}/dev/bob/bitcoin.conf -datadir=. -rpcport=10002 getnewaddress
```
bobのアドレスが表示される。
念のためbobのwalletのbalanceを確認する。

```
bob2 $ bitcoin-cli -regtest -conf=/home/{PCのユーザー名}/dev/bob/bitcoin.conf -datadir=. -rpcport=10002 getbalance
0.00000000
```

もちろん空だ。

続いてAlice側で送金を行う。

```
alice2 $ bitcoin-cli -regtest -conf=/home/{PCのユーザー名}/dev/alice/bitcoin.conf -datadir=. -rpcport=10001 sendtoaddress <bobのwalletのアドレス>
```

このコマンドを入力すると、transactionのハッシュ値が表示されるはずだ。
トランザクションの中身を確認してみる。

```
alice2 $ bitcoin-cli -regtest -conf=/home/{PCのユーザー名}/dev/alice/bitcoin.conf -datadir=. -rpcport=10001 gettransaction <transactionのハッシュ値>
```
表示されたのがtransactionの内容だ。
`amount`が-10.00000000になっているのが確認できるだろうか。
さらに手数料として`fee`もいくらか引かれているはずだ。


#送金を完了する
この段階ではまだ送金は完了していない。
bobのbalanceをもう一度確認してみよう。

```
bob2 $ bitcoin-cli -regtest -conf=/home/{PCのユーザー名}/dev/bob/bitcoin.conf -datadir=. -rpcport=10002 getbalance
0.00000000
```

bobにはまだなにも送金されていない。
transactionが承認されておらず、blockchainに記録されていないからだ。
もう一度アリスのターミナルでマイニングを行う。

```
alice2 $ bitcoin-cli -regtest -conf=/home/{PCのユーザー名}/dev/alice/bitcoin.conf -datadir=. generatetoaddress 1 <aliceのWalletのアドレス>
```

これでbobに送金が完了したはずだ。


```
bob2 $ bitcoin-cli -regtest -conf=/home/{PCのユーザー名}/dev/bob/bitcoin.conf -datadir=. -rpcport=10002 getbalance
10.00000000
```

10BTC入っていることが確認できた。
ついでにbobの側でtransactionを確認してみる。

```
alice2 $ bitcoin-cli -regtest -conf=/home/{PCのユーザー名}/dev/bob/bitcoin.conf -datadir=. -rpcport=10002 gettransaction <transactionのハッシュ値>
```

transactionの内容をみるとAliceの側とは違って、`amount`が10.00000000になっているはずだ。

# bitcoindをstopする

最後にノードを終了させる。

```
alice2 $ bitcoin-cli -regtest -conf=./bitcoin.conf -datadir=./ -rpcport=10001 -rpcuser=kek -rpcpassword=kek stop

bob2 $ bitcoin-cli -regtest -conf=./bitcoin.conf -datadir=./ -rpcport=10002 -rpcuser=kek -rpcpassword=kek stop
```

以上で終了。
気になったことはコマンドを打って遊んでみることで勉強になる。
次はlightningdのチュートリアルを作ろうかな。