我的目标是观看公共比特币地址,并在资金发送到该地址时打印到控制台。就这样。我现在正在使用以前在比特币核心中生成的地址。
我正在做以下事情:
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]中看到了“peer announce new transaction”的连续流。
我做错了什么,如何纠正?我花了更多的时间在一些似乎应该是如此简单的任务的东西上。
PS。我正在调用“loadFromFile”的文件只是bitcoinj生成的空白默认钱包文件。没什么特别的。
编辑:另外,我不打算看钱包的总余额。我只想知道什么时候 - 新交易进来。旧的与我的计划无关。
答案 0 :(得分:2)
我终于明白了。花了我很长时间。我决定只使用钱包应用套件,而不是手动完成此操作。这是我做我想做的最终代码(删除公钥和文件)。
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();
}
为什么这样做有效,我发布的内容没有,我仍然不完全确定。我肯定错过了什么。如果你来这个帖子,知道我上面做错了什么;请告诉我。它对于将来的参考仍然有用。