gpt4 book ai didi

haskell - 从 LevelDB 数据库中获取所有键

转载 作者:行者123 更新时间:2023-12-04 20:11:15 34 4
gpt4 key购买 nike

我正在编写一个脚本来收集所有比特币块的哈希值。程序 bitcoind,如果某个设置发生更改,则将所有块的元数据存储在 LevelDB 数据库中。每组元数据的键是块的哈希值,通常用作它的标识符。本质上,我试图从每个块中获取元数据的特定部分(事务 ID)。我正在编写的脚本是在 Haskell 中编写的,但如果需要,我总是可以执行 shell 命令。笼统地说我的问题,我不确定最简单的方法是否是找到所有块哈希(键),然后调用 bitcoind 来获取每个块的元数据。如果有任何方法可以直接从 LevelDB 数据库中简单地获取每个值,那也可以。什么是最简单有效的方法来做到这一点?

最佳答案

我不知道如何用 haskell 做到这一点,但用 C++ 做到这一点最有效的方法是使用 leveldb::Iterator 和 iterate over the entire key range :
0x00000000 -> 0xFFFFFFFF (32 位 key )0x0000000000000000 -> 0xFFFFFFFFFFFFFFFF (64 位 key )

来自 the example :

leveldb::Slice start = ...; // 0x00000000
leveldb::Slice end = ...; // 0xFFFFFFFFFFFFFFFF

The example显示当您迭代时,可以加载键和值:
leveldb::Slice key = it->key();
leveldb::Slice value = it->value();

由于您不关心值,因此可以跳过查询 it->value() 的部分。 ,只需收集您需要的 key (在这种情况下是所有 key ),您应该会很好。我不会担心不必要地加载值会影响性能。

但是,这里要注意一件大事: 当bitcoind运行时你不能这样做!!!

之所以会出现这种情况,是因为在任何给定时间只能打开一个级别 DB 的实时实例,而 bitcoind 很可能已经将 db 实例保持打开状态,尝试打开另一个实例(即使只是为了读取)将导致一个错误。您可以获得数据库的快照和 iterate the snapshots tho .快照允许您保证 bitcoind 的最短停机时间。

最后,如果您无法承受 bitcoind 客户端的任何停机时间,那么您可能需要为 bitcoind 或 leveldb 编写一个包装器。您必须在某处引入抽象级别。

包装比特币:
  • 在制作快照时关闭bitcoind。
  • 缓冲对 bitcoind 的任何请求,直到您完成快照。
  • 再次启动bitcoind。

  • 围绕 leveldb 的包装:

    level db 的包装器有点困难,您必须保持对数据库实例的控制,并且必须实际进入并修改 bitcoind 代码,然后构建 bitcoind 并运行它。

    关于haskell - 从 LevelDB 数据库中获取所有键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17026408/

    34 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com