2

我正在编写一些读取区块链中 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)
4

3 回答 3

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());
}
于 2017-03-19T00:20:13.517 回答
0

块 .dat 文件在一个文件中包含多个块,包括孤立块,由幻数分隔。

请参考https://en.bitcoin.it/wiki/Protocol_documentation#Message_structure

您的代码似乎不是在寻找由消息结构指定的幻数或跳跃长度。

于 2017-02-27T21:43:36.957 回答
0

你可以使用我的区块链解析器。它使用 Python 编写,可以将 blk*.dat 文件中的所有数据解析为简单的文本视图。

于 2020-04-02T09:41:48.310 回答