Как я могу получать уведомления о новых блоках, используя bitcoinj

Я пытаюсь получать уведомления о новых блоках в цепочке биткойнов. Я использую этот код, но он печатает сотни блоков с 2010 года или около того.

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();
    }
}

Я хотел бы слушать только новые блоки. Есть идеи?
Я старался setFastCatchupTimeSecs но тогда я не получаю никаких событий, кажется.

2 ответа

Решение

Поэтому я вошел в исходный код и, по-видимому, единственный способ получать уведомления о блокировке без необходимости загрузки полной цепочки блоков - это модифицировать исходный код bitcoinj.

В AbstractBlockChain.java вокруг строки 352:

заменить тело метода public boolean add(Block block) с:

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

Как насчет того, чтобы использовать коллекцию для хранения уже найденных блоков и проверить, существует ли уже блок, и выполнить вызов System.out.println, только если это не так.

bc.addNewBestBlockListener((StoredBlock block) -> {
    if (!blocksFoundMap.contains(block)) {
        System.out.println("addNewBestBlockListener");
        System.out.println(block);
    }
});
Другие вопросы по тегам