diff --git a/lib/BlockExtractor.js b/lib/BlockExtractor.js index e67c8f8c..a242a6f4 100644 --- a/lib/BlockExtractor.js +++ b/lib/BlockExtractor.js @@ -16,6 +16,7 @@ function BlockExtractor(dataDir, network) { self.dataDir = dataDir; self.files = glob.sync(path); self.nfiles = self.files.length; + self.errorCount =0; if (self.nfiles === 0) throw new Error('Could not find block files at: ' + path); @@ -97,29 +98,40 @@ BlockExtractor.prototype.getNextBlock = function(cb) { async.whilst( function() { - return (!magic); + return (!magic || magic === '00000000'); }, function(w_cb) { + magic = null; self.readCurrentFileSync(); - if (self.currentFileIndex < 0) return cb(); + var byte0 = self.currentParser ? self.currentParser.buffer(1).toString('hex') : null; - magic = self.currentParser ? self.currentParser.buffer(4).toString('hex') - : null ; + if (byte0) { + // Grab 3 bytes from block without removing them + var p = self.currentParser.pos; + var bytes123 = self.currentParser.subject.toString('hex',p,p+3); + magic = byte0 + bytes123; - if (!self.currentParser || self.currentParser.eof() || magic === '00000000') { - magic = null; - if (self.nextFile()) { + if (magic !=='00000000' && magic !== self.magic) { + + if (self.errorCount++ > 4) + return cb(new Error('CRITICAL ERROR: Magic number mismatch: ' + + magic + '!=' + self.magic)); + + magic=null; + } + } + + if (!self.currentParser || self.currentParser.eof() ) { + if (self.nextFile()) console.log('Moving forward to file:' + self.currentFile() ); - return w_cb(); - } - else { + else console.log('Finished all files'); - magic = null; - return w_cb(); - } + + magic = null; + return w_cb(); } else { return w_cb(); @@ -128,15 +140,8 @@ BlockExtractor.prototype.getNextBlock = function(cb) { }, function (a_cb) { if (!magic) return a_cb(); - - if (magic !== self.magic) { - var e = new Error('CRITICAL ERROR: Magic number mismatch: ' + - magic + '!=' + self.magic); - return a_cb(e); - } - - // spacer? - self.currentParser.word32le(); + // Remove 3 bytes from magic and spacer + self.currentParser.buffer(3+4); return a_cb(); }, function (a_cb) { @@ -145,6 +150,7 @@ BlockExtractor.prototype.getNextBlock = function(cb) { b = new Block(); b.parse(self.currentParser); b.getHash(); + self.errorCount=0; return a_cb(); }, ], function(err) { diff --git a/test/integration/blockExtractor.js b/test/integration/blockExtractor.js index a83766c5..3f5f3609 100644 --- a/test/integration/blockExtractor.js +++ b/test/integration/blockExtractor.js @@ -11,6 +11,7 @@ var assert = require('assert'), networks = require('bitcore/networks'), util = require('bitcore/util/util'); +var should = require('chai'); //var txItemsValid = JSON.parse(fs.readFileSync('test/model/txitems.json')); describe('BlockExtractor', function(){ @@ -46,6 +47,8 @@ describe('BlockExtractor', function(){ it('should read next '+config.network+' block ', function(done) { be.getNextBlock(function(err,b) { assert(!err); + // 2nd block of testnet3 + util.formatHashFull(b.hash).should.equal('00000000b873e79784647a6c82962c70d228557d24a747ea4d1b8bbe878e1206'); assert(b.timestamp > lastTs, 'timestamp > genesis_ts'); done(); });