From 6872a18538efbce325f0b44a55d1e66d215c320e Mon Sep 17 00:00:00 2001 From: Christopher Jeffrey Date: Thu, 2 Jun 2016 14:46:13 -0700 Subject: [PATCH] optimize target checking. --- lib/bcoin/chain.js | 27 +++++++++++++-------------- lib/bcoin/protocol/network.js | 16 ++++++++++++++++ 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/lib/bcoin/chain.js b/lib/bcoin/chain.js index 666d572c..e4f308bd 100644 --- a/lib/bcoin/chain.js +++ b/lib/bcoin/chain.js @@ -1983,7 +1983,7 @@ Chain.prototype.getOrphanRoot = function getOrphanRoot(hash) { Chain.prototype.getCurrentTarget = function getCurrentTarget(callback) { if (!this.tip) - return callback(null, utils.toCompact(this.network.pow.limit)); + return callback(null, this.network.pow.bits); return this.getTargetAsync(null, this.tip, callback); }; @@ -2021,12 +2021,11 @@ Chain.prototype.getTargetAsync = function getTargetAsync(block, prev, callback) */ Chain.prototype.getTarget = function getTarget(block, prev, ancestors) { - var powLimit = utils.toCompact(this.network.pow.limit); var ts, first, i; // Genesis if (!prev) - return powLimit; + return this.network.pow.bits; // Do not retarget if ((prev.height + 1) % this.network.pow.retargetInterval !== 0) { @@ -2034,12 +2033,12 @@ Chain.prototype.getTarget = function getTarget(block, prev, ancestors) { // Special behavior for testnet: ts = block ? (block.ts || block) : bcoin.now(); if (ts > prev.ts + this.network.pow.targetSpacing * 2) - return powLimit; + return this.network.pow.bits; i = 1; while (ancestors[i] && prev.height % this.network.pow.retargetInterval !== 0 - && prev.bits === powLimit) { + && prev.bits === this.network.pow.bits) { prev = ancestors[i++]; } } @@ -2063,26 +2062,26 @@ Chain.prototype.getTarget = function getTarget(block, prev, ancestors) { */ Chain.prototype.retarget = function retarget(prev, first) { - var powTargetTimespan = new bn(this.network.pow.targetTimespan); + var targetTimespan = this.network.pow.targetTimespan; var actualTimespan, target; if (this.network.pow.noRetargeting) return prev.bits; - actualTimespan = new bn(prev.ts - first.ts); + actualTimespan = prev.ts - first.ts; target = utils.fromCompact(prev.bits); - if (actualTimespan.cmp(powTargetTimespan.divn(4)) < 0) - actualTimespan = powTargetTimespan.divn(4); + if (actualTimespan < targetTimespan / 4) + actualTimespan = targetTimespan / 4; - if (actualTimespan.cmp(powTargetTimespan.muln(4)) > 0) - actualTimespan = powTargetTimespan.muln(4); + if (actualTimespan > targetTimespan * 4) + actualTimespan = targetTimespan * 4; - target.imul(actualTimespan); - target = target.div(powTargetTimespan); + target.imuln(actualTimespan); + target.idivn(targetTimespan); if (target.cmp(this.network.pow.limit) > 0) - target = this.network.pow.limit.clone(); + return this.network.pow.bits; return utils.toCompact(target); }; diff --git a/lib/bcoin/protocol/network.js b/lib/bcoin/protocol/network.js index f1723079..247617d0 100644 --- a/lib/bcoin/protocol/network.js +++ b/lib/bcoin/protocol/network.js @@ -214,6 +214,14 @@ main.pow = { main.pow.retargetInterval = main.pow.targetTimespan / main.pow.targetSpacing | 0; +/** + * Compact pow limit. + * @const {Number} + * @default + */ + +main.pow.bits = utils.toCompact(main.pow.limit); + /** * Block constants. * @enum {Number} @@ -519,6 +527,8 @@ testnet.pow = { testnet.pow.retargetInterval = testnet.pow.targetTimespan / testnet.pow.targetSpacing | 0; +testnet.pow.bits = utils.toCompact(testnet.pow.limit); + testnet.block = { majorityEnforceUpgrade: 51, majorityRejectOutdated: 75, @@ -661,6 +671,8 @@ regtest.pow = { regtest.pow.retargetInterval = regtest.pow.targetTimespan / regtest.pow.targetSpacing | 0; +regtest.pow.bits = utils.toCompact(regtest.pow.limit); + regtest.block = { majorityEnforceUpgrade: 750, majorityRejectOutdated: 950, @@ -801,6 +813,8 @@ segnet3.pow = { segnet3.pow.retargetInterval = segnet3.pow.targetTimespan / segnet3.pow.targetSpacing | 0; +segnet3.pow.bits = utils.toCompact(segnet3.pow.limit); + segnet3.block = { majorityEnforceUpgrade: 7, majorityRejectOutdated: 9, @@ -925,6 +939,8 @@ segnet4.pow = { segnet4.pow.retargetInterval = segnet4.pow.targetTimespan / segnet4.pow.targetSpacing | 0; +segnet4.pow.bits = utils.toCompact(segnet4.pow.limit); + segnet4.block = { majorityEnforceUpgrade: 7, majorityRejectOutdated: 9,