bitcoin coreを使ってビットコインのネットワークに接続する

6 min read読了の目安(約5700字

概要

ビットコインは、P2Pのネットワークで運営されており、誰でもそのネットワークに接続して送金などのシステムに参加することができます。

今回は、Linuxでビットコインのネットワークに接続し、ウォレット・アドレスの作成などを行い仕組みを理解したいと思います。

bitcoin coreのインストール

ビットコインの管理や送金といった機能であればどんなウォレットソフトウェアを使っても良いのですが、今回はビットコインを使ったアプリケーションを幅広く試せる環境として、bitcoin coreをインストールします。
bitcoin coreは、オープンソースで管理[1] されており、ソフトウェアは下記公式ページからダウンロードすることができます。

https://bitcoincore.org/en/download/

筆者の環境はLinuxなので、Linux(tgz)をダウンロードします。ダウンロード後、ファイルを解凍します。

tar -zxvf bitcoin-0.20.1-x86_64-linux-gnu.tar.gz

本記事ではダウンロードしたファイルの署名検証はスキップします("Verify your download"に従い、gpgで検証することができます)
ダウンロードしたファイルをインストールします。

sudo install -m 0755 -o root -g root -t /usr/local/bin bitcoin-0.20.1/bin/*

これでインストール完了です。

設定ファイルの作成

次に、設定ファイルを作成します。設定ファイルbitcoin.confを~/.bitcoin に作成します。

~/.bitcoin/bitcoin.conf
testnet=3
server=1
rpcbind=localhost
rpcport=18332
rpcuser=hoge
rpcpassword=piyo

ビットコインのネットワークには、本番環境であるメインネットとテスト環境であるテストネットがありますが、メインネットは同期するのに巨大なストレージが必要なのと、試すだけでもBTCが必要なので、テストネットに接続することにします。
testnet=3を記述することで、テストネットに接続することができます。3というのは、テストネットの現在のバージョンです。
rpcuserとrpcpasswordの設定は、特にこだわりがなければ適当で大丈夫です。

ネットワークの立ち上げ

次に、bitcoindコマンドを利用してネットワークを立ち上げます。

bitcoind -datadir=ディレクトリ名 -testnet -daemon

出力:

Bitcoin Core starting

ディレクトリ名にはブロックチェーンのデータをダウンロードするディレクトリを指定します。テストネットのブロックチェーンデータをすべてダウンロードするため、それなりの容量が必要になります(2021年1月現在、27GB程度)。

コマンド実行後、bitcoin-cliコマンドが使えるようになります。bitcoin-cliコマンドはデータディレクトリとテストネットフラグを指定して使用します。

bitcoin-cli -datadir=ディレクトリ名 -testnet コマンド名

コマンド実行後、チェーンの同期が始まります。しばらくしてチェーンの同期がされ始めると、チェーンの同期状況を確認することができます

bitcoin-cli -datadir=ディレクトリ名 -testnet getblockchaininfo

出力:

{
  "chain": "test",
  "blocks": 683080,
  "headers": 1902074,
  "bestblockhash": "00000000002c1ed512c2405ee9223c6a127c25ce388712ab69fc71d2fbbd534d",
  "difficulty": 1,
  "mediantime": 1454484382,
  "verificationprogress": 0.4134050768402485,
  "initialblockdownload": true,
  "chainwork": "0000000000000000000000000000000000000000000000076de46d05f3f4ebf4",
  "size_on_disk": 5840402087,
  "pruned": false,
  "softforks": {
    "bip34": {
      "type": "buried",
      "active": true,
      "height": 21111
    },
    "bip66": {
      "type": "buried",
      "active": true,
      "height": 330776
    },
    "bip65": {
      "type": "buried",
      "active": true,
      "height": 581885
    },
    "csv": {
      "type": "buried",
      "active": false,
      "height": 770112
    },
    "segwit": {
      "type": "buried",
      "active": false,
      "height": 834624
    }
  },
  "warnings": ""
}

アドレスの作成と送金

次に、アドレスの作成を行っていきます。
アドレスの作成はgetnewaddressコマンドですることができます。

bitcoin-cli -datadir=ディレクトリ名 -testnet getnewaddress アドレス名

ここではchikuwaという名前でアドレスを作成してみます。

bitcoin-cli -datadir=ディレクトリ名 -testnet getnewaddress chikuwa

出力:

tb1qsrpfk4sup8ukyn4cq5uwhrwgjf724uucz5dawx

作成したアドレスが表示されます。
アドレスが作成できたら、ウォレットの残高を表示してみます。

bitcoin-cli -datadir=ディレクトリ名 -testnet getbalance

出力:

0.00000000

残高がゼロであることがわかります。
メインネットのビットコインは取引所で購入することができますが、テストネットのビットコインは取引されていませんので、誰かからもらうことにします。
そのために、faucetと呼ばれる配布サイトでリクエストする必要があります。現在アクティブなfaucetとして下記のfaucetを使うことにします。

https://testnet-faucet.mempool.co/
アドレスと数量を入力してsendをクリックし、数分経ってから再度getbalanceを行ってみます。
0.01000000

該当するアドレスに0.01 BTCが送金されました。

ここで、bitcoin-cliとは別の方法で送金を確認してみましょう。
ビットコインのすべてのトランザクションはブロックチェーン上に記録されオープンになっているので、誰でもその内容を見ることができます。ここがビットコインの面白いところですね!
blockchain.comというブロックチェーン検索サービスで、アドレスから検索して送金記録を確認してみます。

https://www.blockchain.com/btc-testnet/address/tb1qsrpfk4sup8ukyn4cq5uwhrwgjf724uucz5dawx

確かに、"2NFg1ZopihEHugjJT6NkCuFd9ipMdt6VH8H"(faucetのアドレス)から"tb1qsrpfk4sup8ukyn4cq5uwhrwgjf724uucz5dawx"(chikuwaのアドレス)に0.01 BTCが送信されています。

今度は、自分のウォレットに別のアドレスを作成し、自分のアドレス間で送金を行ってみます。
再度、getnewaddressコマンドを実行します。

bitcoin-cli -datadir=ディレクトリ名 -testnet getnewaddress kimpira

出力:

tb1qudgdwskllmhs34drakkx92hdd8mxdsxx8yz3kv

送金は、sendtoaddressコマンドで行うことができます。

bitcoin-cli -datadir=ディレクトリ名 -testnet tb1qudgdwskllmhs34drakkx92hdd8mxdsxx8yz3kv 0.001

アドレス"tb1qudgdwskllmhs34drakkx92hdd8mxdsxx8yz3kv"(アドレス名:kimpira)に0.001 BTCを送金することになります。
無事送金されたことを確認するため、listaddressgroupingsコマンドを使って各アドレスごとの残高を表示します。

bitcoin-cli -datadir=ディレクトリ名 -testnet listaddressgroupings

出力:

[
  [
    [
      "tb1qsrpfk4sup8ukyn4cq5uwhrwgjf724uucz5dawx",
      0.00000000,
      "chikuwa"
    ],
    [
      "tb1q7mypaj5ml8dp77use99tmnkyyemwydyv49nvpw",
      0.00899859
    ]
  ],
  [
    [
      "tb1qudgdwskllmhs34drakkx92hdd8mxdsxx8yz3kv",
      0.00100000,
      "kimpira"
    ]
  ]
]

"kimpira"に0.001 BTCが送金されていることがわかります。また、先ほどと同様に、blockchain.comでも確認してみます。

同じトランザクションが確認できますね。

送金の流れの理解

このトランザクションのBTCの流れを見てみると、"
tb1qsrpfk4sup8ukyn4cq5uwhrwgjf724uucz5dawx"(アドレス名chikuwa)から送金した0.01 BTCのうち、"tb1qudgdwskllmhs34drakkx92hdd8mxdsxx8yz3kv"(アドレス名kimpira)に0.001 BTC、"tb1q7mypaj5ml8dp77use99tmnkyyemwydyv49nvpw"に0.00899859 BTCが送金されています。後者のアドレスはおつり用のアドレスになります。ビットコインはUTXO(Unspent Transaction Output)という仕組みで残高を管理しており、送金するたびにUTXOとして自分のウォレット内に別のアドレスが作成され、そのアドレスに残高が紐づけられることになります。
この辺の仕組みは、下記サイトの説明が分かりやすいです。

https://gaiax-blockchain.com/utxo
最後に、全体の残高から0.00000141 BTCが減っています。これは、ブロック作成者(マイナー)に支払われる手数料になります。

まとめ

今回の記事では、bitcoin coreを使ってテストネットでのビットコインの送金、トランザクションの理解を行いました。
ビットコインは投資対象として注目されがちですが、技術的も面白い部分が多いです。実際に触ってみると、ビットコインのシステムが純粋にソフトウェアとネットワークによって維持されているということが実感できるので、是非遊んでみてください。
メインネットはトランザクション手数料がかかったり、間違ったときに資金をロストしてしまったりするので、遊んで理解したいということであればテストネットをおすすめします。

参考にしたサイト

[1:1][2][3]

脚注
  1. https://github.com/bitcoin/bitcoin/ ↩︎ ↩︎

  2. https://qiita.com/mukoya/items/80993ed2521167f5542a ↩︎

  3. https://bitcoin.clock-up.jp/contents/admin/setting ↩︎