先日、ビットコインコアプロジェクトが0.14.0のクライアントをリリースしました。

※ダウンロードはこちら (https://bitcoin.org/ja/download)

本稿では、今回のリリースに含まれる主な変更点について解説していきます。

プロジェクトのメトリクス

今回のリリースに当たりたくさんの人々が関わりました。 v0.13.2 から v0.14.0 までに下記の作業が行われています。

24人がコミット

1,824 コミット数

830 ファイルの変更・追加・削除

92,758 行の追加されたコード

26,966 行の削除されたコード

１月２日〜３月６日の間で行われた (63日間)

平均では、1日に 29 のコミット、 1472行のコードが書かれています。

今から5年ほど前、2012/6/20 - 2012/9/13 (86日間) に行われたv0.6.3 から v0.7.0 へのアップデートでは、16人の開発者が1日あたり平均 10コミット、 838 行 のコーディングを行っています。

要因はいくつか挙げられますが、今回のアップデートではリファクタリングが主だったこと、開発者からの注目が以前よりも高まっていることが挙げられます。

パフォーマンスの向上

Assumed valid ブロックの設定

以前は初回同期の高速化のために、「checkpoint」と呼ばれるブロックIDを直接ソフトウェアのソースコードで指定していました。しかし、この実装はいくつかの批判の的となっていました。

なぜならcheckpointは度々、ビットコインのルールを無視する可能性があるためです。たとえば、最も長いブロックチェーンがあったとしても、ソフトウェアが他のチェーンにチェックポイントを置いていた場合、ソフトウェアはcheckpointが含まれていないという理由だけで最長のブロックチェーンを無視してしまいます。

assumed-validはビットコインの最長チェーンに関する優先ルールです。この変更では、ブロックヘッダーを見て最長チェーンを計算する際、assumed-validのハッシュ値をIDに持つブロックが含まれていた場合に限り、そのブロックまでのすべての電子署名の検証を行わなくなります。もし、そのハッシュ値が最長チェーンではなく、少数派チェーン(orphaned chain)のブロックか、存在しないブロックだった場合、通常どおりの検証を行っていきます。

assumed-validの初期値は、開発者がリリースごとに、リリース日より数百ブロック前のブロックを選択し埋め込みます。ユーザーがbitcoin.confなどで自由に設定することも可能です。

これを入れるだけで、初回同期が非常に早くなります。

未使用のmempoolメモリの共有

mempoolは、ネットワークにブロードキャストされた未承認トランザクションを蓄えるメモリ領域ですが、初回同期においては殆ど使われません。一方で、初回同期ではdbcacheという別のメモリ領域が使われます。今回のリリースからは、未使用のmempool領域があった場合、そのメモリ領域をdbcacheに分け与え、UTXOのキャッシュに割り当てます。これによって、初回同期がさらに高速化されます。

その他の変更

P2Pネットワークのリファクター

電子署名のキャッシュの変更

BIP 152 圧縮ブロック伝搬の許可（状況による）

getinfoが廃止へ

getinfoとは、ビットコインコアを開発のバックエンドに使っている開発者であれば頻繁に使うであろうRPCコールです。

getinfoで取得できた16項目のデータに関しては、今後getnetworkinfo, getwalletinfo, getblockchaininfoという３つのRPCコールに分割されます。

同期未完了パネルの表示

ビットコインコアのソフトウェアを初めてダウンロードする初心者によくある問題があります：

ビットコインを使うため、検索してbitcoin.orgに訪れる

ウォレットアプリをダウンロードしようとビットコインコアを選ぶ

起動した直後に表示される受け取りボタンをクリックし、アドレスを発行する

そのアドレスに対してビットコインを入金してしまう

ここで、ビットコインコアの致命的なユーザビリティーの悪夢が始まります。ブロックチェーンの同期が終わるまで、そのアドレスに入金されたビットコインが使えないのです。つまり、ユーザーはウォレットとしてビットコインコアのソフトウェアを利用した場合、BTCの入金はできるのに、同期が終わるまでしばらく待たなければ残高に反映されず、送金もできないということが起こります。

今回のリリースでは、初回同期が完了するまでは起動のたびに全画面を覆うポップアップ画面が表示されるようになりました。今までも同期状態を表示するアイコンはありましたが、さらに目立つように、入金しても表示されず、送金もできないことが注意書きとして表示され、同期の状況が表示されます。

Replace By Fee 送金の対応

ビットコインコアのウォレットソフトで初めてRBF送金に対応しました。RBFは、既にブロードキャストされた未承認トランザクションが承認されない場合、手数料を変更して再送信できるという機能です。

-walletrbfという実行フラグを有効にした場合は、ウォレットから送金するすべての取引がRBF対応、つまり置き換え可能になります。

ただし、実際に置き換える際は、画面ではなくデバッグコマンドからbumpfeeを利用し、手動で置き換えないといけません。

所感

今回のリリースは0.13のような大きな変更点はありませんでした。しかし、クライアントの効率化により、ビットコインネットワークのノードを走らせることのハードルが下がっています。たくさんの人々が非集権型開発を通してビットコインをより良いものにしてきました。これからも全世界の数々の開発者がビットコインの開発に貢献してくれるでしょう。