diff options
Diffstat (limited to 'contrib')
37 files changed, 1568 insertions, 988 deletions
diff --git a/contrib/README.md b/contrib/README.md index 4ea9700f59..6f750106e4 100644 --- a/contrib/README.md +++ b/contrib/README.md @@ -3,7 +3,7 @@ Repository Tools ### [Developer tools](/contrib/devtools) ### Specific tools for developers working on this repository. -Contains the script `github-merge.py` for merging github pull requests securely and signing them using GPG. +Contains the script `github-merge.py` for merging GitHub pull requests securely and signing them using GPG. ### [Verify-Commits](/contrib/verify-commits) ### Tool to verify that every merge commit was signed by a developer using the above `github-merge.py` script. diff --git a/contrib/debian/copyright b/contrib/debian/copyright index 0fa06f1aa9..72d64ce62d 100644 --- a/contrib/debian/copyright +++ b/contrib/debian/copyright @@ -5,7 +5,7 @@ Upstream-Contact: Satoshi Nakamoto <satoshin@gmx.com> Source: https://github.com/bitcoin/bitcoin Files: * -Copyright: 2009-2016, Bitcoin Core Developers +Copyright: 2009-2017, Bitcoin Core Developers License: Expat Comment: The Bitcoin Core Developers encompasses the current developers listed on bitcoin.org, as well as the numerous contributors to the project. diff --git a/contrib/debian/examples/bitcoin.conf b/contrib/debian/examples/bitcoin.conf index afbc7882e0..923ab75314 100644 --- a/contrib/debian/examples/bitcoin.conf +++ b/contrib/debian/examples/bitcoin.conf @@ -116,12 +116,7 @@ # running on another host using this option: #rpcconnect=127.0.0.1 -# Transaction Fee Changes in 0.10.0 - -# Send transactions as zero-fee transactions if possible (default: 0) -#sendfreetransactions=0 - -# Create transactions that have enough fees (or priority) so they are likely to begin confirmation within n blocks (default: 1). +# Create transactions that have enough fees so they are likely to begin confirmation within n blocks (default: 6). # This setting is over-ridden by the -paytxfee option. #txconfirmtarget=n diff --git a/contrib/devtools/README.md b/contrib/devtools/README.md index 6c0047833f..67c5e15a15 100644 --- a/contrib/devtools/README.md +++ b/contrib/devtools/README.md @@ -8,11 +8,6 @@ check-doc.py Check if all command line args are documented. The return value indicates the number of undocumented args. -clang-format.py -=============== - -A script to format cpp source code according to [.clang-format](../../src/.clang-format). This should only be applied to new files or files which are currently not actively developed on. Also, git subtrees are not subject to formatting. - clang-format-diff.py =================== @@ -24,6 +19,7 @@ the script should be called from the git root folder as follows. ``` git diff -U0 HEAD~1.. | ./contrib/devtools/clang-format-diff.py -p1 -i -v ``` + copyright\_header.py ==================== @@ -129,7 +125,7 @@ check or whatever). This means that there are no potential race conditions (where a pullreq gets updated while you're reviewing it, but before you click -merge), and when using GPG signatures, that even a compromised github +merge), and when using GPG signatures, that even a compromised GitHub couldn't mess with the sources. Setup diff --git a/contrib/devtools/check-doc.py b/contrib/devtools/check-doc.py index 249214e931..445175ec2b 100755 --- a/contrib/devtools/check-doc.py +++ b/contrib/devtools/check-doc.py @@ -21,7 +21,7 @@ CMD_GREP_DOCS = r"egrep -r -I 'HelpMessageOpt\(\"\-[^\"=]+?(=|\")' %s" % (CMD_RO REGEX_ARG = re.compile(r'(?:map(?:Multi)?Args(?:\.count\(|\[)|Get(?:Bool)?Arg\()\"(\-[^\"]+?)\"') REGEX_DOC = re.compile(r'HelpMessageOpt\(\"(\-[^\"=]+?)(?:=|\")') # list unsupported, deprecated and duplicate args as they need no documentation -SET_DOC_OPTIONAL = set(['-rpcssl', '-benchmark', '-h', '-help', '-socks', '-tor', '-debugnet', '-whitelistalwaysrelay', '-prematurewitness', '-walletprematurewitness', '-promiscuousmempoolflags', '-blockminsize']) +SET_DOC_OPTIONAL = set(['-rpcssl', '-benchmark', '-h', '-help', '-socks', '-tor', '-debugnet', '-whitelistalwaysrelay', '-prematurewitness', '-walletprematurewitness', '-promiscuousmempoolflags', '-blockminsize', '-sendfreetransactions']) def main(): used = check_output(CMD_GREP_ARGS, shell=True) diff --git a/contrib/devtools/clang-format-diff.py b/contrib/devtools/clang-format-diff.py index 13d2573b9f..7ea49b65e1 100755 --- a/contrib/devtools/clang-format-diff.py +++ b/contrib/devtools/clang-format-diff.py @@ -128,7 +128,7 @@ def main(): line_count = int(match.group(3)) if line_count == 0: continue - end_line = start_line + line_count - 1; + end_line = start_line + line_count - 1 lines_by_file.setdefault(filename, []).extend( ['-lines', str(start_line) + ':' + str(end_line)]) @@ -147,7 +147,7 @@ def main(): stderr=None, stdin=subprocess.PIPE) stdout, stderr = p.communicate() if p.returncode != 0: - sys.exit(p.returncode); + sys.exit(p.returncode) if not args.i: with open(filename) as f: diff --git a/contrib/devtools/clang-format.py b/contrib/devtools/clang-format.py deleted file mode 100755 index cee99047ac..0000000000 --- a/contrib/devtools/clang-format.py +++ /dev/null @@ -1,62 +0,0 @@ -#!/usr/bin/env python -''' -Wrapper script for clang-format - -Copyright (c) 2015 MarcoFalke -Copyright (c) 2015 The Bitcoin Core developers -Distributed under the MIT software license, see the accompanying -file COPYING or http://www.opensource.org/licenses/mit-license.php. -''' - -import os -import sys -import subprocess - -tested_versions = ['3.6.0', '3.6.1', '3.6.2'] # A set of versions known to produce the same output -accepted_file_extensions = ('.h', '.cpp') # Files to format - -def check_clang_format_version(clang_format_exe): - try: - output = subprocess.check_output([clang_format_exe, '-version']) - for ver in tested_versions: - if ver in output: - print "Detected clang-format version " + ver - return - raise RuntimeError("Untested version: " + output) - except Exception as e: - print 'Could not verify version of ' + clang_format_exe + '.' - raise e - -def check_command_line_args(argv): - required_args = ['{clang-format-exe}', '{files}'] - example_args = ['clang-format-3.x', 'src/main.cpp', 'src/wallet/*'] - - if(len(argv) < len(required_args) + 1): - for word in (['Usage:', argv[0]] + required_args): - print word, - print '' - for word in (['E.g:', argv[0]] + example_args): - print word, - print '' - sys.exit(1) - -def run_clang_format(clang_format_exe, files): - for target in files: - if os.path.isdir(target): - for path, dirs, files in os.walk(target): - run_clang_format(clang_format_exe, (os.path.join(path, f) for f in files)) - elif target.endswith(accepted_file_extensions): - print "Format " + target - subprocess.check_call([clang_format_exe, '-i', '-style=file', target], stdout=open(os.devnull, 'wb'), stderr=subprocess.STDOUT) - else: - print "Skip " + target - -def main(argv): - check_command_line_args(argv) - clang_format_exe = argv[1] - files = argv[2:] - check_clang_format_version(clang_format_exe) - run_clang_format(clang_format_exe, files) - -if __name__ == "__main__": - main(sys.argv) diff --git a/contrib/devtools/github-merge.py b/contrib/devtools/github-merge.py index aae966a8f6..f1b6a12fd0 100755 --- a/contrib/devtools/github-merge.py +++ b/contrib/devtools/github-merge.py @@ -15,9 +15,10 @@ # In case of a clean merge that is accepted by the user, the local branch with # name $BRANCH is overwritten with the merged result, and optionally pushed. from __future__ import division,print_function,unicode_literals -import os,sys +import os from sys import stdin,stdout,stderr import argparse +import hashlib import subprocess import json,codecs try: @@ -69,6 +70,35 @@ def ask_prompt(text): print("",file=stderr) return reply +def get_symlink_files(): + files = sorted(subprocess.check_output([GIT, 'ls-tree', '--full-tree', '-r', 'HEAD']).splitlines()) + ret = [] + for f in files: + if (int(f.decode('utf-8').split(" ")[0], 8) & 0o170000) == 0o120000: + ret.append(f.decode('utf-8').split("\t")[1]) + return ret + +def tree_sha512sum(): + files = sorted(subprocess.check_output([GIT, 'ls-tree', '--full-tree', '-r', '--name-only', 'HEAD']).splitlines()) + overall = hashlib.sha512() + for f in files: + intern = hashlib.sha512() + fi = open(f, 'rb') + while True: + piece = fi.read(65536) + if piece: + intern.update(piece) + else: + break + fi.close() + dig = intern.hexdigest() + overall.update(dig.encode("utf-8")) + overall.update(" ".encode("utf-8")) + overall.update(f) + overall.update("\n".encode("utf-8")) + return overall.hexdigest() + + def parse_arguments(): epilog = ''' In addition, you can set the following git configuration variables: @@ -157,6 +187,9 @@ def main(): subprocess.check_call([GIT,'checkout','-q','-b',local_merge_branch]) try: + # Go up to the repository's root. + toplevel = subprocess.check_output([GIT,'rev-parse','--show-toplevel']).strip() + os.chdir(toplevel) # Create unsigned merge commit. if title: firstline = 'Merge #%s: %s' % (pull,title) @@ -175,14 +208,31 @@ def main(): print("ERROR: Creating merge failed (already merged?).",file=stderr) exit(4) + symlink_files = get_symlink_files() + for f in symlink_files: + print("ERROR: File %s was a symlink" % f) + if len(symlink_files) > 0: + exit(4) + + # Put tree SHA512 into the message + try: + first_sha512 = tree_sha512sum() + message += '\n\nTree-SHA512: ' + first_sha512 + except subprocess.CalledProcessError as e: + printf("ERROR: Unable to compute tree hash") + exit(4) + try: + subprocess.check_call([GIT,'commit','--amend','-m',message.encode('utf-8')]) + except subprocess.CalledProcessError as e: + printf("ERROR: Cannot update message.",file=stderr) + exit(4) + print('%s#%s%s %s %sinto %s%s' % (ATTR_RESET+ATTR_PR,pull,ATTR_RESET,title,ATTR_RESET+ATTR_PR,branch,ATTR_RESET)) subprocess.check_call([GIT,'log','--graph','--topo-order','--pretty=format:'+COMMIT_FORMAT,base_branch+'..'+head_branch]) print() + # Run test command if configured. if testcmd: - # Go up to the repository's root. - toplevel = subprocess.check_output([GIT,'rev-parse','--show-toplevel']).strip() - os.chdir(toplevel) if subprocess.call(testcmd,shell=True): print("ERROR: Running %s failed." % testcmd,file=stderr) exit(5) @@ -218,6 +268,11 @@ def main(): print("ERROR: Merge rejected.",file=stderr) exit(7) + second_sha512 = tree_sha512sum() + if first_sha512 != second_sha512: + print("ERROR: Tree hash changed unexpectedly",file=stderr) + exit(8) + # Sign the merge commit. reply = ask_prompt("Type 's' to sign off on the merge.") if reply == 's': diff --git a/contrib/devtools/optimize-pngs.py b/contrib/devtools/optimize-pngs.py index 0f653e010b..9286ab731f 100755 --- a/contrib/devtools/optimize-pngs.py +++ b/contrib/devtools/optimize-pngs.py @@ -39,7 +39,7 @@ for folder in folders: if extension.lower() == '.png': print("optimizing "+file+"..."), file_path = os.path.join(absFolder, file) - fileMetaMap = {'file' : file, 'osize': os.path.getsize(file_path), 'sha256Old' : file_hash(file_path)}; + fileMetaMap = {'file' : file, 'osize': os.path.getsize(file_path), 'sha256Old' : file_hash(file_path)} fileMetaMap['contentHashPre'] = content_hash(file_path) pngCrushOutput = "" diff --git a/contrib/devtools/test-security-check.py b/contrib/devtools/test-security-check.py index c0f120392e..18f9835faa 100755 --- a/contrib/devtools/test-security-check.py +++ b/contrib/devtools/test-security-check.py @@ -7,7 +7,6 @@ Test script for security-check.py ''' from __future__ import division,print_function import subprocess -import sys import unittest def write_testcode(filename): diff --git a/contrib/devtools/update-translations.py b/contrib/devtools/update-translations.py index 78b9f9d179..2011841005 100755 --- a/contrib/devtools/update-translations.py +++ b/contrib/devtools/update-translations.py @@ -65,6 +65,14 @@ def split_format_specifiers(specifiers): else: other.append(s) + # If both numeric format specifiers and "others" are used, assume we're dealing + # with a Qt-formatted message. In the case of Qt formatting (see https://doc.qt.io/qt-5/qstring.html#arg) + # only numeric formats are replaced at all. This means "(percentage: %1%)" is valid, without needing + # any kind of escaping that would be necessary for strprintf. Without this, this function + # would wrongly detect '%)' as a printf format specifier. + if numeric: + other = [] + # numeric (Qt) can be present in any order, others (strprintf) must be in specified order return set(numeric),other diff --git a/contrib/gitian-build.sh b/contrib/gitian-build.sh index 53c24e3a87..6ee5df4703 100755 --- a/contrib/gitian-build.sh +++ b/contrib/gitian-build.sh @@ -41,7 +41,7 @@ Options: -c|--commit Indicate that the version argument is for a commit or branch -u|--url Specify the URL of the repository. Default is https://github.com/bitcoin/bitcoin -v|--verify Verify the gitian build --b|--build Do a gitiain build +-b|--build Do a gitian build -s|--sign Make signed binaries for Windows and Mac OSX -B|--buildsign Build both signed and unsigned binaries -o|--os Specify which Operating Systems the build is for. Default is lwx. l for linux, w for windows, x for osx diff --git a/contrib/gitian-descriptors/gitian-linux.yml b/contrib/gitian-descriptors/gitian-linux.yml index 6f43119ba2..00af4bdc6f 100644 --- a/contrib/gitian-descriptors/gitian-linux.yml +++ b/contrib/gitian-descriptors/gitian-linux.yml @@ -1,5 +1,5 @@ --- -name: "bitcoin-linux-0.13" +name: "bitcoin-linux-0.15" enable_cache: true suites: - "trusty" diff --git a/contrib/gitian-descriptors/gitian-osx.yml b/contrib/gitian-descriptors/gitian-osx.yml index 991976d59e..05cc65414f 100644 --- a/contrib/gitian-descriptors/gitian-osx.yml +++ b/contrib/gitian-descriptors/gitian-osx.yml @@ -1,5 +1,5 @@ --- -name: "bitcoin-osx-0.13" +name: "bitcoin-osx-0.15" enable_cache: true suites: - "trusty" diff --git a/contrib/gitian-descriptors/gitian-win.yml b/contrib/gitian-descriptors/gitian-win.yml index fe01b5b957..6fead7c208 100644 --- a/contrib/gitian-descriptors/gitian-win.yml +++ b/contrib/gitian-descriptors/gitian-win.yml @@ -1,5 +1,5 @@ --- -name: "bitcoin-win-0.13" +name: "bitcoin-win-0.15" enable_cache: true suites: - "trusty" diff --git a/contrib/gitian-keys/jtimon-key.pgp b/contrib/gitian-keys/jtimon-key.pgp Binary files differnew file mode 100644 index 0000000000..88d0de1503 --- /dev/null +++ b/contrib/gitian-keys/jtimon-key.pgp diff --git a/contrib/linearize/README.md b/contrib/linearize/README.md index adc9a559cc..0971e7816b 100644 --- a/contrib/linearize/README.md +++ b/contrib/linearize/README.md @@ -32,8 +32,11 @@ Required configuration file settings: * `output`: Output directory for linearized `blocks/blkNNNNN.dat` output. Optional config file setting for linearize-data: -* `file_timestamp`: Set each file's last-modified time to that of the most -recent block in that file. +* `debug_output`: Some printouts may not always be desired. If true, such output +will be printed. +* `file_timestamp`: Set each file's last-accessed and last-modified times, +respectively, to the current time and to the timestamp of the most recent block +written to the script's blockchain. * `genesis`: The hash of the genesis block in the blockchain. * `input`: bitcoind blocks/ directory containing blkNNNNN.dat * `hashlist`: text file containing list of block hashes created by @@ -41,6 +44,9 @@ linearize-hashes.py. * `max_out_sz`: Maximum size for files created by the `output_file` option. (Default: `1000*1000*1000 bytes`) * `netmagic`: Network magic number. +* `out_of_order_cache_sz`: If out-of-order blocks are being read, the block can +be written to a cache so that the blockchain doesn't have to be seeked again. +This option specifies the cache size. (Default: `100*1000*1000 bytes`) * `rev_hash_bytes`: If true, the block hash list written by linearize-hashes.py will be byte-reversed when read by linearize-data.py. See the linearize-hashes entry for more information. diff --git a/contrib/linearize/example-linearize.cfg b/contrib/linearize/example-linearize.cfg index cccdd79213..2cc910edfe 100644 --- a/contrib/linearize/example-linearize.cfg +++ b/contrib/linearize/example-linearize.cfg @@ -1,4 +1,3 @@ - # bitcoind RPC settings (linearize-hashes) rpcuser=someuser rpcpassword=somepassword @@ -21,11 +20,23 @@ input=/home/example/.bitcoin/blocks #genesis=000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943 #input=/home/example/.bitcoin/testnet3/blocks +# "output" option causes blockchain files to be written to the given location, +# with "output_file" ignored. If not used, "output_file" is used instead. +# output=/home/example/blockchain_directory output_file=/home/example/Downloads/bootstrap.dat hashlist=hashlist.txt -# Maxmimum size in bytes of out-of-order blocks cache in memory +# Maximum size in bytes of out-of-order blocks cache in memory out_of_order_cache_sz = 100000000 # Do we want the reverse the hash bytes coming from getblockhash? rev_hash_bytes = False + +# On a new month, do we want to set the access and modify times of the new +# blockchain file? +file_timestamp = 0 +# Do we want to split the blockchain files given a new month or specific height? +split_timestamp = 0 + +# Do we want debug printouts? +debug_output = False diff --git a/contrib/linearize/linearize-data.py b/contrib/linearize/linearize-data.py index 043bf2e814..afcec2b60a 100755 --- a/contrib/linearize/linearize-data.py +++ b/contrib/linearize/linearize-data.py @@ -8,16 +8,10 @@ # from __future__ import print_function, division -try: # Python 3 - import http.client as httplib -except ImportError: # Python 2 - import httplib -import json import struct import re import os import os.path -import base64 import sys import hashlib import datetime @@ -140,7 +134,7 @@ class BlockDataCopier: if not self.fileOutput and ((self.outsz + blockSizeOnDisk) > self.maxOutSz): self.outF.close() if self.setFileTime: - os.utime(outFname, (int(time.time()), highTS)) + os.utime(self.outFname, (int(time.time()), self.highTS)) self.outF = None self.outFname = None self.outFn = self.outFn + 1 @@ -148,12 +142,12 @@ class BlockDataCopier: (blkDate, blkTS) = get_blk_dt(blk_hdr) if self.timestampSplit and (blkDate > self.lastDate): - print("New month " + blkDate.strftime("%Y-%m") + " @ " + hash_str) - lastDate = blkDate - if outF: - outF.close() - if setFileTime: - os.utime(outFname, (int(time.time()), highTS)) + print("New month " + blkDate.strftime("%Y-%m") + " @ " + self.hash_str) + self.lastDate = blkDate + if self.outF: + self.outF.close() + if self.setFileTime: + os.utime(self.outFname, (int(time.time()), self.highTS)) self.outF = None self.outFname = None self.outFn = self.outFn + 1 @@ -161,11 +155,11 @@ class BlockDataCopier: if not self.outF: if self.fileOutput: - outFname = self.settings['output_file'] + self.outFname = self.settings['output_file'] else: - outFname = os.path.join(self.settings['output'], "blk%05d.dat" % self.outFn) - print("Output file " + outFname) - self.outF = open(outFname, "wb") + self.outFname = os.path.join(self.settings['output'], "blk%05d.dat" % self.outFn) + print("Output file " + self.outFname) + self.outF = open(self.outFname, "wb") self.outF.write(inhdr) self.outF.write(blk_hdr) @@ -229,13 +223,16 @@ class BlockDataCopier: blk_hdr = self.inF.read(80) inExtent = BlockExtent(self.inFn, self.inF.tell(), inhdr, blk_hdr, inLen) - hash_str = calc_hash_str(blk_hdr) - if not hash_str in blkmap: - print("Skipping unknown block " + hash_str) + self.hash_str = calc_hash_str(blk_hdr) + if not self.hash_str in blkmap: + # Because blocks can be written to files out-of-order as of 0.10, the script + # may encounter blocks it doesn't know about. Treat as debug output. + if settings['debug_output'] == 'true': + print("Skipping unknown block " + self.hash_str) self.inF.seek(inLen, os.SEEK_CUR) continue - blkHeight = self.blkmap[hash_str] + blkHeight = self.blkmap[self.hash_str] self.blkCountIn += 1 if self.blkCountOut == blkHeight: @@ -301,12 +298,15 @@ if __name__ == '__main__': settings['max_out_sz'] = 1000 * 1000 * 1000 if 'out_of_order_cache_sz' not in settings: settings['out_of_order_cache_sz'] = 100 * 1000 * 1000 + if 'debug_output' not in settings: + settings['debug_output'] = 'false' settings['max_out_sz'] = int(settings['max_out_sz']) settings['split_timestamp'] = int(settings['split_timestamp']) settings['file_timestamp'] = int(settings['file_timestamp']) settings['netmagic'] = unhexlify(settings['netmagic'].encode('utf-8')) settings['out_of_order_cache_sz'] = int(settings['out_of_order_cache_sz']) + settings['debug_output'] = settings['debug_output'].lower() if 'output_file' not in settings and 'output' not in settings: print("Missing output file / directory") diff --git a/contrib/linearize/linearize-hashes.py b/contrib/linearize/linearize-hashes.py index f749da5396..00a54d0820 100755 --- a/contrib/linearize/linearize-hashes.py +++ b/contrib/linearize/linearize-hashes.py @@ -13,7 +13,6 @@ try: # Python 3 except ImportError: # Python 2 import httplib import json -import struct import re import base64 import sys diff --git a/contrib/macdeploy/macdeployqtplus b/contrib/macdeploy/macdeployqtplus index 73d4f159d8..5995f9f438 100755 --- a/contrib/macdeploy/macdeployqtplus +++ b/contrib/macdeploy/macdeployqtplus @@ -340,7 +340,7 @@ def deployFrameworks(frameworks, bundlePath, binaryPath, strip, verbose, deploym # install_name_tool the new id into the binary changeInstallName(framework.installName, framework.deployedInstallName, binaryPath, verbose) - # Copy farmework to app bundle. + # Copy framework to app bundle. deployedBinaryPath = copyFramework(framework, bundlePath, verbose) # Skip the rest if already was deployed. if deployedBinaryPath is None: @@ -492,7 +492,7 @@ ap.add_argument("-no-strip", dest="strip", action="store_false", default=True, h ap.add_argument("-sign", dest="sign", action="store_true", default=False, help="sign .app bundle with codesign tool") ap.add_argument("-dmg", nargs="?", const="", metavar="basename", help="create a .dmg disk image; if basename is not specified, a camel-cased version of the app name is used") ap.add_argument("-fancy", nargs=1, metavar="plist", default=[], help="make a fancy looking disk image using the given plist file with instructions; requires -dmg to work") -ap.add_argument("-add-qt-tr", nargs=1, metavar="languages", default=[], help="add Qt translation files to the bundle's ressources; the language list must be separated with commas, not with whitespace") +ap.add_argument("-add-qt-tr", nargs=1, metavar="languages", default=[], help="add Qt translation files to the bundle's resources; the language list must be separated with commas, not with whitespace") ap.add_argument("-translations-dir", nargs=1, metavar="path", default=None, help="Path to Qt's translation files") ap.add_argument("-add-resources", nargs="+", metavar="path", default=[], help="list of additional files or folders to be copied into the bundle's resources; must be the last argument") ap.add_argument("-volname", nargs=1, metavar="volname", default=[], help="custom volume name for dmg") diff --git a/contrib/qos/README.md b/contrib/qos/README.md index 5e0a975fc6..0ded87c58f 100644 --- a/contrib/qos/README.md +++ b/contrib/qos/README.md @@ -1,5 +1,5 @@ -### Qos ### +### QoS (Quality of service) ### -This is a Linux bash script that will set up tc to limit the outgoing bandwidth for connections to the Bitcoin network. It limits outbound TCP traffic with a source or destination port of 8333, but not if the destination IP is within a LAN (defined as 192.168.x.x). +This is a Linux bash script that will set up tc to limit the outgoing bandwidth for connections to the Bitcoin network. It limits outbound TCP traffic with a source or destination port of 8333, but not if the destination IP is within a LAN. This means one can have an always-on bitcoind instance running, and another local bitcoind/bitcoin-qt instance which connects to this node and receives blocks from it. diff --git a/contrib/qos/tc.sh b/contrib/qos/tc.sh index aaf5e1fa11..0d1dd65b4f 100644 --- a/contrib/qos/tc.sh +++ b/contrib/qos/tc.sh @@ -1,4 +1,4 @@ -# Copyright (c) 2013 The Bitcoin Core developers +# Copyright (c) 2017 The Bitcoin Core developers # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. @@ -8,8 +8,10 @@ IF="eth0" LINKCEIL="1gbit" #limit outbound Bitcoin protocol traffic to this rate LIMIT="160kbit" -#defines the address space for which you wish to disable rate limiting -LOCALNET="192.168.0.0/16" +#defines the IPv4 address space for which you wish to disable rate limiting +LOCALNET_V4="192.168.0.0/16" +#defines the IPv6 address space for which you wish to disable rate limiting +LOCALNET_V6="fe80::/10" #delete existing rules tc qdisc del dev ${IF} root @@ -28,6 +30,12 @@ tc class add dev ${IF} parent 1:1 classid 1:11 htb rate ${LIMIT} ceil ${LIMIT} p tc filter add dev ${IF} parent 1: protocol ip prio 1 handle 1 fw classid 1:10 tc filter add dev ${IF} parent 1: protocol ip prio 2 handle 2 fw classid 1:11 +if [ ! -z "${LOCALNET_V6}" ] ; then + # v6 cannot have the same priority value as v4 + tc filter add dev ${IF} parent 1: protocol ipv6 prio 3 handle 1 fw classid 1:10 + tc filter add dev ${IF} parent 1: protocol ipv6 prio 4 handle 2 fw classid 1:11 +fi + #delete any existing rules #disable for now #ret=0 @@ -37,9 +45,15 @@ tc filter add dev ${IF} parent 1: protocol ip prio 2 handle 2 fw classid 1:11 #done #limit outgoing traffic to and from port 8333. but not when dealing with a host on the local network -# (defined by $LOCALNET) -# --set-mark marks packages matching these criteria with the number "2" -# these packages are filtered by the tc filter with "handle 2" +# (defined by $LOCALNET_V4 and $LOCALNET_V6) +# --set-mark marks packages matching these criteria with the number "2" (v4) +# --set-mark marks packages matching these criteria with the number "4" (v6) +# these packets are filtered by the tc filter with "handle 2" # this filter sends the packages into the 1:11 class, and this class is limited to ${LIMIT} -iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 8333 ! -d ${LOCALNET} -j MARK --set-mark 0x2 -iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 8333 ! -d ${LOCALNET} -j MARK --set-mark 0x2 +iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 8333 ! -d ${LOCALNET_V4} -j MARK --set-mark 0x2 +iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 8333 ! -d ${LOCALNET_V4} -j MARK --set-mark 0x2 + +if [ ! -z "${LOCALNET_V6}" ] ; then + ip6tables -t mangle -A OUTPUT -p tcp -m tcp --dport 8333 ! -d ${LOCALNET_V6} -j MARK --set-mark 0x4 + ip6tables -t mangle -A OUTPUT -p tcp -m tcp --sport 8333 ! -d ${LOCALNET_V6} -j MARK --set-mark 0x4 +fi diff --git a/contrib/rpm/README.md b/contrib/rpm/README.md index aecb3ba84f..e1fd0b317b 100644 --- a/contrib/rpm/README.md +++ b/contrib/rpm/README.md @@ -31,7 +31,7 @@ through `Source23` are used. Sources 30-39 should be reserved for SELinux related files. Currently only `Source30` through `Source32` are used. Until those files are in a tagged release, the full URL specified in the RPM spec file will not work. You can get -them from the git ropository where you retrieved this file. +them from the git repository where you retrieved this file. Sources 100+ are for files that are not source tarballs and are not maintained in the bitcoin git repository. At present only an SVG version of the Bitcoin diff --git a/contrib/seeds/README.md b/contrib/seeds/README.md index c595f83eb9..afe902fd7f 100644 --- a/contrib/seeds/README.md +++ b/contrib/seeds/README.md @@ -1,11 +1,19 @@ -### Seeds ### +# Seeds Utility to generate the seeds.txt list that is compiled into the client (see [src/chainparamsseeds.h](/src/chainparamsseeds.h) and other utilities in [contrib/seeds](/contrib/seeds)). +Be sure to update `PATTERN_AGENT` in `makeseeds.py` to include the current version, +and remove old versions as necessary. + The seeds compiled into the release are created from sipa's DNS seed data, like this: curl -s http://bitcoin.sipa.be/seeds.txt > seeds_main.txt - python makeseeds.py < seeds_main.txt > nodes_main.txt - python generate-seeds.py . > ../../src/chainparamsseeds.h + python3 makeseeds.py < seeds_main.txt > nodes_main.txt + python3 generate-seeds.py . > ../../src/chainparamsseeds.h + +## Dependencies + +Ubuntu: + sudo apt-get install python3-dnspython diff --git a/contrib/seeds/generate-seeds.py b/contrib/seeds/generate-seeds.py index f43dc0b218..b0ac92ae03 100755 --- a/contrib/seeds/generate-seeds.py +++ b/contrib/seeds/generate-seeds.py @@ -1,5 +1,5 @@ -#!/usr/bin/env python -# Copyright (c) 2014 Wladimir J. van der Laan +#!/usr/bin/env python3 +# Copyright (c) 2014-2017 Wladimir J. van der Laan # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. ''' @@ -31,7 +31,7 @@ The output will be two data structures with the peers in binary format: These should be pasted into `src/chainparamsseeds.h`. ''' -from __future__ import print_function, division + from base64 import b32decode from binascii import a2b_hex import sys, os diff --git a/contrib/seeds/makeseeds.py b/contrib/seeds/makeseeds.py index 95498d20e2..34f0f57671 100755 --- a/contrib/seeds/makeseeds.py +++ b/contrib/seeds/makeseeds.py @@ -1,5 +1,5 @@ -#!/usr/bin/env python -# Copyright (c) 2013-2016 The Bitcoin Core developers +#!/usr/bin/env python3 +# Copyright (c) 2013-2017 The Bitcoin Core developers # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. # @@ -14,13 +14,13 @@ MIN_BLOCKS = 337600 # These are hosts that have been observed to be behaving strangely (e.g. # aggressively connecting to every node). -SUSPICIOUS_HOSTS = set([ +SUSPICIOUS_HOSTS = { "130.211.129.106", "178.63.107.226", "83.81.130.26", "88.198.17.7", "148.251.238.178", "176.9.46.6", "54.173.72.127", "54.174.10.182", "54.183.64.54", "54.194.231.211", "54.66.214.167", "54.66.220.137", "54.67.33.14", "54.77.251.214", "54.94.195.96", "54.94.200.247" -]) +} import re import sys @@ -30,7 +30,7 @@ import collections PATTERN_IPV4 = re.compile(r"^((\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})):(\d+)$") PATTERN_IPV6 = re.compile(r"^\[([0-9a-z:]+)\]:(\d+)$") PATTERN_ONION = re.compile(r"^([abcdefghijklmnopqrstuvwxyz234567]{16}\.onion):(\d+)$") -PATTERN_AGENT = re.compile(r"^(\/Satoshi:0\.8\.6\/|\/Satoshi:0\.9\.(2|3|4|5)\/|\/Satoshi:0\.10\.\d{1,2}\/|\/Satoshi:0\.11\.\d{1,2}\/)$") +PATTERN_AGENT = re.compile(r"^(/Satoshi:0.12.(0|1|99)/|/Satoshi:0.13.(0|1|2|99)/)$") def parseline(line): sline = line.split() @@ -104,7 +104,7 @@ def filtermultiport(ips): hist = collections.defaultdict(list) for ip in ips: hist[ip['sortkey']].append(ip) - return [value[0] for (key,value) in hist.items() if len(value)==1] + return [value[0] for (key,value) in list(hist.items()) if len(value)==1] # Based on Greg Maxwell's seed_filter.py def filterbyasn(ips, max_per_asn, max_total): @@ -164,9 +164,9 @@ def main(): for ip in ips: if ip['net'] == 'ipv6': - print '[%s]:%i' % (ip['ip'], ip['port']) + print('[%s]:%i' % (ip['ip'], ip['port'])) else: - print '%s:%i' % (ip['ip'], ip['port']) + print('%s:%i' % (ip['ip'], ip['port'])) if __name__ == '__main__': main() diff --git a/contrib/seeds/nodes_main.txt b/contrib/seeds/nodes_main.txt index f1854b27f9..0451771dae 100644 --- a/contrib/seeds/nodes_main.txt +++ b/contrib/seeds/nodes_main.txt @@ -1,937 +1,1168 @@ -5.2.145.201:8333 -5.22.142.214:8333 -5.53.172.197:8333 -5.189.161.164:8333 -5.230.140.166:8333 -5.231.3.130:8333 -5.255.80.103:8333 -14.202.230.49:8333 -18.85.11.130:8333 -23.91.97.25:8333 -23.94.100.122:8333 -23.95.99.132:8333 -24.115.8.206:8333 -24.127.128.191:8333 -24.154.178.25:8333 -24.207.103.43:8333 -24.207.104.105:8333 -24.210.230.150:8333 -24.224.18.84:8333 -24.246.168.106:8333 -27.254.64.47:8333 -31.6.71.123:8333 -31.6.71.124:8333 -31.14.134.13:8333 -31.30.36.220:8333 -31.164.6.104:8333 +2.7.8.12:8333 +2.228.70.198:8333 +5.39.64.7:8333 +5.45.80.34:38333 +5.51.160.38:8333 +5.61.33.33:8333 +5.61.37.12:8333 +5.95.80.47:8333 +5.102.164.173:8333 +5.175.71.130:8333 +5.189.165.22:8333 +5.199.130.228:8333 +5.228.100.222:8333 +5.255.64.231:8333 +13.93.6.133:8333 +18.85.34.10:8333 +18.241.0.63:8333 +23.28.128.65:8333 +23.248.113.52:8333 +23.253.151.73:8333 +24.4.96.121:8333 +24.69.65.191:8333 +24.87.8.43:8333 +24.150.224.110:8333 +24.227.69.146:8333 +27.0.235.33:8333 31.170.106.203:8333 -31.185.134.201:8333 -31.204.128.99:8333 -31.204.128.219:8333 -37.1.219.88:8333 -37.97.132.109:8333 -37.120.160.55:8333 +31.184.197.96:8333 +31.214.240.56:8333 +37.1.202.134:8333 +37.18.74.232:8333 +37.34.48.17:8333 +37.48.64.140:8333 +37.97.141.116:8333 +37.120.164.16:8333 37.120.169.123:8333 -37.139.32.46:8333 -37.221.163.218:8333 -38.130.192.72:8333 -41.75.96.80:8333 -45.3.0.49:8333 -45.33.72.185:8333 -45.33.96.129:8333 -45.56.4.63:8333 -45.79.0.127:8333 -45.79.80.102:8333 -45.79.97.30:8333 -45.79.132.219:8333 -46.21.97.135:8333 -46.28.205.67:8333 -46.28.206.188:8333 -46.29.20.209:8333 -46.50.234.179:8333 -46.101.160.168:8333 -46.166.161.35:8333 -46.166.161.103:8333 -46.182.132.100:8333 -46.218.227.92:8333 -46.226.109.20:8333 -46.227.66.132:8333 -46.227.66.138:8333 -46.229.165.154:8333 -46.229.165.155:8333 +37.143.9.128:8333 +37.153.172.227:8333 +37.193.227.16:8333 +37.205.8.78:8333 +37.220.0.114:8333 +37.232.218.199:8333 +38.140.161.53:8333 +40.87.70.120:8333 +41.162.163.93:8333 +42.2.198.48:8333 +45.20.67.1:8333 +45.55.197.77:8333 +45.56.97.63:8333 +45.58.38.162:8333 +45.63.1.33:8333 +45.79.2.70:8333 +46.16.240.98:8333 +46.19.137.74:8333 +46.28.206.146:8333 +46.32.252.197:8333 +46.59.13.59:8333 +46.59.39.195:8333 +46.148.16.210:8333 +46.160.195.121:8333 +46.166.142.21:8333 +46.166.160.29:8330 +46.188.44.20:8333 46.229.238.187:8333 -46.234.104.48:8333 -46.239.107.74:8333 -46.244.0.138:8333 -46.254.72.195:8333 -50.5.13.44:8333 -50.7.37.114:8333 -50.30.37.103:8333 -50.39.105.60:8333 -50.106.40.231:8333 -52.29.0.37:8333 -52.76.192.246:8333 -54.152.192.179:8333 -54.169.64.174:8333 -54.175.160.22:8333 -54.199.128.0:8333 -58.96.171.129:8333 -58.161.238.57:8333 -60.251.195.221:8333 -61.35.225.19:8333 +46.231.16.149:8333 +47.88.100.130:8333 +47.89.192.134:8333 +47.185.194.160:8333 +47.189.129.218:8333 +49.65.2.140:8333 +50.3.72.129:8333 +50.31.99.225:8333 +51.175.33.95:8333 +52.1.165.219:8333 +52.10.170.186:8333 +52.51.128.216:8333 +54.197.130.244:8333 +58.59.2.22:8333 +58.84.6.81:8333 +59.125.8.143:8333 +59.167.130.139:8333 +61.47.2.20:8333 62.43.130.178:8333 -62.65.39.12:8333 +62.76.96.6:8333 62.107.200.30:8333 +62.133.15.58:8333 62.133.194.2:8333 -62.181.238.186:8333 -62.183.22.50:8333 -62.210.85.120:8333 -62.210.162.89:8333 +62.133.194.156:8333 +62.138.1.95:8333 +62.216.238.3:8333 62.238.34.125:8333 -64.25.171.73:8333 -64.27.166.30:8333 -64.53.137.101:8333 -64.71.72.44:8333 +63.137.40.207:8333 +63.231.96.109:8333 +64.78.240.150:8333 64.83.225.146:8333 -64.121.3.163:8333 -64.203.102.86:8333 -65.94.131.59:8333 -65.188.136.233:8333 -66.11.162.218:8333 -66.23.228.133:8333 -66.90.137.89:8333 -66.114.33.49:8333 -66.150.105.77:8333 +64.137.236.68:8833 +64.156.193.120:8333 +66.79.160.82:8333 +66.91.230.231:8333 +66.135.128.121:8333 66.172.10.4:8333 66.194.38.250:8333 66.194.38.253:8333 -66.194.38.254:8333 -66.231.97.172:8333 +66.215.34.26:8333 66.240.237.155:8333 -67.159.13.34:8333 -67.205.74.206:8333 +67.205.96.108:8333 +67.205.128.5:8333 +67.219.233.140:8333 67.221.193.55:8333 -67.227.72.17:8333 -68.65.120.53:8333 -68.65.205.226:9000 -68.144.4.34:8333 -69.39.49.199:8333 +68.100.196.118:8333 +68.132.193.222:8333 +68.168.118.234:8333 +69.11.97.43:8333 +69.30.229.10:8333 69.50.171.205:8333 -69.65.41.21:8333 -69.113.98.61:8333 -69.119.97.39:8333 -69.146.70.124:8333 -69.193.71.2:8333 -70.46.10.237:8333 -70.80.200.187:8333 -70.185.97.117:8333 -71.254.160.25:8333 -72.28.203.5:8333 -72.52.130.110:8333 -72.83.194.122:8333 -72.128.32.167:8333 -72.179.136.80:8333 -72.235.38.70:8333 -74.50.44.193:8333 -74.72.60.83:8333 -74.80.234.116:8333 -74.207.233.193:8333 -75.112.233.128:8333 -75.118.166.197:8333 -75.140.0.241:8333 -75.159.240.66:8333 -75.174.5.26:8333 -76.72.160.252:8333 -76.72.160.254:8333 -76.74.170.112:8333 -76.79.201.54:8333 -76.175.166.164:8333 -76.179.105.27:8333 -77.68.37.200:8333 -77.234.49.196:8333 -77.247.229.93:8333 -78.24.72.78:8333 -78.47.32.147:8333 -78.84.100.95:8333 -78.121.69.23:8333 -78.129.167.5:8333 -78.193.96.155:8333 -79.19.37.179:8333 +69.125.193.145:8333 +69.162.139.125:8333 +70.35.98.39:8333 +70.112.32.29:8333 +71.126.181.146:8333 +72.180.32.105:8333 +73.226.64.145:8333 +74.83.140.242:8333 +74.84.128.158:9333 +74.122.237.124:8333 +74.215.133.145:8333 +75.76.101.169:8333 +75.85.13.8:8333 +75.86.168.13:8333 +75.170.97.25:8333 +75.177.137.134:8333 +76.76.227.136:8333 +77.53.136.6:8333 +77.110.11.52:8333 +78.25.32.206:8333 +78.34.8.120:8333 +78.46.32.99:8333 +78.56.9.214:8333 +78.56.229.177:8333 +78.129.237.245:8333 +78.196.172.45:8333 79.132.230.144:8333 -79.133.43.63:8333 -79.134.201.66:8333 79.169.35.235:8333 -80.57.227.14:8333 +79.172.194.219:8333 80.64.65.87:8333 -80.86.92.70:8333 -80.100.203.151:8333 -80.101.32.121:8333 -80.161.178.73:8333 -80.240.129.170:8333 -81.7.11.50:8333 -81.7.11.55:8333 -81.17.17.40:9333 -81.30.39.83:8333 -81.90.36.7:9444 -81.136.224.77:8333 -81.162.231.211:8333 -81.184.0.143:8333 -81.198.128.86:8333 +80.89.137.115:8333 +80.93.36.173:8333 +80.101.167.100:8333 +80.114.34.158:8333 +80.127.136.50:8333 +80.188.139.82:8333 +80.222.39.77:8333 +80.223.105.69:8333 +80.229.151.187:8333 +80.240.129.221:8333 +81.7.10.238:8333 +81.7.13.84:8333 +81.27.96.92:8333 +81.35.143.98:8333 +81.82.201.5:8333 +81.83.96.5:8333 +81.169.227.36:8333 +81.171.2.119:8333 +81.171.38.130:8333 +81.175.255.118:8333 +81.207.8.49:8333 +81.228.194.187:8333 +82.9.1.77:8333 82.11.33.229:8333 -82.79.128.134:8333 -82.118.233.111:8333 -82.135.139.30:8333 +82.102.13.117:8333 +82.116.203.240:8333 +82.130.103.16:8333 +82.136.65.227:8333 +82.158.227.238:8333 +82.197.212.25:8333 82.199.102.10:8333 -82.221.106.17:8333 -82.221.108.21:8333 +82.200.204.41:8333 +82.200.204.119:8333 +82.221.105.223:8333 82.221.108.27:8333 -83.137.41.3:8333 -83.142.197.168:8333 +82.221.111.136:8333 +82.221.139.97:8333 +83.137.41.10:8333 83.143.130.19:8333 83.150.9.196:8333 -83.183.17.191:8333 -83.227.173.83:8333 -83.230.5.15:8333 -83.233.105.151:443 -83.246.75.8:8333 -83.250.133.158:8333 -83.255.66.118:8334 -84.24.69.59:8333 +83.169.2.43:8333 +83.217.203.130:8333 +83.249.88.52:8333 +84.26.162.92:8333 84.42.193.6:8333 -84.45.98.87:8333 -84.54.128.11:8333 -84.212.200.24:8333 -84.215.198.109:8333 -84.230.4.177:8333 -85.95.228.83:8333 -85.95.228.123:8333 -85.114.128.134:8333 -85.214.66.168:8333 -85.214.147.162:8333 -85.243.168.4:8333 -86.1.0.18:8333 -87.79.77.106:8333 -87.91.156.110:8333 -87.236.196.222:8333 -88.85.75.152:8333 -88.87.1.230:8333 -88.87.92.102:8333 -88.89.69.202:8333 -88.97.72.229:8333 -88.164.117.99:8333 -88.198.32.131:8333 +84.134.194.115:8333 +84.201.32.115:8333 +84.212.232.71:8333 +84.238.140.176:8333 +85.10.104.34:8333 +85.21.144.226:8333 +85.25.194.12:8333 +85.144.79.190:8333 +85.145.228.192:8333 +85.194.238.130:8333 +85.228.201.80:8333 +85.229.228.174:8333 +85.236.233.87:8333 +86.80.204.185:8333 +86.105.227.190:8333 +86.135.39.40:8333 +87.106.139.127:8333 +87.120.8.5:8333 +87.120.37.230:8333 +87.239.101.102:8333 +87.243.197.82:8333 +88.112.112.173:8333 +88.150.192.17:8333 +88.185.155.134:8333 +88.202.202.221:8333 88.202.230.87:8333 -88.214.193.154:8343 -88.214.194.226:8343 -89.10.155.88:8333 -89.46.101.44:8333 -89.163.224.212:8333 -89.174.248.20:8333 -89.202.231.198:8333 -89.212.75.6:8333 +88.208.39.182:8333 +89.34.99.41:8333 +89.163.224.187:8333 +89.169.233.150:8333 +89.184.65.85:8333 +89.212.91.219:8333 +89.249.178.36:8333 90.149.38.172:8333 -90.169.106.139:8333 -91.64.101.150:8333 -91.65.196.179:8333 -91.121.80.17:8333 -91.126.77.77:8333 -91.145.76.156:8333 -91.152.150.35:8333 -91.192.137.17:8333 -91.196.170.110:8333 +91.65.97.157:8333 +91.107.64.143:8333 +91.114.35.107:8333 +91.135.0.187:8333 +91.145.110.95:8333 +91.157.38.151:8333 91.197.44.133:8333 -91.207.68.144:8333 -91.210.105.28:8333 -91.211.102.101:8333 -91.211.106.34:8333 -91.214.200.205:8333 -91.220.43.146:8333 -91.222.71.89:8333 -91.224.140.242:8333 -91.229.76.14:8333 +91.205.176.54:8333 +91.206.203.10:8333 +91.206.203.18:8333 +91.215.35.130:8333 +91.219.239.159:8333 +91.223.133.2:8333 +91.223.133.40:8333 +91.226.10.90:8333 +91.240.141.169:8333 92.27.7.209:8333 -92.51.167.88:8333 -92.247.229.163:8333 -93.84.114.106:8333 -93.113.36.172:8333 +92.89.67.207:8333 +92.221.201.138:8333 +93.95.187.122:8333 +93.103.73.187:8333 +93.123.80.47:8333 93.188.224.253:8333 -94.75.239.69:8333 -94.190.227.112:8333 -94.214.2.74:8333 -94.224.162.65:8333 -94.236.198.253:8333 +93.190.69.242:8333 +94.19.12.244:8333 +94.156.128.116:8333 +94.177.171.73:8333 +94.181.44.104:8333 +94.237.26.173:8333 94.242.229.158:8333 -95.84.138.99:8333 -95.95.168.87:8333 +94.255.128.98:8333 +95.79.35.50:8333 +95.91.41.39:8333 95.110.234.93:8333 -95.130.9.200:8333 -95.165.168.168:8333 -95.170.235.254:8333 -95.211.130.154:8333 -96.46.68.104:8333 -96.127.202.148:8333 -97.76.171.35:8333 -98.160.160.67:8333 -99.126.197.187:8333 -99.198.173.1:8333 -101.100.174.138:8333 -101.164.201.208:8333 -103.224.165.48:8333 -104.128.225.223:8333 +95.128.48.209:8333 +95.183.48.71:8333 +96.23.67.85:8333 +97.64.177.10:8333 +97.104.201.95:8333 +98.29.197.149:8333 +98.169.2.107:8333 +99.232.48.72:8333 +101.100.141.55:8333 +103.7.32.40:8333 +103.53.225.69:8333 +103.249.106.74:8333 +104.128.224.13:8333 104.128.228.252:8333 -104.131.192.94:8333 -104.155.45.201:8334 -104.194.28.195:8663 -104.211.1.27:8333 -104.221.38.177:8333 -104.236.9.79:8333 -104.236.129.178:8333 -104.236.186.249:8333 -104.236.194.15:8333 -104.238.128.214:8333 +104.155.1.158:8333 +104.168.128.50:8333 +104.199.160.228:8333 +104.204.109.11:8333 +104.219.251.118:8333 +104.223.3.129:8333 +104.223.3.219:8333 104.238.130.182:8333 -106.38.234.84:8333 -106.185.36.204:8333 -106.185.38.67:8333 -107.6.4.145:8333 -107.150.2.6:8333 -107.150.40.234:8333 -107.170.13.184:8333 -107.181.250.216:8333 -107.191.101.111:8333 -107.191.106.115:8333 +104.245.99.227:8333 +106.38.234.89:8333 +106.104.134.218:8333 +107.136.6.71:8333 +107.150.45.210:8333 +107.151.144.103:8333 +107.170.44.99:8333 +107.181.137.133:8333 +107.191.102.13:8333 +108.58.252.82:8333 +108.59.9.167:8333 108.59.12.163:8333 -108.161.129.247:8333 -109.193.160.140:8333 -109.197.13.54:8333 -109.230.7.248:8333 -109.234.106.191:8333 -109.236.137.80:8333 -109.251.161.121:8333 -112.65.231.226:8333 -115.70.166.57:8333 -115.159.42.80:8333 -117.18.73.34:8333 -118.67.201.40:8333 -118.100.86.246:8333 -118.110.104.152:8333 -119.224.64.141:8333 +108.162.106.215:8333 +108.168.133.164:8333 +108.173.202.101:8333 +108.180.110.190:8333 +109.29.75.40:8333 +109.120.194.136:8333 +109.230.230.88:8333 +109.235.67.115:8333 +109.235.69.120:8333 +109.236.90.199:8333 +109.255.0.107:8333 +110.10.130.12:8333 +110.10.176.94:8333 +110.132.172.251:8333 +111.90.158.17:8333 +115.66.205.171:8333 +116.31.123.139:8333 +118.192.48.46:8333 +118.193.164.98:8333 +119.29.156.231:8333 +119.63.44.133:19980 +119.81.99.27:8333 +119.106.12.169:8333 +119.147.137.155:19980 +119.185.1.182:8333 120.55.193.136:8333 -122.106.169.178:8333 -123.203.174.15:8333 -123.255.232.94:8333 -124.148.165.165:8333 -124.232.141.31:8333 -128.30.92.69:8333 -128.39.141.182:8333 -128.84.167.20:8333 -128.111.73.10:8333 -128.127.38.195:8333 +121.254.173.23:8333 +121.254.173.40:8333 +123.56.129.45:8333 +123.203.163.128:8333 +123.206.32.198:8333 +124.189.160.221:8333 +124.189.192.232:8333 128.140.224.162:8333 -128.199.101.104:8333 -128.233.224.35:8333 -128.253.3.193:20020 -130.180.228.138:8333 -130.185.144.213:8333 -130.255.73.207:8333 -133.218.233.11:8333 -134.249.128.23:8333 -136.159.234.234:8333 -137.116.160.176:8333 -139.162.2.145:8333 -139.162.23.117:8333 -141.134.69.253:8333 -141.255.162.215:8333 -144.122.163.187:8333 -145.131.3.54:8333 -145.255.4.94:8333 -146.0.32.101:8337 -147.83.72.91:8333 -148.103.28.68:8333 -149.5.32.102:8333 -149.210.164.195:8333 -150.101.163.241:8333 -151.236.11.189:8333 -152.3.136.56:8333 -154.20.208.25:8333 -158.181.104.149:8333 -159.253.96.226:8333 -160.36.130.180:8333 +128.199.68.205:8333 +130.234.207.115:8333 +131.113.41.123:8333 +131.114.72.104:8333 +132.204.108.155:8333 +134.119.13.230:8333 +134.213.133.206:8333 +134.213.133.207:8333 +135.23.5.3:8333 +137.74.0.66:8333 +138.68.1.45:8333 +138.68.2.194:8333 +138.68.64.19:8333 +138.68.64.28:8333 +139.59.42.248:8333 +139.220.240.153:8333 +140.112.107.118:8333 +140.186.224.112:8333 +141.52.64.141:8333 +142.68.237.107:8333 +142.217.12.106:8333 +146.60.204.92:8333 +146.185.161.209:8333 +148.103.7.119:8333 +149.210.133.244:8333 +150.229.0.143:8333 +151.231.238.25:8333 +151.248.160.227:8333 +153.230.228.15:8333 +155.133.43.249:8333 +158.58.238.145:8333 +158.109.79.13:34821 +159.203.70.208:8333 +160.16.206.31:8333 162.209.1.233:8333 162.209.4.125:8333 -162.209.106.123:8333 -162.210.198.184:8333 -162.248.99.164:53011 +162.216.192.231:8333 +162.243.100.111:8333 +162.246.11.194:8333 162.248.102.117:8333 -162.251.108.53:8333 -163.44.2.48:8333 -163.158.36.17:8333 -166.230.71.67:8333 -167.160.36.62:8333 -167.160.169.92:8333 -168.93.129.220:8333 -169.55.99.84:8333 -169.228.66.43:8333 -172.9.169.242:8333 -173.32.11.194:8333 -173.230.228.136:8333 -173.246.107.34:8333 -173.254.235.34:8333 -174.0.128.222:8333 -174.25.130.148:8333 -174.50.64.101:8333 -175.140.232.141:8333 -176.36.37.62:8333 -176.46.9.96:8333 -176.124.110.27:8333 -177.39.16.102:8333 -178.17.173.2:8333 -178.62.5.248:8333 -178.62.70.16:8333 +162.252.46.83:8333 +163.172.33.78:8333 +163.172.194.30:8333 +169.229.198.106:8333 +170.75.195.168:8333 +172.103.205.197:8333 +172.245.225.126:8333 +173.179.37.8:8333 +173.208.203.74:8333 +173.252.46.16:8333 +174.117.141.124:8333 +175.126.38.158:8333 +175.126.38.177:8333 +175.139.106.119:8333 +175.140.232.66:8333 +176.9.117.100:8333 +176.36.33.121:8333 +176.36.99.222:8333 +176.56.227.36:8333 +176.100.100.206:8333 +176.106.144.183:8333 +176.123.7.148:8333 +176.126.167.10:8333 +176.223.201.198:8333 +178.62.68.62:8333 +178.62.102.56:8333 178.62.203.185:8333 -178.79.160.118:8333 -178.169.206.244:8333 -178.193.234.62:8333 -178.199.96.108:8333 -178.254.18.96:8333 +178.124.197.101:8333 +178.170.138.202:8333 +178.175.129.18:8333 +178.188.47.62:8333 +178.199.240.22:8333 +178.218.209.162:8333 +178.237.35.34:8333 +178.238.224.242:8333 +178.254.34.144:8333 178.254.34.161:8333 -178.255.41.123:8333 -180.210.34.58:9801 -182.92.226.212:8333 -182.171.246.142:8333 -184.23.8.9:8333 -184.58.162.35:8333 -184.154.9.170:8333 -185.8.238.165:8333 +179.43.183.2:8333 +180.200.128.58:8333 +182.93.34.130:8333 +185.8.238.197:8333 +185.11.139.172:8333 185.24.97.11:8333 -185.31.137.139:8333 -185.38.44.64:8333 -185.53.128.180:8333 -185.53.129.244:8333 -185.77.129.119:8333 -185.77.129.156:8333 -185.82.203.92:8333 -188.20.97.18:8333 -188.126.8.14:8333 -188.138.33.239:8333 -188.155.136.70:8333 +185.24.233.100:8333 +185.25.48.71:8333 +185.25.48.114:8333 +185.28.76.179:8333 +185.70.105.152:8339 +185.77.128.69:8333 +185.77.128.241:8333 +185.86.79.87:8333 +185.89.102.2:3333 +185.89.102.53:3333 +185.109.144.155:8333 +185.117.75.50:8333 +185.121.173.223:8333 +185.128.41.157:8333 +185.130.226.106:8333 +185.145.130.76:8333 +188.63.192.104:8333 +188.113.164.231:8333 188.166.229.112:8333 -188.182.108.129:8333 -188.226.225.174:8010 -188.242.171.8:8333 -188.243.4.139:8333 -190.10.9.234:8333 -190.10.10.147:8333 +188.214.128.77:8333 +190.10.8.211:8333 190.81.160.184:8333 -190.85.201.37:8333 -192.34.227.230:8333 -192.77.189.200:8333 -192.124.224.7:8333 -192.146.137.1:8333 -192.203.228.71:8333 -192.206.202.20:8333 -193.0.109.3:8333 -193.41.229.130:8333 -193.41.229.156:8333 +190.111.231.19:8333 +192.131.44.93:8333 +192.206.202.6:8333 +192.227.245.133:8333 +192.241.74.123:8333 +192.241.74.126:8333 +192.254.71.222:8333 +193.10.64.85:8333 +193.46.80.101:8333 193.49.43.219:8333 -193.147.71.120:8333 -193.179.65.233:8333 +193.93.79.215:8333 193.183.99.46:8333 -193.192.37.135:8333 193.234.224.195:8333 -194.58.108.213:8333 -194.187.96.2:8333 -194.255.31.59:8333 -195.36.6.101:8333 -195.58.238.243:8333 -195.197.175.190:8333 -195.239.1.66:8333 -198.48.196.230:8333 -198.50.192.160:8333 -198.57.210.27:8333 -198.84.195.179:8333 -198.167.140.8:8333 +193.239.80.155:8333 +194.63.140.208:8333 +194.87.1.232:8333 +194.187.227.18:8333 +194.247.12.136:8333 +195.91.176.86:8333 +196.28.98.20:8333 +198.44.249.35:8333 +198.84.172.252:8333 198.204.224.106:8333 -199.127.226.245:8333 -199.201.110.8:8333 -199.233.234.90:8333 +198.211.97.46:8333 +199.66.64.198:8333 +199.101.100.58:8333 +199.101.100.59:8333 +199.127.224.50:8333 +200.46.241.71:8333 200.116.98.185:8333 -202.60.70.18:8333 -203.151.140.14:8333 -204.112.203.52:8333 +203.9.225.13:8333 +203.177.142.37:8333 205.200.247.149:8333 -207.226.141.253:8333 -207.255.42.202:8333 -208.53.164.19:8333 -208.66.68.127:8333 -208.66.68.130:8333 -208.71.171.232:8341 -208.76.200.200:8333 -208.82.98.189:8333 -208.85.193.31:8333 -208.111.48.41:8333 -208.111.48.45:8333 -209.34.232.72:8333 -209.81.9.223:8333 -209.90.224.2:8333 +205.209.131.150:13838 +206.53.64.74:8333 +206.72.192.69:8333 +206.123.112.180:8333 +208.66.208.153:8333 +208.68.174.76:8333 +208.107.97.242:8333 +208.111.48.132:8333 +208.118.235.190:8333 +209.6.205.126:8333 +209.40.96.121:8333 +209.58.130.137:8333 +209.73.142.226:8333 209.90.224.4:8333 -209.126.98.174:8333 -209.136.72.69:8333 -209.195.4.74:8333 -209.197.13.62:8333 -211.72.227.8:8333 -212.51.144.42:8333 -212.71.233.127:8333 -212.126.14.122:8333 -212.159.44.50:8333 -213.5.36.58:8333 -213.57.33.10:8333 -213.66.205.194:8333 -213.136.73.125:8333 -213.155.3.216:8333 -213.155.7.24:8333 -213.167.17.6:8333 -213.223.138.13:8333 -216.15.78.182:8333 -216.38.129.164:8333 -216.48.168.8:8333 -216.169.141.169:8333 -216.245.206.181:8333 -216.249.204.161:8333 -216.250.138.230:8333 +209.126.69.243:8333 +209.126.108.91:8333 +209.195.4.18:8333 +209.250.6.190:8333 +210.54.37.225:8333 +210.223.3.44:8333 +211.149.234.109:8333 +212.51.140.183:8333 +212.90.179.206:8333 +212.93.226.90:8333 +212.110.171.118:8333 +212.202.132.17:8333 +213.91.205.134:8333 +213.165.68.218:8333 +213.196.200.213:8333 +216.59.4.212:8333 +216.74.32.109:8333 +216.158.225.70:8333 +216.164.138.13:8333 +216.167.236.247:8333 +216.197.79.74:8333 217.11.225.189:8333 -217.12.34.158:8333 -217.12.202.33:8333 -217.20.171.43:8333 -217.23.1.126:8333 -217.23.11.138:8333 +217.12.199.207:8333 +217.20.130.72:8333 +217.23.6.148:8333 +217.23.140.103:8333 +217.28.96.180:8333 +217.35.130.42:8333 217.111.66.79:8333 -217.155.202.191:8333 217.158.9.102:8333 -217.172.32.18:20993 -220.245.196.37:8333 -[2001:1291:2bf:1::100]:8333 +217.168.143.169:8333 +217.209.32.219:8333 +218.161.33.165:8333 +221.121.144.138:8333 +[2001:0:4137:9e76:2048:3a84:bb91:e846]:8333 +[2001:0:4137:9e76:2066:e9e:b489:f8b8]:8333 +[2001:0:4137:9e76:3854:1211:b5ac:a96b]:8333 +[2001:0:4137:9e76:4e3:1f66:cd4c:829f]:8333 +[2001:0:4137:9e76:ad:1f4:9ea9:fa2e]:8333 +[2001:0:4137:9e76:e5:baa:b66f:f418]:8333 +[2001:0:53aa:64c:20a2:59c4:ad22:93ea]:8333 +[2001:0:53aa:64c:59:617f:a10d:e0]:8333 +[2001:0:5ef5:79fb:200f:3ae5:3cbc:74c9]:8333 +[2001:0:5ef5:79fb:38f2:13b4:b208:5604]:8333 +[2001:0:5ef5:79fd:200b:22a7:cc50:f52d]:8333 +[2001:0:5ef5:79fd:24ef:1aef:a994:303d]:8333 +[2001:0:5ef5:79fd:24fc:b5d:ad4f:4db2]:8333 +[2001:0:5ef5:79fd:28bf:2d23:e02e:c3ef]:8333 +[2001:0:5ef5:79fd:3cd0:3c2e:da44:a759]:8333 +[2001:0:5ef5:79fd:87e:fd7:b1c2:1b4]:8333 +[2001:0:9d38:6ab8:18db:3bda:ab90:e81e]:8333 +[2001:0:9d38:6ab8:4e7:1660:862f:a6d7]:8333 +[2001:0:9d38:6ab8:6:2b:5074:9588]:8333 +[2001:0:9d38:6abd:10f8:a7d7:bb90:f524]:8333 +[2001:13d8:1c01:1000::11]:8333 +[2001:15c0:65ff:610::2]:8333 +[2001:1608:10:156:ae::4adb]:8333 +[2001:1620:b1b:8888:20d:b9ff:fe41:6710]:8333 +[2001:1620:b1b:face:20d:b9ff:fe41:6710]:8333 [2001:1620:f00:282::2]:8333 [2001:1620:f00:8282::1]:8333 -[2001:19f0:5000:8de8:5400:ff:fe12:55e4]:8333 -[2001:19f0:6c00:9103:5400:ff:fe10:a8d3]:8333 -[2001:1b60:3:172:142b:6dff:fe7a:117]:8333 -[2001:410:a000:4050:8463:90b0:fffb:4e58]:8333 +[2001:1680:101:1ae::1]:8333 +[2001:16d8:ff00:85de:20c:29ff:fe52:9594]:8333 +[2001:19f0:4400:434d:5400:ff:fe42:2678]:8333 +[2001:19f0:5000:8c8b:5400:ff:fe1f:c023]:8333 +[2001:19f0:5000:8ce6:5400:ff:fe1b:24a9]:8333 +[2001:19f0:5:314:5400:ff:fe2c:42e8]:8333 +[2001:19f0:5:51b:5400:ff:fe49:fe5b]:8333 +[2001:19f0:5:bc:5400:ff:fe3b:9339]:8333 +[2001:1af8:4020:a020:5::]:8333 +[2001:1bc8:1a0:590e:2e0:f4ff:fe16:3a39]:8333 +[2001:1c04:1401:8f00:f4fe:4fff:fe0c:df40]:8333 +[2001:4128:6135:10:20c:29ff:fe69:9e81]:8333 [2001:4128:6135:2010:21e:bff:fee8:a3c0]:8333 -[2001:41d0:1008:761::17c]:8333 +[2001:4128:6135:e001:5054:ff:fe37:e9eb]:8333 +[2001:41d0:1000:1024::]:8333 +[2001:41d0:1000:1433::]:8333 +[2001:41d0:1004:22ae::]:8333 +[2001:41d0:1004:2996::]:8333 +[2001:41d0:1008:11e0::1a5c:6d9d]:8333 +[2001:41d0:1008:11e0::b74:baf7]:8333 +[2001:41d0:1008:237a::]:8333 +[2001:41d0:1008:2752::]:8333 +[2001:41d0:1008:494::]:8333 [2001:41d0:1:45d8::1]:8333 -[2001:41d0:1:6cd3::]:8333 +[2001:41d0:1:5630::1]:8333 +[2001:41d0:1:6f57::1]:8333 +[2001:41d0:1:801e::1]:8333 +[2001:41d0:1:8852::1]:8333 [2001:41d0:1:8b26::1]:8333 -[2001:41d0:1:afda::]:8200 +[2001:41d0:1:a5b8::1]:8333 [2001:41d0:1:b26b::1]:8333 [2001:41d0:1:c139::1]:8333 [2001:41d0:1:c8d7::1]:8333 -[2001:41d0:1:f59f::33]:8333 -[2001:41d0:1:f7cc::1]:8333 -[2001:41d0:2:1021::1]:8333 -[2001:41d0:2:37c3::]:8200 -[2001:41d0:2:4797:2323:2323:2323:2323]:8333 -[2001:41d0:2:53df::]:8333 +[2001:41d0:1:d227::]:8333 +[2001:41d0:1:dbc4::1]:8333 +[2001:41d0:1:dc5d::1]:8333 +[2001:41d0:1:e13b::1]:8333 +[2001:41d0:1:ef5b::1]:8333 +[2001:41d0:2:16be::1]:8333 +[2001:41d0:2:203c::1]:8333 +[2001:41d0:2:38c5::1]:8333 +[2001:41d0:2:519::]:8333 [2001:41d0:2:9c94::1]:8333 -[2001:41d0:2:9d3e::1]:8333 -[2001:41d0:2:a24f::]:8333 -[2001:41d0:2:a35a::]:8333 -[2001:41d0:2:b2b8::]:8333 -[2001:41d0:2:c1d9::]:8333 -[2001:41d0:2:c6e::]:8333 +[2001:41d0:2:b792::]:8333 +[2001:41d0:2:bf2a::]:8333 +[2001:41d0:2:c793::]:8333 [2001:41d0:2:c9bf::]:8333 -[2001:41d0:2:f1a5::]:8333 -[2001:41d0:52:a00::105f]:8333 -[2001:41d0:52:cff::6f5]:8333 -[2001:41d0:52:d00::6e2]:8333 -[2001:41d0:8:3e75::1]:8333 -[2001:41d0:8:62ab::1]:8333 +[2001:41d0:303:4f0::]:8333 +[2001:41d0:8:1a8a::1]:8333 +[2001:41d0:8:3fa9::1]:8333 +[2001:41d0:8:4670::1]:8333 +[2001:41d0:8:4f48::1]:8333 [2001:41d0:8:6728::]:8333 -[2001:41d0:8:b30a::1]:8333 -[2001:41d0:8:bc26::1]:8333 -[2001:41d0:8:be9a::1]:8333 -[2001:41d0:8:d984::]:8333 -[2001:41d0:8:eb8b::]:8333 -[2001:41d0:a:13a2::1]:8333 -[2001:41d0:a:2b18::1]:8333 -[2001:41d0:a:2d14::]:8333 -[2001:41d0:a:4558::1df2:76d3]:8333 -[2001:41d0:a:4aaa::]:8333 -[2001:41d0:a:635b::1]:8333 -[2001:41d0:a:63d8::1]:8333 +[2001:41d0:8:72c2:d:242:ac11:2]:8333 +[2001:41d0:8:8007::]:8333 +[2001:41d0:8:a71c::]:8333 +[2001:41d0:8:bccc::1]:8333 +[2001:41d0:8:bd45::1]:8333 +[2001:41d0:8:c67c::]:8333 +[2001:41d0:8:de3d::1]:8333 +[2001:41d0:8:e257::1]:8333 +[2001:41d0:8:e3e4::1]:8333 +[2001:41d0:a:14cc::1]:8333 +[2001:41d0:a:15b2::1]:8333 +[2001:41d0:a:1ac9::1]:8333 +[2001:41d0:a:2496::1]:8333 +[2001:41d0:a:308c::]:8333 +[2001:41d0:a:5879::]:8333 +[2001:41d0:a:6810::1]:8333 +[2001:41d0:a:682d::1]:8333 [2001:41d0:a:6c29::1]:8333 -[2001:41d0:a:f9cd::1]:8333 -[2001:41d0:d:20a4::]:8333 +[2001:41d0:a:f52a::1]:8333 +[2001:41d0:d:111c::]:8333 +[2001:41d0:e:1388::1]:8333 [2001:41d0:e:26b::1]:8333 +[2001:41d0:e:f73::1]:8333 [2001:41d0:fc8c:a200:7a24:afff:fe9d:c69b]:8333 +[2001:41f0:61:0:72f3:95ff:fe09:7521]:8333 [2001:41f0:61::7]:8333 -[2001:41f0::2]:8333 -[2001:44b8:41bd:6101:148e:4022:4950:e861]:8333 -[2001:470:1:2f9:0:1:107a:a301]:8333 -[2001:470:1f0b:ad6::2]:8333 -[2001:470:1f11:12d5::ae1:5611]:8333 +[2001:4428:200:8171:db6:2ff4:9c0e:a2da]:8333 +[2001:470:1f07:151c:baac:6fff:feb7:3ba9]:8333 +[2001:470:1f0b:ad6:a60:6eff:fec6:2323]:8333 +[2001:470:1f11:617::10f]:8333 +[2001:470:1f14:73e::2]:8333 [2001:470:1f14:7d::2]:8333 -[2001:470:27:ce::2]:8333 +[2001:470:1f15:11f8::10]:8333 +[2001:470:1f15:1b95:2c3e:8a9a:24e1:7084]:8333 +[2001:470:1f15:e9b::3ef]:8333 +[2001:470:1f1d:3a9::10]:8333 +[2001:470:25:482::2]:8333 +[2001:470:27:19f::2]:8333 +[2001:470:27:665::2]:8333 +[2001:470:28:365::4]:8333 [2001:470:41:6::2]:8333 -[2001:470:507d:0:6ab5:99ff:fe73:ac18]:8333 -[2001:470:583e::2a]:8333 -[2001:470:5f:5f::232]:8333 -[2001:470:66:119::2]:8333 -[2001:470:6c4f::cafe]:8333 -[2001:470:6f:327:913b:7fe:8545:a4f5]:8333 -[2001:470:7dda:1::1]:8333 -[2001:470:95c1::2]:8333 -[2001:470:b1d0:ffff::1000]:8333 -[2001:470:d00d:0:3664:a9ff:fe9a:5150]:8333 -[2001:470:fab7:1::1]:8333 -[2001:4800:7819:104:be76:4eff:fe05:c828]:8333 -[2001:4800:7819:104:be76:4eff:fe05:c9a0]:8333 +[2001:470:727b::11:14]:8333 +[2001:470:7:2f0::2]:8333 +[2001:470:7:65::2]:8333 +[2001:470:7f85::2]:8333 +[2001:470:8:2e1:5825:39df:3e4c:54a8]:8333 +[2001:470:8:2e1::43]:8333 +[2001:470:8:2e1:ae2a:e257:4470:6350]:8333 +[2001:470:a:c13::2]: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:4802:7800:1:be76:4eff:fe20:f023]:8333 [2001:4802:7800:2:30d7:1775:ff20:1858]:8333 -[2001:4802:7800:2:be76:4eff:fe20:6c26]:8333 -[2001:4802:7802:101:be76:4eff:fe20:256]:8333 -[2001:4802:7802:103:be76:4eff:fe20:2de8]:8333 -[2001:4830:1100:2e8::2]:8333 -[2001:4b98:dc2:41:216:3eff:fe56:f659]:8333 -[2001:4ba0:fffa:5d::93]:8333 -[2001:4ba0:ffff:1be:1:1005:0:1]:8333 -[2001:4dd0:ff00:867f::3]:8333 +[2001:4ba0:babe:832::]:8333 +[2001:4ba0:cafe:379::1]:8333 +[2001:4ba0:ffee:33::10]:8333 [2001:4dd0:ff00:9a67::9]:8333 -[2001:5c0:1400:b::3cc7]:8333 [2001:610:1b19::3]:8333 [2001:610:600:a41::2]:8333 -[2001:67c:26b4::]:8333 -[2001:8d8:840:500::39:1ae]:8333 -[2001:8d8:965:4a00::10:9343]:8333 -[2001:980:4650:1:2e0:53ff:fe13:2449]:8333 +[2001:678:174:4021::2:8333]:8333 +[2001:67c:16dc:1201:5054:ff:fe17:4dac]:8333 +[2001:67c:2128:ffff:6062:36ff:fe30:6532]:8333 +[2001:67c:2564:331:3547:6e28:85a4:fb27]:8333 +[2001:6a0:200:368::2]:8333 +[2001:718:801:311:5054:ff:fe19:c483]:8333 +[2001:7b8:2ff:8f::2]:8333 +[2001:8d8:8a6:4400::3f:86c]:8333 +[2001:8d8:923:8400::87:ebd]:8333 +[2001:960:66d::2]:8333 [2001:981:46:1:ba27:ebff:fe5b:edee]:8333 -[2001:9c8:53e9:369a:226:2dff:fe1b:7472]:8333 -[2001:9d8:cafe:3::87]:8333 -[2001:b10:11:21:3e07:54ff:fe48:7248]:8333 -[2001:ba8:1f1:f34c::2]:8333 -[2001:bc8:2310:100::1]:8333 -[2001:bc8:3427:101:7a4f:8be:2611:6e79]:8333 -[2001:bc8:3505:200::1]:8333 -[2001:cc0:a004::30:1d]:8333 -[2001:e42:102:1209:153:121:76:171]:8333 -[2002:17ea:14eb::17ea:14eb]:8333 -[2002:2f8:2bc5::2f8:2bc5]:8333 -[2002:4047:482c::4047:482c]:8333 -[2002:45c3:8cca::45c3:8cca]:8333 -[2002:46bb:8a41:0:226:b0ff:feed:5f12]:8888 -[2002:46bb:8c3c:0:8d55:8fbb:15fa:f4e0]:8765 -[2002:4c48:a0fe::4c48:a0fe]:8333 -[2002:4d44:25c8::4d44:25c8]:8333 -[2002:505f:aaa2::505f:aaa2]:8333 -[2002:5bc1:799d::5bc1:799d]:8333 -[2002:6dec:5472::6dec:5472]:8333 -[2002:8c6d:6521:9617:12bf:48ff:fed8:1724]:8333 -[2002:ac52:94e2::ac52:94e2]:8333 -[2002:af7e:3eca::af7e:3eca]:8333 -[2002:b009:20c5::b009:20c5]:8333 -[2002:c06f:39a0::c06f:39a0]:8333 -[2002:c23a:738a::c23a:738a]:8333 -[2002:c70f:7442::c70f:7442]:8333 -[2002:cec5:be4f::cec5:be4f]:8333 -[2002:d149:9e3a::d149:9e3a]:8333 +[2001:ba8:1f1:f069::2]:8333 +[2001:bc8:225f:10e:505:6573:7573:d0a]:8333 +[2001:bc8:2706::1]: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 +[2001:bc8:3cbf::5]:8333 +[2001:bc8:4700:2300::19:807]:8333 +[2001:e42:102:1805:160:16:206:31]:8333 +[2002:12f1:3f::12f1:3f]:8333 +[2002:1e2:5349::1e2:5349]:8333 +[2002:1e2:5588::1e2:5588]:8333 +[2002:2501:cf62::2501:cf62]:8333 +[2002:268c:a135::268c:a135]:8333 +[2002:2a33:99db::2a33:99db]:8332 +[2002:2ebc:2c14::7]:8333 +[2002:2f59:2c9c::2f59:2c9c]:11885 +[2002:2f5a:3619::2f5a:3619]:8333 +[2002:2f5a:36a4::2f5a:36a4]:8333 +[2002:2f5a:429::2f5a:429]:8333 +[2002:2f5a:562a::2f5a:562a]:8333 +[2002:3a3b:216::3a3b:216]:8333 +[2002:3dfa:5d23::3dfa:5d23]:8333 +[2002:424f:a052::424f:a052]:8333 +[2002:451e:e922::451e:e922]:8333 +[2002:4540:4b30::4540:4b30]:8333 +[2002:51ab:7cc::51ab:7cc]:8333 +[2002:527:de11::527:de11]:8333 +[2002:5395:7d01::5395:7d01]:8333 +[2002:5395:7d2a::5395:7d2a]:8333 +[2002:5669:e3be::5669:e3be]:8333 +[2002:566a:5d6d::566a:5d6d]:8333 +[2002:59b9:f820::59b9:f820]:8333 +[2002:59f8:ac69::59f8:ac69]:8333 +[2002:5bd4:b65a::5bd4:b65a]:8333 +[2002:5c3f:39db::5c3f:39db]:8333 +[2002:5d33:8d03::5d33:8d03]:8333 +[2002:5d67:49bb::5d67:49bb]:8333 +[2002:5dae:5d5f::5dae:5d5f]:8333 +[2002:5dbe:8cc6::5dbe:8cc6]:8333 +[2002:5dbe:9503::5dbe:9503]:8333 +[2002:5fd3:8944::5fd3:8944]:8333 +[2002:5fd3:9467::5fd3:9467]:8333 +[2002:67f9:6a48::67f9:6a48]:8333 +[2002:67f9:6a4a::67f9:6a4a]:8333 +[2002:67f9:6a95::67f9:6a95]:8333 +[2002:6a0e:3ea8::6a0e:3ea8]:10011 +[2002:6b96:375a::6b96:375a]:8333 +[2002:6ca8:cffb::6ca8:cffb]:8333 +[2002:6caf:234::6caf:234]:8333 +[2002:6dec:58f5::6dec:58f5]:8333 +[2002:6dec:5ac7::6dec:5ac7]:8333 +[2002:7237:4a02::7237:4a02]:20033 +[2002:7237:94fd::7237:94fd]:10011 +[2002:7237:e428::7237:e428]:8333 +[2002:7237:fcf6::7237:fcf6]:20188 +[2002:76c0:96e6::76c0:96e6]:8333 +[2002:7819:7e80::7819:7e80]:7743 +[2002:781a:ea86::781a:ea86]:8333 +[2002:781a:f3c2::781a:f3c2]:14475 +[2002:784c:c2c0::784c:c2c0]:8333 +[2002:784c:ec97::784c:ec97]:8333 +[2002:792b:261a::792b:261a]:8333 +[2002:88f3:8cca::88f3:8cca]:8333 +[2002:88f3:a83c::88f3:a83c]:8333 +[2002:8ac9:516f::8ac9:516f]:8333 +[2002:8b81:6d78::8b81:6d78]:50344 +[2002:8b81:6e5c::8b81:6e5c]:38176 +[2002:8bc4:90a6::8bc4:90a6]:8333 +[2002:ac52:b854::ac52:b854]:8333 +[2002:add0:c14a::add0:c14a]:8333 +[2002:b07e:a70a::b07e:a70a]:8333 +[2002:b27c:c565:1::250]:8333 +[2002:b27c:c565::1]:8333 +[2002:b94d:80f1::b94d:80f1]:8333 +[2002:b982:e26a::b982:e26a]:8333 +[2002:bcd5:3145::bcd5:3145]:8333 +[2002:c08a:d22b::c08a:d22b]:8333 +[2002:c0c7:f8e3::c0c7:f8e3]:32771 +[2002:c1a9:fc5a::c1a9:fc5a]:8333 +[2002:c23f:8fc5::c23f:8fc5]:8333 +[2002:d395:ea6d::d395:ea6d]:8333 [2002:d917:ca5::d917:ca5]:8333 -[2400:8900::f03c:91ff:fe50:153f]:8333 -[2400:8900::f03c:91ff:fe6e:823e]:8333 -[2400:8900::f03c:91ff:fea8:1934]:8333 -[2400:8901::f03c:91ff:fe26:c4d6]:8333 +[2002:d917:e91::d917:e91]:8333 +[2002:db71:f434::db71:f434]:8333 +[2400:2651:161:1000:6847:d40f:aaa3:4848]:8333 [2400:8901::f03c:91ff:fec8:4280]:8333 -[2400:8901::f03c:91ff:fec8:660f]:8333 -[2401:1800:7800:102:be76:4eff:fe1c:559]:8333 [2401:1800:7800:102:be76:4eff:fe1c:a7d]:8333 +[2401:2500:203:10:153:120:156:83]:8333 +[2401:a400:3200:5600:14ee:f361:4bdc:1f7c]:8333 +[2403:4200:403:2::ff]:8333 [2405:aa00:2::40]:8333 -[2600:3c00::f03c:91ff:fe18:59b2]:8333 -[2600:3c00::f03c:91ff:fe26:bfb6]:8333 -[2600:3c00::f03c:91ff:fe33:88e3]:8333 -[2600:3c00::f03c:91ff:fe6e:7297]:8333 -[2600:3c00::f03c:91ff:fe84:8a6e]:8333 +[240b:10:ca20:f0:224:e8ff:fe1f:60d9]:8333 +[240b:250:1e0:2400:b9ef:8fe3:a69a:7378]:8333 +[240d:1a:302:8600:8876:a36d:12ee:f285]:8333 +[2600:3c00::f03c:91ff:fe91:3e49]:8333 +[2600:3c00::f03c:91ff:febb:981e]:8333 [2600:3c01::f03c:91ff:fe18:6adf]:8333 -[2600:3c01::f03c:91ff:fe26:c4b8]:8333 -[2600:3c01::f03c:91ff:fe3b:1f76]:8333 -[2600:3c01::f03c:91ff:fe50:5e06]:8333 -[2600:3c01::f03c:91ff:fe61:289b]:8333 [2600:3c01::f03c:91ff:fe69:89e9]:8333 -[2600:3c01::f03c:91ff:fe84:ac15]:8333 -[2600:3c01::f03c:91ff:fe98:68bb]:8333 -[2600:3c02::f03c:91ff:fe26:713]:8333 -[2600:3c02::f03c:91ff:fe26:c49e]:8333 -[2600:3c02::f03c:91ff:fe84:97d8]:8333 -[2600:3c02::f03c:91ff:fec8:8feb]:8333 +[2600:3c01::f03c:91ff:fe91:6a29]:8333 +[2600:3c01::f03c:91ff:fef1:1eaa]:8333 [2600:3c03::f03c:91ff:fe18:da80]:8333 -[2600:3c03::f03c:91ff:fe26:c49b]:8333 -[2600:3c03::f03c:91ff:fe50:5fa7]:8333 +[2600:3c03::f03c:91ff:fe28:1445]:8333 [2600:3c03::f03c:91ff:fe67:d2e]:8333 -[2600:3c03::f03c:91ff:fe6e:1803]:8333 -[2600:3c03::f03c:91ff:fec8:4bbe]:8333 -[2600:3c03::f03c:91ff:fee4:4e16]:8333 -[2601:18d:8300:58a6::2e4]:8333 -[2601:240:4600:40c0:250:56ff:fea4:6305]:8333 -[2601:581:c200:a719:542c:9cd5:4852:f7d9]:8333 -[2601:647:4900:85f1:ca2a:14ff:fe51:bb35]:8333 -[2601:c2:c002:b300:54a0:15b5:19f7:530d]:8333 -[2602:306:ccff:ad7f:b116:52be:64ba:db3a]:8333 -[2602:ae:1982:9400:846:f78c:fec:4d57]:8333 +[2600:3c03::f03c:91ff:fe89:116f]:8333 +[2600:3c03::f03c:91ff:feb0:5fc4]:8333 +[2600:3c03::f03c:91ff:fee0:233e]:8333 +[2600:3c03::f03c:91ff:fee0:51]:8333 +[2600:8805:2400:14e:226:4aff:fe02:2ba4]:8333 +[2600:8807:5080:3301:1487:83b7:33d7:eb97]:8333 +[2601:186:c100:6bcd:16bd:cea1:235d:1c19]:8333 +[2601:18c:4200:28d0:e4d:e9ff:fec5:76d0]:8333 +[2601:247:8201:6251:30e6:7b95:69bf:9248]:8333 +[2601:602:9980:f78:211:11ff:fec5:1ae]:8333 +[2602:ae:1993:de00:2c50:9a44:8f11:77a5]:8333 +[2602:ff68:0:1:21e:bff:feca:db72]:8333 +[2602:ff68:0:1:2bd:27ff:feb0:adf8]:8333 +[2602:ff68:0:1::5]:8333 +[2602:ff68:0:5:2bd:27ff:feb0:adf8]:8333 [2602:ffc5:1f::1f:2d61]:8333 [2602:ffc5:1f::1f:9211]:8333 -[2602:ffc5::75d5:c1c3]:8333 +[2602:ffc5::9e63:27a2]:8333 +[2602:ffc5::c30:1c75]:8333 [2602:ffc5::ffc5:b844]:8333 [2602:ffe8:100:2::457:936b]:8333 -[2602:ffe8:100:2::9d20:2e3c]:8333 -[2602:ffea:1001:72b::578b]:8333 -[2602:ffea:a::24c4:d9fd]:8333 -[2604:0:c1:100:1ec1:deff:fe54:2235]:8333 -[2604:180:1:1af::42a9]:8333 -[2604:180:3:702::c9de]:8333 -[2604:4080:1114:0:3285:a9ff:fe93:850c]:8333 -[2604:6000:ffc0:3c:64a3:94d0:4f1d:1da8]:8333 -[2605:6000:f380:9a01:ba09:8aff:fed4:3511]:8333 -[2605:6001:e00f:7b00:c587:6d91:6eff:eeba]:8333 -[2605:f700:c0:1::25c3:2a3e]:8333 -[2606:6000:a441:9903:5054:ff:fe78:66ff]:8333 -[2607:5300:100:200::1c83]:9334 -[2607:5300:10::a1]:8333 -[2607:5300:60:1c2f::1]:8333 -[2607:5300:60:2b90::1]:8333 -[2607:5300:60:3320::1]:8333 -[2607:5300:60:385::1]:8333 -[2607:5300:60:4a85::]:8333 -[2607:5300:60:65e4::]:8333 -[2607:5300:60:6918::]:8333 -[2607:5300:60:711a:78::a7b5]:8333 -[2607:5300:60:714::1]:8333 -[2607:5300:60:870::1]:8333 -[2607:5300:60:952e:3733::1414]:8333 -[2607:f1c0:848:1000::48:943c]:8333 -[2607:f2e0:f:5df::2]:8333 -[2607:f748:1200:f8:21e:67ff:fe99:8f07]:8333 -[2607:f948:0:1::7]:8333 -[2607:ff68:100:36::131]:8333 -[2803:6900:1::117]:8333 -[2a00:1098:0:80:1000:25:0:1]:8333 -[2a00:1178:2:43:5054:ff:fe84:f86f]:8333 -[2a00:1178:2:43:5054:ff:fee7:2eb6]:8333 -[2a00:1178:2:43:8983:cc27:d72:d97a]:8333 -[2a00:1328:e100:cc42:230:48ff:fe92:55c]:8333 +[2604:180:2:eee::ca46]:8333 +[2604:880:d:85::be37]:8333 +[2604:9a00:2100:a009:2::]:8333 +[2604:a880:2:d0::301:8001]:8333 +[2604:a880:2:d0::4a9:1001]:8333 +[2604:a880:2:d0::53a:c001]:8333 +[2604:a880:400:d0::ad7:e001]:8333 +[2604:a880:400:d0::dcf:f001]:8333 +[2605:4d00::50]:8333 +[2605:6000:edc8:300::ddfe]:8333 +[2605:6000:ffc0:70:74d5:225c:f553:5bb8]:8333 +[2606:6000:c148:7003:5054:ff:fe78:66ff]:8333 +[2606:6000:e6d6:d701:d428:5e44:a2c9:3ff6]:8333 +[2606:c680:1:4a:2016:d1ff:fe93:52a7]:8333 +[2607:5300:203:118:3733::1414]:8333 +[2607:5300:60:13bb::1]:8333 +[2607:5300:60:1966::1]:8333 +[2607:5300:60:2218::]:8333 +[2607:5300:60:3775::]:8333 +[2607:5300:60:3ddf::]:8333 +[2607:5300:60:a654::]:8333 +[2607:5300:60:a7a3::]:8333 +[2607:5300:60:ac0::1]:8333 +[2607:5300:60:cf97::]:8333 +[2607:f0d0:1901:19::6]:8333 +[2607:f128:40:1202:69:162:139:125]:8333 +[2607:f128:40:1703::2]:8333 +[2607:f178:0:8::106]:8333 +[2607:f1c0:84d:8900::7e:cad]:8333 +[2607:f948:0:1::1:40]:8333 +[2607:fcd0:100:2302::6094:635a]:8333 +[2607:fcd0:100:6a00::3a96:1]:8333 +[2607:fcd0:100:6a02::7ff0:1]:8333 +[2607:fcd0:100:8203::8c58:dbc]:8333 +[2607:fea8:1360:9c2:221a:6ff:fe47:776d]:8333 +[2607:fea8:4da0:9ce:5114:a8ec:20f5:a50b]:8333 +[2607:fea8:5df:fda0:feaa:14ff:feda:c79a]:8333 +[2607:fea8:84c0:163:f42c:baff:fecc:6bbf]:8333 +[2607:ff10:c5:502:225:90ff:fe32:d446]:8333 +[2607:ff48:aa81:800::96cf:1]:8333 +[2620:11c:5001:1118:d267:e5ff:fee9:e673]:8333 +[2620:b8:4000:1000::93:1]:8333 +[2800:1a0::9]:8333 +[2a00:1178:2:43:19fd:d43e:b77:edeb]:8333 +[2a00:1178:2:43:b4e3:e562:f811:d761]:8333 [2a00:14f0:e000:80d2:cd1a::1]:8333 +[2a00:1630:14::101]:8333 [2a00:1630:2:1802:188:122:91:11]:8333 -[2a00:18e0:0:1800::1]:8333 -[2a00:18e0:0:dcc5:109:234:106:191]:8333 -[2a00:1a28:1157:87::94c7]:8333 +[2a00:1630:2:500::4]:8333 +[2a00:1768:2001:24::148:218]:8333 +[2a00:1768:2001:27::142:21]:8333 +[2a00:1a48:7810:101:be76:4eff:fe08:c774]:8333 [2a00:1ca8:37::a5fc:40d1]:8333 [2a00:1ca8:37::ab6d:ce2c]:8333 -[2a00:7143:100:0:216:3eff:fe2e:74a3]:8333 -[2a00:7143:100:0:216:3eff:fed3:5c21]:8333 -[2a00:7c80:0:45::123]:8333 +[2a00:1dc0:2255:10::2]:8333 +[2a00:7c80:0:71::8]:8333 +[2a00:7c80:0:97::7]:8333 +[2a00:bbe0:0:42:222:64ff:fe9a:e206]:8333 +[2a00:c98:2050:a020:3::110]:8333 +[2a00:dcc0:eda:98:183:193:1d24:b53a]:8333 [2a00:dcc0:eda:98:183:193:c382:6bdb]:8333 [2a00:dcc0:eda:98:183:193:f72e:d943]:8333 -[2a00:f820:17::4af:1]:8333 -[2a00:f940:2:1:2::101d]:8333 -[2a00:f940:2:1:2::6ac]:8333 -[2a01:1b0:7999:402::131]:8333 -[2a01:238:42dd:f900:7a6c:2bc6:4041:c43]:8333 -[2a01:238:4313:6300:2189:1c97:696b:5ea]:8333 -[2a01:488:66:1000:5c33:91f9:0:1]:8333 -[2a01:488:66:1000:b01c:178d:0:1]:8333 +[2a00:f90:ff0:c100:53c4:97a7:8b59:796a]:8333 +[2a01:238:435c:de00:b110:38cf:192d:b2c]:28333 +[2a01:348:6:7cf::2]:8333 +[2a01:368:e012:8888:216:3eff:fe24:1162]:8333 +[2a01:488:66:1000:53a9:22b:0:1]:8333 +[2a01:488:67:1000:523:ffa7:0:1]:8333 +[2a01:488:67:1000:b01c:3379:0:1]:8333 [2a01:4f8:100:34ce::2]:8333 -[2a01:4f8:100:34e4::2]:8333 [2a01:4f8:100:44e7::2]:8333 -[2a01:4f8:100:510e::2]:8333 -[2a01:4f8:100:5128::2]:8333 -[2a01:4f8:110:5105::2]:8333 -[2a01:4f8:110:516c::2]:8333 +[2a01:4f8:10a:2e4::2]:8333 +[2a01:4f8:10a:34e::2]:8333 +[2a01:4f8:10a:51d::2]:8333 +[2a01:4f8:10a:622::2]:8333 +[2a01:4f8:10a:85f::2]:8333 +[2a01:4f8:10a:864::2]:8333 +[2a01:4f8:10a:d04::2]:8333 +[2a01:4f8:110:334c::2]:8333 +[2a01:4f8:110:536e::2]:8333 [2a01:4f8:120:43e4::2]:8333 -[2a01:4f8:120:62e6::2]:8333 [2a01:4f8:120:702e::2]:8333 -[2a01:4f8:120:8203::2]:8333 -[2a01:4f8:121:234d::2]:8333 -[2a01:4f8:121:261::2]:8333 -[2a01:4f8:130:11ea::2]:8333 +[2a01:4f8:121:4346::2]:8333 [2a01:4f8:130:3332::2]:8333 -[2a01:4f8:130:40ab::2]:8333 -[2a01:4f8:130:632c::2]:8333 -[2a01:4f8:130:6366::2]:8333 -[2a01:4f8:130:934f::2]:8333 +[2a01:4f8:131:33ad::2]:8333 [2a01:4f8:131:33ad:fea1::666]:8333 -[2a01:4f8:140:2195::2]:8333 -[2a01:4f8:140:6333::2]:8333 -[2a01:4f8:140:930d::2]:8333 +[2a01:4f8:140:31b0::2]:8333 +[2a01:4f8:140:4088::2]:8333 +[2a01:4f8:140:931a::2]:8333 [2a01:4f8:140:93b0::2]:8333 -[2a01:4f8:141:1167::2]:8333 +[2a01:4f8:141:13ad::c451]:8333 [2a01:4f8:141:186::2]:8333 -[2a01:4f8:141:53f0::2]:8333 -[2a01:4f8:150:336a::2]:8333 -[2a01:4f8:150:72ee::4202]:8333 -[2a01:4f8:150:8324::2]:9001 -[2a01:4f8:151:21ca::2]:8333 -[2a01:4f8:151:41c2:0:5404:a67e:f250]:8333 -[2a01:4f8:151:5128::2]:8333 +[2a01:4f8:141:22ae::2]:8333 +[2a01:4f8:141:322c::2]:8333 +[2a01:4f8:150:11d4::2]:8333 +[2a01:4f8:150:440f::2]:8333 +[2a01:4f8:150:61ee::2]:8333 +[2a01:4f8:150:726b::2]:8333 +[2a01:4f8:151:30c9::2]:15000 +[2a01:4f8:151:41a2::2]:8333 +[2a01:4f8:151:41cc::2]:8333 [2a01:4f8:151:52c6::154]:8333 -[2a01:4f8:151:6347::2]:9001 -[2a01:4f8:160:5136::2]:8333 -[2a01:4f8:160:72c5::2858:e1c5]:8333 -[2a01:4f8:160:72c5::593b:60d5]:8333 +[2a01:4f8:151:600b::1:1]:8333 +[2a01:4f8:151:7175::2]:8333 +[2a01:4f8:160:41f0::1:33]:8333 +[2a01:4f8:160:5328::27f0:187a]:8333 [2a01:4f8:160:814f::2]:8333 -[2a01:4f8:161:13d0::2]:8333 -[2a01:4f8:161:228f::2]:8333 -[2a01:4f8:161:51c4::2]:8333 -[2a01:4f8:161:60a7::2]:8333 +[2a01:4f8:161:21ad::333:30]:8333 [2a01:4f8:161:7026::2]:8333 -[2a01:4f8:161:9184::2]:8333 -[2a01:4f8:162:2108::2]:8333 -[2a01:4f8:162:218c::2]:8333 -[2a01:4f8:162:4443::2]:8333 -[2a01:4f8:162:51a3::2]:8333 +[2a01:4f8:162:4110::2]:8333 +[2a01:4f8:162:4348::2]:8333 +[2a01:4f8:171:1c1b::2]:8333 +[2a01:4f8:171:1c3::2]:8333 +[2a01:4f8:171:2258::2]:8333 +[2a01:4f8:171:2a70::2]:8333 +[2a01:4f8:171:2e1b::2]:8333 +[2a01:4f8:171:2f28::2]:8333 +[2a01:4f8:171:3248::2]:8333 +[2a01:4f8:171:380c::2]:8333 [2a01:4f8:171:b93::2]:8333 -[2a01:4f8:190:1483::1]:8333 -[2a01:4f8:190:4495::2]:8333 -[2a01:4f8:190:64c9::2]:8333 +[2a01:4f8:171:d0a::2]:8333 +[2a01:4f8:172:116c::2]:8333 +[2a01:4f8:172:1287::2]:8333 +[2a01:4f8:172:17a9::2]:8333 +[2a01:4f8:172:1ca7::2]:8333 +[2a01:4f8:172:2159::2]:8333 +[2a01:4f8:172:3a41::2]:8333 +[2a01:4f8:172:3b42::2]:8333 +[2a01:4f8:172:3ec1::2]:8333 +[2a01:4f8:172:3ec2::2]:8333 +[2a01:4f8:172:aeb::2]:8333 +[2a01:4f8:172:aec::2]:8333 +[2a01:4f8:173:10ab::2]:8333 +[2a01:4f8:173:1551::2]:8333 +[2a01:4f8:173:1bca::2]:8333 +[2a01:4f8:173:1e2e::2]:8333 +[2a01:4f8:173:2162::2]:8333 +[2a01:4f8:173:21e6::2]:8333 +[2a01:4f8:173:42::2]:8333 +[2a01:4f8:173:cc1::2]:8333 +[2a01:4f8:190:1253::2]:8333 +[2a01:4f8:190:24eb::2]:8333 +[2a01:4f8:190:34f0::2]:8333 +[2a01:4f8:190:528d::2]:8333 [2a01:4f8:190:91ce::2]:8333 [2a01:4f8:191:2194::83]:8333 [2a01:4f8:191:40e8::2]:8333 -[2a01:4f8:191:44b4::2]:8333 -[2a01:4f8:191:8242::2]:8333 -[2a01:4f8:191:83a2::2]:8333 -[2a01:4f8:192:11b2::2]:8333 +[2a01:4f8:191:8165::2]:22556 +[2a01:4f8:191:81b7::2]:8333 +[2a01:4f8:191:8328::3]:8333 +[2a01:4f8:192:11b2::2]:8343 [2a01:4f8:192:216c::2]:8333 -[2a01:4f8:192:22b3::2]:8333 +[2a01:4f8:192:22af::2]:8333 +[2a01:4f8:192:2422::2]:8333 +[2a01:4f8:192:34d0::2]:8333 [2a01:4f8:192:440b::2]:8333 +[2a01:4f8:192:5230::2]:8333 [2a01:4f8:192:db::2]:8333 [2a01:4f8:200:1012::2]:8333 -[2a01:4f8:200:23d1::dead:beef]:8333 -[2a01:4f8:200:506d::2]:8333 -[2a01:4f8:200:51f0::2]:8333 -[2a01:4f8:200:5389::2]:8333 -[2a01:4f8:200:53e3::2]:8333 -[2a01:4f8:200:6344::2]:8333 -[2a01:4f8:200:6396::2]:8333 -[2a01:4f8:200:63af::119]:8333 -[2a01:4f8:200:71e3:78b4:f3ff:fead:e8cf]:8333 -[2a01:4f8:201:214c::2]:8333 -[2a01:4f8:201:233:1::3]:8333 -[2a01:4f8:201:3e3::2]:8333 +[2a01:4f8:200:414e::2]:8333 +[2a01:4f8:200:416a::2]:8333 +[2a01:4f8:201:21a7::2]:8333 +[2a01:4f8:201:4017::11]:8333 [2a01:4f8:201:6011::4]:8333 [2a01:4f8:201:60d5::2]:8333 -[2a01:4f8:202:265::2]:8333 -[2a01:4f8:202:3115::2]:8333 +[2a01:4f8:202:12d6::2]:8333 [2a01:4f8:202:31e3::2]:8333 -[2a01:4f8:202:31ef::2]:8333 -[2a01:4f8:202:3392::2]:8333 +[2a01:4f8:202:32c6::2]:8333 [2a01:4f8:202:53c3::2]:8333 -[2a01:4f8:202:63f4::2]:8333 -[2a01:4f8:202:7227::2]:8333 -[2a01:4f8:210:2227::2]:8333 -[2a01:4f8:210:24aa::2]:8333 [2a01:4f8:211:14cf::2]:8333 -[2a01:4f8:211:181b::2]:8333 -[2a01:4f8:212:289e::2]:8333 -[2a01:4f8:212:33db::2]:18333 -[2a01:4f8:a0:112f::2]:8333 -[2a01:4f8:a0:3174::2]:8333 -[2a01:4f8:a0:328c::2]:8333 -[2a01:4f8:a0:5243::2]:8333 -[2a01:4f8:c17:19b9::2]:8333 -[2a01:4f8:c17:1a41::2]:8333 -[2a01:4f8:c17:1a92::2]:8333 -[2a01:4f8:c17:273::2]:8333 -[2a01:4f8:c17:435::2]:8333 -[2a01:4f8:c17:755::2]:8333 -[2a01:4f8:c17:b54::2]:8333 -[2a01:4f8:d16:9384::2]:8333 +[2a01:4f8:211:1ec5::2]:8333 +[2a01:4f8:211:483::2]:8333 +[2a01:4f8:211:d99::8]:8333 +[2a01:4f8:212:1826::2]:8333 +[2a01:4f8:212:27a8::2]:8333 +[2a01:4f8:221:801::2]:8333 +[2a01:4f8:a0:12cc::2]:8333 +[2a01:4f8:a0:746a:101:1:1:2]:8333 +[2a01:4f8:a0:828a::2]:8333 +[2a01:4f8:c17:2eef::2]:8333 +[2a01:4f8:c17:2f3c::2]:3333 +[2a01:4f8:c17:3b02::2]:8333 +[2a01:4f8:c17:4245::2]:8333 +[2a01:4f8:c17:464f::2]:8333 +[2a01:4f8:c17:4a1c::2]:8333 +[2a01:4f8:c17:4c5d::2]:8333 +[2a01:4f8:c17:67f8::2]:8333 +[2a01:4f8:c17:6dd0::2]:8333 +[2a01:4f8:c17:710b::2]:8333 +[2a01:4f8:c17:714::2]:8333 +[2a01:4f8:c17:72c6::2]:8333 [2a01:608:ffff:a009:8bf5:879d:e51a:f837]:8333 -[2a01:680:10:10:f2de:f1ff:fec9:dc0]:8333 -[2a01:7c8:aaac:1f6:5054:ff:fe30:e585]:8333 -[2a01:7c8:aaac:20b:5054:ff:fe24:435e]:8333 +[2a01:680:10:10::1]:8333 +[2a01:6f0:ffff:120::8dcb]:8333 +[2a01:79c:cebc:857c:98c1:88ff:fef5:90de]:8333 +[2a01:79d:7377:2629:7e57:7e57:1:1]:8333 [2a01:7c8:aaac:43d:5054:ff:fe4e:3dd4]:8333 -[2a01:7c8:aaad:256::1]:8333 -[2a01:7c8:aab6:ea:5054:ff:feff:eac3]:8333 -[2a01:7c8:aab9:5a:5054:ff:fe89:7b26]:8333 -[2a01:7c8:aabc:2c8:5054:ff:fe35:6581]:8333 -[2a01:7e00::f03c:91ff:fe18:301e]:8333 -[2a01:7e00::f03c:91ff:fe18:3942]:8333 +[2a01:7c8:aab5:3e6:5054:ff:fed7:4e54]:8333 +[2a01:7c8:aabd:3d5:5054:ff:fe95:f586]:8333 +[2a01:7c8:aac1:453:d0d2:af96:fa88:5d0e]:8333 +[2a01:7c8:aac3:663:5054:ff:fe25:8c69]:8333 +[2a01:7c8:aac3:97:5054:ff:fea7:3780]:8333 +[2a01:7c8:aac4:567:5054:ff:fedc:518a]:8333 [2a01:7e00::f03c:91ff:fe26:8c87]:8333 -[2a01:7e00::f03c:91ff:fe50:6206]:8333 -[2a01:7e00::f03c:91ff:fe67:559d]:8333 -[2a01:7e00::f03c:91ff:fe84:434f]:8333 +[2a01:7e00::f03c:91ff:fe50:94b8]:8333 +[2a01:7e00::f03c:91ff:fe55:2c]:8333 [2a01:7e00::f03c:91ff:fe89:1143]:8333 -[2a01:7e00::f03c:91ff:fe98:2505]:8333 -[2a01:7e00::f03c:91ff:fedb:352e]:8333 -[2a01:7e01::f03c:91ff:fec8:d7b5]:8333 -[2a01:e34:ee33:1640:c504:f677:b28a:ba42]:8333 -[2a01:e35:2e7e:bc0:e079:f55e:cef3:b5d7]:8333 +[2a01:7e00::f03c:91ff:fe89:53fd]:8333 +[2a01:7e00::f03c:91ff:fedf:b70f]:8333 +[2a01:b000::4166:515b:ef9e:b3]:8333 +[2a01:b2e0:2::40]:8333 +[2a01:e34:ec29:24c0:f3:ddaf:9f59:586f]:8333 +[2a01:e34:eed7:6670:ec1b:bf7c:b012:6069]:8333 [2a01:e35:2ee5:610:21f:d0ff:fe4e:7460]:8333 [2a01:e35:8a3f:47c0:c617:feff:fe3c:9fbd]:8333 -[2a01:e35:8aca:6a0:211:aff:fe5e:295e]:8333 -[2a02:180:a:18:81:7:11:50]:8333 -[2a02:1810:1d87:6a00:5604:a6ff:fe60:d87d]:8333 -[2a02:2168:1144:5c01:d63d:7eff:fedd:4f8e]:8333 -[2a02:2498:6d7b:7001:b508:b39d:2cea:5b7a]:8333 -[2a02:2528:503:2::15]:8333 -[2a02:2528:fa:1a56:216:44ff:fe6a:d112]:8333 -[2a02:27f8:2012:0:e9f7:268f:c441:6129]:8333 +[2a01:e35:8bff:70b0:1e1b:dff:fe0b:236d]:8333 +[2a02:1205:34c3:a4e0:d63d:7eff:fe98:10c8]:8333 +[2a02:1205:34da:aa00:5882:249d:ddbf:bc43]:8333 +[2a02:1205:5051:a640:d6ae:52ff:fea3:ac]:8333 +[2a02:1205:c689:d980:baae:edff:feea:9445]:8333 +[2a02:120b:2c2a:5ec0:10dd:31ff:fe42:5079]:8333 +[2a02:120b:2c35:69d0:219:99ff:fe6b:4ec3]:8333 +[2a02:120b:c3c2:ff60:21f:5bff:fec3:a7ad]:24312 +[2a02:13b8:4000:1000:216:e6ff:fe92:8619]:8333 +[2a02:13b8:4000:1000::27]:8333 +[2a02:17d0:2a:4400:40f:3dd4:b053:47ad]:8333 +[2a02:180:1:1::517:afb]:8333 +[2a02:180:6:1::18]:8333 +[2a02:1810:1d11:f900:6872:f28e:8126:f635]:8333 +[2a02:27a8:0:1:52e5:49ff:fee3:3b49]:8333 [2a02:348:86:3011::1]:8333 -[2a02:4780:1:1::1:8a01]:8333 -[2a02:578:5002:116::2]:8333 +[2a02:390:9000:0:218:7dff:fe10:be33]:8333 +[2a02:582:78c1:7600:2d49:6212:29d3:abb]:8333 [2a02:6080::1:190b:69e3]:8333 -[2a02:6080::1:e893:d9d6]:8333 -[2a02:770:4000::139]:8333 +[2a02:750:7:3305::575]:8333 +[2a02:752:100:3::53]:8333 +[2a02:7aa0:1201::7501:d950]:8333 [2a02:7aa0:1201::deb3:81a2]:8333 -[2a02:8010:b001::5860:59b5]:8333 -[2a02:810d:21c0:f00:a248:1cff:feb8:5348]:8333 -[2a02:a50::21b:24ff:fe93:4e39]:8333 -[2a02:a80:0:1200::2]:8333 -[2a02:c200:0:10:2:1:5830:1]:8333 -[2a02:c200:0:10:2:5:4692:1]:8333 -[2a02:c200:0:10:3:0:7158:1]:8333 -[2a02:c200:0:10::2244:1]:8333 -[2a02:c200:1:10:2:3:3339:1]:8333 -[2a02:c200:1:10:2:3:7844:1]:8333 -[2a02:c200:1:10:2:5:6288:1]:8333 -[2a02:c200:1:10:3:0:5912:1]:8333 +[2a02:7aa0:1619::a037:69a6]:8333 +[2a02:810d:14c0:8694:d250:99ff:fe81:23d9]:8333 +[2a02:a50::dacb:8aff:fe36:8d2d]:8333 +[2a02:c200:0:10:3:0:2591:1]:8333 +[2a02:c200:1:10:2:5:9982:1]:8333 +[2a02:c200:1:10:3:0:9290:1]:8333 +[2a02:c205:3000:7158::1]:8333 +[2a02:c205:3001:4522::1]:8333 +[2a02:c205:3001:6549::1]:8333 +[2a02:c207:2008:3772::1]:8333 +[2a02:c207:2008:6519::1]:8333 +[2a02:c207:2009:213::1]:8333 +[2a02:c207:2009:7858::1]:8333 +[2a02:c207:2010:302::1]:8333 +[2a02:c207:3001:5824::1]:8333 +[2a02:ce80:0:20::1]:8333 [2a03:4000:2:496::8]:8333 +[2a03:4000:6:416c::53]:8333 [2a03:4000:6:8009::1]:8333 -[2a03:4000:6:8063::bcd0]:8333 -[2a03:4900:fffc:b::2]:8333 -[2a03:b0c0:1:d0::d:5001]:8333 +[2a03:4000:9:8e::1]:8333 +[2a03:7380:2140:17:51fe:3519:b571:4a13]:8333 +[2a03:b0c0:0:1010::7a3:1001]:8333 +[2a03:b0c0:0:1010::7aa:4001]: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::2208:6001]:8333 +[2a03:b0c0:3:d0::23f7:1001]:8333 +[2a03:b0c0:3:d0::23f7:9001]: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:7001]:8333 +[2a03:b0c0:3:d0::2400:1]:8333 +[2a03:b0c0:3:d0::2400:3001]:8333 +[2a03:b0c0:3:d0::2400:e001]:8333 +[2a03:b0c0:3:d0::2401:e001]: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::2403:1001]:8333 +[2a03:b0c0:3:d0::2403:2001]: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:f001]:8333 +[2a03:b0c0:3:d0::2404:6001]:8333 +[2a03:b0c0:3:d0::2404:b001]:8333 [2a03:f80:ed15:149:154:155:235:1]:8333 -[2a03:f80:ed15:149:154:155:241:1]:8333 -[2a03:f80:ed16:ca7:ea75:b12d:2af:9e2a]:8333 -[2a04:1980:3100:1aab:290:faff:fe70:a3d8]:8333 -[2a04:1980:3100:1aab:e61d:2dff:fe29:f590]:8333 -[2a04:2f80:6:200::89]:8333 -[2a04:ac00:1:4a0b:5054:ff:fe00:5af5]:8333 -[2a04:ad80:0:68::35da]:8333 -3ffk7iumtx3cegbi.onion:8333 +[2a04:1980:3100:1aac:e61d:2dff:fe29:f241]:8333 +[2a04:1980:3100:1aac:e61d:2dff:fe29:f251]:8333 +[2a04:2180:0:1::5a49:3c06]:8333 +[2a04:2180:1:7::3]:8333 +[2a04:2e00:5:2e:9a4b:e1ff:fe62:6dc0]:8333 +[2a04:3542:1000:910:8492:b8ff:fe91:711d]:8333 +[2a04:dbc3:fffe:0:e61f:13ff:fe95:8401]:8333 +[2a06:9fc0:2a06:9fc0:2a06:9fc1:67c:e706]:8333 +[2c0f:f738:2004:82::]:8333 +2hryb3uh3tzwgnya.onion:8333 3nmbbakinewlgdln.onion:8333 -4j77gihpokxu2kj4.onion:8333 -546esc6botbjfbxb.onion:8333 -5at7sq5nm76xijkd.onion:8333 -77mx2jsxaoyesz2p.onion:8333 -7g7j54btiaxhtsiy.onion:8333 -a6obdgzn67l7exu3.onion:8333 -ab64h7olpl7qpxci.onion:8333 -am2a4rahltfuxz6l.onion:8333 -azuxls4ihrr2mep7.onion:8333 -bitcoin7bi4op7wb.onion:8333 -bitcoinostk4e4re.onion:8333 +3qeri3tmhzmpegyv.onion:8333 +4wdknmecghcmclq5.onion:8333 +53tsjt6zq3iasv5q.onion:8333 +5cg7qeywvwo6vxpt.onion:8333 +5gbcrgqxcbxj253s.onion:8333 +6cn4ilbwkrkh7gwo.onion:8333 +6e4jrnn7igeqxmlf.onion:8333 +6ymgbvnn6d5nfmv4.onion:8333 +6zsh3bfduhpo7ldl.onion:8333 +72fq6phv4fg4rhvh.onion:8333 +7gdqp6npusk4lfwk.onion:8333 +a7emxol55e623lqc.onion:8333 +assbiydziq77zaki.onion:8333 +bafk5ioatlgt7dgl.onion:8333 bk7yp6epnmcllq72.onion:8333 -bmutjfrj5btseddb.onion:8333 -ceeji4qpfs3ms3zc.onion:8333 -clexmzqio7yhdao4.onion:8333 +brwqezn6le54w2bb.onion:8333 +bs4bq6s6qkvt5hpi.onion:8333 +bup5n5e3kurvjzf3.onion:8333 +c2tpqkaz4ihjzwgb.onion:8333 +cernrmrk5zomzozn.onion:8333 +cfyegj64ht3jpodr.onion:8333 +cg5vg54cazzpvoug.onion:8333 +cgk4u2lxrvml4jvb.onion:8333 +cjygd7pu5lqkky5j.onion:8333 +d6wubsdtr46dd5ki.onion:8333 +dfq6yjc3aelplwr4.onion:8333 +dqpxwlpnv3z3hznl.onion:8333 +eamfospuveabaimd.onion:8333 +ep2mjzox3kvb6ax4.onion:8333 +fpbxb4wjudiw2w5a.onion:8333 +fu5hfsbbf5jwsvhv.onion:8333 +g4freoibsczujle3.onion:8333 gb5ypqt63du3wfhn.onion:8333 -h2vlpudzphzqxutd.onion:8333 -n42h7r6oumcfsbrs.onion:4176 -ncwk3lutemffcpc4.onion:8333 +ggdy2pb2avlbtjwq.onion:8333 +gh2aiddzxmvyrnue.onion:8333 +gnxgylbgzvaazkq7.onion:8333 +hnizdxnejel64ubk.onion:8333 +htvdcmlc3abji2ab.onion:8443 +hwuboois4gslupgx.onion:8333 +hxz6gowludlj6d5a.onion:8333 +j6umo4bnsztpsonc.onion:8333 +jdunmaocwbbnw565.onion:8333 +ktv3qlxl7xvmdlf4.onion:8333 +kvd44sw7skb5folw.onion:8333 +kwimnzm6vd4zakvl.onion:8333 +la5xhk3lprxzxmz2.onion:8333 +lc7cx67end26uutp.onion:8352 +mwu5og2agcspmgkx.onion:8333 +mzxkipiyekaoh7my.onion:8333 +n6rwlrtwpqc7qwo7.onion:8333 +nj36424yccqph62z.onion:8333 +o256w7t3vcgktmxk.onion:8333 +o4sl5na6jeqgi3l6.onion:8333 okdzjarwekbshnof.onion:8333 -pjghcivzkoersesd.onion:8333 -rw7ocjltix26mefn.onion:8333 -uws7itep7o3yinxo.onion:8333 -vk3qjdehyy4dwcxw.onion:8333 +oyebydl2pacx6v26.onion:8333 +p5mx2imj75dpmime.onion:8333 +psco6bxjewljrczx.onion:8333 +pxtgswet6tlgrbwj.onion:8333 +rb4v3fhgx2zr4rre.onion:8333 +rjlnp3hwvrsmap6e.onion:8333 +rlafimkctvz63llg.onion:8333 +rxjvy5eyttep5tts.onion:8333 +seoskudzk6vn6mqz.onion:8333 +tpgdufxxsw3jkrdf.onion:8333 +tuiyvqgi3o675pjb.onion:8333 +tx4zd7d5exonnblh.onion:8333 +uokg6avfgbhofls3.onion:8333 +v3gjphgqy5hygcml.onion:8333 +vhdoxqq63xr53ol7.onion:8333 +visevrizz3quyagj.onion:8333 vqpye2k5rcqvj5mq.onion:8333 -wpi7rpvhnndl52ee.onion:8333 +wfsx2gi7djhy22hk.onion:8333 +wg6vwmbrzyyzapun.onion:8333 +xub4w3w4wwk56xiq.onion:8333 +ycivnom44dmxx4ob.onion:8333 +ywskufc62bf2fum4.onion:8333 +z4fax2vxg23t2ddf.onion:8333 +zo5dklwelmdrpo5n.onion:8333 diff --git a/contrib/testgen/base58.py b/contrib/testgen/base58.py index bb0aeaff05..0d09692b36 100644 --- a/contrib/testgen/base58.py +++ b/contrib/testgen/base58.py @@ -84,7 +84,6 @@ def b58decode_chk(v): result = b58decode(v) if result is None: return None - h3 = checksum(result[:-4]) if result[-4:] == checksum(result[:-4]): return result[:-4] else: diff --git a/contrib/testgen/gen_base58_test_vectors.py b/contrib/testgen/gen_base58_test_vectors.py index 7e475b7a36..ac0701e6be 100755 --- a/contrib/testgen/gen_base58_test_vectors.py +++ b/contrib/testgen/gen_base58_test_vectors.py @@ -45,7 +45,6 @@ def is_valid(v): result = b58decode_chk(v) if result is None: return False - valid = False for template in templates: prefix = str(bytearray(template[0])) suffix = str(bytearray(template[2])) diff --git a/contrib/verify-commits/allow-revsig-commits b/contrib/verify-commits/allow-revsig-commits index e69de29bb2..f0088cdca4 100644 --- a/contrib/verify-commits/allow-revsig-commits +++ b/contrib/verify-commits/allow-revsig-commits @@ -0,0 +1,104 @@ +a06ede9a138d0fb86b0de17c42b936d9fe6e2158 +923dc447eaa8e017985b2afbbb12dd1283fbea0e +71148b8947fe8b4d756822420a7f31c380159425 +6696b4635ceb9b47aaa63244bff9032fa7b08354 +812714fd80e96e28cd288c553c83838cecbfc2d9 +8a445c5651edb9a1f51497055b7ddf4402be9188 +e126d0c12ca66278d9e7b12187c5ff4fc02a7e6c +3908fc4728059719bed0e1c7b1c8b388c2d4a8da +8b66bf74e2a349e71eaa183af81fa63eaee76ad2 +05950427d310654774031764a7141a1a4fd9c6e4 +07fd147b9f12e9205afd66a624edce357977d615 +12e31127948fa4bb01c3bddc1b8c85b432f7465b +8c87f175d335e9d9e93f987d871ae9f05f6a10a7 +46b249e578e8a3dfbe85bc7253a12e82ef4b658b +a55716abe5662ec74c2f8af93023f1e7cca901fc +f646275b90b1de93bc62b4c4d045d75ac0b96eee +c252685aa5867631e9a5ef07ccae7c7c25cae8ff +a7d55c93385359952d85decd5037843ac70ba3d4 +7dac1e5e9e887f5f6ff146e812a05bd3bf281eae +2a524b8e8fe69ef487fd8ea1b4f7a03f473ed201 +ce5c1f4acae43477989cdf9a82ed33703919cda2 +2db4cbcc437f51f5dac82cc4de46f383b92e6f11 +7aa700424cbda387536373d8dfec88aee43f950e +b99a093afed880f23fb279c443cc6ae5e379cc43 +b83264d9c7a8ddb79f64bd9540caddc8632ef31f +57e337d40e94ba33d8cd265c134d6ef857b32b59 +a1dcf2e1087beaf3981739fd2bb74f35ecad630a +d38b0d7a6b6056cba26999b702815775e2437d87 +815640ec6af9a38d6a2da4a4400056e2f4105080 +09c4fd157c5b88df2d97fad4826c79b094db90c9 +2efcfa5acfacb958973d9e8125e1d81f102e2dfd +dc6dee41f7cf2ba93fcd0fea7c157e4b2775d439 +ad826b3df9f763b49f1e3e3d50c4efdd438c7547 +c1a52276848d8caa9a9789dff176408c1aa6b1ed +3bf06e9bac57b5b5a746677b75e297a7b154bdbd +72ae6f8cf0224370e8121d6769b21e612ca15d6f +a143b88dbd4971ecfdd1d39a494489c8f2db0344 +76fec09d878d6dbf214bdb6228d480bd9195db4c +93566e0c37c5ae104095474fea89f00dcb40f551 +407d9232ef5cb1ebf6cff21f3d13e07ea4158eeb +9346f8429957e356d21c665bab59fe45bcf1f74e +6eeac6e30d65f9a972067c1ea8c49978c8e631ac +dc6b9406bdfab2af8c86cb080cb3e6cf8f2385d8 +9f554e03ebe5701c1b75ff03b3d6152095c0cad3 +05009935f9ac070197113954d680bc2c9150b9b3 +508404de98a8a5435f52916cef8f328e82651961 +ed0cc50afed146c27f6d8129c683c225fb940093 +6429cfa8a70308241c576aeb92ffe3db5203b2ef +6898213409811b140843c3d89af43328c3b22fad +5b2ea29cf4fd298346437bb16a54407f8c1f9dca +e2a1a1ee895149c544d4ae295466611f0cec3094 +e82fb872ff5cc8fd22d43327c1ee3e755f61c562 +19b0f33de0efd9da788e8e4f3fdc2a9e159abdb1 +89de1538ce1f8c00f80e8d11f43e1b77e24d7dea +de07fdcf77e97b8613091285e4d0a734f5de7492 +01680195f8aa586c55c44767397380def3a23b54 +05e1c85fb687c82ae477c72d4a7e2d6b0c692167 +c072b8fd95cd4fa84f08189a0cd8b173ea2dbb8e +9a0ed08b40b15ae2b791aa8549b53e69934b4ea7 +53f8f226bd1d627c4a6dec5862a1d4ea5a933e45 +9d0f43b7ca7241d8a018fd35dd3bc01555235ec6 +f12d2b5a8ac397e4bcaefcc19898f8ff5705dea5 +8250de13587ed05ca45df3e12c5dc9bcb1500e2c +d727f77e390426e9e463336bda08d50c451c7086 +484312bda2d43e3ea60047be076332299463adf8 +c7e05b35ab0a791c7a8e2d863e716fdec6f3f671 +b9c1cd81848da9de1baf9c2f29c19c50e549de13 +8ea7d31e384975019733b5778feabbd9955c79d8 +f798b891bcecea9548eedacae70eeb9906c1ddbf +ebefe7a00b46579cdd1e033a8c7fd8ce9aa578e4 +ad087638ee4864d6244ec9381ff764bfa6ee5086 +66db2d62d59817320c9182fc18e75a93b76828ea +7ce9ac5c83b1844a518ef2e12e87aae3cacdfe58 +4286f43025149cf44207c3ad98e4a1f068520ada +cd0c5135ab2291aaa5410ac919bad3fc87249a4a +66ed450d771a8fc01c159a8402648ebd1c35eb4c +a82f03393a32842d49236e8666ee57805ca701f8 +f972b04d63eb8af79ff3cec1dc561ed13dfa6053 +ec45cc5e27668171b55271b0c735194c70e7da41 +715e9fd7454f7a48d7adba7d42f662c20a3e3367 +2e0a99037dcc35bc63ba0d54371bc678af737c8e +7fa8d758598407f3bf0beb0118dc122ea5340736 +6a22373771edbc3c7513cacb9355f880c73c2cbf +b89ef131147f71a96152a7b5c4374266cdf539b2 +01d8359983e2f77b5118fede3ffa947072c666c8 +58f0c929a3d70a4bff79cc200f1c186f71ef1675 +950be19727a581970591d8f8138dfe4725750382 +425278d17bd0edf8a3a7cc81e55016f7fd8e7726 +c028c7b7557da2baff7af8840108e8be4db8e0c6 +47a7cfb0aa2498f6801026d258a59f9de48f60b0 +f6b7df3155ddb4cedfbcf5d3eb3383d4614b3a85 +d72098038f3b55a714ed8adb34fab547b15eb0d5 +c49c825bd9f4764536b45df5a684d97173673fc7 +33799afe83eec4200ff140e9bf5eae83701a4d7f +5c3f8ddcaa1164079105c452429fccf8127b01b6 +1f01443567b03ac75a91c810f1733f5c21b5699d +b3e42b6d02e8d19658a9135e427ebceab5367779 +69b3a6dd9d9a0adf5506c8b9fde42187356bd4a8 +bafd075c5e6a1088ef0f1aa0b0b224e026a3d3e0 +7daa3adb242d9c8728fdb15c6af6596aaad5502f +514993554c370f4cf30a109ac28d5d64893dbf0a +c8d2473e6cb042e7275a10c49d3f6a4a91bf0166 +386f4385ab04b0b2c3d47bddc0dc0f2de7354964 +9f33dba05c01ecc5c56eb1284ab7d64d42f55171 diff --git a/contrib/verify-commits/gpg.sh b/contrib/verify-commits/gpg.sh index 09ff237544..b01e2a6d39 100755 --- a/contrib/verify-commits/gpg.sh +++ b/contrib/verify-commits/gpg.sh @@ -8,21 +8,43 @@ VALID=false REVSIG=false IFS=' ' -for LINE in $(echo "$INPUT" | gpg --trust-model always "$@" 2>/dev/null); do +if [ "$BITCOIN_VERIFY_COMMITS_ALLOW_SHA1" = 1 ]; then + GPG_RES="$(echo "$INPUT" | gpg --trust-model always "$@" 2>/dev/null)" +else + # Note how we've disabled SHA1 with the --weak-digest option, disabling + # signatures - including selfsigs - that use SHA1. While you might think that + # collision attacks shouldn't be an issue as they'd be an attack on yourself, + # in fact because what's being signed is a commit object that's + # semi-deterministically generated by untrusted input (the pull-req) in theory + # an attacker could construct a pull-req that results in a commit object that + # they've created a collision for. Not the most likely attack, but preventing + # it is pretty easy so we do so as a "belt-and-suspenders" measure. + GPG_RES="" + for LINE in "$(gpg --version)"; do + case "$LINE" in + "gpg (GnuPG) 1.4.1"*|"gpg (GnuPG) 2.0."*) + echo "Please upgrade to at least gpg 2.1.10 to check for weak signatures" > /dev/stderr + GPG_RES="$(echo "$INPUT" | gpg --trust-model always "$@" 2>/dev/null)" + ;; + # We assume if you're running 2.1+, you're probably running 2.1.10+ + # gpg will fail otherwise + # We assume if you're running 1.X, it is either 1.4.1X or 1.4.20+ + # gpg will fail otherwise + esac + done + [ "$GPG_RES" = "" ] && GPG_RES="$(echo "$INPUT" | gpg --trust-model always --weak-digest sha1 "$@" 2>/dev/null)" +fi +for LINE in $(echo "$GPG_RES"); do case "$LINE" in "[GNUPG:] VALIDSIG "*) while read KEY; do - case "$LINE" in "[GNUPG:] VALIDSIG $KEY "*) VALID=true;; esac + [ "${LINE#?GNUPG:? VALIDSIG * * * * * * * * * }" = "$KEY" ] && VALID=true done < ./contrib/verify-commits/trusted-keys ;; "[GNUPG:] REVKEYSIG "*) [ "$BITCOIN_VERIFY_COMMITS_ALLOW_REVSIG" != 1 ] && exit 1 - while read KEY; do - case "$LINE" in "[GNUPG:] REVKEYSIG ${KEY#????????????????????????} "*) - REVSIG=true - GOODREVSIG="[GNUPG:] GOODSIG ${KEY#????????????????????????} " - esac - done < ./contrib/verify-commits/trusted-keys + REVSIG=true + GOODREVSIG="[GNUPG:] GOODSIG ${LINE#* * *}" ;; esac done @@ -30,7 +52,7 @@ if ! $VALID; then exit 1 fi if $VALID && $REVSIG; then - echo "$INPUT" | gpg --trust-model always "$@" | grep "\[GNUPG:\] \(NEWSIG\|SIG_ID\|VALIDSIG\)" 2>/dev/null + echo "$INPUT" | gpg --trust-model always "$@" 2>/dev/null | grep "\[GNUPG:\] \(NEWSIG\|SIG_ID\|VALIDSIG\)" echo "$GOODREVSIG" else echo "$INPUT" | gpg --trust-model always "$@" 2>/dev/null diff --git a/contrib/verify-commits/trusted-keys b/contrib/verify-commits/trusted-keys index 75242c2a97..5610692616 100644 --- a/contrib/verify-commits/trusted-keys +++ b/contrib/verify-commits/trusted-keys @@ -1,4 +1,4 @@ 71A3B16735405025D447E8F274810B012346C9A6 -3F1888C6DCA92A6499C4911FDBA1A67379A1A931 +133EAC179436F14A5CF1B794860FEB804E669320 32EE5C4C3FA15CCADB46ABE529D4BCB6416F53EC -FE09B823E6D83A3BC7983EAA2D7F2372E50FE137 +B8B3F1C0E58C15DB6A81D30C3648A882F4316B9B diff --git a/contrib/verify-commits/trusted-sha512-root-commit b/contrib/verify-commits/trusted-sha512-root-commit new file mode 100644 index 0000000000..c28f50ff78 --- /dev/null +++ b/contrib/verify-commits/trusted-sha512-root-commit @@ -0,0 +1 @@ +f7ec7cfd38b543ba81ac7bed5b77f9a19739460b diff --git a/contrib/verify-commits/verify-commits.sh b/contrib/verify-commits/verify-commits.sh index cfe4f11a0b..40c9341445 100755 --- a/contrib/verify-commits/verify-commits.sh +++ b/contrib/verify-commits/verify-commits.sh @@ -9,7 +9,10 @@ DIR=$(dirname "$0") [ "/${DIR#/}" != "$DIR" ] && DIR=$(dirname "$(pwd)/$0") +echo "Using verify-commits data from ${DIR}" + VERIFIED_ROOT=$(cat "${DIR}/trusted-git-root") +VERIFIED_SHA512_ROOT=$(cat "${DIR}/trusted-sha512-root-commit") REVSIG_ALLOWED=$(cat "${DIR}/allow-revsig-commits") HAVE_FAILED=false @@ -17,20 +20,78 @@ IS_SIGNED () { if [ $1 = $VERIFIED_ROOT ]; then return 0; fi + + VERIFY_TREE=$2 + NO_SHA1=$3 + if [ $1 = $VERIFIED_SHA512_ROOT ]; then + if [ "$VERIFY_TREE" = "1" ]; then + echo "All Tree-SHA512s matched up to $VERIFIED_SHA512_ROOT" > /dev/stderr + fi + VERIFY_TREE=0 + NO_SHA1=0 + fi + + if [ "$NO_SHA1" = "1" ]; then + export BITCOIN_VERIFY_COMMITS_ALLOW_SHA1=0 + else + export BITCOIN_VERIFY_COMMITS_ALLOW_SHA1=1 + fi + if [ "${REVSIG_ALLOWED#*$1}" != "$REVSIG_ALLOWED" ]; then export BITCOIN_VERIFY_COMMITS_ALLOW_REVSIG=1 else export BITCOIN_VERIFY_COMMITS_ALLOW_REVSIG=0 fi - if ! git -c "gpg.program=${DIR}/gpg.sh" verify-commit $1 > /dev/null 2>&1; then + + if ! git -c "gpg.program=${DIR}/gpg.sh" verify-commit $1 > /dev/null; then return 1; fi + + # We set $4 to 1 on the first call, always verifying the top of the tree + if [ "$VERIFY_TREE" = 1 -o "$4" = "1" ]; then + IFS_CACHE="$IFS" + IFS=' +' + for LINE in $(git ls-tree --full-tree -r $1); do + case "$LINE" in + "12"*) + echo "Repo contains symlinks" > /dev/stderr + IFS="$IFS_CACHE" + return 1 + ;; + esac + done + IFS="$IFS_CACHE" + + FILE_HASHES="" + for FILE in $(git ls-tree --full-tree -r --name-only $1 | LC_ALL=C sort); do + HASH=$(git cat-file blob $1:"$FILE" | sha512sum | { read FIRST OTHER; echo $FIRST; } ) + [ "$FILE_HASHES" != "" ] && FILE_HASHES="$FILE_HASHES"' +' + FILE_HASHES="$FILE_HASHES$HASH $FILE" + done + HASH_MATCHES=0 + MSG="$(git show -s --format=format:%B $1 | tail -n1)" + + case "$MSG -" in + "Tree-SHA512: $(echo "$FILE_HASHES" | sha512sum)") + HASH_MATCHES=1;; + esac + + if [ "$HASH_MATCHES" = "0" ]; then + echo "Tree-SHA512 did not match for commit $1" > /dev/stderr + HAVE_FAILED=true + return 1 + fi + fi + local PARENTS PARENTS=$(git show -s --format=format:%P $1) for PARENT in $PARENTS; do - if IS_SIGNED $PARENT > /dev/null; then + if IS_SIGNED $PARENT $VERIFY_TREE $NO_SHA1 0; then return 0; fi + break done if ! "$HAVE_FAILED"; then echo "No parent of $1 was signed with a trusted key!" > /dev/stderr @@ -49,7 +110,12 @@ else TEST_COMMIT="$1" fi -IS_SIGNED "$TEST_COMMIT" +DO_CHECKOUT_TEST=0 +if [ x"$2" = "x--tree-checks" ]; then + DO_CHECKOUT_TEST=1 +fi + +IS_SIGNED "$TEST_COMMIT" "$DO_CHECKOUT_TEST" 1 1 RES=$? if [ "$RES" = 1 ]; then if ! "$HAVE_FAILED"; then diff --git a/contrib/zmq/zmq_sub.py b/contrib/zmq/zmq_sub.py index 3dea5e3c14..ea398a27ea 100755 --- a/contrib/zmq/zmq_sub.py +++ b/contrib/zmq/zmq_sub.py @@ -1,44 +1,84 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 # Copyright (c) 2014-2016 The Bitcoin Core developers # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. -import array +""" + ZMQ example using python3's asyncio + + Bitcoin should be started with the command line arguments: + bitcoind -testnet -daemon \ + -zmqpubhashblock=tcp://127.0.0.1:28332 \ + -zmqpubrawtx=tcp://127.0.0.1:28332 \ + -zmqpubhashtx=tcp://127.0.0.1:28332 \ + -zmqpubhashblock=tcp://127.0.0.1:28332 + + We use the asyncio library here. `self.handle()` installs itself as a + future at the end of the function. Since it never returns with the event + loop having an empty stack of futures, this creates an infinite loop. An + alternative is to wrap the contents of `handle` inside `while True`. + + A blocking example using python 2.7 can be obtained from the git history: + https://github.com/bitcoin/bitcoin/blob/37a7fe9e440b83e2364d5498931253937abe9294/contrib/zmq/zmq_sub.py +""" + import binascii +import asyncio import zmq +import zmq.asyncio +import signal import struct +import sys + +if not (sys.version_info.major >= 3 and sys.version_info.minor >= 5): + print("This example only works with Python 3.5 and greater") + exit(1) port = 28332 -zmqContext = zmq.Context() -zmqSubSocket = zmqContext.socket(zmq.SUB) -zmqSubSocket.setsockopt(zmq.SUBSCRIBE, "hashblock") -zmqSubSocket.setsockopt(zmq.SUBSCRIBE, "hashtx") -zmqSubSocket.setsockopt(zmq.SUBSCRIBE, "rawblock") -zmqSubSocket.setsockopt(zmq.SUBSCRIBE, "rawtx") -zmqSubSocket.connect("tcp://127.0.0.1:%i" % port) - -try: - while True: - msg = zmqSubSocket.recv_multipart() - topic = str(msg[0]) +class ZMQHandler(): + def __init__(self): + self.loop = zmq.asyncio.install() + self.zmqContext = zmq.asyncio.Context() + + self.zmqSubSocket = self.zmqContext.socket(zmq.SUB) + self.zmqSubSocket.setsockopt_string(zmq.SUBSCRIBE, "hashblock") + self.zmqSubSocket.setsockopt_string(zmq.SUBSCRIBE, "hashtx") + self.zmqSubSocket.setsockopt_string(zmq.SUBSCRIBE, "rawblock") + self.zmqSubSocket.setsockopt_string(zmq.SUBSCRIBE, "rawtx") + self.zmqSubSocket.connect("tcp://127.0.0.1:%i" % port) + + async def handle(self) : + msg = await self.zmqSubSocket.recv_multipart() + topic = msg[0] body = msg[1] - sequence = "Unknown"; + sequence = "Unknown" if len(msg[-1]) == 4: msgSequence = struct.unpack('<I', msg[-1])[-1] sequence = str(msgSequence) - if topic == "hashblock": - print '- HASH BLOCK ('+sequence+') -' - print binascii.hexlify(body) - elif topic == "hashtx": - print '- HASH TX ('+sequence+') -' - print binascii.hexlify(body) - elif topic == "rawblock": - print '- RAW BLOCK HEADER ('+sequence+') -' - print binascii.hexlify(body[:80]) - elif topic == "rawtx": - print '- RAW TX ('+sequence+') -' - print binascii.hexlify(body) - -except KeyboardInterrupt: - zmqContext.destroy() + if topic == b"hashblock": + print('- HASH BLOCK ('+sequence+') -') + print(binascii.hexlify(body)) + elif topic == b"hashtx": + print('- HASH TX ('+sequence+') -') + print(binascii.hexlify(body)) + elif topic == b"rawblock": + print('- RAW BLOCK HEADER ('+sequence+') -') + print(binascii.hexlify(body[:80])) + elif topic == b"rawtx": + print('- RAW TX ('+sequence+') -') + print(binascii.hexlify(body)) + # schedule ourselves to receive the next message + asyncio.ensure_future(self.handle()) + + def start(self): + self.loop.add_signal_handler(signal.SIGINT, self.stop) + self.loop.create_task(self.handle()) + self.loop.run_forever() + + def stop(self): + self.loop.stop() + self.zmqContext.destroy() + +daemon = ZMQHandler() +daemon.start() diff --git a/contrib/zmq/zmq_sub3.4.py b/contrib/zmq/zmq_sub3.4.py new file mode 100755 index 0000000000..a2ff64b29b --- /dev/null +++ b/contrib/zmq/zmq_sub3.4.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python3 +# Copyright (c) 2014-2016 The Bitcoin Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +""" + ZMQ example using python3's asyncio + + Bitcoin should be started with the command line arguments: + bitcoind -testnet -daemon \ + -zmqpubhashblock=tcp://127.0.0.1:28332 \ + -zmqpubrawtx=tcp://127.0.0.1:28332 \ + -zmqpubhashtx=tcp://127.0.0.1:28332 \ + -zmqpubhashblock=tcp://127.0.0.1:28332 + + We use the asyncio library here. `self.handle()` installs itself as a + future at the end of the function. Since it never returns with the event + loop having an empty stack of futures, this creates an infinite loop. An + alternative is to wrap the contents of `handle` inside `while True`. + + The `@asyncio.coroutine` decorator and the `yield from` syntax found here + was introduced in python 3.4 and has been deprecated in favor of the `async` + and `await` keywords respectively. + + A blocking example using python 2.7 can be obtained from the git history: + https://github.com/bitcoin/bitcoin/blob/37a7fe9e440b83e2364d5498931253937abe9294/contrib/zmq/zmq_sub.py +""" + +import binascii +import asyncio +import zmq +import zmq.asyncio +import signal +import struct +import sys + +if not (sys.version_info.major >= 3 and sys.version_info.minor >= 4): + print("This example only works with Python 3.4 and greater") + exit(1) + +port = 28332 + +class ZMQHandler(): + def __init__(self): + self.loop = zmq.asyncio.install() + self.zmqContext = zmq.asyncio.Context() + + self.zmqSubSocket = self.zmqContext.socket(zmq.SUB) + self.zmqSubSocket.setsockopt_string(zmq.SUBSCRIBE, "hashblock") + self.zmqSubSocket.setsockopt_string(zmq.SUBSCRIBE, "hashtx") + self.zmqSubSocket.setsockopt_string(zmq.SUBSCRIBE, "rawblock") + self.zmqSubSocket.setsockopt_string(zmq.SUBSCRIBE, "rawtx") + self.zmqSubSocket.connect("tcp://127.0.0.1:%i" % port) + + @asyncio.coroutine + def handle(self) : + msg = yield from self.zmqSubSocket.recv_multipart() + topic = msg[0] + body = msg[1] + sequence = "Unknown"; + if len(msg[-1]) == 4: + msgSequence = struct.unpack('<I', msg[-1])[-1] + sequence = str(msgSequence) + if topic == b"hashblock": + print('- HASH BLOCK ('+sequence+') -') + print(binascii.hexlify(body)) + elif topic == b"hashtx": + print('- HASH TX ('+sequence+') -') + print(binascii.hexlify(body)) + elif topic == b"rawblock": + print('- RAW BLOCK HEADER ('+sequence+') -') + print(binascii.hexlify(body[:80])) + elif topic == b"rawtx": + print('- RAW TX ('+sequence+') -') + print(binascii.hexlify(body)) + # schedule ourselves to receive the next message + asyncio.ensure_future(self.handle()) + + def start(self): + self.loop.add_signal_handler(signal.SIGINT, self.stop) + self.loop.create_task(self.handle()) + self.loop.run_forever() + + def stop(self): + self.loop.stop() + self.zmqContext.destroy() + +daemon = ZMQHandler() +daemon.start() |