diff --git a/lib/blockchain/chain.js b/lib/blockchain/chain.js index a4adbd3c6..8ac34b18e 100644 --- a/lib/blockchain/chain.js +++ b/lib/blockchain/chain.js @@ -420,13 +420,6 @@ class Chain extends AsyncEmitter { // Get the new deployment state. const state = await this.getDeployments(block.time, prev); - // Enforce BIP91/BIP148. - if (state.hasBIP91() || state.hasBIP148()) { - const {segwit} = this.network.deployments; - if (!consensus.hasBit(block.version, segwit.bit)) - throw new VerifyError(block, 'invalid', 'bad-no-segwit', 0); - } - // Get timestamp for tx.isFinal(). const time = state.hasMTP() ? mtp : block.time; @@ -452,50 +445,9 @@ class Chain extends AsyncEmitter { } } - // Check the commitment hash for segwit. - let commit = null; - if (state.hasWitness()) { - commit = block.getCommitmentHash(); - if (commit) { - // These are totally malleable. Someone - // may have even accidentally sent us - // the non-witness version of the block. - // We don't want to consider this block - // "invalid" if either of these checks - // fail. - if (!block.getWitnessNonce()) { - throw new VerifyError(block, - 'invalid', - 'bad-witness-nonce-size', - 100, - true); - } - - if (!commit.equals(block.createCommitmentHash())) { - throw new VerifyError(block, - 'invalid', - 'bad-witness-merkle-match', - 100, - true); - } - } - } - - // Blocks that do not commit to - // witness data cannot contain it. - if (!commit) { - if (block.hasWitness()) { - throw new VerifyError(block, - 'invalid', - 'unexpected-witness', - 100, - true); - } - } - - // Check block weight (different from block size + // Check block size (different from block size // check in non-contextual verification). - if (block.getWeight() > consensus.MAX_BLOCK_WEIGHT) { + if (block.getBaseSize() > state.maxBlockSize()) { throw new VerifyError(block, 'invalid', 'bad-blk-weight', @@ -540,6 +492,13 @@ class Chain extends AsyncEmitter { if (height >= this.network.block.bip65height) state.flags |= Script.flags.VERIFY_CHECKLOCKTIMEVERIFY; + // UAHF is now enabled. + const mtp = await this.getMedianTime(prev); + if (mtp >= consensus.UAHF_TIME) { + state.flags = Script.flags.VERIFY_STRICTENC; + state.flags = Script.flags.VERIFY_SIGHASH_FORKID; + } + // CHECKSEQUENCEVERIFY and median time // past locktimes are now usable (bip9 & bip113). if (await this.isActive(prev, deployments.csv)) { @@ -548,41 +507,6 @@ class Chain extends AsyncEmitter { state.lockFlags |= common.lockFlags.MEDIAN_TIME_PAST; } - // Check the state of the segwit deployment. - const witness = await this.getState(prev, deployments.segwit); - - // Segregrated witness (bip141) is now usable - // along with SCRIPT_VERIFY_NULLDUMMY (bip147). - if (witness === thresholdStates.ACTIVE) { - state.flags |= Script.flags.VERIFY_WITNESS; - state.flags |= Script.flags.VERIFY_NULLDUMMY; - } - - // Segsignal is now enforced (bip91). - if (this.options.bip91) { - if (witness === thresholdStates.STARTED) { - if (await this.isActive(prev, deployments.segsignal)) - state.bip91 = true; - } - } - - // UASF is now enforced (bip148) (mainnet-only). - if (this.options.bip148 && this.network === Network.main) { - if (witness !== thresholdStates.LOCKED_IN - && witness !== thresholdStates.ACTIVE) { - // The BIP148 MTP check is nonsensical in - // that it includes the _current_ entry's - // timestamp. This requires some hackery, - // since bcoin only operates on the sane - // assumption that deployment checks should - // only ever examine the values of the - // previous block (necessary for mining). - const mtp = await this.getMedianTime(prev, time); - if (mtp >= 1501545600 && mtp <= 1510704000) - state.bip148 = true; - } - } - return state; } @@ -621,6 +545,9 @@ class Chain extends AsyncEmitter { if (!this.state.hasBIP148() && state.hasBIP148()) this.logger.warning('BIP148 has been activated.'); + if (!this.state.hasUAHF() && state.hasUAHF()) + this.logger.warning('UAHF has been activated.'); + this.state = state; } @@ -2262,38 +2189,56 @@ class Chain extends AsyncEmitter { return pow.bits; } + if ((prev.height + 1) % pow.retargetInterval === 0) { + // Back 2 weeks + const height = prev.height - (pow.retargetInterval - 1); + assert(height >= 0); + + const first = await this.getAncestor(prev, height); + assert(first); + + return this.retarget(prev, first); + } + // Do not retarget - if ((prev.height + 1) % pow.retargetInterval !== 0) { - if (pow.targetReset) { - // Special behavior for testnet: - if (time > prev.time + pow.targetSpacing * 2) - return pow.bits; - - while (prev.height !== 0 - && prev.height % pow.retargetInterval !== 0 - && prev.bits === pow.bits) { - const cache = this.getPrevCache(prev); - - if (cache) - prev = cache; - else - prev = await this.getPrevious(prev); - - assert(prev); + if (pow.targetReset) { + // Special behavior for testnet: + if (time > prev.time + pow.targetSpacing * 2) + return pow.bits; + + while (prev.height !== 0 + && prev.height % pow.retargetInterval !== 0 + && prev.bits === pow.bits) { + const cache = this.getPrevCache(prev); + + if (cache) { + prev = cache; + continue; } + + prev = await this.getPrevious(prev); + assert(prev); } - return prev.bits; } - // Back 2 weeks - const height = prev.height - (pow.retargetInterval - 1); - assert(height >= 0); + if (prev.bits === pow.bits) + return prev.bits; - const first = await this.getAncestor(prev, height); - assert(first); + const prev6 = await this.getAncestor(prev, (prev.height + 1) - 7); + assert(prev6); + const mtp6 = (await this.getMedianTime(prev)) - (await this.getMedianTime(prev6)); - return this.retarget(prev, first); - } + if (mtp6 < 12 * 3600) + return prev.bits; + + const target = consensus.fromCompact(prev.bits); + target.iadd(target.ushrn(2)); + + if (target.cmp(pow.limit) > 0) + return pow.bits; + + return consensus.toCompact(target); + }; /** * Retarget. This is called when the chain height @@ -2894,6 +2839,26 @@ class DeploymentState { } } +/** + * Test whether UAHF is active. + * @returns {Boolean} + */ + +DeploymentState.prototype.hasUAHF = function hasUAHF() { + return (this.flags & Script.flags.VERIFY_SIGHASH_FORKID) !== 0; +}; + +/** + * Test whether UAHF is active. + * @returns {Boolean} + */ + +DeploymentState.prototype.maxBlockSize = function maxBlockSize() { + return this.hasUAHF() + ? consensus.MAX_FORK_BLOCK_SIZE + : consensus.MAX_BLOCK_SIZE; +}; + /** * Orphan * @ignore diff --git a/lib/blockchain/chaindb.js b/lib/blockchain/chaindb.js index 869d6cc55..21a3d2b70 100644 --- a/lib/blockchain/chaindb.js +++ b/lib/blockchain/chaindb.js @@ -59,7 +59,7 @@ class ChainDB { this.logger.info('Opening ChainDB...'); await this.db.open(); - await this.db.verify(layout.V.build(), 'chain', 5); + await this.db.verify(layout.V.build(), 'chain', 0x80 | 5); const state = await this.getState(); diff --git a/lib/net/common.js b/lib/net/common.js index 13b78c0fa..11dbca717 100644 --- a/lib/net/common.js +++ b/lib/net/common.js @@ -142,7 +142,7 @@ exports.USER_AGENT = `/bcoin:${pkg.version}/`; * @default */ -exports.MAX_MESSAGE = 4 * 1000 * 1000; +exports.MAX_MESSAGE = 8 * 1000 * 1000; /** * Amount of time to ban misbheaving peers. diff --git a/lib/net/seeds/main.js b/lib/net/seeds/main.js index 5a284196d..104c4ef24 100644 --- a/lib/net/seeds/main.js +++ b/lib/net/seeds/main.js @@ -1,1454 +1,3 @@ 'use strict'; -module.exports = [ - '2.228.70.198:8333', - '4.15.180.29:8333', - '4.15.180.30:8333', - '5.2.67.110:8333', - '5.39.224.103:8333', - '5.43.124.154:8333', - '5.189.165.102:8333', - '5.226.149.145:8333', - '5.228.7.146:8333', - '5.228.64.71:8333', - '5.249.152.101:8333', - '5.254.124.55:8333', - '5.255.64.231:8333', - '5.255.90.234:8333', - '14.192.8.27:21301', - '18.62.3.86:8333', - '18.85.35.80:8333', - '23.28.128.65:8333', - '23.108.83.12:8333', - '23.233.2.238:8333', - '24.27.65.168:8333', - '24.56.241.219:8333', - '24.64.75.132:8333', - '24.73.70.26:8333', - '24.121.154.140:8333', - '24.203.96.72:8333', - '24.225.34.62:8333', - '24.227.69.146:8333', - '24.232.136.119:8333', - '31.16.123.235:8333', - '31.19.205.53:8333', - '31.132.136.35:8333', - '31.184.234.85:8333', - '31.211.102.161:8333', - '37.48.64.140:8333', - '37.97.141.116:8333', - '37.120.160.12:8333', - '37.120.164.16:8333', - '37.134.226.181:8333', - '37.147.110.43:8333', - '37.194.10.30:8333', - '37.247.22.53:8333', - '38.27.65.158:8333', - '38.133.141.34:8333', - '43.248.160.151:8333', - '45.32.130.19:8333', - '45.32.193.157:8333', - '45.46.161.121:8333', - '45.56.97.63:8333', - '45.116.178.79:8188', - '46.16.240.98:8333', - '46.20.246.100:8333', - '46.21.97.135:8333', - '46.59.10.237:8333', - '46.59.13.59:8333', - '46.148.16.210:8333', - '46.166.160.96:8333', - '46.188.44.20:8333', - '46.229.238.187:8333', - '46.231.16.149:8333', - '47.88.35.181:8333', - '47.88.100.130:8333', - '47.184.129.94:8333', - '47.199.68.204:8333', - '50.30.38.203:8333', - '50.63.162.242:8333', - '50.97.133.208:8333', - '50.114.227.224:8333', - '51.15.0.17:8333', - '51.174.69.239:8333', - '52.7.135.69:8333', - '52.14.64.82:8333', - '52.204.105.25:8333', - '54.255.160.87:8333', - '61.47.2.20:8333', - '61.125.131.55:8333', - '62.43.130.178:8333', - '62.106.16.111:8333', - '62.107.200.30:8333', - '62.109.20.99:8333', - '62.133.194.2:8333', - '62.133.194.156:8333', - '62.176.6.94:8333', - '62.182.169.222:8333', - '62.205.132.245:8333', - '62.216.238.133:8333', - '63.231.239.212:8333', - '64.34.231.140:8333', - '64.203.102.86:8333', - '64.233.245.39:8333', - '65.183.76.73:8333', - '66.96.199.166:8333', - '66.194.38.250:8333', - '66.194.38.253:8333', - '66.196.12.63:8333', - '67.215.6.34:8333', - '67.221.193.55:8333', - '68.66.193.192:8333', - '68.69.235.230:8333', - '68.111.10.219:8333', - '68.119.138.175:8333', - '68.132.193.222:8333', - '68.194.42.76:8333', - '68.235.41.204:8333', - '69.11.97.43:8333', - '69.41.3.212:8333', - '69.41.171.35:8333', - '69.41.171.36:8333', - '69.55.64.216:8333', - '69.84.42.56:8333', - '70.48.48.250:8333', - '70.112.32.29:8333', - '70.250.74.20:8333', - '71.93.161.162:8333', - '71.198.0.126:8333', - '72.5.167.41:8333', - '72.224.11.103:8333', - '73.72.160.213:8333', - '74.122.237.124:8333', - '75.86.137.34:8333', - '75.165.99.144:8333', - '76.64.74.193:8333', - '76.76.227.136:8333', - '76.173.161.44:8333', - '76.178.22.44:8333', - '77.47.137.27:8333', - '77.77.46.250:8333', - '77.91.193.152:8333', - '77.95.226.194:8333', - '77.120.246.254:8333', - '77.163.136.136:8333', - '77.203.13.57:8333', - '77.236.37.214:8333', - '77.239.37.12:8333', - '77.247.179.44:8333', - '78.34.14.52:8333', - '78.109.163.153:8333', - '78.196.172.45:8333', - '79.132.230.144:8333', - '79.160.2.105:8333', - '80.82.77.138:8333', - '80.100.203.151:8333', - '80.147.68.237:8333', - '80.237.240.102:8333', - '81.2.246.127:8333', - '81.7.7.86:8333', - '81.7.10.238:8333', - '81.27.96.37:8333', - '81.83.96.5:8333', - '81.228.194.187:8333', - '82.45.69.216:8333', - '82.69.44.183:8333', - '82.72.198.68:8333', - '82.95.204.10:8333', - '82.118.236.127:8333', - '82.118.242.4:8333', - '82.134.66.146:8333', - '82.193.109.199:8333', - '82.197.210.65:8333', - '82.199.102.10:8333', - '82.200.205.30:8333', - '82.221.108.27:8333', - '82.221.128.81:8333', - '82.221.139.97:8333', - '82.232.202.246:8333', - '83.60.64.252:8333', - '83.61.8.228:8333', - '83.128.41.48:8333', - '83.128.111.69:8333', - '83.137.41.10:8333', - '83.150.43.17:8333', - '83.169.2.43:8333', - '83.174.209.87:8333', - '83.255.43.163:8333', - '84.42.193.6:8333', - '84.52.145.231:8333', - '84.52.234.70:8333', - '84.85.102.113:8333', - '84.92.92.247:8333', - '84.146.35.123:8333', - '84.212.198.222:8333', - '84.217.163.135:8333', - '84.245.27.185:8333', - '84.251.203.5:8333', - '85.21.144.226:8333', - '85.25.194.12:8333', - '85.25.194.28:8333', - '85.144.119.222:8333', - '85.183.140.62:8333', - '85.214.228.203:8333', - '85.214.234.254:8333', - '85.218.150.1:8333', - '85.228.196.10:8333', - '86.15.2.235:8333', - '86.61.6.210:8333', - '87.92.115.194:8333', - '87.120.8.5:8333', - '87.120.37.230:8333', - '87.233.181.146:8333', - '87.239.101.102:8333', - '88.87.78.126:8333', - '88.98.198.130:8333', - '88.98.225.214:8333', - '88.99.58.194:8333', - '88.150.192.17:8333', - '88.196.136.31:17556', - '88.208.58.193:8333', - '88.208.58.194:8333', - '89.22.96.132:8333', - '89.22.104.48:8333', - '89.25.80.98:8333', - '89.34.99.41:8333', - '89.142.195.112:8333', - '89.163.224.187:8333', - '89.163.224.195:8333', - '89.238.79.235:8333', - '90.46.240.214:8333', - '90.65.232.129:8333', - '90.71.117.90:8333', - '90.149.38.172:8333', - '90.156.97.145:8333', - '90.177.48.104:8333', - '91.106.194.97:8333', - '91.135.0.187:8333', - '91.150.189.155:8333', - '91.185.198.216:8333', - '91.196.11.45:8333', - '91.197.44.133:8333', - '91.224.0.227:8333', - '91.226.10.90:8333', - '91.228.45.130:8333', - '91.229.77.239:8333', - '91.238.100.249:8333', - '91.240.141.169:8333', - '92.27.7.209:8333', - '92.54.16.135:8333', - '93.89.84.93:8333', - '93.100.51.48:8333', - '93.100.76.151:8333', - '93.104.214.235:8333', - '93.115.86.246:8333', - '93.123.80.47:8333', - '93.174.88.211:8333', - '93.188.224.253:8333', - '93.190.69.242:8333', - '94.74.81.93:8333', - '94.156.35.8:8333', - '94.176.237.241:8333', - '94.181.44.104:8333', - '94.227.43.171:8333', - '95.79.102.208:8333', - '95.79.102.209:8333', - '95.154.237.24:8333', - '95.183.48.62:8333', - '95.183.48.71:8333', - '95.213.161.2:8333', - '95.213.201.94:8333', - '96.20.227.39:8333', - '96.28.41.91:8333', - '98.127.130.17:8333', - '100.36.48.101:8333', - '101.0.81.42:8333', - '101.0.81.43:8333', - '103.11.64.46:8333', - '103.24.244.69:8333', - '103.47.210.50:8333', - '103.76.41.169:8333', - '103.80.168.57:8333', - '103.203.51.186:8333', - '103.224.118.79:8333', - '103.250.4.74:8333', - '104.192.170.202:8333', - '104.196.0.99:8333', - '104.199.192.85:8333', - '104.219.251.46:8333', - '104.223.108.33:8333', - '104.237.2.189:8333', - '104.247.230.28:8333', - '107.150.45.210:8333', - '107.174.34.77:8333', - '107.174.34.78:8333', - '107.180.71.47:8333', - '108.59.12.163:8333', - '108.168.37.13:8333', - '108.175.3.18:8333', - '108.234.193.106:8333', - '109.9.173.13:8333', - '109.101.220.151:8333', - '109.172.104.119:8333', - '109.195.193.138:8333', - '109.206.177.21:8333', - '109.226.35.28:8333', - '109.255.0.107:8333', - '113.29.183.143:8333', - '114.145.97.73:8333', - '115.66.205.171:8333', - '118.67.201.40:8333', - '118.194.226.168:8333', - '119.28.70.144:8333', - '120.24.166.73:9998', - '120.76.244.201:10022', - '121.82.4.232:8333', - '121.254.173.40:8333', - '123.203.163.128:8333', - '124.171.70.45:8333', - '125.63.57.7:8333', - '125.128.35.41:8333', - '128.208.244.124:8333', - '128.230.208.73:8333', - '131.114.10.233:8333', - '131.114.10.235:8333', - '132.239.36.105:8333', - '134.213.214.233:8333', - '136.61.238.121:8333', - '136.62.86.140:8333', - '136.144.128.49:8333', - '137.48.144.52:8333', - '137.116.160.176:8333', - '137.117.193.113:8333', - '138.19.79.208:8333', - '138.68.64.19:8333', - '139.59.96.16:8333', - '139.162.160.232:8333', - '141.136.115.230:8333', - '142.59.232.111:8333', - '142.111.2.74:8333', - '142.162.128.23:8333', - '143.107.116.5:8333', - '143.229.22.74:8333', - '143.229.36.71:8333', - '144.2.105.60:8333', - '144.76.224.214:8333', - '146.185.19.30:8333', - '147.32.30.25:8333', - '147.229.13.210:8333', - '148.103.7.119:8333', - '150.101.114.194:8333', - '150.229.0.143:8333', - '154.66.207.126:8333', - '158.129.212.236:8333', - '158.129.212.251:8333', - '160.16.206.31:8333', - '162.209.1.233:8333', - '162.209.4.125:8333', - '162.220.246.225:8333', - '163.172.218.186:8333', - '166.230.70.145:8333', - '168.235.74.45:8333', - '169.44.34.88:8333', - '170.75.195.168:8333', - '172.112.2.67:8333', - '173.94.164.38:8333', - '173.183.232.109:8333', - '173.208.176.122:8333', - '173.212.194.114:8333', - '173.232.228.146:8333', - '175.126.124.92:8333', - '175.145.109.51:8333', - '176.24.198.205:8333', - '176.36.37.62:8333', - '176.36.99.222:8333', - '176.106.144.183:8333', - '177.33.1.40:8333', - '178.162.214.225:8333', - '178.164.109.83:8333', - '178.170.138.202:8333', - '178.175.136.122:8333', - '178.218.209.162:8333', - '178.254.2.64:8333', - '178.254.34.144:8333', - '178.255.41.21:8333', - '178.255.144.163:8333', - '180.181.208.42:8333', - '180.200.128.58:8333', - '180.235.50.14:8333', - '181.215.148.154:8333', - '184.64.13.43:8333', - '184.94.164.170:8333', - '184.152.107.251:8333', - '184.182.233.206:8333', - '185.4.24.199:8333', - '185.20.99.49:8333', - '185.24.97.11:8333', - '185.25.48.27:8333', - '185.25.48.71:8333', - '185.26.196.249:8333', - '185.28.76.179:8333', - '185.35.139.250:8333', - '185.41.113.69:8333', - '185.50.213.123:8333', - '185.50.213.124:8333', - '185.50.232.114:8333', - '185.51.192.40:8333', - '185.53.129.244:8333', - '185.71.177.100:8333', - '185.77.129.176:8333', - '185.82.201.51:8333', - '185.121.173.223:8333', - '185.140.252.253:8333', - '185.145.129.184:8333', - '185.145.130.163:8333', - '185.154.156.50:8333', - '185.162.124.69:8333', - '185.170.42.2:8333', - '186.149.197.96:8333', - '188.65.212.138:8333', - '188.65.213.48:8333', - '188.93.209.192:8333', - '188.113.79.45:8333', - '188.113.84.116:8333', - '188.113.164.231:8333', - '188.122.16.153:8333', - '188.165.224.28:8333', - '188.175.239.227:8333', - '188.214.128.18:8333', - '188.227.64.19:8333', - '188.253.2.125:8333', - '189.45.203.166:8333', - '190.184.198.34:8333', - '192.151.145.250:8333', - '192.206.202.6:8333', - '192.228.101.157:8333', - '193.2.76.41:8333', - '193.27.209.100:8333', - '193.33.237.187:8333', - '193.46.83.17:8333', - '193.49.43.219:8333', - '194.24.182.27:8333', - '194.28.206.201:8333', - '194.63.143.197:8333', - '194.71.109.91:8333', - '194.79.8.36:8333', - '194.135.93.38:8333', - '194.186.160.253:8333', - '195.9.140.134:8333', - '195.39.206.29:8333', - '195.67.36.89:8333', - '195.169.99.82:8333', - '195.214.214.253:8333', - '195.223.71.147:8333', - '198.37.118.11:8333', - '198.54.113.125:8333', - '198.101.12.139:8333', - '198.143.12.105:8333', - '198.251.83.19:8333', - '199.127.224.50:8333', - '200.12.138.146:8333', - '200.116.98.185:8333', - '200.122.128.130:8333', - '202.29.6.48:8333', - '202.133.115.115:8333', - '203.59.17.160:8333', - '204.15.11.4:8333', - '204.111.241.195:8333', - '205.251.85.151:8333', - '207.244.70.40:8333', - '207.254.50.72:8333', - '208.76.93.83:8333', - '208.107.97.242:8333', - '208.110.73.107:8333', - '208.118.235.190:8333', - '209.73.142.226:8333', - '209.81.9.223:8333', - '209.126.107.166:8333', - '209.177.86.19:8333', - '209.250.6.190:8333', - '210.1.219.155:8333', - '210.211.109.165:8333', - '210.223.3.44:8333', - '211.21.129.69:8333', - '212.50.98.161:8333', - '212.51.140.183:8333', - '212.56.108.81:8333', - '212.83.35.173:8333', - '212.90.179.206:8333', - '212.93.226.90:8333', - '212.110.171.118:8333', - '213.5.36.58:8333', - '213.5.181.205:8333', - '213.17.16.251:8333', - '213.91.205.134:8333', - '213.91.211.17:8333', - '213.155.3.216:8333', - '213.168.13.151:8333', - '213.186.170.109:8334', - '213.222.208.150:8333', - '216.32.213.112:8333', - '216.59.4.212:8333', - '216.126.193.163:8333', - '216.197.79.74:8333', - '216.218.147.140:8333', - '216.227.39.84:8333', - '216.245.206.181:8333', - '216.249.92.230:8333', - '217.12.199.207:8333', - '217.23.2.177:8333', - '217.23.5.68:8333', - '217.28.194.2:8333', - '217.35.130.42:8333', - '217.64.47.138:8333', - '217.101.72.242:8333', - '217.145.81.229:8333', - '217.168.143.169:8333', - '217.169.7.111:8333', - '217.182.192.7:8333', - '219.88.232.229:8333', - '219.113.244.52:8333', - '220.130.128.58:8333', - '220.244.225.239:8333', - '221.141.3.12:8333', - '222.166.176.99:8333', - '223.252.173.147:8333', - '[2001:0:4137:9e76:1025:4e5:acb0:22cd]:8333', - '[2001:0:4137:9e76:1078:18a6:5d2c:2461]:8333', - '[2001:0:4137:9e76:10ec:236a:bd3b:f3c0]:8333', - '[2001:0:4137:9e76:186d:3f17:b7ad:95cf]:8333', - '[2001:0:4137:9e76:1870:242:ac03:aaf9]:8333', - '[2001:0:4137:9e76:18a6:1102:2abf:eb70]:8333', - '[2001:0:4137:9e76:1ce5:248c:4ff5:2b1d]:8333', - '[2001:0:4137:9e76:200f:156a:bc77:3acd]:8333', - '[2001:0:4137:9e76:2418:19d1:cddc:b1af]:8333', - '[2001:0:4137:9e76:2857:3d78:aaf8:eb28]:8333', - '[2001:0:4137:9e76:28b2:1b84:64fb:2d6a]:8333', - '[2001:0:4137:9e76:2c70:d51:d046:1209]:8333', - '[2001:0:4137:9e76:2cac:2fcf:46bb:be0d]:8333', - '[2001:0:4137:9e76:305e:20ee:a94f:6f69]:8333', - '[2001:0:4137:9e76:30cd:849:adfe:6e67]:8333', - '[2001:0:4137:9e76:345b:f12:ae1e:2948]:8333', - '[2001:0:4137:9e76:3c40:146e:9741:5a3a]:8333', - '[2001:0:4137:9e76:3c9e:3c3e:9d6e:7340]:8333', - '[2001:0:4137:9e76:499:29a8:d047:7ea1]:8333', - '[2001:0:4137:9e76:51:24:81b2:59e3]:8333', - '[2001:0:4137:9e76:889:2d7c:b61b:bf0d]:8333', - '[2001:0:4137:9e76:c9f:379c:add2:c938]:8333', - '[2001:0:4137:9e76:cd6:2eb4:b82b:addb]:8333', - '[2001:0:4137:9e76:cf0:2e3a:b29d:6207]:8333', - '[2001:0:53aa:64c:1485:fbf9:a798:1ffe]:8333', - '[2001:0:53aa:64c:59:617f:a10d:e0]:8333', - '[2001:0:5ef5:79fb:1020:2cd0:4750:eb12]:8333', - '[2001:0:5ef5:79fb:1036:1d50:3881:6930]:8333', - '[2001:0:5ef5:79fb:10a4:27d8:9c0a:cfa9]:8333', - '[2001:0:5ef5:79fb:10ae:5a8:524b:dcc4]:8333', - '[2001:0:5ef5:79fb:1892:3e3a:3f74:affa]:8333', - '[2001:0:5ef5:79fb:1c95:1a60:d1f5:215b]:8333', - '[2001:0:5ef5:79fb:200b:16ef:b9cf:9860]:8333', - '[2001:0:5ef5:79fb:28e4:fbff:3237:992]:8333', - '[2001:0:5ef5:79fb:2ce8:1d9e:b3bf:b53e]:8333', - '[2001:0:5ef5:79fb:300a:2e20:4750:eb12]:8333', - '[2001:0:5ef5:79fb:30a2:1ad9:5324:836a]:8333', - '[2001:0:5ef5:79fb:3409:1996:bcac:241f]:8333', - '[2001:0:5ef5:79fb:344b:2bd4:bb3e:e26]:8333', - '[2001:0:5ef5:79fb:34b3:11db:e7da:d461]:8333', - '[2001:0:5ef5:79fb:3839:2e0c:ba30:288e]:8333', - '[2001:0:5ef5:79fb:3880:ef4:b5f0:ee4d]:8333', - '[2001:0:5ef5:79fb:389f:52:9c0c:1f41]:8333', - '[2001:0:5ef5:79fb:3c73:304a:9d8b:99d5]:8333', - '[2001:0:5ef5:79fb:3cac:33e4:39ca:38c]:8333', - '[2001:0:5ef5:79fb:6f:3667:5398:538f]:8333', - '[2001:0:5ef5:79fb:88c:3e6:9454:3331]:8333', - '[2001:0:5ef5:79fb:89:3b55:9fcc:8e66]:8333', - '[2001:0:5ef5:79fb:c9b:3d65:bdf4:5d58]:8333', - '[2001:0:5ef5:79fb:cb7:8cc:b8ee:6806]:8333', - '[2001:0:5ef5:79fd:24f6:37b5:b9d2:2aa7]:8333', - '[2001:0:5ef5:79fd:3c63:82e:aabc:bd39]:8333', - '[2001:0:5ef5:79fd:3cf5:2eb7:c966:561d]:8333', - '[2001:0:5ef5:79fd:cf4:28e2:aabd:b766]:8333', - '[2001:0:9d38:6ab8:10f6:453:3ca4:1a8e]:8333', - '[2001:0:9d38:6ab8:14dd:298b:431c:bfec]:8333', - '[2001:0:9d38:6ab8:3051:1561:b62d:73a5]:8333', - '[2001:0:9d38:6ab8:3467:ffa:b612:e9c6]:8333', - '[2001:0:9d38:6ab8:8e8:1e26:e8e3:eed7]:8333', - '[2001:0:9d38:6ab8:c82:37b3:47ee:3ae2]:8333', - '[2001:0:9d38:6abd:1052:3cd8:a89b:e67]:8333', - '[2001:0:9d38:6abd:144d:23f3:abcb:8bcb]:8333', - '[2001:0:9d38:6abd:1c2e:31df:adf1:e616]:8333', - '[2001:0:9d38:6abd:1c41:213b:facc:9c6b]:8333', - '[2001:0:9d38:6abd:2093:12b5:8cbf:4f57]:8333', - '[2001:0:9d38:6abd:243a:2394:fd91:712c]:8333', - '[2001:0:9d38:6abd:2833:9f8:c94c:6881]:8333', - '[2001:0:9d38:6abd:2c84:29d3:ae5a:f6f0]:8333', - '[2001:0:9d38:6abd:2ce4:d50:cb22:3672]:8333', - '[2001:0:9d38:6abd:3824:816:c30d:e9d4]:8333', - '[2001:0:9d38:6abd:389a:24e9:cb5c:a1cd]:8333', - '[2001:0:9d38:6abd:38bd:88f:2193:4932]:8333', - '[2001:0:9d38:6abd:3c4f:cb1:d65b:d775]:8333', - '[2001:0:9d38:6abd:3c51:280b:b1e9:ffd]:8333', - '[2001:0:9d38:6abd:3c5a:2e2:2193:4932]:8333', - '[2001:0:9d38:6abd:3c5e:3ebf:3dc0:703a]:8333', - '[2001:0:9d38:6abd:4c9:12fc:d1d9:dc21]:8333', - '[2001:0:9d38:6abd:6e:34e7:d0a7:6772]:8333', - '[2001:0:9d38:6abd:8de:1f29:2aea:f96f]:8333', - '[2001:0:9d38:6abd:c5f:2674:a467:787c]:8333', - '[2001:0:9d38:6abd:cc0:23a4:ad7c:c998]:8333', - '[2001:0:9d38:78cf:20c0:2097:d188:9c3b]:8333', - '[2001:0:9d38:78cf:2420:dda:4ff6:8794]:8333', - '[2001:0:9d38:78cf:2892:fcb:26b2:22ac]:8333', - '[2001:0:9d38:78cf:3020:1ad7:26b2:22ac]:8333', - '[2001:0:9d38:78cf:30ae:211b:e717:7788]:8333', - '[2001:0:9d38:78cf:30d0:6edd:a418:a9e9]:8333', - '[2001:0:9d38:78cf:30d9:3278:b004:65a7]:8333', - '[2001:0:9d38:78cf:387a:17d5:dacb:bdf1]:8333', - '[2001:0:9d38:78cf:3c38:c41:433c:7b87]:8333', - '[2001:0:9d38:78cf:467:193:a8b0:a122]:8333', - '[2001:0:9d38:78cf:c65:fb96:97d2:a9b0]:8333', - '[2001:0:9d38:78cf:c9f:2633:d169:9999]:8333', - '[2001:0:9d38:78cf:ce2:aba:d120:90db]:8333', - '[2001:0:9d38:90d7:105d:26f2:a241:7339]:8333', - '[2001:0:9d38:90d7:1062:3f95:e065:fc21]:8333', - '[2001:0:9d38:90d7:10a6:19f6:ab95:ebcb]:8333', - '[2001:0:9d38:90d7:14e2:22cb:738f:9489]:8333', - '[2001:0:9d38:90d7:18fb:3da9:893d:1d57]:8333', - '[2001:0:9d38:90d7:1cc3:2534:e020:53fa]:8333', - '[2001:0:9d38:90d7:206d:2b34:d0cb:9de8]:8333', - '[2001:0:9d38:90d7:20cb:2cb:b9a7:ca5e]:8333', - '[2001:0:9d38:90d7:245c:2753:4382:704b]:8333', - '[2001:0:9d38:90d7:24d6:225f:793b:bf5]:8333', - '[2001:0:9d38:90d7:24da:8f0:bbf9:9c93]:8333', - '[2001:0:9d38:90d7:28a2:107b:438e:b08d]:8333', - '[2001:0:9d38:90d7:2c16:d58:b381:b61]:8333', - '[2001:0:9d38:90d7:2c68:3068:cb59:3be7]:8333', - '[2001:0:9d38:90d7:2c90:3855:b94f:c926]:8333', - '[2001:0:9d38:90d7:2ca2:3592:c111:dd82]:8333', - '[2001:0:9d38:90d7:2cce:1f6e:b381:8605]:8333', - '[2001:0:9d38:90d7:3435:3915:2bcc:6cc7]:8333', - '[2001:0:9d38:90d7:3438:2b9f:ad57:a721]:8333', - '[2001:0:9d38:90d7:3474:1df1:e732:e5e3]:8333', - '[2001:0:9d38:90d7:38c4:37af:ab0a:f5ef]:8333', - '[2001:0:9d38:90d7:3a:39fd:a43b:5591]:8333', - '[2001:0:9d38:90d7:3c9d:2a45:d537:3bd6]:8333', - '[2001:0:9d38:90d7:3cfb:2cf5:5254:4d1e]:8333', - '[2001:0:9d38:90d7:43f:337:adb4:6310]:8333', - '[2001:0:9d38:90d7:493:995:d2e9:39be]:8333', - '[2001:0:9d38:90d7:5b:ce3:b275:92ab]:8333', - '[2001:0:9d38:90d7:8a8:59d:d0cb:d585]:8333', - '[2001:0:9d38:90d7:c8e:1ba0:c5a9:dace]:8333', - '[2001:0:9d38:90d7:cdb:365f:2302:f729]:8333', - '[2001:0:9d38:90d7:cf5:222e:893e:716c]:8333', - '[2001:0:9d38:90d7:d6:1085:b8dd:41c2]:8333', - '[2001:0:9d38:953c:101a:23b3:6b98:f888]:8333', - '[2001:0:9d38:953c:1805:f38:3eb2:2121]:8333', - '[2001:0:9d38:953c:1858:16f9:3833:da19]:8333', - '[2001:0:9d38:953c:18ea:2735:e73d:adc5]:8333', - '[2001:0:9d38:953c:1c44:2b70:9de7:a7cc]:8333', - '[2001:0:9d38:953c:200a:3f95:bb7c:c09f]:8333', - '[2001:0:9d38:953c:200c:3473:b85d:ddd]:8333', - '[2001:0:9d38:953c:200f:5a0:47c6:5507]:8333', - '[2001:0:9d38:953c:2097:204a:47c5:5881]:8333', - '[2001:0:9d38:953c:248f:24cd:aaf5:dee3]:8333', - '[2001:0:9d38:953c:287d:168e:3caf:47af]:8333', - '[2001:0:9d38:953c:28c1:58d:b721:94c1]:8333', - '[2001:0:9d38:953c:2c31:30a3:39d3:528]:8188', - '[2001:0:9d38:953c:2c3d:309b:d2db:8288]:8333', - '[2001:0:9d38:953c:2c47:1b36:52c1:3c73]:8333', - '[2001:0:9d38:953c:304a:10e1:b739:822a]:8333', - '[2001:0:9d38:953c:30a3:29fd:33f6:eaab]:8333', - '[2001:0:9d38:953c:3427:859b:b525:1069]:8333', - '[2001:0:9d38:953c:3459:2541:3651:d675]:8333', - '[2001:0:9d38:953c:4f5:9c88:af91:d3d3]:8333', - '[2001:0:9d38:953c:cd1:1d54:b80a:42f4]:8333', - '[2001:0:9d38:953c:cfa:37e6:9d8e:7474]:8333', - '[2001:13d8:1c01:2000:2470::1]:8333', - '[2001:1470:fffd:202c:225:90ff:fe8f:5f62]:8333', - '[2001:14ba:200:0:543c:42ce:a48b:b0d0]:8333', - '[2001:14ba:2fc:700:41b2:df51:efd8:f581]:8333', - '[2001:19f0:5000:8c8b:5400:ff:fe1f:c023]:8333', - '[2001:19f0:5:749:5400:ff:fe71:c3fc]:8333', - '[2001:19f0:5:bc:5400:ff:fe3b:9339]:8333', - '[2001:19f0:7402:42c:5400:ff:fe6c:b9b8]:8333', - '[2001:1af8:4010:a08f:f811:e5f0:3f63:e753]:8333', - '[2001:1af8:4010:a094:3333::8c38]:8333', - '[2001:1af8:4070:a016:3333::5afb]:8333', - '[2001:1af8:4700:a071:4444::e26e]:8333', - '[2001:1bc8:1a0:590e:2e0:f4ff:fe16:3a39]:8333', - '[2001:2040:77::89]:8333', - '[2001:288:1001:107:294e:5581:74bd:42f9]:8333', - '[2001:3c8:c103:a001::48]:8333', - '[2001:4128:6135:10:20c:29ff:fe69:9e81]:8333', - '[2001:4128:6135:2010:21e:bff:fee8:a3c0]:8333', - '[2001:4128:6135:e001:5054:ff:fe37:e9eb]:8333', - '[2001:4178:6:1427:62:116:188:85]:8333', - '[2001:41d0:1004:20f0::]:8333', - '[2001:41d0:1008:2752::]:8333', - '[2001:41d0:1:4722::1]:8333', - '[2001:41d0:1:6f57::1]:8333', - '[2001:41d0:1:7353::1]:8333', - '[2001:41d0:1:7469::1]:8333', - '[2001:41d0:1:7d09::1]:8333', - '[2001:41d0:1:8b26::1]:8333', - '[2001:41d0:1:c129::1]:8333', - '[2001:41d0:1:d227::]:8333', - '[2001:41d0:1:e13b::1]:8333', - '[2001:41d0:1:e623::1]:8333', - '[2001:41d0:2:16be::1]:8333', - '[2001:41d0:2:203c::1]:8333', - '[2001:41d0:2:3242::]:8333', - '[2001:41d0:2:8a0f::]:8333', - '[2001:41d0:2:8c65::]:8333', - '[2001:41d0:2:8d13::]:8333', - '[2001:41d0:2:9459::]:8333', - '[2001:41d0:2:950a:ffff:ffff:0:3]:8333', - '[2001:41d0:2:9c94::1]:8333', - '[2001:41d0:2:a212::]:8333', - '[2001:41d0:2:a232::]:8333', - '[2001:41d0:2:ab1c::]:8333', - '[2001:41d0:2:bf2a::]:8333', - '[2001:41d0:2:c793::]:8333', - '[2001:41d0:302:1000::fa25]:8333', - '[2001:41d0:303:1907::]:8333', - '[2001:41d0:52:d00::6e2]:8333', - '[2001:41d0:52:d00::6e3]:8333', - '[2001:41d0:8:1b29::]:8333', - '[2001:41d0:8:3d4b::1]:8333', - '[2001:41d0:8:4d4d::1]:8333', - '[2001:41d0:8:7a38::1]:8333', - '[2001:41d0:8:8f46::1]:8333', - '[2001:41d0:8:ba87::1]:8333', - '[2001:41d0:8:bd45::1]:8333', - '[2001:41d0:8:bed3::]:8333', - '[2001:41d0:8:c67c::]:8333', - '[2001:41d0:8:d844:1337::1017]:8333', - '[2001:41d0:8:ddb::1]:8333', - '[2001:41d0:8:ddf::1]:8333', - '[2001:41d0:8:de3d::1]:8333', - '[2001:41d0:8:e3e4::1]:8333', - '[2001:41d0:a:4e3f::1c7d:6b01]:8333', - '[2001:41d0:a:635b::1]:8333', - '[2001:41d0:a:6810::1]:8333', - '[2001:41d0:a:6c29::1]:8333', - '[2001:41d0:a:6fd0::]:8333', - '[2001:41d0:a:fac7::1]:8333', - '[2001:41d0:d:111c::]:8333', - '[2001:41d0:d:2ac8::]:8333', - '[2001:41d0:e:1388::1]:8333', - '[2001:41f0:61:0:72f3:95ff:fe09:7521]:8333', - '[2001:41f0:61::7]:8333', - '[2001:470:1f07:151c:baac:6fff:feb7:3ba9]:8333', - '[2001:470:1f0b:8c4::5]:8333', - '[2001:470:1f0b:967::11]:8333', - '[2001:470:1f15:11f8::10]:8333', - '[2001:470:1f15:1b95:2c3e:8a9a:24e1:7084]:8333', - '[2001:470:1f15:f28::3]:8333', - '[2001:470:1f1a:172::2]:8333', - '[2001:470:1f1c:b07::2]:8333', - '[2001:470:1f1d:3a9::10]:8333', - '[2001:470:25:482::2]:8333', - '[2001:470:28:365::4]:8333', - '[2001:470:754f:42::17a]:8333', - '[2001:470:7:b74::2]:8333', - '[2001:470:7dda:1::1]:8333', - '[2001:470:8:c70:20c:29ff:fe6a:8fdc]:8333', - '[2001:470:8:c70::54]:8333', - '[2001:470:a:c13::2]:8333', - '[2001:470:d00d:0:3664:a9ff:fe9a:5150]:8333', - '[2001:470:dbf2:aaaa::b17:c01c]:8333', - '[2001:470:f457:8000::a6]:8333', - '[2001:4801:7819:74:b745:b9d5:ff10:a61a]:8333', - '[2001:4801:7819:74:b745:b9d5:ff10:aaec]:8333', - '[2001:4801:7828:104:be76:4eff:fe10:1325]:8333', - '[2001:4ba0:cafe:13c0::1]:8333', - '[2001:4ba0:cafe:418::1]:8333', - '[2001:558:6045:23:1830:896c:d901:190d]:8333', - '[2001:67c:1220:80c::93e5:dd2]:8333', - '[2001:67c:2128:ffff:6062:36ff:fe30:6532]:8333', - '[2001:8d8:923:8400::87:ebd]:8333', - '[2001:981:4452:1::100]:8333', - '[2001:981:46:1:ba27:ebff:fe5b:edee]:8333', - '[2001:981:bdbd:1:c506:7d38:4b47:da15]:8333', - '[2001:985:79af:20::35]:8333', - '[2001:bc8:225f:10e:505:6573:7573:d0a]:8333', - '[2001:bc8:323c:100::53]:8333', - '[2001:bc8:323c:100::80:4]:8333', - '[2001:bc8:323c:100::cafe]:8333', - '[2001:bc8:3680:4242::1]:8333', - '[2001:bc8:399f:f000::1]:8333', - '[2002:1e2:5587::1e2:5587]:8333', - '[2002:1e2:5588::1e2:5588]:8333', - '[2002:2a33:21c4::2a33:21c4]:8333', - '[2002:2e04:784b::2e04:784b]:8333', - '[2002:2ebc:2c14::16]:8333', - '[2002:2f5a:3c1c::2f5a:3c1c]:10011', - '[2002:2f5a:562a::2f5a:562a]:8333', - '[2002:2f5b:a5f9::2f5b:a5f9]:8333', - '[2002:3141:28c::3141:28c]:8333', - '[2002:323f:a2f2::323f:a2f2]:8333', - '[2002:323f:fbd::323f:fbd]:8333', - '[2002:33ff:69a0::1]:8333', - '[2002:3e6a:106f::3e6a:106f]:8333', - '[2002:3e70:bbc::3e70:bbc]:8333', - '[2002:3e7a:6727::3e7a:6727]:8333', - '[2002:3f62:e6bb::3f62:e6bb]:8333', - '[2002:4540:4b30::4540:4b30]:8333', - '[2002:4e6b:c745::1]:8333', - '[2002:5052:4d8a::5052:4d8a]:8333', - '[2002:51a9:9cc9::51a9:9cc9]:8333', - '[2002:54fb:cb05::1]:8333', - '[2002:5bc2:5428::5bc2:5428]:8333', - '[2002:5bce:1253::5bce:1253]:8333', - '[2002:5bdb:19e8::5bdb:19e8]:8333', - '[2002:5c3f:3912::5c3f:3912]:8333', - '[2002:5dbd:91a9::5dbd:91a9]:8333', - '[2002:5dbe:8cc6::5dbe:8cc6]:8333', - '[2002:5fd3:8944::5fd3:8944]:8333', - '[2002:65c8:a018::65c8:a018]:8333', - '[2002:6750:a839::6750:a839]:8333', - '[2002:67fa:44b::67fa:44b]:8333', - '[2002:6a0e:3ea8::6a0e:3ea8]:10011', - '[2002:6a0f:2497::6a0f:2497]:8333', - '[2002:6dec:5ac7::6dec:5ac7]:8333', - '[2002:704a:d6d4::704a:d6d4]:9997', - '[2002:7237:fcf6::7237:fcf6]:20188', - '[2002:76b2:7f40::76b2:7f40]:8333', - '[2002:7819:7e80::7819:7e80]:7743', - '[2002:781b:8db8::781b:8db8]:8333', - '[2002:7b38:cd00::7b38:cd00]:8333', - '[2002:ac52:b854::ac52:b854]:8333', - '[2002:b610:1ca3::b610:1ca3]:8333', - '[2002:b946:694a::b946:694a]:8339', - '[2002:b994:9167::b994:9167]:8333', - '[2002:bc28:6b92::bc28:6b92]:8333', - '[2002:c23f:8fc5::c23f:8fc5]:8333', - '[2002:c338:3f0a::c338:3f0a]:8333', - '[2002:d1b1:5615::d1b1:5615]:8333', - '[2002:d2d3:6da5::d2d3:6da5]:8333', - '[2002:d917:2b1::d917:2b1]:8333', - '[2002:db71:f434::db71:f434]:8333', - '[2003:a:36f:4f01::1]:8333', - '[2003:a:37f:ef4f:dead:babe:b00b:beef]:8333', - '[2400:8901::f03c:91ff:fe2c:63d8]:8333', - '[2400:8902::f03c:91ff:fed5:9d8d]:8333', - '[2401:2500:203:10:153:120:156:83]:8333', - '[2401:a400:3200:5600:14ee:f361:4bdc:1f7c]:8333', - '[2402:1f00:8100:36::]:8333', - '[2403:4200:403:2::ff]:8333', - '[2405:9800:b440:947f:59a5:f379:1876:858c]:8333', - '[2405:aa00:2::40]:8333', - '[2406:da14:445:5201::4]:8333', - '[2406:da18:f7c:4351:1a58:81fe:6ed0:1103]:8333', - '[2406:da18:f7c:4351:22aa:2585:fe88:7d58]:8333', - '[2406:da18:f7c:4351:2674:33bb:25d6:cbba]:8333', - '[2406:da18:f7c:4351:2e19:a8c7:a36a:bde0]:8333', - '[2406:da18:f7c:4351:3cc8:43d:fbcc:5067]:8333', - '[2406:da18:f7c:4351:5228:2b53:bb9a:edf5]:8333', - '[2406:da18:f7c:4351:5729:102:998c:d41a]:8333', - '[2406:da18:f7c:4351:591b:4881:3986:3703]:8333', - '[2406:da18:f7c:4351:59b9:b50:f47f:b560]:8333', - '[2406:da18:f7c:4351:61f2:cfb0:8c45:5fdd]:8333', - '[2406:da18:f7c:4351:6356:68e0:73fc:ac0b]:8333', - '[2406:da18:f7c:4351:660e:f6bc:3563:ba8e]:8333', - '[2406:da18:f7c:4351:691:9e:f2df:227d]:8333', - '[2406:da18:f7c:4351:721c:83d2:6765:4300]:8333', - '[2406:da18:f7c:4351:7237:9be:4601:bc15]:8333', - '[2406:da18:f7c:4351:7a3b:c203:fd11:6c7d]:8333', - '[2406:da18:f7c:4351:7a74:a80e:889a:ba42]:8333', - '[2406:da18:f7c:4351:7ee3:a181:f25c:fa79]:8333', - '[2406:da18:f7c:4351:8a25:9084:140:4549]:8333', - '[2406:da18:f7c:4351:8bc0:c6fd:ecfb:f074]:8333', - '[2406:da18:f7c:4351:91ce:d0ba:1b9e:c27b]:8333', - '[2406:da18:f7c:4351:9336:44e7:84b4:85b9]:8333', - '[2406:da18:f7c:4351:936c:c3b9:a1d0:848]:8333', - '[2406:da18:f7c:4351:93ef:1eef:65c8:766d]:8333', - '[2406:da18:f7c:4351:94e0:5b27:78c2:5111]:8333', - '[2406:da18:f7c:4351:9815:a202:18a3:2a36]:8333', - '[2406:da18:f7c:4351:9e1b:135c:7472:9d9]:8333', - '[2406:da18:f7c:4351:9f84:278:68f5:b8ea]:8333', - '[2406:da18:f7c:4351:a062:493f:a6f8:ca75]:8333', - '[2406:da18:f7c:4351:a192:b98:3066:8f11]:8333', - '[2406:da18:f7c:4351:a1cb:2f19:4a54:38c9]:8333', - '[2406:da18:f7c:4351:a4a2:4c9:c43a:98ae]:8333', - '[2406:da18:f7c:4351:a7e9:cd48:fa90:46d3]:8333', - '[2406:da18:f7c:4351:a88:99:6671:fce4]:8333', - '[2406:da18:f7c:4351:abe1:2e48:eb97:2ab5]:8333', - '[2406:da18:f7c:4351:acf5:2b21:5d2a:6b31]:8333', - '[2406:da18:f7c:4351:b51f:8966:74a5:6c53]:8333', - '[2406:da18:f7c:4351:b8e3:f3ca:e412:daa5]:8333', - '[2406:da18:f7c:4351:ba7c:6da8:da59:b1b6]:8333', - '[2406:da18:f7c:4351:be04:6f8e:8f93:c555]:8333', - '[2406:da18:f7c:4351:c82d:2a0b:31a5:e28d]:8333', - '[2406:da18:f7c:4351:c993:eb06:bd2c:1e65]:8333', - '[2406:da18:f7c:4351:d4b9:bff8:c4d4:1e05]:8333', - '[2406:da18:f7c:4351:d70d:a73d:1ddd:439e]:8333', - '[2406:da18:f7c:4351:e103:f456:b296:9f29]:8333', - '[2406:da18:f7c:4351:ea3b:27ec:7c2:aebc]:8333', - '[2406:da18:f7c:4351:f62c:5013:379b:363e]:8333', - '[240b:10:ca20:f0:224:e8ff:fe1f:60d9]:8333', - '[240b:250:1e0:2400:b9ef:8fe3:a69a:7378]:8333', - '[2600:1f14:34a:fe00:13f4:ceb6:a9db:4f47]:8333', - '[2600:1f14:34a:fe00:2550:9366:a5d9:78a5]:8333', - '[2600:1f14:34a:fe00:27d:6ed:7c8d:7bee]:8333', - '[2600:1f14:34a:fe00:2ed6:8a19:4eb:36c1]:8333', - '[2600:1f14:34a:fe00:34c7:2e9e:e60e:f823]:8333', - '[2600:1f14:34a:fe00:38de:442:72df:6346]:8333', - '[2600:1f14:34a:fe00:3a1e:878f:991a:9582]:8333', - '[2600:1f14:34a:fe00:3d88:1805:54e3:f4c8]:8333', - '[2600:1f14:34a:fe00:3f3e:58bd:ec82:5dac]:8333', - '[2600:1f14:34a:fe00:449a:9515:8436:f407]:8333', - '[2600:1f14:34a:fe00:4f84:277f:e64d:1f06]:8333', - '[2600:1f14:34a:fe00:5229:de84:8226:7257]:8333', - '[2600:1f14:34a:fe00:5743:42c3:951b:e97a]:8333', - '[2600:1f14:34a:fe00:5a29:85b:86b5:fa0e]:8333', - '[2600:1f14:34a:fe00:5de8:81e:6d79:330b]:8333', - '[2600:1f14:34a:fe00:5fca:ad1e:5b9c:5265]:8333', - '[2600:1f14:34a:fe00:68c4:ca1b:813e:1bce]:8333', - '[2600:1f14:34a:fe00:6:de9e:7b5e:a558]:8333', - '[2600:1f14:34a:fe00:6c72:1fcd:433:dc97]:8333', - '[2600:1f14:34a:fe00:77ee:629f:bc13:fb4f]:8333', - '[2600:1f14:34a:fe00:79d0:85d6:516f:3293]:8333', - '[2600:1f14:34a:fe00:81:422f:9ef3:4579]:8333', - '[2600:1f14:34a:fe00:822b:5f05:ec8d:48c6]:8333', - '[2600:1f14:34a:fe00:82a:76a2:fdc9:845e]:8333', - '[2600:1f14:34a:fe00:83ca:cef6:e04c:50c0]:8333', - '[2600:1f14:34a:fe00:8ba2:a36c:8687:d5aa]:8333', - '[2600:1f14:34a:fe00:8c80:5c67:3b47:90b3]:8333', - '[2600:1f14:34a:fe00:8eb8:f47f:6d53:e3ae]:8333', - '[2600:1f14:34a:fe00:989c:f8f8:a922:1b9a]:8333', - '[2600:1f14:34a:fe00:98c9:1eb3:ea12:a8f0]:8333', - '[2600:1f14:34a:fe00:9ee5:a8f6:6b2a:866e]:8333', - '[2600:1f14:34a:fe00:a46b:7bd5:629f:f75c]:8333', - '[2600:1f14:34a:fe00:a627:8299:8784:d439]:8333', - '[2600:1f14:34a:fe00:ad0b:955e:b4e5:d97d]:8333', - '[2600:1f14:34a:fe00:ae82:7117:9d69:7c86]:8333', - '[2600:1f14:34a:fe00:ccee:365a:43f8:b871]:8333', - '[2600:1f14:34a:fe00:d5ee:a3e2:2f85:e593]:8333', - '[2600:1f14:34a:fe00:d5f0:1fe0:6bd5:18a8]:8333', - '[2600:1f14:34a:fe00:e4a7:5aba:af87:4cdb]:8333', - '[2600:1f14:34a:fe00:e8e5:2d0:fb6f:2f5]:8333', - '[2600:1f14:34a:fe00:e9ef:4690:a5ac:92be]:8333', - '[2600:1f14:34a:fe00:efba:2260:6997:fcf7]:8333', - '[2600:1f14:34a:fe00:f107:2d08:c67:e5dd]:8333', - '[2600:1f14:34a:fe00:f1b9:88fb:f3db:a86e]:8333', - '[2600:1f14:34a:fe00:f79c:17b7:6f75:95b7]:8333', - '[2600:1f14:6ae:d900:6550:3fc5:e074:a72c]:8333', - '[2600:1f16:625:e00:1243:38b3:caa:d62e]:8333', - '[2600:1f16:625:e00:166d:a956:1041:f97d]:8333', - '[2600:1f16:625:e00:35f2:2428:fc57:d638]:8333', - '[2600:1f16:625:e00:3c75:333e:b7f:8cc0]:8333', - '[2600:1f16:625:e00:3fbf:31f:1b57:8b18]:8333', - '[2600:1f16:625:e00:5617:7575:379:a8cc]:8333', - '[2600:1f16:625:e00:58fa:fce6:30:a5dc]:8333', - '[2600:1f16:625:e00:5e74:70dc:af78:6b77]:8333', - '[2600:1f16:625:e00:7036:f651:2ee:39cd]:8333', - '[2600:1f16:625:e00:7fc:9004:e7be:ffe2]:8333', - '[2600:1f16:625:e00:814a:23f6:e996:5e64]:8333', - '[2600:1f16:625:e00:822c:a88b:f9c:57e3]:8333', - '[2600:1f16:625:e00:8314:b91e:a7ba:702]:8333', - '[2600:1f16:625:e00:88bb:ee9a:10de:12]:8333', - '[2600:1f16:625:e00:8c30:56f5:a29a:91de]:8333', - '[2600:1f16:625:e00:8fdf:6517:7718:8c42]:8333', - '[2600:1f16:625:e00:91fd:78b1:62a3:193]:8333', - '[2600:1f16:625:e00:930d:93ed:76a6:3285]:8333', - '[2600:1f16:625:e00:93c2:615f:a79a:c11f]:8333', - '[2600:1f16:625:e00:a780:8bc8:a1f6:d417]:8333', - '[2600:1f16:625:e00:a951:e663:4046:8c3a]:8333', - '[2600:1f16:625:e00:ab19:5fe3:f155:1371]:8333', - '[2600:1f16:625:e00:aefd:9cc7:d3:6e86]:8333', - '[2600:1f16:625:e00:b031:e86e:8604:324a]:8333', - '[2600:1f16:625:e00:b6e:4399:9dc2:6b45]:8333', - '[2600:1f16:625:e00:b7c7:58c6:21a1:fd41]:8333', - '[2600:1f16:625:e00:c169:6282:178c:27d6]:8333', - '[2600:1f16:625:e00:c94e:58b:bd35:d815]:8333', - '[2600:1f16:625:e00:caa5:7369:73a4:5711]:8333', - '[2600:1f16:625:e00:cd15:b9f2:6e3e:6fd1]:8333', - '[2600:1f16:625:e00:d6f3:775:66b7:3e92]:8333', - '[2600:1f16:625:e00:dbec:f7d9:e15:f8e0]:8333', - '[2600:1f16:625:e00:dbf4:4d41:594e:bc20]:8333', - '[2600:1f16:625:e00:e11b:4589:a0c3:9cc7]:8333', - '[2600:1f16:625:e00:ed68:15b0:3a97:be0c]:8333', - '[2600:1f16:625:e00:eef3:bce0:84ee:a98b]:8333', - '[2600:1f16:625:e00:ef3a:f66e:f059:d03f]:8333', - '[2600:1f16:625:e00:f67c:d398:5b6:d34f]:8333', - '[2600:1f16:625:e00:fe35:5099:3a8e:d123]:8333', - '[2600:1f18:64d9:1603:6f6f:eef9:b595:1958]:8333', - '[2600:3c00::f03c:91ff:fe84:d650]:8333', - '[2600:3c00::f03c:91ff:fe89:7438]:8333', - '[2600:3c00::f03c:91ff:fe91:3e49]:8333', - '[2600:3c00::f03c:91ff:febb:981e]:8333', - '[2600:3c01::f03c:91ff:fe69:89e9]:8333', - '[2600:3c01::f03c:91ff:fe91:6a29]:8333', - '[2600:3c03::f03c:91ff:fe28:1445]:8333', - '[2600:3c03::f03c:91ff:fee0:233e]:8333', - '[2600:6c55:7200:24d:cf4:811c:7cb3:f7a7]:8333', - '[2600:8805:2400:14e:226:4aff:fe02:2ba4]:8333', - '[2601:18d:4600:3cc2:20e7:b3ff:fecf:a99]:8333', - '[2601:1c2:1702:5241:47d:4016:ec42:6705]:8333', - '[2601:441:4101:70cd:4e3:8e81:3250:1f0b]:8333', - '[2601:602:9980:f78:211:11ff:fec5:1ae]:8333', - '[2601:646:4103:179f:5809:1bff:fe55:6678]:8333', - '[2602:4c:323:b101:35a3:9de8:6984:ef56]:8333', - '[2602:ff62:104:ac1:8000::]:8333', - '[2602:ffc5:40::1:711e]:8333', - '[2602:ffc5::c30:1c75]:8333', - '[2604:a880:2:d0::17e9:2001]:8333', - '[2604:a880:2:d0::22f8:f001]:8333', - '[2604:a880:2:d0::22f9:1]:8333', - '[2604:a880:2:d0::22f9:c001]:8333', - '[2604:a880:2:d0::22f9:d001]:8333', - '[2604:a880:2:d0::22f9:e001]:8333', - '[2604:a880:2:d0::22fa:2001]:8333', - '[2604:a880:2:d0::22fa:3001]:8333', - '[2604:a880:400:d0::1684:5001]:8333', - '[2604:a880:400:d0::1ac4:b001]:8333', - '[2604:a880:400:d0::2004:4001]:8333', - '[2604:a880:400:d0::2004:5001]:8333', - '[2604:a880:400:d0::2004:6001]:8333', - '[2604:a880:400:d0::2004:c001]:8333', - '[2604:a880:400:d0::2004:d001]:8333', - '[2604:a880:400:d0::2004:e001]:8333', - '[2604:a880:400:d0::2004:f001]:8333', - '[2604:a880:400:d0::2005:1]:8333', - '[2604:a880:400:d0::2005:3001]:8333', - '[2604:a880:400:d0::261f:6001]:8333', - '[2604:a880:400:d0::28b8:5001]:8333', - '[2604:a880:400:d0::ad7:e001]:8333', - '[2605:4d00::50]:8333', - '[2605:5d80:2002::245]:8333', - '[2605:9880:0:953:225:90ff:fed2:c0b4]:8333', - '[2606:c380::215:17ff:feb3:3ec]:8333', - '[2607:1c00:a:6:3c1c:1b0d:ba4:8ea9]:8333', - '[2607:1c00:a:6::1000]:8333', - '[2607:4480:2:2000:250:56ff:fe86:6449]:8333', - '[2607:5300:120:671::]:8333', - '[2607:5300:120:962::]:8333', - '[2607:5300:201:2000::1:556]:8333', - '[2607:5300:203:118:3733::1414]:8333', - '[2607:5300:60:10aa::1]:8333', - '[2607:5300:60:1e83::]:8333', - '[2607:5300:60:1e83::1000]:8333', - '[2607:5300:60:1e83::2000]:8333', - '[2607:5300:60:2d0::1]:8333', - '[2607:5300:60:3ddf::]:8333', - '[2607:5300:60:3f3c::]:8333', - '[2607:5300:60:5428::]:8333', - '[2607:5300:60:ac0::1]:8333', - '[2607:5300:61:f4b::1]:8333', - '[2607:9000:0:1:5054:ff:fe5d:264e]:8333', - '[2607:f1c0:846:9a00::87:d00e]:8333', - '[2607:f2d8:4005:d:a8a2:eeff:fee0:a859]:8333', - '[2607:f948:0:1::1:40]:8333', - '[2607:fa18:3a01::50]:8333', - '[2607:fea8:3ca0:926::2]:8333', - '[2607:fea8:4da0:3b0::2]:8333', - '[2607:ff10:c5:502:225:90ff:fe32:d446]:8333', - '[2607:ff28:9005:1::2567:57e0]:8333', - '[2620:71:4000:0:192:30:120:110]:8333', - '[2620:b8:4000:1000::93:1]:8333', - '[2800:1a0::9]:8333', - '[2801:84:0:1034:76d4:35ff:fe7f:5033]:8333', - '[2a00:16d8:c::5b6a:c261]:8333', - '[2a00:1768:2001:24::148:218]:8333', - '[2a00:19e0:1:1:225:90ff:fea5:fc0]:8333', - '[2a00:1a48:7810:101:be76:4eff:fe08:c774]:8333', - '[2a00:6340:2004:0:5054:ff:fe54:38c]:8333', - '[2a00:7b80:477:21::1c8c:83a6]:8333', - '[2a00:7c80:0:71::8]:8333', - '[2a00:7c80:0:97::7]:8333', - '[2a01:238:4363:4900:d85e:c1d9:2b32:61d0]:8333', - '[2a01:488:66:1000:53a9:22b:0:1]:8333', - '[2a01:488:67:1000:5bfa:5526:0:1]:8333', - '[2a01:488:67:1000:b01c:3379:0:1]:8333', - '[2a01:4d60:3:1:5::1]:8333', - '[2a01:4f8:10a:1d8f::2]:8333', - '[2a01:4f8:10a:1e81::2]:8333', - '[2a01:4f8:10a:2261::2]:8833', - '[2a01:4f8:10a:239c::2]:9002', - '[2a01:4f8:10a:294a::2]:8333', - '[2a01:4f8:10a:31d3::2]:8333', - '[2a01:4f8:10a:3fe6::2]:8333', - '[2a01:4f8:10a:b2e::2]:8333', - '[2a01:4f8:10b:12d7::2]:8333', - '[2a01:4f8:10b:d50::2]:8333', - '[2a01:4f8:10b:e2d::2]:8333', - '[2a01:4f8:10b:ee1::2]:8333', - '[2a01:4f8:110:5107::2]:8333', - '[2a01:4f8:110:5292::2]:8333', - '[2a01:4f8:110:536e::2]:8333', - '[2a01:4f8:120:43e4::2]:8333', - '[2a01:4f8:130:3332::2]:8333', - '[2a01:4f8:130:430b::2]:8333', - '[2a01:4f8:130:618e::2]:8333', - '[2a01:4f8:130:71d2::2]:8333', - '[2a01:4f8:130:7422::2]:8333', - '[2a01:4f8:131:33ad::2]:8333', - '[2a01:4f8:131:33ad:fea1::666]:8333', - '[2a01:4f8:131:3428::2]:8333', - '[2a01:4f8:140:1326::2]:8333', - '[2a01:4f8:140:524a::2]:8333', - '[2a01:4f8:140:6055::2]:8333', - '[2a01:4f8:140:7410::2]:8333', - '[2a01:4f8:140:931a::2]:8333', - '[2a01:4f8:141:2254::2]:8333', - '[2a01:4f8:141:22ae::2]:8333', - '[2a01:4f8:150:11d4::2]:8333', - '[2a01:4f8:150:70a4::2]:8333', - '[2a01:4f8:150:726b::2]:8333', - '[2a01:4f8:150:72ee::4202]:8333', - '[2a01:4f8:150:90ca::2]:8333', - '[2a01:4f8:151:30c9::2]:8333', - '[2a01:4f8:151:334d::3]:8333', - '[2a01:4f8:151:7175::2]:8333', - '[2a01:4f8:160:41f0::1:33]:8333', - '[2a01:4f8:160:636e::2]:8333', - '[2a01:4f8:161:7026::2]:8333', - '[2a01:4f8:162:2108::2]:8333', - '[2a01:4f8:162:3121::50]:8333', - '[2a01:4f8:162:424c::2]:8333', - '[2a01:4f8:171:1c1b::2]:8333', - '[2a01:4f8:171:1c3::2]:8333', - '[2a01:4f8:171:2258::2]:8333', - '[2a01:4f8:171:27d6::2]:8333', - '[2a01:4f8:171:2f28::2]:8333', - '[2a01:4f8:171:d23::2]:8333', - '[2a01:4f8:172:10da::2]:8333', - '[2a01:4f8:172:504::2]:8333', - '[2a01:4f8:173:1622::2]:8333', - '[2a01:4f8:173:42::2]:8333', - '[2a01:4f8:190:24eb::2]:8333', - '[2a01:4f8:190:528d::2]:8333', - '[2a01:4f8:190:61f3::2]:8333', - '[2a01:4f8:191:418f::2]:3333', - '[2a01:4f8:191:63b4:5000::1]:8333', - '[2a01:4f8:191:81b7::2]:8333', - '[2a01:4f8:191:8328::3]:8333', - '[2a01:4f8:192:4a5::2]:8333', - '[2a01:4f8:192:5230::2]:8333', - '[2a01:4f8:200:1012::2]:8333', - '[2a01:4f8:200:32a6::2]:8333', - '[2a01:4f8:200:414e::2]:8333', - '[2a01:4f8:200:416a::2]:8333', - '[2a01:4f8:200:90c3::2]:8333', - '[2a01:4f8:201:148d::2]:8333', - '[2a01:4f8:201:2cc::2]:8333', - '[2a01:4f8:201:3e3::2]:8333', - '[2a01:4f8:201:53cc::2]:8333', - '[2a01:4f8:201:6011::4]:8333', - '[2a01:4f8:202:3030::2]:8333', - '[2a01:4f8:202:31e3::2]:8333', - '[2a01:4f8:202:32c6::2]:8333', - '[2a01:4f8:202:6035::2]:8333', - '[2a01:4f8:210:5488::2]:8333', - '[2a01:4f8:211:1e17::2]:8333', - '[2a01:4f8:211:1ec5::2]:8333', - '[2a01:4f8:212:1826::2]:8333', - '[2a01:4f8:221:f59::2]:8333', - '[2a01:4f8:c0c:1026::2]:8333', - '[2a01:4f8:c0c:1028::2]:8333', - '[2a01:4f8:c0c:1029::2]:8333', - '[2a01:4f8:c0c:105f::2]:8333', - '[2a01:4f8:c0c:1064::2]:8333', - '[2a01:4f8:c0c:106b::2]:8333', - '[2a01:4f8:c0c:106d::2]:8333', - '[2a01:4f8:c0c:1070::2]:8333', - '[2a01:4f8:c0c:1105::2]:8333', - '[2a01:4f8:c0c:1106::2]:8333', - '[2a01:4f8:c0c:1134::2]:8333', - '[2a01:4f8:c0c:1135::2]:8333', - '[2a01:4f8:c0c:113c::2]:8333', - '[2a01:4f8:c0c:115c::2]:8333', - '[2a01:4f8:c0c:115e::2]:8333', - '[2a01:4f8:c0c:1170::2]:8333', - '[2a01:4f8:c0c:1172::2]:8333', - '[2a01:4f8:c0c:117b::2]:8333', - '[2a01:4f8:c0c:117c::2]:8333', - '[2a01:4f8:c0c:1180::2]:8333', - '[2a01:4f8:c0c:1181::2]:8333', - '[2a01:4f8:c0c:1185::2]:8333', - '[2a01:4f8:c0c:1186::2]:8333', - '[2a01:4f8:c0c:1187::2]:8333', - '[2a01:4f8:c0c:1188::2]:8333', - '[2a01:4f8:c0c:1189::2]:8333', - '[2a01:4f8:c0c:121::2]:8333', - '[2a01:4f8:c0c:122::2]:8333', - '[2a01:4f8:c0c:15a8::2]:8333', - '[2a01:4f8:c0c:1da4::2]:8333', - '[2a01:4f8:c0c:1ff7::2]:8333', - '[2a01:4f8:c0c:2262::2]:8333', - '[2a01:4f8:c0c:73d::2]:8333', - '[2a01:4f8:c0c:790::2]:8333', - '[2a01:4f8:c0c:7a8::2]:8333', - '[2a01:4f8:c0c:7a9::2]:8333', - '[2a01:4f8:c0c:7e9::2]:8333', - '[2a01:4f8:c0c:816::2]:8333', - '[2a01:4f8:c0c:817::2]:8333', - '[2a01:4f8:c0c:818::2]:8333', - '[2a01:4f8:c0c:820::2]:8333', - '[2a01:4f8:c0c:821::2]:8333', - '[2a01:4f8:c0c:822::2]:8333', - '[2a01:4f8:c0c:896::2]:8333', - '[2a01:4f8:c0c:8c6::2]:8333', - '[2a01:4f8:c0c:8c9::2]:8333', - '[2a01:4f8:c0c:8d1::2]:8333', - '[2a01:4f8:c0c:8d2::2]:8333', - '[2a01:4f8:c0c:8d9::2]:8333', - '[2a01:4f8:c0c:8da::2]:8333', - '[2a01:4f8:c0c:8dc::2]:8333', - '[2a01:4f8:c0c:8f1::2]:8333', - '[2a01:4f8:c0c:91e::2]:8333', - '[2a01:4f8:c0c:927::2]:8333', - '[2a01:4f8:c0c:939::2]:8333', - '[2a01:4f8:c0c:944::2]:8333', - '[2a01:4f8:c0c:951::2]:8333', - '[2a01:4f8:c0c:967::2]:8333', - '[2a01:4f8:c0c:96f::2]:8333', - '[2a01:4f8:c0c:97d::2]:8333', - '[2a01:4f8:c0c:982::2]:8333', - '[2a01:4f8:c0c:9fc::2]:8333', - '[2a01:4f8:c0c:b35::2]:8333', - '[2a01:4f8:c0c:b4c::2]:8333', - '[2a01:4f8:c0c:bfe::2]:8333', - '[2a01:4f8:c0c:c08::2]:8333', - '[2a01:4f8:c0c:c13::2]:8333', - '[2a01:4f8:c0c:c14::2]:8333', - '[2a01:4f8:c0c:c16::2]:8333', - '[2a01:4f8:c0c:c19::2]:8333', - '[2a01:4f8:c0c:c32::2]:8333', - '[2a01:4f8:c0c:c36::2]:8333', - '[2a01:4f8:c0c:c39::2]:8333', - '[2a01:4f8:c0c:c58::2]:8333', - '[2a01:4f8:c0c:c5e::2]:8333', - '[2a01:4f8:c0c:c70::2]:8333', - '[2a01:4f8:c0c:c72::2]:8333', - '[2a01:4f8:c0c:c79::2]:8333', - '[2a01:4f8:c0c:cb1::2]:8333', - '[2a01:4f8:c0c:cf5::2]:8333', - '[2a01:4f8:c0c:cff::2]:8333', - '[2a01:4f8:c0c:d0e::2]:8333', - '[2a01:4f8:c0c:d1b::2]:8333', - '[2a01:4f8:c0c:d67::2]:8333', - '[2a01:4f8:c0c:d68::2]:8333', - '[2a01:4f8:c0c:d81::2]:8333', - '[2a01:4f8:c0c:e2d::2]:8333', - '[2a01:4f8:c0c:e30::2]:8333', - '[2a01:4f8:c0c:e4f::2]:8333', - '[2a01:4f8:c0c:e5b::2]:8333', - '[2a01:4f8:c0c:e88::2]:8333', - '[2a01:4f8:c0c:f69::2]:8333', - '[2a01:4f8:c0c:f76::2]:8333', - '[2a01:4f8:c0c:f77::2]:8333', - '[2a01:4f8:c0c:f78::2]:8333', - '[2a01:4f8:c0c:f89::2]:8333', - '[2a01:4f8:c0c:f8a::2]:8333', - '[2a01:4f8:c0c:fd6::2]:8333', - '[2a01:4f8:c0c:fea::2]:8333', - '[2a01:4f8:c17:24ee::2]:8333', - '[2a01:4f8:c17:2c16::2]:8333', - '[2a01:4f8:c17:330f::2]:8333', - '[2a01:4f8:c17:34f0::2]:8333', - '[2a01:4f8:c17:3986::2]:8333', - '[2a01:4f8:c17:3b02::2]:8333', - '[2a01:4f8:c17:3d85::2]:8333', - '[2a01:4f8:c17:4271::2]:8333', - '[2a01:4f8:c17:5dc0::2]:8333', - '[2a01:4f8:c17:63a0::2]:8333', - '[2a01:4f8:c17:67f8::2]:8333', - '[2a01:4f8:c17:710b::2]:8333', - '[2a01:4f8:c17:e00::2]:8333', - '[2a01:680:10:10::1]:8333', - '[2a01:6f0:ffff:120::8dcb]:8333', - '[2a01:79d:b7dd:ffb4:5d86:70b8:fc7f:f253]:8333', - '[2a01:7a0:2:1374::4]:8333', - '[2a01:7a0:2:1374::5]:8333', - '[2a01:7a0:2:137c::3]:8333', - '[2a01:7c8:aaaa:373:5054:ff:feb3:2947]:8333', - '[2a01:7c8:aaaa:3a0:5054:ff:fe8c:974c]:8333', - '[2a01:7c8:aab0:4b7:910d:625e:a13e:c342]:8333', - '[2a01:7c8:aab5:3e6:5054:ff:fed7:4e54]:8333', - '[2a01:7c8:aab5:41e:5054:ff:fe38:f4fb]:8333', - '[2a01:7c8:aaba:343::8333]:8333', - '[2a01:7c8:aabc:18c:5054:ff:fefd:3b49]:8333', - '[2a01:7c8:aabd:3d5:5054:ff:fe95:f586]:8333', - '[2a01:7e00::f03c:91ff:fe50:94b8]:8333', - '[2a01:8e01:b943:3a63:d250:99ff:fe1f:4fb2]:8333', - '[2a01:b2e0:2::40]:8333', - '[2a01:d0:0:1c::245]:8333', - '[2a01:d0:8fc3::2]:8333', - '[2a01:e34:ec29:e8d0:25c7:c1ce:b7a3:d238]:8333', - '[2a01:e34:ec4a:c2d0:1cf3:40d2:a79f:3901]:8333', - '[2a01:e34:eed7:6670:ec1b:bf7c:b012:6069]:8333', - '[2a01:e35:2433:e320:9c8e:6ff0:990f:f06e]:8333', - '[2a01:e35:2ee5:610:21f:d0ff:fe4e:7460]:8333', - '[2a02:1205:5051:a640:d6ae:52ff:fea3:ac]:8333', - '[2a02:120b:2c2a:5ec0:10dd:31ff:fe42:5079]:8333', - '[2a02:168:6273::614]:8333', - '[2a02:180:6:1::18]:8333', - '[2a02:180:6:1::ed]:8333', - '[2a02:1811:b707:116:8c1f:c5be:bf3a:54df]:8333', - '[2a02:20c8:1422:1::a3]:8333', - '[2a02:2168:d05:2c00:216:3eff:fef7:a099]:8333', - '[2a02:27f8:2012:0:e9f7:268f:c441:6129]:8333', - '[2a02:2808:5401:0:225:90ff:fe4e:ee42]:8333', - '[2a02:390:9000:0:218:7dff:fe10:be33]:8333', - '[2a02:7aa0:1201::bd4e:1219]:8333', - '[2a02:7aa0:1619::590:eba2]:8333', - '[2a02:7aa0:1619::a7a2:7e86]:8333', - '[2a02:c200:1:10:2:5:800:1]:8333', - '[2a02:c205:2002:2550::17]:8333', - '[2a02:c205:2008:272::1]:8333', - '[2a02:c205:2010:5484::1]:8333', - '[2a02:c205:3001:6710::1]:8333', - '[2a02:c205:3001:7714::2]:8333', - '[2a02:c205:3002:888::1]:8333', - '[2a02:c207:2002:9013::1]:8333', - '[2a02:c207:2008:3392::1]:8333', - '[2a02:c207:2008:8337::1]:8333', - '[2a02:c207:2009:213::1]:8333', - '[2a02:c207:2010:7751::1]:8333', - '[2a02:c207:2010:7986::1]:8333', - '[2a02:c207:2011:7829::1]:8333', - '[2a02:c207:2011:8299::1]:8333', - '[2a02:c207:2012:2133::1]:8333', - '[2a02:c207:2012:263::1]:8333', - '[2a02:c207:2012:2682::1]:8333', - '[2a02:c207:2012:3635::1]:8333', - '[2a02:c207:2012:4826::1]:8333', - '[2a02:c207:2012:5668::1]:8333', - '[2a02:c207:3001:5824::1]:8333', - '[2a02:c207:3001:7776::1]:8333', - '[2a02:c207:3002:621::1]:8333', - '[2a02:ce80:0:20::1]:8333', - '[2a03:2260:11e:301::8]:8333', - '[2a03:2260:11e:302::3]:8333', - '[2a03:4000:2:496::8]:8333', - '[2a03:4000:6:12e7::1]:8333', - '[2a03:4000:6:416c::53]:8333', - '[2a03:b0c0:3:d0::1219:6001]:8333', - '[2a03:b0c0:3:d0::1b99:c001]:8333', - '[2a03:b0c0:3:d0::1b99:e001]:8333', - '[2a03:b0c0:3:d0::1b9a:3001]:8333', - '[2a03:b0c0:3:d0::23f7:1001]:8333', - '[2a03:b0c0:3:d0::23f7:2001]:8333', - '[2a03:b0c0:3:d0::23f7:4001]:8333', - '[2a03:b0c0:3:d0::23f7:5001]:8333', - '[2a03:b0c0:3:d0::23f7:7001]:8333', - '[2a03:b0c0:3:d0::23f7:9001]:8333', - '[2a03:b0c0:3:d0::23fb:1001]:8333', - '[2a03:b0c0:3:d0::23fb:2001]:8333', - '[2a03:b0c0:3:d0::23fb:3001]:8333', - '[2a03:b0c0:3:d0::23fb:5001]:8333', - '[2a03:b0c0:3:d0::23fb:6001]:8333', - '[2a03:b0c0:3:d0::23fb:8001]:8333', - '[2a03:b0c0:3:d0::23ff:b001]:8333', - '[2a03:b0c0:3:d0::2400:1]:8333', - '[2a03:b0c0:3:d0::2400:3001]:8333', - '[2a03:b0c0:3:d0::2400:4001]:8333', - '[2a03:b0c0:3:d0::2400:e001]:8333', - '[2a03:b0c0:3:d0::2400:f001]:8333', - '[2a03:b0c0:3:d0::2401:e001]:8333', - '[2a03:b0c0:3:d0::2402:1]:8333', - '[2a03:b0c0:3:d0::2402:2001]:8333', - '[2a03:b0c0:3:d0::2402:8001]:8333', - '[2a03:b0c0:3:d0::2402:9001]:8333', - '[2a03:b0c0:3:d0::2402:b001]:8333', - '[2a03:b0c0:3:d0::2402:d001]:8333', - '[2a03:b0c0:3:d0::2402:e001]:8333', - '[2a03:b0c0:3:d0::2403:1001]:8333', - '[2a03:b0c0:3:d0::2403:2001]:8333', - '[2a03:b0c0:3:d0::2403:3001]:8333', - '[2a03:b0c0:3:d0::2403:4001]:8333', - '[2a03:b0c0:3:d0::2403:6001]:8333', - '[2a03:b0c0:3:d0::2403:a001]:8333', - '[2a03:b0c0:3:d0::2403:b001]:8333', - '[2a03:b0c0:3:d0::2403:e001]:8333', - '[2a03:b0c0:3:d0::2403:f001]:8333', - '[2a03:b0c0:3:d0::2404:1]:8333', - '[2a03:b0c0:3:d0::2404:3001]:8333', - '[2a03:b0c0:3:d0::2404:4001]:8333', - '[2a03:b0c0:3:d0::2404:6001]:8333', - '[2a03:b0c0:3:d0::2404:8001]:8333', - '[2a03:b0c0:3:d0::2404:9001]:8333', - '[2a03:b0c0:3:d0::2404:b001]:8333', - '[2a03:b0c0:3:d0::2405:2001]:8333', - '[2a03:b0c0:3:d0::2405:3001]:8333', - '[2a03:b0c0:3:d0::2405:8001]:8333', - '[2a03:b0c0:3:d0::2405:9001]:8333', - '[2a03:b0c0:3:d0::2405:a001]:8333', - '[2a03:b0c0:3:d0::44b8:9001]:8333', - '[2a03:b0c0:3:d0::44b8:e001]:8333', - '[2a03:b0c0:3:d0::44b8:f001]:8333', - '[2a03:b0c0:3:d0::44b9:1]:8333', - '[2a03:b0c0:3:d0::44b9:1001]:8333', - '[2a03:b0c0:3:d0::44b9:2001]:8333', - '[2a03:b0c0:3:d0::44b9:4001]:8333', - '[2a04:2180:0:2::94]:8333', - '[2a04:3542:1000:910:8492:b8ff:fe91:711d]:8333', - '[2a04:52c0:101:122::ba8e]:8333', - '[2a05:3580:d400:140d:da6e:826e:e771:4100]:8333', - '[2a06:9fc0:2a06:9fc0:2a06:9fc1:67c:e706]:8333', - '226eupdnaouu4h2v.onion:8333', - '2frgxpe5mheghyom.onion:8333', - '3ihjnsvwc3x6dp2o.onion:8333', - '3w77hrilg6q64opl.onion:8333', - '4ls4o6iszcd7mkfw.onion:8333', - '4p3abjxqppzxi7qi.onion:8333', - '546esc6botbjfbxb.onion:8333', - '5msftytzlsskr4ut.onion:8333', - '5ty6rxpgrkmdnk4a.onion:8333', - 'akmqyuidrf56ip26.onion:8333', - 'alhlegtjkdmbqsvt.onion:8333', - 'bafk5ioatlgt7dgl.onion:8333', - 'bup5n5e3kurvjzf3.onion:8333', - 'cjygd7pu5lqkky5j.onion:8333', - 'cyvpgt25274i5b7c.onion:8333', - 'dekj4wacywpqsad3.onion:8333', - 'dqpxwlpnv3z3hznl.onion:8333', - 'drarzpycbtxwbcld.onion:8333', - 'drp4pvejybx2ejdr.onion:8333', - 'dxkmtmwiq7ddtgul.onion:8333', - 'e6j57zkyibu2smad.onion:8333', - 'ejcqevujcqltqn7d.onion:8333', - 'eqgbt2ghfvsshbvo.onion:8333', - 'fgizgkdnndilo6ka.onion:8333', - 'fqxup4oev33eeidg.onion:8333', - 'gb5ypqt63du3wfhn.onion:8333', - 'ggdy2pb2avlbtjwq.onion:8333', - 'hahhloezyfqh3hci.onion:8333', - 'ihdv6bzz2gx72fs7.onion:8333', - 'in7r5ieo7ogkxbne.onion:8333', - 'kvd44sw7skb5folw.onion:8333', - 'mn744hbioayn3ojs.onion:8333', - 'ms4ntrrisfxzpvmy.onion:8333', - 'n5lqwpjabqg62ihx.onion:8333', - 'o4sl5na6jeqgi3l6.onion:8333', - 'omjv24nbck4k5ud6.onion:8333', - 'po3j2hfkmf7sh36o.onion:8333', - 'psco6bxjewljrczx.onion:8333', - 'qi5yr6lvlckzffor.onion:8333', - 'qlv6py6hdtzipntn.onion:8333', - 'qynmpgdbp23xyfnj.onion:8333', - 'rhtawcs7xak4gi3t.onion:8333', - 'rjacws757ai66lre.onion:8333', - 'rjlnp3hwvrsmap6e.onion:8333', - 'rkdvqcrtfv6yt4oy.onion:8333', - 'rlafimkctvz63llg.onion:8333', - 'rlj4ppok4dnsdu5n.onion:8333', - 'seoskudzk6vn6mqz.onion:8333', - 'tayqi57tfiy7x3vk.onion:8333', - 'tchop676j6yppwwm.onion:8333', - 'trrtyp3sirmwttyu.onion:8333', - 'tx4zd7d5exonnblh.onion:8333', - 'u4ecb7txxi6l3gix.onion:8333', - 'umcxcmfycvejw264.onion:8333', - 'v7xqd42ocemalurd.onion:8333', - 'vb267mt3lnwfdmdb.onion:8333', - 'vev3n5fxfrtqj6e5.onion:8333', - 'visevrizz3quyagj.onion:8333', - 'vpg6p5e5ln33dqtp.onion:8333', - 'vr2ruasinafoy3fl.onion:8333', - 'x6pthvd5x6abyfo7.onion:8333', - 'xbwbzrspvav7u5ie.onion:8333', - 'xfcevnql2chnawko.onion:8333', - 'ycivnom44dmxx4ob.onion:8333', - 'yzdvlv5daitafekn.onion:8333' -]; +module.exports = []; diff --git a/lib/primitives/block.js b/lib/primitives/block.js index 2749a77ea..1ea19a840 100644 --- a/lib/primitives/block.js +++ b/lib/primitives/block.js @@ -430,7 +430,7 @@ class Block extends AbstractBlock { // Check base size. if (this.txs.length === 0 || this.txs.length > consensus.MAX_BLOCK_SIZE - || this.getBaseSize() > consensus.MAX_BLOCK_SIZE) { + || this.getBaseSize() > consensus.MAX_FORK_BLOCK_SIZE) { return [false, 'bad-blk-length', 100]; } @@ -439,7 +439,7 @@ class Block extends AbstractBlock { return [false, 'bad-cb-missing', 100]; // Test all transactions. - const scale = consensus.WITNESS_SCALE_FACTOR; + const size = this.getSize(); let sigops = 0; @@ -458,7 +458,7 @@ class Block extends AbstractBlock { // Count legacy sigops (do not count scripthash or witness). sigops += tx.getLegacySigops(); - if (sigops * scale > consensus.MAX_BLOCK_SIGOPS_COST) + if (sigops > consensus.maxBlockSigops(size)) return [false, 'bad-blk-sigops', 100]; } diff --git a/lib/primitives/mtx.js b/lib/primitives/mtx.js index 5d96782d0..4eb3107cd 100644 --- a/lib/primitives/mtx.js +++ b/lib/primitives/mtx.js @@ -451,42 +451,6 @@ class MTX extends TX { // Witness program nested in regular P2SH. if (redeem.isProgram()) { - // P2WSH nested within pay-to-scripthash. - const wsh = redeem.getWitnessScripthash(); - if (wsh) { - const wredeem = ring.getRedeem(wsh); - - if (!wredeem) - return false; - - const witness = this.scriptVector(wredeem, ring); - - if (!witness) - return false; - - witness.push(wredeem.toRaw()); - - input.witness.fromStack(witness); - input.script.fromItems([redeem.toRaw()]); - - return true; - } - - // P2WPKH nested within pay-to-scripthash. - const wpkh = redeem.getWitnessPubkeyhash(); - if (wpkh) { - const pkh = Script.fromPubkeyhash(wpkh); - const witness = this.scriptVector(pkh, ring); - - if (!witness) - return false; - - input.witness.fromStack(witness); - input.script.fromItems([redeem.toRaw()]); - - return true; - } - // Unknown witness program. return false; } @@ -506,40 +470,6 @@ class MTX extends TX { // Witness program. if (prev.isProgram()) { - // Bare P2WSH. - const wsh = prev.getWitnessScripthash(); - if (wsh) { - const wredeem = ring.getRedeem(wsh); - - if (!wredeem) - return false; - - const vector = this.scriptVector(wredeem, ring); - - if (!vector) - return false; - - vector.push(wredeem.toRaw()); - - input.witness.fromStack(vector); - - return true; - } - - // Bare P2WPKH. - const wpkh = prev.getWitnessPubkeyhash(); - if (wpkh) { - const pkh = Script.fromPubkeyhash(wpkh); - const vector = this.scriptVector(pkh, ring); - - if (!vector) - return false; - - input.witness.fromStack(vector); - - return true; - } - // Bare... who knows? return false; } @@ -652,7 +582,6 @@ class MTX extends TX { const value = coin.value; let prev = coin.script; let vector = input.script; - let version = 0; let redeem = false; // Grab regular p2sh redeem script. @@ -663,57 +592,24 @@ class MTX extends TX { redeem = true; } - // If the output script is a witness program, - // we have to switch the vector to the witness - // and potentially alter the length. Note that - // witnesses are stack items, so the `dummy` - // _has_ to be an empty buffer (what OP_0 - // pushes onto the stack). - if (prev.isWitnessScripthash()) { - prev = input.witness.getRedeem(); - if (!prev) - throw new Error('Input has not been templated.'); - vector = input.witness; - redeem = true; - version = 1; - } else { - const wpkh = prev.getWitnessPubkeyhash(); - if (wpkh) { - prev = Script.fromPubkeyhash(wpkh); - vector = input.witness; - redeem = false; - version = 1; - } - } + if (type == null) + type = Script.hashType.ALL; + + type |= Script.hashType.SIGHASH_FORKID; + const flags = Script.flags.VERIFY_SIGHASH_FORKID; // Create our signature. - const sig = this.signature(index, prev, value, key, type, version); + const sig = this.signature(index, prev, value, key, type, flags); if (redeem) { - const stack = vector.toStack(); - const redeem = stack.pop(); - - const result = this.signVector(prev, stack, sig, ring); - - if (!result) - return false; - - result.push(redeem); - - vector.fromStack(result); - - return true; + const redeem = vector.pop(); + const result = this.signVector(prev, vector, sig, ring); + vector.push(redeem); + vector.compile(); + return result; } - const stack = vector.toStack(); - const result = this.signVector(prev, stack, sig, ring); - - if (!result) - return false; - - vector.fromStack(result); - - return true; + return this.signVector(prev, vector, sig, ring); } /** @@ -1157,21 +1053,6 @@ class MTX extends TX { continue; } - // P2WPKH - if (prev.isWitnessPubkeyhash()) { - let size = 0; - // varint-items-len - size += 1; - // varint-len [signature] - size += 1 + 73; - // varint-len [key] - size += 1 + 33; - // vsize - size = (size + scale - 1) / scale | 0; - total += size; - continue; - } - // Call out to the custom estimator. if (estimate) { const size = await estimate(prev); @@ -1190,19 +1071,6 @@ class MTX extends TX { continue; } - // P2WSH - if (prev.isWitnessScripthash()) { - let size = 0; - // varint-items-len - size += 1; - // 2-of-3 multisig input - size += 149; - // vsize - size = (size + scale - 1) / scale | 0; - total += size; - continue; - } - // Unknown. total += 110; } diff --git a/lib/primitives/tx.js b/lib/primitives/tx.js index 09051c33a..72c91c5b4 100644 --- a/lib/primitives/tx.js +++ b/lib/primitives/tx.js @@ -407,25 +407,25 @@ class TX { * p2pkh script). * @param {Amount} value - Previous output value. * @param {SighashType} type - Sighash type. - * @param {Number} version - Sighash version (0=legacy, 1=segwit). + * @param {Number} flags - Script flags. * @returns {Buffer} Signature hash. */ - signatureHash(index, prev, value, type, version) { + signatureHash(index, prev, value, type, flags) { assert(index >= 0 && index < this.inputs.length); assert(prev instanceof Script); assert(typeof value === 'number'); assert(typeof type === 'number'); - // Traditional sighashing - if (version === 0) - return this.signatureHashV0(index, prev, type); + if (flags == null) + flags = Script.flags.STANDARD_VERIFY_FLAGS; - // Segwit sighashing - if (version === 1) + if ((type & Script.hashType.SIGHASH_FORKID) + && (flags & Script.flags.VERIFY_SIGHASH_FORKID)) { return this.signatureHashV1(index, prev, value, type); + } - throw new Error('Unknown sighash version.'); + return this.signatureHashV0(index, prev, type); } /** @@ -699,16 +699,16 @@ class TX { * @param {Amount} value * @param {Buffer} sig * @param {Buffer} key - * @param {Number} version + * @param {Number} flags * @returns {Boolean} */ - checksig(index, prev, value, sig, key, version) { + checksig(index, prev, value, sig, key, flags) { if (sig.length === 0) return false; const type = sig[sig.length - 1]; - const hash = this.signatureHash(index, prev, value, type, version); + const hash = this.signatureHash(index, prev, value, type, flags); return secp256k1.verifyDER(hash, sig.slice(0, -1), key); } @@ -722,18 +722,18 @@ class TX { * @param {Amount} value - Previous output value. * @param {Buffer} key * @param {SighashType} type - * @param {Number} version - Sighash version (0=legacy, 1=segwit). + * @param {Number} flags - Script flags. * @returns {Buffer} Signature in DER format. */ - signature(index, prev, value, key, type, version) { + signature(index, prev, value, key, type, flags) { if (type == null) type = hashType.ALL; - if (version == null) - version = 0; + if (flags == null) + flags = Script.flags.VERIFY_SIGHASH_FORKID; - const hash = this.signatureHash(index, prev, value, type, version); + const hash = this.signatureHash(index, prev, value, type, flags); const sig = secp256k1.signDER(hash, key); const bw = bio.write(sig.length + 1); diff --git a/lib/protocol/consensus.js b/lib/protocol/consensus.js index d144108ac..0e342b927 100644 --- a/lib/protocol/consensus.js +++ b/lib/protocol/consensus.js @@ -61,13 +61,21 @@ exports.HALF_REWARD = Math.floor(exports.BASE_REWARD / 2); exports.MAX_BLOCK_SIZE = 1000000; +/** + * Maximum block base size (consensus). + * @const {Number} + * @default + */ + +exports.MAX_FORK_BLOCK_SIZE = 8000000; + /** * Maximum block serialization size (protocol). * @const {Number} * @default */ -exports.MAX_RAW_BLOCK_SIZE = 4000000; +exports.MAX_RAW_BLOCK_SIZE = 8000000; /** * Maximum block weight (consensus). @@ -75,7 +83,7 @@ exports.MAX_RAW_BLOCK_SIZE = 4000000; * @default */ -exports.MAX_BLOCK_WEIGHT = 4000000; +exports.MAX_BLOCK_WEIGHT = 4000000 * 8; /** * Maximum block sigops (consensus). @@ -85,6 +93,14 @@ exports.MAX_BLOCK_WEIGHT = 4000000; exports.MAX_BLOCK_SIGOPS = 1000000 / 50; +/** + * Maximum block sigops per mb (consensus). + * @const {Number} + * @default + */ + +exports.MAX_BLOCK_SIGOPS_PER_MB = 20000; + /** * Maximum block sigops cost (consensus). * @const {Number} @@ -243,6 +259,23 @@ exports.ZERO_HASH = Buffer.alloc(32, 0x00); exports.NULL_HASH = '0000000000000000000000000000000000000000000000000000000000000000'; +/** + * Anti replay commitment. + * @const {String} + * @default + */ + +exports.ANTI_REPLAY_COMMITMENT = + 'Bitcoin: A Peer-to-Peer Electronic Cash System'; + +/** + * UAHF start time. + * @const {Number} + * @default + */ + +exports.UAHF_TIME = 1501590000; + /** * Convert a compact number to a big number. * Used for `block.bits` -> `target` conversion. @@ -372,3 +405,14 @@ exports.hasBit = function hasBit(version, bit) { const mask = 1 << bit; return bits === TOP_BITS && (version & mask) !== 0; }; + +/** + * Calculate max block sigops. + * @param {Number} size + * @returns {Number} + */ + +exports.maxBlockSigops = function maxBlockSigops(size) { + const mb = 1 + ((size - 1) / 1e6 | 0); + return mb * exports.MAX_BLOCK_SIGOPS_PER_MB; +}; diff --git a/lib/protocol/networks.js b/lib/protocol/networks.js index 8fb04fb6b..16bfdd530 100644 --- a/lib/protocol/networks.js +++ b/lib/protocol/networks.js @@ -48,12 +48,12 @@ main.type = 'main'; */ main.seeds = [ - 'seed.bitcoin.sipa.be', // Pieter Wuille - 'dnsseed.bluematt.me', // Matt Corallo - 'dnsseed.bitcoin.dashjr.org', // Luke Dashjr - 'seed.bitcoinstats.com', // Christian Decker - 'seed.bitcoin.jonasschnelli.ch', // Jonas Schnelli - 'seed.btc.petertodd.org' // Peter Todd + 'seed.bitcoinabc.org', + 'seed-abc.bitcoinforks.org', + 'btccash-seeder.bitcoinunlimited.info', + 'seed.bitprim.org', + 'seed.deadalnix.me', + 'seeder.criptolayer.net' ]; /** @@ -102,11 +102,8 @@ main.checkpointMap = { 450000: '0ba2070c62cd9da1f8cef88a0648c661a411d33e728340010000000000000000', 460000: '8c25fc7e414d3e868d6ce0ec473c30ad44e7e8bc1b75ef000000000000000000', 470000: '89756d1ed75901437300af10d5ab69070a282e729c536c000000000000000000', - 480000: 'b1a896fd31e639e0c74d1abeb1dbc93f176b767a5d4c02010000000000000000', - 490000: '90dec4d0153f20fbdcb245b1d5fb3d5a8d7bb1379106de000000000000000000', - 500000: '045d94a1c33354c3759cc0512dcc49fd81bf4c3637fb24000000000000000000', - 510000: '297301b8ca28584cb0c31c7e3fed51696bc33ef8782615000000000000000000', - 515000: '52a71dacfc03557e8eb0afa8cc04f335255d89208da83c000000000000000000' + // UAHF fork block: + 478559: 'ec5e1a193601f25ff1d94b421ddead0dbefcb99cf91e65000000000000000000' }; /** @@ -115,7 +112,7 @@ main.checkpointMap = { * @default */ -main.lastCheckpoint = 515000; +main.lastCheckpoint = 478559; /** * @const {Number} @@ -351,26 +348,6 @@ main.deployments = { required: false, force: true }, - segwit: { - name: 'segwit', - bit: 1, - startTime: 1479168000, // November 15th, 2016. - timeout: 1510704000, // November 15th, 2017. - threshold: -1, - window: -1, - required: true, - force: false - }, - segsignal: { - name: 'segsignal', - bit: 4, - startTime: 1496275200, // June 1st, 2017. - timeout: 1510704000, // November 15th, 2017. - threshold: 269, // 80% - window: 336, // ~2.33 days - required: false, - force: false - }, testdummy: { name: 'testdummy', bit: 28, @@ -391,8 +368,6 @@ main.deployments = { main.deploys = [ main.deployments.csv, - main.deployments.segwit, - main.deployments.segsignal, main.deployments.testdummy ]; @@ -599,26 +574,6 @@ testnet.deployments = { required: false, force: true }, - segwit: { - name: 'segwit', - bit: 1, - startTime: 1462060800, // May 1st 2016 - timeout: 1493596800, // 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, @@ -633,8 +588,6 @@ testnet.deployments = { testnet.deploys = [ testnet.deployments.csv, - testnet.deployments.segwit, - testnet.deployments.segsignal, testnet.deployments.testdummy ]; @@ -762,26 +715,6 @@ regtest.deployments = { required: false, force: true }, - segwit: { - name: 'segwit', - bit: 1, - startTime: 0, - timeout: 0xffffffff, - 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, @@ -796,8 +729,6 @@ regtest.deployments = { regtest.deploys = [ regtest.deployments.csv, - regtest.deployments.segwit, - regtest.deployments.segsignal, regtest.deployments.testdummy ]; @@ -927,26 +858,6 @@ simnet.deployments = { 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, @@ -961,8 +872,6 @@ simnet.deployments = { simnet.deploys = [ simnet.deployments.csv, - simnet.deployments.segwit, - simnet.deployments.segsignal, simnet.deployments.testdummy ]; diff --git a/lib/script/common.js b/lib/script/common.js index b388d71e1..7eb8fa4f1 100644 --- a/lib/script/common.js +++ b/lib/script/common.js @@ -346,7 +346,9 @@ exports.flags = { VERIFY_DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM: 1 << 12, VERIFY_MINIMALIF: 1 << 13, VERIFY_NULLFAIL: 1 << 14, - VERIFY_WITNESS_PUBKEYTYPE: 1 << 15 + VERIFY_WITNESS_PUBKEYTYPE: 1 << 15, + VERIFY_MAST: 1 << 16, + VERIFY_SIGHASH_FORKID: 1 << 17 }; /** @@ -378,7 +380,8 @@ exports.flags.STANDARD_VERIFY_FLAGS = 0 | exports.flags.VERIFY_LOW_S | exports.flags.VERIFY_WITNESS | exports.flags.VERIFY_DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM - | exports.flags.VERIFY_WITNESS_PUBKEYTYPE; + | exports.flags.VERIFY_WITNESS_PUBKEYTYPE + | exports.flags.VERIFY_SIGHASH_FORKID; /** * Standard flags without mandatory bits. @@ -414,6 +417,12 @@ exports.hashType = { SINGLE: 3, + /* + * Sighash fork ID. + */ + + SIGHASH_FORKID: 0x40, + /* * Sign only the current input (mask). */ @@ -479,7 +488,8 @@ exports.isHashType = function isHashType(sig) { if (sig.length === 0) return false; - const type = sig[sig.length - 1] & ~exports.hashType.ANYONECANPAY; + const type = sig[sig.length - 1] + & ~(exports.hashType.ANYONECANPAY | exports.hashType.SIGHASH_FORKID); if (type < exports.hashType.ALL || type > exports.hashType.SINGLE) return false; diff --git a/lib/script/script.js b/lib/script/script.js index 7f2290330..3536ced5f 100644 --- a/lib/script/script.js +++ b/lib/script/script.js @@ -509,18 +509,14 @@ class Script { * @param {TX?} tx - Transaction being verified. * @param {Number?} index - Index of input being verified. * @param {Amount?} value - Previous output value. - * @param {Number?} version - Signature hash version (0=legacy, 1=segwit). * @throws {ScriptError} Will be thrown on VERIFY failures. */ - execute(stack, flags, tx, index, value, version) { + execute(stack, flags, tx, index, value) { if (flags == null) flags = Script.flags.STANDARD_VERIFY_FLAGS; - if (version == null) - version = 0; - - if (this.raw.length > consensus.MAX_SCRIPT_SIZE) + if (this.getSize() > consensus.MAX_SCRIPT_SIZE) throw new ScriptError('SCRIPT_SIZE'); const state = []; @@ -670,7 +666,8 @@ class Script { if (stack.length < 1) throw new ScriptError('UNBALANCED_CONDITIONAL', op, ip); - if (version === 1 && (flags & Script.flags.VERIFY_MINIMALIF)) { + if ((flags & Script.flags.VERIFY_SIGHASH_FORKID) + && (flags & Script.flags.VERIFY_MINIMALIF)) { const item = stack.get(-1); if (item.length > 1) @@ -1120,11 +1117,12 @@ class Script { const subscript = this.getSubscript(lastSep); - if (version === 0) + if (!(flags & Script.flags.VERIFY_SIGHASH_FORKID) + || !(sig[sig.length - 1] & Script.hashType.SIGHASH_FORKID)) subscript.findAndDelete(sig); validateSignature(sig, flags); - validateKey(key, flags, version); + validateKey(key, flags); let res = false; @@ -1135,7 +1133,7 @@ class Script { subscript, value, type, - version + flags ); res = checksig(hash, sig, key); } @@ -1202,7 +1200,8 @@ class Script { for (let j = 0; j < m; j++) { const sig = stack.get(-isig - j); - if (version === 0) + if (!(flags & Script.flags.VERIFY_SIGHASH_FORKID) + || !(sig[sig.length - 1] & Script.hashType.SIGHASH_FORKID)) subscript.findAndDelete(sig); } @@ -1212,7 +1211,7 @@ class Script { const key = stack.get(-ikey); validateSignature(sig, flags); - validateKey(key, flags, version); + validateKey(key, flags); if (sig.length > 0) { const type = sig[sig.length - 1]; @@ -1221,7 +1220,7 @@ class Script { subscript, value, type, - version + flags ); if (checksig(hash, sig, key)) { @@ -1275,11 +1274,11 @@ class Script { throw new ScriptError('BAD_OPCODE', op, ip); } } - - if (stack.length + alt.length > consensus.MAX_SCRIPT_STACK) - throw new ScriptError('STACK_SIZE', op, ip); } + if (stack.length + alt.length > consensus.MAX_SCRIPT_STACK) + throw new ScriptError('STACK_SIZE'); + if (state.length !== 0) throw new ScriptError('UNBALANCED_CONDITIONAL'); } @@ -3096,11 +3095,14 @@ class Script { throw new ScriptError('SIG_PUSHONLY'); } + if (flags & Script.flags.VERIFY_SIGHASH_FORKID) + flags |= Script.flags.VERIFY_STRICTENC; + // Setup a stack. let stack = new Stack(); // Execute the input script - input.execute(stack, flags, tx, index, value, 0); + input.execute(stack, flags, tx, index, value); // Copy the stack for P2SH let copy; @@ -3108,28 +3110,12 @@ class Script { copy = stack.clone(); // Execute the previous output script. - output.execute(stack, flags, tx, index, value, 0); + output.execute(stack, flags, tx, index, value); // Verify the stack values. if (stack.length === 0 || !stack.getBool(-1)) throw new ScriptError('EVAL_FALSE'); - let hadWitness = false; - - if ((flags & Script.flags.VERIFY_WITNESS) && output.isProgram()) { - hadWitness = true; - - // Input script must be empty. - if (input.raw.length !== 0) - throw new ScriptError('WITNESS_MALLEATED'); - - // Verify the program in the output script. - Script.verifyProgram(witness, output, flags, tx, index, value); - - // Force a cleanstack - stack.length = 1; - } - // If the script is P2SH, execute the real output script if ((flags & Script.flags.VERIFY_P2SH) && output.isScripthash()) { // P2SH can only have push ops in the scriptSig @@ -3154,34 +3140,13 @@ class Script { if (stack.length === 0 || !stack.getBool(-1)) throw new ScriptError('EVAL_FALSE'); - if ((flags & Script.flags.VERIFY_WITNESS) && redeem.isProgram()) { - hadWitness = true; - - // Input script must be exactly one push of the redeem script. - if (!input.raw.equals(Opcode.fromPush(raw).toRaw())) - throw new ScriptError('WITNESS_MALLEATED_P2SH'); - - // Verify the program in the redeem script. - Script.verifyProgram(witness, redeem, flags, tx, index, value); - - // Force a cleanstack. - stack.length = 1; + // Ensure there is nothing left on the stack. + if (flags & Script.flags.VERIFY_CLEANSTACK) { + assert((flags & Script.flags.VERIFY_P2SH) !== 0); + if (stack.length !== 1) + throw new ScriptError('CLEANSTACK'); } } - - // Ensure there is nothing left on the stack. - if (flags & Script.flags.VERIFY_CLEANSTACK) { - assert((flags & Script.flags.VERIFY_P2SH) !== 0); - if (stack.length !== 1) - throw new ScriptError('CLEANSTACK'); - } - - // If we had a witness but no witness program, fail. - if (flags & Script.flags.VERIFY_WITNESS) { - assert((flags & Script.flags.VERIFY_P2SH) !== 0); - if (!hadWitness && witness.items.length > 0) - throw new ScriptError('WITNESS_UNEXPECTED'); - } } /** @@ -3384,17 +3349,16 @@ function sortKeys(keys) { * @throws {ScriptError} */ -function validateKey(key, flags, version) { +function validateKey(key, flags) { assert(Buffer.isBuffer(key)); assert(typeof flags === 'number'); - assert(typeof version === 'number'); if (flags & Script.flags.VERIFY_STRICTENC) { if (!common.isKeyEncoding(key)) throw new ScriptError('PUBKEYTYPE'); } - if (version === 1) { + if (flags & Script.flags.VERIFY_SIGHASH_FORKID) { if (flags & Script.flags.VERIFY_WITNESS_PUBKEYTYPE) { if (!common.isCompressedEncoding(key)) throw new ScriptError('WITNESS_PUBKEYTYPE'); @@ -3439,6 +3403,15 @@ function validateSignature(sig, flags) { if (flags & Script.flags.VERIFY_STRICTENC) { if (!common.isHashType(sig)) throw new ScriptError('SIG_HASHTYPE'); + + const usesFork = sig[sig.length - 1] & Script.hashType.SIGHASH_FORKID; + const forkEnabled = flags & Script.flags.VERIFY_SIGHASH_FORKID; + + if (!forkEnabled && usesFork) + throw new ScriptError('ILLEGAL_FORKID'); + + if (forkEnabled && !usesFork) + throw new ScriptError('MUST_USE_FORKID'); } return true; diff --git a/lib/wallet/walletdb.js b/lib/wallet/walletdb.js index ab95c65f3..3e0f511e4 100644 --- a/lib/wallet/walletdb.js +++ b/lib/wallet/walletdb.js @@ -178,7 +178,7 @@ class WalletDB extends EventEmitter { async open() { await this.db.open(); - await this.db.verify(layout.V.build(), 'wallet', 7); + await this.db.verify(layout.V.build(), 'wallet', 0x80 | 7); await this.verifyNetwork();