java - 使用 bitcoinj 获取原始 block

标签 java bitcoin raw-data bitcoinj

我正在尝试使用 bitcoinj 获取原始 block 。我使用 Block.bitcoinSerialize() 来获取每个 block 下载时的字节,但不包括交易。我怎样才能获得完整的原始 block ?

最佳答案

我找到了一个临时解决方案:

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,将 block 存储在 SQLite3 数据库中。当我获得完整的 block 时,我用完整的信息(交易、原始 block 等)覆盖 block 寄存器

关于java - 使用 bitcoinj 获取原始 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43217234/

相关文章:

go - 拨一个 jsonrpc 连接到比特币

php - 保存pdf到本地服务器

java - 单击 JavaFX ListView 中的任意位置将返回索引 -1 并崩溃

比特币-cli : how to create a wallet and utxo address

javascript - 在游戏的 Javascript 代码中使用的 PHP 变量

html - 将原始图像数据放在 Src Attr 中会更高效吗?

android - 如何在 Android 上将原始相机数据转换为位图

java - 如何在 Java 中为操作实现简单的撤消/重做?

java - 将图像保存为 PDF 但总是得到相同的图像

java - 如何使用具有新值的java将现有数组附加到mongodb中的现有集合中