bitcoindについて

こんにちは。

今までウォレットの紹介があったので、よく使っているbitcoindも紹介したいと思います。
少し前に書いた記事なので↓の画像はバージョンがv0.17.0.1ですが、今日(2018/12/26)の最新バージョンはv0.17.1です。

image


インストール

https://github.com/bitcoin/bitcoin

自分でビルドしてもよいですし、コンパイル済みをダウンロードするのもよいかと思います。
ビルドする利点としては、オプションが選択できることかと思います。
例えば、wallet機能が不要であれば取り除けますし、GUI(bitcoin-qt)が不要であればビルドしないようにもできます。
通常はダウンロードするか、Debian系であればPPAでやるのが簡単だと思います。

 

LightningNetwork開発時には、bitcoindのソースコードにログを埋め込んで動作確認をしていました。トランザクションを自作してsendrawtransactionしてもエラーになった場合に有用でした。

Linux/MacOSを起動したときにbitcoindを自動的に起動させたい場合は、こちらを参考に設定するとよいでしょう。


設定ファイル

bitcoindを起動させる前に、設定ファイルを作成します。
bitcoin.confというファイルです。
書き方についての説明はこちらにありますが、サンプルを見た方がわかりやすいでしょう。
bitcoin.confがなかった場合は、mainnetで起動します。

普段のLightningNetwork開発では、このような設定にしています。
”rpcuser”, “rpcpassword”はJSON-RPCを使うためのものです。
”txindex”は、ウォレット以外のブロックチェーンデータも必要なため設定しています。

Linuxでは、個人アカウントで起動した場合には”~/.bitcoin/bitcoin.conf”を見に行きますが、bitcoindのオプションによって見るファイルを変更することもできます。
例えばptarmiganの簡易テストスクリプトでは、このように-confで設定ファイルを与えています。


使い方

bitcoindはdaemonとして動作するので、外部からコマンドを与えるにはbitcoin-cliやJSON-RPCを使います。
JSON-RPCを使用しないようにしていても、bitcoin-cliは使うことができます。

bitcoin-cli help

これでコマンドの一覧が取得できるので、詳細が知りたいコマンドについては、

bitcoin-cli help コマンド名

で取得できます。
例えば、getblockcountではこうなりました。

$ bitcoin-cli help getblockcount
getblockcount

 

Returns the number of blocks in the longest blockchain.

 

Result:
n    (numeric) The current block count

 

Examples:
> bitcoin-cli getblockcount
> curl –user myusername –data-binary ‘{“jsonrpc”: “1.0”, “id”:”curltest”, “method”: “getblockcount”, “params”: [] }’ -H ‘content-type: text/plain;’ http://127.0.0.1:8332/



送金・受金

送金は簡単です。

bitcoin-cli sendtoaddress 送金先アドレス 送金BTC

アドレス形式は、Base58でもBech32でも大丈夫です(最新のbitcoindなら)。

 

受金は、受け取り用のアドレスを作るだけです。

bitcoin-cli getnewaddress

現在のbitcoindでは、P2WPKH nested in BIP16 P2SH形式のアドレスを生成します。
異なる形式がよい場合は、引数で指定します。

bitcoin-cli getnewaddress "" legacy
bitcoin-cli getnewaddress "" bech32

「””」としているのは、labelを空にしているだけです。

bech32の場合、mainnetでは”bc”、testnetでは”tb”、regtestでは”bcrt”で始まるアドレスを生成します。


raw transaction

bitcoindの特徴は、raw transaction、すなわちBitcoinのトランザクションデータそのものを扱うことができることだと思います。
Lightning Networkなどでは、送金先がスクリプト(P2SH, P2WSH)になることもしばしばですし、スクリプトに送金されたトランザクションを自分で処理することもあります。

そういう場合、getrawtransactionコマンドでトランザクションデータを取得したり、自分でトランザクションデータを作ってsendrawtransactionコマンドでブロックチェーンに展開したりします。

 

なお、v0.18からコマンド名がいくつか変更になることが予告されています。
詳細はリリースノートから「V0.18」で検索してください。
https://bitcoin.org/en/release/v0.17.0#low-level-rpc-changes


まとめ

Bitcoin Coreも内部ではbitcoind相当の機能が動作しているようなので、Bitcoin Coreを使うのもよいでしょう。受金アドレスをQRコードで表示してくれるところは便利です。
クラウド上のように画面がないところや、画面などいらぬ、というような場合にはbitcoindで十分でしょう。
他にフルノードとして有名なのはbtcdで、こちらはlndがデフォルトで使っていました(今はlndもbitcoindが使える)。

なんにせよ、フルノードは環境を作るのがそこそこ大変なので、ちょっと試してみよう、という感じではなく、すべてのトランザクションデータを参照したかったり、プログラムを通してブロックチェーンにアクセスしたいような場合になるのではないかと思います。