Private-Blockchain

如何使用 Nodejs levelup 包打開本地乙太坊鏈(leveldb)?

  • November 25, 2017

閱讀有關如何從本地鏈獲取資訊的文章,但範例不起作用。當我在以下位置創建與本地鏈的 LevelDB 的連接時,我的程式碼停止了var db = levelup(...)

var levelup = require('levelup');
var db = levelup('/Users/User/WebstormProjects/untitled/bin/chaindata');

//the genesis state root
var root = 'e5be92145a301820111f91866566e3e99ee344d155569e4556a39bc71238f3bc';

//Note: we are doing everything using binary encoding.
db.get(

   new Buffer(root, 'hex'),
       {
           encoding: 'binary'
       },

   function (err, value)
       {
           console.log(value);
       }
   );

“chaindata”是我在 Mac 上的本地 eth 鏈的副本。文件夾包含這樣的文件:

  • 000002.ldb
  • 000003.log
  • 目前的
  • 日誌
  • 舊日誌
  • 清單-000004

所以,當我嘗試打開 db 時出現錯誤:InitializationError: Must provide db.

問題是,我不得不使用這個:

var level = require('level')
var db = level('/Users/User/WebstormProjects/untitled/bin/chaindata')

反而

var levelup = require('levelup');
var db = levelup('/Users/User/WebstormProjects/untitled/bin/chaindata');

也可以閱讀:github問題

查看LevelDB 程式碼,如果傳入的 DB 為空或無效,則會返回該錯誤。您需要檢查您的副本是否完好無損,並且其中確實有一些東西(通過讓 Geth 執行一段時間)。

在公鏈的 Geth chaindata 上使用以下程式碼…

var levelup = require('levelup');
var db = levelup('chaindata');
var rlp = require('rlp')

// The genesis state root.
var root = 'd7f8974fb5ac78d9ac099b9ad5018bedc2ce0a72dad1827a1709da30580f0544';

// Note: we're doing everything using binary encoding.
db.get(new Buffer(root, 'hex'), {
   encoding: 'binary'
}, function (err, value) {
   console.log(rlp.decode(value));
});

…我得到以下預期(雖然無趣)的原始輸出:

[ <Buffer 90 dc af 88 c4 0c 7b bc 95 a9 12 cb dd e6 7c 17 57 67 b3 11 73 df 9e e4 b0 d7 33 bf dd 51 1c 43>,
 <Buffer ba be 36 9f 6b 12 09 2f 49 18 1a e0 4c a1 73 fb 68 d1 a5 45 6f 18 d2 0f a3 2c ba 73 95 40 52 bd>,
 <Buffer 47 3e cf 8a 7e 36 a8 29 e7 50 39 a3 b0 55 e5 1b 83 32 cb f0 33 24 ab 4a f2 06 6b bd 6f bf 00 21>,
 <Buffer bb da 34 75 3d 7a a6 c3 8e 60 3f 36 02 44 e8 f5 96 11 92 1d 9e 1f 12 83 72 fe c0 d5 86 d4 f9 e0>,
 <Buffer 4e 44 ca ec ff 45 c9 89 1f 74 f6 a2 15 67 35 88 6e ed f6 f1 a7 33 62 8e bc 80 2e c7 9d 84 46 48>,
 <Buffer a5 f3 f2 f7 54 21 48 c9 73 97 7c 8a 1e 15 4c 43 00 fe c9 2f 75 5f 78 46 f1 b7 34 d3 ab 1d 90 e7>,
 <Buffer e8 23 85 0f 50 bf 72 ba ae 9d 17 33 a3 6a 44 4a b6 5d 0a 6f aa ba 40 4f 05 83 ce 0c a4 da d9 2d>,
 <Buffer f7 a0 0c be 7d 4b 30 b1 1f ae a3 ae 61 b7 f1 f2 b3 15 b6 1d 9f 6b d6 8b fe 58 7a d0 ee ce b7 21>,
 <Buffer 71 17 ef 9f c9 32 f1 a8 8e 90 8e ae ad 85 65 c1 9b 56 45 dc 9e 5b 1b 6e 84 1c 5e db df d7 16 81>,
 <Buffer 69 eb 2d e2 83 f3 2c 11 f8 59 d7 bc f9 3d a2 39 90 d3 e6 62 93 5e d4 d6 b3 9c e3 67 3e c8 44 72>,
 <Buffer 20 3d 26 45 63 12 bb c4 da 5c d2 93 b7 5b 84 0f c5 04 5e 49 3d 6f 90 4d 18 08 23 ec 22 bf ed 8e>,
 <Buffer 92 87 b5 c2 1f 22 54 af 4e 64 fc a7 6a cc 5c d8 73 99 c7 f1 ed e8 18 db 43 26 c9 8c e2 dc 22 08>,
 <Buffer 6f c2 d7 54 e3 04 c4 8c e6 a5 17 75 3c 62 b1 a9 c1 d5 92 5b 89 70 74 86 d7 fc 08 91 9e 0a 94 ec>,
 <Buffer 7b 1c 54 f1 5e 29 9b d5 8b df ef 97 41 53 8c 78 28 b5 d7 d1 1a 48 9f 9c 20 d0 52 b3 47 1d f4 75>,
 <Buffer 51 f9 dd 37 39 a9 27 c8 9e 35 75 80 a4 c9 7b 40 23 4a a0 1e d3 d5 e0 39 0d c9 82 a7 97 58 80 a0>,
 <Buffer 89 d6 13 f2 61 59 af 43 61 6f d9 45 5b b4 61 f4 86 9b fe de 26 f2 13 08 35 ed 06 7a 8b 96 7b fb>,
 <Buffer > ]

這是州 Patricia-Merkle Trie 的原始版本。要導航並理解它,您需要引入相關的軟體包。(例如var Trie = require('merkle-patricia-tree');,等等……)

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