From b0b8d333a57fd47c2ac9d5c61c18a26122893f96 Mon Sep 17 00:00:00 2001 From: Christopher Jeffrey Date: Fri, 21 Oct 2016 18:54:36 -0700 Subject: [PATCH] hardfork: remove IsSuperMajority soft fork check. --- lib/chain/chain.js | 21 +++++---- lib/chain/chainentry.js | 98 +++------------------------------------- lib/protocol/networks.js | 37 +-------------- 3 files changed, 18 insertions(+), 138 deletions(-) diff --git a/lib/chain/chain.js b/lib/chain/chain.js index 5445b196..60e5bd70 100644 --- a/lib/chain/chain.js +++ b/lib/chain/chain.js @@ -439,6 +439,7 @@ Chain.prototype.verify = co(function* verify(block, prev) { */ Chain.prototype.getDeployments = co(function* getDeployments(block, prev, ancestors) { + var height = prev.height + 1; var state = new DeploymentState(); var active; @@ -458,42 +459,42 @@ Chain.prototype.getDeployments = co(function* getDeployments(block, prev, ancest // Only allow version 2 blocks (coinbase height) // once the majority of blocks are using it. - if (block.version < 2 && prev.isOutdated(2, ancestors)) + if (block.version < 2 && height >= this.network.block.bip34height) throw new VerifyError(block, 'obsolete', 'bad-version', 0); // Only allow version 3 blocks (sig validation) // once the majority of blocks are using it. - if (block.version < 3 && prev.isOutdated(3, ancestors)) + if (block.version < 3 && height >= this.network.block.bip66height) throw new VerifyError(block, 'obsolete', 'bad-version', 0); // Only allow version 4 blocks (checklocktimeverify) // once the majority of blocks are using it. - if (block.version < 4 && prev.isOutdated(4, ancestors)) + if (block.version < 4 && height >= this.network.block.bip65height) throw new VerifyError(block, 'obsolete', 'bad-version', 0); // Only allow version 5 blocks (bip141 - segnet3) // once the majority of blocks are using it. if (this.options.witness && this.network.oldWitness) { - if (block.version < 5 && prev.isOutdated(5, ancestors)) + if (block.version < 5 && height >= this.network.block.bip141height) throw new VerifyError(block, 'obsolete', 'bad-version', 0); } // Make sure the height contained in the coinbase is correct. - if (block.version >= 2 && prev.isUpgraded(2, ancestors)) { + if (height >= this.network.block.bip34height) { state.bip34 = true; if (!this.state.hasBIP34()) this.logger.warning('BIP34 has been activated.'); } // Signature validation is now enforced (bip66) - if (block.version >= 3 && prev.isUpgraded(3, ancestors)) { + if (height >= this.network.block.bip66height) { state.flags |= constants.flags.VERIFY_DERSIG; if (!this.state.hasBIP66()) this.logger.warning('BIP66 has been activated.'); } // CHECKLOCKTIMEVERIFY is now usable (bip65) - if (block.version >= 4 && prev.isUpgraded(4, ancestors)) { + if (height >= this.network.block.bip65height) { state.flags |= constants.flags.VERIFY_CHECKLOCKTIMEVERIFY; if (!this.state.hasCLTV()) this.logger.warning('BIP65 has been activated.'); @@ -501,7 +502,7 @@ Chain.prototype.getDeployments = co(function* getDeployments(block, prev, ancest // Segregrated witness is now usable (bip141 - segnet3) if (this.options.witness && this.network.oldWitness) { - if (block.version >= 5 && prev.isUpgraded(5, ancestors)) { + if (height >= this.network.block.bip141height) { state.flags |= constants.flags.VERIFY_WITNESS; if (!this.state.hasWitness()) this.logger.warning('Segwit has been activated.'); @@ -525,13 +526,13 @@ Chain.prototype.getDeployments = co(function* getDeployments(block, prev, ancest // Segregrated witness is now usable (bip141 - segnet4) active = yield this.isActive(prev, 'witness'); if (active) { - // BIP147 - // state.flags |= constants.flags.VERIFY_NULLDUMMY; if (this.options.witness) { state.flags |= constants.flags.VERIFY_WITNESS; if (!this.state.hasWitness()) this.logger.warning('Segwit has been activated.'); } + // BIP147 + state.flags |= constants.flags.VERIFY_NULLDUMMY; } return state; diff --git a/lib/chain/chainentry.js b/lib/chain/chainentry.js index bc76349d..2bc4dbe8 100644 --- a/lib/chain/chainentry.js +++ b/lib/chain/chainentry.js @@ -163,13 +163,14 @@ ChainEntry.prototype.isGenesis = function isGenesis() { */ ChainEntry.prototype.getRetargetAncestors = function getRetargetAncestors() { - var majorityWindow = this.network.block.majorityWindow; var medianTimespan = constants.block.MEDIAN_TIMESPAN; - var powDiffInterval = this.network.pow.retargetInterval; + var retargetInterval = this.network.pow.retargetInterval; var diffReset = this.network.pow.difficultyReset; - var max = Math.max(majorityWindow, medianTimespan); - if ((this.height + 1) % powDiffInterval === 0 || diffReset) - max = Math.max(max, powDiffInterval); + var max = medianTimespan; + + if ((this.height + 1) % retargetInterval === 0 || diffReset) + max = Math.max(max, retargetInterval); + return this.getAncestors(max); }; @@ -330,93 +331,6 @@ ChainEntry.prototype.getMedianTimeAsync = co(function* getMedianTimeAsync() { return this.getMedianTime(ancestors); }); -/** - * Check isSuperMajority against majorityRejectOutdated. - * @param {Number} version - * @param {ChainEntry[]} ancestors - * @returns {Boolean} - */ - -ChainEntry.prototype.isOutdated = function isOutdated(version, ancestors) { - return this.isSuperMajority(version, - this.network.block.majorityRejectOutdated, - ancestors); -}; - -/** - * Check {@link ChainEntry#isUpgraded asynchronously}. - * @param {Number} version - * @returns {Promise} - Returns Boolean. - * @returns {Boolean} - */ - -ChainEntry.prototype.isOutdatedAsync = function isOutdatedAsync(version) { - return this.isSuperMajorityAsync(version, - this.network.block.majorityRejectOutdated); -}; - -/** - * Check isSuperMajority against majorityEnforceUpgrade. - * @param {Number} version - * @param {ChainEntry[]} ancestors - * @returns {Boolean} - */ - -ChainEntry.prototype.isUpgraded = function isUpgraded(version, ancestors) { - return this.isSuperMajority(version, - this.network.block.majorityEnforceUpgrade, - ancestors); -}; - -/** - * Check {@link ChainEntry#isUpgraded} asynchronously. - * @param {Number} version - * @returns {Promise} - * @returns {Boolean} - */ - -ChainEntry.prototype.isUpgradedAsync = function isUpgradedAsync(version) { - return this.isSuperMajorityAsync(version, - this.network.block.majorityEnforceUpgrade); -}; - -/** - * Calculate found number of block versions within the majority window. - * @param {Number} version - * @param {Number} required - * @param {ChainEntry[]} ancestors - * @returns {Boolean} - */ - -ChainEntry.prototype.isSuperMajority = function isSuperMajority(version, required, ancestors) { - var entry = this; - var found = 0; - var majorityWindow = this.network.block.majorityWindow; - var i; - - for (i = 0; i < majorityWindow && found < required && entry; i++) { - if (entry.version >= version) - found++; - entry = ancestors[i + 1]; - } - - return found >= required; -}; - -/** - * Calculate {@link ChainEntry#isSuperMajority asynchronously}. - * @param {Number} version - * @param {Number} required - * @returns {Promise} - Returns Boolean. - * @returns {Boolean} - */ - -ChainEntry.prototype.isSuperMajorityAsync = co(function* isSuperMajorityAsync(version, required) { - var majorityWindow = this.network.block.majorityWindow; - var ancestors = yield this.getAncestors(majorityWindow); - return this.isSuperMajority(version, required, ancestors); -}); - /** * Test whether the entry is potentially * an ancestor of a checkpoint. diff --git a/lib/protocol/networks.js b/lib/protocol/networks.js index 89edf9ad..c21a27dd 100644 --- a/lib/protocol/networks.js +++ b/lib/protocol/networks.js @@ -228,26 +228,6 @@ main.pow = { */ main.block = { - /** - * Required versions to upgrade (see {@link ChainEntry#IsUpgraded}). - */ - - majorityEnforceUpgrade: 750, - - /** - * Required versions to consider block - * outdated (see {@link ChainEntry#IsOutdated}). - */ - - majorityRejectOutdated: 950, - - /** - * Majority window to check for upgraded and outdated - * blocks (see {@link ChainEntry#IsSuperMajority}). - */ - - majorityWindow: 1000, - /** * Height at which bip34 was activated. * Used for avoiding bip30 checks. @@ -543,9 +523,6 @@ testnet.pow = { }; testnet.block = { - majorityEnforceUpgrade: 51, - majorityRejectOutdated: 75, - majorityWindow: 100, bip34height: 21111, bip34hash: 'f88ecd9912d00d3f5c2a8e0f50417d3e415c75b3abe584346da9b32300000000', bip65height: 581885, @@ -690,10 +667,7 @@ regtest.pow = { }; regtest.block = { - majorityEnforceUpgrade: 750, - majorityRejectOutdated: 950, - majorityWindow: 1000, - bip34height: -1, + bip34height: 100000000, bip34hash: null, bip65height: 1351, bip65hash: null, @@ -834,9 +808,6 @@ segnet3.pow = { }; segnet3.block = { - majorityEnforceUpgrade: 7, - majorityRejectOutdated: 9, - majorityWindow: 10, bip34height: 8, bip34hash: '1c2a2898cebca152f872fa71b756903711ad778c7d63ba6b73c140f800000000', bip65height: 8, @@ -956,9 +927,6 @@ segnet4.pow = { }; segnet4.block = { - majorityEnforceUpgrade: 7, - majorityRejectOutdated: 9, - majorityWindow: 10, bip34height: 8, bip34hash: '6c48386dc7c460defabb5640e28b6510a5f238cdbe6756c2976a7e0913000000', bip65height: 8, @@ -1098,9 +1066,6 @@ simnet.pow = { }; simnet.block = { - majorityEnforceUpgrade: 51, - majorityRejectOutdated: 75, - majorityWindow: 100, bip34height: 0, bip34hash: 'f67ad7695d9b662a72ff3d8edbbb2de0bfa67b13974bb9910d116d5cbd863e68', bip65height: 0,