/*!
* blockstore/abstract.js - abstract blockstore for hsd
* Copyright (c) 2019, Braydon Fuller (MIT License).
* Copyright (c) 2020, Mark Tyneway (MIT License).
* https://github.com/handshake-org/hsd
*/
'use strict';
const Logger = require('blgr');
/**
* Abstract Block Store
*
* @alias module:blockstore.AbstractBlockStore
* @abstract
*/
class AbstractBlockStore {
/**
* Create an abstract blockstore.
* @constructor
* @param {Object} [options]
*/
constructor(options) {
this.options = options || {};
if (this.options.logger != null)
this.logger = this.options.logger.context('blockstore');
else
this.logger = Logger.global.context('blockstore');
}
/**
* This method ensures that resources are available
* before opening.
* @returns {Promise}
*/
async ensure() {
throw new Error('Abstract method.');
}
/**
* This method opens any necessary resources and
* initializes the store to be ready to be queried.
* @returns {Promise}
*/
async open() {
throw new Error('Abstract method.');
}
/**
* This method closes resources and prepares
* the store to be closed.
* @returns {Promise}
*/
async close() {
throw new Error('Abstract method.');
}
/**
* This method stores merkle blocks including
* all the relevant transactions.
* @param {Buffer} hash
* @param {Buffer} data
* @returns {Promise}
*/
async writeMerkle(hash, data) {
throw new Error('Abstract method.');
}
/**
* This method stores block undo coin data.
* @param {Buffer} hash
* @param {Buffer} data
* @returns {Promise}
*/
async writeUndo(hash, data) {
throw new Error('Abstract method.');
}
/**
* This method stores block data.
* @param {Buffer} hash
* @param {Buffer} data
* @returns {Promise}
*/
async writeBlock(hash, data) {
throw new Error('Abstract method.');
}
/**
* This method reads merkle block data.
* @param {Buffer} hash
* @returns {Promise}
*/
async readMerkle(hash) {
throw new Error('Abstract method.');
}
/**
* This method will retrieve block undo coin data.
* @param {Buffer} hash
* @returns {Promise}
*/
async readUndo(hash) {
throw new Error('Abstract method.');
}
/**
* This method will retrieve block data. Smaller portions of
* the block can be read by using the offset and size arguments.
* @param {Buffer} hash
* @param {Number} offset
* @param {Number} size
* @returns {Promise}
*/
async readBlock(hash, offset, size) {
throw new Error('Abstract method.');
}
/**
* This will free resources for storing the merkle block data.
* @param {Buffer} hash
* @returns {Promise}
*/
async pruneMerkle(hash) {
throw new Error('Abstract method.');
}
/**
* This will free resources for storing the block undo coin data.
* @param {Buffer} hash
* @returns {Promise}
*/
async pruneUndo(hash) {
throw new Error('Abstract method.');
}
/**
* This will free resources for storing the block data.
* @param {Buffer} hash
* @returns {Promise}
*/
async pruneBlock(hash) {
throw new Error('Abstract method.');
}
/**
* This will check if merkle block data has been stored
* and is available.
* @param {Buffer} hash
* @returns {Promise}
*/
async hasMerkle(hash) {
throw new Error('Abstract method.');
}
/**
* This will check if a block undo coin data has been stored
* and is available.
* @param {Buffer} hash
* @returns {Promise}
*/
async hasUndo(hash) {
throw new Error('Abstract method.');
}
/**
* This will check if a block has been stored and is available.
* @param {Buffer} hash
* @returns {Promise}
*/
async hasBlock(hash) {
throw new Error('Abstract method.');
}
/**
* Create batch.
* @returns {AbstractBatch}
*/
batch() {
throw new Error('Abstract method.');
}
}
/**
* This class is just interface for file and level batches.
* @alias module:blockstore.AbstractBatch
* @abstract
*/
class AbstractBatch {
/**
* Create AbstractBatch.
* @constructor
*/
constructor() {
}
/**
* Write merkle block data to the batch.
* @param {Buffer} hash
* @param {Buffer} data
* @returns {this}
*/
writeMerkle(hash, data) {
throw new Error('Abstract method.');
}
/**
* Write undo coin data to the batch.
* @param {Buffer} hash
* @param {Buffer} data
* @returns {this}
*/
writeUndo(hash, data) {
throw new Error('Abstract method.');
}
/**
* Write block data to the batch.
* @param {Buffer} hash
* @param {Buffer} data
* @returns {this}
*/
writeBlock(hash, data) {
throw new Error('Abstract method.');
}
/**
* Remove merkle block data from the batch.
* @param {Buffer} hash
* @returns {this}
*/
pruneMerkle(hash) {
throw new Error('Abstract method.');
}
/**
* Remove undo data from the batch.
* @param {Buffer} hash
* @returns {this}
*/
pruneUndo(hash) {
throw new Error('Abstract method.');
}
/**
* Prune block data from the batch.
* @param {Buffer} hash
* @returns {this}
*/
pruneBlock(hash) {
throw new Error('Abstract method.');
}
/**
* Clear the batch.
* @returns {this}
*/
clear() {
throw new Error('Abstract method.');
}
/**
* Write change to the store.
* @returns {Promise}
*/
commit() {
throw new Error('Abstract method.');
}
}
/*
* Expose
*/
AbstractBlockStore.AbstractBatch = AbstractBatch;
module.exports = AbstractBlockStore;