お久しぶりです。今週はビットコイン(BTC)の実装について書きます。少し長めですがご容赦下さい。

1. ビットコインの実装とは

ビットコインは通信や取引のルールの集合である「プロトコル」なので、そのプロトコルに従って作動するソフトウェアは自由に開発できます。(Eメールや動画再生のようなものと考えてください。)

特に、フルノードとしてネットワークに参加するためのソフトウェアを「ビットコインの実装」と呼び、有名なところではBitcoin Coreなどがあります。

Bitcoin Coreは「リファレンス実装」と呼ばれ、他のソフトウェアの開発者はBitcoin Coreでのプロトコルの実装と互換性を厳密に保つようそれぞれの実装を開発します。

外部に公開されているビットコインのノードの数を実装別で見ることのできるサイト:https://coin.dance/nodes

このリンク先を見ると、ほとんどのユーザーがBitcoin Coreを利用するのに、なぜbtcd, bitcore, bcoinなどの実装が存在するのかという疑問が浮かぶ方もいるでしょう。

私も当初は漠然としかわかっていませんでしたが、関連サービスの開発を計画しているうちに実装によって特徴的な機能があったりすることがわかりました。また、最近でもビットコインキャッシュ(BCH)のネットワークで複数の実装があることによってバグによってネットワークが完全に停止することを防げる場合があるというメリットも再確認できました。

2. 実装による特徴

ここではメジャーな実装を3つ取り上げます。

btcd: Bitcoin Coreと比べて、btcdはリアルタイムでメモリプールなどの情報を他のアプリ等に配信しやすいので、リアルタイムでメモリプールをモニタリングするアプリなどの用途に向いています。例えば大口のウォレットの動向を監視するサービスなどです。また、大きな特徴として、btcdはウォレット機能を持ちません。なので、送金などには利用しないが、ネットワークに参加する必要があるような利用目的に向いています。

bcoin: もともとビットコイン決済サービスのバックエンドとして開発されたbcoinは、大量のアドレスやアカウント、秘密鍵を管理するのに便利な機能が備わっているので、そのような機能を求める事業者に人気があります。例えばオンラインウォレットや一部の取引所などと思われます。

bitcore: モジュラーなことが特徴で、ブロックチェーンエクスプローラーやウォレットサービスを簡単に立ち上げるのに十分な機能を選択したり、既存の機能に独自のサービスを加えたりできます。また、ビットコインのフォークやイーサリアムなど、いくつかの他のブロックチェーンを扱えることも特徴です。

以上の例から、多くの実装は企業などが独自のニーズがあって開発したものをオープンソース化していることが覗えます。つまり、一般ユーザーのほとんどはノードにBitcoin Coreを利用しているが、特別なニーズのあるサービスプロバイダーやマイナーなどが便利な機能を求めてそれ以外の実装を利用している傾向があると考えられます。

3. 複数の実装があることの是非についての論争

複数の実装が存在することについての論争は歴史が古く、当初ナカモトサトシは複数の実装が長期的に持続可能かについて否定的な意見をもっていたようです。

しかしその後、初めて発表されたオルタナティブ実装であるlibbitcoinの開発者が「同じ実装だけを全員が使うことはネットワーク全体に同じ脆弱性が存在することになる」と主張したのを皮切りに、多くのオルタナティブ実装が開発され、多様性があることのメリットが強調されました。

例えば先日ビットコインキャッシュにおいてバグが発現し、bitcoin-abcのノードがブロックを生成できなくなりましたが、Bitcoin Unlimitedという実装を使用したノードは正常に稼働していたので、ネットワークへの影響はある程度抑えられたという見方があります。

一方、リファレンス実装そのものがビットコインの仕様であり、バグを含めてすべて再現しなければならないという意見や、リファレンス実装以外の実装に開発リソースを割くことがビットコイン(Bitcoin Core)の開発プロセスを少数の開発者に集権化してしまうという意見もあります。

これらの意見を持つPeter Todd氏は、独自の機能を追加したいならリファレンス実装をフォークして改造することを推奨しており、そのように誕生したものには彼自身が開発したBitcoin RBFや細かい設定オプションを追加したBitcoin Knots、ブロックエクスプローラー向きのBitcoin Addrindexなどのソフトウェアがあります。

ただ、この主張に対しても反論があり、Bitcoin Coreの新旧多くのバージョンが共存している現状がすでに多様な実装が存在するのと同様だという主張や、参加者全員が同じバグの影響でネットワークが停止し、Bitcoin Coreの開発者のみがその間にアップデートを出すというプロセスを非常時の前提とするのはやはり中央集権的・権威主義的すぎるというものです。

4. おわりに

個人的には、複数の実装がある方が万一のバグに対する冗長性という意味でメリットが大きいと思います。(コンセンサス周りは特別慎重に実装され、意図せぬハードフォークが発生しないという前提において。)

もしフルノードを動かしてみたいと思っているなら、いずれかのオルタナティブ実装で実験してみるのもいいでしょう。特に、モニタリング用のツールやビットコイン関連サービスを開発したい場合、必要な機能を元に適当な実装を選択することが作業量の大幅な削減につながることがあります