Skip to main content
9 of 9
keeping LevelUp in title is probably still helpful
eth
  • 86.5k
  • 53
  • 287
  • 411

How to use Nodejs/LevelUp to read Blocks from local LevelDb database files (.ldb)?

Here's what I've been able to get going to far. I can open the blockchain database but I can't seem to create a valid blockchain object (nor call the blockchain.getBlock() function successfully). I'm running against the local database files for my geth.exe node running against mainnet.

Geth.exe 1.7.3 running against mainnet in a Windows 10 laptop.

const LevelUp = require('levelup');
const LevelDown = require('leveldown');
const RLP = require('rlp');
const Trie = require('merkle-patricia-tree');

const Account = require('ethereumjs-account')
const Transaction = require('ethereumjs-tx')
const Block = require('ethereumjs-block')
const Blockchain = require('ethereumjs-blockchain')

const Util = require('ethereumjs-util')
const BN = Util.BN

var dboptions = { createIfMissing: false };
var BlockchainDB = LevelUp(LevelDown('/Users/mwher/AppData/Roaming/Ethereum/geth/chaindata'), dboptions); // my geth mainnet datadir
//console.log('BlockchainDB:');
//console.log(BlockchainDB);

//the genesis state root
var root = 'd7f8974fb5ac78d9ac099b9ad5018bedc2ce0a72dad1827a1709da30580f0544';
console.log('root:');
console.log(root);

/* console.log('BlockchainDB.get:');
BlockchainDB.get(new Buffer(root, 'hex'), { // WORKS => BlockchainDB is good
    encoding: 'binary'
}, function (err, value) {
    console.log('RLP.decode(value):');
    console.log(RLP.decode(value));
}); */

// https://etherscan.io/block/1
var block1 = new Buffer('88e96d4537bea4d9c05d12549907b32561d3bf31f45aae734cdc119f13406cb6', 'hex');
console.log('block1:' + block1);

const options = { blockDb: BlockchainDB, validate: false };
var blockchain = new Blockchain(options)

blockchain._init( function(err, data) {
    console.log('Initialized');
/*     console.log(err);
    console.log(data);
    console.log('blockchain.0:');
    console.log(blockchain); */

    console.log('blockchain.getBlock.1a:start');
    var bn = 0;
    var hn = Number(bn);
    blockchain.getBlock(hn, function (err, data) { // WORKS for block bn = 0 but not bn = 1
        console.log('blockchain.getBlock.1a.err:', err);
        //console.log('blockchain.getBlock.1a.data:', data);

        console.log('b.1a:');
        var b = new Block(data);
        //console.log(b);
        console.log('Number.1a.JSON:', b.toJSON(true));
        console.log('Number.1a.fields:' + b.header._fields);
        console.log('Number.1a.difficulty:' + (new BN(b.header.difficulty).toString()));
        console.log('Number.1a.gasLimit:' + (new BN(b.header.gasLimit).toString()));
        console.log('Number.1a.timestamp:' + (new BN(b.header.timestamp).toString()));
        console.log('Number.1a.number:' + (new BN(b.header.number).toString()));
        console.log('Number.1a.nonce:' + (new BN(b.header.nonce).toString()), b.header.nonce);
        console.log('Number.1a.extraData:', b.header.extraData);
    });

});

UPDATE: The code was pretty much working all along but I wasn't looking at the err value from getBlock().

UPDATE2: The above updated code now WORKS for block 0 (zero) - still doesn't work for block 1.

You can verify this works for block zero by comparing the log messages to https://etherscan.io/block/0 but I still get the message 'blockchain.getBlock.1a.err: NotFoundError: Key not found in database 1' when I set var bn = 1;

UPDATE3: By added the following code to my JS script (from here https://gist.github.com/daragao/cda5d96d4d4248826762992badb0f96d#L71-98), it appears I've been able to dump out the keys from my local geth database:

const enc = 'binary';
BlockchainDB
  .createReadStream({ encoding: enc, valueEncoding: enc, keyEncoding: enc, keys: true, values: false })
  .on('data',(data) => {
    const keyBin = new Buffer(data, enc);
    const keyBinHex = keyBin.toString('hex');
    console.log(keyBinHex);
   });

...over 300 million keys that look like the following (first 10 rows):

000000339465437a96b9a10371bb4a192815189c9eedcf161a457c618aced55a
0000006ef5936dd01319447945152cdbb95135449f5ba6e701514823abf87cb1
0000008ed8a5e4b794d0ee71b0a1cc9a31de66099dccac511f867f9edbfc59d6
000000dccbeea3c1f013fccf82b3a071fb43177f003f642c00266c8715c286a9
000000f2533a255a343519bcbf7f82b2354b6b894ebdbfc7a4afc9072e5c4fda
00000115188f5faf17c7821e192a1c1adef78cd913f2024bcbe748446df644f7
0000015f9d45bd11a0cf2e545433a15c712aef0a3d335ab4ceb6e0190bcac144
00000161c05c94651393d431f438b4deac9382b2571e8334c9e13fc62d3b9ae5
000001b92f228b64b2c428fc37891d3d126bf74a421c7341b101abed1320e87e
000001e74d9e8ae320613947c4e6cce1a4d6d43abafb4f9a5b13eeb9f394a247

More news at 11...