constants. network. docs.

This commit is contained in:
Christopher Jeffrey 2016-04-17 15:58:12 -07:00
parent 0cbc9b7338
commit 87d985fcdb
No known key found for this signature in database
GPG Key ID: 8962AB9DE6666BBD
5 changed files with 269 additions and 89 deletions

View File

@ -2103,12 +2103,12 @@ Chain.prototype.getCurrentTarget = function getCurrentTarget(callback) {
Chain.prototype.getTargetAsync = function getTargetAsync(last, block, callback) {
var self = this;
if ((last.height + 1) % network.pow.diffInterval !== 0) {
if ((last.height + 1) % network.pow.retargetInterval !== 0) {
if (!network.pow.allowMinDifficultyBlocks)
return utils.asyncify(callback)(null, this.getTarget(last, block));
}
return last.getAncestors(network.pow.diffInterval, function(err, ancestors) {
return last.getAncestors(network.pow.retargetInterval, function(err, ancestors) {
if (err)
return callback(err);
@ -2138,7 +2138,7 @@ Chain.prototype.getTarget = function getTarget(last, block, ancestors) {
ancestors = last.ancestors;
// Do not retarget
if ((last.height + 1) % network.pow.diffInterval !== 0) {
if ((last.height + 1) % network.pow.retargetInterval !== 0) {
if (network.pow.allowMinDifficultyBlocks) {
// Special behavior for testnet:
ts = block ? (block.ts || block) : utils.now();
@ -2147,7 +2147,7 @@ Chain.prototype.getTarget = function getTarget(last, block, ancestors) {
i = 1;
while (ancestors[i]
&& last.height % network.pow.diffInterval !== 0
&& last.height % network.pow.retargetInterval !== 0
&& last.bits === powLimit) {
last = ancestors[i++];
}
@ -2156,7 +2156,7 @@ Chain.prototype.getTarget = function getTarget(last, block, ancestors) {
}
// Back 2 weeks
first = ancestors[network.pow.diffInterval - 1];
first = ancestors[network.pow.retargetInterval - 1];
assert(first);

View File

@ -102,7 +102,7 @@ ChainBlock.prototype.isGenesis = function isGenesis() {
ChainBlock.prototype.ensureAncestors = function ensureAncestors(callback) {
var majorityWindow = network.block.majorityWindow;
var medianTimespan = constants.block.MEDIAN_TIMESPAN;
var powDiffInterval = network.pow.diffInterval;
var powDiffInterval = network.pow.retargetInterval;
var allowMinDiff = network.pow.allowMinDifficultyBlocks;
var max = Math.max(majorityWindow, medianTimespan);
if ((this.height + 1) % powDiffInterval === 0 || allowMinDiff)

View File

@ -61,7 +61,7 @@ function ChainDB(chain, options) {
// if we're going to be checking the damn
// target all the time.
if (network.pow.allowMinDifficultyBlocks)
this._cacheWindow = network.pow.diffInterval + 1;
this._cacheWindow = network.pow.retargetInterval + 1;
else
this._cacheWindow = network.block.majorityWindow + 1;

View File

@ -43,9 +43,28 @@ exports.MAX_MESSAGE = 4 * 1000 * 1000;
*/
exports.services = {
/**
* Whether network services are enabled.
*/
NETWORK: (1 << 0),
/**
* Whether the peer supports the getutxos packet.
*/
GETUTXO: (1 << 1),
/**
* Whether the peer supports BIP37.
*/
BLOOM: (1 << 2),
/**
* Whether the peer supports segregated witness.
*/
WITNESS: (1 << 3)
};
@ -101,8 +120,23 @@ exports.WITNESS_MASK = 1 << 30;
*/
exports.filterFlags = {
/**
* Never update the filter with outpoints.
*/
NONE: 0,
/**
* Always update the filter with outpoints.
*/
ALL: 1,
/**
* Only update the filter with outpoints if it is
* "asymmetric" in terms of addresses (pubkey/multisig).
*/
PUBKEY_ONLY: 2
};
@ -303,9 +337,28 @@ exports.MAX_MONEY = new bn(21000000).mul(exports.COIN);
*/
exports.hashType = {
/**
* Sign all outputs.
*/
ALL: 1,
/**
* Do not sign outputs (zero sequences).
*/
NONE: 2,
/**
* Sign output at the same index (zero sequences).
*/
SINGLE: 3,
/**
* Sign only the current input (mask).
*/
ANYONECANPAY: 0x80
};
@ -384,9 +437,29 @@ exports.script = {
*/
exports.mempool = {
/**
* Ancestor limit.
*/
ANCESTOR_LIMIT: 25,
/**
* Maximum mempool size in bytes.
*/
MAX_MEMPOOL_SIZE: 300 << 20,
/**
* The time at which transactions
* fall out of the mempool.
*/
MEMPOOL_EXPIRY: 72 * 60 * 60,
/**
* Maximum number of orphan transactions.
*/
MAX_ORPHAN_TX: 100
};
@ -452,9 +525,28 @@ exports.LOCKTIME_THRESHOLD = 500000000;
*/
exports.sequence = {
/**
* Highest nSequence bit (disables sequence locktimes).
*/
DISABLE_FLAG: (1 << 31) >>> 0,
/**
* Type (height or time).
*/
TYPE_FLAG: 1 << 22,
/**
* Sequence granularity.
*/
GRANULARITY: 9,
/**
* Mask.
*/
MASK: 0x0000ffff
};
@ -599,11 +691,22 @@ exports.flags.STANDARD_LOCKTIME_FLAGS = 0
*/
exports.versionbits = {
// What block version to use for new blocks (pre versionbits)
/**
* What block version to use for new blocks (pre versionbits)
*/
LAST_OLD_BLOCK_VERSION: 4,
// What bits to set in version for versionbits blocks
/**
* What bits to set in version for versionbits blocks
*/
TOP_BITS: 0x20000000,
// What bitmask determines whether versionbits is in use
/**
* What bitmask determines whether versionbits is in use
*/
TOP_MASK: 0xe0000000
};
@ -628,9 +731,33 @@ exports.thresholdStates = {
*/
exports.confidence = {
/**
* Transaction is in the main chain.
*/
BUILDING: 1,
/**
* Transaction is valid and in the mempool.
*/
PENDING: 2,
/**
* Transaction is on a side chain.
*/
DEAD: 4,
/**
* Transaction is double-spent.
*/
INCONFLICT: 5,
/**
* Transaction is not in the mempool or chain.
*/
UNKNOWN: 0
};

View File

@ -169,33 +169,55 @@ main.genesisBlock =
+ '61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f'
+ 'ac00000000';
main.pow = {};
/**
* Default target.
* @const {Buffer}
*/
main.pow.limit = new bn(
'00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff',
'hex'
);
/**
* Default retarget interval.
* @const {Number}
* POW-related constants.
* @enum {Number}
* @default
*/
main.pow.targetTimespan = 14 * 24 * 60 * 60; // two weeks
main.pow = {
/**
* Default target.
* @const {Buffer}
*/
/**
* Average block time.
* @const {Number}
* @default
*/
limit: new bn(
'00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff',
'hex'
),
main.pow.targetSpacing = 10 * 60;
/**
* Default retarget interval.
* @const {Number}
* @default
*/
targetTimespan: 14 * 24 * 60 * 60, // two weeks
/**
* Average block time.
* @const {Number}
* @default
*/
targetSpacing: 10 * 60,
/**
* Allow constant retargetting on testnet.
* @const {Boolean}
* @default
*/
allowMinDifficultyBlocks: false,
/**
* Do not allow retargetting.
* @const {Boolean}
* @default
*/
noRetargeting: false
};
/**
* Retarget interval in blocks.
@ -203,21 +225,7 @@ main.pow.targetSpacing = 10 * 60;
* @default
*/
main.pow.diffInterval = main.pow.targetTimespan / main.pow.targetSpacing | 0;
/**
* @const {Boolean}
* @default
*/
main.pow.allowMinDifficultyBlocks = false;
/**
* @const {Boolean}
* @default
*/
main.pow.noRetargeting = false;
main.pow.retargetInterval = main.pow.targetTimespan / main.pow.targetSpacing | 0;
/**
* Block constants.
@ -226,12 +234,50 @@ main.pow.noRetargeting = false;
*/
main.block = {
/**
* Required versions to upgrade (see {@link ChainBlock#IsUpgraded}).
*/
majorityEnforceUpgrade: 750,
/**
* Required versions to consider block
* outdated (see {@link ChainBlock#IsOutdated}).
*/
majorityRejectOutdated: 950,
/**
* Majority window to check for upgraded and outdated
* blocks (see {@link ChainBlock#IsSuperMajority}).
*/
majorityWindow: 1000,
/**
* Height at which bip34 was activated.
* Used for avoiding bip30 checks.
*/
bip34height: 227931,
/**
* Hash of the block that activated bip34.
*/
bip34hash: 'b808089c756add1591b1d17bab44bba3fed9e02f942ab4894b02000000000000',
/**
* Safe height to start pruning.
*/
pruneAfterHeight: 100000,
/**
* Age used for the time delta to
* determine whether the chain is synced.
*/
maxTipAge: 24 * 60 * 60
};
@ -312,26 +358,27 @@ main.prefixes = {
/**
* {@link Base58Address} constants.
* @const {Object}
* @enum {Object}
*/
main.address = {
/**
* {@link Base58Address} prefixes.
* @enum {Number}
* @default
*/
prefixes: {
pubkeyhash: 0,
scripthash: 5,
witnesspubkeyhash: 6,
witnessscripthash: 10
},
/**
* {@link Base58Address} versions.
* @enum {Number}
* @default
*/
versions: {
witnesspubkeyhash: 0,
witnessscripthash: 0
@ -415,17 +462,18 @@ testnet.genesisBlock =
+ '61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f'
+ 'ac00000000';
testnet.pow = {};
testnet.pow = {
limit: new bn(
'00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff',
'hex'
),
targetTimespan: 14 * 24 * 60 * 60, // two weeks
targetSpacing: 10 * 60,
allowMinDifficultyBlocks: true,
noRetargeting: false
};
testnet.pow.limit = new bn(
'00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff',
'hex'
);
testnet.pow.targetTimespan = 14 * 24 * 60 * 60; // two weeks
testnet.pow.targetSpacing = 10 * 60;
testnet.pow.diffInterval = testnet.pow.targetTimespan / testnet.pow.targetSpacing | 0;
testnet.pow.allowMinDifficultyBlocks = true;
testnet.pow.noRetargeting = false;
testnet.pow.retargetInterval = testnet.pow.targetTimespan / testnet.pow.targetSpacing | 0;
testnet.block = {
majorityEnforceUpgrade: 51,
@ -541,15 +589,18 @@ regtest.genesisBlock =
regtest.pow = {};
regtest.pow.limit = new bn(
'7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff',
'hex'
);
regtest.pow.targetTimespan = 14 * 24 * 60 * 60; // two weeks
regtest.pow.targetSpacing = 10 * 60;
regtest.pow.diffInterval = regtest.pow.targetTimespan / regtest.pow.targetSpacing | 0;
regtest.pow.allowMinDifficultyBlocks = true;
regtest.pow.noRetargeting = true;
regtest.pow = {
limit: new bn(
'7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff',
'hex'
),
targetTimespan: 14 * 24 * 60 * 60, // two weeks
targetSpacing: 10 * 60,
allowMinDifficultyBlocks: true,
noRetargeting: true
};
regtest.pow.retargetInterval = regtest.pow.targetTimespan / regtest.pow.targetSpacing | 0;
regtest.block = {
majorityEnforceUpgrade: 750,
@ -662,17 +713,18 @@ segnet3.genesisBlock =
+ '61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f'
+ 'ac00000000';
segnet3.pow = {};
segnet3.pow = {
limit: new bn(
'00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff',
'hex'
),
targetTimespan: 14 * 24 * 60 * 60, // two weeks
targetSpacing: 10 * 60,
allowMinDifficultyBlocks: true,
noRetargeting: false
};
segnet3.pow.limit = new bn(
'00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff',
'hex'
);
segnet3.pow.targetTimespan = 14 * 24 * 60 * 60; // two weeks
segnet3.pow.targetSpacing = 10 * 60;
segnet3.pow.diffInterval = segnet3.pow.targetTimespan / segnet3.pow.targetSpacing | 0;
segnet3.pow.allowMinDifficultyBlocks = true;
segnet3.pow.noRetargeting = false;
segnet3.pow.retargetInterval = segnet3.pow.targetTimespan / segnet3.pow.targetSpacing | 0;
segnet3.block = {
majorityEnforceUpgrade: 7,
@ -766,18 +818,19 @@ segnet4.genesisBlock =
+ '61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f'
+ 'ac00000000';
segnet4.pow = {};
segnet4.pow.limit = new bn(
segnet4.pow = {
// 512x lower min difficulty than mainnet
'000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff',
'hex'
);
segnet4.pow.targetTimespan = 14 * 24 * 60 * 60; // two weeks
segnet4.pow.targetSpacing = 10 * 60;
segnet4.pow.diffInterval = segnet4.pow.targetTimespan / segnet4.pow.targetSpacing | 0;
segnet4.pow.allowMinDifficultyBlocks = true;
segnet4.pow.noRetargeting = false;
limit: new bn(
'000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff',
'hex'
),
targetTimespan: 14 * 24 * 60 * 60, // two weeks
targetSpacing: 10 * 60,
allowMinDifficultyBlocks: true,
noRetargeting: false
};
segnet4.pow.retargetInterval = segnet4.pow.targetTimespan / segnet4.pow.targetSpacing | 0;
segnet4.block = {
majorityEnforceUpgrade: 7,