bitcoinjの操作

概要

bitcoinjは、Future,Event,Serializationのデザインパターンをコード全体で使用します。

bitcoinj/examples/src/main/java/org/bitcoinj/examples

上記にあるコードとツールを使用してライブラリの使用方法を確認します。

Future

Futureは非同期の計算結果を扱うクラスです。Google GuavaライブラとListenableFutureクラスを使用します。
ListenableFutureはFutureクラスのサブクラスでFutureクラスの拡張です。バックグラウンドで行われている作業の結果を取得し次の処理を行うリスナーを登録することが出来ます。
ListenableFutureは以下の5つの処理を行います。

1.自分を見つけたらストップ
2.処理の完了するのを待つ
3.準備ができているかどうかを確認
4.タイムアウトを待つ
5.作業が完了した時に呼び出されるコールバックを登録する

定期的にFutureがいくつかの場所で表示される場合があります。これらは、時間の経過とともにListenableFuturesに切り替わります。ListenableFuturesには完了リスナーが追加されているため、多くの利点があります。例えばファンインとファンアウの待機が簡単に行なえます。詳細は、Guavaマニュアルを参照してください。

Event

イベントリスナーは通常、ライブラリによって作成された専用のバックグラウンドスレッドで非同期に呼び出されます。これは、いくつかの理由で行われます。

・ロックが保持されていない状態でイベントリスナーが実行され、再入力の制限がない

・スレッドセーフなイベントハンドラを書く必要がない

ただし、これをリスナー単位でオーバーライドすることができます。ほとんどのメソッドにはaddEventListenerメソッドかaddListenerメソッドがあり、これらはリスナーオブジェクトとエグゼキュータの両方を取得します。たとえば、GUIツールキットなどのスレッドアフィニティを必要とするフレームワークで作業している場合、コールバックを正しいUIスレッドに自動的にマーシャリングできます。

ListenableFutureコールバックは、エグゼキュータを指定することもできます。もしそれが必要ならば、あなたは明示的にThreading.USER_THREADを指定する必要があります。

0.11から、Threading.USER_THREADエグゼキュータを好みのものに変更できます。つまり、イベントリスナーの実行を制御できます。これは、GUIアプリケーションのように、ユーザースレッド(ユーザがプログラムの中で明示して作成するスレッド)ではなく特定のスレッドに受け渡したい時に最も便利です。

例:

Threading.USER_THREAD = new Executor() {
  @Override 
  public void execute(Runnable runnable) {
    SwingUtilities.invokeLater(runnable);
  }
};

アプリの開始時に実行される上記のコードスニペットは、bitcoinjコールバックがGUIスレッド上で実行されるようにします。これにより、ウィジェット(アプリの画面にアプリを使いやすくする機能)を更新し、好みの方法でGUIを変更できます。

Serialization

いくつかのクラスはJavaのSerializationを使用してシリアライズすることが可能です。しかし、Javaシリアライズ可能なオブジェクトには、長期間データ互換性を維持することはありません。したがって、ネットワーク上のように一時的にデータを往復させない限り、これを使用することはお勧めしません。

ウォレットクラスは、Googleプロトコルバッファ形式にシリアル化できます。これは、拡張可能なタグ付きバイナリ形式であり、多くの言語から簡単に操作できます。フォーマットは、好みの環境のクラスにコンパイルされた単純な言語で記述されます。プロトコルバッファは、マイクロペイメントプロトコルにも使用されます。

最後に、独自のBitcoinシリアル化フォーマットは、Messageクラスのサブクラスでサポートされています。