chain: rename constants and update types.

This commit is contained in:
Nodari Chkuaselidze 2025-02-06 14:35:37 +04:00
parent 0da3a98a5f
commit 3f83d575ee
No known key found for this signature in database
GPG key ID: B018A7BB437D1F05
12 changed files with 301 additions and 224 deletions

View file

@ -36,6 +36,17 @@ const {
VERIFY_COVENANTS_LOCKUP
} = rules.nameFlags;
/** @typedef {import('../types').Hash} Hash */
/** @typedef {import('../types').LockFlags} LockFlags */
/** @typedef {import('@handshake-org/bfilter').BloomFilter} BloomFilter */
/** @typedef {import('../primitives/block')} Block */
/** @typedef {import('../primitives/tx')} TX */
/** @typedef {import('../primitives/txmeta')} TXMeta */
/** @typedef {import('../primitives/outpoint')} Outpoint */
/** @typedef {import('../primitives/coin')} Coin */
/** @typedef {import('../primitives/address')} Address */
/** @typedef {import('../coins/coinentry')} CoinEntry */
/**
* Blockchain
* @alias module:blockchain.Chain
@ -78,7 +89,7 @@ class Chain extends AsyncEmitter {
/**
* Open the chain, wait for the database to load.
* @returns {Promise}
* @returns {Promise<void>}
*/
async open() {
@ -123,7 +134,7 @@ class Chain extends AsyncEmitter {
/**
* Close the chain, wait for the database to close.
* @returns {Promise}
* @returns {Promise<void>}
*/
async close() {
@ -243,7 +254,7 @@ class Chain extends AsyncEmitter {
* @param {Block} block
* @param {ChainEntry} prev
* @param {Number} flags
* @returns {Promise} - Returns {@link ContextResult}.
* @returns {Promise<Array>} - [CoinView, DeploymentState]
*/
async verifyContext(block, prev, flags) {
@ -272,7 +283,7 @@ class Chain extends AsyncEmitter {
* Perform all necessary contextual verification
* on a block, without POW check.
* @param {Block} block
* @returns {Promise}
* @returns {Promise<Array>} - [CoinView, DeploymentState]
*/
async verifyBlock(block) {
@ -289,18 +300,18 @@ class Chain extends AsyncEmitter {
* on a block, without POW check (no lock).
* @private
* @param {Block} block
* @returns {Promise}
* @returns {Promise<Array>} - [CoinView, DeploymentState]
*/
async _verifyBlock(block) {
const flags = common.flags.DEFAULT_FLAGS & ~common.flags.VERIFY_POW;
const flags = common.DEFAULT_FLAGS & ~common.flags.VERIFY_POW;
return this.verifyContext(block, this.tip, flags);
}
/**
* Test whether the hash is in the main chain.
* @param {Hash} hash
* @returns {Promise} - Returns Boolean.
* @returns {Promise<Boolean>}
*/
isMainHash(hash) {
@ -310,7 +321,7 @@ class Chain extends AsyncEmitter {
/**
* Test whether the entry is in the main chain.
* @param {ChainEntry} entry
* @returns {Promise} - Returns Boolean.
* @returns {Promise<Boolean>}
*/
isMainChain(entry) {
@ -321,7 +332,7 @@ class Chain extends AsyncEmitter {
* Get ancestor by `height`.
* @param {ChainEntry} entry
* @param {Number} height
* @returns {Promise} - Returns ChainEntry.
* @returns {Promise<ChainEntry?>}
*/
getAncestor(entry, height) {
@ -331,7 +342,7 @@ class Chain extends AsyncEmitter {
/**
* Get previous entry.
* @param {ChainEntry} entry
* @returns {Promise} - Returns ChainEntry.
* @returns {Promise<ChainEntry?>}
*/
getPrevious(entry) {
@ -341,7 +352,7 @@ class Chain extends AsyncEmitter {
/**
* Get previous cached entry.
* @param {ChainEntry} entry
* @returns {ChainEntry|null}
* @returns {ChainEntry?}
*/
getPrevCache(entry) {
@ -351,7 +362,7 @@ class Chain extends AsyncEmitter {
/**
* Get next entry.
* @param {ChainEntry} entry
* @returns {Promise} - Returns ChainEntry.
* @returns {Promise<ChainEntry?>}
*/
getNext(entry) {
@ -361,7 +372,7 @@ class Chain extends AsyncEmitter {
/**
* Get next entry.
* @param {ChainEntry} entry
* @returns {Promise} - Returns ChainEntry.
* @returns {Promise<ChainEntry?>}
*/
getNextEntry(entry) {
@ -434,7 +445,7 @@ class Chain extends AsyncEmitter {
* @param {Block} block
* @param {ChainEntry} prev
* @param {Number} flags
* @returns {Promise} - Returns {@link DeploymentState}.
* @returns {Promise<DeploymentState>}
*/
async verify(block, prev, flags) {
@ -713,7 +724,7 @@ class Chain extends AsyncEmitter {
* Check all deployments on a chain.
* @param {Number} time
* @param {ChainEntry} prev
* @returns {Promise} - Returns {@link DeploymentState}.
* @returns {Promise<DeploymentState>}
*/
async getDeployments(time, prev) {
@ -759,7 +770,8 @@ class Chain extends AsyncEmitter {
* @private
* @param {Block} block
* @param {ChainEntry} prev
* @returns {Promise} - Returns {@link CoinView}.
* @param {DeploymentState} state
* @returns {Promise<CoinView>}
*/
async updateInputs(block, prev, state) {
@ -801,7 +813,7 @@ class Chain extends AsyncEmitter {
* @param {Block} block
* @param {ChainEntry} prev
* @param {DeploymentState} state
* @returns {Promise} - Returns {@link CoinView}.
* @returns {Promise<CoinView>}
*/
async verifyInputs(block, prev, state) {
@ -923,7 +935,7 @@ class Chain extends AsyncEmitter {
/**
* Get main chain height for hash.
* @param {Hash} hash
* @returns {Number}
* @returns {Promise<Number>}
*/
async getMainHeight(hash) {
@ -989,7 +1001,7 @@ class Chain extends AsyncEmitter {
* @param {TX} tx
* @param {CoinView} view
* @param {Number} height
* @param {NameFlags} nameFlags
* @param {Number} nameFlags
*/
async verifyCovenants(tx, view, height, nameFlags) {
@ -1571,7 +1583,7 @@ class Chain extends AsyncEmitter {
* @private
* @param {ChainEntry} fork - The current chain.
* @param {ChainEntry} longer - The competing chain.
* @returns {Promise}
* @returns {Promise<ChainEntry>}
*/
async findFork(fork, longer) {
@ -1600,7 +1612,7 @@ class Chain extends AsyncEmitter {
* is received.
* @private
* @param {ChainEntry} competitor - The competing chain's tip.
* @returns {Promise}
* @returns {Promise<ChainEntry>} - Fork block.
*/
async reorganize(competitor) {
@ -1749,7 +1761,7 @@ class Chain extends AsyncEmitter {
// to the fork block, causing
// us to redownload the blocks
// on the new main chain.
await this._reset(fork.hash);
await this._reset(fork.hash, false);
// Emit disconnection events now that
// the chain has successfully reset.
@ -1808,7 +1820,6 @@ class Chain extends AsyncEmitter {
* (necessary because we cannot validate the inputs
* in alternate chains when they come in).
* @param {ChainEntry} entry
* @param {Number} flags
* @returns {Promise}
*/
@ -2044,10 +2055,11 @@ class Chain extends AsyncEmitter {
* Reset the chain to the desired block without a lock.
* @private
* @param {Hash|Number} block
* @param {Boolean} silent - don't emit reset.
* @returns {Promise}
*/
async _reset(block, silent) {
async _reset(block, silent = false) {
const tip = await this.db.reset(block);
// Reset state.
@ -2092,7 +2104,7 @@ class Chain extends AsyncEmitter {
* Reset the chain without a lock.
* @private
* @param {Hash|Number} block - hash/height
* @param {Boolean?} silent
* @param {Boolean} silent
* @returns {Promise}
*/
@ -2141,7 +2153,7 @@ class Chain extends AsyncEmitter {
/**
* Retroactively prune the database.
* @returns {Promise}
* @returns {Promise<Boolean>}
*/
async prune() {
@ -2252,9 +2264,9 @@ class Chain extends AsyncEmitter {
/**
* Scan the blockchain for transactions containing specified address hashes.
* @param {Hash|Number} start - Block hash or height to start at.
* @param {Bloom} filter - Bloom filter containing tx and address hashes.
* @param {BloomFilter} filter - Bloomfilter containing tx and address hashes.
* @param {Function} iter - Iterator.
* @returns {Promise}
* @returns {Promise<void>}
*/
async scan(start, filter, iter) {
@ -2283,7 +2295,7 @@ class Chain extends AsyncEmitter {
* address and name hashes.
* @param {ScanInteractiveIterCB} iter - Iterator.
* @param {Boolean} [fullLock=false]
* @returns {Promise}
* @returns {Promise<void>}
*/
async scanInteractive(start, filter, iter, fullLock = false) {
@ -2311,7 +2323,7 @@ class Chain extends AsyncEmitter {
* address and name hashes.
* @param {ScanInteractiveIterCB} iter - Iterator.
* @param {Boolean} [lockPerScan=true] - if we should lock per block scan.
* @returns {Promise}
* @returns {Promise<void>}
*/
async _scanInteractive(start, filter, iter, lockPerScan = true) {
@ -2386,7 +2398,7 @@ class Chain extends AsyncEmitter {
* @param {Block} block
* @param {Number?} flags
* @param {Number?} id
* @returns {Promise}
* @returns {Promise<ChainEntry?>}
*/
async add(block, flags, id) {
@ -2405,14 +2417,14 @@ class Chain extends AsyncEmitter {
* @param {Block} block
* @param {Number?} flags
* @param {Number?} id
* @returns {Promise}
* @returns {Promise<ChainEntry?>}
*/
async _add(block, flags, id) {
const hash = block.hash();
if (flags == null)
flags = common.flags.DEFAULT_FLAGS;
flags = common.DEFAULT_FLAGS;
if (id == null)
id = -1;
@ -2480,7 +2492,7 @@ class Chain extends AsyncEmitter {
* @param {ChainEntry} prev
* @param {Block} block
* @param {Number} flags
* @returns {Promise}
* @returns {Promise<ChainEntry?>}
*/
async connect(prev, block, flags) {
@ -2916,7 +2928,7 @@ class Chain extends AsyncEmitter {
/**
* Retrieve a chain entry by height.
* @param {Number} height
* @returns {Promise} - Returns {@link ChainEntry}.
* @returns {Promise<ChainEntry?>}
*/
getEntryByHeight(height) {
@ -2926,7 +2938,7 @@ class Chain extends AsyncEmitter {
/**
* Retrieve a chain entry by hash.
* @param {Hash} hash
* @returns {Promise} - Returns {@link ChainEntry}.
* @returns {Promise<ChainEntry?>}
*/
getEntryByHash(hash) {
@ -2937,7 +2949,7 @@ class Chain extends AsyncEmitter {
* Get the hash of a block by height. Note that this
* will only return hashes in the main chain.
* @param {Number} height
* @returns {Promise} - Returns {@link Hash}.
* @returns {Promise<Hash>}
*/
getHash(height) {
@ -2947,7 +2959,7 @@ class Chain extends AsyncEmitter {
/**
* Get the height of a block by hash.
* @param {Hash} hash
* @returns {Promise} - Returns Number.
* @returns {Promise<Number>}
*/
getHeight(hash) {
@ -2957,7 +2969,7 @@ class Chain extends AsyncEmitter {
/**
* Test the chain to see if it contains a block.
* @param {Hash} hash
* @returns {Promise} - Returns Boolean.
* @returns {Promise<Boolean>}
*/
hasEntry(hash) {
@ -2967,7 +2979,7 @@ class Chain extends AsyncEmitter {
/**
* Get the _next_ block hash (does not work by height).
* @param {Hash} hash
* @returns {Promise} - Returns {@link Hash}.
* @returns {Promise<Hash>}
*/
getNextHash(hash) {
@ -2977,7 +2989,7 @@ class Chain extends AsyncEmitter {
/**
* Check whether coins are still unspent.
* @param {TX} tx
* @returns {Promise} - Returns Boolean.
* @returns {Promise<Boolean>}
*/
hasCoins(tx) {
@ -2986,7 +2998,7 @@ class Chain extends AsyncEmitter {
/**
* Get all tip hashes.
* @returns {Promise} - Returns {@link Hash}[].
* @returns {Promise<Hash[]>}
*/
getTips() {
@ -3017,9 +3029,8 @@ class Chain extends AsyncEmitter {
/**
* Get a coin (unspents only).
* @private
* @param {Outpoint} prevout
* @returns {Promise} - Returns {@link CoinEntry}.
* @returns {Promise<CoinEntry?>}
*/
readCoin(prevout) {
@ -3030,7 +3041,7 @@ class Chain extends AsyncEmitter {
* Get a coin (unspents only).
* @param {Hash} hash
* @param {Number} index
* @returns {Promise} - Returns {@link Coin}.
* @returns {Promise<Coin?>}
*/
getCoin(hash, index) {
@ -3040,7 +3051,7 @@ class Chain extends AsyncEmitter {
/**
* Retrieve a block from the database (not filled with coins).
* @param {Hash} hash
* @returns {Promise} - Returns {@link Block}.
* @returns {Promise<Block?>}
*/
getBlock(hash) {
@ -3049,18 +3060,18 @@ class Chain extends AsyncEmitter {
/**
* Retrieve a block from the database (not filled with coins).
* @param {Hash} hash
* @returns {Promise} - Returns {@link Block}.
* @param {Hash|Number} hashHeight
* @returns {Promise<Buffer|null>}
*/
getRawBlock(block) {
return this.db.getRawBlock(block);
getRawBlock(hashHeight) {
return this.db.getRawBlock(hashHeight);
}
/**
* Get a historical block coin viewpoint.
* @param {Block} hash
* @returns {Promise} - Returns {@link CoinView}.
* @param {Block} block
* @returns {Promise<CoinView>}
*/
getBlockView(block) {
@ -3070,7 +3081,7 @@ class Chain extends AsyncEmitter {
/**
* Get a transaction with metadata.
* @param {Hash} hash
* @returns {Promise} - Returns {@link TXMeta}.
* @returns {Promise<TXMeta>}
*/
getMeta(hash) {
@ -3080,7 +3091,7 @@ class Chain extends AsyncEmitter {
/**
* Retrieve a transaction.
* @param {Hash} hash
* @returns {Promise} - Returns {@link TX}.
* @returns {Promise<TX>}
*/
getTX(hash) {
@ -3089,7 +3100,7 @@ class Chain extends AsyncEmitter {
/**
* @param {Hash} hash
* @returns {Promise} - Returns Boolean.
* @returns {Promise<Boolean>}
*/
hasTX(hash) {
@ -3099,7 +3110,7 @@ class Chain extends AsyncEmitter {
/**
* Get all coins pertinent to an address.
* @param {Address[]} addrs
* @returns {Promise} - Returns {@link Coin}[].
* @returns {Promise<Coin[]>}
*/
getCoinsByAddress(addrs) {
@ -3109,7 +3120,7 @@ class Chain extends AsyncEmitter {
/**
* Get all transaction hashes to an address.
* @param {Address[]} addrs
* @returns {Promise} - Returns {@link Hash}[].
* @returns {Promise<Hash[]>}
*/
getHashesByAddress(addrs) {
@ -3119,7 +3130,7 @@ class Chain extends AsyncEmitter {
/**
* Get all transactions pertinent to an address.
* @param {Address[]} addrs
* @returns {Promise} - Returns {@link TX}[].
* @returns {Promise<TX[]>}
*/
getTXByAddress(addrs) {
@ -3129,7 +3140,7 @@ class Chain extends AsyncEmitter {
/**
* Get all transactions pertinent to an address.
* @param {Address[]} addrs
* @returns {Promise} - Returns {@link TXMeta}[].
* @returns {Promise<TXMeta[]>}
*/
getMetaByAddress(addrs) {
@ -3139,7 +3150,7 @@ class Chain extends AsyncEmitter {
/**
* Get an orphan block.
* @param {Hash} hash
* @returns {Block}
* @returns {Block?}
*/
getOrphan(hash) {
@ -3149,7 +3160,7 @@ class Chain extends AsyncEmitter {
/**
* Test the chain to see if it contains an orphan.
* @param {Hash} hash
* @returns {Promise} - Returns Boolean.
* @returns {Boolean}
*/
hasOrphan(hash) {
@ -3159,7 +3170,7 @@ class Chain extends AsyncEmitter {
/**
* Test the chain to see if it contains a pending block in its queue.
* @param {Hash} hash
* @returns {Promise} - Returns Boolean.
* @returns {Boolean} - Returns Boolean.
*/
hasPending(hash) {
@ -3169,7 +3180,7 @@ class Chain extends AsyncEmitter {
/**
* Get coin viewpoint.
* @param {TX} tx
* @returns {Promise} - Returns {@link CoinView}.
* @returns {Promise<CoinView>}
*/
getCoinView(tx) {
@ -3179,7 +3190,7 @@ class Chain extends AsyncEmitter {
/**
* Get coin viewpoint (spent).
* @param {TX} tx
* @returns {Promise} - Returns {@link CoinView}.
* @returns {Promise<CoinView>}
*/
async getSpentView(tx) {
@ -3252,7 +3263,7 @@ class Chain extends AsyncEmitter {
* @param {Hash?} start - Height or hash to treat as the tip.
* The current tip will be used if not present. Note that this can be a
* non-existent hash, which is useful for headers-first locators.
* @returns {Promise} - Returns {@link Hash}[].
* @returns {Promise<Hash[]>}
*/
async getLocator(start) {
@ -3268,7 +3279,7 @@ class Chain extends AsyncEmitter {
* Calculate chain locator without a lock.
* @private
* @param {Hash?} start
* @returns {Promise}
* @returns {Promise<Hash[]>}
*/
async _getLocator(start) {
@ -3386,7 +3397,7 @@ class Chain extends AsyncEmitter {
/**
* Get median block by timestamp.
* @param {ChainEntry} prev
* @returns {Promise}
* @returns {Promise<ChainEntry>}
*/
async getSuitableBlock(prev) {
@ -3414,7 +3425,7 @@ class Chain extends AsyncEmitter {
* Calculate the next target.
* @param {Number} time - Next block timestamp.
* @param {ChainEntry} prev - Previous entry.
* @returns {Promise} - returns Number
* @returns {Promise<Number>} - returns Number
* (target is in compact/mantissa form).
*/
@ -3511,8 +3522,7 @@ class Chain extends AsyncEmitter {
/**
* Find a locator. Analagous to bitcoind's `FindForkInGlobalIndex()`.
* @param {Hash[]} locator - Hashes.
* @returns {Promise} - Returns {@link Hash} (the
* hash of the latest known block).
* @returns {Promise<Hash>} (the hash of the latest known block).
*/
async findLocator(locator) {
@ -3531,7 +3541,7 @@ class Chain extends AsyncEmitter {
* @see https://github.com/bitcoin/bips/blob/master/bip-0009.mediawiki
* @param {ChainEntry} prev - Previous chain entry.
* @param {Object} deployment - Deployment.
* @returns {Promise} - Returns Number.
* @returns {Promise<Boolean>}
*/
async isActive(prev, deployment) {
@ -3546,7 +3556,7 @@ class Chain extends AsyncEmitter {
* @see https://github.com/bitcoin/bips/blob/master/bip-0009.mediawiki
* @param {ChainEntry} prev - Previous chain entry.
* @param {Object} deployment - Deployment.
* @returns {Promise} - Returns Number.
* @returns {Promise<Number>}
*/
async getState(prev, deployment) {
@ -3669,8 +3679,8 @@ class Chain extends AsyncEmitter {
/**
* Get signalling statistics for BIP9/versionbits soft fork
* @param {ChainEntry} prev - Previous chain entry.
* @param {Obejct} deployment - Deployment.
* @returns {Promise} - Returns JSON object.
* @param {Object} deployment - Deployment.
* @returns {Promise<Object>}
*/
async getBIP9Stats(prev, deployment) {
@ -3714,7 +3724,7 @@ class Chain extends AsyncEmitter {
* Compute the version for a new block (BIP9: versionbits).
* @see https://github.com/bitcoin/bips/blob/master/bip-0009.mediawiki
* @param {ChainEntry} prev - Previous chain entry (usually the tip).
* @returns {Promise} - Returns Number.
* @returns {Promise<Number>}
*/
async computeBlockVersion(prev) {
@ -3737,7 +3747,7 @@ class Chain extends AsyncEmitter {
/**
* Get the current deployment state of the chain. Called on load.
* @private
* @returns {Promise} - Returns {@link DeploymentState}.
* @returns {Promise<DeploymentState>}
*/
async getDeploymentState() {
@ -3747,7 +3757,8 @@ class Chain extends AsyncEmitter {
/**
* Get deployment state.
* @private
* @returns {Promise} - Returns {@link DeploymentState}.
* @param {ChainEntry} tip
* @returns {Promise<DeploymentState>}
*/
async readDeploymentState(tip) {
@ -3766,8 +3777,7 @@ class Chain extends AsyncEmitter {
/**
* Get the next deployment state of the chain.
* @private
* @returns {Promise} - Returns {@link DeploymentState}.
* @returns {Promise<DeploymentState>}
*/
async getNextState() {
@ -3876,7 +3886,7 @@ class Chain extends AsyncEmitter {
/**
* Get safe tree root.
* @returns {Hash}
* @returns {Promise<Hash>}
*/
async getSafeRoot() {
@ -4096,14 +4106,15 @@ class ChainOptions {
class DeploymentState {
/**
* Create a deployment state.
* @param {Hash} tip
* @constructor
*/
constructor(tip) {
this.tip = tip;
this.flags = Script.flags.MANDATORY_VERIFY_FLAGS;
this.lockFlags = common.lockFlags.MANDATORY_LOCKTIME_FLAGS;
this.nameFlags = rules.nameFlags.MANDATORY_VERIFY_COVENANT_FLAGS;
this.lockFlags = common.MANDATORY_LOCKTIME_FLAGS;
this.nameFlags = rules.MANDATORY_VERIFY_COVENANT_FLAGS;
}
hasHardening() {
@ -4146,4 +4157,6 @@ function cmp(a, b) {
* Expose
*/
Chain.ChainOptions = ChainOptions;
module.exports = Chain;

View file

@ -37,6 +37,14 @@ const {
ChainFlags
} = require('./records');
/** @typedef {import('urkel').Proof} Proof */
/** @typedef {ReturnType<bdb.DB['batch']>} Batch */
/** @typedef {import('@handshake-org/bfilter').BloomFilter} BloomFilter */
/** @typedef {import('../types').Hash} Hash */
/** @typedef {import('./chain').ChainOptions} ChainOptions */
/** @typedef {import('../primitives/tx')} TX */
/** @typedef {import('../primitives/coin')} Coin */
/**
* ChainDB
* @alias module:blockchain.ChainDB
@ -75,13 +83,15 @@ class ChainDB {
this.current = null;
this.blocksBatch = null;
/** @type {LRU<Buffer, ChainEntry>} */
this.cacheHash = new LRU(this.options.entryCache, null, BufferMap);
/** @type {LRU<Number, ChainEntry>} */
this.cacheHeight = new LRU(this.options.entryCache);
}
/**
* Open and wait for the database to load.
* @returns {Promise}
* @returns {Promise<void>}
*/
async open() {
@ -174,7 +184,7 @@ class ChainDB {
/**
* Initialize fresh database.
* @returns {Promise}
* @returns {Promise<void>}
*/
async _initialize() {
@ -202,8 +212,8 @@ class ChainDB {
/**
* Verify version
* @param {Number}
* @returns {Promise}
* @param {Number} version
* @returns {Promise<void>}
*/
async verifyVersion(version) {
@ -225,7 +235,7 @@ class ChainDB {
/**
* Close and wait for the database to close.
* @returns {Promise}
* @returns {Promise<void>}
*/
async close() {
@ -258,7 +268,7 @@ class ChainDB {
/**
* Put key and value to current batch.
* @param {String} key
* @param {Buffer} key
* @param {Buffer} value
*/
@ -269,7 +279,7 @@ class ChainDB {
/**
* Delete key from current batch.
* @param {String} key
* @param {Buffer} key
*/
del(key) {
@ -289,7 +299,6 @@ class ChainDB {
/**
* Drop current batch.
* @returns {Batch}
*/
drop() {
@ -318,7 +327,7 @@ class ChainDB {
/**
* Commit current batch.
* @returns {Promise}
* @returns {Promise<void>}
*/
async commit() {
@ -398,7 +407,7 @@ class ChainDB {
/**
* Get the height of a block by hash.
* @param {Hash} hash
* @returns {Promise} - Returns Number.
* @returns {Promise<Number>}
*/
async getHeight(hash) {
@ -420,14 +429,14 @@ class ChainDB {
if (!height)
return -1;
return height.readUInt32LE(0, true);
return height.readUInt32LE(0);
}
/**
* Get the hash of a block by height. Note that this
* will only return hashes in the main chain.
* @param {Number} height
* @returns {Promise} - Returns {@link Hash}.
* @param {Hash|Number} height
* @returns {Promise<Hash>}
*/
async getHash(height) {
@ -450,7 +459,7 @@ class ChainDB {
/**
* Retrieve a chain entry by height.
* @param {Number} height
* @returns {Promise} - Returns {@link ChainEntry}.
* @returns {Promise<ChainEntry?>}
*/
async getEntryByHeight(height) {
@ -487,7 +496,7 @@ class ChainDB {
/**
* Retrieve a chain entry by hash.
* @param {Hash} hash
* @returns {Promise} - Returns {@link ChainEntry}.
* @returns {Promise<ChainEntry?>}
*/
async getEntryByHash(hash) {
@ -506,6 +515,7 @@ class ChainDB {
if (!raw)
return null;
/** @type {ChainEntry} */
const entry = ChainEntry.decode(raw);
// There's no efficient way to check whether
@ -519,7 +529,7 @@ class ChainDB {
/**
* Retrieve a chain entry.
* @param {Number|Hash} block - Height or hash.
* @returns {Promise} - Returns {@link ChainEntry}.
* @returns {Promise<ChainEntry?>}
*/
getEntry(block) {
@ -531,7 +541,7 @@ class ChainDB {
/**
* Test whether the chain contains a block.
* @param {Hash} hash
* @returns {Promise} - Returns Boolean.
* @returns {Promise<Boolean>}
*/
async hasEntry(hash) {
@ -543,7 +553,7 @@ class ChainDB {
* Get ancestor by `height`.
* @param {ChainEntry} entry
* @param {Number} height
* @returns {Promise} - Returns ChainEntry.
* @returns {Promise<ChainEntry?>}
*/
async getAncestor(entry, height) {
@ -573,7 +583,7 @@ class ChainDB {
/**
* Get previous entry.
* @param {ChainEntry} entry
* @returns {Promise} - Returns ChainEntry.
* @returns {Promise<ChainEntry?>}
*/
getPrevious(entry) {
@ -583,7 +593,7 @@ class ChainDB {
/**
* Get previous cached entry.
* @param {ChainEntry} entry
* @returns {ChainEntry|null}
* @returns {ChainEntry?}
*/
getPrevCache(entry) {
@ -593,7 +603,7 @@ class ChainDB {
/**
* Get next entry.
* @param {ChainEntry} entry
* @returns {Promise} - Returns ChainEntry.
* @returns {Promise<ChainEntry?>}
*/
async getNext(entry) {
@ -608,7 +618,7 @@ class ChainDB {
/**
* Get next entry.
* @param {ChainEntry} entry
* @returns {Promise} - Returns ChainEntry.
* @returns {Promise<ChainEntry?>}
*/
async getNextEntry(entry) {
@ -628,7 +638,7 @@ class ChainDB {
* Lookup a name tree value.
* @param {Hash} root
* @param {Hash} key
* @returns {Buffer}
* @returns {Promise<Buffer>}
*/
async lookup(root, key) {
@ -643,7 +653,7 @@ class ChainDB {
* Create a name tree proof.
* @param {Hash} root
* @param {Hash} key
* @returns {Buffer[]} nodes
* @returns {Promise<Proof>} nodes
*/
async prove(root, key) {
@ -665,7 +675,7 @@ class ChainDB {
/**
* Retrieve the tip entry from the tip record.
* @returns {Promise} - Returns {@link ChainEntry}.
* @returns {Promise<ChainEntry?>}
*/
getTip() {
@ -674,7 +684,7 @@ class ChainDB {
/**
* Retrieve the tip entry from the tip record.
* @returns {Promise} - Returns {@link ChainState}.
* @returns {Promise<ChainState?>}
*/
async getState() {
@ -688,7 +698,7 @@ class ChainDB {
/**
* Retrieve tree state from the tree record.
* @returns {Promise<TreeState>}
* @returns {Promise<TreeState?>}
*/
async getTreeState() {
@ -702,7 +712,7 @@ class ChainDB {
/**
* Write genesis block to database.
* @returns {Promise}
* @returns {Promise<void>}
*/
async writeGenesis() {
@ -733,7 +743,7 @@ class ChainDB {
/**
* Retrieve the database flags.
* @returns {Promise} - Returns {@link ChainFlags}.
* @returns {Promise<ChainFlags?>}
*/
async getFlags() {
@ -747,7 +757,7 @@ class ChainDB {
/**
* Verify current options against db options.
* @returns {Promise}
* @returns {Promise<void>}
*/
async verifyFlags() {
@ -787,7 +797,7 @@ class ChainDB {
/**
* Get state caches.
* @returns {Promise} - Returns {@link StateCache}.
* @returns {Promise<StateCache>}
*/
async getStateCache() {
@ -795,8 +805,7 @@ class ChainDB {
const items = await this.db.range({
gte: layout.v.min(),
lte: layout.v.max(),
values: true
lte: layout.v.max()
});
for (const item of items) {
@ -810,7 +819,7 @@ class ChainDB {
/**
* Save deployment table.
* @returns {Promise}
* @returns {Promise<void>}
*/
saveDeployments() {
@ -821,7 +830,7 @@ class ChainDB {
/**
* Save deployment table.
* @returns {Promise}
* @param {Batch} b
*/
writeDeployments(b) {
@ -843,7 +852,7 @@ class ChainDB {
/**
* Check for outdated deployments.
* @private
* @returns {Promise}
* @returns {Promise<Number[]>}
*/
async checkDeployments() {
@ -879,7 +888,7 @@ class ChainDB {
/**
* Potentially invalidate state cache.
* @returns {Promise}
* @returns {Promise<Boolean>}
*/
async verifyDeployments() {
@ -916,7 +925,9 @@ class ChainDB {
/**
* Invalidate state cache.
* @private
* @returns {Promise}
* @param {Number} bit
* @param {Batch} b
* @returns {Promise<void>}
*/
async invalidateCache(bit, b) {
@ -931,7 +942,7 @@ class ChainDB {
/**
* Retroactively prune the database.
* @returns {Promise}
* @returns {Promise<Boolean>}
*/
async prune() {
@ -991,7 +1002,7 @@ class ChainDB {
* Removes all historical state and all data not
* linked directly to the provided root node hash.
* @param {ChainEntry} entry
* @returns {Promise}
* @returns {Promise<void>}
*/
async compactTree(entry) {
@ -1014,7 +1025,9 @@ class ChainDB {
const tmpTree = new Tree({
hash: blake2b,
bits: 256,
prefix: tmpDir
prefix: tmpDir,
cacheOnly: false,
initCacheSize: 0
});
// Make sure to remove the tmp directory first.
@ -1049,7 +1062,7 @@ class ChainDB {
/**
* Get the _next_ block hash (does not work by height).
* @param {Hash} hash
* @returns {Promise} - Returns {@link Hash}.
* @returns {Promise<Hash>}
*/
async getNextHash(hash) {
@ -1059,7 +1072,7 @@ class ChainDB {
/**
* Check to see if a block is on the main chain.
* @param {Hash} hash
* @returns {Promise} - Returns Boolean.
* @returns {Promise<Boolean>}
*/
async isMainHash(hash) {
@ -1091,7 +1104,7 @@ class ChainDB {
/**
* Test whether the entry is in the main chain.
* @param {ChainEntry} entry
* @returns {Promise} - Returns Boolean.
* @returns {Promise<Boolean>}
*/
async isMainChain(entry) {
@ -1161,7 +1174,7 @@ class ChainDB {
/**
* Get all tip hashes.
* @returns {Promise} - Returns {@link Hash}[].
* @returns {Promise<Hash[]>}
*/
async getTips() {
@ -1174,7 +1187,7 @@ class ChainDB {
/**
* Get bitfield.
* @returns {Promise<Buffer>}
* @returns {Promise<BitField>}
*/
async getField() {
@ -1189,7 +1202,7 @@ class ChainDB {
/**
* Get a coin (unspents only).
* @param {Outpoint} prevout
* @returns {Promise<CoinEntry>} - Returns {@link CoinEntry}.
* @returns {Promise<CoinEntry?>}
*/
async readCoin(prevout) {
@ -1210,7 +1223,7 @@ class ChainDB {
* Get a coin (unspents only).
* @param {Hash} hash
* @param {Number} index
* @returns {Promise} - Returns {@link Coin}.
* @returns {Promise<Coin?>}
*/
async getCoin(hash, index) {
@ -1227,7 +1240,7 @@ class ChainDB {
* Check whether coins are still unspent. Necessary for bip30.
* @see https://bitcointalk.org/index.php?topic=67738.0
* @param {TX} tx
* @returns {Promise} - Returns Boolean.
* @returns {Promise<Boolean>}
*/
async hasCoins(tx) {
@ -1242,7 +1255,7 @@ class ChainDB {
/**
* Get coin viewpoint.
* @param {TX} tx
* @returns {Promise} - Returns {@link CoinView}.
* @returns {Promise<CoinView>}
*/
async getCoinView(tx) {
@ -1261,7 +1274,7 @@ class ChainDB {
/**
* Get coin viewpoint (historical).
* @param {TX} tx
* @returns {Promise} - Returns {@link CoinView}.
* @returns {Promise<CoinView>}
*/
async getSpentView(tx) {
@ -1289,7 +1302,7 @@ class ChainDB {
/**
* Get coins necessary to be resurrected during a reorg.
* @param {Hash} hash
* @returns {Promise} - Returns {@link Coin}[].
* @returns {Promise<UndoCoins>}
*/
async getUndoCoins(hash) {
@ -1356,7 +1369,7 @@ class ChainDB {
/**
* Retrieve a block from the database (not filled with coins).
* @param {Hash} hash
* @returns {Promise} - Returns {@link Block}.
* @returns {Promise<Block?>}
*/
async getBlock(hash) {
@ -1370,15 +1383,15 @@ class ChainDB {
/**
* Retrieve a block from the database (not filled with coins).
* @param {Hash} hash
* @returns {Promise} - Returns {@link Block}.
* @param {Hash|Number} hashHeight
* @returns {Promise<Buffer?>}
*/
async getRawBlock(block) {
async getRawBlock(hashHeight) {
if (this.options.spv)
return null;
const hash = await this.getHash(block);
const hash = await this.getHash(hashHeight);
if (!hash)
return null;
@ -1388,8 +1401,8 @@ class ChainDB {
/**
* Get a historical block coin viewpoint.
* @param {Block} hash
* @returns {Promise} - Returns {@link CoinView}.
* @param {Block} block
* @returns {Promise<CoinView>}
*/
async getBlockView(block) {
@ -1417,7 +1430,7 @@ class ChainDB {
/**
* Get a transaction with metadata.
* @param {Hash} hash
* @returns {Promise} - Returns {@link TXMeta}.
* @returns {Promise<TXMeta?>}
*/
async getMeta(hash) {
@ -1435,7 +1448,7 @@ class ChainDB {
/**
* Retrieve a transaction.
* @param {Hash} hash
* @returns {Promise} - Returns {@link TX}.
* @returns {Promise<TX?>}
*/
async getTX(hash) {
@ -1449,7 +1462,7 @@ class ChainDB {
/**
* @param {Hash} hash
* @returns {Promise} - Returns Boolean.
* @returns {Promise<Boolean>}
*/
async hasTX(hash) {
@ -1462,7 +1475,7 @@ class ChainDB {
/**
* Get all coins pertinent to an address.
* @param {Address[]} addrs
* @returns {Promise} - Returns {@link Coin}[].
* @returns {Promise<Coin[]>}
*/
async getCoinsByAddress(addrs) {
@ -1502,7 +1515,7 @@ class ChainDB {
/**
* Get all transaction hashes to an address.
* @param {Address[]} addrs
* @returns {Promise} - Returns {@link Hash}[].
* @returns {Promise<Hash[]>}
*/
async getHashesByAddress(addrs) {
@ -1530,7 +1543,7 @@ class ChainDB {
/**
* Get all transactions pertinent to an address.
* @param {Address[]} addrs
* @returns {Promise} - Returns {@link TX}[].
* @returns {Promise<TX[]>}
*/
async getTXByAddress(addrs) {
@ -1546,7 +1559,7 @@ class ChainDB {
/**
* Get all transactions pertinent to an address.
* @param {Address[]} addrs
* @returns {Promise} - Returns {@link TXMeta}[].
* @returns {Promise<TXMeta[]>}
*/
async getMetaByAddress(addrs) {
@ -1570,10 +1583,10 @@ class ChainDB {
/**
* Scan the blockchain for transactions containing specified address hashes.
* @param {Hash} start - Block hash to start at.
* @param {Bloom} filter - Bloom filter containing tx and address hashes.
* @param {Hash|Number} start - Block hash or height to start at.
* @param {BloomFilter} filter - Bloomfilter containing tx and address hashes.
* @param {Function} iter - Iterator.
* @returns {Promise}
* @returns {Promise<void>}
*/
async scan(start, filter, iter) {
@ -1685,8 +1698,8 @@ class ChainDB {
* instead performed in {@link Chain#add}.
* @param {ChainEntry} entry
* @param {Block} block
* @param {CoinView?} view - Will not connect if null.
* @returns {Promise}
* @param {CoinView?} [view] - Will not connect if null.
* @returns {Promise<void>}
*/
async save(entry, block, view) {
@ -1705,8 +1718,8 @@ class ChainDB {
* @private
* @param {ChainEntry} entry
* @param {Block} block
* @param {CoinView?} view
* @returns {Promise}
* @param {CoinView?} [view]
* @returns {Promise<void>}
*/
async _save(entry, block, view) {
@ -1752,7 +1765,7 @@ class ChainDB {
* @param {ChainEntry} entry
* @param {Block} block
* @param {CoinView} view
* @returns {Promise}
* @returns {Promise<void>}
*/
async reconnect(entry, block, view) {
@ -1772,7 +1785,7 @@ class ChainDB {
* @param {ChainEntry} entry
* @param {Block} block
* @param {CoinView} view
* @returns {Promise}
* @returns {Promise<void>}
*/
async _reconnect(entry, block, view) {
@ -1804,7 +1817,7 @@ class ChainDB {
* Disconnect block from the chain.
* @param {ChainEntry} entry
* @param {Block} block
* @returns {Promise}
* @returns {Promise<CoinView>}
*/
async disconnect(entry, block) {
@ -1828,7 +1841,7 @@ class ChainDB {
* @private
* @param {ChainEntry} entry
* @param {Block} block
* @returns {Promise} - Returns {@link CoinView}.
* @returns {Promise<CoinView>}
*/
async _disconnect(entry, block) {
@ -1854,6 +1867,7 @@ class ChainDB {
/**
* Save state cache updates.
* @private
* @returns {void}
*/
saveUpdates() {
@ -1874,7 +1888,7 @@ class ChainDB {
* Reset the chain to a height or hash. Useful for replaying
* the blockchain download for SPV.
* @param {Hash|Number} block - hash/height
* @returns {Promise}
* @returns {Promise<ChainEntry?>}
*/
async reset(block) {
@ -1952,7 +1966,7 @@ class ChainDB {
/**
* Remove all alternate chains.
* @returns {Promise}
* @returns {Promise<void>}
*/
async removeChains() {
@ -1977,7 +1991,7 @@ class ChainDB {
* Remove an alternate chain.
* @private
* @param {Hash} hash - Alternate chain tip.
* @returns {Promise}
* @returns {Promise<void>}
*/
async _removeChain(hash) {
@ -2016,8 +2030,8 @@ class ChainDB {
* database and potentially connect the inputs.
* @param {ChainEntry} entry
* @param {Block} block
* @param {CoinView?} view
* @returns {Promise} - Returns {@link Block}.
* @param {CoinView?} [view]
* @returns {Promise<void>}
*/
async saveBlock(entry, block, view) {
@ -2039,7 +2053,7 @@ class ChainDB {
* Remove a block (not an entry) to the database.
* Disconnect inputs.
* @param {ChainEntry} entry
* @returns {Promise} - Returns {@link Block}.
* @returns {Promise<CoinView>}
*/
async removeBlock(entry) {
@ -2083,7 +2097,6 @@ class ChainDB {
/**
* Commit names to tree.
* @private
* @param {CoinView} view
* @param {ChainEntry} entry
* @param {Boolean} revert
@ -2106,6 +2119,7 @@ class ChainDB {
* @param {CoinView} view
* @param {ChainEntry} entry
* @param {Boolean} revert
* @returns {Promise<void>}
*/
async _saveNames(view, entry, revert) {
@ -2173,6 +2187,7 @@ class ChainDB {
* @private
* @param {CoinView} view
* @param {ChainEntry} entry
* @returns {Promise<void>}
*/
async disconnectNames(view, entry) {
@ -2198,7 +2213,7 @@ class ChainDB {
* @param {ChainEntry} entry
* @param {Block} block
* @param {CoinView} view
* @returns {Promise} - Returns {@link Block}.
* @returns {Promise<void>}
*/
async connectBlock(entry, block, view) {
@ -2275,7 +2290,7 @@ class ChainDB {
* Disconnect block inputs.
* @param {ChainEntry} entry
* @param {Block} block
* @returns {Promise} - Returns {@link CoinView}.
* @returns {Promise<CoinView>}
*/
async disconnectBlock(entry, block) {
@ -2365,7 +2380,7 @@ class ChainDB {
* add current block to the prune queue.
* @private
* @param {ChainEntry} entry
* @returns {Promise}
* @returns {Promise<void>}
*/
async pruneBlock(entry) {
@ -2391,7 +2406,7 @@ class ChainDB {
/**
* Save database options.
* @returns {Promise}
* @returns {Promise<void>}
*/
saveFlags() {
@ -2516,7 +2531,7 @@ class ChainDB {
function fromU32(num) {
const data = Buffer.allocUnsafe(4);
data.writeUInt32LE(num, 0, true);
data.writeUInt32LE(num, 0);
return data;
}

View file

@ -14,6 +14,11 @@ const Headers = require('../primitives/headers');
const InvItem = require('../primitives/invitem');
const util = require('../utils/util');
/** @typedef {import('../types').BufioWriter} BufioWriter */
/** @typedef {import('../protocol/network')} Network */
/** @typedef {import('../primitives/block')} Block */
/** @typedef {import('../primitives/merkleblock')} MerkleBlock */
/*
* Constants
*/
@ -69,8 +74,8 @@ class ChainEntry extends bio.Struct {
/**
* Inject properties from options.
* @private
* @param {Object} options
* @returns {this}
*/
fromOptions(options) {
@ -126,6 +131,7 @@ class ChainEntry extends bio.Struct {
/**
* Calculate the chainwork by
* adding proof to previous chainwork.
* @param {ChainEntry?} [prev] - Previous entry.
* @returns {BN} chainwork
*/
@ -169,9 +175,9 @@ class ChainEntry extends bio.Struct {
/**
* Inject properties from block.
* @private
* @param {Block|MerkleBlock} block
* @param {ChainEntry} prev - Previous entry.
* @param {ChainEntry?} [prev] - Previous entry.
* @returns {this}
*/
fromBlock(block, prev) {
@ -203,7 +209,8 @@ class ChainEntry extends bio.Struct {
/**
* Serialize the entry to internal database format.
* @returns {Buffer}
* @param {BufioWriter} bw
* @returns {BufioWriter}
*/
write(bw) {
@ -234,8 +241,7 @@ class ChainEntry extends bio.Struct {
/**
* Inject properties from serialized data.
* @private
* @param {Buffer} data
* @param {bio.BufferReader} br
*/
read(br) {
@ -291,8 +297,8 @@ class ChainEntry extends bio.Struct {
/**
* Inject properties from json object.
* @private
* @param {Object} json
* @returns {this}
*/
fromJSON(json) {
@ -355,7 +361,7 @@ class ChainEntry extends bio.Struct {
/**
* Instantiate chainentry from block.
* @param {Block|MerkleBlock} block
* @param {ChainEntry} prev - Previous entry.
* @param {ChainEntry?} [prev] - Previous entry.
* @returns {ChainEntry}
*/

View file

@ -6,6 +6,9 @@
'use strict';
/** @typedef {import('@handshake-org/bfilter').BloomFilter} BloomFilter */
/** @typedef {import('../types').LockFlags} LockFlags */
/**
* @module blockchain/common
*/
@ -23,7 +26,7 @@ exports.lockFlags = {};
* @default
*/
exports.lockFlags.MANDATORY_LOCKTIME_FLAGS = 0;
exports.MANDATORY_LOCKTIME_FLAGS = 0;
/**
* Standard locktime flags (used for mempool validation).
@ -31,8 +34,8 @@ exports.lockFlags.MANDATORY_LOCKTIME_FLAGS = 0;
* @default
*/
exports.lockFlags.STANDARD_LOCKTIME_FLAGS = 0
| exports.lockFlags.MANDATORY_LOCKTIME_FLAGS;
exports.STANDARD_LOCKTIME_FLAGS = 0
| exports.MANDATORY_LOCKTIME_FLAGS;
/**
* Threshold states for versionbits
@ -66,7 +69,7 @@ exports.flags = {
* @default
*/
exports.flags.DEFAULT_FLAGS = 0
exports.DEFAULT_FLAGS = 0
| exports.flags.VERIFY_POW
| exports.flags.VERIFY_BODY;

View file

@ -25,6 +25,8 @@ const {
} = require('../migrations/migrator');
/** @typedef {import('../types').Hash} Hash */
/** @typedef {ReturnType<bdb.DB['batch']>} Batch */
/** @typedef {import('../migrations/migrator').types} MigrationType */
/**
* Switch to new migrations layout.
@ -46,6 +48,10 @@ class MigrateMigrations extends AbstractMigration {
this.layout = MigrateMigrations.layout();
}
/**
* @returns {Promise<MigrationType>}
*/
async check() {
return types.MIGRATE;
}
@ -59,8 +65,8 @@ class MigrateMigrations extends AbstractMigration {
async migrate(b) {
this.logger.info('Migrating migrations..');
const oldLayout = this.layout.oldLayout.wdb;
const newLayout = this.layout.newLayout.wdb;
const oldLayout = this.layout.oldLayout;
const newLayout = this.layout.newLayout;
let nextMigration = 1;
const skipped = [];
@ -83,10 +89,17 @@ class MigrateMigrations extends AbstractMigration {
}
this.db.writeVersion(b, 2);
b.put(newLayout.M.encode(),
this.encodeMigrationState(nextMigration, skipped));
const rawState = this.encodeMigrationState(nextMigration, skipped);
b.put(newLayout.M.encode(), rawState);
}
/**
* @param {Number} nextMigration
* @param {Number[]} skipped
* @returns {Buffer}
*/
encodeMigrationState(nextMigration, skipped) {
let size = 4;
size += encoding.sizeVarint(nextMigration);
@ -116,14 +129,10 @@ class MigrateMigrations extends AbstractMigration {
static layout() {
return {
oldLayout: {
wdb: {
M: bdb.key('M', ['uint32'])
}
M: bdb.key('M', ['uint32'])
},
newLayout: {
wdb: {
M: bdb.key('M')
}
M: bdb.key('M')
}
};
}
@ -138,7 +147,7 @@ class MigrateChainState extends AbstractMigration {
/**
* Create migration chain state
* @constructor
* @param {ChainMigrator} options
* @param {ChainMigratorOptions} options
*/
constructor(options) {
@ -261,7 +270,7 @@ class MigrateChainState extends AbstractMigration {
/**
* Get Block (old layout)
* @param {Hash} hash
* @returns {Promise} - Block
* @returns {Promise<Block>}
*/
async getBlock(hash) {
@ -276,7 +285,7 @@ class MigrateChainState extends AbstractMigration {
/**
* Get block view (old layout)
* @param {Hash} hash
* @param {Block} block
* @returns {Promise} - UndoCoins
*/
@ -369,7 +378,6 @@ class MigrateBlockStore extends AbstractMigration {
/**
* Migrate blocks and undo blocks
* @param {Batch} b
* @returns {Promise}
*/
@ -480,7 +488,7 @@ class MigrateTreeState extends AbstractMigration {
/**
* Create tree state migrator
* @constructor
* @param {ChainMigrator} options
* @param {ChainMigratorOptions} options
*/
constructor(options) {
@ -498,6 +506,11 @@ class MigrateTreeState extends AbstractMigration {
return types.MIGRATE;
}
/**
* @param {Batch} b
* @returns {Promise}
*/
async migrate(b) {
if (this.options.spv) {
this.db.writeVersion(b, 3);
@ -672,13 +685,13 @@ class ChainMigratorOptions {
assert(typeof options.prune === 'boolean');
this.prune = options.prune;
}
return this;
}
}
exports = ChainMigrator;
// List of the migrations with ids
exports.migrations = {
ChainMigrator.migrations = {
0: MigrateMigrations,
1: MigrateChainState,
2: MigrateBlockStore,
@ -686,9 +699,9 @@ exports.migrations = {
};
// Expose migrations
exports.MigrateChainState = MigrateChainState;
exports.MigrateMigrations = MigrateMigrations;
exports.MigrateBlockStore = MigrateBlockStore;
exports.MigrateTreeState = MigrateTreeState;
ChainMigrator.MigrateChainState = MigrateChainState;
ChainMigrator.MigrateMigrations = MigrateMigrations;
ChainMigrator.MigrateBlockStore = MigrateBlockStore;
ChainMigrator.MigrateTreeState = MigrateTreeState;
module.exports = exports;
module.exports = ChainMigrator;

View file

@ -20,6 +20,7 @@ const rules = exports;
/** @typedef {import('../types').Amount} AmountValue */
/** @typedef {import('../types').Hash} Hash */
/** @typedef {import('../types').NameFlags} NameFlags */
/** @typedef {import('../protocol/network')} Network */
/** @typedef {import('../primitives/tx')} TX */
/** @typedef {import('../coins/coinview')} CoinView */
@ -130,11 +131,11 @@ rules.nameFlags = {
/**
* Standard verify flags for covenants.
* @const {NameFlags}
* @const {rules.NameFlags}
* @default
*/
rules.nameFlags.MANDATORY_VERIFY_COVENANT_FLAGS = 0;
rules.MANDATORY_VERIFY_COVENANT_FLAGS = 0;
/**
* Maximum covenant size.

View file

@ -448,7 +448,7 @@ class Mempool extends EventEmitter {
const state = await this.getNextState();
const mtp = await this.chain.getMedianTime(this.chain.tip);
const remove = [];
const lockFlags = common.lockFlags.STANDARD_LOCKTIME_FLAGS;
const lockFlags = common.STANDARD_LOCKTIME_FLAGS;
this.contracts.clear();
@ -1486,7 +1486,7 @@ class Mempool extends EventEmitter {
async insertTX(tx, id) {
assert(!tx.mutable, 'Cannot add mutable TX to mempool.');
const lockFlags = common.lockFlags.STANDARD_LOCKTIME_FLAGS;
const lockFlags = common.STANDARD_LOCKTIME_FLAGS;
const height = this.chain.height;
const hash = tx.hash();
@ -1604,7 +1604,7 @@ class Mempool extends EventEmitter {
const network = this.network;
const height = this.chain.height + 1;
const state = await this.getNextState();
const lockFlags = common.lockFlags.STANDARD_LOCKTIME_FLAGS;
const lockFlags = common.STANDARD_LOCKTIME_FLAGS;
const tx = entry.tx;
// Verify sequence locks.

View file

@ -5,6 +5,10 @@
'use strict';
/** @typedef {import('bdb').DB} DB */
/** @typedef {ReturnType<DB['batch']>} Batch */
/** @typedef {import('./migrator').types} MigrationType */
/**
* Abstract class for single migration.
* @alias module:migrations.AbstractMigration
@ -23,7 +27,7 @@ class AbstractMigration {
/**
* Check if the migration applies to the database
* @returns {Promise}
* @returns {Promise<MigrationType>}
*/
async check() {
@ -32,11 +36,11 @@ class AbstractMigration {
/**
* Run the actual migration
* @param {Batch} batch
* @param {Batch} b
* @returns {Promise}
*/
async migrate() {
async migrate(b) {
throw new Error('Abstract method.');
}

View file

@ -10,6 +10,8 @@ const Logger = require('blgr');
const bdb = require('bdb');
const MigrationState = require('../migrations/state');
/** @typedef {ReturnType<bdb.DB['batch']>} Batch */
/**
* This entry needs to be part of all dbs that support migrations.
* V -> DB Version
@ -29,6 +31,12 @@ const oldLayout = {
M: bdb.key('M', ['uint32'])
};
/**
* Migration types.
* @enum {Number}
* @default
*/
const types = {
MIGRATE: 0,
SKIP: 1,
@ -42,14 +50,24 @@ const types = {
class MigrationResult {
constructor() {
/** @type {Set<Number>} */
this.migrated = new Set();
/** @type {Set<Number>} */
this.skipped = new Set();
}
/**
* @param {Number} id
*/
skip(id) {
this.skipped.add(id);
}
/**
* @param {Number} id
*/
migrate(id) {
this.migrated.add(id);
}
@ -90,6 +108,7 @@ class Migrator {
/**
* Recheck options
* @param {Object} options
* @private
*/

View file

@ -8,6 +8,8 @@ const assert = require('bsert');
const bio = require('bufio');
const {encoding} = bio;
/** @typedef {import('../types').BufioWriter} BufioWriter */
/**
* State of database migrations.
* Because migration IDs are only increasing, we only need
@ -32,6 +34,7 @@ class MigrationState extends bio.Struct {
this.inProgress = false;
this.nextMigration = 0;
/** @type {Number[]} */
this.skipped = [];
}
@ -72,8 +75,8 @@ class MigrationState extends bio.Struct {
/**
* Serialize migration state.
* @param {BufferWriter} bw
* @returns {BufferWriter}
* @param {BufioWriter} bw
* @returns {BufioWriter}
*/
write(bw) {
@ -94,8 +97,8 @@ class MigrationState extends bio.Struct {
/**
* Deserialize migration state.
* @param {BufferReader}
* @returns {MigrationState}
* @param {bio.BufferReader} br
* @returns {this}
*/
read(br) {
@ -108,7 +111,7 @@ class MigrationState extends bio.Struct {
const skippedItems = br.readVarint();
for (let i = 0; i < skippedItems; i++)
this.skipped.push(br.readVarint(0));
this.skipped.push(br.readVarint());
return this;
}

View file

@ -2353,7 +2353,7 @@ class Pool extends EventEmitter {
*/
async handleBlock(peer, packet) {
const flags = chainCommon.flags.DEFAULT_FLAGS;
const flags = chainCommon.DEFAULT_FLAGS;
if (this.options.spv) {
this.logger.warning(
@ -4280,7 +4280,7 @@ class Pool extends EventEmitter {
/**
* Resolve a name at the "safe" Urkel Tree root.
* @param {Buffer} nameHash
* @returns {Buffer}
* @returns {Promise<Buffer>}
*/
async resolve(nameHash) {
@ -4292,7 +4292,7 @@ class Pool extends EventEmitter {
* Resolve a name given any Urkel Tree root.
* @param {Buffer} nameHash
* @param {Buffer} root
* @returns {Buffer}
* @returns {Promise<Buffer>}
*/
async resolveAtRoot(nameHash, root) {

View file

@ -388,7 +388,7 @@ describe('Chain', function() {
});
it('should fail to connect bad tx merkle root', async () => {
const flags = common.flags.DEFAULT_FLAGS & ~common.flags.VERIFY_POW;
const flags = common.DEFAULT_FLAGS & ~common.flags.VERIFY_POW;
const block = await cpu.mineBlock();
block.merkleRoot = Buffer.from(block.merkleRoot);
@ -614,7 +614,7 @@ describe('Chain', function() {
// We are going to modify blocks after mining,
// just to get UTXO for the next test.
// These blocks don't have to be strictly 100% valid.
const flags = common.flags.DEFAULT_FLAGS & ~common.flags.VERIFY_POW;
const flags = common.DEFAULT_FLAGS & ~common.flags.VERIFY_POW;
// Generate 80 blocks where each coinbase transaction
// has 10 outputs to the 100-sigop address.