diff --git a/lib/coins/coinentry.js b/lib/coins/coinentry.js index 05ca7d0f..512cd9b1 100644 --- a/lib/coins/coinentry.js +++ b/lib/coins/coinentry.js @@ -14,6 +14,13 @@ const StaticWriter = require('../utils/staticwriter'); const encoding = require('../utils/encoding'); const compress = require('./compress'); +/* + * Constants + */ + +const NUM_FLAGS = 3; +const MAX_HEIGHT = ((1 << (32 - NUM_FLAGS)) >>> 0) - 1; + /** * Represents an unspent output. * @alias module:coins.CoinEntry @@ -171,17 +178,15 @@ CoinEntry.prototype.toWriter = function toWriter(bw) { } let height = this.height; - let flags = 0; - - // We save 29 bits for the height. - // This should be good for the next 4000 years. - if (height === -1) - height = 0x1fffffff; + let field = 0; if (this.coinbase) - flags |= 1; + field |= 1; - const field = (height * 8) | flags; + if (height === -1) + height = MAX_HEIGHT; + + field |= height << NUM_FLAGS; bw.writeVarint(this.version); bw.writeU32(field); @@ -219,14 +224,13 @@ CoinEntry.prototype.fromReader = function fromReader(br) { const version = br.readVarint(); const field = br.readU32(); - const flags = field & 0x07; - let height = field / 8 | 0; + let height = field >>> NUM_FLAGS; - if (height === 0x1fffffff) + if (height === MAX_HEIGHT) height = -1; this.version = version; - this.coinbase = (flags & 1) !== 0; + this.coinbase = (field & 1) !== 0; this.height = height; compress.unpack(this.output, br);