From fae647b9e97b2e31e2eb667ab927d7a55450644e Mon Sep 17 00:00:00 2001 From: Braydon Fuller Date: Wed, 17 Apr 2019 17:18:07 -0700 Subject: [PATCH] indexer: simplify block meta and remove records --- lib/indexer/indexer.js | 29 +++++--- lib/indexer/layout.js | 9 +-- lib/indexer/records.js | 152 ----------------------------------------- 3 files changed, 24 insertions(+), 166 deletions(-) delete mode 100644 lib/indexer/records.js diff --git a/lib/indexer/indexer.js b/lib/indexer/indexer.js index 702d5a4a..7c092cf2 100644 --- a/lib/indexer/indexer.js +++ b/lib/indexer/indexer.js @@ -15,7 +15,7 @@ const Logger = require('blgr'); const Network = require('../protocol/network'); const util = require('../utils/util'); const layout = require('./layout'); -const {BlockMeta} = require('./records'); +const {ZERO_HASH} = require('../protocol/consensus'); /** * Indexer @@ -221,11 +221,7 @@ class Indexer extends EventEmitter { if (!data) return null; - const block = new BlockMeta(); - block.hash = data; - block.height = height; - - return block; + return new BlockMeta(data, height); } /** @@ -399,7 +395,7 @@ class Indexer extends EventEmitter { if (entry.height !== this.height + 1) throw new Error('Indexer: Can not add block.'); - const tip = BlockMeta.fromEntry(entry); + const tip = new BlockMeta(entry.hash, entry.height); // Start the batch write. this.start(); @@ -458,7 +454,7 @@ class Indexer extends EventEmitter { if (entry.height !== this.height) throw new Error('Indexer: Can not remove block.'); - const tip = BlockMeta.fromEntry(entry); + const tip = new BlockMeta(entry.hash, entry.height); // Start the batch write. this.start(); @@ -498,7 +494,7 @@ class Indexer extends EventEmitter { } // Add to batch write to save tip and height. - this.put(layout.h.encode(tip.height), tip.toHash()); + this.put(layout.h.encode(tip.height), tip.hash); const raw = bio.write(4).writeU32(tip.height).render(); this.put(layout.R.encode(), raw); @@ -544,9 +540,22 @@ class Indexer extends EventEmitter { } } +/** + * Block Meta + */ + +class BlockMeta { + constructor(hash, height) { + this.hash = hash || ZERO_HASH; + this.height = height || 0; + + assert(Buffer.isBuffer(this.hash) && this.hash.length === 32); + assert(Number.isInteger(this.height)); + } +} + /** * Index Options - * @alias module:indexer.IndexOptions */ class IndexOptions { diff --git a/lib/indexer/layout.js b/lib/indexer/layout.js index e2bc243c..3edbd9ed 100644 --- a/lib/indexer/layout.js +++ b/lib/indexer/layout.js @@ -9,12 +9,13 @@ const bdb = require('bdb'); /* - * Index Database Layout: - * To be extended by indexer implementations + * Index database layout: + * To be extended by indexer implementations. + * * V -> db version * O -> flags - * h[height] -> recent block hash - * R -> chain sync state + * h[height] -> block hash + * R -> index sync height */ const layout = { diff --git a/lib/indexer/records.js b/lib/indexer/records.js deleted file mode 100644 index 7db64b94..00000000 --- a/lib/indexer/records.js +++ /dev/null @@ -1,152 +0,0 @@ -/*! - * records.js - indexer records - * Copyright (c) 2018, the bcoin developers (MIT License). - * https://github.com/bcoin-org/bcoin - */ - -'use strict'; - -/** - * @module lib/records - */ - -const bio = require('bufio'); -const util = require('../utils/util'); -const consensus = require('../protocol/consensus'); - -/** - * Block Meta - * @alias module:indexer.BlockMeta - */ - -class BlockMeta { - /** - * Create block meta. - * @constructor - * @param {Hash} hash - * @param {Number} height - */ - - constructor(hash, height) { - this.hash = hash || consensus.NULL_HASH; - this.height = height != null ? height : -1; - } - - /** - * Clone the block. - * @returns {BlockMeta} - */ - - clone() { - return new this.constructor(this.hash, this.height); - } - - /** - * Get block meta hash as a buffer. - * @returns {Buffer} - */ - - toHash() { - return Buffer.from(this.hash, 'hex'); - } - - /** - * Instantiate block meta from chain entry. - * @private - * @param {IndexEntry} entry - */ - - fromEntry(entry) { - this.hash = entry.hash; - this.height = entry.height; - return this; - } - - /** - * Instantiate block meta from json object. - * @private - * @param {Object} json - */ - - fromJSON(json) { - this.hash = util.revHex(json.hash); - this.height = json.height; - return this; - } - - /** - * Instantiate block meta from serialized tip data. - * @private - * @param {Buffer} data - */ - - fromRaw(data) { - const br = bio.read(data); - this.hash = br.readHash('hex'); - this.height = br.readI32(); - return this; - } - - /** - * Instantiate block meta from chain entry. - * @param {IndexEntry} entry - * @returns {BlockMeta} - */ - - static fromEntry(entry) { - return new this().fromEntry(entry); - } - - /** - * Instantiate block meta from json object. - * @param {Object} json - * @returns {BlockMeta} - */ - - static fromJSON(json) { - return new this().fromJSON(json); - } - - /** - * Instantiate block meta from serialized data. - * @param {Hash} hash - * @param {Buffer} data - * @returns {BlockMeta} - */ - - static fromRaw(data) { - return new this().fromRaw(data); - } - - /** - * Serialize the block meta. - * @returns {Buffer} - */ - - toRaw() { - const bw = bio.write(36); - bw.writeHash(this.hash); - bw.writeI32(this.height); - return bw.render(); - } - - /** - * Convert the block meta to a more json-friendly object. - * @returns {Object} - */ - - toJSON() { - return { - hash: util.revHex(this.hash), - height: this.height - }; - } -} - -/* - * Expose - */ - -exports.BlockMeta = BlockMeta; - -module.exports = exports;