使用bitcoinj读取比特币数据文件 blkXXXXX.dat

比特币的交易数据一般有两种获取方式,如果获取的数据不多,可以使用bitcoin的API 或  bitcoin-cli,如果需要完整的数据,则建议将所需数据实时或定时转储到数据库中,直接读取区块链的数据文件是比较好的选择。

比特币的交易和块数据默认存放在目录 ~/.bitcoin/blocks/ 下。

bitcoinj (https://github.com/bitcoinj/bitcoinj) 是java实现的功能齐备的bitcoin开源项目,请下载最新版,包含了bitcoin的最新BIP的实现,否则会遇到异常情况。

//ExplorerTransaction,ExplorerBlock是自己的定义的类,用于存放筛选出来的交易和块数据
   Set<ExplorerBlock> blocks;                                                             
   Set<ExplorerTransaction> transactions;
    blocks = new HashSet<>();
    transactions = new HashSet<>();
    NetworkParameters np =  MainNetParams.get();                             //准备一些必要的环境参数
    Context ct = Context.getOrCreate(np);
    Context.propagate(ct);
    List<File> blockChainFiles = new ArrayList<>();     
    blockChainFiles.add(new File("~/.bitcoin/blocks/blk000999.dat"));    //添加一个要读取的文件
    BlockFileLoader bfl = new BlockFileLoader(np, blockChainFiles);    //关键的一步,加载该文件
    for (Block block : bfl){                                                                         //遍历文件中所有块
            List<Transaction> listTx = block.getTransactions();
            for(Transaction tx : listTx){                                                          //遍历该块中的所有交易
//以下是处理包含OP_RETURN的交易
                    ExplorerTransaction optx = new ExplorerTransaction(block, tx);    //ExplorerTransaction,ExplorerBlock是自己的定义的类
                    if(optx.isOpReturn()){                                                          //如果包含OP_RETURN
                            // Adding block
                            ExplorerBlock tempBlock = new ExplorerBlock(block.getHashAsString(), block.getTime());
                            blocks.add(tempBlock);

                            // Adding transaction
                            optx.setTxHash(tx.getHashAsString());                      //读取原交易中的交易Hash
                            optx.setBlockHash(block.getHashAsString());            //读取所在区块的Hash
                            optx.setFee(tx.getFee());                                             //读取Fee
                            transactions.add(optx);
                    }
            }
    }

单线程的处理速度很快,如果采用多线程,例如4个线程,在主流电脑上,处理到块文件blk01317.dat ,估计需要不到两个小时。

没有更多推荐了,返回首页