930 lines
19 KiB
JavaScript
930 lines
19 KiB
JavaScript
/*!
|
|
* network.js - bitcoin networks for bcoin
|
|
* Copyright (c) 2014-2015, Fedor Indutny (MIT License)
|
|
* Copyright (c) 2014-2017, Christopher Jeffrey (MIT License).
|
|
* https://github.com/bcoin-org/bcoin
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
/**
|
|
* @module protocol/networks
|
|
*/
|
|
|
|
const BN = require('../crypto/bn');
|
|
|
|
const network = exports;
|
|
|
|
/**
|
|
* Network type list.
|
|
* @memberof module:protocol/networks
|
|
* @const {String[]}
|
|
* @default
|
|
*/
|
|
|
|
network.types = ['main', 'testnet', 'regtest', 'simnet'];
|
|
|
|
/**
|
|
* Mainnet
|
|
* @static
|
|
* @lends module:protocol/networks
|
|
* @type {Object}
|
|
*/
|
|
|
|
const main = {};
|
|
|
|
/**
|
|
* Symbolic network type.
|
|
* @const {String}
|
|
* @default
|
|
*/
|
|
|
|
main.type = 'main';
|
|
|
|
/**
|
|
* Default DNS seeds.
|
|
* @const {String[]}
|
|
* @default
|
|
*/
|
|
|
|
main.seeds = [
|
|
'seed-a.litecoin.loshan.co.uk',
|
|
'dnsseed.thrasher.io',
|
|
'dnsseed.litecointools.com',
|
|
'dnsseed.litecoinpool.org',
|
|
'dnsseed.koin-project.com'
|
|
];
|
|
|
|
/**
|
|
* Packet magic number.
|
|
* @const {Number}
|
|
* @default
|
|
*/
|
|
|
|
main.magic = 0xdbb6c0fb;
|
|
|
|
/**
|
|
* Default network port.
|
|
* @const {Number}
|
|
* @default
|
|
*/
|
|
|
|
main.port = 9333;
|
|
|
|
/**
|
|
* Checkpoint block list.
|
|
* @const {Object}
|
|
*/
|
|
|
|
main.checkpointMap = {
|
|
1500: '67299ab5a20244afc95e8376d48b5fe4545ad055a707a7cf88d25d9565291a84',
|
|
4032: '4608cfd9e3d75f9687a935fd6ae2805b720335ce05595ef00efc9871420ee99c',
|
|
8064: '700d4394a67d98b3fc29b7f0efeeb9baa4b8400c151f6510f29051fc534398eb',
|
|
16128: '3d15cd1c2ae103ec4b7acd9d4d1ddc6fb66c0e9b1d9f80afa6f9b75918df2e60',
|
|
23420: '07b501510bce8f974e87ec30258fa57d54fea9c30aa9b2d20bfd1aa89cdf0fd8',
|
|
50000: 'a6207ad0713e2b2b88323a4fdb2a6727c11904cc2d01a575f0689b02eb37dc69',
|
|
80000: '0ae9b2cd2e186748cbbe8c6ab420f9a85599a864c7493f5000a376f6027ccb4f',
|
|
120000: '3161ac52357a6a021b12e7e9ce298e9ec88e82325f15f0a7daf6054f92269dbd',
|
|
161500: '43ff718479f7bb8d41b8283b12914902dc1cba777c225cf7b44b4f478098e8db',
|
|
179620: '09f7b9782b0ba55883b2dca7e969fa2fbed70f6e448ed12604c00a995cc6d92a',
|
|
240000: 'aa885055a13e2eab6e4e0c59c439db739c4cf23676ee17a27c15c2b4c4d14071',
|
|
383640: '64f3c626f1c396a090057d4be94ba32751a310f1b35ec6af5b21a994f009682b',
|
|
409004: 'a3085935f1b439cfe9770edcfb67b682d974ad95931d6108faf1d963d6187548',
|
|
456000: '0420375624e31b407dac0105a4a64ce397f822be060d9387d46c36c61cf734bf',
|
|
638902: '384fc7ae3bc5ec5cc49ccd3d95fc9a81a5f3fc758c9ae28dd263ece856862315',
|
|
721000: 'e540989a758adc4116743ee6a235b2ea14b7759dd93b46e27894dfe14d7b8a19'
|
|
};
|
|
|
|
/**
|
|
* Last checkpoint height.
|
|
* @const {Number}
|
|
* @default
|
|
*/
|
|
|
|
main.lastCheckpoint = 721000;
|
|
|
|
/**
|
|
* @const {Number}
|
|
* @default
|
|
*/
|
|
|
|
main.halvingInterval = 840000;
|
|
|
|
/**
|
|
* Genesis block header.
|
|
* @const {NakedBlock}
|
|
*/
|
|
|
|
main.genesis = {
|
|
version: 1,
|
|
hash: 'e2bf047e7e5a191aa4ef34d314979dc9986e0f19251edaba5940fd1fe365a712',
|
|
prevBlock: '0000000000000000000000000000000000000000000000000000000000000000',
|
|
merkleRoot: 'd9ced4ed1130f7b7faad9be25323ffafa33232a17c3edf6cfd97bee6bafbdd97',
|
|
time: 1317972665,
|
|
bits: 504365040, // 0x1e0ffff0
|
|
nonce: 2084524493,
|
|
height: 0
|
|
};
|
|
|
|
/**
|
|
* The network's genesis block in a hex string.
|
|
* @const {String}
|
|
*/
|
|
|
|
main.genesisBlock =
|
|
'0100000000000000000000000000000000000000000000000000000000000000000000'
|
|
+ '00d9ced4ed1130f7b7faad9be25323ffafa33232a17c3edf6cfd97bee6bafbdd97b9aa'
|
|
+ '8e4ef0ff0f1ecd513f7c01010000000100000000000000000000000000000000000000'
|
|
+ '00000000000000000000000000ffffffff4804ffff001d0104404e592054696d657320'
|
|
+ '30352f4f63742f32303131205374657665204a6f62732c204170706c65e28099732056'
|
|
+ '6973696f6e6172792c2044696573206174203536ffffffff0100f2052a010000004341'
|
|
+ '040184710fa689ad5023690c80f3a49c8f13f8d45b8c857fbcbc8bc4a8e4d3eb4b10f4'
|
|
+ 'd4604fa08dce601aaf0f470216fe1b51850b4acf21b179c45070ac7b03a9ac00000000';
|
|
|
|
/**
|
|
* POW-related constants.
|
|
* @enum {Number}
|
|
* @default
|
|
*/
|
|
|
|
main.pow = {
|
|
/**
|
|
* Default target.
|
|
* @const {BN}
|
|
*/
|
|
|
|
limit: new BN(
|
|
'00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff',
|
|
'hex'
|
|
),
|
|
|
|
/**
|
|
* Compact pow limit.
|
|
* @const {Number}
|
|
* @default
|
|
*/
|
|
|
|
bits: 504365055,
|
|
|
|
/**
|
|
* Minimum chainwork for best chain.
|
|
* @const {BN}
|
|
*/
|
|
|
|
chainwork: new BN(
|
|
'00000000000000000000000000000000000000000000000ba50a60f8b56c7fe0',
|
|
'hex'
|
|
),
|
|
|
|
/**
|
|
* Desired retarget period in seconds.
|
|
* @const {Number}
|
|
* @default
|
|
*/
|
|
|
|
targetTimespan: 3.5 * 24 * 60 * 60,
|
|
|
|
/**
|
|
* Average block time.
|
|
* @const {Number}
|
|
* @default
|
|
*/
|
|
|
|
targetSpacing: 2.5 * 60,
|
|
|
|
/**
|
|
* Retarget interval in blocks.
|
|
* @const {Number}
|
|
* @default
|
|
*/
|
|
|
|
retargetInterval: 2016,
|
|
|
|
/**
|
|
* Whether to reset target if a block
|
|
* has not been mined recently.
|
|
* @const {Boolean}
|
|
* @default
|
|
*/
|
|
|
|
targetReset: false,
|
|
|
|
/**
|
|
* Do not allow retargetting.
|
|
* @const {Boolean}
|
|
* @default
|
|
*/
|
|
|
|
noRetargeting: false
|
|
};
|
|
|
|
/**
|
|
* Block constants.
|
|
* @enum {Number}
|
|
* @default
|
|
*/
|
|
|
|
main.block = {
|
|
/**
|
|
* Height at which bip34 was activated.
|
|
* Used for avoiding bip30 checks.
|
|
*/
|
|
|
|
bip34height: 710000,
|
|
|
|
/**
|
|
* Hash of the block that activated bip34.
|
|
*/
|
|
|
|
bip34hash: 'cf519deb9a32b4c72612ff0c42bf3a04f262fa41d4c8a7d58e763aa804d209fa',
|
|
|
|
/**
|
|
* Height at which bip65 was activated.
|
|
*/
|
|
|
|
bip65height: 918684,
|
|
|
|
/**
|
|
* Hash of the block that activated bip65.
|
|
*/
|
|
|
|
bip65hash: '1a31cc64827cc248b2afefd849d41dde2bb907e73ff6ef3edce077891e04b3ba',
|
|
|
|
/**
|
|
* Height at which bip66 was activated.
|
|
*/
|
|
|
|
bip66height: 811879,
|
|
|
|
/**
|
|
* Hash of the block that activated bip66.
|
|
*/
|
|
|
|
bip66hash: '941849dc7bbdd271a727db8fb06acd33e23a1b8b5d83f85289fa332801eece7a',
|
|
|
|
/**
|
|
* Safe height to start pruning.
|
|
*/
|
|
|
|
pruneAfterHeight: 1000,
|
|
|
|
/**
|
|
* Safe number of blocks to keep.
|
|
*/
|
|
|
|
keepBlocks: 288,
|
|
|
|
/**
|
|
* Age used for the time delta to
|
|
* determine whether the chain is synced.
|
|
*/
|
|
|
|
maxTipAge: 24 * 60 * 60,
|
|
|
|
/**
|
|
* Height at which block processing is
|
|
* slow enough that we can output
|
|
* logs without spamming.
|
|
*/
|
|
|
|
slowHeight: 900000
|
|
};
|
|
|
|
/**
|
|
* Map of historical blocks which create duplicate transactions hashes.
|
|
* @see https://github.com/bitcoin/bips/blob/master/bip-0030.mediawiki
|
|
* @const {Object}
|
|
* @default
|
|
*/
|
|
|
|
main.bip30 = {};
|
|
|
|
/**
|
|
* For versionbits.
|
|
* @const {Number}
|
|
* @default
|
|
*/
|
|
|
|
main.activationThreshold = 6048; // 75% of 8064
|
|
|
|
/**
|
|
* Confirmation window for versionbits.
|
|
* @const {Number}
|
|
* @default
|
|
*/
|
|
|
|
main.minerWindow = 8064; // nPowTargetTimespan / nPowTargetSpacing * 4
|
|
|
|
/**
|
|
* Deployments for versionbits.
|
|
* @const {Object}
|
|
* @default
|
|
*/
|
|
|
|
main.deployments = {
|
|
csv: {
|
|
name: 'csv',
|
|
bit: 0,
|
|
startTime: 1485561600, // January 28, 2017
|
|
timeout: 1517356801, // January 31st, 2018
|
|
threshold: -1,
|
|
window: -1,
|
|
required: false,
|
|
force: true
|
|
},
|
|
segwit: {
|
|
name: 'segwit',
|
|
bit: 1,
|
|
startTime: 1485561600, // January 28, 2017
|
|
timeout: 1517356801, // January 31st, 2018
|
|
threshold: -1,
|
|
window: -1,
|
|
required: true,
|
|
force: false
|
|
},
|
|
testdummy: {
|
|
name: 'testdummy',
|
|
bit: 28,
|
|
startTime: 1199145601, // January 1, 2008
|
|
timeout: 1230767999, // December 31, 2008
|
|
threshold: -1,
|
|
window: -1,
|
|
required: false,
|
|
force: true
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Deployments for versionbits (array form, sorted).
|
|
* @const {Array}
|
|
* @default
|
|
*/
|
|
|
|
main.deploys = [
|
|
main.deployments.csv,
|
|
main.deployments.segwit,
|
|
main.deployments.testdummy
|
|
];
|
|
|
|
/**
|
|
* Key prefixes.
|
|
* @enum {Number}
|
|
* @default
|
|
*/
|
|
|
|
main.keyPrefix = {
|
|
privkey: 0xb0,
|
|
xpubkey: 0x0488b21e,
|
|
xprivkey: 0x0488ade4,
|
|
xpubkey58: 'xpub',
|
|
xprivkey58: 'xprv',
|
|
coinType: 0
|
|
};
|
|
|
|
/**
|
|
* {@link Address} prefixes.
|
|
* @enum {Number}
|
|
*/
|
|
|
|
main.addressPrefix = {
|
|
pubkeyhash: 0x30,
|
|
scripthash: 0x05,
|
|
scripthash2: 0x32,
|
|
witnesspubkeyhash: 0x06,
|
|
witnessscripthash: 0x0a,
|
|
bech32: 'ltc'
|
|
};
|
|
|
|
/**
|
|
* Default value for whether the mempool
|
|
* accepts non-standard transactions.
|
|
* @const {Boolean}
|
|
* @default
|
|
*/
|
|
|
|
main.requireStandard = true;
|
|
|
|
/**
|
|
* Default http port.
|
|
* @const {Number}
|
|
* @default
|
|
*/
|
|
|
|
main.rpcPort = 9332;
|
|
|
|
/**
|
|
* Default min relay rate.
|
|
* @const {Rate}
|
|
* @default
|
|
*/
|
|
|
|
main.minRelay = 10000;
|
|
|
|
/**
|
|
* Default normal relay rate.
|
|
* @const {Rate}
|
|
* @default
|
|
*/
|
|
|
|
main.feeRate = 1000000;
|
|
|
|
/**
|
|
* Maximum normal relay rate.
|
|
* @const {Rate}
|
|
* @default
|
|
*/
|
|
|
|
main.maxFeeRate = 4000000;
|
|
|
|
/**
|
|
* Whether to allow self-connection.
|
|
* @const {Boolean}
|
|
*/
|
|
|
|
main.selfConnect = false;
|
|
|
|
/**
|
|
* Whether to request mempool on sync.
|
|
* @const {Boolean}
|
|
*/
|
|
|
|
main.requestMempool = false;
|
|
|
|
/*
|
|
* Testnet (v3)
|
|
* https://en.bitcoin.it/wiki/Testnet
|
|
*/
|
|
|
|
const testnet = {};
|
|
|
|
testnet.type = 'testnet';
|
|
|
|
testnet.seeds = [
|
|
'testnet-seed.litecointools.com',
|
|
'seed-b.litecoin.loshan.co.uk',
|
|
'dnsseed-testnet.thrasher.io'
|
|
];
|
|
|
|
testnet.magic = 0xf1c8d2fd;
|
|
|
|
testnet.port = 19335;
|
|
|
|
testnet.checkpointMap = {
|
|
2056: '8932a8789c96c516d8a1080a29c7e7e387d2397a83864f9adcaf97ba318a7417',
|
|
};
|
|
|
|
testnet.lastCheckpoint = 2056;
|
|
|
|
testnet.halvingInterval = 840000;
|
|
|
|
testnet.genesis = {
|
|
version: 1,
|
|
hash: 'a0293e4eeb3da6e6f56f81ed595f57880d1a21569e13eefdd951284b5a626649',
|
|
prevBlock: '0000000000000000000000000000000000000000000000000000000000000000',
|
|
merkleRoot: 'd9ced4ed1130f7b7faad9be25323ffafa33232a17c3edf6cfd97bee6bafbdd97',
|
|
time: 1486949366,
|
|
bits: 504365040,
|
|
nonce: 293345,
|
|
height: 0
|
|
};
|
|
|
|
testnet.genesisBlock =
|
|
'010000000000000000000000000000000000000000000000000000000000000000000'
|
|
+ '000d9ced4ed1130f7b7faad9be25323ffafa33232a17c3edf6cfd97bee6bafbdd97f6'
|
|
+ '0ba158f0ff0f1ee179040001010000000100000000000000000000000000000000000'
|
|
+ '00000000000000000000000000000ffffffff4804ffff001d0104404e592054696d65'
|
|
+ '732030352f4f63742f32303131205374657665204a6f62732c204170706c65e280997'
|
|
+ '320566973696f6e6172792c2044696573206174203536ffffffff0100f2052a010000'
|
|
+ '004341040184710fa689ad5023690c80f3a49c8f13f8d45b8c857fbcbc8bc4a8e4d3e'
|
|
+ 'b4b10f4d4604fa08dce601aaf0f470216fe1b51850b4acf21b179c45070ac7b03a9ac'
|
|
+ '00000000';
|
|
|
|
testnet.pow = {
|
|
limit: new BN(
|
|
'00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff',
|
|
'hex'
|
|
),
|
|
bits: 504365055,
|
|
chainwork: new BN(
|
|
'0000000000000000000000000000000000000000000000000000364b0cbc3568',
|
|
'hex'
|
|
),
|
|
targetTimespan: 3.5 * 24 * 60 * 60,
|
|
targetSpacing: 2.5 * 60,
|
|
retargetInterval: 2016,
|
|
targetReset: true,
|
|
noRetargeting: false
|
|
};
|
|
|
|
testnet.block = {
|
|
bip34height: 76,
|
|
bip34hash: '73058ccc33da8b5479e3548c3cce4fb32a705fa9803994fd5f498bed71c77580',
|
|
bip65height: 76,
|
|
bip65hash: '73058ccc33da8b5479e3548c3cce4fb32a705fa9803994fd5f498bed71c77580',
|
|
bip66height: 76,
|
|
bip66hash: '73058ccc33da8b5479e3548c3cce4fb32a705fa9803994fd5f498bed71c77580',
|
|
pruneAfterHeight: 1000,
|
|
keepBlocks: 10000,
|
|
maxTipAge: 24 * 60 * 60,
|
|
slowHeight: 950000
|
|
};
|
|
|
|
testnet.bip30 = {};
|
|
|
|
testnet.activationThreshold = 1512; // 75% for testchains
|
|
|
|
testnet.minerWindow = 2016; // nPowTargetTimespan / nPowTargetSpacing
|
|
|
|
testnet.deployments = {
|
|
csv: {
|
|
name: 'csv',
|
|
bit: 0,
|
|
startTime: 1483228800, // March 1st, 2016
|
|
timeout: 1517356801, // May 1st, 2017
|
|
threshold: -1,
|
|
window: -1,
|
|
required: false,
|
|
force: true
|
|
},
|
|
segwit: {
|
|
name: 'segwit',
|
|
bit: 1,
|
|
startTime: 1483228800, // May 1st 2016
|
|
timeout: 1517356801, // May 1st 2017
|
|
threshold: -1,
|
|
window: -1,
|
|
required: true,
|
|
force: false
|
|
},
|
|
testdummy: {
|
|
name: 'testdummy',
|
|
bit: 28,
|
|
startTime: 1199145601, // January 1, 2008
|
|
timeout: 1230767999, // December 31, 2008
|
|
threshold: -1,
|
|
window: -1,
|
|
required: false,
|
|
force: true
|
|
}
|
|
};
|
|
|
|
testnet.deploys = [
|
|
testnet.deployments.csv,
|
|
testnet.deployments.segwit,
|
|
testnet.deployments.testdummy
|
|
];
|
|
|
|
testnet.keyPrefix = {
|
|
privkey: 0xef,
|
|
xpubkey: 0x043587cf,
|
|
xprivkey: 0x04358394,
|
|
xpubkey58: 'xpub',
|
|
xprivkey58: 'xprv',
|
|
coinType: 1
|
|
};
|
|
|
|
testnet.addressPrefix = {
|
|
pubkeyhash: 0x6f,
|
|
scripthash: 0xc4,
|
|
scripthash2: 0x3a,
|
|
witnesspubkeyhash: 0x03,
|
|
witnessscripthash: 0x28,
|
|
bech32: 'tltc'
|
|
};
|
|
|
|
testnet.requireStandard = false;
|
|
|
|
testnet.rpcPort = 19332;
|
|
|
|
testnet.minRelay = 1000;
|
|
|
|
testnet.feeRate = 20000;
|
|
|
|
testnet.maxFeeRate = 60000;
|
|
|
|
testnet.selfConnect = false;
|
|
|
|
testnet.requestMempool = false;
|
|
|
|
/*
|
|
* Regtest
|
|
*/
|
|
|
|
const regtest = {};
|
|
|
|
regtest.type = 'regtest';
|
|
|
|
regtest.seeds = [
|
|
'127.0.0.1'
|
|
];
|
|
|
|
regtest.magic = 0xdab5bffa;
|
|
|
|
regtest.port = 19444;
|
|
|
|
regtest.checkpointMap = {};
|
|
regtest.lastCheckpoint = 0;
|
|
|
|
regtest.halvingInterval = 150;
|
|
|
|
regtest.genesis = {
|
|
version: 1,
|
|
hash: 'f916c456fc51df627885d7d674ed02dc88a225adb3f02ad13eb4938ff3270853',
|
|
prevBlock: '0000000000000000000000000000000000000000000000000000000000000000',
|
|
merkleRoot: 'd9ced4ed1130f7b7faad9be25323ffafa33232a17c3edf6cfd97bee6bafbdd97',
|
|
time: 1296688602,
|
|
bits: 545259519,
|
|
nonce: 0,
|
|
height: 0
|
|
};
|
|
|
|
regtest.genesisBlock =
|
|
'010000000000000000000000000000000000000000000000000000000000000000000'
|
|
+ '000d9ced4ed1130f7b7faad9be25323ffafa33232a17c3edf6cfd97bee6bafbdd97da'
|
|
+ 'e5494dffff7f200000000001010000000100000000000000000000000000000000000'
|
|
+ '00000000000000000000000000000ffffffff4804ffff001d0104404e592054696d65'
|
|
+ '732030352f4f63742f32303131205374657665204a6f62732c204170706c65e280997'
|
|
+ '320566973696f6e6172792c2044696573206174203536ffffffff0100f2052a010000'
|
|
+ '004341040184710fa689ad5023690c80f3a49c8f13f8d45b8c857fbcbc8bc4a8e4d3e'
|
|
+ 'b4b10f4d4604fa08dce601aaf0f470216fe1b51850b4acf21b179c45070ac7b03a9ac'
|
|
+ '00000000';
|
|
|
|
regtest.pow = {
|
|
limit: new BN(
|
|
'7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff',
|
|
'hex'
|
|
),
|
|
bits: 545259519,
|
|
chainwork: new BN(
|
|
'0000000000000000000000000000000000000000000000000000000000000000',
|
|
'hex'
|
|
),
|
|
targetTimespan: 3.5 * 24 * 60 * 60,
|
|
targetSpacing: 2.5 * 60,
|
|
retargetInterval: 2016,
|
|
targetReset: true,
|
|
noRetargeting: true
|
|
};
|
|
|
|
regtest.block = {
|
|
bip34height: 0xffffffff,
|
|
bip34hash: null,
|
|
bip65height: 1351,
|
|
bip65hash: null,
|
|
bip66height: 1251,
|
|
bip66hash: null,
|
|
pruneAfterHeight: 1000,
|
|
keepBlocks: 10000,
|
|
maxTipAge: 0xffffffff,
|
|
slowHeight: 0
|
|
};
|
|
|
|
regtest.bip30 = {};
|
|
|
|
regtest.activationThreshold = 108; // 75% for testchains
|
|
|
|
regtest.minerWindow = 144; // Faster than normal for regtest
|
|
|
|
regtest.deployments = {
|
|
csv: {
|
|
name: 'csv',
|
|
bit: 0,
|
|
startTime: 0,
|
|
timeout: 0xffffffff,
|
|
threshold: -1,
|
|
window: -1,
|
|
required: false,
|
|
force: true
|
|
},
|
|
segwit: {
|
|
name: 'segwit',
|
|
bit: 1,
|
|
startTime: 0,
|
|
timeout: 0xffffffff,
|
|
threshold: -1,
|
|
window: -1,
|
|
required: true,
|
|
force: false
|
|
},
|
|
testdummy: {
|
|
name: 'testdummy',
|
|
bit: 28,
|
|
startTime: 0,
|
|
timeout: 0xffffffff,
|
|
threshold: -1,
|
|
window: -1,
|
|
required: false,
|
|
force: true
|
|
}
|
|
};
|
|
|
|
regtest.deploys = [
|
|
regtest.deployments.csv,
|
|
regtest.deployments.segwit,
|
|
regtest.deployments.testdummy
|
|
];
|
|
|
|
regtest.keyPrefix = {
|
|
privkey: 0xef,
|
|
xpubkey: 0x043587cf,
|
|
xprivkey: 0x04358394,
|
|
xpubkey58: 'xpub',
|
|
xprivkey58: 'xprv',
|
|
coinType: 1
|
|
};
|
|
|
|
regtest.addressPrefix = {
|
|
pubkeyhash: 0x6f,
|
|
scripthash: 0xc4,
|
|
scripthash2: 0x3a,
|
|
witnesspubkeyhash: 0x03,
|
|
witnessscripthash: 0x28,
|
|
bech32: 'rltc'
|
|
};
|
|
|
|
regtest.requireStandard = false;
|
|
|
|
regtest.rpcPort = 19445;
|
|
|
|
regtest.minRelay = 1000;
|
|
|
|
regtest.feeRate = 20000;
|
|
|
|
regtest.maxFeeRate = 60000;
|
|
|
|
regtest.selfConnect = true;
|
|
|
|
regtest.requestMempool = true;
|
|
|
|
/*
|
|
* Simnet (btcd)
|
|
*/
|
|
|
|
const simnet = {};
|
|
|
|
simnet.type = 'simnet';
|
|
|
|
simnet.seeds = [
|
|
'127.0.0.1'
|
|
];
|
|
|
|
simnet.magic = 0x12141c16;
|
|
|
|
simnet.port = 18555;
|
|
|
|
simnet.checkpointMap = {};
|
|
|
|
simnet.lastCheckpoint = 0;
|
|
|
|
simnet.halvingInterval = 210000;
|
|
|
|
simnet.genesis = {
|
|
version: 1,
|
|
hash: 'f67ad7695d9b662a72ff3d8edbbb2de0bfa67b13974bb9910d116d5cbd863e68',
|
|
prevBlock: '0000000000000000000000000000000000000000000000000000000000000000',
|
|
merkleRoot:
|
|
'3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a',
|
|
time: 1401292357,
|
|
bits: 545259519,
|
|
nonce: 2,
|
|
height: 0
|
|
};
|
|
|
|
simnet.genesisBlock =
|
|
'0100000000000000000000000000000000000000000000000000000000000000000000'
|
|
+ '003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a4506'
|
|
+ '8653ffff7f200200000001010000000100000000000000000000000000000000000000'
|
|
+ '00000000000000000000000000ffffffff4d04ffff001d0104455468652054696d6573'
|
|
+ '2030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66'
|
|
+ '207365636f6e64206261696c6f757420666f722062616e6b73ffffffff0100f2052a01'
|
|
+ '000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f'
|
|
+ '61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f'
|
|
+ 'ac00000000';
|
|
|
|
simnet.pow = {
|
|
limit: new BN(
|
|
// High target of 0x207fffff (545259519)
|
|
'7fffff0000000000000000000000000000000000000000000000000000000000',
|
|
'hex'
|
|
),
|
|
bits: 545259519,
|
|
chainwork: new BN(
|
|
'0000000000000000000000000000000000000000000000000000000000000002',
|
|
'hex'
|
|
),
|
|
targetTimespan: 3.5 * 24 * 60 * 60,
|
|
targetSpacing: 2.5 * 60,
|
|
retargetInterval: 2016,
|
|
targetReset: true,
|
|
noRetargeting: false
|
|
};
|
|
|
|
simnet.block = {
|
|
bip34height: 0,
|
|
bip34hash: 'f67ad7695d9b662a72ff3d8edbbb2de0bfa67b13974bb9910d116d5cbd863e68',
|
|
bip65height: 0,
|
|
bip65hash: 'f67ad7695d9b662a72ff3d8edbbb2de0bfa67b13974bb9910d116d5cbd863e68',
|
|
bip66height: 0,
|
|
bip66hash: 'f67ad7695d9b662a72ff3d8edbbb2de0bfa67b13974bb9910d116d5cbd863e68',
|
|
pruneAfterHeight: 1000,
|
|
keepBlocks: 10000,
|
|
maxTipAge: 0xffffffff,
|
|
slowHeight: 0
|
|
};
|
|
|
|
simnet.bip30 = {};
|
|
|
|
simnet.activationThreshold = 75; // 75% for testchains
|
|
|
|
simnet.minerWindow = 100; // nPowTargetTimespan / nPowTargetSpacing
|
|
|
|
simnet.deployments = {
|
|
csv: {
|
|
name: 'csv',
|
|
bit: 0,
|
|
startTime: 0, // March 1st, 2016
|
|
timeout: 0xffffffff, // May 1st, 2017
|
|
threshold: -1,
|
|
window: -1,
|
|
required: false,
|
|
force: true
|
|
},
|
|
segwit: {
|
|
name: 'segwit',
|
|
bit: 1,
|
|
startTime: 0, // May 1st 2016
|
|
timeout: 0xffffffff, // May 1st 2017
|
|
threshold: -1,
|
|
window: -1,
|
|
required: true,
|
|
force: false
|
|
},
|
|
segsignal: {
|
|
name: 'segsignal',
|
|
bit: 4,
|
|
startTime: 0xffffffff,
|
|
timeout: 0xffffffff,
|
|
threshold: 269,
|
|
window: 336,
|
|
required: false,
|
|
force: false
|
|
},
|
|
testdummy: {
|
|
name: 'testdummy',
|
|
bit: 28,
|
|
startTime: 1199145601, // January 1, 2008
|
|
timeout: 1230767999, // December 31, 2008
|
|
threshold: -1,
|
|
window: -1,
|
|
required: false,
|
|
force: true
|
|
}
|
|
};
|
|
|
|
simnet.deploys = [
|
|
simnet.deployments.csv,
|
|
simnet.deployments.segwit,
|
|
simnet.deployments.segsignal,
|
|
simnet.deployments.testdummy
|
|
];
|
|
|
|
simnet.keyPrefix = {
|
|
privkey: 0x64,
|
|
xpubkey: 0x0420bd3a,
|
|
xprivkey: 0x0420b900,
|
|
xpubkey58: 'spub',
|
|
xprivkey58: 'sprv',
|
|
coinType: 115
|
|
};
|
|
|
|
simnet.addressPrefix = {
|
|
pubkeyhash: 0x3f,
|
|
scripthash: 0x7b,
|
|
witnesspubkeyhash: 0x19,
|
|
witnessscripthash: 0x28,
|
|
bech32: 'sc'
|
|
};
|
|
|
|
simnet.requireStandard = false;
|
|
|
|
simnet.rpcPort = 18556;
|
|
|
|
simnet.minRelay = 1000;
|
|
|
|
simnet.feeRate = 20000;
|
|
|
|
simnet.maxFeeRate = 60000;
|
|
|
|
simnet.selfConnect = false;
|
|
|
|
simnet.requestMempool = false;
|
|
|
|
/*
|
|
* Expose
|
|
*/
|
|
|
|
network.main = main;
|
|
network.testnet = testnet;
|
|
network.regtest = regtest;
|
|
network.simnet = simnet;
|