diff --git a/lib/chain/chain.js b/lib/chain/chain.js index bb2280f3..eaa77932 100644 --- a/lib/chain/chain.js +++ b/lib/chain/chain.js @@ -13,6 +13,7 @@ var constants = bcoin.constants; var utils = require('../utils/utils'); var assert = utils.assert; var VerifyError = bcoin.errors.VerifyError; +var VerifyResult = utils.VerifyResult; /** * Represents a blockchain. @@ -310,7 +311,7 @@ Chain.prototype.isGenesis = function isGenesis(block) { Chain.prototype.verify = function verify(block, prev, callback) { var self = this; - var ret = {}; + var ret = new VerifyResult(); var i, height, ts, tx, medianTime, commitmentHash; if (!block.verify(ret)) { @@ -663,7 +664,7 @@ Chain.prototype.checkInputs = function checkInputs(block, prev, state, callback) var height = prev.height + 1; var historical = prev.isHistorical(); var sigops = 0; - var ret = {}; + var ret = new VerifyResult(); if (this.options.spv) return callback(); @@ -1174,7 +1175,7 @@ Chain.prototype.isBusy = function isBusy() { Chain.prototype.add = function add(block, callback) { var self = this; - var ret = {}; + var ret; assert(this.loaded); @@ -1183,6 +1184,8 @@ Chain.prototype.add = function add(block, callback) { if (!callback) return; + ret = new VerifyResult(); + (function next(block, initial) { var hash = block.hash('hex'); var prevBlock = block.prevBlock; diff --git a/lib/mempool/mempool.js b/lib/mempool/mempool.js index 7d207065..e1be0818 100644 --- a/lib/mempool/mempool.js +++ b/lib/mempool/mempool.js @@ -21,6 +21,7 @@ var BufferWriter = require('../utils/writer'); var BufferReader = require('../utils/reader'); var random = require('../crypto/random'); var VerifyError = bcoin.errors.VerifyError; +var VerifyResult = utils.VerifyResult; /** * Represents a mempool. @@ -521,8 +522,7 @@ Mempool.prototype.addTX = function addTX(tx, callback) { var self = this; var lockFlags = constants.flags.STANDARD_LOCKTIME_FLAGS; var hash = tx.hash('hex'); - var ret = {}; - var entry; + var ret, entry; callback = this._lock(addTX, [tx, callback]); @@ -533,6 +533,8 @@ Mempool.prototype.addTX = function addTX(tx, callback) { assert(!tx.mutable, 'Cannot add mutable TX to mempool.'); + ret = new VerifyResult(); + if (tx.ts !== 0) { return callback(new VerifyError(tx, 'alreadyknown', @@ -799,7 +801,7 @@ Mempool.prototype.verify = function verify(entry, callback) { var flags = constants.flags.STANDARD_VERIFY_FLAGS; var mandatory = constants.flags.MANDATORY_VERIFY_FLAGS; var tx = entry.tx; - var ret = {}; + var ret = new VerifyResult(); var fee, modFee, now, size, rejectFee, minRelayFee, minRate, count; if (this.chain.state.hasWitness()) diff --git a/lib/net/pool.js b/lib/net/pool.js index 0405c385..2dbcac80 100644 --- a/lib/net/pool.js +++ b/lib/net/pool.js @@ -17,6 +17,7 @@ var constants = bcoin.constants; var VerifyError = bcoin.errors.VerifyError; var NetworkAddress = bcoin.packets.NetworkAddress; var InvItem = bcoin.invitem; +var VerifyResult = utils.VerifyResult; /** * A pool of peers for handling all network activity. @@ -733,8 +734,7 @@ Pool.prototype.stopSync = function stopSync() { Pool.prototype._handleHeaders = function _handleHeaders(headers, peer, callback) { var self = this; - var ret = {}; - var last; + var ret, last; callback = this._lock(_handleHeaders, [headers, peer, callback]); @@ -744,6 +744,8 @@ Pool.prototype._handleHeaders = function _handleHeaders(headers, peer, callback) if (!this.options.headers) return callback(); + ret = new VerifyResult(); + this.logger.debug( 'Received %s headers from peer (%s).', headers.length, diff --git a/lib/primitives/abstractblock.js b/lib/primitives/abstractblock.js index 46bd848b..38ac4a3f 100644 --- a/lib/primitives/abstractblock.js +++ b/lib/primitives/abstractblock.js @@ -12,6 +12,7 @@ var constants = bcoin.constants; var utils = bcoin.utils; var crypto = require('../crypto/crypto'); var assert = utils.assert; +var VerifyResult = utils.VerifyResult; /** * The class which all block-like objects inherit from. @@ -194,7 +195,7 @@ AbstractBlock.prototype.verify = function verify(ret) { AbstractBlock.prototype.verifyHeaders = function verifyHeaders(ret) { if (!ret) - ret = {}; + ret = new VerifyResult(); // Check proof of work if (!utils.testTarget(this.hash(), this.bits)) { diff --git a/lib/primitives/block.js b/lib/primitives/block.js index 4eb1994f..c8f12f97 100644 --- a/lib/primitives/block.js +++ b/lib/primitives/block.js @@ -13,6 +13,7 @@ var crypto = require('../crypto/crypto'); var assert = utils.assert; var constants = bcoin.constants; var AbstractBlock = bcoin.abstractblock; +var VerifyResult = utils.VerifyResult; /** * Represents a full block. @@ -389,7 +390,7 @@ Block.prototype._verify = function _verify(ret) { var i, tx, merkle; if (!ret) - ret = {}; + ret = new VerifyResult(); if (!this.verifyHeaders(ret)) return false; diff --git a/lib/primitives/merkleblock.js b/lib/primitives/merkleblock.js index 5f624855..2b0277c1 100644 --- a/lib/primitives/merkleblock.js +++ b/lib/primitives/merkleblock.js @@ -14,6 +14,7 @@ var assert = utils.assert; var constants = bcoin.constants; var DUMMY = new Buffer([0]); var AbstractBlock = bcoin.abstractblock; +var VerifyResult = utils.VerifyResult; /** * Represents a merkle (filtered) block. @@ -260,12 +261,7 @@ MerkleBlock.prototype.extractTree = function extractTree() { if (hashUsed !== hashes.length) return; - return { - root: root.toString('hex'), - matches: matches, - indexes: indexes, - map: map - }; + return new PartialTree(root, matches, indexes, map); }; /** @@ -279,7 +275,7 @@ MerkleBlock.prototype.extractTree = function extractTree() { MerkleBlock.prototype._verify = function _verify(ret) { if (!ret) - ret = {}; + ret = new VerifyResult(); if (!this.verifyHeaders(ret)) return false; @@ -621,6 +617,17 @@ MerkleBlock.isMerkleBlock = function isMerkleBlock(obj) { && typeof obj.verifyPartial === 'function'; }; +/* + * Helpers + */ + +function PartialTree(root, matches, indexes, map) { + this.root = root.toString('hex'); + this.matches = matches; + this.indexes = indexes; + this.map = map; +} + /* * Expose */ diff --git a/lib/primitives/tx.js b/lib/primitives/tx.js index 9b09e283..e7c432d9 100644 --- a/lib/primitives/tx.js +++ b/lib/primitives/tx.js @@ -15,6 +15,7 @@ var constants = bcoin.constants; var Script = bcoin.script; var Stack = bcoin.stack; var BufferWriter = require('../utils/writer'); +var VerifyResult = utils.VerifyResult; /** * A static transaction object. @@ -1149,7 +1150,7 @@ TX.prototype.isSane = function isSane(ret) { var i, input, output, size, key; if (!ret) - ret = {}; + ret = new VerifyResult(); if (this.inputs.length === 0) { ret.reason = 'bad-txns-vin-empty'; @@ -1242,7 +1243,7 @@ TX.prototype.isStandard = function isStandard(ret) { var nulldata = 0; if (!ret) - ret = {}; + ret = new VerifyResult(); if (this.version < 1 || this.version > constants.tx.MAX_VERSION) { ret.reason = 'version'; @@ -1377,7 +1378,7 @@ TX.prototype.checkInputs = function checkInputs(spendHeight, ret) { var i, input, coin, fee, value; if (!ret) - ret = {}; + ret = new VerifyResult(); for (i = 0; i < this.inputs.length; i++) { input = this.inputs[i]; diff --git a/lib/utils/utils.js b/lib/utils/utils.js index f883e00e..915a40fc 100644 --- a/lib/utils/utils.js +++ b/lib/utils/utils.js @@ -2345,3 +2345,13 @@ utils.isName = function isName(key) { utils.fastProp = function fastProp(obj) { ({ __proto__: obj }); }; + +/** + * Verication result. + * @constructor + */ + +utils.VerifyResult = function VerifyResult() { + this.reason = 'unknown'; + this.score = 0; +};