Bitcoin (Bitcoin Core)をローカルで動かしてみる


前提

  • ホストOS: Windows 10、ゲストOS: Ubuntu 16.04
  • ローカルPC に Virtualbox、Vagrant がインストール済

インストール

Ubuntu 16.04 のイメージを取得

  • Vagrant 用のディレクトリを作成(ディレクトリは任意、例: D:\vagrant\ubuntu_16_04)
  • OSイメージのお弁当を持ってくる。コマンドプロンプトで、
> vagrant init bento/ubuntu-16.04
> vagrant up

ゲストOS (ubuntu)にログイン

  • ターミナルソフト(TeraTermとか)から、以下の情報でログイン
Host: 127.0.0.1
Port: 2222
ID: vagrant
PASS: vagrant

Bitcoin Core のソースを持ってくる

(私はソースの中身をいじりたいので folk しました)

  • 適当フォルダを用意(~/bitcoin とか)を用意して、git clone

    $ cd ~/bitcoin
    $ git clone (リポジトリのURL)

ビルドの前に依存する package をインストール

$ sudo apt-get install autoconf build-essential libtool autotools-dev automake pkg-config libssl-dev libevent-dev bsdmainutils
$ sudo apt-get install libboost-system-dev libboost-filesystem-dev libboost-chrono-dev libboost-program-options-dev libboost-test-dev libboost-thread-dev

$ sudo add-apt-repository ppa:bitcoin/bitcoin
$ sudo apt-get update

$ sudo apt-get install libdb4.8-dev libdb4.8++-dev
$ sudo apt-get install libminiupnpc-dev
$ sudo apt-get install libzmq3-dev

ビルドしてインストール

$ ./autogen.sh
$ ./configure
$ make
$ sudo make install

make にはそれなりに時間がかかります。

インストールされるもの

  • /usr/local/bin/bitcoind : Bitcoin サーバ
  • /usr/local/bin/bitcoin-cli : クライアントツール
  • /usr/local/bin/bitcoin-tx : トランザクションを扱うツール(?)
  • /usr/local/bin/test_bitcoin : テストツール
  • /usr/local/bin/bench_bitcoin : ベンチマークツール

動かしてみる

RegTest というローカルでのみ動く Bitcoin のテスト環境を使います

Bitcoin サーバの起動

$ bitcoind -regtest -printtoconsole

フォアグランドで、logを流しながら実行できます。
終了する時は、Ctrl-C

残高を確認してみる

(全アカウント)
$ bitcoin-cli -regtest listaccounts

(アカウントごと)
$ bitcoin-cli -regtest getbalance (アカウント)

(全アドレス)
$ bitcoin-cli -regtest listreceivedbyaddress

当然、なにもしてないので 0 BTC

マイニングしてみる

サーバが起動している状態で、別のターミナルから、

(101ブロックをマイニング)
$ bitcoin-cli -regtest generate 101

デフォルトのアカウント "" に 50 BTC が与えられる。
(=1ブロック目のマイニング報酬)

アカウント、アドレスを作成してみる

(アカウント hogehoge のアドレスを生成、アカウントはなければ自動的に作られる)
$ bitcoin-cli -regtest getnewaddress hogehoge
2NDmc...  ← アドレス

この時点で、

  • アカウント "" : 50 BTC
  • アカウント hogehoge : 0 BTC
    • アドレス 2NDmc... : 0 BTC

送金してみる

(アカウント "" から、アカウント hogehoge のアドレス 2NDmc... に 10BTC送金)
$ bitcoin-cli -regtest sendtoaddress 2NDmc... 10
81d76a0... ← トランザクションID
  • アカウント "" : 39.99996240 BTC
  • アカウント hogehoge : 0 BTC
    • アドレス 2NDmc... : 0 BTC

…???

計算が合わない分は、どこへ行った?
* 10 BTC = "コンセンサスが得られていない" (この取引の合意形成がされていない)
* 40 - 39.99996240 BTC = 手数料

詳しくは、こちらなど:

「ブロックチェーンのコンセンサスアルゴリズム(合意形成)とは?ビットコインのProof of Workを解説!」
https://moblock.jp/articles/17182

取引(トランザクション)の状態を確認する

(トランザクションID 81d76a0... の内容を確認)
$ bitcoin-cli -regtest gettransaction 81d76a0...

取引の合意形成=マイニングしてみる

$ bitcoin-cli -regtest generate 1
  • アカウント "" : 89.99996240 BTC
    • 39.99996240 BTC
    • (最初の101ブロックのうち)2ブロック目のマイニング報酬 50 BTC
  • アカウント hogehoge : 10 BTC
    • アドレス 2NDmc... : 10 BTC

これがすなわち、"Proof of Work"

参考

ほか