Block

bitcoinj 獲取原始塊

  • April 5, 2017

我正在嘗試使用 bitcoinj 獲取原始塊。我用來Block.bitcoinSerialize()在下載每個塊時獲取它的字節,但不包括事務。如何獲得完整的原始塊?

我找到了一個臨時解決方案:

BlockStore blockStore = new MyCustomBlockStore(NETWORK_PARAMETERS);
blockStore.getChainHead();

blockChain = new BlockChain(NETWORK_PARAMETERS, blockStore);

PeerGroup peerGroup = new PeerGroup(NETWORK_PARAMETERS, blockChain);
peerGroup.setDownloadTxDependencies(1000);
peerGroup.setBloomFilteringEnabled(false);
peerGroup.addPeerDiscovery(new PeerDiscovery() {
   private final PeerDiscovery normalPeerDiscovery = new DnsDiscovery(NETWORK_PARAMETERS);

   @Override
   public InetSocketAddress[] getPeers(long services, long timeoutValue, TimeUnit timeoutUnit) throws PeerDiscoveryException {
       final List<InetSocketAddress> peers = new LinkedList<InetSocketAddress>();
           peers.addAll(Arrays.asList(normalPeerDiscovery.getPeers(services, timeoutValue, timeoutUnit)));
           InetSocketAddress[] isas = new InetSocketAddress[0];
           return peers.toArray(isas);
       }

   @Override
   public void shutdown() {
       normalPeerDiscovery.shutdown();
   }
});

peerGroup.startAsync();
peerGroup.startBlockChainDownload(new PeerDataEventListener() {
   public void onBlocksDownloaded(Peer peer, Block block, @Nullable FilteredBlock filteredBlock, int i) {

       List<Transaction> transactionsList = block.getTransactions();
       int transactions = transactionsList == null ? 0 : transactionsList.size();

       long height = peer.getBestHeight() - i;
       //If the block contains transactions, it is likely to be complete.
       Log.e(TAG, "Downloaded block " + height + " with " + transactions + " transactions");
       blockUpdate(block);
   }

   private void blockUpdate(Block fBlock) throws IOException {
       //TODO: Update blockchain database with the full block.
   }

   public void onChainDownloadStarted(Peer peer, int i) {
       Log.i(TAG, "Started to download chain on peer " + peer);
   }

   @Nullable
   public List<Message> getData(Peer peer, GetDataMessage getDataMessage) {
       //Log.i(TAG, "getData from " + peer);
       return null;
   }

   public Message onPreMessageReceived(Peer peer, Message message) {
       //Log.i(TAG, "onPreMessageReceived (" + message.getClass().getSimpleName() + ") from " + peer);
       return message;
   }
});

就我而言,我創建了一個 BlockStore,將塊儲存在 SQLite3 數據庫中。當我得到完整的塊時,我用完整的資訊(事務、原始塊等)覆蓋塊寄存器

引用自:https://bitcoin.stackexchange.com/questions/52567