Cpp-Ethereum

解碼 ethereum leveldb 鍵和值

  • February 15, 2022

我創建了一個簡單的腳本來使用 C++ 從 leveldb 讀取乙太坊數據。基本上,這個測試程序會將 leveldb 中的所有鍵列印到控制台。

#include <cassert>
#include <iostream>
#include "leveldb/db.h"
using namespace std;
// g++ leveldb_test.cpp -o test -lleveldb
int main(int argc, const char *argv[]) {
   leveldb::DB* db;
   leveldb::Options options;
   options.create_if_missing = true;
   leveldb::Status status = leveldb::DB::Open(options, "/home/user/.ethereum/rinkeby/geth/chaindata", &db);

   if (!status.ok()){
       cerr << status.ToString() << endl;
       delete db;
       return 0;
   }
   leveldb::Iterator* it = db->NewIterator(leveldb::ReadOptions());
   for (it->SeekToFirst(); it->Valid(); it->Next()) {
       cout << it->key().ToString() << endl; 
   }
   delete it;
   delete db;
   return 1;
}

但結果是這樣編碼的。

控制台輸出圖像

如何輸出可讀的輸出?有沒有辦法解碼乙太坊 leveldb 數據?(可能是一個 C++ 庫?)

不確定它是否真的對您有幫助,我嘗試在https://medium.com/cybermiles/diving-into-ethereums-world-state-c893102030ed之後閱讀 statetrie 。我的輸出是這樣的,

key:9bd9f586100bd06ef90756fd3aaad9e2ab641443d22cb185d364d627964c1855
[ <Buffer 09>,
 <Buffer 03 2e db 3c fb 1d 5c 00>,
 <Buffer 56 e8 1f 17 1b cc 55 a6 ff 83 45 e6 92 c0 f8 6e 5b 48 e0 1b 99 6c ad c0 01 62 2f b5 e3 63 b4 21>,
 <Buffer c5 d2 46 01 86 f7 23 3c 92 7e 7d b2 dc c7 03 c0 e5 00 b6 53 ca 82 27 3b 7b fa d8 04 5d 85 a4 70> ]

乙太坊節點通常將二進制數據儲存在 LevelDB 中,但使用的方法 ToString 旨在處理文本數據。因此,您需要實現自己的方法將二進制數據轉換為人類可讀的字元串。在乙太坊世界中,顯示二進制數據的常用方法是將其轉換為十六進制格式,如下所示:0x0123456789ABCDEF. 您可以使用以下功能:

std::string toHexString (const char *data, size_t len) {
 std::string result;
 for (size_t i = 0; i < len; i++) {
   result.push_back ("0123456789ABCDEF" [data [i] >> 4 & 0x0F]);
   result.push_back ("0123456789ABCDEF" [data [i] & 0x0F]);
 }
 return result;
}

像這樣:

for (it->SeekToFirst(); it->Valid(); it->Next()) {
   cout << "0x" << toHexString (it->key().data(), it->key().size()) << endl; 
}

引用自:https://ethereum.stackexchange.com/questions/47638