Wie öffne ich die lokale Ethereum-Kette (Leveldb) mit dem Levelup-Paket von Nodejs?

Lesen Sie den Artikel darüber, wie Sie Informationen von einer lokalen Kette erhalten , aber das Beispiel funktioniert nicht. Mein Code wurde angehalten, als ich eine Verbindung zu LevelDB meiner lokalen Kette herstellte in 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" ist eine Kopie meiner lokalen eth-Kette auf dem Mac. Ordner enthält solche Dateien:

  • 000002.ldb
  • 000003.log
  • AKTUELL
  • SPERREN
  • PROTOKOLL
  • LOG.alt
  • MANIFEST-000004

Also, wenn ich versuche, db zu öffnen, bekomme ich einen Fehler: InitializationError: Must provide db.

Antworten (2)

Wenn Sie sich den LevelDB-Code ansehen , scheint dieser Fehler zurückgegeben zu werden, wenn die übergebene DB entweder leer oder ungültig ist. Sie müssen überprüfen, ob Ihre Kopie intakt ist und ob tatsächlich etwas darin ist (indem Sie Geth eine Weile laufen lassen).

Verwenden Sie den folgenden Code auf Geth-Kettendaten für die öffentliche Kette ...

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));
});

... Ich erhalte die folgende erwartete (wenn auch uninteressante) Rohausgabe:

[ <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 > ]

Dies ist die Rohfassung des staatlichen Patricia-Merkle-Trie. Um zu navigieren und es zu verstehen, müssen Sie die entsprechenden Pakete einbringen. (z.B. var Trie = require('merkle-patricia-tree');usw...)

Woher hast du deine 'Chaindata' ? Selbst wenn ich versuche, eine Verbindung zur öffentlichen Kette herzustellen, /Users/User/Library/Ethereum/geth/chaindatahatte ich ein solches Problem. Vielleicht funktioniert es unter Linux oder Win, nicht unter Mac?
Das ist nur mein chaindataOrdner ~.ethereum/geth/auf meinem Computer (ich bin nicht mit einem externen Knoten verbunden). Ich führe das Skript aus demselben Verzeichnis aus. Ich denke, es sollte auf dem Mac funktionieren. Können Sie versuchen, weitere Kettendaten herunterzuladen? Ich bin mir nicht sicher, was ich sonst noch vorschlagen soll, fürchte ich.
Mach das jetzt gleich. Hm kannst du traurig welche Dateien du drin hast ~.ethereum/geth/chaindata? Vielleicht sind unsere Listen unterschiedlich und darin ein Problem.
Lösung bekommen, danach schreiben
Aha, es muss sein, dass ich bereits die alte Version des levelupPakets ausgeführt habe, weshalb es bei mir funktioniert hat :-)
Dies funktioniert für die Wurzel des Genesis-Zustands. Ich habe versucht, einen neueren Zustand zu rooten, aber es gibt nichts. Liegt es am Schnitt? Vielen Dank.

Das Problem war, dass ich das verwenden musste:

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

stattdessen

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

Kann auch darüber lesen in: GitHub Issues