我正在研究一些读取区块链中DAT文件的代码,我试图使用bitcoinj,因为它看起来相当简单。但是,我似乎无法实际读取DAT文件中的块。我尝试了很多不同的版本并没有取得重大进展。
我觉得这应该是相当简单的,我只是在这里错过了一些简单的东西。要清楚,我不是要写区块链,只是阅读DAT文件 谢谢!
以下是代码段。
NetworkParameters np = new MainNetParams();
Context c = new Context( np );
Context.getOrCreate(MainNetParams.get());
List<File> blockChainFiles = new ArrayList<>();
blockChainFiles.add( new File( "blk00000.dat" ) );
BlockFileLoader bfl = new BlockFileLoader(np, blockChainFiles);
int blockNum = 0;
// Iterate over the blocks in the dataset.
for (Block block : bfl) {
...
此代码产生以下错误:
Exception in thread "main" java.lang.IllegalStateException: Context does not match implicit network params: org.bitcoinj.params.MainNetParams@9d1d82f2 vs org.bitcoinj.params.MainNetParams@9d1d82f2
at org.bitcoinj.core.Context.getOrCreate(Context.java:147)
at testBitcoin.main(testBitcoin.java:20)
答案 0 :(得分:0)
块.dat文件在一个文件中包含多个块,包括孤儿,由幻数分开。
请参阅https://en.bitcoin.it/wiki/Protocol_documentation#Message_structure
您的代码似乎没有按照消息结构的规定查找幻数或跳跃长度。
答案 1 :(得分:0)
只是摆脱抱怨线Context.getOrCreate(MainNetParams.get());
,不需要它。
以下略有修改的代码版本适用于我:
List<File> blockChainFiles = new ArrayList<>();
blockChainFiles.add(new File("blk00000.dat"));
MainNetParams params = MainNetParams.get();
Context context = new Context(params);
BlockFileLoader bfl = new BlockFileLoader(params, blockChainFiles);
// Iterate over the blocks in the dataset.
for (Block block : bfl) {
System.out.println(block.getHashAsString());
}
答案 2 :(得分:0)
您可以使用我的blockchain parser。它使用Python编写,可以将blk * .dat文件中的所有数据解析到简单文本视图中。