#はじめに
bitcoindのチュートリアルに当たるものがなさそうなので自分で作ってみた。
ローカルに2つのノード立てて、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の中身はこんな感じ。
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のチュートリアルを作ろうかな。