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 回答