RocksDb:每个键有多个值(C++)
我想做什么
我正在尝试调整我的简单区块链实现以定期将区块链保存到硬盘,因此我寻找了不同的数据库解决方案。我决定使用RocksDb的原因是它易于使用且文档和示例很好。我通读了文档,无法弄清楚如何使其适应我的用例。
我有一个类块
`
class Block {
public:
string PrevHash;
private:
blockheader header; // The header of the block
uint32_t index; // height of this block
std::vector<tx_data> transactions; // All transactions in the block in a vector
std::string hash; // The hash of the block
uint64_t timestamp; // The timestamp this block was created by the node
std::string data; // Extra data that can be appended to blocks (for example text or a smart contract)
// - The larger this feild the higher the fee and the max size is defined in config.h
};
其中包含一些变量和结构tx_data的 vector 。我想将此数据加载到rockdb数据库中。我尝试过的
在google无法返回使用一个密钥对存储多个值的任何结果后,我决定我只需要在开始时将每个块数据封装在0xa1中,然后在结束时将其封装在0x2a中
*0x2a*
header
index
txns
hash
timestamp
data
*0x2a*
但决定肯定有更简单的方法。我试着看了一下龟币所使用的代码,这是一种使用rocksdb作为数据库的货币,但是那里的代码几乎是无法辨认的,我听说过序列化,但是上面似乎没有什么信息。也许我误解了数据库的使用?
最佳答案
您需要对其进行序列化。序列化是将一组结构化的数据转换为一个字符串,数字或字节 vector 的过程,然后可以将其反序列化为该结构。一种方法是获取块的哈希并将其用作db中的键,然后创建一个不包含哈希的新结构。然后编写一个函数,该函数采用Block结构和路径,并构造BlockNoHash结构并保存。然后是另一个函数,用于从哈希中读取一个块并吐出一个块结构。基本上,您可以使用字符分隔符分割每个字段,该字符永远不会出现在数据中(例如`或|),尽管这意味着如果其中一个数据损坏了,那么您将无法获取其他任何数据
关于c++ - RocksDb:每个键有多个值(C++),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57318953/