4

私の目標は、パブリック ビットコイン アドレスを監視し、そのアドレスに送金されるたびにコンソールに出力することです。それで全部です。今のところ、Bitcoin Core で以前に生成されたアドレスを使用しています。

私は次のことをしています:

 NetworkParameters params = MainNetParams.get();
 Wallet wallet = Wallet.loadFromFile(file);
 BlockStore blockStore = new MemoryBlockStore(params);
 BlockChain chain = new BlockChain(params, wallet, blockStore);

 PeerGroup peerGroup = new PeerGroup(params, chain);
 peerGroup.addPeerDiscovery(new DnsDiscovery(params));
 peerGroup.setUseLocalhostPeerWhenPossible(true);
 peerGroup.startAsync();

 Address add = new Address(params, "1NpxxxxxxxxxxxxxxxaSC4");
 wallet.addWatchedAddress(add);

 wallet.addEventListener(new AbstractWalletEventListener() {
        @Override
        public synchronized void onCoinsReceived(Wallet w, Transaction tx, Coin prevBalance, Coin newBalance) {
            System.out.println("[main]: COINS RECIEVED!"); 
            System.out.println("\nReceived tx " + tx.getHashAsString());
            System.out.println(tx.toString());
        }
    });

 System.out.println("\nDone!\n");
 System.out.println(wallet.toString());

AbstractWalletEventListener を正しく処理していない気がします。そのアドレスに送金すると、コンソールに表示されるはずのテキストが表示されません。代わりに、peerGroup.startAsync() メソッドの [NioClientManager] からの「ピアが新しいトランザクションを発表しました」の継続的なストリームが表示されます。

私は何を間違っていますか?どうすれば修正できますか? こんなに簡単な仕事のはずなのに、必要以上に多くの時間を費やしてしまいました。

PS。「loadFromFile」で呼び出しているファイルは、bitcoinj によって生成された空のデフォルトのウォレット ファイルです。それについて特別なことは何もありません。

編集: また、ウォレットの合計残高を確認するつもりはありません。私が知りたいのは、新しいトランザクションがいつ入ってくるかだけです。古いトランザクションは私のプログラムには関係ありません。

4

1 に答える 1

5

私はついにそれを理解しました。十分に時間がかかりました。これを手動で行う代わりに、ウォレット アプリ キットを使用することにしました。これが、私がやろうとしていたことを実行するための最終的なコードです(公開鍵とファイルを削除しました)。

final NetworkParameters params = MainNetParams.get();

try{

    //initialize files and stuff here

    WalletAppKit kit = new WalletAppKit(params, wakfile, "_wak"); 
    kit.setAutoSave(true); 
    kit.connectToLocalHost(); 
    kit.startAsync(); 
    kit.awaitRunning();
    kit.peerGroup().addPeerDiscovery(new DnsDiscovery(params)); 
    kit.wallet().addWatchedAddress(new Address(params, "1NxxxxxxxxxxxxxxxxC4"));
    kit.wallet().addEventListener(new AbstractWalletEventListener() {
        @Override
        public synchronized void onCoinsReceived(Wallet w, Transaction tx, Coin prevBalance, Coin newBalance) {
            System.out.println("[main]: COINS RECIEVED!"); 
            System.out.println("\nReceived tx " + tx.getHashAsString());
            System.out.println(tx.toString());
        }
    });
} catch (IOException e) {
    e.printStackTrace();
} catch (AddressFormatException e) {
    e.printStackTrace();
}

なぜこれが機能し、私が投稿したものは機能しないのか、まだ完全にはわかりません. 私は何かが欠けているに違いない。あなたがこの投稿に来て、私が上で間違ったことを知っているなら; 私にお知らせください。今後も参考にさせていただきます。

于 2015-01-01T01:00:27.963 に答える