チュートリアル:シンプルなGUIウォレットの構築

概要

bitcoinjには基本的なGUIウォレットアプリケーション(Bitcoinを送受信出来るアプリケーション)を作る為のテンプレートが付属しています。 このテンプレートはコピーして使用します。
アプリケーションの例として、ビットコインを賭けるカードゲームを作りたい場合など適しています。このようなアプリでは一般的な使用者の実際のウォレットである必要はありません。
このチュートリアルでは、テンプレートにトランザクションのリストを追加しカスタマイズします。

ステップ1.コードをコピーし、パッケージの名前を変更

①bitcoinjフォルダの中にあるwallettemplateフォルダをコピーしフォルダ名をsimple-walletに変更します。

intellijなどIDEでファイルを選択して開きます。その際、import Maven project automaticallyにチェックを入れて下さい。

IDEでプロジェクトを作成したら、メインフォルダであるwallettemplateをsimplewalletに名前の変更をして下さい。またMain.java内のコードを以下の様に変更して下さい。

public static final String APP_NAME = "wallettemplate";
↓
public static final String APP_NAME = "SimpleWallet";

④これでアプリを実行する事は可能なりました。テストネットで接続する為に以下様に設定します。

public static NetworkParameters params = TestNet3Params.get();

⑤現在Torを使った接続をサポートしていないので、以下のコードは削除して下さい。

bitcoin.useTor();
bitcoin.setDiscovery(new HttpDiscovery(params, URI.create("http://localhost:8080/peers"), ECKey.fromPublicOnly(BaseEncoding.base16().decode("02cba68cfd0679d10b186288b75a59f9132b1b3e222f6332717cb8c4eb2040f940".toUpperCase()))));      

⑥起動するとブロックチェーンの同期がはじまり、完了するまで少し時間がかかります。同期が終わると"m"から始まるアドレス(testnetのアドレス)が表示されます。

⑦画面上のSettingsを押すとパスフレーズが表示されるので、記録しておいて下さい。またパスワードは任意のものを設定して下さい。

処理としては、まずMainクラスから初まり、JavaFxの初期化,bitocinj,クラッシュハンドラのインストールなど基本的な設定の処理を行います。bitcoinjのThreadingクラスの初期段階で、JavaFX UIスレッド上でイベントリスナーを実行するように設定されています。
bitcoinjが初期化されると、MainControllerクラスに準備が整ったことが通知され、UIが表示されます。 MainControllerはメインウィンドウのコントローラクラスであり、そのメンバ変数は主にJavaFXによって自動で接続されています。 BitcoinUIModelクラスは、bitcoinjからのデータを最新の目視可能な値の形式でエクスポートします。これをUIコントロールに直接入れる事ができます。

ステップ2.トランザクションリストをUIに追加

この部分はビデオで簡単に説明されています。

トランザクションリストをUIに追加するにはmain.fxmlのScene Builder(GUI作成ツール)をタブから開きます。

② 画面の真ん中にある"Your content goes here"は削除し、新しく"transactionsList"と言う名前のIDを持つListViewに置き換えてください。

③BitcoinUIModelクラスに以下を追加します。

private ObservableList<Transaction> transactions =FXCollections.observableArrayList();

④updateメソッド内に以下のコードを追加します。

transactions.setAll(wallet.getTransactionsByTime());

⑤以下を追加します

public ObservableList<Transaction> getTransactions() {return transactions;}

⑥アプリを実行し、こちらのサイトから画面に表示されているアドレスにコインを送ってみてください。 UIにトランザクションのデータが表示されます。

ステップ3.トランザクションの表示をカスタマイズ

①MainController.javaファイルのこのコードの下に

 Bindings.bindContent(transactionsList.getItems(), model.getTransactions());
        transactionsList.setCellFactory(new Callback<ListView<Transaction>, ListCell<Transaction>>() {
            @Override
            public ListCell<Transaction> call(ListView<Transaction> param) {
                return new TextFieldListCell<>(new StringConverter<Transaction>() {
                   

以下のコードを追加して下さい。

@Override
public String toString(Transaction tx) {
    Coin value = tx.getValue(Main.bitcoin.wallet());
    if (value.isPositive()) {
        return "Incoming payment of " + MonetaryFormat.BTC.format(value);
    } else if (value.isNegative()) {
        Address address = tx.getOutput(0).getAddressFromP2PKHScript(Main.params);
        return "Outbound payment to " + address;
    }
    return "Payment with id " + tx.getHash();
}

残高との差額として定義される取引の値が得られます。
差がプラスであれば、お金を受け取ったことを意味するので、受け取った金額を示すリスト項目をフォーマットします。
値が負の場合は、送金したことを意味します。 ここで、ユーザーがお金を送ったアドレスには意味があるので、表示します。 もちろん、実際の財布アプリではユーザーがトランザクションに自分のメッセージを記録できるはずですが、bitcoinjはサポートしていません。アプリを実行してお金を先程のサイトに送り返すと、取引記録がリストに表示されるはずです。


うまく起動しない場合は、ソースコードGithubにて公開していますので、参照してみて下さい。