From 830d723e213c2753c8f21d23f6939130b4220d4e Mon Sep 17 00:00:00 2001 From: Daniel Cousens Date: Tue, 30 Jan 2018 18:46:40 +1100 Subject: [PATCH] add MTP index, resolves #9 --- index.js | 6 ++++-- indexes/mediantime.js | 42 ++++++++++++++++++++++++++++++++++++++++++ rpc.js | 2 ++ 3 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 indexes/mediantime.js diff --git a/index.js b/index.js index e9c6f65..4b563ae 100644 --- a/index.js +++ b/index.js @@ -5,6 +5,7 @@ let parallel = require('run-parallel') let rpcUtil = require('./rpc') let FeeIndex = require('./indexes/fee') +let MtpIndex = require('./indexes/mediantime') let ScriptIndex = require('./indexes/script') let TxIndex = require('./indexes/tx') let TxinIndex = require('./indexes/txin') @@ -20,11 +21,12 @@ function Indexd (db, rpc) { this.emitter = new EventEmitter() // TODO: bind to this this.emitter.setMaxListeners(Infinity) this.indexes = { + fee: new FeeIndex(), + mtp: new MtpIndex(), script: new ScriptIndex(), tx: new TxIndex(), txin: new TxinIndex(), - txo: new TxoIndex(), - fee: new FeeIndex() + txo: new TxoIndex() } } diff --git a/indexes/mediantime.js b/indexes/mediantime.js new file mode 100644 index 0000000..dd43964 --- /dev/null +++ b/indexes/mediantime.js @@ -0,0 +1,42 @@ +let typeforce = require('typeforce') +let types = require('./types') +let vstruct = require('varstruct') + +let MTPPREFIX = 0x83 +let MTPTIP = types.tip(MTPPREFIX) +let MTP = { + keyType: typeforce.compile({ + medianTime: typeforce.UInt32, + height: typeforce.UInt32 + }), + key: vstruct([ + ['prefix', vstruct.Value(vstruct.UInt8, MTPPREFIX)], + ['medianTime', vstruct.UInt32BE], // big-endian for lexicographical sort + ['height', vstruct.UInt32LE] + ]), + valueType: typeforce.Null +} + +function MtpIndex () {} + +MtpIndex.prototype.tip = function (db, callback) { + db.get(MTPTIP, {}, callback) +} + +MtpIndex.prototype.connect = function (db, atomic, block, callback) { + let { height, medianTime } = block + + atomic.put(MTP, { medianTime, height }) + atomic.put(MTPTIP, {}, block) + callback() +} + +MtpIndex.prototype.disconnect = function (atomic, block) { + let { height, medianTime } = block + + atomic.del(MTP, { medianTime, height }) + atomic.put(MTPTIP, {}, { blockId: block.prevBlockId, height }) +} + +module.exports = MtpIndex +module.exports.TYPE = MTP diff --git a/rpc.js b/rpc.js index 05ae88d..5b2c5af 100644 --- a/rpc.js +++ b/rpc.js @@ -51,6 +51,8 @@ function block (rpc, blockId, done) { delete block.nextblockhash block.prevBlockId = block.previousblockhash delete block.prevblockhash + block.medianTime = block.mediantime + delete block.mediantime block.transactions = block.tx.map(t => augment(t)) delete block.tx