機能の制限と欠如

【目次】

導入

bitcoinjは進行中のプロジェクトであり、重要性の高い機能がいくつか欠けています。また奇妙な癖やその他の問題を修正する必要があり、まだ未完成です。

プロジェクトの主な目的は常にSPVを使ったスマートフォンのウォレットをサポートすることなので、この様な奇妙な癖が残っています。他のユースケースは優先事項ではありません。したがってbitcoinjは、アンドロイドウォレットをうまく機能させる為に、他の機能やリファクタリングを繰り返し行っています。

完全なリストについては、バグトラッカーを参照してください。 リストに挙げられているものは、厳選された重要な制約を表しています。 パッチはいつでも歓迎します。

バグやその他の問題

・ウォレットのコードは適切にスケールしません。 ウォレットに関連する全てのトランザクションは、常にメモリにロードされ、ウォレットが保存されるたびに書き換えられます。 これにより多くの種類のアプリケーションからアクセスできるシンプルなオンディスクのフォーマットが得られますが、ユーザーにとってはパフォーマンスが低下します。 時間をかけて、これを解決するためにログ構造化ウォレットファイル形式に切り替えることになるでしょう。

セキュリティ上の問題

・初期のコイン選択機能はそれほど賢くありません。なぜなら小さなコインをたくさん送ることで、アドレスに対してサービス受けれないような攻撃を行うことが出来る事を意味するからです。bitcoinjは、この方法を使って支払いを行い、前のポイントで述べたサイズ/手数料の制限を打ち破ります。 また、ウォレットは、他のすべてのBitcoinの実装と同様に1回の支払い要求に対して1つのトランザクションしか作成できません。 トランザクションの数が超過した場合には、手動で必要な値を破棄しない限り使用できなくなります。

・”SPVモードVS完全な検証”は理解しておくべき重要なトピックです。詳細については”SecurityModel”を参照してください。

・ダブルスペンドの検出に対するサポートが不完全です。ダブルスペンドは、いくつかの特定のケースでのみ処理されます。一般的なサポートには、グローバルなBitcoinプロトコルへのアップグレードが必要です。

・Bitcoinjは常にDNSシード*1から自動実行します。bitcoinネットワークにブロードキャストされたブロックのアドレスを格納したり使用しません。つまり、DNSシードがすべてダウンすると、bitcoinjアプリの動作が停止し、不正侵入されます。攻撃者が制御するノードを返すようになると、このアプリケーションはシビル攻撃*2の対象になります(詳細はSecurityModelのページを参照)。

・未確認トランザクションを確認する機能は、ランダムに選択されたピアにポーリング*3を行い、処理要求の有無を確認する動作)することに依存しています。
これにより、未確認トランザクションに依存しているユーザーや財布が攻撃を受けるようになります。将来のバージョンでは、これを解決するためにデフォルトでTorを使用するように切り替えるかもしれません。

・コードはセキュリティ専門家によって専門的に監査されておらず、他の予期しないセキュリティホールがある可能性があります(残念ながら、これはほとんどのビットコイン関連ソフトウェアに当てはまりますが)。このライブラリは大きな金額を扱わないモバイルウォレットを焦点とし作成されています。

合意

SPVモードは常にプルーフオブワークされた最長のチェーンを辿ります。ブロックチェーンでフォークが発生した場合は少数派チェーンはすぐに消滅することが予想されます。少数派チェーンに留まることを望むノードに対する解決策はなく、チェーンが分岐した場合にbitcoinjでは少数派チェーンで行われたトランザクションに対して保護していません。言い換えるならば、bitcoinjは少数派チェーン上におけるウォレットの残高に何が起きても、何の保証もしていません。

プライバシーの問題

・ブルームフィルターは現在、常に厳密に設定されています。その理由はAPI帯域幅モードの概念がなく、帯域幅使用量を測定しFPレートを調整して範囲内に保つコードはありません。”lie coherently”フィルターの構築は挑戦的な研究課題です。

ビットコインP2P売買は暗号化されておません(これはビットコインプロトコルの仕様です)。

プロトコルコンプライアンス

フル検証モードでは、v2ブロック形式(コインベーストランザクションにブロック高が埋め込まれている)はサポートされていません。またチェーンの分岐にバグが残っている可能性があります。実験的なものであり、そのように扱われるべきです。

マイクロペイメントチャネル

セキュリティの問題:Bitcoinネットワークはトランザクションマリアビリティを許容します。bitcoinjのバージョン0.10では、悪意のあるサーバーはトランザクションがブロードキャストされる前にTXデータを変更し、払い戻しを無効にし、横取りする可能性があります。

APIの欠点

・”Wallet”クラスは巨大であり、払い出し可能な多くの機能を備えています。おそらくこれを別のパッケージに移動します。

・”Block”や”Transaction”のようないくつかのコアオブジェクトは不変でなければなりません。

・ほとんどのコアオブジェクトはスレッドセーフ*4ですが、スレッドの安全性は必ずしも正確に文書化されているとは限りません。

・各イベントには1つのインターフェースが必要ですが、その代わりにそれぞれのメソッド(それぞれのピアごとに1つずつ)の一例があります。これにより、Java 8やKotlinのようなラムダや、Java 6よりも現代的な言語など、APIを扱いにくくすることができます。ある時点で、これらのイベントをより細分化します。

・一部の"イベント"は実際にはカスタマイズポイント(データを返す)に似ており、イベントリスナーがSAME_THREADエグゼキュータに登録されている場合にのみ呼び出されます。

・一部の構成状態は、ライブラリ全体で複製されます。 0.13で導入されたContextクラスは、これを修正するための第1歩です。

*1:DNSサーバー:ホスト名やメールアドレスに含まれるドメイン名から、IPアドレス返すサーバー

*2:攻撃者が作成した複数のノードにのみ接続させ正しいノードから隔離する

*3:ネットワークにおいて、周辺の機器などに対して定期的に信号を送信して問い合わせ

*4:同時並行処理が可能