2017-12-08 98 views
7

Próbuję otrzymywać powiadomienia o blokach bitcoinowych o blokach nowych. Używam tego kodu, ale to drukuje setki bloków od 2010 roku lub więcej w górę.Jak mogę otrzymywać powiadomienia o nowych blokach za pomocą bitcoinj

import org.bitcoinj.core.*; 
import org.bitcoinj.net.discovery.DnsDiscovery; 
import org.bitcoinj.params.MainNetParams; 
import org.bitcoinj.store.BlockStore; 
import org.bitcoinj.store.MemoryBlockStore; 


public class BlockChainMonitorTest { 


    BlockChainMonitorTest() throws Exception { 

     NetworkParameters params = MainNetParams.get(); 

     BlockStore bs = new MemoryBlockStore(params); 
     BlockChain bc = new BlockChain(params, bs); 

     PeerGroup peerGroup = new PeerGroup(params, bc); 
     peerGroup.setUserAgent("PeerMonitor", "1.0"); 
     peerGroup.setMaxConnections(4); 
     peerGroup.addPeerDiscovery(new DnsDiscovery(params)); 

     bc.addNewBestBlockListener((StoredBlock block) -> { 
      System.out.println("addNewBestBlockListener"); 
      System.out.println(block); 
     }); 

     //peerGroup.setFastCatchupTimeSecs(1483228800); // 2017-01-01 

     peerGroup.start(); 
     peerGroup.waitForPeers(4).get(); 
     Thread.sleep(1000 * 60 * 30); 
     peerGroup.stop(); 

    } 

    public static void main(String[] args) throws Exception { 
     new BlockChainMonitorTest(); 
    } 
} 

Chciałbym słuchać tylko nowych bloków. Jakieś pomysły ?
Próbowałem setFastCatchupTimeSecs, ale potem nie otrzymuję żadnych zdarzeń, jak się wydaje.

Odpowiedz

0

Poszedłem więc do kodu źródłowego i widocznie jedyny sposób, aby otrzymywać powiadomienia blokowe bez konieczności pobierania kompletny blockchain jest modyfikacja kodu źródłowego bitcoinj.

W AbstractBlockChain.java wokół linii 352:

zastąpić ciało metody public boolean add(Block block) z:

informListenersForNewBlock(block, NewBlockType.BEST_CHAIN, null, null, new StoredBlock(block, BigInteger.ZERO, 0)); 
return true; 
0

A może użyjesz kolekcji do przechowywania już znalezionych bloków i sprawdź, czy blok już tam jest, i wykonuj wywołanie System.out.println, jeśli nie jest.

bc.addNewBestBlockListener((StoredBlock block) -> { 
    if (!blocksFoundMap.contains(block)) { 
     System.out.println("addNewBestBlockListener"); 
     System.out.println(block); 
    } 
}); 
+0

chciałbym uniknąć konieczności pobierania kompletny blockchain. –