indexer: simplify block meta and remove records

This commit is contained in:
Braydon Fuller 2019-04-17 17:18:07 -07:00
parent f30276bc27
commit fae647b9e9
No known key found for this signature in database
GPG Key ID: F24F232D108B3AD4
3 changed files with 24 additions and 166 deletions

View File

@ -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 {

View File

@ -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 = {

View File

@ -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;