diff --git a/.cirrus.yml b/.cirrus.yml deleted file mode 100644 index d31f0afb53..0000000000 --- a/.cirrus.yml +++ /dev/null @@ -1,294 +0,0 @@ -env: - ### cirrus config - CIRRUS_CLONE_DEPTH: 1 - ### compiler options - HOST: - WRAPPER_CMD: - # Specific warnings can be disabled with -Wno-error=foo. - # -pedantic-errors is not equivalent to -Werror=pedantic and thus not implied by -Werror according to the GCC manual. - WERROR_CFLAGS: -Werror -pedantic-errors - MAKEFLAGS: -j4 - BUILD: check - ### secp256k1 config - ECMULTWINDOW: 15 - ECMULTGENKB: 22 - ASM: no - WIDEMUL: auto - WITH_VALGRIND: yes - EXTRAFLAGS: - ### secp256k1 modules - EXPERIMENTAL: no - ECDH: no - RECOVERY: no - SCHNORRSIG: no - ELLSWIFT: no - ### test options - SECP256K1_TEST_ITERS: - BENCH: yes - SECP256K1_BENCH_ITERS: 2 - CTIMETESTS: yes - # Compile and run the tests - EXAMPLES: yes - -# A self-hosted machine(s) can be used via Cirrus CI. It can be configured with -# multiple users to run tasks in parallel. No sudo permission is required. -# -# https://cirrus-ci.org/guide/persistent-workers/ -# -# Generally, a persistent worker must run Ubuntu 23.04+ or Debian 12+. -# -# The following specific types should exist, with the following requirements: -# - small: For an x86_64 machine, recommended to have 2 CPUs and 8 GB of memory. -# - medium: For an x86_64 machine, recommended to have 4 CPUs and 16 GB of memory. -# - arm64: For an aarch64 machine, recommended to have 2 CPUs and 8 GB of memory. -# -# CI jobs for the latter configuration can be run on x86_64 hardware -# by installing qemu-user-static, which works out of the box with -# podman or docker. Background: https://stackoverflow.com/a/72890225/313633 -# -# The above machine types are matched to each task by their label. Refer to the -# Cirrus CI docs for more details. -# -# When a contributor maintains a fork of the repo, any pull request they make -# to their own fork, or to the main repository, will trigger two CI runs: -# one for the branch push and one for the pull request. -# This can be avoided by setting SKIP_BRANCH_PUSH=true as a custom env variable -# in Cirrus repository settings, accessible from -# https://cirrus-ci.com/github/my-organization/my-repository -# -# On machines that are persisted between CI jobs, RESTART_CI_DOCKER_BEFORE_RUN=1 -# ensures that previous containers and artifacts are cleared before each run. -# This requires installing Podman instead of Docker. -# -# Futhermore: -# - apt-get is required due to PACKAGE_MANAGER_INSTALL -# - podman-docker-4.1+ is required due to the bugfix in 4.1 -# (https://github.com/bitcoin/bitcoin/pull/21652#issuecomment-1657098200) -# - The ./ci/ dependencies (with cirrus-cli) should be installed. One-liner example -# for a single user setup with sudo permission: -# -# ``` -# apt update && apt install git screen python3 bash podman-docker curl -y && curl -L -o cirrus "https://github.com/cirruslabs/cirrus-cli/releases/latest/download/cirrus-linux-$(dpkg --print-architecture)" && mv cirrus /usr/local/bin/cirrus && chmod +x /usr/local/bin/cirrus -# ``` -# -# - There are no strict requirements on the hardware. Having fewer CPU threads -# than recommended merely causes the CI script to run slower. -# To avoid rare and intermittent OOM due to short memory usage spikes, -# it is recommended to add (and persist) swap: -# -# ``` -# fallocate -l 16G /swapfile_ci && chmod 600 /swapfile_ci && mkswap /swapfile_ci && swapon /swapfile_ci && ( echo '/swapfile_ci none swap sw 0 0' | tee -a /etc/fstab ) -# ``` -# -# - To register the persistent worker, open a `screen` session and run: -# -# ``` -# RESTART_CI_DOCKER_BEFORE_RUN=1 screen cirrus worker run --labels type=todo_fill_in_type --token todo_fill_in_token -# ``` - -# https://cirrus-ci.org/guide/tips-and-tricks/#sharing-configuration-between-tasks -filter_template: &FILTER_TEMPLATE - # Allow forks to specify SKIP_BRANCH_PUSH=true and skip CI runs when a branch is pushed, - # but still run CI when a PR is created. - # https://cirrus-ci.org/guide/writing-tasks/#conditional-task-execution - skip: $SKIP_BRANCH_PUSH == "true" && $CIRRUS_PR == "" - stateful: false # https://cirrus-ci.org/guide/writing-tasks/#stateful-tasks - -base_template: &BASE_TEMPLATE - << : *FILTER_TEMPLATE - merge_base_script: - # Unconditionally install git (used in fingerprint_script). - - git --version || bash -c "$PACKAGE_MANAGER_INSTALL git" - - if [ "$CIRRUS_PR" = "" ]; then exit 0; fi - - git fetch $CIRRUS_REPO_CLONE_URL $CIRRUS_BASE_BRANCH - - git config --global user.email "ci@ci.ci" - - git config --global user.name "ci" - - git merge FETCH_HEAD # Merge base to detect silent merge conflicts - -env_matrix_snippet: &ENV_MATRIX_VALGRIND - - env: - ENABLE_FIELDS: "7,32,58" - - env: - BUILD: distcheck - - env: - EXEC_CMD: valgrind --error-exitcode=42 - TESTRUNS: 1 - BUILD: - -env_matrix_snippet: &ENV_MATRIX_SAN_VALGRIND - - env: - ENABLE_FIELDS: "11,64,37" - - env: - BUILD: distcheck - - env: - EXEC_CMD: valgrind --error-exitcode=42 - TESTRUNS: 1 - BUILD: - - env: - CXXFLAGS: "-fsanitize=undefined -fno-omit-frame-pointer" - LDFLAGS: "-fsanitize=undefined -fno-omit-frame-pointer" - UBSAN_OPTIONS: "print_stacktrace=1:halt_on_error=1" - BENCH: no - -task: - name: 'lint' - << : *BASE_TEMPLATE - container: - dockerfile: ci/linux-debian.Dockerfile - memory: 2G - cpu: 4 - matrix: - << : *ENV_MATRIX_SAN_VALGRIND - matrix: - - env: - CXX: g++ - - env: - CXX: clang++ -gdwarf-4 - << : *MERGE_BASE - test_script: - - ./ci/cirrus.sh - << : *CAT_LOGS - -task: - name: 'tidy' - << : *GLOBAL_TASK_TEMPLATE - persistent_worker: - labels: - type: medium - env: - HOST: i686-linux-gnu - matrix: - << : *ENV_MATRIX_VALGRIND - matrix: - - env: - CXX: i686-linux-gnu-g++ - - env: - CXX: clang++ --target=i686-linux-gnu -gdwarf-4 - CXXFLAGS: -g -O2 -isystem /usr/i686-linux-gnu/include -isystem /usr/i686-linux-gnu/include/c++/10/i686-linux-gnu - test_script: - - ./ci/cirrus.sh - << : *CAT_LOGS - -task: - name: "arm64: macOS Monterey" - macos_instance: - image: ghcr.io/cirruslabs/macos-monterey-base:latest - env: - # Cirrus gives us a fixed number of 4 virtual CPUs. - MAKEFLAGS: -j5 - matrix: - - env: - CXX: g++-11 - # Homebrew's gcc for arm64 has no libubsan. - matrix: - - env: - ENABLE_FIELDS: 28 - - env: - BUILD: distcheck - - env: - CXX: clang++ - matrix: - - env: - ENABLE_FIELDS: 28 - - env: - BUILD: distcheck - - env: - CXXFLAGS: "-fsanitize=undefined -fno-omit-frame-pointer" - LDFLAGS: "-fsanitize=undefined -fno-omit-frame-pointer" - UBSAN_OPTIONS: "print_stacktrace=1:halt_on_error=1" - BENCH: no - brew_script: - - brew update - - brew install automake libtool gcc@11 - << : *MERGE_BASE - test_script: - - ./ci/cirrus.sh - << : *CAT_LOGS - -task: - name: 'Win64, unit tests, no gui tests, no functional tests' - << : *GLOBAL_TASK_TEMPLATE - persistent_worker: - labels: - type: small - env: - EXEC_CMD: qemu-s390x - HOST: s390x-linux-gnu - BUILD: - << : *MERGE_BASE - test_script: - - ./ci/cirrus.sh - << : *CAT_LOGS - -task: - name: '32-bit CentOS, dash, gui' - << : *GLOBAL_TASK_TEMPLATE - persistent_worker: - labels: - type: small - env: - FILE_ENV: "./ci/test/00_setup_env_i686_centos.sh" - -task: - name: 'previous releases, depends DEBUG' - << : *GLOBAL_TASK_TEMPLATE - persistent_worker: - labels: - type: small - env: - FILE_ENV: "./ci/test/00_setup_env_native_previous_releases.sh" - -task: - name: 'TSan, depends, gui' - << : *GLOBAL_TASK_TEMPLATE - persistent_worker: - labels: - type: medium - env: - FILE_ENV: "./ci/test/00_setup_env_native_tsan.sh" - -task: - name: 'MSan, depends' - << : *GLOBAL_TASK_TEMPLATE - persistent_worker: - labels: - type: small - timeout_in: 300m # Use longer timeout for the *rare* case where a full build (llvm + msan + depends + ...) needs to be done. - env: - FILE_ENV: "./ci/test/00_setup_env_native_msan.sh" - -task: - name: 'fuzzer,address,undefined,integer, no depends' - << : *GLOBAL_TASK_TEMPLATE - persistent_worker: - labels: - type: medium - env: - FILE_ENV: "./ci/test/00_setup_env_native_fuzz.sh" - -task: - name: 'multiprocess, i686, DEBUG' - << : *GLOBAL_TASK_TEMPLATE - persistent_worker: - labels: - type: medium - env: - FILE_ENV: "./ci/test/00_setup_env_i686_multiprocess.sh" - -task: - name: 'no wallet, libBGLkernel' - << : *GLOBAL_TASK_TEMPLATE - persistent_worker: - labels: - type: small - env: - FILE_ENV: "./ci/test/00_setup_env_native_nowallet_libBGLkernel.sh" - -task: - name: 'macOS-cross, gui, no tests' - << : *GLOBAL_TASK_TEMPLATE - persistent_worker: - labels: - type: arm64 - env: - FILE_ENV: "./ci/test/00_setup_env_mac_cross.sh" diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index ae7e92d1c8..0000000000 --- a/.editorconfig +++ /dev/null @@ -1,26 +0,0 @@ -# This is the top-most EditorConfig file. -root = true - -# For all files. -[*] -charset = utf-8 -end_of_line = lf -indent_style = space -insert_final_newline = true -trim_trailing_whitespace = true - -# Source code files -[*.{h,cpp,py,sh}] -indent_size = 4 - -# .cirrus.yml, .fuzzbuzz.yml, etc. -[*.yml] -indent_size = 2 - -# Makefiles -[{*.am,Makefile.*.include}] -indent_style = tab - -# Autoconf scripts -[configure.ac] -indent_size = 2 diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 30efb2244f..0000000000 --- a/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -src/precomputed_ecmult.c linguist-generated -src/precomputed_ecmult_gen.c linguist-generated diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml deleted file mode 100644 index 83922b54cb..0000000000 --- a/.github/ISSUE_TEMPLATE/bug.yml +++ /dev/null @@ -1,93 +0,0 @@ -name: Bug report -description: Submit a new bug report. -labels: [bug] -body: - - type: markdown - attributes: - value: | - ## This issue tracker is only for technical issues related to Bitcoin Core. - - * General bitcoin questions and/or support requests should use Bitcoin StackExchange at https://bitcoin.stackexchange.com. - * For reporting security issues, please read instructions at https://bitcoincore.org/en/contact/. - * If the node is "stuck" during sync or giving "block checksum mismatch" errors, please ensure your hardware is stable by running `memtest` and observe CPU temperature with a load-test tool such as `linpack` before creating an issue. - - ---- - - type: checkboxes - attributes: - label: Is there an existing issue for this? - description: Please search to see if an issue already exists for the bug you encountered. - options: - - label: I have searched the existing issues - required: true - - type: textarea - id: current-behaviour - attributes: - label: Current behaviour - description: Tell us what went wrong - validations: - required: true - - type: textarea - id: expected-behaviour - attributes: - label: Expected behaviour - description: Tell us what you expected to happen - validations: - required: true - - type: textarea - id: reproduction-steps - attributes: - label: Steps to reproduce - description: | - Tell us how to reproduce your bug. Please attach related screenshots if necessary. - * Run-time or compile-time configuration options - * Actions taken - validations: - required: true - - type: textarea - id: logs - attributes: - label: Relevant log output - description: | - Please copy and paste any relevant log output or attach a debug log file. - - You can find the debug.log in your [data dir.](https://github.com/bitcoin/bitcoin/blob/master/doc/files.md#data-directory-location) - - Please be aware that the debug log might contain personally identifying information. - validations: - required: false - - type: dropdown - attributes: - label: How did you obtain Bitcoin Core - multiple: false - options: - - Compiled from source - - Pre-built binaries - - Package manager - - Other - validations: - required: true - - type: input - id: core-version - attributes: - label: What version of Bitcoin Core are you using? - description: Run `bitcoind --version` or in Bitcoin-QT use `Help > About Bitcoin Core` - placeholder: e.g. v24.0.1 or master@e1bf547 - validations: - required: true - - type: input - id: os - attributes: - label: Operating system and version - placeholder: e.g. "MacOS Ventura 13.2" or "Ubuntu 22.04 LTS" - validations: - required: true - - type: textarea - id: machine-specs - attributes: - label: Machine specifications - description: | - What are the specifications of the host machine? - e.g. OS/CPU and disk type, network connectivity - validations: - required: false - diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml deleted file mode 100644 index 40370284a6..0000000000 --- a/.github/ISSUE_TEMPLATE/config.yml +++ /dev/null @@ -1,8 +0,0 @@ -blank_issues_enabled: true -contact_links: - - name: Bitcoin Core Security Policy - url: https://github.com/bitcoin/bitcoin/blob/master/SECURITY.md - about: View security policy - - name: Bitcoin Core Developers - url: https://bitcoincore.org - about: Bitcoin Core homepage diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml deleted file mode 100644 index 4622fd9819..0000000000 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: Feature Request -description: Suggest an idea for this project. -labels: [Feature] -body: - - type: textarea - id: feature - attributes: - label: Please describe the feature you'd like to see added. - description: Attach screenshots or logs if applicable. - validations: - required: true - - type: textarea - id: related-problem - attributes: - label: Is your feature related to a problem, if so please describe it. - description: Attach screenshots or logs if applicable. - validations: - required: false - - type: textarea - id: solution - attributes: - label: Describe the solution you'd like - validations: - required: false - - type: textarea - id: alternatives - attributes: - label: Describe any alternatives you've considered - validations: - required: false - - type: textarea - id: additional-context - attributes: - label: Please leave any additional context - validations: - required: false diff --git a/.github/ISSUE_TEMPLATE/good_first_issue.yml b/.github/ISSUE_TEMPLATE/good_first_issue.yml deleted file mode 100644 index 133937c011..0000000000 --- a/.github/ISSUE_TEMPLATE/good_first_issue.yml +++ /dev/null @@ -1,44 +0,0 @@ -name: Good First Issue -description: (Regular devs only) Suggest a new good first issue -labels: [good first issue] -body: - - type: markdown - attributes: - value: | - Please add the label "good first issue" manually before or after opening - - A good first issue is an uncontroversial issue, that has a relatively unique and obvious solution - - Motivate the issue and explain the solution briefly - - type: textarea - id: motivation - attributes: - label: Motivation - description: Motivate the issue - validations: - required: true - - type: textarea - id: solution - attributes: - label: Possible solution - description: Describe a possible solution - validations: - required: false - - type: textarea - id: useful-skills - attributes: - label: Useful Skills - description: For example, “`std::thread`”, “Qt5 GUI and async GUI design” or “basic understanding of Bitcoin mining and the Bitcoin Core RPC interface”. - value: | - * Compiling Bitcoin Core from source - * Running the C++ unit tests and the Python functional tests - * ... - - type: textarea - attributes: - label: Guidance for new contributors - description: Please leave this to automatically add the footer for new contributors - value: | - Want to work on this issue? - - For guidance on contributing, please read [CONTRIBUTING.md](https://github.com/bitcoin/bitcoin/blob/master/CONTRIBUTING.md) before opening your pull request. - diff --git a/.github/ISSUE_TEMPLATE/gui_issue.yml b/.github/ISSUE_TEMPLATE/gui_issue.yml deleted file mode 100644 index 4fe578e9b5..0000000000 --- a/.github/ISSUE_TEMPLATE/gui_issue.yml +++ /dev/null @@ -1,18 +0,0 @@ -name: Issue or feature request related to the GUI -description: Any report, issue or feature request related to the GUI -labels: [GUI] -body: -- type: checkboxes - id: acknowledgement - attributes: - label: Issues, reports or feature requests related to the GUI should be opened directly on the GUI repo - description: https://github.com/bitcoin-core/gui/issues/ - options: - - label: I still think this issue should be opened here - required: true -- type: textarea - id: gui-request - attributes: - label: Report - validations: - required: true diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 95bdf8981f..0000000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,11 +0,0 @@ -### Description -what is the goal of the pull request - -Pull requests without a rationale and clear improvement may be closed -immediately. - -### Notes -implementation details, hints for reviewers - -### BTC/BGL PR reward address -if applicable, please type your reward wallet address here diff --git a/.github/actions/install-homebrew-valgrind/action.yml b/.github/actions/install-homebrew-valgrind/action.yml deleted file mode 100644 index ce10eb2686..0000000000 --- a/.github/actions/install-homebrew-valgrind/action.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: "Install Valgrind" -description: "Install Homebrew's Valgrind package and cache it." -runs: - using: "composite" - steps: - - run: | - brew tap LouisBrunner/valgrind - brew fetch --HEAD LouisBrunner/valgrind/valgrind - echo "CI_HOMEBREW_CELLAR_VALGRIND=$(brew --cellar valgrind)" >> "$GITHUB_ENV" - shell: bash - - - run: | - sw_vers > valgrind_fingerprint - brew --version >> valgrind_fingerprint - git -C "$(brew --cache)/valgrind--git" rev-parse HEAD >> valgrind_fingerprint - cat valgrind_fingerprint - shell: bash - - - uses: actions/cache@v4 - id: cache - with: - path: ${{ env.CI_HOMEBREW_CELLAR_VALGRIND }} - key: ${{ github.job }}-valgrind-${{ hashFiles('valgrind_fingerprint') }} - - - if: steps.cache.outputs.cache-hit != 'true' - run: | - brew install --HEAD LouisBrunner/valgrind/valgrind - shell: bash - - - if: steps.cache.outputs.cache-hit == 'true' - run: | - brew link valgrind - shell: bash diff --git a/.github/actions/run-in-docker-action/action.yml b/.github/actions/run-in-docker-action/action.yml deleted file mode 100644 index 74933686a0..0000000000 --- a/.github/actions/run-in-docker-action/action.yml +++ /dev/null @@ -1,54 +0,0 @@ -name: 'Run in Docker with environment' -description: 'Run a command in a Docker container, while passing explicitly set environment variables into the container.' -inputs: - dockerfile: - description: 'A Dockerfile that defines an image' - required: true - tag: - description: 'A tag of an image' - required: true - command: - description: 'A command to run in a container' - required: false - default: ./ci/ci.sh -runs: - using: "composite" - steps: - - uses: docker/setup-buildx-action@v3 - - - uses: docker/build-push-action@v5 - id: main_builder - continue-on-error: true - with: - context: . - file: ${{ inputs.dockerfile }} - tags: ${{ inputs.tag }} - load: true - cache-from: type=gha - - - uses: docker/build-push-action@v5 - id: retry_builder - if: steps.main_builder.outcome == 'failure' - with: - context: . - file: ${{ inputs.dockerfile }} - tags: ${{ inputs.tag }} - load: true - cache-from: type=gha - - - # Workaround for https://github.com/google/sanitizers/issues/1614 . - # The underlying issue has been fixed in clang 18.1.3. - run: sudo sysctl -w vm.mmap_rnd_bits=28 - shell: bash - - - # Tell Docker to pass environment variables in `env` into the container. - run: > - docker run \ - $(echo '${{ toJSON(env) }}' | jq -r 'keys[] | "--env \(.) "') \ - --volume ${{ github.workspace }}:${{ github.workspace }} \ - --workdir ${{ github.workspace }} \ - ${{ inputs.tag }} bash -c " - git config --global --add safe.directory ${{ github.workspace }} - ${{ inputs.command }} - " - shell: bash diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 7d608c9f6a..0000000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,925 +0,0 @@ -name: CI -on: - pull_request: - push: - branches: - - '**' - tags-ignore: - - '**' - -concurrency: - group: ${{ github.event_name != 'pull_request' && github.run_id || github.ref }} - cancel-in-progress: true - -env: - ### compiler options - HOST: - WRAPPER_CMD: - # Specific warnings can be disabled with -Wno-error=foo. - # -pedantic-errors is not equivalent to -Werror=pedantic and thus not implied by -Werror according to the GCC manual. - WERROR_CFLAGS: '-Werror -pedantic-errors' - MAKEFLAGS: '-j4' - BUILD: 'check' - ### secp256k1 config - ECMULTWINDOW: 15 - ECMULTGENKB: 22 - ASM: 'no' - WIDEMUL: 'auto' - WITH_VALGRIND: 'yes' - EXTRAFLAGS: - ### secp256k1 modules - EXPERIMENTAL: 'no' - ECDH: 'no' - RECOVERY: 'no' - SCHNORRSIG: 'no' - ELLSWIFT: 'no' - ### test options - SECP256K1_TEST_ITERS: - BENCH: 'yes' - SECP256K1_BENCH_ITERS: 2 - CTIMETESTS: 'yes' - # Compile and run the examples. - EXAMPLES: 'yes' - -jobs: - test-each-commit: - name: 'test each commit' - runs-on: ubuntu-24.04 - if: github.event_name == 'pull_request' && github.event.pull_request.commits != 1 - timeout-minutes: 360 # Use maximum time, see https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idtimeout-minutes. Assuming a worst case time of 1 hour per commit, this leads to a --max-count=6 below. - env: - MAX_COUNT: 6 - steps: - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - with: - ref: ${{ github.event.pull_request.head.sha }} - fetch-depth: ${{ env.FETCH_DEPTH }} - - name: Determine commit range - run: | - # Checkout HEAD~ and find the test base commit - # Checkout HEAD~ because it would be wasteful to rerun tests on the PR - # head commit that are already run by other jobs. - git checkout HEAD~ - # Figure out test base commit by listing ancestors of HEAD, excluding - # ancestors of the most recent merge commit, limiting the list to the - # newest MAX_COUNT ancestors, ordering it from oldest to newest, and - # taking the first one. - # - # If the branch contains up to MAX_COUNT ancestor commits after the - # most recent merge commit, all of those commits will be tested. If it - # contains more, only the most recent MAX_COUNT commits will be - # tested. - # - # In the command below, the ^@ suffix is used to refer to all parents - # of the merge commit as described in: - # https://git-scm.com/docs/git-rev-parse#_other_rev_parent_shorthand_notations - # and the ^ prefix is used to exclude these parents and all their - # ancestors from the rev-list output as described in: - # https://git-scm.com/docs/git-rev-list - MERGE_BASE=$(git rev-list -n1 --merges HEAD) - EXCLUDE_MERGE_BASE_ANCESTORS= - # MERGE_BASE can be empty due to limited fetch-depth - if test -n "$MERGE_BASE"; then - EXCLUDE_MERGE_BASE_ANCESTORS=^${MERGE_BASE}^@ - fi - echo "TEST_BASE=$(git rev-list -n$((${{ env.MAX_COUNT }} + 1)) --reverse HEAD $EXCLUDE_MERGE_BASE_ANCESTORS | head -1)" >> "$GITHUB_ENV" - - run: | - sudo apt-get update - sudo apt-get install clang ccache build-essential libtool autotools-dev automake pkg-config bsdmainutils python3-zmq libevent-dev libboost-dev libsqlite3-dev libdb++-dev systemtap-sdt-dev libminiupnpc-dev libnatpmp-dev qtbase5-dev qttools5-dev qttools5-dev-tools qtwayland5 libqrencode-dev -y - - name: Compile and run tests - run: | - # Run tests on commits after the last merge commit and before the PR head commit - # Use clang++, because it is a bit faster and uses less memory than g++ - git rebase --exec "echo Running test-one-commit on \$( git log -1 ) && ./autogen.sh && CC=clang CXX=clang++ ./configure && make clean && make -j $(nproc) check && ./test/functional/test_runner.py -j $(( $(nproc) * 2 ))" ${{ env.TEST_BASE }} - - macos-native-x86_64: - name: 'macOS 13 native, x86_64, no depends, sqlite only, gui' - # Use latest image, but hardcode version to avoid silent upgrades (and breaks). - # See: https://github.com/actions/runner-images#available-images. - runs-on: macos-13 - - - name: Build container - uses: docker/build-push-action@v5 - with: - file: ./ci/linux-debian.Dockerfile - tags: linux-debian-image - cache-from: type=gha - cache-to: type=gha,mode=min - - linux_debian: - name: "x86_64: Linux (Debian stable)" - runs-on: ubuntu-latest - needs: docker_cache - - strategy: - fail-fast: false - matrix: - configuration: - - env_vars: { WIDEMUL: 'int64', RECOVERY: 'yes' } - - env_vars: { WIDEMUL: 'int64', ECDH: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes' } - - env_vars: { WIDEMUL: 'int128' } - - env_vars: { WIDEMUL: 'int128_struct', ELLSWIFT: 'yes' } - - env_vars: { WIDEMUL: 'int128', RECOVERY: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes' } - - env_vars: { WIDEMUL: 'int128', ECDH: 'yes', SCHNORRSIG: 'yes' } - - env_vars: { WIDEMUL: 'int128', ASM: 'x86_64', ELLSWIFT: 'yes' } - - env_vars: { RECOVERY: 'yes', SCHNORRSIG: 'yes' } - - env_vars: { CTIMETESTS: 'no', RECOVERY: 'yes', ECDH: 'yes', SCHNORRSIG: 'yes', CPPFLAGS: '-DVERIFY' } - - env_vars: { BUILD: 'distcheck', WITH_VALGRIND: 'no', CTIMETESTS: 'no', BENCH: 'no' } - - env_vars: { CPPFLAGS: '-DDETERMINISTIC' } - - env_vars: { CFLAGS: '-O0', CTIMETESTS: 'no' } - - env_vars: { CFLAGS: '-O1', RECOVERY: 'yes', ECDH: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes' } - - env_vars: { ECMULTGENKB: 2, ECMULTWINDOW: 2 } - - env_vars: { ECMULTGENKB: 86, ECMULTWINDOW: 4 } - cc: - - 'gcc' - - 'clang' - - 'gcc-snapshot' - - 'clang-snapshot' - - env: - DANGER_RUN_CI_ON_HOST: 1 - FILE_ENV: './ci/test/00_setup_env_mac_native.sh' - BASE_ROOT_DIR: ${{ github.workspace }} - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Clang version - run: | - sudo xcode-select --switch /Applications/Xcode_15.0.app - clang --version - - - name: Install Homebrew packages - env: - HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK: 1 - run: | - # A workaround for "The `brew link` step did not complete successfully" error. - brew install python@3 || brew link --overwrite python@3 - brew install automake libtool pkg-config gnu-getopt ccache boost libevent miniupnpc libnatpmp zeromq qt@5 qrencode - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Restore Ccache cache - id: ccache-cache - uses: actions/cache/restore@v4 - with: - dockerfile: ./ci/linux-debian.Dockerfile - tag: linux-debian-image - - - run: cat tests.log || true - if: ${{ always() }} - - run: cat noverify_tests.log || true - if: ${{ always() }} - - run: cat exhaustive_tests.log || true - if: ${{ always() }} - - run: cat ctime_tests.log || true - if: ${{ always() }} - - run: cat bench.log || true - if: ${{ always() }} - - run: cat config.log || true - if: ${{ always() }} - - run: cat test_env.log || true - if: ${{ always() }} - - name: CI env - run: env - if: ${{ always() }} - - s390x_debian: - name: "s390x (big-endian): Linux (Debian stable, QEMU)" - runs-on: ubuntu-latest - needs: docker_cache - - env: - WRAPPER_CMD: 'qemu-s390x' - SECP256K1_TEST_ITERS: 16 - HOST: 's390x-linux-gnu' - WITH_VALGRIND: 'no' - ECDH: 'yes' - RECOVERY: 'yes' - SCHNORRSIG: 'yes' - ELLSWIFT: 'yes' - CTIMETESTS: 'no' - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: CI script - uses: ./.github/actions/run-in-docker-action - with: - dockerfile: ./ci/linux-debian.Dockerfile - tag: linux-debian-image - - - run: cat tests.log || true - if: ${{ always() }} - - run: cat noverify_tests.log || true - if: ${{ always() }} - - run: cat exhaustive_tests.log || true - if: ${{ always() }} - - run: cat ctime_tests.log || true - if: ${{ always() }} - - run: cat bench.log || true - if: ${{ always() }} - - run: cat config.log || true - if: ${{ always() }} - - run: cat test_env.log || true - if: ${{ always() }} - - name: CI env - run: env - if: ${{ always() }} - - arm32_debian: - name: "ARM32: Linux (Debian stable, QEMU)" - runs-on: ubuntu-latest - needs: docker_cache - - strategy: - fail-fast: false - matrix: - configuration: - - env_vars: {} - - env_vars: { EXPERIMENTAL: 'yes', ASM: 'arm32' } - - - name: Save Ccache cache - uses: actions/cache/save@v4 - if: github.event_name != 'pull_request' && steps.ccache-cache.outputs.cache-hit != 'true' - with: - dockerfile: ./ci/linux-debian.Dockerfile - tag: linux-debian-image - - - run: cat tests.log || true - if: ${{ always() }} - - run: cat noverify_tests.log || true - if: ${{ always() }} - - run: cat exhaustive_tests.log || true - if: ${{ always() }} - - run: cat ctime_tests.log || true - if: ${{ always() }} - - run: cat bench.log || true - if: ${{ always() }} - - run: cat config.log || true - if: ${{ always() }} - - run: cat test_env.log || true - if: ${{ always() }} - - name: CI env - run: env - if: ${{ always() }} - - arm64_debian: - name: "ARM64: Linux (Debian stable, QEMU)" - runs-on: ubuntu-latest - needs: docker_cache - - env: - WRAPPER_CMD: 'qemu-aarch64' - SECP256K1_TEST_ITERS: 16 - HOST: 'aarch64-linux-gnu' - WITH_VALGRIND: 'no' - ECDH: 'yes' - RECOVERY: 'yes' - SCHNORRSIG: 'yes' - ELLSWIFT: 'yes' - CTIMETESTS: 'no' - - strategy: - fail-fast: false - matrix: - configuration: - - env_vars: { } # gcc - - env_vars: # clang - CC: 'clang --target=aarch64-linux-gnu' - - env_vars: # clang-snapshot - CC: 'clang-snapshot --target=aarch64-linux-gnu' - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: CI script - env: ${{ matrix.configuration.env_vars }} - uses: ./.github/actions/run-in-docker-action - with: - dockerfile: ./ci/linux-debian.Dockerfile - tag: linux-debian-image - - - run: cat tests.log || true - if: ${{ always() }} - - run: cat noverify_tests.log || true - if: ${{ always() }} - - run: cat exhaustive_tests.log || true - if: ${{ always() }} - - run: cat ctime_tests.log || true - if: ${{ always() }} - - run: cat bench.log || true - if: ${{ always() }} - - run: cat config.log || true - if: ${{ always() }} - - run: cat test_env.log || true - if: ${{ always() }} - - name: CI env - run: env - if: ${{ always() }} - - ppc64le_debian: - name: "ppc64le: Linux (Debian stable, QEMU)" - runs-on: ubuntu-latest - needs: docker_cache - - env: - CCACHE_MAXSIZE: '200M' - CI_CCACHE_VERSION: '4.7.5' - CI_QT_CONF: '-release -silent -opensource -confirm-license -opengl desktop -static -static-runtime -mp -qt-zlib -qt-pcre -qt-libpng -nomake examples -nomake tests -nomake tools -no-angle -no-dbus -no-gif -no-gtk -no-ico -no-icu -no-libjpeg -no-libudev -no-sql-sqlite -no-sql-odbc -no-sqlite -no-vulkan -skip qt3d -skip qtactiveqt -skip qtandroidextras -skip qtcharts -skip qtconnectivity -skip qtdatavis3d -skip qtdeclarative -skip doc -skip qtdoc -skip qtgamepad -skip qtgraphicaleffects -skip qtimageformats -skip qtlocation -skip qtlottie -skip qtmacextras -skip qtmultimedia -skip qtnetworkauth -skip qtpurchasing -skip qtquick3d -skip qtquickcontrols -skip qtquickcontrols2 -skip qtquicktimeline -skip qtremoteobjects -skip qtscript -skip qtscxml -skip qtsensors -skip qtserialbus -skip qtserialport -skip qtspeech -skip qtsvg -skip qtvirtualkeyboard -skip qtwayland -skip qtwebchannel -skip qtwebengine -skip qtwebglplugin -skip qtwebsockets -skip qtwebview -skip qtx11extras -skip qtxmlpatterns -no-openssl -no-feature-bearermanagement -no-feature-printdialog -no-feature-printer -no-feature-printpreviewdialog -no-feature-printpreviewwidget -no-feature-sql -no-feature-sqlmodel -no-feature-textbrowser -no-feature-textmarkdownwriter -no-feature-textodfwriter -no-feature-xml' - CI_QT_DIR: 'qt-everywhere-src-5.15.11' - CI_QT_URL: 'https://download.qt.io/official_releases/qt/5.15/5.15.11/single/qt-everywhere-opensource-src-5.15.11.zip' - PYTHONUTF8: 1 - TEST_RUNNER_TIMEOUT_FACTOR: 40 - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Configure Developer Command Prompt for Microsoft Visual C++ - # Using microsoft/setup-msbuild is not enough. - uses: ilammy/msvc-dev-cmd@v1 - with: - dockerfile: ./ci/linux-debian.Dockerfile - tag: linux-debian-image - - - run: cat tests.log || true - if: ${{ always() }} - - run: cat noverify_tests.log || true - if: ${{ always() }} - - run: cat exhaustive_tests.log || true - if: ${{ always() }} - - run: cat ctime_tests.log || true - if: ${{ always() }} - - run: cat bench.log || true - if: ${{ always() }} - - run: cat config.log || true - if: ${{ always() }} - - run: cat test_env.log || true - if: ${{ always() }} - - name: CI env - run: env - if: ${{ always() }} - - valgrind_debian: - name: "Valgrind (memcheck)" - runs-on: ubuntu-latest - needs: docker_cache - - strategy: - fail-fast: false - matrix: - configuration: - - env_vars: { CC: 'clang', ASM: 'auto' } - - env_vars: { CC: 'i686-linux-gnu-gcc', HOST: 'i686-linux-gnu', ASM: 'auto' } - - env_vars: { CC: 'clang', ASM: 'no', ECMULTGENKB: 2, ECMULTWINDOW: 2 } - - env_vars: { CC: 'i686-linux-gnu-gcc', HOST: 'i686-linux-gnu', ASM: 'no', ECMULTGENKB: 2, ECMULTWINDOW: 2 } - - - name: Get tool information - run: | - msbuild -version | Tee-Object -FilePath "msbuild_version" - $env:VCToolsVersion | Tee-Object -FilePath "toolset_version" - $env:CI_QT_URL | Out-File -FilePath "qt_url" - $env:CI_QT_CONF | Out-File -FilePath "qt_conf" - py -3 --version - Write-Host "PowerShell version $($PSVersionTable.PSVersion.ToString())" - - - name: Restore static Qt cache - id: static-qt-cache - uses: actions/cache/restore@v4 - with: - dockerfile: ./ci/linux-debian.Dockerfile - tag: linux-debian-image - - - run: cat tests.log || true - if: ${{ always() }} - - run: cat noverify_tests.log || true - if: ${{ always() }} - - run: cat exhaustive_tests.log || true - if: ${{ always() }} - - run: cat ctime_tests.log || true - if: ${{ always() }} - - run: cat bench.log || true - if: ${{ always() }} - - run: cat config.log || true - if: ${{ always() }} - - run: cat test_env.log || true - if: ${{ always() }} - - name: CI env - run: env - if: ${{ always() }} - - sanitizers_debian: - name: "UBSan, ASan, LSan" - runs-on: ubuntu-latest - needs: docker_cache - - strategy: - fail-fast: false - matrix: - configuration: - - env_vars: { CC: 'clang', ASM: 'auto' } - - env_vars: { CC: 'i686-linux-gnu-gcc', HOST: 'i686-linux-gnu', ASM: 'auto' } - - env_vars: { CC: 'clang', ASM: 'no', ECMULTGENKB: 2, ECMULTWINDOW: 2 } - - env_vars: { CC: 'i686-linux-gnu-gcc', HOST: 'i686-linux-gnu', ASM: 'no', ECMULTGENKB: 2, ECMULTWINDOW: 2 } - - env: - ECDH: 'yes' - RECOVERY: 'yes' - SCHNORRSIG: 'yes' - ELLSWIFT: 'yes' - CTIMETESTS: 'no' - CFLAGS: '-fsanitize=undefined,address -g' - UBSAN_OPTIONS: 'print_stacktrace=1:halt_on_error=1' - ASAN_OPTIONS: 'strict_string_checks=1:detect_stack_use_after_return=1:detect_leaks=1' - LSAN_OPTIONS: 'use_unaligned=1' - SECP256K1_TEST_ITERS: 32 - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Build static Qt. Create build directory - if: steps.static-qt-cache.outputs.cache-hit != 'true' - run: | - Rename-Item -Path "C:\$env:CI_QT_DIR" -NewName "C:\qt-src" - New-Item -ItemType Directory -Path "C:\qt-src\build" - - - name: Build static Qt. Configure - if: steps.static-qt-cache.outputs.cache-hit != 'true' - working-directory: C:\qt-src\build - shell: cmd - run: ..\configure %CI_QT_CONF% -prefix C:\Qt_static - - - name: Build static Qt. Build - if: steps.static-qt-cache.outputs.cache-hit != 'true' - working-directory: C:\qt-src\build - shell: cmd - run: jom - - - name: Build static Qt. Install - if: steps.static-qt-cache.outputs.cache-hit != 'true' - working-directory: C:\qt-src\build - shell: cmd - run: jom install - - - name: Save static Qt cache - if: steps.static-qt-cache.outputs.cache-hit != 'true' - uses: actions/cache/save@v4 - with: - dockerfile: ./ci/linux-debian.Dockerfile - tag: linux-debian-image - - - run: cat tests.log || true - if: ${{ always() }} - - run: cat noverify_tests.log || true - if: ${{ always() }} - - run: cat exhaustive_tests.log || true - if: ${{ always() }} - - run: cat ctime_tests.log || true - if: ${{ always() }} - - run: cat bench.log || true - if: ${{ always() }} - - run: cat config.log || true - if: ${{ always() }} - - run: cat test_env.log || true - if: ${{ always() }} - - name: CI env - run: env - if: ${{ always() }} - - msan_debian: - name: "MSan" - runs-on: ubuntu-latest - needs: docker_cache - - strategy: - fail-fast: false - matrix: - configuration: - - env_vars: - CTIMETESTS: 'yes' - CFLAGS: '-fsanitize=memory -fsanitize-recover=memory -g' - - env_vars: - ECMULTGENKB: 2 - ECMULTWINDOW: 2 - CTIMETESTS: 'yes' - CFLAGS: '-fsanitize=memory -fsanitize-recover=memory -g -O3' - - env_vars: - # -fsanitize-memory-param-retval is clang's default, but our build system disables it - # when ctime_tests when enabled. - CFLAGS: '-fsanitize=memory -fsanitize-recover=memory -fsanitize-memory-param-retval -g' - CTIMETESTS: 'no' - - env: - ECDH: 'yes' - RECOVERY: 'yes' - SCHNORRSIG: 'yes' - ELLSWIFT: 'yes' - CC: 'clang' - SECP256K1_TEST_ITERS: 32 - ASM: 'no' - WITH_VALGRIND: 'no' - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: CI script - env: ${{ matrix.configuration.env_vars }} - uses: ./.github/actions/run-in-docker-action - with: - dockerfile: ./ci/linux-debian.Dockerfile - tag: linux-debian-image - - - run: cat tests.log || true - if: ${{ always() }} - - run: cat noverify_tests.log || true - if: ${{ always() }} - - run: cat exhaustive_tests.log || true - if: ${{ always() }} - - run: cat ctime_tests.log || true - if: ${{ always() }} - - run: cat bench.log || true - if: ${{ always() }} - - run: cat config.log || true - if: ${{ always() }} - - run: cat test_env.log || true - if: ${{ always() }} - - name: CI env - run: env - if: ${{ always() }} - - mingw_debian: - name: ${{ matrix.configuration.job_name }} - runs-on: ubuntu-latest - needs: docker_cache - - - name: Restore Ccache cache - id: ccache-cache - uses: actions/cache/restore@v4 - with: - dockerfile: ./ci/linux-debian.Dockerfile - tag: linux-debian-image - - - run: cat tests.log || true - if: ${{ always() }} - - run: cat noverify_tests.log || true - if: ${{ always() }} - - run: cat exhaustive_tests.log || true - if: ${{ always() }} - - run: cat ctime_tests.log || true - if: ${{ always() }} - - run: cat bench.log || true - if: ${{ always() }} - - run: cat config.log || true - if: ${{ always() }} - - run: cat test_env.log || true - if: ${{ always() }} - - name: CI env - run: env - if: ${{ always() }} - - x86_64-macos-native: - name: "x86_64: macOS Monterey, Valgrind" - # See: https://github.com/actions/runner-images#available-images. - runs-on: macos-12 - - env: - CC: 'clang' - HOMEBREW_NO_AUTO_UPDATE: 1 - HOMEBREW_NO_INSTALL_CLEANUP: 1 - - strategy: - fail-fast: false - matrix: - env_vars: - - { WIDEMUL: 'int64', RECOVERY: 'yes', ECDH: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes' } - - { WIDEMUL: 'int128_struct', ECMULTGENKB: 2, ECMULTWINDOW: 4 } - - { WIDEMUL: 'int128', ECDH: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes' } - - { WIDEMUL: 'int128', RECOVERY: 'yes' } - - { WIDEMUL: 'int128', RECOVERY: 'yes', ECDH: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes' } - - { WIDEMUL: 'int128', RECOVERY: 'yes', ECDH: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes', CC: 'gcc' } - - { WIDEMUL: 'int128', RECOVERY: 'yes', ECDH: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes', WRAPPER_CMD: 'valgrind --error-exitcode=42', SECP256K1_TEST_ITERS: 2 } - - { WIDEMUL: 'int128', RECOVERY: 'yes', ECDH: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes', CC: 'gcc', WRAPPER_CMD: 'valgrind --error-exitcode=42', SECP256K1_TEST_ITERS: 2 } - - { WIDEMUL: 'int128', RECOVERY: 'yes', ECDH: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes', CPPFLAGS: '-DVERIFY', CTIMETESTS: 'no' } - - BUILD: 'distcheck' - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Install Homebrew packages - run: | - Set-Location "$env:VCPKG_INSTALLATION_ROOT" - Add-Content -Path "triplets\x64-windows-static.cmake" -Value "set(VCPKG_BUILD_TYPE release)" - .\vcpkg.exe --vcpkg-root "$env:VCPKG_INSTALLATION_ROOT" integrate install - git rev-parse HEAD | Tee-Object -FilePath "$env:GITHUB_WORKSPACE\vcpkg_commit" - - - name: vcpkg tools cache - uses: actions/cache@v4 - with: - path: C:/vcpkg/downloads/tools - key: ${{ github.job }}-vcpkg-tools - - - name: vcpkg binary cache - uses: actions/cache@v4 - with: - path: ~/AppData/Local/vcpkg/archives - key: ${{ github.job }}-vcpkg-binary-${{ hashFiles('vcpkg_commit', 'msbuild_version', 'toolset_version', 'build_msvc/vcpkg.json') }} - - - name: CI script - env: ${{ matrix.env_vars }} - run: ./ci/ci.sh - - - run: cat tests.log || true - if: ${{ always() }} - - run: cat noverify_tests.log || true - if: ${{ always() }} - - run: cat exhaustive_tests.log || true - if: ${{ always() }} - - run: cat ctime_tests.log || true - if: ${{ always() }} - - run: cat bench.log || true - if: ${{ always() }} - - run: cat config.log || true - if: ${{ always() }} - - run: cat test_env.log || true - if: ${{ always() }} - - name: CI env - run: env - if: ${{ always() }} - - arm64-macos-native: - name: "ARM64: macOS Sonoma" - # See: https://github.com/actions/runner-images#available-images. - runs-on: macos-14 - - env: - CC: 'clang' - HOMEBREW_NO_AUTO_UPDATE: 1 - HOMEBREW_NO_INSTALL_CLEANUP: 1 - WITH_VALGRIND: 'no' - CTIMETESTS: 'no' - - strategy: - fail-fast: false - matrix: - env_vars: - - { WIDEMUL: 'int64', RECOVERY: 'yes', ECDH: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes' } - - { WIDEMUL: 'int128_struct', ECMULTGENPRECISION: 2, ECMULTWINDOW: 4 } - - { WIDEMUL: 'int128', ECDH: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes' } - - { WIDEMUL: 'int128', RECOVERY: 'yes' } - - { WIDEMUL: 'int128', RECOVERY: 'yes', ECDH: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes' } - - { WIDEMUL: 'int128', RECOVERY: 'yes', ECDH: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes', CC: 'gcc' } - - { WIDEMUL: 'int128', RECOVERY: 'yes', ECDH: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes', CPPFLAGS: '-DVERIFY' } - - BUILD: 'distcheck' - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Install Homebrew packages - run: | - brew install automake libtool gcc - ln -s $(brew --prefix gcc)/bin/gcc-?? /usr/local/bin/gcc - - - name: CI script - env: ${{ matrix.env_vars }} - run: ./ci/ci.sh - - - run: cat tests.log || true - if: ${{ always() }} - - run: cat noverify_tests.log || true - if: ${{ always() }} - - run: cat exhaustive_tests.log || true - if: ${{ always() }} - - run: cat ctime_tests.log || true - if: ${{ always() }} - - run: cat bench.log || true - if: ${{ always() }} - - run: cat config.log || true - if: ${{ always() }} - - run: cat test_env.log || true - if: ${{ always() }} - - name: CI env - run: env - if: ${{ always() }} - - win64-native: - name: ${{ matrix.configuration.job_name }} - # See: https://github.com/actions/runner-images#available-images. - runs-on: windows-2022 - - strategy: - fail-fast: false - matrix: - configuration: - - job_name: 'x64 (MSVC): Windows (VS 2022, shared)' - cmake_options: '-A x64 -DBUILD_SHARED_LIBS=ON' - - job_name: 'x64 (MSVC): Windows (VS 2022, static)' - cmake_options: '-A x64 -DBUILD_SHARED_LIBS=OFF' - - job_name: 'x64 (MSVC): Windows (VS 2022, int128_struct)' - cmake_options: '-A x64 -DSECP256K1_TEST_OVERRIDE_WIDE_MULTIPLY=int128_struct' - - job_name: 'x64 (MSVC): Windows (VS 2022, int128_struct with __(u)mulh)' - cmake_options: '-A x64 -DSECP256K1_TEST_OVERRIDE_WIDE_MULTIPLY=int128_struct' - cpp_flags: '/DSECP256K1_MSVC_MULH_TEST_OVERRIDE' - - job_name: 'x86 (MSVC): Windows (VS 2022)' - cmake_options: '-A Win32' - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Generate buildsystem - run: cmake -E env CFLAGS="/WX ${{ matrix.configuration.cpp_flags }}" cmake -B build -DSECP256K1_ENABLE_MODULE_RECOVERY=ON -DSECP256K1_BUILD_EXAMPLES=ON ${{ matrix.configuration.cmake_options }} - - - name: Build - run: cmake --build build --config RelWithDebInfo -- /p:UseMultiToolTask=true /maxCpuCount - - - name: Binaries info - # Use the bash shell included with Git for Windows. - shell: bash - run: | - cd build/src/RelWithDebInfo && file *tests.exe bench*.exe libsecp256k1-*.dll || true - - - name: Check - run: | - ctest -C RelWithDebInfo --test-dir build -j ([int]$env:NUMBER_OF_PROCESSORS + 1) - build\src\RelWithDebInfo\bench_ecmult.exe - build\src\RelWithDebInfo\bench_internal.exe - build\src\RelWithDebInfo\bench.exe - - win64-native-headers: - name: "x64 (MSVC): C++ (public headers)" - # See: https://github.com/actions/runner-images#available-images. - runs-on: windows-2022 - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Add cl.exe to PATH - uses: ilammy/msvc-dev-cmd@v1 - - - name: C++ (public headers) - run: | - cl.exe -c -WX -TP include/*.h - - cxx_fpermissive_debian: - name: "C++ -fpermissive (entire project)" - runs-on: ubuntu-latest - needs: docker_cache - - env: - CC: 'g++' - CFLAGS: '-fpermissive -g' - CPPFLAGS: '-DSECP256K1_CPLUSPLUS_TEST_OVERRIDE' - WERROR_CFLAGS: - ECDH: 'yes' - RECOVERY: 'yes' - SCHNORRSIG: 'yes' - ELLSWIFT: 'yes' - - - name: Save Ccache cache - uses: actions/cache/save@v4 - if: github.event_name != 'pull_request' && steps.ccache-cache.outputs.cache-hit != 'true' - with: - dockerfile: ./ci/linux-debian.Dockerfile - tag: linux-debian-image - - - run: cat tests.log || true - if: ${{ always() }} - - run: cat noverify_tests.log || true - if: ${{ always() }} - - run: cat exhaustive_tests.log || true - if: ${{ always() }} - - run: cat ctime_tests.log || true - if: ${{ always() }} - - run: cat bench.log || true - if: ${{ always() }} - - run: cat config.log || true - if: ${{ always() }} - - run: cat test_env.log || true - if: ${{ always() }} - - name: CI env - run: env - if: ${{ always() }} - - cxx_headers_debian: - name: "C++ (public headers)" - runs-on: ubuntu-latest - needs: docker_cache - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: CI script - uses: ./.github/actions/run-in-docker-action - with: - dockerfile: ./ci/linux-debian.Dockerfile - tag: linux-debian-image - command: | - g++ -Werror include/*.h - clang -Werror -x c++-header include/*.h - - sage: - name: "SageMath prover" - runs-on: ubuntu-latest - container: - image: sagemath/sagemath:latest - options: --user root - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: CI script - run: | - cd sage - sage prove_group_implementations.sage - - release: - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - run: ./autogen.sh && ./configure --enable-dev-mode && make distcheck - - - name: Check installation with Autotools - env: - CI_INSTALL: ${{ runner.temp }}/${{ github.run_id }}${{ github.action }}/install - run: | - ./autogen.sh && ./configure --prefix=${{ env.CI_INSTALL }} && make clean && make install && ls -RlAh ${{ env.CI_INSTALL }} - gcc -o ecdsa examples/ecdsa.c $(PKG_CONFIG_PATH=${{ env.CI_INSTALL }}/lib/pkgconfig pkg-config --cflags --libs libsecp256k1) -Wl,-rpath,"${{ env.CI_INSTALL }}/lib" && ./ecdsa - - - name: Run functional tests - env: - TEST_RUNNER_EXTRA: ${{ github.event_name != 'pull_request' && '--extended' || '' }} - shell: cmd - run: py -3 test\functional\test_runner.py --jobs %NUMBER_OF_PROCESSORS% --ci --quiet --tmpdirprefix=%RUNNER_TEMP% --combinedlogslen=99999999 --timeout-factor=%TEST_RUNNER_TIMEOUT_FACTOR% %TEST_RUNNER_EXTRA% - - - name: Clone fuzz corpus - run: | - git clone --depth=1 https://github.com/bitcoin-core/qa-assets "$env:RUNNER_TEMP\qa-assets" - Set-Location "$env:RUNNER_TEMP\qa-assets" - Write-Host "Using qa-assets repo from commit ..." - git log -1 - - - name: Run fuzz binaries - env: - BITCOINFUZZ: "${{ github.workspace}}\\src\\fuzz.exe" - shell: cmd - run: py -3 test\fuzz\test_runner.py --par %NUMBER_OF_PROCESSORS% --loglevel DEBUG %RUNNER_TEMP%\qa-assets\fuzz_seed_corpus - - asan-lsan-ubsan-integer-no-depends-usdt: - name: 'ASan + LSan + UBSan + integer, no depends, USDT' - runs-on: ubuntu-24.04 # has to match container in ci/test/00_setup_env_native_asan.sh for tracing tools - # No need to run on the read-only mirror, unless it is a PR. - if: github.repository != 'bitcoin-core/gui' || github.event_name == 'pull_request' - timeout-minutes: 120 - env: - FILE_ENV: "./ci/test/00_setup_env_native_asan.sh" - DANGER_CI_ON_HOST_CACHE_FOLDERS: 1 - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Set Ccache directory - run: echo "CCACHE_DIR=${RUNNER_TEMP}/ccache_dir" >> "$GITHUB_ENV" - - - name: Set base root directory - run: echo "BASE_ROOT_DIR=${RUNNER_TEMP}" >> "$GITHUB_ENV" - - - name: Restore Ccache cache - id: ccache-cache - uses: actions/cache/restore@v4 - with: - path: ${{ env.CCACHE_DIR }} - key: ${{ github.job }}-ccache-${{ github.run_id }} - restore-keys: ${{ github.job }}-ccache- - - - name: Enable bpfcc script - # In the image build step, no external environment variables are available, - # so any settings will need to be written to the settings env file: - run: sed -i "s|\${INSTALL_BCC_TRACING_TOOLS}|true|g" ./ci/test/00_setup_env_native_asan.sh - - - name: CI script - run: ./ci/test_run_all.sh - - - name: Save Ccache cache - uses: actions/cache/save@v4 - if: github.event_name != 'pull_request' && steps.ccache-cache.outputs.cache-hit != 'true' - with: - path: ${{ env.CCACHE_DIR }} - # https://github.com/actions/cache/blob/main/tips-and-workarounds.md#update-a-cache - key: ${{ github.job }}-ccache-${{ github.run_id }} diff --git a/.gitignore b/.gitignore deleted file mode 100644 index aa51668b10..0000000000 --- a/.gitignore +++ /dev/null @@ -1,178 +0,0 @@ -bench_ecmult -bench_internal -noverify_tests -tests -exhaustive_tests -precompute_ecmult_gen -precompute_ecmult -ctime_tests -ecdh_example -ecdsa_example -schnorr_example -*.exe -*.so -*.a -*.csv -!.gitignore -*.log -*.trs - -# autoreconf -Makefile.in -aclocal.m4 -autom4te.cache/ -config.log -config.status -conftest* -*.tar.gz -*.la -libtool -.deps/ -.dirstamp -*.lo -*.o -*~ -*.log -*.trs - -coverage/ -coverage.html -coverage.*.html -*.gcda -*.gcno -*.gcov - -build-aux/ar-lib -build-aux/config.guess -build-aux/config.sub -build-aux/depcomp -build-aux/install-sh -build-aux/ltmain.sh -build-aux/m4/libtool.m4 -build-aux/m4/lt~obsolete.m4 -build-aux/m4/ltoptions.m4 -build-aux/m4/ltsugar.m4 -build-aux/m4/ltversion.m4 -build-aux/missing -build-aux/compile -build-aux/test-driver -config.cache -config.log -config.status -configure -libtool -src/config/BGL-config.h -src/config/BGL-config.h.in -src/config/stamp-h1 -src/obj -share/setup.nsi -share/qt/Info.plist - -src/qt/*.moc -src/qt/moc_*.cpp -src/qt/forms/ui_*.h - -src/qt/test/moc*.cpp - -src/qt/BGL-qt.config -src/qt/BGL-qt.creator -src/qt/BGL-qt.creator.user -src/qt/BGL-qt.files -src/qt/BGL-qt.includes - -.deps -.dirstamp -.libs -.*.swp -*~ -*.bak -*.rej -*.orig -*.pyc -*.o -*.o-* -*.a -*.pb.cc -*.pb.h -*.dat - -*.log -*.trs -*.zip - -*.json.h -*.raw.h - -# Only ignore unexpected patches -*.patch -!contrib/guix/patches/*.patch -!depends/patches/**/*.patch - -#libtool object files -*.lo -*.la - -# Compilation and Qt preprocessor part -*.qm -Makefile -!depends/Makefile -src/qt/bitcoin-qt -Bitcoin-Qt.app - -# Qt Creator -Makefile.am.user - -# Unit-tests -Makefile.test -bitcoin-qt_test - -# Resources cpp -qrc_*.cpp - -# Mac specific -.DS_Store -build - -# Previous releases -releases - -#lcov -*.gcno -*.gcda -/*.info -test_bitcoin.coverage/ -total.coverage/ -fuzz.coverage/ -coverage_percent.txt -/cov_tool_wrapper.sh -qa-assets/ - -#build tests -linux-coverage-build -linux-build -win32-build -test/config.ini -test/cache/* -test/.mypy_cache/ -test/lint/test_runner/target/ - -!src/leveldb*/Makefile - -/doc/doxygen/ - -contrib/devtools/split-debug.sh - -# Output from running db4 installation -db4/ - -# clang-check -*.plist - -dist/ - -/guix-build-* - -### CMake -/CMakeUserPresets.json -# Default CMake build directory. -/build diff --git a/.python-version b/.python-version deleted file mode 100644 index 43077b2460..0000000000 --- a/.python-version +++ /dev/null @@ -1 +0,0 @@ -3.9.18 diff --git a/.style.yapf b/.style.yapf deleted file mode 100644 index 350ac63855..0000000000 --- a/.style.yapf +++ /dev/null @@ -1,261 +0,0 @@ -[style] -# Align closing bracket with visual indentation. -align_closing_bracket_with_visual_indent=True - -# Allow dictionary keys to exist on multiple lines. For example: -# -# x = { -# ('this is the first element of a tuple', -# 'this is the second element of a tuple'): -# value, -# } -allow_multiline_dictionary_keys=False - -# Allow lambdas to be formatted on more than one line. -allow_multiline_lambdas=False - -# Allow splits before the dictionary value. -allow_split_before_dict_value=True - -# Number of blank lines surrounding top-level function and class -# definitions. -blank_lines_around_top_level_definition=2 - -# Insert a blank line before a class-level docstring. -blank_line_before_class_docstring=False - -# Insert a blank line before a module docstring. -blank_line_before_module_docstring=False - -# Insert a blank line before a 'def' or 'class' immediately nested -# within another 'def' or 'class'. For example: -# -# class Foo: -# # <------ this blank line -# def method(): -# ... -blank_line_before_nested_class_or_def=False - -# Do not split consecutive brackets. Only relevant when -# dedent_closing_brackets is set. For example: -# -# call_func_that_takes_a_dict( -# { -# 'key1': 'value1', -# 'key2': 'value2', -# } -# ) -# -# would reformat to: -# -# call_func_that_takes_a_dict({ -# 'key1': 'value1', -# 'key2': 'value2', -# }) -coalesce_brackets=False - -# The column limit. -column_limit=160 - -# The style for continuation alignment. Possible values are: -# -# - SPACE: Use spaces for continuation alignment. This is default behavior. -# - FIXED: Use fixed number (CONTINUATION_INDENT_WIDTH) of columns -# (ie: CONTINUATION_INDENT_WIDTH/INDENT_WIDTH tabs) for continuation -# alignment. -# - LESS: Slightly left if cannot vertically align continuation lines with -# indent characters. -# - VALIGN-RIGHT: Vertically align continuation lines with indent -# characters. Slightly right (one more indent character) if cannot -# vertically align continuation lines with indent characters. -# -# For options FIXED, and VALIGN-RIGHT are only available when USE_TABS is -# enabled. -continuation_align_style=SPACE - -# Indent width used for line continuations. -continuation_indent_width=4 - -# Put closing brackets on a separate line, dedented, if the bracketed -# expression can't fit in a single line. Applies to all kinds of brackets, -# including function definitions and calls. For example: -# -# config = { -# 'key1': 'value1', -# 'key2': 'value2', -# } # <--- this bracket is dedented and on a separate line -# -# time_series = self.remote_client.query_entity_counters( -# entity='dev3246.region1', -# key='dns.query_latency_tcp', -# transform=Transformation.AVERAGE(window=timedelta(seconds=60)), -# start_ts=now()-timedelta(days=3), -# end_ts=now(), -# ) # <--- this bracket is dedented and on a separate line -dedent_closing_brackets=False - -# Disable the heuristic which places each list element on a separate line -# if the list is comma-terminated. -disable_ending_comma_heuristic=False - -# Place each dictionary entry onto its own line. -each_dict_entry_on_separate_line=True - -# The regex for an i18n comment. The presence of this comment stops -# reformatting of that line, because the comments are required to be -# next to the string they translate. -i18n_comment= - -# The i18n function call names. The presence of this function stops -# reformatting on that line, because the string it has cannot be moved -# away from the i18n comment. -i18n_function_call= - -# Indent the dictionary value if it cannot fit on the same line as the -# dictionary key. For example: -# -# config = { -# 'key1': -# 'value1', -# 'key2': value1 + -# value2, -# } -indent_dictionary_value=False - -# The number of columns to use for indentation. -indent_width=4 - -# Join short lines into one line. E.g., single line 'if' statements. -join_multiple_lines=True - -# Do not include spaces around selected binary operators. For example: -# -# 1 + 2 * 3 - 4 / 5 -# -# will be formatted as follows when configured with "*,/": -# -# 1 + 2*3 - 4/5 -# -no_spaces_around_selected_binary_operators= - -# Use spaces around default or named assigns. -spaces_around_default_or_named_assign=False - -# Use spaces around the power operator. -spaces_around_power_operator=False - -# The number of spaces required before a trailing comment. -spaces_before_comment=2 - -# Insert a space between the ending comma and closing bracket of a list, -# etc. -space_between_ending_comma_and_closing_bracket=True - -# Split before arguments -split_all_comma_separated_values=False - -# Split before arguments if the argument list is terminated by a -# comma. -split_arguments_when_comma_terminated=False - -# Set to True to prefer splitting before '&', '|' or '^' rather than -# after. -split_before_bitwise_operator=True - -# Split before the closing bracket if a list or dict literal doesn't fit on -# a single line. -split_before_closing_bracket=True - -# Split before a dictionary or set generator (comp_for). For example, note -# the split before the 'for': -# -# foo = { -# variable: 'Hello world, have a nice day!' -# for variable in bar if variable != 42 -# } -split_before_dict_set_generator=True - -# Split before the '.' if we need to split a longer expression: -# -# foo = ('This is a really long string: {}, {}, {}, {}'.format(a, b, c, d)) -# -# would reformat to something like: -# -# foo = ('This is a really long string: {}, {}, {}, {}' -# .format(a, b, c, d)) -split_before_dot=False - -# Split after the opening paren which surrounds an expression if it doesn't -# fit on a single line. -split_before_expression_after_opening_paren=False - -# If an argument / parameter list is going to be split, then split before -# the first argument. -split_before_first_argument=False - -# Set to True to prefer splitting before 'and' or 'or' rather than -# after. -split_before_logical_operator=True - -# Split named assignments onto individual lines. -split_before_named_assigns=True - -# Set to True to split list comprehensions and generators that have -# non-trivial expressions and multiple clauses before each of these -# clauses. For example: -# -# result = [ -# a_long_var + 100 for a_long_var in xrange(1000) -# if a_long_var % 10] -# -# would reformat to something like: -# -# result = [ -# a_long_var + 100 -# for a_long_var in xrange(1000) -# if a_long_var % 10] -split_complex_comprehension=False - -# The penalty for splitting right after the opening bracket. -split_penalty_after_opening_bracket=30 - -# The penalty for splitting the line after a unary operator. -split_penalty_after_unary_operator=10000 - -# The penalty for splitting right before an if expression. -split_penalty_before_if_expr=0 - -# The penalty of splitting the line around the '&', '|', and '^' -# operators. -split_penalty_bitwise_operator=300 - -# The penalty for splitting a list comprehension or generator -# expression. -split_penalty_comprehension=80 - -# The penalty for characters over the column limit. -split_penalty_excess_character=7000 - -# The penalty incurred by adding a line split to the unwrapped line. The -# more line splits added the higher the penalty. -split_penalty_for_added_line_split=30 - -# The penalty of splitting a list of "import as" names. For example: -# -# from a_very_long_or_indented_module_name_yada_yad import (long_argument_1, -# long_argument_2, -# long_argument_3) -# -# would reformat to something like: -# -# from a_very_long_or_indented_module_name_yada_yad import ( -# long_argument_1, long_argument_2, long_argument_3) -split_penalty_import_names=0 - -# The penalty of splitting the line around the 'and' and 'or' -# operators. -split_penalty_logical_operator=300 - -# Use the Tab character for indentation. -use_tabs=False - diff --git a/.tx/config b/.tx/config deleted file mode 100644 index 644cd77566..0000000000 --- a/.tx/config +++ /dev/null @@ -1,7 +0,0 @@ -[main] -host = https://www.transifex.com - -[o:BGL:p:BGL:r:qt-translation-027x] -file_filter = src/qt/locale/BGL_.xlf -source_file = src/qt/locale/BGL_en.xlf -source_lang = en diff --git a/.venv/lib/python3.8/site-packages/pip/__pip-runner__.py b/.venv/lib/python3.8/site-packages/pip/__pip-runner__.py deleted file mode 100644 index 49a148a097..0000000000 --- a/.venv/lib/python3.8/site-packages/pip/__pip-runner__.py +++ /dev/null @@ -1,50 +0,0 @@ -"""Execute exactly this copy of pip, within a different environment. - -This file is named as it is, to ensure that this module can't be imported via -an import statement. -""" - -# /!\ This version compatibility check section must be Python 2 compatible. /!\ - -import sys - -# Copied from setup.py -PYTHON_REQUIRES = (3, 7) - - -def version_str(version): # type: ignore - return ".".join(str(v) for v in version) - - -if sys.version_info[:2] < PYTHON_REQUIRES: - raise SystemExit( - "This version of pip does not support python {} (requires >={}).".format( - version_str(sys.version_info[:2]), version_str(PYTHON_REQUIRES) - ) - ) - -# From here on, we can use Python 3 features, but the syntax must remain -# Python 2 compatible. - -import runpy # noqa: E402 -from importlib.machinery import PathFinder # noqa: E402 -from os.path import dirname # noqa: E402 - -PIP_SOURCES_ROOT = dirname(dirname(__file__)) - - -class PipImportRedirectingFinder: - @classmethod - def find_spec(self, fullname, path=None, target=None): # type: ignore - if fullname != "pip": - return None - - spec = PathFinder.find_spec(fullname, [PIP_SOURCES_ROOT], target) - assert spec, (PIP_SOURCES_ROOT, fullname) - return spec - - -sys.meta_path.insert(0, PipImportRedirectingFinder()) - -assert __name__ == "__main__", "Cannot run __pip-runner__.py as a non-main module" -runpy.run_module("pip", run_name="__main__", alter_sys=True) diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index a2855912fd..0000000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,139 +0,0 @@ -# Changelog - -All notable changes to this project will be documented in this file. - -The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), -and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - -## [Unreleased] - -## [0.5.0] - 2024-05-06 - -#### Added - - New function `secp256k1_ec_pubkey_sort` that sorts public keys using lexicographic (of compressed serialization) order. - -#### Changed - - The implementation of the point multiplication algorithm used for signing and public key generation was changed, resulting in improved performance for those operations. - - The related configure option `--ecmult-gen-precision` was replaced with `--ecmult-gen-kb` (`ECMULT_GEN_KB` for CMake). - - This changes the supported precomputed table sizes for these operations. The new supported sizes are 2 KiB, 22 KiB, or 86 KiB (while the old supported sizes were 32 KiB, 64 KiB, or 512 KiB). - -#### ABI Compatibility -The ABI is backward compatible with versions 0.4.x and 0.3.x. - -## [0.4.1] - 2023-12-21 - -#### Changed - - The point multiplication algorithm used for ECDH operations (module `ecdh`) was replaced with a slightly faster one. - - Optional handwritten x86_64 assembly for field operations was removed because modern C compilers are able to output more efficient assembly. This change results in a significant speedup of some library functions when handwritten x86_64 assembly is enabled (`--with-asm=x86_64` in GNU Autotools, `-DSECP256K1_ASM=x86_64` in CMake), which is the default on x86_64. Benchmarks with GCC 10.5.0 show a 10% speedup for `secp256k1_ecdsa_verify` and `secp256k1_schnorrsig_verify`. - -#### ABI Compatibility -The ABI is backward compatible with versions 0.4.0 and 0.3.x. - -## [0.4.0] - 2023-09-04 - -#### Added - - New module `ellswift` implements ElligatorSwift encoding for public keys and x-only Diffie-Hellman key exchange for them. - ElligatorSwift permits representing secp256k1 public keys as 64-byte arrays which cannot be distinguished from uniformly random. See: - - Header file `include/secp256k1_ellswift.h` which defines the new API. - - Document `doc/ellswift.md` which explains the mathematical background of the scheme. - - The [paper](https://eprint.iacr.org/2022/759) on which the scheme is based. - - We now test the library with unreleased development snapshots of GCC and Clang. This gives us an early chance to catch miscompilations and constant-time issues introduced by the compiler (such as those that led to the previous two releases). - -#### Fixed - - Fixed symbol visibility in Windows DLL builds, where three internal library symbols were wrongly exported. - -#### Changed - - When consuming libsecp256k1 as a static library on Windows, the user must now define the `SECP256K1_STATIC` macro before including `secp256k1.h`. - -#### ABI Compatibility -This release is backward compatible with the ABI of 0.3.0, 0.3.1, and 0.3.2. Symbol visibility is now believed to be handled properly on supported platforms and is now considered to be part of the ABI. Please report any improperly exported symbols as a bug. - -## [0.3.2] - 2023-05-13 -We strongly recommend updating to 0.3.2 if you use or plan to use GCC >=13 to compile libsecp256k1. When in doubt, check the GCC version using `gcc -v`. - -#### Security - - Module `ecdh`: Fix "constant-timeness" issue with GCC 13.1 (and potentially future versions of GCC) that could leave applications using libsecp256k1's ECDH module vulnerable to a timing side-channel attack. The fix avoids secret-dependent control flow during ECDH computations when libsecp256k1 is compiled with GCC 13.1. - -#### Fixed - - Fixed an old bug that permitted compilers to potentially output bad assembly code on x86_64. In theory, it could lead to a crash or a read of unrelated memory, but this has never been observed on any compilers so far. - -#### Changed - - Various improvements and changes to CMake builds. CMake builds remain experimental. - - Made API versioning consistent with GNU Autotools builds. - - Switched to `BUILD_SHARED_LIBS` variable for controlling whether to build a static or a shared library. - - Added `SECP256K1_INSTALL` variable for the controlling whether to install the build artefacts. - - Renamed asm build option `arm` to `arm32`. Use `--with-asm=arm32` instead of `--with-asm=arm` (GNU Autotools), and `-DSECP256K1_ASM=arm32` instead of `-DSECP256K1_ASM=arm` (CMake). - -#### ABI Compatibility -The ABI is compatible with versions 0.3.0 and 0.3.1. - -## [0.3.1] - 2023-04-10 -We strongly recommend updating to 0.3.1 if you use or plan to use Clang >=14 to compile libsecp256k1, e.g., Xcode >=14 on macOS has Clang >=14. When in doubt, check the Clang version using `clang -v`. - -#### Security - - Fix "constant-timeness" issue with Clang >=14 that could leave applications using libsecp256k1 vulnerable to a timing side-channel attack. The fix avoids secret-dependent control flow and secret-dependent memory accesses in conditional moves of memory objects when libsecp256k1 is compiled with Clang >=14. - -#### Added - - Added tests against [Project Wycheproof's](https://github.com/google/wycheproof/) set of ECDSA test vectors (Bitcoin "low-S" variant), a fixed set of test cases designed to trigger various edge cases. - -#### Changed - - Increased minimum required CMake version to 3.13. CMake builds remain experimental. - -#### ABI Compatibility -The ABI is compatible with version 0.3.0. - -## [0.3.0] - 2023-03-08 - -#### Added - - Added experimental support for CMake builds. Traditional GNU Autotools builds (`./configure` and `make`) remain fully supported. - - Usage examples: Added a recommended method for securely clearing sensitive data, e.g., secret keys, from memory. - - Tests: Added a new test binary `noverify_tests`. This binary runs the tests without some additional checks present in the ordinary `tests` binary and is thereby closer to production binaries. The `noverify_tests` binary is automatically run as part of the `make check` target. - -#### Fixed - - Fixed declarations of API variables for MSVC (`__declspec(dllimport)`). This fixes MSVC builds of programs which link against a libsecp256k1 DLL dynamically and use API variables (and not only API functions). Unfortunately, the MSVC linker now will emit warning `LNK4217` when trying to link against libsecp256k1 statically. Pass `/ignore:4217` to the linker to suppress this warning. - -#### Changed - - Forbade cloning or destroying `secp256k1_context_static`. Create a new context instead of cloning the static context. (If this change breaks your code, your code is probably wrong.) - - Forbade randomizing (copies of) `secp256k1_context_static`. Randomizing a copy of `secp256k1_context_static` did not have any effect and did not provide defense-in-depth protection against side-channel attacks. Create a new context if you want to benefit from randomization. - -#### Removed - - Removed the configuration header `src/libsecp256k1-config.h`. We recommend passing flags to `./configure` or `cmake` to set configuration options (see `./configure --help` or `cmake -LH`). If you cannot or do not want to use one of the supported build systems, pass configuration flags such as `-DSECP256K1_ENABLE_MODULE_SCHNORRSIG` manually to the compiler (see the file `configure.ac` for supported flags). - -#### ABI Compatibility -Due to changes in the API regarding `secp256k1_context_static` described above, the ABI is *not* compatible with previous versions. - -## [0.2.0] - 2022-12-12 - -#### Added - - Added usage examples for common use cases in a new `examples/` directory. - - Added `secp256k1_selftest`, to be used in conjunction with `secp256k1_context_static`. - - Added support for 128-bit wide multiplication on MSVC for x86_64 and arm64, giving roughly a 20% speedup on those platforms. - -#### Changed - - Enabled modules `schnorrsig`, `extrakeys` and `ecdh` by default in `./configure`. - - The `secp256k1_nonce_function_rfc6979` nonce function, used by default by `secp256k1_ecdsa_sign`, now reduces the message hash modulo the group order to match the specification. This only affects improper use of ECDSA signing API. - -#### Deprecated - - Deprecated context flags `SECP256K1_CONTEXT_VERIFY` and `SECP256K1_CONTEXT_SIGN`. Use `SECP256K1_CONTEXT_NONE` instead. - - Renamed `secp256k1_context_no_precomp` to `secp256k1_context_static`. - - Module `schnorrsig`: renamed `secp256k1_schnorrsig_sign` to `secp256k1_schnorrsig_sign32`. - -#### ABI Compatibility -Since this is the first release, we do not compare application binary interfaces. -However, there are earlier unreleased versions of libsecp256k1 that are *not* ABI compatible with this version. - -## [0.1.0] - 2013-03-05 to 2021-12-25 - -This version was in fact never released. -The number was given by the build system since the introduction of autotools in Jan 2014 (ea0fe5a5bf0c04f9cc955b2966b614f5f378c6f6). -Therefore, this version number does not uniquely identify a set of source files. - -[unreleased]: https://github.com/bitcoin-core/secp256k1/compare/v0.5.0...HEAD -[0.5.0]: https://github.com/bitcoin-core/secp256k1/compare/v0.4.1...v0.5.0 -[0.4.1]: https://github.com/bitcoin-core/secp256k1/compare/v0.4.0...v0.4.1 -[0.4.0]: https://github.com/bitcoin-core/secp256k1/compare/v0.3.2...v0.4.0 -[0.3.2]: https://github.com/bitcoin-core/secp256k1/compare/v0.3.1...v0.3.2 -[0.3.1]: https://github.com/bitcoin-core/secp256k1/compare/v0.3.0...v0.3.1 -[0.3.0]: https://github.com/bitcoin-core/secp256k1/compare/v0.2.0...v0.3.0 -[0.2.0]: https://github.com/bitcoin-core/secp256k1/compare/423b6d19d373f1224fd671a982584d7e7900bc93..v0.2.0 -[0.1.0]: https://github.com/bitcoin-core/secp256k1/commit/423b6d19d373f1224fd671a982584d7e7900bc93 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 2e0b906ff2..0000000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,410 +0,0 @@ -# Contributing to libsecp256k1 - -## Scope - -libsecp256k1 is a library for elliptic curve cryptography on the curve secp256k1, not a general-purpose cryptography library. -The library primarily serves the needs of the Bitcoin Core project but provides additional functionality for the benefit of the wider Bitcoin ecosystem. - -## Adding new functionality or modules - -The libsecp256k1 project welcomes contributions in the form of new functionality or modules, provided they are within the project's scope. - -It is the responsibility of the contributors to convince the maintainers that the proposed functionality is within the project's scope, high-quality and maintainable. -Contributors are recommended to provide the following in addition to the new code: - -* **Specification:** - A specification can help significantly in reviewing the new code as it provides documentation and context. - It may justify various design decisions, give a motivation and outline security goals. - If the specification contains pseudocode, a reference implementation or test vectors, these can be used to compare with the proposed libsecp256k1 code. -* **Security Arguments:** - In addition to a defining the security goals, it should be argued that the new functionality meets these goals. - Depending on the nature of the new functionality, a wide range of security arguments are acceptable, ranging from being "obviously secure" to rigorous proofs of security. -* **Relevance Arguments:** - The relevance of the new functionality for the Bitcoin ecosystem should be argued by outlining clear use cases. - -These are not the only factors taken into account when considering to add new functionality. -The proposed new libsecp256k1 code must be of high quality, including API documentation and tests, as well as featuring a misuse-resistant API design. - -We recommend reaching out to other contributors (see [Communication Channels](#communication-channels)) and get feedback before implementing new functionality. - -## Communication channels - -Most communication about libsecp256k1 occurs on the GitHub repository: in issues, pull request or on the discussion board. - -Additionally, there is an IRC channel dedicated to libsecp256k1, with biweekly meetings (see channel topic). -The channel is `#secp256k1` on Libera Chat. -The easiest way to participate on IRC is with the web client, [web.libera.chat](https://web.libera.chat/#secp256k1). -Chat history logs can be found at https://gnusha.org/secp256k1/. - -## Contributor workflow & peer review - -The Contributor Workflow & Peer Review in libsecp256k1 are similar to Bitcoin Core's workflow and review processes described in its [CONTRIBUTING.md](https://github.com/bitcoin/bitcoin/blob/master/CONTRIBUTING.md). - -### Coding conventions - -In addition, libsecp256k1 tries to maintain the following coding conventions: - -* No runtime heap allocation (e.g., no `malloc`) unless explicitly requested by the caller (via `secp256k1_context_create` or `secp256k1_scratch_space_create`, for example). Moreover, it should be possible to use the library without any heap allocations. -* The tests should cover all lines and branches of the library (see [Test coverage](#coverage)). -* Operations involving secret data should be tested for being constant time with respect to the secrets (see [src/ctime_tests.c](src/ctime_tests.c)). -* Local variables containing secret data should be cleared explicitly to try to delete secrets from memory. -* Use `secp256k1_memcmp_var` instead of `memcmp` (see [#823](https://github.com/bitcoin-core/secp256k1/issues/823)). - -#### Style conventions - -* Commits should be atomic and diffs should be easy to read. For this reason, do not mix any formatting fixes or code moves with actual code changes. Make sure each individual commit is hygienic: that it builds successfully on its own without warnings, errors, regressions, or test failures. -* New code should adhere to the style of existing, in particular surrounding, code. Other than that, we do not enforce strict rules for code formatting. -* The code conforms to C89. Most notably, that means that only `/* ... */` comments are allowed (no `//` line comments). Moreover, any declarations in a `{ ... }` block (e.g., a function) must appear at the beginning of the block before any statements. When you would like to declare a variable in the middle of a block, you can open a new block: - ```C - void secp256k_foo(void) { - unsigned int x; /* declaration */ - int y = 2*x; /* declaration */ - x = 17; /* statement */ - { - int a, b; /* declaration */ - a = x + y; /* statement */ - secp256k_bar(x, &b); /* statement */ - } - } - ``` -* Use `unsigned int` instead of just `unsigned`. -* Use `void *ptr` instead of `void* ptr`. -* Arguments of the publicly-facing API must have a specific order defined in [include/secp256k1.h](include/secp256k1.h). -* User-facing comment lines in headers should be limited to 80 chars if possible. -* All identifiers in file scope should start with `secp256k1_`. -* Avoid trailing whitespace. - -### Tests - -#### Coverage - -This library aims to have full coverage of reachable lines and branches. - -To create a test coverage report, configure with `--enable-coverage` (use of GCC is necessary): - - $ ./configure --enable-coverage - -Run the tests: - - $ make check - -To create a report, `gcovr` is recommended, as it includes branch coverage reporting: - - $ gcovr --exclude 'src/bench*' --print-summary - -To create a HTML report with coloured and annotated source code: - - $ mkdir -p coverage - $ gcovr --exclude 'src/bench*' --html --html-details -o coverage/coverage.html - -#### Exhaustive tests - -There are tests of several functions in which a small group replaces secp256k1. -These tests are *exhaustive* since they provide all elements and scalars of the small group as input arguments (see [src/tests_exhaustive.c](src/tests_exhaustive.c)). - -### Benchmarks - -The title of the pull request should be prefixed by the component or area that -the pull request affects. Valid areas as: - - - `consensus` for changes to consensus critical code - - `doc` for changes to the documentation - - `qt` or `gui` for changes to bitcoin-qt - - `log` for changes to log messages - - `mining` for changes to the mining code - - `net` or `p2p` for changes to the peer-to-peer network code - - `refactor` for structural changes that do not change behavior - - `rpc`, `rest` or `zmq` for changes to the RPC, REST or ZMQ APIs - - `contrib` or `cli` for changes to the scripts and tools - - `test`, `qa` or `ci` for changes to the unit tests, QA tests or CI code - - `util` or `lib` for changes to the utils or libraries - - `wallet` for changes to the wallet code - - `build` for changes to the GNU Autotools or MSVC builds - - `guix` for changes to the GUIX reproducible builds - -Examples: - - consensus: Add new opcode for BIP-XXXX OP_CHECKAWESOMESIG - net: Automatically create onion service, listen on Tor - qt: Add feed bump button - log: Fix typo in log message - -The body of the pull request should contain sufficient description of *what* the -patch does, and even more importantly, *why*, with justification and reasoning. -You should include references to any discussions (for example, other issues or -mailing list discussions). - -The description for a new pull request should not contain any `@` mentions. The -PR description will be included in the commit message when the PR is merged and -any users mentioned in the description will be annoyingly notified each time a -fork of Bitcoin Core copies the merge. Instead, make any username mentions in a -subsequent comment to the PR. - -### Translation changes - -Note that translations should not be submitted as pull requests. Please see -[Translation Process](https://github.com/bitcoin/bitcoin/blob/master/doc/translation_process.md) -for more information on helping with translations. - -### Work in Progress Changes and Requests for Comments - -If a pull request is not to be considered for merging (yet), please -prefix the title with [WIP] or use [Tasks Lists](https://docs.github.com/en/github/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#task-lists) -in the body of the pull request to indicate tasks are pending. - -### Address Feedback - -At this stage, one should expect comments and review from other contributors. You -can add more commits to your pull request by committing them locally and pushing -to your fork. - -You are expected to reply to any review comments before your pull request is -merged. You may update the code or reject the feedback if you do not agree with -it, but you should express so in a reply. If there is outstanding feedback and -you are not actively working on it, your pull request may be closed. - -Please refer to the [peer review](#peer-review) section below for more details. - -### Squashing Commits - -If your pull request contains fixup commits (commits that change the same line of code repeatedly) or too fine-grained -commits, you may be asked to [squash](https://git-scm.com/docs/git-rebase#_interactive_mode) your commits -before it will be reviewed. The basic squashing workflow is shown below. - - git checkout your_branch_name - git rebase -i HEAD~n - # n is normally the number of commits in the pull request. - # Set commits (except the one in the first line) from 'pick' to 'squash', save and quit. - # On the next screen, edit/refine commit messages. - # Save and quit. - git push -f # (force push to GitHub) - -Please update the resulting commit message, if needed. It should read as a -coherent message. In most cases, this means not just listing the interim -commits. - -If your change contains a merge commit, the above workflow may not work and you -will need to remove the merge commit first. See the next section for details on -how to rebase. - -Please refrain from creating several pull requests for the same change. -Use the pull request that is already open (or was created earlier) to amend -changes. This preserves the discussion and review that happened earlier for -the respective change set. - -The length of time required for peer review is unpredictable and will vary from -pull request to pull request. - -### Rebasing Changes - -When a pull request conflicts with the target branch, you may be asked to rebase it on top of the current target branch. - - git fetch https://github.com/bitcoin/bitcoin # Fetch the latest upstream commit - git rebase FETCH_HEAD # Rebuild commits on top of the new base - -This project aims to have a clean git history, where code changes are only made in non-merge commits. This simplifies -auditability because merge commits can be assumed to not contain arbitrary code changes. Merge commits should be signed, -and the resulting git tree hash must be deterministic and reproducible. The script in -[/contrib/verify-commits](/contrib/verify-commits) checks that. - -After a rebase, reviewers are encouraged to sign off on the force push. This should be relatively straightforward with -the `git range-diff` tool explained in the [productivity -notes](/doc/productivity.md#diff-the-diffs-with-git-range-diff). To avoid needless review churn, maintainers will -generally merge pull requests that received the most review attention first. - -Pull Request Philosophy ------------------------ - -Patchsets should always be focused. For example, a pull request could add a -feature, fix a bug, or refactor code; but not a mixture. Please also avoid super -pull requests which attempt to do too much, are overly large, or overly complex -as this makes review difficult. - - -### Features - -When adding a new feature, thought must be given to the long term technical debt -and maintenance that feature may require after inclusion. Before proposing a new -feature that will require maintenance, please consider if you are willing to -maintain it (including bug fixing). If features get orphaned with no maintainer -in the future, they may be removed by the Repository Maintainer. - - -### Refactoring - -Refactoring is a necessary part of any software project's evolution. The -following guidelines cover refactoring pull requests for the project. - -There are three categories of refactoring: code-only moves, code style fixes, and -code refactoring. In general, refactoring pull requests should not mix these -three kinds of activities in order to make refactoring pull requests easy to -review and uncontroversial. In all cases, refactoring PRs must not change the -behaviour of code within the pull request (bugs must be preserved as is). - -Project maintainers aim for a quick turnaround on refactoring pull requests, so -where possible keep them short, uncomplex and easy to verify. - -Pull requests that refactor the code should not be made by new contributors. It -requires a certain level of experience to know where the code belongs to and to -understand the full ramification (including rebase effort of open pull requests). - -Trivial pull requests or pull requests that refactor the code with no clear -benefits may be immediately closed by the maintainers to reduce unnecessary -workload on reviewing. - - -"Decision Making" Process -------------------------- - -The following applies to code changes to the Bitcoin Core project (and related -projects such as libsecp256k1), and is not to be confused with overall Bitcoin -Network Protocol consensus changes. - -Whether a pull request is merged into Bitcoin Core rests with the project merge -maintainers. - -Maintainers will take into consideration if a patch is in line with the general -principles of the project; meets the minimum standards for inclusion; and will -judge the general consensus of contributors. - -In general, all pull requests must: - - - Have a clear use case, fix a demonstrable bug or serve the greater good of - the project (for example refactoring for modularisation); - - Be well peer-reviewed; - - Have unit tests, functional tests, and fuzz tests, where appropriate; - - Follow code style guidelines ([C++](doc/developer-notes.md), [functional tests](test/functional/README.md)); - - Not break the existing test suite; - - Where bugs are fixed, where possible, there should be unit tests - demonstrating the bug and also proving the fix. This helps prevent regression. - - Change relevant comments and documentation when behaviour of code changes. - -Patches that change Bitcoin consensus rules are considerably more involved than -normal because they affect the entire ecosystem and so must be preceded by -extensive mailing list discussions and have a numbered BIP. While each case will -be different, one should be prepared to expend more time and effort than for -other kinds of patches because of increased peer review and consensus building -requirements. - - -### Peer Review - -Anyone may participate in peer review which is expressed by comments in the pull -request. Typically reviewers will review the code for obvious errors, as well as -test out the patch set and opine on the technical merits of the patch. Project -maintainers take into account the peer review when determining if there is -consensus to merge a pull request (remember that discussions may have been -spread out over GitHub, mailing list and IRC discussions). - -Code review is a burdensome but important part of the development process, and -as such, certain types of pull requests are rejected. In general, if the -**improvements** do not warrant the **review effort** required, the PR has a -high chance of being rejected. It is up to the PR author to convince the -reviewers that the changes warrant the review effort, and if reviewers are -"Concept NACK'ing" the PR, the author may need to present arguments and/or do -research backing their suggested changes. - -#### Conceptual Review - -A review can be a conceptual review, where the reviewer leaves a comment - * `Concept (N)ACK`, meaning "I do (not) agree with the general goal of this pull - request", - * `Approach (N)ACK`, meaning `Concept ACK`, but "I do (not) agree with the - approach of this change". - -A `NACK` needs to include a rationale why the change is not worthwhile. -NACKs without accompanying reasoning may be disregarded. - -#### Code Review - -After conceptual agreement on the change, code review can be provided. A review -begins with `ACK BRANCH_COMMIT`, where `BRANCH_COMMIT` is the top of the PR -branch, followed by a description of how the reviewer did the review. The -following language is used within pull request comments: - - - "I have tested the code", involving change-specific manual testing in - addition to running the unit, functional, or fuzz tests, and in case it is - not obvious how the manual testing was done, it should be described; - - "I have not tested the code, but I have reviewed it and it looks - OK, I agree it can be merged"; - - A "nit" refers to a trivial, often non-blocking issue. - -Project maintainers reserve the right to weigh the opinions of peer reviewers -using common sense judgement and may also weigh based on merit. Reviewers that -have demonstrated a deeper commitment and understanding of the project over time -or who have clear domain expertise may naturally have more weight, as one would -expect in all walks of life. - -Where a patch set affects consensus-critical code, the bar will be much -higher in terms of discussion and peer review requirements, keeping in mind that -mistakes could be very costly to the wider community. This includes refactoring -of consensus-critical code. - -Where a patch set proposes to change the Bitcoin consensus, it must have been -discussed extensively on the mailing list and IRC, be accompanied by a widely -discussed BIP and have a generally widely perceived technical consensus of being -a worthwhile change based on the judgement of the maintainers. - -### Finding Reviewers - -As most reviewers are themselves developers with their own projects, the review -process can be quite lengthy, and some amount of patience is required. If you find -that you've been waiting for a pull request to be given attention for several -months, there may be a number of reasons for this, some of which you can do something -about: - - - It may be because of a feature freeze due to an upcoming release. During this time, - only bug fixes are taken into consideration. If your pull request is a new feature, - it will not be prioritized until after the release. Wait for the release. - - It may be because the changes you are suggesting do not appeal to people. Rather than - nits and critique, which require effort and means they care enough to spend time on your - contribution, thundering silence is a good sign of widespread (mild) dislike of a given change - (because people don't assume *others* won't actually like the proposal). Don't take - that personally, though! Instead, take another critical look at what you are suggesting - and see if it: changes too much, is too broad, doesn't adhere to the - [developer notes](doc/developer-notes.md), is dangerous or insecure, is messily written, etc. - Identify and address any of the issues you find. Then ask e.g. on IRC if someone could give - their opinion on the concept itself. - - It may be because your code is too complex for all but a few people, and those people - may not have realized your pull request even exists. A great way to find people who - are qualified and care about the code you are touching is the - [Git Blame feature](https://docs.github.com/en/github/managing-files-in-a-repository/managing-files-on-github/tracking-changes-in-a-file). Simply - look up who last modified the code you are changing and see if you can find - them and give them a nudge. Don't be incessant about the nudging, though. - - Finally, if all else fails, ask on IRC or elsewhere for someone to give your pull request - a look. If you think you've been waiting for an unreasonably long time (say, - more than a month) for no particular reason (a few lines changed, etc.), - this is totally fine. Try to return the favor when someone else is asking - for feedback on their code, and the universe balances out. - - Remember that the best thing you can do while waiting is give review to others! - - -Backporting ------------ - -Security and bug fixes can be backported from `master` to release -branches. -Maintainers will do backports in batches and -use the proper `Needs backport (...)` labels -when needed (the original author does not need to worry about it). - -A backport should contain the following metadata in the commit body: - -``` -Github-Pull: # -Rebased-From: -``` - -Have a look at [an example backport PR]( -https://github.com/bitcoin/bitcoin/pull/16189). - -Also see the [backport.py script]( -https://github.com/bitcoin-core/bitcoin-maintainer-tools#backport). - -Copyright ---------- - -By contributing to this repository, you agree to license your work under the -MIT license unless specified otherwise in `contrib/debian/copyright` or at -the top of the file itself. Any work contributed where you are not the original -author must contain its license header with the original author(s) and source. diff --git a/COPYING b/COPYING deleted file mode 100644 index e6d6e9fe57..0000000000 --- a/COPYING +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2009-2024 The Bitcoin Core developers -Copyright (c) 2009-2024 Bitcoin Developers - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/INSTALL.md b/INSTALL.md deleted file mode 100644 index b591b8a666..0000000000 --- a/INSTALL.md +++ /dev/null @@ -1,2 +0,0 @@ - -See [doc/build-\*.md](/doc) diff --git a/Makefile.am b/Makefile.am deleted file mode 100644 index 5af4dd3bc5..0000000000 --- a/Makefile.am +++ /dev/null @@ -1,347 +0,0 @@ -# Copyright (c) 2013-2020 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -# Pattern rule to print variables, e.g. make print-top_srcdir -print-%: FORCE - @echo '$*'='$($*)' - -ACLOCAL_AMFLAGS = -I build-aux/m4 -SUBDIRS = src -if ENABLE_MAN -SUBDIRS += doc/man -endif -.PHONY: deploy FORCE -.INTERMEDIATE: $(COVERAGE_INFO) - -BGLD_BIN=$(top_builddir)/src/$(BGL_DAEMON_NAME)$(EXEEXT) -BGL_QT_BIN=$(top_builddir)/src/qt/$(BGL_GUI_NAME)$(EXEEXT) -BGL_TEST_BIN=$(top_builddir)/src/test/$(BGL_TEST_NAME)$(EXEEXT) -BGL_CLI_BIN=$(top_builddir)/src/$(BGL_CLI_NAME)$(EXEEXT) -BGL_TX_BIN=$(top_builddir)/src/$(BGL_TX_NAME)$(EXEEXT) -BGL_UTIL_BIN=$(top_builddir)/src/$(BGL_UTIL_NAME)$(EXEEXT) -BGL_WALLET_BIN=$(top_builddir)/src/$(BGL_WALLET_TOOL_NAME)$(EXEEXT) -BGL_NODE_BIN=$(top_builddir)/src/$(BGL_MP_NODE_NAME)$(EXEEXT) -BGL_GUI_BIN=$(top_builddir)/src/$(BGL_MP_GUI_NAME)$(EXEEXT) -BGL_WIN_INSTALLER=$(PACKAGE)-$(PACKAGE_VERSION)-win64-setup$(EXEEXT) - -empty := -space := $(empty) $(empty) - -OSX_APP=BGL-Qt.app -OSX_VOLNAME = $(subst $(space),-,$(PACKAGE_NAME)) -OSX_ZIP = $(OSX_VOLNAME).zip -OSX_DEPLOY_SCRIPT=$(top_srcdir)/contrib/macdeploy/macdeployqtplus -OSX_INSTALLER_ICONS=$(top_srcdir)/src/qt/res/icons/BGL.icns -OSX_PLIST=$(top_builddir)/share/qt/Info.plist #not installed - -DIST_CONTRIB = \ - $(top_srcdir)/test/sanitizer_suppressions/lsan \ - $(top_srcdir)/test/sanitizer_suppressions/tsan \ - $(top_srcdir)/test/sanitizer_suppressions/ubsan \ - $(top_srcdir)/contrib/linearize/linearize-data.py \ - $(top_srcdir)/contrib/linearize/linearize-hashes.py \ - $(top_srcdir)/contrib/signet/miner - -DIST_SHARE = \ - $(top_srcdir)/share/genbuild.sh \ - $(top_srcdir)/share/rpcauth - -BIN_CHECKS=$(top_srcdir)/contrib/devtools/symbol-check.py \ - $(top_srcdir)/contrib/devtools/security-check.py \ - $(top_srcdir)/contrib/devtools/utils.py - -WINDOWS_PACKAGING = $(top_srcdir)/share/pixmaps/BGL.ico \ - $(top_srcdir)/share/pixmaps/nsis-header.bmp \ - $(top_srcdir)/share/pixmaps/nsis-wizard.bmp \ - $(top_srcdir)/doc/README_windows.txt - -OSX_PACKAGING = $(OSX_DEPLOY_SCRIPT) $(OSX_INSTALLER_ICONS) \ - $(top_srcdir)/contrib/macdeploy/detached-sig-create.sh - -COVERAGE_INFO = $(COV_TOOL_WRAPPER) baseline.info \ - test_BGL_filtered.info total_coverage.info \ - baseline_filtered.info functional_test.info functional_test_filtered.info \ - test_BGL_coverage.info test_BGL.info fuzz.info fuzz_filtered.info fuzz_coverage.info - -dist-hook: - -$(GIT) archive --format=tar HEAD -- src/clientversion.cpp | $(AMTAR) -C $(top_distdir) -xf - - -if TARGET_WINDOWS -$(BGL_WIN_INSTALLER): all-recursive - $(MKDIR_P) $(top_builddir)/release - STRIPPROG="$(STRIP)" $(INSTALL_STRIP_PROGRAM) $(BGLD_BIN) $(top_builddir)/release - STRIPPROG="$(STRIP)" $(INSTALL_STRIP_PROGRAM) $(BGL_QT_BIN) $(top_builddir)/release - STRIPPROG="$(STRIP)" $(INSTALL_STRIP_PROGRAM) $(BGL_TEST_BIN) $(top_builddir)/release - STRIPPROG="$(STRIP)" $(INSTALL_STRIP_PROGRAM) $(BGL_CLI_BIN) $(top_builddir)/release - STRIPPROG="$(STRIP)" $(INSTALL_STRIP_PROGRAM) $(BGL_TX_BIN) $(top_builddir)/release - STRIPPROG="$(STRIP)" $(INSTALL_STRIP_PROGRAM) $(BGL_WALLET_BIN) $(top_builddir)/release - STRIPPROG="$(STRIP)" $(INSTALL_STRIP_PROGRAM) $(BGL_UTIL_BIN) $(top_builddir)/release - @test -f $(MAKENSIS) && echo 'OutFile "$@"' | cat $(top_builddir)/share/setup.nsi - | $(MAKENSIS) -V2 - || \ - echo error: could not build $@ - @echo built $@ - -deploy: $(BGL_WIN_INSTALLER) -endif - -if TARGET_DARWIN -$(OSX_APP)/Contents/PkgInfo: - $(MKDIR_P) $(@D) - @echo "APPL????" > $@ - -$(OSX_APP)/Contents/Resources/empty.lproj: - $(MKDIR_P) $(@D) - @touch $@ - -$(OSX_APP)/Contents/Info.plist: $(OSX_PLIST) - $(MKDIR_P) $(@D) - $(INSTALL_DATA) $< $@ - -$(OSX_APP)/Contents/Resources/BGL.icns: $(OSX_INSTALLER_ICONS) - $(MKDIR_P) $(@D) - $(INSTALL_DATA) $< $@ - -$(OSX_APP)/Contents/MacOS/BGL-Qt: all-recursive - $(MKDIR_P) $(@D) - STRIPPROG="$(STRIP)" $(INSTALL_STRIP_PROGRAM) $(BGL_QT_BIN) $@ - -$(OSX_APP)/Contents/Resources/Base.lproj/InfoPlist.strings: - $(MKDIR_P) $(@D) - echo '{ CFBundleDisplayName = "$(PACKAGE_NAME)"; CFBundleName = "$(PACKAGE_NAME)"; }' > $@ - -OSX_APP_BUILT=$(OSX_APP)/Contents/PkgInfo $(OSX_APP)/Contents/Resources/empty.lproj \ - $(OSX_APP)/Contents/Resources/BGL.icns $(OSX_APP)/Contents/Info.plist \ - $(OSX_APP)/Contents/MacOS/BGL-Qt $(OSX_APP)/Contents/Resources/Base.lproj/InfoPlist.strings - -if BUILD_DARWIN -$(OSX_ZIP): $(OSX_APP_BUILT) $(OSX_PACKAGING) - $(PYTHON) $(OSX_DEPLOY_SCRIPT) $(OSX_APP) $(OSX_VOLNAME) -translations-dir=$(QT_TRANSLATION_DIR) -zip - -deploydir: $(OSX_ZIP) -else !BUILD_DARWIN -APP_DIST_DIR=$(top_builddir)/dist - -$(OSX_ZIP): deploydir - if [ -n "$(SOURCE_DATE_EPOCH)" ]; then find $(APP_DIST_DIR) -exec touch -d @$(SOURCE_DATE_EPOCH) {} +; fi - cd $(APP_DIST_DIR) && find . | sort | $(ZIP) -X@ $@ - -$(APP_DIST_DIR)/$(OSX_APP)/Contents/MacOS/BGL-Qt: $(OSX_APP_BUILT) $(OSX_PACKAGING) - OBJDUMP=$(OBJDUMP) $(PYTHON) $(OSX_DEPLOY_SCRIPT) $(OSX_APP) $(OSX_VOLNAME) -translations-dir=$(QT_TRANSLATION_DIR) - -deploydir: $(APP_DIST_DIR)/$(OSX_APP)/Contents/MacOS/BGL-Qt -endif !BUILD_DARWIN - -deploy: $(OSX_ZIP) -endif - -$(BGL_QT_BIN): FORCE - $(MAKE) -C src qt/$(@F) - -$(BGLD_BIN): FORCE - $(MAKE) -C src $(@F) - -$(BGL_CLI_BIN): FORCE - $(MAKE) -C src $(@F) - -$(BGL_TX_BIN): FORCE - $(MAKE) -C src $(@F) - -$(BGL_UTIL_BIN): FORCE - $(MAKE) -C src $(@F) - -$(BGL_WALLET_BIN): FORCE - $(MAKE) -C src $(@F) - -$(BGL_NODE_BIN): FORCE - $(MAKE) -C src $(@F) - -$(BGL_GUI_BIN): FORCE - $(MAKE) -C src $(@F) - -if USE_LCOV -LCOV_FILTER_PATTERN = \ - -p "/usr/local/" \ - -p "/usr/include/" \ - -p "/usr/lib/" \ - -p "/usr/lib64/" \ - -p "src/leveldb/" \ - -p "src/crc32c/" \ - -p "src/bench/" \ - -p "src/crypto/ctaes" \ - -p "src/minisketch" \ - -p "src/secp256k1" \ - -p "depends" - -DIR_FUZZ_SEED_CORPUS ?= qa-assets/fuzz_seed_corpus - -$(COV_TOOL_WRAPPER): - @echo 'exec $(COV_TOOL) "$$@"' > $(COV_TOOL_WRAPPER) - @chmod +x $(COV_TOOL_WRAPPER) - -baseline.info: $(COV_TOOL_WRAPPER) - $(LCOV) $(LCOV_OPTS) -c -i -d $(abs_builddir)/src -o $@ - -baseline_filtered.info: baseline.info - $(abs_builddir)/contrib/filter-lcov.py $(LCOV_FILTER_PATTERN) $< $@ - $(LCOV) -a $@ $(LCOV_OPTS) -o $@ - -fuzz.info: baseline_filtered.info - @test/fuzz/test_runner.py $(DIR_FUZZ_SEED_CORPUS) -l DEBUG - $(LCOV) -c $(LCOV_OPTS) -d $(abs_builddir)/src --t fuzz-tests -o $@ - $(LCOV) -z $(LCOV_OPTS) -d $(abs_builddir)/src - -fuzz_filtered.info: fuzz.info - $(abs_builddir)/contrib/filter-lcov.py $(LCOV_FILTER_PATTERN) $< $@ - $(LCOV) -a $@ $(LCOV_OPTS) -o $@ - -test_BGL.info: baseline_filtered.info - $(MAKE) -C src/ check - $(LCOV) -c $(LCOV_OPTS) -d $(abs_builddir)/src -t test_BGL -o $@ - $(LCOV) -z $(LCOV_OPTS) -d $(abs_builddir)/src - -test_BGL_filtered.info: test_BGL.info - $(abs_builddir)/contrib/filter-lcov.py $(LCOV_FILTER_PATTERN) $< $@ - $(LCOV) -a $@ $(LCOV_OPTS) -o $@ - -functional_test.info: test_BGL_filtered.info - @test/functional/test_runner.py $(EXTENDED_FUNCTIONAL_TESTS) - $(LCOV) -c $(LCOV_OPTS) -d $(abs_builddir)/src --t functional-tests -o $@ - $(LCOV) -z $(LCOV_OPTS) -d $(abs_builddir)/src - -functional_test_filtered.info: functional_test.info - $(abs_builddir)/contrib/filter-lcov.py $(LCOV_FILTER_PATTERN) $< $@ - $(LCOV) -a $@ $(LCOV_OPTS) -o $@ - -fuzz_coverage.info: fuzz_filtered.info - $(LCOV) $(LCOV_OPTS) -a baseline_filtered.info -a fuzz_filtered.info -o $@ | $(GREP) "\%" | $(AWK) '{ print substr($$3,2,50) "/" $$5 }' > coverage_percent.txt - -test_BGL_coverage.info: baseline_filtered.info test_BGL_filtered.info - $(LCOV) $(LCOV_OPTS) -a baseline_filtered.info -a test_BGL_filtered.info -o $@ - -total_coverage.info: test_BGL_filtered.info functional_test_filtered.info - $(LCOV) $(LCOV_OPTS) -a baseline_filtered.info -a test_BGL_filtered.info -a functional_test_filtered.info -o $@ | $(GREP) "\%" | $(AWK) '{ print substr($$3,2,50) "/" $$5 }' > coverage_percent.txt - -fuzz.coverage/.dirstamp: fuzz_coverage.info - $(GENHTML) -s $(LCOV_OPTS) $< -o $(@D) - @touch $@ - -test_BGL.coverage/.dirstamp: test_BGL_coverage.info - $(GENHTML) -s $(LCOV_OPTS) $< -o $(@D) - @touch $@ - -total.coverage/.dirstamp: total_coverage.info - $(GENHTML) -s $(LCOV_OPTS) $< -o $(@D) - @touch $@ - -cov_fuzz: fuzz.coverage/.dirstamp - -cov: test_BGL.coverage/.dirstamp total.coverage/.dirstamp - -endif - -dist_noinst_SCRIPTS = autogen.sh - -EXTRA_DIST = $(DIST_SHARE) $(DIST_CONTRIB) $(WINDOWS_PACKAGING) $(OSX_PACKAGING) $(BIN_CHECKS) - -EXTRA_DIST += \ - test/functional \ - test/fuzz - -EXTRA_DIST += \ - test/util/test_runner.py \ - test/util/data/BGL-util-test.json \ - test/util/data/blanktxv1.hex \ - test/util/data/blanktxv1.json \ - test/util/data/blanktxv2.hex \ - test/util/data/blanktxv2.json \ - test/util/data/tt-delin1-out.hex \ - test/util/data/tt-delin1-out.json \ - test/util/data/tt-delout1-out.hex \ - test/util/data/tt-delout1-out.json \ - test/util/data/tt-locktime317000-out.hex \ - test/util/data/tt-locktime317000-out.json \ - test/util/data/tx394b54bb.hex \ - test/util/data/txcreate1.hex \ - test/util/data/txcreate1.json \ - test/util/data/txcreate2.hex \ - test/util/data/txcreate2.json \ - test/util/data/txcreatedata1.hex \ - test/util/data/txcreatedata1.json \ - test/util/data/txcreatedata2.hex \ - test/util/data/txcreatedata2.json \ - test/util/data/txcreatedata_seq0.hex \ - test/util/data/txcreatedata_seq0.json \ - test/util/data/txcreatedata_seq1.hex \ - test/util/data/txcreatedata_seq1.json \ - test/util/data/txcreatemultisig1.hex \ - test/util/data/txcreatemultisig1.json \ - test/util/data/txcreatemultisig2.hex \ - test/util/data/txcreatemultisig2.json \ - test/util/data/txcreatemultisig3.hex \ - test/util/data/txcreatemultisig3.json \ - test/util/data/txcreatemultisig4.hex \ - test/util/data/txcreatemultisig4.json \ - test/util/data/txcreatemultisig5.json \ - test/util/data/txcreateoutpubkey1.hex \ - test/util/data/txcreateoutpubkey1.json \ - test/util/data/txcreateoutpubkey2.hex \ - test/util/data/txcreateoutpubkey2.json \ - test/util/data/txcreateoutpubkey3.hex \ - test/util/data/txcreateoutpubkey3.json \ - test/util/data/txcreatescript1.hex \ - test/util/data/txcreatescript1.json \ - test/util/data/txcreatescript2.hex \ - test/util/data/txcreatescript2.json \ - test/util/data/txcreatescript3.hex \ - test/util/data/txcreatescript3.json \ - test/util/data/txcreatescript4.hex \ - test/util/data/txcreatescript4.json \ - test/util/data/txcreatescript5.hex \ - test/util/data/txcreatescript6.hex \ - test/util/data/txcreatesignsegwit1.hex \ - test/util/data/txcreatesignv1.hex \ - test/util/data/txcreatesignv1.json \ - test/util/data/txcreatesignv2.hex \ - test/util/data/txreplace1.hex \ - test/util/data/txreplacenoinputs.hex \ - test/util/data/txreplaceomittedn.hex \ - test/util/data/txreplacesingleinput.hex \ - test/util/rpcauth-test.py - -CLEANFILES = $(OSX_ZIP) $(BGL_WIN_INSTALLER) - -DISTCHECK_CONFIGURE_FLAGS = --enable-man - -doc/doxygen/.stamp: doc/Doxyfile FORCE - $(MKDIR_P) $(@D) - $(DOXYGEN) $^ - $(AM_V_at) touch $@ - -if HAVE_DOXYGEN -docs: doc/doxygen/.stamp -else -docs: - @echo "error: doxygen not found" -endif - -clean-docs: - rm -rf doc/doxygen - -clean-local: clean-docs - rm -rf coverage_percent.txt test_BGL.coverage/ total.coverage/ fuzz.coverage/ test/tmp/ cache/ $(OSX_APP) - rm -rf test/functional/__pycache__ test/functional/test_framework/__pycache__ test/cache share/rpcauth/__pycache__ - rm -rf dist/ test/lint/test_runner/target/ test/lint/__pycache__ - -test-security-check: -if TARGET_DARWIN - $(AM_V_at) CC='$(CC)' CFLAGS='$(CFLAGS)' CPPFLAGS='$(CPPFLAGS)' LDFLAGS='$(LDFLAGS)' $(PYTHON) $(top_srcdir)/contrib/devtools/test-security-check.py TestSecurityChecks.test_MACHO - $(AM_V_at) CC='$(CC)' CFLAGS='$(CFLAGS)' CPPFLAGS='$(CPPFLAGS)' LDFLAGS='$(LDFLAGS)' $(PYTHON) $(top_srcdir)/contrib/devtools/test-symbol-check.py TestSymbolChecks.test_MACHO -endif -if TARGET_WINDOWS - $(AM_V_at) CC='$(CC)' CFLAGS='$(CFLAGS)' CPPFLAGS='$(CPPFLAGS)' LDFLAGS='$(LDFLAGS)' $(PYTHON) $(top_srcdir)/contrib/devtools/test-security-check.py TestSecurityChecks.test_PE - $(AM_V_at) CC='$(CC)' CFLAGS='$(CFLAGS)' CPPFLAGS='$(CPPFLAGS)' LDFLAGS='$(LDFLAGS)' $(PYTHON) $(top_srcdir)/contrib/devtools/test-symbol-check.py TestSymbolChecks.test_PE -endif -if TARGET_LINUX - $(AM_V_at) CC='$(CC)' CFLAGS='$(CFLAGS)' CPPFLAGS='$(CPPFLAGS)' LDFLAGS='$(LDFLAGS)' $(PYTHON) $(top_srcdir)/contrib/devtools/test-security-check.py TestSecurityChecks.test_ELF - $(AM_V_at) CC='$(CC)' CFLAGS='$(CFLAGS)' CPPFLAGS='$(CPPFLAGS)' LDFLAGS='$(LDFLAGS)' $(PYTHON) $(top_srcdir)/contrib/devtools/test-symbol-check.py TestSymbolChecks.test_ELF -endif \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index 1e3d003ae1..0000000000 --- a/README.md +++ /dev/null @@ -1,209 +0,0 @@ - -
-

- - Logo - - -

Bitgesell (BGL)

- -

- Bitgesell (BGL) is a digital currency -
- Explore more about project » -
-
- English - · - Chinese -

-

- - - - -
- Table of Contents -
    -
  1. - About The Project - -
  2. -
  3. - Getting Started - -
  4. -
  5. Roadmap
  6. -
  7. Contributing
  8. -
  9. License
  10. -
  11. Contact
  12. -
  13. Translations
  14. -
-
- - - -## About The Project - - -![Product Name Screen Shot](https://github.com/BitgesellOfficial/bitgesell/blob/master/share/pixmaps/BGL64.png) - - - -Features: -* secp256k1 ECDSA signing/verification and key generation. -* Additive and multiplicative tweaking of secret/public keys. -* Serialization/parsing of secret keys, public keys, signatures. -* Constant time, constant memory access signing and public key generation. -* Derandomized ECDSA (via RFC6979 or with a caller provided function.) -* Very efficient implementation. -* Suitable for embedded systems. -* Optional module for public key recovery. -* Optional module for ECDH key exchange. -* Optional module for Schnorr signatures according to [BIP-340](https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki). - -Bitgesell is a fork of Bitcoin with the following changes:
-* Block Reward [Burn rate is 90% of tx fees] - ```sh - nFees*0.1 + GetBlockSubsidy() - ``` -* Block Weight [10 times smaller than Bitcoin] - ```sh - <= 400,000 - ``` -* 100% Segwit - ```sh - Eliminates problems with legacy type of transactions - ``` -* Halving Interval [Halving cycle of Bitgesell is 1 year while that of Bitcoin is 4 years] - ```sh - 210000 blocks/4 - ``` -* Block Subsidy [Max coins = 21,000,000]
- `210000 blocks/4`

- `Hashing algorithm for blocks is Keccak (sha-3).`

- `The master branch is regularly built (see` [doc/build-*.md](https://github.com/BitgesellOfficial/bitgesell/tree/master/doc) `for instructions) and tested, but is not guaranteed to be completely stable.`

- [tags](https://github.com/BitgesellOfficial/bitgesell/tags) `are created regularly to indicate new official, stable release versions of BGL Core.`
- - -### Built With - -* General - * No runtime heap allocation. - * Extensive testing infrastructure. - * Structured to facilitate review and analysis. - * Intended to be portable to any system with a C89 compiler and uint64_t support. - * No use of floating types. - * Expose only higher level interfaces to minimize the API surface and improve application security. ("Be difficult to use insecurely.") -* Field operations - * Optimized implementation of arithmetic modulo the curve's field size (2^256 - 0x1000003D1). - * Using 5 52-bit limbs - * Using 10 26-bit limbs (including hand-optimized assembly for 32-bit ARM, by Wladimir J. van der Laan). - * This is an experimental feature that has not received enough scrutiny to satisfy the standard of quality of this library but is made available for testing and review by the community. -* Scalar operations - * Optimized implementation without data-dependent branches of arithmetic modulo the curve's order. - * Using 4 64-bit limbs (relying on __int128 support in the compiler). - * Using 8 32-bit limbs. -* Modular inverses (both field elements and scalars) based on [safegcd](https://gcd.cr.yp.to/index.html) with some modifications, and a variable-time variant (by Peter Dettman). -* Group operations - * Point addition formula specifically simplified for the curve equation (y^2 = x^3 + 7). - * Use addition between points in Jacobian and affine coordinates where possible. - * Use a unified addition/doubling formula where necessary to avoid data-dependent branches. - * Point/x comparison without a field inversion by comparison in the Jacobian coordinate space. -* Point multiplication for verification (a*P + b*G). - * Use wNAF notation for point multiplicands. - * Use a much larger window for multiples of G, using precomputed multiples. - * Use Shamir's trick to do the multiplication with the public key and the generator simultaneously. - * Use secp256k1's efficiently-computable endomorphism to split the P multiplicand into 2 half-sized ones. -* Point multiplication for signing - * Use a precomputed table of multiples of powers of 16 multiplied with the generator, so general multiplication becomes a series of additions. - * Intended to be completely free of timing sidechannels for secret-key operations (on reasonable hardware/toolchains) - * Access the table with branch-free conditional moves so memory access is uniform. - * No data-dependent branches - * Optional runtime blinding which attempts to frustrate differential power analysis. - * The precomputed tables add and eventually subtract points for which no known scalar (secret key) is known, preventing even an attacker with control over the secret key used to control the data internally. - -Building with Autotools ------------------------ - - $ ./autogen.sh - $ ./configure - $ make - $ make check # run the test suite - $ sudo make install # optional - -To compile optional modules (such as Schnorr signatures), you need to run `./configure` with additional flags (such as `--enable-module-schnorrsig`). Run `./configure --help` to see the full list of available flags. - -Building with CMake (experimental) ----------------------------------- - -To maintain a pristine source tree, CMake encourages to perform an out-of-source build by using a separate dedicated build tree. - -### Building on POSIX systems - - $ mkdir build && cd build - $ cmake .. - $ make - $ make check # run the test suite - $ sudo make install # optional - -To compile optional modules (such as Schnorr signatures), you need to run `cmake` with additional flags (such as `-DSECP256K1_ENABLE_MODULE_SCHNORRSIG=ON`). Run `cmake .. -LH` to see the full list of available flags. - -### Cross compiling - -To alleviate issues with cross compiling, preconfigured toolchain files are available in the `cmake` directory. -For example, to cross compile for Windows: - - $ cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/x86_64-w64-mingw32.toolchain.cmake - -To cross compile for Android with [NDK](https://developer.android.com/ndk/guides/cmake) (using NDK's toolchain file, and assuming the `ANDROID_NDK_ROOT` environment variable has been set): - - $ cmake .. -DCMAKE_TOOLCHAIN_FILE="${ANDROID_NDK_ROOT}/build/cmake/android.toolchain.cmake" -DANDROID_ABI=arm64-v8a -DANDROID_PLATFORM=28 - -### Building on Windows - -To build on Windows with Visual Studio, a proper [generator](https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html#visual-studio-generators) must be specified for a new build tree. - -The following example assumes using of Visual Studio 2022 and CMake v3.21+. - -In "Developer Command Prompt for VS 2022": - - >cmake -G "Visual Studio 17 2022" -A x64 -S . -B build - >cmake --build build --config RelWithDebInfo - -Usage examples ------------ -Usage examples can be found in the [examples](examples) directory. To compile them you need to configure with `--enable-examples`. - * [ECDSA example](examples/ecdsa.c) - * [Schnorr signatures example](examples/schnorr.c) - * [Deriving a shared secret (ECDH) example](examples/ecdh.c) - -To compile the Schnorr signature and ECDH examples, you also need to configure with `--enable-module-schnorrsig` and `--enable-module-ecdh`. - -Benchmark ------------- -If configured with `--enable-benchmark` (which is the default), binaries for benchmarking the libsecp256k1 functions will be present in the root directory after the build. - -Facebook: [Bitgesell](https://www.facebook.com/Bitgesell) - - - -## Translations - -Changes to translations as well as new translations can be submitted to -[BGL Core's Transifex page](https://www.transifex.com/bitcoin/bitcoin/). - -Translations are periodically pulled from Transifex and merged into the git repository. See the -[translation process](doc/translation_process.md) for details on how this works. - -See [SECURITY.md](SECURITY.md) - -Contributing to libsecp256k1 ------------- - -See [CONTRIBUTING.md](CONTRIBUTING.md) diff --git a/SECURITY.md b/SECURITY.md deleted file mode 100644 index c625761805..0000000000 --- a/SECURITY.md +++ /dev/null @@ -1,20 +0,0 @@ -# Security Policy - -## Supported Versions - -See our website for versions of BGL Core that are currently supported with -security updates: https://bitgesell.ca - -## Reporting a Vulnerability - -To report security issues send an email to security@bitcoincore.org (not for support). - -The following keys may be used to communicate sensitive information to developers: - -| Name | Fingerprint | -|------|-------------| -| Pieter Wuille | 133E AC17 9436 F14A 5CF1 B794 860F EB80 4E66 9320 | -| Michael Ford | E777 299F C265 DD04 7930 70EB 944D 35F9 AC3D B76A | -| Ava Chow | 1528 1230 0785 C964 44D3 334D 1756 5732 E08E 5E41 | - -You can import a key by running the following command with that individual’s fingerprint: `gpg --keyserver hkps://keys.openpgp.org --recv-keys ""` Ensure that you put quotes around fingerprints containing spaces. diff --git a/autogen.sh b/autogen.sh deleted file mode 100755 index 69c892ffa0..0000000000 --- a/autogen.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh -# Copyright (c) 2013-2019 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -export LC_ALL=C -set -e -srcdir="$(dirname "$0")" -cd "$srcdir" -if [ -z "${LIBTOOLIZE}" ] && GLIBTOOLIZE="$(command -v glibtoolize)"; then - LIBTOOLIZE="${GLIBTOOLIZE}" - export LIBTOOLIZE -fi -command -v autoreconf >/dev/null || \ - (echo "configuration failed, please install autoconf first" && exit 1) -autoreconf --install --force --warnings=all - -if expr "'$(build-aux/config.guess --timestamp)" \< "'$(depends/config.guess --timestamp)" > /dev/null; then - chmod ug+w build-aux/config.guess - chmod ug+w src/secp256k1/build-aux/config.guess - cp depends/config.guess build-aux - cp depends/config.guess src/secp256k1/build-aux -fi -if expr "'$(build-aux/config.sub --timestamp)" \< "'$(depends/config.sub --timestamp)" > /dev/null; then - chmod ug+w build-aux/config.sub - chmod ug+w src/secp256k1/build-aux/config.sub - cp depends/config.sub build-aux - cp depends/config.sub src/secp256k1/build-aux -fi diff --git a/build-aux/m4/BGL_find_bdb48.m4 b/build-aux/m4/BGL_find_bdb48.m4 deleted file mode 100644 index 1390f71bef..0000000000 --- a/build-aux/m4/BGL_find_bdb48.m4 +++ /dev/null @@ -1,97 +0,0 @@ -dnl Copyright (c) 2013-2015 The Bitcoin Core developers -dnl Distributed under the MIT software license, see the accompanying -dnl file COPYING or http://www.opensource.org/licenses/mit-license.php. - -AC_DEFUN([BGL_FIND_BDB48],[ - AC_ARG_VAR(BDB_CFLAGS, [C compiler flags for BerkeleyDB, bypasses autodetection]) - AC_ARG_VAR(BDB_LIBS, [Linker flags for BerkeleyDB, bypasses autodetection]) - - if test "x$use_bdb" = "xno"; then - use_bdb=no - elif test "x$BDB_CFLAGS" = "x"; then - AC_MSG_CHECKING([for Berkeley DB C++ headers]) - BDB_CPPFLAGS= - bdbpath=X - bdb48path=X - bdbdirlist= - for _vn in 4.8 48 4 5 5.3 ''; do - for _pfx in b lib ''; do - bdbdirlist="$bdbdirlist ${_pfx}db${_vn}" - done - done - for searchpath in $bdbdirlist ''; do - test -n "${searchpath}" && searchpath="${searchpath}/" - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - #include <${searchpath}db_cxx.h> - ]],[[ - #if !((DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR >= 8) || DB_VERSION_MAJOR > 4) - #error "failed to find bdb 4.8+" - #endif - ]])],[ - if test "x$bdbpath" = "xX"; then - bdbpath="${searchpath}" - fi - ],[ - continue - ]) - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - #include <${searchpath}db_cxx.h> - ]],[[ - #if !(DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR == 8) - #error "failed to find bdb 4.8" - #endif - ]])],[ - bdb48path="${searchpath}" - break - ],[]) - done - if test "x$bdbpath" = "xX"; then - use_bdb=no - AC_MSG_RESULT([no]) - AC_MSG_WARN([libdb_cxx headers missing]) - AC_MSG_WARN(AC_PACKAGE_NAME[ requires this library for BDB (legacy) wallet support]) - AC_MSG_WARN([Passing --without-bdb will suppress this warning]) - elif test "x$bdb48path" = "xX"; then - BGL_SUBDIR_TO_INCLUDE(BDB_CPPFLAGS,[${bdbpath}],db_cxx) - AC_ARG_WITH([incompatible-bdb],[AS_HELP_STRING([--with-incompatible-bdb], [allow using a bdb version other than 4.8])],[ - AC_MSG_WARN([Found Berkeley DB other than 4.8]) - AC_MSG_WARN([BDB (legacy) wallets opened by this build will not be portable!]) - use_bdb=yes - ],[ - AC_MSG_WARN([Found Berkeley DB other than 4.8]) - AC_MSG_WARN([BDB (legacy) wallets opened by this build would not be portable!]) - AC_MSG_WARN([If this is intended, pass --with-incompatible-bdb]) - AC_MSG_WARN([Passing --without-bdb will suppress this warning]) - use_bdb=no - ]) - else - BGL_SUBDIR_TO_INCLUDE(BDB_CPPFLAGS,[${bdb48path}],db_cxx) - bdbpath="${bdb48path}" - use_bdb=yes - fi - else - BDB_CPPFLAGS=${BDB_CFLAGS} - fi - AC_SUBST(BDB_CPPFLAGS) - - if test "x$use_bdb" = "xno"; then - use_bdb=no - elif test "x$BDB_LIBS" = "x"; then - # TODO: Ideally this could find the library version and make sure it matches the headers being used - for searchlib in db_cxx-4.8 db_cxx db4_cxx; do - AC_CHECK_LIB([$searchlib],[main],[ - BDB_LIBS="-l${searchlib}" - break - ]) - done - if test "x$BDB_LIBS" = "x"; then - AC_MSG_WARN([libdb_cxx headers missing]) - AC_MSG_WARN(AC_PACKAGE_NAME[ requires this library for BDB (legacy) wallet support]) - AC_MSG_WARN([Passing --without-bdb will suppress this warning]) - fi - fi - if test "$use_bdb" != "no"; then - AC_DEFINE([USE_BDB], [1], [Define if BDB support should be compiled in]) - use_bdb=yes - fi -]) diff --git a/build-aux/m4/BGL_qt.m4 b/build-aux/m4/BGL_qt.m4 deleted file mode 100644 index d967235e4b..0000000000 --- a/build-aux/m4/BGL_qt.m4 +++ /dev/null @@ -1,371 +0,0 @@ -dnl Copyright (c) 2013-2016 The Bitcoin Core developers -dnl Distributed under the MIT software license, see the accompanying -dnl file COPYING or http://www.opensource.org/licenses/mit-license.php. - -dnl Helper for cases where a qt dependency is not met. -dnl Output: If qt version is auto, set BGL_enable_qt to false. Else, exit. -AC_DEFUN([BGL_QT_FAIL],[ - if test "x$BGL_qt_want_version" = xauto && test "x$BGL_qt_force" != xyes; then - if test "x$BGL_enable_qt" != xno; then - AC_MSG_WARN([$1; BGL-qt frontend will not be built]) - fi - BGL_enable_qt=no - BGL_enable_qt_test=no - else - AC_MSG_ERROR([$1]) - fi -]) - -AC_DEFUN([BGL_QT_CHECK],[ - if test "x$BGL_enable_qt" != xno && test "x$BGL_qt_want_version" != xno; then - true - $1 - else - true - $2 - fi -]) - -dnl BGL_QT_PATH_PROGS([FOO], [foo foo2], [/path/to/search/first], [continue if missing]) -dnl Helper for finding the path of programs needed for Qt. -dnl Inputs: $1: Variable to be set -dnl Inputs: $2: List of programs to search for -dnl Inputs: $3: Look for $2 here before $PATH -dnl Inputs: $4: If "yes", don't fail if $2 is not found. -dnl Output: $1 is set to the path of $2 if found. $2 are searched in order. -AC_DEFUN([BGL_QT_PATH_PROGS],[ - BGL_QT_CHECK([ - if test "x$3" != x; then - AC_PATH_PROGS($1,$2,,$3) - else - AC_PATH_PROGS($1,$2) - fi - if test "x$$1" = x && test "x$4" != xyes; then - BGL_QT_FAIL([$1 not found]) - fi - ]) -]) - -dnl Initialize qt input. -dnl This must be called before any other BGL_QT* macros to ensure that -dnl input variables are set correctly. -dnl CAUTION: Do not use this inside of a conditional. -AC_DEFUN([BGL_QT_INIT],[ - dnl enable qt support - AC_ARG_WITH([gui], - [AS_HELP_STRING([--with-gui@<:@=no|qt5|auto@:>@], - [build BGL-qt GUI (default=auto)])], - [ - BGL_qt_want_version=$withval - if test "x$BGL_qt_want_version" = xyes; then - BGL_qt_force=yes - BGL_qt_want_version=auto - fi - ], - [BGL_qt_want_version=auto]) - - AS_IF([test "x$with_gui" = xqt5_debug], - [AS_CASE([$host], - [*darwin*], [qt_lib_suffix=_debug], - [*mingw*], [qt_lib_suffix=d], - [qt_lib_suffix= ]); BGL_qt_want_version=qt5], - [qt_lib_suffix= ]) - - AC_ARG_WITH([qt-incdir],[AS_HELP_STRING([--with-qt-incdir=INC_DIR],[specify qt include path (overridden by pkgconfig)])], [qt_include_path=$withval], []) - AC_ARG_WITH([qt-libdir],[AS_HELP_STRING([--with-qt-libdir=LIB_DIR],[specify qt lib path (overridden by pkgconfig)])], [qt_lib_path=$withval], []) - AC_ARG_WITH([qt-plugindir],[AS_HELP_STRING([--with-qt-plugindir=PLUGIN_DIR],[specify qt plugin path (overridden by pkgconfig)])], [qt_plugin_path=$withval], []) - AC_ARG_WITH([qt-translationdir],[AS_HELP_STRING([--with-qt-translationdir=PLUGIN_DIR],[specify qt translation path (overridden by pkgconfig)])], [qt_translation_path=$withval], []) - AC_ARG_WITH([qt-bindir],[AS_HELP_STRING([--with-qt-bindir=BIN_DIR],[specify qt bin path])], [qt_bin_path=$withval], []) - - AC_ARG_WITH([qtdbus], - [AS_HELP_STRING([--with-qtdbus], - [enable DBus support (default is yes if qt is enabled and QtDBus is found)])], - [use_dbus=$withval], - [use_dbus=auto]) - - AC_SUBST(QT_TRANSLATION_DIR,$qt_translation_path) -]) - -dnl Find Qt libraries and includes. -dnl -dnl BGL_QT_CONFIGURE([MINIMUM-VERSION]) -dnl -dnl Outputs: See _BGL_QT_FIND_LIBS -dnl Outputs: Sets variables for all qt-related tools. -dnl Outputs: BGL_enable_qt, BGL_enable_qt_dbus, BGL_enable_qt_test -AC_DEFUN([BGL_QT_CONFIGURE],[ - qt_version=">= $1" - qt_lib_prefix="Qt5" - BGL_QT_CHECK([_BGL_QT_FIND_LIBS]) - - dnl This is ugly and complicated. Yuck. Works as follows: - dnl We check a header to find out whether Qt is built statically. - dnl When Qt is built statically, some plugins must be linked into - dnl the final binary as well. _BGL_QT_CHECK_STATIC_PLUGIN does - dnl a quick link-check and appends the results to QT_LIBS. - BGL_QT_CHECK([ - TEMP_CPPFLAGS=$CPPFLAGS - TEMP_CXXFLAGS=$CXXFLAGS - CPPFLAGS="$QT_INCLUDES $CORE_CPPFLAGS $CPPFLAGS" - CXXFLAGS="$PIC_FLAGS $CORE_CXXFLAGS $CXXFLAGS" - _BGL_QT_IS_STATIC - if test "$BGL_cv_static_qt" = "yes"; then - _BGL_QT_CHECK_STATIC_LIBS - - if test "x$qt_plugin_path" != x; then - if test -d "$qt_plugin_path/platforms"; then - QT_LIBS="$QT_LIBS -L$qt_plugin_path/platforms" - fi - if test -d "$qt_plugin_path/styles"; then - QT_LIBS="$QT_LIBS -L$qt_plugin_path/styles" - fi - if test -d "$qt_plugin_path/accessible"; then - QT_LIBS="$QT_LIBS -L$qt_plugin_path/accessible" - fi - fi - - AC_DEFINE([QT_STATICPLUGIN], [1], [Define this symbol if qt plugins are static]) - _BGL_QT_CHECK_STATIC_PLUGIN([QMinimalIntegrationPlugin], [-lqminimal]) - AC_DEFINE([QT_QPA_PLATFORM_MINIMAL], [1], [Define this symbol if the minimal qt platform exists]) - if test "$TARGET_OS" = "windows"; then - dnl Linking against wtsapi32 is required. See #17749 and - dnl https://bugreports.qt.io/browse/QTBUG-27097. - AX_CHECK_LINK_FLAG([-lwtsapi32], [QT_LIBS="$QT_LIBS -lwtsapi32"], [AC_MSG_ERROR([could not link against -lwtsapi32])]) - _BGL_QT_CHECK_STATIC_PLUGIN([QWindowsIntegrationPlugin], [-lqwindows]) - _BGL_QT_CHECK_STATIC_PLUGIN([QWindowsVistaStylePlugin], [-lqwindowsvistastyle]) - AC_DEFINE([QT_QPA_PLATFORM_WINDOWS], [1], [Define this symbol if the qt platform is windows]) - elif test "$TARGET_OS" = "linux"; then - _BGL_QT_CHECK_STATIC_PLUGIN([QXcbIntegrationPlugin], [-lqxcb]) - AC_DEFINE([QT_QPA_PLATFORM_XCB], [1], [Define this symbol if the qt platform is xcb]) - elif test "$TARGET_OS" = "darwin"; then - AX_CHECK_LINK_FLAG([-framework Carbon], [QT_LIBS="$QT_LIBS -framework Carbon"], [AC_MSG_ERROR(could not link against Carbon framework)]) - AX_CHECK_LINK_FLAG([-framework IOSurface], [QT_LIBS="$QT_LIBS -framework IOSurface"], [AC_MSG_ERROR(could not link against IOSurface framework)]) - AX_CHECK_LINK_FLAG([-framework Metal], [QT_LIBS="$QT_LIBS -framework Metal"], [AC_MSG_ERROR(could not link against Metal framework)]) - AX_CHECK_LINK_FLAG([-framework QuartzCore], [QT_LIBS="$QT_LIBS -framework QuartzCore"], [AC_MSG_ERROR(could not link against QuartzCore framework)]) - _BGL_QT_CHECK_STATIC_PLUGIN([QCocoaIntegrationPlugin], [-lqcocoa]) - _BGL_QT_CHECK_STATIC_PLUGIN([QMacStylePlugin], [-lqmacstyle]) - AC_DEFINE([QT_QPA_PLATFORM_COCOA], [1], [Define this symbol if the qt platform is cocoa]) - fi - fi - CPPFLAGS=$TEMP_CPPFLAGS - CXXFLAGS=$TEMP_CXXFLAGS - ]) - - if test "x$qt_bin_path" = x; then - qt_bin_path="`$PKG_CONFIG --variable=host_bins ${qt_lib_prefix}Core 2>/dev/null`" - fi - - if test "x$use_hardening" != xno; then - BGL_QT_CHECK([ - AC_MSG_CHECKING(whether -fPIE can be used with this Qt config) - TEMP_CPPFLAGS=$CPPFLAGS - TEMP_CXXFLAGS=$CXXFLAGS - CPPFLAGS="$QT_INCLUDES $CORE_CPPFLAGS $CPPFLAGS" - CXXFLAGS="$PIE_FLAGS $CORE_CXXFLAGS $CXXFLAGS" - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - #include - #ifndef QT_VERSION - # include - #endif - ]], - [[ - #if defined(QT_REDUCE_RELOCATIONS) - choke - #endif - ]])], - [ AC_MSG_RESULT(yes); QT_PIE_FLAGS=$PIE_FLAGS ], - [ AC_MSG_RESULT(no); QT_PIE_FLAGS=$PIC_FLAGS] - ) - CPPFLAGS=$TEMP_CPPFLAGS - CXXFLAGS=$TEMP_CXXFLAGS - ]) - else - BGL_QT_CHECK([ - AC_MSG_CHECKING(whether -fPIC is needed with this Qt config) - TEMP_CPPFLAGS=$CPPFLAGS - CPPFLAGS="$QT_INCLUDES $CORE_CPPFLAGS $CPPFLAGS" - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - #include - #ifndef QT_VERSION - # include - #endif - ]], - [[ - #if defined(QT_REDUCE_RELOCATIONS) - choke - #endif - ]])], - [ AC_MSG_RESULT(no)], - [ AC_MSG_RESULT(yes); QT_PIE_FLAGS=$PIC_FLAGS] - ) - CPPFLAGS=$TEMP_CPPFLAGS - ]) - fi - - BGL_QT_PATH_PROGS([MOC], [moc-qt5 moc5 moc], $qt_bin_path) - BGL_QT_PATH_PROGS([UIC], [uic-qt5 uic5 uic], $qt_bin_path) - BGL_QT_PATH_PROGS([RCC], [rcc-qt5 rcc5 rcc], $qt_bin_path) - BGL_QT_PATH_PROGS([LRELEASE], [lrelease-qt5 lrelease5 lrelease], $qt_bin_path) - BGL_QT_PATH_PROGS([LUPDATE], [lupdate-qt5 lupdate5 lupdate],$qt_bin_path, yes) - BGL_QT_PATH_PROGS([LCONVERT], [lconvert-qt5 lconvert5 lconvert], $qt_bin_path, yes) - - MOC_DEFS='-I$(srcdir)' - case $host in - *darwin*) - BGL_QT_CHECK([ - MOC_DEFS="${MOC_DEFS} -DQ_OS_MAC" - base_frameworks="-framework Foundation -framework AppKit" - AX_CHECK_LINK_FLAG([[$base_frameworks]],[QT_LIBS="$QT_LIBS $base_frameworks"],[AC_MSG_ERROR(could not find base frameworks)]) - ]) - ;; - *mingw*) - BGL_QT_CHECK([ - AX_CHECK_LINK_FLAG([[-mwindows]],[QT_LDFLAGS="$QT_LDFLAGS -mwindows"],[AC_MSG_WARN(-mwindows linker support not detected)]) - ]) - esac - - - dnl enable qt support - AC_MSG_CHECKING([whether to build ]AC_PACKAGE_NAME[ GUI]) - BGL_QT_CHECK([ - BGL_enable_qt=yes - BGL_enable_qt_test=yes - if test "x$have_qt_test" = xno; then - BGL_enable_qt_test=no - fi - BGL_enable_qt_dbus=no - if test "x$use_dbus" != xno && test "x$have_qt_dbus" = xyes; then - BGL_enable_qt_dbus=yes - fi - if test "x$use_dbus" = xyes && test "x$have_qt_dbus" = xno; then - AC_MSG_ERROR([libQtDBus not found. Install libQtDBus or remove --with-qtdbus.]) - fi - if test "x$LUPDATE" = x; then - AC_MSG_WARN([lupdate tool is required to update Qt translations.]) - fi - if test "x$LCONVERT" = x; then - AC_MSG_WARN([lconvert tool is required to update Qt translations.]) - fi - ],[ - BGL_enable_qt=no - ]) - if test x$BGL_enable_qt = xyes; then - AC_MSG_RESULT([$BGL_enable_qt ($qt_lib_prefix)]) - else - AC_MSG_RESULT([$BGL_enable_qt]) - fi - - AC_SUBST(QT_PIE_FLAGS) - AC_SUBST(QT_INCLUDES) - AC_SUBST(QT_LIBS) - AC_SUBST(QT_LDFLAGS) - AC_SUBST(QT_DBUS_INCLUDES) - AC_SUBST(QT_TEST_INCLUDES) - AC_SUBST(QT_SELECT, qt5) - AC_SUBST(MOC_DEFS) -]) - -dnl All macros below are internal and should _not_ be used from configure.ac. - -dnl Internal. Check if the linked version of Qt was built statically. -dnl -dnl _BGL_QT_IS_STATIC -dnl --------------------- -dnl -dnl Requires: INCLUDES and LIBS must be populated as necessary. -dnl Output: BGL_cv_static_qt=yes|no -AC_DEFUN([_BGL_QT_IS_STATIC],[ - AC_CACHE_CHECK(for static Qt, BGL_cv_static_qt,[ - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - #include - #ifndef QT_VERSION - # include - #endif - ]], - [[ - #if !defined(QT_STATIC) - choke - #endif - ]])], - [BGL_cv_static_qt=yes], - [BGL_cv_static_qt=no]) - ]) -]) - -dnl Internal. Check if the link-requirements for static plugins are met. -dnl Requires: INCLUDES and LIBS must be populated as necessary. -dnl Inputs: $1: A series of Q_IMPORT_PLUGIN(). -dnl Inputs: $2: The libraries that resolve $1. -dnl Output: QT_LIBS is prepended or configure exits. -AC_DEFUN([_BGL_QT_CHECK_STATIC_PLUGIN],[ - AC_MSG_CHECKING(for static Qt plugins: $2) - CHECK_STATIC_PLUGINS_TEMP_LIBS="$LIBS" - LIBS="$2${qt_lib_suffix} $QT_LIBS $LIBS" - AC_LINK_IFELSE([AC_LANG_PROGRAM([[ - #include - Q_IMPORT_PLUGIN($1) - ]])], - [AC_MSG_RESULT([yes]); QT_LIBS="$2${qt_lib_suffix} $QT_LIBS"], - [AC_MSG_RESULT([no]); BGL_QT_FAIL([$1 not found.])]) - LIBS="$CHECK_STATIC_PLUGINS_TEMP_LIBS" -]) - -dnl Internal. Check Qt static libs with PKG_CHECK_MODULES. -dnl -dnl _BGL_QT_CHECK_STATIC_LIBS -dnl ----------------------------- -dnl -dnl Outputs: QT_LIBS is prepended. -AC_DEFUN([_BGL_QT_CHECK_STATIC_LIBS], [ - PKG_CHECK_MODULES([QT_ACCESSIBILITY], [${qt_lib_prefix}AccessibilitySupport${qt_lib_suffix}], [QT_LIBS="$QT_ACCESSIBILITY_LIBS $QT_LIBS"]) - PKG_CHECK_MODULES([QT_DEVICEDISCOVERY], [${qt_lib_prefix}DeviceDiscoverySupport${qt_lib_suffix}], [QT_LIBS="$QT_DEVICEDISCOVERY_LIBS $QT_LIBS"]) - PKG_CHECK_MODULES([QT_EDID], [${qt_lib_prefix}EdidSupport${qt_lib_suffix}], [QT_LIBS="$QT_EDID_LIBS $QT_LIBS"]) - PKG_CHECK_MODULES([QT_EVENTDISPATCHER], [${qt_lib_prefix}EventDispatcherSupport${qt_lib_suffix}], [QT_LIBS="$QT_EVENTDISPATCHER_LIBS $QT_LIBS"]) - PKG_CHECK_MODULES([QT_FB], [${qt_lib_prefix}FbSupport${qt_lib_suffix}], [QT_LIBS="$QT_FB_LIBS $QT_LIBS"]) - PKG_CHECK_MODULES([QT_FONTDATABASE], [${qt_lib_prefix}FontDatabaseSupport${qt_lib_suffix}], [QT_LIBS="$QT_FONTDATABASE_LIBS $QT_LIBS"]) - PKG_CHECK_MODULES([QT_THEME], [${qt_lib_prefix}ThemeSupport${qt_lib_suffix}], [QT_LIBS="$QT_THEME_LIBS $QT_LIBS"]) - if test "x$TARGET_OS" = xlinux; then - PKG_CHECK_MODULES([QT_INPUT], [${qt_lib_prefix}InputSupport], [QT_LIBS="$QT_INPUT_LIBS $QT_LIBS"]) - PKG_CHECK_MODULES([QT_SERVICE], [${qt_lib_prefix}ServiceSupport], [QT_LIBS="$QT_SERVICE_LIBS $QT_LIBS"]) - PKG_CHECK_MODULES([QT_XCBQPA], [${qt_lib_prefix}XcbQpa], [QT_LIBS="$QT_XCBQPA_LIBS $QT_LIBS"]) - elif test "x$TARGET_OS" = xdarwin; then - PKG_CHECK_MODULES([QT_CLIPBOARD], [${qt_lib_prefix}ClipboardSupport${qt_lib_suffix}], [QT_LIBS="$QT_CLIPBOARD_LIBS $QT_LIBS"]) - PKG_CHECK_MODULES([QT_GRAPHICS], [${qt_lib_prefix}GraphicsSupport${qt_lib_suffix}], [QT_LIBS="$QT_GRAPHICS_LIBS $QT_LIBS"]) - PKG_CHECK_MODULES([QT_SERVICE], [${qt_lib_prefix}ServiceSupport${qt_lib_suffix}], [QT_LIBS="$QT_SERVICE_LIBS $QT_LIBS"]) - elif test "x$TARGET_OS" = xwindows; then - PKG_CHECK_MODULES([QT_WINDOWSUIAUTOMATION], [${qt_lib_prefix}WindowsUIAutomationSupport${qt_lib_suffix}], [QT_LIBS="$QT_WINDOWSUIAUTOMATION_LIBS $QT_LIBS"]) - fi -]) - -dnl Internal. Find Qt libraries using pkg-config. -dnl -dnl _BGL_QT_FIND_LIBS -dnl --------------------- -dnl -dnl Outputs: All necessary QT_* variables are set. -dnl Outputs: have_qt_test and have_qt_dbus are set (if applicable) to yes|no. -AC_DEFUN([_BGL_QT_FIND_LIBS],[ - BGL_QT_CHECK([ - PKG_CHECK_MODULES([QT_CORE], [${qt_lib_prefix}Core${qt_lib_suffix} $qt_version], [QT_INCLUDES="$QT_CORE_CFLAGS $QT_INCLUDES" QT_LIBS="$QT_CORE_LIBS $QT_LIBS"], - [BGL_QT_FAIL([${qt_lib_prefix}Core${qt_lib_suffix} $qt_version not found])]) - ]) - BGL_QT_CHECK([ - PKG_CHECK_MODULES([QT_GUI], [${qt_lib_prefix}Gui${qt_lib_suffix} $qt_version], [QT_INCLUDES="$QT_GUI_CFLAGS $QT_INCLUDES" QT_LIBS="$QT_GUI_LIBS $QT_LIBS"], - [BGL_QT_FAIL([${qt_lib_prefix}Gui${qt_lib_suffix} $qt_version not found])]) - ]) - BGL_QT_CHECK([ - PKG_CHECK_MODULES([QT_WIDGETS], [${qt_lib_prefix}Widgets${qt_lib_suffix} $qt_version], [QT_INCLUDES="$QT_WIDGETS_CFLAGS $QT_INCLUDES" QT_LIBS="$QT_WIDGETS_LIBS $QT_LIBS"], - [BGL_QT_FAIL([${qt_lib_prefix}Widgets${qt_lib_suffix} $qt_version not found])]) - ]) - BGL_QT_CHECK([ - PKG_CHECK_MODULES([QT_NETWORK], [${qt_lib_prefix}Network${qt_lib_suffix} $qt_version], [QT_INCLUDES="$QT_NETWORK_CFLAGS $QT_INCLUDES" QT_LIBS="$QT_NETWORK_LIBS $QT_LIBS"], - [BGL_QT_FAIL([${qt_lib_prefix}Network${qt_lib_suffix} $qt_version not found])]) - ]) - - BGL_QT_CHECK([ - PKG_CHECK_MODULES([QT_TEST], [${qt_lib_prefix}Test${qt_lib_suffix} $qt_version], [QT_TEST_INCLUDES="$QT_TEST_CFLAGS"; have_qt_test=yes], [have_qt_test=no]) - if test "x$use_dbus" != xno; then - PKG_CHECK_MODULES([QT_DBUS], [${qt_lib_prefix}DBus $qt_version], [QT_DBUS_INCLUDES="$QT_DBUS_CFLAGS"; have_qt_dbus=yes], [have_qt_dbus=no]) - fi - ]) -]) diff --git a/build-aux/m4/BGL_subdir_to_include.m4 b/build-aux/m4/BGL_subdir_to_include.m4 deleted file mode 100644 index c6b1d44f1e..0000000000 --- a/build-aux/m4/BGL_subdir_to_include.m4 +++ /dev/null @@ -1,18 +0,0 @@ -dnl Copyright (c) 2013-2014 The Bitcoin Core developers -dnl Distributed under the MIT software license, see the accompanying -dnl file COPYING or http://www.opensource.org/licenses/mit-license.php. - -dnl BGL_SUBDIR_TO_INCLUDE([CPPFLAGS-VARIABLE-NAME],[SUBDIRECTORY-NAME],[HEADER-FILE]) -dnl SUBDIRECTORY-NAME must end with a path separator -AC_DEFUN([BGL_SUBDIR_TO_INCLUDE],[ - if test "x$2" = "x"; then - AC_MSG_RESULT([default]) - else - echo "#include <$2$3.h>" >conftest.cpp - newinclpath=`${CXXCPP} ${CPPFLAGS} -M conftest.cpp 2>/dev/null | [ tr -d '\\n\\r\\\\' | sed -e 's/^.*[[:space:]:]\(\/[^[:space:]]*\)]$3[\.h[[:space:]].*$/\1/' -e t -e d`] - AC_MSG_RESULT([${newinclpath}]) - if test "x${newinclpath}" != "x"; then - eval "$1=\"\$$1\"' -I${newinclpath}'" - fi - fi -]) diff --git a/build-aux/m4/ax_boost_base.m4 b/build-aux/m4/ax_boost_base.m4 deleted file mode 100644 index f6620882a2..0000000000 --- a/build-aux/m4/ax_boost_base.m4 +++ /dev/null @@ -1,256 +0,0 @@ -# =========================================================================== -# https://www.gnu.org/software/autoconf-archive/ax_boost_base.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_BOOST_BASE([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) -# -# DESCRIPTION -# -# Test for the Boost C++ headers of a particular version (or newer) -# -# If no path to the installed boost library is given the macro searchs -# under /usr, /usr/local, /opt, /opt/local and /opt/homebrew and evaluates -# the $BOOST_ROOT environment variable. Further documentation is available -# at . -# -# This macro calls: -# -# AC_SUBST(BOOST_CPPFLAGS) -# -# And sets: -# -# HAVE_BOOST -# -# Note that this macro has been modified compared to upstream. -# -# LICENSE -# -# Copyright (c) 2008 Thomas Porschberg -# Copyright (c) 2009 Peter Adolphs -# -# Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice -# and this notice are preserved. This file is offered as-is, without any -# warranty. - -#serial 51 - -# example boost program (need to pass version) -m4_define([_AX_BOOST_BASE_PROGRAM], - [AC_LANG_PROGRAM([[ -#include -]],[[ -(void) ((void)sizeof(char[1 - 2*!!((BOOST_VERSION) < ($1))])); -]])]) - -AC_DEFUN([AX_BOOST_BASE], -[ -AC_ARG_WITH([boost], - [AS_HELP_STRING([--with-boost@<:@=ARG@:>@], - [use Boost library from a standard location (ARG=yes), - from the specified location (ARG=), - or disable it (ARG=no) - @<:@ARG=yes@:>@ ])], - [ - AS_CASE([$withval], - [no],[want_boost="no";_AX_BOOST_BASE_boost_path=""], - [yes],[want_boost="yes";_AX_BOOST_BASE_boost_path=""], - [want_boost="yes";_AX_BOOST_BASE_boost_path="$withval"]) - ], - [want_boost="yes"]) - -BOOST_CPPFLAGS="" -AS_IF([test "x$want_boost" = "xyes"], - [_AX_BOOST_BASE_RUNDETECT([$1],[$2],[$3])]) -AC_SUBST(BOOST_CPPFLAGS) -]) - - -# convert a version string in $2 to numeric and affect to polymorphic var $1 -AC_DEFUN([_AX_BOOST_BASE_TONUMERICVERSION],[ - AS_IF([test "x$2" = "x"],[_AX_BOOST_BASE_TONUMERICVERSION_req="1.20.0"],[_AX_BOOST_BASE_TONUMERICVERSION_req="$2"]) - _AX_BOOST_BASE_TONUMERICVERSION_req_shorten=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '\([[0-9]]*\.[[0-9]]*\)'` - _AX_BOOST_BASE_TONUMERICVERSION_req_major=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '\([[0-9]]*\)'` - AS_IF([test "x$_AX_BOOST_BASE_TONUMERICVERSION_req_major" = "x"], - [AC_MSG_ERROR([You should at least specify libboost major version])]) - _AX_BOOST_BASE_TONUMERICVERSION_req_minor=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '[[0-9]]*\.\([[0-9]]*\)'` - AS_IF([test "x$_AX_BOOST_BASE_TONUMERICVERSION_req_minor" = "x"], - [_AX_BOOST_BASE_TONUMERICVERSION_req_minor="0"]) - _AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '[[0-9]]*\.[[0-9]]*\.\([[0-9]]*\)'` - AS_IF([test "X$_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor" = "X"], - [_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor="0"]) - _AX_BOOST_BASE_TONUMERICVERSION_RET=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req_major \* 100000 \+ $_AX_BOOST_BASE_TONUMERICVERSION_req_minor \* 100 \+ $_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor` - AS_VAR_SET($1,$_AX_BOOST_BASE_TONUMERICVERSION_RET) -]) - -dnl Run the detection of boost should be run only if $want_boost -AC_DEFUN([_AX_BOOST_BASE_RUNDETECT],[ - _AX_BOOST_BASE_TONUMERICVERSION(WANT_BOOST_VERSION,[$1]) - succeeded=no - - - AC_REQUIRE([AC_CANONICAL_HOST]) - dnl On 64-bit systems check for system libraries in both lib64 and lib. - dnl The former is specified by FHS, but e.g. Debian does not adhere to - dnl this (as it rises problems for generic multi-arch support). - dnl The last entry in the list is chosen by default when no libraries - dnl are found, e.g. when only header-only libraries are installed! - AS_CASE([${host_cpu}], - [x86_64],[libsubdirs="lib64 libx32 lib lib64"], - [mips*64*],[libsubdirs="lib64 lib32 lib lib64"], - [ppc64|powerpc64|s390x|sparc64|aarch64|ppc64le|powerpc64le|riscv64|e2k],[libsubdirs="lib64 lib lib64"], - [libsubdirs="lib"] - ) - - dnl allow for real multi-arch paths e.g. /usr/lib/x86_64-linux-gnu. Give - dnl them priority over the other paths since, if libs are found there, they - dnl are almost assuredly the ones desired. - AS_CASE([${host_cpu}], - [i?86],[multiarch_libsubdir="lib/i386-${host_os}"], - [armv7l],[multiarch_libsubdir="lib/arm-${host_os}"], - [multiarch_libsubdir="lib/${host_cpu}-${host_os}"] - ) - - dnl first we check the system location for boost libraries - dnl this location is chosen if boost libraries are installed with the --layout=system option - dnl or if you install boost with RPM - AS_IF([test "x$_AX_BOOST_BASE_boost_path" != "x"],[ - AC_MSG_CHECKING([for boostlib >= $1 ($WANT_BOOST_VERSION) includes in "$_AX_BOOST_BASE_boost_path/include"]) - AS_IF([test -d "$_AX_BOOST_BASE_boost_path/include" && test -r "$_AX_BOOST_BASE_boost_path/include"],[ - AC_MSG_RESULT([yes]) - BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path/include" - for _AX_BOOST_BASE_boost_path_tmp in $multiarch_libsubdir $libsubdirs; do - AC_MSG_CHECKING([for boostlib >= $1 ($WANT_BOOST_VERSION) lib path in "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp"]) - AS_IF([test -d "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp" && test -r "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp" ],[ - AC_MSG_RESULT([yes]) - break; - ], - [AC_MSG_RESULT([no])]) - done],[ - AC_MSG_RESULT([no])]) - ],[ - if test X"$cross_compiling" = Xyes; then - search_libsubdirs=$multiarch_libsubdir - else - search_libsubdirs="$multiarch_libsubdir $libsubdirs" - fi - for _AX_BOOST_BASE_boost_path_tmp in /usr /usr/local /opt /opt/local /opt/homebrew ; do - if test -d "$_AX_BOOST_BASE_boost_path_tmp/include/boost" && test -r "$_AX_BOOST_BASE_boost_path_tmp/include/boost" ; then - for libsubdir in $search_libsubdirs ; do - if ls "$_AX_BOOST_BASE_boost_path_tmp/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi - done - BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path_tmp/include" - break; - fi - done - ]) - - AC_MSG_CHECKING([for Boost headers >= $1 ($WANT_BOOST_VERSION)]) - CPPFLAGS_SAVED="$CPPFLAGS" - CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" - export CPPFLAGS - - AC_REQUIRE([AC_PROG_CXX]) - AC_LANG_PUSH(C++) - AC_COMPILE_IFELSE([_AX_BOOST_BASE_PROGRAM($WANT_BOOST_VERSION)],[ - AC_MSG_RESULT(yes) - succeeded=yes - found_system=yes - ],[ - ]) - AC_LANG_POP([C++]) - - - - dnl if we found no boost with system layout we search for boost libraries - dnl built and installed without the --layout=system option or for a staged(not installed) version - if test "x$succeeded" != "xyes" ; then - CPPFLAGS="$CPPFLAGS_SAVED" - BOOST_CPPFLAGS= - - _version=0 - if test -n "$_AX_BOOST_BASE_boost_path" ; then - if test -d "$_AX_BOOST_BASE_boost_path" && test -r "$_AX_BOOST_BASE_boost_path"; then - for i in `ls -d $_AX_BOOST_BASE_boost_path/include/boost-* 2>/dev/null`; do - _version_tmp=`echo $i | sed "s#$_AX_BOOST_BASE_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` - V_CHECK=`expr $_version_tmp \> $_version` - if test "x$V_CHECK" = "x1" ; then - _version=$_version_tmp - fi - VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` - BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path/include/boost-$VERSION_UNDERSCORE" - done - dnl if nothing found search for layout used in Windows distributions - if test -z "$BOOST_CPPFLAGS"; then - if test -d "$_AX_BOOST_BASE_boost_path/boost" && test -r "$_AX_BOOST_BASE_boost_path/boost"; then - BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path" - fi - fi - fi - else - if test "x$cross_compiling" != "xyes" ; then - for _AX_BOOST_BASE_boost_path in /usr /usr/local /opt /opt/local /opt/homebrew ; do - if test -d "$_AX_BOOST_BASE_boost_path" && test -r "$_AX_BOOST_BASE_boost_path" ; then - for i in `ls -d $_AX_BOOST_BASE_boost_path/include/boost-* 2>/dev/null`; do - _version_tmp=`echo $i | sed "s#$_AX_BOOST_BASE_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` - V_CHECK=`expr $_version_tmp \> $_version` - if test "x$V_CHECK" = "x1" ; then - _version=$_version_tmp - best_path=$_AX_BOOST_BASE_boost_path - fi - done - fi - done - - VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` - BOOST_CPPFLAGS="-I$best_path/include/boost-$VERSION_UNDERSCORE" - fi - - if test -n "$BOOST_ROOT" ; then - for libsubdir in $libsubdirs ; do - if ls "$BOOST_ROOT/stage/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi - done - if test -d "$BOOST_ROOT" && test -r "$BOOST_ROOT" && test -d "$BOOST_ROOT/stage/$libsubdir" && test -r "$BOOST_ROOT/stage/$libsubdir"; then - version_dir=`expr //$BOOST_ROOT : '.*/\(.*\)'` - stage_version=`echo $version_dir | sed 's/boost_//' | sed 's/_/./g'` - stage_version_shorten=`expr $stage_version : '\([[0-9]]*\.[[0-9]]*\)'` - V_CHECK=`expr $stage_version_shorten \>\= $_version` - if test "x$V_CHECK" = "x1" ; then - AC_MSG_NOTICE(We will use a staged boost library from $BOOST_ROOT) - BOOST_CPPFLAGS="-I$BOOST_ROOT" - fi - fi - fi - fi - - CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" - export CPPFLAGS - - AC_LANG_PUSH(C++) - AC_COMPILE_IFELSE([_AX_BOOST_BASE_PROGRAM($WANT_BOOST_VERSION)],[ - AC_MSG_RESULT(yes) - succeeded=yes - found_system=yes - ],[ - ]) - AC_LANG_POP([C++]) - fi - - if test "x$succeeded" != "xyes" ; then - if test "x$_version" = "x0" ; then - AC_MSG_NOTICE([[We could not detect the boost libraries (version $1 or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in . See http://randspringer.de/boost for more documentation.]]) - else - AC_MSG_NOTICE([Your boost libraries seems to old (version $_version).]) - fi - # execute ACTION-IF-NOT-FOUND (if present): - ifelse([$3], , :, [$3]) - else - AC_DEFINE(HAVE_BOOST,,[define if the Boost library is available]) - # execute ACTION-IF-FOUND (if present): - ifelse([$2], , :, [$2]) - fi - - CPPFLAGS="$CPPFLAGS_SAVED" -]) diff --git a/build-aux/m4/ax_check_compile_flag.m4 b/build-aux/m4/ax_check_compile_flag.m4 deleted file mode 100644 index bd753b34d7..0000000000 --- a/build-aux/m4/ax_check_compile_flag.m4 +++ /dev/null @@ -1,53 +0,0 @@ -# =========================================================================== -# https://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) -# -# DESCRIPTION -# -# Check whether the given FLAG works with the current language's compiler -# or gives an error. (Warnings, however, are ignored) -# -# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on -# success/failure. -# -# If EXTRA-FLAGS is defined, it is added to the current language's default -# flags (e.g. CFLAGS) when the check is done. The check is thus made with -# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to -# force the compiler to issue an error when a bad flag is given. -# -# INPUT gives an alternative input source to AC_COMPILE_IFELSE. -# -# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this -# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG. -# -# LICENSE -# -# Copyright (c) 2008 Guido U. Draheim -# Copyright (c) 2011 Maarten Bosmans -# -# Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice -# and this notice are preserved. This file is offered as-is, without any -# warranty. - -#serial 6 - -AC_DEFUN([AX_CHECK_COMPILE_FLAG], -[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF -AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl -AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [ - ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS - _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1" - AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], - [AS_VAR_SET(CACHEVAR,[yes])], - [AS_VAR_SET(CACHEVAR,[no])]) - _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags]) -AS_VAR_IF(CACHEVAR,yes, - [m4_default([$2], :)], - [m4_default([$3], :)]) -AS_VAR_POPDEF([CACHEVAR])dnl -])dnl AX_CHECK_COMPILE_FLAGS diff --git a/build-aux/m4/ax_check_link_flag.m4 b/build-aux/m4/ax_check_link_flag.m4 deleted file mode 100644 index 03a30ce4c7..0000000000 --- a/build-aux/m4/ax_check_link_flag.m4 +++ /dev/null @@ -1,53 +0,0 @@ -# =========================================================================== -# https://www.gnu.org/software/autoconf-archive/ax_check_link_flag.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_CHECK_LINK_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) -# -# DESCRIPTION -# -# Check whether the given FLAG works with the linker or gives an error. -# (Warnings, however, are ignored) -# -# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on -# success/failure. -# -# If EXTRA-FLAGS is defined, it is added to the linker's default flags -# when the check is done. The check is thus made with the flags: "LDFLAGS -# EXTRA-FLAGS FLAG". This can for example be used to force the linker to -# issue an error when a bad flag is given. -# -# INPUT gives an alternative input source to AC_LINK_IFELSE. -# -# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this -# macro in sync with AX_CHECK_{PREPROC,COMPILE}_FLAG. -# -# LICENSE -# -# Copyright (c) 2008 Guido U. Draheim -# Copyright (c) 2011 Maarten Bosmans -# -# Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice -# and this notice are preserved. This file is offered as-is, without any -# warranty. - -#serial 6 - -AC_DEFUN([AX_CHECK_LINK_FLAG], -[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF -AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_ldflags_$4_$1])dnl -AC_CACHE_CHECK([whether the linker accepts $1], CACHEVAR, [ - ax_check_save_flags=$LDFLAGS - LDFLAGS="$LDFLAGS $4 $1" - AC_LINK_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], - [AS_VAR_SET(CACHEVAR,[yes])], - [AS_VAR_SET(CACHEVAR,[no])]) - LDFLAGS=$ax_check_save_flags]) -AS_VAR_IF(CACHEVAR,yes, - [m4_default([$2], :)], - [m4_default([$3], :)]) -AS_VAR_POPDEF([CACHEVAR])dnl -])dnl AX_CHECK_LINK_FLAGS diff --git a/build-aux/m4/ax_check_preproc_flag.m4 b/build-aux/m4/ax_check_preproc_flag.m4 deleted file mode 100644 index e43560fbd3..0000000000 --- a/build-aux/m4/ax_check_preproc_flag.m4 +++ /dev/null @@ -1,53 +0,0 @@ -# =========================================================================== -# https://www.gnu.org/software/autoconf-archive/ax_check_preproc_flag.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_CHECK_PREPROC_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) -# -# DESCRIPTION -# -# Check whether the given FLAG works with the current language's -# preprocessor or gives an error. (Warnings, however, are ignored) -# -# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on -# success/failure. -# -# If EXTRA-FLAGS is defined, it is added to the preprocessor's default -# flags when the check is done. The check is thus made with the flags: -# "CPPFLAGS EXTRA-FLAGS FLAG". This can for example be used to force the -# preprocessor to issue an error when a bad flag is given. -# -# INPUT gives an alternative input source to AC_PREPROC_IFELSE. -# -# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this -# macro in sync with AX_CHECK_{COMPILE,LINK}_FLAG. -# -# LICENSE -# -# Copyright (c) 2008 Guido U. Draheim -# Copyright (c) 2011 Maarten Bosmans -# -# Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice -# and this notice are preserved. This file is offered as-is, without any -# warranty. - -#serial 6 - -AC_DEFUN([AX_CHECK_PREPROC_FLAG], -[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF -AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]cppflags_$4_$1])dnl -AC_CACHE_CHECK([whether _AC_LANG preprocessor accepts $1], CACHEVAR, [ - ax_check_save_flags=$CPPFLAGS - CPPFLAGS="$CPPFLAGS $4 $1" - AC_PREPROC_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], - [AS_VAR_SET(CACHEVAR,[yes])], - [AS_VAR_SET(CACHEVAR,[no])]) - CPPFLAGS=$ax_check_save_flags]) -AS_VAR_IF(CACHEVAR,yes, - [m4_default([$2], :)], - [m4_default([$3], :)]) -AS_VAR_POPDEF([CACHEVAR])dnl -])dnl AX_CHECK_PREPROC_FLAGS diff --git a/build-aux/m4/ax_cxx_compile_stdcxx.m4 b/build-aux/m4/ax_cxx_compile_stdcxx.m4 deleted file mode 100644 index 51a35054d0..0000000000 --- a/build-aux/m4/ax_cxx_compile_stdcxx.m4 +++ /dev/null @@ -1,1005 +0,0 @@ -# =========================================================================== -# https://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_CXX_COMPILE_STDCXX(VERSION, [ext|noext], [mandatory|optional]) -# -# DESCRIPTION -# -# Check for baseline language coverage in the compiler for the specified -# version of the C++ standard. If necessary, add switches to CXX and -# CXXCPP to enable support. VERSION may be '11', '14', '17', or '20' for -# the respective C++ standard version. -# -# The second argument, if specified, indicates whether you insist on an -# extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g. -# -std=c++11). If neither is specified, you get whatever works, with -# preference for no added switch, and then for an extended mode. -# -# The third argument, if specified 'mandatory' or if left unspecified, -# indicates that baseline support for the specified C++ standard is -# required and that the macro should error out if no mode with that -# support is found. If specified 'optional', then configuration proceeds -# regardless, after defining HAVE_CXX${VERSION} if and only if a -# supporting mode is found. -# -# LICENSE -# -# Copyright (c) 2008 Benjamin Kosnik -# Copyright (c) 2012 Zack Weinberg -# Copyright (c) 2013 Roy Stogner -# Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov -# Copyright (c) 2015 Paul Norman -# Copyright (c) 2015 Moritz Klammler -# Copyright (c) 2016, 2018 Krzesimir Nowak -# Copyright (c) 2019 Enji Cooper -# Copyright (c) 2020 Jason Merrill -# Copyright (c) 2021 Jörn Heusipp -# -# Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice -# and this notice are preserved. This file is offered as-is, without any -# warranty. - -#serial 14 - -dnl This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro -dnl (serial version number 13). - -AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl - m4_if([$1], [11], [ax_cxx_compile_alternatives="11 0x"], - [$1], [14], [ax_cxx_compile_alternatives="14 1y"], - [$1], [17], [ax_cxx_compile_alternatives="17 1z"], - [$1], [20], [ax_cxx_compile_alternatives="20"], - [m4_fatal([invalid first argument `$1' to AX_CXX_COMPILE_STDCXX])])dnl - m4_if([$2], [], [], - [$2], [ext], [], - [$2], [noext], [], - [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX])])dnl - m4_if([$3], [], [ax_cxx_compile_cxx$1_required=true], - [$3], [mandatory], [ax_cxx_compile_cxx$1_required=true], - [$3], [optional], [ax_cxx_compile_cxx$1_required=false], - [m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])]) - AC_LANG_PUSH([C++])dnl - ac_success=no - - m4_if([$2], [], [dnl - AC_CACHE_CHECK(whether $CXX supports C++$1 features by default, - ax_cv_cxx_compile_cxx$1, - [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], - [ax_cv_cxx_compile_cxx$1=yes], - [ax_cv_cxx_compile_cxx$1=no])]) - if test x$ax_cv_cxx_compile_cxx$1 = xyes; then - ac_success=yes - fi]) - - m4_if([$2], [noext], [], [dnl - if test x$ac_success = xno; then - for alternative in ${ax_cxx_compile_alternatives}; do - switch="-std=gnu++${alternative}" - cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch]) - AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, - $cachevar, - [ac_save_CXX="$CXX" - CXX="$CXX $switch" - AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], - [eval $cachevar=yes], - [eval $cachevar=no]) - CXX="$ac_save_CXX"]) - if eval test x\$$cachevar = xyes; then - CXX="$CXX $switch" - if test -n "$CXXCPP" ; then - CXXCPP="$CXXCPP $switch" - fi - ac_success=yes - break - fi - done - fi]) - - m4_if([$2], [ext], [], [dnl - if test x$ac_success = xno; then - dnl HP's aCC needs +std=c++11 according to: - dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf - dnl Cray's crayCC needs "-h std=c++11" - for alternative in ${ax_cxx_compile_alternatives}; do - for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}"; do - cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch]) - AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, - $cachevar, - [ac_save_CXX="$CXX" - CXX="$CXX $switch" - AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], - [eval $cachevar=yes], - [eval $cachevar=no]) - CXX="$ac_save_CXX"]) - if eval test x\$$cachevar = xyes; then - CXX="$CXX $switch" - if test -n "$CXXCPP" ; then - CXXCPP="$CXXCPP $switch" - fi - ac_success=yes - break - fi - done - if test x$ac_success = xyes; then - break - fi - done - fi]) - AC_LANG_POP([C++]) - if test x$ax_cxx_compile_cxx$1_required = xtrue; then - if test x$ac_success = xno; then - AC_MSG_ERROR([*** A compiler with support for C++$1 language features is required.]) - fi - fi - if test x$ac_success = xno; then - HAVE_CXX$1=0 - AC_MSG_NOTICE([No compiler with C++$1 support was found]) - else - HAVE_CXX$1=1 - AC_DEFINE(HAVE_CXX$1,1, - [define if the compiler supports basic C++$1 syntax]) - fi - AC_SUBST(HAVE_CXX$1) -]) - - -dnl Test body for checking C++11 support - -m4_define([_AX_CXX_COMPILE_STDCXX_testbody_11], - _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 -) - -dnl Test body for checking C++14 support - -m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14], - _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 - _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 -) - -dnl Test body for checking C++17 support - -m4_define([_AX_CXX_COMPILE_STDCXX_testbody_17], - _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 - _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 - _AX_CXX_COMPILE_STDCXX_testbody_new_in_17 -) - -dnl Test body for checking C++20 support - -m4_define([_AX_CXX_COMPILE_STDCXX_testbody_20], - _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 - _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 - _AX_CXX_COMPILE_STDCXX_testbody_new_in_17 - _AX_CXX_COMPILE_STDCXX_testbody_new_in_20 -) - - -dnl Tests for new features in C++11 - -m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[ - -// If the compiler admits that it is not ready for C++11, why torture it? -// Hopefully, this will speed up the test. - -#ifndef __cplusplus - -#error "This is not a C++ compiler" - -#elif __cplusplus < 201103L - -#error "This is not a C++11 compiler" - -#else - -namespace cxx11 -{ - - namespace test_static_assert - { - - template - struct check - { - static_assert(sizeof(int) <= sizeof(T), "not big enough"); - }; - - } - - namespace test_final_override - { - - struct Base - { - virtual ~Base() {} - virtual void f() {} - }; - - struct Derived : public Base - { - virtual ~Derived() override {} - virtual void f() override {} - }; - - } - - namespace test_double_right_angle_brackets - { - - template < typename T > - struct check {}; - - typedef check single_type; - typedef check> double_type; - typedef check>> triple_type; - typedef check>>> quadruple_type; - - } - - namespace test_decltype - { - - int - f() - { - int a = 1; - decltype(a) b = 2; - return a + b; - } - - } - - namespace test_type_deduction - { - - template < typename T1, typename T2 > - struct is_same - { - static const bool value = false; - }; - - template < typename T > - struct is_same - { - static const bool value = true; - }; - - template < typename T1, typename T2 > - auto - add(T1 a1, T2 a2) -> decltype(a1 + a2) - { - return a1 + a2; - } - - int - test(const int c, volatile int v) - { - static_assert(is_same::value == true, ""); - static_assert(is_same::value == false, ""); - static_assert(is_same::value == false, ""); - auto ac = c; - auto av = v; - auto sumi = ac + av + 'x'; - auto sumf = ac + av + 1.0; - static_assert(is_same::value == true, ""); - static_assert(is_same::value == true, ""); - static_assert(is_same::value == true, ""); - static_assert(is_same::value == false, ""); - static_assert(is_same::value == true, ""); - return (sumf > 0.0) ? sumi : add(c, v); - } - - } - - namespace test_noexcept - { - - int f() { return 0; } - int g() noexcept { return 0; } - - static_assert(noexcept(f()) == false, ""); - static_assert(noexcept(g()) == true, ""); - - } - - namespace test_constexpr - { - - template < typename CharT > - unsigned long constexpr - strlen_c_r(const CharT *const s, const unsigned long acc) noexcept - { - return *s ? strlen_c_r(s + 1, acc + 1) : acc; - } - - template < typename CharT > - unsigned long constexpr - strlen_c(const CharT *const s) noexcept - { - return strlen_c_r(s, 0UL); - } - - static_assert(strlen_c("") == 0UL, ""); - static_assert(strlen_c("1") == 1UL, ""); - static_assert(strlen_c("example") == 7UL, ""); - static_assert(strlen_c("another\0example") == 7UL, ""); - - } - - namespace test_rvalue_references - { - - template < int N > - struct answer - { - static constexpr int value = N; - }; - - answer<1> f(int&) { return answer<1>(); } - answer<2> f(const int&) { return answer<2>(); } - answer<3> f(int&&) { return answer<3>(); } - - void - test() - { - int i = 0; - const int c = 0; - static_assert(decltype(f(i))::value == 1, ""); - static_assert(decltype(f(c))::value == 2, ""); - static_assert(decltype(f(0))::value == 3, ""); - } - - } - - namespace test_uniform_initialization - { - - struct test - { - static const int zero {}; - static const int one {1}; - }; - - static_assert(test::zero == 0, ""); - static_assert(test::one == 1, ""); - - } - - namespace test_lambdas - { - - void - test1() - { - auto lambda1 = [](){}; - auto lambda2 = lambda1; - lambda1(); - lambda2(); - } - - int - test2() - { - auto a = [](int i, int j){ return i + j; }(1, 2); - auto b = []() -> int { return '0'; }(); - auto c = [=](){ return a + b; }(); - auto d = [&](){ return c; }(); - auto e = [a, &b](int x) mutable { - const auto identity = [](int y){ return y; }; - for (auto i = 0; i < a; ++i) - a += b--; - return x + identity(a + b); - }(0); - return a + b + c + d + e; - } - - int - test3() - { - const auto nullary = [](){ return 0; }; - const auto unary = [](int x){ return x; }; - using nullary_t = decltype(nullary); - using unary_t = decltype(unary); - const auto higher1st = [](nullary_t f){ return f(); }; - const auto higher2nd = [unary](nullary_t f1){ - return [unary, f1](unary_t f2){ return f2(unary(f1())); }; - }; - return higher1st(nullary) + higher2nd(nullary)(unary); - } - - } - - namespace test_variadic_templates - { - - template - struct sum; - - template - struct sum - { - static constexpr auto value = N0 + sum::value; - }; - - template <> - struct sum<> - { - static constexpr auto value = 0; - }; - - static_assert(sum<>::value == 0, ""); - static_assert(sum<1>::value == 1, ""); - static_assert(sum<23>::value == 23, ""); - static_assert(sum<1, 2>::value == 3, ""); - static_assert(sum<5, 5, 11>::value == 21, ""); - static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, ""); - - } - - // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae - // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function - // because of this. - namespace test_template_alias_sfinae - { - - struct foo {}; - - template - using member = typename T::member_type; - - template - void func(...) {} - - template - void func(member*) {} - - void test(); - - void test() { func(0); } - - } - -} // namespace cxx11 - -#endif // __cplusplus >= 201103L - -]]) - - -dnl Tests for new features in C++14 - -m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_14], [[ - -// If the compiler admits that it is not ready for C++14, why torture it? -// Hopefully, this will speed up the test. - -#ifndef __cplusplus - -#error "This is not a C++ compiler" - -#elif __cplusplus < 201402L - -#error "This is not a C++14 compiler" - -#else - -namespace cxx14 -{ - - namespace test_polymorphic_lambdas - { - - int - test() - { - const auto lambda = [](auto&&... args){ - const auto istiny = [](auto x){ - return (sizeof(x) == 1UL) ? 1 : 0; - }; - const int aretiny[] = { istiny(args)... }; - return aretiny[0]; - }; - return lambda(1, 1L, 1.0f, '1'); - } - - } - - namespace test_binary_literals - { - - constexpr auto ivii = 0b0000000000101010; - static_assert(ivii == 42, "wrong value"); - - } - - namespace test_generalized_constexpr - { - - template < typename CharT > - constexpr unsigned long - strlen_c(const CharT *const s) noexcept - { - auto length = 0UL; - for (auto p = s; *p; ++p) - ++length; - return length; - } - - static_assert(strlen_c("") == 0UL, ""); - static_assert(strlen_c("x") == 1UL, ""); - static_assert(strlen_c("test") == 4UL, ""); - static_assert(strlen_c("another\0test") == 7UL, ""); - - } - - namespace test_lambda_init_capture - { - - int - test() - { - auto x = 0; - const auto lambda1 = [a = x](int b){ return a + b; }; - const auto lambda2 = [a = lambda1(x)](){ return a; }; - return lambda2(); - } - - } - - namespace test_digit_separators - { - - constexpr auto ten_million = 100'000'000; - static_assert(ten_million == 100000000, ""); - - } - - namespace test_return_type_deduction - { - - auto f(int& x) { return x; } - decltype(auto) g(int& x) { return x; } - - template < typename T1, typename T2 > - struct is_same - { - static constexpr auto value = false; - }; - - template < typename T > - struct is_same - { - static constexpr auto value = true; - }; - - int - test() - { - auto x = 0; - static_assert(is_same::value, ""); - static_assert(is_same::value, ""); - return x; - } - - } - -} // namespace cxx14 - -#endif // __cplusplus >= 201402L - -]]) - - -dnl Tests for new features in C++17 - -m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_17], [[ - -// If the compiler admits that it is not ready for C++17, why torture it? -// Hopefully, this will speed up the test. - -#ifndef __cplusplus - -#error "This is not a C++ compiler" - -#elif __cplusplus < 201703L - -#error "This is not a C++17 compiler" - -#else - -#include -#include -#include - -namespace cxx17 -{ - - namespace test_constexpr_lambdas - { - - constexpr int foo = [](){return 42;}(); - - } - - namespace test::nested_namespace::definitions - { - - } - - namespace test_fold_expression - { - - template - int multiply(Args... args) - { - return (args * ... * 1); - } - - template - bool all(Args... args) - { - return (args && ...); - } - - } - - namespace test_extended_static_assert - { - - static_assert (true); - - } - - namespace test_auto_brace_init_list - { - - auto foo = {5}; - auto bar {5}; - - static_assert(std::is_same, decltype(foo)>::value); - static_assert(std::is_same::value); - } - - namespace test_typename_in_template_template_parameter - { - - template typename X> struct D; - - } - - namespace test_fallthrough_nodiscard_maybe_unused_attributes - { - - int f1() - { - return 42; - } - - [[nodiscard]] int f2() - { - [[maybe_unused]] auto unused = f1(); - - switch (f1()) - { - case 17: - f1(); - [[fallthrough]]; - case 42: - f1(); - } - return f1(); - } - - } - - namespace test_extended_aggregate_initialization - { - - struct base1 - { - int b1, b2 = 42; - }; - - struct base2 - { - base2() { - b3 = 42; - } - int b3; - }; - - struct derived : base1, base2 - { - int d; - }; - - derived d1 {{1, 2}, {}, 4}; // full initialization - derived d2 {{}, {}, 4}; // value-initialized bases - - } - - namespace test_general_range_based_for_loop - { - - struct iter - { - int i; - - int& operator* () - { - return i; - } - - const int& operator* () const - { - return i; - } - - iter& operator++() - { - ++i; - return *this; - } - }; - - struct sentinel - { - int i; - }; - - bool operator== (const iter& i, const sentinel& s) - { - return i.i == s.i; - } - - bool operator!= (const iter& i, const sentinel& s) - { - return !(i == s); - } - - struct range - { - iter begin() const - { - return {0}; - } - - sentinel end() const - { - return {5}; - } - }; - - void f() - { - range r {}; - - for (auto i : r) - { - [[maybe_unused]] auto v = i; - } - } - - } - - namespace test_lambda_capture_asterisk_this_by_value - { - - struct t - { - int i; - int foo() - { - return [*this]() - { - return i; - }(); - } - }; - - } - - namespace test_enum_class_construction - { - - enum class byte : unsigned char - {}; - - byte foo {42}; - - } - - namespace test_constexpr_if - { - - template - int f () - { - if constexpr(cond) - { - return 13; - } - else - { - return 42; - } - } - - } - - namespace test_selection_statement_with_initializer - { - - int f() - { - return 13; - } - - int f2() - { - if (auto i = f(); i > 0) - { - return 3; - } - - switch (auto i = f(); i + 4) - { - case 17: - return 2; - - default: - return 1; - } - } - - } - - namespace test_template_argument_deduction_for_class_templates - { - - template - struct pair - { - pair (T1 p1, T2 p2) - : m1 {p1}, - m2 {p2} - {} - - T1 m1; - T2 m2; - }; - - void f() - { - [[maybe_unused]] auto p = pair{13, 42u}; - } - - } - - namespace test_non_type_auto_template_parameters - { - - template - struct B - {}; - - B<5> b1; - B<'a'> b2; - - } - - namespace test_structured_bindings - { - - int arr[2] = { 1, 2 }; - std::pair pr = { 1, 2 }; - - auto f1() -> int(&)[2] - { - return arr; - } - - auto f2() -> std::pair& - { - return pr; - } - - struct S - { - int x1 : 2; - volatile double y1; - }; - - S f3() - { - return {}; - } - - auto [ x1, y1 ] = f1(); - auto& [ xr1, yr1 ] = f1(); - auto [ x2, y2 ] = f2(); - auto& [ xr2, yr2 ] = f2(); - const auto [ x3, y3 ] = f3(); - - } - - namespace test_exception_spec_type_system - { - - struct Good {}; - struct Bad {}; - - void g1() noexcept; - void g2(); - - template - Bad - f(T*, T*); - - template - Good - f(T1*, T2*); - - static_assert (std::is_same_v); - - } - - namespace test_inline_variables - { - - template void f(T) - {} - - template inline T g(T) - { - return T{}; - } - - template<> inline void f<>(int) - {} - - template<> int g<>(int) - { - return 5; - } - - } - -} // namespace cxx17 - -#endif // __cplusplus < 201703L - -]]) - - -dnl Tests for new features in C++20 - -m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_20], [[ - -#ifndef __cplusplus - -#error "This is not a C++ compiler" - -#elif __cplusplus < 202002L - -#error "This is not a C++20 compiler" - -#else - -#include - -namespace cxx20 -{ - -// As C++20 supports feature test macros in the standard, there is no -// immediate need to actually test for feature availability on the -// Autoconf side. - -} // namespace cxx20 - -#endif // __cplusplus < 202002L - -]]) diff --git a/build-aux/m4/ax_pthread.m4 b/build-aux/m4/ax_pthread.m4 deleted file mode 100644 index 9f35d13914..0000000000 --- a/build-aux/m4/ax_pthread.m4 +++ /dev/null @@ -1,522 +0,0 @@ -# =========================================================================== -# https://www.gnu.org/software/autoconf-archive/ax_pthread.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) -# -# DESCRIPTION -# -# This macro figures out how to build C programs using POSIX threads. It -# sets the PTHREAD_LIBS output variable to the threads library and linker -# flags, and the PTHREAD_CFLAGS output variable to any special C compiler -# flags that are needed. (The user can also force certain compiler -# flags/libs to be tested by setting these environment variables.) -# -# Also sets PTHREAD_CC and PTHREAD_CXX to any special C compiler that is -# needed for multi-threaded programs (defaults to the value of CC -# respectively CXX otherwise). (This is necessary on e.g. AIX to use the -# special cc_r/CC_r compiler alias.) -# -# NOTE: You are assumed to not only compile your program with these flags, -# but also to link with them as well. For example, you might link with -# $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS -# $PTHREAD_CXX $CXXFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS -# -# If you are only building threaded programs, you may wish to use these -# variables in your default LIBS, CFLAGS, and CC: -# -# LIBS="$PTHREAD_LIBS $LIBS" -# CFLAGS="$CFLAGS $PTHREAD_CFLAGS" -# CXXFLAGS="$CXXFLAGS $PTHREAD_CFLAGS" -# CC="$PTHREAD_CC" -# CXX="$PTHREAD_CXX" -# -# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant -# has a nonstandard name, this macro defines PTHREAD_CREATE_JOINABLE to -# that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). -# -# Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the -# PTHREAD_PRIO_INHERIT symbol is defined when compiling with -# PTHREAD_CFLAGS. -# -# ACTION-IF-FOUND is a list of shell commands to run if a threads library -# is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it -# is not found. If ACTION-IF-FOUND is not specified, the default action -# will define HAVE_PTHREAD. -# -# Please let the authors know if this macro fails on any platform, or if -# you have any other suggestions or comments. This macro was based on work -# by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help -# from M. Frigo), as well as ac_pthread and hb_pthread macros posted by -# Alejandro Forero Cuervo to the autoconf macro repository. We are also -# grateful for the helpful feedback of numerous users. -# -# Updated for Autoconf 2.68 by Daniel Richard G. -# -# LICENSE -# -# Copyright (c) 2008 Steven G. Johnson -# Copyright (c) 2011 Daniel Richard G. -# Copyright (c) 2019 Marc Stevens -# -# This program is free software: you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the -# Free Software Foundation, either version 3 of the License, or (at your -# option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General -# Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program. If not, see . -# -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well. - -#serial 31 - -AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD]) -AC_DEFUN([AX_PTHREAD], [ -AC_REQUIRE([AC_CANONICAL_HOST]) -AC_REQUIRE([AC_PROG_CC]) -AC_REQUIRE([AC_PROG_SED]) -AC_LANG_PUSH([C]) -ax_pthread_ok=no - -# We used to check for pthread.h first, but this fails if pthread.h -# requires special compiler flags (e.g. on Tru64 or Sequent). -# It gets checked for in the link test anyway. - -# First of all, check if the user has set any of the PTHREAD_LIBS, -# etcetera environment variables, and if threads linking works using -# them: -if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then - ax_pthread_save_CC="$CC" - ax_pthread_save_CFLAGS="$CFLAGS" - ax_pthread_save_LIBS="$LIBS" - AS_IF([test "x$PTHREAD_CC" != "x"], [CC="$PTHREAD_CC"]) - AS_IF([test "x$PTHREAD_CXX" != "x"], [CXX="$PTHREAD_CXX"]) - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - LIBS="$PTHREAD_LIBS $LIBS" - AC_MSG_CHECKING([for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS]) - AC_LINK_IFELSE([AC_LANG_CALL([], [pthread_join])], [ax_pthread_ok=yes]) - AC_MSG_RESULT([$ax_pthread_ok]) - if test "x$ax_pthread_ok" = "xno"; then - PTHREAD_LIBS="" - PTHREAD_CFLAGS="" - fi - CC="$ax_pthread_save_CC" - CFLAGS="$ax_pthread_save_CFLAGS" - LIBS="$ax_pthread_save_LIBS" -fi - -# We must check for the threads library under a number of different -# names; the ordering is very important because some systems -# (e.g. DEC) have both -lpthread and -lpthreads, where one of the -# libraries is broken (non-POSIX). - -# Create a list of thread flags to try. Items with a "," contain both -# C compiler flags (before ",") and linker flags (after ","). Other items -# starting with a "-" are C compiler flags, and remaining items are -# library names, except for "none" which indicates that we try without -# any flags at all, and "pthread-config" which is a program returning -# the flags for the Pth emulation library. - -ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" - -# The ordering *is* (sometimes) important. Some notes on the -# individual items follow: - -# pthreads: AIX (must check this before -lpthread) -# none: in case threads are in libc; should be tried before -Kthread and -# other compiler flags to prevent continual compiler warnings -# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) -# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64 -# (Note: HP C rejects this with "bad form for `-t' option") -# -pthreads: Solaris/gcc (Note: HP C also rejects) -# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it -# doesn't hurt to check since this sometimes defines pthreads and -# -D_REENTRANT too), HP C (must be checked before -lpthread, which -# is present but should not be used directly; and before -mthreads, -# because the compiler interprets this as "-mt" + "-hreads") -# -mthreads: Mingw32/gcc, Lynx/gcc -# pthread: Linux, etcetera -# --thread-safe: KAI C++ -# pthread-config: use pthread-config program (for GNU Pth library) - -case $host_os in - - freebsd*) - - # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) - # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) - - ax_pthread_flags="-kthread lthread $ax_pthread_flags" - ;; - - hpux*) - - # From the cc(1) man page: "[-mt] Sets various -D flags to enable - # multi-threading and also sets -lpthread." - - ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags" - ;; - - openedition*) - - # IBM z/OS requires a feature-test macro to be defined in order to - # enable POSIX threads at all, so give the user a hint if this is - # not set. (We don't define these ourselves, as they can affect - # other portions of the system API in unpredictable ways.) - - AC_EGREP_CPP([AX_PTHREAD_ZOS_MISSING], - [ -# if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS) - AX_PTHREAD_ZOS_MISSING -# endif - ], - [AC_MSG_WARN([IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support.])]) - ;; - - solaris*) - - # On Solaris (at least, for some versions), libc contains stubbed - # (non-functional) versions of the pthreads routines, so link-based - # tests will erroneously succeed. (N.B.: The stubs are missing - # pthread_cleanup_push, or rather a function called by this macro, - # so we could check for that, but who knows whether they'll stub - # that too in a future libc.) So we'll check first for the - # standard Solaris way of linking pthreads (-mt -lpthread). - - ax_pthread_flags="-mt,-lpthread pthread $ax_pthread_flags" - ;; -esac - -# Are we compiling with Clang? - -AC_CACHE_CHECK([whether $CC is Clang], - [ax_cv_PTHREAD_CLANG], - [ax_cv_PTHREAD_CLANG=no - # Note that Autoconf sets GCC=yes for Clang as well as GCC - if test "x$GCC" = "xyes"; then - AC_EGREP_CPP([AX_PTHREAD_CC_IS_CLANG], - [/* Note: Clang 2.7 lacks __clang_[a-z]+__ */ -# if defined(__clang__) && defined(__llvm__) - AX_PTHREAD_CC_IS_CLANG -# endif - ], - [ax_cv_PTHREAD_CLANG=yes]) - fi - ]) -ax_pthread_clang="$ax_cv_PTHREAD_CLANG" - - -# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC) - -# Note that for GCC and Clang -pthread generally implies -lpthread, -# except when -nostdlib is passed. -# This is problematic using libtool to build C++ shared libraries with pthread: -# [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25460 -# [2] https://bugzilla.redhat.com/show_bug.cgi?id=661333 -# [3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=468555 -# To solve this, first try -pthread together with -lpthread for GCC - -AS_IF([test "x$GCC" = "xyes"], - [ax_pthread_flags="-pthread,-lpthread -pthread -pthreads $ax_pthread_flags"]) - -# Clang takes -pthread (never supported any other flag), but we'll try with -lpthread first - -AS_IF([test "x$ax_pthread_clang" = "xyes"], - [ax_pthread_flags="-pthread,-lpthread -pthread"]) - - -# The presence of a feature test macro requesting re-entrant function -# definitions is, on some systems, a strong hint that pthreads support is -# correctly enabled - -case $host_os in - darwin* | hpux* | linux* | osf* | solaris*) - ax_pthread_check_macro="_REENTRANT" - ;; - - aix*) - ax_pthread_check_macro="_THREAD_SAFE" - ;; - - *) - ax_pthread_check_macro="--" - ;; -esac -AS_IF([test "x$ax_pthread_check_macro" = "x--"], - [ax_pthread_check_cond=0], - [ax_pthread_check_cond="!defined($ax_pthread_check_macro)"]) - - -if test "x$ax_pthread_ok" = "xno"; then -for ax_pthread_try_flag in $ax_pthread_flags; do - - case $ax_pthread_try_flag in - none) - AC_MSG_CHECKING([whether pthreads work without any flags]) - ;; - - *,*) - PTHREAD_CFLAGS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\1/"` - PTHREAD_LIBS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\2/"` - AC_MSG_CHECKING([whether pthreads work with "$PTHREAD_CFLAGS" and "$PTHREAD_LIBS"]) - ;; - - -*) - AC_MSG_CHECKING([whether pthreads work with $ax_pthread_try_flag]) - PTHREAD_CFLAGS="$ax_pthread_try_flag" - ;; - - pthread-config) - AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no]) - AS_IF([test "x$ax_pthread_config" = "xno"], [continue]) - PTHREAD_CFLAGS="`pthread-config --cflags`" - PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" - ;; - - *) - AC_MSG_CHECKING([for the pthreads library -l$ax_pthread_try_flag]) - PTHREAD_LIBS="-l$ax_pthread_try_flag" - ;; - esac - - ax_pthread_save_CFLAGS="$CFLAGS" - ax_pthread_save_LIBS="$LIBS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - LIBS="$PTHREAD_LIBS $LIBS" - - # Check for various functions. We must include pthread.h, - # since some functions may be macros. (On the Sequent, we - # need a special flag -Kthread to make this header compile.) - # We check for pthread_join because it is in -lpthread on IRIX - # while pthread_create is in libc. We check for pthread_attr_init - # due to DEC craziness with -lpthreads. We check for - # pthread_cleanup_push because it is one of the few pthread - # functions on Solaris that doesn't have a non-functional libc stub. - # We try pthread_create on general principles. - - AC_LINK_IFELSE([AC_LANG_PROGRAM([#include -# if $ax_pthread_check_cond -# error "$ax_pthread_check_macro must be defined" -# endif - static void *some_global = NULL; - static void routine(void *a) - { - /* To avoid any unused-parameter or - unused-but-set-parameter warning. */ - some_global = a; - } - static void *start_routine(void *a) { return a; }], - [pthread_t th; pthread_attr_t attr; - pthread_create(&th, 0, start_routine, 0); - pthread_join(th, 0); - pthread_attr_init(&attr); - pthread_cleanup_push(routine, 0); - pthread_cleanup_pop(0) /* ; */])], - [ax_pthread_ok=yes], - []) - - CFLAGS="$ax_pthread_save_CFLAGS" - LIBS="$ax_pthread_save_LIBS" - - AC_MSG_RESULT([$ax_pthread_ok]) - AS_IF([test "x$ax_pthread_ok" = "xyes"], [break]) - - PTHREAD_LIBS="" - PTHREAD_CFLAGS="" -done -fi - - -# Clang needs special handling, because older versions handle the -pthread -# option in a rather... idiosyncratic way - -if test "x$ax_pthread_clang" = "xyes"; then - - # Clang takes -pthread; it has never supported any other flag - - # (Note 1: This will need to be revisited if a system that Clang - # supports has POSIX threads in a separate library. This tends not - # to be the way of modern systems, but it's conceivable.) - - # (Note 2: On some systems, notably Darwin, -pthread is not needed - # to get POSIX threads support; the API is always present and - # active. We could reasonably leave PTHREAD_CFLAGS empty. But - # -pthread does define _REENTRANT, and while the Darwin headers - # ignore this macro, third-party headers might not.) - - # However, older versions of Clang make a point of warning the user - # that, in an invocation where only linking and no compilation is - # taking place, the -pthread option has no effect ("argument unused - # during compilation"). They expect -pthread to be passed in only - # when source code is being compiled. - # - # Problem is, this is at odds with the way Automake and most other - # C build frameworks function, which is that the same flags used in - # compilation (CFLAGS) are also used in linking. Many systems - # supported by AX_PTHREAD require exactly this for POSIX threads - # support, and in fact it is often not straightforward to specify a - # flag that is used only in the compilation phase and not in - # linking. Such a scenario is extremely rare in practice. - # - # Even though use of the -pthread flag in linking would only print - # a warning, this can be a nuisance for well-run software projects - # that build with -Werror. So if the active version of Clang has - # this misfeature, we search for an option to squash it. - - AC_CACHE_CHECK([whether Clang needs flag to prevent "argument unused" warning when linking with -pthread], - [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG], - [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown - # Create an alternate version of $ac_link that compiles and - # links in two steps (.c -> .o, .o -> exe) instead of one - # (.c -> exe), because the warning occurs only in the second - # step - ax_pthread_save_ac_link="$ac_link" - ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g' - ax_pthread_link_step=`AS_ECHO(["$ac_link"]) | sed "$ax_pthread_sed"` - ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)" - ax_pthread_save_CFLAGS="$CFLAGS" - for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do - AS_IF([test "x$ax_pthread_try" = "xunknown"], [break]) - CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS" - ac_link="$ax_pthread_save_ac_link" - AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])], - [ac_link="$ax_pthread_2step_ac_link" - AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])], - [break]) - ]) - done - ac_link="$ax_pthread_save_ac_link" - CFLAGS="$ax_pthread_save_CFLAGS" - AS_IF([test "x$ax_pthread_try" = "x"], [ax_pthread_try=no]) - ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try" - ]) - - case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in - no | unknown) ;; - *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;; - esac - -fi # $ax_pthread_clang = yes - - - -# Various other checks: -if test "x$ax_pthread_ok" = "xyes"; then - ax_pthread_save_CFLAGS="$CFLAGS" - ax_pthread_save_LIBS="$LIBS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - LIBS="$PTHREAD_LIBS $LIBS" - - # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. - AC_CACHE_CHECK([for joinable pthread attribute], - [ax_cv_PTHREAD_JOINABLE_ATTR], - [ax_cv_PTHREAD_JOINABLE_ATTR=unknown - for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do - AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], - [int attr = $ax_pthread_attr; return attr /* ; */])], - [ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break], - []) - done - ]) - AS_IF([test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \ - test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \ - test "x$ax_pthread_joinable_attr_defined" != "xyes"], - [AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE], - [$ax_cv_PTHREAD_JOINABLE_ATTR], - [Define to necessary symbol if this constant - uses a non-standard name on your system.]) - ax_pthread_joinable_attr_defined=yes - ]) - - AC_CACHE_CHECK([whether more special flags are required for pthreads], - [ax_cv_PTHREAD_SPECIAL_FLAGS], - [ax_cv_PTHREAD_SPECIAL_FLAGS=no - case $host_os in - solaris*) - ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS" - ;; - esac - ]) - AS_IF([test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \ - test "x$ax_pthread_special_flags_added" != "xyes"], - [PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS" - ax_pthread_special_flags_added=yes]) - - AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT], - [ax_cv_PTHREAD_PRIO_INHERIT], - [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], - [[int i = PTHREAD_PRIO_INHERIT; - return i;]])], - [ax_cv_PTHREAD_PRIO_INHERIT=yes], - [ax_cv_PTHREAD_PRIO_INHERIT=no]) - ]) - AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \ - test "x$ax_pthread_prio_inherit_defined" != "xyes"], - [AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.]) - ax_pthread_prio_inherit_defined=yes - ]) - - CFLAGS="$ax_pthread_save_CFLAGS" - LIBS="$ax_pthread_save_LIBS" - - # More AIX lossage: compile with *_r variant - if test "x$GCC" != "xyes"; then - case $host_os in - aix*) - AS_CASE(["x/$CC"], - [x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6], - [#handle absolute path differently from PATH based program lookup - AS_CASE(["x$CC"], - [x/*], - [ - AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"]) - AS_IF([test "x${CXX}" != "x"], [AS_IF([AS_EXECUTABLE_P([${CXX}_r])],[PTHREAD_CXX="${CXX}_r"])]) - ], - [ - AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC]) - AS_IF([test "x${CXX}" != "x"], [AC_CHECK_PROGS([PTHREAD_CXX],[${CXX}_r],[$CXX])]) - ] - ) - ]) - ;; - esac - fi -fi - -test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" -test -n "$PTHREAD_CXX" || PTHREAD_CXX="$CXX" - -AC_SUBST([PTHREAD_LIBS]) -AC_SUBST([PTHREAD_CFLAGS]) -AC_SUBST([PTHREAD_CC]) -AC_SUBST([PTHREAD_CXX]) - -# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: -if test "x$ax_pthread_ok" = "xyes"; then - ifelse([$1],,[AC_DEFINE([HAVE_PTHREAD],[1],[Define if you have POSIX threads libraries and header files.])],[$1]) - : -else - ax_pthread_ok=no - $2 -fi -AC_LANG_POP -])dnl AX_PTHREAD diff --git a/build-aux/m4/l_atomic.m4 b/build-aux/m4/l_atomic.m4 deleted file mode 100644 index 859ddaabbb..0000000000 --- a/build-aux/m4/l_atomic.m4 +++ /dev/null @@ -1,65 +0,0 @@ -dnl Copyright (c) 2015 Tim Kosse -dnl Copying and distribution of this file, with or without modification, are -dnl permitted in any medium without royalty provided the copyright notice -dnl and this notice are preserved. This file is offered as-is, without any -dnl warranty. - -# Clang, when building for 32-bit, -# and linking against libstdc++, requires linking with -# -latomic if using the C++ atomic library. -# Can be tested with: clang++ -std=c++20 test.cpp -m32 -# -# Sourced from http://bugs.debian.org/797228 - -m4_define([_CHECK_ATOMIC_testbody], [[ - #include - #include - #include - - using namespace std::chrono_literals; - - int main() { - std::atomic lock{true}; - lock.exchange(false); - - std::atomic t{0s}; - t.store(2s); - auto t1 = t.load(); - t.compare_exchange_strong(t1, 3s); - - std::atomic d{}; - d.store(3.14); - auto d1 = d.load(); - - std::atomic a{}; - int64_t v = 5; - int64_t r = a.fetch_add(v); - return static_cast(r); - } -]]) - -AC_DEFUN([CHECK_ATOMIC], [ - - AC_LANG_PUSH(C++) - TEMP_CXXFLAGS="$CXXFLAGS" - CXXFLAGS="$CXXFLAGS $PTHREAD_CFLAGS" - - AC_MSG_CHECKING([whether std::atomic can be used without link library]) - - AC_LINK_IFELSE([AC_LANG_SOURCE([_CHECK_ATOMIC_testbody])],[ - AC_MSG_RESULT([yes]) - ],[ - AC_MSG_RESULT([no]) - LIBS="$LIBS -latomic" - AC_MSG_CHECKING([whether std::atomic needs -latomic]) - AC_LINK_IFELSE([AC_LANG_SOURCE([_CHECK_ATOMIC_testbody])],[ - AC_MSG_RESULT([yes]) - ],[ - AC_MSG_RESULT([no]) - AC_MSG_FAILURE([cannot figure out how to use std::atomic]) - ]) - ]) - - CXXFLAGS="$TEMP_CXXFLAGS" - AC_LANG_POP -]) diff --git a/build-aux/m4/l_socket.m4 b/build-aux/m4/l_socket.m4 deleted file mode 100644 index 38923a98fc..0000000000 --- a/build-aux/m4/l_socket.m4 +++ /dev/null @@ -1,36 +0,0 @@ -# Illumos/SmartOS requires linking with -lsocket if -# using getifaddrs & freeifaddrs - -m4_define([_CHECK_SOCKET_testbody], [[ - #include - #include - - int main() { - struct ifaddrs *ifaddr; - getifaddrs(&ifaddr); - freeifaddrs(ifaddr); - } -]]) - -AC_DEFUN([CHECK_SOCKET], [ - - AC_LANG_PUSH(C++) - - AC_MSG_CHECKING([whether ifaddrs funcs can be used without link library]) - - AC_LINK_IFELSE([AC_LANG_SOURCE([_CHECK_SOCKET_testbody])],[ - AC_MSG_RESULT([yes]) - ],[ - AC_MSG_RESULT([no]) - LIBS="$LIBS -lsocket" - AC_MSG_CHECKING([whether getifaddrs needs -lsocket]) - AC_LINK_IFELSE([AC_LANG_SOURCE([_CHECK_SOCKET_testbody])],[ - AC_MSG_RESULT([yes]) - ],[ - AC_MSG_RESULT([no]) - AC_MSG_FAILURE([cannot figure out how to use getifaddrs]) - ]) - ]) - - AC_LANG_POP -]) diff --git a/build_msvc/.gitignore b/build_msvc/.gitignore deleted file mode 100644 index 0bd3235228..0000000000 --- a/build_msvc/.gitignore +++ /dev/null @@ -1,30 +0,0 @@ -# Build directories -Debug/* -Release/* -.vs -packages/* -*/Obj -*/Debug -*/Release -*/x64 -*.vcxproj.user - -# .vcxproj files that are auto-generated by the msvc-autogen.py script. -libBGL_cli/libBGL_cli.vcxproj -libBGL_common/libBGL_common.vcxproj -libBGL_crypto/libBGL_crypto.vcxproj -libBGL_node/libBGL_node.vcxproj -libBGL_util/libBGL_util.vcxproj -libBGL_wallet_tool/libBGL_wallet_tool.vcxproj -libBGL_wallet/libBGL_wallet.vcxproj -libBGL_zmq/libBGL_zmq.vcxproj -bench_BGL/bench_BGL.vcxproj -libtest_util/libtest_util.vcxproj - -/BGL_config.h -/common.init.vcxproj - -*/Win32 -libBGL_qt/QtGeneratedFiles/* -test_BGL-qt/QtGeneratedFiles/* -vcpkg_installed diff --git a/build_msvc/BGL-cli/BGL-cli.vcxproj b/build_msvc/BGL-cli/BGL-cli.vcxproj deleted file mode 100644 index 24e6a610d9..0000000000 --- a/build_msvc/BGL-cli/BGL-cli.vcxproj +++ /dev/null @@ -1,34 +0,0 @@ - - - - - {0B2D7431-F876-4A58-87BF-F748338CD3BF} - - - Application - $(SolutionDir)$(Platform)\$(Configuration)\ - - - - - - - {0667528c-d734-4009-adf9-c0d6c4a5a5a6} - - - {7c87e378-df58-482e-aa2f-1bc129bc19ce} - - - {6190199c-6cf4-4dad-bfbd-93fa72a760c1} - - - {b53a5535-ee9d-4c6f-9a26-f79ee3bc3754} - - - {5724ba7d-a09a-4ba8-800b-c4c1561b3d69} - - - - - - diff --git a/build_msvc/BGL-qt/BGL-qt.vcxproj b/build_msvc/BGL-qt/BGL-qt.vcxproj deleted file mode 100644 index c30aaa11a6..0000000000 --- a/build_msvc/BGL-qt/BGL-qt.vcxproj +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - {7E99172D-7FF2-4CB6-B736-AC9B76ED412A} - Application - $(SolutionDir)$(Platform)\$(Configuration)\ - - - - - - - - - {0667528c-d734-4009-adf9-c0d6c4a5a5a6} - - - {7c87e378-df58-482e-aa2f-1bc129bc19ce} - - - {2b384fa8-9ee1-4544-93cb-0d733c25e8ce} - - - {6190199c-6cf4-4dad-bfbd-93fa72a760c1} - - - {460fee33-1fe1-483f-b3bf-931ff8e969a5} - - - {2b4abff8-d1fd-4845-88c9-1f3c0a6512bf} - - - {b53a5535-ee9d-4c6f-9a26-f79ee3bc3754} - - - {93b86837-b543-48a5-a89b-7c87abb77df2} - - - {792d487f-f14c-49fc-a9de-3fc150f31c3f} - - - {18430fef-6b61-4c53-b396-718e02850f1b} - - - {bb493552-3b8c-4a8c-bf69-a6e7a51d2ea6} - - - {5724ba7d-a09a-4ba8-800b-c4c1561b3d69} - - - - - $(QtIncludes);%(AdditionalIncludeDirectories) - - - Windows - $(QtReleaseLibraries);%(AdditionalDependencies) - /LTCG:OFF - - - ..\..\src; - _UNICODE;UNICODE;%(PreprocessorDefinitions) - - - - - $(QtIncludes);%(AdditionalIncludeDirectories) - - - $(QtDebugLibraries);%(AdditionalDependencies) - - - ..\..\src; - _UNICODE;UNICODE;%(PreprocessorDefinitions) - - - - - \ No newline at end of file diff --git a/build_msvc/BGL-tx/BGL-tx.vcxproj b/build_msvc/BGL-tx/BGL-tx.vcxproj deleted file mode 100644 index fb3de47d2e..0000000000 --- a/build_msvc/BGL-tx/BGL-tx.vcxproj +++ /dev/null @@ -1,37 +0,0 @@ - - - - - {D3022AF6-AD33-4CE3-B358-87CB6A1B29CF} - - - Application - $(SolutionDir)$(Platform)\$(Configuration)\ - - - - - - - {7c87e378-df58-482e-aa2f-1bc129bc19ce} - - - {2b384fa8-9ee1-4544-93cb-0d733c25e8ce} - - - {6190199c-6cf4-4dad-bfbd-93fa72a760c1} - - - {b53a5535-ee9d-4c6f-9a26-f79ee3bc3754} - - - {5724ba7d-a09a-4ba8-800b-c4c1561b3d69} - - - {bb493552-3b8c-4a8c-bf69-a6e7a51d2ea6} - - - - - - \ No newline at end of file diff --git a/build_msvc/BGL-util/BGL-util.vcxproj b/build_msvc/BGL-util/BGL-util.vcxproj deleted file mode 100644 index 9f503aaa65..0000000000 --- a/build_msvc/BGL-util/BGL-util.vcxproj +++ /dev/null @@ -1,37 +0,0 @@ - - - - - {57A04EC9-542A-4E40-83D0-AC3BE1F36805} - - - Application - $(SolutionDir)$(Platform)\$(Configuration)\ - - - - - - - {7c87e378-df58-482e-aa2f-1bc129bc19ce} - - - {2b384fa8-9ee1-4544-93cb-0d733c25e8ce} - - - {6190199c-6cf4-4dad-bfbd-93fa72a760c1} - - - {b53a5535-ee9d-4c6f-9a26-f79ee3bc3754} - - - {5724ba7d-a09a-4ba8-800b-c4c1561b3d69} - - - {bb493552-3b8c-4a8c-bf69-a6e7a51d2ea6} - - - - - - \ No newline at end of file diff --git a/build_msvc/BGL-wallet/BGL-wallet.vcxproj b/build_msvc/BGL-wallet/BGL-wallet.vcxproj deleted file mode 100644 index fa46698319..0000000000 --- a/build_msvc/BGL-wallet/BGL-wallet.vcxproj +++ /dev/null @@ -1,58 +0,0 @@ - - - - - {84DE8790-EDE3-4483-81AC-C32F15E861F4} - - - Application - $(SolutionDir)$(Platform)\$(Configuration)\ - - - - - $(IntDir)init_BGL-wallet.obj - - - - - {0667528c-d734-4009-adf9-c0d6c4a5a5a6} - - - {7c87e378-df58-482e-aa2f-1bc129bc19ce} - - - {2b384fa8-9ee1-4544-93cb-0d733c25e8ce} - - - {6190199c-6cf4-4dad-bfbd-93fa72a760c1} - - - {460fee33-1fe1-483f-b3bf-931ff8e969a5} - - - {b53a5535-ee9d-4c6f-9a26-f79ee3bc3754} - - - {93b86837-b543-48a5-a89b-7c87abb77df2} - - - {792d487f-f14c-49fc-a9de-3fc150f31c3f} - - - {5724ba7d-a09a-4ba8-800b-c4c1561b3d69} - - - {f91ac55e-6f5e-4c58-9ac5-b40db7deef93} - - - {bb493552-3b8c-4a8c-bf69-a6e7a51d2ea6} - - - {18430fef-6b61-4c53-b396-718e02850f1b} - - - - - - \ No newline at end of file diff --git a/build_msvc/BGL.sln b/build_msvc/BGL.sln deleted file mode 100644 index ec1384639c..0000000000 --- a/build_msvc/BGL.sln +++ /dev/null @@ -1,162 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.9.34616.47 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libBGL_consensus", "libBGL_consensus\libBGL_consensus.vcxproj", "{2B384FA8-9EE1-4544-93CB-0D733C25E8CE}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BGLd", "BGLd\BGLd.vcxproj", "{D4513DDF-6013-44DC-ADCC-12EAF6D1F038}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libBGL_util", "libBGL_util\libBGL_util.vcxproj", "{B53A5535-EE9D-4C6F-9A26-F79EE3BC3754}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libBGL_common", "libBGL_common\libBGL_common.vcxproj", "{7C87E378-DF58-482E-AA2F-1BC129BC19CE}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libBGL_crypto", "libBGL_crypto\libBGL_crypto.vcxproj", "{6190199C-6CF4-4DAD-BFBD-93FA72A760C1}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libBGL_node", "libBGL_node\libBGL_node.vcxproj", "{460FEE33-1FE1-483F-B3BF-931FF8E969A5}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libunivalue", "libunivalue\libunivalue.vcxproj", "{5724BA7D-A09A-4BA8-800B-C4C1561B3D69}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libBGL_wallet", "libBGL_wallet\libBGL_wallet.vcxproj", "{93B86837-B543-48A5-A89B-7C87ABB77DF2}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libBGL_zmq", "libBGL_zmq\libBGL_zmq.vcxproj", "{792D487F-F14C-49FC-A9DE-3FC150F31C3F}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_BGL", "test_BGL\test_BGL.vcxproj", "{A56B73DB-D46D-4882-8374-1FE3FFA08F07}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libBGL_cli", "libBGL_cli\libBGL_cli.vcxproj", "{0667528C-D734-4009-ADF9-C0D6C4A5A5A6}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BGL-cli", "BGL-cli\BGL-cli.vcxproj", "{0B2D7431-F876-4A58-87BF-F748338CD3BF}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bench_BGL", "bench_BGL\bench_BGL.vcxproj", "{1125654E-E1B2-4431-8B5C-62EA9A2FEECB}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BGL-tx", "BGL-tx\BGL-tx.vcxproj", "{D3022AF6-AD33-4CE3-B358-87CB6A1B29CF}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BGL-util", "BGL-util\BGL-util.vcxproj", "{57A04EC9-542A-4E40-83D0-AC3BE1F36805}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BGL-wallet", "BGL-wallet\BGL-wallet.vcxproj", "{84DE8790-EDE3-4483-81AC-C32F15E861F4}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libBGL_wallet_tool", "libBGL_wallet_tool\libBGL_wallet_tool.vcxproj", "{F91AC55E-6F5E-4C58-9AC5-B40DB7DEEF93}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libsecp256k1", "libsecp256k1\libsecp256k1.vcxproj", "{BB493552-3B8C-4A8C-BF69-A6E7A51D2EA6}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libleveldb", "libleveldb\libleveldb.vcxproj", "{18430FEF-6B61-4C53-B396-718E02850F1B}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libBGL_qt", "libBGL_qt\libBGL_qt.vcxproj", "{2B4ABFF8-D1FD-4845-88C9-1F3C0A6512BF}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BGL-qt", "BGL-qt\BGL-qt.vcxproj", "{7E99172D-7FF2-4CB6-B736-AC9B76ED412A}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libtest_util", "libtest_util\libtest_util.vcxproj", "{868474FD-35F6-4400-8EED-30A33E7521D4}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_BGL-qt", "test_BGL-qt\test_BGL-qt.vcxproj", "{51201D5E-D939-4854-AE9D-008F03FF518E}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libminisketch", "libminisketch\libminisketch.vcxproj", "{542007E3-BE0D-4B0D-A6B0-AA8813E2558D}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x64 = Debug|x64 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {2B384FA8-9EE1-4544-93CB-0D733C25E8CE}.Debug|x64.ActiveCfg = Debug|x64 - {2B384FA8-9EE1-4544-93CB-0D733C25E8CE}.Debug|x64.Build.0 = Debug|x64 - {2B384FA8-9EE1-4544-93CB-0D733C25E8CE}.Release|x64.ActiveCfg = Release|x64 - {2B384FA8-9EE1-4544-93CB-0D733C25E8CE}.Release|x64.Build.0 = Release|x64 - {D4513DDF-6013-44DC-ADCC-12EAF6D1F038}.Debug|x64.ActiveCfg = Debug|x64 - {D4513DDF-6013-44DC-ADCC-12EAF6D1F038}.Debug|x64.Build.0 = Debug|x64 - {D4513DDF-6013-44DC-ADCC-12EAF6D1F038}.Release|x64.ActiveCfg = Release|x64 - {D4513DDF-6013-44DC-ADCC-12EAF6D1F038}.Release|x64.Build.0 = Release|x64 - {B53A5535-EE9D-4C6F-9A26-F79EE3BC3754}.Debug|x64.ActiveCfg = Debug|x64 - {B53A5535-EE9D-4C6F-9A26-F79EE3BC3754}.Debug|x64.Build.0 = Debug|x64 - {B53A5535-EE9D-4C6F-9A26-F79EE3BC3754}.Release|x64.ActiveCfg = Release|x64 - {B53A5535-EE9D-4C6F-9A26-F79EE3BC3754}.Release|x64.Build.0 = Release|x64 - {7C87E378-DF58-482E-AA2F-1BC129BC19CE}.Debug|x64.ActiveCfg = Debug|x64 - {7C87E378-DF58-482E-AA2F-1BC129BC19CE}.Debug|x64.Build.0 = Debug|x64 - {7C87E378-DF58-482E-AA2F-1BC129BC19CE}.Release|x64.ActiveCfg = Release|x64 - {7C87E378-DF58-482E-AA2F-1BC129BC19CE}.Release|x64.Build.0 = Release|x64 - {6190199C-6CF4-4DAD-BFBD-93FA72A760C1}.Debug|x64.ActiveCfg = Debug|x64 - {6190199C-6CF4-4DAD-BFBD-93FA72A760C1}.Debug|x64.Build.0 = Debug|x64 - {6190199C-6CF4-4DAD-BFBD-93FA72A760C1}.Release|x64.ActiveCfg = Release|x64 - {6190199C-6CF4-4DAD-BFBD-93FA72A760C1}.Release|x64.Build.0 = Release|x64 - {460FEE33-1FE1-483F-B3BF-931FF8E969A5}.Debug|x64.ActiveCfg = Debug|x64 - {460FEE33-1FE1-483F-B3BF-931FF8E969A5}.Debug|x64.Build.0 = Debug|x64 - {460FEE33-1FE1-483F-B3BF-931FF8E969A5}.Release|x64.ActiveCfg = Release|x64 - {460FEE33-1FE1-483F-B3BF-931FF8E969A5}.Release|x64.Build.0 = Release|x64 - {5724BA7D-A09A-4BA8-800B-C4C1561B3D69}.Debug|x64.ActiveCfg = Debug|x64 - {5724BA7D-A09A-4BA8-800B-C4C1561B3D69}.Debug|x64.Build.0 = Debug|x64 - {5724BA7D-A09A-4BA8-800B-C4C1561B3D69}.Release|x64.ActiveCfg = Release|x64 - {5724BA7D-A09A-4BA8-800B-C4C1561B3D69}.Release|x64.Build.0 = Release|x64 - {93B86837-B543-48A5-A89B-7C87ABB77DF2}.Debug|x64.ActiveCfg = Debug|x64 - {93B86837-B543-48A5-A89B-7C87ABB77DF2}.Debug|x64.Build.0 = Debug|x64 - {93B86837-B543-48A5-A89B-7C87ABB77DF2}.Release|x64.ActiveCfg = Release|x64 - {93B86837-B543-48A5-A89B-7C87ABB77DF2}.Release|x64.Build.0 = Release|x64 - {792D487F-F14C-49FC-A9DE-3FC150F31C3F}.Debug|x64.ActiveCfg = Debug|x64 - {792D487F-F14C-49FC-A9DE-3FC150F31C3F}.Debug|x64.Build.0 = Debug|x64 - {792D487F-F14C-49FC-A9DE-3FC150F31C3F}.Release|x64.ActiveCfg = Release|x64 - {792D487F-F14C-49FC-A9DE-3FC150F31C3F}.Release|x64.Build.0 = Release|x64 - {A56B73DB-D46D-4882-8374-1FE3FFA08F07}.Debug|x64.ActiveCfg = Debug|x64 - {A56B73DB-D46D-4882-8374-1FE3FFA08F07}.Debug|x64.Build.0 = Debug|x64 - {A56B73DB-D46D-4882-8374-1FE3FFA08F07}.Release|x64.ActiveCfg = Release|x64 - {A56B73DB-D46D-4882-8374-1FE3FFA08F07}.Release|x64.Build.0 = Release|x64 - {0667528C-D734-4009-ADF9-C0D6C4A5A5A6}.Debug|x64.ActiveCfg = Debug|x64 - {0667528C-D734-4009-ADF9-C0D6C4A5A5A6}.Debug|x64.Build.0 = Debug|x64 - {0667528C-D734-4009-ADF9-C0D6C4A5A5A6}.Release|x64.ActiveCfg = Release|x64 - {0667528C-D734-4009-ADF9-C0D6C4A5A5A6}.Release|x64.Build.0 = Release|x64 - {0B2D7431-F876-4A58-87BF-F748338CD3BF}.Debug|x64.ActiveCfg = Debug|x64 - {0B2D7431-F876-4A58-87BF-F748338CD3BF}.Debug|x64.Build.0 = Debug|x64 - {0B2D7431-F876-4A58-87BF-F748338CD3BF}.Release|x64.ActiveCfg = Release|x64 - {0B2D7431-F876-4A58-87BF-F748338CD3BF}.Release|x64.Build.0 = Release|x64 - {1125654E-E1B2-4431-8B5C-62EA9A2FEECB}.Debug|x64.ActiveCfg = Debug|x64 - {1125654E-E1B2-4431-8B5C-62EA9A2FEECB}.Debug|x64.Build.0 = Debug|x64 - {1125654E-E1B2-4431-8B5C-62EA9A2FEECB}.Release|x64.ActiveCfg = Release|x64 - {1125654E-E1B2-4431-8B5C-62EA9A2FEECB}.Release|x64.Build.0 = Release|x64 - {D3022AF6-AD33-4CE3-B358-87CB6A1B29CF}.Debug|x64.ActiveCfg = Debug|x64 - {D3022AF6-AD33-4CE3-B358-87CB6A1B29CF}.Debug|x64.Build.0 = Debug|x64 - {D3022AF6-AD33-4CE3-B358-87CB6A1B29CF}.Release|x64.ActiveCfg = Release|x64 - {D3022AF6-AD33-4CE3-B358-87CB6A1B29CF}.Release|x64.Build.0 = Release|x64 - {57A04EC9-542A-4E40-83D0-AC3BE1F36805}.Debug|x64.ActiveCfg = Debug|x64 - {57A04EC9-542A-4E40-83D0-AC3BE1F36805}.Debug|x64.Build.0 = Debug|x64 - {57A04EC9-542A-4E40-83D0-AC3BE1F36805}.Release|x64.ActiveCfg = Release|x64 - {57A04EC9-542A-4E40-83D0-AC3BE1F36805}.Release|x64.Build.0 = Release|x64 - {84DE8790-EDE3-4483-81AC-C32F15E861F4}.Debug|x64.ActiveCfg = Debug|x64 - {84DE8790-EDE3-4483-81AC-C32F15E861F4}.Debug|x64.Build.0 = Debug|x64 - {84DE8790-EDE3-4483-81AC-C32F15E861F4}.Release|x64.ActiveCfg = Release|x64 - {84DE8790-EDE3-4483-81AC-C32F15E861F4}.Release|x64.Build.0 = Release|x64 - {F91AC55E-6F5E-4C58-9AC5-B40DB7DEEF93}.Debug|x64.ActiveCfg = Debug|x64 - {F91AC55E-6F5E-4C58-9AC5-B40DB7DEEF93}.Debug|x64.Build.0 = Debug|x64 - {F91AC55E-6F5E-4C58-9AC5-B40DB7DEEF93}.Release|x64.ActiveCfg = Release|x64 - {F91AC55E-6F5E-4C58-9AC5-B40DB7DEEF93}.Release|x64.Build.0 = Release|x64 - {BB493552-3B8C-4A8C-BF69-A6E7A51D2EA6}.Debug|x64.ActiveCfg = Debug|x64 - {BB493552-3B8C-4A8C-BF69-A6E7A51D2EA6}.Debug|x64.Build.0 = Debug|x64 - {BB493552-3B8C-4A8C-BF69-A6E7A51D2EA6}.Release|x64.ActiveCfg = Release|x64 - {BB493552-3B8C-4A8C-BF69-A6E7A51D2EA6}.Release|x64.Build.0 = Release|x64 - {18430FEF-6B61-4C53-B396-718E02850F1B}.Debug|x64.ActiveCfg = Debug|x64 - {18430FEF-6B61-4C53-B396-718E02850F1B}.Debug|x64.Build.0 = Debug|x64 - {18430FEF-6B61-4C53-B396-718E02850F1B}.Release|x64.ActiveCfg = Release|x64 - {18430FEF-6B61-4C53-B396-718E02850F1B}.Release|x64.Build.0 = Release|x64 - {2B4ABFF8-D1FD-4845-88C9-1F3C0A6512BF}.Debug|x64.ActiveCfg = Debug|x64 - {2B4ABFF8-D1FD-4845-88C9-1F3C0A6512BF}.Debug|x64.Build.0 = Debug|x64 - {2B4ABFF8-D1FD-4845-88C9-1F3C0A6512BF}.Release|x64.ActiveCfg = Release|x64 - {2B4ABFF8-D1FD-4845-88C9-1F3C0A6512BF}.Release|x64.Build.0 = Release|x64 - {7E99172D-7FF2-4CB6-B736-AC9B76ED412A}.Debug|x64.ActiveCfg = Debug|x64 - {7E99172D-7FF2-4CB6-B736-AC9B76ED412A}.Debug|x64.Build.0 = Debug|x64 - {7E99172D-7FF2-4CB6-B736-AC9B76ED412A}.Release|x64.ActiveCfg = Release|x64 - {7E99172D-7FF2-4CB6-B736-AC9B76ED412A}.Release|x64.Build.0 = Release|x64 - {868474FD-35F6-4400-8EED-30A33E7521D4}.Debug|x64.ActiveCfg = Debug|x64 - {868474FD-35F6-4400-8EED-30A33E7521D4}.Debug|x64.Build.0 = Debug|x64 - {868474FD-35F6-4400-8EED-30A33E7521D4}.Release|x64.ActiveCfg = Release|x64 - {868474FD-35F6-4400-8EED-30A33E7521D4}.Release|x64.Build.0 = Release|x64 - {51201D5E-D939-4854-AE9D-008F03FF518E}.Debug|x64.ActiveCfg = Debug|x64 - {51201D5E-D939-4854-AE9D-008F03FF518E}.Debug|x64.Build.0 = Debug|x64 - {51201D5E-D939-4854-AE9D-008F03FF518E}.Release|x64.ActiveCfg = Release|x64 - {51201D5E-D939-4854-AE9D-008F03FF518E}.Release|x64.Build.0 = Release|x64 - {542007E3-BE0D-4B0D-A6B0-AA8813E2558D}.Debug|x64.ActiveCfg = Debug|x64 - {542007E3-BE0D-4B0D-A6B0-AA8813E2558D}.Debug|x64.Build.0 = Debug|x64 - {542007E3-BE0D-4B0D-A6B0-AA8813E2558D}.Release|x64.ActiveCfg = Release|x64 - {542007E3-BE0D-4B0D-A6B0-AA8813E2558D}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {58AAB032-7274-49BD-845E-5EF4DBB69B70} - EndGlobalSection -EndGlobal diff --git a/build_msvc/BGL_config.h b/build_msvc/BGL_config.h deleted file mode 100644 index 7d99fa6af4..0000000000 --- a/build_msvc/BGL_config.h +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright (c) 2018-2020 The Bitcoin Core developers -// Distributed under the MIT software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. - -#ifndef BGL_BGL_CONFIG_H -#define BGL_BGL_CONFIG_H - -/* Version Build */ -#define CLIENT_VERSION_BUILD 13 - -/* Version is release */ -#define CLIENT_VERSION_IS_RELEASE true - -/* Major version */ -#define CLIENT_VERSION_MAJOR 0 - -/* Minor version */ -#define CLIENT_VERSION_MINOR 1 - -/* Copyright holder(s) before %s replacement */ -#define COPYRIGHT_HOLDERS "The %s developers" - -/* Copyright holder(s) */ -#define COPYRIGHT_HOLDERS_FINAL "The Bitgesell Core developers" - -/* Replacement for %s in copyright holders string */ -#define COPYRIGHT_HOLDERS_SUBSTITUTION "Bitgesell Core" - -/* Copyright year */ -#define COPYRIGHT_YEAR 2024 - -/* Define to 1 to enable wallet functions */ -#define ENABLE_WALLET 1 - -/* Define to 1 to enable BDB wallet */ -#define USE_BDB 1 - -/* Define to 1 to enable SQLite wallet */ -#define USE_SQLITE 1 - -/* Define this symbol to enable ZMQ functions */ -#define ENABLE_ZMQ 1 - -/* Define to 1 if you have the declaration of `fork', and to 0 if you don't. - */ -#define HAVE_DECL_FORK 0 - -/* Define to 1 if you have the declaration of `setsid', and to 0 if you don't. - */ -#define HAVE_DECL_SETSID 0 - -/* Define if the dllexport attribute is supported. */ -#define HAVE_DLLEXPORT_ATTRIBUTE 1 - -/* Define to the address where bug reports for this package should be sent. */ -#define PACKAGE_BUGREPORT "https://github.com/bitgesellofficial/bitgesell/issues" - -/* Define to the full name of this package. */ -#define PACKAGE_NAME "Bitgesell Core" - -/* Define to the full name and version of this package. */ -#define PACKAGE_STRING "BGL Core 0.1.13" - -/* Define to the home page for this package. */ -#define PACKAGE_URL "https://github.com/BitgesellOfficial/bitgesell/releases/" - -/* Define to the version of this package. */ -#define PACKAGE_VERSION "0.1.13" - -/* Define this symbol if the minimal qt platform exists */ -#define QT_QPA_PLATFORM_MINIMAL 1 - -/* Define this symbol if the qt platform is windows */ -#define QT_QPA_PLATFORM_WINDOWS 1 - -/* Define this symbol if qt plugins are static */ -#define QT_STATICPLUGIN 1 - -/* Windows Universal Platform constraints */ -#if !defined(WINAPI_FAMILY) || (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP) -/* Either a desktop application without API restrictions, or and older system - before these macros were defined. */ - -/* ::wsystem is available */ -#define HAVE_SYSTEM 1 - -#endif // !WINAPI_FAMILY || WINAPI_FAMILY_DESKTOP_APP - -#endif //BGL_BGL_CONFIG_H diff --git a/build_msvc/BGL_config.h.in b/build_msvc/BGL_config.h.in deleted file mode 100644 index 512deb7ba3..0000000000 --- a/build_msvc/BGL_config.h.in +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright (c) 2018-2020 The Bitcoin Core developers -// Distributed under the MIT software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. - -#ifndef BGL_BGL_CONFIG_H -#define BGL_BGL_CONFIG_H - -/* Version Build */ -#define CLIENT_VERSION_BUILD $ - -/* Version is release */ -#define CLIENT_VERSION_IS_RELEASE $ - -/* Major version */ -#define CLIENT_VERSION_MAJOR $ - -/* Minor version */ -#define CLIENT_VERSION_MINOR $ - -/* Copyright holder(s) before %s replacement */ -#define COPYRIGHT_HOLDERS "The %s developers" - -/* Copyright holder(s) */ -#define COPYRIGHT_HOLDERS_FINAL "The Bitgesell Core developers" - -/* Replacement for %s in copyright holders string */ -#define COPYRIGHT_HOLDERS_SUBSTITUTION "Bitgesell Core" - -/* Copyright year */ -#define COPYRIGHT_YEAR $ - -/* Define to 1 to enable wallet functions */ -#define ENABLE_WALLET 1 - -/* Define to 1 to enable BDB wallet */ -#define USE_BDB 1 - -/* Define to 1 to enable SQLite wallet */ -#define USE_SQLITE 1 - -/* Define this symbol to enable ZMQ functions */ -#define ENABLE_ZMQ 1 - -/* Define to 1 if you have the declaration of `fork', and to 0 if you don't. - */ -#define HAVE_DECL_FORK 0 - -/* Define to 1 if you have the declaration of `setsid', and to 0 if you don't. - */ -#define HAVE_DECL_SETSID 0 - -/* Define if the dllexport attribute is supported. */ -#define HAVE_DLLEXPORT_ATTRIBUTE 1 - -/* Define to the address where bug reports for this package should be sent. */ -#define PACKAGE_BUGREPORT "https://github.com/bitgesellofficial/bitgesell/issues" - -/* Define to the full name of this package. */ -#define PACKAGE_NAME "Bitgesell Core" - -/* Define to the full name and version of this package. */ -#define PACKAGE_STRING $ - -/* Define to the home page for this package. */ -#define PACKAGE_URL "https://github.com/BitgesellOfficial/bitgesell/releases/" - -/* Define to the version of this package. */ -#define PACKAGE_VERSION $ - -/* Define this symbol if the minimal qt platform exists */ -#define QT_QPA_PLATFORM_MINIMAL 1 - -/* Define this symbol if the qt platform is windows */ -#define QT_QPA_PLATFORM_WINDOWS 1 - -/* Define this symbol if qt plugins are static */ -#define QT_STATICPLUGIN 1 - -/* Windows Universal Platform constraints */ -#if !defined(WINAPI_FAMILY) || (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP) -/* Either a desktop application without API restrictions, or and older system - before these macros were defined. */ - -/* ::wsystem is available */ -#define HAVE_SYSTEM 1 - -#endif // !WINAPI_FAMILY || WINAPI_FAMILY_DESKTOP_APP - -#endif //BGL_BGL_CONFIG_H diff --git a/build_msvc/BGLd/BGLd.vcxproj b/build_msvc/BGLd/BGLd.vcxproj deleted file mode 100644 index 2fb0cef9fe..0000000000 --- a/build_msvc/BGLd/BGLd.vcxproj +++ /dev/null @@ -1,92 +0,0 @@ - - - - - {D4513DDF-6013-44DC-ADCC-12EAF6D1F038} - - - Application - $(SolutionDir)$(Platform)\$(Configuration)\ - - - - - $(IntDir)init_BGLd.obj - - - - - {7c87e378-df58-482e-aa2f-1bc129bc19ce} - - - {2b384fa8-9ee1-4544-93cb-0d733c25e8ce} - - - {6190199c-6cf4-4dad-bfbd-93fa72a760c1} - - - {460fee33-1fe1-483f-b3bf-931ff8e969a5} - - - {b53a5535-ee9d-4c6f-9a26-f79ee3bc3754} - - - {93b86837-b543-48a5-a89b-7c87abb77df2} - - - {792d487f-f14c-49fc-a9de-3fc150f31c3f} - - - {5724ba7d-a09a-4ba8-800b-c4c1561b3d69} - - - {bb493552-3b8c-4a8c-bf69-a6e7a51d2ea6} - - - {18430fef-6b61-4c53-b396-718e02850f1b} - - - - - - - ..\..\test\config.ini.in - ..\..\test\config.ini - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/build_msvc/README.md b/build_msvc/README.md deleted file mode 100644 index 5e8e2be44e..0000000000 --- a/build_msvc/README.md +++ /dev/null @@ -1,92 +0,0 @@ -Building BGL Core with Visual Studio -======================================== - -Introduction ---------------------- -Visual Studio 2022 is minimum required to build BGL Core. - -Solution and project files to build with `msbuild` or Visual Studio can be found in the `build_msvc` directory. - -To build BGL Core from the command-line, it is sufficient to only install the [Visual Studio Build Tools](https://visualstudio.microsoft.com/downloads/) component. - -The "Desktop development with C++" workload must be installed as well. - -Building with Visual Studio is an alternative to the Linux based [cross-compiler build](../doc/build-windows.md). - - -Prerequisites ---------------------- -To build [dependencies](../doc/dependencies.md) (except for [Qt](#qt)), -the default approach is to use the [vcpkg](https://vcpkg.io) package manager from Microsoft: - -1. [Install](https://vcpkg.io/en/getting-started.html) vcpkg. - -2. By default, vcpkg makes both `release` and `debug` builds for each package. -To save build time and disk space, one could skip `debug` builds (example uses PowerShell): -```powershell - -Add-Content -Path "vcpkg\triplets\x64-windows-static.cmake" -Value "set(VCPKG_BUILD_TYPE release)" -``` - -Qt ---------------------- -To build Bitgesell Core with the GUI, a static build of Qt is required. - -1. Download a single ZIP archive of Qt source code from https://download.qt.io/official_releases/qt/ (e.g., [`qt-everywhere-opensource-src-5.15.11.zip`](https://download.qt.io/official_releases/qt/5.15/5.15.11/single/qt-everywhere-opensource-src-5.15.11.zip)), and expand it into a dedicated folder. The following instructions assume that this folder is `C:\dev\qt-source`. - -> 💡 **Tip:** If you use the default path with "Extract All" for the Qt source code zip file, and end up with something like `C:\dev\qt-everywhere-opensource-src-5.15.11\qt-everywhere-src-5.15.11`, you are likely to encounter a "path too long" error when building. To fix the problem move the source files to a shorter path such as the recommended `C:\dev\qt-source`. - -2. Open "x64 Native Tools Command Prompt for VS 2022", and input the following commands: -```cmd -cd C:\dev\qt-source -mkdir build -cd build -..\configure -release -silent -opensource -confirm-license -opengl desktop -static -static-runtime -mp -qt-zlib -qt-pcre -qt-libpng -nomake examples -nomake tests -nomake tools -no-angle -no-dbus -no-gif -no-gtk -no-ico -no-icu -no-libjpeg -no-libudev -no-sql-sqlite -no-sql-odbc -no-sqlite -no-vulkan -skip qt3d -skip qtactiveqt -skip qtandroidextras -skip qtcharts -skip qtconnectivity -skip qtdatavis3d -skip qtdeclarative -skip doc -skip qtdoc -skip qtgamepad -skip qtgraphicaleffects -skip qtimageformats -skip qtlocation -skip qtlottie -skip qtmacextras -skip qtmultimedia -skip qtnetworkauth -skip qtpurchasing -skip qtquick3d -skip qtquickcontrols -skip qtquickcontrols2 -skip qtquicktimeline -skip qtremoteobjects -skip qtscript -skip qtscxml -skip qtsensors -skip qtserialbus -skip qtserialport -skip qtspeech -skip qtsvg -skip qtvirtualkeyboard -skip qtwayland -skip qtwebchannel -skip qtwebengine -skip qtwebglplugin -skip qtwebsockets -skip qtwebview -skip qtx11extras -skip qtxmlpatterns -no-openssl -no-feature-bearermanagement -no-feature-printdialog -no-feature-printer -no-feature-printpreviewdialog -no-feature-printpreviewwidget -no-feature-sql -no-feature-sqlmodel -no-feature-textbrowser -no-feature-textmarkdownwriter -no-feature-textodfwriter -no-feature-xml -prefix C:\Qt_static -nmake -nmake install -``` - -One could speed up building with [`jom`](https://wiki.qt.io/Jom), a replacement for `nmake` which makes use of all CPU cores. - -To build Bitgesell Core without Qt, unload or disable the `BGL-qt`, `libBGL_qt` and `test_BGL-qt` projects. - - -Building ---------------------- -1. Use Python to generate `*.vcxproj` for the Visual Studio 2022 toolchain from Makefile: - -```cmd -python build_msvc\msvc-autogen.py -``` - -2. An optional step is to adjust the settings in the `build_msvc` directory and the `common.init.vcxproj` file. This project file contains settings that are common to all projects such as the runtime library version and target Windows SDK version. The Qt directories can also be set. To specify a non-default path to a static Qt package directory, use the `QTBASEDIR` environment variable. - -3. To build from the command-line with the Visual Studio toolchain use: - -```cmd -msbuild build_msvc\BGL.sln -property:Configuration=Release -maxCpuCount -verbosity:minimal -``` - -Alternatively, open the `build_msvc/BGL.sln` file in Visual Studio. - -Security ---------------------- -[Base address randomization](https://learn.microsoft.com/en-us/cpp/build/reference/dynamicbase-use-address-space-layout-randomization) is used to make Bitcoin Core more secure. When building Bitcoin using the `build_msvc` process base address randomization can be disabled by editing `common.init.vcproj` to change `RandomizedBaseAddress` from `true` to `false` and then rebuilding the project. - -To check if `BGLd` has `RandomizedBaseAddress` enabled or disabled run - -``` -.\dumpbin.exe /headers src/BGLd.exe -``` - -If is it enabled then in the output `Dynamic base` will be listed in the `DLL characteristics` under `OPTIONAL HEADER VALUES` as shown below - -``` - 8160 DLL characteristics - High Entropy Virtual Addresses - Dynamic base - NX compatible - Terminal Server Aware -``` - -This may not disable all stack randomization as versions of windows employ additional stack randomization protections. These protections must be turned off in the OS configuration. diff --git a/build_msvc/bench_BGL/bench_BGL.vcxproj.in b/build_msvc/bench_BGL/bench_BGL.vcxproj.in deleted file mode 100644 index f395cf5556..0000000000 --- a/build_msvc/bench_BGL/bench_BGL.vcxproj.in +++ /dev/null @@ -1,62 +0,0 @@ - - - - - {1125654E-E1B2-4431-8B5C-62EA9A2FEECB} - - - Application - $(SolutionDir)$(Platform)\$(Configuration)\ - - -@SOURCE_FILES@ - - - - {2b384fa8-9ee1-4544-93cb-0d733c25e8ce} - - - {7c87e378-df58-482e-aa2f-1bc129bc19ce} - - - {6190199c-6cf4-4dad-bfbd-93fa72a760c1} - - - {460fee33-1fe1-483f-b3bf-931ff8e969a5} - - - {b53a5535-ee9d-4c6f-9a26-f79ee3bc3754} - - - {93b86837-b543-48a5-a89b-7c87abb77df2} - - - {792d487f-f14c-49fc-a9de-3fc150f31c3f} - - - {5724ba7d-a09a-4ba8-800b-c4c1561b3d69} - - - {bb493552-3b8c-4a8c-bf69-a6e7a51d2ea6} - - - {18430fef-6b61-4c53-b396-718e02850f1b} - - - {1e065f03-3566-47d0-8fa9-daa72b084e7d} - - - - - There was an error executing the raw bench header generation task. - - - - - - - - - - - \ No newline at end of file diff --git a/build_msvc/common.init.vcxproj.in b/build_msvc/common.init.vcxproj.in deleted file mode 100644 index ff3f32b6ea..0000000000 --- a/build_msvc/common.init.vcxproj.in +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - 16.0 - true - - - - true - true - true - true - true - $(Configuration) - x64-windows-static - - - - $(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v10.0@ProductVersion) - $(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SDKs\Windows\v10.0@ProductVersion) - - $(WindowsTargetPlatformVersion_10).0 - $(WindowsTargetPlatformVersion_10) - - - - - Release - x64 - - - Debug - x64 - - - - - false - false - @TOOLSET@ - Unicode - No - $(SolutionDir)$(Platform)\$(Configuration)\$(ProjectName)\ - $(Platform)\$(Configuration)\$(ProjectName)\ - - - - true - true - @TOOLSET@ - Unicode - $(SolutionDir)$(Platform)\$(Configuration)\$(ProjectName)\ - $(Platform)\$(Configuration)\$(ProjectName)\ - - - - - MaxSpeed - false - true - true - true - MultiThreaded - None - - - false - false - /LTCG:OFF - - - - - - Disabled - false - _DEBUG;%(PreprocessorDefinitions) - true - MultiThreadedDebug - /bigobj %(AdditionalOptions) - - - - - - Level3 - NotUsing - /utf-8 /Zc:preprocessor /Zc:__cplusplus /std:c++20 %(AdditionalOptions) - 4018;4244;4267;4715;4805 - true - _SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING;SECP256K1_STATIC;ZMQ_STATIC;NOMINMAX;WIN32;_CRT_SECURE_NO_WARNINGS;_CONSOLE;_WIN32_WINNT=0x0601;_WIN32_IE=0x0501;WIN32_LEAN_AND_MEAN;PROVIDE_FUZZ_MAIN_FUNCTION;%(PreprocessorDefinitions) - ..\..\src;..\..\src\minisketch\include;..\..\src\univalue\include;..\..\src\secp256k1\include;..\..\src\leveldb\include;..\..\src\leveldb\helpers\memenv;%(AdditionalIncludeDirectories) - - - Console - Iphlpapi.lib;ws2_32.lib;Shlwapi.lib;kernel32.lib;user32.lib;gdi32.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - diff --git a/build_msvc/common.qt.init.vcxproj b/build_msvc/common.qt.init.vcxproj deleted file mode 100644 index dabbec707f..0000000000 --- a/build_msvc/common.qt.init.vcxproj +++ /dev/null @@ -1,22 +0,0 @@ - - - - - C:\Qt_static - $(QtBaseDir)\plugins - $(QtBaseDir)\lib - $(QtBaseDir)\include - $(QtIncludeDir);$(QtIncludeDir)\QtNetwork;$(QtIncludeDir)\QtCore;$(QtIncludeDir)\QtWidgets;$(QtIncludeDir)\QtGui; - .\QtGeneratedFiles\qt - $(QtBaseDir)\bin - $(QtPluginsLibraryDir)\platforms\qminimal.lib;$(QtPluginsLibraryDir)\platforms\qwindows.lib;$(QtPluginsLibraryDir)\styles\qwindowsvistastyle.lib;$(QtLibraryDir)\Qt5WindowsUIAutomationSupport.lib;$(QtLibraryDir)\qtfreetype.lib;$(QtLibraryDir)\qtharfbuzz.lib;$(QtLibraryDir)\qtlibpng.lib;$(QtLibraryDir)\qtpcre2.lib;$(QtLibraryDir)\Qt5AccessibilitySupport.lib;$(QtLibraryDir)\Qt5Core.lib;$(QtLibraryDir)\Qt5Concurrent.lib;$(QtLibraryDir)\Qt5EventDispatcherSupport.lib;$(QtLibraryDir)\Qt5FontDatabaseSupport.lib;$(QtLibraryDir)\Qt5Gui.lib;$(QtLibraryDir)\Qt5Network.lib;$(QtLibraryDir)\Qt5PlatformCompositorSupport.lib;$(QtLibraryDir)\Qt5ThemeSupport.lib;$(QtLibraryDir)\Qt5Widgets.lib;$(QtLibraryDir)\Qt5WinExtras.lib;$(QtLibraryDir)\qtmain.lib;Wtsapi32.lib;userenv.lib;netapi32.lib;imm32.lib;Dwmapi.lib;version.lib;winmm.lib;UxTheme.lib - $(QtPluginsLibraryDir)\platforms\qwindowsd.lib;$(QtPluginsLibraryDir)\platforms\qminimald.lib;$(QtPluginsLibraryDir)\styles\qwindowsvistastyled.lib;$(QtLibraryDir)\*d.lib;Wtsapi32.lib;crypt32.lib;userenv.lib;netapi32.lib;imm32.lib;Dwmapi.lib;version.lib;winmm.lib;UxTheme.lib - - - - - QT_NO_KEYWORDS;QT_USE_QSTRINGBUILDER;%(PreprocessorDefinitions) - - - - diff --git a/build_msvc/common.vcxproj b/build_msvc/common.vcxproj deleted file mode 100644 index 4bbcc3767f..0000000000 --- a/build_msvc/common.vcxproj +++ /dev/null @@ -1,12 +0,0 @@ - - -$(BuildDependsOn);CopyBuildArtifacts - - - - - - - - - diff --git a/build_msvc/fuzz/fuzz.vcxproj b/build_msvc/fuzz/fuzz.vcxproj deleted file mode 100644 index 7c72703c93..0000000000 --- a/build_msvc/fuzz/fuzz.vcxproj +++ /dev/null @@ -1,85 +0,0 @@ - - - - - {AFCEE6C1-89FB-49AB-A694-BA580A59E2D8} - - - Application - $(SolutionDir)$(Platform)\$(Configuration)\ - - - - - $(IntDir)test_fuzz_util_descriptor.obj - - - $(IntDir)test_fuzz_util_mempool.obj - - - $(IntDir)test_fuzz_util_net.obj - - - $(IntDir)wallet_test_fuzz_coincontrol.obj - - - $(IntDir)wallet_test_fuzz_coinselection.obj - - - $(IntDir)wallet_test_fuzz_fees.obj - - - $(IntDir)wallet_test_fuzz_notifications.obj - - - $(IntDir)wallet_test_fuzz_parse_iso8601.obj - - - $(IntDir)wallet_test_fuzz_scriptpubkeyman.obj - - - - - {542007e3-be0d-4b0d-a6b0-aa8813e2558d} - - - {2b384fa8-9ee1-4544-93cb-0d733c25e8ce} - - - {0667528c-d734-4009-adf9-c0d6c4a5a5a6} - - - {7c87e378-df58-482e-aa2f-1bc129bc19ce} - - - {6190199c-6cf4-4dad-bfbd-93fa72a760c1} - - - {460fee33-1fe1-483f-b3bf-931ff8e969a5} - - - {b53a5535-ee9d-4c6f-9a26-f79ee3bc3754} - - - {93b86837-b543-48a5-a89b-7c87abb77df2} - - - {792d487f-f14c-49fc-a9de-3fc150f31c3f} - - - {1e065f03-3566-47d0-8fa9-daa72b084e7d} - - - {5724ba7d-a09a-4ba8-800b-c4c1561b3d69} - - - {bb493552-3b8c-4a8c-bf69-a6e7a51d2ea6} - - - {18430fef-6b61-4c53-b396-718e02850f1b} - - - - - - diff --git a/build_msvc/libBGL_cli/libBGL_cli.vcxproj.in b/build_msvc/libBGL_cli/libBGL_cli.vcxproj.in deleted file mode 100644 index 620df72a2f..0000000000 --- a/build_msvc/libBGL_cli/libBGL_cli.vcxproj.in +++ /dev/null @@ -1,16 +0,0 @@ - - - - - {0667528C-D734-4009-ADF9-C0D6C4A5A5A6} - - - StaticLibrary - - -@SOURCE_FILES@ - - - - - diff --git a/build_msvc/libBGL_common/libBGL_common.vcxproj.in b/build_msvc/libBGL_common/libBGL_common.vcxproj.in deleted file mode 100644 index b47d62b295..0000000000 --- a/build_msvc/libBGL_common/libBGL_common.vcxproj.in +++ /dev/null @@ -1,16 +0,0 @@ - - - - - {7C87E378-DF58-482E-AA2F-1BC129BC19CE} - - - StaticLibrary - - -@SOURCE_FILES@ - - - - - diff --git a/build_msvc/libBGL_consensus/libBGL_consensus.vcxproj b/build_msvc/libBGL_consensus/libBGL_consensus.vcxproj deleted file mode 100644 index 57b4d3e328..0000000000 --- a/build_msvc/libBGL_consensus/libBGL_consensus.vcxproj +++ /dev/null @@ -1,27 +0,0 @@ - - - - - {2B384FA8-9EE1-4544-93CB-0D733C25E8CE} - - - StaticLibrary - - - - - - - - - - - - - - - - - - - diff --git a/build_msvc/libBGL_crypto/libBGL_crypto.vcxproj.in b/build_msvc/libBGL_crypto/libBGL_crypto.vcxproj.in deleted file mode 100644 index 32cb75bf87..0000000000 --- a/build_msvc/libBGL_crypto/libBGL_crypto.vcxproj.in +++ /dev/null @@ -1,16 +0,0 @@ - - - - - {6190199C-6CF4-4DAD-BFBD-93FA72A760C1} - - - StaticLibrary - - -@SOURCE_FILES@ - - - - - diff --git a/build_msvc/libBGL_node/libBGL_node.vcxproj.in b/build_msvc/libBGL_node/libBGL_node.vcxproj.in deleted file mode 100644 index 58e90dbaeb..0000000000 --- a/build_msvc/libBGL_node/libBGL_node.vcxproj.in +++ /dev/null @@ -1,19 +0,0 @@ - - - - - {460FEE33-1FE1-483F-B3BF-931FF8E969A5} - - - StaticLibrary - - -@SOURCE_FILES@ - - $(IntDir)wallet_init.obj - - - - - - \ No newline at end of file diff --git a/build_msvc/libBGL_qt/libBGL_qt.vcxproj b/build_msvc/libBGL_qt/libBGL_qt.vcxproj deleted file mode 100644 index cd0871ca8f..0000000000 --- a/build_msvc/libBGL_qt/libBGL_qt.vcxproj +++ /dev/null @@ -1,221 +0,0 @@ - - - - - - {2B4ABFF8-D1FD-4845-88C9-1F3C0A6512BF} - StaticLibrary - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _AMD64_;%(PreprocessorDefinitions) - $(QtIncludes);$(GeneratedFilesOutDir)\..;%(AdditionalIncludeDirectories) - MaxSpeed - - - - - - - - - - - - - _AMD64_;%(PreprocessorDefinitions) - $(QtIncludes);$(GeneratedFilesOutDir)\..;%(AdditionalIncludeDirectories) - - - - - - - - - - - - - - - There was an error executing the libBGL_qt moc code include generation task. - - - - - - - - - There was an error executing the libBGL_qt moc header generation task. - - - - - - - - - There was an error executing the libBGL_qt forms header generation task. - - - - - - - - There was an error executing the libBGL_qt translation file generation task. - - - - - - - There was an error executing the libBGL_qt resource code generation task. - - - - - - - - - - - - - moccode; - mocheader; - forms; - translation; - resource; - $(BuildDependsOn); - - - - - qtclean; - $(CleanDependsOn); - - - \ No newline at end of file diff --git a/build_msvc/libBGL_util/libBGL_util.vcxproj.in b/build_msvc/libBGL_util/libBGL_util.vcxproj.in deleted file mode 100644 index adf4fa0354..0000000000 --- a/build_msvc/libBGL_util/libBGL_util.vcxproj.in +++ /dev/null @@ -1,16 +0,0 @@ - - - - - {B53A5535-EE9D-4C6F-9A26-F79EE3BC3754} - - - StaticLibrary - - -@SOURCE_FILES@ - - - - - diff --git a/build_msvc/libBGL_wallet/libBGL_wallet.vcxproj.in b/build_msvc/libBGL_wallet/libBGL_wallet.vcxproj.in deleted file mode 100644 index 613d5c7199..0000000000 --- a/build_msvc/libBGL_wallet/libBGL_wallet.vcxproj.in +++ /dev/null @@ -1,19 +0,0 @@ - - - - - {93B86837-B543-48A5-A89B-7C87ABB77DF2} - - - StaticLibrary - - - - - -@SOURCE_FILES@ - - - - - diff --git a/build_msvc/libBGL_wallet_tool/libBGL_wallet_tool.vcxproj.in b/build_msvc/libBGL_wallet_tool/libBGL_wallet_tool.vcxproj.in deleted file mode 100644 index 1a6b7b6b92..0000000000 --- a/build_msvc/libBGL_wallet_tool/libBGL_wallet_tool.vcxproj.in +++ /dev/null @@ -1,16 +0,0 @@ - - - - - {F91AC55E-6F5E-4C58-9AC5-B40DB7DEEF93} - - - StaticLibrary - - -@SOURCE_FILES@ - - - - - diff --git a/build_msvc/libBGL_zmq/libBGL_zmq.vcxproj.in b/build_msvc/libBGL_zmq/libBGL_zmq.vcxproj.in deleted file mode 100644 index e86eea81e6..0000000000 --- a/build_msvc/libBGL_zmq/libBGL_zmq.vcxproj.in +++ /dev/null @@ -1,16 +0,0 @@ - - - - - {792D487F-F14C-49FC-A9DE-3FC150F31C3F} - - - StaticLibrary - - -@SOURCE_FILES@ - - - - - diff --git a/build_msvc/libleveldb/libleveldb.vcxproj b/build_msvc/libleveldb/libleveldb.vcxproj deleted file mode 100644 index eacfbb2641..0000000000 --- a/build_msvc/libleveldb/libleveldb.vcxproj +++ /dev/null @@ -1,61 +0,0 @@ - - - - - {18430FEF-6B61-4C53-B396-718E02850F1B} - - - StaticLibrary - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - HAVE_CRC32C=0;HAVE_SNAPPY=0;LEVELDB_IS_BIG_ENDIAN=0;_UNICODE;UNICODE;_CRT_NONSTDC_NO_DEPRECATE;LEVELDB_PLATFORM_WINDOWS;%(PreprocessorDefinitions) - 4244;4267;4722 - ..\..\src\leveldb;..\..\src\leveldb\include;%(AdditionalIncludeDirectories) - - - - - - diff --git a/build_msvc/libminisketch/libminisketch.vcxproj b/build_msvc/libminisketch/libminisketch.vcxproj deleted file mode 100644 index 60e57caa57..0000000000 --- a/build_msvc/libminisketch/libminisketch.vcxproj +++ /dev/null @@ -1,38 +0,0 @@ - - - - - {542007E3-BE0D-4B0D-A6B0-AA8813E2558D} - - - StaticLibrary - - - - - - - - - - - - - - - - - - - - - - - 4060;4065;4146;4244;4267 - HAVE_CLMUL;DISABLE_DEFAULT_FIELDS;ENABLE_FIELD_32;%(PreprocessorDefinitions) - - - - - - diff --git a/build_msvc/libsecp256k1/libsecp256k1.vcxproj b/build_msvc/libsecp256k1/libsecp256k1.vcxproj deleted file mode 100644 index 7ea4b96534..0000000000 --- a/build_msvc/libsecp256k1/libsecp256k1.vcxproj +++ /dev/null @@ -1,26 +0,0 @@ - - - - - {BB493552-3B8C-4A8C-BF69-A6E7A51D2EA6} - - - StaticLibrary - - - - - - - - - ENABLE_MODULE_RECOVERY;ENABLE_MODULE_EXTRAKEYS;ENABLE_MODULE_SCHNORRSIG;ENABLE_MODULE_ELLSWIFT;%(PreprocessorDefinitions) - USE_ASM_X86_64;%(UndefinePreprocessorDefinitions) - ..\..\src\secp256k1;%(AdditionalIncludeDirectories) - 4146;4244;4267 - - - - - - diff --git a/build_msvc/libtest_util/libtest_util.vcxproj.in b/build_msvc/libtest_util/libtest_util.vcxproj.in deleted file mode 100644 index 64cfa82dcc..0000000000 --- a/build_msvc/libtest_util/libtest_util.vcxproj.in +++ /dev/null @@ -1,17 +0,0 @@ - - - - - {868474FD-35F6-4400-8EED-30A33E7521D4} - - - StaticLibrary - - - -@SOURCE_FILES@ - - - - - diff --git a/build_msvc/libunivalue/libunivalue.vcxproj b/build_msvc/libunivalue/libunivalue.vcxproj deleted file mode 100644 index 0f13a57241..0000000000 --- a/build_msvc/libunivalue/libunivalue.vcxproj +++ /dev/null @@ -1,19 +0,0 @@ - - - - - {5724BA7D-A09A-4BA8-800B-C4C1561B3D69} - - - StaticLibrary - - - - - - - - - - - diff --git a/build_msvc/msbuild/tasks/hexdump.targets b/build_msvc/msbuild/tasks/hexdump.targets deleted file mode 100644 index 12868a9874..0000000000 --- a/build_msvc/msbuild/tasks/hexdump.targets +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - outFileInfo.LastWriteTime) - { - using (Stream inStm = File.OpenRead(RawFilePath)) - { - using (StreamWriter sw = new StreamWriter(HeaderFilePath)) - { - sw.WriteLine(SourceHeader); - int count = 0; - int rawChar = inStm.ReadByte(); - while(rawChar != -1) - { - sw.Write("0x{0:x2}, ", rawChar); - count++; - if(count % 8 == 0) - { - sw.WriteLine(); - } - rawChar = inStm.ReadByte(); - } - sw.WriteLine(SourceFooter); - } - } - } -} -]]> - - - - \ No newline at end of file diff --git a/build_msvc/msbuild/tasks/replaceinfile.targets b/build_msvc/msbuild/tasks/replaceinfile.targets deleted file mode 100644 index 2ccb8b30e0..0000000000 --- a/build_msvc/msbuild/tasks/replaceinfile.targets +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/build_msvc/msvc-autogen.py b/build_msvc/msvc-autogen.py deleted file mode 100644 index bb103cb6d3..0000000000 --- a/build_msvc/msvc-autogen.py +++ /dev/null @@ -1,118 +0,0 @@ -#!/usr/bin/env python3 -# Copyright (c) 2016-2024 The Bitcoin Core developers -# Copyright (c) 2019-2024 The Bitgesell 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 re -import argparse -from shutil import copyfile - -SOURCE_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'src')) -DEFAULT_PLATFORM_TOOLSET = R'v143' - -libs = [ - 'libBGL_cli', - 'libBGL_common', - 'libBGL_crypto', - 'libBGL_node', - 'libBGL_util', - 'libBGL_wallet_tool', - 'libBGL_wallet', - 'libBGL_zmq', - 'bench_BGL', - 'libtest_util', -] - -ignore_list = [ -] - -lib_sources = {} - - -def parse_makefile(makefile): - with open(makefile, 'r', encoding='utf-8') as file: - current_lib = '' - for line in file.read().splitlines(): - if current_lib: - source = line.split()[0] - if (source.endswith('.cpp') or source.endswith('.c')) and not source.startswith('$') and source not in ignore_list: - source_filename = source.replace('/', '\\') - object_filename = source.replace('/', '_')[:-4] + ".obj" - lib_sources[current_lib].append((source_filename, object_filename)) - if not line.endswith('\\'): - current_lib = '' - continue - for lib in libs: - _lib = lib.replace('-', '_') - if re.search(_lib + '.*_SOURCES \\= \\\\', line): - current_lib = lib - if not current_lib in lib_sources: - lib_sources[current_lib] = [] - break - -def parse_config_into_BGL_config(): - def find_between( s, first, last ): - try: - start = s.index( first ) + len( first ) - end = s.index( last, start ) - return s[start:end] - except ValueError: - return "" - - config_info = [] - with open(os.path.join(SOURCE_DIR,'../configure.ac'), encoding="utf8") as f: - for line in f: - if line.startswith("define"): - config_info.append(find_between(line, "(_", ")")) - - config_info = [c for c in config_info if not c.startswith("COPYRIGHT_HOLDERS")] - - config_dict = dict(item.split(", ") for item in config_info) - config_dict["PACKAGE_VERSION"] = f"\"{config_dict['CLIENT_VERSION_MAJOR']}.{config_dict['CLIENT_VERSION_MINOR']}.{config_dict['CLIENT_VERSION_BUILD']}\"" - version = config_dict["PACKAGE_VERSION"].strip('"') - config_dict["PACKAGE_STRING"] = f"\"BGL Core {version}\"" - - with open(os.path.join(SOURCE_DIR,'../build_msvc/BGL_config.h.in'), "r", encoding="utf8") as template_file: - template = template_file.readlines() - - for index, line in enumerate(template): - header = "" - if line.startswith("#define"): - header = line.split(" ")[1] - if header in config_dict: - template[index] = line.replace("$", f"{config_dict[header]}") - - with open(os.path.join(SOURCE_DIR,'../build_msvc/BGL_config.h'), "w", encoding="utf8") as BGL_config: - BGL_config.writelines(template) - -def set_properties(vcxproj_filename, placeholder, content): - with open(vcxproj_filename + '.in', 'r', encoding='utf-8') as vcxproj_in_file: - with open(vcxproj_filename, 'w', encoding='utf-8') as vcxproj_file: - vcxproj_file.write(vcxproj_in_file.read().replace(placeholder, content)) - -def main(): - parser = argparse.ArgumentParser(description='BGL-core msbuild configuration initialiser.') - parser.add_argument('-toolset', nargs='?', default=DEFAULT_PLATFORM_TOOLSET, - help='Optionally sets the msbuild platform toolset, e.g. v143 for Visual Studio 2022.' - ' default is %s.'%DEFAULT_PLATFORM_TOOLSET) - args = parser.parse_args() - set_properties(os.path.join(SOURCE_DIR, '../build_msvc/common.init.vcxproj'), '@TOOLSET@', args.toolset) - - for makefile_name in os.listdir(SOURCE_DIR): - if 'Makefile' in makefile_name: - parse_makefile(os.path.join(SOURCE_DIR, makefile_name)) - for key, value in lib_sources.items(): - vcxproj_filename = os.path.abspath(os.path.join(os.path.dirname(__file__), key, key + '.vcxproj')) - content = '' - for source_filename, object_filename in value: - content += ' \n' - content += ' $(IntDir)' + object_filename + '\n' - content += ' \n' - set_properties(vcxproj_filename, '@SOURCE_FILES@\n', content) - parse_config_into_BGL_config() - copyfile(os.path.join(SOURCE_DIR,'../build_msvc/BGL_config.h'), os.path.join(SOURCE_DIR, 'config/BGL-config.h')) - -if __name__ == '__main__': - main() diff --git a/build_msvc/test_BGL-qt/test_BGL-qt.vcxproj b/build_msvc/test_BGL-qt/test_BGL-qt.vcxproj deleted file mode 100644 index aa49e1ccd6..0000000000 --- a/build_msvc/test_BGL-qt/test_BGL-qt.vcxproj +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - {51201D5E-D939-4854-AE9D-008F03FF518E} - - - Application - $(SolutionDir)$(Platform)\$(Configuration)\ - - - - - - - - - - - - - - - - - - - - - - {2b384fa8-9ee1-4544-93cb-0d733c25e8ce} - - - {0667528c-d734-4009-adf9-c0d6c4a5a5a6} - - - {7c87e378-df58-482e-aa2f-1bc129bc19ce} - - - {6190199c-6cf4-4dad-bfbd-93fa72a760c1} - - - {2b4abff8-d1fd-4845-88c9-1f3c0a6512bf} - - - {460fee33-1fe1-483f-b3bf-931ff8e969a5} - - - {b53a5535-ee9d-4c6f-9a26-f79ee3bc3754} - - - {93b86837-b543-48a5-a89b-7c87abb77df2} - - - {792d487f-f14c-49fc-a9de-3fc150f31c3f} - - - {1e065f03-3566-47d0-8fa9-daa72b084e7d} - - - {18430fef-6b61-4c53-b396-718e02850f1b} - - - {bb493552-3b8c-4a8c-bf69-a6e7a51d2ea6} - - - {5724ba7d-a09a-4ba8-800b-c4c1561b3d69} - - - - - - ..\libBGL_qt\$(GeneratedFilesOutDir)\..\;$(QtIncludeDir)\QtTest;$(QtIncludes);%(AdditionalIncludeDirectories) - - - $(QtLibraryDir)\Qt5Test.lib;$(QtReleaseLibraries);%(AdditionalDependencies) - /LTCG:OFF - - - - - - ..\libBGL_qt\$(GeneratedFilesOutDir)\..\;$(QtIncludeDir)\QtTest;$(QtIncludes);%(AdditionalIncludeDirectories) - - - $(QtDebugLibraries);%(AdditionalDependencies) - - - - - - - - - - - - - - There was an error executing the test_BGL-qt moc code generation task. - - - - - - - - - - - - - - - moccode; - $(BuildDependsOn); - - - - - QtTestCleanGeneratedFiles; - $(CleanDependsOn); - - - diff --git a/build_msvc/test_BGL/script_tests.json.gen b/build_msvc/test_BGL/script_tests.json.gen deleted file mode 100644 index 4715b70beb..0000000000 --- a/build_msvc/test_BGL/script_tests.json.gen +++ /dev/null @@ -1,1213 +0,0 @@ -[ - "0x47 0x304402202f763ef88e392432743b924ae8e4b1c2d0d50c82f6daa3951f5381bda59e607b022064bdd1f2a1264d3eb7d81d6b640d99c7a895f6a4ab210396c026b63e98f642d501", - "0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG", - "", - "OK", - "P2PK" -], -[ - "0x47 0x304402202f763ef88e392532743b924ae8e4b1c2d0d50c82f6daa3951f5381bda59e607b022064bdd1f2a1264d3eb7d81d6b640d99c7a895f6a4ab210396c026b63e98f642d501", - "0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG", - "", - "EVAL_FALSE", - "P2PK, bad sig" -], -[ - "0x47 0x3044022027224977e7e5745cdd37b3bf09ec747c204d90f275bd116c51b351dac36c8b8102201dcc5e35101a889d2bac617e390751f324e2089dd7fd042e96d9ac78f32cf31f01 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508", - "DUP HASH160 0x14 0x1018853670f9f3b0582c5b9ee8ce93764ac32b93 EQUALVERIFY CHECKSIG", - "", - "OK", - "P2PKH" -], -[ - "0x47 0x304402206fc4f0b1fa68a22ff0d25cfb40e3249b18c339c8d26a706f1e245699b4ecb1d60220552a7383dd3fdf726d04c2e80105a09dff2bfeb2fa3ed9499b0fef8951f68a3101 0x21 0x03363d90d446b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640", - "DUP HASH160 0x14 0xc0834c0c158f53be706d234c38fd52de7eece656 EQUALVERIFY CHECKSIG", - "", - "EQUALVERIFY", - "P2PKH, bad pubkey" -], -[ - "0x47 0x304402204c3d1a627134a349d9f82a4ee6f52155522a9ea67ae4f1f488602600d750f3a902203036f487fef12e7a0d95d051e23bef80bd95fd140245c9006fb3b5c293b0aebf81", - "0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG", - "", - "OK", - "P2PK anyonecanpay" -], -[ - "0x47 0x304402204c3d1a627134a349d9f82a4ee6f52155522a9ea67ae4f1f488602600d750f3a902203036f487fef12e7a0d95d051e23bef80bd95fd140245c9006fb3b5c293b0aebf01", - "0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG", - "", - "EVAL_FALSE", - "P2PK anyonecanpay marked with normal hashtype" -], -[ - "0x47 0x304402203d9c2d90707437fa92ed333ab431b6c9f257843b235a6c791fbd086c0a390be6022020315ba8bb7e0a06c07ea9a4362feaa066fe01324a3d445688bf757843a6b65b01 0x23 0x210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ac", - "HASH160 0x14 0x23b0ad3477f2178bc0b3eed26e4e6316f4e83aa1 EQUAL", - "P2SH", - "OK", - "P2SH(P2PK)" -], -[ - "0x47 0x304402203d9c2d90707437fa92ed333ab431b6c9f257843b235a6c791fbd086c0a390be6022020315ba8bb7e0a06c07ea9a4362feaa066fe01324a3d445688bf757843a6b65b01 0x23 0x210279be667ef9dcbbac54a06295ce870b07029bfcdb2dce28d959f2815b16f81798ac", - "HASH160 0x14 0x23b0ad3477f2178bc0b3eed26e4e6316f4e83aa1 EQUAL", - "P2SH", - "EVAL_FALSE", - "P2SH(P2PK), bad redeemscript" -], -[ - "0x47 0x3044022047a393ca3f3570cc1a5a6596d76f3ccdfee6d6ba1b892bfae6461b326a5a103502206bc10cdb27e34377b233d29a3906ba6b5036909e09413c1cf471e1940216c7ba01 0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 0x19 0x76a91491b24bf9f5288532960ac687abb035127b1d28a588ac", - "HASH160 0x14 0x7f67f0521934a57d3039f77f9f32cf313f3ac74b EQUAL", - "P2SH", - "OK", - "P2SH(P2PKH)" -], -[ - "0x47 0x304402200ae21021ae37a1993e49102af849b3a17a513ae3dee0381956745fb991e6d36a022019c3b053fa70b82860379e3981cbad42de338ff4258a7b546c41cffd5793d21401 0x19 0x76a9147cf9c846cd4882efec4bf07e44ebdad495c94f4b88ac", - "HASH160 0x14 0x2df519943d5acc0ef5222091f9dfe3543f489a82 EQUAL", - "", - "OK", - "P2SH(P2PKH), bad sig but no VERIFY_P2SH" -], -[ - "0x47 0x304402200ae21021ae37a1993e49102af849b3a17a513ae3dee0381956745fb991e6d36a022019c3b053fa70b82860379e3981cbad42de338ff4258a7b546c41cffd5793d21401 0x19 0x76a9147cf9c846cd4882efec4bf07e44ebdad495c94f4b88ac", - "HASH160 0x14 0x2df519943d5acc0ef5222091f9dfe3543f489a82 EQUAL", - "P2SH", - "EQUALVERIFY", - "P2SH(P2PKH), bad sig" -], -[ - "0 0x47 0x304402203e24a07d8f567bf7155dba218ae289b9a703ed3ce099c28bee8061b6d288599602203b8582b39d1a80771ef24542001e0a5685b9d861fb06de901570a28f4e84473401 0x47 0x304402205274eab62617650fea6dadee4c74296730d86770a706e453e9244701cb3cdb6c0220678c10a1b573066f996f48df3be1485f39dead6b7a77ea3c9da2302aabc4f1e001 0x47 0x3044022057c0ab36ad3717ff41b629bc425ff6919738a0c5608f37fb093091411435682b022072fd0b78a2fd360bfec6ad760510390dfbcf2c37c3b528f3fdcbffdb37273d9201", - "3 0x21 0x0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 3 CHECKMULTISIG", - "", - "OK", - "3-of-3" -], -[ - "0 0x47 0x304402203e24a07d8f567bf7155dba218ae289b9a703ed3ce099c28bee8061b6d288599602203b8582b39d1a80771ef24542001e0a5685b9d861fb06de901570a28f4e84473401 0x47 0x304402205274eab62617650fea6dadee4c74296730d86770a706e453e9244701cb3cdb6c0220678c10a1b573066f996f48df3be1485f39dead6b7a77ea3c9da2302aabc4f1e001 0", - "3 0x21 0x0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 3 CHECKMULTISIG", - "", - "EVAL_FALSE", - "3-of-3, 2 sigs" -], -[ - "0 0x47 0x3044022073fd5e9b77c017ccc6d3dec43b312773e0a24a653fde9e56fbff2c623352164a0220246e0bb4e146a3cc2feaf370e07f6ebabcabdd3e234dda48f111fbcad4fdb8ee01 0x47 0x30440220015b3e45cd1937f40aafd3851a56977c8b08afe218b2ce541ebcc7c6e74efd59022043ada940a1cad600ea3bd145729e7884bdba486e9715c1ce0bd9b3b6bb18893a01 0x4c69 0x52210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179821038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f515082103363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff464053ae", - "HASH160 0x14 0xc9e4a896d149702d0d1695434feddd52e24ad78d EQUAL", - "P2SH", - "OK", - "P2SH(2-of-3)" -], -[ - "0 0x47 0x3044022073fd5e9b77c017ccc6d3dec43b312773e0a24a653fde9e56fbff2c623352164a0220246e0bb4e146a3cc2feaf370e07f6ebabcabdd3e234dda48f111fbcad4fdb8ee01 0 0x4c69 0x52210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179821038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f515082103363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff464053ae", - "HASH160 0x14 0xc9e4a896d149702d0d1695434feddd52e24ad78d EQUAL", - "P2SH", - "EVAL_FALSE", - "P2SH(2-of-3), 1 sig" -], -[ - "0x47 0x3044022000222a93e4a99ed27f25a40894c548108c47dacc92ff7faf498012712af67bec022056af509a180ec1cc900a6e31d86536015b7451245270d1a9715ca460d5b30f9501", - "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG", - "", - "OK", - "P2PK with too much R padding but no DERSIG" -], -[ - "0x47 0x3044022000222a93e4a99ed27f25a40894c548108c47dacc92ff7faf498012712af67bec022056af509a180ec1cc900a6e31d86536015b7451245270d1a9715ca460d5b30f9501", - "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG", - "DERSIG", - "SIG_DER", - "P2PK with too much R padding" -], -[ - "0x48 0x304502204faa6ee94c89550aa1be8ae6951bdceee018803e2b309e21091f5830b47056de02210033decc3b97a43bd1af08d23f62b4c8464002a8485ad5359626f415db9b8db14e01", - "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG", - "", - "OK", - "P2PK with too much S padding but no DERSIG" -], -[ - "0x48 0x304502204faa6ee94c89550aa1be8ae6951bdceee018803e2b309e21091f5830b47056de02210033decc3b97a43bd1af08d23f62b4c8464002a8485ad5359626f415db9b8db14e01", - "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG", - "DERSIG", - "SIG_DER", - "P2PK with too much S padding" -], -[ - "0x47 0x30440220b0ff27d082f4f0ad7f74cb47c79c20510aa0d3ff0d142245984bd1592d8b3fea022043c8f45a85357afd4dfedeffb6ff25780549cd5a6b4e4de31b2a0b2bba2c55e601", - "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG", - "", - "OK", - "P2PK with too little R padding but no DERSIG" -], -[ - "0x47 0x30440220b0ff27d082f4f0ad7f74cb47c79c20510aa0d3ff0d142245984bd1592d8b3fea022043c8f45a85357afd4dfedeffb6ff25780549cd5a6b4e4de31b2a0b2bba2c55e601", - "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG", - "DERSIG", - "SIG_DER", - "P2PK with too little R padding" -], -[ - "0x47 0x304402200026502aabf35664553416f619eeebbc7fb282702ce08f54d8d89d32a7407a54022027d8a81feabacb90c8b16cd4bff90a9b125652999534c8f52568c5e495bae2fe01", - "0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG NOT", - "", - "OK", - "P2PK NOT with bad sig with too much R padding but no DERSIG" -], -[ - "0x47 0x304402200026502aabf35664553416f619eeebbc7fb282702ce08f54d8d89d32a7407a54022027d8a81feabacb90c8b16cd4bff90a9b125652999534c8f52568c5e495bae2fe01", - "0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG NOT", - "DERSIG", - "SIG_DER", - "P2PK NOT with bad sig with too much R padding" -], -[ - "0x47 0x304402200026502aabf35764553416f619eeebbc7fb282702ce08f54d8d89d32a7407a54022027d8a81feabacb90c8b16cd4bff90a9b125652999534c8f52568c5e495bae2fe01", - "0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG NOT", - "", - "EVAL_FALSE", - "P2PK NOT with too much R padding but no DERSIG" -], -[ - "0x47 0x304402200026502aabf35764553416f619eeebbc7fb282702ce08f54d8d89d32a7407a54022027d8a81feabacb90c8b16cd4bff90a9b125652999534c8f52568c5e495bae2fe01", - "0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG NOT", - "DERSIG", - "SIG_DER", - "P2PK NOT with too much R padding" -], -[ - "0x47 0x30440220b0ff27d082f4f0ad7f74cb47c79c20510aa0d3ff0d142245984bd1592d8b3fea022043c8f45a85357afd4dfedeffb6ff25780549cd5a6b4e4de31b2a0b2bba2c55e601", - "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG", - "", - "OK", - "BIP66 example 1, without DERSIG" -], -[ - "0x47 0x30440220b0ff27d082f4f0ad7f74cb47c79c20510aa0d3ff0d142245984bd1592d8b3fea022043c8f45a85357afd4dfedeffb6ff25780549cd5a6b4e4de31b2a0b2bba2c55e601", - "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG", - "DERSIG", - "SIG_DER", - "BIP66 example 1, with DERSIG" -], -[ - "0x47 0x304402209159084ae48850881e3bf5848797e1d5441e8c82574193435c1424a65eb70de9022025926fb55795bc207dd3490c11fab0ff34814a41d6ed341a8e76abdf2ffba49f01", - "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT", - "", - "EVAL_FALSE", - "BIP66 example 2, without DERSIG" -], -[ - "0x47 0x304402209159084ae48850881e3bf5848797e1d5441e8c82574193435c1424a65eb70de9022025926fb55795bc207dd3490c11fab0ff34814a41d6ed341a8e76abdf2ffba49f01", - "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT", - "DERSIG", - "SIG_DER", - "BIP66 example 2, with DERSIG" -], -[ - "0", - "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG", - "", - "EVAL_FALSE", - "BIP66 example 3, without DERSIG" -], -[ - "0", - "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG", - "DERSIG", - "EVAL_FALSE", - "BIP66 example 3, with DERSIG" -], -[ - "0", - "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT", - "", - "OK", - "BIP66 example 4, without DERSIG" -], -[ - "0", - "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT", - "DERSIG", - "OK", - "BIP66 example 4, with DERSIG" -], -[ - "1", - "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG", - "", - "EVAL_FALSE", - "BIP66 example 5, without DERSIG" -], -[ - "1", - "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG", - "DERSIG", - "SIG_DER", - "BIP66 example 5, with DERSIG" -], -[ - "1", - "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT", - "", - "OK", - "BIP66 example 6, without DERSIG" -], -[ - "1", - "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT", - "DERSIG", - "SIG_DER", - "BIP66 example 6, with DERSIG" -], -[ - "0 0x47 0x304402208444cb9968d1554b3571a66a84987035dc088b8429d2e022c5f62a6fb6bf50ad022062ac1d278811b929b78f184658ccab04441ca59cab04dc2802ce9b6b95bcb41c01 0x47 0x30440220050e97f4e52d3eff0c311d5eb2ee951a8a1304ad5b2f3c93fb9c86048ab4d92002202efaafe9cf1c929ec0368c181425943bcefdcf27b2aca16b3177804e626520dc01", - "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG", - "", - "OK", - "BIP66 example 7, without DERSIG" -], -[ - "0 0x47 0x304402208444cb9968d1554b3571a66a84987035dc088b8429d2e022c5f62a6fb6bf50ad022062ac1d278811b929b78f184658ccab04441ca59cab04dc2802ce9b6b95bcb41c01 0x47 0x30440220050e97f4e52d3eff0c311d5eb2ee951a8a1304ad5b2f3c93fb9c86048ab4d92002202efaafe9cf1c929ec0368c181425943bcefdcf27b2aca16b3177804e626520dc01", - "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG", - "DERSIG", - "SIG_DER", - "BIP66 example 7, with DERSIG" -], -[ - "0 0x47 0x304402209e16f5d70a140a64c6188c316751486ce0b0119f8d754f885347c874a8184567022060affd6c89334882dd8561478f5223707637acd552f1302410418fe4082cc2db01 0x47 0x304402206467f4d178ed25e4be74fe930162f5c41a028250a0820dffe36443d86f403336022009f107641622ae98ebd40efea2fbafef9c264bc0bf19d949baaafb9ed68b1c1201", - "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT", - "", - "EVAL_FALSE", - "BIP66 example 8, without DERSIG" -], -[ - "0 0x47 0x304402209e16f5d70a140a64c6188c316751486ce0b0119f8d754f885347c874a8184567022060affd6c89334882dd8561478f5223707637acd552f1302410418fe4082cc2db01 0x47 0x304402206467f4d178ed25e4be74fe930162f5c41a028250a0820dffe36443d86f403336022009f107641622ae98ebd40efea2fbafef9c264bc0bf19d949baaafb9ed68b1c1201", - "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT", - "DERSIG", - "SIG_DER", - "BIP66 example 8, with DERSIG" -], -[ - "0 0 0x47 0x30440220d3b448d17d0a9d410ef9f34d72d3dfe1a32d576ca40fabf0ca5b2d53a7a600cf0220461274b58b82cb40e0b4cef91624c65065a895395f3033bd77686717bd9b28ac01", - "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG", - "", - "EVAL_FALSE", - "BIP66 example 9, without DERSIG" -], -[ - "0 0 0x47 0x30440220d3b448d17d0a9d410ef9f34d72d3dfe1a32d576ca40fabf0ca5b2d53a7a600cf0220461274b58b82cb40e0b4cef91624c65065a895395f3033bd77686717bd9b28ac01", - "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG", - "DERSIG", - "SIG_DER", - "BIP66 example 9, with DERSIG" -], -[ - "0 0 0x47 0x30440220f0419b58619ff6c6960001464bb743539a0e5bc28a452adccc63041e7338b58f02204371508fafd1661c8ecd378f2bdc646f2c1d2a25ae805cbbf25978a3594b07ae01", - "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT", - "", - "OK", - "BIP66 example 10, without DERSIG" -], -[ - "0 0 0x47 0x30440220f0419b58619ff6c6960001464bb743539a0e5bc28a452adccc63041e7338b58f02204371508fafd1661c8ecd378f2bdc646f2c1d2a25ae805cbbf25978a3594b07ae01", - "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT", - "DERSIG", - "SIG_DER", - "BIP66 example 10, with DERSIG" -], -[ - "0 0x47 0x304402208444cb9968d1554b3571a66a84987035dc088b8429d2e022c5f62a6fb6bf50ad022062ac1d278811b929b78f184658ccab04441ca59cab04dc2802ce9b6b95bcb41c01 0", - "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG", - "", - "EVAL_FALSE", - "BIP66 example 11, without DERSIG" -], -[ - "0 0x47 0x304402208444cb9968d1554b3571a66a84987035dc088b8429d2e022c5f62a6fb6bf50ad022062ac1d278811b929b78f184658ccab04441ca59cab04dc2802ce9b6b95bcb41c01 0", - "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG", - "DERSIG", - "EVAL_FALSE", - "BIP66 example 11, with DERSIG" -], -[ - "0 0x47 0x304402209e16f5d70a140a64c6188c316751486ce0b0119f8d754f885347c874a8184567022060affd6c89334882dd8561478f5223707637acd552f1302410418fe4082cc2db01 0", - "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT", - "", - "OK", - "BIP66 example 12, without DERSIG" -], -[ - "0 0x47 0x304402209e16f5d70a140a64c6188c316751486ce0b0119f8d754f885347c874a8184567022060affd6c89334882dd8561478f5223707637acd552f1302410418fe4082cc2db01 0", - "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT", - "DERSIG", - "OK", - "BIP66 example 12, with DERSIG" -], -[ - "0x48 0x304402206a2728a6798ad93944222b613eea2e9e8dfc39868db220f90f06d1c9b9f07b740220283b5b96d6f06933289dc30977e0524cd7018c01f1c8559d2d3b1c80b5cad67a0101", - "0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG", - "", - "OK", - "P2PK with multi-byte hashtype, without DERSIG" -], -[ - "0x48 0x304402206a2728a6798ad93944222b613eea2e9e8dfc39868db220f90f06d1c9b9f07b740220283b5b96d6f06933289dc30977e0524cd7018c01f1c8559d2d3b1c80b5cad67a0101", - "0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG", - "DERSIG", - "SIG_DER", - "P2PK with multi-byte hashtype, with DERSIG" -], -[ - "0x48 0x304502206a2728a6798ad93944222b613eea2e9e8dfc39868db220f90f06d1c9b9f07b74022100d7c4a469290f96ccd7623cf6881fadb1e3ad50e4bd804a9e9297420c1a6b6ac701", - "0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG", - "", - "OK", - "P2PK with high S but no LOW_S" -], -[ - "0x48 0x304502206a2728a6798ad93944222b613eea2e9e8dfc39868db220f90f06d1c9b9f07b74022100d7c4a469290f96ccd7623cf6881fadb1e3ad50e4bd804a9e9297420c1a6b6ac701", - "0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG", - "LOW_S", - "SIG_HIGH_S", - "P2PK with high S" -], -[ - "0x47 0x3044022071d3ef65cf3e012353a4e1ffaa56240f071caf097053ff28c8d5d11335709ad9022066d7db6104fd18f59104f2b148b30d320d115c7fae8a7733ec0c35e93537082b01", - "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG", - "", - "OK", - "P2PK with hybrid pubkey but no STRICTENC" -], -[ - "0x47 0x3044022071d3ef65cf3e012353a4e1ffaa56240f071caf097053ff28c8d5d11335709ad9022066d7db6104fd18f59104f2b148b30d320d115c7fae8a7733ec0c35e93537082b01", - "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG", - "STRICTENC", - "PUBKEYTYPE", - "P2PK with hybrid pubkey" -], -[ - "0x47 0x3044022037981565c1f0af558cd1f04c2c93bed46ef998f37e6a8cfabf1bf640157a0f1002202de6f60321899e7e89ae03f4cfe24a7eca4ebeb4c5deba0e11f365e4ffa2e82001", - "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG NOT", - "", - "EVAL_FALSE", - "P2PK NOT with hybrid pubkey but no STRICTENC" -], -[ - "0x47 0x3044022037981565c1f0af558cd1f04c2c93bed46ef998f37e6a8cfabf1bf640157a0f1002202de6f60321899e7e89ae03f4cfe24a7eca4ebeb4c5deba0e11f365e4ffa2e82001", - "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG NOT", - "STRICTENC", - "PUBKEYTYPE", - "P2PK NOT with hybrid pubkey" -], -[ - "0x47 0x3044022037981565c1f0ae558cd1f04c2c93bed46ef998f37e6a8cfabf1bf640157a0f1002202de6f60321899e7e89ae03f4cfe24a7eca4ebeb4c5deba0e11f365e4ffa2e82001", - "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG NOT", - "", - "OK", - "P2PK NOT with invalid hybrid pubkey but no STRICTENC" -], -[ - "0x47 0x3044022037981565c1f0ae558cd1f04c2c93bed46ef998f37e6a8cfabf1bf640157a0f1002202de6f60321899e7e89ae03f4cfe24a7eca4ebeb4c5deba0e11f365e4ffa2e82001", - "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG NOT", - "STRICTENC", - "PUBKEYTYPE", - "P2PK NOT with invalid hybrid pubkey" -], -[ - "0 0x47 0x304402201f7a091a0de31f9c62a42dd521e6099b1e0050175a71f65479fae5f323b3f96f022037a595d1a1c3e32a47d7b57edb4e3ca140c4b8060fa7d39dfab2b3a555ae4c1501", - "1 0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 2 CHECKMULTISIG", - "", - "OK", - "1-of-2 with the second 1 hybrid pubkey and no STRICTENC" -], -[ - "0 0x47 0x304402201f7a091a0de31f9c62a42dd521e6099b1e0050175a71f65479fae5f323b3f96f022037a595d1a1c3e32a47d7b57edb4e3ca140c4b8060fa7d39dfab2b3a555ae4c1501", - "1 0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 2 CHECKMULTISIG", - "STRICTENC", - "OK", - "1-of-2 with the second 1 hybrid pubkey" -], -[ - "0 0x47 0x304402204934e0d2ed505fed6109948a68b225fc727623e4fbc494ec29dce0b46aaa18c6022027c7e1a16c5f7d65d31338d40416516d871fa811c15bf476675ded4f8ec41ba801", - "1 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 2 CHECKMULTISIG", - "STRICTENC", - "PUBKEYTYPE", - "1-of-2 with the first 1 hybrid pubkey" -], -[ - "0x47 0x3044022049703259b59bf68deaeddf553bd59d2c936c9dee452f7960383550bc7020bf990220690e6599bda6d703f4fce1fa928f907e09e045a1063d073b1c63116756039bb605", - "0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG", - "", - "OK", - "P2PK with undefined hashtype but no STRICTENC" -], -[ - "0x47 0x3044022049703259b59bf68deaeddf553bd59d2c936c9dee452f7960383550bc7020bf990220690e6599bda6d703f4fce1fa928f907e09e045a1063d073b1c63116756039bb605", - "0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG", - "STRICTENC", - "SIG_HASHTYPE", - "P2PK with undefined hashtype" -], -[ - "0x47 0x304402200dcee0a3e9637deb2e055705b84e89463b2d90e9f56eafe904735e1751ad19a302202c0b89c6a5269fe29c33a9913c1769b706d63aeadad4ed3c9d09409d13d00f5d05", - "0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG NOT", - "", - "OK", - "P2PK NOT with invalid sig and undefined hashtype but no STRICTENC" -], -[ - "0x47 0x304402200dcee0a3e9637deb2e055705b84e89463b2d90e9f56eafe904735e1751ad19a302202c0b89c6a5269fe29c33a9913c1769b706d63aeadad4ed3c9d09409d13d00f5d05", - "0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG NOT", - "STRICTENC", - "SIG_HASHTYPE", - "P2PK NOT with invalid sig and undefined hashtype" -], -[ - "1 0x47 0x304402203e24a07d8f567bf7155dba218ae289b9a703ed3ce099c28bee8061b6d288599602203b8582b39d1a80771ef24542001e0a5685b9d861fb06de901570a28f4e84473401 0x47 0x304402205274eab62617650fea6dadee4c74296730d86770a706e453e9244701cb3cdb6c0220678c10a1b573066f996f48df3be1485f39dead6b7a77ea3c9da2302aabc4f1e001 0x47 0x3044022057c0ab36ad3717ff41b629bc425ff6919738a0c5608f37fb093091411435682b022072fd0b78a2fd360bfec6ad760510390dfbcf2c37c3b528f3fdcbffdb37273d9201", - "3 0x21 0x0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 3 CHECKMULTISIG", - "", - "OK", - "3-of-3 with nonzero dummy but no NULLDUMMY" -], -[ - "1 0x47 0x304402203e24a07d8f567bf7155dba218ae289b9a703ed3ce099c28bee8061b6d288599602203b8582b39d1a80771ef24542001e0a5685b9d861fb06de901570a28f4e84473401 0x47 0x304402205274eab62617650fea6dadee4c74296730d86770a706e453e9244701cb3cdb6c0220678c10a1b573066f996f48df3be1485f39dead6b7a77ea3c9da2302aabc4f1e001 0x47 0x3044022057c0ab36ad3717ff41b629bc425ff6919738a0c5608f37fb093091411435682b022072fd0b78a2fd360bfec6ad760510390dfbcf2c37c3b528f3fdcbffdb37273d9201", - "3 0x21 0x0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 3 CHECKMULTISIG", - "NULLDUMMY", - "SIG_NULLDUMMY", - "3-of-3 with nonzero dummy" -], -[ - "1 0x47 0x304402201342b5f5b76d5df0d5a9bd1347ab151802c2b0d9b73d1f5ff319b9233c0b45dc02200e57936b0224558928675d4a4de39f5f4a06e63a0e583cce51e4868468f026f801 0x47 0x304402204d9d0484262a62e1a186be28421be84ccf8c36f8c6cf0cee249553712b9c72fd02205095ae7bb131ae84ac5aa50c2f6a4f720a55141924975544d73495a2571f4d1501 0x47 0x304402201169c76a279796902f8b3ffb396034c5c49a06e4482666149ce5fc6cb647671602204ae473ac10d898d9da7c46d93d6f941ba4f0991818823713b1382e9930acbeea01", - "3 0x21 0x0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 3 CHECKMULTISIG NOT", - "", - "OK", - "3-of-3 NOT with invalid sig and nonzero dummy but no NULLDUMMY" -], -[ - "1 0x47 0x304402201342b5f5b76d5df0d5a9bd1347ab151802c2b0d9b73d1f5ff319b9233c0b45dc02200e57936b0224558928675d4a4de39f5f4a06e63a0e583cce51e4868468f026f801 0x47 0x304402204d9d0484262a62e1a186be28421be84ccf8c36f8c6cf0cee249553712b9c72fd02205095ae7bb131ae84ac5aa50c2f6a4f720a55141924975544d73495a2571f4d1501 0x47 0x304402201169c76a279796902f8b3ffb396034c5c49a06e4482666149ce5fc6cb647671602204ae473ac10d898d9da7c46d93d6f941ba4f0991818823713b1382e9930acbeea01", - "3 0x21 0x0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 3 CHECKMULTISIG NOT", - "NULLDUMMY", - "SIG_NULLDUMMY", - "3-of-3 NOT with invalid sig with nonzero dummy" -], -[ - "0 0x47 0x304402201bd5e3ac832002ed5c2fe24e99c2a789ee4df65e5a6f71971173bb1c9083b9c5022029cb9caa5e735bb47f6497a23b762454444b17492d51ae5e9f66ecc6b2c7abbd01 DUP", - "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 2 CHECKMULTISIG", - "", - "OK", - "2-of-2 with two identical keys and sigs pushed using OP_DUP but no SIGPUSHONLY" -], -[ - "0 0x47 0x304402201bd5e3ac832002ed5c2fe24e99c2a789ee4df65e5a6f71971173bb1c9083b9c5022029cb9caa5e735bb47f6497a23b762454444b17492d51ae5e9f66ecc6b2c7abbd01 DUP", - "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 2 CHECKMULTISIG", - "SIGPUSHONLY", - "SIG_PUSHONLY", - "2-of-2 with two identical keys and sigs pushed using OP_DUP" -], -[ - "0x47 0x30440220285b69cc93cd00d0025875cbc78bd4802bb3eea703233274243dd6f695d87af5022071c3a797a9221400ae1efbd9d061c53257e1779ae2b5bc78d569e46d7503d72e01 NOP8 0x23 0x2103363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640ac", - "HASH160 0x14 0x215640c2f72f0d16b4eced26762035a42ffed39a EQUAL", - "", - "OK", - "P2SH(P2PK) with non-push scriptSig but no P2SH or SIGPUSHONLY" -], -[ - "0x47 0x304402206a2728a6798ad93944222b613eea2e9e8dfc39868db220f90f06d1c9b9f07b740220283b5b96d6f06933289dc30977e0524cd7018c01f1c8559d2d3b1c80b5cad67a01 NOP8", - "0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG", - "", - "OK", - "P2PK with non-push scriptSig but with P2SH validation" -], -[ - "0x47 0x30440220285b69cc93cd00d0025875cbc78bd4802bb3eea703233274243dd6f695d87af5022071c3a797a9221400ae1efbd9d061c53257e1779ae2b5bc78d569e46d7503d72e01 NOP8 0x23 0x2103363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640ac", - "HASH160 0x14 0x215640c2f72f0d16b4eced26762035a42ffed39a EQUAL", - "P2SH", - "SIG_PUSHONLY", - "P2SH(P2PK) with non-push scriptSig but no SIGPUSHONLY" -], -[ - "0x47 0x30440220285b69cc93cd00d0025875cbc78bd4802bb3eea703233274243dd6f695d87af5022071c3a797a9221400ae1efbd9d061c53257e1779ae2b5bc78d569e46d7503d72e01 NOP8 0x23 0x2103363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640ac", - "HASH160 0x14 0x215640c2f72f0d16b4eced26762035a42ffed39a EQUAL", - "SIGPUSHONLY", - "SIG_PUSHONLY", - "P2SH(P2PK) with non-push scriptSig but not P2SH" -], -[ - "0 0x47 0x304402201bd5e3ac832002ed5c2fe24e99c2a789ee4df65e5a6f71971173bb1c9083b9c5022029cb9caa5e735bb47f6497a23b762454444b17492d51ae5e9f66ecc6b2c7abbd01 0x47 0x304402201bd5e3ac832002ed5c2fe24e99c2a789ee4df65e5a6f71971173bb1c9083b9c5022029cb9caa5e735bb47f6497a23b762454444b17492d51ae5e9f66ecc6b2c7abbd01", - "2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 2 CHECKMULTISIG", - "SIGPUSHONLY", - "OK", - "2-of-2 with two identical keys and sigs pushed" -], -[ - "11 0x47 0x304402202f763ef88e392432743b924ae8e4b1c2d0d50c82f6daa3951f5381bda59e607b022064bdd1f2a1264d3eb7d81d6b640d99c7a895f6a4ab210396c026b63e98f642d501", - "0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG", - "P2SH", - "OK", - "P2PK with unnecessary input but no CLEANSTACK" -], -[ - "11 0x47 0x304402202f763ef88e392432743b924ae8e4b1c2d0d50c82f6daa3951f5381bda59e607b022064bdd1f2a1264d3eb7d81d6b640d99c7a895f6a4ab210396c026b63e98f642d501", - "0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG", - "CLEANSTACK,P2SH", - "CLEANSTACK", - "P2PK with unnecessary input" -], -[ - "11 0x47 0x304402200a0db51699a4546f888907ede3a35123d78eae08c1a8e691db40b222839835ad022066c146b6cc02c036ae79dafe3dc7f7eb85a169649857ee7279fcae151fa9a75d01 0x43 0x410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac", - "HASH160 0x14 0x31edc23bdafda4639e669f89ad6b2318dd79d032 EQUAL", - "P2SH", - "OK", - "P2SH with unnecessary input but no CLEANSTACK" -], -[ - "11 0x47 0x304402200a0db51699a4546f888907ede3a35123d78eae08c1a8e691db40b222839835ad022066c146b6cc02c036ae79dafe3dc7f7eb85a169649857ee7279fcae151fa9a75d01 0x43 0x410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac", - "HASH160 0x14 0x31edc23bdafda4639e669f89ad6b2318dd79d032 EQUAL", - "CLEANSTACK,P2SH", - "CLEANSTACK", - "P2SH with unnecessary input" -], -[ - "0x47 0x304402200a0db51699a4546f888907ede3a35123d78eae08c1a8e691db40b222839835ad022066c146b6cc02c036ae79dafe3dc7f7eb85a169649857ee7279fcae151fa9a75d01 0x43 0x410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac", - "HASH160 0x14 0x31edc23bdafda4639e669f89ad6b2318dd79d032 EQUAL", - "CLEANSTACK,P2SH", - "OK", - "P2SH with CLEANSTACK" -], -[ - [ - "3044022016352dc8c84b9b890fb6fd1ae9114aa3d8a845e69daf69f6071ec17479a0aa1e0220045ce064147e898b5f0b2bea963079906d5adb6231b44f134949d180e7f87cd801", - "410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac", - 0.00000001 - ], - "", - "0 0x20 0xb95237b48faaa69eb078e1170be3b5cbb3fddf16d0a991e14ad274f7b33a4f64", - "P2SH,WITNESS", - "OK", - "Basic P2WSH" -], -[ - [ - "3044022037eb6edecc0cb2c2e2e6f234ba0dfbdac659d0035ea281478f46645f93cb2a710220162a33f108462c4216d346801f10b81ccf88498fe7d5af13a5c07fbb659398d201", - "0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8", - 0.00000001 - ], - "", - "0 0x14 0x91b24bf9f5288532960ac687abb035127b1d28a5", - "P2SH,WITNESS", - "OK", - "Basic P2WPKH" -], -[ - [ - "3044022048300b4f6df240fd6d99b3f4a05de1853f1ae119cc0a592ad42436b146a2554a022005bfcfafd70126204f27ad3b889f82c21c6182f9e51ff0609541eecc52e96f9701", - "410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac", - 0.00000001 - ], - "0x22 0x0020b95237b48faaa69eb078e1170be3b5cbb3fddf16d0a991e14ad274f7b33a4f64", - "HASH160 0x14 0xf386c2ba255cc56d20cfa6ea8b062f8b59945518 EQUAL", - "P2SH,WITNESS", - "OK", - "Basic P2SH(P2WSH)" -], -[ - [ - "3044022031232887440f3e8b8b737cd2d2752dd90dcd8a7dd367cbfdc83368e2849e2cea022061a3f1b809ea4b31af0543b36645ddd9247f357abcc20da9e502f82ea7a5abfa01", - "0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8", - 0.00000001 - ], - "0x16 0x001491b24bf9f5288532960ac687abb035127b1d28a5", - "HASH160 0x14 0x17743beb429c55c942d2ec703b98c4d57c2df5c6 EQUAL", - "P2SH,WITNESS", - "OK", - "Basic P2SH(P2WPKH)" -], -[ - [ - "304402203cf006faf2c63553330d5cf0d6e754629f36db171dcc5ac213e4a0259c533eec02203e0ab4b8637e0f4f386a565d12fbe1e261e910ee60be1cac05cfe423233c961b01", - "41048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26cafac", - 0.00000000 - ], - "", - "0 0x20 0xac8ebd9e52c17619a381fa4f71aebb696087c6ef17c960fd0587addad99c0610", - "P2SH,WITNESS", - "EVAL_FALSE", - "Basic P2WSH with the wrong key" -], -[ - [ - "3044022072a8d9e01b0fa3cf6d2e7d9970507499c5b3f59fc9ab8307e2e76af86adf40ef02203ae0ea2ef2a81d62d9e6703081308cea5efcbb0ae1bae3c91241310b94712ab501", - "048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf", - 0.00000000 - ], - "", - "0 0x14 0x7cf9c846cd4882efec4bf07e44ebdad495c94f4b", - "P2SH,WITNESS", - "EVAL_FALSE", - "Basic P2WPKH with the wrong key" -], -[ - [ - "304402203204e3898f15bf02602d6c130adf9b11ee9c44e2ac4752ccee115ab8ce0c17e30220719bdc69363e2fc60fc758ae71ea30a53aa9babad7ce27f0a0331099e362725001", - "41048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26cafac", - 0.00000000 - ], - "0x22 0x0020ac8ebd9e52c17619a381fa4f71aebb696087c6ef17c960fd0587addad99c0610", - "HASH160 0x14 0x61039a003883787c0d6ebc66d97fdabe8e31449d EQUAL", - "P2SH,WITNESS", - "EVAL_FALSE", - "Basic P2SH(P2WSH) with the wrong key" -], -[ - [ - "304402205afa9c6cfe060e637533e86fe93218328764dba3a68b613104a04613c08a592402204d30c8707ccd6ce38d72c9d4e900a413e58ffa5225e8855cefececbb86b822fb01", - "048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf", - 0.00000000 - ], - "0x16 0x00147cf9c846cd4882efec4bf07e44ebdad495c94f4b", - "HASH160 0x14 0x4e0c2aed91315303fc6a1dc4c7bc21c88f75402e EQUAL", - "P2SH,WITNESS", - "EVAL_FALSE", - "Basic P2SH(P2WPKH) with the wrong key" -], -[ - [ - "304402203cf006faf2c63553330d5cf0d6e754629f36db171dcc5ac213e4a0259c533eec02203e0ab4b8637e0f4f386a565d12fbe1e261e910ee60be1cac05cfe423233c961b01", - "41048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26cafac", - 0.00000000 - ], - "", - "0 0x20 0xac8ebd9e52c17619a381fa4f71aebb696087c6ef17c960fd0587addad99c0610", - "P2SH", - "OK", - "Basic P2WSH with the wrong key but no WITNESS" -], -[ - [ - "3044022072a8d9e01b0fa3cf6d2e7d9970507499c5b3f59fc9ab8307e2e76af86adf40ef02203ae0ea2ef2a81d62d9e6703081308cea5efcbb0ae1bae3c91241310b94712ab501", - "048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf", - 0.00000000 - ], - "", - "0 0x14 0x7cf9c846cd4882efec4bf07e44ebdad495c94f4b", - "P2SH", - "OK", - "Basic P2WPKH with the wrong key but no WITNESS" -], -[ - [ - "304402203204e3898f15bf02602d6c130adf9b11ee9c44e2ac4752ccee115ab8ce0c17e30220719bdc69363e2fc60fc758ae71ea30a53aa9babad7ce27f0a0331099e362725001", - "41048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26cafac", - 0.00000000 - ], - "0x22 0x0020ac8ebd9e52c17619a381fa4f71aebb696087c6ef17c960fd0587addad99c0610", - "HASH160 0x14 0x61039a003883787c0d6ebc66d97fdabe8e31449d EQUAL", - "P2SH", - "OK", - "Basic P2SH(P2WSH) with the wrong key but no WITNESS" -], -[ - [ - "304402205afa9c6cfe060e637533e86fe93218328764dba3a68b613104a04613c08a592402204d30c8707ccd6ce38d72c9d4e900a413e58ffa5225e8855cefececbb86b822fb01", - "048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf", - 0.00000000 - ], - "0x16 0x00147cf9c846cd4882efec4bf07e44ebdad495c94f4b", - "HASH160 0x14 0x4e0c2aed91315303fc6a1dc4c7bc21c88f75402e EQUAL", - "P2SH", - "OK", - "Basic P2SH(P2WPKH) with the wrong key but no WITNESS" -], -[ - [ - "3044022075aab81ee7463c1a620841f8a405109cac9554481c38e6f5edd6176490be21ce022072875f38877fb5886b6dd296f7b924c8df097f3fe4881e50f4b7a0ed835e110701", - "410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac", - 0.00000000 - ], - "", - "0 0x20 0xb95237b48faaa69eb078e1170be3b5cbb3fddf16d0a991e14ad274f7b33a4f64", - "P2SH,WITNESS", - "EVAL_FALSE", - "Basic P2WSH with wrong value" -], -[ - [ - "304402202f6a8a562a3cb46704b8f3fc99b756896b3666d95a671d0b6f9d472b1bf9be7502203411cc79d21b12442c9df76788261f228a209f9482905dbb8ec165265fbc662c01", - "0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8", - 0.00000000 - ], - "", - "0 0x14 0x91b24bf9f5288532960ac687abb035127b1d28a5", - "P2SH,WITNESS", - "EVAL_FALSE", - "Basic P2WPKH with wrong value" -], -[ - [ - "30440220131f9e4ea76f2db299a76cb224cb421f5e6c1ccc71576aff1fea6dfef5ddf91c0220025966e1259162813e2cf4f502f5cd877b588ce813e93d02b4cb7b5e5ce33f8701", - "410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac", - 0.00000000 - ], - "0x22 0x0020b95237b48faaa69eb078e1170be3b5cbb3fddf16d0a991e14ad274f7b33a4f64", - "HASH160 0x14 0xf386c2ba255cc56d20cfa6ea8b062f8b59945518 EQUAL", - "P2SH,WITNESS", - "EVAL_FALSE", - "Basic P2SH(P2WSH) with wrong value" -], -[ - [ - "3044022064ec31fcdc57ccfc46de3359e152b119c79074391caa4a9cce6794773bc1eb82022071be8cdda130352afd29fb61d65a526b032709bff7cdf564ffb4315dfe187c1701", - "0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8", - 0.00000000 - ], - "0x16 0x001491b24bf9f5288532960ac687abb035127b1d28a5", - "HASH160 0x14 0x17743beb429c55c942d2ec703b98c4d57c2df5c6 EQUAL", - "P2SH,WITNESS", - "EVAL_FALSE", - "Basic P2SH(P2WPKH) with wrong value" -], -[ - [ - "304402203973920538dc9890a9d7e427bbccf99f74ed314bb20122fffe4edeadc17959fe02205c27ada4bdf198b0e3be3bcad458a727c8263b4f33b1d423d1deef9c01b3e7d501", - "0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8", - 0.00000000 - ], - "", - "1 0x14 0x91b24bf9f5288532960ac687abb035127b1d28a5", - "DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM,P2SH,WITNESS", - "DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM", - "P2WPKH with future witness version" -], -[ - [ - "304402207e0165db8d60508f472b91f733f8d8a7d035ac8739f25eb9eb21aed113438ffb02205d08bd991e024075165afd17414ad5e33c3940b2df20c322f01da06e3ec6de9801", - "0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8", - 0.00000000 - ], - "", - "0 0x1f 0xb34b78da162751647974d5cb7410aa428ad339dbf7d1e16e833f68a0cbf1c3", - "P2SH,WITNESS", - "WITNESS_PROGRAM_WRONG_LENGTH", - "P2WPKH with wrong witness program length" -], -[ - "", - "0 0x20 0xb95237b48faaa69eb078e1170be3b5cbb3fddf16d0a991e14ad274f7b33a4f64", - "P2SH,WITNESS", - "WITNESS_PROGRAM_WITNESS_EMPTY", - "P2WSH with empty witness" -], -[ - [ - "3044022060011fdebc01a685426a5013f20b7c82682e1f891532a3053a0d8ec020f96dc7022024ce6f81fcfcfe3ebd0b73b395b4517dff6be7b61ceb2c187710fd01cb99176f01", - "400479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac", - 0.00000000 - ], - "", - "0 0x20 0xb95237b48faaa69eb078e1170be3b5cbb3fddf16d0a991e14ad274f7b33a4f64", - "P2SH,WITNESS", - "WITNESS_PROGRAM_MISMATCH", - "P2WSH with witness program mismatch" -], -[ - [ - "304402205b42381c8ce93c1e271ff9b545a8d492383892bc5aa9f2e31721f9a47f323f3c022028b1e4fec4070ebb0c08783ef5779ec1fd3cccdb25cea2dd0a38a8786cc816e101", - "0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8", - "", - 0.00000000 - ], - "", - "0 0x14 0x91b24bf9f5288532960ac687abb035127b1d28a5", - "P2SH,WITNESS", - "WITNESS_PROGRAM_MISMATCH", - "P2WPKH with witness program mismatch" -], -[ - [ - "304402205b42381c8ce93c1e271ff9b545a8d492383892bc5aa9f2e31721f9a47f323f3c022028b1e4fec4070ebb0c08783ef5779ec1fd3cccdb25cea2dd0a38a8786cc816e101", - "0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8", - 0.00000000 - ], - "11", - "0 0x14 0x91b24bf9f5288532960ac687abb035127b1d28a5", - "P2SH,WITNESS", - "WITNESS_MALLEATED", - "P2WPKH with non-empty scriptSig" -], -[ - [ - "304402205afa9c6cfe060e637533e86fe93218328764dba3a68b613104a04613c08a592402204d30c8707ccd6ce38d72c9d4e900a413e58ffa5225e8855cefececbb86b822fb01", - "048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf", - 0.00000000 - ], - "11 0x16 0x00147cf9c846cd4882efec4bf07e44ebdad495c94f4b", - "HASH160 0x14 0x4e0c2aed91315303fc6a1dc4c7bc21c88f75402e EQUAL", - "P2SH,WITNESS", - "WITNESS_MALLEATED_P2SH", - "P2SH(P2WPKH) with superfluous push in scriptSig" -], -[ - [ - "", - 0.00000000 - ], - "0x47 0x304402202f763ef88e392432743b924ae8e4b1c2d0d50c82f6daa3951f5381bda59e607b022064bdd1f2a1264d3eb7d81d6b640d99c7a895f6a4ab210396c026b63e98f642d501", - "0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG", - "P2SH,WITNESS", - "WITNESS_UNEXPECTED", - "P2PK with witness" -], -[ - [ - "304402207c190909d6e5d0e8e577443ea4ea42faa21759e78fdcf2a54eec8fccbf1204f50220695771734ff79d77ba5370cd780ba9d53367ca0d4016301fa7926bfda936545901", - "210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ac", - 0.00000001 - ], - "", - "0 0x20 0x1863143c14c5166804bd19203356da136c985678cd4d27a1b8c6329604903262", - "P2SH,WITNESS,WITNESS_PUBKEYTYPE", - "OK", - "Basic P2WSH with compressed key" -], -[ - [ - "304402207a1af4309e75e7b4639b75c2421bd4e2a25efc98d35756c4cb3c11c1aa78e18c022001454df5608eee3ac424b3de122f2d71a8fc01fbdba60161b13ec3a1d1c1a19a01", - "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", - 0.00000001 - ], - "", - "0 0x14 0x751e76e8199196d454941c45d1b3a323f1433bd6", - "P2SH,WITNESS,WITNESS_PUBKEYTYPE", - "OK", - "Basic P2WPKH with compressed key" -], -[ - [ - "30440220282f5a767a5173e3b612f988dad5767e584025f106c7973b2b0e976dc9dcf46202202cd6d87df00bc30041cb64ff3ee8cb083e9363268d6d0c626439443cc7bec2f901", - "210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ac", - 0.00000001 - ], - "0x22 0x00201863143c14c5166804bd19203356da136c985678cd4d27a1b8c6329604903262", - "HASH160 0x14 0xe4300531190587e3880d4c3004f5355d88ff928d EQUAL", - "P2SH,WITNESS,WITNESS_PUBKEYTYPE", - "OK", - "Basic P2SH(P2WSH) with compressed key" -], -[ - [ - "304402203e35b5cf57fce0dc264f83d49323269674e1f955a1f8a9355599406350ad1cc202201e5cd13125e2e0fa9c3f86167c4f48753126270de709ab661097f84fd1e816a601", - "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", - 0.00000001 - ], - "0x16 0x0014751e76e8199196d454941c45d1b3a323f1433bd6", - "HASH160 0x14 0xbcfeb728b584253d5f3f70bcb780e9ef218a68f4 EQUAL", - "P2SH,WITNESS,WITNESS_PUBKEYTYPE", - "OK", - "Basic P2SH(P2WPKH) with compressed key" -], -[ - [ - "3044022016352dc8c84b9b890fb6fd1ae9114aa3d8a845e69daf69f6071ec17479a0aa1e0220045ce064147e898b5f0b2bea963079906d5adb6231b44f134949d180e7f87cd801", - "410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac", - 0.00000001 - ], - "", - "0 0x20 0xb95237b48faaa69eb078e1170be3b5cbb3fddf16d0a991e14ad274f7b33a4f64", - "P2SH,WITNESS,WITNESS_PUBKEYTYPE", - "WITNESS_PUBKEYTYPE", - "Basic P2WSH" -], -[ - [ - "3044022037eb6edecc0cb2c2e2e6f234ba0dfbdac659d0035ea281478f46645f93cb2a710220162a33f108462c4216d346801f10b81ccf88498fe7d5af13a5c07fbb659398d201", - "0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8", - 0.00000001 - ], - "", - "0 0x14 0x91b24bf9f5288532960ac687abb035127b1d28a5", - "P2SH,WITNESS,WITNESS_PUBKEYTYPE", - "WITNESS_PUBKEYTYPE", - "Basic P2WPKH" -], -[ - [ - "3044022048300b4f6df240fd6d99b3f4a05de1853f1ae119cc0a592ad42436b146a2554a022005bfcfafd70126204f27ad3b889f82c21c6182f9e51ff0609541eecc52e96f9701", - "410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac", - 0.00000001 - ], - "0x22 0x0020b95237b48faaa69eb078e1170be3b5cbb3fddf16d0a991e14ad274f7b33a4f64", - "HASH160 0x14 0xf386c2ba255cc56d20cfa6ea8b062f8b59945518 EQUAL", - "P2SH,WITNESS,WITNESS_PUBKEYTYPE", - "WITNESS_PUBKEYTYPE", - "Basic P2SH(P2WSH)" -], -[ - [ - "3044022031232887440f3e8b8b737cd2d2752dd90dcd8a7dd367cbfdc83368e2849e2cea022061a3f1b809ea4b31af0543b36645ddd9247f357abcc20da9e502f82ea7a5abfa01", - "0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8", - 0.00000001 - ], - "0x16 0x001491b24bf9f5288532960ac687abb035127b1d28a5", - "HASH160 0x14 0x17743beb429c55c942d2ec703b98c4d57c2df5c6 EQUAL", - "P2SH,WITNESS,WITNESS_PUBKEYTYPE", - "WITNESS_PUBKEYTYPE", - "Basic P2SH(P2WPKH)" -], -[ - [ - "", - "30440220362ac7e95571015b7dafeccc6c1365a166f17c4eeedeac1cb13e447dc430491202202133556011ae59bf4972da83559b0ff860ecc3260fc39dbe6fbc7c4ed384471201", - "5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae", - 0.00000001 - ], - "", - "0 0x20 0x06c24420938f0fa3c1cb2707d867154220dca365cdbfa0dd2a83854730221460", - "P2SH,WITNESS,WITNESS_PUBKEYTYPE", - "OK", - "P2WSH CHECKMULTISIG with compressed keys" -], -[ - [ - "", - "304402201336601eddba440c6a887aada531b306a9697b0caee950beeae2f2403c5f67ed02204a5a997c95baa369f504885b30cd011da29a580564915d603118ceba8dd144b901", - "5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae", - 0.00000001 - ], - "0x22 0x002006c24420938f0fa3c1cb2707d867154220dca365cdbfa0dd2a83854730221460", - "HASH160 0x14 0x26282aad7c29369d15fed062a778b6100d31a340 EQUAL", - "P2SH,WITNESS,WITNESS_PUBKEYTYPE", - "OK", - "P2SH(P2WSH) CHECKMULTISIG with compressed keys" -], -[ - [ - "", - "304402207ab7d09e1e999569dcef95f5dea8f9351e94a9ebedb79f44e07b19ad1d94bc0b022016b379168db9ecd1d4f772f6b041053102da11543005c894a0ec5e63c550759e01", - "5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae", - 0.00000001 - ], - "", - "0 0x20 0x06c24420938f0fa3c1cb2707d867154220dca365cdbfa0dd2a83854730221460", - "P2SH,WITNESS,WITNESS_PUBKEYTYPE", - "OK", - "P2WSH CHECKMULTISIG with compressed keys" -], -[ - [ - "", - "304402205a9b79fdc350fda415133e29a6f2014977968356f340163a07d3f1943e557144022054e5aab5db5efb99831168323729053b5d9b48c3fe91231fb910c5e5b5c91e7b01", - "5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae", - 0.00000001 - ], - "0x22 0x002006c24420938f0fa3c1cb2707d867154220dca365cdbfa0dd2a83854730221460", - "HASH160 0x14 0x26282aad7c29369d15fed062a778b6100d31a340 EQUAL", - "P2SH,WITNESS,WITNESS_PUBKEYTYPE", - "OK", - "P2SH(P2WSH) CHECKMULTISIG with compressed keys" -], -[ - [ - "", - "304402201bdb094968744526ec1c520bdd55bf60bba7d777b7e489505d7ccf7124249519022057abae6935a7b29927799c4444e6cbb3dc0c595697e686fb8c6d9572710e769901", - "5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b852ae", - 0.00000001 - ], - "", - "0 0x20 0x08a6665ebfd43b02323423e764e185d98d1587f903b81507dbb69bfc41005efa", - "P2SH,WITNESS", - "OK", - "P2WSH CHECKMULTISIG with first key uncompressed and signing with the first key" -], -[ - [ - "", - "304402203d7927f23280a3e073319cd7e185c52ed90eb0042ad522580f03886a9a4f164f0220028f740448c2c994cd419e569afd8250a89f71339aab2c35a5a4e830de2a159901", - "5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b852ae", - 0.00000001 - ], - "0x22 0x002008a6665ebfd43b02323423e764e185d98d1587f903b81507dbb69bfc41005efa", - "HASH160 0x14 0x6f5ecd4b83b77f3c438f5214eff96454934fc5d1 EQUAL", - "P2SH,WITNESS", - "OK", - "P2SH(P2WSH) CHECKMULTISIG first key uncompressed and signing with the first key" -], -[ - [ - "", - "304402201bdb094968744526ec1c520bdd55bf60bba7d777b7e489505d7ccf7124249519022057abae6935a7b29927799c4444e6cbb3dc0c595697e686fb8c6d9572710e769901", - "5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b852ae", - 0.00000001 - ], - "", - "0 0x20 0x08a6665ebfd43b02323423e764e185d98d1587f903b81507dbb69bfc41005efa", - "P2SH,WITNESS,WITNESS_PUBKEYTYPE", - "WITNESS_PUBKEYTYPE", - "P2WSH CHECKMULTISIG with first key uncompressed and signing with the first key" -], -[ - [ - "", - "304402203d7927f23280a3e073319cd7e185c52ed90eb0042ad522580f03886a9a4f164f0220028f740448c2c994cd419e569afd8250a89f71339aab2c35a5a4e830de2a159901", - "5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b852ae", - 0.00000001 - ], - "0x22 0x002008a6665ebfd43b02323423e764e185d98d1587f903b81507dbb69bfc41005efa", - "HASH160 0x14 0x6f5ecd4b83b77f3c438f5214eff96454934fc5d1 EQUAL", - "P2SH,WITNESS,WITNESS_PUBKEYTYPE", - "WITNESS_PUBKEYTYPE", - "P2SH(P2WSH) CHECKMULTISIG with first key uncompressed and signing with the first key" -], -[ - [ - "", - "304402200cbdc65fb1e630b69805d8c81c3cfdbf815640413caf8f8a702a09ac260fa5a7022059c2ba0c3c0834b79ad28b1b48a6c3249cda4f44d2a27623ff22855a9533d30b01", - "5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b852ae", - 0.00000001 - ], - "", - "0 0x20 0x08a6665ebfd43b02323423e764e185d98d1587f903b81507dbb69bfc41005efa", - "P2SH,WITNESS", - "OK", - "P2WSH CHECKMULTISIG with first key uncompressed and signing with the second key" -], -[ - [ - "", - "30440220603b2b7c5a431eb438bece11e58e7e8ff3ac68be9ffef44f8b491913e8ccd06c022058dfe13abfcee8606d6725ccd1c2267b6c937fcab4342017535e4408a607785c01", - "5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b852ae", - 0.00000001 - ], - "0x22 0x002008a6665ebfd43b02323423e764e185d98d1587f903b81507dbb69bfc41005efa", - "HASH160 0x14 0x6f5ecd4b83b77f3c438f5214eff96454934fc5d1 EQUAL", - "P2SH,WITNESS", - "OK", - "P2SH(P2WSH) CHECKMULTISIG with first key uncompressed and signing with the second key" -], -[ - [ - "", - "304402200cbdc65fb1e630b69805d8c81c3cfdbf815640413caf8f8a702a09ac260fa5a7022059c2ba0c3c0834b79ad28b1b48a6c3249cda4f44d2a27623ff22855a9533d30b01", - "5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b852ae", - 0.00000001 - ], - "", - "0 0x20 0x08a6665ebfd43b02323423e764e185d98d1587f903b81507dbb69bfc41005efa", - "P2SH,WITNESS,WITNESS_PUBKEYTYPE", - "WITNESS_PUBKEYTYPE", - "P2WSH CHECKMULTISIG with first key uncompressed and signing with the second key" -], -[ - [ - "", - "30440220603b2b7c5a431eb438bece11e58e7e8ff3ac68be9ffef44f8b491913e8ccd06c022058dfe13abfcee8606d6725ccd1c2267b6c937fcab4342017535e4408a607785c01", - "5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b852ae", - 0.00000001 - ], - "0x22 0x002008a6665ebfd43b02323423e764e185d98d1587f903b81507dbb69bfc41005efa", - "HASH160 0x14 0x6f5ecd4b83b77f3c438f5214eff96454934fc5d1 EQUAL", - "P2SH,WITNESS,WITNESS_PUBKEYTYPE", - "WITNESS_PUBKEYTYPE", - "P2SH(P2WSH) CHECKMULTISIG with first key uncompressed and signing with the second key" -], -[ - [ - "", - "30440220140fe1d19f61d597812ac6367db8dbed6def1708d1f97671ed256370e3741a2002207c4adc2a4cd36601e6c3a0f5d7bb4c5f99db81bbb17b5554f040e6d0e49319d601", - "5141048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae", - 0.00000001 - ], - "", - "0 0x20 0x230828ed48871f0f362ce9432aa52f620f442cc8d9ce7a8b5e798365595a38bb", - "P2SH,WITNESS", - "OK", - "P2WSH CHECKMULTISIG with second key uncompressed and signing with the first key" -], -[ - [ - "", - "3044022079d9040b4debff97d50c66a3d2c16b27d109508baab5f63a4137b5b091d57cb0022035e7ae4cb59ee5b0bb6a1699e074c0738301203f482ccff2ba79f0bafc0b586f01", - "5141048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae", - 0.00000001 - ], - "0x22 0x0020230828ed48871f0f362ce9432aa52f620f442cc8d9ce7a8b5e798365595a38bb", - "HASH160 0x14 0x3478e7019ce61a68148f87549579b704cbe4c393 EQUAL", - "P2SH,WITNESS", - "OK", - "P2SH(P2WSH) CHECKMULTISIG second key uncompressed and signing with the first key" -], -[ - [ - "", - "30440220140fe1d19f61d597812ac6367db8dbed6def1708d1f97671ed256370e3741a2002207c4adc2a4cd36601e6c3a0f5d7bb4c5f99db81bbb17b5554f040e6d0e49319d601", - "5141048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae", - 0.00000001 - ], - "", - "0 0x20 0x230828ed48871f0f362ce9432aa52f620f442cc8d9ce7a8b5e798365595a38bb", - "P2SH,WITNESS,WITNESS_PUBKEYTYPE", - "OK", - "P2WSH CHECKMULTISIG with second key uncompressed and signing with the first key should pass as the uncompressed key is not used" -], -[ - [ - "", - "3044022079d9040b4debff97d50c66a3d2c16b27d109508baab5f63a4137b5b091d57cb0022035e7ae4cb59ee5b0bb6a1699e074c0738301203f482ccff2ba79f0bafc0b586f01", - "5141048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae", - 0.00000001 - ], - "0x22 0x0020230828ed48871f0f362ce9432aa52f620f442cc8d9ce7a8b5e798365595a38bb", - "HASH160 0x14 0x3478e7019ce61a68148f87549579b704cbe4c393 EQUAL", - "P2SH,WITNESS,WITNESS_PUBKEYTYPE", - "OK", - "P2SH(P2WSH) CHECKMULTISIG with second key uncompressed and signing with the first key should pass as the uncompressed key is not used" -], -[ - [ - "", - "30440220339730b62971f96a76020e5e3204940a5f1f4195c696b0dd9e5e7e231ecf3107022071f01fca2641f13d6a9e3c16220b89dcb0f27803981637aa039ad0af7e3da07701", - "5141048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae", - 0.00000001 - ], - "", - "0 0x20 0x230828ed48871f0f362ce9432aa52f620f442cc8d9ce7a8b5e798365595a38bb", - "P2SH,WITNESS", - "OK", - "P2WSH CHECKMULTISIG with second key uncompressed and signing with the second key" -], -[ - [ - "", - "304402204d12cdd54acab2575f7887111867a5f8b2c048b71f530a6b8169df54538373cc022079ce82062677aba2232456034fad18519cac583dc6eef6097e71ff8c9d69b6bc01", - "5141048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae", - 0.00000001 - ], - "0x22 0x0020230828ed48871f0f362ce9432aa52f620f442cc8d9ce7a8b5e798365595a38bb", - "HASH160 0x14 0x3478e7019ce61a68148f87549579b704cbe4c393 EQUAL", - "P2SH,WITNESS", - "OK", - "P2SH(P2WSH) CHECKMULTISIG with second key uncompressed and signing with the second key" -], -[ - [ - "", - "30440220339730b62971f96a76020e5e3204940a5f1f4195c696b0dd9e5e7e231ecf3107022071f01fca2641f13d6a9e3c16220b89dcb0f27803981637aa039ad0af7e3da07701", - "5141048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae", - 0.00000001 - ], - "", - "0 0x20 0x230828ed48871f0f362ce9432aa52f620f442cc8d9ce7a8b5e798365595a38bb", - "P2SH,WITNESS,WITNESS_PUBKEYTYPE", - "WITNESS_PUBKEYTYPE", - "P2WSH CHECKMULTISIG with second key uncompressed and signing with the second key" -], -[ - [ - "", - "304402204d12cdd54acab2575f7887111867a5f8b2c048b71f530a6b8169df54538373cc022079ce82062677aba2232456034fad18519cac583dc6eef6097e71ff8c9d69b6bc01", - "5141048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae", - 0.00000001 - ], - "0x22 0x0020230828ed48871f0f362ce9432aa52f620f442cc8d9ce7a8b5e798365595a38bb", - "HASH160 0x14 0x3478e7019ce61a68148f87549579b704cbe4c393 EQUAL", - "P2SH,WITNESS,WITNESS_PUBKEYTYPE", - "WITNESS_PUBKEYTYPE", - "P2SH(P2WSH) CHECKMULTISIG with second key uncompressed and signing with the second key" -], diff --git a/build_msvc/test_BGL/test_BGL.vcxproj b/build_msvc/test_BGL/test_BGL.vcxproj deleted file mode 100644 index 8d6c9f3e5d..0000000000 --- a/build_msvc/test_BGL/test_BGL.vcxproj +++ /dev/null @@ -1,77 +0,0 @@ - - - - - {A56B73DB-D46D-4882-8374-1FE3FFA08F07} - - - Application - $(SolutionDir)$(Platform)\$(Configuration)\ - - - - - - - - - - - - - - {542007e3-be0d-4b0d-a6b0-aa8813e2558d} - - - {2b384fa8-9ee1-4544-93cb-0d733c25e8ce} - - - {0667528c-d734-4009-adf9-c0d6c4a5a5a6} - - - {7c87e378-df58-482e-aa2f-1bc129bc19ce} - - - {6190199c-6cf4-4dad-bfbd-93fa72a760c1} - - - {460fee33-1fe1-483f-b3bf-931ff8e969a5} - - - {b53a5535-ee9d-4c6f-9a26-f79ee3bc3754} - - - {93b86837-b543-48a5-a89b-7c87abb77df2} - - - {792d487f-f14c-49fc-a9de-3fc150f31c3f} - - - {1e065f03-3566-47d0-8fa9-daa72b084e7d} - - - {5724ba7d-a09a-4ba8-800b-c4c1561b3d69} - - - {bb493552-3b8c-4a8c-bf69-a6e7a51d2ea6} - - - {18430fef-6b61-4c53-b396-718e02850f1b} - - - - - There was an error executing the JSON test header generation task. - - - - - - - - - - - - - diff --git a/build_msvc/vcpkg.json b/build_msvc/vcpkg.json deleted file mode 100644 index 1edc322b9c..0000000000 --- a/build_msvc/vcpkg.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "bgl-core", - "version-string": "1", - "dependencies": [ - "berkeleydb", - "boost-date-time", - "boost-multi-index", - "boost-signals2", - "boost-test", - "libevent", - "sqlite3", - "zeromq" - ], - "builtin-baseline": "9edb1b8e590cc086563301d735cae4b6e732d2d2", - "overrides": [ - { - "name": "libevent", - "version": "2.1.12#7" - } - ] -} diff --git a/ci/README.md b/ci/README.md deleted file mode 100644 index b4edd4b191..0000000000 --- a/ci/README.md +++ /dev/null @@ -1,56 +0,0 @@ -## CI Scripts - -This directory contains scripts for each build step in each build stage. - -### Running a Stage Locally - -Be aware that the tests will be built and run in-place, so please run at your own risk. -If the repository is not a fresh git clone, you might have to clean files from previous builds or test runs first. - -The ci needs to perform various sysadmin tasks such as installing packages or writing to the user's home directory. -While it should be fine to run -the ci system locally on you development box, the ci scripts can generally be assumed to have received less review and -testing compared to other parts of the codebase. If you want to keep the work tree clean, you might want to run the ci -system in a virtual machine with a Linux operating system of your choice. - -To allow for a wide range of tested environments, but also ensure reproducibility to some extent, the test stage -requires `bash`, `docker`, and `python3` to be installed. To run on different architectures than the host `qemu` is also required. To install all requirements on Ubuntu, run - -``` -sudo apt install bash docker.io python3 qemu-user-static -``` - -It is recommended to run the ci system in a clean env. To run the test stage -with a specific configuration, - -``` -env -i HOME="$HOME" PATH="$PATH" USER="$USER" bash -c 'FILE_ENV="./ci/test/00_setup_env_arm.sh" ./ci/test_run_all.sh' -``` - -### Configurations - -The test files (`FILE_ENV`) are constructed to test a wide range of -configurations, rather than a single pass/fail. This helps to catch build -failures and logic errors that present on platforms other than the ones the -author has tested. - -Some builders use the dependency-generator in `./depends`, rather than using -the system package manager to install build dependencies. This guarantees that -the tester is using the same versions as the release builds, which also use -`./depends`. - -It is also possible to force a specific configuration without modifying the -file. For example, - -``` -env -i HOME="$HOME" PATH="$PATH" USER="$USER" bash -c 'MAKEJOBS="-j1" FILE_ENV="./ci/test/00_setup_env_arm.sh" ./ci/test_run_all.sh' -``` - -The files starting with `0n` (`n` greater than 0) are the scripts that are run -in order. - -### Cache - -In order to avoid rebuilding all dependencies for each build, the binaries are -cached and reused when possible. Changes in the dependency-generator will -trigger cache-invalidation and rebuilds as necessary. diff --git a/ci/ci.sh b/ci/ci.sh deleted file mode 100755 index c7d2e9e4ea..0000000000 --- a/ci/ci.sh +++ /dev/null @@ -1,147 +0,0 @@ -#!/bin/sh - -set -eux - -export LC_ALL=C - -# Print commit and relevant CI environment to allow reproducing the job outside of CI. -git show --no-patch -print_environment() { - # Turn off -x because it messes up the output - set +x - # There are many ways to print variable names and their content. This one - # does not rely on bash. - for var in WERROR_CFLAGS MAKEFLAGS BUILD \ - ECMULTWINDOW ECMULTGENKB ASM WIDEMUL WITH_VALGRIND EXTRAFLAGS \ - EXPERIMENTAL ECDH RECOVERY SCHNORRSIG ELLSWIFT \ - SECP256K1_TEST_ITERS BENCH SECP256K1_BENCH_ITERS CTIMETESTS\ - EXAMPLES \ - HOST WRAPPER_CMD \ - CC CFLAGS CPPFLAGS AR NM \ - UBSAN_OPTIONS ASAN_OPTIONS LSAN_OPTIONS - do - eval "isset=\${$var+x}" - if [ -n "$isset" ]; then - eval "val=\${$var}" - # shellcheck disable=SC2154 - printf '%s="%s" ' "$var" "$val" - fi - done - echo "$0" - set -x -} -print_environment - -env >> test_env.log - -# If gcc is requested, assert that it's in fact gcc (and not some symlinked Apple clang). -case "${CC:-undefined}" in - *gcc*) - $CC -v 2>&1 | grep -q "gcc version" || exit 1; - ;; -esac - -if [ -n "${CC+x}" ]; then - # The MSVC compiler "cl" doesn't understand "-v" - $CC -v || true -fi -if [ "$WITH_VALGRIND" = "yes" ]; then - valgrind --version -fi -if [ -n "$WRAPPER_CMD" ]; then - $WRAPPER_CMD --version -fi - -# Workaround for https://bugs.kde.org/show_bug.cgi?id=452758 (fixed in valgrind 3.20.0). -case "${CC:-undefined}" in - clang*) - if [ "$CTIMETESTS" = "yes" ] && [ "$WITH_VALGRIND" = "yes" ] - then - export CFLAGS="${CFLAGS:+$CFLAGS }-gdwarf-4" - else - case "$WRAPPER_CMD" in - valgrind*) - export CFLAGS="${CFLAGS:+$CFLAGS }-gdwarf-4" - ;; - esac - fi - ;; -esac - -./autogen.sh - -./configure \ - --enable-experimental="$EXPERIMENTAL" \ - --with-test-override-wide-multiply="$WIDEMUL" --with-asm="$ASM" \ - --with-ecmult-window="$ECMULTWINDOW" \ - --with-ecmult-gen-kb="$ECMULTGENKB" \ - --enable-module-ecdh="$ECDH" --enable-module-recovery="$RECOVERY" \ - --enable-module-ellswift="$ELLSWIFT" \ - --enable-module-schnorrsig="$SCHNORRSIG" \ - --enable-examples="$EXAMPLES" \ - --enable-ctime-tests="$CTIMETESTS" \ - --with-valgrind="$WITH_VALGRIND" \ - --host="$HOST" $EXTRAFLAGS - -# We have set "-j" in MAKEFLAGS. -build_exit_code=0 -make > make.log 2>&1 || build_exit_code=$? -cat make.log -if [ $build_exit_code -ne 0 ]; then - case "${CC:-undefined}" in - *snapshot*) - # Ignore internal compiler errors in gcc-snapshot and clang-snapshot - grep -e "internal compiler error:" -e "PLEASE submit a bug report" make.log - return $?; - ;; - *) - return 1; - ;; - esac -fi - -# Print information about binaries so that we can see that the architecture is correct -file *tests* || true -file bench* || true -file .libs/* || true - -# This tells `make check` to wrap test invocations. -export LOG_COMPILER="$WRAPPER_CMD" - -make "$BUILD" - -# Using the local `libtool` because on macOS the system's libtool has nothing to do with GNU libtool -EXEC='./libtool --mode=execute' -if [ -n "$WRAPPER_CMD" ] -then - EXEC="$EXEC $WRAPPER_CMD" -fi - -if [ "$BENCH" = "yes" ] -then - { - $EXEC ./bench_ecmult - $EXEC ./bench_internal - $EXEC ./bench - } >> bench.log 2>&1 -fi - -if [ "$CTIMETESTS" = "yes" ] -then - if [ "$WITH_VALGRIND" = "yes" ]; then - ./libtool --mode=execute valgrind --error-exitcode=42 ./ctime_tests > ctime_tests.log 2>&1 - else - $EXEC ./ctime_tests > ctime_tests.log 2>&1 - fi -fi - -# Rebuild precomputed files (if not cross-compiling). -if [ -z "$HOST" ] -then - make clean-precomp clean-testvectors - make precomp testvectors -fi - -# Check that no repo files have been modified by the build. -# (This fails for example if the precomp files need to be updated in the repo.) -git diff --exit-code diff --git a/ci/debian_deploy.sh b/ci/debian_deploy.sh deleted file mode 100755 index dbb578cf47..0000000000 --- a/ci/debian_deploy.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env bash - -export LC_ALL=C.UTF-8 - -set -o errexit; source ./ci/test/00_setup_env.sh - -echo "INSTALL" - -apt-get update - -apt-get install --no-install-recommends --no-upgrade -y build-essential devscripts debhelper g++-8 libssl-dev wget pkg-config libevent-dev fakeroot - -echo "INSTALL DONE" - -export ARTIFACT_NAME="bitgesell_amd64.deb" -export RELEASE_ARTIFACT_NAME="bitgesell_${CIRRUS_TAG}_amd64.deb" - -mv ./debian.minimal ./debian -chmod +x ./debian/build-in-docker.sh -set -o errexit; source ./debian/build-in-docker.sh -set -o errexit; source ./ci/test/07_script.sh diff --git a/ci/debian_qt_deploy.sh b/ci/debian_qt_deploy.sh deleted file mode 100755 index 7be9b377e8..0000000000 --- a/ci/debian_qt_deploy.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env bash - -export LC_ALL=C.UTF-8 - -set -o errexit; source ./ci/test/00_setup_env.sh - -echo "INSTALL" - -apt-get update - -apt-get install --no-install-recommends --no-upgrade -y build-essential devscripts debhelper g++-8 libssl-dev wget pkg-config libevent-dev fakeroot - -echo "INSTALL DONE" - -export ARTIFACT_NAME="bitgesell-qt-amd64.deb" -export RELEASE_ARTIFACT_NAME="bitgesell-qt_${CIRRUS_TAG}_amd64.deb" - -mv ./debian.qt ./debian -chmod +x ./debian/build-in-docker.sh -set -o errexit; source ./debian/build-in-docker.sh -set -o errexit; source ./ci/test/07_script.sh diff --git a/ci/lint/04_install.sh b/ci/lint/04_install.sh deleted file mode 100755 index 87e3a8fa9b..0000000000 --- a/ci/lint/04_install.sh +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright (c) 2018-2022 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -export LC_ALL=C - -export PATH=$PWD/ci/retry:$PATH - -${CI_RETRY_EXE} apt-get update -# Lint dependencies: -# - automake pkg-config libtool (for lint_includes_build_config) -# - curl/xz-utils (to install shellcheck) -# - git (used in many lint scripts) -# - gpg (used by verify-commits) -${CI_RETRY_EXE} apt-get install -y automake pkg-config libtool curl xz-utils git gpg - -PYTHON_PATH="/python_build" -if [ ! -d "${PYTHON_PATH}/bin" ]; then - ( - ${CI_RETRY_EXE} git clone https://github.com/pyenv/pyenv.git - cd pyenv/plugins/python-build || exit 1 - ./install.sh - ) - # For dependencies see https://github.com/pyenv/pyenv/wiki#suggested-build-environment - ${CI_RETRY_EXE} apt-get install -y build-essential libssl-dev zlib1g-dev \ - libbz2-dev libreadline-dev libsqlite3-dev curl llvm \ - libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev \ - clang - env CC=clang python-build "$(cat "./.python-version")" "${PYTHON_PATH}" -fi -export PATH="${PYTHON_PATH}/bin:${PATH}" -command -v python3 -python3 --version - -export LINT_RUNNER_PATH="/lint_test_runner" -if [ ! -d "${LINT_RUNNER_PATH}" ]; then - ${CI_RETRY_EXE} apt-get install -y cargo - ( - cd ./test/lint/test_runner || exit 1 - cargo build - mkdir -p "${LINT_RUNNER_PATH}" - mv target/debug/test_runner "${LINT_RUNNER_PATH}" - ) -fi - -${CI_RETRY_EXE} pip3 install \ - codespell==2.2.6 \ - flake8==6.1.0 \ - lief==0.13.2 \ - mypy==1.4.1 \ - pyzmq==25.1.0 \ - vulture==2.6 - -SHELLCHECK_VERSION=v0.8.0 -curl -sL "https://github.com/koalaman/shellcheck/releases/download/${SHELLCHECK_VERSION}/shellcheck-${SHELLCHECK_VERSION}.linux.x86_64.tar.xz" | \ - tar --xz -xf - --directory /tmp/ -mv "/tmp/shellcheck-${SHELLCHECK_VERSION}/shellcheck" /usr/bin/ - -MLC_VERSION=v0.16.3 -MLC_BIN=mlc-x86_64-linux -curl -sL "https://github.com/becheran/mlc/releases/download/${MLC_VERSION}/${MLC_BIN}" -o "/usr/bin/mlc" -chmod +x /usr/bin/mlc diff --git a/ci/lint/05_before_script.sh b/ci/lint/05_before_script.sh deleted file mode 100755 index 2987812c8e..0000000000 --- a/ci/lint/05_before_script.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright (c) 2018-2019 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -export LC_ALL=C - -git fetch --unshallow diff --git a/ci/lint/06_script.sh b/ci/lint/06_script.sh deleted file mode 100755 index 81650aca68..0000000000 --- a/ci/lint/06_script.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright (c) 2018-2022 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -export LC_ALL=C - -set -ex - -if [ -n "$LOCAL_BRANCH" ]; then - # To faithfully recreate CI linting locally, specify all commits on the current - # branch. - COMMIT_RANGE="$(git merge-base HEAD master)..HEAD" -elif [ -n "$CIRRUS_PR" ]; then - COMMIT_RANGE="HEAD~..HEAD" - echo - git log --no-merges --oneline "$COMMIT_RANGE" - echo - test/lint/commit-script-check.sh "$COMMIT_RANGE" -else - COMMIT_RANGE="SKIP_EMPTY_NOT_A_PR" -fi - -RUST_BACKTRACE=1 "${LINT_RUNNER_PATH}/test_runner" - -if [ "$CIRRUS_REPO_FULL_NAME" = "BGL/BGL" ] && [ "$CIRRUS_PR" = "" ] ; then - # Sanity check only the last few commits to get notified of missing sigs, - # missing keys, or expired keys. Usually there is only one new merge commit - # per push on the master branch and a few commits on release branches, so - # sanity checking only a few (10) commits seems sufficient and cheap. - git log HEAD~10 -1 --format='%H' > ./contrib/verify-commits/trusted-sha512-root-commit - git log HEAD~10 -1 --format='%H' > ./contrib/verify-commits/trusted-git-root - mapfile -t KEYS < contrib/verify-commits/trusted-keys - git config user.email "ci@ci.ci" - git config user.name "ci" - ${CI_RETRY_EXE} gpg --keyserver hkps://keys.openpgp.org --recv-keys "${KEYS[@]}" && - ./contrib/verify-commits/verify-commits.py; -fi diff --git a/ci/lint/container-entrypoint.sh b/ci/lint/container-entrypoint.sh deleted file mode 100755 index a403f923a2..0000000000 --- a/ci/lint/container-entrypoint.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright (c) The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or https://opensource.org/license/mit/. - -export LC_ALL=C - -# Fixes permission issues when there is a container UID/GID mismatch with the owner -# of the mounted bitcoin src dir. -git config --global --add safe.directory /bitcoin - -export PATH="/python_build/bin:${PATH}" -export LINT_RUNNER_PATH="/lint_test_runner" - -if [ -z "$1" ]; then - LOCAL_BRANCH=1 bash -ic "./ci/lint/06_script.sh" -else - exec "$@" -fi diff --git a/ci/lint_imagefile b/ci/lint_imagefile deleted file mode 100644 index d32b35b19d..0000000000 --- a/ci/lint_imagefile +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright (c) The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or https://opensource.org/license/mit/. - -# See test/lint/README.md for usage. - -FROM debian:bookworm - -ENV DEBIAN_FRONTEND=noninteractive -ENV LC_ALL=C.UTF-8 - -COPY ./.python-version /.python-version -COPY ./ci/lint/container-entrypoint.sh /entrypoint.sh -COPY ./ci/lint/04_install.sh /install.sh -COPY ./test/lint/test_runner /test/lint/test_runner - -RUN /install.sh && \ - echo 'alias lint="./ci/lint/06_script.sh"' >> ~/.bashrc && \ - chmod 755 /entrypoint.sh && \ - rm -rf /var/lib/apt/lists/* - - -WORKDIR /bitcoin -ENTRYPOINT ["/entrypoint.sh"] diff --git a/ci/lint_run_all.sh b/ci/lint_run_all.sh deleted file mode 100755 index b56ee0d303..0000000000 --- a/ci/lint_run_all.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright (c) 2019-2020 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -export LC_ALL=C.UTF-8 - -set -o errexit; source ./ci/test/00_setup_env.sh -set -o errexit; source ./ci/lint/04_install.sh -set -o errexit -./ci/lint/06_script.sh diff --git a/ci/linux-debian.Dockerfile b/ci/linux-debian.Dockerfile deleted file mode 100644 index f12545be0d..0000000000 --- a/ci/linux-debian.Dockerfile +++ /dev/null @@ -1,31 +0,0 @@ -FROM debian:stable-slim - -SHELL ["/bin/bash", "-c"] - -WORKDIR /root - -# A too high maximum number of file descriptors (with the default value -# inherited from the docker host) can cause issues with some of our tools: -# - sanitizers hanging: https://github.com/google/sanitizers/issues/1662 -# - valgrind crashing: https://stackoverflow.com/a/75293014 -# This is not be a problem on our CI hosts, but developers who run the image -# on their machines may run into this (e.g., on Arch Linux), so warn them. -# (Note that .bashrc is only executed in interactive bash shells.) -RUN echo 'if [[ $(ulimit -n) -gt 200000 ]]; then echo "WARNING: Very high value reported by \"ulimit -n\". Consider passing \"--ulimit nofile=32768\" to \"docker run\"."; fi' >> /root/.bashrc - -RUN dpkg --add-architecture i386 && \ - dpkg --add-architecture s390x && \ - dpkg --add-architecture armhf && \ - dpkg --add-architecture arm64 && \ - dpkg --add-architecture ppc64el - -# dkpg-dev: to make pkg-config work in cross-builds -# llvm: for llvm-symbolizer, which is used by clang's UBSan for symbolized stack traces -RUN apt-get update && apt-get install --no-install-recommends -y \ - git ca-certificates \ - make automake libtool pkg-config dpkg-dev valgrind qemu-user \ - gcc g++ clang libclang-rt-dev libc6-dbg \ - gcc-i686-linux-gnu g++-i686-linux-gnu libc6-dev-i386-cross libc6-dbg:i386 \ - g++-s390x-linux-gnu libstdc++6:s390x gcc-s390x-linux-gnu libc6-dev-s390x-cross libc6-dbg:s390x \ - wine wine64 g++-mingw-w64-x86-64 - diff --git a/ci/retry/README.md b/ci/retry/README.md deleted file mode 100644 index 1b03c652db..0000000000 --- a/ci/retry/README.md +++ /dev/null @@ -1,123 +0,0 @@ -retry - The command line retry tool ------------------------------------------- - -Retry any shell command with exponential backoff or constant delay. - -### Instructions - -Install: - -retry is a shell script, so drop it somewhere and make sure it's added to your $PATH. Or you can use the following one-liner: - -```sh -sudo sh -c "curl https://raw.githubusercontent.com/kadwanev/retry/master/retry -o /usr/local/bin/retry && chmod +x /usr/local/bin/retry" -``` - -If you're on OS X, retry is also on Homebrew: - -``` -brew pull 27283 -brew install retry -``` -Not popular enough for homebrew-core. Please star this project to help. - -### Usage - -Help: - -`retry -?` - - Usage: retry [options] -- execute command - -h, -?, --help - -v, --verbose Verbose output - -t, --tries=# Set max retries: Default 10 - -s, --sleep=secs Constant sleep amount (seconds) - -m, --min=secs Exponential Backoff: minimum sleep amount (seconds): Default 0.3 - -x, --max=secs Exponential Backoff: maximum sleep amount (seconds): Default 60 - -f, --fail="script +cmds" Fail Script: run in case of final failure - -### Examples - -No problem: - -`retry echo u work good` - - u work good - -Test functionality: - -`retry 'echo "y u no work"; false'` - - y u no work - Before retry #1: sleeping 0.3 seconds - y u no work - Before retry #2: sleeping 0.6 seconds - y u no work - Before retry #3: sleeping 1.2 seconds - y u no work - Before retry #4: sleeping 2.4 seconds - y u no work - Before retry #5: sleeping 4.8 seconds - y u no work - Before retry #6: sleeping 9.6 seconds - y u no work - Before retry #7: sleeping 19.2 seconds - y u no work - Before retry #8: sleeping 38.4 seconds - y u no work - Before retry #9: sleeping 60.0 seconds - y u no work - Before retry #10: sleeping 60.0 seconds - y u no work - etc.. - -Limit retries: - -`retry -t 4 'echo "y u no work"; false'` - - y u no work - Before retry #1: sleeping 0.3 seconds - y u no work - Before retry #2: sleeping 0.6 seconds - y u no work - Before retry #3: sleeping 1.2 seconds - y u no work - Before retry #4: sleeping 2.4 seconds - y u no work - Retries exhausted - -Bad command: - -`retry poop` - - bash: poop: command not found - -Fail command: - -`retry -t 3 -f 'echo "oh poopsickles"' 'echo "y u no work"; false'` - - y u no work - Before retry #1: sleeping 0.3 seconds - y u no work - Before retry #2: sleeping 0.6 seconds - y u no work - Before retry #3: sleeping 1.2 seconds - y u no work - Retries exhausted, running fail script - oh poopsickles - -Last attempt passed: - -`retry -t 3 -- 'if [ $RETRY_ATTEMPT -eq 3 ]; then echo Passed at attempt $RETRY_ATTEMPT; true; else echo Failed at attempt $RETRY_ATTEMPT; false; fi;'` - - Failed at attempt 0 - Before retry #1: sleeping 0.3 seconds - Failed at attempt 1 - Before retry #2: sleeping 0.6 seconds - Failed at attempt 2 - Before retry #3: sleeping 1.2 seconds - Passed at attempt 3 - -### License - -Apache 2.0 - go nuts diff --git a/ci/retry/retry b/ci/retry/retry deleted file mode 100755 index 3c06519dbd..0000000000 --- a/ci/retry/retry +++ /dev/null @@ -1,163 +0,0 @@ -#!/usr/bin/env bash - -GETOPT_BIN=$IN_GETOPT_BIN -GETOPT_BIN=${GETOPT_BIN:-getopt} - -__sleep_amount() { - if [ -n "$constant_sleep" ]; then - sleep_time=$constant_sleep - else - #TODO: check for awk - #TODO: check if user would rather use one of the other possible dependencies: python, ruby, bc, dc - sleep_time=`awk "BEGIN {t = $min_sleep * $(( (1<<($attempts -1)) )); print (t > $max_sleep ? $max_sleep : t)}"` - fi -} - -__log_out() { - echo "$1" 1>&2 -} - -# Parameters: max_tries min_sleep max_sleep constant_sleep fail_script EXECUTION_COMMAND -retry() -{ - local max_tries="$1"; shift - local min_sleep="$1"; shift - local max_sleep="$1"; shift - local constant_sleep="$1"; shift - local fail_script="$1"; shift - if [ -n "$VERBOSE" ]; then - __log_out "Retry Parameters: max_tries=$max_tries min_sleep=$min_sleep max_sleep=$max_sleep constant_sleep=$constant_sleep" - if [ -n "$fail_script" ]; then __log_out "Fail script: $fail_script"; fi - __log_out "" - __log_out "Execution Command: $*" - __log_out "" - fi - - local attempts=0 - local return_code=1 - - - while [[ $return_code -ne 0 && $attempts -le $max_tries ]]; do - if [ $attempts -gt 0 ]; then - __sleep_amount - __log_out "Before retry #$attempts: sleeping $sleep_time seconds" - sleep $sleep_time - fi - - P="$1" - for param in "${@:2}"; do P="$P '$param'"; done - #TODO: replace single quotes in each arg with '"'"' ? - export RETRY_ATTEMPT=$attempts - bash -c "$P" - return_code=$? - #__log_out "Process returned $return_code on attempt $attempts" - if [ $return_code -eq 127 ]; then - # command not found - exit $return_code - elif [ $return_code -ne 0 ]; then - attempts=$[$attempts +1] - fi - done - - if [ $attempts -gt $max_tries ]; then - if [ -n "$fail_script" ]; then - __log_out "Retries exhausted, running fail script" - eval $fail_script - else - __log_out "Retries exhausted" - fi - fi - - exit $return_code -} - -# If we're being sourced, don't worry about such things -if [ "$BASH_SOURCE" == "$0" ]; then - # Prints the help text - help() - { - local retry=$(basename $0) - cat < /dev/null - if [[ $? -ne 4 ]]; then - echo "I’m sorry, 'getopt --test' failed in this environment. Please load GNU getopt." - exit 1 - fi - - OPTIONS=vt:s:m:x:f: - LONGOPTIONS=verbose,tries:,sleep:,min:,max:,fail: - - PARSED=$($GETOPT_BIN --options="$OPTIONS" --longoptions="$LONGOPTIONS" --name "$0" -- "$@") - if [[ $? -ne 0 ]]; then - # e.g. $? == 1 - # then getopt has complained about wrong arguments to stdout - exit 2 - fi - # read getopt’s output this way to handle the quoting right: - eval set -- "$PARSED" - - max_tries=10 - min_sleep=0.3 - max_sleep=60.0 - constant_sleep= - fail_script= - - # now enjoy the options in order and nicely split until we see -- - while true; do - case "$1" in - -v|--verbose) - VERBOSE=true - shift - ;; - -t|--tries) - max_tries="$2" - shift 2 - ;; - -s|--sleep) - constant_sleep="$2" - shift 2 - ;; - -m|--min) - min_sleep="$2" - shift 2 - ;; - -x|--max) - max_sleep="$2" - shift 2 - ;; - -f|--fail) - fail_script="$2" - shift 2 - ;; - --) - shift - break - ;; - *) - echo "Programming error" - exit 3 - ;; - esac - done - - retry "$max_tries" "$min_sleep" "$max_sleep" "$constant_sleep" "$fail_script" "$@" - -fi diff --git a/ci/test/00_setup_env.sh b/ci/test/00_setup_env.sh deleted file mode 100755 index fe732da6b9..0000000000 --- a/ci/test/00_setup_env.sh +++ /dev/null @@ -1,75 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright (c) 2019-2022 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -export LC_ALL=C.UTF-8 - -set -ex - -# The source root dir, usually from git, usually read-only. -# The ci system copies this folder. -BASE_READ_ONLY_DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )"/../../ >/dev/null 2>&1 && pwd ) -export BASE_READ_ONLY_DIR -# The destination root dir inside the container. -# This folder will also hold any SDKs. -# This folder only exists on the ci guest and will be a copy of BASE_READ_ONLY_DIR -export BASE_ROOT_DIR="${BASE_ROOT_DIR:-/ci_container_base}" -# The depends dir. -# This folder exists only on the ci guest, and on the ci host as a volume. -export DEPENDS_DIR=${DEPENDS_DIR:-$BASE_ROOT_DIR/depends} -# A folder for the ci system to put temporary files (build result, datadirs for tests, ...) -# This folder only exists on the ci guest. -export BASE_SCRATCH_DIR=${BASE_SCRATCH_DIR:-$BASE_ROOT_DIR/ci/scratch} -# A folder for the ci system to put executables. -# This folder only exists on the ci guest. -export BINS_SCRATCH_DIR="${BASE_SCRATCH_DIR}/bins/" - -echo "Setting specific values in env" -if [ -n "${FILE_ENV}" ]; then - set -o errexit; - # shellcheck disable=SC1090 - source "${FILE_ENV}" -fi - -echo "Fallback to default values in env (if not yet set)" -# The number of parallel jobs to pass down to make and test_runner.py -export MAKEJOBS=${MAKEJOBS:--j4} -# Whether to prefer BusyBox over GNU utilities -export USE_BUSY_BOX=${USE_BUSY_BOX:-false} - -export RUN_UNIT_TESTS=${RUN_UNIT_TESTS:-true} -export RUN_FUNCTIONAL_TESTS=${RUN_FUNCTIONAL_TESTS:-true} -export RUN_TIDY=${RUN_TIDY:-false} -# By how much to scale the test_runner timeouts (option --timeout-factor). -# This is needed because some ci machines have slow CPU or disk, so sanitizers -# might be slow or a reindex might be waiting on disk IO. -export TEST_RUNNER_TIMEOUT_FACTOR=${TEST_RUNNER_TIMEOUT_FACTOR:-40} -export RUN_FUZZ_TESTS=${RUN_FUZZ_TESTS:-false} - -# Randomize test order. -# See https://www.boost.org/doc/libs/1_71_0/libs/test/doc/html/boost_test/utf_reference/rt_param_reference/random.html -export BOOST_TEST_RANDOM=${BOOST_TEST_RANDOM:-1} -# See man 7 debconf -export DEBIAN_FRONTEND=noninteractive -export CCACHE_MAXSIZE=${CCACHE_MAXSIZE:-100M} -export CCACHE_TEMPDIR=${CCACHE_TEMPDIR:-/tmp/.ccache-temp} -export CCACHE_COMPRESS=${CCACHE_COMPRESS:-1} -# The cache dir. -# This folder exists only on the ci guest, and on the ci host as a volume. -export CCACHE_DIR=${CCACHE_DIR:-$BASE_SCRATCH_DIR/.ccache} -# The depends dir. -# This folder exists on the ci host and ci guest. Changes are propagated back and forth. -export DEPENDS_DIR=${DEPENDS_DIR:-$BASE_ROOT_DIR/depends} -# Folder where the build result is put (bin and lib). -export BASE_OUTDIR=${BASE_OUTDIR:-$BASE_SCRATCH_DIR/out} -# Folder where the build is done (dist and out-of-tree build). -export BASE_BUILD_DIR=${BASE_BUILD_DIR:-$BASE_SCRATCH_DIR/build} -# The folder for previous release binaries. -# This folder exists only on the ci guest, and on the ci host as a volume. -export PREVIOUS_RELEASES_DIR=${PREVIOUS_RELEASES_DIR:-$BASE_ROOT_DIR/prev_releases} -export CI_BASE_PACKAGES=${CI_BASE_PACKAGES:-build-essential libtool autotools-dev automake pkg-config bsdmainutils curl ca-certificates ccache python3 rsync git procps bison e2fsprogs cmake} -export GOAL=${GOAL:-install} -export DIR_QA_ASSETS=${DIR_QA_ASSETS:-${BASE_SCRATCH_DIR}/qa-assets} -export CI_RETRY_EXE=${CI_RETRY_EXE:-"retry --"} diff --git a/ci/test/00_setup_env_arm.sh b/ci/test/00_setup_env_arm.sh deleted file mode 100755 index 396e782959..0000000000 --- a/ci/test/00_setup_env_arm.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright (c) 2019-present The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -export LC_ALL=C.UTF-8 - -export HOST=arm-linux-gnueabihf -export DPKG_ADD_ARCH="armhf" -export PACKAGES="python3-zmq g++-arm-linux-gnueabihf busybox libc6:armhf libstdc++6:armhf libfontconfig1:armhf libxcb1:armhf" -export CONTAINER_NAME=ci_arm_linux -export CI_IMAGE_NAME_TAG="docker.io/arm64v8/debian:bookworm" # Check that https://packages.debian.org/bookworm/g++-arm-linux-gnueabihf (version 12.2, similar to guix) can cross-compile -export USE_BUSY_BOX=true -export RUN_UNIT_TESTS=true -export RUN_FUNCTIONAL_TESTS=false -export GOAL="install" -# -Wno-psabi is to disable ABI warnings: "note: parameter passing for argument of type ... changed in GCC 7.1" -# This could be removed once the ABI change warning does not show up by default -export BITCOIN_CONFIG="--enable-reduce-exports CXXFLAGS='-Wno-psabi -Wno-error=maybe-uninitialized'" diff --git a/ci/test/00_setup_env_i686_centos.sh b/ci/test/00_setup_env_i686_centos.sh deleted file mode 100644 index 00da932939..0000000000 --- a/ci/test/00_setup_env_i686_centos.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright (c) 2020-2022 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -export LC_ALL=C.UTF-8 - -export HOST=i686-pc-linux-gnu -export CONTAINER_NAME=ci_i686_centos -export CI_IMAGE_NAME_TAG="quay.io/centos/amd64:stream9" -export CI_BASE_PACKAGES="gcc-c++ glibc-devel.x86_64 libstdc++-devel.x86_64 glibc-devel.i686 libstdc++-devel.i686 ccache libtool make git python3 python3-pip which patch lbzip2 xz procps-ng dash rsync coreutils bison util-linux e2fsprogs cmake" -export PIP_PACKAGES="pyzmq" -export GOAL="install" -export NO_WERROR=1 # Suppress error: #warning _FORTIFY_SOURCE > 2 is treated like 2 on this platform [-Werror=cpp] -export BGL_CONFIG="--enable-zmq --with-gui=qt5 --enable-reduce-exports" -export CONFIG_SHELL="/bin/dash" diff --git a/ci/test/00_setup_env_i686_multiprocess.sh b/ci/test/00_setup_env_i686_multiprocess.sh deleted file mode 100644 index fd26bf26b3..0000000000 --- a/ci/test/00_setup_env_i686_multiprocess.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright (c) 2020-present The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -export LC_ALL=C.UTF-8 - -export HOST=i686-pc-linux-gnu -export CONTAINER_NAME=ci_i686_multiprocess -export CI_IMAGE_NAME_TAG="docker.io/amd64/ubuntu:24.04" -export PACKAGES="llvm clang g++-multilib" -export DEP_OPTS="DEBUG=1 MULTIPROCESS=1" -export GOAL="install" -export TEST_RUNNER_EXTRA="--v2transport" -export BGL_CONFIG="--enable-debug CC='clang -m32' CXX='clang++ -m32' \ -CPPFLAGS='-DBOOST_MULTI_INDEX_ENABLE_SAFE_MODE' CXXFLAGS='-Wno-error=documentation'" -export BGLD=BGL-node # Used in functional tests diff --git a/ci/test/00_setup_env_mac_cross.sh b/ci/test/00_setup_env_mac_cross.sh deleted file mode 100755 index f607c93ae6..0000000000 --- a/ci/test/00_setup_env_mac_cross.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright (c) 2019-present The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -export LC_ALL=C.UTF-8 - -export SDK_URL=${SDK_URL:-https://bitcoincore.org/depends-sources/sdks} - -export CONTAINER_NAME=ci_macos_cross -export CI_IMAGE_NAME_TAG="docker.io/ubuntu:24.04" -export HOST=x86_64-apple-darwin -export PACKAGES="clang lld llvm zip" -export XCODE_VERSION=15.0 -export XCODE_BUILD_ID=15A240d -export RUN_UNIT_TESTS=false -export RUN_FUNCTIONAL_TESTS=false -export GOAL="deploy" -export BITCOIN_CONFIG="--with-gui --enable-reduce-exports" diff --git a/ci/test/00_setup_env_mac_native.sh b/ci/test/00_setup_env_mac_native.sh deleted file mode 100644 index 842da60a0c..0000000000 --- a/ci/test/00_setup_env_mac_native.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright (c) 2019-present The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -export LC_ALL=C.UTF-8 - -export HOST=x86_64-apple-darwin -# Homebrew's python@3.12 is marked as externally managed (PEP 668). -# Therefore, `--break-system-packages` is needed. -export PIP_PACKAGES="--break-system-packages zmq" -export GOAL="install" -export BGL_CONFIG="--with-gui --with-miniupnpc --with-natpmp --enable-reduce-exports" -export CI_OS_NAME="macos" -export NO_DEPENDS=1 -export OSX_SDK="" -export CCACHE_MAXSIZE=400M -export RUN_FUZZ_TESTS=true diff --git a/ci/test/00_setup_env_native_asan.sh b/ci/test/00_setup_env_native_asan.sh deleted file mode 100755 index aca315a617..0000000000 --- a/ci/test/00_setup_env_native_asan.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright (c) 2019-present The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -export LC_ALL=C.UTF-8 - -export CI_IMAGE_NAME_TAG="docker.io/ubuntu:24.04" - -# Only install BCC tracing packages in CI. Container has to match the host for BCC to work. -if [[ "${INSTALL_BCC_TRACING_TOOLS}" == "true" ]]; then - # Required for USDT functional tests to run - BPFCC_PACKAGE="bpfcc-tools linux-headers-$(uname --kernel-release)" - export CI_CONTAINER_CAP="--privileged -v /sys/kernel:/sys/kernel:rw" -else - BPFCC_PACKAGE="" - export CI_CONTAINER_CAP="--cap-add SYS_PTRACE" # If run with (ASan + LSan), the container needs access to ptrace (https://github.com/google/sanitizers/issues/764) -fi - -export CONTAINER_NAME=ci_native_asan -export PACKAGES="systemtap-sdt-dev clang-18 llvm-18 libclang-rt-18-dev python3-zmq qtbase5-dev qttools5-dev-tools libevent-dev libboost-dev libdb5.3++-dev libminiupnpc-dev libnatpmp-dev libzmq3-dev libqrencode-dev libsqlite3-dev ${BPFCC_PACKAGE}" -export NO_DEPENDS=1 -export GOAL="install" -export BGL_CONFIG="--enable-usdt --enable-zmq --with-incompatible-bdb --with-gui=qt5 \ -CPPFLAGS='-DARENA_DEBUG -DDEBUG_LOCKORDER' \ ---with-sanitizers=address,float-divide-by-zero,integer,undefined \ -CC='clang-18 -ftrivial-auto-var-init=pattern' CXX='clang++-18 -ftrivial-auto-var-init=pattern'" -export CCACHE_MAXSIZE=300M diff --git a/ci/test/00_setup_env_native_fuzz.sh b/ci/test/00_setup_env_native_fuzz.sh deleted file mode 100755 index 3c1cb47e4d..0000000000 --- a/ci/test/00_setup_env_native_fuzz.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright (c) 2019-present The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -export LC_ALL=C.UTF-8 - -export CI_IMAGE_NAME_TAG="docker.io/ubuntu:24.04" -export CONTAINER_NAME=ci_native_fuzz -export PACKAGES="clang-18 llvm-18 libclang-rt-18-dev libevent-dev libboost-dev libsqlite3-dev" -export NO_DEPENDS=1 -export RUN_UNIT_TESTS=false -export RUN_FUNCTIONAL_TESTS=false -export RUN_FUZZ_TESTS=true -export GOAL="install" -export CI_CONTAINER_CAP="--cap-add SYS_PTRACE" # If run with (ASan + LSan), the container needs access to ptrace (https://github.com/google/sanitizers/issues/764) -export BGL_CONFIG="--enable-fuzz --with-sanitizers=fuzzer,address,undefined,float-divide-by-zero,integer \ -CC='clang-18 -ftrivial-auto-var-init=pattern' CXX='clang++-18 -ftrivial-auto-var-init=pattern'" -export CCACHE_MAXSIZE=200M -export LLVM_SYMBOLIZER_PATH="/usr/bin/llvm-symbolizer-18" diff --git a/ci/test/00_setup_env_native_fuzz_with_msan.sh b/ci/test/00_setup_env_native_fuzz_with_msan.sh deleted file mode 100755 index 070e49c909..0000000000 --- a/ci/test/00_setup_env_native_fuzz_with_msan.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright (c) 2020-present The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -export LC_ALL=C.UTF-8 - -export CI_IMAGE_NAME_TAG="docker.io/ubuntu:24.04" -LIBCXX_DIR="/msan/cxx_build/" -export MSAN_FLAGS="-fsanitize=memory -fsanitize-memory-track-origins=2 -fno-omit-frame-pointer -g -O1 -fno-optimize-sibling-calls" -LIBCXX_FLAGS="-nostdinc++ -nostdlib++ -isystem ${LIBCXX_DIR}include/c++/v1 -L${LIBCXX_DIR}lib -Wl,-rpath,${LIBCXX_DIR}lib -lc++ -lc++abi -lpthread -Wno-unused-command-line-argument" -export MSAN_AND_LIBCXX_FLAGS="${MSAN_FLAGS} ${LIBCXX_FLAGS}" - -export CONTAINER_NAME="ci_native_fuzz_msan" -export PACKAGES="ninja-build" -# BDB generates false-positives and will be removed in future -export DEP_OPTS="DEBUG=1 NO_BDB=1 NO_QT=1 CC=clang CXX=clang++ CFLAGS='${MSAN_FLAGS}' CXXFLAGS='${MSAN_AND_LIBCXX_FLAGS}'" -export GOAL="install" -# _FORTIFY_SOURCE is not compatible with MSAN. -export BGL_CONFIG="--enable-fuzz --with-sanitizers=fuzzer,memory CPPFLAGS='-DBOOST_MULTI_INDEX_ENABLE_SAFE_MODE -U_FORTIFY_SOURCE'" -export USE_MEMORY_SANITIZER="true" -export RUN_UNIT_TESTS="false" -export RUN_FUNCTIONAL_TESTS="false" -export RUN_FUZZ_TESTS=true -export CCACHE_MAXSIZE=250M diff --git a/ci/test/00_setup_env_native_fuzz_with_valgrind.sh b/ci/test/00_setup_env_native_fuzz_with_valgrind.sh deleted file mode 100644 index 0ab90a7503..0000000000 --- a/ci/test/00_setup_env_native_fuzz_with_valgrind.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright (c) 2019-present The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -export LC_ALL=C.UTF-8 - -export CI_IMAGE_NAME_TAG="docker.io/ubuntu:24.04" -export CONTAINER_NAME=ci_native_fuzz_valgrind -export PACKAGES="clang-16 llvm-16 libclang-rt-16-dev libevent-dev libboost-dev libsqlite3-dev valgrind" -export NO_DEPENDS=1 -export RUN_UNIT_TESTS=false -export RUN_FUNCTIONAL_TESTS=false -export RUN_FUZZ_TESTS=true -export FUZZ_TESTS_CONFIG="--valgrind" -export GOAL="install" -export BGL_CONFIG="--enable-fuzz --with-sanitizers=fuzzer CC=clang-16 CXX=clang++-16" -export CCACHE_MAXSIZE=200M diff --git a/ci/test/00_setup_env_native_msan.sh b/ci/test/00_setup_env_native_msan.sh deleted file mode 100644 index 600f16a5a6..0000000000 --- a/ci/test/00_setup_env_native_msan.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright (c) 2020-present The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -export LC_ALL=C.UTF-8 - -export CI_IMAGE_NAME_TAG="docker.io/ubuntu:24.04" -LIBCXX_DIR="/msan/cxx_build/" -export MSAN_FLAGS="-fsanitize=memory -fsanitize-memory-track-origins=2 -fno-omit-frame-pointer -g -O1 -fno-optimize-sibling-calls" -LIBCXX_FLAGS="-nostdinc++ -nostdlib++ -isystem ${LIBCXX_DIR}include/c++/v1 -L${LIBCXX_DIR}lib -Wl,-rpath,${LIBCXX_DIR}lib -lc++ -lc++abi -lpthread -Wno-unused-command-line-argument" -export MSAN_AND_LIBCXX_FLAGS="${MSAN_FLAGS} ${LIBCXX_FLAGS}" - -export CONTAINER_NAME="ci_native_msan" -export PACKAGES="ninja-build" -# BDB generates false-positives and will be removed in future -export DEP_OPTS="DEBUG=1 NO_BDB=1 NO_QT=1 CC=clang CXX=clang++ CFLAGS='${MSAN_FLAGS}' CXXFLAGS='${MSAN_AND_LIBCXX_FLAGS}'" -export GOAL="install" -# _FORTIFY_SOURCE is not compatible with MSAN. -export BGL_CONFIG="--with-sanitizers=memory CPPFLAGS='-U_FORTIFY_SOURCE'" -export USE_MEMORY_SANITIZER="true" -export RUN_FUNCTIONAL_TESTS="false" -export CCACHE_MAXSIZE=250M diff --git a/ci/test/00_setup_env_native_nowallet_libBGLkernel.sh b/ci/test/00_setup_env_native_nowallet_libBGLkernel.sh deleted file mode 100644 index 1eb7e666ce..0000000000 --- a/ci/test/00_setup_env_native_nowallet_libBGLkernel.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright (c) 2019-present The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -export LC_ALL=C.UTF-8 - -export CONTAINER_NAME=ci_native_nowallet_libbitcoinkernel -export CI_IMAGE_NAME_TAG="docker.io/debian:bullseye" -# Use minimum supported python3.9 and clang-16, see doc/dependencies.md -export PACKAGES="python3-zmq clang-16 llvm-16 libc++abi-16-dev libc++-16-dev" -export DEP_OPTS="NO_WALLET=1 CC=clang-16 CXX='clang++-16 -stdlib=libc++'" -export GOAL="install" -export BGL_CONFIG="--enable-reduce-exports --enable-experimental-util-chainstate --with-experimental-kernel-lib --enable-shared" diff --git a/ci/test/00_setup_env_native_previous_releases.sh b/ci/test/00_setup_env_native_previous_releases.sh deleted file mode 100644 index 555019ca07..0000000000 --- a/ci/test/00_setup_env_native_previous_releases.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright (c) 2019-present The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -export LC_ALL=C.UTF-8 -#export PACKAGE_MANAGER_INSTALL #default -#export MAKEJOBS #default -#export DANGER_RUN_CI_ON_HOST #default -#export TEST_RUNNER_PORT_MIN #default -#export CCACHE_SIZE #default -#export CCACHE_DIR #default - -export CONTAINER_NAME=ci_native_previous_releases -export CI_IMAGE_NAME_TAG="docker.io/ubuntu:22.04" -# Use minimum supported python3.9 (or best effort 3.10) and gcc-11, see doc/dependencies.md -export PACKAGES="gcc-11 g++-11 python3-zmq" -export DEP_OPTS="NO_UPNP=1 NO_NATPMP=1 DEBUG=1 CC=gcc-11 CXX=g++-11" -export TEST_RUNNER_EXTRA="--previous-releases --coverage --extended --exclude feature_dbcrash" # Run extended tests so that coverage does not fail, but exclude the very slow dbcrash -export RUN_UNIT_TESTS_SEQUENTIAL="true" -export RUN_UNIT_TESTS="false" -export GOAL="install" -export DOWNLOAD_PREVIOUS_RELEASES="true" -export BGL_CONFIG="--enable-zmq --with-gui=qt5 --enable-reduce-exports --enable-debug \ -CFLAGS=\"-g0 -O2 -funsigned-char\" CPPFLAGS='-DBOOST_MULTI_INDEX_ENABLE_SAFE_MODE' CXXFLAGS=\"-g0 -O2 -funsigned-char\"" diff --git a/ci/test/00_setup_env_native_tidy.sh b/ci/test/00_setup_env_native_tidy.sh deleted file mode 100755 index 5f422bbdb6..0000000000 --- a/ci/test/00_setup_env_native_tidy.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright (c) 2023-present The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -export LC_ALL=C.UTF-8 - -export CI_IMAGE_NAME_TAG="docker.io/ubuntu:24.04" -export CONTAINER_NAME=ci_native_tidy -export TIDY_LLVM_V="18" -export PACKAGES="clang-${TIDY_LLVM_V} libclang-${TIDY_LLVM_V}-dev llvm-${TIDY_LLVM_V}-dev libomp-${TIDY_LLVM_V}-dev clang-tidy-${TIDY_LLVM_V} jq bear libevent-dev libboost-dev libminiupnpc-dev libnatpmp-dev libzmq3-dev systemtap-sdt-dev qtbase5-dev qttools5-dev qttools5-dev-tools libqrencode-dev libsqlite3-dev libdb++-dev" -export NO_DEPENDS=1 -export RUN_UNIT_TESTS=false -export RUN_FUNCTIONAL_TESTS=false -export RUN_FUZZ_TESTS=false -export RUN_TIDY=true -export GOAL="install" -export BITCOIN_CONFIG="CC=clang-${TIDY_LLVM_V} CXX=clang++-${TIDY_LLVM_V} --with-incompatible-bdb --disable-hardening CFLAGS='-O0 -g0' CXXFLAGS='-O0 -g0'" -export CCACHE_MAXSIZE=200M diff --git a/ci/test/00_setup_env_native_tsan.sh b/ci/test/00_setup_env_native_tsan.sh deleted file mode 100755 index 3fcaa8c6c6..0000000000 --- a/ci/test/00_setup_env_native_tsan.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright (c) 2019-present The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -export LC_ALL=C.UTF-8 - -export CONTAINER_NAME=ci_native_tsan -export CI_IMAGE_NAME_TAG="docker.io/ubuntu:24.04" -export PACKAGES="clang-18 llvm-18 libclang-rt-18-dev libc++abi-18-dev libc++-18-dev python3-zmq" -export DEP_OPTS="CC=clang-18 CXX='clang++-18 -stdlib=libc++'" -export GOAL="install" -export BITCOIN_CONFIG="--enable-zmq CPPFLAGS='-DARENA_DEBUG -DDEBUG_LOCKORDER -DDEBUG_LOCKCONTENTION' --with-sanitizers=thread" diff --git a/ci/test/00_setup_env_native_valgrind.sh b/ci/test/00_setup_env_native_valgrind.sh deleted file mode 100755 index 5dbd96ffc1..0000000000 --- a/ci/test/00_setup_env_native_valgrind.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright (c) 2019-present The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -export LC_ALL=C.UTF-8 - -export CI_IMAGE_NAME_TAG="docker.io/ubuntu:24.04" -export CONTAINER_NAME=ci_native_valgrind -export PACKAGES="valgrind clang-16 llvm-16 libclang-rt-16-dev python3-zmq libevent-dev libboost-dev libdb5.3++-dev libminiupnpc-dev libnatpmp-dev libzmq3-dev libsqlite3-dev" -export USE_VALGRIND=1 -export NO_DEPENDS=1 -export TEST_RUNNER_EXTRA="--exclude feature_init,rpc_bind,feature_bind_extra" # feature_init excluded for now, see https://github.com/bitcoin/bitcoin/issues/30011 ; bind tests excluded for now, see https://github.com/bitcoin/bitcoin/issues/17765#issuecomment-602068547 -export GOAL="install" -export BGL_CONFIG="--enable-zmq --with-incompatible-bdb --with-gui=no CC=clang-16 CXX=clang++-16" # TODO enable GUI diff --git a/ci/test/00_setup_env_s390x.sh b/ci/test/00_setup_env_s390x.sh deleted file mode 100755 index c4698a9075..0000000000 --- a/ci/test/00_setup_env_s390x.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright (c) 2019-present The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -export LC_ALL=C.UTF-8 - -export HOST=s390x-linux-gnu -export PACKAGES="python3-zmq" -export CONTAINER_NAME=ci_s390x -export CI_IMAGE_NAME_TAG="docker.io/s390x/ubuntu:24.04" -export TEST_RUNNER_EXTRA="--exclude rpc_bind,feature_bind_extra" # Excluded for now, see https://github.com/bitcoin/bitcoin/issues/17765#issuecomment-602068547 -export RUN_FUNCTIONAL_TESTS=true -export GOAL="install" -export BGL_CONFIG="--enable-reduce-exports" diff --git a/ci/test/00_setup_env_win64.sh b/ci/test/00_setup_env_win64.sh deleted file mode 100644 index a0108cd147..0000000000 --- a/ci/test/00_setup_env_win64.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright (c) 2019-present The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -export LC_ALL=C.UTF-8 -#export PACKAGE_MANAGER_INSTALL #default -#export MAKEJOBS #default -#export DANGER_RUN_CI_ON_HOST #default -#export TEST_RUNNER_PORT_MIN #default -#export CCACHE_SIZE #default -#export CCACHE_DIR #default - - -export CONTAINER_NAME=ci_win64 -export CI_IMAGE_NAME_TAG="docker.io/amd64/debian:bookworm" # Check that https://packages.debian.org/bookworm/g++-mingw-w64-x86-64-posix (version 12.2, similar to guix) can cross-compile -export HOST=x86_64-w64-mingw32 -export DPKG_ADD_ARCH="i386" -export PACKAGES="nsis g++-mingw-w64-x86-64-posix wine-binfmt wine64 wine32 file" -export RUN_FUNCTIONAL_TESTS=false -export GOAL="deploy" -# Prior to 11.0.0, the mingw-w64 headers were missing noreturn attributes, causing warnings when -# cross-compiling for Windows. https://sourceforge.net/p/mingw-w64/bugs/306/ -# https://github.com/mingw-w64/mingw-w64/commit/1690994f515910a31b9fb7c7bd3a52d4ba987abe -export BGL_CONFIG="--enable-reduce-exports --disable-gui-tests CXXFLAGS='-Wno-return-type -Wno-error=maybe-uninitialized -Wno-error=array-bounds'" diff --git a/ci/test/01_base_install.sh b/ci/test/01_base_install.sh deleted file mode 100755 index f16321ba55..0000000000 --- a/ci/test/01_base_install.sh +++ /dev/null @@ -1,89 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright (c) 2018-present The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -export LC_ALL=C.UTF-8 - -set -ex - -CFG_DONE="ci.base-install-done" # Use a global git setting to remember whether this script ran to avoid running it twice - -if [ "$(git config --global ${CFG_DONE})" == "true" ]; then - echo "Skip base install" - exit 0 -fi - -if [ -n "$DPKG_ADD_ARCH" ]; then - dpkg --add-architecture "$DPKG_ADD_ARCH" -fi - -if [[ $CI_IMAGE_NAME_TAG == *centos* ]]; then - bash -c "dnf -y install epel-release" - bash -c "dnf -y --allowerasing install $CI_BASE_PACKAGES $PACKAGES" -elif [ "$CI_OS_NAME" != "macos" ]; then - if [[ -n "${APPEND_APT_SOURCES_LIST}" ]]; then - echo "${APPEND_APT_SOURCES_LIST}" >> /etc/apt/sources.list - fi - ${CI_RETRY_EXE} apt-get update - ${CI_RETRY_EXE} bash -c "apt-get install --no-install-recommends --no-upgrade -y $PACKAGES $CI_BASE_PACKAGES" -fi - -if [ -n "$PIP_PACKAGES" ]; then - # shellcheck disable=SC2086 - ${CI_RETRY_EXE} pip3 install --user $PIP_PACKAGES -fi - -if [[ ${USE_MEMORY_SANITIZER} == "true" ]]; then - ${CI_RETRY_EXE} git clone --depth=1 https://github.com/llvm/llvm-project -b "llvmorg-18.1.3" /msan/llvm-project - - cmake -G Ninja -B /msan/clang_build/ \ - -DLLVM_ENABLE_PROJECTS="clang" \ - -DCMAKE_BUILD_TYPE=Release \ - -DLLVM_TARGETS_TO_BUILD=Native \ - -DLLVM_ENABLE_RUNTIMES="compiler-rt;libcxx;libcxxabi;libunwind" \ - -S /msan/llvm-project/llvm - - ninja -C /msan/clang_build/ "-j$( nproc )" # Use nproc, because MAKEJOBS is the default in docker image builds - ninja -C /msan/clang_build/ install-runtimes - - update-alternatives --install /usr/bin/clang++ clang++ /msan/clang_build/bin/clang++ 100 - update-alternatives --install /usr/bin/clang clang /msan/clang_build/bin/clang 100 - update-alternatives --install /usr/bin/llvm-symbolizer llvm-symbolizer /msan/clang_build/bin/llvm-symbolizer 100 - - cmake -G Ninja -B /msan/cxx_build/ \ - -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi;libunwind" \ - -DCMAKE_BUILD_TYPE=Release \ - -DLLVM_USE_SANITIZER=MemoryWithOrigins \ - -DCMAKE_C_COMPILER=clang \ - -DCMAKE_CXX_COMPILER=clang++ \ - -DLLVM_TARGETS_TO_BUILD=Native \ - -DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=OFF \ - -DLIBCXXABI_USE_LLVM_UNWINDER=OFF \ - -DLIBCXX_HARDENING_MODE=debug \ - -S /msan/llvm-project/runtimes - - ninja -C /msan/cxx_build/ "-j$( nproc )" # Use nproc, because MAKEJOBS is the default in docker image builds -fi - -if [[ "${RUN_TIDY}" == "true" ]]; then - ${CI_RETRY_EXE} git clone --depth=1 https://github.com/include-what-you-use/include-what-you-use -b clang_"${TIDY_LLVM_V}" /include-what-you-use - cmake -B /iwyu-build/ -G 'Unix Makefiles' -DCMAKE_PREFIX_PATH=/usr/lib/llvm-"${TIDY_LLVM_V}" -S /include-what-you-use - make -C /iwyu-build/ install "-j$( nproc )" # Use nproc, because MAKEJOBS is the default in docker image builds -fi - -mkdir -p "${DEPENDS_DIR}/SDKs" "${DEPENDS_DIR}/sdk-sources" - -OSX_SDK_BASENAME="Xcode-${XCODE_VERSION}-${XCODE_BUILD_ID}-extracted-SDK-with-libcxx-headers" - -if [ -n "$XCODE_VERSION" ] && [ ! -d "${DEPENDS_DIR}/SDKs/${OSX_SDK_BASENAME}" ]; then - OSX_SDK_FILENAME="${OSX_SDK_BASENAME}.tar.gz" - OSX_SDK_PATH="${DEPENDS_DIR}/sdk-sources/${OSX_SDK_FILENAME}" - if [ ! -f "$OSX_SDK_PATH" ]; then - ${CI_RETRY_EXE} curl --location --fail "${SDK_URL}/${OSX_SDK_FILENAME}" -o "$OSX_SDK_PATH" - fi - tar -C "${DEPENDS_DIR}/SDKs" -xf "$OSX_SDK_PATH" -fi - -git config --global ${CFG_DONE} "true" diff --git a/ci/test/02_run_container.sh b/ci/test/02_run_container.sh deleted file mode 100755 index d383948637..0000000000 --- a/ci/test/02_run_container.sh +++ /dev/null @@ -1,115 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright (c) 2018-present The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -export LC_ALL=C.UTF-8 -export CI_IMAGE_LABEL="BGL-ci-test" - -set -ex - -if [ -z "$DANGER_RUN_CI_ON_HOST" ]; then - # Export all env vars to avoid missing some. - # Though, exclude those with newlines to avoid parsing problems. - python3 -c 'import os; [print(f"{key}={value}") for key, value in os.environ.items() if "\n" not in value and "HOME" != key and "PATH" != key and "USER" != key]' | tee "/tmp/env-$USER-$CONTAINER_NAME" - # System-dependent env vars must be kept as is. So read them from the container. - docker run --rm "${CI_IMAGE_NAME_TAG}" bash -c "env | grep --extended-regexp '^(HOME|PATH|USER)='" | tee --append "/tmp/env-$USER-$CONTAINER_NAME" - echo "Creating $CI_IMAGE_NAME_TAG container to run in" - - DOCKER_BUILDKIT=1 docker build \ - --file "${BASE_READ_ONLY_DIR}/ci/test_imagefile" \ - --build-arg "CI_IMAGE_NAME_TAG=${CI_IMAGE_NAME_TAG}" \ - --build-arg "FILE_ENV=${FILE_ENV}" \ - --label="${CI_IMAGE_LABEL}" \ - --tag="${CONTAINER_NAME}" \ - "${BASE_READ_ONLY_DIR}" - - docker volume create "${CONTAINER_NAME}_ccache" || true - docker volume create "${CONTAINER_NAME}_depends" || true - docker volume create "${CONTAINER_NAME}_depends_sources" || true - docker volume create "${CONTAINER_NAME}_previous_releases" || true - - CI_CCACHE_MOUNT="type=volume,src=${CONTAINER_NAME}_ccache,dst=$CCACHE_DIR" - CI_DEPENDS_MOUNT="type=volume,src=${CONTAINER_NAME}_depends,dst=$DEPENDS_DIR/built" - CI_DEPENDS_SOURCES_MOUNT="type=volume,src=${CONTAINER_NAME}_depends_sources,dst=$DEPENDS_DIR/sources" - CI_PREVIOUS_RELEASES_MOUNT="type=volume,src=${CONTAINER_NAME}_previous_releases,dst=$PREVIOUS_RELEASES_DIR" - - if [ "$DANGER_CI_ON_HOST_CACHE_FOLDERS" ]; then - # ensure the directories exist - mkdir -p "${CCACHE_DIR}" - mkdir -p "${DEPENDS_DIR}/built" - mkdir -p "${DEPENDS_DIR}/sources" - mkdir -p "${PREVIOUS_RELEASES_DIR}" - - CI_CCACHE_MOUNT="type=bind,src=${CCACHE_DIR},dst=$CCACHE_DIR" - CI_DEPENDS_MOUNT="type=bind,src=${DEPENDS_DIR}/built,dst=$DEPENDS_DIR/built" - CI_DEPENDS_SOURCES_MOUNT="type=bind,src=${DEPENDS_DIR}/sources,dst=$DEPENDS_DIR/sources" - CI_PREVIOUS_RELEASES_MOUNT="type=bind,src=${PREVIOUS_RELEASES_DIR},dst=$PREVIOUS_RELEASES_DIR" - fi - - docker network create --ipv6 --subnet 1111:1111::/112 ci-ip6net || true - - if [ -n "${RESTART_CI_DOCKER_BEFORE_RUN}" ] ; then - echo "Restart docker before run to stop and clear all containers started with --rm" - podman container rm --force --all # Similar to "systemctl restart docker" - - # Still prune everything in case the filtered pruning doesn't work, or if labels were not set - # on a previous run. Belt and suspenders approach, should be fine to remove in the future. - # Prune images used by --external containers (e.g. build containers) when - # using podman. - echo "Prune all dangling images" - podman image prune --force --external - fi - echo "Prune all dangling $CI_IMAGE_LABEL images" - # When detecting podman-docker, `--external` should be added. - docker image prune --force --filter "label=$CI_IMAGE_LABEL" - - # Append $USER to /tmp/env to support multi-user systems and $CONTAINER_NAME - # to allow support starting multiple runs simultaneously by the same user. - # shellcheck disable=SC2086 - CI_CONTAINER_ID=$(docker run --cap-add LINUX_IMMUTABLE $CI_CONTAINER_CAP --rm --interactive --detach --tty \ - --mount "type=bind,src=$BASE_READ_ONLY_DIR,dst=$BASE_READ_ONLY_DIR,readonly" \ - --mount "${CI_CCACHE_MOUNT}" \ - --mount "${CI_DEPENDS_MOUNT}" \ - --mount "${CI_DEPENDS_SOURCES_MOUNT}" \ - --mount "${CI_PREVIOUS_RELEASES_MOUNT}" \ - --env-file /tmp/env-$USER-$CONTAINER_NAME \ - --name "$CONTAINER_NAME" \ - --network ci-ip6net \ - "$CONTAINER_NAME") - export CI_CONTAINER_ID - export CI_EXEC_CMD_PREFIX="docker exec ${CI_CONTAINER_ID}" -else - echo "Running on host system without docker wrapper" - echo "Create missing folders" - mkdir -p "${CCACHE_DIR}" - mkdir -p "${PREVIOUS_RELEASES_DIR}" -fi - -if [ "$CI_OS_NAME" == "macos" ]; then - IN_GETOPT_BIN="$(brew --prefix gnu-getopt)/bin/getopt" - export IN_GETOPT_BIN -fi - -CI_EXEC () { - $CI_EXEC_CMD_PREFIX bash -c "export PATH=\"/path_with space:${BINS_SCRATCH_DIR}:${BASE_ROOT_DIR}/ci/retry:\$PATH\" && cd \"${BASE_ROOT_DIR}\" && $*" -} -export -f CI_EXEC - -# Normalize all folders to BASE_ROOT_DIR -CI_EXEC rsync --archive --stats --human-readable "${BASE_READ_ONLY_DIR}/" "${BASE_ROOT_DIR}" || echo "Nothing to copy from ${BASE_READ_ONLY_DIR}/" -CI_EXEC "${BASE_ROOT_DIR}/ci/test/01_base_install.sh" - -# Fixes permission issues when there is a container UID/GID mismatch with the owner -# of the git source code directory. -CI_EXEC git config --global --add safe.directory \"*\" - -CI_EXEC mkdir -p "${BINS_SCRATCH_DIR}" - -CI_EXEC "${BASE_ROOT_DIR}/ci/test/03_test_script.sh" - -if [ -z "$DANGER_RUN_CI_ON_HOST" ]; then - echo "Stop and remove CI container by ID" - docker container kill "${CI_CONTAINER_ID}" -fi diff --git a/ci/test/03_test_script.sh b/ci/test/03_test_script.sh deleted file mode 100755 index 71d9ad7f72..0000000000 --- a/ci/test/03_test_script.sh +++ /dev/null @@ -1,199 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright (c) 2018-present The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -export LC_ALL=C.UTF-8 - -set -ex - -export ASAN_OPTIONS="detect_stack_use_after_return=1:check_initialization_order=1:strict_init_order=1" -export LSAN_OPTIONS="suppressions=${BASE_ROOT_DIR}/test/sanitizer_suppressions/lsan" -export TSAN_OPTIONS="suppressions=${BASE_ROOT_DIR}/test/sanitizer_suppressions/tsan:halt_on_error=1" -export UBSAN_OPTIONS="suppressions=${BASE_ROOT_DIR}/test/sanitizer_suppressions/ubsan:print_stacktrace=1:halt_on_error=1:report_error_type=1" - -if [ "$CI_OS_NAME" == "macos" ]; then - top -l 1 -s 0 | awk ' /PhysMem/ {print}' - echo "Number of CPUs: $(sysctl -n hw.logicalcpu)" -else - free -m -h - echo "Number of CPUs (nproc): $(nproc)" - echo "System info: $(uname --kernel-name --kernel-release)" - lscpu -fi -echo "Free disk space:" -df -h - -# What host to compile for. See also ./depends/README.md -# Tests that need cross-compilation export the appropriate HOST. -# Tests that run natively guess the host -export HOST=${HOST:-$("$BASE_ROOT_DIR/depends/config.guess")} - -( - # compact->outputs[i].file_size is uninitialized memory, so reading it is UB. - # The statistic bytes_written is only used for logging, which is disabled in - # CI, so as a temporary minimal fix to work around UB and CI failures, leave - # bytes_written unmodified. - # See https://github.com/bitcoin/bitcoin/pull/28359#issuecomment-1698694748 - # Tee patch to stdout to make it clear CI is testing modified code. - tee >(patch -p1) <<'EOF' ---- a/src/leveldb/db/db_impl.cc -+++ b/src/leveldb/db/db_impl.cc -@@ -1028,9 +1028,6 @@ Status DBImpl::DoCompactionWork(CompactionState* compact) { - stats.bytes_read += compact->compaction->input(which, i)->file_size; - } - } -- for (size_t i = 0; i < compact->outputs.size(); i++) { -- stats.bytes_written += compact->outputs[i].file_size; -- } - - mutex_.Lock(); - stats_[compact->compaction->level() + 1].Add(stats); -EOF -) - -if [ "$RUN_FUZZ_TESTS" = "true" ]; then - export DIR_FUZZ_IN=${DIR_QA_ASSETS}/fuzz_seed_corpus/ - if [ ! -d "$DIR_FUZZ_IN" ]; then - ${CI_RETRY_EXE} git clone --depth=1 https://github.com/bitcoin-core/qa-assets "${DIR_QA_ASSETS}" - fi - ( - cd "${DIR_QA_ASSETS}" - echo "Using qa-assets repo from commit ..." - git log -1 - ) -elif [ "$RUN_UNIT_TESTS" = "true" ] || [ "$RUN_UNIT_TESTS_SEQUENTIAL" = "true" ]; then - export DIR_UNIT_TEST_DATA=${DIR_QA_ASSETS}/unit_test_data/ - if [ ! -d "$DIR_UNIT_TEST_DATA" ]; then - mkdir -p "$DIR_UNIT_TEST_DATA" - ${CI_RETRY_EXE} curl --location --fail https://github.com/bitcoin-core/qa-assets/raw/main/unit_test_data/script_assets_test.json -o "${DIR_UNIT_TEST_DATA}/script_assets_test.json" - fi -fi - -if [ "$USE_BUSY_BOX" = "true" ]; then - echo "Setup to use BusyBox utils" - # tar excluded for now because it requires passing in the exact archive type in ./depends (fixed in later BusyBox version) - # ar excluded for now because it does not recognize the -q option in ./depends (unknown if fixed) - for util in $(busybox --list | grep -v "^ar$" | grep -v "^tar$" ); do ln -s "$(command -v busybox)" "${BINS_SCRATCH_DIR}/$util"; done - # Print BusyBox version - patch --help -fi - -# Make sure default datadir does not exist and is never read by creating a dummy file -if [ "$CI_OS_NAME" == "macos" ]; then - echo > "${HOME}/Library/Application Support/Bitcoin" -else - echo > "${HOME}/.bitcoin" -fi - -if [ -z "$NO_DEPENDS" ]; then - if [[ $CI_IMAGE_NAME_TAG == *centos* ]]; then - SHELL_OPTS="CONFIG_SHELL=/bin/dash" - else - SHELL_OPTS="CONFIG_SHELL=" - fi - bash -c "$SHELL_OPTS make $MAKEJOBS -C depends HOST=$HOST $DEP_OPTS LOG=1" -fi -if [ "$DOWNLOAD_PREVIOUS_RELEASES" = "true" ]; then - test/get_previous_releases.py -b -t "$PREVIOUS_RELEASES_DIR" -fi - -BITCOIN_CONFIG_ALL="--disable-dependency-tracking" -if [ -z "$NO_DEPENDS" ]; then - BITCOIN_CONFIG_ALL="${BITCOIN_CONFIG_ALL} CONFIG_SITE=$DEPENDS_DIR/$HOST/share/config.site" -fi -if [ -z "$NO_WERROR" ]; then - BITCOIN_CONFIG_ALL="${BITCOIN_CONFIG_ALL} --enable-werror" -fi - -ccache --zero-stats -PRINT_CCACHE_STATISTICS="ccache --version | head -n 1 && ccache --show-stats" - -BITCOIN_CONFIG_ALL="${BITCOIN_CONFIG_ALL} --enable-external-signer --prefix=$BASE_OUTDIR" - -if [ -n "$CONFIG_SHELL" ]; then - "$CONFIG_SHELL" -c "./autogen.sh" -else - ./autogen.sh -fi - -mkdir -p "${BASE_BUILD_DIR}" -cd "${BASE_BUILD_DIR}" - -bash -c "${BASE_ROOT_DIR}/configure --cache-file=config.cache $BITCOIN_CONFIG_ALL $BITCOIN_CONFIG" || ( (cat config.log) && false) - -make distdir VERSION="$HOST" - -cd "${BASE_BUILD_DIR}/bitcoin-$HOST" - -bash -c "./configure --cache-file=../config.cache $BITCOIN_CONFIG_ALL $BITCOIN_CONFIG" || ( (cat config.log) && false) - -if [[ "${RUN_TIDY}" == "true" ]]; then - MAYBE_BEAR="bear --config src/.bear-tidy-config" - MAYBE_TOKEN="--" -fi - -bash -c "${MAYBE_BEAR} ${MAYBE_TOKEN} make $MAKEJOBS $GOAL" || ( echo "Build failure. Verbose build follows." && make "$GOAL" V=1 ; false ) - -bash -c "${PRINT_CCACHE_STATISTICS}" -du -sh "${DEPENDS_DIR}"/*/ -du -sh "${PREVIOUS_RELEASES_DIR}" - -if [[ $HOST = *-mingw32 ]]; then - # Generate all binaries, so that they can be wrapped - make "$MAKEJOBS" -C src/secp256k1 VERBOSE=1 - make "$MAKEJOBS" -C src minisketch/test.exe VERBOSE=1 - "${BASE_ROOT_DIR}/ci/test/wrap-wine.sh" -fi - -if [ -n "$USE_VALGRIND" ]; then - "${BASE_ROOT_DIR}/ci/test/wrap-valgrind.sh" -fi - -if [ "$RUN_UNIT_TESTS" = "true" ]; then - DIR_UNIT_TEST_DATA="${DIR_UNIT_TEST_DATA}" LD_LIBRARY_PATH="${DEPENDS_DIR}/${HOST}/lib" make "${MAKEJOBS}" check VERBOSE=1 -fi - -if [ "$RUN_UNIT_TESTS_SEQUENTIAL" = "true" ]; then - DIR_UNIT_TEST_DATA="${DIR_UNIT_TEST_DATA}" LD_LIBRARY_PATH="${DEPENDS_DIR}/${HOST}/lib" "${BASE_OUTDIR}"/bin/test_bitcoin --catch_system_errors=no -l test_suite -fi - -if [ "$RUN_FUNCTIONAL_TESTS" = "true" ]; then - # shellcheck disable=SC2086 - LD_LIBRARY_PATH="${DEPENDS_DIR}/${HOST}/lib" test/functional/test_runner.py --ci "${MAKEJOBS}" --tmpdirprefix "${BASE_SCRATCH_DIR}"/test_runner/ --ansi --combinedlogslen=99999999 --timeout-factor="${TEST_RUNNER_TIMEOUT_FACTOR}" ${TEST_RUNNER_EXTRA} --quiet --failfast -fi - -if [ "${RUN_TIDY}" = "true" ]; then - cmake -B /tidy-build -DLLVM_DIR=/usr/lib/llvm-"${TIDY_LLVM_V}"/cmake -DCMAKE_BUILD_TYPE=Release -S "${BASE_ROOT_DIR}"/contrib/devtools/bitcoin-tidy - cmake --build /tidy-build "$MAKEJOBS" - cmake --build /tidy-build --target bitcoin-tidy-tests "$MAKEJOBS" - - set -eo pipefail - cd "${BASE_BUILD_DIR}/bitcoin-$HOST/src/" - if ! ( run-clang-tidy-"${TIDY_LLVM_V}" -quiet -load="/tidy-build/libbitcoin-tidy.so" "${MAKEJOBS}" | tee tmp.tidy-out.txt ); then - grep -C5 "error: " tmp.tidy-out.txt - echo "^^^ ⚠️ Failure generated from clang-tidy" - false - fi - # Filter out files by regex here, because regex may not be - # accepted in src/.bear-tidy-config - # Filter out: - # * qt qrc and moc generated files - jq 'map(select(.file | test("src/qt/qrc_.*\\.cpp$|/moc_.*\\.cpp$") | not))' ../compile_commands.json > tmp.json - mv tmp.json ../compile_commands.json - cd "${BASE_BUILD_DIR}/bitcoin-$HOST/" - python3 "/include-what-you-use/iwyu_tool.py" \ - -p . "${MAKEJOBS}" \ - -- -Xiwyu --cxx17ns -Xiwyu --mapping_file="${BASE_BUILD_DIR}/bitcoin-$HOST/contrib/devtools/iwyu/bitcoin.core.imp" \ - -Xiwyu --max_line_length=160 \ - 2>&1 | tee /tmp/iwyu_ci.out - cd "${BASE_ROOT_DIR}/src" - python3 "/include-what-you-use/fix_includes.py" --nosafe_headers < /tmp/iwyu_ci.out - git --no-pager diff -fi - -if [ "$RUN_FUZZ_TESTS" = "true" ]; then - # shellcheck disable=SC2086 - LD_LIBRARY_PATH="${DEPENDS_DIR}/${HOST}/lib" test/fuzz/test_runner.py ${FUZZ_TESTS_CONFIG} "${MAKEJOBS}" -l DEBUG "${DIR_FUZZ_IN}" --empty_min_time=60 -fi diff --git a/ci/test/07_script.sh b/ci/test/07_script.sh deleted file mode 100755 index cadb6e557e..0000000000 --- a/ci/test/07_script.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/env bash - -echo "UPLOAD ARTIFACTS" - -if [[ "$ARTIFACT_NAME" == "" ]]; then - echo "No artifacts to upload" - exit 0 -fi - -if [[ "$CIRRUS_RELEASE" == "" ]]; then - echo "Not a release. No need to deploy!" - exit 0 -fi - -if [[ "$GITHUB_TOKEN" == "" ]]; then - echo "Please provide GitHub access token via GITHUB_TOKEN environment variable!" - exit 1 -fi - -file_content_type="application/octet-stream" -fpath=$ARTIFACT_NAME - -echo "Uploading $fpath..." -name=$(basename "$RELEASE_ARTIFACT_NAME") -url_to_upload="https://uploads.github.com/repos/$CIRRUS_REPO_FULL_NAME/releases/$CIRRUS_RELEASE/assets?name=$name" -curl -X POST \ - --data-binary @$fpath \ - --header "Authorization: token $GITHUB_TOKEN" \ - --header "Content-Type: $file_content_type" \ - $url_to_upload \ No newline at end of file diff --git a/ci/test/wrap-valgrind.sh b/ci/test/wrap-valgrind.sh deleted file mode 100755 index 2775483184..0000000000 --- a/ci/test/wrap-valgrind.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright (c) 2018-2021 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -export LC_ALL=C.UTF-8 - -for b_name in "${BASE_OUTDIR}/bin"/*; do - # shellcheck disable=SC2044 - for b in $(find "${BASE_ROOT_DIR}" -executable -type f -name "$(basename "$b_name")"); do - echo "Wrap $b ..." - mv "$b" "${b}_orig" - echo '#!/usr/bin/env bash' > "$b" - echo "valgrind --gen-suppressions=all --quiet --error-exitcode=1 --suppressions=${BASE_ROOT_DIR}/contrib/valgrind.supp \"${b}_orig\" \"\$@\"" >> "$b" - chmod +x "$b" - done -done diff --git a/ci/test/wrap-wine.sh b/ci/test/wrap-wine.sh deleted file mode 100755 index 3915d6bd8a..0000000000 --- a/ci/test/wrap-wine.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright (c) 2020-2022 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -export LC_ALL=C.UTF-8 - -for b_name in {"${BASE_OUTDIR}/bin"/*,src/secp256k1/*tests,src/minisketch/test{,-verify},src/univalue/{test_json,unitester,object}}.exe; do - # shellcheck disable=SC2044 - for b in $(find "${BASE_ROOT_DIR}" -executable -type f -name "$(basename "$b_name")"); do - if (file "$b" | grep "Windows"); then - echo "Wrap $b ..." - mv "$b" "${b}_orig" - echo '#!/usr/bin/env bash' > "$b" - echo "wine64 \"${b}_orig\" \"\$@\"" >> "$b" - chmod +x "$b" - fi - done -done diff --git a/ci/test_imagefile b/ci/test_imagefile deleted file mode 100644 index f8b5eea1c8..0000000000 --- a/ci/test_imagefile +++ /dev/null @@ -1,16 +0,0 @@ -# Copyright (c) The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or https://opensource.org/license/mit/. - -# See ci/README.md for usage. - -ARG CI_IMAGE_NAME_TAG -FROM ${CI_IMAGE_NAME_TAG} - -ARG FILE_ENV -ENV FILE_ENV=${FILE_ENV} - -COPY ./ci/retry/retry /usr/bin/retry -COPY ./ci/test/00_setup_env.sh ./${FILE_ENV} ./ci/test/01_base_install.sh /ci_container_base/ci/test/ - -RUN ["bash", "-c", "cd /ci_container_base/ && set -o errexit && source ./ci/test/00_setup_env.sh && ./ci/test/01_base_install.sh"] diff --git a/ci/test_run_all.sh b/ci/test_run_all.sh deleted file mode 100755 index 3afc47b23e..0000000000 --- a/ci/test_run_all.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright (c) 2019-present The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -export LC_ALL=C.UTF-8 - -set -o errexit; source ./ci/test/00_setup_env.sh -set -o errexit -"./ci/test/02_run_container.sh" diff --git a/configure.ac b/configure.ac deleted file mode 100755 index 15a9d5ad38..0000000000 --- a/configure.ac +++ /dev/null @@ -1,1782 +0,0 @@ -AC_PREREQ([2.69]) -define(_CLIENT_VERSION_MAJOR, 0) -define(_CLIENT_VERSION_MINOR, 1) -define(_CLIENT_VERSION_BUILD, 13) -define(_CLIENT_VERSION_RC, 0) -define(_CLIENT_VERSION_IS_RELEASE, true) -define(_COPYRIGHT_YEAR, 2024) -define(_COPYRIGHT_HOLDERS,[The %s developers]) -define(_COPYRIGHT_HOLDERS_SUBSTITUTION,[[Bitgesell Core]]) -AC_INIT([Bitgesell Core],m4_join([.], _CLIENT_VERSION_MAJOR, _CLIENT_VERSION_MINOR, _CLIENT_VERSION_BUILD)m4_if(_CLIENT_VERSION_RC, [0], [], [rc]_CLIENT_VERSION_RC),[https://github.com/BitgesellOfficial/bitgesell/issues],[BGL],[https://bitgesell.ca/]) -AC_CONFIG_SRCDIR([src/validation.cpp]) -AC_CONFIG_HEADERS([src/config/BGL-config.h]) -AC_CONFIG_AUX_DIR([build-aux]) -AC_CONFIG_MACRO_DIR([build-aux/m4]) - -m4_ifndef([PKG_PROG_PKG_CONFIG], [m4_fatal([PKG_PROG_PKG_CONFIG macro not found. Please install pkg-config and re-run autogen.sh])]) -PKG_PROG_PKG_CONFIG -if test "$PKG_CONFIG" = ""; then - AC_MSG_ERROR([pkg-config not found]) -fi - -# When compiling with depends, the `PKG_CONFIG_PATH` and `PKG_CONFIG_LIBDIR` variables, -# being set in a `config.site` file, are not exported to let the `--config-cache` option -# work properly. -if test -n "$PKG_CONFIG_PATH"; then - PKG_CONFIG="env PKG_CONFIG_PATH=$PKG_CONFIG_PATH $PKG_CONFIG" -fi -if test -n "$PKG_CONFIG_LIBDIR"; then - PKG_CONFIG="env PKG_CONFIG_LIBDIR=$PKG_CONFIG_LIBDIR $PKG_CONFIG" -fi - -BGL_DAEMON_NAME=BGLd -BGL_GUI_NAME=BGL-qt -BGL_TEST_NAME=test_BGL -BGL_CLI_NAME=BGL-cli -BGL_TX_NAME=BGL-tx -BGL_UTIL_NAME=BGL-util -BGL_CHAINSTATE_NAME=BGL-chainstate -BGL_WALLET_TOOL_NAME=BGL-wallet -dnl Multi Process -BGL_MP_NODE_NAME=BGL-node -BGL_MP_GUI_NAME=BGL-gui - -dnl Unless the user specified ARFLAGS, force it to be cr -dnl This is also the default as-of libtool 2.4.7 -AC_ARG_VAR([ARFLAGS], [Flags for the archiver, defaults to if not set]) -if test "${ARFLAGS+set}" != "set"; then - ARFLAGS="cr" -fi - -AC_CANONICAL_HOST - -AH_TOP([#ifndef BGL_CONFIG_H]) -AH_TOP([#define BGL_CONFIG_H]) -AH_BOTTOM([#endif //BGL_CONFIG_H]) - -dnl Automake init set-up and checks -AM_INIT_AUTOMAKE([1.13 no-define subdir-objects foreign]) - -AM_MAINTAINER_MODE([enable]) - -dnl make the compilation flags quiet unless V=1 is used -AM_SILENT_RULES([yes]) - -dnl Compiler checks (here before libtool). -if test "${CXXFLAGS+set}" = "set"; then - CXXFLAGS_overridden=yes -else - CXXFLAGS_overridden=no -fi -AC_PROG_CXX - -dnl libtool overrides -case $host in - *mingw*) - dnl By default, libtool for mingw refuses to link static libs into a dll for - dnl fear of mixing pic/non-pic objects, and import/export complications. Since - dnl we have those under control, re-enable that functionality. - lt_cv_deplibs_check_method="pass_all" - - dnl Remove unwanted -DDLL_EXPORT from these variables. - dnl We do not use this macro, but system headers may export unwanted symbols - dnl if it's set. - lt_cv_prog_compiler_pic="-DPIC" - lt_cv_prog_compiler_pic_CXX="-DPIC" - ;; - *darwin*) - dnl Because it prints a verbose warning, lld fails the following check - dnl for "-Wl,-single_module" from libtool.m4: - dnl # If there is a non-empty error log, and "single_module" - dnl # appears in it, assume the flag caused a linker warning - dnl "-single_module" works fine on ld64 and lld, so just bypass the test. - dnl Failure to set this to "yes" causes libtool to use a very broken - dnl link-line for shared libs. - lt_cv_apple_cc_single_mod="yes" - ;; -esac - -dnl Require C++20 compiler (no GNU extensions) -AX_CXX_COMPILE_STDCXX([20], [noext], [mandatory]) - -dnl Unless the user specified OBJCXX, force it to be the same as CXX. This ensures -dnl that we get the same -std flags for both. -m4_ifdef([AC_PROG_OBJCXX],[ -if test "${OBJCXX+set}" = ""; then - OBJCXX="${CXX}" -fi -AC_PROG_OBJCXX -]) - -dnl OpenBSD ships with 2.4.2 -LT_PREREQ([2.4.2]) -dnl Libtool init checks. -LT_INIT([pic-only win32-dll]) - -dnl Check/return PATH for base programs. -AC_PATH_TOOL([AR], [ar]) -AC_PATH_TOOL([GCOV], [gcov]) -AC_PATH_TOOL([LLVM_COV], [llvm-cov]) -AC_PATH_PROG([LCOV], [lcov]) -dnl The minimum supported version is specified in .python-version and should be used if available, see doc/dependencies.md -AC_PATH_PROGS([PYTHON], [python3.9 python3.10 python3.11 python3.12 python3 python]) -AC_PATH_PROG([GENHTML], [genhtml]) -AC_PATH_PROG([GIT], [git]) -AC_PATH_PROG([CCACHE], [ccache]) -AC_PATH_PROG([XGETTEXT], [xgettext]) -AC_PATH_PROG([HEXDUMP], [hexdump]) -AC_PATH_TOOL([OBJDUMP], [objdump]) -AC_PATH_TOOL([OBJCOPY], [objcopy]) -AC_PATH_PROG([DOXYGEN], [doxygen]) -AM_CONDITIONAL([HAVE_DOXYGEN], [test -n "$DOXYGEN"]) - -AC_ARG_ENABLE([wallet], - [AS_HELP_STRING([--disable-wallet], - [disable wallet (enabled by default)])], - [enable_wallet=$enableval], - [enable_wallet=auto]) - -AC_ARG_WITH([sqlite], - [AS_HELP_STRING([--with-sqlite=yes|no|auto], - [enable sqlite wallet support (default: auto, i.e., enabled if wallet is enabled and sqlite is found)])], - [use_sqlite=$withval], - [use_sqlite=auto]) - -AC_ARG_WITH([bdb], - [AS_HELP_STRING([--without-bdb], - [disable bdb wallet support (default is enabled if wallet is enabled)])], - [use_bdb=$withval], - [use_bdb=auto]) - -AC_ARG_ENABLE([usdt], - [AS_HELP_STRING([--enable-usdt], - [enable tracepoints for Userspace, Statically Defined Tracing (default is yes if sys/sdt.h is found)])], - [use_usdt=$enableval], - [use_usdt=yes]) - -AC_ARG_WITH([miniupnpc], - [AS_HELP_STRING([--with-miniupnpc], - [enable UPNP (default is yes if libminiupnpc is found)])], - [use_upnp=$withval], - [use_upnp=auto]) - -AC_ARG_WITH([natpmp], - [AS_HELP_STRING([--with-natpmp], - [enable NAT-PMP (default is yes if libnatpmp is found)])], - [use_natpmp=$withval], - [use_natpmp=auto]) - -AC_ARG_ENABLE(tests, - AS_HELP_STRING([--disable-tests],[do not compile tests (default is to compile)]), - [use_tests=$enableval], - [use_tests=yes]) - -AC_ARG_ENABLE(gui-tests, - AS_HELP_STRING([--disable-gui-tests],[do not compile GUI tests (default is to compile if GUI and tests enabled)]), - [use_gui_tests=$enableval], - [use_gui_tests=$use_tests]) - -AC_ARG_ENABLE(bench, - AS_HELP_STRING([--disable-bench],[do not compile benchmarks (default is to compile)]), - [use_bench=$enableval], - [use_bench=yes]) - -AC_ARG_ENABLE([extended-functional-tests], - AS_HELP_STRING([--enable-extended-functional-tests],[enable expensive functional tests when using lcov (default no)]), - [use_extended_functional_tests=$enableval], - [use_extended_functional_tests=no]) - -AC_ARG_ENABLE([fuzz], - AS_HELP_STRING([--enable-fuzz], - [build for fuzzing (default no). enabling this will disable all other targets and override --{enable,disable}-fuzz-binary]), - [enable_fuzz=$enableval], - [enable_fuzz=no]) - -AC_ARG_ENABLE([fuzz-binary], - AS_HELP_STRING([--enable-fuzz-binary], - [enable building of fuzz binary (default yes).]), - [enable_fuzz_binary=$enableval], - [enable_fuzz_binary=yes]) - -AC_ARG_WITH([qrencode], - [AS_HELP_STRING([--with-qrencode], - [enable QR code support (default is yes if qt is enabled and libqrencode is found)])], - [use_qr=$withval], - [use_qr=auto]) - -AC_ARG_ENABLE([hardening], - [AS_HELP_STRING([--disable-hardening], - [do not attempt to harden the resulting executables (default is to harden)])], - [use_hardening=$enableval], - [use_hardening=yes]) - -AC_ARG_ENABLE([reduce-exports], - [AS_HELP_STRING([--enable-reduce-exports], - [attempt to reduce exported symbols in the resulting executables (default is no)])], - [use_reduce_exports=$enableval], - [use_reduce_exports=no]) - -AC_ARG_ENABLE([ccache], - [AS_HELP_STRING([--disable-ccache], - [do not use ccache for building (default is to use if found)])], - [use_ccache=$enableval], - [use_ccache=auto]) - -dnl Suppress warnings from external headers (e.g. Boost, Qt). -dnl May be useful if warnings from external headers clutter the build output -dnl too much, so that it becomes difficult to spot Bitgesell Core warnings -dnl or if they cause a build failure with --enable-werror. -AC_ARG_ENABLE([suppress-external-warnings], - [AS_HELP_STRING([--disable-suppress-external-warnings], - [Do not suppress warnings from external headers (default is to suppress)])], - [suppress_external_warnings=$enableval], - [suppress_external_warnings=yes]) - -AC_ARG_ENABLE([lcov], - [AS_HELP_STRING([--enable-lcov], - [enable lcov testing (default is no)])], - [use_lcov=$enableval], - [use_lcov=no]) - -AC_ARG_ENABLE([zmq], - [AS_HELP_STRING([--disable-zmq], - [disable ZMQ notifications])], - [use_zmq=$enableval], - [use_zmq=yes]) - -AC_ARG_WITH([libmultiprocess], - [AS_HELP_STRING([--with-libmultiprocess=yes|no|auto], - [Build with libmultiprocess library. (default: auto, i.e. detect with pkg-config)])], - [with_libmultiprocess=$withval], - [with_libmultiprocess=auto]) - -AC_ARG_WITH([mpgen], - [AS_HELP_STRING([--with-mpgen=yes|no|auto|PREFIX], - [Build with libmultiprocess codegen tool. Useful to specify different libmultiprocess host system library and build system codegen tool prefixes when cross-compiling (default is host system libmultiprocess prefix)])], - [with_mpgen=$withval], - [with_mpgen=auto]) - -AC_ARG_ENABLE([multiprocess], - [AS_HELP_STRING([--enable-multiprocess], - [build multiprocess BGL-node, BGL-wallet, and BGL-gui executables in addition to monolithic BGLd and BGL-qt executables. Requires libmultiprocess library. Experimental (default is no)])], - [enable_multiprocess=$enableval], - [enable_multiprocess=no]) - -AC_ARG_ENABLE(man, - [AS_HELP_STRING([--disable-man], - [do not install man pages (default is to install)])],, - enable_man=yes) -AM_CONDITIONAL([ENABLE_MAN], [test "$enable_man" != "no"]) - -dnl Enable debug -AC_ARG_ENABLE([debug], - [AS_HELP_STRING([--enable-debug], - [use compiler flags and macros suited for debugging (default is no)])], - [enable_debug=$enableval], - [enable_debug=no]) - -dnl Enable different -fsanitize options -AC_ARG_WITH([sanitizers], - [AS_HELP_STRING([--with-sanitizers], - [comma separated list of extra sanitizers to build with (default is none enabled)])], - [use_sanitizers=$withval]) - -dnl Turn warnings into errors -AC_ARG_ENABLE([werror], - [AS_HELP_STRING([--enable-werror], - [Treat compiler warnings as errors (default is no)])], - [enable_werror=$enableval], - [enable_werror=no]) - -AC_ARG_ENABLE([external-signer], - [AS_HELP_STRING([--enable-external-signer],[compile external signer support (default is yes)])], - [use_external_signer=$enableval], - [use_external_signer=yes]) - -AC_LANG_PUSH([C++]) - -dnl Always set -g -O2 in our CXXFLAGS. Autoconf will try and set CXXFLAGS to "-g -O2" by default, -dnl so we suppress that (if CXXFLAGS hasn't been overridden by the user), given we are adding it -dnl ourselves. -CORE_CXXFLAGS="$CORE_CXXFLAGS -g -O2" - -if test "$CXXFLAGS_overridden" = "no"; then - CXXFLAGS="" -fi - -dnl Check for a flag to turn compiler warnings into errors. This is helpful for checks which may -dnl appear to succeed because by default they merely emit warnings when they fail. -dnl -dnl Note that this is not necessarily a check to see if -Werror is supported, but rather to see if -dnl a compile with -Werror can succeed. This is important because the compiler may already be -dnl warning about something unrelated, for example about some path issue. If that is the case, -dnl -Werror cannot be used because all of those warnings would be turned into errors. -AX_CHECK_COMPILE_FLAG([-Werror], [CXXFLAG_WERROR="-Werror"], [CXXFLAG_WERROR=""]) - -dnl Check for a flag to turn linker warnings into errors. When flags are passed to linkers via the -dnl compiler driver using a -Wl,-foo flag, linker warnings may be swallowed rather than bubbling up. -dnl See note above, the same applies here as well. -dnl -dnl LDFLAG_WERROR Should only be used when testing -Wl,* -case $host in - *darwin*) - AX_CHECK_LINK_FLAG([-Wl,-fatal_warnings], [LDFLAG_WERROR="-Wl,-fatal_warnings"], [LDFLAG_WERROR=""]) - ;; - *) - AX_CHECK_LINK_FLAG([-Wl,--fatal-warnings], [LDFLAG_WERROR="-Wl,--fatal-warnings"], [LDFLAG_WERROR=""]) - ;; -esac - -if test "$enable_debug" = "yes"; then - - dnl Disable all optimizations - AX_CHECK_COMPILE_FLAG([-O0], [DEBUG_CXXFLAGS="$DEBUG_CXXFLAGS -O0"], [], [$CXXFLAG_WERROR]) - - dnl Prefer -g3, fall back to -g if that is unavailable. - AX_CHECK_COMPILE_FLAG( - [-g3], - [DEBUG_CXXFLAGS="$DEBUG_CXXFLAGS -g3"], - [AX_CHECK_COMPILE_FLAG([-g], [DEBUG_CXXFLAGS="$DEBUG_CXXFLAGS -g"], [], [$CXXFLAG_WERROR])], - [$CXXFLAG_WERROR]) - - AX_CHECK_PREPROC_FLAG([-DDEBUG], [DEBUG_CPPFLAGS="$DEBUG_CPPFLAGS -DDEBUG"], [], [$CXXFLAG_WERROR]) - AX_CHECK_PREPROC_FLAG([-DDEBUG_LOCKORDER], [DEBUG_CPPFLAGS="$DEBUG_CPPFLAGS -DDEBUG_LOCKORDER"], [], [$CXXFLAG_WERROR]) - AX_CHECK_PREPROC_FLAG([-DDEBUG_LOCKCONTENTION], [DEBUG_CPPFLAGS="$DEBUG_CPPFLAGS -DDEBUG_LOCKCONTENTION"], [], [$CXXFLAG_WERROR]) - AX_CHECK_PREPROC_FLAG([-DRPC_DOC_CHECK], [DEBUG_CPPFLAGS="$DEBUG_CPPFLAGS -DRPC_DOC_CHECK"], [], [$CXXFLAG_WERROR]) - AX_CHECK_PREPROC_FLAG([-DABORT_ON_FAILED_ASSUME], [DEBUG_CPPFLAGS="$DEBUG_CPPFLAGS -DABORT_ON_FAILED_ASSUME"], [], [$CXXFLAG_WERROR]) - AX_CHECK_COMPILE_FLAG([-ftrapv], [DEBUG_CXXFLAGS="$DEBUG_CXXFLAGS -ftrapv"], [], [$CXXFLAG_WERROR]) -fi - -if test "$use_sanitizers" != ""; then - dnl First check if the compiler accepts flags. If an incompatible pair like - dnl -fsanitize=address,thread is used here, this check will fail. This will also - dnl fail if a bad argument is passed, e.g. -fsanitize=undfeined - AX_CHECK_COMPILE_FLAG( - [-fsanitize=$use_sanitizers], - [SANITIZER_CXXFLAGS="-fsanitize=$use_sanitizers" - SANITIZER_CFLAGS="-fsanitize=$use_sanitizers"], - [AC_MSG_ERROR([compiler did not accept requested flags])]) - - dnl Some compilers (e.g. GCC) require additional libraries like libasan, - dnl libtsan, libubsan, etc. Make sure linking still works with the sanitize - dnl flag. This is a separate check so we can give a better error message when - dnl the sanitize flags are supported by the compiler but the actual sanitizer - dnl libs are missing. - AX_CHECK_LINK_FLAG( - [-fsanitize=$use_sanitizers], - [SANITIZER_LDFLAGS="-fsanitize=$use_sanitizers"], - [AC_MSG_ERROR([linker did not accept requested flags, you are missing required libraries])], - [], - [AC_LANG_PROGRAM([[ - #include - #include - extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { return 0; } - __attribute__((weak)) // allow for libFuzzer linking - ]],[[]])]) -fi - -ERROR_CXXFLAGS= -if test "$enable_werror" = "yes"; then - if test "$CXXFLAG_WERROR" = ""; then - AC_MSG_ERROR([enable-werror set but -Werror is not usable]) - fi - ERROR_CXXFLAGS=$CXXFLAG_WERROR -fi - -AX_CHECK_COMPILE_FLAG([-Wall], [WARN_CXXFLAGS="$WARN_CXXFLAGS -Wall"], [], [$CXXFLAG_WERROR]) -AX_CHECK_COMPILE_FLAG([-Wextra], [WARN_CXXFLAGS="$WARN_CXXFLAGS -Wextra"], [], [$CXXFLAG_WERROR]) -AX_CHECK_COMPILE_FLAG([-Wgnu], [WARN_CXXFLAGS="$WARN_CXXFLAGS -Wgnu"], [], [$CXXFLAG_WERROR]) -dnl some compilers will ignore -Wformat-security without -Wformat, so just combine the two here. -AX_CHECK_COMPILE_FLAG([-Wformat -Wformat-security], [WARN_CXXFLAGS="$WARN_CXXFLAGS -Wformat -Wformat-security"], [], [$CXXFLAG_WERROR]) -AX_CHECK_COMPILE_FLAG([-Wvla], [WARN_CXXFLAGS="$WARN_CXXFLAGS -Wvla"], [], [$CXXFLAG_WERROR]) -AX_CHECK_COMPILE_FLAG([-Wshadow-field], [WARN_CXXFLAGS="$WARN_CXXFLAGS -Wshadow-field"], [], [$CXXFLAG_WERROR]) -AX_CHECK_COMPILE_FLAG([-Wthread-safety], [WARN_CXXFLAGS="$WARN_CXXFLAGS -Wthread-safety"], [], [$CXXFLAG_WERROR]) -AX_CHECK_COMPILE_FLAG([-Wloop-analysis], [WARN_CXXFLAGS="$WARN_CXXFLAGS -Wloop-analysis"], [], [$CXXFLAG_WERROR]) -AX_CHECK_COMPILE_FLAG([-Wredundant-decls], [WARN_CXXFLAGS="$WARN_CXXFLAGS -Wredundant-decls"], [], [$CXXFLAG_WERROR]) -AX_CHECK_COMPILE_FLAG([-Wunused-member-function], [WARN_CXXFLAGS="$WARN_CXXFLAGS -Wunused-member-function"], [], [$CXXFLAG_WERROR]) -AX_CHECK_COMPILE_FLAG([-Wdate-time], [WARN_CXXFLAGS="$WARN_CXXFLAGS -Wdate-time"], [], [$CXXFLAG_WERROR]) -AX_CHECK_COMPILE_FLAG([-Wconditional-uninitialized], [WARN_CXXFLAGS="$WARN_CXXFLAGS -Wconditional-uninitialized"], [], [$CXXFLAG_WERROR]) -AX_CHECK_COMPILE_FLAG([-Wduplicated-branches], [WARN_CXXFLAGS="$WARN_CXXFLAGS -Wduplicated-branches"], [], [$CXXFLAG_WERROR]) -AX_CHECK_COMPILE_FLAG([-Wduplicated-cond], [WARN_CXXFLAGS="$WARN_CXXFLAGS -Wduplicated-cond"], [], [$CXXFLAG_WERROR]) -AX_CHECK_COMPILE_FLAG([-Wlogical-op], [WARN_CXXFLAGS="$WARN_CXXFLAGS -Wlogical-op"], [], [$CXXFLAG_WERROR]) -AX_CHECK_COMPILE_FLAG([-Woverloaded-virtual], [WARN_CXXFLAGS="$WARN_CXXFLAGS -Woverloaded-virtual"], [], [$CXXFLAG_WERROR]) -AX_CHECK_COMPILE_FLAG([-Wsuggest-override], [WARN_CXXFLAGS="$WARN_CXXFLAGS -Wsuggest-override"], [], [$CXXFLAG_WERROR]) -AX_CHECK_COMPILE_FLAG([-Wimplicit-fallthrough], [WARN_CXXFLAGS="$WARN_CXXFLAGS -Wimplicit-fallthrough"], [], [$CXXFLAG_WERROR]) -AX_CHECK_COMPILE_FLAG([-Wunreachable-code], [WARN_CXXFLAGS="$WARN_CXXFLAGS -Wunreachable-code"], [], [$CXXFLAG_WERROR]) -AX_CHECK_COMPILE_FLAG([-Wdocumentation], [WARN_CXXFLAGS="$WARN_CXXFLAGS -Wdocumentation"], [], [$CXXFLAG_WERROR]) -AX_CHECK_COMPILE_FLAG([-Wself-assign], [WARN_CXXFLAGS="$WARN_CXXFLAGS -Wself-assign"], [], [$CXXFLAG_WERROR]) - -dnl Some compilers (gcc) ignore unknown -Wno-* options, but warn about all -dnl unknown options if any other warning is produced. Test the -Wfoo case, and -dnl set the -Wno-foo case if it works. -AX_CHECK_COMPILE_FLAG([-Wunused-parameter], [NOWARN_CXXFLAGS="$NOWARN_CXXFLAGS -Wno-unused-parameter"], [], [$CXXFLAG_WERROR]) - -dnl Don't allow extended (non-ASCII) symbols in identifiers. This is easier for code review. -AX_CHECK_COMPILE_FLAG([-fno-extended-identifiers], [CORE_CXXFLAGS="$CORE_CXXFLAGS -fno-extended-identifiers"], [], [$CXXFLAG_WERROR]) - -dnl Currently all versions of gcc are subject to a class of bugs, see the -dnl gccbug_90348 test case (only reproduces on GCC 11 and earlier) and -dnl https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111843. To work around that, set -dnl -fstack-reuse=none for all gcc builds. (Only gcc understands this flag) -AX_CHECK_COMPILE_FLAG([-fstack-reuse=none], [CORE_CXXFLAGS="$CORE_CXXFLAGS -fstack-reuse=none"]) - -enable_arm_crc=no -enable_arm_shani=no -enable_sse42=no -enable_sse41=no -enable_avx2=no -enable_x86_shani=no - -dnl Check for optional instruction set support. Enabling these does _not_ imply that all code will -dnl be compiled with them, rather that specific objects/libs may use them after checking for runtime -dnl compatibility. - -dnl x86 -AX_CHECK_COMPILE_FLAG([-msse4.2], [SSE42_CXXFLAGS="-msse4.2"], [], [$CXXFLAG_WERROR]) -AX_CHECK_COMPILE_FLAG([-msse4.1], [SSE41_CXXFLAGS="-msse4.1"], [], [$CXXFLAG_WERROR]) -AX_CHECK_COMPILE_FLAG([-mavx -mavx2], [AVX2_CXXFLAGS="-mavx -mavx2"], [], [$CXXFLAG_WERROR]) -AX_CHECK_COMPILE_FLAG([-msse4 -msha], [X86_SHANI_CXXFLAGS="-msse4 -msha"], [], [$CXXFLAG_WERROR]) - -enable_clmul= -AX_CHECK_COMPILE_FLAG([-mpclmul], [enable_clmul=yes], [], [$CXXFLAG_WERROR], [AC_LANG_PROGRAM([ - #include - #include -], [ - __m128i a = _mm_cvtsi64_si128((uint64_t)7); - __m128i b = _mm_clmulepi64_si128(a, a, 37); - __m128i c = _mm_srli_epi64(b, 41); - __m128i d = _mm_xor_si128(b, c); - uint64_t e = _mm_cvtsi128_si64(d); - return e == 0; -])]) - -if test "$enable_clmul" = "yes"; then - CLMUL_CXXFLAGS="-mpclmul" - AC_DEFINE([HAVE_CLMUL], [1], [Define this symbol if clmul instructions can be used]) -fi - -TEMP_CXXFLAGS="$CXXFLAGS" -CXXFLAGS="$SSE42_CXXFLAGS $CXXFLAGS" -AC_MSG_CHECKING([for SSE4.2 intrinsics]) -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - #include - #if defined(_MSC_VER) - #include - #elif defined(__GNUC__) && defined(__SSE4_2__) - #include - #endif - ]],[[ - uint64_t l = 0; - l = _mm_crc32_u8(l, 0); - l = _mm_crc32_u32(l, 0); - l = _mm_crc32_u64(l, 0); - return l; - ]])], - [ AC_MSG_RESULT([yes]); enable_sse42=yes], - [ AC_MSG_RESULT([no])] -) -CXXFLAGS="$TEMP_CXXFLAGS" - -TEMP_CXXFLAGS="$CXXFLAGS" -CXXFLAGS="$SSE41_CXXFLAGS $CXXFLAGS" -AC_MSG_CHECKING([for SSE4.1 intrinsics]) -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - #include - #include - ]],[[ - __m128i l = _mm_set1_epi32(0); - return _mm_extract_epi32(l, 3); - ]])], - [ AC_MSG_RESULT([yes]); enable_sse41=yes; AC_DEFINE([ENABLE_SSE41], [1], [Define this symbol to build code that uses SSE4.1 intrinsics]) ], - [ AC_MSG_RESULT([no])] -) -CXXFLAGS="$TEMP_CXXFLAGS" - -TEMP_CXXFLAGS="$CXXFLAGS" -CXXFLAGS="$AVX2_CXXFLAGS $CXXFLAGS" -AC_MSG_CHECKING([for AVX2 intrinsics]) -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - #include - #include - ]],[[ - __m256i l = _mm256_set1_epi32(0); - return _mm256_extract_epi32(l, 7); - ]])], - [ AC_MSG_RESULT([yes]); enable_avx2=yes; AC_DEFINE([ENABLE_AVX2], [1], [Define this symbol to build code that uses AVX2 intrinsics]) ], - [ AC_MSG_RESULT([no])] -) -CXXFLAGS="$TEMP_CXXFLAGS" - -TEMP_CXXFLAGS="$CXXFLAGS" -CXXFLAGS="$X86_SHANI_CXXFLAGS $CXXFLAGS" -AC_MSG_CHECKING([for x86 SHA-NI intrinsics]) -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - #include - #include - ]],[[ - __m128i i = _mm_set1_epi32(0); - __m128i j = _mm_set1_epi32(1); - __m128i k = _mm_set1_epi32(2); - return _mm_extract_epi32(_mm_sha256rnds2_epu32(i, i, k), 0); - ]])], - [ AC_MSG_RESULT([yes]); enable_x86_shani=yes; AC_DEFINE([ENABLE_X86_SHANI], [1], [Define this symbol to build code that uses x86 SHA-NI intrinsics]) ], - [ AC_MSG_RESULT([no])] -) -CXXFLAGS="$TEMP_CXXFLAGS" - -# ARM -AX_CHECK_COMPILE_FLAG([-march=armv8-a+crc+crypto], [ARM_CRC_CXXFLAGS="-march=armv8-a+crc+crypto"], [], [$CXXFLAG_WERROR]) -AX_CHECK_COMPILE_FLAG([-march=armv8-a+crypto], [ARM_SHANI_CXXFLAGS="-march=armv8-a+crypto"], [], [$CXXFLAG_WERROR]) - -TEMP_CXXFLAGS="$CXXFLAGS" -CXXFLAGS="$ARM_CRC_CXXFLAGS $CXXFLAGS" -AC_MSG_CHECKING([for ARMv8 CRC32 intrinsics]) -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - #include - #include - ]],[[ -#ifdef __aarch64__ - __crc32cb(0, 0); __crc32ch(0, 0); __crc32cw(0, 0); __crc32cd(0, 0); - vmull_p64(0, 0); -#else -#error "crc32c library does not support hardware acceleration on 32-bit ARM" -#endif - ]])], - [ AC_MSG_RESULT([yes]); enable_arm_crc=yes; ], - [ AC_MSG_RESULT([no])] -) -CXXFLAGS="$TEMP_CXXFLAGS" - -TEMP_CXXFLAGS="$CXXFLAGS" -CXXFLAGS="$ARM_SHANI_CXXFLAGS $CXXFLAGS" -AC_MSG_CHECKING([for ARMv8 SHA-NI intrinsics]) -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - #include - #include - ]],[[ - uint32x4_t a, b, c; - vsha256h2q_u32(a, b, c); - vsha256hq_u32(a, b, c); - vsha256su0q_u32(a, b); - vsha256su1q_u32(a, b, c); - ]])], - [ AC_MSG_RESULT([yes]); enable_arm_shani=yes; AC_DEFINE([ENABLE_ARM_SHANI], [1], [Define this symbol to build code that uses ARMv8 SHA-NI intrinsics]) ], - [ AC_MSG_RESULT([no])] -) -CXXFLAGS="$TEMP_CXXFLAGS" - -CORE_CPPFLAGS="$CORE_CPPFLAGS -DHAVE_BUILD_INFO" - -AC_ARG_WITH([utils], - [AS_HELP_STRING([--with-utils], - [build BGL-cli BGL-tx BGL-util BGL-wallet (default=yes)])], - [build_BGL_utils=$withval], - [build_BGL_utils=yes]) - -AC_ARG_ENABLE([util-cli], - [AS_HELP_STRING([--enable-util-cli], - [build BGL-cli])], - [build_BGL_cli=$enableval], - [build_BGL_cli=$build_BGL_utils]) - -AC_ARG_ENABLE([util-tx], - [AS_HELP_STRING([--enable-util-tx], - [build BGL-tx])], - [build_BGL_tx=$enableval], - [build_BGL_tx=$build_BGL_utils]) - -AC_ARG_ENABLE([util-wallet], - [AS_HELP_STRING([--enable-util-wallet], - [build BGL-wallet])], - [build_BGL_wallet=$enableval], - [build_BGL_wallet=$build_BGL_utils]) - -AC_ARG_ENABLE([util-util], - [AS_HELP_STRING([--enable-util-util], - [build BGL-util])], - [build_BGL_util=$enableval], - [build_BGL_util=$build_BGL_utils]) - -AC_ARG_ENABLE([experimental-util-chainstate], - [AS_HELP_STRING([--enable-experimental-util-chainstate], - [build experimental BGL-chainstate executable (default=no)])], - [build_BGL_chainstate=$enableval], - [build_BGL_chainstate=no]) - -AC_ARG_WITH([experimental-kernel-lib], - [AS_HELP_STRING([--with-experimental-kernel-lib], - [build experimental BGLkernel library (default is to build if we're building the experimental build-chainstate executable)])], - [build_experimental_kernel_lib=$withval], - [build_experimental_kernel_lib=auto]) - -AC_ARG_WITH([daemon], - [AS_HELP_STRING([--with-daemon], - [build BGLd daemon (default=yes)])], - [build_BGLd=$withval], - [build_BGLd=yes]) - -case $host in - *mingw*) - TARGET_OS=windows - AC_CHECK_LIB([kernel32], [GetModuleFileNameA], [], [AC_MSG_ERROR([libkernel32 missing])]) - AC_CHECK_LIB([user32], [main], [], [AC_MSG_ERROR([libuser32 missing])]) - AC_CHECK_LIB([gdi32], [main], [], [AC_MSG_ERROR([libgdi32 missing])]) - AC_CHECK_LIB([comdlg32], [main], [], [AC_MSG_ERROR([libcomdlg32 missing])]) - AC_CHECK_LIB([winmm], [main], [], [AC_MSG_ERROR([libwinmm missing])]) - AC_CHECK_LIB([shell32], [SHGetSpecialFolderPathW], [], [AC_MSG_ERROR([libshell32 missing])]) - AC_CHECK_LIB([comctl32], [main], [], [AC_MSG_ERROR([libcomctl32 missing])]) - AC_CHECK_LIB([ole32], [CoCreateInstance], [], [AC_MSG_ERROR([libole32 missing])]) - AC_CHECK_LIB([oleaut32], [main], [], [AC_MSG_ERROR([liboleaut32 missing])]) - AC_CHECK_LIB([uuid], [main], [], [AC_MSG_ERROR([libuuid missing])]) - AC_CHECK_LIB([advapi32], [CryptAcquireContextW], [], [AC_MSG_ERROR([libadvapi32 missing])]) - AC_CHECK_LIB([ws2_32], [WSAStartup], [], [AC_MSG_ERROR([libws2_32 missing])]) - AC_CHECK_LIB([shlwapi], [PathRemoveFileSpecW], [], [AC_MSG_ERROR([libshlwapi missing])]) - AC_CHECK_LIB([iphlpapi], [GetAdaptersAddresses], [], [AC_MSG_ERROR([libiphlpapi missing])]) - - dnl -static is interpreted by libtool, where it has a different meaning. - dnl In libtool-speak, it's -all-static. - AX_CHECK_LINK_FLAG([-static], [LIBTOOL_APP_LDFLAGS="$LIBTOOL_APP_LDFLAGS -all-static"]) - - AC_PATH_PROG([MAKENSIS], [makensis], [none]) - if test "$MAKENSIS" = "none"; then - AC_MSG_WARN([makensis not found. Cannot create installer.]) - fi - - AC_PATH_TOOL([WINDRES], [windres], [none]) - if test "$WINDRES" = "none"; then - AC_MSG_ERROR([windres not found]) - fi - - CORE_CPPFLAGS="$CORE_CPPFLAGS -DSECP256K1_STATIC" - - CORE_CPPFLAGS="$CORE_CPPFLAGS -D_MT -DWIN32 -D_WINDOWS -D_WIN32_WINNT=0x0601 -D_WIN32_IE=0x0501 -DWIN32_LEAN_AND_MEAN" - dnl Prevent the definition of min/max macros. - dnl We always want to use the standard library. - CORE_CPPFLAGS="$CORE_CPPFLAGS -DNOMINMAX" - - dnl libtool insists upon adding -nostdlib and a list of objects/libs to link against. - dnl That breaks our ability to build dll's with static libgcc/libstdc++/libssp. Override - dnl its command here, with the predeps/postdeps removed, and -static inserted. Postdeps are - dnl also overridden to prevent their insertion later. - dnl This should only affect dll's. - archive_cmds_CXX="\$CC -shared \$libobjs \$deplibs \$compiler_flags -static -o \$output_objdir/\$soname \${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker \$lib" - postdeps_CXX= - - dnl We require Windows 7 (NT 6.1) or later - AX_CHECK_LINK_FLAG([-Wl,--major-subsystem-version -Wl,6 -Wl,--minor-subsystem-version -Wl,1], [CORE_LDFLAGS="$CORE_LDFLAGS -Wl,--major-subsystem-version -Wl,6 -Wl,--minor-subsystem-version -Wl,1"], [], [$LDFLAG_WERROR]) - - dnl Avoid the use of aligned vector instructions when building for Windows. - dnl See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54412. - AX_CHECK_COMPILE_FLAG([-Wa,-muse-unaligned-vector-move], [CORE_CXXFLAGS="$CORE_CXXFLAGS -Wa,-muse-unaligned-vector-move"], [], [$CXXFLAG_WERROR]) - ;; - *darwin*) - TARGET_OS=darwin - if test $cross_compiling != "yes"; then - BUILD_OS=darwin - - AX_CHECK_LINK_FLAG([-Wl,-headerpad_max_install_names], [CORE_LDFLAGS="$CORE_LDFLAGS -Wl,-headerpad_max_install_names"], [], [$LDFLAG_WERROR]) - - AC_CHECK_PROG([BREW], [brew], [brew]) - if test "$BREW" = "brew"; then - dnl These Homebrew packages may be keg-only, meaning that they won't be found - dnl in expected paths because they may conflict with system files. Ask - dnl Homebrew where each one is located, then adjust paths accordingly. - dnl It's safe to add these paths even if the functionality is disabled by - dnl the user (--without-wallet or --without-gui for example). - - dnl Homebrew may create symlinks in /usr/local/include for some packages. - dnl Because MacOS's clang internally adds "-I /usr/local/include" to its search - dnl paths, this will negate efforts to use -isystem for those packages, as they - dnl will be found first in /usr/local. Use the internal "-internal-isystem" - dnl option to system-ify all /usr/local/include paths without adding it to the list - dnl of search paths in case it's not already there. - if test "$suppress_external_warnings" != "no"; then - AX_CHECK_PREPROC_FLAG([-Xclang -internal-isystem -Xclang /usr/local/include/], [CORE_CPPFLAGS="$CORE_CPPFLAGS -Xclang -internal-isystem -Xclang /usr/local/include/"], [], [$CXXFLAG_WERROR]) - fi - - if test "$use_bdb" != "no" && $BREW list --versions berkeley-db@4 >/dev/null && test "$BDB_CFLAGS" = "" && test "$BDB_LIBS" = ""; then - bdb_prefix=$($BREW --prefix berkeley-db@4 2>/dev/null) - dnl This must precede the call to BGL_FIND_BDB48 below. - BDB_CFLAGS="-I$bdb_prefix/include" - BDB_LIBS="-L$bdb_prefix/lib -ldb_cxx-4.8" - fi - - if $BREW list --versions qt@5 >/dev/null; then - export PKG_CONFIG_PATH="$($BREW --prefix qt@5 2>/dev/null)/lib/pkgconfig:$PKG_CONFIG_PATH" - fi - - case $host in - *aarch64*) - dnl The preferred Homebrew prefix for Apple Silicon is /opt/homebrew. - dnl Therefore, as we do not use pkg-config to detect miniupnpc and libnatpmp - dnl packages, we should set the CPPFLAGS and LDFLAGS variables for them - dnl explicitly. - if test "$use_upnp" != "no" && $BREW list --versions miniupnpc >/dev/null; then - miniupnpc_prefix=$($BREW --prefix miniupnpc 2>/dev/null) - if test "$suppress_external_warnings" != "no"; then - MINIUPNPC_CPPFLAGS="-isystem $miniupnpc_prefix/include" - else - MINIUPNPC_CPPFLAGS="-I$miniupnpc_prefix/include" - fi - MINIUPNPC_LIBS="-L$miniupnpc_prefix/lib" - fi - if test "$use_natpmp" != "no" && $BREW list --versions libnatpmp >/dev/null; then - libnatpmp_prefix=$($BREW --prefix libnatpmp 2>/dev/null) - if test "$suppress_external_warnings" != "no"; then - NATPMP_CPPFLAGS="-isystem $libnatpmp_prefix/include" - else - NATPMP_CPPFLAGS="-I$libnatpmp_prefix/include" - fi - NATPMP_LIBS="-L$libnatpmp_prefix/lib" - fi - ;; - esac - fi - else - case $build_os in - *darwin*) - BUILD_OS=darwin - ;; - *) - AC_PATH_TOOL([DSYMUTIL], [dsymutil], [dsymutil]) - AC_PATH_PROG([ZIP], [zip], [zip]) - - dnl libtool will try to strip the static lib, which is a problem for - dnl cross-builds because strip attempts to call a hard-coded ld, - dnl which may not exist in the path. Stripping the .a is not - dnl necessary, so just disable it. - old_striplib= - ;; - esac - fi - - CORE_CPPFLAGS="$CORE_CPPFLAGS -DMAC_OSX -DOBJC_OLD_DISPATCH_PROTOTYPES=0" - - dnl ignore deprecated-declarations warnings coming from objcxx code - dnl "'NSUserNotificationCenter' is deprecated: first deprecated in macOS 11.0". - OBJCXXFLAGS="$CXXFLAGS -Wno-deprecated-declarations" - ;; - *linux*) - TARGET_OS=linux - ;; -esac - -if test "$use_extended_functional_tests" != "no"; then - AC_SUBST(EXTENDED_FUNCTIONAL_TESTS, --extended) -fi - -if test "$use_lcov" = "yes"; then - if test "$LCOV" = ""; then - AC_MSG_ERROR([lcov testing requested but lcov not found]) - fi - if test "$PYTHON" = ""; then - AC_MSG_ERROR([lcov testing requested but python not found]) - fi - if test "$GENHTML" = ""; then - AC_MSG_ERROR([lcov testing requested but genhtml not found]) - fi - - AC_MSG_CHECKING([whether compiler is Clang]) - AC_PREPROC_IFELSE([AC_LANG_SOURCE([[ - #if defined(__clang__) && defined(__llvm__) - // Compiler is Clang - #else - # error Compiler is not Clang - #endif - ]])],[ - AC_MSG_RESULT([yes]) - if test "$LLVM_COV" = ""; then - AC_MSG_ERROR([lcov testing requested but llvm-cov not found]) - fi - COV_TOOL="$LLVM_COV gcov" - ],[ - AC_MSG_RESULT([no]) - if test "$GCOV" = "x"; then - AC_MSG_ERROR([lcov testing requested but gcov not found]) - fi - COV_TOOL="$GCOV" - ]) - AC_SUBST(COV_TOOL) - AC_SUBST(COV_TOOL_WRAPPER, "cov_tool_wrapper.sh") - LCOV="$LCOV --gcov-tool $(pwd)/$COV_TOOL_WRAPPER" - - AX_CHECK_LINK_FLAG([--coverage], [CORE_LDFLAGS="$CORE_LDFLAGS --coverage"], - [AC_MSG_ERROR([lcov testing requested but --coverage linker flag does not work])]) - AX_CHECK_COMPILE_FLAG([--coverage],[CORE_CXXFLAGS="$CORE_CXXFLAGS --coverage"], - [AC_MSG_ERROR([lcov testing requested but --coverage flag does not work])]) - CORE_CXXFLAGS="$CORE_CXXFLAGS -Og" - - AC_SUBST(LCOV_OPTS) -fi - -dnl Check for endianness -AC_C_BIGENDIAN - -dnl Check for pthread compile/link requirements -AX_PTHREAD - -dnl Check if -latomic is required for -CHECK_ATOMIC - -dnl The following macro will add the necessary defines to BGL-config.h, but -dnl they also need to be passed down to any subprojects. Pull the results out of -dnl the cache and add them to CPPFLAGS. -AC_SYS_LARGEFILE -dnl detect POSIX or GNU variant of strerror_r -AC_FUNC_STRERROR_R - -if test "$ac_cv_sys_file_offset_bits" != "" && - test "$ac_cv_sys_file_offset_bits" != "no" && - test "$ac_cv_sys_file_offset_bits" != "unknown"; then - CORE_CPPFLAGS="$CORE_CPPFLAGS -D_FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits" -fi - -if test "$ac_cv_sys_large_files" != "" && - test "$ac_cv_sys_large_files" != "no" && - test "$ac_cv_sys_large_files" != "unknown"; then - CORE_CPPFLAGS="$CORE_CPPFLAGS -D_LARGE_FILES=$ac_cv_sys_large_files" -fi - -if test "$TARGET_OS" != "windows"; then - dnl All windows code is PIC, forcing it on just adds useless compile warnings - AX_CHECK_COMPILE_FLAG([-fPIC], [PIC_FLAGS="-fPIC"]) -fi - -if test "$use_hardening" != "no"; then - AX_CHECK_COMPILE_FLAG([-Wstack-protector], [HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -Wstack-protector"]) - AX_CHECK_COMPILE_FLAG([-fstack-protector-all], [HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -fstack-protector-all"]) - - AX_CHECK_COMPILE_FLAG([-fcf-protection=full], [HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -fcf-protection=full"]) - - case $host in - *mingw*) - dnl stack-clash-protection doesn't compile with GCC 10 and earlier. - dnl In any case, it is a no-op for Windows. - dnl See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90458 for more details. - ;; - *) - AX_CHECK_COMPILE_FLAG([-fstack-clash-protection], [HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -fstack-clash-protection"], [], [$CXXFLAG_WERROR]) - ;; - esac - - case $host in - *aarch64*) - AX_CHECK_COMPILE_FLAG([-mbranch-protection=bti], [HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -mbranch-protection=bti"]) - ;; - esac - - dnl When enable_debug is yes, all optimizations are disabled. - dnl However, FORTIFY_SOURCE requires that there is some level of optimization, otherwise it does nothing and just creates a compiler warning. - dnl Since FORTIFY_SOURCE is a no-op without optimizations, do not enable it when enable_debug is yes. - if test "$enable_debug" != "yes"; then - AX_CHECK_PREPROC_FLAG([-D_FORTIFY_SOURCE=3],[ - AX_CHECK_PREPROC_FLAG([-U_FORTIFY_SOURCE],[ - HARDENED_CPPFLAGS="$HARDENED_CPPFLAGS -U_FORTIFY_SOURCE" - ]) - HARDENED_CPPFLAGS="$HARDENED_CPPFLAGS -D_FORTIFY_SOURCE=3" - ]) - fi - - AX_CHECK_LINK_FLAG([-Wl,--enable-reloc-section], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,--enable-reloc-section"], [], [$LDFLAG_WERROR]) - AX_CHECK_LINK_FLAG([-Wl,--dynamicbase], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,--dynamicbase"], [], [$LDFLAG_WERROR]) - AX_CHECK_LINK_FLAG([-Wl,--nxcompat], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,--nxcompat"], [], [$LDFLAG_WERROR]) - AX_CHECK_LINK_FLAG([-Wl,--high-entropy-va], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,--high-entropy-va"], [], [$LDFLAG_WERROR]) - AX_CHECK_LINK_FLAG([-Wl,-z,relro], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-z,relro"], [], [$LDFLAG_WERROR]) - AX_CHECK_LINK_FLAG([-Wl,-z,now], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-z,now"], [], [$LDFLAG_WERROR]) - AX_CHECK_LINK_FLAG([-Wl,-z,separate-code], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-z,separate-code"], [], [$LDFLAG_WERROR]) - AX_CHECK_LINK_FLAG([-fPIE -pie], [PIE_FLAGS="-fPIE"; HARDENED_LDFLAGS="$HARDENED_LDFLAGS -pie"], [], [$CXXFLAG_WERROR]) -fi - -dnl These flags are specific to ld64, and may cause issues with other linkers. -dnl For example: GNU ld will interpret -dead_strip as -de and then try and use -dnl "ad_strip" as the symbol for the entry point. -if test "$TARGET_OS" = "darwin"; then - AX_CHECK_LINK_FLAG([-Wl,-dead_strip], [CORE_LDFLAGS="$CORE_LDFLAGS -Wl,-dead_strip"], [], [$LDFLAG_WERROR]) - AX_CHECK_LINK_FLAG([-Wl,-dead_strip_dylibs], [CORE_LDFLAGS="$CORE_LDFLAGS -Wl,-dead_strip_dylibs"], [], [$LDFLAG_WERROR]) - AX_CHECK_LINK_FLAG([-Wl,-fixup_chains], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-fixup_chains"], [], [$LDFLAG_WERROR]) -fi - -AC_CHECK_HEADERS([sys/select.h sys/prctl.h vm/vm_param.h sys/vmmeter.h sys/resources.h]) - -AC_CHECK_DECLS([getifaddrs, freeifaddrs],[CHECK_SOCKET],, - [#include - #include ] -) - -dnl These are used for daemonization in BGLd -AC_CHECK_DECLS([fork]) -AC_CHECK_DECLS([setsid]) - -AC_CHECK_DECLS([pipe2]) - -dnl Check for malloc_info (for memory statistics information in getmemoryinfo) -AC_MSG_CHECKING([for getmemoryinfo]) -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], - [[ int f = malloc_info(0, NULL); ]])], - [ AC_MSG_RESULT([yes]); AC_DEFINE([HAVE_MALLOC_INFO], [1], [Define this symbol if you have malloc_info]) ], - [ AC_MSG_RESULT([no])] -) - -dnl Check for mallopt(M_ARENA_MAX) (to set glibc arenas) -AC_MSG_CHECKING([for mallopt M_ARENA_MAX]) -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], - [[ mallopt(M_ARENA_MAX, 1); ]])], - [ AC_MSG_RESULT([yes]); AC_DEFINE([HAVE_MALLOPT_ARENA_MAX], [1], [Define this symbol if you have mallopt with M_ARENA_MAX]) ], - [ AC_MSG_RESULT([no])] -) - -dnl Check for posix_fallocate -AC_MSG_CHECKING([for posix_fallocate]) -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - // same as in src/util/fs_helpers.cpp - #ifdef __linux__ - #ifdef _POSIX_C_SOURCE - #undef _POSIX_C_SOURCE - #endif - #define _POSIX_C_SOURCE 200112L - #endif // __linux__ - #include ]], - [[ int f = posix_fallocate(0, 0, 0); ]])], - [ AC_MSG_RESULT([yes]); AC_DEFINE([HAVE_POSIX_FALLOCATE], [1], [Define this symbol if you have posix_fallocate]) ], - [ AC_MSG_RESULT([no])] -) - -AC_MSG_CHECKING([for default visibility attribute]) -AC_COMPILE_IFELSE([AC_LANG_SOURCE([ - int foo(void) __attribute__((visibility("default"))); - int main(){} - ])], - [ - AC_DEFINE([HAVE_DEFAULT_VISIBILITY_ATTRIBUTE], [1], [Define if the visibility attribute is supported.]) - AC_MSG_RESULT([yes]) - ], - [ - AC_MSG_RESULT([no]) - if test "$use_reduce_exports" = "yes"; then - AC_MSG_ERROR([Cannot find a working visibility attribute. Use --disable-reduce-exports.]) - fi - ] -) - -AC_MSG_CHECKING([for dllexport attribute]) -AC_COMPILE_IFELSE([AC_LANG_SOURCE([ - __declspec(dllexport) int foo(void); - int main(){} - ])], - [ - AC_DEFINE([HAVE_DLLEXPORT_ATTRIBUTE], [1], [Define if the dllexport attribute is supported.]) - AC_MSG_RESULT([yes]) - ], - [AC_MSG_RESULT([no])] -) - -dnl Check for different ways of gathering OS randomness -AC_MSG_CHECKING([for Linux getrandom function]) -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - #include ]], - [[ getrandom(nullptr, 32, 0); ]])], - [ AC_MSG_RESULT([yes]); AC_DEFINE([HAVE_GETRANDOM], [1], [Define this symbol if the Linux getrandom function call is available]) ], - [ AC_MSG_RESULT([no])] -) - -AC_MSG_CHECKING([for getentropy via sys/random.h]) -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - #include ]], - [[ getentropy(nullptr, 32) ]])], - [ AC_MSG_RESULT([yes]); AC_DEFINE([HAVE_GETENTROPY_RAND], [1], [Define this symbol if the BSD getentropy system call is available with sys/random.h]) ], - [ AC_MSG_RESULT([no])] -) - -AC_MSG_CHECKING([for sysctl]) -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include - #include ]], - [[ #ifdef __linux__ - #error "Don't use sysctl on Linux, it's deprecated even when it works" - #endif - sysctl(nullptr, 2, nullptr, nullptr, nullptr, 0); ]])], - [ AC_MSG_RESULT([yes]); AC_DEFINE([HAVE_SYSCTL], [1], [Define this symbol if the BSD sysctl() is available]) ], - [ AC_MSG_RESULT([no])] -) - -AC_MSG_CHECKING([for sysctl KERN_ARND]) -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include - #include ]], - [[ #ifdef __linux__ - #error "Don't use sysctl on Linux, it's deprecated even when it works" - #endif - static int name[2] = {CTL_KERN, KERN_ARND}; - sysctl(name, 2, nullptr, nullptr, nullptr, 0); ]])], - [ AC_MSG_RESULT([yes]); AC_DEFINE([HAVE_SYSCTL_ARND], [1], [Define this symbol if the BSD sysctl(KERN_ARND) is available]) ], - [ AC_MSG_RESULT([no])] -) - -AC_MSG_CHECKING([for fdatasync]) -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], - [[ fdatasync(0); ]])], - [ AC_MSG_RESULT([yes]); HAVE_FDATASYNC=1 ], - [ AC_MSG_RESULT([no]); HAVE_FDATASYNC=0 ] -) -AC_DEFINE_UNQUOTED([HAVE_FDATASYNC], [$HAVE_FDATASYNC], [Define to 1 if fdatasync is available.]) - -AC_MSG_CHECKING([for F_FULLFSYNC]) -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], - [[ fcntl(0, F_FULLFSYNC, 0); ]])], - [ AC_MSG_RESULT([yes]); HAVE_FULLFSYNC=1 ], - [ AC_MSG_RESULT([no]); HAVE_FULLFSYNC=0 ] -) - -AC_MSG_CHECKING([for O_CLOEXEC]) -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], - [[ open("", O_CLOEXEC); ]])], - [ AC_MSG_RESULT([yes]); HAVE_O_CLOEXEC=1 ], - [ AC_MSG_RESULT([no]); HAVE_O_CLOEXEC=0 ] -) -AC_DEFINE_UNQUOTED([HAVE_O_CLOEXEC], [$HAVE_O_CLOEXEC], [Define to 1 if O_CLOEXEC flag is available.]) - -dnl crc32c platform checks -AC_MSG_CHECKING([for __builtin_prefetch]) -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ ]], [[ - char data = 0; - const char* address = &data; - __builtin_prefetch(address, 0, 0); - ]])], - [ AC_MSG_RESULT([yes]); HAVE_BUILTIN_PREFETCH=1 ], - [ AC_MSG_RESULT([no]); HAVE_BUILTIN_PREFETCH=0 ] -) - -AC_MSG_CHECKING([for _mm_prefetch]) -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[ - char data = 0; - const char* address = &data; - _mm_prefetch(address, _MM_HINT_NTA); - ]])], - [ AC_MSG_RESULT([yes]); HAVE_MM_PREFETCH=1 ], - [ AC_MSG_RESULT([no]); HAVE_MM_PREFETCH=0 ] -) - -AC_MSG_CHECKING([for strong getauxval support in the system headers]) -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - #include - ]], [[ - getauxval(AT_HWCAP); - ]])], - [ AC_MSG_RESULT([yes]); HAVE_STRONG_GETAUXVAL=1; AC_DEFINE([HAVE_STRONG_GETAUXVAL], [1], [Define this symbol to build code that uses getauxval]) ], - [ AC_MSG_RESULT([no]); HAVE_STRONG_GETAUXVAL=0 ] -) - -# Check for UNIX sockets -AC_MSG_CHECKING(for sockaddr_un) -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - #include - #include - ]], [[ - struct sockaddr_un addr; - addr.sun_family = AF_UNIX; - ]])], - [ AC_MSG_RESULT([yes]); AC_DEFINE([HAVE_SOCKADDR_UN], [1], [Define this symbol if platform supports unix domain sockets]) ], - [ AC_MSG_RESULT([no]); ] -) - -have_any_system=no -AC_MSG_CHECKING([for std::system]) -AC_LINK_IFELSE( - [ AC_LANG_PROGRAM( - [[ #include ]], - [[ int nErr = std::system(""); ]] - )], - [ AC_MSG_RESULT([yes]); have_any_system=yes], - [ AC_MSG_RESULT([no]) ] -) - -AC_MSG_CHECKING([for ::_wsystem]) -AC_LINK_IFELSE( - [ AC_LANG_PROGRAM( - [[ #include ]], - [[ int nErr = ::_wsystem(NULL); ]] - )], - [ AC_MSG_RESULT([yes]); have_any_system=yes], - [ AC_MSG_RESULT([no]) ] -) - -if test "$have_any_system" != "no"; then - AC_DEFINE([HAVE_SYSTEM], [1], [Define to 1 if std::system or ::wsystem is available.]) -fi - -dnl SUPPRESSED_CPPFLAGS=SUPPRESS_WARNINGS([$SOME_CPPFLAGS]) -dnl Replace -I with -isystem in $SOME_CPPFLAGS to suppress warnings from -dnl headers from its include directories and return the result. -dnl See -isystem documentation: -dnl https://gcc.gnu.org/onlinedocs/gcc/Directory-Options.html -dnl https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-isystem-directory -dnl Do not change "-I/usr/include" to "-isystem /usr/include" because that -dnl is not necessary (/usr/include is already a system directory) and because -dnl it would break GCC's #include_next. -AC_DEFUN([SUPPRESS_WARNINGS], - [[$(echo $1 |${SED} -E -e 's/(^| )-I/\1-isystem /g' -e 's;-isystem /usr/include/*( |$);-I/usr/include\1;g')]]) - -dnl enable-fuzz should disable all other targets -if test "$enable_fuzz" = "yes"; then - AC_MSG_WARN([enable-fuzz will disable all other targets and force --enable-fuzz-binary=yes]) - build_BGL_utils=no - build_BGL_cli=no - build_BGL_tx=no - build_BGL_util=no - build_BGL_chainstate=no - build_BGL_wallet=no - build_BGLd=no - BGL_enable_qt=no - BGL_enable_qt_test=no - BGL_enable_qt_dbus=no - use_bench=no - use_tests=no - use_external_signer=no - use_upnp=no - use_natpmp=no - use_zmq=no - enable_fuzz_binary=yes - - AX_CHECK_PREPROC_FLAG([-DABORT_ON_FAILED_ASSUME], [DEBUG_CPPFLAGS="$DEBUG_CPPFLAGS -DABORT_ON_FAILED_ASSUME"], [], [$CXXFLAG_WERROR]) -else - BGL_QT_INIT - - dnl sets $BGL_enable_qt, $BGL_enable_qt_test, $BGL_enable_qt_dbus - BGL_QT_CONFIGURE([5.11.3]) - - dnl Keep a copy of the original $QT_INCLUDES and use it when invoking qt's moc - QT_INCLUDES_UNSUPPRESSED=$QT_INCLUDES - if test "$suppress_external_warnings" != "no" ; then - QT_INCLUDES=SUPPRESS_WARNINGS($QT_INCLUDES) - QT_DBUS_INCLUDES=SUPPRESS_WARNINGS($QT_DBUS_INCLUDES) - QT_TEST_INCLUDES=SUPPRESS_WARNINGS($QT_TEST_INCLUDES) - fi -fi - -if test "$enable_fuzz_binary" = "yes"; then - AC_MSG_CHECKING([whether main function is needed for fuzz binary]) - AX_CHECK_LINK_FLAG( - [], - [AC_MSG_RESULT([no])], - [AC_MSG_RESULT([yes]); CORE_CPPFLAGS="$CORE_CPPFLAGS -DPROVIDE_FUZZ_MAIN_FUNCTION"], - [$SANITIZER_LDFLAGS], - [AC_LANG_PROGRAM([[ - #include - #include - extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { return 0; } - /* comment to remove the main function ... - ]],[[ - */ int not_main() { - ]])]) -fi - -if test "$enable_wallet" != "no"; then - dnl Check for libdb_cxx only if wallet enabled - if test "$use_bdb" != "no"; then - BGL_FIND_BDB48 - if test "$suppress_external_warnings" != "no" ; then - BDB_CPPFLAGS=SUPPRESS_WARNINGS($BDB_CPPFLAGS) - fi - fi - - dnl Check for sqlite3 - if test "$use_sqlite" != "no"; then - PKG_CHECK_MODULES([SQLITE], [sqlite3 >= 3.7.17], [have_sqlite=yes], [have_sqlite=no]) - fi - AC_MSG_CHECKING([whether to build wallet with support for sqlite]) - if test "$use_sqlite" = "no"; then - use_sqlite=no - elif test "$have_sqlite" = "no"; then - if test "$use_sqlite" = "yes"; then - AC_MSG_ERROR([sqlite support requested but cannot be built. Use --without-sqlite]) - fi - use_sqlite=no - else - if test "$use_sqlite" != "no"; then - AC_DEFINE([USE_SQLITE],[1],[Define if sqlite support should be compiled in]) - use_sqlite=yes - fi - fi - AC_MSG_RESULT([$use_sqlite]) - - dnl Disable wallet if both --without-bdb and --without-sqlite - if test "$use_bdb$use_sqlite" = "nono"; then - if test "$enable_wallet" = "yes"; then - AC_MSG_ERROR([wallet functionality requested but no BDB or SQLite support available.]) - fi - enable_wallet=no - fi -fi - -if test "$use_usdt" != "no"; then - AC_MSG_CHECKING([whether Userspace, Statically Defined Tracing tracepoints are supported]) - AC_COMPILE_IFELSE([ - AC_LANG_PROGRAM( - [#include ], - [DTRACE_PROBE(context, event); - int a, b, c, d, e, f, g; - DTRACE_PROBE7(context, event, a, b, c, d, e, f, g);] - )], - [AC_MSG_RESULT([yes]); AC_DEFINE([ENABLE_TRACING], [1], [Define to 1 to enable tracepoints for Userspace, Statically Defined Tracing])], - [AC_MSG_RESULT([no]); use_usdt=no;] - ) -fi -AM_CONDITIONAL([ENABLE_USDT_TRACEPOINTS], [test "$use_usdt" = "yes"]) - -if test "$build_BGLd$BGL_enable_qt$use_bench$use_tests" = "nononono"; then - use_upnp=no - use_natpmp=no - use_zmq=no -fi - -dnl Check for libminiupnpc (optional) -if test "$use_upnp" != "no"; then - TEMP_CPPFLAGS="$CPPFLAGS" - CPPFLAGS="$CPPFLAGS $MINIUPNPC_CPPFLAGS" - AC_CHECK_HEADERS([miniupnpc/miniupnpc.h miniupnpc/upnpcommands.h miniupnpc/upnperrors.h], [], [have_miniupnpc=no]) - - if test "$have_miniupnpc" != "no"; then - AC_CHECK_LIB([miniupnpc], [upnpDiscover], [MINIUPNPC_LIBS="$MINIUPNPC_LIBS -lminiupnpc"], [have_miniupnpc=no], [$MINIUPNPC_LIBS]) - - dnl The minimum supported miniUPnPc API version is set to 17. This excludes - dnl versions with known vulnerabilities. - AC_MSG_CHECKING([whether miniUPnPc API version is supported]) - AC_PREPROC_IFELSE([AC_LANG_PROGRAM([[ - @%:@include - ]], [[ - #if MINIUPNPC_API_VERSION >= 17 - // Everything is okay - #else - # error miniUPnPc API version is too old - #endif - ]])],[ - AC_MSG_RESULT([yes]) - ],[ - AC_MSG_RESULT([no]) - AC_MSG_WARN([miniUPnPc API version < 17 is unsupported, disabling UPnP support.]) - have_miniupnpc=no - ]) - fi - CPPFLAGS="$TEMP_CPPFLAGS" -fi - -dnl Check for libnatpmp (optional). -if test "$use_natpmp" != "no"; then - TEMP_CPPFLAGS="$CPPFLAGS" - CPPFLAGS="$CPPFLAGS $NATPMP_CPPFLAGS" - AC_CHECK_HEADERS([natpmp.h], [], [have_natpmp=no]) - - if test "$have_natpmp" != "no"; then - AC_CHECK_LIB([natpmp], [initnatpmp], [NATPMP_LIBS="$NATPMP_LIBS -lnatpmp"], [have_natpmp=no], [$NATPMP_LIBS]) - fi - - CPPFLAGS="$TEMP_CPPFLAGS" -fi - -if test "$build_BGL_wallet$build_BGL_cli$build_BGL_tx$build_BGL_util$build_BGLd$BGL_enable_qt$use_tests$use_bench$enable_fuzz_binary" = "nonononononononono"; then - use_boost=no -else - use_boost=yes -fi - -if test "$use_boost" = "yes"; then - - dnl Check for Boost headers - AX_BOOST_BASE([1.73.0],[],[AC_MSG_ERROR([Boost is not available!])]) - if test "$want_boost" = "no"; then - AC_MSG_ERROR([Boost is required]) - fi - - dnl we don't use multi_index serialization - BOOST_CPPFLAGS="$BOOST_CPPFLAGS -DBOOST_MULTI_INDEX_DISABLE_SERIALIZATION" - - dnl Prevent use of std::unary_function, which was removed in C++17, - dnl and will generate warnings with newer compilers for Boost - dnl older than 1.80. - dnl See: https://github.com/boostorg/config/pull/430. - AX_CHECK_PREPROC_FLAG([-DBOOST_NO_CXX98_FUNCTION_BASE], [BOOST_CPPFLAGS="$BOOST_CPPFLAGS -DBOOST_NO_CXX98_FUNCTION_BASE"], [], [$CXXFLAG_WERROR], - [AC_LANG_PROGRAM([[#include ]])]) - - if test "$suppress_external_warnings" != "no"; then - BOOST_CPPFLAGS=SUPPRESS_WARNINGS($BOOST_CPPFLAGS) - fi -fi - -case $host in - dnl Re-enable it after enabling Windows support in cpp-subprocess. - *mingw*) - use_external_signer="no" - ;; -esac -if test "$use_external_signer" = "yes"; then - AC_DEFINE([ENABLE_EXTERNAL_SIGNER], [1], [Define if external signer support is enabled]) -fi -AM_CONDITIONAL([ENABLE_EXTERNAL_SIGNER], [test "$use_external_signer" = "yes"]) - -dnl Check for reduced exports -if test "$use_reduce_exports" = "yes"; then - AX_CHECK_COMPILE_FLAG([-fvisibility=hidden], [CORE_CXXFLAGS="$CORE_CXXFLAGS -fvisibility=hidden"], - [AC_MSG_ERROR([Cannot set hidden symbol visibility. Use --disable-reduce-exports.])], [$CXXFLAG_WERROR]) - AX_CHECK_LINK_FLAG([-Wl,--exclude-libs,ALL], [RELDFLAGS="-Wl,--exclude-libs,ALL"], [], [$LDFLAG_WERROR]) -fi - -if test "$use_tests" = "yes"; then - - if test "$HEXDUMP" = ""; then - AC_MSG_ERROR([hexdump is required for tests]) - fi -fi - -dnl libevent check - -use_libevent=no -if test "$build_BGL_cli$build_BGLd$BGL_enable_qt$enable_fuzz_binary$use_tests$use_bench" != "nononononono"; then - PKG_CHECK_MODULES([EVENT], [libevent >= 2.1.8], [use_libevent=yes], [AC_MSG_ERROR([libevent version 2.1.8 or greater not found.])]) - if test "$TARGET_OS" != "windows"; then - PKG_CHECK_MODULES([EVENT_PTHREADS], [libevent_pthreads >= 2.1.8], [], [AC_MSG_ERROR([libevent_pthreads version 2.1.8 or greater not found.])]) - fi - - if test "$suppress_external_warnings" != "no"; then - EVENT_CFLAGS=SUPPRESS_WARNINGS($EVENT_CFLAGS) - fi -fi - -if test x$use_libevent = xyes; then - TEMP_CXXFLAGS="$CXXFLAGS" - CXXFLAGS="$CXXFLAGS $EVENT_CFLAGS" - AC_MSG_CHECKING([if evhttp_connection_get_peer expects const char**]) - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - #include - #include - ]], [[ - evhttp_connection *conn = (evhttp_connection *)1; - const char *host; - uint16_t port; - - evhttp_connection_get_peer(conn, &host, &port); - ]])], - [ AC_MSG_RESULT([yes]); AC_DEFINE([HAVE_EVHTTP_CONNECTION_GET_PEER_CONST_CHAR], [1], [Define this symbol if evhttp_connection_get_peer expects const char**]) ], - [ AC_MSG_RESULT([no]) ] - ) - CXXFLAGS="$TEMP_CXXFLAGS" -fi - -dnl QR Code encoding library check - -if test "$use_qr" != "no"; then - BGL_QT_CHECK([PKG_CHECK_MODULES([QR], [libqrencode], [have_qrencode=yes], [have_qrencode=no])]) -fi - -dnl ZMQ check - -if test "$use_zmq" = "yes"; then - PKG_CHECK_MODULES([ZMQ], [libzmq >= 4], - AC_DEFINE([ENABLE_ZMQ], [1], [Define this symbol to enable ZMQ functions]), - [AC_MSG_WARN([libzmq version 4.x or greater not found, disabling]) - use_zmq=no]) -fi - -if test "$use_zmq" = "yes"; then - dnl Assume libzmq was built for static linking - case $host in - *mingw*) - ZMQ_CFLAGS="$ZMQ_CFLAGS -DZMQ_STATIC" - ;; - esac -fi - -AM_CONDITIONAL([ENABLE_ZMQ], [test "$use_zmq" = "yes"]) - -dnl libmultiprocess library check - -libmultiprocess_found=no -if test "$with_libmultiprocess" = "yes" || test "$with_libmultiprocess" = "auto"; then - PKG_CHECK_MODULES([LIBMULTIPROCESS], [libmultiprocess], [ - libmultiprocess_found=yes; - libmultiprocess_prefix=`$PKG_CONFIG --variable=prefix libmultiprocess`; - ], [true]) -elif test "$with_libmultiprocess" != "no"; then - AC_MSG_ERROR([--with-libmultiprocess=$with_libmultiprocess value is not yes, auto, or no]) -fi - -dnl Enable multiprocess check - -if test "$enable_multiprocess" = "yes"; then - if test "$libmultiprocess_found" != "yes"; then - AC_MSG_ERROR([--enable-multiprocess=yes option specified but libmultiprocess library was not found. May need to install libmultiprocess library, or specify install path with PKG_CONFIG_PATH environment variable. Running 'pkg-config --debug libmultiprocess' may be helpful for debugging.]) - fi - build_multiprocess=yes -elif test "$enable_multiprocess" = "auto"; then - build_multiprocess=$libmultiprocess_found -else - build_multiprocess=no -fi - -AM_CONDITIONAL([BUILD_MULTIPROCESS], [test "$build_multiprocess" = "yes"]) -AM_CONDITIONAL([BUILD_BGL_NODE], [test "$build_multiprocess" = "yes"]) -AM_CONDITIONAL([BUILD_BGL_GUI], [test "$build_multiprocess" = "yes"]) - -dnl codegen tools check - -if test "$build_multiprocess" != "no"; then - if test "$with_mpgen" = "yes" || test "$with_mpgen" = "auto"; then - MPGEN_PREFIX="$libmultiprocess_prefix" - elif test "$with_mpgen" != "no"; then - MPGEN_PREFIX="$with_mpgen"; - fi - AC_SUBST(MPGEN_PREFIX) -fi - -AC_MSG_CHECKING([whether to build BGLd]) -AM_CONDITIONAL([BUILD_BGLD], [test $build_BGLd = "yes"]) -AC_MSG_RESULT($build_BGLd) - -AC_MSG_CHECKING([whether to build BGL-cli]) -AM_CONDITIONAL([BUILD_BGL_CLI], [test $build_BGL_cli = "yes"]) -AC_MSG_RESULT($build_BGL_cli) - -AC_MSG_CHECKING([whether to build BGL-tx]) -AM_CONDITIONAL([BUILD_BGL_TX], [test $build_BGL_tx = "yes"]) -AC_MSG_RESULT($build_BGL_tx) - -AC_MSG_CHECKING([whether to build BGL-wallet]) -AM_CONDITIONAL([BUILD_BGL_WALLET], [test $build_BGL_wallet = "yes"]) -AC_MSG_RESULT($build_BGL_wallet) - -AC_MSG_CHECKING([whether to build BGL-util]) -AM_CONDITIONAL([BUILD_BGL_UTIL], [test $build_BGL_util = "yes"]) -AC_MSG_RESULT($build_BGL_util) - -AC_MSG_CHECKING([whether to build experimental BGL-chainstate]) -if test "$build_BGL_chainstate" = "yes"; then - if test "$build_experimental_kernel_lib" = "no"; then - AC_MSG_ERROR([experimental BGL-chainstate cannot be built without the experimental BGLkernel library. Use --with-experimental-kernel-lib]); - fi -fi -AM_CONDITIONAL([BUILD_BGL_CHAINSTATE], [test $build_BGL_chainstate = "yes"]) -AC_MSG_RESULT($build_BGL_chainstate) - -AM_CONDITIONAL([BUILD_BGL_KERNEL_LIB], [test "$build_experimental_kernel_lib" != "no" && ( test "$build_experimental_kernel_lib" = "yes" || test "$build_BGL_chainstate" = "yes" )]) - -AC_LANG_POP - -if test "$use_ccache" != "no"; then - AC_MSG_CHECKING([if ccache should be used]) - if test "$CCACHE" = ""; then - if test "$use_ccache" = "yes"; then - AC_MSG_ERROR([ccache not found.]); - else - use_ccache=no - fi - else - use_ccache=yes - CC="$ac_cv_path_CCACHE $CC" - CXX="$ac_cv_path_CCACHE $CXX" - fi - AC_MSG_RESULT($use_ccache) - if test "$use_ccache" = "yes"; then - AX_CHECK_COMPILE_FLAG([-fdebug-prefix-map=A=B], [DEBUG_CXXFLAGS="$DEBUG_CXXFLAGS -fdebug-prefix-map=\$(abs_top_srcdir)=."], [], [$CXXFLAG_WERROR]) - AX_CHECK_PREPROC_FLAG([-fmacro-prefix-map=A=B], [DEBUG_CPPFLAGS="$DEBUG_CPPFLAGS -fmacro-prefix-map=\$(abs_top_srcdir)=."], [], [$CXXFLAG_WERROR]) - fi -fi - -dnl enable wallet -AC_MSG_CHECKING([if wallet should be enabled]) -if test "$enable_wallet" != "no"; then - AC_MSG_RESULT([yes]) - AC_DEFINE_UNQUOTED([ENABLE_WALLET],[1],[Define to 1 to enable wallet functions]) - enable_wallet=yes - -else - AC_MSG_RESULT([no]) -fi - -dnl enable upnp support -AC_MSG_CHECKING([whether to build with support for UPnP]) -if test "$have_miniupnpc" = "no"; then - if test "$use_upnp" = "yes"; then - AC_MSG_ERROR([UPnP requested but cannot be built. Use --without-miniupnpc]) - fi - AC_MSG_RESULT([no]) - use_upnp=no -else - if test "$use_upnp" != "no"; then - AC_MSG_RESULT([yes]) - use_upnp=yes - AC_DEFINE([USE_UPNP], [1], [Define to 1 if UPnP support should be compiled in.]) - if test "$TARGET_OS" = "windows"; then - MINIUPNPC_CPPFLAGS="$MINIUPNPC_CPPFLAGS -DMINIUPNP_STATICLIB" - fi - else - AC_MSG_RESULT([no]) - fi -fi - -dnl Enable NAT-PMP support. -AC_MSG_CHECKING([whether to build with support for NAT-PMP]) -if test "$have_natpmp" = "no"; then - if test "$use_natpmp" = "yes"; then - AC_MSG_ERROR([NAT-PMP requested but cannot be built. Use --without-natpmp]) - fi - AC_MSG_RESULT([no]) - use_natpmp=no -else - if test "$use_natpmp" != "no"; then - AC_MSG_RESULT([yes]) - use_natpmp=yes - AC_DEFINE([USE_NATPMP], [1], [Define to 1 if UPnP support should be compiled in.]) - if test "$TARGET_OS" = "windows"; then - NATPMP_CPPFLAGS="$NATPMP_CPPFLAGS -DSTATICLIB -DNATPMP_STATICLIB" - fi - else - AC_MSG_RESULT([no]) - fi -fi - -dnl these are only used when qt is enabled -BUILD_TEST_QT="" -if test "$BGL_enable_qt" != "no"; then - dnl enable dbus support - AC_MSG_CHECKING([whether to build GUI with support for D-Bus]) - if test "$BGL_enable_qt_dbus" != "no"; then - AC_DEFINE([USE_DBUS], [1], [Define if dbus support should be compiled in]) - fi - AC_MSG_RESULT([$BGL_enable_qt_dbus]) - - dnl enable qr support - AC_MSG_CHECKING([whether to build GUI with support for QR codes]) - if test "$have_qrencode" = "no"; then - if test "$use_qr" = "yes"; then - AC_MSG_ERROR([QR support requested but cannot be built. Use --without-qrencode]) - fi - use_qr=no - else - if test "$use_qr" != "no"; then - AC_DEFINE([USE_QRCODE], [1], [Define if QR support should be compiled in]) - use_qr=yes - fi - fi - AC_MSG_RESULT([$use_qr]) - - if test "$XGETTEXT" = ""; then - AC_MSG_WARN([xgettext is required to update qt translations]) - fi - - AC_MSG_CHECKING([whether to build test_BGL-qt]) - if test "$use_gui_tests$BGL_enable_qt_test" = "yesyes"; then - AC_MSG_RESULT([yes]) - BUILD_TEST_QT="yes" - else - AC_MSG_RESULT([no]) - fi -fi - -AC_MSG_CHECKING([whether to build test_BGL]) -if test "$use_tests" = "yes"; then - if test "$enable_fuzz" = "yes"; then - AC_MSG_RESULT([no, because fuzzing is enabled]) - else - AC_MSG_RESULT([yes]) - fi - BUILD_TEST="yes" -else - AC_MSG_RESULT([no]) - BUILD_TEST="" -fi - -AC_MSG_CHECKING([whether to reduce exports]) -if test "$use_reduce_exports" = "yes"; then - AC_MSG_RESULT([yes]) -else - AC_MSG_RESULT([no]) -fi - -if test "$build_BGL_wallet$build_BGL_cli$build_BGL_tx$build_BGL_util$build_BGLd$BGL_enable_qt$enable_fuzz_binary$use_bench$use_tests" = "nonononononononono"; then - AC_MSG_ERROR([No targets! Please specify at least one of: --with-utils --with-daemon --with-gui --enable-fuzz(-binary) --enable-bench or --enable-tests]) -fi - -AM_CONDITIONAL([TARGET_DARWIN], [test "$TARGET_OS" = "darwin"]) -AM_CONDITIONAL([BUILD_DARWIN], [test "$BUILD_OS" = "darwin"]) -AM_CONDITIONAL([TARGET_LINUX], [test "$TARGET_OS" = "linux"]) -AM_CONDITIONAL([TARGET_WINDOWS], [test "$TARGET_OS" = "windows"]) -AM_CONDITIONAL([ENABLE_WALLET], [test "$enable_wallet" = "yes"]) -AM_CONDITIONAL([USE_SQLITE], [test "$use_sqlite" = "yes"]) -AM_CONDITIONAL([USE_BDB], [test "$use_bdb" = "yes"]) -AM_CONDITIONAL([ENABLE_TESTS], [test "$BUILD_TEST" = "yes"]) -AM_CONDITIONAL([ENABLE_FUZZ], [test "$enable_fuzz" = "yes"]) -AM_CONDITIONAL([ENABLE_FUZZ_BINARY], [test "$enable_fuzz_binary" = "yes"]) -AM_CONDITIONAL([ENABLE_QT], [test "$BGL_enable_qt" = "yes"]) -AM_CONDITIONAL([ENABLE_QT_TESTS], [test "$BUILD_TEST_QT" = "yes"]) -AM_CONDITIONAL([ENABLE_BENCH], [test "$use_bench" = "yes"]) -AM_CONDITIONAL([USE_QRCODE], [test "$use_qr" = "yes"]) -AM_CONDITIONAL([USE_LCOV], [test "$use_lcov" = "yes"]) -AM_CONDITIONAL([HARDEN], [test "$use_hardening" = "yes"]) -AM_CONDITIONAL([ENABLE_SSE42], [test "$enable_sse42" = "yes"]) -AM_CONDITIONAL([ENABLE_SSE41], [test "$enable_sse41" = "yes"]) -AM_CONDITIONAL([ENABLE_AVX2], [test "$enable_avx2" = "yes"]) -AM_CONDITIONAL([ENABLE_X86_SHANI], [test "$enable_x86_shani" = "yes"]) -AM_CONDITIONAL([ENABLE_ARM_CRC], [test "$enable_arm_crc" = "yes"]) -AM_CONDITIONAL([ENABLE_ARM_SHANI], [test "$enable_arm_shani" = "yes"]) -AM_CONDITIONAL([WORDS_BIGENDIAN], [test "$ac_cv_c_bigendian" = "yes"]) -AM_CONDITIONAL([USE_NATPMP], [test "$use_natpmp" = "yes"]) -AM_CONDITIONAL([USE_UPNP], [test "$use_upnp" = "yes"]) - -dnl for minisketch -AM_CONDITIONAL([ENABLE_CLMUL], [test "$enable_clmul" = "yes"]) - -AC_DEFINE([CLIENT_VERSION_MAJOR], [_CLIENT_VERSION_MAJOR], [Major version]) -AC_DEFINE([CLIENT_VERSION_MINOR], [_CLIENT_VERSION_MINOR], [Minor version]) -AC_DEFINE([CLIENT_VERSION_BUILD], [_CLIENT_VERSION_BUILD], [Version Build]) -AC_DEFINE([CLIENT_VERSION_IS_RELEASE], [_CLIENT_VERSION_IS_RELEASE], [Version is release]) -AC_DEFINE([COPYRIGHT_YEAR], [_COPYRIGHT_YEAR], [Copyright year]) -AC_DEFINE([COPYRIGHT_HOLDERS], ["_COPYRIGHT_HOLDERS"], [Copyright holder(s) before %s replacement]) -AC_DEFINE([COPYRIGHT_HOLDERS_SUBSTITUTION], ["_COPYRIGHT_HOLDERS_SUBSTITUTION"], [Replacement for %s in copyright holders string]) -define(_COPYRIGHT_HOLDERS_FINAL, [patsubst(_COPYRIGHT_HOLDERS, [%s], [_COPYRIGHT_HOLDERS_SUBSTITUTION])]) -AC_DEFINE([COPYRIGHT_HOLDERS_FINAL], ["_COPYRIGHT_HOLDERS_FINAL"], [Copyright holder(s)]) -AC_SUBST(CLIENT_VERSION_MAJOR, _CLIENT_VERSION_MAJOR) -AC_SUBST(CLIENT_VERSION_MINOR, _CLIENT_VERSION_MINOR) -AC_SUBST(CLIENT_VERSION_BUILD, _CLIENT_VERSION_BUILD) -AC_SUBST(CLIENT_VERSION_IS_RELEASE, _CLIENT_VERSION_IS_RELEASE) -AC_SUBST(COPYRIGHT_YEAR, _COPYRIGHT_YEAR) -AC_SUBST(COPYRIGHT_HOLDERS, "_COPYRIGHT_HOLDERS") -AC_SUBST(COPYRIGHT_HOLDERS_SUBSTITUTION, "_COPYRIGHT_HOLDERS_SUBSTITUTION") -AC_SUBST(COPYRIGHT_HOLDERS_FINAL, "_COPYRIGHT_HOLDERS_FINAL") -AC_SUBST(BGL_DAEMON_NAME) -AC_SUBST(BGL_GUI_NAME) -AC_SUBST(BGL_TEST_NAME) -AC_SUBST(BGL_CLI_NAME) -AC_SUBST(BGL_TX_NAME) -AC_SUBST(BGL_UTIL_NAME) -AC_SUBST(BGL_CHAINSTATE_NAME) -AC_SUBST(BGL_WALLET_TOOL_NAME) -AC_SUBST(BGL_MP_NODE_NAME) -AC_SUBST(BGL_MP_GUI_NAME) - -AC_SUBST(RELDFLAGS) -AC_SUBST(CORE_LDFLAGS) -AC_SUBST(CORE_CPPFLAGS) -AC_SUBST(CORE_CXXFLAGS) -AC_SUBST(DEBUG_CPPFLAGS) -AC_SUBST(WARN_CXXFLAGS) -AC_SUBST(NOWARN_CXXFLAGS) -AC_SUBST(DEBUG_CXXFLAGS) -AC_SUBST(ERROR_CXXFLAGS) -AC_SUBST(HARDENED_CXXFLAGS) -AC_SUBST(HARDENED_CPPFLAGS) -AC_SUBST(HARDENED_LDFLAGS) -AC_SUBST(PIC_FLAGS) -AC_SUBST(PIE_FLAGS) -AC_SUBST(SANITIZER_CXXFLAGS) -AC_SUBST(SANITIZER_LDFLAGS) -AC_SUBST(SSE42_CXXFLAGS) -AC_SUBST(SSE41_CXXFLAGS) -AC_SUBST(CLMUL_CXXFLAGS) -AC_SUBST(AVX2_CXXFLAGS) -AC_SUBST(X86_SHANI_CXXFLAGS) -AC_SUBST(ARM_CRC_CXXFLAGS) -AC_SUBST(ARM_SHANI_CXXFLAGS) -AC_SUBST(LIBTOOL_APP_LDFLAGS) -AC_SUBST(USE_SQLITE) -AC_SUBST(USE_BDB) -AC_SUBST(ENABLE_EXTERNAL_SIGNER) -AC_SUBST(USE_UPNP) -AC_SUBST(USE_QRCODE) -AC_SUBST(TESTDEFS) -AC_SUBST(MINIUPNPC_CPPFLAGS) -AC_SUBST(MINIUPNPC_LIBS) -AC_SUBST(NATPMP_CPPFLAGS) -AC_SUBST(NATPMP_LIBS) -AC_SUBST(HAVE_FDATASYNC) -AC_SUBST(HAVE_FULLFSYNC) -AC_SUBST(HAVE_O_CLOEXEC) -AC_SUBST(HAVE_BUILTIN_PREFETCH) -AC_SUBST(HAVE_MM_PREFETCH) -AC_SUBST(HAVE_STRONG_GETAUXVAL) -AC_SUBST(HAVE_EVHTTP_CONNECTION_GET_PEER_CONST_CHAR) -AC_CONFIG_FILES([Makefile src/Makefile doc/man/Makefile share/setup.nsi share/qt/Info.plist test/config.ini]) -AC_CONFIG_FILES([contrib/devtools/split-debug.sh],[chmod +x contrib/devtools/split-debug.sh]) -AM_COND_IF([HAVE_DOXYGEN], [AC_CONFIG_FILES([doc/Doxyfile])]) -AC_CONFIG_LINKS([contrib/devtools/iwyu/BGL.core.imp:contrib/devtools/iwyu/BGL.core.imp]) -AC_CONFIG_LINKS([contrib/filter-lcov.py:contrib/filter-lcov.py]) -AC_CONFIG_LINKS([src/.bear-tidy-config:src/.bear-tidy-config]) -AC_CONFIG_LINKS([src/.clang-tidy:src/.clang-tidy]) -AC_CONFIG_LINKS([test/functional/test_runner.py:test/functional/test_runner.py]) -AC_CONFIG_LINKS([test/fuzz/test_runner.py:test/fuzz/test_runner.py]) -AC_CONFIG_LINKS([test/util/test_runner.py:test/util/test_runner.py]) -AC_CONFIG_LINKS([test/util/rpcauth-test.py:test/util/rpcauth-test.py]) -AC_CONFIG_LINKS([src/qt/Makefile:src/qt/Makefile]) -AC_CONFIG_LINKS([src/qt/test/Makefile:src/qt/test/Makefile]) -AC_CONFIG_LINKS([src/test/Makefile:src/test/Makefile]) - -dnl boost's m4 checks do something really nasty: they export these vars. As a -dnl result, they leak into secp256k1's configure and crazy things happen. -dnl Until this is fixed upstream and we've synced, we'll just un-export them. -CPPFLAGS_TEMP="$CPPFLAGS" -unset CPPFLAGS -CPPFLAGS="$CPPFLAGS_TEMP" - -if test -n "$use_sanitizers"; then - export SECP_CFLAGS="$SECP_CFLAGS $SANITIZER_CFLAGS" -fi -ac_configure_args="${ac_configure_args} --disable-shared --with-pic --with-ecmult-gen-kb=86 --enable-benchmark=no --enable-module-recovery --disable-module-ecdh" -AC_CONFIG_SUBDIRS([src/secp256k1]) - -AC_OUTPUT - -dnl Replace the BUILDDIR path with the correct Windows path if compiling on Native Windows -case ${OS} in - *Windows*) - sed 's/BUILDDIR="\/\([[a-z]]\)/BUILDDIR="\1:/' test/config.ini > test/config-2.ini - mv test/config-2.ini test/config.ini - ;; -esac - -dnl An old hack similar to a98356fee to remove hard-coded -dnl bind_at_load flag from libtool -case $host in - *darwin*) - AC_MSG_RESULT([Removing -Wl,bind_at_load from libtool.]) - sed < libtool > libtool-2 '/bind_at_load/d' - mv libtool-2 libtool - chmod 755 libtool - ;; -esac - -echo -echo "Options used to compile and link:" -echo " external signer = $use_external_signer" -echo " multiprocess = $build_multiprocess" -echo " with wallet = $enable_wallet" -if test "$enable_wallet" != "no"; then - echo " with sqlite = $use_sqlite" - echo " with bdb = $use_bdb" -fi -echo " with gui / qt = $BGL_enable_qt" -if test $BGL_enable_qt != "no"; then - echo " with qr = $use_qr" -fi -echo " with zmq = $use_zmq" -if test $enable_fuzz = "no"; then - echo " with test = $use_tests" -else - echo " with test = not building test_BGL because fuzzing is enabled" -fi -echo " with fuzz binary = $enable_fuzz_binary" -echo " with bench = $use_bench" -echo " with upnp = $use_upnp" -echo " with natpmp = $use_natpmp" -echo " USDT tracing = $use_usdt" -echo " sanitizers = $use_sanitizers" -echo " debug enabled = $enable_debug" -echo " werror = $enable_werror" -echo -echo " target os = $host_os" -echo " build os = $build_os" -echo -echo " CC = $CC" -echo " CFLAGS = $PTHREAD_CFLAGS $SANITIZER_CFLAGS $CFLAGS" -echo " CPPFLAGS = $DEBUG_CPPFLAGS $HARDENED_CPPFLAGS $CORE_CPPFLAGS $CPPFLAGS" -echo " CXX = $CXX" -echo " CXXFLAGS = $CORE_CXXFLAGS $DEBUG_CXXFLAGS $HARDENED_CXXFLAGS $WARN_CXXFLAGS $NOWARN_CXXFLAGS $ERROR_CXXFLAGS $SANITIZER_CXXFLAGS $CXXFLAGS" -echo " LDFLAGS = $PTHREAD_LIBS $HARDENED_LDFLAGS $SANITIZER_LDFLAGS $CORE_LDFLAGS $LDFLAGS" -echo " AR = $AR" -echo " ARFLAGS = $ARFLAGS" -echo diff --git a/contrib/BGL-qt.pro b/contrib/BGL-qt.pro deleted file mode 100644 index 49c37daf8f..0000000000 --- a/contrib/BGL-qt.pro +++ /dev/null @@ -1,22 +0,0 @@ -FORMS += \ - ../src/qt/forms/aboutdialog.ui \ - ../src/qt/forms/addressbookpage.ui \ - ../src/qt/forms/askpassphrasedialog.ui \ - ../src/qt/forms/coincontroldialog.ui \ - ../src/qt/forms/editaddressdialog.ui \ - ../src/qt/forms/helpmessagedialog.ui \ - ../src/qt/forms/intro.ui \ - ../src/qt/forms/openuridialog.ui \ - ../src/qt/forms/optionsdialog.ui \ - ../src/qt/forms/overviewpage.ui \ - ../src/qt/forms/receivecoinsdialog.ui \ - ../src/qt/forms/receiverequestdialog.ui \ - ../src/qt/forms/debugwindow.ui \ - ../src/qt/forms/sendcoinsdialog.ui \ - ../src/qt/forms/sendcoinsentry.ui \ - ../src/qt/forms/signverifymessagedialog.ui \ - ../src/qt/forms/transactiondescdialog.ui \ - ../src/qt/forms/createwalletdialog.ui - -RESOURCES += \ - ../src/qt/BGL.qrc diff --git a/contrib/README.md b/contrib/README.md deleted file mode 100644 index 1a609c1e67..0000000000 --- a/contrib/README.md +++ /dev/null @@ -1,45 +0,0 @@ -Repository Tools ---------------------- - -### [Developer tools](/contrib/devtools) ### -Specific tools for developers working on this repository. -Additional tools, including the `github-merge.py` script, are available in the [maintainer-tools](https://github.com/BGL-core/BGL-maintainer-tools) repository. - -### [Verify-Commits](/contrib/verify-commits) ### -Tool to verify that every merge commit was signed by a developer using the `github-merge.py` script. - -### [Linearize](/contrib/linearize) ### -Construct a linear, no-fork, best version of the blockchain. - -### [Qos](/contrib/qos) ### - -A Linux bash script that will set up traffic control (tc) to limit the outgoing bandwidth for connections to the BGL network. This means one can have an always-on BGLd instance running, and another local BGLd/BGL-qt instance which connects to this node and receives blocks from it. - -### [Seeds](/contrib/seeds) ### -Utility to generate the pnSeed[] array that is compiled into the client. - -Build Tools and Keys ---------------------- - -### Packaging ### -The [Debian](/contrib/debian) subfolder contains the copyright file. - -All other packaging related files can be found in the [BGL-core/packaging](https://github.com/BGL-core/packaging) repository. - -### [MacDeploy](/contrib/macdeploy) ### -Scripts and notes for Mac builds. - -Test and Verify Tools ---------------------- - -### [TestGen](/contrib/testgen) ### -Utilities to generate test vectors for the data-driven BGL tests. - -### [Verify-Binaries](/contrib/verify-binaries) ### -This script attempts to download and verify the signature file SHA256SUMS.asc from bitcoin.org. - -Command Line Tools ---------------------- - -### [Completions](/contrib/completions) ### -Shell completions for bash and fish. diff --git a/contrib/asmap/README.md b/contrib/asmap/README.md deleted file mode 100644 index 5fab4b285e..0000000000 --- a/contrib/asmap/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# ASMap Tool - -Tool for performing various operations on textual and binary asmap files, -particularly encoding/compressing the raw data to the binary format that can -be used in Bitcoin Core with the `-asmap` option. - -Example usage: -``` -python3 asmap-tool.py encode /path/to/input.file /path/to/output.file -python3 asmap-tool.py decode /path/to/input.file /path/to/output.file -python3 asmap-tool.py diff /path/to/first.file /path/to/second.file -``` diff --git a/contrib/asmap/asmap-tool.py b/contrib/asmap/asmap-tool.py deleted file mode 100755 index 09c28725e4..0000000000 --- a/contrib/asmap/asmap-tool.py +++ /dev/null @@ -1,156 +0,0 @@ -#!/usr/bin/env python3 -# Copyright (c) 2022 Pieter Wuille -# Distributed under the MIT software license, see the accompanying -# file LICENSE or http://www.opensource.org/licenses/mit-license.php. - -import argparse -import sys -import ipaddress -import math - -import asmap - -def load_file(input_file): - try: - contents = input_file.read() - except OSError as err: - sys.exit(f"Input file '{input_file.name}' cannot be read: {err.strerror}.") - try: - bin_asmap = asmap.ASMap.from_binary(contents) - except ValueError: - bin_asmap = None - txt_error = None - entries = None - try: - txt_contents = str(contents, encoding="utf-8") - except UnicodeError: - txt_error = "invalid UTF-8" - txt_contents = None - if txt_contents is not None: - entries = [] - for line in txt_contents.split("\n"): - idx = line.find('#') - if idx >= 0: - line = line[:idx] - line = line.lstrip(' ').rstrip(' \t\r\n') - if len(line) == 0: - continue - fields = line.split(' ') - if len(fields) != 2: - txt_error = f"unparseable line '{line}'" - entries = None - break - prefix, asn = fields - if len(asn) <= 2 or asn[:2] != "AS" or any(c < '0' or c > '9' for c in asn[2:]): - txt_error = f"invalid ASN '{asn}'" - entries = None - break - try: - net = ipaddress.ip_network(prefix) - except ValueError: - txt_error = f"invalid network '{prefix}'" - entries = None - break - entries.append((asmap.net_to_prefix(net), int(asn[2:]))) - if entries is not None and bin_asmap is not None and len(contents) > 0: - sys.exit(f"Input file '{input_file.name}' is ambiguous.") - if entries is not None: - state = asmap.ASMap() - state.update_multi(entries) - return state - if bin_asmap is not None: - return bin_asmap - sys.exit(f"Input file '{input_file.name}' is neither a valid binary asmap file nor valid text input ({txt_error}).") - - -def save_binary(output_file, state, fill): - contents = state.to_binary(fill=fill) - try: - output_file.write(contents) - output_file.close() - except OSError as err: - sys.exit(f"Output file '{output_file.name}' cannot be written to: {err.strerror}.") - -def save_text(output_file, state, fill, overlapping): - for prefix, asn in state.to_entries(fill=fill, overlapping=overlapping): - net = asmap.prefix_to_net(prefix) - try: - print(f"{net} AS{asn}", file=output_file) - except OSError as err: - sys.exit(f"Output file '{output_file.name}' cannot be written to: {err.strerror}.") - try: - output_file.close() - except OSError as err: - sys.exit(f"Output file '{output_file.name}' cannot be written to: {err.strerror}.") - -def main(): - parser = argparse.ArgumentParser(description="Tool for performing various operations on textual and binary asmap files.") - subparsers = parser.add_subparsers(title="valid subcommands", dest="subcommand") - - parser_encode = subparsers.add_parser("encode", help="convert asmap data to binary format") - parser_encode.add_argument('-f', '--fill', dest="fill", default=False, action="store_true", - help="permit reassigning undefined network ranges arbitrarily to reduce size") - parser_encode.add_argument('infile', nargs='?', type=argparse.FileType('rb'), default=sys.stdin.buffer, - help="input asmap file (text or binary); default is stdin") - parser_encode.add_argument('outfile', nargs='?', type=argparse.FileType('wb'), default=sys.stdout.buffer, - help="output binary asmap file; default is stdout") - - parser_decode = subparsers.add_parser("decode", help="convert asmap data to text format") - parser_decode.add_argument('-f', '--fill', dest="fill", default=False, action="store_true", - help="permit reassigning undefined network ranges arbitrarily to reduce length") - parser_decode.add_argument('-n', '--nonoverlapping', dest="overlapping", default=True, action="store_false", - help="output strictly non-overall ping network ranges (increases output size)") - parser_decode.add_argument('infile', nargs='?', type=argparse.FileType('rb'), default=sys.stdin.buffer, - help="input asmap file (text or binary); default is stdin") - parser_decode.add_argument('outfile', nargs='?', type=argparse.FileType('w'), default=sys.stdout, - help="output text file; default is stdout") - - parser_diff = subparsers.add_parser("diff", help="compute the difference between two asmap files") - parser_diff.add_argument('-i', '--ignore-unassigned', dest="ignore_unassigned", default=False, action="store_true", - help="ignore unassigned ranges in the first input (useful when second input is filled)") - parser_diff.add_argument('infile1', type=argparse.FileType('rb'), - help="first file to compare (text or binary)") - parser_diff.add_argument('infile2', type=argparse.FileType('rb'), - help="second file to compare (text or binary)") - - args = parser.parse_args() - if args.subcommand is None: - parser.print_help() - elif args.subcommand == "encode": - state = load_file(args.infile) - save_binary(args.outfile, state, fill=args.fill) - elif args.subcommand == "decode": - state = load_file(args.infile) - save_text(args.outfile, state, fill=args.fill, overlapping=args.overlapping) - elif args.subcommand == "diff": - state1 = load_file(args.infile1) - state2 = load_file(args.infile2) - ipv4_changed = 0 - ipv6_changed = 0 - for prefix, old_asn, new_asn in state1.diff(state2): - if args.ignore_unassigned and old_asn == 0: - continue - net = asmap.prefix_to_net(prefix) - if isinstance(net, ipaddress.IPv4Network): - ipv4_changed += 1 << (32 - net.prefixlen) - elif isinstance(net, ipaddress.IPv6Network): - ipv6_changed += 1 << (128 - net.prefixlen) - if new_asn == 0: - print(f"# {net} was AS{old_asn}") - elif old_asn == 0: - print(f"{net} AS{new_asn} # was unassigned") - else: - print(f"{net} AS{new_asn} # was AS{old_asn}") - ipv4_change_str = "" if ipv4_changed == 0 else f" (2^{math.log2(ipv4_changed):.2f})" - ipv6_change_str = "" if ipv6_changed == 0 else f" (2^{math.log2(ipv6_changed):.2f})" - - print( - f"# {ipv4_changed}{ipv4_change_str} IPv4 addresses changed; " - f"{ipv6_changed}{ipv6_change_str} IPv6 addresses changed" - ) - else: - parser.print_help() - sys.exit("No command provided.") - -if __name__ == '__main__': - main() diff --git a/contrib/asmap/asmap.py b/contrib/asmap/asmap.py deleted file mode 100644 index 903a42c945..0000000000 --- a/contrib/asmap/asmap.py +++ /dev/null @@ -1,810 +0,0 @@ -# Copyright (c) 2022 Pieter Wuille -# Distributed under the MIT software license, see the accompanying -# file LICENSE or http://www.opensource.org/licenses/mit-license.php. - -""" -This module provides the ASNEntry and ASMap classes. -""" - -import copy -import ipaddress -import random -import unittest -from collections.abc import Callable, Iterable -from enum import Enum -from functools import total_ordering -from typing import Optional, Union, overload - -def net_to_prefix(net: Union[ipaddress.IPv4Network,ipaddress.IPv6Network]) -> list[bool]: - """ - Convert an IPv4 or IPv6 network to a prefix represented as a list of bits. - IPv4 ranges are remapped to their IPv4-mapped IPv6 range (::ffff:0:0/96). - """ - num_bits = net.prefixlen - netrange = int.from_bytes(net.network_address.packed, 'big') - - # Map an IPv4 prefix into IPv6 space. - if isinstance(net, ipaddress.IPv4Network): - num_bits += 96 - netrange += 0xffff00000000 - - # Strip unused bottom bits. - assert (netrange & ((1 << (128 - num_bits)) - 1)) == 0 - return [((netrange >> (127 - i)) & 1) != 0 for i in range(num_bits)] - -def prefix_to_net(prefix: list[bool]) -> Union[ipaddress.IPv4Network,ipaddress.IPv6Network]: - """The reverse operation of net_to_prefix.""" - # Convert to number - netrange = sum(b << (127 - i) for i, b in enumerate(prefix)) - num_bits = len(prefix) - assert num_bits <= 128 - - # Return IPv4 range if in ::ffff:0:0/96 - if num_bits >= 96 and (netrange >> 32) == 0xffff: - return ipaddress.IPv4Network((netrange & 0xffffffff, num_bits - 96), True) - - # Return IPv6 range otherwise. - return ipaddress.IPv6Network((netrange, num_bits), True) - -# Shortcut for (prefix, ASN) entries. -ASNEntry = tuple[list[bool], int] - -# Shortcut for (prefix, old ASN, new ASN) entries. -ASNDiff = tuple[list[bool], int, int] - -class _VarLenCoder: - """ - A class representing a custom variable-length binary encoder/decoder for - integers. Each object represents a different coder, with different parameters - minval and clsbits. - The encoding is easiest to describe using an example. Let's say minval=100 and - clsbits=[4,2,2,3]. In that case: - - x in [100..115]: encoded as [0] + [4-bit BE encoding of (x-100)]. - - x in [116..119]: encoded as [1,0] + [2-bit BE encoding of (x-116)]. - - x in [120..123]: encoded as [1,1,0] + [2-bit BE encoding of (x-120)]. - - x in [124..131]: encoded as [1,1,1] + [3-bit BE encoding of (x-124)]. - In general, every number is encoded as: - - First, k "1"-bits, where k is the class the number falls in (there is one class - per element of clsbits). - - Then, a "0"-bit, unless k is the highest class, in which case there is nothing. - - Lastly, clsbits[k] bits encoding in big endian the position in its class that - number falls into. - - Every class k consists of 2^clsbits[k] consecutive integers. k=0 starts at minval, - other classes start one past the last element of the class before it. - """ - - def __init__(self, minval: int, clsbits: list[int]): - """Construct a new _VarLenCoder.""" - self._minval = minval - self._clsbits = clsbits - self._maxval = minval + sum(1 << b for b in clsbits) - 1 - - def can_encode(self, val: int) -> bool: - """Check whether value val is in the range this coder supports.""" - return self._minval <= val <= self._maxval - - def encode(self, val: int, ret: list[int]) -> None: - """Append encoding of val onto integer list ret.""" - - assert self._minval <= val <= self._maxval - val -= self._minval - bits = 0 - for k, bits in enumerate(self._clsbits): - if val >> bits: - # If the value will not fit in class k, subtract its range from v, - # emit a "1" bit and continue with the next class. - val -= 1 << bits - ret.append(1) - else: - if k + 1 < len(self._clsbits): - # Unless we're in the last class, emit a "0" bit. - ret.append(0) - break - # And then encode v (now the position within the class) in big endian. - ret.extend((val >> (bits - 1 - b)) & 1 for b in range(bits)) - - def encode_size(self, val: int) -> int: - """Compute how many bits are needed to encode val.""" - assert self._minval <= val <= self._maxval - val -= self._minval - ret = 0 - bits = 0 - for k, bits in enumerate(self._clsbits): - if val >> bits: - val -= 1 << bits - ret += 1 - else: - ret += k + 1 < len(self._clsbits) - break - return ret + bits - - def decode(self, stream, bitpos) -> tuple[int,int]: - """Decode a number starting at bitpos in stream, returning value and new bitpos.""" - val = self._minval - bits = 0 - for k, bits in enumerate(self._clsbits): - bit = 0 - if k + 1 < len(self._clsbits): - bit = stream[bitpos] - bitpos += 1 - if not bit: - break - val += 1 << bits - for i in range(bits): - bit = stream[bitpos] - bitpos += 1 - val += bit << (bits - 1 - i) - return val, bitpos - -# Variable-length encoders used in the binary asmap format. -_CODER_INS = _VarLenCoder(0, [0, 0, 1]) -_CODER_ASN = _VarLenCoder(1, list(range(15, 25))) -_CODER_MATCH = _VarLenCoder(2, list(range(1, 9))) -_CODER_JUMP = _VarLenCoder(17, list(range(5, 31))) - -class _Instruction(Enum): - """One instruction in the binary asmap format.""" - # A return instruction, encoded as [0], returns a constant ASN. It is followed by - # an integer using the ASN encoding. - RETURN = 0 - # A jump instruction, encoded as [1,0] inspects the next unused bit in the input - # and either continues execution (if 0), or skips a specified number of bits (if 1). - # It is followed by an integer, and then two subprograms. The integer uses jump encoding - # and corresponds to the length of the first subprogram (so it can be skipped). - JUMP = 1 - # A match instruction, encoded as [1,1,0] inspects 1 or more of the next unused bits - # in the input with its argument. If they all match, execution continues. If they do - # not, failure is returned. If a default instruction has been executed before, instead - # of failure the default instruction's argument is returned. It is followed by an - # integer in match encoding, and a subprogram. That value is at least 2 bits and at - # most 9 bits. An n-bit value signifies matching (n-1) bits in the input with the lower - # (n-1) bits in the match value. - MATCH = 2 - # A default instruction, encoded as [1,1,1] sets the default variable to its argument, - # and continues execution. It is followed by an integer in ASN encoding, and a subprogram. - DEFAULT = 3 - # Not an actual instruction, but a way to encode the empty program that fails. In the - # encoder, it is used more generally to represent the failure case inside MATCH instructions, - # which may (if used inside the context of a DEFAULT instruction) actually correspond to - # a successful return. In this usage, they're always converted to an actual MATCH or RETURN - # before the top level is reached (see make_default below). - END = 4 - -class _BinNode: - """A class representing a (node of) the parsed binary asmap format.""" - - @overload - def __init__(self, ins: _Instruction): ... - @overload - def __init__(self, ins: _Instruction, arg1: int): ... - @overload - def __init__(self, ins: _Instruction, arg1: "_BinNode", arg2: "_BinNode"): ... - @overload - def __init__(self, ins: _Instruction, arg1: int, arg2: "_BinNode"): ... - - def __init__(self, ins: _Instruction, arg1=None, arg2=None): - """ - Construct a new asmap node. Possibilities are: - - _BinNode(_Instruction.RETURN, asn) - - _BinNode(_Instruction.JUMP, node_0, node_1) - - _BinNode(_Instruction.MATCH, val, node) - - _BinNode(_Instruction.DEFAULT, asn, node) - - _BinNode(_Instruction.END) - """ - self.ins = ins - self.arg1 = arg1 - self.arg2 = arg2 - if ins == _Instruction.RETURN: - assert isinstance(arg1, int) - assert arg2 is None - self.size = _CODER_INS.encode_size(ins.value) + _CODER_ASN.encode_size(arg1) - elif ins == _Instruction.JUMP: - assert isinstance(arg1, _BinNode) - assert isinstance(arg2, _BinNode) - self.size = (_CODER_INS.encode_size(ins.value) + _CODER_JUMP.encode_size(arg1.size) + - arg1.size + arg2.size) - elif ins == _Instruction.DEFAULT: - assert isinstance(arg1, int) - assert isinstance(arg2, _BinNode) - self.size = _CODER_INS.encode_size(ins.value) + _CODER_ASN.encode_size(arg1) + arg2.size - elif ins == _Instruction.MATCH: - assert isinstance(arg1, int) - assert isinstance(arg2, _BinNode) - self.size = (_CODER_INS.encode_size(ins.value) + _CODER_MATCH.encode_size(arg1) - + arg2.size) - elif ins == _Instruction.END: - assert arg1 is None - assert arg2 is None - self.size = 0 - else: - assert False - - @staticmethod - def make_end() -> "_BinNode": - """Constructor for a _BinNode with just an END instruction.""" - return _BinNode(_Instruction.END) - - @staticmethod - def make_leaf(val: int) -> "_BinNode": - """Constructor for a _BinNode of just a RETURN instruction.""" - assert val is not None and val > 0 - return _BinNode(_Instruction.RETURN, val) - - @staticmethod - def make_branch(node0: "_BinNode", node1: "_BinNode") -> "_BinNode": - """ - Construct a _BinNode corresponding to running either the node0 or node1 subprogram, - based on the next input bit. It exploits shortcuts that are possible in the encoding, - and uses either a JUMP, MATCH, or END instruction. - """ - if node0.ins == _Instruction.END and node1.ins == _Instruction.END: - return node0 - if node0.ins == _Instruction.END: - if node1.ins == _Instruction.MATCH and node1.arg1 <= 0xFF: - return _BinNode(node1.ins, node1.arg1 + (1 << node1.arg1.bit_length()), node1.arg2) - return _BinNode(_Instruction.MATCH, 3, node1) - if node1.ins == _Instruction.END: - if node0.ins == _Instruction.MATCH and node0.arg1 <= 0xFF: - return _BinNode(node0.ins, node0.arg1 + (1 << (node0.arg1.bit_length() - 1)), - node0.arg2) - return _BinNode(_Instruction.MATCH, 2, node0) - return _BinNode(_Instruction.JUMP, node0, node1) - - @staticmethod - def make_default(val: int, sub: "_BinNode") -> "_BinNode": - """ - Construct a _BinNode that corresponds to the specified subprogram, with the specified - default value. It exploits shortcuts that are possible in the encoding, and will use - either a DEFAULT or a RETURN instruction.""" - assert val is not None and val > 0 - if sub.ins == _Instruction.END: - return _BinNode(_Instruction.RETURN, val) - if sub.ins in (_Instruction.RETURN, _Instruction.DEFAULT): - return sub - return _BinNode(_Instruction.DEFAULT, val, sub) - -@total_ordering -class ASMap: - """ - A class whose objects represent a mapping from subnets to ASNs. - Internally the mapping is stored as a binary trie, but can be converted - from/to a list of ASNEntry objects, and from/to the binary asmap file format. - In the trie representation, nodes are represented as bare lists for efficiency - and ease of manipulation: - - [0] means an unassigned subnet (no ASN mapping for it is present) - - [int] means a subnet mapped entirely to the specified ASN. - - [node,node] means a subnet whose lower half and upper half have different - - mappings, represented by new trie nodes. - """ - - def update(self, prefix: list[bool], asn: int) -> None: - """Update this ASMap object to map prefix to the specified asn.""" - assert asn == 0 or _CODER_ASN.can_encode(asn) - - def recurse(node: list, offset: int) -> None: - if offset == len(prefix): - # Reached the end of prefix; overwrite this node. - node.clear() - node.append(asn) - return - if len(node) == 1: - # Need to descend into a leaf node; split it up. - oldasn = node[0] - node.clear() - node.append([oldasn]) - node.append([oldasn]) - # Descend into the node. - recurse(node[prefix[offset]], offset + 1) - # If the result is two identical leaf children, merge them. - if len(node[0]) == 1 and len(node[1]) == 1 and node[0] == node[1]: - oldasn = node[0][0] - node.clear() - node.append(oldasn) - recurse(self._trie, 0) - - def update_multi(self, entries: list[tuple[list[bool], int]]) -> None: - """Apply multiple update operations, where longer prefixes take precedence.""" - entries.sort(key=lambda entry: len(entry[0])) - for prefix, asn in entries: - self.update(prefix, asn) - - def _set_trie(self, trie) -> None: - """Set trie directly. Internal use only.""" - def recurse(node: list) -> None: - if len(node) < 2: - return - recurse(node[0]) - recurse(node[1]) - if len(node[0]) == 2: - return - if node[0] == node[1]: - if len(node[0]) == 0: - node.clear() - else: - asn = node[0][0] - node.clear() - node.append(asn) - recurse(trie) - self._trie = trie - - def __init__(self, entries: Optional[Iterable[ASNEntry]] = None) -> None: - """Construct an ASMap object from an optional list of entries.""" - self._trie = [0] - if entries is not None: - def entry_key(entry): - """Sort function that places shorter prefixes first.""" - prefix, asn = entry - return len(prefix), prefix, asn - for prefix, asn in sorted(entries, key=entry_key): - self.update(prefix, asn) - - def lookup(self, prefix: list[bool]) -> Optional[int]: - """Look up a prefix. Returns ASN, or 0 if unassigned, or None if indeterminate.""" - node = self._trie - for bit in prefix: - if len(node) == 1: - break - node = node[bit] - if len(node) == 1: - return node[0] - return None - - def _to_entries_flat(self, fill: bool = False) -> list[ASNEntry]: - """Convert an ASMap object to a list of non-overlapping (prefix, asn) objects.""" - prefix : list[bool] = [] - - def recurse(node: list) -> list[ASNEntry]: - ret = [] - if len(node) == 1: - if node[0] > 0: - ret = [(list(prefix), node[0])] - elif len(node) == 2: - prefix.append(False) - ret = recurse(node[0]) - prefix[-1] = True - ret += recurse(node[1]) - prefix.pop() - if fill and len(ret) > 1: - asns = set(x[1] for x in ret) - if len(asns) == 1: - ret = [(list(prefix), list(asns)[0])] - return ret - return recurse(self._trie) - - def _to_entries_minimal(self, fill: bool = False) -> list[ASNEntry]: - """Convert a trie to a minimal list of ASNEntry objects, exploiting overlap.""" - prefix : list[bool] = [] - - def recurse(node: list) -> (tuple[dict[Optional[int], list[ASNEntry]], bool]): - if len(node) == 1 and node[0] == 0: - return {None if fill else 0: []}, True - if len(node) == 1: - return {node[0]: [], None: [(list(prefix), node[0])]}, False - ret: dict[Optional[int], list[ASNEntry]] = {} - prefix.append(False) - left, lhole = recurse(node[0]) - prefix[-1] = True - right, rhole = recurse(node[1]) - prefix.pop() - hole = not fill and (lhole or rhole) - def candidate(ctx: Optional[int], res0: Optional[list[ASNEntry]], - res1: Optional[list[ASNEntry]]): - if res0 is not None and res1 is not None: - if ctx not in ret or len(res0) + len(res1) < len(ret[ctx]): - ret[ctx] = res0 + res1 - for ctx in set(left) | set(right): - candidate(ctx, left.get(ctx), right.get(ctx)) - candidate(ctx, left.get(None), right.get(ctx)) - candidate(ctx, left.get(ctx), right.get(None)) - if not hole: - for ctx in list(ret): - if ctx is not None: - candidate(None, [(list(prefix), ctx)], ret[ctx]) - if None in ret: - ret = {ctx:entries for ctx, entries in ret.items() - if ctx is None or len(entries) < len(ret[None])} - if hole: - ret = {ctx:entries for ctx, entries in ret.items() if ctx is None or ctx == 0} - return ret, hole - res, _ = recurse(self._trie) - return res[0] if 0 in res else res[None] - - def __str__(self) -> str: - """Convert this ASMap object to a string containing Python code constructing it.""" - return f"ASMap({self._trie})" - - def to_entries(self, overlapping: bool = True, fill: bool = False) -> list[ASNEntry]: - """ - Convert the mappings in this ASMap object to a list of ASNEntry objects. - Arguments: - overlapping: Permit the subnets in the resulting ASNEntry to overlap. - Setting this can result in a shorter list. - fill: Permit the resulting ASNEntry objects to cover subnets that - are unassigned in this ASMap object. Setting this can - result in a shorter list. - """ - if overlapping: - return self._to_entries_minimal(fill) - return self._to_entries_flat(fill) - - @staticmethod - def from_random(num_leaves: int = 10, max_asn: int = 6, - unassigned_prob: float = 0.5) -> "ASMap": - """ - Construct a random ASMap object, with specified: - - Number of leaves in its trie (at least 1) - - Maximum ASN value (at least 1) - - Probability for leaf nodes to be unassigned - The number of leaves in the resulting object may be less than what is - requested. This method is mostly intended for testing. - """ - assert num_leaves >= 1 - assert max_asn >= 1 or unassigned_prob == 1 - assert _CODER_ASN.can_encode(max_asn) - assert 0.0 <= unassigned_prob <= 1.0 - trie: list = [] - leaves = [trie] - ret = ASMap() - for i in range(1, num_leaves): - idx = random.randrange(i) - leaf = leaves[idx] - lastleaf = leaves.pop() - if idx + 1 < i: - leaves[idx] = lastleaf - leaf.append([]) - leaf.append([]) - leaves.append(leaf[0]) - leaves.append(leaf[1]) - for leaf in leaves: - if random.random() >= unassigned_prob: - leaf.append(random.randrange(1, max_asn + 1)) - else: - leaf.append(0) - #pylint: disable=protected-access - ret._set_trie(trie) - return ret - - def _to_binnode(self, fill: bool = False) -> _BinNode: - """Convert a trie to a _BinNode object.""" - def recurse(node: list) -> tuple[dict[Optional[int], _BinNode], bool]: - if len(node) == 1 and node[0] == 0: - return {(None if fill else 0): _BinNode.make_end()}, True - if len(node) == 1: - return {None: _BinNode.make_leaf(node[0]), node[0]: _BinNode.make_end()}, False - ret: dict[Optional[int], _BinNode] = {} - left, lhole = recurse(node[0]) - right, rhole = recurse(node[1]) - hole = (lhole or rhole) and not fill - - def candidate(ctx: Optional[int], arg1, arg2, func: Callable): - if arg1 is not None and arg2 is not None: - cand = func(arg1, arg2) - if ctx not in ret or cand.size < ret[ctx].size: - ret[ctx] = cand - - union = set(left) | set(right) - sorted_union = sorted(union, key=lambda x: (x is None, x)) - for ctx in sorted_union: - candidate(ctx, left.get(ctx), right.get(ctx), _BinNode.make_branch) - candidate(ctx, left.get(None), right.get(ctx), _BinNode.make_branch) - candidate(ctx, left.get(ctx), right.get(None), _BinNode.make_branch) - if not hole: - for ctx in sorted(set(ret) - set([None])): - candidate(None, ctx, ret[ctx], _BinNode.make_default) - if None in ret: - ret = {ctx:enc for ctx, enc in ret.items() - if ctx is None or enc.size < ret[None].size} - if hole: - ret = {ctx:enc for ctx, enc in ret.items() if ctx is None or ctx == 0} - return ret, hole - res, _ = recurse(self._trie) - return res[0] if 0 in res else res[None] - - @staticmethod - def _from_binnode(binnode: _BinNode) -> "ASMap": - """Construct an ASMap object from a _BinNode. Internal use only.""" - def recurse(node: _BinNode, default: int) -> list: - if node.ins == _Instruction.RETURN: - return [node.arg1] - if node.ins == _Instruction.JUMP: - return [recurse(node.arg1, default), recurse(node.arg2, default)] - if node.ins == _Instruction.MATCH: - val = node.arg1 - sub = recurse(node.arg2, default) - while val >= 2: - bit = val & 1 - val >>= 1 - if bit: - sub = [[default], sub] - else: - sub = [sub, [default]] - return sub - assert node.ins == _Instruction.DEFAULT - return recurse(node.arg2, node.arg1) - ret = ASMap() - if binnode.ins != _Instruction.END: - #pylint: disable=protected-access - ret._set_trie(recurse(binnode, 0)) - return ret - - def to_binary(self, fill: bool = False) -> bytes: - """ - Convert this ASMap object to binary. - Argument: - fill: permit the resulting binary encoder to contain mappers for - unassigned subnets in this ASMap object. Doing so may - reduce the size of the encoding. - Returns: - A bytes object with the encoding of this ASMap object. - """ - bits: list[int] = [] - - def recurse(node: _BinNode) -> None: - _CODER_INS.encode(node.ins.value, bits) - if node.ins == _Instruction.RETURN: - _CODER_ASN.encode(node.arg1, bits) - elif node.ins == _Instruction.JUMP: - _CODER_JUMP.encode(node.arg1.size, bits) - recurse(node.arg1) - recurse(node.arg2) - elif node.ins == _Instruction.DEFAULT: - _CODER_ASN.encode(node.arg1, bits) - recurse(node.arg2) - else: - assert node.ins == _Instruction.MATCH - _CODER_MATCH.encode(node.arg1, bits) - recurse(node.arg2) - - binnode = self._to_binnode(fill) - if binnode.ins != _Instruction.END: - recurse(binnode) - - val = 0 - nbits = 0 - ret = [] - for bit in bits: - val += (bit << nbits) - nbits += 1 - if nbits == 8: - ret.append(val) - val = 0 - nbits = 0 - if nbits: - ret.append(val) - return bytes(ret) - - @staticmethod - def from_binary(bindata: bytes) -> Optional["ASMap"]: - """Decode an ASMap object from the provided binary encoding.""" - - bits: list[int] = [] - for byte in bindata: - bits.extend((byte >> i) & 1 for i in range(8)) - - def recurse(bitpos: int) -> tuple[_BinNode, int]: - insval, bitpos = _CODER_INS.decode(bits, bitpos) - ins = _Instruction(insval) - if ins == _Instruction.RETURN: - asn, bitpos = _CODER_ASN.decode(bits, bitpos) - return _BinNode(ins, asn), bitpos - if ins == _Instruction.JUMP: - jump, bitpos = _CODER_JUMP.decode(bits, bitpos) - left, bitpos1 = recurse(bitpos) - if bitpos1 != bitpos + jump: - raise ValueError("Inconsistent jump") - right, bitpos = recurse(bitpos1) - return _BinNode(ins, left, right), bitpos - if ins == _Instruction.MATCH: - match, bitpos = _CODER_MATCH.decode(bits, bitpos) - sub, bitpos = recurse(bitpos) - return _BinNode(ins, match, sub), bitpos - assert ins == _Instruction.DEFAULT - asn, bitpos = _CODER_ASN.decode(bits, bitpos) - sub, bitpos = recurse(bitpos) - return _BinNode(ins, asn, sub), bitpos - - if len(bits) == 0: - binnode = _BinNode(_Instruction.END) - else: - try: - binnode, bitpos = recurse(0) - except (ValueError, IndexError): - return None - if bitpos < len(bits) - 7: - return None - if not all(bit == 0 for bit in bits[bitpos:]): - return None - - return ASMap._from_binnode(binnode) - - def __lt__(self, other: "ASMap") -> bool: - return self._trie < other._trie - - def __eq__(self, other: object) -> bool: - if isinstance(other, ASMap): - return self._trie == other._trie - return False - - def extends(self, req: "ASMap") -> bool: - """Determine whether this matches req for all subranges where req is assigned.""" - def recurse(actual: list, require: list) -> bool: - if len(require) == 1 and require[0] == 0: - return True - if len(require) == 1: - if len(actual) == 1: - return bool(require[0] == actual[0]) - return recurse(actual[0], require) and recurse(actual[1], require) - if len(actual) == 2: - return recurse(actual[0], require[0]) and recurse(actual[1], require[1]) - return recurse(actual, require[0]) and recurse(actual, require[1]) - assert isinstance(req, ASMap) - #pylint: disable=protected-access - return recurse(self._trie, req._trie) - - def diff(self, other: "ASMap") -> list[ASNDiff]: - """Compute the diff from self to other.""" - prefix: list[bool] = [] - ret: list[ASNDiff] = [] - - def recurse(old_node: list, new_node: list): - if len(old_node) == 1 and len(new_node) == 1: - if old_node[0] != new_node[0]: - ret.append((list(prefix), old_node[0], new_node[0])) - else: - old_left: list = old_node if len(old_node) == 1 else old_node[0] - old_right: list = old_node if len(old_node) == 1 else old_node[1] - new_left: list = new_node if len(new_node) == 1 else new_node[0] - new_right: list = new_node if len(new_node) == 1 else new_node[1] - prefix.append(False) - recurse(old_left, new_left) - prefix[-1] = True - recurse(old_right, new_right) - prefix.pop() - assert isinstance(other, ASMap) - #pylint: disable=protected-access - recurse(self._trie, other._trie) - return ret - - def __copy__(self) -> "ASMap": - """Construct a copy of this ASMap object. Its state will not be shared.""" - ret = ASMap() - #pylint: disable=protected-access - ret._set_trie(copy.deepcopy(self._trie)) - return ret - - def __deepcopy__(self, _) -> "ASMap": - # ASMap objects do not allow sharing of the _trie member, so we don't need the memoization. - return self.__copy__() - - -class TestASMap(unittest.TestCase): - """Unit tests for this module.""" - - def test_ipv6_prefix_roundtrips(self) -> None: - """Test that random IPv6 network ranges roundtrip through prefix encoding.""" - for _ in range(20): - net_bits = random.getrandbits(128) - for prefix_len in range(0, 129): - masked_bits = (net_bits >> (128 - prefix_len)) << (128 - prefix_len) - net = ipaddress.IPv6Network((masked_bits.to_bytes(16, 'big'), prefix_len)) - prefix = net_to_prefix(net) - self.assertTrue(len(prefix) <= 128) - net2 = prefix_to_net(prefix) - self.assertEqual(net, net2) - - def test_ipv4_prefix_roundtrips(self) -> None: - """Test that random IPv4 network ranges roundtrip through prefix encoding.""" - for _ in range(100): - net_bits = random.getrandbits(32) - for prefix_len in range(0, 33): - masked_bits = (net_bits >> (32 - prefix_len)) << (32 - prefix_len) - net = ipaddress.IPv4Network((masked_bits.to_bytes(4, 'big'), prefix_len)) - prefix = net_to_prefix(net) - self.assertTrue(32 <= len(prefix) <= 128) - net2 = prefix_to_net(prefix) - self.assertEqual(net, net2) - - def test_asmap_roundtrips(self) -> None: - """Test case that verifies random ASMap objects roundtrip to/from entries/binary.""" - # Iterate over the number of leaves the random test ASMap objects have. - for leaves in range(1, 20): - # Iterate over the number of bits in the AS numbers used. - for asnbits in range(0, 24): - # Iterate over the probability that leaves are unassigned. - for pct in range(101): - # Construct a random ASMap object according to the above parameters. - asmap = ASMap.from_random(num_leaves=leaves, max_asn=1 + (1 << asnbits), - unassigned_prob=0.01 * pct) - # Run tests for to_entries and construction from those entries, both - # for overlapping and non-overlapping ones. - for overlapping in [False, True]: - entries = asmap.to_entries(overlapping=overlapping, fill=False) - random.shuffle(entries) - asmap2 = ASMap(entries) - assert asmap2 is not None - self.assertEqual(asmap2, asmap) - entries = asmap.to_entries(overlapping=overlapping, fill=True) - random.shuffle(entries) - asmap2 = ASMap(entries) - assert asmap2 is not None - self.assertTrue(asmap2.extends(asmap)) - - # Run tests for to_binary and construction from binary. - enc = asmap.to_binary(fill=False) - asmap3 = ASMap.from_binary(enc) - assert asmap3 is not None - self.assertEqual(asmap3, asmap) - enc = asmap.to_binary(fill=True) - asmap3 = ASMap.from_binary(enc) - assert asmap3 is not None - self.assertTrue(asmap3.extends(asmap)) - - def test_patching(self) -> None: - """Test behavior of update, lookup, extends, and diff.""" - #pylint: disable=too-many-locals,too-many-nested-blocks - # Iterate over the number of leaves the random test ASMap objects have. - for leaves in range(1, 20): - # Iterate over the number of bits in the AS numbers used. - for asnbits in range(0, 10): - # Iterate over the probability that leaves are unassigned. - for pct in range(0, 101): - # Construct a random ASMap object according to the above parameters. - asmap = ASMap.from_random(num_leaves=leaves, max_asn=1 + (1 << asnbits), - unassigned_prob=0.01 * pct) - # Make a copy of that asmap object to which patches will be applied. - # It starts off being equal to asmap. - patched = copy.copy(asmap) - # Keep a list of patches performed. - patches: list[ASNEntry] = [] - # Initially there cannot be any difference. - self.assertEqual(asmap.diff(patched), []) - # Make 5 patches, each building on top of the previous ones. - for _ in range(0, 5): - # Construct a random path and new ASN to assign it to, apply it to patched, - # and remember it in patches. - pathlen = random.randrange(5) - path = [random.getrandbits(1) != 0 for _ in range(pathlen)] - newasn = random.randrange(1 + (1 << asnbits)) - patched.update(path, newasn) - patches = [(path, newasn)] + patches - - # Compute the diff, and whether asmap extends patched, and the other way - # around. - diff = asmap.diff(patched) - self.assertEqual(asmap == patched, len(diff) == 0) - extends = asmap.extends(patched) - back_extends = patched.extends(asmap) - # Determine whether those extends results are consistent with the diff - # result. - self.assertEqual(extends, all(d[2] == 0 for d in diff)) - self.assertEqual(back_extends, all(d[1] == 0 for d in diff)) - # For every diff found: - for path, old_asn, new_asn in diff: - # Verify asmap and patched actually differ there. - self.assertTrue(old_asn != new_asn) - self.assertEqual(asmap.lookup(path), old_asn) - self.assertEqual(patched.lookup(path), new_asn) - for _ in range(2): - # Extend the path far enough that it's smaller than any mapped - # range, and check the lookup holds there too. - spec_path = list(path) - while len(spec_path) < 32: - spec_path.append(random.getrandbits(1) != 0) - self.assertEqual(asmap.lookup(spec_path), old_asn) - self.assertEqual(patched.lookup(spec_path), new_asn) - # Search through the list of performed patches to find the last one - # applying to the extended path (note that patches is in reverse - # order, so the first match should work). - found = False - for patch_path, patch_asn in patches: - if spec_path[:len(patch_path)] == patch_path: - # When found, it must match whatever the result was patched - # to. - self.assertEqual(new_asn, patch_asn) - found = True - break - # And such a patch must exist. - self.assertTrue(found) - -if __name__ == '__main__': - unittest.main() diff --git a/contrib/completions/bash/BGL-cli.bash b/contrib/completions/bash/BGL-cli.bash deleted file mode 100644 index 66f67f087e..0000000000 --- a/contrib/completions/bash/BGL-cli.bash +++ /dev/null @@ -1,141 +0,0 @@ -# bash programmable completion for BGL-cli(1) -# Copyright (c) 2012-2022 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -# call $BGL-cli for RPC -_BGL_rpc() { - # determine already specified args necessary for RPC - local rpcargs=() - for i in ${COMP_LINE}; do - case "$i" in - -conf=*|-datadir=*|-regtest|-rpc*|-testnet) - rpcargs=( "${rpcargs[@]}" "$i" ) - ;; - esac - done - $BGL_cli "${rpcargs[@]}" "$@" -} - -_BGL_cli() { - local cur prev words=() cword - local BGL_cli - - # save and use original argument to invoke BGL-cli for -help, help and RPC - # as BGL-cli might not be in $PATH - BGL_cli="$1" - - COMPREPLY=() - _get_comp_words_by_ref -n = cur prev words cword - - if ((cword > 5)); then - case ${words[cword-5]} in - sendtoaddress) - COMPREPLY=( $( compgen -W "true false" -- "$cur" ) ) - return 0 - ;; - esac - fi - - if ((cword > 4)); then - case ${words[cword-4]} in - importaddress|listtransactions|setban) - COMPREPLY=( $( compgen -W "true false" -- "$cur" ) ) - return 0 - ;; - signrawtransactionwithkey|signrawtransactionwithwallet) - COMPREPLY=( $( compgen -W "ALL NONE SINGLE ALL|ANYONECANPAY NONE|ANYONECANPAY SINGLE|ANYONECANPAY" -- "$cur" ) ) - return 0 - ;; - esac - fi - - if ((cword > 3)); then - case ${words[cword-3]} in - addmultisigaddress) - return 0 - ;; - getbalance|gettxout|importaddress|importpubkey|importprivkey|listreceivedbyaddress|listsinceblock) - COMPREPLY=( $( compgen -W "true false" -- "$cur" ) ) - return 0 - ;; - esac - fi - - if ((cword > 2)); then - case ${words[cword-2]} in - addnode) - COMPREPLY=( $( compgen -W "add remove onetry" -- "$cur" ) ) - return 0 - ;; - setban) - COMPREPLY=( $( compgen -W "add remove" -- "$cur" ) ) - return 0 - ;; - fundrawtransaction|getblock|getblockheader|getmempoolancestors|getmempooldescendants|getrawtransaction|gettransaction|listreceivedbyaddress|sendrawtransaction) - COMPREPLY=( $( compgen -W "true false" -- "$cur" ) ) - return 0 - ;; - esac - fi - - case "$prev" in - backupwallet|dumpwallet|importwallet) - _filedir - return 0 - ;; - getaddednodeinfo|getrawmempool|lockunspent) - COMPREPLY=( $( compgen -W "true false" -- "$cur" ) ) - return 0 - ;; - getbalance|getnewaddress|listtransactions|sendmany) - return 0 - ;; - esac - - case "$cur" in - -conf=*) - cur="${cur#*=}" - _filedir - return 0 - ;; - -datadir=*) - cur="${cur#*=}" - _filedir -d - return 0 - ;; - -*=*) # prevent nonsense completions - return 0 - ;; - *) - local helpopts commands - - # only parse -help if senseful - if [[ -z "$cur" || "$cur" =~ ^- ]]; then - helpopts=$($BGL_cli -help 2>&1 | awk '$1 ~ /^-/ { sub(/=.*/, "="); print $1 }' ) - fi - - # only parse help if senseful - if [[ -z "$cur" || "$cur" =~ ^[a-z] ]]; then - commands=$(_BGL_rpc help 2>/dev/null | awk '$1 ~ /^[a-z]/ { print $1; }') - fi - - COMPREPLY=( $( compgen -W "$helpopts $commands" -- "$cur" ) ) - - # Prevent space if an argument is desired - if [[ $COMPREPLY == *= ]]; then - compopt -o nospace - fi - return 0 - ;; - esac -} && -complete -F _BGL_cli BGL-cli - -# Local variables: -# mode: shell-script -# sh-basic-offset: 4 -# sh-indent-comment: t -# indent-tabs-mode: nil -# End: -# ex: ts=4 sw=4 et filetype=sh diff --git a/contrib/completions/bash/BGL-tx.bash b/contrib/completions/bash/BGL-tx.bash deleted file mode 100644 index 4394b339b5..0000000000 --- a/contrib/completions/bash/BGL-tx.bash +++ /dev/null @@ -1,57 +0,0 @@ -# bash programmable completion for BGL-tx(1) -# Copyright (c) 2016-2022 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -_BGL_tx() { - local cur prev words=() cword - local BGL_tx - - # save and use original argument to invoke BGL-tx for -help - # it might not be in $PATH - BGL_tx="$1" - - COMPREPLY=() - _get_comp_words_by_ref -n =: cur prev words cword - - case "$cur" in - load=*:*) - cur="${cur#load=*:}" - _filedir - return 0 - ;; - *=*) # prevent attempts to complete other arguments - return 0 - ;; - esac - - if [[ "$cword" == 1 || ( "$prev" != "-create" && "$prev" == -* ) ]]; then - # only options (or an uncompletable hex-string) allowed - # parse BGL-tx -help for options - local helpopts - helpopts=$($BGL_tx -help | sed -e '/^ -/ p' -e d ) - COMPREPLY=( $( compgen -W "$helpopts" -- "$cur" ) ) - else - # only commands are allowed - # parse -help for commands - local helpcmds - helpcmds=$($BGL_tx -help | sed -e '1,/Commands:/d' -e 's/=.*/=/' -e '/^ [a-z]/ p' -e d ) - COMPREPLY=( $( compgen -W "$helpcmds" -- "$cur" ) ) - fi - - # Prevent space if an argument is desired - if [[ $COMPREPLY == *= ]]; then - compopt -o nospace - fi - - return 0 -} && -complete -F _BGL_tx BGL-tx - -# Local variables: -# mode: shell-script -# sh-basic-offset: 4 -# sh-indent-comment: t -# indent-tabs-mode: nil -# End: -# ex: ts=4 sw=4 et filetype=sh diff --git a/contrib/completions/bash/BGLd.bash b/contrib/completions/bash/BGLd.bash deleted file mode 100644 index 385e3110f9..0000000000 --- a/contrib/completions/bash/BGLd.bash +++ /dev/null @@ -1,56 +0,0 @@ -# bash programmable completion for BGLd(1) and BGL-qt(1) -# Copyright (c) 2012-2022 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -_BGLd() { - local cur prev words=() cword - local BGLd - - # save and use original argument to invoke BGLd for -help - # it might not be in $PATH - BGLd="$1" - - COMPREPLY=() - _get_comp_words_by_ref -n = cur prev words cword - - case "$cur" in - -conf=*|-pid=*|-loadblock=*|-rpccookiefile=*|-wallet=*) - cur="${cur#*=}" - _filedir - return 0 - ;; - -datadir=*) - cur="${cur#*=}" - _filedir -d - return 0 - ;; - -*=*) # prevent nonsense completions - return 0 - ;; - *) - - # only parse -help if sensible - if [[ -z "$cur" || "$cur" =~ ^- ]]; then - local helpopts - helpopts=$($BGLd -help 2>&1 | awk '$1 ~ /^-/ { sub(/=.*/, "="); print $1 }' ) - COMPREPLY=( $( compgen -W "$helpopts" -- "$cur" ) ) - fi - - # Prevent space if an argument is desired - if [[ $COMPREPLY == *= ]]; then - compopt -o nospace - fi - return 0 - ;; - esac -} && -complete -F _BGLd BGLd BGL-qt - -# Local variables: -# mode: shell-script -# sh-basic-offset: 4 -# sh-indent-comment: t -# indent-tabs-mode: nil -# End: -# ex: ts=4 sw=4 et filetype=sh diff --git a/contrib/completions/fish/BGL-cli.fish b/contrib/completions/fish/BGL-cli.fish deleted file mode 100644 index f76b941cbb..0000000000 --- a/contrib/completions/fish/BGL-cli.fish +++ /dev/null @@ -1,99 +0,0 @@ -# Disable files from being included in completions by default -complete --command BGL-cli --no-files - -function __fish_BGL_cli_get_commands_helper - set --local cmd (commandline -oc) - - # Don't return commands if '-help or -?' in commandline - if string match --quiet --regex -- '^-help$|^-\?$' $cmd - return - end - - # Strip help cmd from token to avoid duplication errors - set --local cmd (string match --invert --regex -- '^help$' $cmd) - # Strip -stdin* options to avoid waiting for input while we fetch completions - # TODO: this appears to be broken when run as tab completion (requires ctrl+c to exit) - set --local cmd (string match --invert --regex -- '^-stdin.*$' $cmd) - - # Match, format and return commands - for command in ($cmd help 2>&1 | string match --invert -r '^\=\=.*' | string match --invert -r '^\\s*$') - echo $command - end -end - -function __fish_BGL_cli_get_commands - argparse 'nohelp' 'commandsonly' -- $argv - set --local commands - - # Exclude description, exclude help - if set -q _flag_nohelp; and set -q _flag_commandsonly - set --append commands (__fish_BGL_cli_get_commands_helper | string replace -r ' .*$' '' | string match --invert -r 'help') - # Include description, exclude help - else if set -q _flag_nohelp - set --append commands (__fish_BGL_cli_get_commands_helper | string replace ' ' \t | string match --invert -r 'help') - # Exclude description, include help - else if set -q _flag_commandsonly - set --append commands (__fish_BGL_cli_get_commands_helper | string replace -r ' .*$' '') - # Include description, include help - else - set --append commands (__fish_BGL_cli_get_commands_helper | string replace ' ' \t) - end - - if string match -q -r '^.*error.*$' $commands[1] - # RPC offline or RPC wallet not loaded - return - else - for command in $commands - echo $command - end - end -end - - -function __fish_BGL_cli_get_options - argparse 'nofiles' -- $argv - set --local cmd (commandline -oc) - # Don't return options if '-help or -?' in commandline - if string match --quiet --regex -- '^-help$|-\?$' $cmd - return - end - set --local options - - if set -q _flag_nofiles - set --append options ($cmd -help 2>&1 | string match -r '^ -.*' | string replace -r ' -' '-' | string replace -r '=.*' '=' | string match --invert -r '^.*=$') - else - set --append options ($cmd -help 2>&1 | string match -r '^ -.*' | string replace -r ' -' '-' | string replace -r '=.*' '=' | string match -r '^.*=$') - end - - for option in $options - echo $option - end -end - -# Add options with file completion -# Don't offer after a command is given -complete \ - --command BGL-cli \ - --no-files \ - --condition "not __fish_seen_subcommand_from (__fish_BGL_cli_get_commands --commandsonly)" \ - --arguments "(__fish_BGL_cli_get_options)" -# Enable file completions only if the commandline now contains a `*.=` style option -complete --command BGL-cli \ - --condition 'string match --regex -- ".*=" (commandline -pt)' \ - --force-files - -# Add options without file completion -# Don't offer after a command is given -complete \ - --command BGL-cli \ - --no-files \ - --condition "not __fish_seen_subcommand_from (__fish_BGL_cli_get_commands --commandsonly)" \ - --arguments "(__fish_BGL_cli_get_options --nofiles)" - -# Add commands -# Permit command completions after `bitcoin-cli help` but not after other commands -complete \ - --command BGL-cli \ - --no-files \ - --condition "not __fish_seen_subcommand_from (__fish_BGL_cli_get_commands --commandsonly --nohelp)" \ - --arguments "(__fish_BGL_cli_get_commands)" diff --git a/contrib/completions/fish/BGL-qt.fish b/contrib/completions/fish/BGL-qt.fish deleted file mode 100644 index ca83e485a2..0000000000 --- a/contrib/completions/fish/BGL-qt.fish +++ /dev/null @@ -1,35 +0,0 @@ -# Disable files from being included in completions by default -complete --command BGL-qt --no-files - -# Extract options -function __fish_BGLqt_get_options - argparse 'nofiles' -- $argv - set --local cmd (commandline -opc)[1] - set --local options - - if set -q _flag_nofiles - set --append options ($cmd -help-debug | string match -r '^ -.*' | string replace -r ' -' '-' | string replace -r '=.*' '=' | string match --invert -r '^.*=$') - else - set --append options ($cmd -help-debug | string match -r '^ -.*' | string replace -r ' -' '-' | string replace -r '=.*' '=' | string match -r '^.*=$') - end - - for option in $options - echo $option - end -end - - -# Add options with file completion -complete \ - --command BGL-qt \ - --arguments "(__fish_BGLqt_get_options)" -# Enable file completions only if the commandline now contains a `*.=` style option -complete -c BGL-qt \ - --condition 'string match --regex -- ".*=" (commandline -pt)' \ - --force-files - -# Add options without file completion -complete \ - --command BGL-qt \ - --arguments "(__fish_BGLqt_get_options --nofiles)" - diff --git a/contrib/completions/fish/BGL-tx.fish b/contrib/completions/fish/BGL-tx.fish deleted file mode 100644 index 7523f0a933..0000000000 --- a/contrib/completions/fish/BGL-tx.fish +++ /dev/null @@ -1,65 +0,0 @@ -# Disable files from being included in completions by default -complete --command BGL-tx --no-files - -# Modified version of __fish_seen_subcommand_from -# Uses regex to detect cmd= syntax -function __fish_BGL_seen_cmd - set -l cmd (commandline -oc) - set -e cmd[1] - for i in $cmd - for j in $argv - if string match --quiet --regex -- "^$j.*" $i - return 0 - end - end - end - return 1 -end - -# Extract options -function __fish_BGL_tx_get_options - set --local cmd (commandline -oc)[1] - if string match --quiet --regex -- '^-help$|-\?$' $cmd - return - end - - for option in ($cmd -help 2>&1 | string match -r '^ -.*' | string replace -r ' -' '-' | string replace -r '=.*' '=') - echo $option - end -end - -# Extract commands -function __fish_BGL_tx_get_commands - argparse 'commandsonly' -- $argv - set --local cmd (commandline -oc)[1] - set --local commands - - if set -q _flag_commandsonly - set --append commands ($cmd -help | sed -e '1,/Commands:/d' -e 's/=/=\t/' -e 's/(=/=/' -e '/^ [a-z]/ p' -e d | string replace -r '\ \ ' '' | string replace -r '=.*' '') - else - set --append commands ($cmd -help | sed -e '1,/Commands:/d' -e 's/=/=\t/' -e 's/(=/=/' -e '/^ [a-z]/ p' -e d | string replace -r '\ \ ' '') - end - - for command in $commands - echo $command - end -end - -# Add options -complete \ - --command BGL-tx \ - --condition "not __fish_BGL_seen_cmd (__fish_BGL_tx_get_commands --commandsonly)" \ - --arguments "(__fish_BGL_tx_get_options)" \ - --no-files - -# Add commands -complete \ - --command BGL-tx \ - --arguments "(__fish_BGL_tx_get_commands)" \ - --no-files - -# Add file completions for load and set commands -complete \ - --command BGL-tx \ - --condition 'string match --regex -- "(load|set)=" (commandline -pt)' \ - --force-files diff --git a/contrib/completions/fish/BGL-util.fish b/contrib/completions/fish/BGL-util.fish deleted file mode 100644 index 2fc6ccf57a..0000000000 --- a/contrib/completions/fish/BGL-util.fish +++ /dev/null @@ -1,38 +0,0 @@ -# Disable files from being included in completions by default -complete --command BGL-util --no-files - -# Extract options -function __fish_BGL_util_get_options - set --local cmd (commandline -opc)[1] - set --local options - - set --append options ($cmd -help 2>&1 | string match -r '^ -.*' | string replace -r ' -' '-' | string replace -r '=.*' '=') - - for option in $options - echo $option - end -end - -# Extract commands -function __fish_BGL_util_get_commands - set --local cmd (commandline -opc)[1] - set --local commands - - set --append commands ($cmd -help | sed -e '1,/Commands:/d' -e 's/=/=\t/' -e 's/(=/=/' -e '/^ [a-z]/ p' -e d | string replace -r '\ \ ' '') - for command in $commands - echo $command - end -end - -# Add options -complete \ - --command BGL-util \ - --condition "not __fish_seen_subcommand_from (__fish_BGL_util_get_commands)" \ - --arguments "(__fish_BGL_util_get_options)" - -# Add commands -complete \ - --command BGL-util \ - --condition "not __fish_seen_subcommand_from (__fish_BGL_util_get_commands)" \ - --arguments "(__fish_BGL_util_get_commands)" - diff --git a/contrib/completions/fish/BGL-wallet.fish b/contrib/completions/fish/BGL-wallet.fish deleted file mode 100644 index 52de0cc03b..0000000000 --- a/contrib/completions/fish/BGL-wallet.fish +++ /dev/null @@ -1,35 +0,0 @@ -# Disable files from being included in completions by default -complete --command BGL-wallet --no-files - -# Extract options -function __fish_BGL_wallet_get_options - set --local cmd (commandline -opc)[1] - for option in ($cmd -help 2>&1 | string match -r '^ -.*' | string replace -r ' -' '-' | string replace -r '=.*' '=') - echo $option - end -end - -# Extract commands -function __fish_BGL_wallet_get_commands - set --local cmd (commandline -opc)[1] - for command in ($cmd -help | sed -e '1,/Commands:/d' -e 's/=/=\t/' -e 's/(=/=/' -e '/^ [a-z]/ p' -e d | string replace -r '\ \ ' '') - echo $command - end -end - -# Add options -complete \ - --command BGL-wallet \ - --condition "not __fish_seen_subcommand_from (__fish_BGL_wallet_get_commands)" \ - --arguments "(__fish_BGL_wallet_get_options)" - -# Add commands -complete \ - --command BGL-wallet \ - --condition "not __fish_seen_subcommand_from (__fish_BGL_wallet_get_commands)" \ - --arguments "(__fish_BGL_wallet_get_commands)" - -# Add file completions for load and set commands -complete --command BGL-wallet \ - --condition "string match -r -- '(dumpfile|datadir)*=' (commandline -pt)" \ - --force-files diff --git a/contrib/completions/fish/BGLd.fish b/contrib/completions/fish/BGLd.fish deleted file mode 100644 index dbecd87e17..0000000000 --- a/contrib/completions/fish/BGLd.fish +++ /dev/null @@ -1,35 +0,0 @@ -# Disable files from being included in completions by default -complete --command BGLd --no-files - -# Extract options -function __fish_BGLd_get_options - argparse 'nofiles' -- $argv - set --local cmd (commandline -opc)[1] - set --local options - - if set -q _flag_nofiles - set --append options ($cmd -help-debug | string match -r '^ -.*' | string replace -r ' -' '-' | string replace -r '=.*' '=' | string match --invert -r '^.*=$') - else - set --append options ($cmd -help-debug | string match -r '^ -.*' | string replace -r ' -' '-' | string replace -r '=.*' '=' | string match -r '^.*=$') - end - - for option in $options - echo $option - end -end - - -# Add options with file completion -complete \ - --command BGLd \ - --arguments "(__fish_BGLd_get_options)" -# Enable file completions only if the commandline now contains a `*.=` style option -complete --command BGLd \ - --condition 'string match --regex -- ".*=" (commandline -pt)' \ - --force-files - -# Add options without file completion -complete \ - --command BGLd \ - --arguments "(__fish_BGLd_get_options --nofiles)" - diff --git a/contrib/debian/copyright b/contrib/debian/copyright deleted file mode 100644 index 641c53997e..0000000000 --- a/contrib/debian/copyright +++ /dev/null @@ -1,147 +0,0 @@ -Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ -Upstream-Name: Bitcoin -Upstream-Contact: Satoshi Nakamoto - irc://#Bitcoin@freenode.net -Source: https://github.com/BitgesellOfficial/bitgesell - -Files: * -Copyright: 2009-2024, Bitcoin Core Developers -License: Expat -Comment: The Bitcoin Core Developers encompasses all contributors to the - project, listed in the release notes or the git log. - -Files: debian/* -Copyright: 2010-2011, Jonas Smedegaard - 2011, Matt Corallo -License: GPL-2+ - -Files: src/qt/res/icons/add.png - src/qt/res/icons/address-book.png - src/qt/res/icons/chevron.png - src/qt/res/icons/edit.png - src/qt/res/icons/editcopy.png - src/qt/res/icons/editpaste.png - src/qt/res/icons/export.png - src/qt/res/icons/eye.png - src/qt/res/icons/history.png - src/qt/res/icons/lock_*.png - src/qt/res/icons/overview.png - src/qt/res/icons/receive.png - src/qt/res/icons/remove.png - src/qt/res/icons/send.png - src/qt/res/icons/synced.png - src/qt/res/icons/transaction*.png - src/qt/res/icons/tx_output.png - src/qt/res/icons/warning.png -Copyright: Stephen Hutchings (and more) - http://typicons.com -License: Expat -Comment: Site: https://github.com/stephenhutchings/typicons.font - -Files: src/qt/res/icons/connect*.png - src/qt/res/src/connect-*.svg - src/qt/res/icons/network_disabled.png - src/qt/res/src/network_disabled.svg -Copyright: Marco Falke - Luke Dashjr -License: Expat -Comment: Inspired by Stephen Hutchings' Typicons - -Files: src/qt/res/icons/tx_mined.png - src/qt/res/src/mine.svg - src/qt/res/icons/fontbigger.png - src/qt/res/icons/fontsmaller.png - src/qt/res/icons/hd_disabled.png - src/qt/res/src/hd_disabled.svg - src/qt/res/icons/hd_enabled.png - src/qt/res/src/hd_enabled.svg -Copyright: Jonas Schnelli -License: Expat - -Files: src/qt/res/icons/clock*.png - src/qt/res/icons/eye_*.png - src/qt/res/icons/tx_in*.png - src/qt/res/src/clock_*.svg - src/qt/res/src/tx_*.svg -Copyright: Stephen Hutchings, Jonas Schnelli -License: Expat -Comment: Modifications of Stephen Hutchings' Typicons - -Files: src/qt/res/icons/BGL.* - share/pixmaps/BGL* - src/qt/res/src/BGL.svg -Copyright: Bitboy, Jonas Schnelli -License: public-domain -Comment: Site: https://BGLtalk.org/?topic=1756.0 - -Files: src/qt/res/icons/proxy.png - src/qt/res/src/proxy.svg -Copyright: Cristian Mircea Messel -License: public-domain - -Files: src/qt/res/fonts/RobotoMono-Bold.ttf -License: Apache-2.0 -Comment: Site: https://fonts.google.com/specimen/Roboto+Mono - - -License: Expat - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - . - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - . - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -License: GPL-2+ - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2, or (at your option) any - later version. - . - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. -Comment: - On Debian systems the GNU General Public License (GPL) version 2 is - located in '/usr/share/common-licenses/GPL-2'. - . - You should have received a copy of the GNU General Public License along - with this program. If not, see . - -License: GPL-3+ - Permission is granted to copy, distribute and/or modify this document - under the terms of the GNU General Public License, Version 3 or any - later version published by the Free Software Foundation. -Comment: - On Debian systems the GNU General Public License (GPL) version 3 is - located in '/usr/share/common-licenses/GPL-3'. - . - You should have received a copy of the GNU General Public License along - with this program. If not, see . - -License: public-domain - This work is in the public domain. - -License: Apache-2.0 - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/contrib/devtools/BGL-tidy/BGL-tidy.cpp b/contrib/devtools/BGL-tidy/BGL-tidy.cpp deleted file mode 100644 index b7a5e1b922..0000000000 --- a/contrib/devtools/BGL-tidy/BGL-tidy.cpp +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) 2023 Bitcoin Developers -// Distributed under the MIT software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. - -#include "logprintf.h" - -#include -#include - -class BGLModule final : public clang::tidy::ClangTidyModule -{ -public: - void addCheckFactories(clang::tidy::ClangTidyCheckFactories& CheckFactories) override - { - CheckFactories.registerCheck("BGL-unterminated-logprintf"); - } -}; - -static clang::tidy::ClangTidyModuleRegistry::Add - X("BGL-module", "Adds BGL checks."); - -volatile int BGLModuleAnchorSource = 0; diff --git a/contrib/devtools/BGL-tidy/CMakeLists.txt b/contrib/devtools/BGL-tidy/CMakeLists.txt deleted file mode 100644 index 0fb8eff269..0000000000 --- a/contrib/devtools/BGL-tidy/CMakeLists.txt +++ /dev/null @@ -1,56 +0,0 @@ -cmake_minimum_required(VERSION 3.9) - -project(BGL-tidy VERSION 1.0.0 DESCRIPTION "clang-tidy checks for BGL Core") - -include(GNUInstallDirs) - -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED True) -set(CMAKE_CXX_EXTENSIONS False) - -# TODO: Figure out how to avoid the terminfo check -find_package(LLVM REQUIRED CONFIG) -find_program(CLANG_TIDY_EXE NAMES "clang-tidy-${LLVM_VERSION_MAJOR}" "clang-tidy" HINTS ${LLVM_TOOLS_BINARY_DIR}) -message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}") -message(STATUS "Found clang-tidy: ${CLANG_TIDY_EXE}") - -add_library(BGL-tidy MODULE BGL-tidy.cpp logprintf.cpp) -target_include_directories(BGL-tidy SYSTEM PRIVATE ${LLVM_INCLUDE_DIRS}) - -# Disable RTTI and exceptions as necessary -if (MSVC) - target_compile_options(BGL-tidy PRIVATE /GR-) -else() - target_compile_options(BGL-tidy PRIVATE -fno-rtti) - target_compile_options(BGL-tidy PRIVATE -fno-exceptions) -endif() - -if(CMAKE_HOST_APPLE) - # ld64 expects no undefined symbols by default - target_link_options(BGL-tidy PRIVATE -Wl,-flat_namespace) - target_link_options(BGL-tidy PRIVATE -Wl,-undefined -Wl,suppress) -endif() - -# Add warnings -if (MSVC) - target_compile_options(BGL-tidy PRIVATE /W4) -else() - target_compile_options(BGL-tidy PRIVATE -Wall) - target_compile_options(BGL-tidy PRIVATE -Wextra) -endif() - -if(CMAKE_VERSION VERSION_LESS 3.27) - set(CLANG_TIDY_COMMAND "${CLANG_TIDY_EXE}" "--load=${CMAKE_BINARY_DIR}/${CMAKE_SHARED_MODULE_PREFIX}BGL-tidy${CMAKE_SHARED_MODULE_SUFFIX}" "-checks=-*,BGL-*") -else() - # CLANG_TIDY_COMMAND supports generator expressions as of 3.27 - set(CLANG_TIDY_COMMAND "${CLANG_TIDY_EXE}" "--load=$" "-checks=-*,BGL-*") -endif() - -# Create a dummy library that runs clang-tidy tests as a side-effect of building -add_library(BGL-tidy-tests OBJECT EXCLUDE_FROM_ALL example_logprintf.cpp) -add_dependencies(BGL-tidy-tests BGL-tidy) - -set_target_properties(BGL-tidy-tests PROPERTIES CXX_CLANG_TIDY "${CLANG_TIDY_COMMAND}") - - -install(TARGETS BGL-tidy LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) diff --git a/contrib/devtools/BGL-tidy/README.md b/contrib/devtools/BGL-tidy/README.md deleted file mode 100644 index ae8c9ef346..0000000000 --- a/contrib/devtools/BGL-tidy/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# Bitcoin Tidy - -Example Usage: - -```bash -cmake -S . -B build -DLLVM_DIR=$(llvm-config --cmakedir) -DCMAKE_BUILD_TYPE=Release - -cmake --build build -j$(nproc) - -cmake --build build --target BGL-tidy-tests -j$(nproc) -``` diff --git a/contrib/devtools/BGL-tidy/example_logprintf.cpp b/contrib/devtools/BGL-tidy/example_logprintf.cpp deleted file mode 100644 index 745ad3de08..0000000000 --- a/contrib/devtools/BGL-tidy/example_logprintf.cpp +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright (c) 2023 Bitcoin Developers -// Distributed under the MIT software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. - -#include - -// Test for bitcoin-unterminated-logprintf - -enum LogFlags { - NONE -}; - -enum Level { - None -}; - -template -static inline void LogPrintf_(const std::string& logging_function, const std::string& source_file, const int source_line, const LogFlags flag, const Level level, const char* fmt, const Args&... args) -{ -} - -#define LogPrintLevel_(category, level, ...) LogPrintf_(__func__, __FILE__, __LINE__, category, level, __VA_ARGS__) -#define LogPrintf(...) LogPrintLevel_(LogFlags::NONE, Level::None, __VA_ARGS__) - -#define LogPrint(category, ...) \ - do { \ - LogPrintf(__VA_ARGS__); \ - } while (0) - - -class CWallet -{ - std::string GetDisplayName() const - { - return "default wallet"; - } - -public: - template - void WalletLogPrintf(const char* fmt, Params... parameters) const - { - LogPrintf(("%s " + std::string{fmt}).c_str(), GetDisplayName(), parameters...); - }; -}; - -void good_func() -{ - LogPrintf("hello world!\n"); -} -void good_func2() -{ - CWallet wallet; - wallet.WalletLogPrintf("hi\n"); - - const CWallet& walletref = wallet; - walletref.WalletLogPrintf("hi\n"); - - auto* walletptr = new CWallet(); - walletptr->WalletLogPrintf("hi\n"); - delete walletptr; -} -void bad_func() -{ - LogPrintf("hello world!"); -} -void bad_func2() -{ - LogPrintf(""); -} -void bad_func3() -{ - // Ending in "..." has no special meaning. - LogPrintf("hello world!..."); -} -void bad_func4_ignored() -{ - LogPrintf("hello world!"); // NOLINT(BGL-unterminated-logprintf) -} -void bad_func5() -{ - CWallet wallet; - wallet.WalletLogPrintf("hi"); - - const CWallet& walletref = wallet; - walletref.WalletLogPrintf("hi"); - - auto* walletptr = new CWallet(); - walletptr->WalletLogPrintf("hi"); - delete walletptr; -} diff --git a/contrib/devtools/BGL-tidy/logprintf.cpp b/contrib/devtools/BGL-tidy/logprintf.cpp deleted file mode 100644 index f963f8c921..0000000000 --- a/contrib/devtools/BGL-tidy/logprintf.cpp +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright (c) 2023 Bitcoin Developers -// Distributed under the MIT software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. - -#include "logprintf.h" - -#include -#include - - -namespace { -AST_MATCHER(clang::StringLiteral, unterminated) -{ - size_t len = Node.getLength(); - if (len > 0 && Node.getCodeUnit(len - 1) == '\n') { - return false; - } - return true; -} -} // namespace - -namespace BGL { - -void LogPrintfCheck::registerMatchers(clang::ast_matchers::MatchFinder* finder) -{ - using namespace clang::ast_matchers; - - /* - Logprintf(..., ..., ..., ..., ..., "foo", ...) - */ - - finder->addMatcher( - callExpr( - callee(functionDecl(hasName("LogPrintf_"))), - hasArgument(5, stringLiteral(unterminated()).bind("logstring"))), - this); - - /* - CWallet wallet; - auto walletptr = &wallet; - wallet.WalletLogPrintf("foo"); - wallet->WalletLogPrintf("foo"); - */ - finder->addMatcher( - cxxMemberCallExpr( - thisPointerType(qualType(hasDeclaration(cxxRecordDecl(hasName("CWallet"))))), - callee(cxxMethodDecl(hasName("WalletLogPrintf"))), - hasArgument(0, stringLiteral(unterminated()).bind("logstring"))), - this); -} - -void LogPrintfCheck::check(const clang::ast_matchers::MatchFinder::MatchResult& Result) -{ - if (const clang::StringLiteral* lit = Result.Nodes.getNodeAs("logstring")) { - const clang::ASTContext& ctx = *Result.Context; - const auto user_diag = diag(lit->getEndLoc(), "Unterminated format string used with LogPrintf"); - const auto& loc = lit->getLocationOfByte(lit->getByteLength(), *Result.SourceManager, ctx.getLangOpts(), ctx.getTargetInfo()); - user_diag << clang::FixItHint::CreateInsertion(loc, "\\n"); - } -} - -} // namespace BGL diff --git a/contrib/devtools/BGL-tidy/logprintf.h b/contrib/devtools/BGL-tidy/logprintf.h deleted file mode 100644 index ef735e2dc9..0000000000 --- a/contrib/devtools/BGL-tidy/logprintf.h +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) 2023 Bitcoin Developers -// Distributed under the MIT software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. - -#ifndef LOGPRINTF_CHECK_H -#define LOGPRINTF_CHECK_H - -#include - -namespace BGL { - -// Warn about any use of LogPrintf that does not end with a newline. -class LogPrintfCheck final : public clang::tidy::ClangTidyCheck -{ -public: - LogPrintfCheck(clang::StringRef Name, clang::tidy::ClangTidyContext* Context) - : clang::tidy::ClangTidyCheck(Name, Context) {} - - bool isLanguageVersionSupported(const clang::LangOptions& LangOpts) const override - { - return LangOpts.CPlusPlus; - } - void registerMatchers(clang::ast_matchers::MatchFinder* Finder) override; - void check(const clang::ast_matchers::MatchFinder::MatchResult& Result) override; -}; - -} // namespace BGL - -#endif // LOGPRINTF_CHECK_H diff --git a/contrib/devtools/README.md b/contrib/devtools/README.md deleted file mode 100644 index c86efafeb2..0000000000 --- a/contrib/devtools/README.md +++ /dev/null @@ -1,158 +0,0 @@ -Contents -======== -This directory contains tools for developers working on this repository. - -clang-format-diff.py -=================== - -A script to format unified git diffs according to [.clang-format](../../src/.clang-format). - -Requires `clang-format`, installed e.g. via `brew install clang-format` on macOS, -or `sudo apt install clang-format` on Debian/Ubuntu. - -For instance, to format the last commit with 0 lines of context, -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 -==================== - -Provides utilities for managing copyright headers of `The BGL Core -developers` in repository source files. It has three subcommands: - -``` -$ ./copyright_header.py report [verbose] -$ ./copyright_header.py update -$ ./copyright_header.py insert -``` -Running these subcommands without arguments displays a usage string. - -copyright\_header.py report \ [verbose] ---------------------------------------------------------- - -Produces a report of all copyright header notices found inside the source files -of a repository. Useful to quickly visualize the state of the headers. -Specifying `verbose` will list the full filenames of files of each category. - -copyright\_header.py update \ [verbose] ---------------------------------------------------------- -Updates all the copyright headers of `The Bitcoin Core developers` which were -changed in a year more recent than is listed. For example: -``` -// Copyright (c) - The Bitcoin Core developers -``` -will be updated to: -``` -// Copyright (c) - The Bitcoin Core developers -``` -where `` is obtained from the `git log` history. - -This subcommand also handles copyright headers that have only a single year. In -those cases: -``` -// Copyright (c) The Bitcoin Core developers -``` -will be updated to: -``` -// Copyright (c) - The Bitcoin Core developers -``` -where the update is appropriate. - -copyright\_header.py insert \ ------------------------------------- -Inserts a copyright header for `The Bitcoin Core developers` at the top of the -file in either Python or C++ style as determined by the file extension. If the -file is a Python file and it has `#!` starting the first line, the header is -inserted in the line below it. - -The copyright dates will be set to be `-` where -`` is according to the `git log` history. If -`` is equal to ``, it will be set as a single -year rather than two hyphenated years. - -If the file already has a copyright for `The Bitcoin Core developers`, the -script will exit. - -gen-manpages.py -=============== - -A small script to automatically create manpages in ../../doc/man by running the release binaries with the -help option. -This requires help2man which can be found at: https://www.gnu.org/software/help2man/ - -With in-tree builds this tool can be run from any directory within the -repository. To use this tool with out-of-tree builds set `BUILDDIR`. For -example: - -```bash -BUILDDIR=$PWD/build contrib/devtools/gen-manpages.py -``` - -gen-BGL-conf.sh -======= -headerssync-params.py -===================== - -A script to generate optimal parameters for the headerssync module (src/headerssync.cpp). It takes no command-line -options, as all its configuration is set at the top of the file. It runs many times faster inside PyPy. Invocation: - -```bash -pypy3 contrib/devtools/headerssync-params.py -``` - -gen-bitcoin-conf.sh -=================== - -Generates a BGL.conf file in `share/examples/` by parsing the output from `BGLd --help`. This script is run during the -release process to include a BGL.conf with the release binaries and can also be run by users to generate a file locally. -When generating a file as part of the release process, make sure to commit the changes after running the script. - -With in-tree builds this tool can be run from any directory within the -repository. To use this tool with out-of-tree builds set `BUILDDIR`. For -example: - -```bash -BUILDDIR=$PWD/build contrib/devtools/gen-BGL-conf.sh -``` - -security-check.py and test-security-check.py -============================================ - -Perform basic security checks on a series of executables. - -symbol-check.py -=============== - -A script to check that release executables only contain -certain symbols and are only linked against allowed libraries. - -For Linux this means checking for allowed gcc, glibc and libstdc++ version symbols. -This makes sure they are still compatible with the minimum supported distribution versions. - -For macOS and Windows we check that the executables are only linked against libraries we allow. - -Example usage: - - find ../path/to/executables -type f -executable | xargs python3 contrib/devtools/symbol-check.py - -If no errors occur the return value will be 0 and the output will be empty. - -If there are any errors the return value will be 1 and output like this will be printed: - - .../64/test_BGL: symbol memcpy from unsupported version GLIBC_2.14 - .../64/test_BGL: symbol __fdelt_chk from unsupported version GLIBC_2.15 - .../64/test_BGL: symbol std::out_of_range::~out_of_range() from unsupported version GLIBCXX_3.4.15 - .../64/test_BGL: symbol _ZNSt8__detail15_List_nod from unsupported version GLIBCXX_3.4.15 - -circular-dependencies.py -======================== - -Run this script from the root of the source tree (`src/`) to find circular dependencies in the source code. -This looks only at which files include other files, treating the `.cpp` and `.h` file as one unit. - -Example usage: - - cd .../src - ../contrib/devtools/circular-dependencies.py {*,*/*,*/*/*}.{h,cpp} diff --git a/contrib/devtools/circular-dependencies.py b/contrib/devtools/circular-dependencies.py deleted file mode 100755 index b742a8cea6..0000000000 --- a/contrib/devtools/circular-dependencies.py +++ /dev/null @@ -1,91 +0,0 @@ -#!/usr/bin/env python3 -# Copyright (c) 2018-2020 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 sys -import re - -MAPPING = { - 'core_read.cpp': 'core_io.cpp', - 'core_write.cpp': 'core_io.cpp', -} - -# Directories with header-based modules, where the assumption that .cpp files -# define functions and variables declared in corresponding .h files is -# incorrect. -HEADER_MODULE_PATHS = [ - 'interfaces/' -] - -def module_name(path): - if path in MAPPING: - path = MAPPING[path] - if any(path.startswith(dirpath) for dirpath in HEADER_MODULE_PATHS): - return path - if path.endswith(".h"): - return path[:-2] - if path.endswith(".c"): - return path[:-2] - if path.endswith(".cpp"): - return path[:-4] - return None - -files = dict() -deps: dict[str, set[str]] = dict() - -RE = re.compile("^#include <(.*)>") - -# Iterate over files, and create list of modules -for arg in sys.argv[1:]: - module = module_name(arg) - if module is None: - print("Ignoring file %s (does not constitute module)\n" % arg) - else: - files[arg] = module - deps[module] = set() - -# Iterate again, and build list of direct dependencies for each module -# TODO: implement support for multiple include directories -for arg in sorted(files.keys()): - module = files[arg] - with open(arg, 'r', encoding="utf8") as f: - for line in f: - match = RE.match(line) - if match: - include = match.group(1) - included_module = module_name(include) - if included_module is not None and included_module in deps and included_module != module: - deps[module].add(included_module) - -# Loop to find the shortest (remaining) circular dependency -have_cycle: bool = False -while True: - shortest_cycle = None - for module in sorted(deps.keys()): - # Build the transitive closure of dependencies of module - closure: dict[str, list[str]] = dict() - for dep in deps[module]: - closure[dep] = [] - while True: - old_size = len(closure) - old_closure_keys = sorted(closure.keys()) - for src in old_closure_keys: - for dep in deps[src]: - if dep not in closure: - closure[dep] = closure[src] + [src] - if len(closure) == old_size: - break - # If module is in its own transitive closure, it's a circular dependency; check if it is the shortest - if module in closure and (shortest_cycle is None or len(closure[module]) + 1 < len(shortest_cycle)): - shortest_cycle = [module] + closure[module] - if shortest_cycle is None: - break - # We have the shortest circular dependency; report it - module = shortest_cycle[0] - print("Circular dependency: %s" % (" -> ".join(shortest_cycle + [module]))) - # And then break the dependency to avoid repeating in other cycles - deps[shortest_cycle[-1]] = deps[shortest_cycle[-1]] - set([module]) - have_cycle = True - -sys.exit(1 if have_cycle else 0) diff --git a/contrib/devtools/clang-format-diff.py b/contrib/devtools/clang-format-diff.py deleted file mode 100755 index e2b661d65d..0000000000 --- a/contrib/devtools/clang-format-diff.py +++ /dev/null @@ -1,190 +0,0 @@ -#!/usr/bin/env python3 -# -# ===- clang-format-diff.py - ClangFormat Diff Reformatter ----*- python -*--===# -# -# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -# See https://llvm.org/LICENSE.txt for license information. -# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -# -# ===------------------------------------------------------------------------===# - -""" -This script reads input from a unified diff and reformats all the changed -lines. This is useful to reformat all the lines touched by a specific patch. -Example usage for git/svn users: - - git diff -U0 --no-color --relative HEAD^ | {clang_format_diff} -p1 -i - svn diff --diff-cmd=diff -x-U0 | {clang_format_diff} -i - -It should be noted that the filename contained in the diff is used unmodified -to determine the source file to update. Users calling this script directly -should be careful to ensure that the path in the diff is correct relative to the -current working directory. -""" -from __future__ import absolute_import, division, print_function - -import argparse -import difflib -import re -import subprocess -import sys - -from io import StringIO - - -def main(): - parser = argparse.ArgumentParser( - description=__doc__.format(clang_format_diff="%(prog)s"), - formatter_class=argparse.RawDescriptionHelpFormatter, - ) - parser.add_argument( - "-i", - action="store_true", - default=False, - help="apply edits to files instead of displaying a diff", - ) - parser.add_argument( - "-p", - metavar="NUM", - default=0, - help="strip the smallest prefix containing P slashes", - ) - parser.add_argument( - "-regex", - metavar="PATTERN", - default=None, - help="custom pattern selecting file paths to reformat " - "(case sensitive, overrides -iregex)", - ) - parser.add_argument( - "-iregex", - metavar="PATTERN", - default=r".*\.(?:cpp|cc|c\+\+|cxx|cppm|ccm|cxxm|c\+\+m|c|cl|h|hh|hpp" - r"|hxx|m|mm|inc|js|ts|proto|protodevel|java|cs|json|s?vh?)", - help="custom pattern selecting file paths to reformat " - "(case insensitive, overridden by -regex)", - ) - parser.add_argument( - "-sort-includes", - action="store_true", - default=False, - help="let clang-format sort include blocks", - ) - parser.add_argument( - "-v", - "--verbose", - action="store_true", - help="be more verbose, ineffective without -i", - ) - parser.add_argument( - "-style", - help="formatting style to apply (LLVM, GNU, Google, Chromium, " - "Microsoft, Mozilla, WebKit)", - ) - parser.add_argument( - "-fallback-style", - help="The name of the predefined style used as a" - "fallback in case clang-format is invoked with" - "-style=file, but can not find the .clang-format" - "file to use.", - ) - parser.add_argument( - "-binary", - default="clang-format", - help="location of binary to use for clang-format", - ) - args = parser.parse_args() - - # Extract changed lines for each file. - filename = None - lines_by_file = {} - for line in sys.stdin: - match = re.search(r"^\+\+\+\ (.*?/){%s}(\S*)" % args.p, line) - if match: - filename = match.group(2) - if filename is None: - continue - - if args.regex is not None: - if not re.match("^%s$" % args.regex, filename): - continue - else: - if not re.match("^%s$" % args.iregex, filename, re.IGNORECASE): - continue - - match = re.search(r"^@@.*\+(\d+)(?:,(\d+))?", line) - if match: - start_line = int(match.group(1)) - line_count = 1 - if match.group(2): - line_count = int(match.group(2)) - # The input is something like - # - # @@ -1, +0,0 @@ - # - # which means no lines were added. - if line_count == 0: - continue - # Also format lines range if line_count is 0 in case of deleting - # surrounding statements. - end_line = start_line - if line_count != 0: - end_line += line_count - 1 - lines_by_file.setdefault(filename, []).extend( - ["-lines", str(start_line) + ":" + str(end_line)] - ) - - # Reformat files containing changes in place. - for filename, lines in lines_by_file.items(): - if args.i and args.verbose: - print("Formatting {}".format(filename)) - command = [args.binary, filename] - if args.i: - command.append("-i") - if args.sort_includes: - command.append("-sort-includes") - command.extend(lines) - if args.style: - command.extend(["-style", args.style]) - if args.fallback_style: - command.extend(["-fallback-style", args.fallback_style]) - - try: - p = subprocess.Popen( - command, - stdout=subprocess.PIPE, - stderr=None, - stdin=subprocess.PIPE, - universal_newlines=True, - ) - except OSError as e: - # Give the user more context when clang-format isn't - # found/isn't executable, etc. - raise RuntimeError( - 'Failed to run "%s" - %s"' % (" ".join(command), e.strerror) - ) - - stdout, stderr = p.communicate() - if p.returncode != 0: - sys.exit(p.returncode) - - if not args.i: - with open(filename, encoding="utf8") as f: - code = f.readlines() - formatted_code = StringIO(stdout).readlines() - diff = difflib.unified_diff( - code, - formatted_code, - filename, - filename, - "(before formatting)", - "(after formatting)", - ) - diff_string = "".join(diff) - if len(diff_string) > 0: - sys.stdout.write(diff_string) - sys.exit(1) - - -if __name__ == "__main__": - main() diff --git a/contrib/devtools/copyright_header.py b/contrib/devtools/copyright_header.py deleted file mode 100755 index 0687a997a2..0000000000 --- a/contrib/devtools/copyright_header.py +++ /dev/null @@ -1,603 +0,0 @@ -#!/usr/bin/env python3 -# Copyright (c) 2016-2022 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 re -import fnmatch -import sys -import subprocess -import datetime -import os - -################################################################################ -# file filtering -################################################################################ - -EXCLUDE = [ - # auto generated: - 'src/qt/BGLstrings.cpp', - 'src/chainparamsseeds.h', - # other external copyrights: - 'src/reverse_iterator.h', - 'src/test/fuzz/FuzzedDataProvider.h', - 'src/tinyformat.h', - 'src/bench/nanobench.h', - 'test/functional/test_framework/bignum.py', - # python init: - '*__init__.py', -] -EXCLUDE_COMPILED = re.compile('|'.join([fnmatch.translate(m) for m in EXCLUDE])) - -EXCLUDE_DIRS = [ - # git subtrees - "src/crypto/ctaes/", - "src/leveldb/", - "src/secp256k1/", - "src/crc32c/", -] - -INCLUDE = ['*.h', '*.cpp', '*.cc', '*.c', '*.mm', '*.py', '*.sh', '*.bash-completion'] -INCLUDE_COMPILED = re.compile('|'.join([fnmatch.translate(m) for m in INCLUDE])) - -def applies_to_file(filename): - for excluded_dir in EXCLUDE_DIRS: - if filename.startswith(excluded_dir): - return False - return ((EXCLUDE_COMPILED.match(filename) is None) and - (INCLUDE_COMPILED.match(filename) is not None)) - -################################################################################ -# obtain list of files in repo according to INCLUDE and EXCLUDE -################################################################################ - -GIT_LS_CMD = 'git ls-files --full-name'.split(' ') -GIT_TOPLEVEL_CMD = 'git rev-parse --show-toplevel'.split(' ') - -def call_git_ls(base_directory): - out = subprocess.check_output([*GIT_LS_CMD, base_directory]) - return [f for f in out.decode("utf-8").split('\n') if f != ''] - -def call_git_toplevel(): - "Returns the absolute path to the project root" - return subprocess.check_output(GIT_TOPLEVEL_CMD).strip().decode("utf-8") - -def get_filenames_to_examine(base_directory): - "Returns an array of absolute paths to any project files in the base_directory that pass the include/exclude filters" - root = call_git_toplevel() - filenames = call_git_ls(base_directory) - return sorted([os.path.join(root, filename) for filename in filenames if - applies_to_file(filename)]) - -################################################################################ -# define and compile regexes for the patterns we are looking for -################################################################################ - - -COPYRIGHT_WITH_C = r'Copyright \(c\)' -COPYRIGHT_WITHOUT_C = 'Copyright' -ANY_COPYRIGHT_STYLE = '(%s|%s)' % (COPYRIGHT_WITH_C, COPYRIGHT_WITHOUT_C) - -YEAR = "20[0-9][0-9]" -YEAR_RANGE = '(%s)(-%s)?' % (YEAR, YEAR) -YEAR_LIST = '(%s)(, %s)+' % (YEAR, YEAR) -ANY_YEAR_STYLE = '(%s|%s)' % (YEAR_RANGE, YEAR_LIST) -ANY_COPYRIGHT_STYLE_OR_YEAR_STYLE = ("%s %s" % (ANY_COPYRIGHT_STYLE, - ANY_YEAR_STYLE)) - -ANY_COPYRIGHT_COMPILED = re.compile(ANY_COPYRIGHT_STYLE_OR_YEAR_STYLE) - -def compile_copyright_regex(copyright_style, year_style, name): - return re.compile(r'%s %s,? %s( +\*)?\n' % (copyright_style, year_style, name)) - -EXPECTED_HOLDER_NAMES = [ - r"Satoshi Nakamoto", - r"The Bitcoin Core developers", - r"BitPay Inc\.", - r"University of Illinois at Urbana-Champaign\.", - r"Pieter Wuille", - r"Wladimir J\. van der Laan", - r"Jeff Garzik", - r"Jan-Klaas Kollhof", - r"ArtForz -- public domain half-a-node", - r"Intel Corporation ?", - r"The Zcash developers", - r"Jeremy Rubin", -] - -DOMINANT_STYLE_COMPILED = {} -YEAR_LIST_STYLE_COMPILED = {} -WITHOUT_C_STYLE_COMPILED = {} - -for holder_name in EXPECTED_HOLDER_NAMES: - DOMINANT_STYLE_COMPILED[holder_name] = ( - compile_copyright_regex(COPYRIGHT_WITH_C, YEAR_RANGE, holder_name)) - YEAR_LIST_STYLE_COMPILED[holder_name] = ( - compile_copyright_regex(COPYRIGHT_WITH_C, YEAR_LIST, holder_name)) - WITHOUT_C_STYLE_COMPILED[holder_name] = ( - compile_copyright_regex(COPYRIGHT_WITHOUT_C, ANY_YEAR_STYLE, - holder_name)) - -################################################################################ -# search file contents for copyright message of particular category -################################################################################ - -def get_count_of_copyrights_of_any_style_any_holder(contents): - return len(ANY_COPYRIGHT_COMPILED.findall(contents)) - -def file_has_dominant_style_copyright_for_holder(contents, holder_name): - match = DOMINANT_STYLE_COMPILED[holder_name].search(contents) - return match is not None - -def file_has_year_list_style_copyright_for_holder(contents, holder_name): - match = YEAR_LIST_STYLE_COMPILED[holder_name].search(contents) - return match is not None - -def file_has_without_c_style_copyright_for_holder(contents, holder_name): - match = WITHOUT_C_STYLE_COMPILED[holder_name].search(contents) - return match is not None - -################################################################################ -# get file info -################################################################################ - -def read_file(filename): - return open(filename, 'r', encoding="utf8").read() - -def gather_file_info(filename): - info = {} - info['filename'] = filename - c = read_file(filename) - info['contents'] = c - - info['all_copyrights'] = get_count_of_copyrights_of_any_style_any_holder(c) - - info['classified_copyrights'] = 0 - info['dominant_style'] = {} - info['year_list_style'] = {} - info['without_c_style'] = {} - for holder_name in EXPECTED_HOLDER_NAMES: - has_dominant_style = ( - file_has_dominant_style_copyright_for_holder(c, holder_name)) - has_year_list_style = ( - file_has_year_list_style_copyright_for_holder(c, holder_name)) - has_without_c_style = ( - file_has_without_c_style_copyright_for_holder(c, holder_name)) - info['dominant_style'][holder_name] = has_dominant_style - info['year_list_style'][holder_name] = has_year_list_style - info['without_c_style'][holder_name] = has_without_c_style - if has_dominant_style or has_year_list_style or has_without_c_style: - info['classified_copyrights'] = info['classified_copyrights'] + 1 - return info - -################################################################################ -# report execution -################################################################################ - -SEPARATOR = '-'.join(['' for _ in range(80)]) - -def print_filenames(filenames, verbose): - if not verbose: - return - for filename in filenames: - print("\t%s" % filename) - -def print_report(file_infos, verbose): - print(SEPARATOR) - examined = [i['filename'] for i in file_infos] - print("%d files examined according to INCLUDE and EXCLUDE fnmatch rules" % - len(examined)) - print_filenames(examined, verbose) - - print(SEPARATOR) - print('') - zero_copyrights = [i['filename'] for i in file_infos if - i['all_copyrights'] == 0] - print("%4d with zero copyrights" % len(zero_copyrights)) - print_filenames(zero_copyrights, verbose) - one_copyright = [i['filename'] for i in file_infos if - i['all_copyrights'] == 1] - print("%4d with one copyright" % len(one_copyright)) - print_filenames(one_copyright, verbose) - two_copyrights = [i['filename'] for i in file_infos if - i['all_copyrights'] == 2] - print("%4d with two copyrights" % len(two_copyrights)) - print_filenames(two_copyrights, verbose) - three_copyrights = [i['filename'] for i in file_infos if - i['all_copyrights'] == 3] - print("%4d with three copyrights" % len(three_copyrights)) - print_filenames(three_copyrights, verbose) - four_or_more_copyrights = [i['filename'] for i in file_infos if - i['all_copyrights'] >= 4] - print("%4d with four or more copyrights" % len(four_or_more_copyrights)) - print_filenames(four_or_more_copyrights, verbose) - print('') - print(SEPARATOR) - print('Copyrights with dominant style:\ne.g. "Copyright (c)" and ' - '"" or "-":\n') - for holder_name in EXPECTED_HOLDER_NAMES: - dominant_style = [i['filename'] for i in file_infos if - i['dominant_style'][holder_name]] - if len(dominant_style) > 0: - print("%4d with '%s'" % (len(dominant_style), - holder_name.replace('\n', '\\n'))) - print_filenames(dominant_style, verbose) - print('') - print(SEPARATOR) - print('Copyrights with year list style:\ne.g. "Copyright (c)" and ' - '", , ...":\n') - for holder_name in EXPECTED_HOLDER_NAMES: - year_list_style = [i['filename'] for i in file_infos if - i['year_list_style'][holder_name]] - if len(year_list_style) > 0: - print("%4d with '%s'" % (len(year_list_style), - holder_name.replace('\n', '\\n'))) - print_filenames(year_list_style, verbose) - print('') - print(SEPARATOR) - print('Copyrights with no "(c)" style:\ne.g. "Copyright" and "" or ' - '"-":\n') - for holder_name in EXPECTED_HOLDER_NAMES: - without_c_style = [i['filename'] for i in file_infos if - i['without_c_style'][holder_name]] - if len(without_c_style) > 0: - print("%4d with '%s'" % (len(without_c_style), - holder_name.replace('\n', '\\n'))) - print_filenames(without_c_style, verbose) - - print('') - print(SEPARATOR) - - unclassified_copyrights = [i['filename'] for i in file_infos if - i['classified_copyrights'] < i['all_copyrights']] - print("%d with unexpected copyright holder names" % - len(unclassified_copyrights)) - print_filenames(unclassified_copyrights, verbose) - print(SEPARATOR) - -def exec_report(base_directory, verbose): - filenames = get_filenames_to_examine(base_directory) - file_infos = [gather_file_info(f) for f in filenames] - print_report(file_infos, verbose) - -################################################################################ -# report cmd -################################################################################ - -REPORT_USAGE = """ -Produces a report of all copyright header notices found inside the source files -of a repository. - -Usage: - $ ./copyright_header.py report [verbose] - -Arguments: - - The base directory of a BGL source code repository. - [verbose] - Includes a list of every file of each subcategory in the report. -""" - -def report_cmd(argv): - if len(argv) == 2: - sys.exit(REPORT_USAGE) - - base_directory = argv[2] - if not os.path.exists(base_directory): - sys.exit("*** bad : %s" % base_directory) - - if len(argv) == 3: - verbose = False - elif argv[3] == 'verbose': - verbose = True - else: - sys.exit("*** unknown argument: %s" % argv[2]) - - exec_report(base_directory, verbose) - -################################################################################ -# query git for year of last change -################################################################################ - -GIT_LOG_CMD = "git log --pretty=format:%%ai %s" - -def call_git_log(filename): - out = subprocess.check_output((GIT_LOG_CMD % filename).split(' ')) - return out.decode("utf-8").split('\n') - -def get_git_change_years(filename): - git_log_lines = call_git_log(filename) - if len(git_log_lines) == 0: - return [datetime.date.today().year] - # timestamp is in ISO 8601 format. e.g. "2016-09-05 14:25:32 -0600" - return [line.split(' ')[0].split('-')[0] for line in git_log_lines] - -def get_most_recent_git_change_year(filename): - return max(get_git_change_years(filename)) - -################################################################################ -# read and write to file -################################################################################ - -def read_file_lines(filename): - with open(filename, 'r', encoding="utf8") as f: - file_lines = f.readlines() - return file_lines - -def write_file_lines(filename, file_lines): - with open(filename, 'w', encoding="utf8") as f: - f.write(''.join(file_lines)) - -################################################################################ -# update header years execution -################################################################################ - -COPYRIGHT = r'Copyright \(c\)' -YEAR = "20[0-9][0-9]" -YEAR_RANGE = '(%s)(-%s)?' % (YEAR, YEAR) -HOLDER = 'The Bitcoin Core developers' -UPDATEABLE_LINE_COMPILED = re.compile(' '.join([COPYRIGHT, YEAR_RANGE, HOLDER])) - -def get_updatable_copyright_line(file_lines): - index = 0 - for line in file_lines: - if UPDATEABLE_LINE_COMPILED.search(line) is not None: - return index, line - index = index + 1 - return None, None - -def parse_year_range(year_range): - year_split = year_range.split('-') - start_year = year_split[0] - if len(year_split) == 1: - return start_year, start_year - return start_year, year_split[1] - -def year_range_to_str(start_year, end_year): - if start_year == end_year: - return start_year - return "%s-%s" % (start_year, end_year) - -def create_updated_copyright_line(line, last_git_change_year): - copyright_splitter = 'Copyright (c) ' - copyright_split = line.split(copyright_splitter) - # Preserve characters on line that are ahead of the start of the copyright - # notice - they are part of the comment block and vary from file-to-file. - before_copyright = copyright_split[0] - after_copyright = copyright_split[1] - - space_split = after_copyright.split(' ') - year_range = space_split[0] - start_year, end_year = parse_year_range(year_range) - if end_year >= last_git_change_year: - return line - return (before_copyright + copyright_splitter + - year_range_to_str(start_year, last_git_change_year) + ' ' + - ' '.join(space_split[1:])) - -def update_updatable_copyright(filename): - file_lines = read_file_lines(filename) - index, line = get_updatable_copyright_line(file_lines) - if not line: - print_file_action_message(filename, "No updatable copyright.") - return - last_git_change_year = get_most_recent_git_change_year(filename) - new_line = create_updated_copyright_line(line, last_git_change_year) - if line == new_line: - print_file_action_message(filename, "Copyright up-to-date.") - return - file_lines[index] = new_line - write_file_lines(filename, file_lines) - print_file_action_message(filename, - "Copyright updated! -> %s" % last_git_change_year) - -def exec_update_header_year(base_directory): - for filename in get_filenames_to_examine(base_directory): - update_updatable_copyright(filename) - -################################################################################ -# update cmd -################################################################################ - -UPDATE_USAGE = """ -Updates all the copyright headers of "The Bitcoin Core developers" which were -changed in a year more recent than is listed. For example: - -// Copyright (c) - The Bitcoin Core developers - -will be updated to: - -// Copyright (c) - The Bitcoin Core developers - -where is obtained from the 'git log' history. - -This subcommand also handles copyright headers that have only a single year. In those cases: - -// Copyright (c) The Bitcoin Core developers - -will be updated to: - -// Copyright (c) - The Bitcoin Core developers - -where the update is appropriate. - -Usage: - $ ./copyright_header.py update - -Arguments: - - The base directory of a BGL source code repository. -""" - -def print_file_action_message(filename, action): - print("%-52s %s" % (filename, action)) - -def update_cmd(argv): - if len(argv) != 3: - sys.exit(UPDATE_USAGE) - - base_directory = argv[2] - if not os.path.exists(base_directory): - sys.exit("*** bad base_directory: %s" % base_directory) - exec_update_header_year(base_directory) - -################################################################################ -# inserted copyright header format -################################################################################ - -def get_header_lines(header, start_year, end_year): - lines = header.split('\n')[1:-1] - lines[0] = lines[0] % year_range_to_str(start_year, end_year) - return [line + '\n' for line in lines] - -CPP_HEADER = ''' -// Copyright (c) %s The Bitcoin Core developers -// Distributed under the MIT software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. -''' - -def get_cpp_header_lines_to_insert(start_year, end_year): - return reversed(get_header_lines(CPP_HEADER, start_year, end_year)) - -SCRIPT_HEADER = ''' -# Copyright (c) %s The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. -''' - -def get_script_header_lines_to_insert(start_year, end_year): - return reversed(get_header_lines(SCRIPT_HEADER, start_year, end_year)) - -################################################################################ -# query git for year of last change -################################################################################ - -def get_git_change_year_range(filename): - years = get_git_change_years(filename) - return min(years), max(years) - -################################################################################ -# check for existing core copyright -################################################################################ - -def file_already_has_core_copyright(file_lines): - index, _ = get_updatable_copyright_line(file_lines) - return index is not None - -################################################################################ -# insert header execution -################################################################################ - -def file_has_hashbang(file_lines): - if len(file_lines) < 1: - return False - if len(file_lines[0]) <= 2: - return False - return file_lines[0][:2] == '#!' - -def insert_script_header(filename, file_lines, start_year, end_year): - if file_has_hashbang(file_lines): - insert_idx = 1 - else: - insert_idx = 0 - header_lines = get_script_header_lines_to_insert(start_year, end_year) - for line in header_lines: - file_lines.insert(insert_idx, line) - write_file_lines(filename, file_lines) - -def insert_cpp_header(filename, file_lines, start_year, end_year): - file_lines.insert(0, '\n') - header_lines = get_cpp_header_lines_to_insert(start_year, end_year) - for line in header_lines: - file_lines.insert(0, line) - write_file_lines(filename, file_lines) - -def exec_insert_header(filename, style): - file_lines = read_file_lines(filename) - if file_already_has_core_copyright(file_lines): - sys.exit('*** %s already has a copyright by The Bitcoin Core developers' - % (filename)) - start_year, end_year = get_git_change_year_range(filename) - if style in ['python', 'shell']: - insert_script_header(filename, file_lines, start_year, end_year) - else: - insert_cpp_header(filename, file_lines, start_year, end_year) - -################################################################################ -# insert cmd -################################################################################ - -INSERT_USAGE = """ -Inserts a copyright header for "The Bitcoin Core developers" at the top of the -file in either Python or C++ style as determined by the file extension. If the -file is a Python file and it has a '#!' starting the first line, the header is -inserted in the line below it. - -The copyright dates will be set to be: - -"-" - -where is according to the 'git log' history. If - is equal to , the date will be set to be: - -"" - -If the file already has a copyright for "The Bitcoin Core developers", the -script will exit. - -Usage: - $ ./copyright_header.py insert - -Arguments: - - A source file in the BGL repository. -""" - -def insert_cmd(argv): - if len(argv) != 3: - sys.exit(INSERT_USAGE) - - filename = argv[2] - if not os.path.isfile(filename): - sys.exit("*** bad filename: %s" % filename) - _, extension = os.path.splitext(filename) - if extension not in ['.h', '.cpp', '.cc', '.c', '.py', '.sh']: - sys.exit("*** cannot insert for file extension %s" % extension) - - if extension == '.py': - style = 'python' - elif extension == '.sh': - style = 'shell' - else: - style = 'cpp' - exec_insert_header(filename, style) - -################################################################################ -# UI -################################################################################ - -USAGE = """ -copyright_header.py - utilities for managing copyright headers of 'The BGL -Core developers' in repository source files. - -Usage: - $ ./copyright_header - -Subcommands: - report - update - insert - -To see subcommand usage, run them without arguments. -""" - -SUBCOMMANDS = ['report', 'update', 'insert'] - -if __name__ == "__main__": - if len(sys.argv) == 1: - sys.exit(USAGE) - subcommand = sys.argv[1] - if subcommand not in SUBCOMMANDS: - sys.exit(USAGE) - if subcommand == 'report': - report_cmd(sys.argv) - elif subcommand == 'update': - update_cmd(sys.argv) - elif subcommand == 'insert': - insert_cmd(sys.argv) diff --git a/contrib/devtools/gen-BGL-conf.sh b/contrib/devtools/gen-BGL-conf.sh deleted file mode 100755 index e68e8a5145..0000000000 --- a/contrib/devtools/gen-BGL-conf.sh +++ /dev/null @@ -1,83 +0,0 @@ -#!/usr/bin/env bash -# Copyright (c) 2021 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -export LC_ALL=C -TOPDIR=${TOPDIR:-$(git rev-parse --show-toplevel)} -BUILDDIR=${BUILDDIR:-$TOPDIR} -BINDIR=${BINDIR:-$BUILDDIR/src} -BGLD=${BGLD:-$BINDIR/BGLd} -SHARE_EXAMPLES_DIR=${SHARE_EXAMPLES_DIR:-$TOPDIR/share/examples} -EXAMPLE_CONF_FILE=${EXAMPLE_CONF_FILE:-$SHARE_EXAMPLES_DIR/bitcoin.conf} - -[ ! -x "$BGLD" ] && echo "$BGLD not found or not executable." && exit 1 - -DIRTY="" -VERSION_OUTPUT=$($BGLD --version) -if [[ $VERSION_OUTPUT == *"dirty"* ]]; then - DIRTY="${DIRTY}${BGLD}\n" -fi - -if [ -n "$DIRTY" ] -then - echo -e "WARNING: $BGLD was built from a dirty tree.\n" - echo -e "To safely generate a BGL.conf file, please commit your changes to $BGLD, rebuild, then run this script again.\n" -fi - -echo 'Generating example BGL.conf file in share/examples/' - -# create the directory, if it doesn't exist -mkdir -p "${SHARE_EXAMPLES_DIR}" - -# create the header text -cat > "${EXAMPLE_CONF_FILE}" << 'EOF' -## -## bitcoin.conf configuration file. -## Generated by contrib/devtools/gen-bitcoin-conf.sh. -## -## Lines beginning with # are comments. -## All possible configuration options are provided. To use, copy this file -## to your data directory (default or specified by -datadir), uncomment -## options you would like to change, and save the file. -## - - -### Options -EOF - -# parse the output from bitcoind --help -# adding newlines is a bit funky to ensure portability for BSD -# see here for more details: https://stackoverflow.com/a/24575385 -${BITCOIND} --help \ - | sed '1,/Print this help message and exit/d' \ - | sed -E 's/^[[:space:]]{2}\-/#/' \ - | sed -E 's/^[[:space:]]{7}/# /' \ - | sed -E '/[=[:space:]]/!s/#.*$/&=1/' \ - | awk '/^#[a-z]/{x=$0;next}{if (NF==0) print x"\n",x="";else print}' \ - | sed 's,\(^[[:upper:]].*\)\:$,\ -### \1,' \ - | sed 's/[[:space:]]*$//' >> "${EXAMPLE_CONF_FILE}" - -# create the footer text -cat >> "${EXAMPLE_CONF_FILE}" << 'EOF' - -# [Sections] -# Most options will apply to all networks. To confine an option to a specific -# network, add it under the relevant section below. -# -# Note: If not specified under a network section, the options addnode, connect, -# port, bind, rpcport, rpcbind, and wallet will only apply to mainnet. - -# Options for mainnet -[main] - -# Options for testnet -[test] - -# Options for signet -[signet] - -# Options for regtest -[regtest] -EOF diff --git a/contrib/devtools/gen-manpages.py b/contrib/devtools/gen-manpages.py deleted file mode 100755 index e760701efd..0000000000 --- a/contrib/devtools/gen-manpages.py +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/env python3 -# Copyright (c) 2022 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 subprocess -import sys -import tempfile - -BINARIES = [ -'src/BGLd', -'src/BGL-cli', -'src/BGL-tx', -'src/BGL-wallet', -'src/BGL-util', -'src/qt/BGL-qt', -] - -# Paths to external utilities. -git = os.getenv('GIT', 'git') -help2man = os.getenv('HELP2MAN', 'help2man') - -# If not otherwise specified, get top directory from git. -topdir = os.getenv('TOPDIR') -if not topdir: - r = subprocess.run([git, 'rev-parse', '--show-toplevel'], stdout=subprocess.PIPE, check=True, text=True) - topdir = r.stdout.rstrip() - -# Get input and output directories. -builddir = os.getenv('BUILDDIR', topdir) -mandir = os.getenv('MANDIR', os.path.join(topdir, 'doc/man')) - -# Verify that all the required binaries are usable, and extract copyright -# message in a first pass. -versions = [] -for relpath in BINARIES: - abspath = os.path.join(builddir, relpath) - try: - r = subprocess.run([abspath, "--version"], stdout=subprocess.PIPE, check=True, text=True) - except IOError: - print(f'{abspath} not found or not an executable', file=sys.stderr) - sys.exit(1) - # take first line (which must contain version) - verstr = r.stdout.splitlines()[0] - # last word of line is the actual version e.g. v22.99.0-5c6b3d5b3508 - verstr = verstr.split()[-1] - assert verstr.startswith('v') - # remaining lines are copyright - copyright = r.stdout.split('\n')[1:] - assert copyright[0].startswith('Copyright (C)') - - versions.append((abspath, verstr, copyright)) - -if any(verstr.endswith('-dirty') for (_, verstr, _) in versions): - print("WARNING: Binaries were built from a dirty tree.") - print('man pages generated from dirty binaries should NOT be committed.') - print('To properly generate man pages, please commit your changes (or discard them), rebuild, then run this script again.') - print() - -with tempfile.NamedTemporaryFile('w', suffix='.h2m') as footer: - # Create copyright footer, and write it to a temporary include file. - # Copyright is the same for all binaries, so just use the first. - footer.write('[COPYRIGHT]\n') - footer.write('\n'.join(versions[0][2]).strip()) - footer.flush() - - # Call the binaries through help2man to produce a manual page for each of them. - for (abspath, verstr, _) in versions: - outname = os.path.join(mandir, os.path.basename(abspath) + '.1') - print(f'Generating {outname}…') - subprocess.run([help2man, '-N', '--version-string=' + verstr, '--include=' + footer.name, '-o', outname, abspath], check=True) diff --git a/contrib/devtools/headerssync-params.py b/contrib/devtools/headerssync-params.py deleted file mode 100644 index 0198f5db99..0000000000 --- a/contrib/devtools/headerssync-params.py +++ /dev/null @@ -1,357 +0,0 @@ -#!/usr/bin/env python3 -# Copyright (c) 2022 Pieter Wuille -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -"""Script to find the optimal parameters for the headerssync module through simulation.""" - -from math import log, exp, sqrt -from datetime import datetime, timedelta -import random - -# Parameters: - -# Aim for still working fine at some point in the future. [datetime] -TIME = datetime(2026, 10, 5) - -# Expected block interval. [timedelta] -BLOCK_INTERVAL = timedelta(seconds=600) - -# The number of headers corresponding to the minchainwork parameter. [headers] -MINCHAINWORK_HEADERS = 804000 - -# Combined processing bandwidth from all attackers to one victim. [bit/s] -# 6 Gbit/s is approximately the speed at which a single thread of a Ryzen 5950X CPU thread can hash -# headers. In practice, the victim's network bandwidth and network processing overheads probably -# impose a far lower number, but it's a useful upper bound. -ATTACK_BANDWIDTH = 6000000000 - -# How much additional permanent memory usage are attackers (jointly) allowed to cause in the victim, -# expressed as fraction of the normal memory usage due to mainchain growth, for the duration the -# attack is sustained. [unitless] -# 0.2 means that attackers, while they keep up the attack, can cause permanent memory usage due to -# headers storage to grow at 1.2 header per BLOCK_INTERVAL. -ATTACK_FRACTION = 0.2 - -# When this is set, the mapping from period size to memory usage (at optimal buffer size for that -# period) is assumed to be convex. This greatly speeds up the computation, and does not appear -# to influence the outcome. Set to False for a stronger guarantee to get the optimal result. -ASSUME_CONVEX = True - -# Explanation: -# -# The headerssync module implements a DoS protection against low-difficulty header spam which does -# not rely on checkpoints. In short it works as follows: -# -# - (initial) header synchronization is split into two phases: -# - A commitment phase, in which headers are downloaded from the peer, and a very compact -# commitment to them is remembered in per-peer memory. The commitment phase ends when the -# received chain's combined work reaches a predetermined threshold. -# - A redownload phase, during which the headers are downloaded a second time from the same peer, -# and compared against the commitment constructed in the first phase. If there is a match, the -# redownloaded headers are fed to validation and accepted into permanent storage. -# -# This separation guarantees that no headers are accepted into permanent storage without -# requiring the peer to first prove the chain actually has sufficient work. -# -# - To actually implement this commitment mechanism, the following approach is used: -# - Keep a *1 bit* commitment (constructed using a salted hash function), for every block whose -# height is a multiple of {period} plus an offset value. If RANDOMIZE_OFFSET, the offset, -# like the salt, is chosen randomly when the synchronization starts and kept fixed afterwards. -# - When redownloading, headers are fed through a per-peer queue that holds {bufsize} headers, -# before passing them to validation. All the headers in this queue are verified against the -# commitment bits created in the first phase before any header is released from it. This means -# {bufsize/period} bits are checked "on top of" each header before actually processing it, -# which results in a commitment structure with roughly {bufsize/period} bits of security, as -# once a header is modified, due to the prevhash inclusion, all future headers necessarily -# change as well. -# -# The question is what these {period} and {bufsize} parameters need to be set to. This program -# exhaustively tests a range of values to find the optimal choice, taking into account: -# -# - Minimizing the (maximum of) two scenarios that trigger per-peer memory usage: -# -# - When downloading a (likely honest) chain that reaches the chainwork threshold after {n} -# blocks, and then redownloads them, we will consume per-peer memory that is sufficient to -# store {n/period} commitment bits and {bufsize} headers. We only consider attackers without -# sufficient hashpower (as otherwise they are from a PoW perspective not attackers), which -# means {n} is restricted to the honest chain's length before reaching minchainwork. -# -# - When downloading a (likely false) chain of {n} headers that never reaches the chainwork -# threshold, we will consume per-peer memory that is sufficient to store {n/period} -# commitment bits. Such a chain may be very long, by exploiting the timewarp bug to avoid -# ramping up difficulty. There is however an absolute limit on how long such a chain can be: 6 -# blocks per second since genesis, due to the increasing MTP consensus rule. -# -# - Not gratuitously preventing synchronizing any valid chain, however difficult such a chain may -# be to construct. In particular, the above scenario with an enormous timewarp-expoiting chain -# cannot simply be ignored, as it is legal that the honest main chain is like that. We however -# do not bother minimizing the memory usage in that case (because a billion-header long honest -# chain will inevitably use far larger amounts of memory than designed for). -# -# - Keep the rate at which attackers can get low-difficulty headers accepted to the block index -# negligible. Specifically, the possibility exists for an attacker to send the honest main -# chain's headers during the commitment phase, but then start deviating at an attacker-chosen -# point by sending novel low-difficulty headers instead. Depending on how high we set the -# {bufsize/period} ratio, we can make the probability that such a header makes it in -# arbitrarily small, but at the cost of higher memory during the redownload phase. It turns out, -# some rate of memory usage growth is expected anyway due to chain growth, so permitting the -# attacker to increase that rate by a small factor isn't concerning. The attacker may start -# somewhat later than genesis, as long as the difficulty doesn't get too high. This reduces -# the attacker bandwidth required at the cost of higher PoW needed for constructing the -# alternate chain. This trade-off is ignored here, as it results in at most a small constant -# factor in attack rate. - - -# System properties: - -# Headers in the redownload buffer are stored without prevhash. [bits] -COMPACT_HEADER_SIZE = 48 * 8 - -# How many bits a header uses in P2P protocol. [bits] -NET_HEADER_SIZE = 81 * 8 - -# How many headers are sent at once. [headers] -HEADER_BATCH_COUNT = 2000 - -# Whether or not the offset of which blocks heights get checksummed is randomized. -RANDOMIZE_OFFSET = True - -# Timestamp of the genesis block -GENESIS_TIME = datetime(2009, 1, 3) - -# Derived values: - -# What rate of headers worth of RAM attackers are allowed to cause in the victim. [headers/s] -LIMIT_HEADERRATE = ATTACK_FRACTION / BLOCK_INTERVAL.total_seconds() - -# How many headers can attackers (jointly) send a victim per second. [headers/s] -NET_HEADERRATE = ATTACK_BANDWIDTH / NET_HEADER_SIZE - -# What fraction of headers sent by attackers can at most be accepted by a victim [unitless] -LIMIT_FRACTION = LIMIT_HEADERRATE / NET_HEADERRATE - -# How many headers we permit attackers to cause being accepted per attack. [headers/attack] -ATTACK_HEADERS = LIMIT_FRACTION * MINCHAINWORK_HEADERS - - -def find_max_headers(when): - """Compute the maximum number of headers a valid Bitcoin chain can have at given time.""" - # When exploiting the timewarp attack, this can be up to 6 per second since genesis. - return 6 * ((when - GENESIS_TIME) // timedelta(seconds=1)) - - -def lambert_w(value): - """Solve the equation x*exp(x)=value (x > 0, value > 0).""" - # Initial approximation. - approx = max(log(value), 0.0) - for _ in range(10): - # Newton-Rhapson iteration steps. - approx += (value * exp(-approx) - approx) / (approx + 1.0) - return approx - - -def attack_rate(period, bufsize, limit=None): - """Compute maximal accepted headers per attack in (period, bufsize) configuration. - - If limit is provided, the computation is stopped early when the result is known to exceed the - value in limit. - """ - - max_rate = None - max_honest = None - # Let the current batch 0 being received be the first one in which the attacker starts lying. - # They will only ever start doing so right after a commitment block, but where that is can be - # in a number of places. Let honest be the number of honest headers in this current batch, - # preceding the forged ones. - for honest in range(HEADER_BATCH_COUNT): - # The number of headers the attack under consideration will on average get accepted. - # This is the number being computed. - rate = 0 - - # Iterate over the possible alignments of commitments w.r.t. the first batch. In case - # the alignments are randomized, try all values. If not, the attacker can know/choose - # the alignment, and will always start forging right after a commitment. - if RANDOMIZE_OFFSET: - align_choices = list(range(period)) - else: - align_choices = [(honest - 1) % period] - # Now loop over those possible alignment values, computing the average attack rate - # over them by dividing each contribution by len(align_choices). - for align in align_choices: - # These state variables capture the situation after receiving the first batch. - # - The number of headers received after the last commitment for an honest block: - after_good_commit = HEADER_BATCH_COUNT - honest + ((honest - align - 1) % period) - # - The number of forged headers in the redownload buffer: - forged_in_buf = HEADER_BATCH_COUNT - honest - - # Now iterate over the next batches of headers received, adding contributions to the - # rate variable. - while True: - # Process the first HEADER_BATCH_COUNT headers in the buffer: - accept_forged_headers = max(forged_in_buf - bufsize, 0) - forged_in_buf -= accept_forged_headers - if accept_forged_headers: - # The probability the attack has not been detected yet at this point: - prob = 0.5 ** (after_good_commit // period) - # Update attack rate, divided by align_choices to average over the alignments. - rate += accept_forged_headers * prob / len(align_choices) - # If this means we exceed limit, bail out early (performance optimization). - if limit is not None and rate >= limit: - return rate, None - # If the maximal term being added is negligible compared to rate, stop - # iterating. - if HEADER_BATCH_COUNT * prob < 1.0e-16 * rate * len(align_choices): - break - # Update state from a new incoming batch (which is all forged) - after_good_commit += HEADER_BATCH_COUNT - forged_in_buf += HEADER_BATCH_COUNT - - if max_rate is None or rate > max_rate: - max_rate = rate - max_honest = honest - - return max_rate, max_honest - - -def memory_usage(period, bufsize, when): - """How much memory (max,mainchain,timewarp) does the (period,bufsize) configuration need?""" - - # Per-peer memory usage for a timewarp chain that never meets minchainwork - mem_timewarp = find_max_headers(when) // period - # Per-peer memory usage for being fed the main chain - mem_mainchain = (MINCHAINWORK_HEADERS // period) + bufsize * COMPACT_HEADER_SIZE - # Maximum per-peer memory usage - max_mem = max(mem_timewarp, mem_mainchain) - - return max_mem, mem_mainchain, mem_timewarp - -def find_bufsize(period, attack_headers, when, max_mem=None, min_bufsize=1): - """Determine how big bufsize needs to be given a specific period length. - - Given a period, find the smallest value of bufsize such that the attack rate against the - (period, bufsize) configuration is below attack_headers. If max_mem is provided, and no - such bufsize exists that needs less than max_mem bits of memory, None is returned. - min_bufsize is the minimal result to be considered.""" - - if max_mem is None: - succ_buf = min_bufsize - 1 - fail_buf = min_bufsize - # First double iteratively until an upper bound for failure is found. - while True: - if attack_rate(period, fail_buf, attack_headers)[0] < attack_headers: - break - succ_buf, fail_buf = fail_buf, 3 * fail_buf - 2 * succ_buf - else: - # If a long low-work header chain exists that exceeds max_mem already, give up. - if find_max_headers(when) // period > max_mem: - return None - # Otherwise, verify that the maximal buffer size that permits a mainchain sync with less - # than max_mem memory is sufficient to get the attack rate below attack_headers. If not, - # also give up. - max_buf = (max_mem - (MINCHAINWORK_HEADERS // period)) // COMPACT_HEADER_SIZE - if max_buf < min_bufsize: - return None - if attack_rate(period, max_buf, attack_headers)[0] >= attack_headers: - return None - # If it is sufficient, that's an upper bound to start our search. - succ_buf = min_bufsize - 1 - fail_buf = max_buf - - # Then perform a bisection search to narrow it down. - while fail_buf > succ_buf + 1: - try_buf = (succ_buf + fail_buf) // 2 - if attack_rate(period, try_buf, attack_headers)[0] >= attack_headers: - succ_buf = try_buf - else: - fail_buf = try_buf - return fail_buf - - -def optimize(when): - """Find the best (period, bufsize) configuration.""" - - # When period*bufsize = memory_scale, the per-peer memory for a mainchain sync and a maximally - # long low-difficulty header sync are equal. - memory_scale = (find_max_headers(when) - MINCHAINWORK_HEADERS) / COMPACT_HEADER_SIZE - # Compute approximation for {bufsize/period}, using a formula for a simplified problem. - approx_ratio = lambert_w(log(4) * memory_scale / ATTACK_HEADERS**2) / log(4) - # Use those for a first attempt. - print("Searching configurations:") - period = int(sqrt(memory_scale / approx_ratio) + 0.5) - bufsize = find_bufsize(period, ATTACK_HEADERS, when) - mem = memory_usage(period, bufsize, when) - best = (period, bufsize, mem) - maps = [(period, bufsize), (MINCHAINWORK_HEADERS + 1, None)] - print(f"- Initial: period={period}, buffer={bufsize}, mem={mem[0] / 8192:.3f} KiB") - - # Consider all period values between 1 and MINCHAINWORK_HEADERS, except the one just tried. - periods = [iv for iv in range(1, MINCHAINWORK_HEADERS + 1) if iv != period] - # Iterate, picking a random element from periods, computing its corresponding bufsize, and - # then using the result to shrink the period. - while True: - # Remove all periods whose memory usage for low-work long chain sync exceed the best - # memory usage we've found so far. - periods = [p for p in periods if find_max_headers(when) // p < best[2][0]] - # Stop if there is nothing left to try. - if len(periods) == 0: - break - # Pick a random remaining option for period size, and compute corresponding bufsize. - period = periods.pop(random.randrange(len(periods))) - # The buffer size (at a given attack level) cannot shrink as the period grows. Find the - # largest period smaller than the selected one we know the buffer size for, and use that - # as a lower bound to find_bufsize. - min_bufsize = max([(p, b) for p, b in maps if p < period] + [(0,0)])[1] - bufsize = find_bufsize(period, ATTACK_HEADERS, when, best[2][0], min_bufsize) - if bufsize is not None: - # We found a (period, bufsize) configuration with better memory usage than our best - # so far. Remember it for future lower bounds. - maps.append((period, bufsize)) - mem = memory_usage(period, bufsize, when) - assert mem[0] <= best[2][0] - if ASSUME_CONVEX: - # Remove all periods that are on the other side of the former best as the new - # best. - periods = [p for p in periods if (p < best[0]) == (period < best[0])] - best = (period, bufsize, mem) - print(f"- New best: period={period}, buffer={bufsize}, mem={mem[0] / 8192:.3f} KiB") - else: - # The (period, bufsize) configuration we found is worse than what we already had. - if ASSUME_CONVEX: - # Remove all periods that are on the other side of the tried configuration as the - # best one. - periods = [p for p in periods if (p < period) == (best[0] < period)] - - # Return the result. - period, bufsize, _ = best - return period, bufsize - - -def analyze(when): - """Find the best configuration and print it out.""" - - period, bufsize = optimize(when) - # Compute accurate statistics for the best found configuration. - _, mem_mainchain, mem_timewarp = memory_usage(period, bufsize, when) - headers_per_attack, _ = attack_rate(period, bufsize) - attack_volume = NET_HEADER_SIZE * MINCHAINWORK_HEADERS - # And report them. - print() - print("Optimal configuration:") - print() - print("//! Store one header commitment per HEADER_COMMITMENT_PERIOD blocks.") - print(f"constexpr size_t HEADER_COMMITMENT_PERIOD{{{period}}};") - print() - print("//! Only feed headers to validation once this many headers on top have been") - print("//! received and validated against commitments.") - print(f"constexpr size_t REDOWNLOAD_BUFFER_SIZE{{{bufsize}}};" - f" // {bufsize}/{period} = ~{bufsize/period:.1f} commitments") - print() - print("Properties:") - print(f"- Per-peer memory for mainchain sync: {mem_mainchain / 8192:.3f} KiB") - print(f"- Per-peer memory for timewarp attack: {mem_timewarp / 8192:.3f} KiB") - print(f"- Attack rate: {1/headers_per_attack:.1f} attacks for 1 header of memory growth") - print(f" (where each attack costs {attack_volume / 8388608:.3f} MiB bandwidth)") - - -analyze(TIME) diff --git a/contrib/devtools/iwyu/BGL.core.imp b/contrib/devtools/iwyu/BGL.core.imp deleted file mode 100644 index befc949f18..0000000000 --- a/contrib/devtools/iwyu/BGL.core.imp +++ /dev/null @@ -1,4 +0,0 @@ -# Fixups / upstreamed changes -[ - { include: [ "", private, "", public ] }, -] diff --git a/contrib/devtools/security-check.py b/contrib/devtools/security-check.py deleted file mode 100755 index 49b5e1cb7f..0000000000 --- a/contrib/devtools/security-check.py +++ /dev/null @@ -1,286 +0,0 @@ -#!/usr/bin/env python3 -# Copyright (c) 2015-2022 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. -''' -Perform basic security checks on a series of executables. -Exit status will be 0 if successful, and the program will be silent. -Otherwise the exit status will be 1 and it will log which executables failed which checks. -Needs `objdump` (for PE). -''' -import sys - -import lief - -def check_ELF_RELRO(binary) -> bool: - ''' - Check for read-only relocations. - GNU_RELRO program header must exist - Dynamic section must have BIND_NOW flag - ''' - binary = lief.parse(executable) - have_gnu_relro = False - for segment in binary.segments: - # Note: not checking p_flags == PF_R: here as linkers set the permission differently - # This does not affect security: the permission flags of the GNU_RELRO program - # header are ignored, the PT_LOAD header determines the effective permissions. - # However, the dynamic linker need to write to this area so these are RW. - # Glibc itself takes care of mprotecting this area R after relocations are finished. - # See also https://marc.info/?l=binutils&m=1498883354122353 - if segment.type == lief.ELF.SEGMENT_TYPES.GNU_RELRO: - have_gnu_relro = True - - have_bindnow = False - try: - flags = binary.get(lief.ELF.DYNAMIC_TAGS.FLAGS) - if flags.value & lief.ELF.DYNAMIC_FLAGS.BIND_NOW: - have_bindnow = True - except Exception: - have_bindnow = False - - for line in stdout.splitlines(): - tokens = line.split() - if len(tokens)>1 and tokens[1] == '(BIND_NOW)' or (len(tokens)>2 and tokens[1] == '(FLAGS)' and 'BIND_NOW' in tokens[2:]): - have_bindnow = True - return have_gnu_relro and have_bindnow - -def check_ELF_Canary(binary) -> bool: - ''' - Check for use of stack canary - ''' - binary = lief.parse(executable) - return binary.has_symbol('__stack_chk_fail') - -def check_ELF_separate_code(binary): - ''' - Check that sections are appropriately separated in virtual memory, - based on their permissions. This checks for missing -Wl,-z,separate-code - and potentially other problems. - ''' - binary = lief.parse(executable) - R = lief.ELF.SEGMENT_FLAGS.R - W = lief.ELF.SEGMENT_FLAGS.W - E = lief.ELF.SEGMENT_FLAGS.X - EXPECTED_FLAGS = { - # Read + execute - '.init': R | E, - '.plt': R | E, - '.plt.got': R | E, - '.plt.sec': R | E, - '.text': R | E, - '.fini': R | E, - # Read-only data - '.interp': R, - '.note.gnu.property': R, - '.note.gnu.build-id': R, - '.note.ABI-tag': R, - '.gnu.hash': R, - '.dynsym': R, - '.dynstr': R, - '.gnu.version': R, - '.gnu.version_r': R, - '.rela.dyn': R, - '.rela.plt': R, - '.rodata': R, - '.eh_frame_hdr': R, - '.eh_frame': R, - '.qtmetadata': R, - '.gcc_except_table': R, - '.stapsdt.base': R, - # Writable data - '.init_array': R | W, - '.fini_array': R | W, - '.dynamic': R | W, - '.got': R | W, - '.data': R | W, - '.bss': R | W, - } - if binary.header.machine_type == lief.ELF.ARCH.PPC64: - # .plt is RW on ppc64 even with separate-code - EXPECTED_FLAGS['.plt'] = R | W - # For all LOAD program headers get mapping to the list of sections, - # and for each section, remember the flags of the associated program header. - flags_per_section = {} - for segment in binary.segments: - if segment.type == lief.ELF.SEGMENT_TYPES.LOAD: - for section in segment.sections: - flags_per_section[section.name] = segment.flags - # Spot-check ELF LOAD program header flags per section - # If these sections exist, check them against the expected R/W/E flags - for (section, flags) in flags_per_section.items(): - if section in EXPECTED_FLAGS: - if int(EXPECTED_FLAGS[section]) != int(flags): - return False - return True - -def check_ELF_control_flow(binary) -> bool: - ''' - Check for control flow instrumentation - ''' - main = binary.get_function_address('main') - content = binary.get_content_from_virtual_address(main, 4, lief.Binary.VA_TYPES.AUTO) - - if content.tolist() == [243, 15, 30, 250]: # endbr64 - return True - return False - -def check_PE_DYNAMIC_BASE(binary) -> bool: - '''PIE: DllCharacteristics bit 0x40 signifies dynamicbase (ASLR)''' - return lief.PE.DLL_CHARACTERISTICS.DYNAMIC_BASE in binary.optional_header.dll_characteristics_lists - -# Must support high-entropy 64-bit address space layout randomization -# in addition to DYNAMIC_BASE to have secure ASLR. -def check_PE_HIGH_ENTROPY_VA(binary) -> bool: - '''PIE: DllCharacteristics bit 0x20 signifies high-entropy ASLR''' - return lief.PE.DLL_CHARACTERISTICS.HIGH_ENTROPY_VA in binary.optional_header.dll_characteristics_lists - -def check_PE_RELOC_SECTION(binary) -> bool: - '''Check for a reloc section. This is required for functional ASLR.''' - return binary.has_relocations - -def check_PE_control_flow(binary) -> bool: - ''' - Check for control flow instrumentation - ''' - main = binary.get_symbol('main').value - - section_addr = binary.section_from_rva(main).virtual_address - virtual_address = binary.optional_header.imagebase + section_addr + main - - content = binary.get_content_from_virtual_address(virtual_address, 4, lief.Binary.VA_TYPES.VA) - - if content.tolist() == [243, 15, 30, 250]: # endbr64 - return True - return False - -def check_PE_Canary(binary) -> bool: - ''' - Check for use of stack canary - ''' - return binary.has_symbol('__stack_chk_fail') - -def check_MACHO_NOUNDEFS(binary) -> bool: - ''' - Check for no undefined references. - ''' - return binary.header.has(lief.MachO.HEADER_FLAGS.NOUNDEFS) - -def check_MACHO_FIXUP_CHAINS(binary) -> bool: - ''' - Check for use of chained fixups. - ''' - return binary.has_dyld_chained_fixups - -def check_MACHO_Canary(binary) -> bool: - ''' - Check for use of stack canary - ''' - return binary.has_symbol('___stack_chk_fail') - -def check_PIE(binary) -> bool: - ''' - Check for position independent executable (PIE), - allowing for address space randomization. - ''' - return binary.is_pie - -def check_NX(binary) -> bool: - ''' - Check for no stack execution - ''' - return binary.has_nx - -def check_MACHO_control_flow(binary) -> bool: - ''' - Check for control flow instrumentation - ''' - content = binary.get_content_from_virtual_address(binary.entrypoint, 4, lief.Binary.VA_TYPES.AUTO) - - if content.tolist() == [243, 15, 30, 250]: # endbr64 - return True - return False - -def check_MACHO_branch_protection(binary) -> bool: - ''' - Check for branch protection instrumentation - ''' - content = binary.get_content_from_virtual_address(binary.entrypoint, 4, lief.Binary.VA_TYPES.AUTO) - - if content.tolist() == [95, 36, 3, 213]: # bti - return True - return False - -BASE_ELF = [ - ('PIE', check_PIE), - ('NX', check_NX), - ('RELRO', check_ELF_RELRO), - ('Canary', check_ELF_Canary), - ('separate_code', check_ELF_separate_code), -] - -BASE_PE = [ - ('PIE', check_PIE), - ('DYNAMIC_BASE', check_PE_DYNAMIC_BASE), - ('HIGH_ENTROPY_VA', check_PE_HIGH_ENTROPY_VA), - ('NX', check_NX), - ('RELOC_SECTION', check_PE_RELOC_SECTION), - ('CONTROL_FLOW', check_PE_control_flow), - ('Canary', check_PE_Canary), -] - -BASE_MACHO = [ - ('NOUNDEFS', check_MACHO_NOUNDEFS), - ('Canary', check_MACHO_Canary), - ('FIXUP_CHAINS', check_MACHO_FIXUP_CHAINS), -] - -CHECKS = { - lief.EXE_FORMATS.ELF: { - lief.ARCHITECTURES.X86: BASE_ELF + [('CONTROL_FLOW', check_ELF_control_flow)], - lief.ARCHITECTURES.ARM: BASE_ELF, - lief.ARCHITECTURES.ARM64: BASE_ELF, - lief.ARCHITECTURES.PPC: BASE_ELF, - lief.ARCHITECTURES.RISCV: BASE_ELF, - }, - lief.EXE_FORMATS.PE: { - lief.ARCHITECTURES.X86: BASE_PE, - }, - lief.EXE_FORMATS.MACHO: { - lief.ARCHITECTURES.X86: BASE_MACHO + [('PIE', check_PIE), - ('NX', check_NX), - ('CONTROL_FLOW', check_MACHO_control_flow)], - lief.ARCHITECTURES.ARM64: BASE_MACHO + [('BRANCH_PROTECTION', check_MACHO_branch_protection)], - } -} - -if __name__ == '__main__': - retval: int = 0 - for filename in sys.argv[1:]: - try: - binary = lief.parse(filename) - etype = binary.format - arch = binary.abstract.header.architecture - binary.concrete - - if etype == lief.EXE_FORMATS.UNKNOWN: - print(f'{filename}: unknown executable format') - retval = 1 - continue - - if arch == lief.ARCHITECTURES.NONE: - print(f'{filename}: unknown architecture') - retval = 1 - continue - - failed: list[str] = [] - for (name, func) in CHECKS[etype][arch]: - if not func(binary): - failed.append(name) - if failed: - print(f'{filename}: failed {" ".join(failed)}') - retval = 1 - except IOError: - print(f'{filename}: cannot open') - retval = 1 - sys.exit(retval) - diff --git a/contrib/devtools/split-debug.sh b/contrib/devtools/split-debug.sh deleted file mode 100755 index 3822fd1310..0000000000 --- a/contrib/devtools/split-debug.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh -set -e -if [ $# -ne 3 ]; - then echo "usage: $0 " -fi - -/usr/bin/objcopy --enable-deterministic-archives -p --only-keep-debug $1 $3 -/usr/bin/objcopy --enable-deterministic-archives -p --strip-debug $1 $2 -strip --enable-deterministic-archives -p -s $2 -/usr/bin/objcopy --enable-deterministic-archives -p --add-gnu-debuglink=$3 $2 diff --git a/contrib/devtools/split-debug.sh.in b/contrib/devtools/split-debug.sh.in deleted file mode 100644 index 92b72b1446..0000000000 --- a/contrib/devtools/split-debug.sh.in +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh -set -e -if [ $# -ne 3 ]; - then echo "usage: $0 " -fi - -@OBJCOPY@ --enable-deterministic-archives -p --only-keep-debug $1 $3 -@OBJCOPY@ --enable-deterministic-archives -p --strip-debug $1 $2 -@STRIP@ --enable-deterministic-archives -p -s $2 -@OBJCOPY@ --enable-deterministic-archives -p --add-gnu-debuglink=$3 $2 diff --git a/contrib/devtools/symbol-check.py b/contrib/devtools/symbol-check.py deleted file mode 100755 index 12f2bb9d4b..0000000000 --- a/contrib/devtools/symbol-check.py +++ /dev/null @@ -1,318 +0,0 @@ -#!/usr/bin/env python3 -# Copyright (c) 2014 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. -''' -A script to check that release executables only contain certain symbols -and are only linked against allowed libraries. - -Example usage: - - find ../path/to/binaries -type f -executable | xargs python3 contrib/devtools/symbol-check.py -''' -import sys - -import lief - -# Debian 11 (Bullseye) EOL: 2026. https://wiki.debian.org/LTS -# -# - libgcc version 10.2.1 (https://packages.debian.org/bullseye/libgcc-s1) -# - libc version 2.31 (https://packages.debian.org/source/bullseye/glibc) -# -# Ubuntu 20.04 (Focal) EOL: 2030. https://wiki.ubuntu.com/ReleaseTeam -# -# - libgcc version 10.5.0 (https://packages.ubuntu.com/focal/libgcc1) -# - libc version 2.31 (https://packages.ubuntu.com/focal/libc6) -# -# CentOS Stream 9 EOL: 2027. https://www.centos.org/cl-vs-cs/#end-of-life -# -# - libgcc version 12.2.1 (https://mirror.stream.centos.org/9-stream/AppStream/x86_64/os/Packages/) -# - libc version 2.34 (https://mirror.stream.centos.org/9-stream/AppStream/x86_64/os/Packages/) -# -# See https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html for more info. - -MAX_VERSIONS = { -'GCC': (4,3,0), -'GLIBC': { - lief.ELF.ARCH.x86_64: (2,31), - lief.ELF.ARCH.ARM: (2,31), - lief.ELF.ARCH.AARCH64:(2,31), - lief.ELF.ARCH.PPC64: (2,31), - lief.ELF.ARCH.RISCV: (2,31), -}, -'LIBATOMIC': (1,0), -'V': (0,5,0), # xkb (bitcoin-qt only) -} - -# Ignore symbols that are exported as part of every executable -IGNORE_EXPORTS = { -'environ', '_environ', '__environ', '_fini', '_init', 'stdin', -'stdout', 'stderr', -} - -# Expected linker-loader names can be found here: -# https://sourceware.org/glibc/wiki/ABIList?action=recall&rev=16 -ELF_INTERPRETER_NAMES: dict[lief.ELF.ARCH, dict[lief.ENDIANNESS, str]] = { - lief.ELF.ARCH.x86_64: { - lief.ENDIANNESS.LITTLE: "/lib64/ld-linux-x86-64.so.2", - }, - lief.ELF.ARCH.ARM: { - lief.ENDIANNESS.LITTLE: "/lib/ld-linux-armhf.so.3", - }, - lief.ELF.ARCH.AARCH64: { - lief.ENDIANNESS.LITTLE: "/lib/ld-linux-aarch64.so.1", - }, - lief.ELF.ARCH.PPC64: { - lief.ENDIANNESS.BIG: "/lib64/ld64.so.1", - lief.ENDIANNESS.LITTLE: "/lib64/ld64.so.2", - }, - lief.ELF.ARCH.RISCV: { - lief.ENDIANNESS.LITTLE: "/lib/ld-linux-riscv64-lp64d.so.1", - }, -} - -ELF_ABIS: dict[lief.ELF.ARCH, dict[lief.ENDIANNESS, list[int]]] = { - lief.ELF.ARCH.x86_64: { - lief.ENDIANNESS.LITTLE: [3,2,0], - }, - lief.ELF.ARCH.ARM: { - lief.ENDIANNESS.LITTLE: [3,2,0], - }, - lief.ELF.ARCH.AARCH64: { - lief.ENDIANNESS.LITTLE: [3,7,0], - }, - lief.ELF.ARCH.PPC64: { - lief.ENDIANNESS.LITTLE: [3,10,0], - lief.ENDIANNESS.BIG: [3,2,0], - }, - lief.ELF.ARCH.RISCV: { - lief.ENDIANNESS.LITTLE: [4,15,0], - }, -} - -# Allowed NEEDED libraries -ELF_ALLOWED_LIBRARIES = { -# BGLd and BGL-qt -'libgcc_s.so.1', # GCC base support -'libc.so.6', # C library -'libpthread.so.0', # threading -'libm.so.6', # math library -'libatomic.so.1', -'ld-linux-x86-64.so.2', # 64-bit dynamic linker -'ld-linux.so.2', # 32-bit dynamic linker -'ld-linux-aarch64.so.1', # 64-bit ARM dynamic linker -'ld-linux-armhf.so.3', # 32-bit ARM dynamic linker -'ld-linux-riscv64-lp64d.so.1', # 64-bit RISC-V dynamic linker -# BGL-qt only -'libxcb.so.1', # part of X11 -'libxkbcommon.so.0', # keyboard keymapping -'libxkbcommon-x11.so.0', # keyboard keymapping -'libfontconfig.so.1', # font support -'libfreetype.so.6', # font parsing -'libdl.so.2', # programming interface to dynamic linker -'libxcb-icccm.so.4', -'libxcb-image.so.0', -'libxcb-shm.so.0', -'libxcb-keysyms.so.1', -'libxcb-randr.so.0', -'libxcb-render-util.so.0', -'libxcb-render.so.0', -'libxcb-shape.so.0', -'libxcb-sync.so.1', -'libxcb-xfixes.so.0', -'libxcb-xinerama.so.0', -'libxcb-xkb.so.1', -} - -MACHO_ALLOWED_LIBRARIES = { -# bitcoind and bitcoin-qt -'libc++.1.dylib', # C++ Standard Library -'libSystem.B.dylib', # libc, libm, libpthread, libinfo -# bitcoin-qt only -'AppKit', # user interface -'ApplicationServices', # common application tasks. -'Carbon', # deprecated c back-compat API -'ColorSync', -'CoreFoundation', # low level func, data types -'CoreGraphics', # 2D rendering -'CoreServices', # operating system services -'CoreText', # interface for laying out text and handling fonts. -'CoreVideo', # video processing -'Foundation', # base layer functionality for apps/frameworks -'ImageIO', # read and write image file formats. -'IOKit', # user-space access to hardware devices and drivers. -'IOSurface', # cross process image/drawing buffers -'libobjc.A.dylib', # Objective-C runtime library -'Metal', # 3D graphics -'Security', # access control and authentication -'QuartzCore', # animation -} - -PE_ALLOWED_LIBRARIES = { -'ADVAPI32.dll', # security & registry -'IPHLPAPI.DLL', # IP helper API -'KERNEL32.dll', # win32 base APIs -'msvcrt.dll', # C standard library for MSVC -'SHELL32.dll', # shell API -'WS2_32.dll', # sockets -# bitcoin-qt only -'dwmapi.dll', # desktop window manager -'GDI32.dll', # graphics device interface -'IMM32.dll', # input method editor -'NETAPI32.dll', # network management -'ole32.dll', # component object model -'OLEAUT32.dll', # OLE Automation API -'SHLWAPI.dll', # light weight shell API -'USER32.dll', # user interface -'USERENV.dll', # user management -'UxTheme.dll', # visual style -'VERSION.dll', # version checking -'WINMM.dll', # WinMM audio API -'WTSAPI32.dll', # Remote Desktop -} - -def check_version(max_versions, version, arch) -> bool: - (lib, _, ver) = version.rpartition('_') - ver = tuple([int(x) for x in ver.split('.')]) - if not lib in max_versions: - return False - if isinstance(max_versions[lib], tuple): - return ver <= max_versions[lib] - else: - return ver <= max_versions[lib][arch] - -def check_imported_symbols(binary) -> bool: - ok: bool = True - - for symbol in binary.imported_symbols: - if not symbol.imported: - continue - - version = symbol.symbol_version if symbol.has_version else None - - if version: - aux_version = version.symbol_version_auxiliary.name if version.has_auxiliary_version else None - if aux_version and not check_version(MAX_VERSIONS, aux_version, binary.header.machine_type): - print(f'{filename}: symbol {symbol.name} from unsupported version {version}') - ok = False - return ok - -def check_exported_symbols(binary) -> bool: - ok: bool = True - - for symbol in binary.dynamic_symbols: - if not symbol.exported: - continue - name = symbol.name - if binary.header.machine_type == lief.ELF.ARCH.RISCV or name in IGNORE_EXPORTS: - continue - print(f'{binary.name}: export of symbol {name} not allowed!') - ok = False - return ok - -def check_RUNPATH(binary) -> bool: - assert binary.get(lief.ELF.DYNAMIC_TAGS.RUNPATH) is None - assert binary.get(lief.ELF.DYNAMIC_TAGS.RPATH) is None - return True - -def check_ELF_libraries(binary) -> bool: - ok: bool = True - for library in binary.libraries: - if library not in ELF_ALLOWED_LIBRARIES: - print(f'{filename}: {library} is not in ALLOWED_LIBRARIES!') - ok = False - return ok - -def check_MACHO_libraries(binary) -> bool: - ok: bool = True - for dylib in binary.libraries: - split = dylib.name.split('/') - if split[-1] not in MACHO_ALLOWED_LIBRARIES: - print(f'{split[-1]} is not in ALLOWED_LIBRARIES!') - ok = False - return ok - -def check_MACHO_min_os(binary) -> bool: - if binary.build_version.minos == [11,0,0]: - return True - return False - -def check_MACHO_sdk(binary) -> bool: - if binary.build_version.sdk == [14, 0, 0]: - return True - return False - -def check_MACHO_lld(binary) -> bool: - if binary.build_version.tools[0].version == [18, 1, 6]: - return True - return False - -def check_PE_libraries(binary) -> bool: - ok: bool = True - for dylib in binary.libraries: - if dylib not in PE_ALLOWED_LIBRARIES: - print(f'{dylib} is not in ALLOWED_LIBRARIES!') - ok = False - return ok - -def check_PE_subsystem_version(binary) -> bool: - major: int = binary.optional_header.major_subsystem_version - minor: int = binary.optional_header.minor_subsystem_version - if major == 6 and minor == 1: - return True - return False - -def check_ELF_interpreter(binary) -> bool: - expected_interpreter = ELF_INTERPRETER_NAMES[binary.header.machine_type][binary.abstract.header.endianness] - - return binary.concrete.interpreter == expected_interpreter - -def check_ELF_ABI(binary) -> bool: - expected_abi = ELF_ABIS[binary.header.machine_type][binary.abstract.header.endianness] - note = binary.concrete.get(lief.ELF.NOTE_TYPES.ABI_TAG) - assert note.details.abi == lief.ELF.NOTE_ABIS.LINUX - return note.details.version == expected_abi - -CHECKS = { -lief.EXE_FORMATS.ELF: [ - ('IMPORTED_SYMBOLS', check_imported_symbols), - ('EXPORTED_SYMBOLS', check_exported_symbols), - ('LIBRARY_DEPENDENCIES', check_ELF_libraries), - ('INTERPRETER_NAME', check_ELF_interpreter), - ('ABI', check_ELF_ABI), - ('RUNPATH', check_RUNPATH), -], -lief.EXE_FORMATS.MACHO: [ - ('DYNAMIC_LIBRARIES', check_MACHO_libraries), - ('MIN_OS', check_MACHO_min_os), - ('SDK', check_MACHO_sdk), - ('LLD', check_MACHO_lld), -], -lief.EXE_FORMATS.PE: [ - ('DYNAMIC_LIBRARIES', check_PE_libraries), - ('SUBSYSTEM_VERSION', check_PE_subsystem_version), -] -} - -if __name__ == '__main__': - retval: int = 0 - for filename in sys.argv[1:]: - try: - binary = lief.parse(filename) - etype = binary.format - if etype == lief.EXE_FORMATS.UNKNOWN: - print(f'{filename}: unknown executable format') - retval = 1 - continue - - failed: list[str] = [] - for (name, func) in CHECKS[etype]: - if not func(binary): - failed.append(name) - if failed: - print(f'{filename}: failed {" ".join(failed)}') - retval = 1 - except IOError: - print(f'{filename}: cannot open') - retval = 1 - sys.exit(retval) diff --git a/contrib/devtools/test-security-check.py b/contrib/devtools/test-security-check.py deleted file mode 100755 index 7bfd4d98da..0000000000 --- a/contrib/devtools/test-security-check.py +++ /dev/null @@ -1,148 +0,0 @@ -#!/usr/bin/env python3 -# Copyright (c) 2015-2022 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. -''' -Test script for security-check.py -''' -import lief -import os -import subprocess -import unittest - -from utils import determine_wellknown_cmd - -def write_testcode(filename): - with open(filename, 'w', encoding="utf8") as f: - f.write(''' - #include - int main() - { - printf("the quick brown fox jumps over the lazy god\\n"); - return 0; - } - ''') - -def clean_files(source, executable): - os.remove(source) - os.remove(executable) - -def env_flags() -> list[str]: - # This should behave the same as AC_TRY_LINK, so arrange well-known flags - # in the same order as autoconf would. - # - # See the definitions for ac_link in autoconf's lib/autoconf/c.m4 file for - # reference. - flags: list[str] = [] - for var in ['CFLAGS', 'CPPFLAGS', 'LDFLAGS']: - flags += filter(None, os.environ.get(var, '').split(' ')) - return flags - -def call_security_check(cc: str, source: str, executable: str, options) -> tuple: - subprocess.run([*cc,source,'-o',executable] + env_flags() + options, check=True) - p = subprocess.run([os.path.join(os.path.dirname(__file__), 'security-check.py'), executable], stdout=subprocess.PIPE, text=True) - return (p.returncode, p.stdout.rstrip()) - -def get_arch(cc, source, executable): - subprocess.run([*cc, source, '-o', executable] + env_flags(), check=True) - binary = lief.parse(executable) - arch = binary.abstract.header.architecture - os.remove(executable) - return arch - -class TestSecurityChecks(unittest.TestCase): - def test_ELF(self): - source = 'test1.c' - executable = 'test1' - cc = determine_wellknown_cmd('CC', 'gcc') - write_testcode(source) - arch = get_arch(cc, source, executable) - - if arch == lief.ARCHITECTURES.X86: - self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-zexecstack','-Wl,-znorelro','-no-pie','-fno-PIE', '-Wl,-z,separate-code']), - (1, executable+': failed PIE NX RELRO CONTROL_FLOW')) - self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-znoexecstack','-Wl,-znorelro','-no-pie','-fno-PIE', '-Wl,-z,separate-code']), - (1, executable+': failed PIE RELRO CONTROL_FLOW')) - self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-znoexecstack','-Wl,-znorelro','-no-pie','-fno-PIE', '-Wl,-z,separate-code']), - (1, executable+': failed PIE RELRO CONTROL_FLOW')) - self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-znoexecstack','-Wl,-znorelro','-pie','-fPIE', '-Wl,-z,separate-code']), - (1, executable+': failed RELRO CONTROL_FLOW')) - self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-znoexecstack','-Wl,-zrelro','-Wl,-z,now','-pie','-fPIE', '-Wl,-z,noseparate-code']), - (1, executable+': failed separate_code CONTROL_FLOW')) - self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-znoexecstack','-Wl,-zrelro','-Wl,-z,now','-pie','-fPIE', '-Wl,-z,separate-code']), - (1, executable+': failed CONTROL_FLOW')) - self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-znoexecstack','-Wl,-zrelro','-Wl,-z,now','-pie','-fPIE', '-Wl,-z,separate-code', '-fcf-protection=full']), - (0, '')) - else: - self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-zexecstack','-Wl,-znorelro','-no-pie','-fno-PIE', '-Wl,-z,separate-code']), - (1, executable+': failed PIE NX RELRO')) - self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-znoexecstack','-Wl,-znorelro','-no-pie','-fno-PIE', '-Wl,-z,separate-code']), - (1, executable+': failed PIE RELRO')) - self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-znoexecstack','-Wl,-znorelro','-no-pie','-fno-PIE', '-Wl,-z,separate-code']), - (1, executable+': failed PIE RELRO')) - self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-znoexecstack','-Wl,-znorelro','-pie','-fPIE', '-Wl,-z,separate-code']), - (1, executable+': failed RELRO')) - self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-znoexecstack','-Wl,-zrelro','-Wl,-z,now','-pie','-fPIE', '-Wl,-z,noseparate-code']), - (1, executable+': failed separate_code')) - self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-znoexecstack','-Wl,-zrelro','-Wl,-z,now','-pie','-fPIE', '-Wl,-z,separate-code']), - (0, '')) - - clean_files(source, executable) - - def test_PE(self): - source = 'test1.c' - executable = 'test1.exe' - cc = determine_wellknown_cmd('CC', 'x86_64-w64-mingw32-gcc') - write_testcode(source) - - self.assertEqual(call_security_check(cc, source, executable, ['-Wl,--disable-nxcompat','-Wl,--disable-reloc-section','-Wl,--disable-dynamicbase','-Wl,--disable-high-entropy-va','-no-pie','-fno-PIE','-fno-stack-protector']), - (1, executable+': failed PIE DYNAMIC_BASE HIGH_ENTROPY_VA NX RELOC_SECTION CONTROL_FLOW Canary')) - self.assertEqual(call_security_check(cc, source, executable, ['-Wl,--nxcompat','-Wl,--disable-reloc-section','-Wl,--disable-dynamicbase','-Wl,--disable-high-entropy-va','-no-pie','-fno-PIE','-fstack-protector-all', '-lssp']), - (1, executable+': failed PIE DYNAMIC_BASE HIGH_ENTROPY_VA RELOC_SECTION CONTROL_FLOW')) - self.assertEqual(call_security_check(cc, source, executable, ['-Wl,--nxcompat','-Wl,--enable-reloc-section','-Wl,--disable-dynamicbase','-Wl,--disable-high-entropy-va','-no-pie','-fno-PIE','-fstack-protector-all', '-lssp']), - (1, executable+': failed PIE DYNAMIC_BASE HIGH_ENTROPY_VA CONTROL_FLOW')) - self.assertEqual(call_security_check(cc, source, executable, ['-Wl,--nxcompat','-Wl,--enable-reloc-section','-Wl,--disable-dynamicbase','-Wl,--disable-high-entropy-va','-pie','-fPIE','-fstack-protector-all', '-lssp']), - (1, executable+': failed PIE DYNAMIC_BASE HIGH_ENTROPY_VA CONTROL_FLOW')) # -pie -fPIE does nothing unless --dynamicbase is also supplied - self.assertEqual(call_security_check(cc, source, executable, ['-Wl,--nxcompat','-Wl,--enable-reloc-section','-Wl,--dynamicbase','-Wl,--disable-high-entropy-va','-pie','-fPIE','-fstack-protector-all', '-lssp']), - (1, executable+': failed HIGH_ENTROPY_VA CONTROL_FLOW')) - self.assertEqual(call_security_check(cc, source, executable, ['-Wl,--nxcompat','-Wl,--enable-reloc-section','-Wl,--dynamicbase','-Wl,--high-entropy-va','-pie','-fPIE','-fstack-protector-all', '-lssp']), - (1, executable+': failed CONTROL_FLOW')) - self.assertEqual(call_security_check(cc, source, executable, ['-Wl,--nxcompat','-Wl,--enable-reloc-section','-Wl,--dynamicbase','-Wl,--high-entropy-va','-pie','-fPIE', '-fcf-protection=full','-fstack-protector-all', '-lssp']), - (0, '')) - - clean_files(source, executable) - - def test_MACHO(self): - source = 'test1.c' - executable = 'test1' - cc = determine_wellknown_cmd('CC', 'clang') - write_testcode(source) - arch = get_arch(cc, source, executable) - - if arch == lief.ARCHITECTURES.X86: - self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-no_pie','-Wl,-flat_namespace','-fno-stack-protector', '-Wl,-no_fixup_chains']), - (1, executable+': failed NOUNDEFS Canary FIXUP_CHAINS PIE CONTROL_FLOW')) - self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-flat_namespace','-fno-stack-protector', '-Wl,-fixup_chains']), - (1, executable+': failed NOUNDEFS Canary CONTROL_FLOW')) - self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-flat_namespace','-fstack-protector-all', '-Wl,-fixup_chains']), - (1, executable+': failed NOUNDEFS CONTROL_FLOW')) - self.assertEqual(call_security_check(cc, source, executable, ['-fstack-protector-all', '-Wl,-fixup_chains']), - (1, executable+': failed CONTROL_FLOW')) - self.assertEqual(call_security_check(cc, source, executable, ['-fstack-protector-all', '-fcf-protection=full', '-Wl,-fixup_chains']), - (0, '')) - else: - # arm64 darwin doesn't support non-PIE binaries, control flow or executable stacks - self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-flat_namespace','-fno-stack-protector', '-Wl,-no_fixup_chains']), - (1, executable+': failed NOUNDEFS Canary FIXUP_CHAINS BRANCH_PROTECTION')) - self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-flat_namespace','-fno-stack-protector', '-Wl,-fixup_chains', '-mbranch-protection=bti']), - (1, executable+': failed NOUNDEFS Canary')) - self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-flat_namespace','-fstack-protector-all', '-Wl,-fixup_chains', '-mbranch-protection=bti']), - (1, executable+': failed NOUNDEFS')) - self.assertEqual(call_security_check(cc, source, executable, ['-fstack-protector-all', '-Wl,-fixup_chains', '-mbranch-protection=bti']), - (0, '')) - - - clean_files(source, executable) - -if __name__ == '__main__': - unittest.main() diff --git a/contrib/devtools/test-symbol-check.py b/contrib/devtools/test-symbol-check.py deleted file mode 100755 index b00004586c..0000000000 --- a/contrib/devtools/test-symbol-check.py +++ /dev/null @@ -1,174 +0,0 @@ -#!/usr/bin/env python3 -# Copyright (c) 2020-2022 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. -''' -Test script for symbol-check.py -''' -import os -import subprocess -import unittest - -from utils import determine_wellknown_cmd - -def call_symbol_check(cc: list[str], source, executable, options): - # This should behave the same as AC_TRY_LINK, so arrange well-known flags - # in the same order as autoconf would. - # - # See the definitions for ac_link in autoconf's lib/autoconf/c.m4 file for - # reference. - env_flags: list[str] = [] - for var in ['CFLAGS', 'CPPFLAGS', 'LDFLAGS']: - env_flags += filter(None, os.environ.get(var, '').split(' ')) - - subprocess.run([*cc,source,'-o',executable] + env_flags + options, check=True) - p = subprocess.run([os.path.join(os.path.dirname(__file__), 'symbol-check.py'), executable], stdout=subprocess.PIPE, text=True) - os.remove(source) - os.remove(executable) - return (p.returncode, p.stdout.rstrip()) - -class TestSymbolChecks(unittest.TestCase): - def test_ELF(self): - source = 'test1.c' - executable = 'test1' - cc = determine_wellknown_cmd('CC', 'gcc') - - # -lutil is part of the libc6 package so a safe bet that it's installed - # it's also out of context enough that it's unlikely to ever become a real dependency - source = 'test2.c' - executable = 'test2' - with open(source, 'w', encoding="utf8") as f: - f.write(''' - #include - - int main() - { - login(0); - return 0; - } - ''') - - self.assertEqual(call_symbol_check(cc, source, executable, ['-lutil']), - (1, executable + ': libutil.so.1 is not in ALLOWED_LIBRARIES!\n' + - executable + ': failed LIBRARY_DEPENDENCIES')) - - # finally, check a simple conforming binary - source = 'test3.c' - executable = 'test3' - with open(source, 'w', encoding="utf8") as f: - f.write(''' - #include - - int main() - { - printf("42"); - return 0; - } - ''') - - self.assertEqual(call_symbol_check(cc, source, executable, []), - (0, '')) - - def test_MACHO(self): - source = 'test1.c' - executable = 'test1' - cc = determine_wellknown_cmd('CC', 'clang') - - with open(source, 'w', encoding="utf8") as f: - f.write(''' - #include - - int main() - { - XML_ExpatVersion(); - return 0; - } - - ''') - - self.assertEqual(call_symbol_check(cc, source, executable, ['-lexpat', '-Wl,-platform_version','-Wl,macos', '-Wl,11.4', '-Wl,11.4']), - (1, 'libexpat.1.dylib is not in ALLOWED_LIBRARIES!\n' + - f'{executable}: failed DYNAMIC_LIBRARIES MIN_OS SDK')) - - source = 'test2.c' - executable = 'test2' - with open(source, 'w', encoding="utf8") as f: - f.write(''' - #include - - int main() - { - CGMainDisplayID(); - return 0; - } - ''') - - self.assertEqual(call_symbol_check(cc, source, executable, ['-framework', 'CoreGraphics', '-Wl,-platform_version','-Wl,macos', '-Wl,11.4', '-Wl,11.4']), - (1, f'{executable}: failed MIN_OS SDK')) - - source = 'test3.c' - executable = 'test3' - with open(source, 'w', encoding="utf8") as f: - f.write(''' - int main() - { - return 0; - } - ''') - - self.assertEqual(call_symbol_check(cc, source, executable, ['-Wl,-platform_version','-Wl,macos', '-Wl,11.0', '-Wl,11.4']), - (1, f'{executable}: failed SDK')) - - def test_PE(self): - source = 'test1.c' - executable = 'test1.exe' - cc = determine_wellknown_cmd('CC', 'x86_64-w64-mingw32-gcc') - - with open(source, 'w', encoding="utf8") as f: - f.write(''' - #include - - int main() - { - PdhConnectMachineA(NULL); - return 0; - } - ''') - - self.assertEqual(call_symbol_check(cc, source, executable, ['-lpdh', '-Wl,--major-subsystem-version', '-Wl,6', '-Wl,--minor-subsystem-version', '-Wl,1']), - (1, 'pdh.dll is not in ALLOWED_LIBRARIES!\n' + - executable + ': failed DYNAMIC_LIBRARIES')) - - source = 'test2.c' - executable = 'test2.exe' - - with open(source, 'w', encoding="utf8") as f: - f.write(''' - int main() - { - return 0; - } - ''') - - self.assertEqual(call_symbol_check(cc, source, executable, ['-Wl,--major-subsystem-version', '-Wl,9', '-Wl,--minor-subsystem-version', '-Wl,9']), - (1, executable + ': failed SUBSYSTEM_VERSION')) - - source = 'test3.c' - executable = 'test3.exe' - with open(source, 'w', encoding="utf8") as f: - f.write(''' - #include - - int main() - { - CoFreeUnusedLibrariesEx(0,0); - return 0; - } - ''') - - self.assertEqual(call_symbol_check(cc, source, executable, ['-lole32', '-Wl,--major-subsystem-version', '-Wl,6', '-Wl,--minor-subsystem-version', '-Wl,1']), - (0, '')) - - -if __name__ == '__main__': - unittest.main() diff --git a/contrib/devtools/test_deterministic_coverage.sh b/contrib/devtools/test_deterministic_coverage.sh deleted file mode 100755 index d621e35b68..0000000000 --- a/contrib/devtools/test_deterministic_coverage.sh +++ /dev/null @@ -1,151 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright (c) 2019-2020 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. -# -# Test for deterministic coverage across unit test runs. - -export LC_ALL=C - -# Use GCOV_EXECUTABLE="gcov" if compiling with gcc. -# Use GCOV_EXECUTABLE="llvm-cov gcov" if compiling with clang. -GCOV_EXECUTABLE="gcov" - -# Disable tests known to cause non-deterministic behaviour and document the source or point of non-determinism. -NON_DETERMINISTIC_TESTS=( - "blockfilter_index_tests/blockfilter_index_initial_sync" # src/checkqueue.h: In CCheckQueue::Loop(): while (queue.empty()) { ... } - "coinselector_tests/knapsack_solver_test" # coinselector_tests.cpp: if (equal_sets(setCoinsRet, setCoinsRet2)) - "fs_tests/fsbridge_fstream" # deterministic test failure? - "miner_tests/CreateNewBlock_validity" # validation.cpp: if (signals.CallbacksPending() > 10) - "scheduler_tests/manythreads" # scheduler.cpp: CScheduler::serviceQueue() - "scheduler_tests/singlethreadedscheduler_ordered" # scheduler.cpp: CScheduler::serviceQueue() - "txvalidationcache_tests/checkinputs_test" # validation.cpp: if (signals.CallbacksPending() > 10) - "txvalidationcache_tests/tx_mempool_block_doublespend" # validation.cpp: if (signals.CallbacksPending() > 10) - "txindex_tests/txindex_initial_sync" # validation.cpp: if (signals.CallbacksPending() > 10) - "txvalidation_tests/tx_mempool_reject_coinbase" # validation.cpp: if (signals.CallbacksPending() > 10) - "validation_block_tests/processnewblock_signals_ordering" # validation.cpp: if (signals.CallbacksPending() > 10) - "wallet_tests/coin_mark_dirty_immature_credit" # validation.cpp: if (signals.CallbacksPending() > 10) - "wallet_tests/dummy_input_size_test" # validation.cpp: if (signals.CallbacksPending() > 10) - "wallet_tests/importmulti_rescan" # validation.cpp: if (signals.CallbacksPending() > 10) - "wallet_tests/importwallet_rescan" # validation.cpp: if (signals.CallbacksPending() > 10) - "wallet_tests/ListCoins" # validation.cpp: if (signals.CallbacksPending() > 10) - "wallet_tests/scan_for_wallet_transactions" # validation.cpp: if (signals.CallbacksPending() > 10) - "wallet_tests/wallet_disableprivkeys" # validation.cpp: if (signals.CallbacksPending() > 10) -) - -TEST_BGL_BINARY="src/test/test_BGL" - -print_usage() { - echo "Usage: $0 [custom test filter (default: all but known non-deterministic tests)] [number of test runs (default: 2)]" -} - -N_TEST_RUNS=2 -BOOST_TEST_RUN_FILTERS="" -if [[ $# != 0 ]]; then - if [[ $1 == "--help" ]]; then - print_usage - exit - fi - PARSED_ARGUMENTS=0 - if [[ $1 =~ [a-z] ]]; then - BOOST_TEST_RUN_FILTERS=$1 - PARSED_ARGUMENTS=$((PARSED_ARGUMENTS + 1)) - shift - fi - if [[ $1 =~ ^[0-9]+$ ]]; then - N_TEST_RUNS=$1 - PARSED_ARGUMENTS=$((PARSED_ARGUMENTS + 1)) - shift - fi - if [[ ${PARSED_ARGUMENTS} == 0 || $# -gt 2 || ${N_TEST_RUNS} -lt 2 ]]; then - print_usage - exit - fi -fi -if [[ ${BOOST_TEST_RUN_FILTERS} == "" ]]; then - BOOST_TEST_RUN_FILTERS="$(IFS=":"; echo "!${NON_DETERMINISTIC_TESTS[*]}" | sed 's/:/:!/g')" -else - echo "Using Boost test filter: ${BOOST_TEST_RUN_FILTERS}" - echo -fi - -if ! command -v gcov > /dev/null; then - echo "Error: gcov not installed. Exiting." - exit 1 -fi - -if ! command -v gcovr > /dev/null; then - echo "Error: gcovr not installed. Exiting." - exit 1 -fi - -if [[ ! -e ${TEST_BGL_BINARY} ]]; then - echo "Error: Executable ${TEST_BGL_BINARY} not found. Run \"./configure --enable-lcov\" and compile." - exit 1 -fi - -get_file_suffix_count() { - find src/ -type f -name "*.$1" | wc -l -} - -if [[ $(get_file_suffix_count gcno) == 0 ]]; then - echo "Error: Could not find any *.gcno files. The *.gcno files are generated by the compiler. Run \"./configure --enable-lcov\" and re-compile." - exit 1 -fi - -get_covr_filename() { - echo "gcovr.run-$1.txt" -} - -TEST_RUN_ID=0 -while [[ ${TEST_RUN_ID} -lt ${N_TEST_RUNS} ]]; do - TEST_RUN_ID=$((TEST_RUN_ID + 1)) - echo "[$(date +"%Y-%m-%d %H:%M:%S")] Measuring coverage, run #${TEST_RUN_ID} of ${N_TEST_RUNS}" - find src/ -type f -name "*.gcda" -exec rm {} \; - if [[ $(get_file_suffix_count gcda) != 0 ]]; then - echo "Error: Stale *.gcda files found. Exiting." - exit 1 - fi - TEST_OUTPUT_TEMPFILE=$(mktemp) - if ! BOOST_TEST_RUN_FILTERS="${BOOST_TEST_RUN_FILTERS}" ${TEST_BGL_BINARY} > "${TEST_OUTPUT_TEMPFILE}" 2>&1; then - cat "${TEST_OUTPUT_TEMPFILE}" - rm "${TEST_OUTPUT_TEMPFILE}" - exit 1 - fi - rm "${TEST_OUTPUT_TEMPFILE}" - if [[ $(get_file_suffix_count gcda) == 0 ]]; then - echo "Error: Running the test suite did not create any *.gcda files. The gcda files are generated when the instrumented test programs are executed. Run \"./configure --enable-lcov\" and re-compile." - exit 1 - fi - GCOVR_TEMPFILE=$(mktemp) - if ! gcovr --gcov-executable "${GCOV_EXECUTABLE}" -r src/ > "${GCOVR_TEMPFILE}"; then - echo "Error: gcovr failed. Output written to ${GCOVR_TEMPFILE}. Exiting." - exit 1 - fi - GCOVR_FILENAME=$(get_covr_filename ${TEST_RUN_ID}) - mv "${GCOVR_TEMPFILE}" "${GCOVR_FILENAME}" - if grep -E "^TOTAL *0 *0 " "${GCOVR_FILENAME}"; then - echo "Error: Spurious gcovr output. Make sure the correct GCOV_EXECUTABLE variable is set in $0 (\"gcov\" for gcc, \"llvm-cov gcov\" for clang)." - exit 1 - fi - if [[ ${TEST_RUN_ID} != 1 ]]; then - COVERAGE_DIFF=$(diff -u "$(get_covr_filename 1)" "${GCOVR_FILENAME}") - if [[ ${COVERAGE_DIFF} != "" ]]; then - echo - echo "The line coverage is non-deterministic between runs. Exiting." - echo - echo "The test suite must be deterministic in the sense that the set of lines executed at least" - echo "once must be identical between runs. This is a necessary condition for meaningful" - echo "coverage measuring." - echo - echo "${COVERAGE_DIFF}" - exit 1 - fi - rm "${GCOVR_FILENAME}" - fi -done - -echo -echo "Coverage test passed: Deterministic coverage across ${N_TEST_RUNS} runs." -exit diff --git a/contrib/devtools/test_utxo_snapshots.sh b/contrib/devtools/test_utxo_snapshots.sh deleted file mode 100755 index d7c019f4a6..0000000000 --- a/contrib/devtools/test_utxo_snapshots.sh +++ /dev/null @@ -1,209 +0,0 @@ -#!/usr/bin/env bash -# Demonstrate the creation and usage of UTXO snapshots. -# -# A server node starts up, IBDs up to a certain height, then generates a UTXO -# snapshot at that point. -# -# The server then downloads more blocks (to create a diff from the snapshot). -# -# We bring a client up, load the UTXO snapshot, and we show the client sync to -# the "network tip" and then start a background validation of the snapshot it -# loaded. We see the background validation chainstate removed after validation -# completes. -# -# The shellcheck rule SC2086 (quoted variables) disablements are necessary -# since this rule needs to be violated in order to get bitcoind to pick up on -# $EARLY_IBD_FLAGS for the script to work. - -export LC_ALL=C -set -e - -BASE_HEIGHT=${1:-30000} -INCREMENTAL_HEIGHT=20000 -FINAL_HEIGHT=$((BASE_HEIGHT + INCREMENTAL_HEIGHT)) - -SERVER_DATADIR="$(pwd)/utxodemo-data-server-$BASE_HEIGHT" -CLIENT_DATADIR="$(pwd)/utxodemo-data-client-$BASE_HEIGHT" -UTXO_DAT_FILE="$(pwd)/utxo.$BASE_HEIGHT.dat" - -# Chosen to try to not interfere with any running bitcoind processes. -SERVER_PORT=8633 -SERVER_RPC_PORT=8632 - -CLIENT_PORT=8733 -CLIENT_RPC_PORT=8732 - -SERVER_PORTS="-port=${SERVER_PORT} -rpcport=${SERVER_RPC_PORT}" -CLIENT_PORTS="-port=${CLIENT_PORT} -rpcport=${CLIENT_RPC_PORT}" - -# Ensure the client exercises all indexes to test that snapshot use works -# properly with indexes. -ALL_INDEXES="-txindex -coinstatsindex -blockfilterindex=1" - -if ! command -v jq >/dev/null ; then - echo "This script requires jq to parse JSON RPC output. Please install it." - echo "(e.g. sudo apt install jq)" - exit 1 -fi - -DUMP_OUTPUT="dumptxoutset-output-$BASE_HEIGHT.json" - -finish() { - echo - echo "Killing server and client PIDs ($SERVER_PID, $CLIENT_PID) and cleaning up datadirs" - echo - rm -f "$UTXO_DAT_FILE" "$DUMP_OUTPUT" - rm -rf "$SERVER_DATADIR" "$CLIENT_DATADIR" - kill -9 "$SERVER_PID" "$CLIENT_PID" -} - -trap finish EXIT - -# Need to specify these to trick client into accepting server as a peer -# it can IBD from, otherwise the default values prevent IBD from the server node. -EARLY_IBD_FLAGS="-maxtipage=9223372036854775207 -minimumchainwork=0x00" - -server_rpc() { - ./src/bitcoin-cli -rpcport=$SERVER_RPC_PORT -datadir="$SERVER_DATADIR" "$@" -} -client_rpc() { - ./src/bitcoin-cli -rpcport=$CLIENT_RPC_PORT -datadir="$CLIENT_DATADIR" "$@" -} -server_sleep_til_boot() { - while ! server_rpc ping >/dev/null 2>&1; do sleep 0.1; done -} -client_sleep_til_boot() { - while ! client_rpc ping >/dev/null 2>&1; do sleep 0.1; done -} -server_sleep_til_shutdown() { - while server_rpc ping >/dev/null 2>&1; do sleep 0.1; done -} - -mkdir -p "$SERVER_DATADIR" "$CLIENT_DATADIR" - -echo "Hi, welcome to the assumeutxo demo/test" -echo -echo "We're going to" -echo -echo " - start up a 'server' node, sync it via mainnet IBD to height ${BASE_HEIGHT}" -echo " - create a UTXO snapshot at that height" -echo " - IBD ${INCREMENTAL_HEIGHT} more blocks on top of that" -echo -echo "then we'll demonstrate assumeutxo by " -echo -echo " - starting another node (the 'client') and loading the snapshot in" -echo " * first you'll have to modify the code slightly (chainparams) and recompile" -echo " * don't worry, we'll make it easy" -echo " - observing the client sync ${INCREMENTAL_HEIGHT} blocks on top of the snapshot from the server" -echo " - observing the client validate the snapshot chain via background IBD" -echo -read -p "Press [enter] to continue" _ - -echo -echo "-- Starting the demo. You might want to run the two following commands in" -echo " separate terminal windows:" -echo -echo " watch -n0.1 tail -n 30 $SERVER_DATADIR/debug.log" -echo " watch -n0.1 tail -n 30 $CLIENT_DATADIR/debug.log" -echo -read -p "Press [enter] to continue" _ - -echo -echo "-- IBDing the blocks (height=$BASE_HEIGHT) required to the server node..." -# shellcheck disable=SC2086 -./src/bitcoind -logthreadnames=1 $SERVER_PORTS \ - -datadir="$SERVER_DATADIR" $EARLY_IBD_FLAGS -stopatheight="$BASE_HEIGHT" >/dev/null - -echo -echo "-- Creating snapshot at ~ height $BASE_HEIGHT ($UTXO_DAT_FILE)..." -server_sleep_til_shutdown # wait for stopatheight to be hit -# shellcheck disable=SC2086 -./src/bitcoind -logthreadnames=1 $SERVER_PORTS \ - -datadir="$SERVER_DATADIR" $EARLY_IBD_FLAGS -connect=0 -listen=0 >/dev/null & -SERVER_PID="$!" - -server_sleep_til_boot -server_rpc dumptxoutset "$UTXO_DAT_FILE" > "$DUMP_OUTPUT" -cat "$DUMP_OUTPUT" -kill -9 "$SERVER_PID" - -RPC_BASE_HEIGHT=$(jq -r .base_height < "$DUMP_OUTPUT") -RPC_AU=$(jq -r .txoutset_hash < "$DUMP_OUTPUT") -RPC_NCHAINTX=$(jq -r .nchaintx < "$DUMP_OUTPUT") -RPC_BLOCKHASH=$(jq -r .base_hash < "$DUMP_OUTPUT") - -server_sleep_til_shutdown - -echo -echo "-- Now: add the following to CMainParams::m_assumeutxo_data" -echo " in src/kernel/chainparams.cpp, and recompile:" -echo -echo " {${RPC_BASE_HEIGHT}, AssumeutxoHash{uint256S(\"0x${RPC_AU}\")}, ${RPC_NCHAINTX}, uint256S(\"0x${RPC_BLOCKHASH}\")}," -echo -echo -echo "-- IBDing more blocks to the server node (height=$FINAL_HEIGHT) so there is a diff between snapshot and tip..." -# shellcheck disable=SC2086 -./src/bitcoind $SERVER_PORTS -logthreadnames=1 -datadir="$SERVER_DATADIR" \ - $EARLY_IBD_FLAGS -stopatheight="$FINAL_HEIGHT" >/dev/null - -echo -echo "-- Starting the server node to provide blocks to the client node..." -# shellcheck disable=SC2086 -./src/bitcoind $SERVER_PORTS -logthreadnames=1 -debug=net -datadir="$SERVER_DATADIR" \ - $EARLY_IBD_FLAGS -connect=0 -listen=1 >/dev/null & -SERVER_PID="$!" -server_sleep_til_boot - -echo -echo "-- Okay, what you're about to see is the client starting up and activating the snapshot." -echo " I'm going to display the top 14 log lines from the client on top of an RPC called" -echo " getchainstates, which is like getblockchaininfo but for both the snapshot and " -echo " background validation chainstates." -echo -echo " You're going to first see the snapshot chainstate sync to the server's tip, then" -echo " the background IBD chain kicks in to validate up to the base of the snapshot." -echo -echo " Once validation of the snapshot is done, you should see log lines indicating" -echo " that we've deleted the background validation chainstate." -echo -echo " Once everything completes, exit the watch command with CTRL+C." -echo -read -p "When you're ready for all this, hit [enter]" _ - -echo -echo "-- Starting the client node to get headers from the server, then load the snapshot..." -# shellcheck disable=SC2086 -./src/bitcoind $CLIENT_PORTS $ALL_INDEXES -logthreadnames=1 -datadir="$CLIENT_DATADIR" \ - -connect=0 -addnode=127.0.0.1:$SERVER_PORT -debug=net $EARLY_IBD_FLAGS >/dev/null & -CLIENT_PID="$!" -client_sleep_til_boot - -echo -echo "-- Initial state of the client:" -client_rpc getchainstates - -echo -echo "-- Loading UTXO snapshot into client. Calling RPC in a loop..." -while ! client_rpc loadtxoutset "$UTXO_DAT_FILE" ; do sleep 10; done - -watch -n 0.3 "( tail -n 14 $CLIENT_DATADIR/debug.log ; echo ; ./src/bitcoin-cli -rpcport=$CLIENT_RPC_PORT -datadir=$CLIENT_DATADIR getchainstates) | cat" - -echo -echo "-- Okay, now I'm going to restart the client to make sure that the snapshot chain reloads " -echo " as the main chain properly..." -echo -echo " Press CTRL+C after you're satisfied to exit the demo" -echo -read -p "Press [enter] to continue" - -client_sleep_til_boot -# shellcheck disable=SC2086 -./src/bitcoind $CLIENT_PORTS $ALL_INDEXES -logthreadnames=1 -datadir="$CLIENT_DATADIR" -connect=0 \ - -addnode=127.0.0.1:$SERVER_PORT "$EARLY_IBD_FLAGS" >/dev/null & -CLIENT_PID="$!" -client_sleep_til_boot - -watch -n 0.3 "( tail -n 14 $CLIENT_DATADIR/debug.log ; echo ; ./src/bitcoin-cli -rpcport=$CLIENT_RPC_PORT -datadir=$CLIENT_DATADIR getchainstates) | cat" - -echo -echo "-- Done!" diff --git a/contrib/devtools/utils.py b/contrib/devtools/utils.py deleted file mode 100755 index 8b4c67c6c0..0000000000 --- a/contrib/devtools/utils.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env python3 -# Copyright (c) 2021 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. -''' -Common utility functions -''' -import shutil -import sys -import os - - -def determine_wellknown_cmd(envvar, progname) -> list[str]: - maybe_env = os.getenv(envvar) - maybe_which = shutil.which(progname) - if maybe_env: - return maybe_env.split(' ') # Well-known vars are often meant to be word-split - elif maybe_which: - return [ maybe_which ] - else: - sys.exit(f"{progname} not found") diff --git a/contrib/devtools/utxo_snapshot.sh b/contrib/devtools/utxo_snapshot.sh deleted file mode 100755 index b98f72edcc..0000000000 --- a/contrib/devtools/utxo_snapshot.sh +++ /dev/null @@ -1,94 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright (c) 2019-2023 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. -# -export LC_ALL=C - -set -ueo pipefail - -NETWORK_DISABLED=false - -if (( $# < 3 )); then - echo 'Usage: utxo_snapshot.sh ' - echo - echo " if is '-', don't produce a snapshot file but instead print the " - echo " expected assumeutxo hash" - echo - echo 'Examples:' - echo - echo " ./contrib/devtools/utxo_snapshot.sh 570000 utxo.dat ./src/BGL-cli -datadir=\$(pwd)/testdata" - echo ' ./contrib/devtools/utxo_snapshot.sh 570000 - ./src/BGL-cli' - exit 1 -fi - -GENERATE_AT_HEIGHT="${1}"; shift; -OUTPUT_PATH="${1}"; shift; -# Most of the calls we make take a while to run, so pad with a lengthy timeout. -BGL_CLI_CALL="${*} -rpcclienttimeout=9999999" - -# Check if the node is pruned and get the pruned block height -PRUNED=$( ${BITCOIN_CLI_CALL} getblockchaininfo | awk '/pruneheight/ {print $2}' | tr -d ',' ) - -if (( GENERATE_AT_HEIGHT < PRUNED )); then - echo "Error: The requested snapshot height (${GENERATE_AT_HEIGHT}) should be greater than the pruned block height (${PRUNED})." - exit 1 -fi - -# Early exit if file at OUTPUT_PATH already exists -if [[ -e "$OUTPUT_PATH" ]]; then - (>&2 echo "Error: $OUTPUT_PATH already exists or is not a valid path.") - exit 1 -fi - -# Validate that the path is correct -if [[ "${OUTPUT_PATH}" != "-" && ! -d "$(dirname "${OUTPUT_PATH}")" ]]; then - (>&2 echo "Error: The directory $(dirname "${OUTPUT_PATH}") does not exist.") - exit 1 -fi - -function cleanup { - (>&2 echo "Restoring chain to original height; this may take a while") - ${BITCOIN_CLI_CALL} reconsiderblock "${PIVOT_BLOCKHASH}" - - if $NETWORK_DISABLED; then - (>&2 echo "Restoring network activity") - ${BITCOIN_CLI_CALL} setnetworkactive true - fi -} - -function early_exit { - (>&2 echo "Exiting due to Ctrl-C") - cleanup - exit 1 -} - -# Prompt the user to disable network activity -read -p "Do you want to disable network activity (setnetworkactive false) before running invalidateblock? (Y/n): " -r -if [[ "$REPLY" =~ ^[Yy]*$ || -z "$REPLY" ]]; then - # User input is "Y", "y", or Enter key, proceed with the action - NETWORK_DISABLED=true - (>&2 echo "Disabling network activity") - ${BITCOIN_CLI_CALL} setnetworkactive false -else - (>&2 echo "Network activity remains enabled") -fi - -# Block we'll invalidate/reconsider to rewind/fast-forward the chain. -PIVOT_BLOCKHASH=$($BGL_CLI_CALL getblockhash $(( GENERATE_AT_HEIGHT + 1 )) ) - -# Trap for normal exit and Ctrl-C -trap cleanup EXIT -trap early_exit INT - -(>&2 echo "Rewinding chain back to height ${GENERATE_AT_HEIGHT} (by invalidating ${PIVOT_BLOCKHASH}); this may take a while") -${BGL_CLI_CALL} invalidateblock "${PIVOT_BLOCKHASH}" - -if [[ "${OUTPUT_PATH}" = "-" ]]; then - (>&2 echo "Generating txoutset info...") - ${BGL_CLI_CALL} gettxoutsetinfo | grep hash_serialized_3 | sed 's/^.*: "\(.\+\)\+",/\1/g' -else - (>&2 echo "Generating UTXO snapshot...") - ${BGL_CLI_CALL} dumptxoutset "${OUTPUT_PATH}" -fi diff --git a/contrib/filter-lcov.py b/contrib/filter-lcov.py deleted file mode 100755 index db780ad53b..0000000000 --- a/contrib/filter-lcov.py +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env python3 -# Copyright (c) 2017-2020 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 argparse - -parser = argparse.ArgumentParser(description='Remove the coverage data from a tracefile for all files matching the pattern.') -parser.add_argument('--pattern', '-p', action='append', help='the pattern of files to remove', required=True) -parser.add_argument('tracefile', help='the tracefile to remove the coverage data from') -parser.add_argument('outfile', help='filename for the output to be written to') - -args = parser.parse_args() -tracefile = args.tracefile -pattern = args.pattern -outfile = args.outfile - -in_remove = False -with open(tracefile, 'r', encoding="utf8") as f: - with open(outfile, 'w', encoding="utf8") as wf: - for line in f: - for p in pattern: - if line.startswith("SF:") and p in line: - in_remove = True - if not in_remove: - wf.write(line) - if line == 'end_of_record\n': - in_remove = False diff --git a/contrib/guix/INSTALL.md b/contrib/guix/INSTALL.md deleted file mode 100644 index 22ba246953..0000000000 --- a/contrib/guix/INSTALL.md +++ /dev/null @@ -1,810 +0,0 @@ -# Guix Installation and Setup - -This only needs to be done once per machine. If you have already completed the -installation and setup, please proceed to [perform a build](./README.md). - -Otherwise, you may choose from one of the following options to install Guix: - -1. Using the official **shell installer script** [⤓ skip to section][install-script] - - Maintained by Guix developers - - Easiest (automatically performs *most* setup) - - Works on nearly all Linux distributions - - Only installs latest release - - Binary installation only, requires high level of trust - - Note: The script needs to be run as root, so it should be inspected before it's run -2. Using the official **binary tarball** [⤓ skip to section][install-bin-tarball] - - Maintained by Guix developers - - Normal difficulty (full manual setup required) - - Works on nearly all Linux distributions - - Installs any release - - Binary installation only, requires high level of trust -3. Using fanquake's **Docker image** [↗︎ external instructions][install-fanquake-docker] - - Maintained by fanquake - - Easy (automatically performs *some* setup) - - Works wherever Docker images work - - Installs any release - - Binary installation only, requires high level of trust -4. Using a **distribution-maintained package** [⤓ skip to section][install-distro-pkg] - - Maintained by distribution's Guix package maintainer - - Normal difficulty (manual setup required) - - Works only on distributions with Guix packaged, see: https://repology.org/project/guix/versions - - Installs a release decided on by package maintainer - - Source or binary installation depending on the distribution -5. Building **from source** [⤓ skip to section][install-source] - - Maintained by you - - Hard, but rewarding - - Can be made to work on most Linux distributions - - Installs any commit (more granular) - - Source installation, requires lower level of trust - -## Options 1 and 2: Using the official shell installer script or binary tarball - -The installation instructions for both the official shell installer script and -the binary tarballs can be found in the GNU Guix Manual's [Binary Installation -section](https://guix.gnu.org/manual/en/html_node/Binary-Installation.html). - -Note that running through the binary tarball installation steps is largely -equivalent to manually performing what the shell installer script does. - -Note that at the time of writing (July 5th, 2021), the shell installer script -automatically creates an `/etc/profile.d` entry which the binary tarball -installation instructions do not ask you to create. However, you will likely -need this entry for better desktop integration. Please see [this -section](#add-an-etcprofiled-entry) for instructions on how to add a -`/etc/profile.d/guix.sh` entry. - -Regardless of which installation option you chose, the changes to -`/etc/profile.d` will not take effect until the next shell or desktop session, -so you should log out and log back in. - -## Option 3: Using fanquake's Docker image - -Please refer to fanquake's instructions -[here](https://github.com/fanquake/core-review/tree/master/guix). - -## Option 4: Using a distribution-maintained package - -Note that this section is based on the distro packaging situation at the time of -writing (July 2021). Guix is expected to be more widely packaged over time. For -an up-to-date view on Guix's package status/version across distros, please see: -https://repology.org/project/guix/versions - -### Debian / Ubuntu - -Guix is available as a distribution package in [Debian -](https://packages.debian.org/search?keywords=guix) and [Ubuntu -](https://packages.ubuntu.com/search?keywords=guix). - -To install: -```sh -sudo apt install guix -``` - -### Arch Linux - -Guix is available in the AUR as -[`guix`](https://aur.archlinux.org/packages/guix/), please follow the -installation instructions in the Arch Linux Wiki ([live -link](https://wiki.archlinux.org/index.php/Guix#AUR_Package_Installation), -[2021/03/30 -permalink](https://wiki.archlinux.org/index.php?title=Guix&oldid=637559#AUR_Package_Installation)) -to install Guix. - -At the time of writing (2021/03/30), the `check` phase will fail if the path to -guix's build directory is longer than 36 characters due to an anachronistic -character limit on the shebang line. Since the `check` phase happens after the -`build` phase, which may take quite a long time, it is recommended that users -either: - -1. Skip the `check` phase - - For `makepkg`: `makepkg --nocheck ...` - - For `yay`: `yay --mflags="--nocheck" ...` - - For `paru`: `paru --nocheck ...` -2. Or, check their build directory's length beforehand - - For those building with `makepkg`: `pwd | wc -c` - -## Option 5: Building from source - -Building Guix from source is a rather involved process but a rewarding one for -those looking to minimize trust and maximize customizability (e.g. building a -particular commit of Guix). Previous experience with using autotools-style build -systems to build packages from source will be helpful. *hic sunt dracones.* - -I strongly urge you to at least skim through the entire section once before you -start issuing commands, as it will save you a lot of unnecessary pain and -anguish. - -### Installing common build tools - -There are a few basic build tools that are required for most things we'll build, -so let's install them now: - -Text transformation/i18n: -- `autopoint` (sometimes packaged in `gettext`) -- `help2man` -- `po4a` -- `texinfo` - -Build system tools: -- `g++` w/ C++11 support -- `libtool` -- `autoconf` -- `automake` -- `pkg-config` (sometimes packaged as `pkgconf`) -- `make` -- `cmake` - -Miscellaneous: -- `git` -- `gnupg` -- `python3` - -### Building and Installing Guix's dependencies - -In order to build Guix itself from source, we need to first make sure that the -necessary dependencies are installed and discoverable. The most up-to-date list -of Guix's dependencies is kept in the ["Requirements" -section](https://guix.gnu.org/manual/en/html_node/Requirements.html) of the Guix -Reference Manual. - -Depending on your distribution, most or all of these dependencies may already be -packaged and installable without manually building and installing. - -For reference, the graphic below outlines Guix v1.3.0's dependency graph: - -![bootstrap map](https://user-images.githubusercontent.com/6399679/125064185-a9a59880-e0b0-11eb-82c1-9b8e5dc9950d.png) - -If you do not care about building each dependency from source, and Guix is -already packaged for your distribution, you can easily install only the build -dependencies of Guix. For example, to enable deb-src and install the Guix build -dependencies on Ubuntu/Debian: - -```sh -sed -i 's|# deb-src|deb-src|g' /etc/apt/sources.list -apt update -apt-get build-dep -y guix -``` - -If this succeeded, you can likely skip to section -["Building and Installing Guix itself"](#building-and-installing-guix-itself). - -#### Guile - -###### Corner case: Multiple versions of Guile on one system - -It is recommended to only install the required version of Guile, so that build systems do -not get confused about which Guile to use. - -However, if you insist on having more versions of Guile installed on -your system, then you need to **consistently** specify -`GUILE_EFFECTIVE_VERSION=3.0` to all -`./configure` invocations for Guix and its dependencies. - -##### Installing Guile - -If your distribution splits packages into `-dev`-suffixed and -non-`-dev`-suffixed sub-packages (as is the case for Debian-derived -distributions), please make sure to install both. For example, to install Guile -v3.0 on Debian/Ubuntu: - -```sh -apt install guile-3.0 guile-3.0-dev -``` - -#### Mixing distribution packages and source-built packages - -At the time of writing, most distributions have _some_ of Guix's dependencies -packaged, but not all. This means that you may want to install the distribution -package for some dependencies, and manually build-from-source for others. - -Distribution packages usually install to `/usr`, which is different from the -default `./configure` prefix of source-built packages: `/usr/local`. - -This means that if you mix-and-match distribution packages and source-built -packages and do not specify exactly `--prefix=/usr` to `./configure` for -source-built packages, you will need to augment the `GUILE_LOAD_PATH` and -`GUILE_LOAD_COMPILED_PATH` environment variables so that Guile will look -under the right prefix and find your source-built packages. - -For example, if you are using Guile v3.0, and have Guile packages in the -`/usr/local` prefix, either add the following lines to your `.profile` or -`.bash_profile` so that the environment variable is properly set for all future -shell logins, or paste the lines into a POSIX-style shell to temporarily modify -the environment variables of your current shell session. - -```sh -# Help Guile v3.0.x find packages in /usr/local -export GUILE_LOAD_PATH="/usr/local/share/guile/site/3.0${GUILE_LOAD_PATH:+:}$GUILE_LOAD_PATH" -export GUILE_LOAD_COMPILED_PATH="/usr/local/lib/guile/3.0/site-ccache${GUILE_LOAD_COMPILED_PATH:+:}$GUILE_COMPILED_LOAD_PATH" -``` - -Note that these environment variables are used to check for packages during -`./configure`, so they should be set as soon as possible should you want to use -a prefix other than `/usr`. - -#### Building and installing source-built packages - -***IMPORTANT**: A few dependencies have non-obvious quirks/errata which are -documented in the sub-sections immediately below. Please read these sections -before proceeding to build and install these packages.* - -Although you should always refer to the README or INSTALL files for the most -accurate information, most of these dependencies use autoconf-style build -systems (check if there's a `configure.ac` file), and will likely do the right -thing with the following: - -Clone the repository and check out the latest release: -```sh -git clone /.git -cd -git tag -l # check for the latest release -git checkout -``` - -For autoconf-based build systems (if `./autogen.sh` or `configure.ac` exists at -the root of the repository): - -```sh -./autogen.sh || autoreconf -vfi -./configure --prefix= -make -sudo make install -``` - -For CMake-based build systems (if `CMakeLists.txt` exists at the root of the -repository): - -```sh -mkdir build && cd build -cmake .. -DCMAKE_INSTALL_PREFIX= -sudo cmake --build . --target install -``` - -If you choose not to specify exactly `--prefix=/usr` to `./configure`, please -make sure you've carefully read the [previous section] on mixing distribution -packages and source-built packages. - -##### Binding packages require `-dev`-suffixed packages - -Relevant for: -- Everyone - -When building bindings, the `-dev`-suffixed version of the original package -needs to be installed. For example, building `Guile-zlib` on Debian-derived -distributions requires that `zlib1g-dev` is installed. - -When using bindings, the `-dev`-suffixed version of the original package still -needs to be installed. This is particularly problematic when distribution -packages are mispackaged like `guile-sqlite3` is in Ubuntu Focal such that -installing `guile-sqlite3` does not automatically install `libsqlite3-dev` as a -dependency. - -Below is a list of relevant Guile bindings and their corresponding `-dev` -packages in Debian at the time of writing. - -| Guile binding package | -dev Debian package | -|-----------------------|---------------------| -| guile-gcrypt | libgcrypt-dev | -| guile-git | libgit2-dev | -| guile-gnutls | (none) | -| guile-json | (none) | -| guile-lzlib | liblz-dev | -| guile-ssh | libssh-dev | -| guile-sqlite3 | libsqlite3-dev | -| guile-zlib | zlib1g-dev | - -##### `guile-git` actually depends on `libgit2 >= 1.1` - -Relevant for: -- Those building `guile-git` from source against `libgit2 < 1.1` -- Those installing `guile-git` from their distribution where `guile-git` is - built against `libgit2 < 1.1` - -As of v0.5.2, `guile-git` claims to only require `libgit2 >= 0.28.0`, however, -it actually requires `libgit2 >= 1.1`, otherwise, it will be confused by a -reference of `origin/keyring`: instead of interpreting the reference as "the -'keyring' branch of the 'origin' remote", the reference is interpreted as "the -branch literally named 'origin/keyring'" - -This is especially notable because Ubuntu Focal packages `libgit2 v0.28.4`, and -`guile-git` is built against it. - -Should you be in this situation, you need to build both `libgit2 v1.1.x` and -`guile-git` from source. - -Source: https://logs.guix.gnu.org/guix/2020-11-12.log#232527 - -### Building and Installing Guix itself - -Start by cloning Guix: - -``` -git clone https://git.savannah.gnu.org/git/guix.git -cd guix -``` - -You will likely want to build the latest release. -At the time of writing (November 2023), the latest release was `v1.4.0`. - -``` -git branch -a -l 'origin/version-*' # check for the latest release -git checkout -``` - -Bootstrap the build system: -``` -./bootstrap -``` - -Configure with the recommended `--localstatedir` flag: -``` -./configure --localstatedir=/var -``` - -Note: If you intend to hack on Guix in the future, you will need to supply the -same `--localstatedir=` flag for all future Guix `./configure` invocations. See -the last paragraph of this -[section](https://guix.gnu.org/manual/en/html_node/Requirements.html) for more -details. - -Build Guix (this will take a while): -``` -make -j$(nproc) -``` - -Install Guix: - -``` -sudo make install -``` - -### Post-"build from source" Setup - -#### Creating and starting a `guix-daemon-original` service with a fixed `argv[0]` - -At this point, guix will be installed to `${bindir}`, which is likely -`/usr/local/bin` if you did not override directory variables at -`./configure`-time. More information on standard Automake directory variables -can be found -[here](https://www.gnu.org/software/automake/manual/html_node/Standard-Directory-Variables.html). - -However, the Guix init scripts and service configurations for Upstart, systemd, -SysV, and OpenRC are installed to launch -`${localstatedir}/guix/profiles/per-user/root/current-guix/bin/guix-daemon`, -which does not yet exist, and will only exist after `root` performs their first -`guix pull`. TODO: Link to `guix pull` as root section - -We need to create a `-original` version of these init scripts that's pointed to -the binaries we just built and `make install`'ed in `${bindir}` (normally, -`/usr/local/bin`). - -Example for `systemd`, run as `root`: - -```sh -# Create guix-daemon-original.service by modifying guix-daemon.service -bindir="$(dirname $(command -v guix-daemon))" -sed -E -e "s|/\S*/guix/profiles/per-user/root/current-guix/bin/guix-daemon|${bindir}/guix-daemon|" /etc/systemd/system/guix-daemon.service > /etc/systemd/system/guix-daemon-original.service -chmod 664 /etc/systemd/system/guix-daemon-original.service - -# Make systemd recognize the new service -systemctl daemon-reload - -# Make sure that the non-working guix-daemon.service is stopped and disabled -systemctl stop guix-daemon -systemctl disable guix-daemon - -# Make sure that the working guix-daemon-original.service is started and enabled -systemctl enable guix-daemon-original -systemctl start guix-daemon-original -``` - -#### Creating `guix-daemon` users / groups - -Please see the [relevant -section](https://guix.gnu.org/manual/en/html_node/Build-Environment-Setup.html) -in the Guix Reference Manual for more details. - -## Optional setup - -At this point, you are set up to [use Guix to build Bitcoin -Core](./README.md#usage). However, if you want to polish your setup a bit and -make it "what Guix intended", then read the next few subsections. - -### Add an `/etc/profile.d` entry - -This section definitely does not apply to you if you installed Guix using: -1. The shell installer script -2. fanquake's Docker image -3. Debian's `guix` package - -#### Background - -Although Guix knows how to update itself and its packages, it does so in a -non-invasive way (it does not modify `/usr/local/bin/guix`). - -Instead, it does the following: - -- After a `guix pull`, it updates - `/var/guix/profiles/per-user/$USER/current-guix`, and creates a symlink - targeting this directory at `$HOME/.config/guix/current` - -- After a `guix install`, it updates - `/var/guix/profiles/per-user/$USER/guix-profile`, and creates a symlink - targeting this directory at `$HOME/.guix-profile` - -Therefore, in order for these operations to affect your shell/desktop sessions -(and for the principle of least astonishment to hold), their corresponding -directories have to be added to well-known environment variables like `$PATH`, -`$INFOPATH`, `$XDG_DATA_DIRS`, etc. - -In other words, if `$HOME/.config/guix/current/bin` does not exist in your -`$PATH`, a `guix pull` will have no effect on what `guix` you are using. Same -goes for `$HOME/.guix-profile/bin`, `guix install`, and installed packages. - -Helpfully, after a `guix pull` or `guix install`, a message will be printed like -so: - -``` -hint: Consider setting the necessary environment variables by running: - - GUIX_PROFILE="$HOME/.guix-profile" - . "$GUIX_PROFILE/etc/profile" - -Alternately, see `guix package --search-paths -p "$HOME/.guix-profile"'. -``` - -However, this is somewhat tedious to do for both `guix pull` and `guix install` -for each user on the system that wants to properly use `guix`. I recommend that -you instead add an entry to `/etc/profile.d` instead. This is done by default -when installing the Debian package later than 1.2.0-4 and when using the shell -script installer. - -#### Instructions - -Create `/etc/profile.d/guix.sh` with the following content: -```sh -# _GUIX_PROFILE: `guix pull` profile -_GUIX_PROFILE="$HOME/.config/guix/current" -if [ -L $_GUIX_PROFILE ]; then - export PATH="$_GUIX_PROFILE/bin${PATH:+:}$PATH" - # Export INFOPATH so that the updated info pages can be found - # and read by both /usr/bin/info and/or $GUIX_PROFILE/bin/info - # When INFOPATH is unset, add a trailing colon so that Emacs - # searches 'Info-default-directory-list'. - export INFOPATH="$_GUIX_PROFILE/share/info:$INFOPATH" -fi - -# GUIX_PROFILE: User's default profile -GUIX_PROFILE="$HOME/.guix-profile" -[ -L $GUIX_PROFILE ] || return -GUIX_LOCPATH="$GUIX_PROFILE/lib/locale" -export GUIX_PROFILE GUIX_LOCPATH - -[ -f "$GUIX_PROFILE/etc/profile" ] && . "$GUIX_PROFILE/etc/profile" - -# set XDG_DATA_DIRS to include Guix installations -export XDG_DATA_DIRS="$GUIX_PROFILE/share:${XDG_DATA_DIRS:-/usr/local/share/:/usr/share/}" -``` - -Please note that this will not take effect until the next shell or desktop -session (log out and log back in). - -### `guix pull` as root - -Before you do this, you need to read the section on [choosing your security -model][security-model] and adjust `guix` and `guix-daemon` flags according to -your choice, as invoking `guix pull` may pull substitutes from substitute -servers (which you may not want). - -As mentioned in a previous section, Guix expects -`${localstatedir}/guix/profiles/per-user/root/current-guix` to be populated with -`root`'s Guix profile, `guix pull`-ed and built by some former version of Guix. -However, this is not the case when we build from source. Therefore, we need to -perform a `guix pull` as `root`: - -```sh -sudo --login guix pull --branch=version- -# or -sudo --login guix pull --commit= -``` - -`guix pull` is quite a long process (especially if you're using -`--no-substitutes`). If you encounter build problems, please refer to the -[troubleshooting section](#troubleshooting). - -Note that running a bare `guix pull` with no commit or branch specified will -pull the latest commit on Guix's master branch, which is likely fine, but not -recommended. - -If you installed Guix from source, you may get an error like the following: -```sh -error: while creating symlink '/root/.config/guix/current' No such file or directory -``` -To resolve this, simply: -``` -sudo mkdir -p /root/.config/guix -``` -Then try the `guix pull` command again. - -After the `guix pull` finishes successfully, -`${localstatedir}/guix/profiles/per-user/root/current-guix` should be populated. - -#### Using the newly-pulled `guix` by restarting the daemon - -Depending on how you installed Guix, you should now make sure that your init -scripts and service configurations point to the newly-pulled `guix-daemon`. - -##### If you built Guix from source - -If you followed the instructions for [fixing argv\[0\]][fix-argv0], you can now -do the following: - -```sh -systemctl stop guix-daemon-original -systemctl disable guix-daemon-original - -systemctl enable guix-daemon -systemctl start guix-daemon -``` - -Remember to set `--no-substitutes` in `$libdir/systemd/system/guix-daemon.service` and other customizations if you used them for `guix-daemon-original.service`. - -##### If you installed Guix via the Debian/Ubuntu distribution packages - -You will need to create a `guix-daemon-latest` service which points to the new -`guix` rather than a pinned one. - -```sh -# Create guix-daemon-latest.service by modifying guix-daemon.service -sed -E -e "s|/usr/bin/guix-daemon|/var/guix/profiles/per-user/root/current-guix/bin/guix-daemon|" /etc/systemd/system/guix-daemon.service > /lib/systemd/system/guix-daemon-latest.service -chmod 664 /lib/systemd/system/guix-daemon-latest.service - -# Make systemd recognize the new service -systemctl daemon-reload - -# Make sure that the old guix-daemon.service is stopped and disabled -systemctl stop guix-daemon -systemctl disable guix-daemon - -# Make sure that the new guix-daemon-latest.service is started and enabled -systemctl enable guix-daemon-latest -systemctl start guix-daemon-latest -``` - -##### If you installed Guix via lantw44's Arch Linux AUR package - -At the time of writing (July 5th, 2021) the systemd unit for "updated Guix" is -`guix-daemon-latest.service`, therefore, you should do the following: - -```sh -systemctl stop guix-daemon -systemctl disable guix-daemon - -systemctl enable guix-daemon-latest -systemctl start guix-daemon-latest -``` - -##### Otherwise... - -Simply do: - -```sh -systemctl restart guix-daemon -``` - -### Checking everything - -If you followed all the steps above to make your Guix setup "prim and proper," -you can check that you did everything properly by running through this -checklist. - -1. `/etc/profile.d/guix.sh` should exist and be sourced at each shell login - -2. `guix describe` should not print `guix describe: error: failed to determine - origin`, but rather something like: - - ``` - Generation 38 Feb 22 2021 16:39:31 (current) - guix f350df4 - repository URL: https://git.savannah.gnu.org/git/guix.git - branch: version-1.2.0 - commit: f350df405fbcd5b9e27e6b6aa500da7f101f41e7 - ``` - -3. `guix-daemon` should be running from `${localstatedir}/guix/profiles/per-user/root/current-guix` - -# Troubleshooting - -## Derivation failed to build - -When you see a build failure like below: - -``` -building /gnu/store/...-foo-3.6.12.drv... -/ 'check' phasenote: keeping build directory `/tmp/guix-build-foo-3.6.12.drv-0' -builder for `/gnu/store/...-foo-3.6.12.drv' failed with exit code 1 -build of /gnu/store/...-foo-3.6.12.drv failed -View build log at '/var/log/guix/drvs/../...-foo-3.6.12.drv.bz2'. -cannot build derivation `/gnu/store/...-qux-7.69.1.drv': 1 dependencies couldn't be built -cannot build derivation `/gnu/store/...-bar-3.16.5.drv': 1 dependencies couldn't be built -cannot build derivation `/gnu/store/...-baz-2.0.5.drv': 1 dependencies couldn't be built -guix time-machine: error: build of `/gnu/store/...-baz-2.0.5.drv' failed -``` - -It means that `guix` failed to build a package named `foo`, which was a -dependency of `qux`, `bar`, and `baz`. Importantly, note that the last "failed" -line is not necessarily the root cause, the first "failed" line is. - -Most of the time, the build failure is due to a spurious test failure or the -package's build system/test suite breaking when running multi-threaded. To -rebuild _just_ this derivation in a single-threaded fashion (please don't forget -to add other `guix` flags like `--no-substitutes` as appropriate): - -```sh -$ guix build --cores=1 /gnu/store/...-foo-3.6.12.drv -``` - -If the single-threaded rebuild did not succeed, you may need to dig deeper. -You may view `foo`'s build logs in `less` like so (please replace paths with the -path you see in the build failure output): - -```sh -$ bzcat /var/log/guix/drvs/../...-foo-3.6.12.drv.bz2 | less -``` - -`foo`'s build directory is also preserved and available at -`/tmp/guix-build-foo-3.6.12.drv-0`. However, if you fail to build `foo` multiple -times, it may be `/tmp/...drv-1` or `/tmp/...drv-2`. Always consult the build -failure output for the most accurate, up-to-date information. - -### python(-minimal): [Errno 84] Invalid or incomplete multibyte or wide character - -This error occurs when your `$TMPDIR` (default: /tmp) exists on a filesystem -which rejects characters not present in the UTF-8 character code set. An example -is ZFS with the utf8only=on option set. - -More information: https://github.com/python/cpython/issues/81765 - -### openssl-1.1.1l and openssl-1.1.1n - -OpenSSL includes tests that will fail once some certificate has expired. -The workarounds from the GnuTLS section immediately below can be used. - -### GnuTLS: test-suite FAIL: status-request-revoked - -*The derivation is likely identified by: `/gnu/store/vhphki5sg9xkdhh2pbc8gi6vhpfzryf0-gnutls-3.6.12.drv`* - -This unfortunate error is most common for non-substitute builders who installed -Guix v1.2.0. The problem stems from the fact that one of GnuTLS's tests uses a -hardcoded certificate which expired on 2020-10-24. - -What's more unfortunate is that this GnuTLS derivation is somewhat special in -Guix's dependency graph and is not affected by the package transformation flags -like `--without-tests=`. - -The easiest solution for those encountering this problem is to install a newer -version of Guix. However, there are ways to work around this issue: - -#### Workaround 1: Using substitutes for this single derivation - -If you've authorized the official Guix build farm's key (more info -[here](./README.md#step-1-authorize-the-signing-keys)), then you can use -substitutes just for this single derivation by invoking the following: - -```sh -guix build --substitute-urls="https://ci.guix.gnu.org" /gnu/store/vhphki5sg9xkdhh2pbc8gi6vhpfzryf0-gnutls-3.6.12.drv -``` - -See [this section](./README.md#removing-authorized-keys) for instructions on how -to remove authorized keys if you don't want to keep the build farm's key -authorized. - -#### Workaround 2: Temporarily setting the system clock back - -This workaround was described [here](https://issues.guix.gnu.org/44559#5). - -Basically: -2. Turn off NTP -3. Set system time to 2020-10-01 -4. guix build --no-substitutes /gnu/store/vhphki5sg9xkdhh2pbc8gi6vhpfzryf0-gnutls-3.6.12.drv -5. Set system time back to accurate current time -6. Turn NTP back on - -For example, - -```sh -sudo timedatectl set-ntp no -sudo date --set "01 oct 2020 15:00:00" -guix build /gnu/store/vhphki5sg9xkdhh2pbc8gi6vhpfzryf0-gnutls-3.6.12.drv -sudo timedatectl set-ntp yes -``` - -#### Workaround 3: Disable the tests in the Guix source code for this single derivation - -If all of the above workarounds fail, you can also disable the `tests` phase of -the derivation via the `arguments` option, as described in the official -[`package` -reference](https://guix.gnu.org/manual/en/html_node/package-Reference.html). - -For example, to disable the openssl-1.1 check phase: - -```diff -diff --git a/gnu/packages/tls.scm b/gnu/packages/tls.scm -index f1e844b..1077c4b 100644 ---- a/gnu/packages/tls.scm -+++ b/gnu/packages/tls.scm -@@ -494,4 +494,5 @@ (define-public openssl-1.1 - (arguments - `(#:parallel-tests? #f -+ #:tests? #f - #:test-target "test" -``` - -### coreutils: FAIL: tests/tail-2/inotify-dir-recreate - -The inotify-dir-create test fails on "remote" filesystems such as overlayfs -(Docker's default filesystem) due to the filesystem being mistakenly recognized -as non-remote. - -A relatively easy workaround to this is to make sure that a somewhat traditional -filesystem is mounted at `/tmp` (where `guix-daemon` performs its builds). For -Docker users, this might mean [using a volume][docker/volumes], [binding -mounting][docker/bind-mnt] from host, or (for those with enough RAM and swap) -[mounting a tmpfs][docker/tmpfs] using the `--tmpfs` flag. - -Please see the following links for more details: - -- An upstream coreutils bug has been filed: [debbugs#47940](https://debbugs.gnu.org/cgi/bugreport.cgi?bug=47940) -- A Guix bug detailing the underlying problem has been filed: [guix-issues#47935](https://issues.guix.gnu.org/47935), [guix-issues#49985](https://issues.guix.gnu.org/49985#5) -- A commit to skip this test in Guix has been merged into the core-updates branch: -[savannah/guix@6ba1058](https://git.savannah.gnu.org/cgit/guix.git/commit/?id=6ba1058df0c4ce5611c2367531ae5c3cdc729ab4) - - -[install-script]: #options-1-and-2-using-the-official-shell-installer-script-or-binary-tarball -[install-bin-tarball]: #options-1-and-2-using-the-official-shell-installer-script-or-binary-tarball -[install-fanquake-docker]: #option-3-using-fanquakes-docker-image -[install-distro-pkg]: #option-4-using-a-distribution-maintained-package -[install-source]: #option-5-building-from-source - -[fix-argv0]: #creating-and-starting-a-guix-daemon-original-service-with-a-fixed-argv0 -[security-model]: ./README.md#choosing-your-security-model - -[docker/volumes]: https://docs.docker.com/storage/volumes/ -[docker/bind-mnt]: https://docs.docker.com/storage/bind-mounts/ -[docker/tmpfs]: https://docs.docker.com/storage/tmpfs/ - -# Purging/Uninstalling Guix - -In the extraordinarily rare case where you messed up your Guix installation in -an irreversible way, you may want to completely purge Guix from your system and -start over. - -1. Uninstall Guix itself according to the way you installed it (e.g. `sudo apt - purge guix` for Ubuntu packaging, `sudo make uninstall` for a build from source). -2. Remove all build users and groups - - You may check for relevant users and groups using: - - ``` - getent passwd | grep guix - getent group | grep guix - ``` - - Then, you may remove users and groups using: - - ``` - sudo userdel - sudo groupdel - ``` - -3. Remove all possible Guix-related directories - - `/var/guix/` - - `/var/log/guix/` - - `/gnu/` - - `/etc/guix/` - - `/home/*/.config/guix/` - - `/home/*/.cache/guix/` - - `/home/*/.guix-profile/` - - `/root/.config/guix/` - - `/root/.cache/guix/` - - `/root/.guix-profile/` diff --git a/contrib/guix/README.md b/contrib/guix/README.md deleted file mode 100644 index cece3a4d15..0000000000 --- a/contrib/guix/README.md +++ /dev/null @@ -1,435 +0,0 @@ -# Bootstrappable BGL Core Builds - -This directory contains the files necessary to perform bootstrappable BGL -Core builds. - -[Bootstrappability][b17e] furthers our binary security guarantees by allowing us -to _audit and reproduce_ our toolchain instead of blindly _trusting_ binary -downloads. - -We achieve bootstrappability by using Guix as a functional package manager. - -# Requirements - -Conservatively, you will need: - -- 16GB of free disk space on the partition that /gnu/store will reside in -- 8GB of free disk space **per platform triple** you're planning on building - (see the `HOSTS` [environment variable description][env-vars-list]) - -# Installation and Setup - -If you don't have Guix installed and set up, please follow the instructions in -[INSTALL.md](./INSTALL.md) - -# Usage - -If you haven't considered your security model yet, please read [the relevant -section](#choosing-your-security-model) before proceeding to perform a build. - -## Making the Xcode SDK available for macOS cross-compilation - -In order to perform a build for macOS (which is included in the default set of -platform triples to build), you'll need to extract the macOS SDK tarball using -tools found in the [`macdeploy` directory](../macdeploy/README.md). - -You can then either point to the SDK using the `SDK_PATH` environment variable: - -```sh -# Extract the SDK tarball to /path/to/parent/dir/of/extracted/SDK/Xcode---extracted-SDK-with-libcxx-headers -tar -C /path/to/parent/dir/of/extracted/SDK -xaf /path/to/Xcode---extracted-SDK-with-libcxx-headers.tar.gz - -# Indicate where to locate the SDK tarball -export SDK_PATH=/path/to/parent/dir/of/extracted/SDK -``` - -or extract it into `depends/SDKs`: - -```sh -mkdir -p depends/SDKs -tar -C depends/SDKs -xaf /path/to/SDK/tarball -``` - -## Building - -*The author highly recommends at least reading over the [common usage patterns -and examples](#common-guix-build-invocation-patterns-and-examples) section below -before starting a build. For a full list of customization options, see the -[recognized environment variables][env-vars-list] section.* - -To build Bitcoin Core reproducibly with all default options, invoke the -following from the top of a clean repository: - -```sh -./contrib/guix/guix-build -``` - -## Codesigning build outputs - -The `guix-codesign` command attaches codesignatures (produced by codesigners) to -existing non-codesigned outputs. Please see the [release process -documentation](/doc/release-process.md) for more context. - -It respects many of the same environment variable flags as `guix-build`, with 2 -crucial differences: - -1. Since only Windows and macOS build outputs require codesigning, the `HOSTS` - environment variable will have a sane default value of `x86_64-w64-mingw32 - x86_64-apple-darwin arm64-apple-darwin` instead of all the platforms. -2. The `guix-codesign` command ***requires*** a `DETACHED_SIGS_REPO` flag. - * _**DETACHED_SIGS_REPO**_ - - Set the directory where detached codesignatures can be found for the current - Bitcoin Core version being built. - - _REQUIRED environment variable_ - -An invocation with all default options would look like: - -``` -env DETACHED_SIGS_REPO= ./contrib/guix-codesign -``` - -## Cleaning intermediate work directories - -By default, `guix-build` leaves all intermediate files or "work directories" -(e.g. `depends/work`, `guix-build-*/distsrc-*`) intact at the end of a build so -that they are available to the user (to aid in debugging, etc.). However, these -directories usually take up a large amount of disk space. Therefore, a -`guix-clean` convenience script is provided which cleans the current `git` -worktree to save disk space: - -``` -./contrib/guix/guix-clean -``` - - -## Attesting to build outputs - -Much like how Gitian build outputs are attested to in a `gitian.sigs` -repository, Guix build outputs are attested to in the [`guix.sigs` -repository](https://github.com/bitcoin-core/guix.sigs). - -After you've cloned the `guix.sigs` repository, to attest to the current -worktree's commit/tag: - -``` -env GUIX_SIGS_REPO= SIGNER= ./contrib/guix/guix-attest -``` - -See `./contrib/guix/guix-attest --help` for more information on the various ways -`guix-attest` can be invoked. - -## Verifying build output attestations - -After at least one other signer has uploaded their signatures to the `guix.sigs` -repository: - -``` -git -C pull -env GUIX_SIGS_REPO= ./contrib/guix/guix-verify -``` - - -## Common `guix-build` invocation patterns and examples - -### Keeping caches and SDKs outside of the worktree - -If you perform a lot of builds and have a bunch of worktrees, you may find it -more efficient to keep the depends tree's download cache, build cache, and SDKs -outside of the worktrees to avoid duplicate downloads and unnecessary builds. To -help with this situation, the `guix-build` script honours the `SOURCES_PATH`, -`BASE_CACHE`, and `SDK_PATH` environment variables and will pass them on to the -depends tree so that you can do something like: - -```sh -env SOURCES_PATH="$HOME/depends-SOURCES_PATH" BASE_CACHE="$HOME/depends-BASE_CACHE" SDK_PATH="$HOME/macOS-SDKs" ./contrib/guix/guix-build -``` - -Note that the paths that these environment variables point to **must be -directories**, and **NOT symlinks to directories**. - -See the [recognized environment variables][env-vars-list] section for more -details. - -### Building a subset of platform triples - -Sometimes you only want to build a subset of the supported platform triples, in -which case you can override the default list by setting the space-separated -`HOSTS` environment variable: - -```sh -env HOSTS='x86_64-w64-mingw32 x86_64-apple-darwin' ./contrib/guix/guix-build -``` - -See the [recognized environment variables][env-vars-list] section for more -details. - -### Controlling the number of threads used by `guix` build commands - -Depending on your system's RAM capacity, you may want to decrease the number of -threads used to decrease RAM usage or vice versa. - -By default, the scripts under `./contrib/guix` will invoke all `guix` build -commands with `--cores="$JOBS"`. Note that `$JOBS` defaults to `$(nproc)` if not -specified. However, astute manual readers will also notice that `guix` build -commands also accept a `--max-jobs=` flag (which defaults to 1 if unspecified). - -Here is the difference between `--cores=` and `--max-jobs=`: - -> Note: When I say "derivation," think "package" - -`--cores=` - - - controls the number of CPU cores to build each derivation. This is the value - passed to `make`'s `--jobs=` flag. - -`--max-jobs=` - - - controls how many derivations can be built in parallel - - defaults to 1 - -Therefore, the default is for `guix` build commands to build one derivation at a -time, utilizing `$JOBS` threads. - -Specifying the `$JOBS` environment variable will only modify `--cores=`, but you -can also modify the value for `--max-jobs=` by specifying -`$ADDITIONAL_GUIX_COMMON_FLAGS`. For example, if you have a LOT of memory, you -may want to set: - -```sh -export ADDITIONAL_GUIX_COMMON_FLAGS='--max-jobs=8' -``` - -Which allows for a maximum of 8 derivations to be built at the same time, each -utilizing `$JOBS` threads. - -Or, if you'd like to avoid spurious build failures caused by issues with -parallelism within a single package, but would still like to build multiple -packages when the dependency graph allows for it, you may want to try: - -```sh -export JOBS=1 ADDITIONAL_GUIX_COMMON_FLAGS='--max-jobs=8' -``` - -See the [recognized environment variables][env-vars-list] section for more -details. - -## Recognized environment variables - -* _**HOSTS**_ - - Override the space-separated list of platform triples for which to perform a - bootstrappable build. - - _(defaults to "x86\_64-linux-gnu arm-linux-gnueabihf aarch64-linux-gnu - riscv64-linux-gnu powerpc64-linux-gnu powerpc64le-linux-gnu - x86\_64-w64-mingw32 x86\_64-apple-darwin arm64-apple-darwin")_ - -* _**SOURCES_PATH**_ - - Set the depends tree download cache for sources. This is passed through to the - depends tree. Setting this to the same directory across multiple builds of the - depends tree can eliminate unnecessary redownloading of package sources. - - The path that this environment variable points to **must be a directory**, and - **NOT a symlink to a directory**. - -* _**BASE_CACHE**_ - - Set the depends tree cache for built packages. This is passed through to the - depends tree. Setting this to the same directory across multiple builds of the - depends tree can eliminate unnecessary building of packages. - - The path that this environment variable points to **must be a directory**, and - **NOT a symlink to a directory**. - -* _**SDK_PATH**_ - - Set the path where _extracted_ SDKs can be found. This is passed through to - the depends tree. Note that this is should be set to the _parent_ directory of - the actual SDK (e.g. `SDK_PATH=$HOME/Downloads/macOS-SDKs` instead of - `$HOME/Downloads/macOS-SDKs/Xcode-12.2-12B45b-extracted-SDK-with-libcxx-headers`). - - The path that this environment variable points to **must be a directory**, and - **NOT a symlink to a directory**. - -* _**JOBS**_ - - Override the number of jobs to run simultaneously, you might want to do so on - a memory-limited machine. This may be passed to: - - - `guix` build commands as in `guix shell --cores="$JOBS"` - - `make` as in `make --jobs="$JOBS"` - - `xargs` as in `xargs -P"$JOBS"` - - See [here](#controlling-the-number-of-threads-used-by-guix-build-commands) for - more details. - - _(defaults to the value of `nproc` outside the container)_ - -* _**SOURCE_DATE_EPOCH**_ - - Override the reference UNIX timestamp used for bit-for-bit reproducibility, - the variable name conforms to [standard][r12e/source-date-epoch]. - - _(defaults to the output of `$(git log --format=%at -1)`)_ - -* _**V**_ - - If non-empty, will pass `V=1` to all `make` invocations, making `make` output - verbose. - - Note that any given value is ignored. The variable is only checked for - emptiness. More concretely, this means that `V=` (setting `V` to the empty - string) is interpreted the same way as not setting `V` at all, and that `V=0` - has the same effect as `V=1`. - -* _**SUBSTITUTE_URLS**_ - - A whitespace-delimited list of URLs from which to download pre-built packages. - A URL is only used if its signing key is authorized (refer to the [substitute - servers section](#option-1-building-with-substitutes) for more details). - -* _**ADDITIONAL_GUIX_COMMON_FLAGS**_ - - Additional flags to be passed to all `guix` commands. - -* _**ADDITIONAL_GUIX_TIMEMACHINE_FLAGS**_ - - Additional flags to be passed to `guix time-machine`. - -* _**ADDITIONAL_GUIX_ENVIRONMENT_FLAGS**_ - - Additional flags to be passed to the invocation of `guix shell` inside - `guix time-machine`. - -# Choosing your security model - -No matter how you installed Guix, you need to decide on your security model for -building packages with Guix. - -Guix allows us to achieve better binary security by using our CPU time to build -everything from scratch. However, it doesn't sacrifice user choice in pursuit of -this: users can decide whether or not to use **substitutes** (pre-built -packages). - -## Option 1: Building with substitutes - -### Step 1: Authorize the signing keys - -Depending on the installation procedure you followed, you may have already -authorized the Guix build farm key. In particular, the official shell installer -script asks you if you want the key installed, and the debian distribution -package authorized the key during installation. - -You can check the current list of authorized keys at `/etc/guix/acl`. - -At the time of writing, a `/etc/guix/acl` with just the Guix build farm key -authorized looks something like: - -```lisp -(acl - (entry - (public-key - (ecc - (curve Ed25519) - (q #8D156F295D24B0D9A86FA5741A840FF2D24F60F7B6C4134814AD55625971B394#) - ) - ) - (tag - (guix import) - ) - ) - ) -``` - -If you've determined that the official Guix build farm key hasn't been -authorized, and you would like to authorize it, run the following as root: - -``` -guix archive --authorize < /var/guix/profiles/per-user/root/current-guix/share/guix/ci.guix.gnu.org.pub -``` - -If -`/var/guix/profiles/per-user/root/current-guix/share/guix/ci.guix.gnu.org.pub` -doesn't exist, try: - -```sh -guix archive --authorize < /share/guix/ci.guix.gnu.org.pub -``` - -Where `` is likely: -- `/usr` if you installed from a distribution package -- `/usr/local` if you installed Guix from source and didn't supply any - prefix-modifying flags to Guix's `./configure` - -For dongcarl's substitute server at https://guix.carldong.io, run as root: - -```sh -wget -qO- 'https://guix.carldong.io/signing-key.pub' | guix archive --authorize -``` - -#### Removing authorized keys - -To remove previously authorized keys, simply edit `/etc/guix/acl` and remove the -`(entry (public-key ...))` entry. - -### Step 2: Specify the substitute servers - -Once its key is authorized, the official Guix build farm at -https://ci.guix.gnu.org is automatically used unless the `--no-substitutes` flag -is supplied. This default list of substitute servers is overridable both on a -`guix-daemon` level and when you invoke `guix` commands. See examples below for -the various ways of adding dongcarl's substitute server after having [authorized -his signing key](#step-1-authorize-the-signing-keys). - -Change the **default list** of substitute servers by starting `guix-daemon` with -the `--substitute-urls` option (you will likely need to edit your init script): - -```sh -guix-daemon --substitute-urls='https://guix.carldong.io https://ci.guix.gnu.org' -``` - -Override the default list of substitute servers by passing the -`--substitute-urls` option for invocations of `guix` commands: - -```sh -guix --substitute-urls='https://guix.carldong.io https://ci.guix.gnu.org' -``` - -For scripts under `./contrib/guix`, set the `SUBSTITUTE_URLS` environment -variable: - -```sh -export SUBSTITUTE_URLS='https://guix.carldong.io https://ci.guix.gnu.org' -``` - -## Option 2: Disabling substitutes on an ad-hoc basis - -If you prefer not to use any substitutes, make sure to supply `--no-substitutes` -like in the following snippet. The first build will take a while, but the -resulting packages will be cached for future builds. - -For direct invocations of `guix`: -```sh -guix --no-substitutes -``` - -For the scripts under `./contrib/guix/`: -```sh -export ADDITIONAL_GUIX_COMMON_FLAGS='--no-substitutes' -``` - -## Option 3: Disabling substitutes by default - -`guix-daemon` accepts a `--no-substitutes` flag, which will make sure that, -unless otherwise overridden by a command line invocation, no substitutes will be -used. - -If you start `guix-daemon` using an init script, you can edit said script to -supply this flag. - -[b17e]: https://bootstrappable.org/ -[r12e/source-date-epoch]: https://reproducible-builds.org/docs/source-date-epoch/ -[env-vars-list]: #recognized-environment-variables diff --git a/contrib/guix/guix-attest b/contrib/guix/guix-attest deleted file mode 100755 index b0ef28dc3f..0000000000 --- a/contrib/guix/guix-attest +++ /dev/null @@ -1,263 +0,0 @@ -#!/usr/bin/env bash -export LC_ALL=C -set -e -o pipefail - -# Source the common prelude, which: -# 1. Checks if we're at the top directory of the Bitcoin Core repository -# 2. Defines a few common functions and variables -# -# shellcheck source=libexec/prelude.bash -source "$(dirname "${BASH_SOURCE[0]}")/libexec/prelude.bash" - - -################### -## Sanity Checks ## -################### - -################ -# Required non-builtin commands should be invokable -################ - -check_tools cat env basename mkdir diff sort - -if [ -z "$NO_SIGN" ]; then - # make it possible to override the gpg binary - GPG=${GPG:-gpg} - - # $GPG can contain extra arguments passed to the binary - # so let's check only the existence of arg[0] - # shellcheck disable=SC2206 - GPG_ARRAY=($GPG) - check_tools "${GPG_ARRAY[0]}" -fi - -################ -# Required env vars should be non-empty -################ - -cmd_usage() { -cat < \\ - SIGNER=GPG_KEY_NAME[=SIGNER_NAME] \\ - [ NO_SIGN=1 ] - ./contrib/guix/guix-attest - -Example w/o overriding signing name: - - env GUIX_SIGS_REPO=/home/achow101/guix.sigs \\ - SIGNER=achow101 \\ - ./contrib/guix/guix-attest - -Example overriding signing name: - - env GUIX_SIGS_REPO=/home/dongcarl/guix.sigs \\ - SIGNER=0x96AB007F1A7ED999=dongcarl \\ - ./contrib/guix/guix-attest - -Example w/o signing, just creating SHA256SUMS: - - env GUIX_SIGS_REPO=/home/achow101/guix.sigs \\ - SIGNER=achow101 \\ - NO_SIGN=1 \\ - ./contrib/guix/guix-attest - -EOF -} - -if [ -z "$GUIX_SIGS_REPO" ] || [ -z "$SIGNER" ]; then - cmd_usage - exit 1 -fi - -################ -# GUIX_SIGS_REPO should exist as a directory -################ - -if [ ! -d "$GUIX_SIGS_REPO" ]; then -cat << EOF -ERR: The specified GUIX_SIGS_REPO is not an existent directory: - - '$GUIX_SIGS_REPO' - -Hint: Please clone the guix.sigs repository and point to it with the - GUIX_SIGS_REPO environment variable. - -EOF -cmd_usage -exit 1 -fi - -################ -# The key specified in SIGNER should be usable -################ - -IFS='=' read -r gpg_key_name signer_name <<< "$SIGNER" -if [ -z "${signer_name}" ]; then - signer_name="$gpg_key_name" -fi - -if [ -z "$NO_SIGN" ] && ! ${GPG} --dry-run --list-secret-keys "${gpg_key_name}" >/dev/null 2>&1; then - echo "ERR: GPG can't seem to find any key named '${gpg_key_name}'" - exit 1 -fi - -################ -# We should be able to find at least one output -################ - -echo "Looking for build output SHA256SUMS fragments in ${OUTDIR_BASE}" - -shopt -s nullglob -sha256sum_fragments=( "$OUTDIR_BASE"/*/SHA256SUMS.part ) # This expands to an array of directories... -shopt -u nullglob - -noncodesigned_fragments=() -codesigned_fragments=() - -if (( ${#sha256sum_fragments[@]} )); then - echo "Found build output SHA256SUMS fragments:" - for outdir in "${sha256sum_fragments[@]}"; do - echo " '$outdir'" - case "$outdir" in - "$OUTDIR_BASE"/*-codesigned/SHA256SUMS.part) - codesigned_fragments+=("$outdir") - ;; - *) - noncodesigned_fragments+=("$outdir") - ;; - esac - done - echo -else - echo "ERR: Could not find any build output SHA256SUMS fragments in ${OUTDIR_BASE}" - exit 1 -fi - -############## -## Attest ## -############## - -# Usage: out_name $outdir -# -# HOST: The output directory being attested -# -out_name() { - basename "$(dirname "$1")" -} - -shasum_already_exists() { -cat < "$temp_noncodesigned" - if [ -e noncodesigned.SHA256SUMS ]; then - # The SHA256SUMS already exists, make sure it's exactly what we - # expect, error out if not - if diff -u noncodesigned.SHA256SUMS "$temp_noncodesigned"; then - echo "A noncodesigned.SHA256SUMS file already exists for '${VERSION}' and is up-to-date." - else - shasum_already_exists noncodesigned.SHA256SUMS - exit 1 - fi - else - mv "$temp_noncodesigned" noncodesigned.SHA256SUMS - fi - else - echo "ERR: No noncodesigned outputs found for '${VERSION}', exiting..." - exit 1 - fi - - temp_all="$(mktemp)" - trap 'rm -rf -- "$temp_all"' EXIT - - if (( ${#codesigned_fragments[@]} )); then - # Note: all.SHA256SUMS attests to all of $sha256sum_fragments, but is - # not needed if there are no $codesigned_fragments - cat "${sha256sum_fragments[@]}" \ - | sort -u \ - | sort -k2 \ - | basenameify_SHA256SUMS \ - > "$temp_all" - if [ -e all.SHA256SUMS ]; then - # The SHA256SUMS already exists, make sure it's exactly what we - # expect, error out if not - if diff -u all.SHA256SUMS "$temp_all"; then - echo "An all.SHA256SUMS file already exists for '${VERSION}' and is up-to-date." - else - shasum_already_exists all.SHA256SUMS - exit 1 - fi - else - mv "$temp_all" all.SHA256SUMS - fi - else - # It is fine to have the codesigned outputs be missing (perhaps the - # detached codesigs have not been published yet), just print a log - # message instead of erroring out - echo "INFO: No codesigned outputs found for '${VERSION}', skipping..." - fi - - if [ -z "$NO_SIGN" ]; then - echo "Signing SHA256SUMS to produce SHA256SUMS.asc" - for i in *.SHA256SUMS; do - if [ ! -e "$i".asc ]; then - ${GPG} --detach-sign \ - --digest-algo sha256 \ - --local-user "$gpg_key_name" \ - --armor \ - --output "$i".asc "$i" - else - echo "Signature already there" - fi - done - else - echo "Not signing SHA256SUMS as \$NO_SIGN is not empty" - fi - echo "" -) diff --git a/contrib/guix/guix-build b/contrib/guix/guix-build deleted file mode 100755 index 2a79e42ce4..0000000000 --- a/contrib/guix/guix-build +++ /dev/null @@ -1,467 +0,0 @@ -#!/usr/bin/env bash -export LC_ALL=C -set -e -o pipefail - -# Source the common prelude, which: -# 1. Checks if we're at the top directory of the Bitcoin Core repository -# 2. Defines a few common functions and variables -# -# shellcheck source=libexec/prelude.bash -source "$(dirname "${BASH_SOURCE[0]}")/libexec/prelude.bash" - - -################### -## SANITY CHECKS ## -################### - -################ -# Required non-builtin commands should be invocable -################ - -check_tools cat mkdir make getent curl git guix - -################ -# GUIX_BUILD_OPTIONS should be empty -################ -# -# GUIX_BUILD_OPTIONS is an environment variable recognized by guix commands that -# can perform builds. This seems like what we want instead of -# ADDITIONAL_GUIX_COMMON_FLAGS, but the value of GUIX_BUILD_OPTIONS is actually -# _appended_ to normal command-line options. Meaning that they will take -# precedence over the command-specific ADDITIONAL_GUIX__FLAGS. -# -# This seems like a poor user experience. Thus we check for GUIX_BUILD_OPTIONS's -# existence here and direct users of this script to use our (more flexible) -# custom environment variables. -if [ -n "$GUIX_BUILD_OPTIONS" ]; then -cat << EOF -Error: Environment variable GUIX_BUILD_OPTIONS is not empty: - '$GUIX_BUILD_OPTIONS' - -Unfortunately this script is incompatible with GUIX_BUILD_OPTIONS, please unset -GUIX_BUILD_OPTIONS and use ADDITIONAL_GUIX_COMMON_FLAGS to set build options -across guix commands or ADDITIONAL_GUIX__FLAGS to set build options for a -specific guix command. - -See contrib/guix/README.md for more details. -EOF -exit 1 -fi - -################ -# The git worktree should not be dirty -################ - -if ! git diff-index --quiet HEAD -- && [ -z "$FORCE_DIRTY_WORKTREE" ]; then -cat << EOF -ERR: The current git worktree is dirty, which may lead to broken builds. - - Aborting... - -Hint: To make your git worktree clean, You may want to: - 1. Commit your changes, - 2. Stash your changes, or - 3. Set the 'FORCE_DIRTY_WORKTREE' environment variable if you insist on - using a dirty worktree -EOF -exit 1 -fi - -mkdir -p "$VERSION_BASE" - -################ -# Build directories should not exist -################ - -# Default to building for all supported HOSTs (overridable by environment) -# powerpc64le-linux-gnu currently disabled due non-determinism issues across build arches. -export HOSTS="${HOSTS:-x86_64-linux-gnu arm-linux-gnueabihf aarch64-linux-gnu riscv64-linux-gnu powerpc64-linux-gnu - x86_64-w64-mingw32 - x86_64-apple-darwin arm64-apple-darwin}" - -# Usage: distsrc_for_host HOST -# -# HOST: The current platform triple we're building for -# -distsrc_for_host() { - echo "${DISTSRC_BASE}/distsrc-${VERSION}-${1}" -} - -# Accumulate a list of build directories that already exist... -hosts_distsrc_exists="" -for host in $HOSTS; do - if [ -e "$(distsrc_for_host "$host")" ]; then - hosts_distsrc_exists+=" ${host}" - fi -done - -if [ -n "$hosts_distsrc_exists" ]; then -# ...so that we can print them out nicely in an error message -cat << EOF -ERR: Build directories for this commit already exist for the following platform - triples you're attempting to build, probably because of previous builds. - Please remove, or otherwise deal with them prior to starting another build. - - Aborting... - -Hint: To blow everything away, you may want to use: - - $ ./contrib/guix/guix-clean - -Specifically, this will remove all files without an entry in the index, -excluding the SDK directory, the depends download cache, the depends built -packages cache, the garbage collector roots for Guix environments, and the -output directory. -EOF -for host in $hosts_distsrc_exists; do - echo " ${host} '$(distsrc_for_host "$host")'" -done -exit 1 -else - mkdir -p "$DISTSRC_BASE" -fi - -################ -# When building for darwin, the macOS SDK should exist -################ - -for host in $HOSTS; do - case "$host" in - *darwin*) - OSX_SDK="$(make -C "${PWD}/depends" --no-print-directory HOST="$host" print-OSX_SDK | sed 's@^[^=]\+=@@g')" - if [ -e "$OSX_SDK" ]; then - echo "Found macOS SDK at '${OSX_SDK}', using..." - break - else - echo "macOS SDK does not exist at '${OSX_SDK}', please place the extracted, untarred SDK there to perform darwin builds, or define SDK_PATH environment variable. Exiting..." - exit 1 - fi - ;; - esac -done - -################ -# VERSION_BASE should have enough space -################ - -avail_KiB="$(df -Pk "$VERSION_BASE" | sed 1d | tr -s ' ' | cut -d' ' -f4)" -total_required_KiB=0 -for host in $HOSTS; do - case "$host" in - *darwin*) required_KiB=440000 ;; - *mingw*) required_KiB=7600000 ;; - *) required_KiB=6400000 ;; - esac - total_required_KiB=$((total_required_KiB+required_KiB)) -done - -if (( total_required_KiB > avail_KiB )); then - total_required_GiB=$((total_required_KiB / 1048576)) - avail_GiB=$((avail_KiB / 1048576)) - echo "Performing a Bitcoin Core Guix build for the selected HOSTS requires ${total_required_GiB} GiB, however, only ${avail_GiB} GiB is available. Please free up some disk space before performing the build." - exit 1 -fi - -################ -# Check that we can connect to the guix-daemon -################ - -cat << EOF -Checking that we can connect to the guix-daemon... - -Hint: If this hangs, you may want to try turning your guix-daemon off and on - again. - -EOF -if ! guix gc --list-failures > /dev/null; then -cat << EOF - -ERR: Failed to connect to the guix-daemon, please ensure that one is running and - reachable. -EOF -exit 1 -fi - -# Developer note: we could use `guix repl` for this check and run: -# -# (import (guix store)) (close-connection (open-connection)) -# -# However, the internal API is likely to change more than the CLI invocation - -################ -# Services database must have basic entries -################ - -if ! getent services http https ftp > /dev/null 2>&1; then -cat << EOF -ERR: Your system's C library cannot find service database entries for at least - one of the following services: http, https, ftp. - -Hint: Most likely, /etc/services does not exist yet (common for docker images - and minimal distros), or you don't have permissions to access it. - - If /etc/services does not exist yet, you may want to install the - appropriate package for your distro which provides it. - - On Debian/Ubuntu: netbase - On Arch Linux: iana-etc - - For more information, see: getent(1), services(5) - -EOF - -fi - -######### -# SETUP # -######### - -# Determine the maximum number of jobs to run simultaneously (overridable by -# environment) -JOBS="${JOBS:-$(nproc)}" - -# Usage: host_to_commonname HOST -# -# HOST: The current platform triple we're building for -# -host_to_commonname() { - case "$1" in - *darwin*) echo osx ;; - *mingw*) echo win ;; - *linux*) echo linux ;; - *) exit 1 ;; - esac -} - -# Determine the reference time used for determinism (overridable by environment) -SOURCE_DATE_EPOCH="${SOURCE_DATE_EPOCH:-$(git -c log.showSignature=false log --format=%at -1)}" - -# Precious directories are those which should not be cleaned between successive -# guix builds -depends_precious_dir_names='SOURCES_PATH BASE_CACHE SDK_PATH' -precious_dir_names="${depends_precious_dir_names} OUTDIR_BASE PROFILES_BASE" - -# Usage: contains IFS-SEPARATED-LIST ITEM -contains() { - for i in ${1}; do - if [ "$i" = "${2}" ]; then - return 0 # Found! - fi - done - return 1 -} - -# If the user explicitly specified a precious directory, create it so we -# can map it into the container -for precious_dir_name in $precious_dir_names; do - precious_dir_path="${!precious_dir_name}" - if [ -n "$precious_dir_path" ]; then - if [ ! -e "$precious_dir_path" ]; then - mkdir -p "$precious_dir_path" - elif [ -L "$precious_dir_path" ]; then - echo "ERR: ${precious_dir_name} cannot be a symbolic link" - exit 1 - elif [ ! -d "$precious_dir_path" ]; then - echo "ERR: ${precious_dir_name} must be a directory" - exit 1 - fi - fi -done - -mkdir -p "$VAR_BASE" - -# Record the _effective_ values of precious directories such that guix-clean can -# avoid clobbering them if appropriate. -# -# shellcheck disable=SC2046,SC2086 -{ - # Get depends precious dir definitions from depends - make -C "${PWD}/depends" \ - --no-print-directory \ - -- $(printf "print-%s\n" $depends_precious_dir_names) - - # Get remaining precious dir definitions from the environment - for precious_dir_name in $precious_dir_names; do - precious_dir_path="${!precious_dir_name}" - if ! contains "$depends_precious_dir_names" "$precious_dir_name"; then - echo "${precious_dir_name}=${precious_dir_path}" - fi - done -} > "${VAR_BASE}/precious_dirs" - -# Make sure an output directory exists for our builds -OUTDIR_BASE="${OUTDIR_BASE:-${VERSION_BASE}/output}" -mkdir -p "$OUTDIR_BASE" - -# Download the depends sources now as we won't have internet access in the build -# container -for host in $HOSTS; do - make -C "${PWD}/depends" -j"$JOBS" download-"$(host_to_commonname "$host")" ${V:+V=1} ${SOURCES_PATH:+SOURCES_PATH="$SOURCES_PATH"} -done - -# Usage: outdir_for_host HOST SUFFIX -# -# HOST: The current platform triple we're building for -# -outdir_for_host() { - echo "${OUTDIR_BASE}/${1}${2:+-${2}}" -} - -# Usage: profiledir_for_host HOST SUFFIX -# -# HOST: The current platform triple we're building for -# -profiledir_for_host() { - echo "${PROFILES_BASE}/${1}${2:+-${2}}" -} - - -######### -# BUILD # -######### - -# Function to be called when building for host ${1} and the user interrupts the -# build -int_trap() { -cat << EOF -** INT received while building ${1}, you may want to clean up the relevant - work directories (e.g. distsrc-*) before rebuilding - -Hint: To blow everything away, you may want to use: - - $ ./contrib/guix/guix-clean - -Specifically, this will remove all files without an entry in the index, -excluding the SDK directory, the depends download cache, the depends built -packages cache, the garbage collector roots for Guix environments, and the -output directory. -EOF -} - -# Deterministically build Bitcoin Core -# shellcheck disable=SC2153 -for host in $HOSTS; do - - # Display proper warning when the user interrupts the build - trap 'int_trap ${host}' INT - - ( - # Required for 'contrib/guix/manifest.scm' to output the right manifest - # for the particular $HOST we're building for - export HOST="$host" - - # shellcheck disable=SC2030 -cat << EOF -INFO: Building ${VERSION:?not set} for platform triple ${HOST:?not set}: - ...using reference timestamp: ${SOURCE_DATE_EPOCH:?not set} - ...running at most ${JOBS:?not set} jobs - ...from worktree directory: '${PWD}' - ...bind-mounted in container to: '/BGL' - ...in build directory: '$(distsrc_for_host "$HOST")' - ...bind-mounted in container to: '$(DISTSRC_BASE=/distsrc-base && distsrc_for_host "$HOST")' - ...outputting in: '$(outdir_for_host "$HOST")' - ...bind-mounted in container to: '$(OUTDIR_BASE=/outdir-base && outdir_for_host "$HOST")' - ADDITIONAL FLAGS (if set) - ADDITIONAL_GUIX_COMMON_FLAGS: ${ADDITIONAL_GUIX_COMMON_FLAGS} - ADDITIONAL_GUIX_ENVIRONMENT_FLAGS: ${ADDITIONAL_GUIX_ENVIRONMENT_FLAGS} - ADDITIONAL_GUIX_TIMEMACHINE_FLAGS: ${ADDITIONAL_GUIX_TIMEMACHINE_FLAGS} -EOF - - # Run the build script 'contrib/guix/libexec/build.sh' in the build - # container specified by 'contrib/guix/manifest.scm'. - # - # Explanation of `guix shell` flags: - # - # --container run command within an isolated container - # - # Running in an isolated container minimizes build-time differences - # between machines and improves reproducibility - # - # --pure unset existing environment variables - # - # Same rationale as --container - # - # --no-cwd do not share current working directory with an - # isolated container - # - # When --container is specified, the default behavior is to share - # the current working directory with the isolated container at the - # same exact path (e.g. mapping '/home/satoshi/BGL/' to - # '/home/satoshi/BGL/'). This means that the $PWD inside the - # container becomes a source of irreproducibility. --no-cwd disables - # this behaviour. - # - # --share=SPEC for containers, share writable host file system - # according to SPEC - # - # --share="$PWD"=/BGL - # - # maps our current working directory to /BGL - # inside the isolated container, which we later cd - # into. - # - # While we don't want to map our current working directory to the - # same exact path (as this introduces irreproducibility), we do want - # it to be at a _fixed_ path _somewhere_ inside the isolated - # container so that we have something to build. '/BGL' was - # chosen arbitrarily. - # - # ${SOURCES_PATH:+--share="$SOURCES_PATH"} - # - # make the downloaded depends sources path available - # inside the isolated container - # - # The isolated container has no network access as it's in a - # different network namespace from the main machine, so we have to - # make the downloaded depends sources available to it. The sources - # should have been downloaded prior to this invocation. - # - # --keep-failed keep build tree of failed builds - # - # When builds of the Guix environment itself (not Bitcoin Core) - # fail, it is useful for the build tree to be kept for debugging - # purposes. - # - # ${SUBSTITUTE_URLS:+--substitute-urls="$SUBSTITUTE_URLS"} - # - # fetch substitute from SUBSTITUTE_URLS if they are - # authorized - # - # Depending on the user's security model, it may be desirable to use - # substitutes (pre-built packages) from servers that the user trusts. - # Please read the README.md in the same directory as this file for - # more information. - # - # shellcheck disable=SC2086,SC2031 - time-machine shell --manifest="${PWD}/contrib/guix/manifest.scm" \ - --container \ - --pure \ - --no-cwd \ - --share="$PWD"=/BGL \ - --share="$DISTSRC_BASE"=/distsrc-base \ - --share="$OUTDIR_BASE"=/outdir-base \ - --expose="$(git rev-parse --git-common-dir)" \ - ${SOURCES_PATH:+--share="$SOURCES_PATH"} \ - ${BASE_CACHE:+--share="$BASE_CACHE"} \ - ${SDK_PATH:+--share="$SDK_PATH"} \ - --cores="$JOBS" \ - --keep-failed \ - --link-profile \ - --root="$(profiledir_for_host "${HOST}")" \ - ${SUBSTITUTE_URLS:+--substitute-urls="$SUBSTITUTE_URLS"} \ - ${ADDITIONAL_GUIX_COMMON_FLAGS} ${ADDITIONAL_GUIX_ENVIRONMENT_FLAGS} \ - -- env HOST="$host" \ - DISTNAME="$DISTNAME" \ - JOBS="$JOBS" \ - SOURCE_DATE_EPOCH="${SOURCE_DATE_EPOCH:?unable to determine value}" \ - ${V:+V=1} \ - ${SOURCES_PATH:+SOURCES_PATH="$SOURCES_PATH"} \ - ${BASE_CACHE:+BASE_CACHE="$BASE_CACHE"} \ - ${SDK_PATH:+SDK_PATH="$SDK_PATH"} \ - DISTSRC="$(DISTSRC_BASE=/distsrc-base && distsrc_for_host "$HOST")" \ - OUTDIR="$(OUTDIR_BASE=/outdir-base && outdir_for_host "$HOST")" \ - DIST_ARCHIVE_BASE=/outdir-base/dist-archive \ - bash -c "cd /BGL && bash contrib/guix/libexec/build.sh" - ) - -done diff --git a/contrib/guix/guix-clean b/contrib/guix/guix-clean deleted file mode 100755 index 9af0a793cf..0000000000 --- a/contrib/guix/guix-clean +++ /dev/null @@ -1,83 +0,0 @@ -#!/usr/bin/env bash -export LC_ALL=C -set -e -o pipefail - -# Source the common prelude, which: -# 1. Checks if we're at the top directory of the Bitcoin Core repository -# 2. Defines a few common functions and variables -# -# shellcheck source=libexec/prelude.bash -source "$(dirname "${BASH_SOURCE[0]}")/libexec/prelude.bash" - - -################### -## Sanity Checks ## -################### - -################ -# Required non-builtin commands should be invokable -################ - -check_tools cat mkdir make git guix - - -############# -## Clean ## -############# - -# Usage: under_dir MAYBE_PARENT MAYBE_CHILD -# -# If MAYBE_CHILD is a subdirectory of MAYBE_PARENT, print the relative path -# from MAYBE_PARENT to MAYBE_CHILD. Otherwise, return 1 as the error code. -# -# NOTE: This does not perform any symlink-resolving or path canonicalization. -# -under_dir() { - local path_residue - path_residue="${2##"${1}"}" - if [ -z "$path_residue" ] || [ "$path_residue" = "$2" ]; then - return 1 - else - echo "$path_residue" - fi -} - -# Usage: dir_under_git_root MAYBE_CHILD -# -# If MAYBE_CHILD is under the current git repository and exists, print the -# relative path from the git repository's top-level directory to MAYBE_CHILD, -# otherwise, exit with an error code. -# -dir_under_git_root() { - local rv - rv="$(under_dir "$(git_root)" "$1")" - [ -n "$rv" ] && echo "$rv" -} - -shopt -s nullglob -found_precious_dirs_files=( "${version_base_prefix}"*/"${var_base_basename}/precious_dirs" ) # This expands to an array of directories... -shopt -u nullglob - -exclude_flags=() - -for precious_dirs_file in "${found_precious_dirs_files[@]}"; do - # Make sure the precious directories (e.g. SOURCES_PATH, BASE_CACHE, SDK_PATH) - # are excluded from git-clean - echo "Found precious_dirs file: '${precious_dirs_file}'" - - # Exclude the precious_dirs file itself - if dirs_file_exclude_fragment=$(dir_under_git_root "$(dirname "$precious_dirs_file")"); then - exclude_flags+=( --exclude="${dirs_file_exclude_fragment}/precious_dirs" ) - fi - - # Read each 'name=dir' pair from the precious_dirs file - while IFS='=' read -r name dir; do - # Add an exclusion flag if the precious directory is under the git root. - if under=$(dir_under_git_root "$dir"); then - echo "Avoiding ${name}: ${under}" - exclude_flags+=( --exclude="$under" ) - fi - done < "$precious_dirs_file" -done - -git clean -xdff "${exclude_flags[@]}" diff --git a/contrib/guix/guix-codesign b/contrib/guix/guix-codesign deleted file mode 100755 index ce8b125286..0000000000 --- a/contrib/guix/guix-codesign +++ /dev/null @@ -1,378 +0,0 @@ -#!/usr/bin/env bash -export LC_ALL=C -set -e -o pipefail - -# Source the common prelude, which: -# 1. Checks if we're at the top directory of the Bitcoin Core repository -# 2. Defines a few common functions and variables -# -# shellcheck source=libexec/prelude.bash -source "$(dirname "${BASH_SOURCE[0]}")/libexec/prelude.bash" - - -################### -## SANITY CHECKS ## -################### - -################ -# Required non-builtin commands should be invocable -################ - -check_tools cat mkdir git guix - -################ -# Required env vars should be non-empty -################ - -cmd_usage() { - cat < \\ - ./contrib/guix/guix-codesign - -EOF -} - -if [ -z "$DETACHED_SIGS_REPO" ]; then - cmd_usage - exit 1 -fi - -################ -# GUIX_BUILD_OPTIONS should be empty -################ -# -# GUIX_BUILD_OPTIONS is an environment variable recognized by guix commands that -# can perform builds. This seems like what we want instead of -# ADDITIONAL_GUIX_COMMON_FLAGS, but the value of GUIX_BUILD_OPTIONS is actually -# _appended_ to normal command-line options. Meaning that they will take -# precedence over the command-specific ADDITIONAL_GUIX__FLAGS. -# -# This seems like a poor user experience. Thus we check for GUIX_BUILD_OPTIONS's -# existence here and direct users of this script to use our (more flexible) -# custom environment variables. -if [ -n "$GUIX_BUILD_OPTIONS" ]; then -cat << EOF -Error: Environment variable GUIX_BUILD_OPTIONS is not empty: - '$GUIX_BUILD_OPTIONS' - -Unfortunately this script is incompatible with GUIX_BUILD_OPTIONS, please unset -GUIX_BUILD_OPTIONS and use ADDITIONAL_GUIX_COMMON_FLAGS to set build options -across guix commands or ADDITIONAL_GUIX__FLAGS to set build options for a -specific guix command. - -See contrib/guix/README.md for more details. -EOF -exit 1 -fi - -################ -# The codesignature git worktree should not be dirty -################ - -if ! git -C "$DETACHED_SIGS_REPO" diff-index --quiet HEAD -- && [ -z "$FORCE_DIRTY_WORKTREE" ]; then - cat << EOF -ERR: The DETACHED CODESIGNATURE git worktree is dirty, which may lead to broken builds. - - Aborting... - -Hint: To make your git worktree clean, You may want to: - 1. Commit your changes, - 2. Stash your changes, or - 3. Set the 'FORCE_DIRTY_WORKTREE' environment variable if you insist on - using a dirty worktree -EOF - exit 1 -fi - -################ -# Build directories should not exist -################ - -# Default to building for all supported HOSTs (overridable by environment) -export HOSTS="${HOSTS:-x86_64-w64-mingw32 x86_64-apple-darwin arm64-apple-darwin}" - -# Usage: distsrc_for_host HOST -# -# HOST: The current platform triple we're building for -# -distsrc_for_host() { - echo "${DISTSRC_BASE}/distsrc-${VERSION}-${1}-codesigned" -} - -# Accumulate a list of build directories that already exist... -hosts_distsrc_exists="" -for host in $HOSTS; do - if [ -e "$(distsrc_for_host "$host")" ]; then - hosts_distsrc_exists+=" ${host}" - fi -done - -if [ -n "$hosts_distsrc_exists" ]; then -# ...so that we can print them out nicely in an error message -cat << EOF -ERR: Build directories for this commit already exist for the following platform - triples you're attempting to build, probably because of previous builds. - Please remove, or otherwise deal with them prior to starting another build. - - Aborting... - -Hint: To blow everything away, you may want to use: - - $ ./contrib/guix/guix-clean - -Specifically, this will remove all files without an entry in the index, -excluding the SDK directory, the depends download cache, the depends built -packages cache, the garbage collector roots for Guix environments, and the -output directory. -EOF -for host in $hosts_distsrc_exists; do - echo " ${host} '$(distsrc_for_host "$host")'" -done -exit 1 -else - mkdir -p "$DISTSRC_BASE" -fi - - -################ -# Unsigned tarballs SHOULD exist -################ - -# Usage: outdir_for_host HOST SUFFIX -# -# HOST: The current platform triple we're building for -# -outdir_for_host() { - echo "${OUTDIR_BASE}/${1}${2:+-${2}}" -} - - -unsigned_tarball_for_host() { - case "$1" in - *mingw*) - echo "$(outdir_for_host "$1")/${DISTNAME}-win64-unsigned.tar.gz" - ;; - *darwin*) - echo "$(outdir_for_host "$1")/${DISTNAME}-${1}-unsigned.tar.gz" - ;; - *) - exit 1 - ;; - esac -} - -# Accumulate a list of build directories that already exist... -hosts_unsigned_tarball_missing="" -for host in $HOSTS; do - if [ ! -e "$(unsigned_tarball_for_host "$host")" ]; then - hosts_unsigned_tarball_missing+=" ${host}" - fi -done - -if [ -n "$hosts_unsigned_tarball_missing" ]; then - # ...so that we can print them out nicely in an error message - cat << EOF -ERR: Unsigned tarballs do not exist -... - -EOF -for host in $hosts_unsigned_tarball_missing; do - echo " ${host} '$(unsigned_tarball_for_host "$host")'" -done -exit 1 -fi - -################ -# Check that we can connect to the guix-daemon -################ - -cat << EOF -Checking that we can connect to the guix-daemon... - -Hint: If this hangs, you may want to try turning your guix-daemon off and on - again. - -EOF -if ! guix gc --list-failures > /dev/null; then - cat << EOF - -ERR: Failed to connect to the guix-daemon, please ensure that one is running and - reachable. -EOF - exit 1 -fi - -# Developer note: we could use `guix repl` for this check and run: -# -# (import (guix store)) (close-connection (open-connection)) -# -# However, the internal API is likely to change more than the CLI invocation - - -######### -# SETUP # -######### - -# Determine the maximum number of jobs to run simultaneously (overridable by -# environment) -JOBS="${JOBS:-$(nproc)}" - -# Determine the reference time used for determinism (overridable by environment) -SOURCE_DATE_EPOCH="${SOURCE_DATE_EPOCH:-$(git -c log.showSignature=false log --format=%at -1)}" - -# Make sure an output directory exists for our builds -OUTDIR_BASE="${OUTDIR_BASE:-${VERSION_BASE}/output}" -mkdir -p "$OUTDIR_BASE" - -# Usage: profiledir_for_host HOST SUFFIX -# -# HOST: The current platform triple we're building for -# -profiledir_for_host() { - echo "${PROFILES_BASE}/${1}${2:+-${2}}" -} - -######### -# BUILD # -######### - -# Function to be called when codesigning for host ${1} and the user interrupts -# the codesign -int_trap() { -cat << EOF -** INT received while codesigning ${1}, you may want to clean up the relevant - work directories (e.g. distsrc-*) before recodesigning - -Hint: To blow everything away, you may want to use: - - $ ./contrib/guix/guix-clean - -Specifically, this will remove all files without an entry in the index, -excluding the SDK directory, the depends download cache, the depends built -packages cache, the garbage collector roots for Guix environments, and the -output directory. -EOF -} - -# Deterministically build Bitcoin Core -# shellcheck disable=SC2153 -for host in $HOSTS; do - - # Display proper warning when the user interrupts the build - trap 'int_trap ${host}' INT - - ( - # Required for 'contrib/guix/manifest.scm' to output the right manifest - # for the particular $HOST we're building for - export HOST="$host" - - # shellcheck disable=SC2030 -cat << EOF -INFO: Codesigning ${VERSION:?not set} for platform triple ${HOST:?not set}: - ...using reference timestamp: ${SOURCE_DATE_EPOCH:?not set} - ...from worktree directory: '${PWD}' - ...bind-mounted in container to: '/bitgesell' - ...in build directory: '$(distsrc_for_host "$HOST")' - ...bind-mounted in container to: '$(DISTSRC_BASE=/distsrc-base && distsrc_for_host "$HOST")' - ...outputting in: '$(outdir_for_host "$HOST" codesigned)' - ...bind-mounted in container to: '$(OUTDIR_BASE=/outdir-base && outdir_for_host "$HOST" codesigned)' - ...using detached signatures in: '${DETACHED_SIGS_REPO:?not set}' - ...bind-mounted in container to: '/detached-sigs' -EOF - - - # Run the build script 'contrib/guix/libexec/build.sh' in the build - # container specified by 'contrib/guix/manifest.scm'. - # - # Explanation of `guix shell` flags: - # - # --container run command within an isolated container - # - # Running in an isolated container minimizes build-time differences - # between machines and improves reproducibility - # - # --pure unset existing environment variables - # - # Same rationale as --container - # - # --no-cwd do not share current working directory with an - # isolated container - # - # When --container is specified, the default behavior is to share - # the current working directory with the isolated container at the - # same exact path (e.g. mapping '/home/satoshi/bitcoin/' to - # '/home/satoshi/bitcoin/'). This means that the $PWD inside the - # container becomes a source of irreproducibility. --no-cwd disables - # this behaviour. - # - # --share=SPEC for containers, share writable host file system - # according to SPEC - # - # --share="$PWD"=/bitcoin - # - # maps our current working directory to /bitcoin - # inside the isolated container, which we later cd - # into. - # - # While we don't want to map our current working directory to the - # same exact path (as this introduces irreproducibility), we do want - # it to be at a _fixed_ path _somewhere_ inside the isolated - # container so that we have something to build. '/bitcoin' was - # chosen arbitrarily. - # - # ${SOURCES_PATH:+--share="$SOURCES_PATH"} - # - # make the downloaded depends sources path available - # inside the isolated container - # - # The isolated container has no network access as it's in a - # different network namespace from the main machine, so we have to - # make the downloaded depends sources available to it. The sources - # should have been downloaded prior to this invocation. - # - # ${SUBSTITUTE_URLS:+--substitute-urls="$SUBSTITUTE_URLS"} - # - # fetch substitute from SUBSTITUTE_URLS if they are - # authorized - # - # Depending on the user's security model, it may be desirable to use - # substitutes (pre-built packages) from servers that the user trusts. - # Please read the README.md in the same directory as this file for - # more information. - # - # shellcheck disable=SC2086,SC2031 - time-machine shell --manifest="${PWD}/contrib/guix/manifest.scm" \ - --container \ - --pure \ - --no-cwd \ - --share="$PWD"=/bitgesell \ - --share="$DISTSRC_BASE"=/distsrc-base \ - --share="$OUTDIR_BASE"=/outdir-base \ - --share="$DETACHED_SIGS_REPO"=/detached-sigs \ - --expose="$(git rev-parse --git-common-dir)" \ - --expose="$(git -C "$DETACHED_SIGS_REPO" rev-parse --git-common-dir)" \ - ${SOURCES_PATH:+--share="$SOURCES_PATH"} \ - --cores="$JOBS" \ - --keep-failed \ - --fallback \ - --link-profile \ - --root="$(profiledir_for_host "${HOST}" codesigned)" \ - ${SUBSTITUTE_URLS:+--substitute-urls="$SUBSTITUTE_URLS"} \ - ${ADDITIONAL_GUIX_COMMON_FLAGS} ${ADDITIONAL_GUIX_ENVIRONMENT_FLAGS} \ - -- env HOST="$host" \ - DISTNAME="$DISTNAME" \ - JOBS="$JOBS" \ - SOURCE_DATE_EPOCH="${SOURCE_DATE_EPOCH:?unable to determine value}" \ - ${V:+V=1} \ - ${SOURCES_PATH:+SOURCES_PATH="$SOURCES_PATH"} \ - DISTSRC="$(DISTSRC_BASE=/distsrc-base && distsrc_for_host "$HOST")" \ - OUTDIR="$(OUTDIR_BASE=/outdir-base && outdir_for_host "$HOST" codesigned)" \ - DIST_ARCHIVE_BASE=/outdir-base/dist-archive \ - DETACHED_SIGS_REPO=/detached-sigs \ - UNSIGNED_TARBALL="$(OUTDIR_BASE=/outdir-base && unsigned_tarball_for_host "$HOST")" \ - bash -c "cd /bitgesell && bash contrib/guix/libexec/codesign.sh" - ) - -done diff --git a/contrib/guix/guix-verify b/contrib/guix/guix-verify deleted file mode 100755 index 02ae022741..0000000000 --- a/contrib/guix/guix-verify +++ /dev/null @@ -1,174 +0,0 @@ -#!/usr/bin/env bash -export LC_ALL=C -set -e -o pipefail - -# Source the common prelude, which: -# 1. Checks if we're at the top directory of the Bitcoin Core repository -# 2. Defines a few common functions and variables -# -# shellcheck source=libexec/prelude.bash -source "$(dirname "${BASH_SOURCE[0]}")/libexec/prelude.bash" - - -################### -## Sanity Checks ## -################### - -################ -# Required non-builtin commands should be invokable -################ - -check_tools cat diff gpg - -################ -# Required env vars should be non-empty -################ - -cmd_usage() { -cat < [ SIGNER= ] ./contrib/guix/guix-verify - -Example overriding signer's manifest to use as base - - env GUIX_SIGS_REPO=/home/dongcarl/guix.sigs SIGNER=achow101 ./contrib/guix/guix-verify - -EOF -} - -if [ -z "$GUIX_SIGS_REPO" ]; then - cmd_usage - exit 1 -fi - -################ -# GUIX_SIGS_REPO should exist as a directory -################ - -if [ ! -d "$GUIX_SIGS_REPO" ]; then -cat << EOF -ERR: The specified GUIX_SIGS_REPO is not an existent directory: - - '$GUIX_SIGS_REPO' - -Hint: Please clone the guix.sigs repository and point to it with the - GUIX_SIGS_REPO environment variable. - -EOF -cmd_usage -exit 1 -fi - -############## -## Verify ## -############## - -OUTSIGDIR_BASE="${GUIX_SIGS_REPO}/${VERSION}" -echo "Looking for signature directories in '${OUTSIGDIR_BASE}'" -echo "" - -# Usage: verify compare_manifest current_manifest -verify() { - local compare_manifest="$1" - local current_manifest="$2" - if ! gpg --quiet --batch --verify "$current_manifest".asc "$current_manifest" 1>&2; then - echo "ERR: Failed to verify GPG signature in '${current_manifest}'" - echo "" - echo "Hint: Either the signature is invalid or the public key is missing" - echo "" - failure=1 - elif ! diff --report-identical "$compare_manifest" "$current_manifest" 1>&2; then - echo "ERR: The SHA256SUMS attestation in these two directories differ:" - echo " '${compare_manifest}'" - echo " '${current_manifest}'" - echo "" - failure=1 - else - echo "Verified: '${current_manifest}'" - echo "" - fi -} - -shopt -s nullglob -all_noncodesigned=( "$OUTSIGDIR_BASE"/*/noncodesigned.SHA256SUMS ) -shopt -u nullglob - -echo "--------------------" -echo "" -if (( ${#all_noncodesigned[@]} )); then - compare_noncodesigned="${all_noncodesigned[0]}" - if [[ -n "$SIGNER" ]]; then - signer_noncodesigned="$OUTSIGDIR_BASE/$SIGNER/noncodesigned.SHA256SUMS" - if [[ -f "$signer_noncodesigned" ]]; then - echo "Using $SIGNER's manifest as the base to compare against" - compare_noncodesigned="$signer_noncodesigned" - else - echo "Unable to find $SIGNER's manifest, using the first one found" - fi - else - echo "No SIGNER provided, using the first manifest found" - fi - - for current_manifest in "${all_noncodesigned[@]}"; do - verify "$compare_noncodesigned" "$current_manifest" - done - - echo "DONE: Checking output signatures for noncodesigned.SHA256SUMS" - echo "" -else - echo "WARN: No signature directories with noncodesigned.SHA256SUMS found" - echo "" -fi - -shopt -s nullglob -all_all=( "$OUTSIGDIR_BASE"/*/all.SHA256SUMS ) -shopt -u nullglob - -echo "--------------------" -echo "" -if (( ${#all_all[@]} )); then - compare_all="${all_all[0]}" - if [[ -n "$SIGNER" ]]; then - signer_all="$OUTSIGDIR_BASE/$SIGNER/all.SHA256SUMS" - if [[ -f "$signer_all" ]]; then - echo "Using $SIGNER's manifest as the base to compare against" - compare_all="$signer_all" - else - echo "Unable to find $SIGNER's manifest, using the first one found" - fi - else - echo "No SIGNER provided, using the first manifest found" - fi - - for current_manifest in "${all_all[@]}"; do - verify "$compare_all" "$current_manifest" - done - - # Sanity check: there should be no entries that exist in - # noncodesigned.SHA256SUMS that doesn't exist in all.SHA256SUMS - if [[ "$(comm -23 <(sort "$compare_noncodesigned") <(sort "$compare_all") | wc -c)" -ne 0 ]]; then - echo "ERR: There are unique lines in noncodesigned.SHA256SUMS which" - echo " do not exist in all.SHA256SUMS, something went very wrong." - exit 1 - fi - - echo "DONE: Checking output signatures for all.SHA256SUMS" - echo "" -else - echo "WARN: No signature directories with all.SHA256SUMS found" - echo "" -fi - -echo "====================" -echo "" -if (( ${#all_noncodesigned[@]} + ${#all_all[@]} == 0 )); then - echo "ERR: Unable to perform any verifications as no signature directories" - echo " were found" - echo "" - exit 1 -fi - -if [ -n "$failure" ]; then - exit 1 -fi diff --git a/contrib/guix/libexec/build.sh b/contrib/guix/libexec/build.sh deleted file mode 100644 index 86cd855364..0000000000 --- a/contrib/guix/libexec/build.sh +++ /dev/null @@ -1,404 +0,0 @@ -#!/usr/bin/env bash -# Copyright (c) 2019-2022 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. -export LC_ALL=C -set -e -o pipefail -export TZ=UTC - -# Although Guix _does_ set umask when building its own packages (in our case, -# this is all packages in manifest.scm), it does not set it for `guix -# shell`. It does make sense for at least `guix shell --container` -# to set umask, so if that change gets merged upstream and we bump the -# time-machine to a commit which includes the aforementioned change, we can -# remove this line. -# -# This line should be placed before any commands which creates files. -umask 0022 - -if [ -n "$V" ]; then - # Print both unexpanded (-v) and expanded (-x) forms of commands as they are - # read from this file. - set -vx - # Set VERBOSE for CMake-based builds - export VERBOSE="$V" -fi - -# Check that required environment variables are set -cat << EOF -Required environment variables as seen inside the container: - DIST_ARCHIVE_BASE: ${DIST_ARCHIVE_BASE:?not set} - DISTNAME: ${DISTNAME:?not set} - HOST: ${HOST:?not set} - SOURCE_DATE_EPOCH: ${SOURCE_DATE_EPOCH:?not set} - JOBS: ${JOBS:?not set} - DISTSRC: ${DISTSRC:?not set} - OUTDIR: ${OUTDIR:?not set} -EOF - -ACTUAL_OUTDIR="${OUTDIR}" -OUTDIR="${DISTSRC}/output" - -##################### -# Environment Setup # -##################### - -# The depends folder also serves as a base-prefix for depends packages for -# $HOSTs after successfully building. -BASEPREFIX="${PWD}/depends" - -# Given a package name and an output name, return the path of that output in our -# current guix environment -store_path() { - grep --extended-regexp "/[^-]{32}-${1}-[^-]+${2:+-${2}}" "${GUIX_ENVIRONMENT}/manifest" \ - | head --lines=1 \ - | sed --expression='s|^[[:space:]]*"||' \ - --expression='s|"[[:space:]]*$||' -} - - -# Set environment variables to point the NATIVE toolchain to the right -# includes/libs -NATIVE_GCC="$(store_path gcc-toolchain)" - -unset LIBRARY_PATH -unset CPATH -unset C_INCLUDE_PATH -unset CPLUS_INCLUDE_PATH -unset OBJC_INCLUDE_PATH -unset OBJCPLUS_INCLUDE_PATH - -export LIBRARY_PATH="${NATIVE_GCC}/lib:${NATIVE_GCC_STATIC}/lib" -export C_INCLUDE_PATH="${NATIVE_GCC}/include" -export CPLUS_INCLUDE_PATH="${NATIVE_GCC}/include/c++:${NATIVE_GCC}/include" -export OBJC_INCLUDE_PATH="${NATIVE_GCC}/include" -export OBJCPLUS_INCLUDE_PATH="${NATIVE_GCC}/include/c++:${NATIVE_GCC}/include" - -case "$HOST" in - *darwin*) export LIBRARY_PATH="${NATIVE_GCC}/lib" ;; - *mingw*) export LIBRARY_PATH="${NATIVE_GCC}/lib" ;; - *) - NATIVE_GCC_STATIC="$(store_path gcc-toolchain static)" - export LIBRARY_PATH="${NATIVE_GCC}/lib:${NATIVE_GCC_STATIC}/lib" - ;; -esac - -# Set environment variables to point the CROSS toolchain to the right -# includes/libs for $HOST -case "$HOST" in - *mingw*) - # Determine output paths to use in CROSS_* environment variables - CROSS_GLIBC="$(store_path "mingw-w64-x86_64-winpthreads")" - CROSS_GCC="$(store_path "gcc-cross-${HOST}")" - CROSS_GCC_LIB_STORE="$(store_path "gcc-cross-${HOST}" lib)" - CROSS_GCC_LIBS=( "${CROSS_GCC_LIB_STORE}/lib/gcc/${HOST}"/* ) # This expands to an array of directories... - CROSS_GCC_LIB="${CROSS_GCC_LIBS[0]}" # ...we just want the first one (there should only be one) - - # The search path ordering is generally: - # 1. gcc-related search paths - # 2. libc-related search paths - # 2. kernel-header-related search paths (not applicable to mingw-w64 hosts) - export CROSS_C_INCLUDE_PATH="${CROSS_GCC_LIB}/include:${CROSS_GCC_LIB}/include-fixed:${CROSS_GLIBC}/include" - export CROSS_CPLUS_INCLUDE_PATH="${CROSS_GCC}/include/c++:${CROSS_GCC}/include/c++/${HOST}:${CROSS_GCC}/include/c++/backward:${CROSS_C_INCLUDE_PATH}" - export CROSS_LIBRARY_PATH="${CROSS_GCC_LIB_STORE}/lib:${CROSS_GCC_LIB}:${CROSS_GLIBC}/lib" - ;; - *darwin*) - # The CROSS toolchain for darwin uses the SDK and ignores environment variables. - # See depends/hosts/darwin.mk for more details. - ;; - *linux*) - CROSS_GLIBC="$(store_path "glibc-cross-${HOST}")" - CROSS_GLIBC_STATIC="$(store_path "glibc-cross-${HOST}" static)" - CROSS_KERNEL="$(store_path "linux-libre-headers-cross-${HOST}")" - CROSS_GCC="$(store_path "gcc-cross-${HOST}")" - CROSS_GCC_LIB_STORE="$(store_path "gcc-cross-${HOST}" lib)" - CROSS_GCC_LIBS=( "${CROSS_GCC_LIB_STORE}/lib/gcc/${HOST}"/* ) # This expands to an array of directories... - CROSS_GCC_LIB="${CROSS_GCC_LIBS[0]}" # ...we just want the first one (there should only be one) - - export CROSS_C_INCLUDE_PATH="${CROSS_GCC_LIB}/include:${CROSS_GCC_LIB}/include-fixed:${CROSS_GLIBC}/include:${CROSS_KERNEL}/include" - export CROSS_CPLUS_INCLUDE_PATH="${CROSS_GCC}/include/c++:${CROSS_GCC}/include/c++/${HOST}:${CROSS_GCC}/include/c++/backward:${CROSS_C_INCLUDE_PATH}" - export CROSS_LIBRARY_PATH="${CROSS_GCC_LIB_STORE}/lib:${CROSS_GCC_LIB}:${CROSS_GLIBC}/lib:${CROSS_GLIBC_STATIC}/lib" - ;; - *) - exit 1 ;; -esac - -# Sanity check CROSS_*_PATH directories -IFS=':' read -ra PATHS <<< "${CROSS_C_INCLUDE_PATH}:${CROSS_CPLUS_INCLUDE_PATH}:${CROSS_LIBRARY_PATH}" -for p in "${PATHS[@]}"; do - if [ -n "$p" ] && [ ! -d "$p" ]; then - echo "'$p' doesn't exist or isn't a directory... Aborting..." - exit 1 - fi -done - -# Disable Guix ld auto-rpath behavior -export GUIX_LD_WRAPPER_DISABLE_RPATH=yes - -# Make /usr/bin if it doesn't exist -[ -e /usr/bin ] || mkdir -p /usr/bin - -# Symlink file and env to a conventional path -[ -e /usr/bin/file ] || ln -s --no-dereference "$(command -v file)" /usr/bin/file -[ -e /usr/bin/env ] || ln -s --no-dereference "$(command -v env)" /usr/bin/env - -# Determine the correct value for -Wl,--dynamic-linker for the current $HOST -case "$HOST" in - *linux*) - glibc_dynamic_linker=$( - case "$HOST" in - x86_64-linux-gnu) echo /lib64/ld-linux-x86-64.so.2 ;; - arm-linux-gnueabihf) echo /lib/ld-linux-armhf.so.3 ;; - aarch64-linux-gnu) echo /lib/ld-linux-aarch64.so.1 ;; - riscv64-linux-gnu) echo /lib/ld-linux-riscv64-lp64d.so.1 ;; - powerpc64-linux-gnu) echo /lib64/ld64.so.1;; - powerpc64le-linux-gnu) echo /lib64/ld64.so.2;; - *) exit 1 ;; - esac - ) - ;; -esac - -# Environment variables for determinism -export TAR_OPTIONS="--owner=0 --group=0 --numeric-owner --mtime='@${SOURCE_DATE_EPOCH}' --sort=name" -export TZ="UTC" - -#################### -# Depends Building # -#################### - -# Build the depends tree, overriding variables that assume multilib gcc -make -C depends --jobs="$JOBS" HOST="$HOST" \ - ${V:+V=1} \ - ${SOURCES_PATH+SOURCES_PATH="$SOURCES_PATH"} \ - ${BASE_CACHE+BASE_CACHE="$BASE_CACHE"} \ - ${SDK_PATH+SDK_PATH="$SDK_PATH"} \ - x86_64_linux_CC=x86_64-linux-gnu-gcc \ - x86_64_linux_CXX=x86_64-linux-gnu-g++ \ - x86_64_linux_AR=x86_64-linux-gnu-gcc-ar \ - x86_64_linux_RANLIB=x86_64-linux-gnu-gcc-ranlib \ - x86_64_linux_NM=x86_64-linux-gnu-gcc-nm \ - x86_64_linux_STRIP=x86_64-linux-gnu-strip - - -########################### -# Source Tarball Building # -########################### - -GIT_ARCHIVE="${DIST_ARCHIVE_BASE}/${DISTNAME}.tar.gz" - -# Create the source tarball if not already there -if [ ! -e "$GIT_ARCHIVE" ]; then - mkdir -p "$(dirname "$GIT_ARCHIVE")" - git archive --prefix="${DISTNAME}/" --output="$GIT_ARCHIVE" HEAD -fi - -mkdir -p "$OUTDIR" - -########################### -# Binary Tarball Building # -########################### - -# CONFIGFLAGS -CONFIGFLAGS="--enable-reduce-exports --disable-bench --disable-gui-tests --disable-fuzz-binary" - -# CFLAGS -HOST_CFLAGS="-O2 -g" -case "$HOST" in - *linux*) HOST_CFLAGS+=" -ffile-prefix-map=${PWD}=." ;; - *mingw*) HOST_CFLAGS+=" -fno-ident" ;; - *darwin*) unset HOST_CFLAGS ;; -esac - -# CXXFLAGS -HOST_CXXFLAGS="$HOST_CFLAGS" - -case "$HOST" in - arm-linux-gnueabihf) HOST_CXXFLAGS="${HOST_CXXFLAGS} -Wno-psabi" ;; -esac - -# LDFLAGS -case "$HOST" in - *linux*) HOST_LDFLAGS="-Wl,--as-needed -Wl,--dynamic-linker=$glibc_dynamic_linker -static-libstdc++" ;; - *mingw*) HOST_LDFLAGS="-Wl,--no-insert-timestamp" ;; -esac - -# Make $HOST-specific native binaries from depends available in $PATH -export PATH="${BASEPREFIX}/${HOST}/native/bin:${PATH}" -mkdir -p "$DISTSRC" -( - cd "$DISTSRC" - - # Extract the source tarball - tar --strip-components=1 -xf "${GIT_ARCHIVE}" - - ./autogen.sh - - # Configure this DISTSRC for $HOST - # shellcheck disable=SC2086 - env CONFIG_SITE="${BASEPREFIX}/${HOST}/share/config.site" \ - ./configure --prefix=/ \ - --disable-ccache \ - --disable-maintainer-mode \ - --disable-dependency-tracking \ - ${CONFIGFLAGS} \ - ${HOST_CFLAGS:+CFLAGS="${HOST_CFLAGS}"} \ - ${HOST_CXXFLAGS:+CXXFLAGS="${HOST_CXXFLAGS}"} \ - ${HOST_LDFLAGS:+LDFLAGS="${HOST_LDFLAGS}"} - - sed -i.old 's/-lstdc++ //g' config.status libtool - - # Build Bitcoin Core - make --jobs="$JOBS" ${V:+V=1} - - # Check that symbol/security checks tools are sane. - make test-security-check ${V:+V=1} - # Perform basic security checks on a series of executables. - make -C src --jobs=1 check-security ${V:+V=1} - # Check that executables only contain allowed version symbols. - make -C src --jobs=1 check-symbols ${V:+V=1} - - mkdir -p "$OUTDIR" - - # Make the os-specific installers - case "$HOST" in - *mingw*) - make deploy ${V:+V=1} BGL_WIN_INSTALLER="${OUTDIR}/${DISTNAME}-win64-setup-unsigned.exe" - ;; - esac - - # Setup the directory where our BGL Core build for HOST will be - # installed. This directory will also later serve as the input for our - # binary tarballs. - INSTALLPATH="${PWD}/installed/${DISTNAME}" - mkdir -p "${INSTALLPATH}" - # Install built BGL Core to $INSTALLPATH - case "$HOST" in - *darwin*) - make install-strip DESTDIR="${INSTALLPATH}" ${V:+V=1} - ;; - *) - make install DESTDIR="${INSTALLPATH}" ${V:+V=1} - ;; - esac - - case "$HOST" in - *darwin*) - make deploydir ${V:+V=1} - mkdir -p "unsigned-app-${HOST}" - cp --target-directory="unsigned-app-${HOST}" \ - contrib/macdeploy/detached-sig-create.sh - mv --target-directory="unsigned-app-${HOST}" dist - ( - cd "unsigned-app-${HOST}" - find . -print0 \ - | sort --zero-terminated \ - | tar --create --no-recursion --mode='u+rw,go+r-w,a+X' --null --files-from=- \ - | gzip -9n > "${OUTDIR}/${DISTNAME}-${HOST}-unsigned.tar.gz" \ - || ( rm -f "${OUTDIR}/${DISTNAME}-${HOST}-unsigned.tar.gz" && exit 1 ) - ) - make deploy ${V:+V=1} OSX_ZIP="${OUTDIR}/${DISTNAME}-${HOST}-unsigned.zip" - ;; - esac - ( - cd installed - - # Prune libtool and object archives - find . -name "lib*.la" -delete - find . -name "lib*.a" -delete - - case "$HOST" in - *darwin*) ;; - *) - # Split binaries from their debug symbols - { - find "${DISTNAME}/bin" -type f -executable -print0 - } | xargs -0 -P"$JOBS" -I{} "${DISTSRC}/contrib/devtools/split-debug.sh" {} {} {}.dbg - ;; - esac - - case "$HOST" in - *mingw*) - cp "${DISTSRC}/doc/README_windows.txt" "${DISTNAME}/readme.txt" - ;; - *linux*) - cp "${DISTSRC}/README.md" "${DISTNAME}/" - ;; - esac - - # copy over the example bitcoin.conf file. if contrib/devtools/gen-bitcoin-conf.sh - # has not been run before buildling, this file will be a stub - cp "${DISTSRC}/share/examples/BGL.conf" "${DISTNAME}/" - - cp -r "${DISTSRC}/share/rpcauth" "${DISTNAME}/share/" - - # Finally, deterministically produce {non-,}debug binary tarballs ready - # for release - case "$HOST" in - *mingw*) - find "${DISTNAME}" -not -name "*.dbg" -print0 \ - | xargs -0r touch --no-dereference --date="@${SOURCE_DATE_EPOCH}" - find "${DISTNAME}" -not -name "*.dbg" \ - | sort \ - | zip -X@ "${OUTDIR}/${DISTNAME}-${HOST//x86_64-w64-mingw32/win64}.zip" \ - || ( rm -f "${OUTDIR}/${DISTNAME}-${HOST//x86_64-w64-mingw32/win64}.zip" && exit 1 ) - find "${DISTNAME}" -name "*.dbg" -print0 \ - | xargs -0r touch --no-dereference --date="@${SOURCE_DATE_EPOCH}" - find "${DISTNAME}" -name "*.dbg" \ - | sort \ - | zip -X@ "${OUTDIR}/${DISTNAME}-${HOST//x86_64-w64-mingw32/win64}-debug.zip" \ - || ( rm -f "${OUTDIR}/${DISTNAME}-${HOST//x86_64-w64-mingw32/win64}-debug.zip" && exit 1 ) - ;; - *linux*) - find "${DISTNAME}" -not -name "*.dbg" -print0 \ - | sort --zero-terminated \ - | tar --create --no-recursion --mode='u+rw,go+r-w,a+X' --null --files-from=- \ - | gzip -9n > "${OUTDIR}/${DISTNAME}-${HOST}.tar.gz" \ - || ( rm -f "${OUTDIR}/${DISTNAME}-${HOST}.tar.gz" && exit 1 ) - find "${DISTNAME}" -name "*.dbg" -print0 \ - | sort --zero-terminated \ - | tar --create --no-recursion --mode='u+rw,go+r-w,a+X' --null --files-from=- \ - | gzip -9n > "${OUTDIR}/${DISTNAME}-${HOST}-debug.tar.gz" \ - || ( rm -f "${OUTDIR}/${DISTNAME}-${HOST}-debug.tar.gz" && exit 1 ) - ;; - *darwin*) - find "${DISTNAME}" -print0 \ - | sort --zero-terminated \ - | tar --create --no-recursion --mode='u+rw,go+r-w,a+X' --null --files-from=- \ - | gzip -9n > "${OUTDIR}/${DISTNAME}-${HOST}.tar.gz" \ - || ( rm -f "${OUTDIR}/${DISTNAME}-${HOST}.tar.gz" && exit 1 ) - ;; - esac - ) # $DISTSRC/installed - - case "$HOST" in - *mingw*) - cp -rf --target-directory=. contrib/windeploy - ( - cd ./windeploy - mkdir -p unsigned - cp --target-directory=unsigned/ "${OUTDIR}/${DISTNAME}-win64-setup-unsigned.exe" - find . -print0 \ - | sort --zero-terminated \ - | tar --create --no-recursion --mode='u+rw,go+r-w,a+X' --null --files-from=- \ - | gzip -9n > "${OUTDIR}/${DISTNAME}-win64-unsigned.tar.gz" \ - || ( rm -f "${OUTDIR}/${DISTNAME}-win64-unsigned.tar.gz" && exit 1 ) - ) - ;; - esac -) # $DISTSRC - -rm -rf "$ACTUAL_OUTDIR" -mv --no-target-directory "$OUTDIR" "$ACTUAL_OUTDIR" \ - || ( rm -rf "$ACTUAL_OUTDIR" && exit 1 ) - -( - cd /outdir-base - { - echo "$GIT_ARCHIVE" - find "$ACTUAL_OUTDIR" -type f - } | xargs realpath --relative-base="$PWD" \ - | xargs sha256sum \ - | sort -k2 \ - | sponge "$ACTUAL_OUTDIR"/SHA256SUMS.part -) diff --git a/contrib/guix/libexec/codesign.sh b/contrib/guix/libexec/codesign.sh deleted file mode 100755 index b56d2a2309..0000000000 --- a/contrib/guix/libexec/codesign.sh +++ /dev/null @@ -1,115 +0,0 @@ -#!/usr/bin/env bash -# Copyright (c) 2021-2022 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. -export LC_ALL=C -set -e -o pipefail -export TZ=UTC - -# Although Guix _does_ set umask when building its own packages (in our case, -# this is all packages in manifest.scm), it does not set it for `guix -# shell`. It does make sense for at least `guix shell --container` -# to set umask, so if that change gets merged upstream and we bump the -# time-machine to a commit which includes the aforementioned change, we can -# remove this line. -# -# This line should be placed before any commands which creates files. -umask 0022 - -if [ -n "$V" ]; then - # Print both unexpanded (-v) and expanded (-x) forms of commands as they are - # read from this file. - set -vx - # Set VERBOSE for CMake-based builds - export VERBOSE="$V" -fi - -# Check that required environment variables are set -cat << EOF -Required environment variables as seen inside the container: - UNSIGNED_TARBALL: ${UNSIGNED_TARBALL:?not set} - DETACHED_SIGS_REPO: ${DETACHED_SIGS_REPO:?not set} - DIST_ARCHIVE_BASE: ${DIST_ARCHIVE_BASE:?not set} - DISTNAME: ${DISTNAME:?not set} - HOST: ${HOST:?not set} - SOURCE_DATE_EPOCH: ${SOURCE_DATE_EPOCH:?not set} - DISTSRC: ${DISTSRC:?not set} - OUTDIR: ${OUTDIR:?not set} -EOF - -ACTUAL_OUTDIR="${OUTDIR}" -OUTDIR="${DISTSRC}/output" - -git_head_version() { - local recent_tag - if recent_tag="$(git -C "$1" describe --exact-match HEAD 2> /dev/null)"; then - echo "${recent_tag#v}" - else - git -C "$1" rev-parse --short=12 HEAD - fi -} - -CODESIGNATURE_GIT_ARCHIVE="${DIST_ARCHIVE_BASE}/${DISTNAME}-codesignatures-$(git_head_version "$DETACHED_SIGS_REPO").tar.gz" - -# Create the codesignature tarball if not already there -if [ ! -e "$CODESIGNATURE_GIT_ARCHIVE" ]; then - mkdir -p "$(dirname "$CODESIGNATURE_GIT_ARCHIVE")" - git -C "$DETACHED_SIGS_REPO" archive --output="$CODESIGNATURE_GIT_ARCHIVE" HEAD -fi - -mkdir -p "$OUTDIR" - -mkdir -p "$DISTSRC" -( - cd "$DISTSRC" - - tar -xf "$UNSIGNED_TARBALL" - - mkdir -p codesignatures - tar -C codesignatures -xf "$CODESIGNATURE_GIT_ARCHIVE" - - case "$HOST" in - *mingw*) - find "$PWD" -name "*-unsigned.exe" | while read -r infile; do - infile_base="$(basename "$infile")" - - # Codesigned *-unsigned.exe and output to OUTDIR - osslsigncode attach-signature \ - -in "$infile" \ - -out "${OUTDIR}/${infile_base/-unsigned}" \ - -CAfile "$GUIX_ENVIRONMENT/etc/ssl/certs/ca-certificates.crt" \ - -sigin codesignatures/win/"$infile_base".pem - done - ;; - *darwin*) - # Apply detached codesignatures to dist/ (in-place) - signapple apply dist/Bitcoin-Qt.app codesignatures/osx/dist - - # Make a .zip from dist/ - cd dist/ - find . -print0 \ - | xargs -0r touch --no-dereference --date="@${SOURCE_DATE_EPOCH}" - find . | sort \ - | zip -X@ "${OUTDIR}/${DISTNAME}-${HOST}.zip" - ;; - *) - exit 1 - ;; - esac -) # $DISTSRC - -rm -rf "$ACTUAL_OUTDIR" -mv --no-target-directory "$OUTDIR" "$ACTUAL_OUTDIR" \ - || ( rm -rf "$ACTUAL_OUTDIR" && exit 1 ) - -( - cd /outdir-base - { - echo "$UNSIGNED_TARBALL" - echo "$CODESIGNATURE_GIT_ARCHIVE" - find "$ACTUAL_OUTDIR" -type f - } | xargs realpath --relative-base="$PWD" \ - | xargs sha256sum \ - | sort -k2 \ - | sponge "$ACTUAL_OUTDIR"/SHA256SUMS.part -) diff --git a/contrib/guix/libexec/prelude.bash b/contrib/guix/libexec/prelude.bash deleted file mode 100644 index f126b2295a..0000000000 --- a/contrib/guix/libexec/prelude.bash +++ /dev/null @@ -1,82 +0,0 @@ -#!/usr/bin/env bash -export LC_ALL=C -set -e -o pipefail - -# shellcheck source=contrib/shell/realpath.bash -source contrib/shell/realpath.bash - -# shellcheck source=contrib/shell/git-utils.bash -source contrib/shell/git-utils.bash - -################ -# Required non-builtin commands should be invocable -################ - -check_tools() { - for cmd in "$@"; do - if ! command -v "$cmd" > /dev/null 2>&1; then - echo "ERR: This script requires that '$cmd' is installed and available in your \$PATH" - exit 1 - fi - done -} - -check_tools cat env readlink dirname basename git - -################ -# We should be at the top directory of the repository -################ - -same_dir() { - local resolved1 resolved2 - resolved1="$(bash_realpath "${1}")" - resolved2="$(bash_realpath "${2}")" - [ "$resolved1" = "$resolved2" ] -} - -if ! same_dir "${PWD}" "$(git_root)"; then -cat << EOF -ERR: This script must be invoked from the top level of the git repository - -Hint: This may look something like: - env FOO=BAR ./contrib/guix/guix- - -EOF -exit 1 -fi - -################ -# Execute "$@" in a pinned, possibly older version of Guix, for reproducibility -# across time. -time-machine() { - # shellcheck disable=SC2086 - guix time-machine --url=https://git.savannah.gnu.org/git/guix.git \ - --commit=f0bb724211872cd6158fce6162e0b8c73efed126 \ - --cores="$JOBS" \ - --keep-failed \ - --fallback \ - ${SUBSTITUTE_URLS:+--substitute-urls="$SUBSTITUTE_URLS"} \ - ${ADDITIONAL_GUIX_COMMON_FLAGS} ${ADDITIONAL_GUIX_TIMEMACHINE_FLAGS} \ - -- "$@" -} - - -################ -# Set common variables -################ - -VERSION="${FORCE_VERSION:-$(git_head_version)}" -DISTNAME="${DISTNAME:-BGL-${VERSION}}" - -version_base_prefix="${PWD}/guix-build-" -VERSION_BASE="${version_base_prefix}${VERSION}" # TOP - -DISTSRC_BASE="${DISTSRC_BASE:-${VERSION_BASE}}" - -OUTDIR_BASE="${OUTDIR_BASE:-${VERSION_BASE}/output}" - -var_base_basename="var" -VAR_BASE="${VAR_BASE:-${VERSION_BASE}/${var_base_basename}}" - -profiles_base_basename="profiles" -PROFILES_BASE="${PROFILES_BASE:-${VAR_BASE}/${profiles_base_basename}}" diff --git a/contrib/guix/manifest.scm b/contrib/guix/manifest.scm deleted file mode 100644 index da0891a60f..0000000000 --- a/contrib/guix/manifest.scm +++ /dev/null @@ -1,538 +0,0 @@ -(use-modules (gnu packages) - (gnu packages autotools) - ((gnu packages bash) #:select (bash-minimal)) - (gnu packages bison) - ((gnu packages certs) #:select (nss-certs)) - ((gnu packages cmake) #:select (cmake-minimal)) - (gnu packages commencement) - (gnu packages compression) - (gnu packages cross-base) - (gnu packages file) - (gnu packages gawk) - (gnu packages gcc) - ((gnu packages installers) #:select (nsis-x86_64)) - ((gnu packages linux) #:select (linux-libre-headers-6.1 util-linux)) - (gnu packages llvm) - (gnu packages mingw) - (gnu packages moreutils) - (gnu packages pkg-config) - ((gnu packages python) #:select (python-minimal)) - ((gnu packages python-build) #:select (python-tomli)) - ((gnu packages python-crypto) #:select (python-asn1crypto)) - ((gnu packages tls) #:select (openssl)) - ((gnu packages version-control) #:select (git-minimal)) - (guix build-system cmake) - (guix build-system gnu) - (guix build-system python) - (guix build-system trivial) - (guix gexp) - (guix git-download) - ((guix licenses) #:prefix license:) - (guix packages) - ((guix utils) #:select (substitute-keyword-arguments))) - -(define-syntax-rule (search-our-patches file-name ...) - "Return the list of absolute file names corresponding to each -FILE-NAME found in ./patches relative to the current file." - (parameterize - ((%patch-path (list (string-append (dirname (current-filename)) "/patches")))) - (list (search-patch file-name) ...))) - -(define building-on (string-append "--build=" (list-ref (string-split (%current-system) #\-) 0) "-guix-linux-gnu")) - -(define (make-cross-toolchain target - base-gcc-for-libc - base-kernel-headers - base-libc - base-gcc) - "Create a cross-compilation toolchain package for TARGET" - (let* ((xbinutils (cross-binutils target)) - ;; 1. Build a cross-compiling gcc without targeting any libc, derived - ;; from BASE-GCC-FOR-LIBC - (xgcc-sans-libc (cross-gcc target - #:xgcc base-gcc-for-libc - #:xbinutils xbinutils)) - ;; 2. Build cross-compiled kernel headers with XGCC-SANS-LIBC, derived - ;; from BASE-KERNEL-HEADERS - (xkernel (cross-kernel-headers target - base-kernel-headers - xgcc-sans-libc - xbinutils)) - ;; 3. Build a cross-compiled libc with XGCC-SANS-LIBC and XKERNEL, - ;; derived from BASE-LIBC - (xlibc (cross-libc target - base-libc - xgcc-sans-libc - xbinutils - xkernel)) - ;; 4. Build a cross-compiling gcc targeting XLIBC, derived from - ;; BASE-GCC - (xgcc (cross-gcc target - #:xgcc base-gcc - #:xbinutils xbinutils - #:libc xlibc))) - ;; Define a meta-package that propagates the resulting XBINUTILS, XLIBC, and - ;; XGCC - (package - (name (string-append target "-toolchain")) - (version (package-version xgcc)) - (source #f) - (build-system trivial-build-system) - (arguments '(#:builder (begin (mkdir %output) #t))) - (propagated-inputs - (list xbinutils - xlibc - xgcc - `(,xlibc "static") - `(,xgcc "lib"))) - (synopsis (string-append "Complete GCC tool chain for " target)) - (description (string-append "This package provides a complete GCC tool -chain for " target " development.")) - (home-page (package-home-page xgcc)) - (license (package-license xgcc))))) - -(define base-gcc gcc-12) -(define base-linux-kernel-headers linux-libre-headers-6.1) - -(define* (make-BGL-cross-toolchain target - #:key - (base-gcc-for-libc linux-base-gcc) - (base-kernel-headers base-linux-kernel-headers) - (base-libc glibc-2.31) - (base-gcc linux-base-gcc)) - "Convenience wrapper around MAKE-CROSS-TOOLCHAIN with default values -desirable for building BGL Core release binaries." - (make-cross-toolchain target - base-gcc-for-libc - base-kernel-headers - base-libc - base-gcc)) - -(define (gcc-mingw-patches gcc) - (package-with-extra-patches gcc - (search-our-patches "gcc-remap-guix-store.patch"))) - -(define (binutils-mingw-patches binutils) - (package-with-extra-patches binutils - (search-our-patches "binutils-unaligned-default.patch"))) - -(define (make-mingw-pthreads-cross-toolchain target) - "Create a cross-compilation toolchain package for TARGET" - (let* ((xbinutils (binutils-mingw-patches (cross-binutils target))) - (pthreads-xlibc mingw-w64-x86_64-winpthreads) - (pthreads-xgcc (cross-gcc target - #:xgcc (gcc-mingw-patches mingw-w64-base-gcc) - #:xbinutils xbinutils - #:libc pthreads-xlibc))) - ;; Define a meta-package that propagates the resulting XBINUTILS, XLIBC, and - ;; XGCC - (package - (name (string-append target "-posix-toolchain")) - (version (package-version pthreads-xgcc)) - (source #f) - (build-system trivial-build-system) - (arguments '(#:builder (begin (mkdir %output) #t))) - (propagated-inputs - (list xbinutils - pthreads-xlibc - pthreads-xgcc - `(,pthreads-xgcc "lib"))) - (synopsis (string-append "Complete GCC tool chain for " target)) - (description (string-append "This package provides a complete GCC tool -chain for " target " development.")) - (home-page (package-home-page pthreads-xgcc)) - (license (package-license pthreads-xgcc))))) - -;; While LIEF is packaged in Guix, we maintain our own package, -;; to simplify building, and more easily apply updates. -;; Moreover, the Guix's package uses cmake, which caused build -;; failure; see https://github.com/bitcoin/bitcoin/pull/27296. -(define-public python-lief - (package - (name "python-lief") - (version "0.13.2") - (source (origin - (method git-fetch) - (uri (git-reference - (url "https://github.com/lief-project/LIEF") - (commit version))) - (file-name (git-file-name name version)) - (modules '((guix build utils))) - (snippet - '(begin - ;; Configure build for Python bindings. - (substitute* "api/python/config-default.toml" - (("(ninja = )true" all m) - (string-append m "false")) - (("(parallel-jobs = )0" all m) - (string-append m (number->string (parallel-job-count))))))) - (sha256 - (base32 - "0y48x358ppig5xp97ahcphfipx7cg9chldj2q5zrmn610fmi4zll")))) - (build-system python-build-system) - (native-inputs (list cmake-minimal python-tomli)) - (arguments - (list - #:tests? #f ;needs network - #:phases #~(modify-phases %standard-phases - (add-before 'build 'change-directory - (lambda _ - (chdir "api/python"))) - (replace 'build - (lambda _ - (invoke "python" "setup.py" "build")))))) - (home-page "https://github.com/lief-project/LIEF") - (synopsis "Library to instrument executable formats") - (description - "@code{python-lief} is a cross platform library which can parse, modify -and abstract ELF, PE and MachO formats.") - (license license:asl2.0))) - -(define osslsigncode - (package - (name "osslsigncode") - (version "2.5") - (source (origin - (method git-fetch) - (uri (git-reference - (url "https://github.com/mtrojnar/osslsigncode") - (commit version))) - (sha256 - (base32 - "1j47vwq4caxfv0xw68kw5yh00qcpbd56d7rq6c483ma3y7s96yyz")))) - (build-system cmake-build-system) - (inputs (list openssl)) - (home-page "https://github.com/mtrojnar/osslsigncode") - (synopsis "Authenticode signing and timestamping tool") - (description "osslsigncode is a small tool that implements part of the -functionality of the Microsoft tool signtool.exe - more exactly the Authenticode -signing and timestamping. But osslsigncode is based on OpenSSL and cURL, and -thus should be able to compile on most platforms where these exist.") - (license license:gpl3+))) ; license is with openssl exception - -(define-public python-elfesteem - (let ((commit "87bbd79ab7e361004c98cc8601d4e5f029fd8bd5")) - (package - (name "python-elfesteem") - (version (git-version "0.1" "1" commit)) - (source - (origin - (method git-fetch) - (uri (git-reference - (url "https://github.com/LRGH/elfesteem") - (commit commit))) - (file-name (git-file-name name commit)) - (sha256 - (base32 - "1nyvjisvyxyxnd0023xjf5846xd03lwawp5pfzr8vrky7wwm5maz")) - (patches (search-our-patches "elfsteem-value-error-python-39.patch")))) - (build-system python-build-system) - ;; There are no tests, but attempting to run python setup.py test leads to - ;; PYTHONPATH problems, just disable the test - (arguments '(#:tests? #f)) - (home-page "https://github.com/LRGH/elfesteem") - (synopsis "ELF/PE/Mach-O parsing library") - (description "elfesteem parses ELF, PE and Mach-O files.") - (license license:lgpl2.1)))) - -(define-public python-oscrypto - (package - (name "python-oscrypto") - (version "1.2.1") - (source - (origin - (method git-fetch) - (uri (git-reference - (url "https://github.com/wbond/oscrypto") - (commit version))) - (file-name (git-file-name name version)) - (sha256 - (base32 - "1d4d8s4z340qhvb3g5m5v3436y3a71yc26wk4749q64m09kxqc3l")) - (patches (search-our-patches "oscrypto-hard-code-openssl.patch")))) - (build-system python-build-system) - (native-search-paths - (list (search-path-specification - (variable "SSL_CERT_FILE") - (file-type 'regular) - (separator #f) ;single entry - (files '("etc/ssl/certs/ca-certificates.crt"))))) - - (propagated-inputs - (list python-asn1crypto openssl)) - (arguments - `(#:phases - (modify-phases %standard-phases - (add-after 'unpack 'hard-code-path-to-libscrypt - (lambda* (#:key inputs #:allow-other-keys) - (let ((openssl (assoc-ref inputs "openssl"))) - (substitute* "oscrypto/__init__.py" - (("@GUIX_OSCRYPTO_USE_OPENSSL@") - (string-append openssl "/lib/libcrypto.so" "," openssl "/lib/libssl.so"))) - #t))) - (add-after 'unpack 'disable-broken-tests - (lambda _ - ;; This test is broken as there is no keyboard interrupt. - (substitute* "tests/test_trust_list.py" - (("^(.*)class TrustListTests" line indent) - (string-append indent - "@unittest.skip(\"Disabled by Guix\")\n" - line))) - (substitute* "tests/test_tls.py" - (("^(.*)class TLSTests" line indent) - (string-append indent - "@unittest.skip(\"Disabled by Guix\")\n" - line))) - #t)) - (replace 'check - (lambda _ - (invoke "python" "run.py" "tests") - #t))))) - (home-page "https://github.com/wbond/oscrypto") - (synopsis "Compiler-free Python crypto library backed by the OS") - (description "oscrypto is a compilation-free, always up-to-date encryption library for Python.") - (license license:expat))) - -(define-public python-oscryptotests - (package (inherit python-oscrypto) - (name "python-oscryptotests") - (propagated-inputs - (list python-oscrypto)) - (arguments - `(#:tests? #f - #:phases - (modify-phases %standard-phases - (add-after 'unpack 'hard-code-path-to-libscrypt - (lambda* (#:key inputs #:allow-other-keys) - (chdir "tests") - #t))))))) - -(define-public python-certvalidator - (let ((commit "a145bf25eb75a9f014b3e7678826132efbba6213")) - (package - (name "python-certvalidator") - (version (git-version "0.1" "1" commit)) - (source - (origin - (method git-fetch) - (uri (git-reference - (url "https://github.com/achow101/certvalidator") - (commit commit))) - (file-name (git-file-name name commit)) - (sha256 - (base32 - "1qw2k7xis53179lpqdqyylbcmp76lj7sagp883wmxg5i7chhc96k")))) - (build-system python-build-system) - (propagated-inputs - (list python-asn1crypto - python-oscrypto - python-oscryptotests)) ;; certvalidator tests import oscryptotests - (arguments - `(#:phases - (modify-phases %standard-phases - (add-after 'unpack 'disable-broken-tests - (lambda _ - (substitute* "tests/test_certificate_validator.py" - (("^(.*)class CertificateValidatorTests" line indent) - (string-append indent - "@unittest.skip(\"Disabled by Guix\")\n" - line))) - (substitute* "tests/test_crl_client.py" - (("^(.*)def test_fetch_crl" line indent) - (string-append indent - "@unittest.skip(\"Disabled by Guix\")\n" - line))) - (substitute* "tests/test_ocsp_client.py" - (("^(.*)def test_fetch_ocsp" line indent) - (string-append indent - "@unittest.skip(\"Disabled by Guix\")\n" - line))) - (substitute* "tests/test_registry.py" - (("^(.*)def test_build_paths" line indent) - (string-append indent - "@unittest.skip(\"Disabled by Guix\")\n" - line))) - (substitute* "tests/test_validate.py" - (("^(.*)def test_revocation_mode_hard" line indent) - (string-append indent - "@unittest.skip(\"Disabled by Guix\")\n" - line))) - (substitute* "tests/test_validate.py" - (("^(.*)def test_revocation_mode_soft" line indent) - (string-append indent - "@unittest.skip(\"Disabled by Guix\")\n" - line))) - #t)) - (replace 'check - (lambda _ - (invoke "python" "run.py" "tests") - #t))))) - (home-page "https://github.com/wbond/certvalidator") - (synopsis "Python library for validating X.509 certificates and paths") - (description "certvalidator is a Python library for validating X.509 -certificates or paths. Supports various options, including: validation at a -specific moment in time, whitelisting and revocation checks.") - (license license:expat)))) - -(define-public python-signapple - (let ((commit "62155712e7417aba07565c9780a80e452823ae6a")) - (package - (name "python-signapple") - (version (git-version "0.1" "1" commit)) - (source - (origin - (method git-fetch) - (uri (git-reference - (url "https://github.com/achow101/signapple") - (commit commit))) - (file-name (git-file-name name commit)) - (sha256 - (base32 - "1nm6rm4h4m7kbq729si4cm8rzild62mk4ni8xr5zja7l33fhv3gb")))) - (build-system python-build-system) - (propagated-inputs - (list python-asn1crypto - python-oscrypto - python-certvalidator - python-elfesteem)) - ;; There are no tests, but attempting to run python setup.py test leads to - ;; problems, just disable the test - (arguments '(#:tests? #f)) - (home-page "https://github.com/achow101/signapple") - (synopsis "Mach-O binary signature tool") - (description "signapple is a Python tool for creating, verifying, and -inspecting signatures in Mach-O binaries.") - (license license:expat)))) - -(define-public mingw-w64-base-gcc - (package - (inherit base-gcc) - (arguments - (substitute-keyword-arguments (package-arguments base-gcc) - ((#:configure-flags flags) - `(append ,flags - ;; https://gcc.gnu.org/install/configure.html - (list "--enable-threads=posix", - "--enable-default-ssp=yes", - building-on))))))) - -(define-public linux-base-gcc - (package - (inherit base-gcc) - (arguments - (substitute-keyword-arguments (package-arguments base-gcc) - ((#:configure-flags flags) - `(append ,flags - ;; https://gcc.gnu.org/install/configure.html - (list "--enable-initfini-array=yes", - "--enable-default-ssp=yes", - "--enable-default-pie=yes", - building-on))) - ((#:phases phases) - `(modify-phases ,phases - ;; Given a XGCC package, return a modified package that replace each instance of - ;; -rpath in the default system spec that's inserted by Guix with -rpath-link - (add-after 'pre-configure 'replace-rpath-with-rpath-link - (lambda _ - (substitute* (cons "gcc/config/rs6000/sysv4.h" - (find-files "gcc/config" - "^gnu-user.*\\.h$")) - (("-rpath=") "-rpath-link=")) - #t)))))))) - -(define-public glibc-2.31 - (let ((commit "8e30f03744837a85e33d84ccd34ed3abe30d37c3")) - (package - (inherit glibc) ;; 2.35 - (version "2.31") - (source (origin - (method git-fetch) - (uri (git-reference - (url "https://sourceware.org/git/glibc.git") - (commit commit))) - (file-name (git-file-name "glibc" commit)) - (sha256 - (base32 - "1zi0s9yy5zkisw823vivn7zlj8w6g9p3mm7lmlqiixcxdkz4dbn6")) - (patches (search-our-patches "glibc-guix-prefix.patch")))) - (arguments - (substitute-keyword-arguments (package-arguments glibc) - ((#:configure-flags flags) - `(append ,flags - ;; https://www.gnu.org/software/libc/manual/html_node/Configuring-and-compiling.html - (list "--enable-stack-protector=all", - "--enable-bind-now", - "--disable-werror", - building-on))) - ((#:phases phases) - `(modify-phases ,phases - (add-before 'configure 'set-etc-rpc-installation-directory - (lambda* (#:key outputs #:allow-other-keys) - ;; Install the rpc data base file under `$out/etc/rpc'. - ;; Otherwise build will fail with "Permission denied." - ;; Can be removed when we are building 2.32 or later. - (let ((out (assoc-ref outputs "out"))) - (substitute* "sunrpc/Makefile" - (("^\\$\\(inst_sysconfdir\\)/rpc(.*)$" _ suffix) - (string-append out "/etc/rpc" suffix "\n")) - (("^install-others =.*$") - (string-append "install-others = " out "/etc/rpc\n"))))))))))))) - -(packages->manifest - (append - (list ;; The Basics - bash-minimal - which - coreutils-minimal - util-linux - ;; File(system) inspection - file - grep - diffutils - findutils - ;; File transformation - patch - gawk - sed - moreutils - ;; Compression and archiving - tar - gzip - xz - ;; Build tools - cmake-minimal - gnu-make - libtool-2.4.7 - autoconf-2.71 - automake - pkg-config - bison - ;; Scripting - python-minimal ;; (3.9) - ;; Git - git-minimal - ;; Tests - python-lief) - (let ((target (getenv "HOST"))) - (cond ((string-suffix? "-mingw32" target) - (list ;; Native GCC 12 toolchain - gcc-toolchain-12 - zip - (make-mingw-pthreads-cross-toolchain "x86_64-w64-mingw32") - nsis-x86_64 - nss-certs - osslsigncode)) - ((string-contains target "-linux-") - (list ;; Native GCC 12 toolchain - gcc-toolchain-12 - (list gcc-toolchain-12 "static") - (make-BGL-cross-toolchain target))) - ((string-contains target "darwin") - (list ;; Native GCC 11 toolchain - gcc-toolchain-11 - clang-toolchain-18 - lld-18 - (make-lld-wrapper lld-18 #:lld-as-ld? #t) - python-signapple - zip)) - (else '()))))) diff --git a/contrib/guix/patches/binutils-unaligned-default.patch b/contrib/guix/patches/binutils-unaligned-default.patch deleted file mode 100644 index d1bc71aee1..0000000000 --- a/contrib/guix/patches/binutils-unaligned-default.patch +++ /dev/null @@ -1,22 +0,0 @@ -commit 6537181f59ed186a341db621812a6bc35e22eaf6 -Author: fanquake -Date: Wed Apr 10 12:15:52 2024 +0200 - - build: turn on -muse-unaligned-vector-move by default - - This allows us to avoid (more invasively) patching GCC, to avoid - unaligned instruction use. - -diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c -index e0632681477..14a9653abdf 100644 ---- a/gas/config/tc-i386.c -+++ b/gas/config/tc-i386.c -@@ -801,7 +801,7 @@ static unsigned int no_cond_jump_promotion = 0; - static unsigned int sse2avx; - - /* Encode aligned vector move as unaligned vector move. */ --static unsigned int use_unaligned_vector_move; -+static unsigned int use_unaligned_vector_move = 1; - - /* Encode scalar AVX instructions with specific vector length. */ - static enum diff --git a/contrib/guix/patches/elfsteem-value-error-python-39.patch b/contrib/guix/patches/elfsteem-value-error-python-39.patch deleted file mode 100644 index 21e1228afd..0000000000 --- a/contrib/guix/patches/elfsteem-value-error-python-39.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/examples/otool.py b/examples/otool.py -index 2b8efc0..d797b2e 100755 ---- a/examples/otool.py -+++ b/examples/otool.py -@@ -342,7 +342,7 @@ if __name__ == '__main__': - try: - e = macho_init.MACHO(raw, - parseSymbols = False) -- except ValueError, err: -+ except ValueError as err: - print("%s:" %file) - print(" %s" % err) - continue diff --git a/contrib/guix/patches/gcc-broken-longjmp.patch b/contrib/guix/patches/gcc-broken-longjmp.patch deleted file mode 100644 index 56568813c0..0000000000 --- a/contrib/guix/patches/gcc-broken-longjmp.patch +++ /dev/null @@ -1,70 +0,0 @@ -commit eb5698897c52702498938592d7f76e67d126451f -Author: Eric Botcazou -Date: Wed May 5 22:48:51 2021 +0200 - - Fix PR target/100402 - - This is a regression for 64-bit Windows present from mainline down to the 9 - branch and introduced by the fix for PR target/99234. Again SEH, but with - a twist related to the way MinGW implements setjmp/longjmp, which turns out - to be piggybacked on SEH with recent versions of MinGW, i.e. the longjmp - performs a bona-fide unwinding of the stack, because it calls RtlUnwindEx - with the second argument initially passed to setjmp, which is the result of - __builtin_frame_address (0) in the MinGW header file: - - define setjmp(BUF) _setjmp((BUF), __builtin_frame_address (0)) - - This means that we directly expose the frame pointer to the SEH machinery - here (unlike with regular exception handling where we use an intermediate - CFA) and thus that we cannot do whatever we want with it. The old code - would leave it unaligned, i.e. not multiple of 16, whereas the new code - aligns it, but this breaks for some reason; at least it appears that a - .seh_setframe directive with 0 as second argument always works, so the - fix aligns it this way. - - gcc/ - PR target/100402 - * config/i386/i386.c (ix86_compute_frame_layout): For a SEH target, - always return the establisher frame for __builtin_frame_address (0). - gcc/testsuite/ - * gcc.c-torture/execute/20210505-1.c: New test. - - This patch can be dropped when we are building with GCC 10.4.0 or later. - -diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c -index 2f838840e96..06ad1b2274e 100644 ---- a/gcc/config/i386/i386.c -+++ b/gcc/config/i386/i386.c -@@ -6356,12 +6356,29 @@ ix86_compute_frame_layout (void) - area, see the SEH code in config/i386/winnt.c for the rationale. */ - frame->hard_frame_pointer_offset = frame->sse_reg_save_offset; - -- /* If we can leave the frame pointer where it is, do so. Also, return -+ /* If we can leave the frame pointer where it is, do so; however return - the establisher frame for __builtin_frame_address (0) or else if the -- frame overflows the SEH maximum frame size. */ -+ frame overflows the SEH maximum frame size. -+ -+ Note that the value returned by __builtin_frame_address (0) is quite -+ constrained, because setjmp is piggybacked on the SEH machinery with -+ recent versions of MinGW: -+ -+ # elif defined(__SEH__) -+ # if defined(__aarch64__) || defined(_ARM64_) -+ # define setjmp(BUF) _setjmp((BUF), __builtin_sponentry()) -+ # elif (__MINGW_GCC_VERSION < 40702) -+ # define setjmp(BUF) _setjmp((BUF), mingw_getsp()) -+ # else -+ # define setjmp(BUF) _setjmp((BUF), __builtin_frame_address (0)) -+ # endif -+ -+ and the second argument passed to _setjmp, if not null, is forwarded -+ to the TargetFrame parameter of RtlUnwindEx by longjmp (after it has -+ built an ExceptionRecord on the fly describing the setjmp buffer). */ - const HOST_WIDE_INT diff - = frame->stack_pointer_offset - frame->hard_frame_pointer_offset; -- if (diff <= 255) -+ if (diff <= 255 && !crtl->accesses_prior_frames) - { - /* The resulting diff will be a multiple of 16 lower than 255, - i.e. at most 240 as required by the unwind data structure. */ diff --git a/contrib/guix/patches/gcc-remap-guix-store.patch b/contrib/guix/patches/gcc-remap-guix-store.patch deleted file mode 100644 index a47ef7a2df..0000000000 --- a/contrib/guix/patches/gcc-remap-guix-store.patch +++ /dev/null @@ -1,25 +0,0 @@ -From aad25427e74f387412e8bc9a9d7bbc6c496c792f Mon Sep 17 00:00:00 2001 -From: Andrew Chow -Date: Wed, 6 Jul 2022 16:49:41 -0400 -Subject: [PATCH] guix: remap guix store paths to /usr - ---- - libgcc/Makefile.in | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/libgcc/Makefile.in b/libgcc/Makefile.in -index 851e7657d07..476c2becd1c 100644 ---- a/libgcc/Makefile.in -+++ b/libgcc/Makefile.in -@@ -854,7 +854,7 @@ endif - # libgcc_eh.a, only LIB2ADDEH matters. If we do, only LIB2ADDEHSTATIC and - # LIB2ADDEHSHARED matter. (Usually all three are identical.) - --c_flags := -fexceptions -+c_flags := -fexceptions $(shell find /gnu/store -maxdepth 1 -mindepth 1 -type d -exec echo -n " -ffile-prefix-map={}=/usr" \;) - - ifeq ($(enable_shared),yes) - --- -2.37.0 - diff --git a/contrib/guix/patches/glibc-guix-prefix.patch b/contrib/guix/patches/glibc-guix-prefix.patch deleted file mode 100644 index 60e12ca525..0000000000 --- a/contrib/guix/patches/glibc-guix-prefix.patch +++ /dev/null @@ -1,16 +0,0 @@ -Without ffile-prefix-map, the debug symbols will contain paths for the -guix store which will include the hashes of each package. However, the -hash for the same package will differ when on different architectures. -In order to be reproducible regardless of the architecture used to build -the package, map all guix store prefixes to something fixed, e.g. /usr. - ---- a/Makeconfig -+++ b/Makeconfig -@@ -1007,6 +1007,7 @@ object-suffixes := - CPPFLAGS-.o = $(pic-default) - # libc.a must be compiled with -fPIE/-fpie for static PIE. - CFLAGS-.o = $(filter %frame-pointer,$(+cflags)) $(pie-default) -+CFLAGS-.o += `find /gnu/store -maxdepth 1 -mindepth 1 -type d -exec echo -n " -ffile-prefix-map={}=/usr" \;` - libtype.o := lib%.a - object-suffixes += .o - ifeq (yes,$(build-shared)) diff --git a/contrib/guix/patches/nsis-disable-installer-reloc.patch b/contrib/guix/patches/nsis-disable-installer-reloc.patch deleted file mode 100644 index 4914527e56..0000000000 --- a/contrib/guix/patches/nsis-disable-installer-reloc.patch +++ /dev/null @@ -1,30 +0,0 @@ -Patch NSIS so that it's installer stubs, produced at NSIS build time, -do not contain .reloc sections, which will exist by default when using -binutils/ld 2.36+. - -This ultimately fixes an issue when running the installer with the -"Force randomization for images (Mandatory ASLR)" setting active. - -This patch has not yet been sent upstream, because it's not clear if this -is the best fix, for the underlying issue, which seems to be that makensis -doesn't account for .reloc sections when it builds installers. - -The existence of a reloc section shouldn't be a problem, and, if anything, -is actually a requirement for working ASLR. All other Windows binaries we -produce contain them, and function correctly when under the same -"Force randomization for images (Mandatory ASLR)" setting. - -See: -https://github.com/bitcoin/bitcoin/issues/25726 -https://sourceforge.net/p/nsis/bugs/1131/ - ---- a/SCons/Config/gnu -+++ b/SCons/Config/gnu -@@ -102,6 +102,7 @@ stub_env.Append(LINKFLAGS = ['-mwindows']) # build windows executables - stub_env.Append(LINKFLAGS = ['$NODEFLIBS_FLAG']) # no standard libraries - stub_env.Append(LINKFLAGS = ['$ALIGN_FLAG']) # 512 bytes align - stub_env.Append(LINKFLAGS = ['$MAP_FLAG']) # generate map file -+stub_env.Append(LINKFLAGS = ['-Wl,--disable-reloc-section']) - - conf = FlagsConfigure(stub_env) - conf.CheckCompileFlag('-fno-tree-loop-distribute-patterns') # GCC 10: Don't generate msvcrt!memmove calls (bug #1248) diff --git a/contrib/guix/patches/oscrypto-hard-code-openssl.patch b/contrib/guix/patches/oscrypto-hard-code-openssl.patch deleted file mode 100644 index 32027f2d09..0000000000 --- a/contrib/guix/patches/oscrypto-hard-code-openssl.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/oscrypto/__init__.py b/oscrypto/__init__.py -index eb27313..371ab24 100644 ---- a/oscrypto/__init__.py -+++ b/oscrypto/__init__.py -@@ -302,3 +302,8 @@ def load_order(): - 'oscrypto._win.tls', - 'oscrypto.tls', - ] -+ -+ -+paths = '@GUIX_OSCRYPTO_USE_OPENSSL@'.split(',') -+assert len(paths) == 2, 'Value for OSCRYPTO_USE_OPENSSL env var must be two paths separated by a comma' -+use_openssl(*paths) diff --git a/contrib/init/BGLd.conf b/contrib/init/BGLd.conf deleted file mode 100644 index d13560cefb..0000000000 --- a/contrib/init/BGLd.conf +++ /dev/null @@ -1,65 +0,0 @@ -description "BGL Core Daemon" - -start on runlevel [2345] -stop on starting rc RUNLEVEL=[016] - -env BGLD_BIN="/usr/bin/BGLd" -env BGLD_USER="BGL" -env BGLD_GROUP="BGL" -env BGLD_PIDDIR="/var/run/BGLd" -# upstart can't handle variables constructed with other variables -env BGLD_PIDFILE="/var/run/BGLd/BGLd.pid" -env BGLD_CONFIGFILE="/etc/BGL/BGL.conf" -env BGLD_DATADIR="/var/lib/BGLd" - -expect fork - -respawn -respawn limit 5 120 -kill timeout 600 - -pre-start script - # this will catch non-existent config files - # BGLd will check and exit with this very warning, but it can do so - # long after forking, leaving upstart to think everything started fine. - # since this is a commonly encountered case on install, just check and - # warn here. - if ! grep -qs '^rpcpassword=' "$BGLD_CONFIGFILE" ; then - echo "ERROR: You must set a secure rpcpassword to run BGLd." - echo "The setting must appear in $BGLD_CONFIGFILE" - echo - echo "This password is security critical to securing wallets " - echo "and must not be the same as the rpcuser setting." - echo "You can generate a suitable random password using the following " - echo "command from the shell:" - echo - echo "bash -c 'tr -dc a-zA-Z0-9 < /dev/urandom | head -c32 && echo'" - echo - echo "It is recommended that you also set alertnotify so you are " - echo "notified of problems:" - echo - echo "ie: alertnotify=echo %%s | mail -s \"BGL Alert\"" \ - "admin@foo.com" - echo - exit 1 - fi - - mkdir -p "$BGLD_PIDDIR" - chmod 0755 "$BGLD_PIDDIR" - chown $BGLD_USER:$BGLD_GROUP "$BGLD_PIDDIR" - chown $BGLD_USER:$BGLD_GROUP "$BGLD_CONFIGFILE" - chmod 0660 "$BGLD_CONFIGFILE" -end script - -exec start-stop-daemon \ - --start \ - --pidfile "$BGLD_PIDFILE" \ - --chuid $BGLD_USER:$BGLD_GROUP \ - --exec "$BGLD_BIN" \ - -- \ - -pid="$BGLD_PIDFILE" \ - -conf="$BGLD_CONFIGFILE" \ - -datadir="$BGLD_DATADIR" \ - -disablewallet \ - -daemon - diff --git a/contrib/init/BGLd.init b/contrib/init/BGLd.init deleted file mode 100644 index 41004e4d99..0000000000 --- a/contrib/init/BGLd.init +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env bash -# -# BGLd The BGL core server. -# -# -# chkconfig: 345 80 20 -# description: BGLd -# processname: BGLd -# - -# Source function library. -. /etc/init.d/functions - -# you can override defaults in /etc/sysconfig/BGLd, see below -if [ -f /etc/sysconfig/BGLd ]; then - . /etc/sysconfig/BGLd -fi - -RETVAL=0 - -prog=BGLd -# you can override the lockfile via BGLD_LOCKFILE in /etc/sysconfig/BGLd -lockfile=${BGLD_LOCKFILE-/var/lock/subsys/BGLd} - -# BGLd defaults to /usr/bin/BGLd, override with BGLD_BIN -BGLd=${BGLD_BIN-/usr/bin/BGLd} - -# BGLd opts default to -disablewallet, override with BGLD_OPTS -BGLd_opts=${BGLD_OPTS--disablewallet} - -start() { - echo -n $"Starting $prog: " - daemon $DAEMONOPTS $BGLd $BGLd_opts - RETVAL=$? - echo - [ $RETVAL -eq 0 ] && touch $lockfile - return $RETVAL -} - -stop() { - echo -n $"Stopping $prog: " - killproc $prog -t600 - RETVAL=$? - echo - [ $RETVAL -eq 0 ] && rm -f $lockfile - return $RETVAL -} - -case "$1" in - start) - start - ;; - stop) - stop - ;; - status) - status $prog - ;; - restart) - stop - start - ;; - *) - echo "Usage: service $prog {start|stop|status|restart}" - exit 1 - ;; -esac diff --git a/contrib/init/BGLd.openrc b/contrib/init/BGLd.openrc deleted file mode 100644 index e6f0381795..0000000000 --- a/contrib/init/BGLd.openrc +++ /dev/null @@ -1,92 +0,0 @@ -#!/sbin/openrc-run - -# backward compatibility for existing gentoo layout -# -if [ -d "/var/lib/BGL/.BGL" ]; then - BGLD_DEFAULT_DATADIR="/var/lib/BGL/.BGL" -else - BGLD_DEFAULT_DATADIR="/var/lib/BGLd" -fi - -BGLD_CONFIGFILE=${BGLD_CONFIGFILE:-/etc/BGL/BGL.conf} -BGLD_PIDDIR=${BGLD_PIDDIR:-/var/run/BGLd} -BGLD_PIDFILE=${BGLD_PIDFILE:-${BGLD_PIDDIR}/BGLd.pid} -BGLD_DATADIR=${BGLD_DATADIR:-${BGLD_DEFAULT_DATADIR}} -BGLD_USER=${BGLD_USER:-${BGL_USER:-BGL}} -BGLD_GROUP=${BGLD_GROUP:-BGL} -BGLD_BIN=${BGLD_BIN:-/usr/bin/BGLd} -BGLD_NICE=${BGLD_NICE:-${NICELEVEL:-0}} -BGLD_OPTS="${BGLD_OPTS:-${BGL_OPTS}}" - -name="BGL Core Daemon" -description="BGL cryptocurrency P2P network daemon" - -command="/usr/bin/BGLd" -command_args="-pid=\"${BGLD_PIDFILE}\" \ - -conf=\"${BGLD_CONFIGFILE}\" \ - -datadir=\"${BGLD_DATADIR}\" \ - -daemon \ - ${BGLD_OPTS}" - -required_files="${BGLD_CONFIGFILE}" -start_stop_daemon_args="-u ${BGLD_USER} \ - -N ${BGLD_NICE} -w 2000" -pidfile="${BGLD_PIDFILE}" - -# The retry schedule to use when stopping the daemon. Could be either -# a timeout in seconds or multiple signal/timeout pairs (like -# "SIGKILL/180 SIGTERM/300") -retry="${BGLD_SIGTERM_TIMEOUT}" - -depend() { - need localmount net -} - -# verify -# 1) that the datadir exists and is writable (or create it) -# 2) that a directory for the pid exists and is writable -# 3) ownership and permissions on the config file -start_pre() { - checkpath \ - -d \ - --mode 0750 \ - --owner "${BGLD_USER}:${BGLD_GROUP}" \ - "${BGLD_DATADIR}" - - checkpath \ - -d \ - --mode 0755 \ - --owner "${BGLD_USER}:${BGLD_GROUP}" \ - "${BGLD_PIDDIR}" - - checkpath -f \ - -o ${BGLD_USER}:${BGLD_GROUP} \ - -m 0660 \ - ${BGLD_CONFIGFILE} - - checkconfig || return 1 -} - -checkconfig() -{ - if ! grep -qs '^rpcpassword=' "${BGLD_CONFIGFILE}" ; then - eerror "" - eerror "ERROR: You must set a secure rpcpassword to run BGLd." - eerror "The setting must appear in ${BGLD_CONFIGFILE}" - eerror "" - eerror "This password is security critical to securing wallets " - eerror "and must not be the same as the rpcuser setting." - eerror "You can generate a suitable random password using the following " - eerror "command from the shell:" - eerror "" - eerror "bash -c 'tr -dc a-zA-Z0-9 < /dev/urandom | head -c32 && echo'" - eerror "" - eerror "It is recommended that you also set alertnotify so you are " - eerror "notified of problems:" - eerror "" - eerror "ie: alertnotify=echo %%s | mail -s \"BGL Alert\"" \ - "admin@foo.com" - eerror "" - return 1 - fi -} diff --git a/contrib/init/BGLd.openrcconf b/contrib/init/BGLd.openrcconf deleted file mode 100644 index 24aa3bddaa..0000000000 --- a/contrib/init/BGLd.openrcconf +++ /dev/null @@ -1,33 +0,0 @@ -# /etc/conf.d/BGLd: config file for /etc/init.d/BGLd - -# Config file location -#BGLD_CONFIGFILE="/etc/BGL/BGL.conf" - -# What directory to write pidfile to? (created and owned by $BGLD_USER) -#BGLD_PIDDIR="/var/run/BGLd" - -# What filename to give the pidfile -#BGLD_PIDFILE="${BGLD_PIDDIR}/BGLd.pid" - -# Where to write BGLd data (be mindful that the blockchain is large) -#BGLD_DATADIR="/var/lib/BGLd" - -# User and group to own BGLd process -#BGLD_USER="BGL" -#BGLD_GROUP="BGL" - -# Path to BGLd executable -#BGLD_BIN="/usr/bin/BGLd" - -# Nice value to run BGLd under -#BGLD_NICE=0 - -# Additional options (avoid -conf and -datadir, use flags above) -#BGLD_OPTS="" - -# The timeout in seconds OpenRC will wait for BGLd to terminate -# after a SIGTERM has been raised. -# Note that this will be mapped as argument to start-stop-daemon's -# '--retry' option, which means you can specify a retry schedule -# here. For more information see man 8 start-stop-daemon. -BGLD_SIGTERM_TIMEOUT=600 diff --git a/contrib/init/BGLd.service b/contrib/init/BGLd.service deleted file mode 100644 index 467044ea36..0000000000 --- a/contrib/init/BGLd.service +++ /dev/null @@ -1,85 +0,0 @@ -# It is not recommended to modify this file in-place, because it will -# be overwritten during package upgrades. If you want to add further -# options or overwrite existing ones then use -# $ systemctl edit BGLd.service -# See "man systemd.service" for details. - -# Note that almost all daemon options could be specified in -# /etc/BGL/BGL.conf, but keep in mind those explicitly -# specified as arguments in ExecStart= will override those in the -# config file. - -[Unit] -Description=BGL daemon -Documentation=https://github.com/BitgesellOfficial/bitgesell/blob/master/doc/init.md - -# https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/ -After=network-online.target -Wants=network-online.target - -[Service] -ExecStart=/usr/bin/BGLd -pid=/run/BGLd/BGLd.pid \ - -conf=/etc/BGL/BGL.conf \ - -datadir=/var/lib/BGLd \ - -startupnotify='systemd-notify --ready' \ - -shutdownnotify='systemd-notify --stopping' - -# Make sure the config directory is readable by the service user -PermissionsStartOnly=true -ExecStartPre=/bin/chgrp BGL /etc/BGL - -# Process management -#################### - -Type=notify -NotifyAccess=all -PIDFile=/run/BGLd/BGLd.pid - -Restart=on-failure -TimeoutStartSec=infinity -TimeoutStopSec=600 - -# Directory creation and permissions -#################################### - -# Run as BGL:BGL -User=BGL -Group=BGL - -# /run/BGLd -RuntimeDirectory=BGLd -RuntimeDirectoryMode=0710 - -# /etc/BGL -ConfigurationDirectory=BGL -ConfigurationDirectoryMode=0710 - -# /var/lib/BGLd -StateDirectory=BGLd -StateDirectoryMode=0710 - -# Hardening measures -#################### - -# Provide a private /tmp and /var/tmp. -PrivateTmp=true - -# Mount /usr, /boot/ and /etc read-only for the process. -ProtectSystem=full - -# Deny access to /home, /root and /run/user -ProtectHome=true - -# Disallow the process and all of its children to gain -# new privileges through execve(). -NoNewPrivileges=true - -# Use a new /dev namespace only populated with API pseudo devices -# such as /dev/null, /dev/zero and /dev/random. -PrivateDevices=true - -# Deny the creation of writable and executable memory mappings. -MemoryDenyWriteExecute=true - -[Install] -WantedBy=multi-user.target diff --git a/contrib/init/README.md b/contrib/init/README.md deleted file mode 100644 index ed15856c54..0000000000 --- a/contrib/init/README.md +++ /dev/null @@ -1,12 +0,0 @@ -Sample configuration files for: -``` -SystemD: BGLd.service -Upstart: BGLd.conf -OpenRC: BGLd.openrc - BGLd.openrcconf -CentOS: BGLd.init -macOS: org.BGL.BGLd.plist -``` -have been made available to assist packagers in creating node packages here. - -See [doc/init.md](../../doc/init.md) for more information. diff --git a/contrib/linearize/README.md b/contrib/linearize/README.md deleted file mode 100644 index fe12e1dc04..0000000000 --- a/contrib/linearize/README.md +++ /dev/null @@ -1,54 +0,0 @@ -# Linearize -Construct a linear, no-fork, best version of the BGL blockchain. - -## Step 1: Download hash list - - $ ./linearize-hashes.py linearize.cfg > hashlist.txt - -Required configuration file settings for linearize-hashes: -* RPC: `datadir` (Required if `rpcuser` and `rpcpassword` are not specified) -* RPC: `rpcuser`, `rpcpassword` (Required if `datadir` is not specified) - -Optional config file setting for linearize-hashes: -* RPC: `host` (Default: `127.0.0.1`) -* RPC: `port` (Default: `8332`) -* Blockchain: `min_height`, `max_height` -* `rev_hash_bytes`: If true, the written block hash list will be -byte-reversed. (In other words, the hash returned by getblockhash will have its -bytes reversed.) False by default. Intended for generation of -standalone hash lists but safe to use with linearize-data.py, which will output -the same data no matter which byte format is chosen. - -The `linearize-hashes` script requires a connection, local or remote, to a -JSON-RPC server. Running `BGLd` or `BGL-qt -server` will be sufficient. - -## Step 2: Copy local block data - - $ ./linearize-data.py linearize.cfg - -Required configuration file settings: -* `output_file`: The file that will contain the final blockchain. - or -* `output`: Output directory for linearized `blocks/blkNNNNN.dat` output. - -Optional config file setting for linearize-data: -* `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`: BGLd blocks/ directory containing blkNNNNN.dat -* `hashlist`: text file containing list of block hashes created by -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 sought 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. -* `split_timestamp`: Split blockchain files when a new month is first seen, in -addition to reaching a maximum file size (`max_out_sz`). diff --git a/contrib/linearize/example-linearize.cfg b/contrib/linearize/example-linearize.cfg deleted file mode 100644 index 9df2763a4c..0000000000 --- a/contrib/linearize/example-linearize.cfg +++ /dev/null @@ -1,58 +0,0 @@ -# BGLd RPC settings (linearize-hashes) -rpcuser=someuser -rpcpassword=somepassword -#datadir=~/.BGL -host=127.0.0.1 - -#mainnet default -port=8332 - -#testnet default -#port=18332 - -#regtest default -#port=18443 - -#signet default -#port=38332 - -# bootstrap.dat hashlist settings (linearize-hashes) -max_height=313000 - -# bootstrap.dat input/output settings (linearize-data) - -# mainnet -netmagic=f9beb4d9 -genesis=000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f -input=/home/example/.BGL/blocks - -# testnet -#netmagic=0b110907 -#genesis=000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943 -#input=/home/example/.BGL/testnet3/blocks - -# signet -#netmagic=0a03cf40 -#genesis=00000008819873e925422c1ff0f99f7cc9bbb232af63a077a480a3633bee1ef6 -#input=/home/example/.bitcoin/signet/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 - -# 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 deleted file mode 100755 index b7cd28b1ee..0000000000 --- a/contrib/linearize/linearize-data.py +++ /dev/null @@ -1,283 +0,0 @@ -#!/usr/bin/env python3 -# -# linearize-data.py: Construct a linear, no-fork version of the chain. -# -# Copyright (c) 2013-2022 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 struct -import re -import os -import os.path -import sha3 -import sys -import hashlib -import datetime -import time -from collections import namedtuple - -settings = {} - -def calc_hash_str(blk_hdr): - blk_hdr_hash = sha3.keccak_256() - blk_hdr_hash.update(blk_hdr) - return blk_hdr_hash.digest()[::-1].hex() - -def get_blk_dt(blk_hdr): - members = struct.unpack(" self.maxOutSz): - 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 - self.outsz = 0 - - (blkDate, blkTS) = get_blk_dt(blk_hdr) - if self.timestampSplit and (blkDate > self.lastDate): - 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 - self.outsz = 0 - - if not self.outF: - if self.fileOutput: - self.outFname = self.settings['output_file'] - else: - 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) - self.outF.write(rawblock) - self.outsz = self.outsz + len(inhdr) + len(blk_hdr) + len(rawblock) - - self.blkCountOut = self.blkCountOut + 1 - if blkTS > self.highTS: - self.highTS = blkTS - - if (self.blkCountOut % 1000) == 0: - print('%i blocks scanned, %i blocks written (of %i, %.1f%% complete)' % - (self.blkCountIn, self.blkCountOut, len(self.blkindex), 100.0 * self.blkCountOut / len(self.blkindex))) - - def inFileName(self, fn): - return os.path.join(self.settings['input'], "blk%05d.dat" % fn) - - def fetchBlock(self, extent): - '''Fetch block contents from disk given extents''' - with open(self.inFileName(extent.fn), "rb") as f: - f.seek(extent.offset) - return f.read(extent.size) - - def copyOneBlock(self): - '''Find the next block to be written in the input, and copy it to the output.''' - extent = self.blockExtents.pop(self.blkCountOut) - if self.blkCountOut in self.outOfOrderData: - # If the data is cached, use it from memory and remove from the cache - rawblock = self.outOfOrderData.pop(self.blkCountOut) - self.outOfOrderSize -= len(rawblock) - else: # Otherwise look up data on disk - rawblock = self.fetchBlock(extent) - - self.writeBlock(extent.inhdr, extent.blkhdr, rawblock) - - def run(self): - while self.blkCountOut < len(self.blkindex): - if not self.inF: - fname = self.inFileName(self.inFn) - print("Input file " + fname) - try: - self.inF = open(fname, "rb") - except IOError: - print("Premature end of block data") - return - - inhdr = self.inF.read(8) - if (not inhdr or (inhdr[0] == "\0")): - self.inF.close() - self.inF = None - self.inFn = self.inFn + 1 - continue - - inMagic = inhdr[:4] - if (inMagic != self.settings['netmagic']): - # Seek backwards 7 bytes (skipping the first byte in the previous search) - # and continue searching from the new position if the magic bytes are not - # found. - self.inF.seek(-7, os.SEEK_CUR) - continue - inLenLE = inhdr[4:] - su = struct.unpack(" - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/contrib/macdeploy/README.md b/contrib/macdeploy/README.md deleted file mode 100644 index c5619d10dc..0000000000 --- a/contrib/macdeploy/README.md +++ /dev/null @@ -1,77 +0,0 @@ -# MacOS Deployment - -The `macdeployqtplus` script should not be run manually. Instead, after building as usual: - -```bash -make deploy -``` - -When complete, it will have produced `Bitgesell-Core.zip`. - -## SDK Extraction - -### Step 1: Obtaining `Xcode.app` - -A free Apple Developer Account is required to proceed. - -Our macOS SDK can be extracted from -[Xcode_15.xip](https://download.developer.apple.com/Developer_Tools/Xcode_15/Xcode_15.xip). - -Alternatively, after logging in to your account go to 'Downloads', then 'More' -and search for [`Xcode 15`](https://developer.apple.com/download/all/?q=Xcode%2015). - -An Apple ID and cookies enabled for the hostname are needed to download this. - -The `sha256sum` of the downloaded XIP archive should be `4daaed2ef2253c9661779fa40bfff50655dc7ec45801aba5a39653e7bcdde48e`. - -To extract the `.xip` on Linux: - -```bash -# Install/clone tools needed for extracting Xcode.app -apt install cpio -git clone https://github.com/bitcoin-core/apple-sdk-tools.git - -# Unpack the .xip and place the resulting Xcode.app in your current -# working directory -python3 apple-sdk-tools/extract_xcode.py -f Xcode_15.xip | cpio -d -i -``` - -On macOS: - -```bash -xip -x Xcode_15.xip -``` - -### Step 2: Generating the SDK tarball from `Xcode.app` - -To generate the SDK, run the script [`gen-sdk`](./gen-sdk) with the -path to `Xcode.app` (extracted in the previous stage) as the first argument. - -```bash -./contrib/macdeploy/gen-sdk '/path/to/Xcode.app' -``` - -The generated archive should be: `Xcode-15.0-15A240d-extracted-SDK-with-libcxx-headers.tar.gz`. -The `sha256sum` should be `c0c2e7bb92c1fee0c4e9f3a485e4530786732d6c6dd9e9f418c282aa6892f55d`. - -## Deterministic macOS App Notes - -macOS Applications are created on Linux using a recent LLVM. - -All builds must target an Apple SDK. These SDKs are free to download, but not redistributable. -See the SDK Extraction notes above for how to obtain it. - -The Guix build process has been designed to avoid including the SDK's files in Guix's outputs. -All interim tarballs are fully deterministic and may be freely redistributed. - -Using an Apple-blessed key to sign binaries is a requirement to produce (distributable) macOS -binaries. Because this private key cannot be shared, we'll have to be a bit creative in order -for the build process to remain somewhat deterministic. Here's how it works: - -- Builders use Guix to create an unsigned release. This outputs an unsigned ZIP which - users may choose to bless, self-codesign, and run. It also outputs an unsigned app structure - in the form of a tarball. -- The Apple keyholder uses this unsigned app to create a detached signature, using the - included script. Detached signatures are available from this [repository](https://github.com/bitcoin-core/bitcoin-detached-sigs). -- Builders feed the unsigned app + detached signature back into Guix, which combines the - pieces into a deterministic ZIP. diff --git a/contrib/macdeploy/detached-sig-create.sh b/contrib/macdeploy/detached-sig-create.sh deleted file mode 100755 index f96be2c27d..0000000000 --- a/contrib/macdeploy/detached-sig-create.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/sh -# Copyright (c) 2014-2022 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -export LC_ALL=C -set -e - -ROOTDIR=dist -BUNDLE="${ROOTDIR}/BGL-Qt.app" -BINARY="${BUNDLE}/Contents/MacOS/BGL-Qt" -SIGNAPPLE=signapple -TEMPDIR=sign.temp -ARCH=$(${SIGNAPPLE} info ${BINARY} | head -n 1 | cut -d " " -f 1) -OUT="signature-osx-${ARCH}.tar.gz" -OUTROOT=osx/dist - -if [ -z "$1" ]; then - echo "usage: $0 " - echo "example: $0 " - exit 1 -fi - -rm -rf ${TEMPDIR} -mkdir -p ${TEMPDIR} - -${SIGNAPPLE} sign -f --detach "${TEMPDIR}/${OUTROOT}" "$@" "${BUNDLE}" --hardened-runtime - -tar -C "${TEMPDIR}" -czf "${OUT}" . -rm -rf "${TEMPDIR}" -echo "Created ${OUT}" diff --git a/contrib/macdeploy/gen-sdk b/contrib/macdeploy/gen-sdk deleted file mode 100755 index 86a6262b5c..0000000000 --- a/contrib/macdeploy/gen-sdk +++ /dev/null @@ -1,96 +0,0 @@ -#!/usr/bin/env python3 -import argparse -import plistlib -import pathlib -import sys -import tarfile -import gzip -import os -import contextlib - -@contextlib.contextmanager -def cd(path): - """Context manager that restores PWD even if an exception was raised.""" - old_pwd = os.getcwd() - os.chdir(str(path)) - try: - yield - finally: - os.chdir(old_pwd) - -def run(): - parser = argparse.ArgumentParser( - description=__doc__, formatter_class=argparse.RawTextHelpFormatter) - - parser.add_argument('xcode_app', metavar='XCODEAPP', nargs=1) - parser.add_argument("-o", metavar='OUTSDKTGZ', nargs=1, dest='out_sdktgz', required=False) - - args = parser.parse_args() - - xcode_app = pathlib.Path(args.xcode_app[0]).resolve() - assert xcode_app.is_dir(), "The supplied Xcode.app path '{}' either does not exist or is not a directory".format(xcode_app) - - xcode_app_plist = xcode_app.joinpath("Contents/version.plist") - with xcode_app_plist.open('rb') as fp: - pl = plistlib.load(fp) - xcode_version = pl['CFBundleShortVersionString'] - xcode_build_id = pl['ProductBuildVersion'] - print("Found Xcode (version: {xcode_version}, build id: {xcode_build_id})".format(xcode_version=xcode_version, xcode_build_id=xcode_build_id)) - - sdk_dir = xcode_app.joinpath("Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk") - sdk_plist = sdk_dir.joinpath("System/Library/CoreServices/SystemVersion.plist") - with sdk_plist.open('rb') as fp: - pl = plistlib.load(fp) - sdk_version = pl['ProductVersion'] - sdk_build_id = pl['ProductBuildVersion'] - print("Found MacOSX SDK (version: {sdk_version}, build id: {sdk_build_id})".format(sdk_version=sdk_version, sdk_build_id=sdk_build_id)) - - out_name = "Xcode-{xcode_version}-{xcode_build_id}-extracted-SDK-with-libcxx-headers".format(xcode_version=xcode_version, xcode_build_id=xcode_build_id) - - if args.out_sdktgz: - out_sdktgz_path = pathlib.Path(args.out_sdktgz_path) - else: - # Construct our own out_sdktgz if not specified on the command line - out_sdktgz_path = pathlib.Path("./{}.tar.gz".format(out_name)) - - def tarfp_add_with_base_change(tarfp, dir_to_add, alt_base_dir): - """Add all files in dir_to_add to tarfp, but prepent alt_base_dir to the files' - names - - e.g. if the only file under /root/bazdir is /root/bazdir/qux, invoking: - - tarfp_add_with_base_change(tarfp, "foo/bar", "/root/bazdir") - - would result in the following members being added to tarfp: - - foo/bar/ -> corresponding to /root/bazdir - foo/bar/qux -> corresponding to /root/bazdir/qux - - """ - def change_tarinfo_base(tarinfo): - if tarinfo.name and tarinfo.name.startswith("./"): - tarinfo.name = str(pathlib.Path(alt_base_dir, tarinfo.name)) - if tarinfo.linkname and tarinfo.linkname.startswith("./"): - tarinfo.linkname = str(pathlib.Path(alt_base_dir, tarinfo.linkname)) - # make metadata deterministic - tarinfo.mtime = 0 - tarinfo.uid, tarinfo.uname = 0, '' - tarinfo.gid, tarinfo.gname = 0, '' - # don't use isdir() as there are also executable files present - tarinfo.mode = 0o0755 if tarinfo.mode & 0o0100 else 0o0644 - return tarinfo - with cd(dir_to_add): - # recursion already adds entries in sorted order - tarfp.add(".", recursive=True, filter=change_tarinfo_base) - - print("Creating output .tar.gz file...") - with out_sdktgz_path.open("wb") as fp: - with gzip.GzipFile(fileobj=fp, mode='wb', compresslevel=9, mtime=0) as gzf: - with tarfile.open(mode="w", fileobj=gzf, format=tarfile.GNU_FORMAT) as tarfp: - print("Adding MacOSX SDK {} files...".format(sdk_version)) - tarfp_add_with_base_change(tarfp, sdk_dir, out_name) - print("Done! Find the resulting gzipped tarball at:") - print(out_sdktgz_path.resolve()) - -if __name__ == '__main__': - run() diff --git a/contrib/macdeploy/macdeployqtplus b/contrib/macdeploy/macdeployqtplus deleted file mode 100755 index e6b146f41f..0000000000 --- a/contrib/macdeploy/macdeployqtplus +++ /dev/null @@ -1,507 +0,0 @@ -#!/usr/bin/env python3 -# -# Copyright (C) 2011 Patrick "p2k" Schneider -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# - -import sys, re, os, platform, shutil, stat, subprocess, os.path -from argparse import ArgumentParser -from pathlib import Path -from subprocess import PIPE, run -from typing import Optional - -# This is ported from the original macdeployqt with modifications - -class FrameworkInfo(object): - def __init__(self): - self.frameworkDirectory = "" - self.frameworkName = "" - self.frameworkPath = "" - self.binaryDirectory = "" - self.binaryName = "" - self.binaryPath = "" - self.version = "" - self.installName = "" - self.deployedInstallName = "" - self.sourceFilePath = "" - self.destinationDirectory = "" - self.sourceResourcesDirectory = "" - self.sourceVersionContentsDirectory = "" - self.sourceContentsDirectory = "" - self.destinationResourcesDirectory = "" - self.destinationVersionContentsDirectory = "" - - def __eq__(self, other): - if self.__class__ == other.__class__: - return self.__dict__ == other.__dict__ - else: - return False - - def __str__(self): - return f""" Framework name: {self.frameworkName} - Framework directory: {self.frameworkDirectory} - Framework path: {self.frameworkPath} - Binary name: {self.binaryName} - Binary directory: {self.binaryDirectory} - Binary path: {self.binaryPath} - Version: {self.version} - Install name: {self.installName} - Deployed install name: {self.deployedInstallName} - Source file Path: {self.sourceFilePath} - Deployed Directory (relative to bundle): {self.destinationDirectory} -""" - - def isDylib(self): - return self.frameworkName.endswith(".dylib") - - def isQtFramework(self): - if self.isDylib(): - return self.frameworkName.startswith("libQt") - else: - return self.frameworkName.startswith("Qt") - - reOLine = re.compile(r'^(.+) \(compatibility version [0-9.]+, current version [0-9.]+\)$') - bundleFrameworkDirectory = "Contents/Frameworks" - bundleBinaryDirectory = "Contents/MacOS" - - @classmethod - def fromLibraryLine(cls, line: str) -> Optional['FrameworkInfo']: - # Note: line must be trimmed - if line == "": - return None - - # Don't deploy system libraries - if line.startswith("/System/Library/") or line.startswith("@executable_path") or line.startswith("/usr/lib/"): - return None - - m = cls.reOLine.match(line) - if m is None: - raise RuntimeError(f"Line could not be parsed: {line}") - - path = m.group(1) - - info = cls() - info.sourceFilePath = path - info.installName = path - - if path.endswith(".dylib"): - dirname, filename = os.path.split(path) - info.frameworkName = filename - info.frameworkDirectory = dirname - info.frameworkPath = path - - info.binaryDirectory = dirname - info.binaryName = filename - info.binaryPath = path - info.version = "-" - - info.installName = path - info.deployedInstallName = f"@executable_path/../Frameworks/{info.binaryName}" - info.sourceFilePath = path - info.destinationDirectory = cls.bundleFrameworkDirectory - else: - parts = path.split("/") - i = 0 - # Search for the .framework directory - for part in parts: - if part.endswith(".framework"): - break - i += 1 - if i == len(parts): - raise RuntimeError(f"Could not find .framework or .dylib in line: {line}") - - info.frameworkName = parts[i] - info.frameworkDirectory = "/".join(parts[:i]) - info.frameworkPath = os.path.join(info.frameworkDirectory, info.frameworkName) - - info.binaryName = parts[i+3] - info.binaryDirectory = "/".join(parts[i+1:i+3]) - info.binaryPath = os.path.join(info.binaryDirectory, info.binaryName) - info.version = parts[i+2] - - info.deployedInstallName = f"@executable_path/../Frameworks/{os.path.join(info.frameworkName, info.binaryPath)}" - info.destinationDirectory = os.path.join(cls.bundleFrameworkDirectory, info.frameworkName, info.binaryDirectory) - - info.sourceResourcesDirectory = os.path.join(info.frameworkPath, "Resources") - info.sourceContentsDirectory = os.path.join(info.frameworkPath, "Contents") - info.sourceVersionContentsDirectory = os.path.join(info.frameworkPath, "Versions", info.version, "Contents") - info.destinationResourcesDirectory = os.path.join(cls.bundleFrameworkDirectory, info.frameworkName, "Resources") - info.destinationVersionContentsDirectory = os.path.join(cls.bundleFrameworkDirectory, info.frameworkName, "Versions", info.version, "Contents") - - return info - -class ApplicationBundleInfo(object): - def __init__(self, path: str): - self.path = path - # for backwards compatibility reasons, this must remain as BGL-Qt - self.binaryPath = os.path.join(path, "Contents", "MacOS", "BGL-Qt") - if not os.path.exists(self.binaryPath): - raise RuntimeError(f"Could not find bundle binary for {path}") - self.resourcesPath = os.path.join(path, "Contents", "Resources") - self.pluginPath = os.path.join(path, "Contents", "PlugIns") - -class DeploymentInfo(object): - def __init__(self): - self.qtPath = None - self.pluginPath = None - self.deployedFrameworks = [] - - def detectQtPath(self, frameworkDirectory: str): - parentDir = os.path.dirname(frameworkDirectory) - if os.path.exists(os.path.join(parentDir, "translations")): - # Classic layout, e.g. "/usr/local/Trolltech/Qt-4.x.x" - self.qtPath = parentDir - else: - self.qtPath = os.getenv("QTDIR", None) - - if self.qtPath is not None: - pluginPath = os.path.join(self.qtPath, "plugins") - if os.path.exists(pluginPath): - self.pluginPath = pluginPath - - def usesFramework(self, name: str) -> bool: - for framework in self.deployedFrameworks: - if framework.endswith(".framework"): - if framework.startswith(f"{name}."): - return True - elif framework.endswith(".dylib"): - if framework.startswith(f"lib{name}."): - return True - return False - -def getFrameworks(binaryPath: str, verbose: int) -> list[FrameworkInfo]: - objdump = os.getenv("OBJDUMP", "objdump") - if verbose: - print(f"Inspecting with {objdump}: {binaryPath}") - output = run([objdump, "--macho", "--dylibs-used", binaryPath], stdout=PIPE, stderr=PIPE, text=True) - if output.returncode != 0: - sys.stderr.write(output.stderr) - sys.stderr.flush() - raise RuntimeError(f"{objdump} failed with return code {output.returncode}") - - lines = output.stdout.split("\n") - lines.pop(0) # First line is the inspected binary - if ".framework" in binaryPath or binaryPath.endswith(".dylib"): - lines.pop(0) # Frameworks and dylibs list themselves as a dependency. - - libraries = [] - for line in lines: - line = line.replace("@loader_path", os.path.dirname(binaryPath)) - info = FrameworkInfo.fromLibraryLine(line.strip()) - if info is not None: - if verbose: - print("Found framework:") - print(info) - libraries.append(info) - - return libraries - -def runInstallNameTool(action: str, *args): - installnametoolbin=os.getenv("INSTALL_NAME_TOOL", "install_name_tool") - run([installnametoolbin, "-"+action] + list(args), check=True) - -def changeInstallName(oldName: str, newName: str, binaryPath: str, verbose: int): - if verbose: - print("Using install_name_tool:") - print(" in", binaryPath) - print(" change reference", oldName) - print(" to", newName) - runInstallNameTool("change", oldName, newName, binaryPath) - -def changeIdentification(id: str, binaryPath: str, verbose: int): - if verbose: - print("Using install_name_tool:") - print(" change identification in", binaryPath) - print(" to", id) - runInstallNameTool("id", id, binaryPath) - -def runStrip(binaryPath: str, verbose: int): - stripbin=os.getenv("STRIP", "strip") - if verbose: - print("Using strip:") - print(" stripped", binaryPath) - run([stripbin, "-x", binaryPath], check=True) - -def copyFramework(framework: FrameworkInfo, path: str, verbose: int) -> Optional[str]: - if framework.sourceFilePath.startswith("Qt"): - #standard place for Nokia Qt installer's frameworks - fromPath = f"/Library/Frameworks/{framework.sourceFilePath}" - else: - fromPath = framework.sourceFilePath - toDir = os.path.join(path, framework.destinationDirectory) - toPath = os.path.join(toDir, framework.binaryName) - - if framework.isDylib(): - if not os.path.exists(fromPath): - raise RuntimeError(f"No file at {fromPath}") - - if os.path.exists(toPath): - return None # Already there - - if not os.path.exists(toDir): - os.makedirs(toDir) - - shutil.copy2(fromPath, toPath) - if verbose: - print("Copied:", fromPath) - print(" to:", toPath) - else: - to_dir = os.path.join(path, "Contents", "Frameworks", framework.frameworkName) - if os.path.exists(to_dir): - return None # Already there - - from_dir = framework.frameworkPath - if not os.path.exists(from_dir): - raise RuntimeError(f"No directory at {from_dir}") - - shutil.copytree(from_dir, to_dir, symlinks=True) - if verbose: - print("Copied:", from_dir) - print(" to:", to_dir) - - headers_link = os.path.join(to_dir, "Headers") - if os.path.exists(headers_link): - os.unlink(headers_link) - - headers_dir = os.path.join(to_dir, framework.binaryDirectory, "Headers") - if os.path.exists(headers_dir): - shutil.rmtree(headers_dir) - - permissions = os.stat(toPath) - if not permissions.st_mode & stat.S_IWRITE: - os.chmod(toPath, permissions.st_mode | stat.S_IWRITE) - - return toPath - -def deployFrameworks(frameworks: list[FrameworkInfo], bundlePath: str, binaryPath: str, strip: bool, verbose: int, deploymentInfo: Optional[DeploymentInfo] = None) -> DeploymentInfo: - if deploymentInfo is None: - deploymentInfo = DeploymentInfo() - - while len(frameworks) > 0: - framework = frameworks.pop(0) - deploymentInfo.deployedFrameworks.append(framework.frameworkName) - - print("Processing", framework.frameworkName, "...") - - # Get the Qt path from one of the Qt frameworks - if deploymentInfo.qtPath is None and framework.isQtFramework(): - deploymentInfo.detectQtPath(framework.frameworkDirectory) - - if framework.installName.startswith("@executable_path") or framework.installName.startswith(bundlePath): - print(framework.frameworkName, "already deployed, skipping.") - continue - - # install_name_tool the new id into the binary - changeInstallName(framework.installName, framework.deployedInstallName, binaryPath, verbose) - - # Copy framework to app bundle. - deployedBinaryPath = copyFramework(framework, bundlePath, verbose) - # Skip the rest if already was deployed. - if deployedBinaryPath is None: - continue - - if strip: - runStrip(deployedBinaryPath, verbose) - - # install_name_tool it a new id. - changeIdentification(framework.deployedInstallName, deployedBinaryPath, verbose) - # Check for framework dependencies - dependencies = getFrameworks(deployedBinaryPath, verbose) - - for dependency in dependencies: - changeInstallName(dependency.installName, dependency.deployedInstallName, deployedBinaryPath, verbose) - - # Deploy framework if necessary. - if dependency.frameworkName not in deploymentInfo.deployedFrameworks and dependency not in frameworks: - frameworks.append(dependency) - - return deploymentInfo - -def deployFrameworksForAppBundle(applicationBundle: ApplicationBundleInfo, strip: bool, verbose: int) -> DeploymentInfo: - frameworks = getFrameworks(applicationBundle.binaryPath, verbose) - if len(frameworks) == 0: - print(f"Warning: Could not find any external frameworks to deploy in {applicationBundle.path}.") - return DeploymentInfo() - else: - return deployFrameworks(frameworks, applicationBundle.path, applicationBundle.binaryPath, strip, verbose) - -def deployPlugins(appBundleInfo: ApplicationBundleInfo, deploymentInfo: DeploymentInfo, strip: bool, verbose: int): - plugins = [] - if deploymentInfo.pluginPath is None: - return - for dirpath, dirnames, filenames in os.walk(deploymentInfo.pluginPath): - pluginDirectory = os.path.relpath(dirpath, deploymentInfo.pluginPath) - - if pluginDirectory not in ['styles', 'platforms']: - continue - - for pluginName in filenames: - pluginPath = os.path.join(pluginDirectory, pluginName) - - if pluginName.split('.')[0] not in ['libqminimal', 'libqcocoa', 'libqmacstyle']: - continue - - plugins.append((pluginDirectory, pluginName)) - - for pluginDirectory, pluginName in plugins: - print("Processing plugin", os.path.join(pluginDirectory, pluginName), "...") - - sourcePath = os.path.join(deploymentInfo.pluginPath, pluginDirectory, pluginName) - destinationDirectory = os.path.join(appBundleInfo.pluginPath, pluginDirectory) - if not os.path.exists(destinationDirectory): - os.makedirs(destinationDirectory) - - destinationPath = os.path.join(destinationDirectory, pluginName) - shutil.copy2(sourcePath, destinationPath) - if verbose: - print("Copied:", sourcePath) - print(" to:", destinationPath) - - if strip: - runStrip(destinationPath, verbose) - - dependencies = getFrameworks(destinationPath, verbose) - - for dependency in dependencies: - changeInstallName(dependency.installName, dependency.deployedInstallName, destinationPath, verbose) - - # Deploy framework if necessary. - if dependency.frameworkName not in deploymentInfo.deployedFrameworks: - deployFrameworks([dependency], appBundleInfo.path, destinationPath, strip, verbose, deploymentInfo) - -ap = ArgumentParser(description="""Improved version of macdeployqt. - -Outputs a ready-to-deploy app in a folder "dist" and optionally wraps it in a .zip file. -Note, that the "dist" folder will be deleted before deploying on each run. - -Optionally, Qt translation files (.qm) can be added to the bundle.""") - -ap.add_argument("app_bundle", nargs=1, metavar="app-bundle", help="application bundle to be deployed") -ap.add_argument("appname", nargs=1, metavar="appname", help="name of the app being deployed") -ap.add_argument("-verbose", nargs="?", const=True, help="Output additional debugging information") -ap.add_argument("-no-plugins", dest="plugins", action="store_false", default=True, help="skip plugin deployment") -ap.add_argument("-no-strip", dest="strip", action="store_false", default=True, help="don't run 'strip' on the binaries") -ap.add_argument("-translations-dir", nargs=1, metavar="path", default=None, help="Path to Qt's translations. Base translations will automatically be added to the bundle's resources.") -ap.add_argument("-zip", nargs="?", const="", metavar="zip", help="create a .zip containing the app bundle") - -config = ap.parse_args() - -verbose = config.verbose - -# ------------------------------------------------ - -app_bundle = config.app_bundle[0] -appname = config.appname[0] - -if not os.path.exists(app_bundle): - sys.stderr.write(f"Error: Could not find app bundle \"{app_bundle}\"\n") - sys.exit(1) - - -# ------------------------------------------------ - -if os.path.exists("dist"): - print("+ Removing existing dist folder +") - shutil.rmtree("dist") - -if os.path.exists(appname + ".zip"): - print("+ Removing existing .zip +") - os.unlink(appname + ".zip") - -# ------------------------------------------------ - -target = os.path.join("dist", "BGL-Qt.app") - -print("+ Copying source bundle +") -if verbose: - print(app_bundle, "->", target) - -os.mkdir("dist") -shutil.copytree(app_bundle, target, symlinks=True) - -applicationBundle = ApplicationBundleInfo(target) - -# ------------------------------------------------ - -print("+ Deploying frameworks +") - -try: - deploymentInfo = deployFrameworksForAppBundle(applicationBundle, config.strip, verbose) - if deploymentInfo.qtPath is None: - deploymentInfo.qtPath = os.getenv("QTDIR", None) - if deploymentInfo.qtPath is None: - sys.stderr.write("Warning: Could not detect Qt's path, skipping plugin deployment!\n") - config.plugins = False -except RuntimeError as e: - sys.stderr.write(f"Error: {str(e)}\n") - sys.exit(1) - -# ------------------------------------------------ - -if config.plugins: - print("+ Deploying plugins +") - try: - deployPlugins(applicationBundle, deploymentInfo, config.strip, verbose) - except RuntimeError as e: - sys.stderr.write(f"Error: {str(e)}\n") - sys.exit(1) - -# ------------------------------------------------ - -if config.translations_dir: - if not Path(config.translations_dir[0]).exists(): - sys.stderr.write(f"Error: Could not find translation dir \"{config.translations_dir[0]}\"\n") - sys.exit(1) - -print("+ Adding Qt translations +") - -translations = Path(config.translations_dir[0]) - -regex = re.compile('qt_[a-z]*(.qm|_[A-Z]*.qm)') - -lang_files = [x for x in translations.iterdir() if regex.match(x.name)] - -for file in lang_files: - if verbose: - print(file.as_posix(), "->", os.path.join(applicationBundle.resourcesPath, file.name)) - shutil.copy2(file.as_posix(), os.path.join(applicationBundle.resourcesPath, file.name)) - -# ------------------------------------------------ - -print("+ Installing qt.conf +") - -qt_conf="""[Paths] -Translations=Resources -Plugins=PlugIns -""" - -with open(os.path.join(applicationBundle.resourcesPath, "qt.conf"), "wb") as f: - f.write(qt_conf.encode()) - -# ------------------------------------------------ - -if platform.system() == "Darwin": - subprocess.check_call(f"codesign --deep --force --sign - {target}", shell=True) - -# ------------------------------------------------ - -if config.zip is not None: - shutil.make_archive('{}'.format(appname), format='zip', root_dir='dist', base_dir='BGL-Qt.app') - -# ------------------------------------------------ - -print("+ Done +") - -sys.exit(0) diff --git a/contrib/message-capture/message-capture-docs.md b/contrib/message-capture/message-capture-docs.md deleted file mode 100644 index 7301968461..0000000000 --- a/contrib/message-capture/message-capture-docs.md +++ /dev/null @@ -1,25 +0,0 @@ -# Per-Peer Message Capture - -## Purpose - -This feature allows for message capture on a per-peer basis. It answers the simple question: "Can I see what messages my node is sending and receiving?" - -## Usage and Functionality - -* Run `bitcoind` with the `-capturemessages` option. -* Look in the `message_capture` folder in your datadir. - * Typically this will be `~/.bitcoin/message_capture`. - * See that there are many folders inside, one for each peer names with its IP address and port. - * Inside each peer's folder there are two `.dat` files: one is for received messages (`msgs_recv.dat`) and the other is for sent messages (`msgs_sent.dat`). -* Run `contrib/message-capture/message-capture-parser.py` with the proper arguments. - * See the `-h` option for help. - * To see all messages, both sent and received, for all peers use: - ``` - ./contrib/message-capture/message-capture-parser.py -o out.json \ - ~/.bitcoin/message_capture/**/*.dat - ``` - * Note: The messages in the given `.dat` files will be interleaved in chronological order. So, giving both received and sent `.dat` files (as above with `*.dat`) will result in all messages being interleaved in chronological order. - * If an output file is not provided (i.e. the `-o` option is not used), then the output prints to `stdout`. -* View the resulting output. - * The output file is `JSON` formatted. - * Suggestion: use `jq` to view the output, with `jq . out.json` diff --git a/contrib/message-capture/message-capture-parser.py b/contrib/message-capture/message-capture-parser.py deleted file mode 100755 index e8f227f210..0000000000 --- a/contrib/message-capture/message-capture-parser.py +++ /dev/null @@ -1,215 +0,0 @@ -#!/usr/bin/env python3 -# Copyright (c) 2020-2022 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. -"""Parse message capture binary files. To be used in conjunction with -capturemessages.""" - -import argparse -import os -import shutil -import sys -from io import BytesIO -import json -from pathlib import Path -from typing import Any, Optional - -sys.path.append(os.path.join(os.path.dirname(__file__), '../../test/functional')) - -from test_framework.messages import ser_uint256 # noqa: E402 -from test_framework.p2p import MESSAGEMAP # noqa: E402 - -TIME_SIZE = 8 -LENGTH_SIZE = 4 -MSGTYPE_SIZE = 12 - -# The test framework classes stores hashes as large ints in many cases. -# These are variables of type uint256 in core. -# There isn't a way to distinguish between a large int and a large int that is actually a blob of bytes. -# As such, they are itemized here. -# Any variables with these names that are of type int are actually uint256 variables. -# (These can be easily found by looking for calls to deser_uint256, deser_uint256_vector, and uint256_from_str in messages.py) -HASH_INTS = [ - "blockhash", - "block_hash", - "hash", - "hashMerkleRoot", - "hashPrevBlock", - "hashstop", - "prev_header", - "sha256", - "stop_hash", -] - -HASH_INT_VECTORS = [ - "hashes", - "headers", - "vHave", - "vHash", -] - - -class ProgressBar: - def __init__(self, total: float): - self.total = total - self.running = 0 - - def set_progress(self, progress: float): - cols = shutil.get_terminal_size()[0] - if cols <= 12: - return - max_blocks = cols - 9 - num_blocks = int(max_blocks * progress) - print('\r[ {}{} ] {:3.0f}%' - .format('#' * num_blocks, - ' ' * (max_blocks - num_blocks), - progress * 100), - end ='') - - def update(self, more: float): - self.running += more - self.set_progress(self.running / self.total) - - -def to_jsonable(obj: Any) -> Any: - if hasattr(obj, "__dict__"): - return obj.__dict__ - elif hasattr(obj, "__slots__"): - ret = {} # type: Any - for slot in obj.__slots__: - val = getattr(obj, slot, None) - if slot in HASH_INTS and isinstance(val, int): - ret[slot] = ser_uint256(val).hex() - elif slot in HASH_INT_VECTORS: - assert all(isinstance(a, int) for a in val) - ret[slot] = [ser_uint256(a).hex() for a in val] - else: - ret[slot] = to_jsonable(val) - return ret - elif isinstance(obj, list): - return [to_jsonable(a) for a in obj] - elif isinstance(obj, bytes): - return obj.hex() - else: - return obj - - -def process_file(path: str, messages: list[Any], recv: bool, progress_bar: Optional[ProgressBar]) -> None: - with open(path, 'rb') as f_in: - if progress_bar: - bytes_read = 0 - - while True: - if progress_bar: - # Update progress bar - diff = f_in.tell() - bytes_read - 1 - progress_bar.update(diff) - bytes_read = f_in.tell() - 1 - - # Read the Header - tmp_header_raw = f_in.read(TIME_SIZE + LENGTH_SIZE + MSGTYPE_SIZE) - if not tmp_header_raw: - break - tmp_header = BytesIO(tmp_header_raw) - time = int.from_bytes(tmp_header.read(TIME_SIZE), "little") # type: int - msgtype = tmp_header.read(MSGTYPE_SIZE).split(b'\x00', 1)[0] # type: bytes - length = int.from_bytes(tmp_header.read(LENGTH_SIZE), "little") # type: int - - # Start converting the message to a dictionary - msg_dict = {} - msg_dict["direction"] = "recv" if recv else "sent" - msg_dict["time"] = time - msg_dict["size"] = length # "size" is less readable here, but more readable in the output - - msg_ser = BytesIO(f_in.read(length)) - - # Determine message type - if msgtype not in MESSAGEMAP: - # Unrecognized message type - try: - msgtype_tmp = msgtype.decode() - if not msgtype_tmp.isprintable(): - raise UnicodeDecodeError - msg_dict["msgtype"] = msgtype_tmp - except UnicodeDecodeError: - msg_dict["msgtype"] = "UNREADABLE" - msg_dict["body"] = msg_ser.read().hex() - msg_dict["error"] = "Unrecognized message type." - messages.append(msg_dict) - print(f"WARNING - Unrecognized message type {msgtype} in {path}", file=sys.stderr) - continue - - # Deserialize the message - msg = MESSAGEMAP[msgtype]() - msg_dict["msgtype"] = msgtype.decode() - - try: - msg.deserialize(msg_ser) - except KeyboardInterrupt: - raise - except Exception: - # Unable to deserialize message body - msg_ser.seek(0, os.SEEK_SET) - msg_dict["body"] = msg_ser.read().hex() - msg_dict["error"] = "Unable to deserialize message." - messages.append(msg_dict) - print(f"WARNING - Unable to deserialize message in {path}", file=sys.stderr) - continue - - # Convert body of message into a jsonable object - if length: - msg_dict["body"] = to_jsonable(msg) - messages.append(msg_dict) - - if progress_bar: - # Update the progress bar to the end of the current file - # in case we exited the loop early - f_in.seek(0, os.SEEK_END) # Go to end of file - diff = f_in.tell() - bytes_read - 1 - progress_bar.update(diff) - - -def main(): - parser = argparse.ArgumentParser( - description=__doc__, - epilog="EXAMPLE \n\t{0} -o out.json /message_capture/**/*.dat".format(sys.argv[0]), - formatter_class=argparse.RawTextHelpFormatter) - parser.add_argument( - "capturepaths", - nargs='+', - help="binary message capture files to parse.") - parser.add_argument( - "-o", "--output", - help="output file. If unset print to stdout") - parser.add_argument( - "-n", "--no-progress-bar", - action='store_true', - help="disable the progress bar. Automatically set if the output is not a terminal") - args = parser.parse_args() - capturepaths = [Path.cwd() / Path(capturepath) for capturepath in args.capturepaths] - output = Path.cwd() / Path(args.output) if args.output else False - use_progress_bar = (not args.no_progress_bar) and sys.stdout.isatty() - - messages = [] # type: list[Any] - if use_progress_bar: - total_size = sum(capture.stat().st_size for capture in capturepaths) - progress_bar = ProgressBar(total_size) - else: - progress_bar = None - - for capture in capturepaths: - process_file(str(capture), messages, "recv" in capture.stem, progress_bar) - - messages.sort(key=lambda msg: msg['time']) - - if use_progress_bar: - progress_bar.set_progress(1) - - jsonrep = json.dumps(messages) - if output: - with open(str(output), 'w+', encoding="utf8") as f_out: - f_out.write(jsonrep) - else: - print(jsonrep) - -if __name__ == "__main__": - main() diff --git a/contrib/qos/README.md b/contrib/qos/README.md deleted file mode 100644 index e99d6b852f..0000000000 --- a/contrib/qos/README.md +++ /dev/null @@ -1,5 +0,0 @@ -### QoS (Quality of service) ### - -This is a Linux bash script that will set up tc to limit the outgoing bandwidth for connections to the BGL 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 BGLd instance running, and another local BGLd/BGL-qt instance which connects to this node and receives blocks from it. diff --git a/contrib/qos/tc.sh b/contrib/qos/tc.sh deleted file mode 100644 index 3a416bfb52..0000000000 --- a/contrib/qos/tc.sh +++ /dev/null @@ -1,62 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright (c) 2017-2021 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -export LC_ALL=C -#network interface on which to limit traffic -IF="eth0" -#limit of the network interface in question -LINKCEIL="1gbit" -#limit outbound BGL protocol traffic to this rate -LIMIT="160kbit" -#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 - -#add root class -tc qdisc add dev ${IF} root handle 1: htb default 10 - -#add parent class -tc class add dev ${IF} parent 1: classid 1:1 htb rate ${LINKCEIL} ceil ${LINKCEIL} - -#add our two classes. one unlimited, another limited -tc class add dev ${IF} parent 1:1 classid 1:10 htb rate ${LINKCEIL} ceil ${LINKCEIL} prio 0 -tc class add dev ${IF} parent 1:1 classid 1:11 htb rate ${LIMIT} ceil ${LIMIT} prio 1 - -#add handles to our classes so packets marked with go into the class with "... handle fw ..." -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 [ -n "${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 -#while [ $ret -eq 0 ]; do -# iptables -t mangle -D OUTPUT 1 -# ret=$? -#done - -#limit outgoing traffic to and from port 8333. but not when dealing with a host on the local network -# (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_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 [ -n "${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/seeds/README.md b/contrib/seeds/README.md deleted file mode 100755 index 4a6187e845..0000000000 --- a/contrib/seeds/README.md +++ /dev/null @@ -1,20 +0,0 @@ -### 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 (at a minimum when SeedsServiceFlags() -changes its default return value, as those are the services which seeds are added -to addrman with). - -The seeds compiled into the release are created from sipa's DNS seed and AS map -data. Run the following commands from the `/contrib/seeds` directory: - -``` -curl https://bitcoin.sipa.be/seeds.txt.gz | gzip -dc > seeds_main.txt -curl https://bitcoin.sipa.be/asmap-filled.dat > asmap-filled.dat -python3 makeseeds.py -a asmap-filled.dat -s seeds_main.txt > nodes_main.txt -cat nodes_main_manual.txt >> nodes_main.txt -python3 generate-seeds.py . > ../../src/chainparamsseeds.h -``` diff --git a/contrib/seeds/generate-seeds.py b/contrib/seeds/generate-seeds.py deleted file mode 100755 index 06753ea5df..0000000000 --- a/contrib/seeds/generate-seeds.py +++ /dev/null @@ -1,172 +0,0 @@ -#!/usr/bin/env python3 -# Copyright (c) 2014-2021 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. -''' -Script to generate list of seed nodes for kernel/chainparams.cpp. - -This script expects two text files in the directory that is passed as an -argument: - nodes_main.txt - nodes_test.txt -These files must consist of lines in the format - : - []: - .onion: - .b32.i2p: -The output will be two data structures with the peers in binary format: - static const uint8_t chainparams_seed_{main,test}[]={ - ... - } -These should be pasted into `src/chainparamsseeds.h`. -''' -from __future__ import print_function, division -from base64 import b32decode -from enum import Enum -import struct -import sys -import os -import re - -class BIP155Network(Enum): - IPV4 = 1 - IPV6 = 2 - TORV2 = 3 # no longer supported - TORV3 = 4 - I2P = 5 - CJDNS = 6 - -def name_to_bip155(addr): - '''Convert address string to BIP155 (networkID, addr) tuple.''' - if addr.endswith('.onion'): - vchAddr = b32decode(addr[0:-6], True) - if len(vchAddr) == 35: - assert vchAddr[34] == 3 - return (BIP155Network.TORV3, vchAddr[:32]) - elif len(vchAddr) == 10: - return (BIP155Network.TORV2, vchAddr) - else: - raise ValueError('Invalid onion %s' % vchAddr) - elif addr.endswith('.b32.i2p'): - vchAddr = b32decode(addr[0:-8] + '====', True) - if len(vchAddr) == 32: - return (BIP155Network.I2P, vchAddr) - else: - raise ValueError(f'Invalid I2P {vchAddr}') - elif '.' in addr: # IPv4 - return (BIP155Network.IPV4, bytes((int(x) for x in addr.split('.')))) - elif ':' in addr: # IPv6 or CJDNS - sub = [[], []] # prefix, suffix - x = 0 - addr = addr.split(':') - for i,comp in enumerate(addr): - if comp == '': - if i == 0 or i == (len(addr)-1): # skip empty component at beginning or end - continue - x += 1 # :: skips to suffix - assert x < 2 - else: # two bytes per component - val = int(comp, 16) - sub[x].append(val >> 8) - sub[x].append(val & 0xff) - nullbytes = 16 - len(sub[0]) - len(sub[1]) - assert (x == 0 and nullbytes == 0) or (x == 1 and nullbytes > 0) - addr_bytes = bytes(sub[0] + ([0] * nullbytes) + sub[1]) - if addr_bytes[0] == 0xfc: - # Assume that seeds with fc00::/8 addresses belong to CJDNS, - # not to the publicly unroutable "Unique Local Unicast" network, see - # RFC4193: https://datatracker.ietf.org/doc/html/rfc4193#section-8 - return (BIP155Network.CJDNS, addr_bytes) - else: - return (BIP155Network.IPV6, addr_bytes) - else: - raise ValueError('Could not parse address %s' % addr) - -def parse_spec(s): - '''Convert endpoint string to BIP155 (networkID, addr, port) tuple.''' - match = re.match(r'\[([0-9a-fA-F:]+)\](?::([0-9]+))?$', s) - if match: # ipv6 - host = match.group(1) - port = match.group(2) - elif s.count(':') > 1: # ipv6, no port - host = s - port = '' - else: - (host,_,port) = s.partition(':') - - if not port: - port = 0 - else: - port = int(port) - - host = name_to_bip155(host) - - if host[0] == BIP155Network.TORV2: - return None # TORV2 is no longer supported, so we ignore it - else: - return host + (port, ) - -def ser_compact_size(l): - r = b"" - if l < 253: - r = struct.pack("B", l) - elif l < 0x10000: - r = struct.pack("H', spec[2]) - return r - -def process_nodes(g, f, structname): - g.write('static const uint8_t %s[] = {\n' % structname) - for line in f: - comment = line.find('#') - if comment != -1: - line = line[0:comment] - line = line.strip() - if not line: - continue - - spec = parse_spec(line) - if spec is None: # ignore this entry (e.g. no longer supported addresses like TORV2) - continue - blob = bip155_serialize(spec) - hoststr = ','.join(('0x%02x' % b) for b in blob) - g.write(f' {hoststr},\n') - g.write('};\n') - -def main(): - if len(sys.argv)<2: - print(('Usage: %s ' % sys.argv[0]), file=sys.stderr) - exit(1) - g = sys.stdout - indir = sys.argv[1] - g.write('#ifndef BGL_CHAINPARAMSSEEDS_H\n') - g.write('#define BGL_CHAINPARAMSSEEDS_H\n') - g.write('/**\n') - g.write(' * List of fixed seed nodes for the falco network\n') - g.write(' * AUTOGENERATED by contrib/seeds/generate-seeds.py\n') - g.write(' *\n') - g.write(' * Each line contains a BIP155 serialized (networkID, addr, port) tuple.\n') - g.write(' */\n') - with open(os.path.join(indir,'nodes_main.txt'), 'r', encoding="utf8") as f: - process_nodes(g, f, 'chainparams_seed_main') - g.write('\n') - with open(os.path.join(indir,'nodes_test.txt'), 'r', encoding="utf8") as f: - process_nodes(g, f, 'chainparams_seed_test') - g.write('#endif // BGL_CHAINPARAMSSEEDS_H\n') - -if __name__ == '__main__': - main() diff --git a/contrib/seeds/makeseeds.py b/contrib/seeds/makeseeds.py deleted file mode 100755 index c30bc68097..0000000000 --- a/contrib/seeds/makeseeds.py +++ /dev/null @@ -1,251 +0,0 @@ -#!/usr/bin/env python3 -# Copyright (c) 2013-2022 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. -# -# Generate seeds.txt from Pieter's DNS seeder -# - -import argparse -import collections -import ipaddress -from pathlib import Path -import re -import sys -from typing import Union - -asmap_dir = Path(__file__).parent.parent / "asmap" -sys.path.append(str(asmap_dir)) -from asmap import ASMap, net_to_prefix # noqa: E402 - -NSEEDS=512 - -MAX_SEEDS_PER_ASN = { - 'ipv4': 2, - 'ipv6': 10, -} - -MIN_BLOCKS = 730000 - -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"^([a-z2-7]{56}\.onion):(\d+)$") -PATTERN_I2P = re.compile(r"^([a-z2-7]{52}\.b32.i2p):(\d+)$") -PATTERN_AGENT = re.compile( - r"^/Satoshi:(" - r"0.14.(0|1|2|3|99)|" - r"0.15.(0|1|2|99)|" - r"0.16.(0|1|2|3|99)|" - r"0.17.(0|0.1|1|2|99)|" - r"0.18.(0|1|99)|" - r"0.19.(0|1|2|99)|" - r"0.20.(0|1|2|99)|" - r"0.21.(0|1|2|99)|" - r"22.(0|1|99)|" - r"23.(0|1|99)|" - r"24.(0|1|99)|" - r"25.(0|1|99)|" - r"26.(0|99)|" - r")") - -def parseline(line: str) -> Union[dict, None]: - """ Parses a line from `seeds_main.txt` into a dictionary of details for that line. - or `None`, if the line could not be parsed. - """ - sline = line.split() - if len(sline) < 11: - # line too short to be valid, skip it. - return None - m = PATTERN_IPV4.match(sline[0]) - sortkey = None - ip = None - if m is None: - m = PATTERN_IPV6.match(sline[0]) - if m is None: - m = PATTERN_ONION.match(sline[0]) - if m is None: - m = PATTERN_I2P.match(sline[0]) - if m is None: - return None - else: - net = 'i2p' - ipstr = sortkey = m.group(1) - port = int(m.group(2)) - else: - net = 'onion' - ipstr = sortkey = m.group(1) - port = int(m.group(2)) - else: - net = 'ipv6' - if m.group(1) in ['::']: # Not interested in localhost - return None - ipstr = m.group(1) - sortkey = ipstr # XXX parse IPv6 into number, could use name_to_ipv6 from generate-seeds - port = int(m.group(2)) - else: - # Do IPv4 sanity check - ip = 0 - for i in range(0,4): - if int(m.group(i+2)) < 0 or int(m.group(i+2)) > 255: - return None - ip = ip + (int(m.group(i+2)) << (8*(3-i))) - if ip == 0: - return None - net = 'ipv4' - sortkey = ip - ipstr = m.group(1) - port = int(m.group(6)) - # Skip bad results. - if sline[1] == 0: - return None - # Extract uptime %. - uptime30 = float(sline[7][:-1]) - # Extract Unix timestamp of last success. - lastsuccess = int(sline[2]) - # Extract protocol version. - version = int(sline[10]) - # Extract user agent. - agent = sline[11][1:-1] - # Extract service flags. - service = int(sline[9], 16) - # Extract blocks. - blocks = int(sline[8]) - # Construct result. - return { - 'net': net, - 'ip': ipstr, - 'port': port, - 'ipnum': ip, - 'uptime': uptime30, - 'lastsuccess': lastsuccess, - 'version': version, - 'agent': agent, - 'service': service, - 'blocks': blocks, - 'sortkey': sortkey, - } - -def dedup(ips: list[dict]) -> list[dict]: - """ Remove duplicates from `ips` where multiple ips share address and port. """ - d = {} - for ip in ips: - d[ip['ip'],ip['port']] = ip - return list(d.values()) - -def filtermultiport(ips: list[dict]) -> list[dict]: - """ Filter out hosts with more nodes per IP""" - hist = collections.defaultdict(list) - for ip in ips: - hist[ip['sortkey']].append(ip) - return [value[0] for (key,value) in list(hist.items()) if len(value)==1] - -# Based on Greg Maxwell's seed_filter.py -def filterbyasn(asmap: ASMap, ips: list[dict], max_per_asn: dict, max_per_net: int) -> list[dict]: - """ Prunes `ips` by - (a) trimming ips to have at most `max_per_net` ips from each net (e.g. ipv4, ipv6); and - (b) trimming ips to have at most `max_per_asn` ips from each asn in each net. - """ - # Sift out ips by type - ips_ipv46 = [ip for ip in ips if ip['net'] in ['ipv4', 'ipv6']] - ips_onion = [ip for ip in ips if ip['net'] == 'onion'] - ips_i2p = [ip for ip in ips if ip['net'] == 'i2p'] - - # Filter IPv46 by ASN, and limit to max_per_net per network - result = [] - net_count: dict[str, int] = collections.defaultdict(int) - asn_count: dict[int, int] = collections.defaultdict(int) - - for i, ip in enumerate(ips_ipv46): - if net_count[ip['net']] == max_per_net: - # do not add this ip as we already too many - # ips from this network - continue - asn = asmap.lookup(net_to_prefix(ipaddress.ip_network(ip['ip']))) - if not asn or asn_count[ip['net'], asn] == max_per_asn[ip['net']]: - # do not add this ip as we already have too many - # ips from this ASN on this network - continue - asn_count[ip['net'], asn] += 1 - net_count[ip['net']] += 1 - ip['asn'] = asn - result.append(ip) - - # Add back Onions (up to max_per_net) - result.extend(ips_onion[0:max_per_net]) - result.extend(ips_i2p[0:max_per_net]) - return result - -def ip_stats(ips: list[dict]) -> str: - """ Format and return pretty string from `ips`. """ - hist: dict[str, int] = collections.defaultdict(int) - for ip in ips: - if ip is not None: - hist[ip['net']] += 1 - - return f"{hist['ipv4']:6d} {hist['ipv6']:6d} {hist['onion']:6d} {hist['i2p']:6d}" - -def parse_args(): - argparser = argparse.ArgumentParser(description='Generate a list of BGL node seed ip addresses.') - argparser.add_argument("-a","--asmap", help='the location of the asmap asn database file (required)', required=True) - return argparser.parse_args() - -def main(): - args = parse_args() - - print(f'Loading asmap database "{args.asmap}"…', end='', file=sys.stderr, flush=True) - with open(args.asmap, 'rb') as f: - asmap = ASMap.from_binary(f.read()) - print('Done.', file=sys.stderr) - - print('Loading and parsing DNS seeds…', end='', file=sys.stderr, flush=True) - lines = sys.stdin.readlines() - ips = [parseline(line) for line in lines] - print('Done.', file=sys.stderr) - - print('\x1b[7m IPv4 IPv6 Onion I2P Pass \x1b[0m', file=sys.stderr) - print(f'{ip_stats(ips):s} Initial', file=sys.stderr) - # Skip entries with invalid address. - ips = [ip for ip in ips if ip is not None] - print(f'{ip_stats(ips):s} Skip entries with invalid address', file=sys.stderr) - # Skip duplicates (in case multiple seeds files were concatenated) - ips = dedup(ips) - print(f'{ip_stats(ips):s} After removing duplicates', file=sys.stderr) - # Enforce minimal number of blocks. - ips = [ip for ip in ips if ip['blocks'] >= MIN_BLOCKS] - print(f'{ip_stats(ips):s} Enforce minimal number of blocks', file=sys.stderr) - # Require service bit 1. - ips = [ip for ip in ips if (ip['service'] & 1) == 1] - print(f'{ip_stats(ips):s} Require service bit 1', file=sys.stderr) - # Require at least 50% 30-day uptime for clearnet, 10% for onion and i2p. - req_uptime = { - 'ipv4': 50, - 'ipv6': 50, - 'onion': 10, - 'i2p' : 10, - } - ips = [ip for ip in ips if ip['uptime'] > req_uptime[ip['net']]] - print(f'{ip_stats(ips):s} Require minimum uptime', file=sys.stderr) - # Require a known and recent user agent. - ips = [ip for ip in ips if PATTERN_AGENT.match(ip['agent'])] - print(f'{ip_stats(ips):s} Require a known and recent user agent', file=sys.stderr) - # Sort by availability (and use last success as tie breaker) - ips.sort(key=lambda x: (x['uptime'], x['lastsuccess'], x['ip']), reverse=True) - # Filter out hosts with multiple ports, these are likely abusive - ips = filtermultiport(ips) - print(f'{ip_stats(ips):s} Filter out hosts with multiple BGL ports', file=sys.stderr) - # Look up ASNs and limit results, both per ASN and globally. - ips = filterbyasn(asmap, ips, MAX_SEEDS_PER_ASN, NSEEDS) - print(f'{ip_stats(ips):s} Look up ASNs and limit results per ASN and per net', file=sys.stderr) - # Sort the results by IP address (for deterministic output). - ips.sort(key=lambda x: (x['net'], x['sortkey'])) - for ip in ips: - if ip['net'] == 'ipv6': - print(f"[{ip['ip']}]:{ip['port']}", end="") - else: - print(f"{ip['ip']}:{ip['port']}", end="") - if 'asn' in ip: - print(f" # AS{ip['asn']}", end="") - print() - -if __name__ == '__main__': - main() diff --git a/contrib/seeds/nodes_main.txt b/contrib/seeds/nodes_main.txt deleted file mode 100755 index be7607c0f7..0000000000 --- a/contrib/seeds/nodes_main.txt +++ /dev/null @@ -1,1748 +0,0 @@ -1.253.159.19:8333 # AS9318 -2.152.74.211:8333 # AS12430 -5.2.23.226:8333 # AS21472 -5.128.87.126:8333 # AS31200 -5.157.103.202:8333 # AS35612 -5.188.62.18:8333 # AS34665 -5.253.18.218:8333 # AS58073 -5.255.109.160:8333 # AS60404 -8.129.184.255:8333 # AS37963 -8.209.70.77:8333 # AS45102 -8.210.18.56:8333 # AS45102 -12.34.98.148:8333 # AS7018 -18.27.79.17:8333 # AS3 -23.93.170.118:8333 # AS46375 -23.154.136.144:8333 # AS54002 -23.175.0.212:8333 # AS395502 -23.175.0.222:8333 # AS395502 -24.84.164.50:8333 # AS6327 -24.86.90.127:8333 # AS6327 -24.101.126.194:8333 # AS27364 -24.183.75.154:8333 # AS20115 -27.124.108.19:8333 # AS58511 -27.148.206.140:8333 # AS4134 -31.25.98.16:8333 # AS48635 -31.41.23.249:8333 # AS31287 -31.47.202.112:8333 # AS34385 -31.156.128.248:8333 # AS30722 -31.164.160.162:8333 # AS6730 -31.201.190.134:8333 # AS50266 -31.208.34.61:8333 # AS29518 -34.78.14.25:8333 # AS15169 -34.80.134.68:8333 # AS15169 -35.137.133.225:8333 # AS7843 -35.193.192.48:8333 # AS396982 -35.194.39.250:8333 # AS396982 -37.15.60.144:8333 # AS12479 -37.60.228.251:8333 # AS31214 -37.60.229.117:8333 # AS31214 -37.110.132.94:8333 # AS42610 -37.120.179.29:8333 # AS47147 -37.139.102.73:8333 # AS35816 -37.157.192.94:8333 # AS197019 -37.220.135.151:8333 # AS41206 -38.9.81.160:8333 # AS16904 -38.21.221.252:8333 # AS40545 -38.54.14.89:8333 # AS138915 -38.91.106.111:8333 # AS63023 -38.102.85.36:8333 # AS174 -42.2.162.218:8333 # AS4760 -43.129.75.20:8333 # AS132203 -43.159.61.16:8333 # AS132203 -43.225.62.107:8333 # AS63953 -43.245.196.214:8333 # AS63916 -45.13.7.221:8333 # AS60377 -45.44.213.123:8333 # AS54198 -45.48.75.224:8333 # AS20001 -45.79.76.12:8333 # AS63949 -45.94.209.127:8333 # AS13789 -45.130.23.57:8333 # AS3214 -45.132.118.25:8333 # AS208451 -45.144.249.207:8333 # AS203936 -45.145.40.43:8333 # AS63213 -45.155.169.30:8333 # AS62000 -46.17.99.13:8333 # AS57043 -46.17.99.26:8333 # AS57043 -46.21.250.25:8333 # AS24875 -46.28.204.161:8333 # AS197988 -46.128.199.26:8333 # AS16097 -46.164.59.139:8333 # AS21283 -46.166.142.2:8333 # AS43350 -46.172.233.241:8333 # AS6752 -46.252.5.112:8333 # AS206774 -47.28.85.71:8333 # AS20115 -47.176.248.250:8333 # AS5650 -47.198.60.180:8333 # AS5650 -50.27.22.141:8333 # AS19108 -50.39.170.149:8333 # AS20055 -50.53.250.162:8333 # AS20055 -51.154.62.103:8333 # AS15796 -51.158.150.155:8333 # AS12876 -51.174.206.76:8333 # AS29695 -54.217.136.122:8333 # AS16509 -54.253.15.33:8333 # AS16509 -57.128.96.115:8333 # AS8220 -57.128.148.169:8333 # AS8220 -58.6.46.171:8333 # AS7545 -58.96.77.114:8333 # AS10143 -58.96.123.120:8333 # AS38195 -58.168.253.35:8333 # AS1221 -59.167.191.60:8333 # AS4739 -60.205.205.119:8333 # AS37963 -60.212.189.151:8333 # AS4837 -61.74.99.193:8333 # AS4766 -62.24.76.122:8333 # AS16019 -62.106.70.249:8333 # AS8100 -62.168.65.42:8333 # AS5578 -62.171.129.32:8333 # AS51167 -62.245.75.70:8333 # AS16019 -62.248.8.167:8333 # AS16010 -64.23.150.211:8333 # AS3064 -64.98.119.136:8333 # AS32133 -65.24.75.34:8333 # AS7843 -65.175.185.101:8333 # AS11776 -66.45.141.46:8333 # AS11232 -66.58.163.185:8333 # AS8047 -66.85.133.182:8333 # AS12189 -66.206.22.26:8333 # AS29802 -67.40.102.33:8333 # AS209 -67.43.210.62:8333 # AS394883 -67.82.136.177:8333 # AS6128 -67.193.87.50:8333 # AS7992 -67.210.228.203:8333 # AS7819 -67.211.211.118:8333 # AS19318 -67.231.246.58:8333 # AS40244 -68.6.84.222:8333 # AS22773 -68.48.136.216:8333 # AS7922 -68.69.170.92:8333 # AS6315 -69.4.94.226:8333 # AS36352 -69.8.175.201:8333 # AS21766 -69.57.160.49:8333 # AS22612 -69.112.103.124:8333 # AS6128 -69.196.152.33:8333 # AS5645 -71.19.148.180:8333 # AS6939 -73.227.153.213:8333 # AS1351 -74.50.81.93:8333 # AS19318 -74.101.205.214:8333 # AS701 -74.118.137.119:8333 # AS20326 -74.213.175.108:8333 # AS21949 -74.213.251.239:8333 # AS14978 -74.220.255.190:8333 # AS23175 -77.20.48.144:8333 # AS3209 -77.21.149.160:8333 # AS204028 -77.37.240.209:8333 # AS42610 -77.43.14.68:8333 # AS5396 -77.111.57.109:8333 # AS3212 -77.162.190.90:8333 # AS1136 -77.173.132.140:8333 # AS1136 -77.202.10.220:8333 # AS15557 -78.27.139.13:8333 # AS6723 -78.31.71.190:8333 # AS24961 -78.35.147.203:8333 # AS8422 -78.42.144.24:8333 # AS51185 -78.43.153.185:8333 # AS51185 -78.56.89.146:8333 # AS8764 -78.70.208.53:8333 # AS3301 -79.109.120.38:8333 # AS12430 -79.116.56.89:8333 # AS57269 -79.124.7.253:8333 # AS203380 -79.136.250.162:8333 # AS9049 -80.83.186.25:8333 # AS33891 -80.98.75.248:8333 # AS21334 -80.229.28.60:8333 # AS2856 -80.244.26.192:8333 # AS35432 -81.4.110.168:8333 # AS198203 -81.7.17.202:8333 # AS35366 -81.19.10.2:8333 # AS24641 -81.83.214.134:8333 # AS6848 -81.170.142.100:8333 # AS8473 -81.171.22.143:8333 # AS60781 -81.242.239.139:8333 # AS5432 -82.66.10.11:8333 # AS12322 -82.66.204.177:8333 # AS12322 -82.96.96.40:8333 # AS29686 -82.149.225.249:8333 # AS29551 -82.155.148.211:8333 # AS8657 -82.181.218.133:8333 # AS16086 -83.99.247.25:8333 # AS24651 -83.136.232.21:8333 # AS29182 -83.192.226.66:8333 # AS3215 -83.208.193.242:8333 # AS5610 -83.240.118.196:8333 # AS31246 -84.7.219.130:8333 # AS15557 -84.52.64.82:8333 # AS25408 -84.64.99.78:8333 # AS5378 -84.112.60.16:8333 # AS8412 -84.113.129.195:8333 # AS8412 -84.211.187.211:8333 # AS41164 -84.217.134.213:8333 # AS2119 -84.247.128.15:8333 # AS49788 -84.247.132.27:8333 # AS29286 -84.247.173.117:8333 # AS29286 -84.247.179.51:8333 # AS49788 -84.255.245.194:8333 # AS34779 -85.145.79.26:8333 # AS50266 -85.173.165.66:8333 # AS12389 -85.195.196.86:8333 # AS13030 -85.214.118.71:8333 # AS6724 -86.22.20.13:8333 # AS5089 -86.45.238.115:8333 # AS5466 -86.182.223.189:8333 # AS2856 -86.215.168.115:8333 # AS3215 -87.79.94.221:8333 # AS8422 -87.90.94.120:8333 # AS5410 -87.92.171.53:8333 # AS16086 -87.236.195.198:8333 # AS35592 -87.236.199.197:8333 # AS35592 -88.6.31.66:8333 # AS3352 -88.9.73.252:8333 # AS3352 -88.84.223.30:8333 # AS21453 -88.146.114.173:8333 # AS29208 -89.35.142.177:8333 # AS34977 -89.44.41.142:8333 # AS56478 -89.116.25.234:8333 # AS398465 -89.117.58.113:8333 # AS1239 -89.117.172.121:8333 # AS3320 -89.165.232.242:8333 # AS48161 -89.190.142.56:8333 # AS38919 -89.216.91.120:8333 # AS31042 -89.247.224.28:8333 # AS8881 -90.146.207.67:8333 # AS12605 -90.156.26.148:8333 # AS12741 -90.163.172.78:8333 # AS12479 -90.192.118.202:8333 # AS5607 -90.208.159.11:8333 # AS5607 -90.247.70.31:8333 # AS5378 -91.86.25.207:8333 # AS47377 -91.123.182.164:8333 # AS51648 -91.123.183.219:8333 # AS51792 -91.134.145.202:8333 # AS16276 -91.135.0.187:8333 # AS12496 -91.152.122.36:8333 # AS6667 -91.184.174.191:8333 # AS9063 -91.204.149.5:8333 # AS42765 -91.206.17.195:8333 # AS13259 -91.209.51.131:8333 # AS48239 -91.215.91.254:8333 # AS48078 -91.231.182.53:8333 # AS44103 -91.236.251.137:8333 # AS57944 -91.236.251.139:8333 # AS57944 -91.237.88.218:8333 # AS56813 -92.27.150.46:8333 # AS13285 -92.27.150.47:8333 # AS13285 -92.42.110.219:8333 # AS1273 -92.43.187.34:8333 # AS8359 -92.206.105.31:8333 # AS20880 -92.233.2.59:8333 # AS5089 -92.240.181.45:8333 # AS16246 -93.51.13.120:8333 # AS12874 -93.57.81.162:8333 # AS12874 -93.71.19.130:8333 # AS30722 -93.81.254.159:8333 # AS8402 -93.90.82.227:8333 # AS47626 -93.100.35.189:8333 # AS35807 -93.103.13.1:8333 # AS34779 -93.123.180.164:8333 # AS35539 -93.177.188.74:8333 # AS16010 -93.188.102.53:8333 # AS43989 -94.19.7.55:8333 # AS35807 -94.63.75.74:8333 # AS12353 -94.72.141.61:8333 # AS57344 -94.72.143.47:8333 # AS203380 -94.105.53.124:8333 # AS47377 -94.181.46.106:8333 # AS9049 -94.231.253.18:8333 # AS35224 -95.42.140.142:8333 # AS8866 -95.82.130.223:8333 # AS31246 -95.88.61.176:8333 # AS204028 -95.105.172.171:8333 # AS15962 -95.110.234.93:8333 # AS31034 -95.164.182.44:8333 # AS29632 -95.191.130.100:8333 # AS12389 -96.3.53.254:8333 # AS11232 -97.75.144.9:8333 # AS22709 -98.17.95.93:8333 # AS398465 -98.128.230.186:8333 # AS8473 -98.163.242.149:8333 # AS22773 -98.229.126.23:8333 # AS1351 -99.233.20.215:8333 # AS812 -99.246.87.2:8333 # AS812 -101.51.138.194:8333 # AS38040 -102.130.113.94:8333 # AS328364 -103.99.170.210:8333 # AS54415 -103.99.170.220:8333 # AS54415 -103.156.165.171:8333 # AS63859 -103.219.169.49:8333 # AS13335 -104.171.202.244:8333 # AS30496 -104.225.220.33:8333 # AS29802 -104.244.73.6:8333 # AS53667 -104.244.79.131:8333 # AS53667 -108.49.65.132:8333 # AS701 -109.86.60.33:8333 # AS13188 -109.91.141.145:8333 # AS3209 -109.99.63.159:8333 # AS9050 -109.120.194.136:8333 # AS34569 -109.196.124.182:8333 # AS196883 -109.201.168.32:8333 # AS41750 -109.224.84.149:8333 # AS197197 -111.90.140.46:8333 # AS45839 -112.139.10.25:8333 # AS10010 -114.34.130.206:8333 # AS3462 -116.58.171.67:8333 # AS2514 -116.86.195.192:8333 # AS4657 -119.31.179.202:8333 # AS17408 -119.42.55.203:8333 # AS133159 -120.226.39.100:8333 # AS9808 -120.226.39.103:8333 # AS9808 -121.6.69.73:8333 # AS9506 -121.99.240.87:8333 # AS9790 -122.148.147.136:8333 # AS4826 -122.199.40.21:8333 # AS38195 -123.60.213.192:8333 # AS55990 -123.202.193.121:8333 # AS9269 -124.170.182.194:8333 # AS7545 -124.197.54.113:8333 # AS9790 -125.168.110.28:8333 # AS4826 -125.227.178.68:8333 # AS3462 -128.0.190.26:8333 # AS30764 -129.13.189.215:8333 # AS34878 -130.44.176.111:8333 # AS6079 -130.204.161.3:8333 # AS8717 -131.153.232.139:8333 # AS12189 -131.188.40.47:8333 # AS680 -134.65.193.149:8333 # AS19037 -135.19.41.208:8333 # AS5769 -135.19.253.101:8333 # AS5769 -135.23.204.98:8333 # AS5645 -135.181.215.237:8333 # AS24940 -136.55.46.15:8333 # AS16591 -136.62.58.224:8333 # AS16591 -136.175.8.175:8333 # AS14315 -136.244.19.126:8333 # AS397412 -137.226.34.46:8333 # AS680 -138.59.20.209:8333 # AS28201 -139.59.70.163:8333 # AS14061 -140.238.220.99:8333 # AS31898 -141.193.68.11:8333 # AS396998 -142.54.181.218:8333 # AS32097 -142.115.140.2:8333 # AS577 -142.188.125.200:8333 # AS577 -143.110.252.124:8333 # AS14061 -144.24.236.64:8333 # AS31898 -144.137.29.181:8333 # AS1221 -146.71.69.103:8333 # AS7782 -149.28.159.141:8333 # AS20473 -149.143.32.26:8333 # AS15435 -149.202.79.199:8333 # AS16276 -149.248.1.254:8333 # AS20473 -151.248.221.197:8333 # AS8821 -152.44.137.83:8333 # AS11404 -152.230.180.115:8333 # AS14259 -154.26.137.105:8333 # AS174 -154.92.111.100:8333 # AS141356 -157.131.20.174:8333 # AS46375 -158.129.140.201:8333 # AS5479 -158.181.114.196:8333 # AS8821 -158.220.85.82:8333 # AS8556 -158.220.121.93:8333 # AS8556 -159.2.191.175:8333 # AS855 -159.224.238.145:8333 # AS13188 -161.97.167.10:8333 # AS51167 -162.213.119.12:8333 # AS2711 -162.226.61.8:8333 # AS7018 -162.254.171.209:8333 # AS17210 -163.114.159.205:8333 # AS15830 -163.172.84.134:8333 # AS12876 -165.255.241.184:8333 # AS327693 -167.179.147.155:8333 # AS4764 -169.150.206.206:8333 # AS60068 -170.17.151.235:8333 # AS3303 -170.254.147.116:8333 # AS265398 -172.92.102.115:8333 # AS11404 -172.105.21.216:8333 # AS63949 -172.219.229.252:8333 # AS852 -172.251.101.27:8333 # AS20001 -173.12.119.133:8333 # AS7922 -173.19.176.228:8333 # AS30036 -173.181.35.50:8333 # AS395570 -173.212.98.0:8333 # AS11260 -173.241.227.243:8333 # AS19009 -173.246.31.114:8333 # AS1403 -174.20.57.30:8333 # AS209 -175.27.247.104:8333 # AS45090 -175.136.174.174:8333 # AS4788 -176.9.17.121:8333 # AS24940 -176.37.82.83:8333 # AS39608 -176.74.136.237:8333 # AS35613 -176.118.220.29:8333 # AS60042 -176.138.233.166:8333 # AS5410 -177.32.50.167:8333 # AS28573 -178.21.118.178:8333 # AS49544 -178.41.11.254:8333 # AS6855 -178.79.83.147:8333 # AS3212 -178.88.189.254:8333 # AS9198 -178.154.222.104:8333 # AS200350 -178.159.98.133:8333 # AS202390 -178.198.23.120:8333 # AS3303 -178.250.232.111:8333 # AS31197 -182.229.145.161:8333 # AS3786 -183.88.223.208:8333 # AS45758 -183.129.178.205:8333 # AS4134 -185.25.48.184:8333 # AS61272 -185.26.99.171:8333 # AS44066 -185.31.136.246:8333 # AS47605 -185.52.93.45:8333 # AS39449 -185.69.53.153:8333 # AS62282 -185.84.224.116:8333 # AS8816 -185.107.83.55:8333 # AS43350 -185.116.94.239:8333 # AS39184 -185.140.209.159:8333 # AS44901 -185.148.3.227:8333 # AS47605 -185.152.138.74:8333 # AS6697 -185.153.196.14:8333 # AS15836 -185.153.196.162:8333 # AS15836 -185.156.37.30:8333 # AS202605 -185.156.154.129:8333 # AS41897 -185.158.113.172:8333 # AS28917 -185.165.170.19:8333 # AS3223 -185.190.24.72:8333 # AS9002 -185.199.209.52:8333 # AS49666 -185.203.41.148:8333 # AS9009 -185.209.12.76:8333 # AS212323 -185.210.125.33:8333 # AS205671 -185.233.189.210:8333 # AS61303 -185.250.36.66:8333 # AS1239 -185.254.97.164:8333 # AS44486 -186.235.86.249:8333 # AS263097 -188.27.79.235:8333 # AS8708 -188.35.167.14:8333 # AS34123 -188.68.53.44:8333 # AS47147 -188.119.67.137:8333 # AS9002 -188.127.243.41:8333 # AS56694 -188.138.112.60:8333 # AS20773 -188.142.199.17:8333 # AS21334 -188.155.72.160:8333 # AS6730 -188.214.129.52:8333 # AS16125 -188.214.129.139:8333 # AS16125 -188.215.62.122:8333 # AS203600 -188.237.167.51:8333 # AS8926 -188.246.224.12:8333 # AS49505 -189.6.221.37:8333 # AS28573 -190.2.146.90:8333 # AS49981 -190.17.18.190:8333 # AS7303 -190.210.98.253:8333 # AS16814 -192.3.11.24:8333 # AS36352 -192.69.53.18:8333 # AS11142 -192.146.137.44:8333 # AS25376 -193.22.128.12:8333 # AS39647 -193.39.142.89:8333 # AS60781 -193.46.74.252:8333 # AS395003 -193.46.74.254:8333 # AS395003 -193.95.249.3:8333 # AS5603 -193.149.176.200:8333 # AS40676 -193.151.155.122:8333 # AS49666 -193.187.90.122:8333 # AS3399 -193.196.37.62:8333 # AS34878 -194.35.184.95:8333 # AS9063 -194.165.30.20:8333 # AS35162 -194.191.232.153:8333 # AS1836 -195.32.108.164:8333 # AS3269 -195.56.63.11:8333 # AS5483 -195.56.63.12:8333 # AS5483 -195.123.217.63:8333 # AS21100 -195.128.248.153:8333 # AS25229 -195.140.226.154:8333 # AS35614 -195.160.222.81:8333 # AS31148 -195.206.105.7:8333 # AS9009 -199.36.253.252:8333 # AS16713 -199.58.100.115:8333 # AS25961 -202.90.242.93:8333 # AS4764 -202.112.238.128:8333 # AS4538 -202.186.38.99:8333 # AS9930 -203.12.0.167:8333 # AS134697 -203.12.10.224:8333 # AS134697 -203.210.193.21:8333 # AS45899 -204.228.142.211:8333 # AS6315 -205.178.182.133:8333 # AS396998 -206.55.178.157:8333 # AS10242 -206.192.203.0:8333 # AS7029 -207.98.253.88:8333 # AS12083 -207.115.84.47:8333 # AS18530 -207.255.193.47:8333 # AS11776 -208.104.92.74:8333 # AS14615 -209.38.244.87:8333 # AS2914 -209.204.29.18:8333 # AS395439 -209.205.204.218:8333 # AS55081 -209.237.133.54:8333 # AS53859 -210.6.95.127:8333 # AS9269 -210.205.146.114:8333 # AS9318 -211.221.42.143:8333 # AS4766 -212.5.157.40:8333 # AS8866 -212.51.136.50:8333 # AS13030 -212.86.32.106:8333 # AS15366 -212.162.152.149:8333 # AS24875 -212.227.150.147:8333 # AS8560 -212.227.155.170:8333 # AS8560 -212.251.162.190:8333 # AS2119 -213.109.236.129:8333 # AS47702 -213.141.154.201:8333 # AS12714 -213.193.83.251:8333 # AS6830 -213.193.83.252:8333 # AS6830 -213.202.225.122:8333 # AS24961 -216.83.150.142:8333 # AS5048 -216.186.236.98:8333 # AS12083 -216.232.33.24:8333 # AS395570 -217.64.47.138:8333 # AS39324 -217.64.47.200:8333 # AS39324 -217.76.61.78:8333 # AS39597 -217.92.55.246:8333 # AS3320 -217.113.121.169:8333 # AS8416 -217.155.244.170:8333 # AS13037 -217.170.124.170:8333 # AS35401 -217.173.236.25:8333 # AS8447 -217.180.192.116:8333 # AS30600 -217.180.221.162:8333 # AS30600 -218.43.123.236:8333 # AS4713 -219.77.79.128:8333 # AS4760 -223.18.222.210:8333 # AS9304 -223.167.75.165:8333 # AS4837 -[2001:1620:5566:100::62c]:8333 # AS13030 -[2001:1620:a21:0:da5e:d3ff:fee3:68a0]:8333 # AS13030 -[2001:19f0:4401:e8a:5400:4ff:fe8e:d398]:8333 # AS20473 -[2001:1bc0:c1::2000]:8333 # AS29686 -[2001:4060:4419:8001::42]:8333 # AS6772 -[2001:41d0:203:8f46::]:8333 # AS16276 -[2001:41d0:30e:8e00::]:8333 # AS16276 -[2001:41d0:403:3d61::]:8333 # AS16276 -[2001:41d0:405:6e00::]:8333 # AS16276 -[2001:41d0:8:83cf:195b:b202:9271:cc5b]:8333 # AS16276 -[2001:41d0:8:ed7f::1]:8333 # AS16276 -[2001:41d0:a:69a2::1]:8333 # AS16276 -[2001:41d0:a:6b4d::1]:8333 # AS16276 -[2001:470:1b55::]:8333 # AS6939 -[2001:470:1b62::]:8333 # AS6939 -[2001:470:1f09:b14::11]:8333 # AS6939 -[2001:470:1f0a:89a::2]:8333 # AS6939 -[2001:470:1f1b:5a6:216:3eff:fe24:1162]:8333 # AS6939 -[2001:470:75e9:1::10]:8333 # AS6939 -[2001:470:88ff:2e::1]:8333 # AS6939 -[2001:470:8ca0:2:7646:a0ff:fe9b:e662]:8333 # AS6939 -[2001:470:a:c13::2]:8333 # AS6939 -[2001:470:c:1077::2]:8333 # AS6939 -[2001:4dd0:3564:0:30b7:1d7b:6fec:4c5c]:8333 # AS8422 -[2001:4dd0:3564:0:88e:b4ff:2ad0:699b]:8333 # AS8422 -[2001:4dd0:3564:0:9c1c:cc31:9fe8:5505]:8333 # AS8422 -[2001:4dd0:3564:0:a0c4:d41f:4c4:1bb0]:8333 # AS8422 -[2001:4dd0:3564:0:fd76:c1d3:1854:5bd9]:8333 # AS8422 -[2001:4dd0:3564:1::7676:8090]:8333 # AS8422 -[2001:4dd0:3564:1:b977:bd71:4612:8e40]:8333 # AS8422 -[2001:4dd0:af0e:3564::69:1]:8333 # AS8422 -[2001:4dd0:af0e:3564::69:90]:8333 # AS8422 -[2001:560:441f:1::4]:8333 # AS18530 -[2001:5a8:40c7:f500:7a0d:d50:255e:dbac]:8333 # AS46375 -[2001:638:a000:4140::ffff:47]:8333 # AS680 -[2001:67c:26b4:ff00::44]:8333 # AS25376 -[2001:67c:440:688:91:236:251:137]:8333 # AS57944 -[2001:67c:440:688:91:236:251:139]:8333 # AS57944 -[2001:7c0:2310:0:f816:3eff:fe6c:4f58]:8333 # AS34878 -[2001:861:c62:2fd0:ca7f:54ff:fece:6d9]:8333 # AS5410 -[2001:871:23d:d5d1:5a47:caff:fe71:c8d]:8333 # AS8447 -[2001:910:109d:2c03:d217:c2ff:fe07:2cd9]:8333 # AS20766 -[2001:b07:6461:7811:489:d2da:e07:1af7]:8333 # AS12874 -[2001:b07:646b:8074:32e8:9243:a337:e60a]:8333 # AS12874 -[2001:bc8:1201:715:ca1f:66ff:fec9:5ff0]:8333 # AS12876 -[2001:bc8:1201:71a:2e59:e5ff:fe42:52f4]:8333 # AS12876 -[2001:bc8:1600:0:208:a2ff:fe0c:8a2e]:8333 # AS12876 -[2003:dc:2f4a:eb00:4ecc:6aff:fe25:c9a3]:8333 # AS3320 -[2003:f6:3f31:600:4c9f:7620:8324:d4a7]:8333 # AS3320 -[2400:6180:100:d0::848:5001]:8333 # AS14061 -[2400:6180:100:d0::940:4001]:8333 # AS14061 -[2400:6180:100:d0::953:8001]:8333 # AS14061 -[2400:6180:100:d0::a02:2001]:8333 # AS14061 -[2400:6180:100:d0::a0f:9001]:8333 # AS14061 -[2400:6180:100:d0::a3d:b001]:8333 # AS14061 -[2400:6180:100:d0::a3f:1001]:8333 # AS14061 -[2400:6180:100:d0::a49:a001]:8333 # AS14061 -[2400:6180:100:d0::a56:d001]:8333 # AS14061 -[2400:6180:100:d0::a56:e001]:8333 # AS14061 -[2401:b140:1::100:210]:8333 # AS54415 -[2401:b140:1::100:220]:8333 # AS54415 -[2402:e280:3d17:945:1889:d3c6:8e85:d3c4]:8333 # AS134674 -[2403:6200:8821:2fdf:3903:a2b1:9f:c897]:8333 # AS20473 -[2406:3400:216:8b00:211:32ff:feca:336b]:8333 # AS10143 -[2406:da14:335:b600:eb14:5fd:2072:3653]:8333 # AS16509 -[2406:da1c:50b:cd00:3cae:1728:ecfc:4334]:8333 # AS16509 -[2406:da1c:50b:cd03:36d6:13fa:eba8:6543]:8333 # AS16509 -[2406:da1e:a4e:8a03:d90a:fbb0:23d3:ccb4]:8333 # AS16509 -[2407:3640:2107:1278::1]:8333 # AS141995 -[2407:7000:9f71:2d00:1c5a:5292:5108:c734]:8333 # AS9500 -[2408:8207:2655:fae0::10b]:8333 # AS4837 -[2408:8207:5456:d8d0::5c6]:8333 # AS4837 -[2409:250:60a0:2600:a971:1cdd:3d5b:654d]:8333 # AS55392 -[240d:1a:4b1:e700:19:d9ef:7f3:8e75]:8333 # AS2527 -[2600:1700:3948:82f:ce04:d382:5226:4cac]:8333 # AS7018 -[2600:1f16:a08:b900:4bfe:2f81:ae31:5f5]:8333 # AS16509 -[2600:1f1c:2d3:2401:6989:b1fd:d2a6:fbc8]:8333 # AS16509 -[2600:1f1e:2fe:3601:63a8:ebf6:83e4:1932]:8333 # AS16509 -[2600:2104:1003:c5ab:dc5e:90ff:fe18:1d08]:8333 # AS11404 -[2600:3c00::f03c:91ff:fe4b:c52]:8333 # AS63949 -[2600:3c00:e002:2e32::1:c8]:8333 # AS63949 -[2600:3c02::f03c:94ff:fecc:c99c]:8333 # AS63949 -[2600:6c4e:a00:cd0:428d:5cff:fe58:4884]:8333 # AS20115 -[2600:6c54:7100:1ad1:c92e:36d:651:bd18]:8333 # AS20115 -[2601:184:300:156c:ba4c:30:9da:6c06]:8333 # AS7922 -[2601:185:8302:12f0:1ab2:2840:9de4:1550]:8333 # AS7922 -[2603:3003:11b:e100:20c:29ff:fe38:bbc0]:8333 # AS7922 -[2603:3004:6a1:3800:851f:584d:7aba:affb]:8333 # AS7922 -[2603:3024:18ee:8000:20e:c4ff:fed1:ef15]:8333 # AS7922 -[2603:8080:1f07:6fdd:7de2:d969:78c9:b7ea]:8333 # AS7843 -[2604:4080:1036:80b1:50e1:43ff:fe0e:9df5]:8333 # AS11404 -[2605:6400:30:f220::]:8333 # AS53667 -[2605:6400:30:fd6f::4]:8333 # AS53667 -[2605:c000:2a0a:1::102]:8333 # AS7393 -[2606:6d00:100:5102:3d2:f06a:c2e8:a54]:8333 # AS1403 -[2607:5300:60:2e54::1]:8333 # AS16276 -[2607:5300:61:854::1]:8333 # AS16276 -[2607:9280:b:73b:250:56ff:fe14:25b5]:8333 # AS395502 -[2607:9280:b:73b:250:56ff:fe21:9c2f]:8333 # AS395502 -[2607:9280:b:73b:250:56ff:fe21:bf32]:8333 # AS395502 -[2607:9280:b:73b:250:56ff:fe33:4d1b]:8333 # AS395502 -[2607:9280:b:73b:250:56ff:fe3d:401]:8333 # AS395502 -[2620:a6:2000:1:1:0:d:3015]:8333 # AS27566 -[2620:a6:2000:1:2:0:3:266c]:8333 # AS27566 -[2620:a6:2000:1:2:0:9:930b]:8333 # AS27566 -[2620:a6:2000:1:2:0:b:3011]:8333 # AS27566 -[2800:150:11d:2426:62b:b164:704a:6962]:8333 # AS22047 -[2800:300:8251:b50::d]:8333 # AS27651 -[2800:300:8251:b50:e92:64f5:22af:c31e]:8333 # AS27651 -[2800:40:15:6ad:48e8:2200:a882:e08e]:8333 # AS16814 -[2803:5180:4100:4000::2]:8333 # AS52468 -[2803:9800:9447:84bb:cab8:d2f5:388c:9a57]:8333 # AS19037 -[2804:14d:7e33:83b0:6e41:1ccc:cf20:aff9]:8333 # AS4230 -[2804:431:e038:cd01:aaa1:59ff:fe0d:44b8]:8333 # AS27699 -[2804:d57:450d:f00:a422:9828:b00e:91e9]:8333 # AS8167 -[2806:2f0:5020:d287:4dcd:6204:909b:4125]:8333 # AS17072 -[2a00:1298:8001::6542]:8333 # AS5578 -[2a00:12e0:101:99:20c:29ff:fe29:d03f]:8333 # AS6798 -[2a00:1398:4:2a03:3eec:efff:fe05:d93e]:8333 # AS34878 -[2a00:1398:4:2a03::bc03]:8333 # AS34878 -[2a00:1768:2001:27::ef6a]:8333 # AS43350 -[2a00:1f40:5001:108:5d17:7703:b0f5:4133]:8333 # AS42864 -[2a00:23c5:fe80:7301:d6ae:52ff:fed5:56a5]:8333 # AS2856 -[2a00:23c6:5c8a:5c00:c05a:4dff:fe65:9d69]:8333 # AS2856 -[2a00:6020:4503:3700:5054:ff:fe90:640e]:8333 # AS60294 -[2a00:6020:b489:2000:5054:ff:fefc:5ed8]:8333 # AS60294 -[2a00:8a60:e012:a00::21]:8333 # AS680 -[2a00:bbe0:0:221f::246]:8333 # AS47605 -[2a00:d520:9:9300:420b:544e:8019:6d3a]:8333 # AS15600 -[2a00:fd40:c:c::c]:8333 # AS3269 -[2a01:4f8:171:1f16::2]:8333 # AS24940 -[2a01:4f8:200:7222::2]:8333 # AS24940 -[2a01:4f8:202:4205::2]:8333 # AS24940 -[2a01:4f8:242:2016::2]:8333 # AS24940 -[2a01:4f8:261:420c::2]:8333 # AS24940 -[2a01:4f8:272:4cd9::2]:8333 # AS24940 -[2a01:4f9:1a:a966::2]:8333 # AS24940 -[2a01:4f9:1a:af0d::2]:8333 # AS24940 -[2a01:4f9:2b:29a::2]:8333 # AS24940 -[2a01:4f9:5a:44a5::2]:8333 # AS24940 -[2a01:7a7:2:2804:ae1f:6bff:fe9d:6c94]:8333 # AS20773 -[2a01:8740:1:753::e5cb]:8333 # AS57344 -[2a01:8740:1:ff2e::9428]:8333 # AS57344 -[2a01:8740:1:ffc5::8c6a]:8333 # AS57344 -[2a01:cb00:790:f500:110b:b446:2260:7d2c]:8333 # AS3215 -[2a01:cb10:336:cb00:61ac:d15d:4ac0:2cbd]:8333 # AS3215 -[2a01:cb10:336:cb00:d237:45ff:fec5:2cd0]:8333 # AS3215 -[2a01:cb15:804c:8000:21e:6ff:fe51:2c32]:8333 # AS3215 -[2a01:e0a:185:55f0:a0ba:9eaf:9853:92b7]:8333 # AS12322 -[2a01:e0a:301:7010:b87d:e14b:cea9:b998]:8333 # AS12322 -[2a01:e0a:3b3:1420:7ca0:3a9a:5cc3:b644]:8333 # AS12322 -[2a01:e0a:5:9390:bf35:4d41:8a2a:570]:8333 # AS12322 -[2a01:e0a:9e9:c240:8e3a:af64:4f0:8f79]:8333 # AS12322 -[2a01:e0a:b0f:37e0:a13f:e65:ac42:8e36]:8333 # AS12322 -[2a01:e0a:b5:7f50:c257:a55b:4846:97e1]:8333 # AS12322 -[2a01:e0a:bf6:8d70:20c:29ff:fe30:4fd2]:8333 # AS12322 -[2a01:e11:100c:70:39f3:e3c9:832f:37a]:8333 # AS12322 -[2a01:e34:ec1d:7100:8aae:ddff:fe02:4159]:8333 # AS12322 -[2a02:1210:7c92:5100:211:32ff:feae:152d]:8333 # AS3303 -[2a02:1210:86bf:f100:a9ac:d041:1f8e:6925]:8333 # AS3303 -[2a02:22a0:bbb3:dc10:50e1:57ff:fe70:9492]:8333 # AS1136 -[2a02:247a:215:3e00:1::1]:8333 # AS8560 -[2a02:2c60:f103:7c0:1a31:bfff:fecc:5d91]:8333 # AS9063 -[2a02:3102:4d5c:f000:dea6:32ff:febb:b9cb]:8333 # AS6805 -[2a02:3102:bc00:10e9:ca5:9dff:fea9:1cbb]:8333 # AS6805 -[2a02:390:9000:0:aaa1:59ff:fe43:b57b]:8333 # AS12496 -[2a02:768:f92b:db46:5e46:772b:71d:29b7]:8333 # AS44489 -[2a02:8070:f181:f600:bcb:2d1:d790:78ff]:8333 # AS51185 -[2a02:8071:6380:c500:7285:c2ff:feb5:a39c]:8333 # AS3209 -[2a02:8084:2021:73f3::66e6]:8333 # AS6830 -[2a02:8308:8188:5100:6d8b:4531:4331:eee2]:8333 # AS16019 -[2a02:8388:e302:7980:6f85:a0b3:4b4d:8b0f]:8333 # AS8412 -[2a02:8388:e5c3:4a80:201:2eff:fe82:b3cc]:8333 # AS8412 -[2a02:a31a:e03d:9400:3f18:2729:c86:d754]:8333 # AS6830 -[2a02:a45a:94cd:f00d::1]:8333 # AS1136 -[2a02:a465:80f4:1:f369:4ef5:aa12:7566]:8333 # AS1136 -[2a02:ab88:20b:ce00:223:24ff:fe56:6202]:8333 # AS21334 -[2a02:c206:2016:2394::1]:8333 # AS51167 -[2a02:c206:2162:5603::1]:8333 # AS51167 -[2a02:c206:2162:5605::1]:8333 # AS51167 -[2a02:c206:2162:5606::1]:8333 # AS51167 -[2a02:c206:2162:5856::1]:8333 # AS51167 -[2a02:c206:2162:7348::1]:8333 # AS51167 -[2a02:c206:2162:7352::1]:8333 # AS51167 -[2a02:c206:2162:8026::1]:8333 # AS51167 -[2a02:c207:2034:7358::1]:8333 # AS51167 -[2a02:c207:3006:3185::1]:8333 # AS51167 -[2a03:cfc0:8000:2a::9532:6507]:8333 # AS201814 -[2a03:cfc0:8000:2a::9532:6510]:8333 # AS201814 -[2a03:cfc0:8000:2a::9532:6511]:8333 # AS201814 -[2a03:cfc0:8000:2a::9532:6516]:8333 # AS201814 -[2a03:cfc0:8000:2a::9532:651d]:8333 # AS201814 -[2a03:cfc0:8000:2a::9532:6520]:8333 # AS201814 -[2a03:cfc0:8000:2a::9532:6522]:8333 # AS201814 -[2a03:cfc0:8000:2a::9532:6523]:8333 # AS201814 -[2a03:cfc0:8000:2a::9532:659a]:8333 # AS201814 -[2a03:cfc0:8000:2a::9532:659d]:8333 # AS201814 -[2a03:ec0:0:928::701:701]:8333 # AS199669 -[2a04:ee41:86:50b6:fa75:a4ff:fe3c:243f]:8333 # AS15796 -[2a05:d012:42a:5703:4dc5:8116:787c:e016]:8333 # AS16509 -[2a05:d014:a55:4001:f6ab:dd5e:4039:b46c]:8333 # AS16509 -[2a05:d018:a75:6c00:c05b:4d0a:3658:1030]:8333 # AS16509 -[2a07:9a07:3::2:1]:8333 # AS202605 -[2a07:d884::130e]:8333 # AS6762 -[2a0a:ef40:e44:9b01:2746:ca1e:6788:351c]:8333 # AS1273 -[2a0b:f4c0:c1:920e:b25a:daff:fe87:77b4]:8333 # AS205100 -[2a10:c941:100:24::2:1001]:8333 # AS141011 -[2a12:8e40:5668:f001::1]:8333 # AS34465 -[2a12:a302:1:a180::b5ca]:8333 # AS23959 -[2c0f:f4a8:b:b108:807d:b2d6:9146:38be]:8333 # AS37254 -[2c0f:f4a8:b:b108:c458:5c61:dcca:cb10]:8333 # AS37254 -iy7go4454pb4p2zmnkwrgsi6v6oqv53zxnmalz6rnfjemxftapfa.b32.i2p:0 -j225nrmndwviihpe7ib6mm5h723cg62wrb7vnwofopv472ue3zwa.b32.i2p:0 -j2m526lqsujvt6b6xl4ipzbjkvkuecrye3vkggwo6jadvzqu7f7q.b32.i2p:0 -j2pyenyhoppsjexenznxvgqrcs4buv4nssctowgpg6czdoo3nyiq.b32.i2p:0 -j3usxovx7ukl645u77jud2mpmrk7ryh5yaxno6rceu77hqlxkuta.b32.i2p:0 -j42dsnjlg4vv33tshgs5jyham6plf3suj2sn2k6ew4tmcz3fpaqq.b32.i2p:0 -j4tjrfxnwcmbhkixmqlnotginhfxgfdvjahr6yn7j7rkbdqngh4a.b32.i2p:0 -jb3iui7grnljdjmsz7qbustrl5vn3ip3upnkzbaegaiklric7cha.b32.i2p:0 -jbmqtghha7hscwbwpi7ps2dnghq2bvxjnfeb5glngnvgjmeackaq.b32.i2p:0 -jd43pc2l73ek6hk2tp6hiyada7ed7vshqo2fvxbga2daylcghfyq.b32.i2p:0 -jd63whebd5yuls7r34mi3lnnuuhqxxr4lns672tzliru4vk7hwrq.b32.i2p:0 -je6ju6ihybxm5wkw5daeqjet74lscvi4ls5wn5wf7kiaczfggafq.b32.i2p:0 -jeidstlwdlt63lju7cnj2mh4fofysjnc2wcvilphynprd7jw64ma.b32.i2p:0 -jeox5nruuoopedsfpuoi6kwewmhbbsnhf7kib2q6oafvchxvmnnq.b32.i2p:0 -jex3ykw2nmw7owhgbtio5flv7us624bxwp46nr7rhmteujrmtvvq.b32.i2p:0 -jfdh65i4nhpg4obnoe4aqi3vzvbi6fyzjj2ee7s3qm2gbcnllkvq.b32.i2p:0 -jh2qxkjqngj2m5tn2ecaidfqac4awgnmkgsajntoqs5qqyjtp5yq.b32.i2p:0 -jh7ev4a5zfzmeyekinhtbqfi6c7xhvc4msdpyi67j3sxl6r44ukq.b32.i2p:0 -jibaw7ynbnxueqsy7k7jyvoj6ldzbuckppfx5wozt7mftihy5vcq.b32.i2p:0 -jicc5kwy4tv4j2nn6gfbis7e6dxy2kdvet3zpxdbyp74h5gpnxuq.b32.i2p:0 -jimdydczt6e2lceezopnl4fgz7q2jeqqhlqaxrgen33ouxk57xiq.b32.i2p:0 -jjangl6h4py2pd2gwamhqlsymyuocmpioneinzf5bb5qvvdjzzqa.b32.i2p:0 -jk56z3febpco6rbkpzzv3jszf4px5uztmoxzkpss7mxnzqlpsdla.b32.i2p:0 -jkfuajo4ayvo2rbv5qdj443q6adqmnormbhsf2f7rlp5t24xomda.b32.i2p:0 -jkvey2vfdto2ucudi4jlgsbpmlls3uwmlkjonfhk5yminkwzwi2q.b32.i2p:0 -jl4vr5kac7njyltivn7ut5afyq5ipzc5woxl4523emodxixci3zq.b32.i2p:0 -jmebfluhrl6ad5pt4ipevf3g3a4trcu7axalpubpkir6zlwovm5q.b32.i2p:0 -jndr5i4qhxs6aa2bqvufrgttq6enavyghi54dqfuku2qnstdqa5a.b32.i2p:0 -jopiw2tup5h5xh2hwef4oflgskawbpfmswub2iosmqocejijd4fa.b32.i2p:0 -jrert3o2rhbkpquybwg7tq4bdvlxeh6lnlcr5ddexkuguvi2l2pq.b32.i2p:0 -jrobuecgmuuqmpdsbxwbqeldt2735cgcemngoasnbbkdz2ufdlmq.b32.i2p:0 -jrvg22xvbmjyrkqg7mr622zhnda3ijtua65cqngwrven7sf5zd7q.b32.i2p:0 -jsg4dsxvgjcqz3c2qgtwi4ip3l4n4hlxodbvgukwaipycwo26zua.b32.i2p:0 -jt35uwbl5wx7ponyxomksrjjs7zy5yymvtud3nmogt7ci7xxlm2q.b32.i2p:0 -jvaoh33cpczp626ldwr4azh4hb5cjmxlbz3dq3cxisdlzn7z25eq.b32.i2p:0 -jvlj7qyxcmolf76wneyvmdxrpiezsxkiimapwxbdbiw2phvlyjba.b32.i2p:0 -jwqlvqmfvodnrslde2idqt25qxiyvgqdlr2q4uod5s6lkmlempya.b32.i2p:0 -jxjc7oe24vxdepkfvl365qfwrxcad2f3j43fnfuchtvqqkqd2rzq.b32.i2p:0 -k4mch53m72zv7jdda3poa2zn7bi3jacqwfb45peealxbhysdozcq.b32.i2p:0 -k4pjt6m25dcxno3udek6rasooz5ztqnywa3f2owpvcjzvisg7nga.b32.i2p:0 -k5ars7hsrfubadroe5h7oypjnqwi6v2vxxy6rmns7zubf66aivbq.b32.i2p:0 -k6eeshsk4vf34b5gfnraz4p5qb6scv4kw6eiltebel5exw6keppq.b32.i2p:0 -k6gt64xby5igmln5hfcuzspt2tndimzrdvj65yo76h22g5yhlvja.b32.i2p:0 -k7kcnrqe3ybqu2w3fali7zext6na7o5o65rx6f5oqza2lonsry6a.b32.i2p:0 -kbawcieyelwwitrjow537zpmdkncwiq42rhjgayw5o7u562mk23a.b32.i2p:0 -kcqkothplemakipfpeajxmu4xsszpaxpprgtuv5tgfdaqejg2sqq.b32.i2p:0 -kdrcbr6wg2bj6oipsbeqy6bp3v7dqpth6cheviysmvo4bdta7fda.b32.i2p:0 -kehosmgk76fxnjywqjj6nqs4ohg4hsutljdzjo4sswhxlj5l5tca.b32.i2p:0 -khxruoaom7juockko2tbxqo3bnrjmoqjhdoady3yyr4qacz4somq.b32.i2p:0 -kjaa3zlp4sipfxikketgvlx4oxq5ok57ifxenbiewmsrew6lcw7q.b32.i2p:0 -kjvrzgckasb57yqhluvjblx2ngxstumfg6uufz5mc7zyetkjlr7a.b32.i2p:0 -kkihsh2faw2gxil6it4glol4u37ccruuzsusyikquzmkffj3wn6q.b32.i2p:0 -km3b5j6cqrcqewdpuveibptw5gguwktwan36jlow4xykpg2dgr6a.b32.i2p:0 -kppcor54kkge6cgq47nzevlfrhbxingcjfmk2emkrdaejpixkqdq.b32.i2p:0 -kskidltmbigp2etp4pdl67ke2qzjjw66wqairzr4wn2apq4o7bka.b32.i2p:0 -ksxxinje357zctkobwnxsy44ddivq7yp2n3n5gopk4okir2vghaa.b32.i2p:0 -ktua3j43ijxhhhfeljsp32kdiuic5nlnfnkx3ealy7ojva4vwkoq.b32.i2p:0 -kuzu73gzvlnog4cdtdk7edbusxr4pigknvwg2bjo6l46ugsgmrtq.b32.i2p:0 -kw3v6gq5semgt4gg6itum3qtaylanyof7wn6bnbngdeby4xixuoa.b32.i2p:0 -l364nudwoj63fe5nsjmniiun63e3ycdqrjyknbfixxtre5spx7ga.b32.i2p:0 -l3ach5wbdx3n5nq53sv6tagijrbse3nwa2gkqz5oj7aifyaizpcq.b32.i2p:0 -l5fita4r7niir3hxmu7mzcwrigxinkrn4oqeembdkgao7k2yztha.b32.i2p:0 -l5obkk7zzop3nztnt6ijugz4okqsyhhb5o6gkbqottgqzzzcgvla.b32.i2p:0 -lai3534z6zs2tukzixdagrciezum2bkyuask2srxjrn67yu4c57a.b32.i2p:0 -lbif3mgg2b2ir5dkz7u6iatdrui2h2a64vlmffcfgqnpjuvwzaxa.b32.i2p:0 -leu37bptuuu5377mi7cb5t2vsu4hesblyxl5zptnnk4vodhovwea.b32.i2p:0 -lfuvzzzceuik5u5pnd2i67amegel5ua2rrnncxkyyc7bhteq73aa.b32.i2p:0 -lgpojpoix7zd6dhpo5hdrnwm4ueyjvi7tbot4qsqybk3upuocnpa.b32.i2p:0 -lh7qjombcmiekvv6niz5eflr55cnd3oxx7nuus6vmehqfodr67za.b32.i2p:0 -lhupu3owhuc7qwvyfazgkbcmr7sjp5qqxps732vy52v67fsn5guq.b32.i2p:0 -li4vuovafxjrf54kvfg3mjrg2mebs6edpl5yrr2dohddvgmxjyvq.b32.i2p:0 -liu75cvktv4icbctg72w7nxbk4eibt7wamizfdii4omz7gcke5vq.b32.i2p:0 -lmlf3yjyg4djrb7wtzmrb4fbkorqba7k4lvk7ax4omay4mbytupa.b32.i2p:0 -lpal67whroip3c2yj4fxbayj46d3tr5osyqog6el5n6ctktdnakq.b32.i2p:0 -lpektonr2uyiohuzi35shtj3oaa77rklmqsivuydxkcxkea2dwuq.b32.i2p:0 -lpffyejskwwap2go7ommmryex2autlkmcnnpk2tm6aitxcalwrha.b32.i2p:0 -lpqkgbek3ci3w4qobpeqepjor3bukz555rzlmghck4o7wwb7ajza.b32.i2p:0 -lprgmkc45te7skx7rffpz72ca5c3zdg3tabiksdboao5w4wceu5a.b32.i2p:0 -lqn32kgic4cincyqlybpwbywcrowcxmscfcm4mqt4fgp24qs3y3q.b32.i2p:0 -lrah7acdsgopybg43shadwwiv6igezaw64i6jb5muqdg7dmhj3la.b32.i2p:0 -ls52j74gwtsrqhlgqcai2cjl2rcivfib7jzovc4454h6tq3i6k7q.b32.i2p:0 -ls5otp5mybmxqsaeaid7wlori2ukieehr644adjfwdxux7jxlvga.b32.i2p:0 -lttdnbluvybzbjq52t5vbdkk3pvzc6zyi2oji7yjdpcgtgz732bq.b32.i2p:0 -lunkwblewltvq4spt7j5u2nfpqyndvgepl7edkiru322mmtpy2lq.b32.i2p:0 -lvdbqavgdom5h5denwkmdwslfzxckf6eddwflelbog7tgo2m7usa.b32.i2p:0 -lwjrapkfexjyjqf2rrdr4ghhxmlr3jdygsonetgtheglvmru5x6q.b32.i2p:0 -lyg26sjkcx5ied5a4a7jdxmfeplfcnux3fux5rsxzkm5mgbbsllq.b32.i2p:0 -lyqmygrc6gujxa4xlnwqku3vtfkbrszdiirsagn6xd2yw4kvodrq.b32.i2p:0 -lzuu6mjtu7vd55d2biphicihufipoa7vyym6xfnkmmlra3tiziia.b32.i2p:0 -m2k7ajij2wvgfpsbg32zuorbsjt72iye3ozz6dbyxtj57fx7xsqq.b32.i2p:0 -m3hlmj2gz2co5gu4ss3wj4b7ebeg2xbkrr65ogxvhn76uxna5qma.b32.i2p:0 -m4o2kndr75clxemwbq5m6vnok7eiqshf42wjjvag7dtwxtafxhra.b32.i2p:0 -m6bpynxkv2ktwxkg6p2gyudjfhdupb6kuzabeqdnckkdkf4kxjla.b32.i2p:0 -me6x2p4m6jw3cxi2xl4a37u4orzmv3xdopr5t2vgwjmauiuqrmzq.b32.i2p:0 -mf6tmlegp7uga66cdael5376uaz4qd3wacuh44yvepa3kbu4fk3a.b32.i2p:0 -mhgxec57s6h7eixgemsghlcuhmgh7m7p7phqd5kzmm4wovrp2pqq.b32.i2p:0 -mjpulaafdyuanouslfpjcsvumi4edtckfu3ffn3ipabkxj4sn35q.b32.i2p:0 -mlakhs4ixcqwvk4vo4ce3loa54wmdlfingk73jookrkbra6ppq4q.b32.i2p:0 -mnkqn3r4jmg6vrmlprabenndyft2z2jw6g4nsnolt434coiklmyq.b32.i2p:0 -mnrbc3qi4zuk2tzghmy55kplawncih6jkmt75qczfu27enu3gcea.b32.i2p:0 -mnrrefebq3yxr2avprp3ay7w42sx27ijv6stjljzpwohnfnkg26a.b32.i2p:0 -mo27t6wym666b3wfauhndqocbetdsssxksep6x4dcpuh5dxe76oa.b32.i2p:0 -mo6mp2tymma5l2swob6kqzzb25ccmgccfj5pic6omjkktv4wve2q.b32.i2p:0 -mpi7bivbr2pywsgasslw5we766m757os2667h3hqnhcftaszdv3a.b32.i2p:0 -mpqb3jdmdibarrflyiik5wj3ekitxpe2oqieztlax3uomxspgsvq.b32.i2p:0 -mqocuhx3qwcwfuuin42yuhtqgm76drlmfvzikf7urot75qw3ykpa.b32.i2p:0 -mrbhw6ow77bjqmb67rurbkcl4xs2ocj4pti6hnz4wcsg6bduwtya.b32.i2p:0 -mrypjr2fagjhg6z4ixr73f5npkeyoxsjamcdv5uc6oj5oi2ylsvq.b32.i2p:0 -msjl4a7mdp7x2bcllmbxurhfmtxvolykonz45psmh7j6pptfyy5a.b32.i2p:0 -mtlznxqya5nbuyorybzul4cpdlrnvlrhalx2eogwjce5j32js5wa.b32.i2p:0 -mv7b44duaxqpzbdztnrdvnj6ypsp7yhs4z3dc2q64jov6pritmja.b32.i2p:0 -mvs5a3s6rgfbvvgq44wzyd57vf5pr3jcthc5qdo75xgj4slsm7tq.b32.i2p:0 -mwcqoe2lu7u6ogwo77kr5sr4wx6pxnotkdeck3yyjfh4uklytj2a.b32.i2p:0 -mwevh5r5dkzddlo2ol6bojpdds3kno4xqoy6p6ulid3paamgrtla.b32.i2p:0 -mwyjzdrgtypbwjyulw4ifetejz6xusqstvzylztsphpg2r2zf7ua.b32.i2p:0 -my66tuvzfyy6kkbdeqvgfpk3xuoxerucxt73tw6wxv3ian2p2snq.b32.i2p:0 -n3f4ngbs2igvp3j27vsi7thguqxoyvbfenaqhgypuqdz5iovek2a.b32.i2p:0 -n3fa2yuf3i3opdktiwyxzhbpudcut73valxdrlre2xs2ooepddaa.b32.i2p:0 -n47e4gkf5xujcamnsarfuy7435hfsgs4zhndcxaw2evafn6r2rma.b32.i2p:0 -n4n7bivjb2mffgll2ulpwyb4m2oomv5roxtdj6bmlb4cgpf3wdja.b32.i2p:0 -n4zwusew5coibur4p2g436ktc3cyogz3sklztu6ruulag3je6ita.b32.i2p:0 -n7ykk3cxcqzcoeipo7ghzb62ko4d6bxzfgenzxistvg6fuclebva.b32.i2p:0 -nazasriqoa6qoxdlgzjwsggubxl6i4nge5q7om7nijaqi24ulgua.b32.i2p:0 -ncdjjthck6v6phz4laddyc7a7czoujys55melfcoptvl2h4izqlq.b32.i2p:0 -ndtoi53fz7e6ml6v6jn33675nwciw7mu5msn7afzbhebprusqg7a.b32.i2p:0 -ndunnsjyp6l4w3jebow4zgsfrdsy2lrapjgslb3tv7dg6oypfbwq.b32.i2p:0 -ndx23xqvt4qezezih4wlj7mqtwc4nzbvmgseq6fc6e2ddywrmkwq.b32.i2p:0 -nejmippeopyo75wd3gjrhca3fr5mo2g37owzwdezxmg7uhx6ygxa.b32.i2p:0 -nfsi3fenzrzoccj7bpzuvjbxnij7dmzuprg7ia4geuortoquja7q.b32.i2p:0 -ngn5elnvbm234yyun5kbjyr76oy5nhrvyckn33cqcbx25hw4lfoq.b32.i2p:0 -nhpbv2ravt6t5fhxyvuhrxyma37wph6dzuzpddlw3uoivzl6tx4a.b32.i2p:0 -ni4ns3ou7v6zh5qrawvkwnmshnrzcyc5zojkw647rrniplmurrba.b32.i2p:0 -nigrfbou3zt6wxegn5im4cyminjcjmbsqror7ntcr5i7yv6chwvq.b32.i2p:0 -nij7pzb6mhrra5glb3dyghjt55sngwrikzdlagmpsf7jn2onvoaa.b32.i2p:0 -nisd4was4gm3pkvuwjh3sbaoo35jtxop6y2d7ug4iol4cffkrk5q.b32.i2p:0 -niyz7v5fdhqqtlr4y3tcgdoeu3myntub4trzvgixlgjbmowccgja.b32.i2p:0 -nloq52novup3cawccvaakmbudooatwkw7dqltnr6q3j4qy7r6oia.b32.i2p:0 -nn7p4y7pun3m3txaqbkeptkxykzwrf75ru2zimadnewj7g3r4una.b32.i2p:0 -noj7le7kkj54umo6mdftagvvk327cuir7q75bnvuphrxa7kjujna.b32.i2p:0 -npcmehkhh4z2wtk3f5426izrytvqvyf6aa7hyx6hf6jdbxveqima.b32.i2p:0 -nrrg4p7tztllzthlkqzomqi3dejfcak7t63n7zzuomt5atzz5m4a.b32.i2p:0 -nt3ysas4wpjgkft5pohrfstm2vgj7t2vx34u32voy7rqon7dlbga.b32.i2p:0 -nu2ao72zway2ponkhrf322wyfrrn4mdmyp7n5q5xzmjhcge5odma.b32.i2p:0 -nufliiw3uav3tzdalit224yhbfpcjtgfrm5ic7ob6l3mmsay6cpa.b32.i2p:0 -numilh7hhhf6inzkzway3hzif4kiroqstxqbz7hzvoy2ctgpaqda.b32.i2p:0 -nuwphtuudfrswids22qjq63zgxh5wu7erafl36jyniuxhz75ikyq.b32.i2p:0 -nvmuuajhaw74g565l3a7dpezs4rkzm22ub5jhh6mdvzu43j4a6dq.b32.i2p:0 -nz4lq7pmswngaevv2uqyainqzutfxlkavxgde2w2slo2p6e2kcfq.b32.i2p:0 -o5ijpzor3en5xnndm3ntti7o4fxvv24t3veh4g7mahk7ogesb67a.b32.i2p:0 -o6b747qkpgu6gvsem7leylvmxsaaqby67pu55fmqn52dgazuvbxa.b32.i2p:0 -o6t4fr5ayfadzieutstgwcllvwxeuzjlxmzsmpj3hpkvefhzfaea.b32.i2p:0 -o6vbupdnpd5bwvcx7ivaecgyo7x5vdu5em4va6cmx5iwcf5tyaca.b32.i2p:0 -oaeqbkgpek4qnm3nly76x2tfrad2tun2xefliez7a3uxddeq4i4a.b32.i2p:0 -obf5kfk5n4nnsw7ez6ls6chqu4lz4wlck7utwvmjnlin4nzfnspq.b32.i2p:0 -oeydvkjoeqy3473wxkkbmoc6zz5m6zcmf6ov2hfkci54efsityua.b32.i2p:0 -of2gy2vblht57tn6yfczslnmp2xybdiazzta43y24w76tl6tu2xa.b32.i2p:0 -oggn6qbpmbag224gumagzgno53mgozb65tpzt5lezjbfbbiqky4q.b32.i2p:0 -ognn4mwwtmtjbrnq2kur7spcfohivxlrvz3sfamt3t46pk2e2ibq.b32.i2p:0 -ogqdcq2igslh3n5jn3utz2vpevttul366bt2246vilfnowuyvova.b32.i2p:0 -okjamsyd4wutvhfhsffejwk6ioru4mmvwagfssoy5hcocg2gj76a.b32.i2p:0 -om32whhwvcsbrf4g6uh5hupsl67oapccourkxyr7uf5zwaqxtxbq.b32.i2p:0 -ommky7qetuh45h4lk3raili27fnbhsgxv3zucinoaymnymo5735q.b32.i2p:0 -omngcjfwtiyqwbfqqggzbkttqgm3blywu43kpto2py2e4gp7fhra.b32.i2p:0 -opnpvz7mzfw6nypgmnn5zgtlzx7xuc4w7vat5bsr4mdtp77kz7eq.b32.i2p:0 -oqrl573nw6my2o5mup6uq6pm5immw3gnviahig5cceges4wfnyhq.b32.i2p:0 -orvshryqq24l24e4dvockx2ekj4hu42otqxsvyvy7tm7hhdjsz7a.b32.i2p:0 -oukeldqgovavh3npgb2by7w6hug575uae24z6uqfdl6flh7ma6rq.b32.i2p:0 -ovnk3wfbrkvvute6vkn5glhdtlxr6nyvebiflvr5l6ws6sorpa2q.b32.i2p:0 -owexluejb3eszx4p3b6zuxyggsxxtkxfgxoylkagfecs3bgfnpja.b32.i2p:0 -oz2ia3flpm3du2tyusulrn7h7e2eo3juzkrmn34bvnrlcrugv7ia.b32.i2p:0 -oznpphdisfvlcjgkvny6ma62wy637nh4vtpxww47ifpmlqkjv3ba.b32.i2p:0 -p3au2w5jnkqugxnkukj4rusvynvz3oxawdf4ajzeyxvfvyzhmetq.b32.i2p:0 -p4tsqwvdpaitvlgaujfr2m2qbr36qiwusas5zkiut7w2wjcp3sqa.b32.i2p:0 -p6o3tzllswm2j4wah35niry4tcdu6lq5b67ehevcx45sae7pb6da.b32.i2p:0 -p7ifeij3vhds3diihx5qimucyzgck5omfkqxc4pkbbjtfu4hp6wq.b32.i2p:0 -pbag76x5yyo5d3wypvtohxmgbtdrjjb35ljnq4w5fpoguyt5mj6q.b32.i2p:0 -pbftrtdthbj5qcecraden3hdvwomqrgseec6ib5h24n2zcivdqaa.b32.i2p:0 -pc4d5v74tr4vz54pbr57ejga765ep6vwk5kox55gfobi5572apta.b32.i2p:0 -pcc6cnry4maul7zlbd32khalaavkcbw5hdjuk4zjwposaorjicca.b32.i2p:0 -pcdlqw2awppohbiued4rffgs6n3lv3thhon3r67jmx2652qx2khq.b32.i2p:0 -peteksofgwgndsdh6ovh2ydkrgpyqgttit4ususs4bzksvdqkbea.b32.i2p:0 -phendyytrqdr2vfsw3kil6yui5vb2p4v5xuddezg57wsdw5uyquq.b32.i2p:0 -plhoz53xhplmyuejnsg5bkfe24ow3pbldysoovuupu6qwb3nttca.b32.i2p:0 -pm4nukrzndd2lvd3shivpjrcbjlontmxhag2xzdf572snwbr3p6a.b32.i2p:0 -pn5cx32ljrvzj6x7hpgyff3rlftextqpp4zn3nkfufrrpnpuimzq.b32.i2p:0 -pnhspu3rloczdbzsysa2iftsgoiy3zgcd22jodmk7zdjanhiemla.b32.i2p:0 -ppe2jfsb2xrmgwugbq7agy44ucb6yq4qbufaf2sh76b4kwpa4jcq.b32.i2p:0 -ppez53yrs6lanyvyxuxblqxiuvhnqvvtafmwaid2kgp2dx2v5iaq.b32.i2p:0 -pqnqwxl7jsrok7vgpgcvlxwlkg6yckx33n3g4xf5lvuntwn63b6a.b32.i2p:0 -pri376r6uuwgnbnevki7c363h4ryfwjza7pcbfswqqxk6hnrkhja.b32.i2p:0 -pscw5yzaj5js2fn7gzrzoj6teonlsohlbnvdco65ubdefpnpwhpa.b32.i2p:0 -pt3mqmvkv7aleja7vattlysu6x7gjnbwqvwtu4skzabvkjztfi2q.b32.i2p:0 -pu6e2b5bz75qnmp2rox252aksllnitv2grnn7qfyzjkfio7w5h6a.b32.i2p:0 -punslpht6pysnlteht24rgvrkmzdd437lnpflojwakl5dy6mbema.b32.i2p:0 -pv6g7uin653rerdiivdgtoirjvokjowi4b3fwatszdlteyos3i2a.b32.i2p:0 -pvqyvn2lpvoeyhgcgunoqtetkrkp76iegyoii2af4crnlto6gb2q.b32.i2p:0 -pw42656k2vbwxmvrc2qbsz3jslvcxahln7rehsbia5jdio2knh3q.b32.i2p:0 -pxbyhv62tcdqqpl6pbp3og7ajzzcnbximv5kyt3hid3djd3uwkdq.b32.i2p:0 -pyf2csixjugwp6ad3bkry2ulkzj7inc747dsmpk7iebuidk4l3ra.b32.i2p:0 -pyole4gslrmenfcmd4ilqyzvsuyrjyffjbw7angentqjkkljitqq.b32.i2p:0 -q3ueujd332k5qjxdqkjtjlgkm3ktvdy7ats4c2ogcvokog4wm3vq.b32.i2p:0 -q4o7bf37e6afx7evwdyovsqptjwo6td3c6qtjh4rtdngp3trwi3a.b32.i2p:0 -q55g5g6s47hi7pcuomug3vrcd67vji7us2gqmfe7qn2nkq5vz52a.b32.i2p:0 -q6lzsezu4idxpdwro4x6svwz7j6h6gso6enidcxv7jhc2gbepuzq.b32.i2p:0 -q6o3eqnyg44uzjzqeudsankgdouylshkhdhl7b4bqxkbmdnm4iaq.b32.i2p:0 -q76g4lkosb2sxenh47eutqgwwzjyph52rirc635wkwnxsejrzdda.b32.i2p:0 -q7ntdwy6xueyvghbjamfrh62aqtuu3ikwg622em44pa3czomrdjq.b32.i2p:0 -qa77lz7dl64qwtj4fxxlz6otkuvv42dciggnmx62eobs2xqi3vlq.b32.i2p:0 -qaqvxmyvq2m4wombmtaz3our3qmp7eet3qle5flnrs3a5wgfhxba.b32.i2p:0 -qawed5ou5vb42ugi42goxr2s6cqzpyh3s5atkhvfvyhyc6anxyaa.b32.i2p:0 -qddg7myylinn4tw6kdjmmp6fsyetkosnrbp2gsjx77tmkqyqv6ua.b32.i2p:0 -qelsaseevnmz2unpovh4nbpjpshjg45iudiaf5zbngealwwuxe2a.b32.i2p:0 -qfbughfr5hhgoomasyviwk3zin24uerpl6urz5smzxc2div5ixxa.b32.i2p:0 -qfl3i45ipgugo7ueswy3ynnbaet77xawiplvmm3kp4fj72qvzc6a.b32.i2p:0 -qhuk5zq5v7h5p7o62gsxgtqqo7va4i77o5vei6wttxqcgaw47h7a.b32.i2p:0 -qivuqkrr3pv3rul4wgx4o4zon5wegidt5auylv3bhebfuj6oqauq.b32.i2p:0 -qjdftbhcaghdslzxjqx3nmem4z5p5jt7e7ou5bdz5llnqlxshe5a.b32.i2p:0 -qk3iq3wr6emttdilvdqbv6vnqjshuzz6mylwyfo3z6vpjywvnfca.b32.i2p:0 -qkohzoxigef43ro7mf2bd76eyneuuj2vfyremufvufssksbvj3jq.b32.i2p:0 -qksthizqtfdjjxcrahqxkl3bev75k24blagrkoszxen45zelijpa.b32.i2p:0 -qlhklv3q3rrszbrkxw755lpdburxwcj5dkxwicas46flztlkdcja.b32.i2p:0 -qmtg5ukzxemsktsxw2brwmohehyehwlleky3kuzeqzy4ledcou3a.b32.i2p:0 -qndgqhj3cpbxrktu6r7ysaooccqzvselvn2tphu3plx2z5ouocgq.b32.i2p:0 -qnqojlthym7z4gwizcblhpd2thy7v4a6ifme57bzyl3nxzkj6ica.b32.i2p:0 -qorzdjceszf432obxa73tnwhqb7ltxrxlfkkqmw2flmfjhoyv36a.b32.i2p:0 -qp5ppgozzbkuingg22zgamf4ozpe2n5hjlu4i25r6pjqw2ngrhoq.b32.i2p:0 -qpddavnflr5tdmeypeu5lrjjwsgtdhz7hw5emxiyjkcp7m7xysca.b32.i2p:0 -qpo3u565rmgeioruszadbc4vmpgjyoh7qorv4lyefl7geewyyz7a.b32.i2p:0 -qqiakw24obfwz375gfb6muzaz7tr6ani3od6leoox7jwzrizyxkq.b32.i2p:0 -qqmxvujwi4ktgj2cuqmw4kiujkf7ukrkoe5ryy4bjb7tyleplsja.b32.i2p:0 -qrpz67rcwrbpcockid5ml24dtdhhhekty3xd66ekkyatpfjd2wka.b32.i2p:0 -quzkrgzb5pmn4465647ke5lsfbseqnorr6ljvfsxcagj7rzl7hcq.b32.i2p:0 -qv5e4jlcmmkdlmh5spkvv2wgj343vm4yoty2hofuzi4lornn3hzq.b32.i2p:0 -qwhvlprhk3ntswr5xntnc2hhgmvd3bbgzgkbombiibhrsj7k6gyq.b32.i2p:0 -qykavpjbecssape77mrxjxwxces2gbjd6gzewd6zys32uhmnnw3a.b32.i2p:0 -qyqwn5xs24h65rldrle5msyarmqof3lb33uz7sutauwdg5qiuhoq.b32.i2p:0 -r2p5kqr7xjo4ncz7l6ekdx2ge6su2j22j2tdsoxu4jw3u67z7poa.b32.i2p:0 -r4ukdj7c2k557k7qd6siauhhqucshwy2rrkm66twzyh4jiucimaq.b32.i2p:0 -r5d5jgscvs6ix5v646ohwa64vutu7umfeknrc2hrezdjtlr4lm6a.b32.i2p:0 -r6d4moarp22wnnsnmsxqt3s32gzyscaccackcazvimrep7sa26ma.b32.i2p:0 -r6hd3knqi2p6kaw7hybrcf2q5lcarulcczs3sgcuz4yc2saj3gya.b32.i2p:0 -r7bug6wbhevqqlbavouj3ggpa7e57sbd3oivkzqeyagrtxshmjpa.b32.i2p:0 -ra7ztq7oq7jcozpui7c4zv76gh7rjwhq5fkpxp7dvw7ritick66q.b32.i2p:0 -rb7tyjd6gi7evmt5mzvtboramqip43sh72zjxnwhj5k72zfi3g6a.b32.i2p:0 -rb7x26lmepfbcd7wtxu42pf4tdxbe5p5zsf3cwuukd4fs4zhxtba.b32.i2p:0 -rd2cw3iukuth2lwe44q7fipawrne2io6y3fyyv5xew6vd3hos2qa.b32.i2p:0 -refo4v727jmff6ylrpbkvd5emlfr2hamaeh7zho6oval5dmnwlta.b32.i2p:0 -refrtydbdslzcgcsmmph3435qigyajh4q2nvl756f5yojouln4yq.b32.i2p:0 -rfgsjhyvqbunef5b5r2emjuoxx2i7rcsl7gathy2n4gwjyyat6bq.b32.i2p:0 -rg677vpfzyhsckzzcvoyvqdbwtdkqig7lxv4unmxcz63vtr6tgza.b32.i2p:0 -rgbq36syjadm2ex2gftc6xztivckrqzcjszla3jacwfo5hqutzqa.b32.i2p:0 -rizuiypjfhukt3bqnetppoauovuaqq5e6jzgd7tgy24zrwa2ydxq.b32.i2p:0 -rkhb3463btvfozwta37itlkt37iyncpkzak2xhoe4kg7tqafqria.b32.i2p:0 -rl4b3r5h5xodo7kiw4nykd4rhoc4j37kxizzyb6ukgcomyc2qrya.b32.i2p:0 -rnsjgirap5lfhxpb2xczuawgoztb4ptgdwt5rcb2bz72vhtai2jq.b32.i2p:0 -rrm2pems425buhonptp7lbtbprmwwjhbftey4ujvk25nclx7rerq.b32.i2p:0 -rvjzxak3jvwwti7klfb64wrsmlfcs6ceiqhzbbmjynokn5tz3egq.b32.i2p:0 -rwgf2wj2x66xtnjx3dggxhkuy6gvihvur42tbkoej6bd7iukoqiq.b32.i2p:0 -rxatc4b7obgosvznpqrmyrl6ty2yixhi7rpbh45sopqwzglyimga.b32.i2p:0 -ry3iuaabf5ek73otfvchwrqryez3nsgq57bpmzkyzumqhfbhgtaq.b32.i2p:0 -rypsyqod2yq3zagcvvc2643vydtv4zm2ew5r3w5kjzyq2snvzv2a.b32.i2p:0 -s35hlnmumkgdsvj2gepnwro4wo2h7ts7ddjhhihqggywn7qcym2a.b32.i2p:0 -s3rbe5n7lyy6smerpkgr4ictzbvkciu7gxyj6zqw3xyw62rmivha.b32.i2p:0 -s43w4tsmzmddvu2cxugh2lx4o5mup3rkvjhm455u2qqpg4bqlhyq.b32.i2p:0 -s4qlly4iwzevejk4ex5zfqhb4t666o73mvdmy4gpu47tpb775nja.b32.i2p:0 -s5ls42vzfaqzgrjr6cvgkmgifei2rtvj7uzaljkpsmt62jwtmvxq.b32.i2p:0 -s6umfzwe27x7az2yjsgqftjzawoj5lrcrgxldkfwfq2qwobml2ma.b32.i2p:0 -s6vsdby2liaahn2fh7qvrehqfus7gaz3p3u3rpjtfjhm4ahvz46q.b32.i2p:0 -sa3k2xipbuwm62bb5n2mwaqyyjcvxzb53kmzinoojgnjpnqurzeq.b32.i2p:0 -sadnlzguaa4k6kvpiky27izp36er3i5h74l452povbnajqullpca.b32.i2p:0 -saj5uchj7dzmxjv3kdzalgtbqzw6wu4wzxxdiobc23m452ehk3zq.b32.i2p:0 -sbalp2doxyedtr52kj57va2rmbi5npspv4drk4vxnujag72gtpiq.b32.i2p:0 -sdxfzbgwxpf6hbik7k4bqm63wm4xld7qgo3hjlhknnehzxyyeu5a.b32.i2p:0 -sh5hww42vwlsl57cdropaeqmmwozinnr2tg6wq4prg5wrkusvxja.b32.i2p:0 -shpd3cifcjoebw6pskj4pfmrm7lwecrygjnje55heorhsxm2lnrq.b32.i2p:0 -si5x3fon3ew644friidc5o3syrf5v6kk4pxxjvhibev3odxk7nyq.b32.i2p:0 -sikkmrxv6wat265rpay2tk7jywyvlzkekpolmwyp2el5g7iihsvq.b32.i2p:0 -sjpqyf3rq7ojcalldlybvyyh5lqiq5j3ade5w6txe3473ybhk3sa.b32.i2p:0 -sk7aivked563g6g2ri2saggni7jqzxmucuqa6xkudcgjvpbjsyda.b32.i2p:0 -slbbsiq2pmouqht3hznafnowq7sxzlidmwghfch7iiq64rzdhwra.b32.i2p:0 -sle3cbbdom6rknc3drqtawctpy635ica5d5gerjjdahfymkok4ma.b32.i2p:0 -slnmute5o6h23ldim34wro4zh4qa2pchnskmdpek2nzc7u5oz7jq.b32.i2p:0 -snfinsblh4j4wsv2n5kmkfxbvqzcei2ryfyu4heqy6u73mosep6q.b32.i2p:0 -snsw3ewf7wjtwspiuj33h3vtxnybllurzcwm7u62iutf5phoitkq.b32.i2p:0 -sooo7ajo74ajo6m2yomcc6jcofdgkdoyjcbrpl3nyvvusr6fw7ta.b32.i2p:0 -sorobw22rerrhpx5t67joyqai3ou6xsvqxb7wdomtnwnqztm4sga.b32.i2p:0 -sotpvcqqzzmty6llimwlvknqsdcypn4wsnwk677kepzmy76w2gqa.b32.i2p:0 -spbb34lslk2tldwzr4ydi2culk7sxgl3imb2gg746xbxqqcj7vzq.b32.i2p:0 -spuaa2y6qsaywypklz7itcb5klesogef2x66m4flws2r574qjc5a.b32.i2p:0 -sqjjqyrhh45jpgfp66idiirgh5ck7f4s76ee2l5bli4obsotu7zq.b32.i2p:0 -sqjorsqambyienumg5qpw3foftkp44vpsd4lwklgbl4lag4mm6gq.b32.i2p:0 -sqr66feh2g3f6bknt2tnltmnhqdkzoq3jhdaatfusshrv6v2zhma.b32.i2p:0 -stltasmf4b54srrjb3mf7hjtjvmvvms26btxakccdtllgrm2qzgq.b32.i2p:0 -su7d4biurihkyr3qeea7makkxzikxr5zi4znvryh3bjespppfhxq.b32.i2p:0 -swmtaospvaup7me3dvzlw5xoeohhj4zn5q6agivif7kxtseweriq.b32.i2p:0 -syhxehvl6rublw6k5ysmzcsqrzdsnd7eqrbwalfkvhgfccpu2osq.b32.i2p:0 -sykjw3jnb7n6bo574wnpiaxhp2nm4gc6hc4jh4v6trsbpboysooa.b32.i2p:0 -syqxyl67b4hdo5u3jtkkzsabccvtjaerpushov7nrc2f42x67fja.b32.i2p:0 -t2e45js4dn4cfsyyevm26z5ltvmu6lftxziji4fm3v4v2t3ykaoa.b32.i2p:0 -t32qcc2tbjgqxrydr2txgm4ahhhae3zkkojmguehw5gsbtrdvxsa.b32.i2p:0 -t43qqzux7ik7kki2rxtillcgbxrznuhjac7wtqh52sqovk5ay3xq.b32.i2p:0 -t4notlid4bejwz2tzucpvednkeuskenpnu5sqcbdhh3lqouigqxa.b32.i2p:0 -t5cd7q36no6doxduuvk5psdx47zl7ousnckjgw7c6zr3o3ke7ffa.b32.i2p:0 -t7gbmefspnynaezmvx445fjapp24pjjf7wx3evpwlmolzyu3wi5q.b32.i2p:0 -tanmhvkoyd35kf6a2nhj5rmbwpt3shc6thypsle45my565womjya.b32.i2p:0 -tbqehmm3nuuf2spwsjobrc4hg6uxji4mdelivhywz4b7f5lv6rka.b32.i2p:0 -tbrjczwl76v7ob6hon36z6f35otpv5g467q33pgzyyakp525wwfq.b32.i2p:0 -tcx3ftsdl36ukysuuewydapdzuu4alewyg22squei2wda4a74tba.b32.i2p:0 -tetoqjagsf7fpejajiwm4rosqscy5huqbz5hcqgfuha5tdfnlrnq.b32.i2p:0 -tf4tozh5unsgyzpdsmrdcpbgekw2agu7tp5jvyclzcs5kjudwwpa.b32.i2p:0 -tfuvti7yonn5pjptzzvpshh23x4rqjvm2usolrbnlu42laj4mhyq.b32.i2p:0 -tg6goh3flzmcer5voft2nf3tudm7ikyez334zry66vqxmc4ieixa.b32.i2p:0 -tgt7rdhywtlwob47flp6ccq7prrbh4ipnwm3xszuykq7be2pksyq.b32.i2p:0 -th3dj5sqw75lga3tnffbsywajxafv7cvlb7sed6w7q3w3sxuqo6a.b32.i2p:0 -tj2upmck47iktfh4vncmyajnkbatqglqzy4coqef7wioor4hbsjq.b32.i2p:0 -tk63xbzug7def6esivofwq2h2c53ar3ot7hsezdq3amxqqaoyr5a.b32.i2p:0 -tkzuysa4lkad53cywbt6sgpcndvvvdkjeatpkwyfweorx7rfe3ba.b32.i2p:0 -tl3xkknuukvyinyhvt7saz3tvz24ptgyqtzy3igygyfapcf2o3lq.b32.i2p:0 -tl66bkfoqu6eameaqtlwrvfttyc6xj3s57za3hd7omnfnjg3i44a.b32.i2p:0 -tlfttkbshrcixu6i6syntl5xjsoh6mtgfpix54knahyeuhlju4ga.b32.i2p:0 -tmmjmcrwegjke5fzv2hha2wkis7l6xdaa7fkq24ge5rbvqpwxzpa.b32.i2p:0 -tobdew6554c76jhrulcd2ssgvef7dryini2xjxem2zushe37ycua.b32.i2p:0 -trucvlawpufrszky4zzhhxtddnhio4mnqawzc47n7kik6i444m2q.b32.i2p:0 -tsfr6zvcgsmw2ekaxqqtkdrnbib5uio7lgmrtmscrvwe2d46g7jq.b32.i2p:0 -tsrlbxayhihugr723z6rkyafglnhcyzi2zhojzsyfdjsqkkd53bq.b32.i2p:0 -tv3x4kddbu753tnlghgh3txogp26tlydt47rl5scx7eoxgnocf4a.b32.i2p:0 -tvbutrv73xhwqbtosmbp3cesdyc5bbtslay4gjsf7rzdx4ztgzaq.b32.i2p:0 -tvotv5p3emxxnti2bnvucbfy4to7gxptwvh4qznuhy62hghnju4a.b32.i2p:0 -txpr56jvbf3lmqgaozqdqzgckfpugzyd4cwplkjootvf3hk42ibq.b32.i2p:0 -tyfkhz6ggpi2rykez3v3j5f3evnjxfoau7ve7m2heaukrcqiui4a.b32.i2p:0 -tyvsuqy36cx2yvf7jhnkd5ojc52g6vxl2rw5qshqwpk63ptovdda.b32.i2p:0 -tz5txdipkxcnydzcsuqw47qxdvpob644u3cttlbrbfg3zp75vl7q.b32.i2p:0 -tzudbbctweb7rpnf2vswuw26j63ysqztsbt7lfpfj6xautueiklq.b32.i2p:0 -u2tnrysboqqwjn73awg4hfxtfjgbqab6vrdgyu43s672jdcanhca.b32.i2p:0 -u5ixxcd6slvzxouj532njusx7ec4wemrfwmg6gwltlnkruubi63q.b32.i2p:0 -u635477uxqs7z4uvwx224u6ojn3c3ewcb66f3j7qlbzqyrrevxja.b32.i2p:0 -u6wrw47yfjdzk6a7nc6c6scvfokwuqmvuhxehqvymrv7owiajxia.b32.i2p:0 -u7uklnwthbrynr3z2gc3yxfmi5yoemsugjbb4nm44x26f25vxp5q.b32.i2p:0 -u7ygn3heosxu6l2die34y7wteexfp6h2w5j3nhr424yoblysigyq.b32.i2p:0 -uags6hm646f2qsyqfhzjt2xlnjqbiopiodghywosdgz7bwtbggta.b32.i2p:0 -uc52rzz4xu5ikx6hl6r6sqxfmiyyxsffpcu5frrtepczidwjwuha.b32.i2p:0 -udfxh2r5yfu5z7ynzacur7p3g7ug35kfa33ghes2bazpdivxlhsq.b32.i2p:0 -udkwqdo5odg5npn52rueipghn5omhvojthzdmvcvuomgzglum7fa.b32.i2p:0 -udzbx5jyvrp4g3iujlca7jnlaaaa5m3e4jv4sbr7tvp6k6cdjc5q.b32.i2p:0 -ufgoaa6g746zzpphuvxuomuizkyfpz45chqta7skrywqq6cjbqna.b32.i2p:0 -ufittrlr4eautphuqzuotc7b3xx27n4xgy5afm4foc6nsv56q7ka.b32.i2p:0 -ugw5zbhs2pvsgxieklmc6z4z6d5cvyux4pctpf2udhjgxvajot2a.b32.i2p:0 -ujg6b4cyxhi5pf4puwvwupur3iddm23uibapigpwl4bstvlt4cva.b32.i2p:0 -undzufsjeb4qlf7y5llh56tji6zlhtshlsyht4yjdsa2k4ayx7vq.b32.i2p:0 -uobwophnzqq4yhpp54aisud5ojgrxq6pasmq4aq6qw7dhgjcoqpa.b32.i2p:0 -uodycjdscpurlego2nrs7ptoze26p6236t2r2tax5ubdgi6duqaa.b32.i2p:0 -uohuxnjd27cftarbf6kh4czmotwvstpon2sgs2vpffqkgmg7guxa.b32.i2p:0 -up2kudwqomqrwvfognnhz2mjwqvkgpknfyscp4ue5ioev3q4jd5q.b32.i2p:0 -upme7c64dwjgbt7w72yf5ydl3dyp25dtenrkq6z3aw6hbircqzsa.b32.i2p:0 -uppxodf6bz3qibvpzzvtedl5lk3h7fslrwmed2cmqvdpgtvqkv2q.b32.i2p:0 -urqlr3cei7pp2cruga4txxmmvel3bh7nsbqzqzpe7omvmbm4v75a.b32.i2p:0 -usgqijrwhtwgoekjcr26yqcgpncwpsescrr3eek35e3rhkrtptoa.b32.i2p:0 -uu47uxdqqtv2pqorbaxnhhfmcsxmknvpreambqqkosr45b44h5ia.b32.i2p:0 -uv44mjoqrj3m3gzz5wxlnszt5pvgk3iqlc3pmqfe6un6gxays2cq.b32.i2p:0 -uyshm6nokdjyq3l43224at2rigpa4zmiyybuufyq22t4l65ialmq.b32.i2p:0 -uysvdsh2bzicmdqqdl7ezuftxcywzapohbzl5ap5hyiinki354mq.b32.i2p:0 -uyy4dbfyx2i2x3goobc6uxj4nb7ktzsu72zlksypjfisgka3xnta.b32.i2p:0 -uzgfmsjcbjxitt6bed3p3gpdzviyop2rz3cxqyu64ec3z2r5imqa.b32.i2p:0 -vbzp4sjkgqwymn2z4ikbae7rv3clbo7vv4mwv4ft7tu7ubrmbeha.b32.i2p:0 -vcksnyuyw3i6hfviob5yzoynq7okxi677bw7224273fjhsk2kgra.b32.i2p:0 -vdpfoahxse7cjciw5l7ffbwzc6e4xdlf5ulvrk34mzm2gy4mhlwq.b32.i2p:0 -vdv2aitgqica4taqcmjexw5xfbrfbhvf5kuxwvfjf3yiki5a5cjq.b32.i2p:0 -vet6qwwa74jrqrjzcm7ylfprzwpnt3hlzjvkbnaoiv4o2zzkr3sq.b32.i2p:0 -veucihmd74nnumiunvruyjs6kpjs5sqw5dprldlzcf7i3h4igkda.b32.i2p:0 -vewdrismzwnlxlvni7slpq722wlwfami2elghudm2ofcjhpjcs6a.b32.i2p:0 -vf3l3f5unlwrfmr3fiphpomgslxgm6m4chg72itf45yfu3brmy2q.b32.i2p:0 -vfpzasrsrqh3llkudmas5fymwn2ohswqi3vakclgm6fn4nb6s5xq.b32.i2p:0 -vgkou4ysuxvhlxrwf5n2ihn4ffyvvedluun47l6dobi5ycziy3nq.b32.i2p:0 -vgu6llqbyjphml25umd5ztvyxrxuplz2g74fzbx75g3kkaetoyiq.b32.i2p:0 -vj54d2pkdeqvcuj5ykeggr6jnhhnmq5q6qe7nttvb6yjetweadma.b32.i2p:0 -vlwovj6fxzvtsypnmslocootmphezr5txanyfz2gjhn5lanrn2fa.b32.i2p:0 -vmatpbu2vf5p76k2emzg2tjyqi6p6yj3cl4z32ncdhz37ubprkha.b32.i2p:0 -vmbyttxf6sw6ivdamftxung44mktqb4vphmm4lqzdqqpcmksterq.b32.i2p:0 -vmoogdd5lztt5wpzkwhd67uwnvpupye7ycsbz55jl25sueowcxxq.b32.i2p:0 -vn5rsr26rp7yxrqliq7vo4zb6aoichaybd3urvc5eedaspxjp3la.b32.i2p:0 -vnxjmzogakc2a4xn5w4qormiqt5khnjptnoaro74ehinrv4q3yga.b32.i2p:0 -voi5u3azhajnt7476tcikl5mactxcvtsbnrzixwkj62qhpaw5ujq.b32.i2p:0 -vpevx6tl6ma6mnlj42d4fke57en4v5r76yx6rcmhtvw47guo34uq.b32.i2p:0 -vpmkctqhkdqgkekt72srqm4sqaliug37uq2wp2ywady3p235cpaq.b32.i2p:0 -vptzpxba7oys3w2htjgh4uxogaedursdh2yz5k6e7yh4b3pokuna.b32.i2p:0 -vs67sj5crkcjo7m74tdunzefj6ahgrgohs6egj5jxmneszwaoo7a.b32.i2p:0 -vuqk76jvxfk55bkovqcmmkvycmndee7j3tuv7ezdb2slrfpjyvoa.b32.i2p:0 -vxokhkidetjp4tjrj7idojx45hguhnl2azvqnbulougvdkstf3ma.b32.i2p:0 -vxs2es6f7uw2uuneslb7ipvmg6kqh6ytpjezoj2ptwx7od4jqmxa.b32.i2p:0 -vziy2cbrbvliqpi27feak2hiewovxtlkqppsagtaxeib6nkonknq.b32.i2p:0 -vzqowkd4aoyekapcskylli77aj3e5fomixsjyiawnldzj6c5nxtq.b32.i2p:0 -w2a73mo4grdgwvkzdsh6nyutagd4bmywywacxviodw7xnof72aoa.b32.i2p:0 -w2mgaza75amrvfocl7wt6v7eimprlasuj3bi4xezdr2wyqhkxzwq.b32.i2p:0 -w2zi3xos4jaz3ft5yca2x5zf34esctpmzqlqpdrqntjmi2o3gfba.b32.i2p:0 -w3hyqnlueb4yv5lkzj3wlnrjp7fzpxnig6x6m3w5du2ptfjcm2jq.b32.i2p:0 -w4arykcvc7eckzuqr7kvs2njsjpknzb6vvsodpyzp6tvu27bzoka.b32.i2p:0 -w4k4gm3chiyskfzshilxjchpgtpx2xmc6euvkyzkyjvzvdbqroma.b32.i2p:0 -w55r4ykzu6qt6uhp33exqbqmlt357cts2u2zoi7hkuphqmv5iupa.b32.i2p:0 -w6jl2gubyscdpubizes5bp6s42cito4k27xwcjwh76rvuik2prha.b32.i2p:0 -wacfewi6ehmfxvftxqmracfh7se2t7ozl62u4hsuyd4c5xfzuajq.b32.i2p:0 -weidpvshind3dnblwtb4zpssazeenkf7a63favavkc4crhqdk76a.b32.i2p:0 -wgrbhqemtf7qu4c6acjicb7uyee6rlinafyysvxc2yocq4t2ilca.b32.i2p:0 -wjfukwyohljaxgv4woewdtpoxi3q6hnwcnefpgrtif2kqfrxslnq.b32.i2p:0 -wlepjf4lxs4e553rtpoys6kqp2ozcv4pqjwzoybawcl3zhrdvz2a.b32.i2p:0 -wmly6cz5j54w2g2gibnhlpvuhh3bky26cq3a5jy6dp2hg3hc34oq.b32.i2p:0 -wnp26nyphqfmq3udocgcwenpsgfwk4ssw53st4wvwt6mwf7wm35q.b32.i2p:0 -woanasilvwu3yfurvhvqj3lxd25bzj4fxwy3ef3qjbso3cozvyca.b32.i2p:0 -wpnewole7fofvwvrvkkgf45sgcverlodocu7fstm2axp5jfykraq.b32.i2p:0 -wrqu543ssub7kiwzfug4o7m6lc5ibmaamdc3o4uo6a7ntxiqzd4q.b32.i2p:0 -wsbf5tpo7ecsafusflyym72k6tbyclgvqav56qafvyc4j3spzdoq.b32.i2p:0 -wtfebbwmsxoywu6nw5cowlxqhtokxrxftve2zee6flvrpqg4j6ma.b32.i2p:0 -wtoh5v7xm3wx4rqutbyvqaixybwlprx5ua2yiv2gac3prria5emq.b32.i2p:0 -wuikfwkext6lbl6urhoysr2abcyff5lkm2ojr6mfenqq25nzlluq.b32.i2p:0 -wumjwpr45uhvtggq6jkzfda47e4iqk2onizw6vn5po3bd3uqcduq.b32.i2p:0 -wv335vkr73gsaza4t6foqypnovccubvwfsarkmw3xtc3t3sncmya.b32.i2p:0 -wvktcp7hy4l6immhi5cxyz2dlsbhhvtcmskjemrnqehacnoap23q.b32.i2p:0 -wwbojywnrcf2mci7f3zgbomrukcm4d3nv6pttb3dohjpge2sz27a.b32.i2p:0 -wwbw7nqr3ahkqv62cuqfwgtneekvvpnuc4i4f6yo7tpoqjswvcwa.b32.i2p:0 -wxfs2ccar4szd66dlmlijh3i3r4muehqjxjmabwbb46cq3gpbsoa.b32.i2p:0 -wy2udklgydh7iknnffbzvldoiwsct6dy3o7fjcsjcdjoq4b65vha.b32.i2p:0 -wzui6sc7667w7aabs6iebiex47o7cysxpryfdaltaklw2z2xgtuq.b32.i2p:0 -wzvki5234ffqhri26fqoxosqq3xengl23eoitkvip4mp7aipo3lq.b32.i2p:0 -x4cetuarbwiqphebitvgv4x4kzh6yhyyvu5c4yjlm4jsyl4bvs5q.b32.i2p:0 -x5qtgyzzgkovoko62l6n54p55xma5pbstbp6t6xc6hbugxz5ck2a.b32.i2p:0 -xasewpiqpzhyggxwsajmnkrppi2ozmapqv6673zuuymoueq67tla.b32.i2p:0 -xbetybs3nyeykskasolpatj4qrfnigz7a2bx7wcsyrniqd3usnaq.b32.i2p:0 -xd2byhr22rqkawocapbxedovmifyk77qrh6br4ctx7ny26hpmusq.b32.i2p:0 -xdoonpwnxhr7sjoyca3lkqsapmefd2puyar22ztocod4drjju6fq.b32.i2p:0 -xdq2g4tkaukzcu6mnvdukchinma7koi6c3noflpjabrzjrgeumfa.b32.i2p:0 -xegcohfrnnnuz3hdmb7r4e6pzxbmtg466n6mty2oz3tcoqutxj7q.b32.i2p:0 -xfyzfugo3qtfpq3s5zccbbqrxfkgy3ttlqhz6t6ovmtgrsuyce7q.b32.i2p:0 -xgbz5vpek6vaeej2zejxrjloqg2sqb67gim72qqpodqfq62rflvq.b32.i2p:0 -xgqzxudkvgbqwosaha7zb26jgza5wb7m66727rk4v2zj72xgg2ia.b32.i2p:0 -xgsk2huqghiftyznr6llr6ztepo523hiwqscxjpawcbme7xtjrta.b32.i2p:0 -xjebyiaydsbb76gqzetsmccgh67oeaxt3c4mkwmt7gjlfym266ea.b32.i2p:0 -xlfxusgnzpmatutaredcvx27zoiecno4tpxm52jicdvn4sr5dyya.b32.i2p:0 -xm55wnfhgmsy4wz24swjs2ziguheut6y72kht4ytwyfdmjsxslnq.b32.i2p:0 -xnb3pxtmai6ofbarycclwwueaarn4r3zt3zgkeepo4pgmswqvfcq.b32.i2p:0 -xnvsgbonlja7cmeokr2msvdelqlasbkwgqndqg7eakw43t3m465q.b32.i2p:0 -xpqubs4ftu7ym4xwrirlz2e36gvyjkil3chvq74bj4lf7djcrw4q.b32.i2p:0 -xrrx2rcpj3zefshtt7kamz3uflnwebpv2gkgd6vlrdazxgln57gq.b32.i2p:0 -xrwuqylcgkr2ovsf4pziosd27ywd7pfaohnreoyzm72qlnvoktrq.b32.i2p:0 -xtxh4wtmbjls76wxnehe57etubuqvsdiunwgve6kwjt4acwswnjq.b32.i2p:0 -xud4fgmeq4hl4cgsbjn3ubz2iyjguogskn7wreesvpsm3ib27kpa.b32.i2p:0 -xuivvnpcj2rhsxmkyyjzmyq6a7gwgusnqwdklgimamvkzu7rnnmq.b32.i2p:0 -xvpzaqftlfx2etqys733mndm7jr3l2j3if3wskfljzaow5s4rrfq.b32.i2p:0 -xvtvmaele7ns725mjaowsajpx4bgfecburyh6pqmdnn37cq7cs2q.b32.i2p:0 -xw6ble42juwkfrjetb3hmk2ep6jnyufhutoenyrou6ieoqiomw4q.b32.i2p:0 -xwlkpubkvsdsyaeylqfmxfk43juk6sz3hxnmwe4zencjq77aznea.b32.i2p:0 -xydzqrwggskdbmeqrhgt6alroglzbkcarzdlhabmvrszm5u6cfuq.b32.i2p:0 -xyhlemqmoeusqbbzr4oqph6kgmvm3a3lrbuanxkmyetwohxoynna.b32.i2p:0 -y365lf3vlh6vg4rs6trnjc4ia2xqplahk26y3tyqjly2q2vpfnqa.b32.i2p:0 -y3equ2tc6zsxqtndugsfzottuenfgxnl7eqgadmnzjkoigxvseka.b32.i2p:0 -y3occl5rqc2mz64esu5mqzoyfzlbxop7tttf2b3gyxjust57txfq.b32.i2p:0 -y45xhqkb43ncokfwhsmr4z6fwykuit6o3p2kbso3emv7stpiwwoq.b32.i2p:0 -y4njm6ftdn562q5thzd3fvb2f5mbi6bglmyupukcmcpt2tuo6slq.b32.i2p:0 -y5wr2bw3rt4rvw7hqqj7qtlf7vdds6zk6cs3mu3myyduasieqoka.b32.i2p:0 -ybjgylnhvk3fzyacxvyh6dwvrh7lk273qh5qws7uquvrhhwr6rka.b32.i2p:0 -yc4xwin5ujenvcr6ynwkz7lnmmq3nmzxvfguele6ovqqpxgjvonq.b32.i2p:0 -yemrkyqmjzwwn2yast2ga6dcnsovnxwip2rjpid56grdg7itugpa.b32.i2p:0 -yfplj67xwcblbiu4ozddmzlmjl4ifa7bhkzzu6fu6jkoyqui6v6q.b32.i2p:0 -ygtc5m4mh3qhi7tct44gxqbenhkasp2y4ydjn5qua4l5vh35osdq.b32.i2p:0 -yj3v3ocgldnackxptsjmwasa4xzxj3it6rtuhmlpxvwlq5kmyytq.b32.i2p:0 -yk2srkdlbm7kebv53dx45ss7q2fjcy56m3gywqvw65eya7co7hgq.b32.i2p:0 -ykppjmwunzqzuuqc6qqsijomfzdgieeq2mkidapc4awrww2ninbq.b32.i2p:0 -ykv62rivlxurq2wkecagzs76tulfor765c237bsjn7jt4436kn2q.b32.i2p:0 -yllvqk2utimxjtoyzk7l24s4n5sqp5dbn5vwsbt3g3dd6h4dxseq.b32.i2p:0 -ylpyfcs24ij67dkl7ighyou4z2gpfhjlt2iellj2ad4ddrxci63a.b32.i2p:0 -ymo2cnldmstzqlsdhx7kurii7aaffrhpgafxlli3s47pzbfe5evq.b32.i2p:0 -yny6zqtb7qve7wwfctsozhzhbq4hyitlqco4uhc5q3rvjex77oaq.b32.i2p:0 -ynzhhxlieigtmj6l7f2dq54ypnsaf723au7o3uhnismlgnkmcqjq.b32.i2p:0 -yof4yvv4agwhfmicj5u2drem47nvfkihnp6bil7ocg65gydyzzcq.b32.i2p:0 -yojuyryq6vfoy2mftrdmybmq2hjefuzrwmpqqfvk2kd5hptgr3qa.b32.i2p:0 -ypbq5aleoqqoxto4tkxlmlxh2hrstjxzpgonj3lk7dzweahs3hhq.b32.i2p:0 -yql2k4zjl64dtybuculjgg4v4u6sje4smnyay3vslv7irrigzxka.b32.i2p:0 -ys36rtuedg44sahelbysqi2mbc2l3rcfdy33zdvhvfkx5uocacba.b32.i2p:0 -ys7np3pmfhiyq3z2rcoeylb7agfbyfuhhp7ky2uzvvuzswad6cia.b32.i2p:0 -yuqb55drzrhxfnvobycxqau47kibaaf4voamk3kxl77xbb42xkqa.b32.i2p:0 -ywfauauaekbrxgwaahcjzifemzdq26xsshw54sg4bpr5z74scwiq.b32.i2p:0 -ywpsgu6nlnf2l4sy44tit2av7hfzwwttbjvwbtsbtqur3awiax2a.b32.i2p:0 -z34pw5tlowwi3gpj3ycb2dptgyuq65bpj7w36xahslgikggo5eaa.b32.i2p:0 -z3j2xshl4tpbxaybcprhzq7cuz6urboqoxvvpnfriv4n2lq72jsq.b32.i2p:0 -z3pgyfiwfzcd2g7v4rs6el5tvc55y7a3tai4gcbpso6flaejckea.b32.i2p:0 -z6mlyrxcjddpcaoumxnw5peulnkvj56hgwqmnc5adoutp7piujaa.b32.i2p:0 -z6xsstyq4zynzvagwv3wr7htz4vxttrotzb5izefotlwqm7kjtua.b32.i2p:0 -z7cjxpy4taui2ka3ekfqtoumsb7pg2sok3wfey3m2roeuppcrzhq.b32.i2p:0 -z7cjzfmv6wadjguzaavu7pfsqhujbczspbf5sxxrqndeovu3lt3a.b32.i2p:0 -z7gkesbkbl27lpcpbnhgfofjz5fhnvljzfvyydu7ky3odzdqs4lq.b32.i2p:0 -zafd45c2hzd4w2t24qtjqqbqm3z4hayb6vadj6sd5oukjyij2ara.b32.i2p:0 -zbkqcqtiiw4nwsds5pjel6alr5i4hgiyqf5giwurdygfysacru2a.b32.i2p:0 -zbz722dh7rvu6ugdydmlmtgfyc7rnpeslae525c7mhr7rgsekjba.b32.i2p:0 -zcwgqw7hlw7437a7au6n6obljdb4arnshoibdqo6voree4xiznoq.b32.i2p:0 -zd4ns4zcyvgpwkioftiiftgj74n6mf4m4ieq6aedqaznmdi6rhdq.b32.i2p:0 -zgwseerxwqnid3zhculzuqbkhghthsbvsbnqowredostfqlvawsq.b32.i2p:0 -ziehuxdpyg5dvvnzedmcqxszdcflsrx6fqmgzb7odefqwqaxrs7q.b32.i2p:0 -zk2r7kzzigzu5kz67xnrbe56u5walngylcsk756bkmt66cmeeydq.b32.i2p:0 -zkbjgfp4ouockpsmpbdyli4ilo7f3lbfjsboay3nf47ymir2ldrq.b32.i2p:0 -zki6halesukhfel76pziutgica4zrp5qtbmlmgyqf6dnnomk7hja.b32.i2p:0 -zkij473aummp6rvwvi7wbr5iio6xu2uh4rophbhyot37uxhrygiq.b32.i2p:0 -zpvqqdrcnagad5ayutf7hkp6prtvrbmknhqdul3qweft7oa5ikzq.b32.i2p:0 -zqft7c6riv7aux62qwe5xfqki3dcb4urvbfy6m4wz7f46j2us3la.b32.i2p:0 -zqhoqgf3enj2pv74sjov6dthpr6jqafw5qqzzsvnfdqzycychxpq.b32.i2p:0 -zrrki54mn56fytizkfmhx7eubea37padxa3zliwq6gtknrsxv2aa.b32.i2p:0 -zsfpcnbk4g2bwxl7yy5ebrcvlxd5gpcxatewdrgpige7oqykunwq.b32.i2p:0 -zszq7enaxbz5p3f3idhfkkd2u2ygpeqwj3o6hkofffcmllnymwqa.b32.i2p:0 -ztr3c7qz6v4hrnegmkzjsr52wyi4u6ery4m74sk3m77oup2ws4ka.b32.i2p:0 -ztyxbjae7ucfyupxpy75jwpzdktg4gbvhl43nh2crwqrx2uhveda.b32.i2p:0 -zuamj63ad73jmnw7xnxrmjsbjg7vg23j46w3mpc2udpcgjfkcqcq.b32.i2p:0 -zvchlrjuzqdlx37fhibhnym4y6p56vtlymujjuzhh2cp34yqfrtq.b32.i2p:0 -zxsd3fqczh6ddgejc24nnmb3ww7nalieq3a7cs2mqiy6tmff3wia.b32.i2p:0 -zy2ywvyqds5bgdoo4tgbu3bwjp3ygyn3zfuby44jemc6xa6fbwta.b32.i2p:0 -zzre44vh766jgfordw2ehu2r6p44j23uyovgvm7iwuhp3g5iz4ca.b32.i2p:0 -ycdw2e4ufgfwhcqna4g3m2qsvaly23ozaexawcj3x4gtgcehgwujjgid.onion:8333 -ycfvedulkprd5bmivqejur5aptcs47daqtcvzotnnhfvwu3o6gcp5cyd.onion:8333 -yck6l5ffw6oszgtoc7et4fytvp3sqdf5awyky4tlpgem2n4y6icxqoqd.onion:8333 -ycnepnzktkhfysqijlgbjk5awivls3eiqb5kjudotjvnvlbe6ah2k5yd.onion:8333 -ycwrrabomoixkxggkxldyxkqoc7qqy2t5wxcsxjgodlvuydwch6dqoyd.onion:8333 -ycwwrwkqibvkftpc5kyqs6nf7hrzetrmqgwo4yae7bq5otvubkfsread.onion:8333 -ycxjdh4jr4vun447cdszcoge26pbdnqblfi2osmk5e4uqmrigw7y4byd.onion:8333 -yd2ami3rem3i24q2b76l4ujyq343ycrowrthwqycvpcsofgpwlxyryqd.onion:8333 -yd4nyusqking6tkcwmmopznlxhyfhk3gsw265alz7vpo6toqg3kwn6yd.onion:8333 -yd6b3wtmu6bz5km7hw645omyv65one627xech7f3vnlwkblsvqdtmiyd.onion:8333 -ydforbx54mnz7g5u2mu2ulkomvakdbwxoad6araknijb2i47gkfeh7qd.onion:8333 -ydiqekqpcf536w5uwsdclw5pt4n2fkz52fo4vwdducc5t5l4ghqaxnad.onion:8333 -ydl5kqr2auvie5mtjkm37hzkqh43pobibty4msfzkbu4junpg5gak6yd.onion:8333 -ydojumivjpins2lwgql5xaywbngrmw56nvmtalvfiy7sr42ksvr6apyd.onion:8333 -ydvbxdzs6w5wefifiqsqntpbd7tliofenqih5hlnz34546fvy4ab7iid.onion:8333 -yeat6ea4esvd4nimhg2rcb3ghpusoqzjb44alb3hhdj4d2nimn2vpoad.onion:8333 -yeficzguf443sojjdcmh7lzk7l6y43a6v2jbyk3x2w4n7xokjs4crnqd.onion:8333 -yefjaylovpdhbb5b5bhjx37digt5u62lmzyc54ygtabwdphm3zwd77id.onion:8333 -yeghpcuryadlbxzk6o3ujebmfuumkpoi32dr2ctfmql6vqn5wjioehqd.onion:8333 -yenw26f3i6kf5u2nad6xligxk5iyizjvl7msx3pzjcatiesogdef4zqd.onion:8333 -yeoadueo3ukf6s3fetywtbvgmpvrtkja5rlp7wcp4aich6tfhh35giyd.onion:8333 -yeqjrnnuf4fbgzik74qfhrohcymj7ccbze6ndky4pe673chfsjconfqd.onion:8333 -yernmfgru46g43vsijjv44n7m35tpoznnkd2p2wl3uqzkietukxqxoqd.onion:8333 -yettfzp2vanmkehwxeaugotqcsg3wsomcargvetk4nhwnebrpq7ah2qd.onion:8333 -yfgo33tiu6w3nrvnfyw2nmpcwtfozinctn57566y5l4hfcttuvgff7id.onion:8333 -yfmujam6pa75vm7p5q7gvgkocqzcwm7lgbnodwtmzfw7usy5dvlgqyqd.onion:8333 -yfpqwz4qogg2r5sdweggggz76pmhxtegnisz55urw3egvcq2e3amvkid.onion:8333 -yfpucmv4zspytubs5epnze4xc4joqny52s7ifjk3vu644axwkfyfurad.onion:8333 -yfq3sexjxzuww7tnwc7jj2ethiu5f5r65ewpy66os3ozhoeje7na4hyd.onion:8333 -yftuiua74fspnqanvait246qn6vmab4aoympjd3omppu46jkq777axid.onion:8333 -yfxz53gdbxu5hapg3e5kaa5pyxpbrpiql6j7sfe4i7fqj4blpqpufzyd.onion:8333 -yg5xbesziuiaigwyxjrn5c5hvj6fxef45edl7pir7risnr6un6esjtid.onion:8333 -yg75fc53cicbsarrpfv2s4crpkx6vdjub4va7cvbducwzhsf6qehx5id.onion:8333 -ygczn2llqhks3ohxvfck4ks45ekg4xr3loriyynnejw2jfmi7hjsfead.onion:8333 -ygdfwrg33s3qwiarwxbejalkirmqui3wjz7wfccprjry6bm5la65vhad.onion:8333 -ygh4hx4ugapidwxodkjr6vgl6vkaqvievk2eiie7v3ewuvjvg2mzp5id.onion:8333 -yglvvnb3dk2vh2wwgpcnvm6t4lgbdhnvpy4jfj3ee4ugb4xzvjrrcfqd.onion:8333 -ygospbn7dc5a6haqur4eoe2oj6jttjohs43rhl5m22ltruh4fz5isxyd.onion:8333 -ygowwz67kvvri2lcwknsc5xjdz7ffat5tqkm7fmxrrzfgvqnxoxkvgid.onion:8333 -ygwuwz5autfc4tqluyuoebghc7f6lgjykm6oprynh3h2vfp4xmhiapqd.onion:8333 -yh4edjvpbo55vsankh7e33u77ep7eah5h5gvfgu7t7mbb7kkmjvgirqd.onion:8333 -yh4uoyfzey53dnoj6zm3frihhgwpqfqkw36sjmqsvfnl3rqohs52wqid.onion:8333 -yh5us7dk25ttxkt6miers3bazlm3jiums5nwz6mzd4i6kn5oizjccuqd.onion:8333 -yhddybpp6lgu34i7uurdqg5jznfdajwr7co3twiqf7pgnj4yjgzbnpqd.onion:8333 -yhiswltkrs3upvkrygsuiou5i2njnyxk3gwtsmcr5yn4lfinzifbpkid.onion:8333 -yhjkylctf577degc7ufffvg3gsdxgnx64pdhzfujxjgfhbulmtc7yaad.onion:8333 -yhnzb5pmcbeiqs6bxm3xvzdy2dgblteiswvvtg6vhkum5gjjw7abjzqd.onion:8333 -yhqytulgwdtvozjhuyod2cufnkbh75mgyw43k6w63ah2fzulskfssyid.onion:8333 -yhtxfuf5zxqoqkuodfpmzsnnmtm354y5rtexqplt5l3fkzzksjkkzvyd.onion:8333 -yhvyxjfauptpsjrxrf3oxtv5zlju2gdpitwsabcmj5gdpjr6i4z4ulyd.onion:8333 -yhxcgpy2bwwhhpmgellyghjpkw7cfrjlq6trq2yl3632rxerwbmkvfyd.onion:8333 -yi2k4otmwujg7bi5iw7ewqntnxb26jyplx5xyk7bjvvaut2y2mhcgqid.onion:8333 -yi32omh7hh54oeot4i2ze2tif4l4cwdhzxxn4bzmtqrotfxrepttfead.onion:8333 -yi4gxqy63csutkea3zss2oryz4get22hcfginwcejy65g35ec5t4uzad.onion:8333 -yi4nvghovjd5bzcbhitvezh4uwg32n6r23et633odlacu4eamfym5mad.onion:8333 -yi5x6isngj7pivr5wt6i3drntlqsvbzijpdy254lbjdnihxmfy2cdgad.onion:8333 -yi6umkklbb6vr4j75buoss7kqkgcsdsx5fvgi57h7j5bzuleoe3ae4qd.onion:8333 -yibgffpo7dimyvjlbzfr3dnmnl2r5hbrpxbtcpksthsko6udsrk5uzqd.onion:8333 -yiiyiuwns45zhmkwi3wjumqhnyfkwkahbggd6hrxtnrxfqwn2vdx7pid.onion:8333 -yijdxmlgnfcwrb5zxvchjhgtc5357mecuopminujkono7bwjgqu4acyd.onion:8333 -yise75jksg27th74bxo3a6rcr3huvromhmuhnmy3n3ngcgfpagq445id.onion:8333 -yised7sf3xzsnlggeuioas2of4crrllkpz2gfbdy7c5cysa5sxi23lad.onion:8333 -yisvuvmqtn7wht6dndrqzsdl7vuspxwrmfwwu5o7wldnzn4mbzeb4yad.onion:8333 -yitceyo3wv2mk56omv6mon3n7dcfr7jiggdmzlmtikpoam2otiey64yd.onion:8333 -yiuesqqc73nn7kxadavmlwc7ymciszzk7bxs3bd4fwucaocme6qb7lyd.onion:8333 -yiz7d2lkgk2mftp6i5e2tqhotqkqjgxbdmzbnflwvsioyfydqrvll6qd.onion:8333 -yj3gs4nvumsfztawn7ku4cmner2zlmcn5kke33g4j2vywxsrqmbd7kyd.onion:8333 -yj3q4iustxfcq4bisbuw3jvqc7ph2ggld56mvyxqvgw2tmsinbwlnzyd.onion:8333 -yj666fxjddvz4xzkhtzhh53wvkiobvildczzxb3mixjipqqiqaz3bzid.onion:8333 -yjdhdurh6vqxuykgmuskpabjzjni3ehxxh3zq5redu5hqdmhdw5b5jyd.onion:8333 -yjkojvjsg6yhfj2ln2bpcrh2e6fr42ul3yzsebbz2kkytg7pf2zzjzid.onion:8333 -yjudzsswyvfqyeth2eghfvegxg6z6ubnx72kmqjljhdewrckw56lggyd.onion:8333 -yk2foofoifxgbrp5a45okwbelrsvycgqgw24xv56hmuqxlpmw6msndad.onion:8333 -yk4sercvyzvqxgbgn7srm6eeivlzoa3t4sz363aygcyciubcieihhxqd.onion:8333 -ykh3t44zjojpj76ouqeo662ljhyc2t6e3mike76iqpelcdztgaxuw5id.onion:8333 -ykkhln6x6hcmhyrx5rxaf3c5auh5k4plrpaisits63r33ecwkmtexhqd.onion:8333 -ykqehwl47hwypuhhuuxkpoexocldvllixqhplpsy6ym65vbjfa3yfbid.onion:8333 -yku2clwr3x3ndzfjdk3o4spoztoqy6ndatken5wopgapg7qkvypuqoid.onion:8333 -ykwrwuffwvaxlwivt3hlhyz2yo5xde7dw4x67ygc4xh2t6m4i5cftkid.onion:8333 -yl2preaby2yqyhmviyq46roapupmnijt2g3mzmvwtxptvybz7rbs32ad.onion:8333 -yl2stshaozpyqtut7m6ln47z2qhledknuwhij6kvxsuaai4nwy6fp7qd.onion:8333 -yl37nyh3vujz2fyrz3eoqoteixyiz3dj5rfnnmrglcgcswzbeqbjhiid.onion:8333 -yl3bo5zwwsg5dbhrrcjkvoyvwwxp3kbdgprhe6md52ob2lra7ynrbwid.onion:8333 -ylaoywooejvpfosewxmyxjhc2ahfepjbvuyjc4p7bymwirexlkdituid.onion:8333 -ylaprgwti4dsumx5xvlhul3esf3yi3ebyyubb2dwfgwe3zysv3e6nyad.onion:8333 -ylblnrd2jnfjtustl6yt6pix4mgqr5qqoevunmwk32e6fxq6uj3dchqd.onion:8333 -yldtx7o5y5jf2utrrtqf5yf56akol55wars2uwxuvjoubustrtmuqxid.onion:8333 -ylh3vliup6k27pt2thw4xgfguiziaosb5y3ovee4w6dzwcb6hc6czwqd.onion:8333 -ylsvnjqrcgatkzj5gfkwt6cz236z76yvgpeulggzml3xb7tnbsttjnad.onion:8333 -yluwecwlibf5dw2sup64dq4gs4cfdhtkfhoy5cszrvu75wljeqanr7ad.onion:8333 -ylyuglp5b2p65gmiofhe2irpxswlhecdecg7d27qhcwehegr2efmesyd.onion:8333 -ymgyodvztfs4nnijjnwiv6eadetxjm765iv3ryuyhsq4upnjwncpvsqd.onion:8333 -ymiw3d4klephwuwbkgdpllrs6hssb4svcg2um7sdm3hsnnksbnvj2vqd.onion:8333 -ymnypd7xmz2fka2r4yxvq2ibf7rvdyl6eemppo74rfehu2d2oqkclcqd.onion:8333 -ympp5jlakwfhj2bozw6w33qailkrqbroizxm3pdfxvjdbrkwtyx5iiqd.onion:8333 -ymrunm2vhoarw7rpo6jdmq4mev5hz63umljki65q2v327vmnw6wjyvad.onion:8333 -ymt2hdfgdxo2awvj2k4y5tbpvapj75j7v34tvvlrqy44lsvvdcnjx3qd.onion:8333 -ymuufa5br75liswfrb6pgm3hc6o67gnzhyg7vpfo2qsw3oyw7m7nsaqd.onion:8333 -ymxea74sswjyqvv7jsh74dnvimcsq4rnao5x5g7dfjnbfy67oj37l7id.onion:8333 -yn3avowdk5cox7qz34s3qiz2u5j2xg3irxckhzikfjv5ccjqrdiramid.onion:8333 -yna4zorq57ehghewlega7lb4zgx3t4lgv5k24orv7b4qcg27svymosid.onion:8333 -ync7fc7dz24s32kp6opdkbvohb74obme4jgo3rkkvjzywslxegist2id.onion:8333 -ynilvzuulga2tlv2hcic7ayc5qpd4nz7r7snsyejp4vxwnxlonf4gvid.onion:8333 -ynkv7njh6hj5xewxxy3gvtnu6ocyvu4tgrl3gnw5xxkdpfshalppqmyd.onion:8333 -ynqgzojvdwv2rui2rlechb22e5hwqipltusdnfkv7s65iz6fgrnybnyd.onion:8333 -yo4ykt7hngppavow7f2sz36ajl6w34bw6qrcfee6i3s6jkm6seove7ad.onion:8333 -yoat2b46hzeuhy7n57gjmfxgppei3xnzdxwsl2ipc5ny656j7zp6ovqd.onion:8333 -yobra7r3ketjuhr4g4cfdqumsez4om2eefvmgxrxq7wxnkouzmcemwid.onion:8333 -yogfxdco264tjbbeek22o26lznu2g2kwvs4lmft3ib3xelndagtf3uqd.onion:8333 -yomwxfciljad63gicbd5757og4lypcph5f5mqdou5kj5rowkyotaohid.onion:8333 -yon5gz4q7soici4i7jf2zaciusioym56jo2bat363tr3peoiurransqd.onion:8333 -yoobb72dyt62n5dpsu3aqpqa3lmfj6gfurno46o6vmqdbpwqw32ahjad.onion:8333 -yotcqynj24k2ckilo54hjhftjuvvwiacbzoraqc2kq5vtmsxloswddad.onion:8333 -yp3juo763dmi7ryhkv3kq2l262cllrru6ks5tlzcdlxdakmip3zosuyd.onion:8333 -yp47gud6fjsvjgu54oica4b3ij4zfreactcaon6fx7v7pfbxbrvqhtyd.onion:8333 -yp6klgnrvisq73qg4dk255h7un2k7pbk666jtzc22rxjs2en64ojauqd.onion:8333 -ypaazf2z3t5dqzudlygjjpyb2uvk63guovstzubsohbbeomometn7cad.onion:8333 -ypakyst4bbhh2juqd6r7xymqnrgwx3eajekpg6o5b4fazccy3mwovdqd.onion:8333 -ypkjkt4dnyqy6svecydigttwnsj5x643w6edk6qzhfo2hkxxu4ln6zad.onion:8333 -ypmikts3saaffj2uo5zmkbac5m7xnbblxkbhpw5xtxbamajqf36wgdad.onion:8333 -ypninar2hybv3jdovr7ax7teq6wpzvrw6n74csq7edos3hzumh2h27qd.onion:8333 -ypoinzgql3zo5d3strpmannbkdtndxkxlajwgcpaj4ngbc5mqrzzgpid.onion:8333 -ypp73pv2vcjfq23ltwhojuremxxfknwtgkxsvwe3widlaevyx34pepqd.onion:8333 -yq7s6pe7jzrzj5uxlorytwxd5bs4kljyvp27akdrpang765yd3sexwqd.onion:8333 -yqnal4phy7wz3lsoi23rziyb56bnbzvvypy2mg5ponzrk63qpyvle3qd.onion:8333 -yqoiqt3molj4ygq44zyme5gdbgee7catlf4ndjr4myiicduuwiev3fad.onion:8333 -yqvhbmvc45iy3drl7nceuhugdt2fevwx4x53zafio6h2626kflwtrcqd.onion:8333 -yrambbqlzkm6o5pkc5q563njvrkfallqobvscvpdik5owbdtnhbc5jad.onion:8333 -yrdtnt4lkpysyyrvryqhxw3k427gxwziosdtipf2dcifougwzomdfcqd.onion:8333 -yrlc4r3qfcr4x5wnciutrdvasrpahor3ui25lgdgkxbit3zwtmwfmxad.onion:8333 -yrmpasdjmb77ono4c6rjh24fj5gt7bbjx7nxurytkmxbww2gam6vodyd.onion:8333 -yrqolwaoxpa32cw2zegnaggmniuer66umflznja6dcp7udqpaoanqwqd.onion:8333 -yrwksigpx4foqlwnf6cxwtppx2z2msompig73dkcm34pwsmy5bwwg6yd.onion:8333 -yrybhm2es4siupjnyjffviemvqx24mqj5niwm2wf56spdqlwau44r4id.onion:8333 -yrzwl3rbfjx7eybyjvnjz2y7qmvpnkexkmylqpwsb7ivpg6ch42mmxyd.onion:8333 -ys2muyvcnpdadettzavleh7qrn7t6r7e2tobfp7yxftta7ez2i6rdxad.onion:8333 -yshp2g6b53ndeez34nxnk4bz6cqbzlfxqdggi7btqlwzxzuc7sweqcad.onion:8333 -ysq5rtpfzkz5gt2s62idbsd7secz3jepzlup6hqf5ttdutsdmwg2ryqd.onion:8333 -ysyx5eagwnqpfemz2nhwcxs2c3eueqk5f3jnyvyfqfno3pflcqfw6yqd.onion:8333 -yt2vub6llcegxuucu3iekjqfpmbyz4kreuxx4su2pqcetw7kbkbipzid.onion:8333 -yta7q7v5lkzt4zyp3m44cxcdtymxgmuqdntnagz6h3hwidmqoeavifid.onion:8333 -yti2ofsqg7k4zbln6aqx4zqaor2zpmlsebyljxlu7jczsjqtd4ctd5yd.onion:8333 -ytkkqeik77zjjwabsdlctuum37jr3r2rg6ckxudza7y7tialqr2wfeqd.onion:8333 -ytq4uowr6vwyjmrjvac7aimjjlzylfmhqhn3z4ecenm5dd6u2ccsijyd.onion:8333 -ytqhsolk7pqur5cu2faxruehvx72yiiwb33p4szdnzidjqksanps3nyd.onion:8333 -ytqzrm7fke3kqgh5b62taq7yyejgtd3yxwaifj2pimoqbfq4p7xi7sid.onion:8333 -ytrhvysmp4iq2qumdrpgp54q3ushkf53b6i4oxpddg4rmlk7hbayusqd.onion:8333 -ytyn2e3bkmgavrygpk5rzydfdmhpkercccqcaks3xtnbgq5qsyg4euyd.onion:8333 -ytz6ov6l5ofhjudlfi5k26lsg4v36p7xwciafy2sdau4cn6ozxgmefyd.onion:8333 -ytznm6jwapg5h3firimqb7ao2g7uihakg3gt6hcpfqkkgcyemklfufid.onion:8333 -yu6ilgxjfffdb3fq7srwwmz6ymp3fxberstpl6vdocmxbrrf5e3tw2qd.onion:8333 -yu7c5kjgmlci4arofpgq5d2qs5fvbw3zac52nampn2vc6vximc6qovqd.onion:8333 -yufe3o5x7spybs5tku64r6hzbrc46uq6izky6z3dyvba2ymblvehyiid.onion:8333 -yuhebtpb6urpsrr3g3vk7tcl5lp5dt7kcaj7zpgox5r4x6ptysxzvgqd.onion:8333 -yuqoihr4p76t2yupxuciurcpzsij5i32enjlsynqor25fhdvidx3djid.onion:8333 -yux32z6r5leyhbdrgdpti4sggxyoy336qb73ia6sk5egfli5qsvkxvyd.onion:8333 -yv2ezeqqfeoprti36q4fds3ckq43vdv7vktqfpn2npv6isnbxay47hid.onion:8333 -yv7ainbyxz6wejjhpjgzx6ghcomdwd3k7fclru4woooxcovyjwrp7dqd.onion:8333 -yv7llcydwvi2m4xpnulhgxcrje6vswtsasu5bbmgxuk3lgln37tdvbyd.onion:8333 -yvgzvmh4ngi36zvn7pe3bocsxj6pccafh7v6wmswkdobbxdzh3b56iyd.onion:8333 -yvhvl5bvjp5ljmooujmw74wdyqnhvwlm44766wwgq5thnzctyni6yeyd.onion:8333 -yvnppv3n3hwexlvugfviwv33ycavxdwnh24dps5vp3y7kw6kze36v3qd.onion:8333 -yvsokw66m7kqqqjxb4mntjvwhnpoovoec6rrpqtdze6fdvpbtvt4iyqd.onion:8333 -yvud2f6wb6puec4xq3a6yruax25jydqepowhz65uvlbvblsyi64skoid.onion:8333 -yvvodwqb3szlgkx4egcyq7qmhpyoqxdyxdnksxl6ppnmagnsu4noemqd.onion:8333 -yw7tqaujnglpjmjak5r7sxvjg4gqeubwetm5h54e7fbfn7yx7kgr4kyd.onion:8333 -ywbprsiodgtlc2qoubvot5qm22logutr2dbizmlond4dcifklaxqlcad.onion:8333 -ywkxlaydopi6ygjeggtv5znptkrldzsh7peg6wabkjmcu4k3hmbjivid.onion:8333 -ywmh5zcx3r2rd7zmkyx5kymgxk43lsamie52kbhayqwqyod5togs6aqd.onion:8333 -ywq6oxdfdvlict3cuasd3akvcl47iw6bxykrvkalemrcyqzyzclbf6id.onion:8333 -ywqkdkihpzr3hx6la2lzqsguoqbuwkn36qcrbkhvltd62zdrguprljad.onion:8333 -ywqp3kjwchkto24so4nn4ofq5m5c454btnkux5jxftkkqz66ducu3mad.onion:8333 -ywqygs72qzxbkjekezlhsnrsfnnvm66igkovfoh267ru7ho3qtxtalqd.onion:8333 -ywvpyur4ny6zhfxpsva4mh6cd4htw4q7ylx7tissnxehwg2bid5fumyd.onion:8333 -yx3nnyxy3h4ex22uqdjwephoprte34jelnkpr4ua3d23ks7qxjrqzoqd.onion:8333 -yxa2iu56fp4i4mxzdkmv7xxrluyxtkylqvexuceivx4fqxbjyzme76id.onion:8333 -yxgvp66ll3c6ko7w4hm7xvzofd3cb3ku3jjqc4wihapnyk3wxijafrid.onion:8333 -yxlaxiaatyfnrx3l2vhb4p6d347djzux75gcl2d33aydlwspo5w5wpad.onion:8333 -yxlwpmsjdbpldhi5hlzopision3iqbjzpvyaaeb4yst3z73qbgqy5fad.onion:8333 -yxnuslj7hslwmofh36a37stlm5jjnq46vvvyntf42uw3zuouot3sjaid.onion:8333 -yxq3bjwdrck3lflvwixj2fc2l7pzqnea5l7cucviamoc63a2xozk7iad.onion:8333 -yxreb5ajudnpt3b7z5hyizaj6ufgd46o334wtduuyaakboxwztgji2id.onion:8333 -yy3bnszld2tbbyd45f2j7btrbdz2p5zsuzie27liqr7xgkfh37rcojqd.onion:8333 -yy7rusheh2cq2xghpsdzlrx4gpejgfvsfhq6333d2jttcovhh5jo44ad.onion:8333 -yygxdcvyp6tn46umpmxlsgsi6crg2xjchuhi3okobofsx4dqgwucnnad.onion:8333 -yyo5s4r6wr6p7l5p5umlp7xgb47ugeptugscv4gvpsxvjlwymfpwruyd.onion:8333 -yyr2peqznujer3t63yyhlcasjndbhllvtxxkmcvr7p4yxpuzjrcylcid.onion:8333 -yywmc2hhk7t56e7jun62oidqft6jvtvvlylexihzgcrtkzxe5axsd7id.onion:8333 -yz3izxf6pdtr3ucbriuo4bpgjn2visad4vgocktexnpv3rfgar3kydid.onion:8333 -yz4l7aqcjf3lcdtdcuxoxljedrcrlo3lu6kths2bvjeoil4wqx3d46id.onion:8333 -yz5i6sldywr2mqzh5qmwoqfgsta5f67bgdhqogejjmpengl3llafdjyd.onion:8333 -yzakgornrhzzenpclo4ahyai5lxsg6mjq4zrwlhqt3ff4sblxi42jwad.onion:8333 -yzbka2sygb5eqgrgk2svqin5hl3dfknzfdn6wzwncexsejmrp5wgm4id.onion:8333 -yzh2ineefkzohck7vkwcfe62kvplsly5xn4dmm25fpxbjq2va34bu5id.onion:8333 -yzigosfexpco67cy3e32xehlpwor37fp52my5pwtr2xsnj3mxl7gfoid.onion:8333 -yzijb7pu6mrrdwb7sku2e3epfyrkhl7t2a723vaisqulr3roaxoy4xid.onion:8333 -yzlai35raddd2kdjnukns7u5t4m4ngi5dfrlq72e6lqf2hp5dzkuszqd.onion:8333 -yzo2vz4kuitm53zwynkm7ddfdw5escsp5fp7rgf6uspphe653mvdekqd.onion:8333 -yzqfzw7fgzzs63xpvsgznhnassxcadbfaxxaxbmkffvesgdxizhxkyyd.onion:8333 -yzrw7ukful7rhvlletmabm37wupkhsxwo2esqqotsoh6gxib57ss3tyd.onion:8333 -yzs2bdhwhxfgaozpcic4v66w7wwlxrr3v4xpgzer733qehcwewijipqd.onion:8333 -z23pfizxwpae2sbje722iesvd6rcxntazcaoefabzsudkc4xxmtbqoqd.onion:8333 -z2eky4p4ozlkrrmuq2jqcz6w2k22re6hxrm3um4ypcnmzmpsi4p6l2id.onion:8333 -z2eo4uckd3ymgtsjitag7yqukmjsjpwuf3d3npq4oskeatpkcinxkcad.onion:8333 -z2gnzha7ttijmle75dvqdzaeqz3xyxzjrrqbzribvwbomh74je4xeiad.onion:8333 -z2ihxne7lyodwglkwpvdmz3a6343msirrvjmaf2pytuo3jysabrkiiqd.onion:8333 -z2lhlshxak5owviqqzacj73ioftqmvq5idawmrgt4k347bwr6yubmqad.onion:8333 -z2njilhjl33youet5rbdfmncadpt7tohtconls3qhpvuqfkreoteqfyd.onion:8333 -z2nocd4haqt257cyr6festid7enoe72qpmu27cuvveoon4rcak4femad.onion:8333 -z2yjvxbv3rfpso4cjkxc4i72f55xb5fihthcdbvh6dp7ghxz2q2tabyd.onion:8333 -z33gr6fni32nkhfmkovcbvpuk7s2atoqfbuzdgz2jszh5ua7zdu6uvad.onion:8333 -z36427rantiy4ikleyihwfwh2ga3pyqqz7doezrzkyv52bi3mpcgt2yd.onion:8333 -z3asgzuzdvhrrejqjnkg5qfeynspuwzzrl3sr7seqxlwkiemnrpsrzyd.onion:8333 -z3hdtpvmnaz2izvnlopzmfgdb2synsomzgy62h7vlxvsn3yqhgufqjyd.onion:8333 -z3hgdhj7zxtih2gkjlnex6occtzw3tpd6f5eobwrntrhxtiww6ke43qd.onion:8333 -z3jl2izfxwfmqnbbrac3tustn4bngymj2tia2sn7nuyconbmjskedtyd.onion:8333 -z3m3a6wii62jc37c2fw7huca7mu4eywnssindvhn3hrh3t4y4kwj7dyd.onion:8333 -z3od23fobhkvypxarneq3fqsdsksjt3hmujnlaiwb65hdwa2n5xdjiyd.onion:8333 -z42np5zjd3thnd54h5n45ibynz5vb3flbgypt4me2c3bnvntn4rsgryd.onion:8333 -z4d7f4dvqutzvvqkmj35znzpyorroqg53jhbft34gyk2h34wzorv2rqd.onion:8333 -z4gvqymmj5jmg3dnao7k3vc245pzepqcrevzyh4s5xn5fcc6ape22sqd.onion:8333 -z4mmpbj7md2ljj2nzbk5b6stdromp2sxhysdexiq6kjqp2go2yfhlwyd.onion:8333 -z4pyvdupcieuqtzvhh47sbiahdyegvpgtwgfmlvfsrm4yj6g5mt6cgad.onion:8333 -z4qgvajgk3tr6aomi7zkpiilx5xb6tvavupvw42sgjf3bfqrgwk4tjyd.onion:8333 -z4rgrsudz3wjx7uykg2kmcadwixklibr5b4k5nulwrpxcjkasu6gnjqd.onion:8333 -z4s6g5bqdmo445vu2i6tcm54zjypfhl5uwnxqjq764bbu5h37gkp5gqd.onion:8333 -z4zr3v232rayjy7e4wuxxez2blz6p6apyv4souxjztqnv3mvaytb4nid.onion:8333 -z52bx6657mva3yjtrutjhxojkbwmrmndk3r3nptxc5xqz3nd62frfoqd.onion:8333 -z5ecnh7crpgo54nfll6qbwl4ybvfbq3izazsdu3pp6zqkam47nuux5ad.onion:8333 -z5v63i7lvhkfdqcex3ioeny62glxhptowtrfof54qbl545mlchkul5qd.onion:8333 -z62kddfut74o5njyehkdlj4caa6yg5orz5lznaccpbloqq2siiwbtayd.onion:8333 -z62r52qegmgv4otygobjdsubc6jffaei23he6n553akc4wnf5ryur4ad.onion:8333 -z63d77gd7artekfeamkqycni7tzrkvbc54fqr733veuoaqx45jwmytyd.onion:8333 -z63fpitzdw3ot62wtxtindh5334uatz2flxg6ronyy6jwx2ztjs4meqd.onion:8333 -z642d45aauehr2ycmv4ewv6zkwjlvlhwf5wlueuy5ynpu4qmffc7utyd.onion:8333 -z65lbxuvo5x36vuv5rgwgyoplqjzzciwvb2whvo3tlghzhp6zij6grad.onion:8333 -z6gr5c5yrp5seqsw73b2pkn3i4aqd5idmzgidjchjjm7f2hdgfkl4fad.onion:8333 -z6n3h75u5kkd5xkqfwbqasd2rekxams3jinrrqaj7p33qdxq7fdlmdqd.onion:8333 -z6n5kkyabl2huqtcp332n6xbo7kpilcw4b64govztw3swtzulgtxcjyd.onion:8333 -z6nq6lkmjoyjhqp5j3tg2gcjq4e3hgduo74unmtmnybd7a777hp4asad.onion:8333 -z6nuvxnjicev3v47o4vxjwakfz6g3jvyo3l4rds5qqfjptqie5re27qd.onion:8333 -z6okjxmclwc55pbwioqx5wyua7rjobcmbttpte525tlt2gexjcjtr4qd.onion:8333 -z6qmf32mld7uqjmx6hroqnkieerstp3vle3u3do6odxig3ubmv557qid.onion:8333 -z6s6t6bi4llpuod6rnakc344wn3h6ejpfejxrkjohjjy246shwfd34yd.onion:8333 -z6soa5spkni5ze6p2xg6lnehu3d7hnqn5ddiy34jtedwegf4syqnnaad.onion:8333 -z6t6fxwhgndvi36vra6d5duaryx2m75v6a5yoz3cqjlj53ko4wm7fhyd.onion:8333 -z6tmafvqwf2sd4rchnafg4urcug4xpkylwls2owruyifaduaeneyqkqd.onion:8333 -z6u4s3uz6bxke3tyibyccbg7uaxt4cb4dued3cu3pbjw6frqc5nil5yd.onion:8333 -z72rd3arkarr6eehucg7rrkjmvqnzdbjmppfk7zcvzd7jqrvisf7rpyd.onion:8333 -z745wkcll7vkkrx7zamibvbyqjtcp3y7wdz5kd33gijxfz54cxzg3mad.onion:8333 -z7eb2xkiigjdfay4ch4pubeqxb2jwyzdb5fo5owkbteyhefek76qoqyd.onion:8333 -z7f7lrvup632wkbzinvbkyyrhmguaf4fzt6zleiynk2vuvwdwt6ysnqd.onion:8333 -z7g3tx3nucmd5ozvs7wgq4i2riiufxlutv2usowr3p4lixfbx54fc3yd.onion:8333 -z7g4iekn3i7nliiowlt3ek7o6xlhi5tv2hofycacjqkpeoijghmiyxqd.onion:8333 -z7j2lcfj5b3isqznsb44ivi66lwmidcfspmvdrmhbfuyub2h3wbmnkid.onion:8333 -z7jbbwkyza6e37iqos6u7ln3nedom5i3dcnowdscr7wfj2xygre47aqd.onion:8333 -z7jtpaghm4na5po5p27fwbdh2aq3z4rkpwhhzemlrhsoefru2z5eyvyd.onion:8333 -z7m7rmzhol6swqnk6l4sadrjgxwnggt5zwgp2jx6tadca74o5puyuyid.onion:8333 -z7mcuih5vw5qob6o5qg27jhozuczpqx5lmzl2ghfxra53tov2h5xtmqd.onion:8333 -z7rxmrmvtsbgrrwwh4k37bpkk6dtu3aq7f5d442ys75nepy6r2q2xaad.onion:8333 -z7u326iowflnv6tvy6uiwwkusx4vat5gdaxwamcp6jd2we35ih6zplqd.onion:8333 -za6k2u2t22ohdrpqbirjhl75eadxcjvnqfkl4bzeygbnliqsc45gplyd.onion:8333 -zabx7shizdfchrfthsjcuyypqy473ni23ebi4aedow4bg5c4tl4cxbqd.onion:8333 -zac6qhbqbb5yo4rvcsmbilp33odkzfwrftwma4yo5hor4brj4d3ksiad.onion:8333 -zad5dkykkoelu5tdj7l7mr24pdf6eos4o7cbs5nvx6bcg5443eqwaiid.onion:8333 -zafdafmd2h6ue2pmuj25chhmkqad3jdcxwtaess2opxkrroopwdqfvyd.onion:8333 -zagkhagdzvkgpuo5znflvxcqxal5tweg3vsaoaonsvsl7r7orhlwshqd.onion:8333 -zahrvinucuxpxu56h6nkiiw7cvutxrua65l4jynvwkzt2bzmeuvdpuqd.onion:8333 -zalrhwuj5j47tntffl77xrdehzfwq7c7duhaq4jwnq5vdtdtajwiucad.onion:8333 -zaw7gnlyeqrlpgcmsp3e63anveudschhifaaezu3web3z6pjjdtvviqd.onion:8333 -zayfuym6j35mxprdsm2x7pvws2vyaoinsomdbgrqbe22rcc77j7jtnqd.onion:8333 -zb226sk3eljxccaswfgouu6mitu43sf2dan4feygrqnlvrot6z65oxad.onion:8333 -zb2qixzmsethowd6fqnwikvp3yeeeo3zvhgjmq2yb27tfslscgkp2zid.onion:8333 -zb62u4o5qzst7rzjaq6tafgzoybi2ncogcjp3sf7zbto7b2xmicwvyad.onion:8333 -zbci2c2pkku7hwg64ek4z4cbyn6o5bnzpzyriqwjckzgs34xmu62szid.onion:8333 -zbmhiorqlldelgniyhwogswpvrlcdjqxxcfm6vulenrpwiadvv37anad.onion:8333 -zbnovu66ikceaodzrkpwww4vop6iwvtebbeznngo2mtjkikwknqzgrid.onion:8333 -zbwbqxytihkvupc5zhezoh7oibfb7bopfcw6y4qbhh2kugnsw6zur4qd.onion:8333 -zbwpgu4z2lfuto566v6duz2qw5kkyvor37rpihk244bfjzqiuohdcyid.onion:8333 -zc2c56k7hcdux5wrlpixrx6lfutylfamr676tu2nr5z2vf5gwoyzrnid.onion:8333 -zc4l45jx3txlag7hduov4su5kl633sykaw7guioejg5pq2qyuescabqd.onion:8333 -zcc4wsaenndkzqdp4xsfzn6ilsdhwzpqiswumdc22dv5ejejec3o7qyd.onion:8333 -zcdv7z3vetrpeo7souyie7u3vyy6w43cuautaogldhs4n2fitytsihyd.onion:8333 -zcezifa7mmgv4voul4jf4wbqmr24djgrskwszktkt5hihywblltpahid.onion:8333 -zcif26i4yzp53k3uedswyrqkdmsmkflpmclmasdo6hat57pqjpm2omqd.onion:8333 -zcnl5vojc5aufydmssv4yxeotzeqpvyoxyae4kmoskty77j4dx4aykqd.onion:8333 -zctnwv5ln3yktcyqsbgie3qcee33x44b5quhjdq4zwjprl75r3snduid.onion:8333 -zcugrsfyxb3y5ucbdndifvt5ilp47a2233sv42ryf2cvzoncrgo2mrid.onion:8333 -zcw6xk4bfnl46fx3mkrmlnknbwnpssxsp7hlllj34fdrkutzts6yepyd.onion:8333 -zcyumipuaiotm5fhffmhit3ajzrgqihhibh73lvjo5hdt4aituudguyd.onion:8333 -zd2mgisets23i4mslxjl75froqjygtue4lnoq56qk3ohd4qcxpop7pqd.onion:8333 -zd3fxn7nwlj76qyjseubm4o2gs73jv2g22px6t24z7p5oeogqe3icyid.onion:8333 -zd7irysta3wti4efbjq3di2jfv237nhwotupj3rtufvvav4e5umtkfqd.onion:8333 -zd7uq75dlcseq546lmbqymh37cninokajwkixpvupillb7fgpqgbwjid.onion:8333 -zdi46azujxcjqa2wnvdecld3bdkps5erbodcvw2mn424gk2by5mterad.onion:8333 -zdm5zxotwdsma3jvij3jmlke5wmblwy7qa2kikfctlzltexx6l35u2id.onion:8333 -zdn24r3iovbxfkp5qx5ng7ribn4cqm4v5ers4olnbzugyp2gbhd56yid.onion:8333 -zdovdneke7oxtxdnee7f43vcu5mjzoa5m4bexpxgvopa5kaxyrcwa4qd.onion:8333 -zdovy6gcj6nrmxaygnjqf3ym5hbd3s7h3irznsbrjmgdywd2rkj2m6ad.onion:8333 -zdoyjklv576u3w4paxyjb4jmdhx2id7xoqkd7zn3sspodasmmazbbpqd.onion:8333 -zdqon7u5ofin5gy4rcmkixc7u42xypwklntwceohpektisokskrn5gad.onion:8333 -zdqxfzqxbaa654nsngnaqdz3jfsfe2u4hxs42covbct2dou7z7jpa7id.onion:8333 -zdtchifs5gqldijr7vzcgqqaftlcydhatm57owdwzrgudns5vpdcx3qd.onion:8333 -zdzkcrnoctqhn26hjbngpcl54nmvozbodf4gwf7anfxjrwhjxgurrdad.onion:8333 -zej7mizjlb26qecppzvgyswervt7ov6f4x6fwrot7obvab23xsv5jjid.onion:8333 -zejyatwyaptvvubp6b22cpow3an47bsrve63l6rerkldmuwwb37b74qd.onion:8333 -zepqddw4zaqqawkx7aqezpqwykxmxxeh2opnl3xnq2i6piazcvyb6qid.onion:8333 -zeso2dbskp3curnpgug5mjyvhs7i6rero3zbqo5n534wccstcok6ywad.onion:8333 -zexnlgnfxldyx6leiqvyhuimrfxznjfjoko2ek6rdtu4dvwkvztfysqd.onion:8333 -zf4cm7bgv4qollcjcj7kpx4qrtqzcsa3q7sds2jc3mxu45gvazlts3ad.onion:8333 -zf4k4efdpcwsfyobz444dgdfnsa6tdbd6aor7p2s6mpuol3ladssb6ad.onion:8333 -zf6nwlrrtd6q73svcimgfp54pinn46hbcriqnqqsitz3fbibzmkev3qd.onion:8333 -zf6tbmhchmzo46lmhx6vu3smjj3y4hjjrv4lnwpa3uq7bvtjcwapmqid.onion:8333 -zfhx5nerqkerm3jfoq4763vlmay4pifit5a6a6jtcjxpu7t4galhxwad.onion:8333 -zfo72va3rnioxbhh4kuth4epqwqque74aehlonvde3re6mvhz4uzgaqd.onion:8333 -zfomias3uj7w6sai3ty3coxhnb6voldudbeyldgyedxqo6kfc7rg7sqd.onion:8333 -zg2yslkwabguckkqanyxwbncrtozc2fjivsyesrcd27xxkowkbcwnxqd.onion:8333 -zg7obxhb4c4j3dgzg47zffbetclv2so4foyutdxizfnedhdkhjzo2cid.onion:8333 -zgaubbm4h7qckt4pgtp5zawrcf6aazby2zk7aeo5xsqpgwsc2yrlbiyd.onion:8333 -zgegpxbr7z34gupenib4tuwywyk4nlevo5dkfg3jt6c2jw23len76qad.onion:8333 -zgjrto32gianyp6i4gc73nlilodiqyo2s5dkr5ev73yq4qvcjxkwycad.onion:8333 -zgp3f3dmwbnr7257rouxkgddijr34keobzrtk5gkm2dgfbw2bylcwqyd.onion:8333 -zgrpshddeijmdp34xfyw2kz22la4jxgwce42pupjp3bo6xtchsorrxqd.onion:8333 -zgvklnnz2avqcnyiffw7t6umb3is4tfthnkzbhnyfr76sjtwu5u35pad.onion:8333 -zgwclfbi25s4ta5hfiwylboeitti64xzoan5aewuqimp5j55nye663qd.onion:8333 -zgxg4d4jifuihgozqblrt3kjkrh5zhbr4uyivtrzf2khnbtbe4z3qxad.onion:8333 -zhabxolberrktnga2eixvhe6vmaoxour3ktd6jgjq3emzkgthsmaq3ad.onion:8333 -zhapnpxpk3lmrfsmhluytttodeosmie7yabywa3aaxmtkreh2lmeemqd.onion:8333 -zhdd42th33pv6qnfi7v3w3gddy3tlgu6pjo2bhh5ezuytutxhivbtqqd.onion:8333 -zhea7pvhuzw4cte7pkd7u6lwjyiqczxi7wgvzhfovtjd7qwdc24pleqd.onion:8333 -zhgdvhnh5zymbwrmd2rfjncparbxfiyraqh4imk6kl3tkltgccl5cgqd.onion:8333 -zhhkv5u7pxuu36y7vzu6wlbjpd3wftxfuadsst3ifs3q23eydmako4yd.onion:8333 -zhhxxlz3wvdaj4scdetokkqgs2ndmdvyfwq4qwrn3l3hv2iftlgsucqd.onion:8333 -zhrzks7gkdvyef6s2aogxxuw7iqheixmrdzgkqotpvl5bjz4vq5tkkid.onion:8333 -zhwmsba7q6vn4yfi63p4tc3dobsarso4322ynl5ofggjbyiozefttcid.onion:8333 -zhzpumb4itgdxy53chqowtu43ru23ag3f37r77ydjs3t5o7bookfe3ad.onion:8333 -zi77cxawtknqkjiod4rhf7gsughbvv2z6e7mg5kax465uc4vtg4cwlid.onion:8333 -zike5s7xtcgp6frbjgzjhcz6gsvd3pghkl2jin3sdasrek3vy7l4ibqd.onion:8333 -zip37ysefmcbnyqvt4jiag6dj3h45ie7h56hmw7ktheotkuagippyiyd.onion:8333 -zipzgdr2m6gmjfucup7xpertovt746f57hrgb7lj6m4rxeniem6zdgad.onion:8333 -ziquiv5d3hditb2r2qmt7hn7knosdcokxe3khj3kgn253l6cynl62zyd.onion:8333 -ziyp62u4xfsuljn5ae4n7jea7wfd6vfutket2e73bzrhpstozs5364yd.onion:8333 -zj55khmgsehm24efh4nmye7oao3u3l4tjuk5edghey3mt2ippfste7yd.onion:8333 -zj7jf7o4b3qztdorj2stojv4us7lzqs37fbubqpqq2wu4dxi3cxpa3ad.onion:8333 -zjdf27w3vt4rpyb6usa3r5yi455svyaha4qtsfwvyrmf3hmz5hckbwad.onion:8333 -zjgnxih45rz3kalgxvhyebyavcnohmoa3bcnl5cwkmq5pmbyypavqcyd.onion:8333 -zjx5rmakdzormbwzl27w4xcucehwiat3dnncoqdiwesbmb7dg4fpmgad.onion:8333 -zjy7d5t6rxljc64pvta3hqi6yxzfsnixtbslafamoxiiw6ptcmv3kfyd.onion:8333 -zk3cgisxp3uxevuxmbzbmqyhvkhezspeydo2bmhu72b6mw2kl6v43fqd.onion:8333 -zkc2lid246a5jr2dpxtvmtu2tfiwt5dbry3xybu22b62vguco5a4qvid.onion:8333 -zkisbl3pv7dsz3szdawti4r7mhrhssqxf3uopi3vrib5dpt6u2u7ckyd.onion:8333 -zkjnuuenigzhs6d5y62jct4tira6fzijqx2k3yzsdsyulut6ywp5muid.onion:8333 -zkjoev53w4e547zot35onpmij4fiube4aomnysttqtv576zdr7wex4qd.onion:8333 -zkl2fsiisu3cyhhsua7qlr5afhyvmfh4qmapgubioyhoepqdb46jceqd.onion:8333 -zkl7x3u7365zj6opig53dxtty7ctw2ijidwa4lbdbhcv3wkld22bvxad.onion:8333 -zknqouk6z7g7h5y7rmycqb6sgzykylbbfpvf5efmzibww377iminltyd.onion:8333 -zkq4fgcc4bxksbsi74pjwjfby5tdwn26yhjnmewy2qy6a3l5p6bnaaad.onion:8333 -zkr66xkrvecgu6jkyan6nxvtefynf2mpsls5csvf6lt6ltqvoscw5yqd.onion:8333 -zkxe2fnm4tsmbu4bdge7i7j2cesfrq5oznfzobf4mwtejbhenp7ubxqd.onion:8333 -zkzj45moxjhjvrzqweh5g3iyucdb2qaqby7vdtmlqbvxmm5u337aglid.onion:8333 -zkzj4uhvvpav6ee7djkfj2uem6tyswi7idzupkozspbgr2kfvrk5biid.onion:8333 -zl27cum3gly7nfhwl7ulnob6pyichpxglnss4ffqv3terkquhf3dm7id.onion:8333 -zl3dx4nswje7l5p2fgvypve5wugfqtcru2ud55qo77tqdp2btm6kp3qd.onion:8333 -zl4gt6uafawn452rlqb4w2mujut5tjcnq4ahdr6ucdyeu2gtzlsk2jid.onion:8333 -zl5voqvgyf7deglpxamz6hpg4bierfngqsmmu72wpeut7toja47v6bid.onion:8333 -zliat4frxeuirx3nbijcljvgr5wembicg26fdpgda4pnps4oguaobmid.onion:8333 -zliy5o4uqgpqj2nbgyadqnlomnjtmdlwoxcuduwcfavzsguj4z4iwzqd.onion:8333 -zlkwqytpxbhkg4umwpqiynz6niefzqjbiwzryg2zpwwmvmw6pmssngqd.onion:8333 -zlpztcqey4osd3omtpsm7micrh6jrxuqzeeendpngk25iyfhleieekqd.onion:8333 -zlx2jkuv2iuzffo35hc264rnvoimzccvtlljdbmut4es76qe5pnvs6yd.onion:8333 -zlzhg5hipy7nc4ulsaprgro53f63mjj7je7m5xptgkksibgvbc6r2fyd.onion:8333 -zm2j2k2nl7pug2amadjkrcgs5omdnxctyl7b6kmlywsphcfl6c22gtad.onion:8333 -zmfmdmzlsyy7owe6vpgugvdq664vjhluqura3skjlm6fzpgqe6udm7ad.onion:8333 -zmfmmn72dg5jjkovy4jt56c6btg7pgp7wmeh547zlvavwmlbrbsl5yyd.onion:8333 -zmjncrrwtui476nyn6sqbp67bvgdhotllq33vzwygasumv6d2us64iad.onion:8333 -zmmtddrew2mjtghs7zjiyi2eelmyss7miyj2axzwfgnmvzthx7phevad.onion:8333 -zmn3jyv5a2rod2udnreygi6uan4zq5ul4mhewyfyrf7a3ury72bycuid.onion:8333 -zmqvv2cdxjj3vbclq7l6rfdmjegmixwkxsnzzd6qezwp32vxkr2cbiad.onion:8333 -zmt7psgtnnqxk6tibhvwkdfuhtgtjatz6bpoyyl4ptuv3u6ko2b5o5yd.onion:8333 -zmtd72b4nsa22ocez2hbjsxxrdfuxxyghg3zjtqjob5sgnjpustat4qd.onion:8333 -zmuuhwxhoa6h53jijpb6mczcvtxhw6zyjymm53dwzsbmkc3kkv5v64yd.onion:8333 -zmvriguathsanquofxml7kgcda4tkihm5qked7a6ntbqk7rmz7qadkad.onion:8333 -zmvritlexdmgatfqjlexl7wsx3lmf7y3qxe2kqeergb7ntkfu4nky5ad.onion:8333 -zmyavuyz774c2fo3eb55yokivpr7qfxdpjy2t5wpeygunhulck7yxzid.onion:8333 -zmzjx42yxlpepdgya34rvwb3wc2peggturiedmn4sfjltgy6gjtspsid.onion:8333 -zn3gjkpqkajav76kaem2espqt2bw6ggfvmn4u3gmkonds7pqd5heqkid.onion:8333 -zn3mj2tggwpbzzkvtsovkrbdshbsvac7n676hbi76r72de2b4gknpdyd.onion:8333 -zn5purhx3rnikkks5tx4scnjlhewwll3uzcs4pgde3qeqawof3jefhid.onion:8333 -znaiehv3qrtloxdi5rkbs4eqpmuveazuftob3sqzw3ta5pyakuwhx7qd.onion:8333 -znbv4cupk7rrdk4rqi6xncbouhscxnqdlbxtltp7564isfv5vtbyu7yd.onion:8333 -znc4xhwywjqejoioap3ssxvtsdilsc6i5o5s2rnp2ecmxqe6xe2nh5yd.onion:8333 -znea5ol7qgniizv3og2gfcbxw2wi4qhk7dfkdlt7bbxpy5aflljygbqd.onion:8333 -zngxgkdgkqpfyepa5cvxlaxvlyluzdryhzmviar4ojzaduxw37hhdmqd.onion:8333 -zni7kioacgsy5haqiftnexr74sv7rzvgy5o6lmz6dy26vvwg5lffioad.onion:8333 -znlvmmj4dvpju46kbb6mob4kufyf5a4qivyygmjj36kymbaa4nzi42ad.onion:8333 -znmgbi6qlwwwdlizjxsc6eujnfwgytufu6guo67b54av4y6inwgxllad.onion:8333 -znmwoazdkcffprail6h4p4opy7i4zqomhpdxe5l5nc6ejqagvt4i7yyd.onion:8333 -znt2jb6nivjgl47s2gdcgac3merqjfq5h2n6x6mbjegx6fumtl2ownid.onion:8333 -znvkqu376ienu62x5hprstn36jfqxospcnfhpc3kq5quwcd6436pzuid.onion:8333 -znwekshd4os5a2n222xrllgjuyvsw7hsb2y6br7pkwjatywk5lerbtid.onion:8333 -znxkxyd564sfftgjscsmi3a73jsazxwhsneix3bgto4suyjx356xewid.onion:8333 -zo4fczw4drgcbsumtgmigjkiso4miz34ltauajaawqmqoa6oxmzy4nad.onion:8333 -zo5jasvz5qo7pkgrgn4r45twdic4zake6zpjfemj6x2ioxcwvs7yzlid.onion:8333 -zobj27bempyxsigdvawc7foivyyuek73hemep7zf2tajof54353ok2yd.onion:8333 -zodjfmegrevmjbppq2t46iluruefbgh3b46tbrl2s5qkprvbetk3euyd.onion:8333 -zofseltpp23n2xb6fsmfgkwgqggwhrelxmt7zq7toazybgehbs7d5fad.onion:8333 -zohxazkomcr5ggqlj2edu23zs6xiay7wfsrxuetrn2k2s5gwhwhcngad.onion:8333 -zokmgys3gsgs5oivjcqp3xiki25iexezy33ekzuratdz3j5unqpxrzad.onion:8333 -zosjvclhqzwklml43hvsdmupglajj5lfdb5h5frgym7hsqo25rwrbdad.onion:8333 -zosk6fx2a3mxkfaeayziiuizq3y3j3azzp4ylwyh76wq2sqtaenuwdad.onion:8333 -zovm6wkattzmxc755cgqqd4sxugn3jaxw44izlm4yfpot2ucfeqnukqd.onion:8333 -zowc7rklhd6xhje724xomkftwimuihacwcnxkt7vhbjpvpkdahvlhxid.onion:8333 -zp3vpkpcfdx5lxvnuellqaf5qdvhu4luf4zqfx5xjo2dge7cqsxhsxyd.onion:8333 -zpgobpk2j2suauhuzfmh4iiz3y2zhj3xvb3g2t4a775t72stt3majryd.onion:8333 -zpgybnbaxfvzjeus7qna45zchxdkekjpk5webdkeqtxfwcglgogm2vad.onion:8333 -zphjbml3fqtbez63bjvd4s552yc2xebitadkpw2jon2qkbapbiltijyd.onion:8333 -zpnoo3qordv4xj5hjynkssu6wechvup6to7pamrgbi4ljmfugjyzwwad.onion:8333 -zppmhj76a6dyjch5qtubosxcyvtwjnb6zndsfywxci7dy3vc6lbfusyd.onion:8333 -zpq2nzcnlasmy3rmwtmaybav6t7xfrvorqqdwntnbgbxqujyy3dkwlid.onion:8333 -zpqvo25bxu4n2u3mh2pdzax7wmpsitd3qsszgw2ye3mpfdpjbg52kgid.onion:8333 -zpx2tq27yviwzbpc4nyjfqtlhigoa5k7cwl676nft7bkajo6jq224hid.onion:8333 -zqlwzzfzdoacgngtsnofmyqetag6o44f5r72opj733y434b7npnb4oyd.onion:8333 -zqq4g2eikcfgls64ffstsylfbqrfstm6n2otvrsbtvvjpqwgyqdnmbyd.onion:8333 -zqrj4fhhp4mq5eh5xptzcxjzpae37brkdn3voz32qsohl6noijygdkad.onion:8333 -zqrwah6dn3t5fuj7ohlyka27zzopduhxy4wyknfrtqpx4sykece65fqd.onion:8333 -zqtyvr7h277x5rxin6rhsrsbhwcfsyyiqgghpk6jlbewej2v3tn27yad.onion:8333 -zqv5nepyrwezkym2ba5s2sskmi2qck22snw2rygeke45bxg2o4vckuid.onion:8333 -zqvbnqwwhtoux2sxicng2blfiowk5mvty7c5xnssxwtlsjzalhg3zqqd.onion:8333 -zr222c3ybuqxn6a6piydvfos4zjnaklfgh6kofmujmolpiprfw4z6vqd.onion:8333 -zr6ffisxxo4gelmkoyb7izfm7ehjrbqbnzuguw34to34bqhxeeqzzjad.onion:8333 -zr7sqclimv46jdnmmeazqrhflhiqkhhrz5i3ed7yvyue63swk3qkjnad.onion:8333 -zrrfr5sr5wrgdt6rn44cxnotlvwe7cl67rgssw5dwsax42evokdaw6id.onion:8333 -zrrhgs52ftlylshuwp5e2uesgqnwct7h6cqhzofdduwoi4sz3shmxxad.onion:8333 -zrt3rg4paxmo24ucd56eehl7apindhbubq3ej3q5nhr6i72jv2eznryd.onion:8333 -zrvsjjrb3lgvmeftz2vfjva4pl63htmv5qyviq7zhnfmlk42evrxdpid.onion:8333 -zry2rqlcqf5p5e46wc6nmtcbt5vd45mf4hyf4nxlqogckoniufdjklid.onion:8333 -zs47b66pljpz4ahompanciv73xtztnnzkx4wjklt6hh4drsge4m26iad.onion:8333 -zsalwutefh6m6x6yxccbhulzrz2bmo7dzu2ggu4hxp5zv3xx2j642dyd.onion:8333 -zsbzferezmnyxhpktxtccn2xxuggmdzdnrza7pqjlnwjorgx57y2acyd.onion:8333 -zsgtoyy2svehhfba345dx3dazp7tfdio6o34zxlcgylq6pi67gjq7nqd.onion:8333 -zsi55x2nvjc4oqrpzzopkneukb5fudnm4e6drao4x73lf4zshhcvllqd.onion:8333 -zsipwsjpm4f3p6ueczh7lqei5rp3cusl6t4d6nntnwxq72hori5f7jqd.onion:8333 -zsisadra7jlxp5nhec2vsjwspvvnk6jemjxk7zn7arypl6cm6dy7mwqd.onion:8333 -zsr43xqj6nsrqh6qgxghadctltwytnaw4zmlvx6exqybt2qdt72f5yad.onion:8333 -zsxgefpkofjc3nti4qusk3pdqcfinkljajlwcb2cee2tduxltxbmrpad.onion:8333 -zszufrszpweaoysubpdnqparmyotjnev6nhhcnejhjjftu5sb55kesid.onion:8333 -zt6gkop3n6aggrxucnaqp4yrjeu6htwvuy2nyn3vadjjrodwxfhfv3id.onion:8333 -zt6hvzyoalzm4a576drn7yfvdetdvzwwouvfz435wzrf5pcnxqxplaad.onion:8333 -zt6v7eqh7vvlwy5kjzbdfgkw3syj3nnhckyghlzgmwwfccxvyfusuzqd.onion:8333 -ztcmlrstdkp7coheeolpwj75gp3imzgiw26xnoiucquwhxxcofao63ad.onion:8333 -zthmey4ueoutf7q36nwgujxu7hq76s5ifbtanvze4mxq2s2xq2cmjwad.onion:8333 -ztmwsyo35zkogpftujm2o7oilhucjxe3w6bjagsaiwtb2bu62vgjptid.onion:8333 -ztou4ytvgvpcakjaje2c6l5j53rxcxes7qhkerszi4haffxfpj3kdnyd.onion:8333 -ztwryklhcnfoeck4qntt2aitoilit2cmmr2geyqo6cjc4nwr7jlludid.onion:8333 -zu3ekh3vtqjfnxqjqlmnq3jbqlg2zum4ehgirz5cggwe2thjmgkz4cqd.onion:8333 -zu3yh7mvqw342e7qt5amwtwe2btjubi6t75k7wgcpsyoicsnpgbgj5ad.onion:8333 -zu76ecbahyc6ofjiiutna6myxmfdcsuhcrhtgpifbw3vfo7njd4b5tyd.onion:8333 -zuaotutv2ngbf5ot5kvz75uehbh5e2j726fglhqw7omk3b7xnaastpad.onion:8333 -zubmiztmnfy2vqowqmpyzbqtf2a43jgazsex6zlxokhfmnzmi3rht6yd.onion:8333 -zuc7sobx6ttj7lswk32raexasfbxc5kd6a3l6td35srqzkj3emsv4uid.onion:8333 -zunmnr7czrxvfjgxtvkwk6ziti5kskx4fi3j4dzahhdljfsqtz7yeqyd.onion:8333 -zuoml3m3jdkoh5bdrwfecnew5f4mrlcwhmhkn456qsa72cp274pbgtqd.onion:8333 -zutyd7pzkyejctriyr2lqlrex3arkunntsdjo3kgw2qj5u3fj5uyusyd.onion:8333 -zuzdl7nnjhy6inyqwsc5i7fae2nregm7wnyrtolaxhi6oiufyc7l26qd.onion:8333 -zv2nusexbcrncbutlcprevwhvbtqlyri3stjwmgl23x7fdqkmae6owqd.onion:8333 -zv63heoa7jstwhq3wg2nibip36bw4icd7jphccy3li3nut7gp2gojqqd.onion:8333 -zvbhycudpglrdi3sk7yixe64eknydwzzisc4n6xmxwhb7xyyzevc4nqd.onion:8333 -zvgutw2u7tu4dx7t25leghdp6j5n44u464mmoypafwstayp6ggabtkad.onion:8333 -zvjn5jscn7jncqss44uh53gvi6b4eycjqp42t6pv46bsr7gine5cbrqd.onion:8333 -zvmxfy5z7nxeknglvpbh7rveoppkyvvzvnpwxon2kgkepafnq4igheyd.onion:8333 -zvpcm7eemfvlklgqio3fgzcwa2vukg3n7caov5itik36kdua6mvm43qd.onion:8333 -zvzirfk3h4hk52j4u254y2np6ve2xttd2nugiccsqw2liiw7aqmglkyd.onion:8333 -zw4olgpxujj6iydkmhuxbx37b52syl5bm6embyebesysep2ignp2dgid.onion:8333 -zwbnovgpo4qxidylubpdrhxm34t23iwaniawfshiqrilttwqjnnlohid.onion:8333 -zwbqgh5le73aurfmbwf5ivjb7ycemwnjiq2jnq4sqz6epl7rdtd6rtid.onion:8333 -zweiy44ngrkfzhnaoqov3fopwqd3uhwsen4v6sdyf3ynmhlpuluvzeyd.onion:8333 -zwg2cvvkm37u2hicwbjasqzdqdhcblwvtzsulmz4kpbebf77jheiaaid.onion:8333 -zwrp2kb2covbrr3xdz2pxr6gg6ndnhpcgfvjkjr43eudnl5aswxgvbqd.onion:8333 -zwsapfrsxzsomsoty652jifwii56st6fg7bs2crr6boveh5o6npl7vyd.onion:8333 -zwtjkx5blzs4i6e7hwfeekcwufdl2lba4j65243tvkajder5iodkavad.onion:8333 -zwu3ep3zqki62b7ldjbsxk4dm4rlppkxpzzqfwsfvkoihxltm3y4qaid.onion:8333 -zwwpbfpymszcmkwlfozzl26m66r6n7xzgnw6bs4nf3pypqh36ya2w6yd.onion:8333 -zx37fw5b4eatt3dekaefun3ln67agpt7oqobeacvyq4keurbj26azwid.onion:8333 -zxaujdps5ce6wvk6ykbfquygtbli4ecvpokj7oyfxjqiionn3u3fdsid.onion:8333 -zxbq3k7hwswo2f374ahsmlgkpdj7ju7pyygurkvzqaoh35vmxleewsad.onion:8333 -zxc2bzuqdkippxthxbg7n7e3lznbcnx7zyitlhwvjusbwr5v32oxueid.onion:8333 -zxcnzlo2eigfig66vxyx43znm66a5i4ieuiosycgddgzdff4vhn6zhqd.onion:8333 -zxk4bqrede3tnlb7ymjlsoyupc37r2vqe647otr3nczqmgfeoyiu75id.onion:8333 -zxqdpu4gmvn5vz2kdld6c2swqdzknwh2czwsw55vx323orvtk6a6igyd.onion:8333 -zxqe6efq4odzd2mvyeglqto2cfggagoicgcvlvca4mxycg47jei4uxad.onion:8333 -zxzfz3z4nbb7u3ifcv2p5xenzpbnzuuezelbbjcfrmupxtqyoh7uhyqd.onion:8333 -zxzqhfwi3gdheuxmzagp4aw4aks6cii2llljapcvqhtqrxlksxddo5id.onion:8333 -zy4jeshnpx3i3wjcqrb27qcea4qetpez65wpocat5sqncz24xeo6sxyd.onion:8333 -zyccgvzokepone36ulu74l54ad4dtqv7a2bjzcvopj6rg5xhbc7ihjad.onion:8333 -zydziohabauwybhbqkegn4d5r4257bmfain36fatcxdbj2nw5zoa5vid.onion:8333 -zyetfkanxicfp6tt5tegkxlkoz5rl2i3zsc6hyyqizahywbktezfuwid.onion:8333 -zyjfoui3hrpsw3fo4owxrztclffqhr26wdedizvz5xvlgurgixit2mad.onion:8333 -zyku4bk6pdifla26hympigytlwsx4htajcn43hhobdbrv4tfojv3snqd.onion:8333 -zyl4kfejs3t4vefsvuqrqopboxrmztuun62jick4uh3wpu4mw7dpqlyd.onion:8333 -zyphknlr4ogrknj5t64qya246kdaasgirn4iercvesggqplzzxsisbid.onion:8333 -zyrodumrgvgpinhygbi5molpbhl6ndfs3lwtt55pumd6wy5k7nb3esqd.onion:8333 -zyvgumk5pcanh4zk3z72glefxgbd4dpyhsbzvqlsp2gspaw37lrhjyad.onion:8333 -zyyefl5unnw7lnrjlgfyvnytw4iy4n4cy5bbs2nudjh7wp7psvefmfid.onion:8333 -zznngqwcp6g55wkjg52rzeogk3fcdpopyl3zprh2fz266nykv4sqveyd.onion:8333 -zzntdfpcb3spf5pb3g2gczw2njmhwwksgxt3twbzjhbaisihg7h2ywqd.onion:8333 -zzsi7brufwylb52w3bcbqvp5jx6vribh6geiqfy5jhxpihqjjaox7vad.onion:8333 -zzthz644hdjxn3d54xrfe7snnuyhsx2cguy4kqb6dpc5u7aun5lflbad.onion:8333 -zzuipjogcfvs7uyfhfgesehon6viegga3sc6c6265n235pqmkwyqfmyd.onion:8333 -zzul2xvyhqvajnd6zfs2dzljoppx5lsp2xt4qad7256kpxrv3wzyiuyd.onion:8333 -zzx4r2yrkxul2kg2ojoeijwce3skll4wbkkjw5xprstn2o2xw6n74wid.onion:8333 -zzyp22x6ryzyin43pltkup6jki5ynboh6cwpucscx5a3md2tooqn52yd.onion:8333 -zzzzzzzz5bs2qnoijxlhxd3ibxipajesgprqlrxtpfbygw4zcaf6oaad.onion:8333 - -# manually updated 2023-04 for minimal cjdns bootstrap support -[fc32:17ea:e415:c3bf:9808:149d:b5a2:c9aa]:8333 -[fcc7:be49:ccd1:dc91:3125:f0da:457d:8ce]:8333 -[fcdc:73ae:b1a9:1bf8:d4c2:811:a4c7:c34e]:8333 diff --git a/contrib/seeds/nodes_main_manual.txt b/contrib/seeds/nodes_main_manual.txt deleted file mode 100644 index a3f00ad52e..0000000000 --- a/contrib/seeds/nodes_main_manual.txt +++ /dev/null @@ -1,1029 +0,0 @@ -iy7go4454pb4p2zmnkwrgsi6v6oqv53zxnmalz6rnfjemxftapfa.b32.i2p:0 -j225nrmndwviihpe7ib6mm5h723cg62wrb7vnwofopv472ue3zwa.b32.i2p:0 -j2m526lqsujvt6b6xl4ipzbjkvkuecrye3vkggwo6jadvzqu7f7q.b32.i2p:0 -j2pyenyhoppsjexenznxvgqrcs4buv4nssctowgpg6czdoo3nyiq.b32.i2p:0 -j3usxovx7ukl645u77jud2mpmrk7ryh5yaxno6rceu77hqlxkuta.b32.i2p:0 -j42dsnjlg4vv33tshgs5jyham6plf3suj2sn2k6ew4tmcz3fpaqq.b32.i2p:0 -j4tjrfxnwcmbhkixmqlnotginhfxgfdvjahr6yn7j7rkbdqngh4a.b32.i2p:0 -jb3iui7grnljdjmsz7qbustrl5vn3ip3upnkzbaegaiklric7cha.b32.i2p:0 -jbmqtghha7hscwbwpi7ps2dnghq2bvxjnfeb5glngnvgjmeackaq.b32.i2p:0 -jd43pc2l73ek6hk2tp6hiyada7ed7vshqo2fvxbga2daylcghfyq.b32.i2p:0 -jd63whebd5yuls7r34mi3lnnuuhqxxr4lns672tzliru4vk7hwrq.b32.i2p:0 -je6ju6ihybxm5wkw5daeqjet74lscvi4ls5wn5wf7kiaczfggafq.b32.i2p:0 -jeidstlwdlt63lju7cnj2mh4fofysjnc2wcvilphynprd7jw64ma.b32.i2p:0 -jeox5nruuoopedsfpuoi6kwewmhbbsnhf7kib2q6oafvchxvmnnq.b32.i2p:0 -jex3ykw2nmw7owhgbtio5flv7us624bxwp46nr7rhmteujrmtvvq.b32.i2p:0 -jfdh65i4nhpg4obnoe4aqi3vzvbi6fyzjj2ee7s3qm2gbcnllkvq.b32.i2p:0 -jh2qxkjqngj2m5tn2ecaidfqac4awgnmkgsajntoqs5qqyjtp5yq.b32.i2p:0 -jh7ev4a5zfzmeyekinhtbqfi6c7xhvc4msdpyi67j3sxl6r44ukq.b32.i2p:0 -jibaw7ynbnxueqsy7k7jyvoj6ldzbuckppfx5wozt7mftihy5vcq.b32.i2p:0 -jicc5kwy4tv4j2nn6gfbis7e6dxy2kdvet3zpxdbyp74h5gpnxuq.b32.i2p:0 -jimdydczt6e2lceezopnl4fgz7q2jeqqhlqaxrgen33ouxk57xiq.b32.i2p:0 -jjangl6h4py2pd2gwamhqlsymyuocmpioneinzf5bb5qvvdjzzqa.b32.i2p:0 -jk56z3febpco6rbkpzzv3jszf4px5uztmoxzkpss7mxnzqlpsdla.b32.i2p:0 -jkfuajo4ayvo2rbv5qdj443q6adqmnormbhsf2f7rlp5t24xomda.b32.i2p:0 -jkvey2vfdto2ucudi4jlgsbpmlls3uwmlkjonfhk5yminkwzwi2q.b32.i2p:0 -jl4vr5kac7njyltivn7ut5afyq5ipzc5woxl4523emodxixci3zq.b32.i2p:0 -jmebfluhrl6ad5pt4ipevf3g3a4trcu7axalpubpkir6zlwovm5q.b32.i2p:0 -jndr5i4qhxs6aa2bqvufrgttq6enavyghi54dqfuku2qnstdqa5a.b32.i2p:0 -jopiw2tup5h5xh2hwef4oflgskawbpfmswub2iosmqocejijd4fa.b32.i2p:0 -jrert3o2rhbkpquybwg7tq4bdvlxeh6lnlcr5ddexkuguvi2l2pq.b32.i2p:0 -jrobuecgmuuqmpdsbxwbqeldt2735cgcemngoasnbbkdz2ufdlmq.b32.i2p:0 -jrvg22xvbmjyrkqg7mr622zhnda3ijtua65cqngwrven7sf5zd7q.b32.i2p:0 -jsg4dsxvgjcqz3c2qgtwi4ip3l4n4hlxodbvgukwaipycwo26zua.b32.i2p:0 -jt35uwbl5wx7ponyxomksrjjs7zy5yymvtud3nmogt7ci7xxlm2q.b32.i2p:0 -jvaoh33cpczp626ldwr4azh4hb5cjmxlbz3dq3cxisdlzn7z25eq.b32.i2p:0 -jvlj7qyxcmolf76wneyvmdxrpiezsxkiimapwxbdbiw2phvlyjba.b32.i2p:0 -jwqlvqmfvodnrslde2idqt25qxiyvgqdlr2q4uod5s6lkmlempya.b32.i2p:0 -jxjc7oe24vxdepkfvl365qfwrxcad2f3j43fnfuchtvqqkqd2rzq.b32.i2p:0 -k4mch53m72zv7jdda3poa2zn7bi3jacqwfb45peealxbhysdozcq.b32.i2p:0 -k4pjt6m25dcxno3udek6rasooz5ztqnywa3f2owpvcjzvisg7nga.b32.i2p:0 -k5ars7hsrfubadroe5h7oypjnqwi6v2vxxy6rmns7zubf66aivbq.b32.i2p:0 -k6eeshsk4vf34b5gfnraz4p5qb6scv4kw6eiltebel5exw6keppq.b32.i2p:0 -k6gt64xby5igmln5hfcuzspt2tndimzrdvj65yo76h22g5yhlvja.b32.i2p:0 -k7kcnrqe3ybqu2w3fali7zext6na7o5o65rx6f5oqza2lonsry6a.b32.i2p:0 -kbawcieyelwwitrjow537zpmdkncwiq42rhjgayw5o7u562mk23a.b32.i2p:0 -kcqkothplemakipfpeajxmu4xsszpaxpprgtuv5tgfdaqejg2sqq.b32.i2p:0 -kdrcbr6wg2bj6oipsbeqy6bp3v7dqpth6cheviysmvo4bdta7fda.b32.i2p:0 -kehosmgk76fxnjywqjj6nqs4ohg4hsutljdzjo4sswhxlj5l5tca.b32.i2p:0 -khxruoaom7juockko2tbxqo3bnrjmoqjhdoady3yyr4qacz4somq.b32.i2p:0 -kjaa3zlp4sipfxikketgvlx4oxq5ok57ifxenbiewmsrew6lcw7q.b32.i2p:0 -kjvrzgckasb57yqhluvjblx2ngxstumfg6uufz5mc7zyetkjlr7a.b32.i2p:0 -kkihsh2faw2gxil6it4glol4u37ccruuzsusyikquzmkffj3wn6q.b32.i2p:0 -km3b5j6cqrcqewdpuveibptw5gguwktwan36jlow4xykpg2dgr6a.b32.i2p:0 -kppcor54kkge6cgq47nzevlfrhbxingcjfmk2emkrdaejpixkqdq.b32.i2p:0 -kskidltmbigp2etp4pdl67ke2qzjjw66wqairzr4wn2apq4o7bka.b32.i2p:0 -ksxxinje357zctkobwnxsy44ddivq7yp2n3n5gopk4okir2vghaa.b32.i2p:0 -ktua3j43ijxhhhfeljsp32kdiuic5nlnfnkx3ealy7ojva4vwkoq.b32.i2p:0 -kuzu73gzvlnog4cdtdk7edbusxr4pigknvwg2bjo6l46ugsgmrtq.b32.i2p:0 -kw3v6gq5semgt4gg6itum3qtaylanyof7wn6bnbngdeby4xixuoa.b32.i2p:0 -l364nudwoj63fe5nsjmniiun63e3ycdqrjyknbfixxtre5spx7ga.b32.i2p:0 -l3ach5wbdx3n5nq53sv6tagijrbse3nwa2gkqz5oj7aifyaizpcq.b32.i2p:0 -l5fita4r7niir3hxmu7mzcwrigxinkrn4oqeembdkgao7k2yztha.b32.i2p:0 -l5obkk7zzop3nztnt6ijugz4okqsyhhb5o6gkbqottgqzzzcgvla.b32.i2p:0 -lai3534z6zs2tukzixdagrciezum2bkyuask2srxjrn67yu4c57a.b32.i2p:0 -lbif3mgg2b2ir5dkz7u6iatdrui2h2a64vlmffcfgqnpjuvwzaxa.b32.i2p:0 -leu37bptuuu5377mi7cb5t2vsu4hesblyxl5zptnnk4vodhovwea.b32.i2p:0 -lfuvzzzceuik5u5pnd2i67amegel5ua2rrnncxkyyc7bhteq73aa.b32.i2p:0 -lgpojpoix7zd6dhpo5hdrnwm4ueyjvi7tbot4qsqybk3upuocnpa.b32.i2p:0 -lh7qjombcmiekvv6niz5eflr55cnd3oxx7nuus6vmehqfodr67za.b32.i2p:0 -lhupu3owhuc7qwvyfazgkbcmr7sjp5qqxps732vy52v67fsn5guq.b32.i2p:0 -li4vuovafxjrf54kvfg3mjrg2mebs6edpl5yrr2dohddvgmxjyvq.b32.i2p:0 -liu75cvktv4icbctg72w7nxbk4eibt7wamizfdii4omz7gcke5vq.b32.i2p:0 -lmlf3yjyg4djrb7wtzmrb4fbkorqba7k4lvk7ax4omay4mbytupa.b32.i2p:0 -lpal67whroip3c2yj4fxbayj46d3tr5osyqog6el5n6ctktdnakq.b32.i2p:0 -lpektonr2uyiohuzi35shtj3oaa77rklmqsivuydxkcxkea2dwuq.b32.i2p:0 -lpffyejskwwap2go7ommmryex2autlkmcnnpk2tm6aitxcalwrha.b32.i2p:0 -lpqkgbek3ci3w4qobpeqepjor3bukz555rzlmghck4o7wwb7ajza.b32.i2p:0 -lprgmkc45te7skx7rffpz72ca5c3zdg3tabiksdboao5w4wceu5a.b32.i2p:0 -lqn32kgic4cincyqlybpwbywcrowcxmscfcm4mqt4fgp24qs3y3q.b32.i2p:0 -lrah7acdsgopybg43shadwwiv6igezaw64i6jb5muqdg7dmhj3la.b32.i2p:0 -ls52j74gwtsrqhlgqcai2cjl2rcivfib7jzovc4454h6tq3i6k7q.b32.i2p:0 -ls5otp5mybmxqsaeaid7wlori2ukieehr644adjfwdxux7jxlvga.b32.i2p:0 -lttdnbluvybzbjq52t5vbdkk3pvzc6zyi2oji7yjdpcgtgz732bq.b32.i2p:0 -lunkwblewltvq4spt7j5u2nfpqyndvgepl7edkiru322mmtpy2lq.b32.i2p:0 -lvdbqavgdom5h5denwkmdwslfzxckf6eddwflelbog7tgo2m7usa.b32.i2p:0 -lwjrapkfexjyjqf2rrdr4ghhxmlr3jdygsonetgtheglvmru5x6q.b32.i2p:0 -lyg26sjkcx5ied5a4a7jdxmfeplfcnux3fux5rsxzkm5mgbbsllq.b32.i2p:0 -lyqmygrc6gujxa4xlnwqku3vtfkbrszdiirsagn6xd2yw4kvodrq.b32.i2p:0 -lzuu6mjtu7vd55d2biphicihufipoa7vyym6xfnkmmlra3tiziia.b32.i2p:0 -m2k7ajij2wvgfpsbg32zuorbsjt72iye3ozz6dbyxtj57fx7xsqq.b32.i2p:0 -m3hlmj2gz2co5gu4ss3wj4b7ebeg2xbkrr65ogxvhn76uxna5qma.b32.i2p:0 -m4o2kndr75clxemwbq5m6vnok7eiqshf42wjjvag7dtwxtafxhra.b32.i2p:0 -m6bpynxkv2ktwxkg6p2gyudjfhdupb6kuzabeqdnckkdkf4kxjla.b32.i2p:0 -me6x2p4m6jw3cxi2xl4a37u4orzmv3xdopr5t2vgwjmauiuqrmzq.b32.i2p:0 -mf6tmlegp7uga66cdael5376uaz4qd3wacuh44yvepa3kbu4fk3a.b32.i2p:0 -mhgxec57s6h7eixgemsghlcuhmgh7m7p7phqd5kzmm4wovrp2pqq.b32.i2p:0 -mjpulaafdyuanouslfpjcsvumi4edtckfu3ffn3ipabkxj4sn35q.b32.i2p:0 -mlakhs4ixcqwvk4vo4ce3loa54wmdlfingk73jookrkbra6ppq4q.b32.i2p:0 -mnkqn3r4jmg6vrmlprabenndyft2z2jw6g4nsnolt434coiklmyq.b32.i2p:0 -mnrbc3qi4zuk2tzghmy55kplawncih6jkmt75qczfu27enu3gcea.b32.i2p:0 -mnrrefebq3yxr2avprp3ay7w42sx27ijv6stjljzpwohnfnkg26a.b32.i2p:0 -mo27t6wym666b3wfauhndqocbetdsssxksep6x4dcpuh5dxe76oa.b32.i2p:0 -mo6mp2tymma5l2swob6kqzzb25ccmgccfj5pic6omjkktv4wve2q.b32.i2p:0 -mpi7bivbr2pywsgasslw5we766m757os2667h3hqnhcftaszdv3a.b32.i2p:0 -mpqb3jdmdibarrflyiik5wj3ekitxpe2oqieztlax3uomxspgsvq.b32.i2p:0 -mqocuhx3qwcwfuuin42yuhtqgm76drlmfvzikf7urot75qw3ykpa.b32.i2p:0 -mrbhw6ow77bjqmb67rurbkcl4xs2ocj4pti6hnz4wcsg6bduwtya.b32.i2p:0 -mrypjr2fagjhg6z4ixr73f5npkeyoxsjamcdv5uc6oj5oi2ylsvq.b32.i2p:0 -msjl4a7mdp7x2bcllmbxurhfmtxvolykonz45psmh7j6pptfyy5a.b32.i2p:0 -mtlznxqya5nbuyorybzul4cpdlrnvlrhalx2eogwjce5j32js5wa.b32.i2p:0 -mv7b44duaxqpzbdztnrdvnj6ypsp7yhs4z3dc2q64jov6pritmja.b32.i2p:0 -mvs5a3s6rgfbvvgq44wzyd57vf5pr3jcthc5qdo75xgj4slsm7tq.b32.i2p:0 -mwcqoe2lu7u6ogwo77kr5sr4wx6pxnotkdeck3yyjfh4uklytj2a.b32.i2p:0 -mwevh5r5dkzddlo2ol6bojpdds3kno4xqoy6p6ulid3paamgrtla.b32.i2p:0 -mwyjzdrgtypbwjyulw4ifetejz6xusqstvzylztsphpg2r2zf7ua.b32.i2p:0 -my66tuvzfyy6kkbdeqvgfpk3xuoxerucxt73tw6wxv3ian2p2snq.b32.i2p:0 -n3f4ngbs2igvp3j27vsi7thguqxoyvbfenaqhgypuqdz5iovek2a.b32.i2p:0 -n3fa2yuf3i3opdktiwyxzhbpudcut73valxdrlre2xs2ooepddaa.b32.i2p:0 -n47e4gkf5xujcamnsarfuy7435hfsgs4zhndcxaw2evafn6r2rma.b32.i2p:0 -n4n7bivjb2mffgll2ulpwyb4m2oomv5roxtdj6bmlb4cgpf3wdja.b32.i2p:0 -n4zwusew5coibur4p2g436ktc3cyogz3sklztu6ruulag3je6ita.b32.i2p:0 -n7ykk3cxcqzcoeipo7ghzb62ko4d6bxzfgenzxistvg6fuclebva.b32.i2p:0 -nazasriqoa6qoxdlgzjwsggubxl6i4nge5q7om7nijaqi24ulgua.b32.i2p:0 -ncdjjthck6v6phz4laddyc7a7czoujys55melfcoptvl2h4izqlq.b32.i2p:0 -ndtoi53fz7e6ml6v6jn33675nwciw7mu5msn7afzbhebprusqg7a.b32.i2p:0 -ndunnsjyp6l4w3jebow4zgsfrdsy2lrapjgslb3tv7dg6oypfbwq.b32.i2p:0 -ndx23xqvt4qezezih4wlj7mqtwc4nzbvmgseq6fc6e2ddywrmkwq.b32.i2p:0 -nejmippeopyo75wd3gjrhca3fr5mo2g37owzwdezxmg7uhx6ygxa.b32.i2p:0 -nfsi3fenzrzoccj7bpzuvjbxnij7dmzuprg7ia4geuortoquja7q.b32.i2p:0 -ngn5elnvbm234yyun5kbjyr76oy5nhrvyckn33cqcbx25hw4lfoq.b32.i2p:0 -nhpbv2ravt6t5fhxyvuhrxyma37wph6dzuzpddlw3uoivzl6tx4a.b32.i2p:0 -ni4ns3ou7v6zh5qrawvkwnmshnrzcyc5zojkw647rrniplmurrba.b32.i2p:0 -nigrfbou3zt6wxegn5im4cyminjcjmbsqror7ntcr5i7yv6chwvq.b32.i2p:0 -nij7pzb6mhrra5glb3dyghjt55sngwrikzdlagmpsf7jn2onvoaa.b32.i2p:0 -nisd4was4gm3pkvuwjh3sbaoo35jtxop6y2d7ug4iol4cffkrk5q.b32.i2p:0 -niyz7v5fdhqqtlr4y3tcgdoeu3myntub4trzvgixlgjbmowccgja.b32.i2p:0 -nloq52novup3cawccvaakmbudooatwkw7dqltnr6q3j4qy7r6oia.b32.i2p:0 -nn7p4y7pun3m3txaqbkeptkxykzwrf75ru2zimadnewj7g3r4una.b32.i2p:0 -noj7le7kkj54umo6mdftagvvk327cuir7q75bnvuphrxa7kjujna.b32.i2p:0 -npcmehkhh4z2wtk3f5426izrytvqvyf6aa7hyx6hf6jdbxveqima.b32.i2p:0 -nrrg4p7tztllzthlkqzomqi3dejfcak7t63n7zzuomt5atzz5m4a.b32.i2p:0 -nt3ysas4wpjgkft5pohrfstm2vgj7t2vx34u32voy7rqon7dlbga.b32.i2p:0 -nu2ao72zway2ponkhrf322wyfrrn4mdmyp7n5q5xzmjhcge5odma.b32.i2p:0 -nufliiw3uav3tzdalit224yhbfpcjtgfrm5ic7ob6l3mmsay6cpa.b32.i2p:0 -numilh7hhhf6inzkzway3hzif4kiroqstxqbz7hzvoy2ctgpaqda.b32.i2p:0 -nuwphtuudfrswids22qjq63zgxh5wu7erafl36jyniuxhz75ikyq.b32.i2p:0 -nvmuuajhaw74g565l3a7dpezs4rkzm22ub5jhh6mdvzu43j4a6dq.b32.i2p:0 -nz4lq7pmswngaevv2uqyainqzutfxlkavxgde2w2slo2p6e2kcfq.b32.i2p:0 -o5ijpzor3en5xnndm3ntti7o4fxvv24t3veh4g7mahk7ogesb67a.b32.i2p:0 -o6b747qkpgu6gvsem7leylvmxsaaqby67pu55fmqn52dgazuvbxa.b32.i2p:0 -o6t4fr5ayfadzieutstgwcllvwxeuzjlxmzsmpj3hpkvefhzfaea.b32.i2p:0 -o6vbupdnpd5bwvcx7ivaecgyo7x5vdu5em4va6cmx5iwcf5tyaca.b32.i2p:0 -oaeqbkgpek4qnm3nly76x2tfrad2tun2xefliez7a3uxddeq4i4a.b32.i2p:0 -obf5kfk5n4nnsw7ez6ls6chqu4lz4wlck7utwvmjnlin4nzfnspq.b32.i2p:0 -oeydvkjoeqy3473wxkkbmoc6zz5m6zcmf6ov2hfkci54efsityua.b32.i2p:0 -of2gy2vblht57tn6yfczslnmp2xybdiazzta43y24w76tl6tu2xa.b32.i2p:0 -oggn6qbpmbag224gumagzgno53mgozb65tpzt5lezjbfbbiqky4q.b32.i2p:0 -ognn4mwwtmtjbrnq2kur7spcfohivxlrvz3sfamt3t46pk2e2ibq.b32.i2p:0 -ogqdcq2igslh3n5jn3utz2vpevttul366bt2246vilfnowuyvova.b32.i2p:0 -okjamsyd4wutvhfhsffejwk6ioru4mmvwagfssoy5hcocg2gj76a.b32.i2p:0 -om32whhwvcsbrf4g6uh5hupsl67oapccourkxyr7uf5zwaqxtxbq.b32.i2p:0 -ommky7qetuh45h4lk3raili27fnbhsgxv3zucinoaymnymo5735q.b32.i2p:0 -omngcjfwtiyqwbfqqggzbkttqgm3blywu43kpto2py2e4gp7fhra.b32.i2p:0 -opnpvz7mzfw6nypgmnn5zgtlzx7xuc4w7vat5bsr4mdtp77kz7eq.b32.i2p:0 -oqrl573nw6my2o5mup6uq6pm5immw3gnviahig5cceges4wfnyhq.b32.i2p:0 -orvshryqq24l24e4dvockx2ekj4hu42otqxsvyvy7tm7hhdjsz7a.b32.i2p:0 -oukeldqgovavh3npgb2by7w6hug575uae24z6uqfdl6flh7ma6rq.b32.i2p:0 -ovnk3wfbrkvvute6vkn5glhdtlxr6nyvebiflvr5l6ws6sorpa2q.b32.i2p:0 -owexluejb3eszx4p3b6zuxyggsxxtkxfgxoylkagfecs3bgfnpja.b32.i2p:0 -oz2ia3flpm3du2tyusulrn7h7e2eo3juzkrmn34bvnrlcrugv7ia.b32.i2p:0 -oznpphdisfvlcjgkvny6ma62wy637nh4vtpxww47ifpmlqkjv3ba.b32.i2p:0 -p3au2w5jnkqugxnkukj4rusvynvz3oxawdf4ajzeyxvfvyzhmetq.b32.i2p:0 -p4tsqwvdpaitvlgaujfr2m2qbr36qiwusas5zkiut7w2wjcp3sqa.b32.i2p:0 -p6o3tzllswm2j4wah35niry4tcdu6lq5b67ehevcx45sae7pb6da.b32.i2p:0 -p7ifeij3vhds3diihx5qimucyzgck5omfkqxc4pkbbjtfu4hp6wq.b32.i2p:0 -pbag76x5yyo5d3wypvtohxmgbtdrjjb35ljnq4w5fpoguyt5mj6q.b32.i2p:0 -pbftrtdthbj5qcecraden3hdvwomqrgseec6ib5h24n2zcivdqaa.b32.i2p:0 -pc4d5v74tr4vz54pbr57ejga765ep6vwk5kox55gfobi5572apta.b32.i2p:0 -pcc6cnry4maul7zlbd32khalaavkcbw5hdjuk4zjwposaorjicca.b32.i2p:0 -pcdlqw2awppohbiued4rffgs6n3lv3thhon3r67jmx2652qx2khq.b32.i2p:0 -peteksofgwgndsdh6ovh2ydkrgpyqgttit4ususs4bzksvdqkbea.b32.i2p:0 -phendyytrqdr2vfsw3kil6yui5vb2p4v5xuddezg57wsdw5uyquq.b32.i2p:0 -plhoz53xhplmyuejnsg5bkfe24ow3pbldysoovuupu6qwb3nttca.b32.i2p:0 -pm4nukrzndd2lvd3shivpjrcbjlontmxhag2xzdf572snwbr3p6a.b32.i2p:0 -pn5cx32ljrvzj6x7hpgyff3rlftextqpp4zn3nkfufrrpnpuimzq.b32.i2p:0 -pnhspu3rloczdbzsysa2iftsgoiy3zgcd22jodmk7zdjanhiemla.b32.i2p:0 -ppe2jfsb2xrmgwugbq7agy44ucb6yq4qbufaf2sh76b4kwpa4jcq.b32.i2p:0 -ppez53yrs6lanyvyxuxblqxiuvhnqvvtafmwaid2kgp2dx2v5iaq.b32.i2p:0 -pqnqwxl7jsrok7vgpgcvlxwlkg6yckx33n3g4xf5lvuntwn63b6a.b32.i2p:0 -pri376r6uuwgnbnevki7c363h4ryfwjza7pcbfswqqxk6hnrkhja.b32.i2p:0 -pscw5yzaj5js2fn7gzrzoj6teonlsohlbnvdco65ubdefpnpwhpa.b32.i2p:0 -pt3mqmvkv7aleja7vattlysu6x7gjnbwqvwtu4skzabvkjztfi2q.b32.i2p:0 -pu6e2b5bz75qnmp2rox252aksllnitv2grnn7qfyzjkfio7w5h6a.b32.i2p:0 -punslpht6pysnlteht24rgvrkmzdd437lnpflojwakl5dy6mbema.b32.i2p:0 -pv6g7uin653rerdiivdgtoirjvokjowi4b3fwatszdlteyos3i2a.b32.i2p:0 -pvqyvn2lpvoeyhgcgunoqtetkrkp76iegyoii2af4crnlto6gb2q.b32.i2p:0 -pw42656k2vbwxmvrc2qbsz3jslvcxahln7rehsbia5jdio2knh3q.b32.i2p:0 -pxbyhv62tcdqqpl6pbp3og7ajzzcnbximv5kyt3hid3djd3uwkdq.b32.i2p:0 -pyf2csixjugwp6ad3bkry2ulkzj7inc747dsmpk7iebuidk4l3ra.b32.i2p:0 -pyole4gslrmenfcmd4ilqyzvsuyrjyffjbw7angentqjkkljitqq.b32.i2p:0 -q3ueujd332k5qjxdqkjtjlgkm3ktvdy7ats4c2ogcvokog4wm3vq.b32.i2p:0 -q4o7bf37e6afx7evwdyovsqptjwo6td3c6qtjh4rtdngp3trwi3a.b32.i2p:0 -q55g5g6s47hi7pcuomug3vrcd67vji7us2gqmfe7qn2nkq5vz52a.b32.i2p:0 -q6lzsezu4idxpdwro4x6svwz7j6h6gso6enidcxv7jhc2gbepuzq.b32.i2p:0 -q6o3eqnyg44uzjzqeudsankgdouylshkhdhl7b4bqxkbmdnm4iaq.b32.i2p:0 -q76g4lkosb2sxenh47eutqgwwzjyph52rirc635wkwnxsejrzdda.b32.i2p:0 -q7ntdwy6xueyvghbjamfrh62aqtuu3ikwg622em44pa3czomrdjq.b32.i2p:0 -qa77lz7dl64qwtj4fxxlz6otkuvv42dciggnmx62eobs2xqi3vlq.b32.i2p:0 -qaqvxmyvq2m4wombmtaz3our3qmp7eet3qle5flnrs3a5wgfhxba.b32.i2p:0 -qawed5ou5vb42ugi42goxr2s6cqzpyh3s5atkhvfvyhyc6anxyaa.b32.i2p:0 -qddg7myylinn4tw6kdjmmp6fsyetkosnrbp2gsjx77tmkqyqv6ua.b32.i2p:0 -qelsaseevnmz2unpovh4nbpjpshjg45iudiaf5zbngealwwuxe2a.b32.i2p:0 -qfbughfr5hhgoomasyviwk3zin24uerpl6urz5smzxc2div5ixxa.b32.i2p:0 -qfl3i45ipgugo7ueswy3ynnbaet77xawiplvmm3kp4fj72qvzc6a.b32.i2p:0 -qhuk5zq5v7h5p7o62gsxgtqqo7va4i77o5vei6wttxqcgaw47h7a.b32.i2p:0 -qivuqkrr3pv3rul4wgx4o4zon5wegidt5auylv3bhebfuj6oqauq.b32.i2p:0 -qjdftbhcaghdslzxjqx3nmem4z5p5jt7e7ou5bdz5llnqlxshe5a.b32.i2p:0 -qk3iq3wr6emttdilvdqbv6vnqjshuzz6mylwyfo3z6vpjywvnfca.b32.i2p:0 -qkohzoxigef43ro7mf2bd76eyneuuj2vfyremufvufssksbvj3jq.b32.i2p:0 -qksthizqtfdjjxcrahqxkl3bev75k24blagrkoszxen45zelijpa.b32.i2p:0 -qlhklv3q3rrszbrkxw755lpdburxwcj5dkxwicas46flztlkdcja.b32.i2p:0 -qmtg5ukzxemsktsxw2brwmohehyehwlleky3kuzeqzy4ledcou3a.b32.i2p:0 -qndgqhj3cpbxrktu6r7ysaooccqzvselvn2tphu3plx2z5ouocgq.b32.i2p:0 -qnqojlthym7z4gwizcblhpd2thy7v4a6ifme57bzyl3nxzkj6ica.b32.i2p:0 -qorzdjceszf432obxa73tnwhqb7ltxrxlfkkqmw2flmfjhoyv36a.b32.i2p:0 -qp5ppgozzbkuingg22zgamf4ozpe2n5hjlu4i25r6pjqw2ngrhoq.b32.i2p:0 -qpddavnflr5tdmeypeu5lrjjwsgtdhz7hw5emxiyjkcp7m7xysca.b32.i2p:0 -qpo3u565rmgeioruszadbc4vmpgjyoh7qorv4lyefl7geewyyz7a.b32.i2p:0 -qqiakw24obfwz375gfb6muzaz7tr6ani3od6leoox7jwzrizyxkq.b32.i2p:0 -qqmxvujwi4ktgj2cuqmw4kiujkf7ukrkoe5ryy4bjb7tyleplsja.b32.i2p:0 -qrpz67rcwrbpcockid5ml24dtdhhhekty3xd66ekkyatpfjd2wka.b32.i2p:0 -quzkrgzb5pmn4465647ke5lsfbseqnorr6ljvfsxcagj7rzl7hcq.b32.i2p:0 -qv5e4jlcmmkdlmh5spkvv2wgj343vm4yoty2hofuzi4lornn3hzq.b32.i2p:0 -qwhvlprhk3ntswr5xntnc2hhgmvd3bbgzgkbombiibhrsj7k6gyq.b32.i2p:0 -qykavpjbecssape77mrxjxwxces2gbjd6gzewd6zys32uhmnnw3a.b32.i2p:0 -qyqwn5xs24h65rldrle5msyarmqof3lb33uz7sutauwdg5qiuhoq.b32.i2p:0 -r2p5kqr7xjo4ncz7l6ekdx2ge6su2j22j2tdsoxu4jw3u67z7poa.b32.i2p:0 -r4ukdj7c2k557k7qd6siauhhqucshwy2rrkm66twzyh4jiucimaq.b32.i2p:0 -r5d5jgscvs6ix5v646ohwa64vutu7umfeknrc2hrezdjtlr4lm6a.b32.i2p:0 -r6d4moarp22wnnsnmsxqt3s32gzyscaccackcazvimrep7sa26ma.b32.i2p:0 -r6hd3knqi2p6kaw7hybrcf2q5lcarulcczs3sgcuz4yc2saj3gya.b32.i2p:0 -r7bug6wbhevqqlbavouj3ggpa7e57sbd3oivkzqeyagrtxshmjpa.b32.i2p:0 -ra7ztq7oq7jcozpui7c4zv76gh7rjwhq5fkpxp7dvw7ritick66q.b32.i2p:0 -rb7tyjd6gi7evmt5mzvtboramqip43sh72zjxnwhj5k72zfi3g6a.b32.i2p:0 -rb7x26lmepfbcd7wtxu42pf4tdxbe5p5zsf3cwuukd4fs4zhxtba.b32.i2p:0 -rd2cw3iukuth2lwe44q7fipawrne2io6y3fyyv5xew6vd3hos2qa.b32.i2p:0 -refo4v727jmff6ylrpbkvd5emlfr2hamaeh7zho6oval5dmnwlta.b32.i2p:0 -refrtydbdslzcgcsmmph3435qigyajh4q2nvl756f5yojouln4yq.b32.i2p:0 -rfgsjhyvqbunef5b5r2emjuoxx2i7rcsl7gathy2n4gwjyyat6bq.b32.i2p:0 -rg677vpfzyhsckzzcvoyvqdbwtdkqig7lxv4unmxcz63vtr6tgza.b32.i2p:0 -rgbq36syjadm2ex2gftc6xztivckrqzcjszla3jacwfo5hqutzqa.b32.i2p:0 -rizuiypjfhukt3bqnetppoauovuaqq5e6jzgd7tgy24zrwa2ydxq.b32.i2p:0 -rkhb3463btvfozwta37itlkt37iyncpkzak2xhoe4kg7tqafqria.b32.i2p:0 -rl4b3r5h5xodo7kiw4nykd4rhoc4j37kxizzyb6ukgcomyc2qrya.b32.i2p:0 -rnsjgirap5lfhxpb2xczuawgoztb4ptgdwt5rcb2bz72vhtai2jq.b32.i2p:0 -rrm2pems425buhonptp7lbtbprmwwjhbftey4ujvk25nclx7rerq.b32.i2p:0 -rvjzxak3jvwwti7klfb64wrsmlfcs6ceiqhzbbmjynokn5tz3egq.b32.i2p:0 -rwgf2wj2x66xtnjx3dggxhkuy6gvihvur42tbkoej6bd7iukoqiq.b32.i2p:0 -rxatc4b7obgosvznpqrmyrl6ty2yixhi7rpbh45sopqwzglyimga.b32.i2p:0 -ry3iuaabf5ek73otfvchwrqryez3nsgq57bpmzkyzumqhfbhgtaq.b32.i2p:0 -rypsyqod2yq3zagcvvc2643vydtv4zm2ew5r3w5kjzyq2snvzv2a.b32.i2p:0 -s35hlnmumkgdsvj2gepnwro4wo2h7ts7ddjhhihqggywn7qcym2a.b32.i2p:0 -s3rbe5n7lyy6smerpkgr4ictzbvkciu7gxyj6zqw3xyw62rmivha.b32.i2p:0 -s43w4tsmzmddvu2cxugh2lx4o5mup3rkvjhm455u2qqpg4bqlhyq.b32.i2p:0 -s4qlly4iwzevejk4ex5zfqhb4t666o73mvdmy4gpu47tpb775nja.b32.i2p:0 -s5ls42vzfaqzgrjr6cvgkmgifei2rtvj7uzaljkpsmt62jwtmvxq.b32.i2p:0 -s6umfzwe27x7az2yjsgqftjzawoj5lrcrgxldkfwfq2qwobml2ma.b32.i2p:0 -s6vsdby2liaahn2fh7qvrehqfus7gaz3p3u3rpjtfjhm4ahvz46q.b32.i2p:0 -sa3k2xipbuwm62bb5n2mwaqyyjcvxzb53kmzinoojgnjpnqurzeq.b32.i2p:0 -sadnlzguaa4k6kvpiky27izp36er3i5h74l452povbnajqullpca.b32.i2p:0 -saj5uchj7dzmxjv3kdzalgtbqzw6wu4wzxxdiobc23m452ehk3zq.b32.i2p:0 -sbalp2doxyedtr52kj57va2rmbi5npspv4drk4vxnujag72gtpiq.b32.i2p:0 -sdxfzbgwxpf6hbik7k4bqm63wm4xld7qgo3hjlhknnehzxyyeu5a.b32.i2p:0 -sh5hww42vwlsl57cdropaeqmmwozinnr2tg6wq4prg5wrkusvxja.b32.i2p:0 -shpd3cifcjoebw6pskj4pfmrm7lwecrygjnje55heorhsxm2lnrq.b32.i2p:0 -si5x3fon3ew644friidc5o3syrf5v6kk4pxxjvhibev3odxk7nyq.b32.i2p:0 -sikkmrxv6wat265rpay2tk7jywyvlzkekpolmwyp2el5g7iihsvq.b32.i2p:0 -sjpqyf3rq7ojcalldlybvyyh5lqiq5j3ade5w6txe3473ybhk3sa.b32.i2p:0 -sk7aivked563g6g2ri2saggni7jqzxmucuqa6xkudcgjvpbjsyda.b32.i2p:0 -slbbsiq2pmouqht3hznafnowq7sxzlidmwghfch7iiq64rzdhwra.b32.i2p:0 -sle3cbbdom6rknc3drqtawctpy635ica5d5gerjjdahfymkok4ma.b32.i2p:0 -slnmute5o6h23ldim34wro4zh4qa2pchnskmdpek2nzc7u5oz7jq.b32.i2p:0 -snfinsblh4j4wsv2n5kmkfxbvqzcei2ryfyu4heqy6u73mosep6q.b32.i2p:0 -snsw3ewf7wjtwspiuj33h3vtxnybllurzcwm7u62iutf5phoitkq.b32.i2p:0 -sooo7ajo74ajo6m2yomcc6jcofdgkdoyjcbrpl3nyvvusr6fw7ta.b32.i2p:0 -sorobw22rerrhpx5t67joyqai3ou6xsvqxb7wdomtnwnqztm4sga.b32.i2p:0 -sotpvcqqzzmty6llimwlvknqsdcypn4wsnwk677kepzmy76w2gqa.b32.i2p:0 -spbb34lslk2tldwzr4ydi2culk7sxgl3imb2gg746xbxqqcj7vzq.b32.i2p:0 -spuaa2y6qsaywypklz7itcb5klesogef2x66m4flws2r574qjc5a.b32.i2p:0 -sqjjqyrhh45jpgfp66idiirgh5ck7f4s76ee2l5bli4obsotu7zq.b32.i2p:0 -sqjorsqambyienumg5qpw3foftkp44vpsd4lwklgbl4lag4mm6gq.b32.i2p:0 -sqr66feh2g3f6bknt2tnltmnhqdkzoq3jhdaatfusshrv6v2zhma.b32.i2p:0 -stltasmf4b54srrjb3mf7hjtjvmvvms26btxakccdtllgrm2qzgq.b32.i2p:0 -su7d4biurihkyr3qeea7makkxzikxr5zi4znvryh3bjespppfhxq.b32.i2p:0 -swmtaospvaup7me3dvzlw5xoeohhj4zn5q6agivif7kxtseweriq.b32.i2p:0 -syhxehvl6rublw6k5ysmzcsqrzdsnd7eqrbwalfkvhgfccpu2osq.b32.i2p:0 -sykjw3jnb7n6bo574wnpiaxhp2nm4gc6hc4jh4v6trsbpboysooa.b32.i2p:0 -syqxyl67b4hdo5u3jtkkzsabccvtjaerpushov7nrc2f42x67fja.b32.i2p:0 -t2e45js4dn4cfsyyevm26z5ltvmu6lftxziji4fm3v4v2t3ykaoa.b32.i2p:0 -t32qcc2tbjgqxrydr2txgm4ahhhae3zkkojmguehw5gsbtrdvxsa.b32.i2p:0 -t43qqzux7ik7kki2rxtillcgbxrznuhjac7wtqh52sqovk5ay3xq.b32.i2p:0 -t4notlid4bejwz2tzucpvednkeuskenpnu5sqcbdhh3lqouigqxa.b32.i2p:0 -t5cd7q36no6doxduuvk5psdx47zl7ousnckjgw7c6zr3o3ke7ffa.b32.i2p:0 -t7gbmefspnynaezmvx445fjapp24pjjf7wx3evpwlmolzyu3wi5q.b32.i2p:0 -tanmhvkoyd35kf6a2nhj5rmbwpt3shc6thypsle45my565womjya.b32.i2p:0 -tbqehmm3nuuf2spwsjobrc4hg6uxji4mdelivhywz4b7f5lv6rka.b32.i2p:0 -tbrjczwl76v7ob6hon36z6f35otpv5g467q33pgzyyakp525wwfq.b32.i2p:0 -tcx3ftsdl36ukysuuewydapdzuu4alewyg22squei2wda4a74tba.b32.i2p:0 -tetoqjagsf7fpejajiwm4rosqscy5huqbz5hcqgfuha5tdfnlrnq.b32.i2p:0 -tf4tozh5unsgyzpdsmrdcpbgekw2agu7tp5jvyclzcs5kjudwwpa.b32.i2p:0 -tfuvti7yonn5pjptzzvpshh23x4rqjvm2usolrbnlu42laj4mhyq.b32.i2p:0 -tg6goh3flzmcer5voft2nf3tudm7ikyez334zry66vqxmc4ieixa.b32.i2p:0 -tgt7rdhywtlwob47flp6ccq7prrbh4ipnwm3xszuykq7be2pksyq.b32.i2p:0 -th3dj5sqw75lga3tnffbsywajxafv7cvlb7sed6w7q3w3sxuqo6a.b32.i2p:0 -tj2upmck47iktfh4vncmyajnkbatqglqzy4coqef7wioor4hbsjq.b32.i2p:0 -tk63xbzug7def6esivofwq2h2c53ar3ot7hsezdq3amxqqaoyr5a.b32.i2p:0 -tkzuysa4lkad53cywbt6sgpcndvvvdkjeatpkwyfweorx7rfe3ba.b32.i2p:0 -tl3xkknuukvyinyhvt7saz3tvz24ptgyqtzy3igygyfapcf2o3lq.b32.i2p:0 -tl66bkfoqu6eameaqtlwrvfttyc6xj3s57za3hd7omnfnjg3i44a.b32.i2p:0 -tlfttkbshrcixu6i6syntl5xjsoh6mtgfpix54knahyeuhlju4ga.b32.i2p:0 -tmmjmcrwegjke5fzv2hha2wkis7l6xdaa7fkq24ge5rbvqpwxzpa.b32.i2p:0 -tobdew6554c76jhrulcd2ssgvef7dryini2xjxem2zushe37ycua.b32.i2p:0 -trucvlawpufrszky4zzhhxtddnhio4mnqawzc47n7kik6i444m2q.b32.i2p:0 -tsfr6zvcgsmw2ekaxqqtkdrnbib5uio7lgmrtmscrvwe2d46g7jq.b32.i2p:0 -tsrlbxayhihugr723z6rkyafglnhcyzi2zhojzsyfdjsqkkd53bq.b32.i2p:0 -tv3x4kddbu753tnlghgh3txogp26tlydt47rl5scx7eoxgnocf4a.b32.i2p:0 -tvbutrv73xhwqbtosmbp3cesdyc5bbtslay4gjsf7rzdx4ztgzaq.b32.i2p:0 -tvotv5p3emxxnti2bnvucbfy4to7gxptwvh4qznuhy62hghnju4a.b32.i2p:0 -txpr56jvbf3lmqgaozqdqzgckfpugzyd4cwplkjootvf3hk42ibq.b32.i2p:0 -tyfkhz6ggpi2rykez3v3j5f3evnjxfoau7ve7m2heaukrcqiui4a.b32.i2p:0 -tyvsuqy36cx2yvf7jhnkd5ojc52g6vxl2rw5qshqwpk63ptovdda.b32.i2p:0 -tz5txdipkxcnydzcsuqw47qxdvpob644u3cttlbrbfg3zp75vl7q.b32.i2p:0 -tzudbbctweb7rpnf2vswuw26j63ysqztsbt7lfpfj6xautueiklq.b32.i2p:0 -u2tnrysboqqwjn73awg4hfxtfjgbqab6vrdgyu43s672jdcanhca.b32.i2p:0 -u5ixxcd6slvzxouj532njusx7ec4wemrfwmg6gwltlnkruubi63q.b32.i2p:0 -u635477uxqs7z4uvwx224u6ojn3c3ewcb66f3j7qlbzqyrrevxja.b32.i2p:0 -u6wrw47yfjdzk6a7nc6c6scvfokwuqmvuhxehqvymrv7owiajxia.b32.i2p:0 -u7uklnwthbrynr3z2gc3yxfmi5yoemsugjbb4nm44x26f25vxp5q.b32.i2p:0 -u7ygn3heosxu6l2die34y7wteexfp6h2w5j3nhr424yoblysigyq.b32.i2p:0 -uags6hm646f2qsyqfhzjt2xlnjqbiopiodghywosdgz7bwtbggta.b32.i2p:0 -uc52rzz4xu5ikx6hl6r6sqxfmiyyxsffpcu5frrtepczidwjwuha.b32.i2p:0 -udfxh2r5yfu5z7ynzacur7p3g7ug35kfa33ghes2bazpdivxlhsq.b32.i2p:0 -udkwqdo5odg5npn52rueipghn5omhvojthzdmvcvuomgzglum7fa.b32.i2p:0 -udzbx5jyvrp4g3iujlca7jnlaaaa5m3e4jv4sbr7tvp6k6cdjc5q.b32.i2p:0 -ufgoaa6g746zzpphuvxuomuizkyfpz45chqta7skrywqq6cjbqna.b32.i2p:0 -ufittrlr4eautphuqzuotc7b3xx27n4xgy5afm4foc6nsv56q7ka.b32.i2p:0 -ugw5zbhs2pvsgxieklmc6z4z6d5cvyux4pctpf2udhjgxvajot2a.b32.i2p:0 -ujg6b4cyxhi5pf4puwvwupur3iddm23uibapigpwl4bstvlt4cva.b32.i2p:0 -undzufsjeb4qlf7y5llh56tji6zlhtshlsyht4yjdsa2k4ayx7vq.b32.i2p:0 -uobwophnzqq4yhpp54aisud5ojgrxq6pasmq4aq6qw7dhgjcoqpa.b32.i2p:0 -uodycjdscpurlego2nrs7ptoze26p6236t2r2tax5ubdgi6duqaa.b32.i2p:0 -uohuxnjd27cftarbf6kh4czmotwvstpon2sgs2vpffqkgmg7guxa.b32.i2p:0 -up2kudwqomqrwvfognnhz2mjwqvkgpknfyscp4ue5ioev3q4jd5q.b32.i2p:0 -upme7c64dwjgbt7w72yf5ydl3dyp25dtenrkq6z3aw6hbircqzsa.b32.i2p:0 -uppxodf6bz3qibvpzzvtedl5lk3h7fslrwmed2cmqvdpgtvqkv2q.b32.i2p:0 -urqlr3cei7pp2cruga4txxmmvel3bh7nsbqzqzpe7omvmbm4v75a.b32.i2p:0 -usgqijrwhtwgoekjcr26yqcgpncwpsescrr3eek35e3rhkrtptoa.b32.i2p:0 -uu47uxdqqtv2pqorbaxnhhfmcsxmknvpreambqqkosr45b44h5ia.b32.i2p:0 -uv44mjoqrj3m3gzz5wxlnszt5pvgk3iqlc3pmqfe6un6gxays2cq.b32.i2p:0 -uyshm6nokdjyq3l43224at2rigpa4zmiyybuufyq22t4l65ialmq.b32.i2p:0 -uysvdsh2bzicmdqqdl7ezuftxcywzapohbzl5ap5hyiinki354mq.b32.i2p:0 -uyy4dbfyx2i2x3goobc6uxj4nb7ktzsu72zlksypjfisgka3xnta.b32.i2p:0 -uzgfmsjcbjxitt6bed3p3gpdzviyop2rz3cxqyu64ec3z2r5imqa.b32.i2p:0 -vbzp4sjkgqwymn2z4ikbae7rv3clbo7vv4mwv4ft7tu7ubrmbeha.b32.i2p:0 -vcksnyuyw3i6hfviob5yzoynq7okxi677bw7224273fjhsk2kgra.b32.i2p:0 -vdpfoahxse7cjciw5l7ffbwzc6e4xdlf5ulvrk34mzm2gy4mhlwq.b32.i2p:0 -vdv2aitgqica4taqcmjexw5xfbrfbhvf5kuxwvfjf3yiki5a5cjq.b32.i2p:0 -vet6qwwa74jrqrjzcm7ylfprzwpnt3hlzjvkbnaoiv4o2zzkr3sq.b32.i2p:0 -veucihmd74nnumiunvruyjs6kpjs5sqw5dprldlzcf7i3h4igkda.b32.i2p:0 -vewdrismzwnlxlvni7slpq722wlwfami2elghudm2ofcjhpjcs6a.b32.i2p:0 -vf3l3f5unlwrfmr3fiphpomgslxgm6m4chg72itf45yfu3brmy2q.b32.i2p:0 -vfpzasrsrqh3llkudmas5fymwn2ohswqi3vakclgm6fn4nb6s5xq.b32.i2p:0 -vgkou4ysuxvhlxrwf5n2ihn4ffyvvedluun47l6dobi5ycziy3nq.b32.i2p:0 -vgu6llqbyjphml25umd5ztvyxrxuplz2g74fzbx75g3kkaetoyiq.b32.i2p:0 -vj54d2pkdeqvcuj5ykeggr6jnhhnmq5q6qe7nttvb6yjetweadma.b32.i2p:0 -vlwovj6fxzvtsypnmslocootmphezr5txanyfz2gjhn5lanrn2fa.b32.i2p:0 -vmatpbu2vf5p76k2emzg2tjyqi6p6yj3cl4z32ncdhz37ubprkha.b32.i2p:0 -vmbyttxf6sw6ivdamftxung44mktqb4vphmm4lqzdqqpcmksterq.b32.i2p:0 -vmoogdd5lztt5wpzkwhd67uwnvpupye7ycsbz55jl25sueowcxxq.b32.i2p:0 -vn5rsr26rp7yxrqliq7vo4zb6aoichaybd3urvc5eedaspxjp3la.b32.i2p:0 -vnxjmzogakc2a4xn5w4qormiqt5khnjptnoaro74ehinrv4q3yga.b32.i2p:0 -voi5u3azhajnt7476tcikl5mactxcvtsbnrzixwkj62qhpaw5ujq.b32.i2p:0 -vpevx6tl6ma6mnlj42d4fke57en4v5r76yx6rcmhtvw47guo34uq.b32.i2p:0 -vpmkctqhkdqgkekt72srqm4sqaliug37uq2wp2ywady3p235cpaq.b32.i2p:0 -vptzpxba7oys3w2htjgh4uxogaedursdh2yz5k6e7yh4b3pokuna.b32.i2p:0 -vs67sj5crkcjo7m74tdunzefj6ahgrgohs6egj5jxmneszwaoo7a.b32.i2p:0 -vuqk76jvxfk55bkovqcmmkvycmndee7j3tuv7ezdb2slrfpjyvoa.b32.i2p:0 -vxokhkidetjp4tjrj7idojx45hguhnl2azvqnbulougvdkstf3ma.b32.i2p:0 -vxs2es6f7uw2uuneslb7ipvmg6kqh6ytpjezoj2ptwx7od4jqmxa.b32.i2p:0 -vziy2cbrbvliqpi27feak2hiewovxtlkqppsagtaxeib6nkonknq.b32.i2p:0 -vzqowkd4aoyekapcskylli77aj3e5fomixsjyiawnldzj6c5nxtq.b32.i2p:0 -w2a73mo4grdgwvkzdsh6nyutagd4bmywywacxviodw7xnof72aoa.b32.i2p:0 -w2mgaza75amrvfocl7wt6v7eimprlasuj3bi4xezdr2wyqhkxzwq.b32.i2p:0 -w2zi3xos4jaz3ft5yca2x5zf34esctpmzqlqpdrqntjmi2o3gfba.b32.i2p:0 -w3hyqnlueb4yv5lkzj3wlnrjp7fzpxnig6x6m3w5du2ptfjcm2jq.b32.i2p:0 -w4arykcvc7eckzuqr7kvs2njsjpknzb6vvsodpyzp6tvu27bzoka.b32.i2p:0 -w4k4gm3chiyskfzshilxjchpgtpx2xmc6euvkyzkyjvzvdbqroma.b32.i2p:0 -w55r4ykzu6qt6uhp33exqbqmlt357cts2u2zoi7hkuphqmv5iupa.b32.i2p:0 -w6jl2gubyscdpubizes5bp6s42cito4k27xwcjwh76rvuik2prha.b32.i2p:0 -wacfewi6ehmfxvftxqmracfh7se2t7ozl62u4hsuyd4c5xfzuajq.b32.i2p:0 -weidpvshind3dnblwtb4zpssazeenkf7a63favavkc4crhqdk76a.b32.i2p:0 -wgrbhqemtf7qu4c6acjicb7uyee6rlinafyysvxc2yocq4t2ilca.b32.i2p:0 -wjfukwyohljaxgv4woewdtpoxi3q6hnwcnefpgrtif2kqfrxslnq.b32.i2p:0 -wlepjf4lxs4e553rtpoys6kqp2ozcv4pqjwzoybawcl3zhrdvz2a.b32.i2p:0 -wmly6cz5j54w2g2gibnhlpvuhh3bky26cq3a5jy6dp2hg3hc34oq.b32.i2p:0 -wnp26nyphqfmq3udocgcwenpsgfwk4ssw53st4wvwt6mwf7wm35q.b32.i2p:0 -woanasilvwu3yfurvhvqj3lxd25bzj4fxwy3ef3qjbso3cozvyca.b32.i2p:0 -wpnewole7fofvwvrvkkgf45sgcverlodocu7fstm2axp5jfykraq.b32.i2p:0 -wrqu543ssub7kiwzfug4o7m6lc5ibmaamdc3o4uo6a7ntxiqzd4q.b32.i2p:0 -wsbf5tpo7ecsafusflyym72k6tbyclgvqav56qafvyc4j3spzdoq.b32.i2p:0 -wtfebbwmsxoywu6nw5cowlxqhtokxrxftve2zee6flvrpqg4j6ma.b32.i2p:0 -wtoh5v7xm3wx4rqutbyvqaixybwlprx5ua2yiv2gac3prria5emq.b32.i2p:0 -wuikfwkext6lbl6urhoysr2abcyff5lkm2ojr6mfenqq25nzlluq.b32.i2p:0 -wumjwpr45uhvtggq6jkzfda47e4iqk2onizw6vn5po3bd3uqcduq.b32.i2p:0 -wv335vkr73gsaza4t6foqypnovccubvwfsarkmw3xtc3t3sncmya.b32.i2p:0 -wvktcp7hy4l6immhi5cxyz2dlsbhhvtcmskjemrnqehacnoap23q.b32.i2p:0 -wwbojywnrcf2mci7f3zgbomrukcm4d3nv6pttb3dohjpge2sz27a.b32.i2p:0 -wwbw7nqr3ahkqv62cuqfwgtneekvvpnuc4i4f6yo7tpoqjswvcwa.b32.i2p:0 -wxfs2ccar4szd66dlmlijh3i3r4muehqjxjmabwbb46cq3gpbsoa.b32.i2p:0 -wy2udklgydh7iknnffbzvldoiwsct6dy3o7fjcsjcdjoq4b65vha.b32.i2p:0 -wzui6sc7667w7aabs6iebiex47o7cysxpryfdaltaklw2z2xgtuq.b32.i2p:0 -wzvki5234ffqhri26fqoxosqq3xengl23eoitkvip4mp7aipo3lq.b32.i2p:0 -x4cetuarbwiqphebitvgv4x4kzh6yhyyvu5c4yjlm4jsyl4bvs5q.b32.i2p:0 -x5qtgyzzgkovoko62l6n54p55xma5pbstbp6t6xc6hbugxz5ck2a.b32.i2p:0 -xasewpiqpzhyggxwsajmnkrppi2ozmapqv6673zuuymoueq67tla.b32.i2p:0 -xbetybs3nyeykskasolpatj4qrfnigz7a2bx7wcsyrniqd3usnaq.b32.i2p:0 -xd2byhr22rqkawocapbxedovmifyk77qrh6br4ctx7ny26hpmusq.b32.i2p:0 -xdoonpwnxhr7sjoyca3lkqsapmefd2puyar22ztocod4drjju6fq.b32.i2p:0 -xdq2g4tkaukzcu6mnvdukchinma7koi6c3noflpjabrzjrgeumfa.b32.i2p:0 -xegcohfrnnnuz3hdmb7r4e6pzxbmtg466n6mty2oz3tcoqutxj7q.b32.i2p:0 -xfyzfugo3qtfpq3s5zccbbqrxfkgy3ttlqhz6t6ovmtgrsuyce7q.b32.i2p:0 -xgbz5vpek6vaeej2zejxrjloqg2sqb67gim72qqpodqfq62rflvq.b32.i2p:0 -xgqzxudkvgbqwosaha7zb26jgza5wb7m66727rk4v2zj72xgg2ia.b32.i2p:0 -xgsk2huqghiftyznr6llr6ztepo523hiwqscxjpawcbme7xtjrta.b32.i2p:0 -xjebyiaydsbb76gqzetsmccgh67oeaxt3c4mkwmt7gjlfym266ea.b32.i2p:0 -xlfxusgnzpmatutaredcvx27zoiecno4tpxm52jicdvn4sr5dyya.b32.i2p:0 -xm55wnfhgmsy4wz24swjs2ziguheut6y72kht4ytwyfdmjsxslnq.b32.i2p:0 -xnb3pxtmai6ofbarycclwwueaarn4r3zt3zgkeepo4pgmswqvfcq.b32.i2p:0 -xnvsgbonlja7cmeokr2msvdelqlasbkwgqndqg7eakw43t3m465q.b32.i2p:0 -xpqubs4ftu7ym4xwrirlz2e36gvyjkil3chvq74bj4lf7djcrw4q.b32.i2p:0 -xrrx2rcpj3zefshtt7kamz3uflnwebpv2gkgd6vlrdazxgln57gq.b32.i2p:0 -xrwuqylcgkr2ovsf4pziosd27ywd7pfaohnreoyzm72qlnvoktrq.b32.i2p:0 -xtxh4wtmbjls76wxnehe57etubuqvsdiunwgve6kwjt4acwswnjq.b32.i2p:0 -xud4fgmeq4hl4cgsbjn3ubz2iyjguogskn7wreesvpsm3ib27kpa.b32.i2p:0 -xuivvnpcj2rhsxmkyyjzmyq6a7gwgusnqwdklgimamvkzu7rnnmq.b32.i2p:0 -xvpzaqftlfx2etqys733mndm7jr3l2j3if3wskfljzaow5s4rrfq.b32.i2p:0 -xvtvmaele7ns725mjaowsajpx4bgfecburyh6pqmdnn37cq7cs2q.b32.i2p:0 -xw6ble42juwkfrjetb3hmk2ep6jnyufhutoenyrou6ieoqiomw4q.b32.i2p:0 -xwlkpubkvsdsyaeylqfmxfk43juk6sz3hxnmwe4zencjq77aznea.b32.i2p:0 -xydzqrwggskdbmeqrhgt6alroglzbkcarzdlhabmvrszm5u6cfuq.b32.i2p:0 -xyhlemqmoeusqbbzr4oqph6kgmvm3a3lrbuanxkmyetwohxoynna.b32.i2p:0 -y365lf3vlh6vg4rs6trnjc4ia2xqplahk26y3tyqjly2q2vpfnqa.b32.i2p:0 -y3equ2tc6zsxqtndugsfzottuenfgxnl7eqgadmnzjkoigxvseka.b32.i2p:0 -y3occl5rqc2mz64esu5mqzoyfzlbxop7tttf2b3gyxjust57txfq.b32.i2p:0 -y45xhqkb43ncokfwhsmr4z6fwykuit6o3p2kbso3emv7stpiwwoq.b32.i2p:0 -y4njm6ftdn562q5thzd3fvb2f5mbi6bglmyupukcmcpt2tuo6slq.b32.i2p:0 -y5wr2bw3rt4rvw7hqqj7qtlf7vdds6zk6cs3mu3myyduasieqoka.b32.i2p:0 -ybjgylnhvk3fzyacxvyh6dwvrh7lk273qh5qws7uquvrhhwr6rka.b32.i2p:0 -yc4xwin5ujenvcr6ynwkz7lnmmq3nmzxvfguele6ovqqpxgjvonq.b32.i2p:0 -yemrkyqmjzwwn2yast2ga6dcnsovnxwip2rjpid56grdg7itugpa.b32.i2p:0 -yfplj67xwcblbiu4ozddmzlmjl4ifa7bhkzzu6fu6jkoyqui6v6q.b32.i2p:0 -ygtc5m4mh3qhi7tct44gxqbenhkasp2y4ydjn5qua4l5vh35osdq.b32.i2p:0 -yj3v3ocgldnackxptsjmwasa4xzxj3it6rtuhmlpxvwlq5kmyytq.b32.i2p:0 -yk2srkdlbm7kebv53dx45ss7q2fjcy56m3gywqvw65eya7co7hgq.b32.i2p:0 -ykppjmwunzqzuuqc6qqsijomfzdgieeq2mkidapc4awrww2ninbq.b32.i2p:0 -ykv62rivlxurq2wkecagzs76tulfor765c237bsjn7jt4436kn2q.b32.i2p:0 -yllvqk2utimxjtoyzk7l24s4n5sqp5dbn5vwsbt3g3dd6h4dxseq.b32.i2p:0 -ylpyfcs24ij67dkl7ighyou4z2gpfhjlt2iellj2ad4ddrxci63a.b32.i2p:0 -ymo2cnldmstzqlsdhx7kurii7aaffrhpgafxlli3s47pzbfe5evq.b32.i2p:0 -yny6zqtb7qve7wwfctsozhzhbq4hyitlqco4uhc5q3rvjex77oaq.b32.i2p:0 -ynzhhxlieigtmj6l7f2dq54ypnsaf723au7o3uhnismlgnkmcqjq.b32.i2p:0 -yof4yvv4agwhfmicj5u2drem47nvfkihnp6bil7ocg65gydyzzcq.b32.i2p:0 -yojuyryq6vfoy2mftrdmybmq2hjefuzrwmpqqfvk2kd5hptgr3qa.b32.i2p:0 -ypbq5aleoqqoxto4tkxlmlxh2hrstjxzpgonj3lk7dzweahs3hhq.b32.i2p:0 -yql2k4zjl64dtybuculjgg4v4u6sje4smnyay3vslv7irrigzxka.b32.i2p:0 -ys36rtuedg44sahelbysqi2mbc2l3rcfdy33zdvhvfkx5uocacba.b32.i2p:0 -ys7np3pmfhiyq3z2rcoeylb7agfbyfuhhp7ky2uzvvuzswad6cia.b32.i2p:0 -yuqb55drzrhxfnvobycxqau47kibaaf4voamk3kxl77xbb42xkqa.b32.i2p:0 -ywfauauaekbrxgwaahcjzifemzdq26xsshw54sg4bpr5z74scwiq.b32.i2p:0 -ywpsgu6nlnf2l4sy44tit2av7hfzwwttbjvwbtsbtqur3awiax2a.b32.i2p:0 -z34pw5tlowwi3gpj3ycb2dptgyuq65bpj7w36xahslgikggo5eaa.b32.i2p:0 -z3j2xshl4tpbxaybcprhzq7cuz6urboqoxvvpnfriv4n2lq72jsq.b32.i2p:0 -z3pgyfiwfzcd2g7v4rs6el5tvc55y7a3tai4gcbpso6flaejckea.b32.i2p:0 -z6mlyrxcjddpcaoumxnw5peulnkvj56hgwqmnc5adoutp7piujaa.b32.i2p:0 -z6xsstyq4zynzvagwv3wr7htz4vxttrotzb5izefotlwqm7kjtua.b32.i2p:0 -z7cjxpy4taui2ka3ekfqtoumsb7pg2sok3wfey3m2roeuppcrzhq.b32.i2p:0 -z7cjzfmv6wadjguzaavu7pfsqhujbczspbf5sxxrqndeovu3lt3a.b32.i2p:0 -z7gkesbkbl27lpcpbnhgfofjz5fhnvljzfvyydu7ky3odzdqs4lq.b32.i2p:0 -zafd45c2hzd4w2t24qtjqqbqm3z4hayb6vadj6sd5oukjyij2ara.b32.i2p:0 -zbkqcqtiiw4nwsds5pjel6alr5i4hgiyqf5giwurdygfysacru2a.b32.i2p:0 -zbz722dh7rvu6ugdydmlmtgfyc7rnpeslae525c7mhr7rgsekjba.b32.i2p:0 -zcwgqw7hlw7437a7au6n6obljdb4arnshoibdqo6voree4xiznoq.b32.i2p:0 -zd4ns4zcyvgpwkioftiiftgj74n6mf4m4ieq6aedqaznmdi6rhdq.b32.i2p:0 -zgwseerxwqnid3zhculzuqbkhghthsbvsbnqowredostfqlvawsq.b32.i2p:0 -ziehuxdpyg5dvvnzedmcqxszdcflsrx6fqmgzb7odefqwqaxrs7q.b32.i2p:0 -zk2r7kzzigzu5kz67xnrbe56u5walngylcsk756bkmt66cmeeydq.b32.i2p:0 -zkbjgfp4ouockpsmpbdyli4ilo7f3lbfjsboay3nf47ymir2ldrq.b32.i2p:0 -zki6halesukhfel76pziutgica4zrp5qtbmlmgyqf6dnnomk7hja.b32.i2p:0 -zkij473aummp6rvwvi7wbr5iio6xu2uh4rophbhyot37uxhrygiq.b32.i2p:0 -zpvqqdrcnagad5ayutf7hkp6prtvrbmknhqdul3qweft7oa5ikzq.b32.i2p:0 -zqft7c6riv7aux62qwe5xfqki3dcb4urvbfy6m4wz7f46j2us3la.b32.i2p:0 -zqhoqgf3enj2pv74sjov6dthpr6jqafw5qqzzsvnfdqzycychxpq.b32.i2p:0 -zrrki54mn56fytizkfmhx7eubea37padxa3zliwq6gtknrsxv2aa.b32.i2p:0 -zsfpcnbk4g2bwxl7yy5ebrcvlxd5gpcxatewdrgpige7oqykunwq.b32.i2p:0 -zszq7enaxbz5p3f3idhfkkd2u2ygpeqwj3o6hkofffcmllnymwqa.b32.i2p:0 -ztr3c7qz6v4hrnegmkzjsr52wyi4u6ery4m74sk3m77oup2ws4ka.b32.i2p:0 -ztyxbjae7ucfyupxpy75jwpzdktg4gbvhl43nh2crwqrx2uhveda.b32.i2p:0 -zuamj63ad73jmnw7xnxrmjsbjg7vg23j46w3mpc2udpcgjfkcqcq.b32.i2p:0 -zvchlrjuzqdlx37fhibhnym4y6p56vtlymujjuzhh2cp34yqfrtq.b32.i2p:0 -zxsd3fqczh6ddgejc24nnmb3ww7nalieq3a7cs2mqiy6tmff3wia.b32.i2p:0 -zy2ywvyqds5bgdoo4tgbu3bwjp3ygyn3zfuby44jemc6xa6fbwta.b32.i2p:0 -zzre44vh766jgfordw2ehu2r6p44j23uyovgvm7iwuhp3g5iz4ca.b32.i2p:0 -ycdw2e4ufgfwhcqna4g3m2qsvaly23ozaexawcj3x4gtgcehgwujjgid.onion:8333 -ycfvedulkprd5bmivqejur5aptcs47daqtcvzotnnhfvwu3o6gcp5cyd.onion:8333 -yck6l5ffw6oszgtoc7et4fytvp3sqdf5awyky4tlpgem2n4y6icxqoqd.onion:8333 -ycnepnzktkhfysqijlgbjk5awivls3eiqb5kjudotjvnvlbe6ah2k5yd.onion:8333 -ycwrrabomoixkxggkxldyxkqoc7qqy2t5wxcsxjgodlvuydwch6dqoyd.onion:8333 -ycwwrwkqibvkftpc5kyqs6nf7hrzetrmqgwo4yae7bq5otvubkfsread.onion:8333 -ycxjdh4jr4vun447cdszcoge26pbdnqblfi2osmk5e4uqmrigw7y4byd.onion:8333 -yd2ami3rem3i24q2b76l4ujyq343ycrowrthwqycvpcsofgpwlxyryqd.onion:8333 -yd4nyusqking6tkcwmmopznlxhyfhk3gsw265alz7vpo6toqg3kwn6yd.onion:8333 -yd6b3wtmu6bz5km7hw645omyv65one627xech7f3vnlwkblsvqdtmiyd.onion:8333 -ydforbx54mnz7g5u2mu2ulkomvakdbwxoad6araknijb2i47gkfeh7qd.onion:8333 -ydiqekqpcf536w5uwsdclw5pt4n2fkz52fo4vwdducc5t5l4ghqaxnad.onion:8333 -ydl5kqr2auvie5mtjkm37hzkqh43pobibty4msfzkbu4junpg5gak6yd.onion:8333 -ydojumivjpins2lwgql5xaywbngrmw56nvmtalvfiy7sr42ksvr6apyd.onion:8333 -ydvbxdzs6w5wefifiqsqntpbd7tliofenqih5hlnz34546fvy4ab7iid.onion:8333 -yeat6ea4esvd4nimhg2rcb3ghpusoqzjb44alb3hhdj4d2nimn2vpoad.onion:8333 -yeficzguf443sojjdcmh7lzk7l6y43a6v2jbyk3x2w4n7xokjs4crnqd.onion:8333 -yefjaylovpdhbb5b5bhjx37digt5u62lmzyc54ygtabwdphm3zwd77id.onion:8333 -yeghpcuryadlbxzk6o3ujebmfuumkpoi32dr2ctfmql6vqn5wjioehqd.onion:8333 -yenw26f3i6kf5u2nad6xligxk5iyizjvl7msx3pzjcatiesogdef4zqd.onion:8333 -yeoadueo3ukf6s3fetywtbvgmpvrtkja5rlp7wcp4aich6tfhh35giyd.onion:8333 -yeqjrnnuf4fbgzik74qfhrohcymj7ccbze6ndky4pe673chfsjconfqd.onion:8333 -yernmfgru46g43vsijjv44n7m35tpoznnkd2p2wl3uqzkietukxqxoqd.onion:8333 -yettfzp2vanmkehwxeaugotqcsg3wsomcargvetk4nhwnebrpq7ah2qd.onion:8333 -yfgo33tiu6w3nrvnfyw2nmpcwtfozinctn57566y5l4hfcttuvgff7id.onion:8333 -yfmujam6pa75vm7p5q7gvgkocqzcwm7lgbnodwtmzfw7usy5dvlgqyqd.onion:8333 -yfpqwz4qogg2r5sdweggggz76pmhxtegnisz55urw3egvcq2e3amvkid.onion:8333 -yfpucmv4zspytubs5epnze4xc4joqny52s7ifjk3vu644axwkfyfurad.onion:8333 -yfq3sexjxzuww7tnwc7jj2ethiu5f5r65ewpy66os3ozhoeje7na4hyd.onion:8333 -yftuiua74fspnqanvait246qn6vmab4aoympjd3omppu46jkq777axid.onion:8333 -yfxz53gdbxu5hapg3e5kaa5pyxpbrpiql6j7sfe4i7fqj4blpqpufzyd.onion:8333 -yg5xbesziuiaigwyxjrn5c5hvj6fxef45edl7pir7risnr6un6esjtid.onion:8333 -yg75fc53cicbsarrpfv2s4crpkx6vdjub4va7cvbducwzhsf6qehx5id.onion:8333 -ygczn2llqhks3ohxvfck4ks45ekg4xr3loriyynnejw2jfmi7hjsfead.onion:8333 -ygdfwrg33s3qwiarwxbejalkirmqui3wjz7wfccprjry6bm5la65vhad.onion:8333 -ygh4hx4ugapidwxodkjr6vgl6vkaqvievk2eiie7v3ewuvjvg2mzp5id.onion:8333 -yglvvnb3dk2vh2wwgpcnvm6t4lgbdhnvpy4jfj3ee4ugb4xzvjrrcfqd.onion:8333 -ygospbn7dc5a6haqur4eoe2oj6jttjohs43rhl5m22ltruh4fz5isxyd.onion:8333 -ygowwz67kvvri2lcwknsc5xjdz7ffat5tqkm7fmxrrzfgvqnxoxkvgid.onion:8333 -ygwuwz5autfc4tqluyuoebghc7f6lgjykm6oprynh3h2vfp4xmhiapqd.onion:8333 -yh4edjvpbo55vsankh7e33u77ep7eah5h5gvfgu7t7mbb7kkmjvgirqd.onion:8333 -yh4uoyfzey53dnoj6zm3frihhgwpqfqkw36sjmqsvfnl3rqohs52wqid.onion:8333 -yh5us7dk25ttxkt6miers3bazlm3jiums5nwz6mzd4i6kn5oizjccuqd.onion:8333 -yhddybpp6lgu34i7uurdqg5jznfdajwr7co3twiqf7pgnj4yjgzbnpqd.onion:8333 -yhiswltkrs3upvkrygsuiou5i2njnyxk3gwtsmcr5yn4lfinzifbpkid.onion:8333 -yhjkylctf577degc7ufffvg3gsdxgnx64pdhzfujxjgfhbulmtc7yaad.onion:8333 -yhnzb5pmcbeiqs6bxm3xvzdy2dgblteiswvvtg6vhkum5gjjw7abjzqd.onion:8333 -yhqytulgwdtvozjhuyod2cufnkbh75mgyw43k6w63ah2fzulskfssyid.onion:8333 -yhtxfuf5zxqoqkuodfpmzsnnmtm354y5rtexqplt5l3fkzzksjkkzvyd.onion:8333 -yhvyxjfauptpsjrxrf3oxtv5zlju2gdpitwsabcmj5gdpjr6i4z4ulyd.onion:8333 -yhxcgpy2bwwhhpmgellyghjpkw7cfrjlq6trq2yl3632rxerwbmkvfyd.onion:8333 -yi2k4otmwujg7bi5iw7ewqntnxb26jyplx5xyk7bjvvaut2y2mhcgqid.onion:8333 -yi32omh7hh54oeot4i2ze2tif4l4cwdhzxxn4bzmtqrotfxrepttfead.onion:8333 -yi4gxqy63csutkea3zss2oryz4get22hcfginwcejy65g35ec5t4uzad.onion:8333 -yi4nvghovjd5bzcbhitvezh4uwg32n6r23et633odlacu4eamfym5mad.onion:8333 -yi5x6isngj7pivr5wt6i3drntlqsvbzijpdy254lbjdnihxmfy2cdgad.onion:8333 -yi6umkklbb6vr4j75buoss7kqkgcsdsx5fvgi57h7j5bzuleoe3ae4qd.onion:8333 -yibgffpo7dimyvjlbzfr3dnmnl2r5hbrpxbtcpksthsko6udsrk5uzqd.onion:8333 -yiiyiuwns45zhmkwi3wjumqhnyfkwkahbggd6hrxtnrxfqwn2vdx7pid.onion:8333 -yijdxmlgnfcwrb5zxvchjhgtc5357mecuopminujkono7bwjgqu4acyd.onion:8333 -yise75jksg27th74bxo3a6rcr3huvromhmuhnmy3n3ngcgfpagq445id.onion:8333 -yised7sf3xzsnlggeuioas2of4crrllkpz2gfbdy7c5cysa5sxi23lad.onion:8333 -yisvuvmqtn7wht6dndrqzsdl7vuspxwrmfwwu5o7wldnzn4mbzeb4yad.onion:8333 -yitceyo3wv2mk56omv6mon3n7dcfr7jiggdmzlmtikpoam2otiey64yd.onion:8333 -yiuesqqc73nn7kxadavmlwc7ymciszzk7bxs3bd4fwucaocme6qb7lyd.onion:8333 -yiz7d2lkgk2mftp6i5e2tqhotqkqjgxbdmzbnflwvsioyfydqrvll6qd.onion:8333 -yj3gs4nvumsfztawn7ku4cmner2zlmcn5kke33g4j2vywxsrqmbd7kyd.onion:8333 -yj3q4iustxfcq4bisbuw3jvqc7ph2ggld56mvyxqvgw2tmsinbwlnzyd.onion:8333 -yj666fxjddvz4xzkhtzhh53wvkiobvildczzxb3mixjipqqiqaz3bzid.onion:8333 -yjdhdurh6vqxuykgmuskpabjzjni3ehxxh3zq5redu5hqdmhdw5b5jyd.onion:8333 -yjkojvjsg6yhfj2ln2bpcrh2e6fr42ul3yzsebbz2kkytg7pf2zzjzid.onion:8333 -yjudzsswyvfqyeth2eghfvegxg6z6ubnx72kmqjljhdewrckw56lggyd.onion:8333 -yk2foofoifxgbrp5a45okwbelrsvycgqgw24xv56hmuqxlpmw6msndad.onion:8333 -yk4sercvyzvqxgbgn7srm6eeivlzoa3t4sz363aygcyciubcieihhxqd.onion:8333 -ykh3t44zjojpj76ouqeo662ljhyc2t6e3mike76iqpelcdztgaxuw5id.onion:8333 -ykkhln6x6hcmhyrx5rxaf3c5auh5k4plrpaisits63r33ecwkmtexhqd.onion:8333 -ykqehwl47hwypuhhuuxkpoexocldvllixqhplpsy6ym65vbjfa3yfbid.onion:8333 -yku2clwr3x3ndzfjdk3o4spoztoqy6ndatken5wopgapg7qkvypuqoid.onion:8333 -ykwrwuffwvaxlwivt3hlhyz2yo5xde7dw4x67ygc4xh2t6m4i5cftkid.onion:8333 -yl2preaby2yqyhmviyq46roapupmnijt2g3mzmvwtxptvybz7rbs32ad.onion:8333 -yl2stshaozpyqtut7m6ln47z2qhledknuwhij6kvxsuaai4nwy6fp7qd.onion:8333 -yl37nyh3vujz2fyrz3eoqoteixyiz3dj5rfnnmrglcgcswzbeqbjhiid.onion:8333 -yl3bo5zwwsg5dbhrrcjkvoyvwwxp3kbdgprhe6md52ob2lra7ynrbwid.onion:8333 -ylaoywooejvpfosewxmyxjhc2ahfepjbvuyjc4p7bymwirexlkdituid.onion:8333 -ylaprgwti4dsumx5xvlhul3esf3yi3ebyyubb2dwfgwe3zysv3e6nyad.onion:8333 -ylblnrd2jnfjtustl6yt6pix4mgqr5qqoevunmwk32e6fxq6uj3dchqd.onion:8333 -yldtx7o5y5jf2utrrtqf5yf56akol55wars2uwxuvjoubustrtmuqxid.onion:8333 -ylh3vliup6k27pt2thw4xgfguiziaosb5y3ovee4w6dzwcb6hc6czwqd.onion:8333 -ylsvnjqrcgatkzj5gfkwt6cz236z76yvgpeulggzml3xb7tnbsttjnad.onion:8333 -yluwecwlibf5dw2sup64dq4gs4cfdhtkfhoy5cszrvu75wljeqanr7ad.onion:8333 -ylyuglp5b2p65gmiofhe2irpxswlhecdecg7d27qhcwehegr2efmesyd.onion:8333 -ymgyodvztfs4nnijjnwiv6eadetxjm765iv3ryuyhsq4upnjwncpvsqd.onion:8333 -ymiw3d4klephwuwbkgdpllrs6hssb4svcg2um7sdm3hsnnksbnvj2vqd.onion:8333 -ymnypd7xmz2fka2r4yxvq2ibf7rvdyl6eemppo74rfehu2d2oqkclcqd.onion:8333 -ympp5jlakwfhj2bozw6w33qailkrqbroizxm3pdfxvjdbrkwtyx5iiqd.onion:8333 -ymrunm2vhoarw7rpo6jdmq4mev5hz63umljki65q2v327vmnw6wjyvad.onion:8333 -ymt2hdfgdxo2awvj2k4y5tbpvapj75j7v34tvvlrqy44lsvvdcnjx3qd.onion:8333 -ymuufa5br75liswfrb6pgm3hc6o67gnzhyg7vpfo2qsw3oyw7m7nsaqd.onion:8333 -ymxea74sswjyqvv7jsh74dnvimcsq4rnao5x5g7dfjnbfy67oj37l7id.onion:8333 -yn3avowdk5cox7qz34s3qiz2u5j2xg3irxckhzikfjv5ccjqrdiramid.onion:8333 -yna4zorq57ehghewlega7lb4zgx3t4lgv5k24orv7b4qcg27svymosid.onion:8333 -ync7fc7dz24s32kp6opdkbvohb74obme4jgo3rkkvjzywslxegist2id.onion:8333 -ynilvzuulga2tlv2hcic7ayc5qpd4nz7r7snsyejp4vxwnxlonf4gvid.onion:8333 -ynkv7njh6hj5xewxxy3gvtnu6ocyvu4tgrl3gnw5xxkdpfshalppqmyd.onion:8333 -ynqgzojvdwv2rui2rlechb22e5hwqipltusdnfkv7s65iz6fgrnybnyd.onion:8333 -yo4ykt7hngppavow7f2sz36ajl6w34bw6qrcfee6i3s6jkm6seove7ad.onion:8333 -yoat2b46hzeuhy7n57gjmfxgppei3xnzdxwsl2ipc5ny656j7zp6ovqd.onion:8333 -yobra7r3ketjuhr4g4cfdqumsez4om2eefvmgxrxq7wxnkouzmcemwid.onion:8333 -yogfxdco264tjbbeek22o26lznu2g2kwvs4lmft3ib3xelndagtf3uqd.onion:8333 -yomwxfciljad63gicbd5757og4lypcph5f5mqdou5kj5rowkyotaohid.onion:8333 -yon5gz4q7soici4i7jf2zaciusioym56jo2bat363tr3peoiurransqd.onion:8333 -yoobb72dyt62n5dpsu3aqpqa3lmfj6gfurno46o6vmqdbpwqw32ahjad.onion:8333 -yotcqynj24k2ckilo54hjhftjuvvwiacbzoraqc2kq5vtmsxloswddad.onion:8333 -yp3juo763dmi7ryhkv3kq2l262cllrru6ks5tlzcdlxdakmip3zosuyd.onion:8333 -yp47gud6fjsvjgu54oica4b3ij4zfreactcaon6fx7v7pfbxbrvqhtyd.onion:8333 -yp6klgnrvisq73qg4dk255h7un2k7pbk666jtzc22rxjs2en64ojauqd.onion:8333 -ypaazf2z3t5dqzudlygjjpyb2uvk63guovstzubsohbbeomometn7cad.onion:8333 -ypakyst4bbhh2juqd6r7xymqnrgwx3eajekpg6o5b4fazccy3mwovdqd.onion:8333 -ypkjkt4dnyqy6svecydigttwnsj5x643w6edk6qzhfo2hkxxu4ln6zad.onion:8333 -ypmikts3saaffj2uo5zmkbac5m7xnbblxkbhpw5xtxbamajqf36wgdad.onion:8333 -ypninar2hybv3jdovr7ax7teq6wpzvrw6n74csq7edos3hzumh2h27qd.onion:8333 -ypoinzgql3zo5d3strpmannbkdtndxkxlajwgcpaj4ngbc5mqrzzgpid.onion:8333 -ypp73pv2vcjfq23ltwhojuremxxfknwtgkxsvwe3widlaevyx34pepqd.onion:8333 -yq7s6pe7jzrzj5uxlorytwxd5bs4kljyvp27akdrpang765yd3sexwqd.onion:8333 -yqnal4phy7wz3lsoi23rziyb56bnbzvvypy2mg5ponzrk63qpyvle3qd.onion:8333 -yqoiqt3molj4ygq44zyme5gdbgee7catlf4ndjr4myiicduuwiev3fad.onion:8333 -yqvhbmvc45iy3drl7nceuhugdt2fevwx4x53zafio6h2626kflwtrcqd.onion:8333 -yrambbqlzkm6o5pkc5q563njvrkfallqobvscvpdik5owbdtnhbc5jad.onion:8333 -yrdtnt4lkpysyyrvryqhxw3k427gxwziosdtipf2dcifougwzomdfcqd.onion:8333 -yrlc4r3qfcr4x5wnciutrdvasrpahor3ui25lgdgkxbit3zwtmwfmxad.onion:8333 -yrmpasdjmb77ono4c6rjh24fj5gt7bbjx7nxurytkmxbww2gam6vodyd.onion:8333 -yrqolwaoxpa32cw2zegnaggmniuer66umflznja6dcp7udqpaoanqwqd.onion:8333 -yrwksigpx4foqlwnf6cxwtppx2z2msompig73dkcm34pwsmy5bwwg6yd.onion:8333 -yrybhm2es4siupjnyjffviemvqx24mqj5niwm2wf56spdqlwau44r4id.onion:8333 -yrzwl3rbfjx7eybyjvnjz2y7qmvpnkexkmylqpwsb7ivpg6ch42mmxyd.onion:8333 -ys2muyvcnpdadettzavleh7qrn7t6r7e2tobfp7yxftta7ez2i6rdxad.onion:8333 -yshp2g6b53ndeez34nxnk4bz6cqbzlfxqdggi7btqlwzxzuc7sweqcad.onion:8333 -ysq5rtpfzkz5gt2s62idbsd7secz3jepzlup6hqf5ttdutsdmwg2ryqd.onion:8333 -ysyx5eagwnqpfemz2nhwcxs2c3eueqk5f3jnyvyfqfno3pflcqfw6yqd.onion:8333 -yt2vub6llcegxuucu3iekjqfpmbyz4kreuxx4su2pqcetw7kbkbipzid.onion:8333 -yta7q7v5lkzt4zyp3m44cxcdtymxgmuqdntnagz6h3hwidmqoeavifid.onion:8333 -yti2ofsqg7k4zbln6aqx4zqaor2zpmlsebyljxlu7jczsjqtd4ctd5yd.onion:8333 -ytkkqeik77zjjwabsdlctuum37jr3r2rg6ckxudza7y7tialqr2wfeqd.onion:8333 -ytq4uowr6vwyjmrjvac7aimjjlzylfmhqhn3z4ecenm5dd6u2ccsijyd.onion:8333 -ytqhsolk7pqur5cu2faxruehvx72yiiwb33p4szdnzidjqksanps3nyd.onion:8333 -ytqzrm7fke3kqgh5b62taq7yyejgtd3yxwaifj2pimoqbfq4p7xi7sid.onion:8333 -ytrhvysmp4iq2qumdrpgp54q3ushkf53b6i4oxpddg4rmlk7hbayusqd.onion:8333 -ytyn2e3bkmgavrygpk5rzydfdmhpkercccqcaks3xtnbgq5qsyg4euyd.onion:8333 -ytz6ov6l5ofhjudlfi5k26lsg4v36p7xwciafy2sdau4cn6ozxgmefyd.onion:8333 -ytznm6jwapg5h3firimqb7ao2g7uihakg3gt6hcpfqkkgcyemklfufid.onion:8333 -yu6ilgxjfffdb3fq7srwwmz6ymp3fxberstpl6vdocmxbrrf5e3tw2qd.onion:8333 -yu7c5kjgmlci4arofpgq5d2qs5fvbw3zac52nampn2vc6vximc6qovqd.onion:8333 -yufe3o5x7spybs5tku64r6hzbrc46uq6izky6z3dyvba2ymblvehyiid.onion:8333 -yuhebtpb6urpsrr3g3vk7tcl5lp5dt7kcaj7zpgox5r4x6ptysxzvgqd.onion:8333 -yuqoihr4p76t2yupxuciurcpzsij5i32enjlsynqor25fhdvidx3djid.onion:8333 -yux32z6r5leyhbdrgdpti4sggxyoy336qb73ia6sk5egfli5qsvkxvyd.onion:8333 -yv2ezeqqfeoprti36q4fds3ckq43vdv7vktqfpn2npv6isnbxay47hid.onion:8333 -yv7ainbyxz6wejjhpjgzx6ghcomdwd3k7fclru4woooxcovyjwrp7dqd.onion:8333 -yv7llcydwvi2m4xpnulhgxcrje6vswtsasu5bbmgxuk3lgln37tdvbyd.onion:8333 -yvgzvmh4ngi36zvn7pe3bocsxj6pccafh7v6wmswkdobbxdzh3b56iyd.onion:8333 -yvhvl5bvjp5ljmooujmw74wdyqnhvwlm44766wwgq5thnzctyni6yeyd.onion:8333 -yvnppv3n3hwexlvugfviwv33ycavxdwnh24dps5vp3y7kw6kze36v3qd.onion:8333 -yvsokw66m7kqqqjxb4mntjvwhnpoovoec6rrpqtdze6fdvpbtvt4iyqd.onion:8333 -yvud2f6wb6puec4xq3a6yruax25jydqepowhz65uvlbvblsyi64skoid.onion:8333 -yvvodwqb3szlgkx4egcyq7qmhpyoqxdyxdnksxl6ppnmagnsu4noemqd.onion:8333 -yw7tqaujnglpjmjak5r7sxvjg4gqeubwetm5h54e7fbfn7yx7kgr4kyd.onion:8333 -ywbprsiodgtlc2qoubvot5qm22logutr2dbizmlond4dcifklaxqlcad.onion:8333 -ywkxlaydopi6ygjeggtv5znptkrldzsh7peg6wabkjmcu4k3hmbjivid.onion:8333 -ywmh5zcx3r2rd7zmkyx5kymgxk43lsamie52kbhayqwqyod5togs6aqd.onion:8333 -ywq6oxdfdvlict3cuasd3akvcl47iw6bxykrvkalemrcyqzyzclbf6id.onion:8333 -ywqkdkihpzr3hx6la2lzqsguoqbuwkn36qcrbkhvltd62zdrguprljad.onion:8333 -ywqp3kjwchkto24so4nn4ofq5m5c454btnkux5jxftkkqz66ducu3mad.onion:8333 -ywqygs72qzxbkjekezlhsnrsfnnvm66igkovfoh267ru7ho3qtxtalqd.onion:8333 -ywvpyur4ny6zhfxpsva4mh6cd4htw4q7ylx7tissnxehwg2bid5fumyd.onion:8333 -yx3nnyxy3h4ex22uqdjwephoprte34jelnkpr4ua3d23ks7qxjrqzoqd.onion:8333 -yxa2iu56fp4i4mxzdkmv7xxrluyxtkylqvexuceivx4fqxbjyzme76id.onion:8333 -yxgvp66ll3c6ko7w4hm7xvzofd3cb3ku3jjqc4wihapnyk3wxijafrid.onion:8333 -yxlaxiaatyfnrx3l2vhb4p6d347djzux75gcl2d33aydlwspo5w5wpad.onion:8333 -yxlwpmsjdbpldhi5hlzopision3iqbjzpvyaaeb4yst3z73qbgqy5fad.onion:8333 -yxnuslj7hslwmofh36a37stlm5jjnq46vvvyntf42uw3zuouot3sjaid.onion:8333 -yxq3bjwdrck3lflvwixj2fc2l7pzqnea5l7cucviamoc63a2xozk7iad.onion:8333 -yxreb5ajudnpt3b7z5hyizaj6ufgd46o334wtduuyaakboxwztgji2id.onion:8333 -yy3bnszld2tbbyd45f2j7btrbdz2p5zsuzie27liqr7xgkfh37rcojqd.onion:8333 -yy7rusheh2cq2xghpsdzlrx4gpejgfvsfhq6333d2jttcovhh5jo44ad.onion:8333 -yygxdcvyp6tn46umpmxlsgsi6crg2xjchuhi3okobofsx4dqgwucnnad.onion:8333 -yyo5s4r6wr6p7l5p5umlp7xgb47ugeptugscv4gvpsxvjlwymfpwruyd.onion:8333 -yyr2peqznujer3t63yyhlcasjndbhllvtxxkmcvr7p4yxpuzjrcylcid.onion:8333 -yywmc2hhk7t56e7jun62oidqft6jvtvvlylexihzgcrtkzxe5axsd7id.onion:8333 -yz3izxf6pdtr3ucbriuo4bpgjn2visad4vgocktexnpv3rfgar3kydid.onion:8333 -yz4l7aqcjf3lcdtdcuxoxljedrcrlo3lu6kths2bvjeoil4wqx3d46id.onion:8333 -yz5i6sldywr2mqzh5qmwoqfgsta5f67bgdhqogejjmpengl3llafdjyd.onion:8333 -yzakgornrhzzenpclo4ahyai5lxsg6mjq4zrwlhqt3ff4sblxi42jwad.onion:8333 -yzbka2sygb5eqgrgk2svqin5hl3dfknzfdn6wzwncexsejmrp5wgm4id.onion:8333 -yzh2ineefkzohck7vkwcfe62kvplsly5xn4dmm25fpxbjq2va34bu5id.onion:8333 -yzigosfexpco67cy3e32xehlpwor37fp52my5pwtr2xsnj3mxl7gfoid.onion:8333 -yzijb7pu6mrrdwb7sku2e3epfyrkhl7t2a723vaisqulr3roaxoy4xid.onion:8333 -yzlai35raddd2kdjnukns7u5t4m4ngi5dfrlq72e6lqf2hp5dzkuszqd.onion:8333 -yzo2vz4kuitm53zwynkm7ddfdw5escsp5fp7rgf6uspphe653mvdekqd.onion:8333 -yzqfzw7fgzzs63xpvsgznhnassxcadbfaxxaxbmkffvesgdxizhxkyyd.onion:8333 -yzrw7ukful7rhvlletmabm37wupkhsxwo2esqqotsoh6gxib57ss3tyd.onion:8333 -yzs2bdhwhxfgaozpcic4v66w7wwlxrr3v4xpgzer733qehcwewijipqd.onion:8333 -z23pfizxwpae2sbje722iesvd6rcxntazcaoefabzsudkc4xxmtbqoqd.onion:8333 -z2eky4p4ozlkrrmuq2jqcz6w2k22re6hxrm3um4ypcnmzmpsi4p6l2id.onion:8333 -z2eo4uckd3ymgtsjitag7yqukmjsjpwuf3d3npq4oskeatpkcinxkcad.onion:8333 -z2gnzha7ttijmle75dvqdzaeqz3xyxzjrrqbzribvwbomh74je4xeiad.onion:8333 -z2ihxne7lyodwglkwpvdmz3a6343msirrvjmaf2pytuo3jysabrkiiqd.onion:8333 -z2lhlshxak5owviqqzacj73ioftqmvq5idawmrgt4k347bwr6yubmqad.onion:8333 -z2njilhjl33youet5rbdfmncadpt7tohtconls3qhpvuqfkreoteqfyd.onion:8333 -z2nocd4haqt257cyr6festid7enoe72qpmu27cuvveoon4rcak4femad.onion:8333 -z2yjvxbv3rfpso4cjkxc4i72f55xb5fihthcdbvh6dp7ghxz2q2tabyd.onion:8333 -z33gr6fni32nkhfmkovcbvpuk7s2atoqfbuzdgz2jszh5ua7zdu6uvad.onion:8333 -z36427rantiy4ikleyihwfwh2ga3pyqqz7doezrzkyv52bi3mpcgt2yd.onion:8333 -z3asgzuzdvhrrejqjnkg5qfeynspuwzzrl3sr7seqxlwkiemnrpsrzyd.onion:8333 -z3hdtpvmnaz2izvnlopzmfgdb2synsomzgy62h7vlxvsn3yqhgufqjyd.onion:8333 -z3hgdhj7zxtih2gkjlnex6occtzw3tpd6f5eobwrntrhxtiww6ke43qd.onion:8333 -z3jl2izfxwfmqnbbrac3tustn4bngymj2tia2sn7nuyconbmjskedtyd.onion:8333 -z3m3a6wii62jc37c2fw7huca7mu4eywnssindvhn3hrh3t4y4kwj7dyd.onion:8333 -z3od23fobhkvypxarneq3fqsdsksjt3hmujnlaiwb65hdwa2n5xdjiyd.onion:8333 -z42np5zjd3thnd54h5n45ibynz5vb3flbgypt4me2c3bnvntn4rsgryd.onion:8333 -z4d7f4dvqutzvvqkmj35znzpyorroqg53jhbft34gyk2h34wzorv2rqd.onion:8333 -z4gvqymmj5jmg3dnao7k3vc245pzepqcrevzyh4s5xn5fcc6ape22sqd.onion:8333 -z4mmpbj7md2ljj2nzbk5b6stdromp2sxhysdexiq6kjqp2go2yfhlwyd.onion:8333 -z4pyvdupcieuqtzvhh47sbiahdyegvpgtwgfmlvfsrm4yj6g5mt6cgad.onion:8333 -z4qgvajgk3tr6aomi7zkpiilx5xb6tvavupvw42sgjf3bfqrgwk4tjyd.onion:8333 -z4rgrsudz3wjx7uykg2kmcadwixklibr5b4k5nulwrpxcjkasu6gnjqd.onion:8333 -z4s6g5bqdmo445vu2i6tcm54zjypfhl5uwnxqjq764bbu5h37gkp5gqd.onion:8333 -z4zr3v232rayjy7e4wuxxez2blz6p6apyv4souxjztqnv3mvaytb4nid.onion:8333 -z52bx6657mva3yjtrutjhxojkbwmrmndk3r3nptxc5xqz3nd62frfoqd.onion:8333 -z5ecnh7crpgo54nfll6qbwl4ybvfbq3izazsdu3pp6zqkam47nuux5ad.onion:8333 -z5v63i7lvhkfdqcex3ioeny62glxhptowtrfof54qbl545mlchkul5qd.onion:8333 -z62kddfut74o5njyehkdlj4caa6yg5orz5lznaccpbloqq2siiwbtayd.onion:8333 -z62r52qegmgv4otygobjdsubc6jffaei23he6n553akc4wnf5ryur4ad.onion:8333 -z63d77gd7artekfeamkqycni7tzrkvbc54fqr733veuoaqx45jwmytyd.onion:8333 -z63fpitzdw3ot62wtxtindh5334uatz2flxg6ronyy6jwx2ztjs4meqd.onion:8333 -z642d45aauehr2ycmv4ewv6zkwjlvlhwf5wlueuy5ynpu4qmffc7utyd.onion:8333 -z65lbxuvo5x36vuv5rgwgyoplqjzzciwvb2whvo3tlghzhp6zij6grad.onion:8333 -z6gr5c5yrp5seqsw73b2pkn3i4aqd5idmzgidjchjjm7f2hdgfkl4fad.onion:8333 -z6n3h75u5kkd5xkqfwbqasd2rekxams3jinrrqaj7p33qdxq7fdlmdqd.onion:8333 -z6n5kkyabl2huqtcp332n6xbo7kpilcw4b64govztw3swtzulgtxcjyd.onion:8333 -z6nq6lkmjoyjhqp5j3tg2gcjq4e3hgduo74unmtmnybd7a777hp4asad.onion:8333 -z6nuvxnjicev3v47o4vxjwakfz6g3jvyo3l4rds5qqfjptqie5re27qd.onion:8333 -z6okjxmclwc55pbwioqx5wyua7rjobcmbttpte525tlt2gexjcjtr4qd.onion:8333 -z6qmf32mld7uqjmx6hroqnkieerstp3vle3u3do6odxig3ubmv557qid.onion:8333 -z6s6t6bi4llpuod6rnakc344wn3h6ejpfejxrkjohjjy246shwfd34yd.onion:8333 -z6soa5spkni5ze6p2xg6lnehu3d7hnqn5ddiy34jtedwegf4syqnnaad.onion:8333 -z6t6fxwhgndvi36vra6d5duaryx2m75v6a5yoz3cqjlj53ko4wm7fhyd.onion:8333 -z6tmafvqwf2sd4rchnafg4urcug4xpkylwls2owruyifaduaeneyqkqd.onion:8333 -z6u4s3uz6bxke3tyibyccbg7uaxt4cb4dued3cu3pbjw6frqc5nil5yd.onion:8333 -z72rd3arkarr6eehucg7rrkjmvqnzdbjmppfk7zcvzd7jqrvisf7rpyd.onion:8333 -z745wkcll7vkkrx7zamibvbyqjtcp3y7wdz5kd33gijxfz54cxzg3mad.onion:8333 -z7eb2xkiigjdfay4ch4pubeqxb2jwyzdb5fo5owkbteyhefek76qoqyd.onion:8333 -z7f7lrvup632wkbzinvbkyyrhmguaf4fzt6zleiynk2vuvwdwt6ysnqd.onion:8333 -z7g3tx3nucmd5ozvs7wgq4i2riiufxlutv2usowr3p4lixfbx54fc3yd.onion:8333 -z7g4iekn3i7nliiowlt3ek7o6xlhi5tv2hofycacjqkpeoijghmiyxqd.onion:8333 -z7j2lcfj5b3isqznsb44ivi66lwmidcfspmvdrmhbfuyub2h3wbmnkid.onion:8333 -z7jbbwkyza6e37iqos6u7ln3nedom5i3dcnowdscr7wfj2xygre47aqd.onion:8333 -z7jtpaghm4na5po5p27fwbdh2aq3z4rkpwhhzemlrhsoefru2z5eyvyd.onion:8333 -z7m7rmzhol6swqnk6l4sadrjgxwnggt5zwgp2jx6tadca74o5puyuyid.onion:8333 -z7mcuih5vw5qob6o5qg27jhozuczpqx5lmzl2ghfxra53tov2h5xtmqd.onion:8333 -z7rxmrmvtsbgrrwwh4k37bpkk6dtu3aq7f5d442ys75nepy6r2q2xaad.onion:8333 -z7u326iowflnv6tvy6uiwwkusx4vat5gdaxwamcp6jd2we35ih6zplqd.onion:8333 -za6k2u2t22ohdrpqbirjhl75eadxcjvnqfkl4bzeygbnliqsc45gplyd.onion:8333 -zabx7shizdfchrfthsjcuyypqy473ni23ebi4aedow4bg5c4tl4cxbqd.onion:8333 -zac6qhbqbb5yo4rvcsmbilp33odkzfwrftwma4yo5hor4brj4d3ksiad.onion:8333 -zad5dkykkoelu5tdj7l7mr24pdf6eos4o7cbs5nvx6bcg5443eqwaiid.onion:8333 -zafdafmd2h6ue2pmuj25chhmkqad3jdcxwtaess2opxkrroopwdqfvyd.onion:8333 -zagkhagdzvkgpuo5znflvxcqxal5tweg3vsaoaonsvsl7r7orhlwshqd.onion:8333 -zahrvinucuxpxu56h6nkiiw7cvutxrua65l4jynvwkzt2bzmeuvdpuqd.onion:8333 -zalrhwuj5j47tntffl77xrdehzfwq7c7duhaq4jwnq5vdtdtajwiucad.onion:8333 -zaw7gnlyeqrlpgcmsp3e63anveudschhifaaezu3web3z6pjjdtvviqd.onion:8333 -zayfuym6j35mxprdsm2x7pvws2vyaoinsomdbgrqbe22rcc77j7jtnqd.onion:8333 -zb226sk3eljxccaswfgouu6mitu43sf2dan4feygrqnlvrot6z65oxad.onion:8333 -zb2qixzmsethowd6fqnwikvp3yeeeo3zvhgjmq2yb27tfslscgkp2zid.onion:8333 -zb62u4o5qzst7rzjaq6tafgzoybi2ncogcjp3sf7zbto7b2xmicwvyad.onion:8333 -zbci2c2pkku7hwg64ek4z4cbyn6o5bnzpzyriqwjckzgs34xmu62szid.onion:8333 -zbmhiorqlldelgniyhwogswpvrlcdjqxxcfm6vulenrpwiadvv37anad.onion:8333 -zbnovu66ikceaodzrkpwww4vop6iwvtebbeznngo2mtjkikwknqzgrid.onion:8333 -zbwbqxytihkvupc5zhezoh7oibfb7bopfcw6y4qbhh2kugnsw6zur4qd.onion:8333 -zbwpgu4z2lfuto566v6duz2qw5kkyvor37rpihk244bfjzqiuohdcyid.onion:8333 -zc2c56k7hcdux5wrlpixrx6lfutylfamr676tu2nr5z2vf5gwoyzrnid.onion:8333 -zc4l45jx3txlag7hduov4su5kl633sykaw7guioejg5pq2qyuescabqd.onion:8333 -zcc4wsaenndkzqdp4xsfzn6ilsdhwzpqiswumdc22dv5ejejec3o7qyd.onion:8333 -zcdv7z3vetrpeo7souyie7u3vyy6w43cuautaogldhs4n2fitytsihyd.onion:8333 -zcezifa7mmgv4voul4jf4wbqmr24djgrskwszktkt5hihywblltpahid.onion:8333 -zcif26i4yzp53k3uedswyrqkdmsmkflpmclmasdo6hat57pqjpm2omqd.onion:8333 -zcnl5vojc5aufydmssv4yxeotzeqpvyoxyae4kmoskty77j4dx4aykqd.onion:8333 -zctnwv5ln3yktcyqsbgie3qcee33x44b5quhjdq4zwjprl75r3snduid.onion:8333 -zcugrsfyxb3y5ucbdndifvt5ilp47a2233sv42ryf2cvzoncrgo2mrid.onion:8333 -zcw6xk4bfnl46fx3mkrmlnknbwnpssxsp7hlllj34fdrkutzts6yepyd.onion:8333 -zcyumipuaiotm5fhffmhit3ajzrgqihhibh73lvjo5hdt4aituudguyd.onion:8333 -zd2mgisets23i4mslxjl75froqjygtue4lnoq56qk3ohd4qcxpop7pqd.onion:8333 -zd3fxn7nwlj76qyjseubm4o2gs73jv2g22px6t24z7p5oeogqe3icyid.onion:8333 -zd7irysta3wti4efbjq3di2jfv237nhwotupj3rtufvvav4e5umtkfqd.onion:8333 -zd7uq75dlcseq546lmbqymh37cninokajwkixpvupillb7fgpqgbwjid.onion:8333 -zdi46azujxcjqa2wnvdecld3bdkps5erbodcvw2mn424gk2by5mterad.onion:8333 -zdm5zxotwdsma3jvij3jmlke5wmblwy7qa2kikfctlzltexx6l35u2id.onion:8333 -zdn24r3iovbxfkp5qx5ng7ribn4cqm4v5ers4olnbzugyp2gbhd56yid.onion:8333 -zdovdneke7oxtxdnee7f43vcu5mjzoa5m4bexpxgvopa5kaxyrcwa4qd.onion:8333 -zdovy6gcj6nrmxaygnjqf3ym5hbd3s7h3irznsbrjmgdywd2rkj2m6ad.onion:8333 -zdoyjklv576u3w4paxyjb4jmdhx2id7xoqkd7zn3sspodasmmazbbpqd.onion:8333 -zdqon7u5ofin5gy4rcmkixc7u42xypwklntwceohpektisokskrn5gad.onion:8333 -zdqxfzqxbaa654nsngnaqdz3jfsfe2u4hxs42covbct2dou7z7jpa7id.onion:8333 -zdtchifs5gqldijr7vzcgqqaftlcydhatm57owdwzrgudns5vpdcx3qd.onion:8333 -zdzkcrnoctqhn26hjbngpcl54nmvozbodf4gwf7anfxjrwhjxgurrdad.onion:8333 -zej7mizjlb26qecppzvgyswervt7ov6f4x6fwrot7obvab23xsv5jjid.onion:8333 -zejyatwyaptvvubp6b22cpow3an47bsrve63l6rerkldmuwwb37b74qd.onion:8333 -zepqddw4zaqqawkx7aqezpqwykxmxxeh2opnl3xnq2i6piazcvyb6qid.onion:8333 -zeso2dbskp3curnpgug5mjyvhs7i6rero3zbqo5n534wccstcok6ywad.onion:8333 -zexnlgnfxldyx6leiqvyhuimrfxznjfjoko2ek6rdtu4dvwkvztfysqd.onion:8333 -zf4cm7bgv4qollcjcj7kpx4qrtqzcsa3q7sds2jc3mxu45gvazlts3ad.onion:8333 -zf4k4efdpcwsfyobz444dgdfnsa6tdbd6aor7p2s6mpuol3ladssb6ad.onion:8333 -zf6nwlrrtd6q73svcimgfp54pinn46hbcriqnqqsitz3fbibzmkev3qd.onion:8333 -zf6tbmhchmzo46lmhx6vu3smjj3y4hjjrv4lnwpa3uq7bvtjcwapmqid.onion:8333 -zfhx5nerqkerm3jfoq4763vlmay4pifit5a6a6jtcjxpu7t4galhxwad.onion:8333 -zfo72va3rnioxbhh4kuth4epqwqque74aehlonvde3re6mvhz4uzgaqd.onion:8333 -zfomias3uj7w6sai3ty3coxhnb6voldudbeyldgyedxqo6kfc7rg7sqd.onion:8333 -zg2yslkwabguckkqanyxwbncrtozc2fjivsyesrcd27xxkowkbcwnxqd.onion:8333 -zg7obxhb4c4j3dgzg47zffbetclv2so4foyutdxizfnedhdkhjzo2cid.onion:8333 -zgaubbm4h7qckt4pgtp5zawrcf6aazby2zk7aeo5xsqpgwsc2yrlbiyd.onion:8333 -zgegpxbr7z34gupenib4tuwywyk4nlevo5dkfg3jt6c2jw23len76qad.onion:8333 -zgjrto32gianyp6i4gc73nlilodiqyo2s5dkr5ev73yq4qvcjxkwycad.onion:8333 -zgp3f3dmwbnr7257rouxkgddijr34keobzrtk5gkm2dgfbw2bylcwqyd.onion:8333 -zgrpshddeijmdp34xfyw2kz22la4jxgwce42pupjp3bo6xtchsorrxqd.onion:8333 -zgvklnnz2avqcnyiffw7t6umb3is4tfthnkzbhnyfr76sjtwu5u35pad.onion:8333 -zgwclfbi25s4ta5hfiwylboeitti64xzoan5aewuqimp5j55nye663qd.onion:8333 -zgxg4d4jifuihgozqblrt3kjkrh5zhbr4uyivtrzf2khnbtbe4z3qxad.onion:8333 -zhabxolberrktnga2eixvhe6vmaoxour3ktd6jgjq3emzkgthsmaq3ad.onion:8333 -zhapnpxpk3lmrfsmhluytttodeosmie7yabywa3aaxmtkreh2lmeemqd.onion:8333 -zhdd42th33pv6qnfi7v3w3gddy3tlgu6pjo2bhh5ezuytutxhivbtqqd.onion:8333 -zhea7pvhuzw4cte7pkd7u6lwjyiqczxi7wgvzhfovtjd7qwdc24pleqd.onion:8333 -zhgdvhnh5zymbwrmd2rfjncparbxfiyraqh4imk6kl3tkltgccl5cgqd.onion:8333 -zhhkv5u7pxuu36y7vzu6wlbjpd3wftxfuadsst3ifs3q23eydmako4yd.onion:8333 -zhhxxlz3wvdaj4scdetokkqgs2ndmdvyfwq4qwrn3l3hv2iftlgsucqd.onion:8333 -zhrzks7gkdvyef6s2aogxxuw7iqheixmrdzgkqotpvl5bjz4vq5tkkid.onion:8333 -zhwmsba7q6vn4yfi63p4tc3dobsarso4322ynl5ofggjbyiozefttcid.onion:8333 -zhzpumb4itgdxy53chqowtu43ru23ag3f37r77ydjs3t5o7bookfe3ad.onion:8333 -zi77cxawtknqkjiod4rhf7gsughbvv2z6e7mg5kax465uc4vtg4cwlid.onion:8333 -zike5s7xtcgp6frbjgzjhcz6gsvd3pghkl2jin3sdasrek3vy7l4ibqd.onion:8333 -zip37ysefmcbnyqvt4jiag6dj3h45ie7h56hmw7ktheotkuagippyiyd.onion:8333 -zipzgdr2m6gmjfucup7xpertovt746f57hrgb7lj6m4rxeniem6zdgad.onion:8333 -ziquiv5d3hditb2r2qmt7hn7knosdcokxe3khj3kgn253l6cynl62zyd.onion:8333 -ziyp62u4xfsuljn5ae4n7jea7wfd6vfutket2e73bzrhpstozs5364yd.onion:8333 -zj55khmgsehm24efh4nmye7oao3u3l4tjuk5edghey3mt2ippfste7yd.onion:8333 -zj7jf7o4b3qztdorj2stojv4us7lzqs37fbubqpqq2wu4dxi3cxpa3ad.onion:8333 -zjdf27w3vt4rpyb6usa3r5yi455svyaha4qtsfwvyrmf3hmz5hckbwad.onion:8333 -zjgnxih45rz3kalgxvhyebyavcnohmoa3bcnl5cwkmq5pmbyypavqcyd.onion:8333 -zjx5rmakdzormbwzl27w4xcucehwiat3dnncoqdiwesbmb7dg4fpmgad.onion:8333 -zjy7d5t6rxljc64pvta3hqi6yxzfsnixtbslafamoxiiw6ptcmv3kfyd.onion:8333 -zk3cgisxp3uxevuxmbzbmqyhvkhezspeydo2bmhu72b6mw2kl6v43fqd.onion:8333 -zkc2lid246a5jr2dpxtvmtu2tfiwt5dbry3xybu22b62vguco5a4qvid.onion:8333 -zkisbl3pv7dsz3szdawti4r7mhrhssqxf3uopi3vrib5dpt6u2u7ckyd.onion:8333 -zkjnuuenigzhs6d5y62jct4tira6fzijqx2k3yzsdsyulut6ywp5muid.onion:8333 -zkjoev53w4e547zot35onpmij4fiube4aomnysttqtv576zdr7wex4qd.onion:8333 -zkl2fsiisu3cyhhsua7qlr5afhyvmfh4qmapgubioyhoepqdb46jceqd.onion:8333 -zkl7x3u7365zj6opig53dxtty7ctw2ijidwa4lbdbhcv3wkld22bvxad.onion:8333 -zknqouk6z7g7h5y7rmycqb6sgzykylbbfpvf5efmzibww377iminltyd.onion:8333 -zkq4fgcc4bxksbsi74pjwjfby5tdwn26yhjnmewy2qy6a3l5p6bnaaad.onion:8333 -zkr66xkrvecgu6jkyan6nxvtefynf2mpsls5csvf6lt6ltqvoscw5yqd.onion:8333 -zkxe2fnm4tsmbu4bdge7i7j2cesfrq5oznfzobf4mwtejbhenp7ubxqd.onion:8333 -zkzj45moxjhjvrzqweh5g3iyucdb2qaqby7vdtmlqbvxmm5u337aglid.onion:8333 -zkzj4uhvvpav6ee7djkfj2uem6tyswi7idzupkozspbgr2kfvrk5biid.onion:8333 -zl27cum3gly7nfhwl7ulnob6pyichpxglnss4ffqv3terkquhf3dm7id.onion:8333 -zl3dx4nswje7l5p2fgvypve5wugfqtcru2ud55qo77tqdp2btm6kp3qd.onion:8333 -zl4gt6uafawn452rlqb4w2mujut5tjcnq4ahdr6ucdyeu2gtzlsk2jid.onion:8333 -zl5voqvgyf7deglpxamz6hpg4bierfngqsmmu72wpeut7toja47v6bid.onion:8333 -zliat4frxeuirx3nbijcljvgr5wembicg26fdpgda4pnps4oguaobmid.onion:8333 -zliy5o4uqgpqj2nbgyadqnlomnjtmdlwoxcuduwcfavzsguj4z4iwzqd.onion:8333 -zlkwqytpxbhkg4umwpqiynz6niefzqjbiwzryg2zpwwmvmw6pmssngqd.onion:8333 -zlpztcqey4osd3omtpsm7micrh6jrxuqzeeendpngk25iyfhleieekqd.onion:8333 -zlx2jkuv2iuzffo35hc264rnvoimzccvtlljdbmut4es76qe5pnvs6yd.onion:8333 -zlzhg5hipy7nc4ulsaprgro53f63mjj7je7m5xptgkksibgvbc6r2fyd.onion:8333 -zm2j2k2nl7pug2amadjkrcgs5omdnxctyl7b6kmlywsphcfl6c22gtad.onion:8333 -zmfmdmzlsyy7owe6vpgugvdq664vjhluqura3skjlm6fzpgqe6udm7ad.onion:8333 -zmfmmn72dg5jjkovy4jt56c6btg7pgp7wmeh547zlvavwmlbrbsl5yyd.onion:8333 -zmjncrrwtui476nyn6sqbp67bvgdhotllq33vzwygasumv6d2us64iad.onion:8333 -zmmtddrew2mjtghs7zjiyi2eelmyss7miyj2axzwfgnmvzthx7phevad.onion:8333 -zmn3jyv5a2rod2udnreygi6uan4zq5ul4mhewyfyrf7a3ury72bycuid.onion:8333 -zmqvv2cdxjj3vbclq7l6rfdmjegmixwkxsnzzd6qezwp32vxkr2cbiad.onion:8333 -zmt7psgtnnqxk6tibhvwkdfuhtgtjatz6bpoyyl4ptuv3u6ko2b5o5yd.onion:8333 -zmtd72b4nsa22ocez2hbjsxxrdfuxxyghg3zjtqjob5sgnjpustat4qd.onion:8333 -zmuuhwxhoa6h53jijpb6mczcvtxhw6zyjymm53dwzsbmkc3kkv5v64yd.onion:8333 -zmvriguathsanquofxml7kgcda4tkihm5qked7a6ntbqk7rmz7qadkad.onion:8333 -zmvritlexdmgatfqjlexl7wsx3lmf7y3qxe2kqeergb7ntkfu4nky5ad.onion:8333 -zmyavuyz774c2fo3eb55yokivpr7qfxdpjy2t5wpeygunhulck7yxzid.onion:8333 -zmzjx42yxlpepdgya34rvwb3wc2peggturiedmn4sfjltgy6gjtspsid.onion:8333 -zn3gjkpqkajav76kaem2espqt2bw6ggfvmn4u3gmkonds7pqd5heqkid.onion:8333 -zn3mj2tggwpbzzkvtsovkrbdshbsvac7n676hbi76r72de2b4gknpdyd.onion:8333 -zn5purhx3rnikkks5tx4scnjlhewwll3uzcs4pgde3qeqawof3jefhid.onion:8333 -znaiehv3qrtloxdi5rkbs4eqpmuveazuftob3sqzw3ta5pyakuwhx7qd.onion:8333 -znbv4cupk7rrdk4rqi6xncbouhscxnqdlbxtltp7564isfv5vtbyu7yd.onion:8333 -znc4xhwywjqejoioap3ssxvtsdilsc6i5o5s2rnp2ecmxqe6xe2nh5yd.onion:8333 -znea5ol7qgniizv3og2gfcbxw2wi4qhk7dfkdlt7bbxpy5aflljygbqd.onion:8333 -zngxgkdgkqpfyepa5cvxlaxvlyluzdryhzmviar4ojzaduxw37hhdmqd.onion:8333 -zni7kioacgsy5haqiftnexr74sv7rzvgy5o6lmz6dy26vvwg5lffioad.onion:8333 -znlvmmj4dvpju46kbb6mob4kufyf5a4qivyygmjj36kymbaa4nzi42ad.onion:8333 -znmgbi6qlwwwdlizjxsc6eujnfwgytufu6guo67b54av4y6inwgxllad.onion:8333 -znmwoazdkcffprail6h4p4opy7i4zqomhpdxe5l5nc6ejqagvt4i7yyd.onion:8333 -znt2jb6nivjgl47s2gdcgac3merqjfq5h2n6x6mbjegx6fumtl2ownid.onion:8333 -znvkqu376ienu62x5hprstn36jfqxospcnfhpc3kq5quwcd6436pzuid.onion:8333 -znwekshd4os5a2n222xrllgjuyvsw7hsb2y6br7pkwjatywk5lerbtid.onion:8333 -znxkxyd564sfftgjscsmi3a73jsazxwhsneix3bgto4suyjx356xewid.onion:8333 -zo4fczw4drgcbsumtgmigjkiso4miz34ltauajaawqmqoa6oxmzy4nad.onion:8333 -zo5jasvz5qo7pkgrgn4r45twdic4zake6zpjfemj6x2ioxcwvs7yzlid.onion:8333 -zobj27bempyxsigdvawc7foivyyuek73hemep7zf2tajof54353ok2yd.onion:8333 -zodjfmegrevmjbppq2t46iluruefbgh3b46tbrl2s5qkprvbetk3euyd.onion:8333 -zofseltpp23n2xb6fsmfgkwgqggwhrelxmt7zq7toazybgehbs7d5fad.onion:8333 -zohxazkomcr5ggqlj2edu23zs6xiay7wfsrxuetrn2k2s5gwhwhcngad.onion:8333 -zokmgys3gsgs5oivjcqp3xiki25iexezy33ekzuratdz3j5unqpxrzad.onion:8333 -zosjvclhqzwklml43hvsdmupglajj5lfdb5h5frgym7hsqo25rwrbdad.onion:8333 -zosk6fx2a3mxkfaeayziiuizq3y3j3azzp4ylwyh76wq2sqtaenuwdad.onion:8333 -zovm6wkattzmxc755cgqqd4sxugn3jaxw44izlm4yfpot2ucfeqnukqd.onion:8333 -zowc7rklhd6xhje724xomkftwimuihacwcnxkt7vhbjpvpkdahvlhxid.onion:8333 -zp3vpkpcfdx5lxvnuellqaf5qdvhu4luf4zqfx5xjo2dge7cqsxhsxyd.onion:8333 -zpgobpk2j2suauhuzfmh4iiz3y2zhj3xvb3g2t4a775t72stt3majryd.onion:8333 -zpgybnbaxfvzjeus7qna45zchxdkekjpk5webdkeqtxfwcglgogm2vad.onion:8333 -zphjbml3fqtbez63bjvd4s552yc2xebitadkpw2jon2qkbapbiltijyd.onion:8333 -zpnoo3qordv4xj5hjynkssu6wechvup6to7pamrgbi4ljmfugjyzwwad.onion:8333 -zppmhj76a6dyjch5qtubosxcyvtwjnb6zndsfywxci7dy3vc6lbfusyd.onion:8333 -zpq2nzcnlasmy3rmwtmaybav6t7xfrvorqqdwntnbgbxqujyy3dkwlid.onion:8333 -zpqvo25bxu4n2u3mh2pdzax7wmpsitd3qsszgw2ye3mpfdpjbg52kgid.onion:8333 -zpx2tq27yviwzbpc4nyjfqtlhigoa5k7cwl676nft7bkajo6jq224hid.onion:8333 -zqlwzzfzdoacgngtsnofmyqetag6o44f5r72opj733y434b7npnb4oyd.onion:8333 -zqq4g2eikcfgls64ffstsylfbqrfstm6n2otvrsbtvvjpqwgyqdnmbyd.onion:8333 -zqrj4fhhp4mq5eh5xptzcxjzpae37brkdn3voz32qsohl6noijygdkad.onion:8333 -zqrwah6dn3t5fuj7ohlyka27zzopduhxy4wyknfrtqpx4sykece65fqd.onion:8333 -zqtyvr7h277x5rxin6rhsrsbhwcfsyyiqgghpk6jlbewej2v3tn27yad.onion:8333 -zqv5nepyrwezkym2ba5s2sskmi2qck22snw2rygeke45bxg2o4vckuid.onion:8333 -zqvbnqwwhtoux2sxicng2blfiowk5mvty7c5xnssxwtlsjzalhg3zqqd.onion:8333 -zr222c3ybuqxn6a6piydvfos4zjnaklfgh6kofmujmolpiprfw4z6vqd.onion:8333 -zr6ffisxxo4gelmkoyb7izfm7ehjrbqbnzuguw34to34bqhxeeqzzjad.onion:8333 -zr7sqclimv46jdnmmeazqrhflhiqkhhrz5i3ed7yvyue63swk3qkjnad.onion:8333 -zrrfr5sr5wrgdt6rn44cxnotlvwe7cl67rgssw5dwsax42evokdaw6id.onion:8333 -zrrhgs52ftlylshuwp5e2uesgqnwct7h6cqhzofdduwoi4sz3shmxxad.onion:8333 -zrt3rg4paxmo24ucd56eehl7apindhbubq3ej3q5nhr6i72jv2eznryd.onion:8333 -zrvsjjrb3lgvmeftz2vfjva4pl63htmv5qyviq7zhnfmlk42evrxdpid.onion:8333 -zry2rqlcqf5p5e46wc6nmtcbt5vd45mf4hyf4nxlqogckoniufdjklid.onion:8333 -zs47b66pljpz4ahompanciv73xtztnnzkx4wjklt6hh4drsge4m26iad.onion:8333 -zsalwutefh6m6x6yxccbhulzrz2bmo7dzu2ggu4hxp5zv3xx2j642dyd.onion:8333 -zsbzferezmnyxhpktxtccn2xxuggmdzdnrza7pqjlnwjorgx57y2acyd.onion:8333 -zsgtoyy2svehhfba345dx3dazp7tfdio6o34zxlcgylq6pi67gjq7nqd.onion:8333 -zsi55x2nvjc4oqrpzzopkneukb5fudnm4e6drao4x73lf4zshhcvllqd.onion:8333 -zsipwsjpm4f3p6ueczh7lqei5rp3cusl6t4d6nntnwxq72hori5f7jqd.onion:8333 -zsisadra7jlxp5nhec2vsjwspvvnk6jemjxk7zn7arypl6cm6dy7mwqd.onion:8333 -zsr43xqj6nsrqh6qgxghadctltwytnaw4zmlvx6exqybt2qdt72f5yad.onion:8333 -zsxgefpkofjc3nti4qusk3pdqcfinkljajlwcb2cee2tduxltxbmrpad.onion:8333 -zszufrszpweaoysubpdnqparmyotjnev6nhhcnejhjjftu5sb55kesid.onion:8333 -zt6gkop3n6aggrxucnaqp4yrjeu6htwvuy2nyn3vadjjrodwxfhfv3id.onion:8333 -zt6hvzyoalzm4a576drn7yfvdetdvzwwouvfz435wzrf5pcnxqxplaad.onion:8333 -zt6v7eqh7vvlwy5kjzbdfgkw3syj3nnhckyghlzgmwwfccxvyfusuzqd.onion:8333 -ztcmlrstdkp7coheeolpwj75gp3imzgiw26xnoiucquwhxxcofao63ad.onion:8333 -zthmey4ueoutf7q36nwgujxu7hq76s5ifbtanvze4mxq2s2xq2cmjwad.onion:8333 -ztmwsyo35zkogpftujm2o7oilhucjxe3w6bjagsaiwtb2bu62vgjptid.onion:8333 -ztou4ytvgvpcakjaje2c6l5j53rxcxes7qhkerszi4haffxfpj3kdnyd.onion:8333 -ztwryklhcnfoeck4qntt2aitoilit2cmmr2geyqo6cjc4nwr7jlludid.onion:8333 -zu3ekh3vtqjfnxqjqlmnq3jbqlg2zum4ehgirz5cggwe2thjmgkz4cqd.onion:8333 -zu3yh7mvqw342e7qt5amwtwe2btjubi6t75k7wgcpsyoicsnpgbgj5ad.onion:8333 -zu76ecbahyc6ofjiiutna6myxmfdcsuhcrhtgpifbw3vfo7njd4b5tyd.onion:8333 -zuaotutv2ngbf5ot5kvz75uehbh5e2j726fglhqw7omk3b7xnaastpad.onion:8333 -zubmiztmnfy2vqowqmpyzbqtf2a43jgazsex6zlxokhfmnzmi3rht6yd.onion:8333 -zuc7sobx6ttj7lswk32raexasfbxc5kd6a3l6td35srqzkj3emsv4uid.onion:8333 -zunmnr7czrxvfjgxtvkwk6ziti5kskx4fi3j4dzahhdljfsqtz7yeqyd.onion:8333 -zuoml3m3jdkoh5bdrwfecnew5f4mrlcwhmhkn456qsa72cp274pbgtqd.onion:8333 -zutyd7pzkyejctriyr2lqlrex3arkunntsdjo3kgw2qj5u3fj5uyusyd.onion:8333 -zuzdl7nnjhy6inyqwsc5i7fae2nregm7wnyrtolaxhi6oiufyc7l26qd.onion:8333 -zv2nusexbcrncbutlcprevwhvbtqlyri3stjwmgl23x7fdqkmae6owqd.onion:8333 -zv63heoa7jstwhq3wg2nibip36bw4icd7jphccy3li3nut7gp2gojqqd.onion:8333 -zvbhycudpglrdi3sk7yixe64eknydwzzisc4n6xmxwhb7xyyzevc4nqd.onion:8333 -zvgutw2u7tu4dx7t25leghdp6j5n44u464mmoypafwstayp6ggabtkad.onion:8333 -zvjn5jscn7jncqss44uh53gvi6b4eycjqp42t6pv46bsr7gine5cbrqd.onion:8333 -zvmxfy5z7nxeknglvpbh7rveoppkyvvzvnpwxon2kgkepafnq4igheyd.onion:8333 -zvpcm7eemfvlklgqio3fgzcwa2vukg3n7caov5itik36kdua6mvm43qd.onion:8333 -zvzirfk3h4hk52j4u254y2np6ve2xttd2nugiccsqw2liiw7aqmglkyd.onion:8333 -zw4olgpxujj6iydkmhuxbx37b52syl5bm6embyebesysep2ignp2dgid.onion:8333 -zwbnovgpo4qxidylubpdrhxm34t23iwaniawfshiqrilttwqjnnlohid.onion:8333 -zwbqgh5le73aurfmbwf5ivjb7ycemwnjiq2jnq4sqz6epl7rdtd6rtid.onion:8333 -zweiy44ngrkfzhnaoqov3fopwqd3uhwsen4v6sdyf3ynmhlpuluvzeyd.onion:8333 -zwg2cvvkm37u2hicwbjasqzdqdhcblwvtzsulmz4kpbebf77jheiaaid.onion:8333 -zwrp2kb2covbrr3xdz2pxr6gg6ndnhpcgfvjkjr43eudnl5aswxgvbqd.onion:8333 -zwsapfrsxzsomsoty652jifwii56st6fg7bs2crr6boveh5o6npl7vyd.onion:8333 -zwtjkx5blzs4i6e7hwfeekcwufdl2lba4j65243tvkajder5iodkavad.onion:8333 -zwu3ep3zqki62b7ldjbsxk4dm4rlppkxpzzqfwsfvkoihxltm3y4qaid.onion:8333 -zwwpbfpymszcmkwlfozzl26m66r6n7xzgnw6bs4nf3pypqh36ya2w6yd.onion:8333 -zx37fw5b4eatt3dekaefun3ln67agpt7oqobeacvyq4keurbj26azwid.onion:8333 -zxaujdps5ce6wvk6ykbfquygtbli4ecvpokj7oyfxjqiionn3u3fdsid.onion:8333 -zxbq3k7hwswo2f374ahsmlgkpdj7ju7pyygurkvzqaoh35vmxleewsad.onion:8333 -zxc2bzuqdkippxthxbg7n7e3lznbcnx7zyitlhwvjusbwr5v32oxueid.onion:8333 -zxcnzlo2eigfig66vxyx43znm66a5i4ieuiosycgddgzdff4vhn6zhqd.onion:8333 -zxk4bqrede3tnlb7ymjlsoyupc37r2vqe647otr3nczqmgfeoyiu75id.onion:8333 -zxqdpu4gmvn5vz2kdld6c2swqdzknwh2czwsw55vx323orvtk6a6igyd.onion:8333 -zxqe6efq4odzd2mvyeglqto2cfggagoicgcvlvca4mxycg47jei4uxad.onion:8333 -zxzfz3z4nbb7u3ifcv2p5xenzpbnzuuezelbbjcfrmupxtqyoh7uhyqd.onion:8333 -zxzqhfwi3gdheuxmzagp4aw4aks6cii2llljapcvqhtqrxlksxddo5id.onion:8333 -zy4jeshnpx3i3wjcqrb27qcea4qetpez65wpocat5sqncz24xeo6sxyd.onion:8333 -zyccgvzokepone36ulu74l54ad4dtqv7a2bjzcvopj6rg5xhbc7ihjad.onion:8333 -zydziohabauwybhbqkegn4d5r4257bmfain36fatcxdbj2nw5zoa5vid.onion:8333 -zyetfkanxicfp6tt5tegkxlkoz5rl2i3zsc6hyyqizahywbktezfuwid.onion:8333 -zyjfoui3hrpsw3fo4owxrztclffqhr26wdedizvz5xvlgurgixit2mad.onion:8333 -zyku4bk6pdifla26hympigytlwsx4htajcn43hhobdbrv4tfojv3snqd.onion:8333 -zyl4kfejs3t4vefsvuqrqopboxrmztuun62jick4uh3wpu4mw7dpqlyd.onion:8333 -zyphknlr4ogrknj5t64qya246kdaasgirn4iercvesggqplzzxsisbid.onion:8333 -zyrodumrgvgpinhygbi5molpbhl6ndfs3lwtt55pumd6wy5k7nb3esqd.onion:8333 -zyvgumk5pcanh4zk3z72glefxgbd4dpyhsbzvqlsp2gspaw37lrhjyad.onion:8333 -zyyefl5unnw7lnrjlgfyvnytw4iy4n4cy5bbs2nudjh7wp7psvefmfid.onion:8333 -zznngqwcp6g55wkjg52rzeogk3fcdpopyl3zprh2fz266nykv4sqveyd.onion:8333 -zzntdfpcb3spf5pb3g2gczw2njmhwwksgxt3twbzjhbaisihg7h2ywqd.onion:8333 -zzsi7brufwylb52w3bcbqvp5jx6vribh6geiqfy5jhxpihqjjaox7vad.onion:8333 -zzthz644hdjxn3d54xrfe7snnuyhsx2cguy4kqb6dpc5u7aun5lflbad.onion:8333 -zzuipjogcfvs7uyfhfgesehon6viegga3sc6c6265n235pqmkwyqfmyd.onion:8333 -zzul2xvyhqvajnd6zfs2dzljoppx5lsp2xt4qad7256kpxrv3wzyiuyd.onion:8333 -zzx4r2yrkxul2kg2ojoeijwce3skll4wbkkjw5xprstn2o2xw6n74wid.onion:8333 -zzyp22x6ryzyin43pltkup6jki5ynboh6cwpucscx5a3md2tooqn52yd.onion:8333 -zzzzzzzz5bs2qnoijxlhxd3ibxipajesgprqlrxtpfbygw4zcaf6oaad.onion:8333 - -# manually updated 2023-04 for minimal cjdns bootstrap support -[fc32:17ea:e415:c3bf:9808:149d:b5a2:c9aa]:8333 -[fcc7:be49:ccd1:dc91:3125:f0da:457d:8ce]:8333 -[fcdc:73ae:b1a9:1bf8:d4c2:811:a4c7:c34e]:8333 diff --git a/contrib/seeds/nodes_test.txt b/contrib/seeds/nodes_test.txt deleted file mode 100755 index 2def8ae644..0000000000 --- a/contrib/seeds/nodes_test.txt +++ /dev/null @@ -1,29 +0,0 @@ -2yq4xcwzvb2ktyci5lpmb2q3nl6qqywb7nrf6fkcthha7l3tle2q.b32.i2p:0 -4g5uvbkvi5fvyditekvzajldtzgurorqjupuwtmymrjloq6cjm5q.b32.i2p:0 -f3w7soepsy7jqwf7dlo4ro2qkyapg2lrb2dkkvwfwuymgaqvljqa.b32.i2p:0 -nr7nozlb54xv3ozg4ksvcr3ofzfwfeud2n7xijywvt22ixzal7qa.b32.i2p:0 -o6j3b33bv26vthoqzjy3h7a3qsuqbtbe3ulajmjzsl43vaqyieyq.b32.i2p:0 -ocqipbbxx4paopgkkbnj234ie7opzrtca5gtiwr6oda3h32rzgsa.b32.i2p:0 -r2zdpkcslf7e4t2fmglu45xhfw5zgupthdh5pcewdo6jajumveda.b32.i2p:0 -xgctj4seo3ofstiymoyeuzq74bvddrbr6jtia6erodlf5va3cz5a.b32.i2p:0 -y5e6aqz4jkjjoeipoxwurzc2jrfv6ilvfbdqmjqk574maba5uara.b32.i2p:0 -ye3ajv2tgpq7jvvzzn5wxbtmd3txev3axsdla5bkpobeiwccyjjq.b32.i2p:0 -7ph7mrc24te57mvppajfkfj4mk7zuz4teukymt3wgpdpw6vpndeivtyd.onion:18333 -bkzo7mpxuar7rhsbiwdaxqcymixarcbdmb3sdaqtv6yb2svqttz2s6ad.onion:18333 -d63vf45ta4chrewnruyvypm7ybfxtut327crtq6qfyrvcwx434rli5qd.onion:18333 -efqfw6vjq7gpgyhosu3qf24hsshxpbhay426ccsgz54key4cvwund6yd.onion:18333 -gy6nih4pmp5esyvvnhlj6qvk7zkbjuoswkxffyiip3dbkvsfxwz5zcqd.onion:18333 -hwipziotclxg3ledn5yj5j6n6pkrgnmlksozzlrtlnlpguvixox7naqd.onion:18333 -i5gphw2d224tniqkjebxdwz5ygbbo5gcushoyevv7x7o454b6qlrzeid.onion:18333 -ipbzs2lbe7lab2xaikvkdkwxian6t3nakaoltwbshpevbszdvoyyjiad.onion:18333 -jjfuyj7krgzkmpxvn3b2j2hwlzkmze3ezy3ifwk7dnswwawgmzqhjrqd.onion:18333 -jnphftehkfstwbko34idxlpo5fdw6lromkmeukxh3xclthlstehpg4ad.onion:18333 -jrhpwqahjrj75gtb7gt23eve65x7bbawy7j4edhmgbo5nj2mkaeghbyd.onion:18333 -jun6gdmbgasr57bhr4zs3dfhc6pzpaw27nqb4dadbai7yrbq55zskeid.onion:18333 -o52y7fadtubr4tuqhix6ymrin3qzn7ubh5tewuuehw5wxcbnfj6yaoad.onion:18333 -rigfm3joif5lsl7b7yr6d6cvddukawykm7kgguzfwi6dplckyz6x7gad.onion:18333 -t6d6epb5ccbo4e66iaanukraxpjmqiqsz6poj5uvxu2ownnhcguygdyd.onion:18333 -test2vozlxfznmfyxzkulf3l6qe6dti5hqfjsxar5lml45cjnyeusmyd.onion:18333 -uxtmtmpkfaxc6zcxaxgydrukyd5jdrcp2m5oubpimijy44rnjuywijad.onion:18333 -xuhmq42du7dckfophyr2rmf75aqkp3bk6y3wyyc6jxw7jmpp66zlm3id.onion:18333 -zcep44k7unwjm2wxty4ijh2e4fv5zgbrvwlctzyaqnrqhltjfzrtodad.onion:18333 diff --git a/contrib/shell/git-utils.bash b/contrib/shell/git-utils.bash deleted file mode 100644 index 37bac1f38d..0000000000 --- a/contrib/shell/git-utils.bash +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env bash - -git_root() { - git rev-parse --show-toplevel 2> /dev/null -} - -git_head_version() { - local recent_tag - if recent_tag="$(git describe --exact-match HEAD 2> /dev/null)"; then - echo "${recent_tag#v}" - else - git rev-parse --short=12 HEAD - fi -} diff --git a/contrib/shell/realpath.bash b/contrib/shell/realpath.bash deleted file mode 100644 index 389b77b562..0000000000 --- a/contrib/shell/realpath.bash +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/env bash - -# Based on realpath.sh written by Michael Kropat -# Found at: https://github.com/mkropat/sh-realpath/blob/65512368b8155b176b67122aa395ac580d9acc5b/realpath.sh - -bash_realpath() { - canonicalize_path "$(resolve_symlinks "$1")" -} - -resolve_symlinks() { - _resolve_symlinks "$1" -} - -_resolve_symlinks() { - _assert_no_path_cycles "$@" || return - - local dir_context path - if path=$(readlink -- "$1"); then - dir_context=$(dirname -- "$1") - _resolve_symlinks "$(_prepend_dir_context_if_necessary "$dir_context" "$path")" "$@" - else - printf '%s\n' "$1" - fi -} - -_prepend_dir_context_if_necessary() { - if [ "$1" = . ]; then - printf '%s\n' "$2" - else - _prepend_path_if_relative "$1" "$2" - fi -} - -_prepend_path_if_relative() { - case "$2" in - /* ) printf '%s\n' "$2" ;; - * ) printf '%s\n' "$1/$2" ;; - esac -} - -_assert_no_path_cycles() { - local target path - - target=$1 - shift - - for path in "$@"; do - if [ "$path" = "$target" ]; then - return 1 - fi - done -} - -canonicalize_path() { - if [ -d "$1" ]; then - _canonicalize_dir_path "$1" - else - _canonicalize_file_path "$1" - fi -} - -_canonicalize_dir_path() { - (cd "$1" 2>/dev/null && pwd -P) -} - -_canonicalize_file_path() { - local dir file - dir=$(dirname -- "$1") - file=$(basename -- "$1") - (cd "$dir" 2>/dev/null && printf '%s/%s\n' "$(pwd -P)" "$file") -} diff --git a/contrib/signet/getcoins.py b/contrib/signet/getcoins.py deleted file mode 100755 index ad0059298e..0000000000 --- a/contrib/signet/getcoins.py +++ /dev/null @@ -1,158 +0,0 @@ -#!/usr/bin/env python3 -# Copyright (c) 2020-2022 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 argparse -import io -import requests -import subprocess -import sys -import xml.etree.ElementTree - -DEFAULT_GLOBAL_FAUCET = 'https://signetfaucet.com/claim' -DEFAULT_GLOBAL_CAPTCHA = 'https://signetfaucet.com/captcha' -GLOBAL_FIRST_BLOCK_HASH = '00000086d6b2636cb2a392d45edc4ec544a10024d30141c9adf4bfd9de533b53' - -# braille unicode block -BASE = 0x2800 -BIT_PER_PIXEL = [ - [0x01, 0x08], - [0x02, 0x10], - [0x04, 0x20], - [0x40, 0x80], -] -BW = 2 -BH = 4 - -# imagemagick or compatible fork (used for converting SVG) -CONVERT = 'convert' - -class PPMImage: - ''' - Load a PPM image (Pillow-ish API). - ''' - def __init__(self, f): - if f.readline() != b'P6\n': - raise ValueError('Invalid ppm format: header') - line = f.readline() - (width, height) = (int(x) for x in line.rstrip().split(b' ')) - if f.readline() != b'255\n': - raise ValueError('Invalid ppm format: color depth') - data = f.read(width * height * 3) - stride = width * 3 - self.size = (width, height) - self._grid = [[tuple(data[stride * y + 3 * x:stride * y + 3 * (x + 1)]) for x in range(width)] for y in range(height)] - - def getpixel(self, pos): - return self._grid[pos[1]][pos[0]] - -def print_image(img, threshold=128): - '''Print black-and-white image to terminal in braille unicode characters.''' - x_blocks = (img.size[0] + BW - 1) // BW - y_blocks = (img.size[1] + BH - 1) // BH - - for yb in range(y_blocks): - line = [] - for xb in range(x_blocks): - ch = BASE - for y in range(BH): - for x in range(BW): - try: - val = img.getpixel((xb * BW + x, yb * BH + y)) - except IndexError: - pass - else: - if val[0] < threshold: - ch |= BIT_PER_PIXEL[y][x] - line.append(chr(ch)) - print(''.join(line)) - -parser = argparse.ArgumentParser(description='Script to get coins from a faucet.', epilog='You may need to start with double-dash (--) when providing BGL-cli arguments.') -parser.add_argument('-c', '--cmd', dest='cmd', default='BGL-cli', help='BGL-cli command to use') -parser.add_argument('-f', '--faucet', dest='faucet', default=DEFAULT_GLOBAL_FAUCET, help='URL of the faucet') -parser.add_argument('-g', '--captcha', dest='captcha', default=DEFAULT_GLOBAL_CAPTCHA, help='URL of the faucet captcha, or empty if no captcha is needed') -parser.add_argument('-a', '--addr', dest='addr', default='', help='BGL address to which the faucet should send') -parser.add_argument('-p', '--password', dest='password', default='', help='Faucet password, if any') -parser.add_argument('-n', '--amount', dest='amount', default='0.001', help='Amount to request (0.001-0.1, default is 0.001)') -parser.add_argument('-i', '--imagemagick', dest='imagemagick', default=CONVERT, help='Path to imagemagick convert utility') -parser.add_argument('BGL_cli_args', nargs='*', help='Arguments to pass on to BGL-cli (default: -signet)') - -args = parser.parse_args() - -if args.BGL_cli_args == []: - args.BGL_cli_args = ['-signet'] - - -def BGL_cli(rpc_command_and_params): - argv = [args.cmd] + args.BGL_cli_args + rpc_command_and_params - try: - return subprocess.check_output(argv).strip().decode() - except FileNotFoundError: - raise SystemExit(f"The binary {args.cmd} could not be found") - except subprocess.CalledProcessError: - cmdline = ' '.join(argv) - raise SystemExit(f"-----\nError while calling {cmdline} (see output above).") - - -if args.faucet.lower() == DEFAULT_GLOBAL_FAUCET: - # Get the hash of the block at height 1 of the currently active signet chain - curr_signet_hash = BGL_cli(['getblockhash', '1']) - if curr_signet_hash != GLOBAL_FIRST_BLOCK_HASH: - raise SystemExit('The global faucet cannot be used with a custom Signet network. Please use the global signet or setup your custom faucet to use this functionality.\n') -else: - # For custom faucets, don't request captcha by default. - if args.captcha == DEFAULT_GLOBAL_CAPTCHA: - args.captcha = '' - -if args.addr == '': - # get address for receiving coins - args.addr = BGL_cli(['getnewaddress', 'faucet', 'bech32']) - -data = {'address': args.addr, 'password': args.password, 'amount': args.amount} - -# Store cookies -# for debugging: print(session.cookies.get_dict()) -session = requests.Session() - -if args.captcha != '': # Retrieve a captcha - try: - res = session.get(args.captcha) - res.raise_for_status() - except requests.exceptions.RequestException as e: - raise SystemExit(f"Unexpected error when contacting faucet: {e}") - - # Size limitation - svg = xml.etree.ElementTree.fromstring(res.content) - if svg.attrib.get('width') != '150' or svg.attrib.get('height') != '50': - raise SystemExit("Captcha size doesn't match expected dimensions 150x50") - - # Convert SVG image to PPM, and load it - try: - rv = subprocess.run([args.imagemagick, 'svg:-', '-depth', '8', 'ppm:-'], input=res.content, check=True, capture_output=True) - except FileNotFoundError: - raise SystemExit(f"The binary {args.imagemagick} could not be found. Please make sure ImageMagick (or a compatible fork) is installed and that the correct path is specified.") - - img = PPMImage(io.BytesIO(rv.stdout)) - - # Terminal interaction - print_image(img) - print(f"Captcha from URL {args.captcha}") - data['captcha'] = input('Enter captcha: ') - -try: - res = session.post(args.faucet, data=data) -except Exception: - raise SystemExit(f"Unexpected error when contacting faucet: {sys.exc_info()[0]}") - -# Display the output as per the returned status code -if res: - # When the return code is in between 200 and 400 i.e. successful - print(res.text) -elif res.status_code == 404: - print('The specified faucet URL does not exist. Please check for any server issues/typo.') -elif res.status_code == 429: - print('The script does not allow for repeated transactions as the global faucet is rate-limitied to 1 request/IP/day. You can access the faucet website to get more coins manually') -else: - print(f'Returned Error Code {res.status_code}\n{res.text}\n') - print('Please check the provided arguments for their validity and/or any possible typo.') diff --git a/contrib/signet/miner b/contrib/signet/miner deleted file mode 100755 index 813d11e74a..0000000000 --- a/contrib/signet/miner +++ /dev/null @@ -1,545 +0,0 @@ -#!/usr/bin/env python3 -# Copyright (c) 2020 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 argparse -import json -import logging -import math -import os -import re -import struct -import sys -import time -import subprocess - -PATH_BASE_CONTRIB_SIGNET = os.path.abspath(os.path.dirname(os.path.realpath(__file__))) -PATH_BASE_TEST_FUNCTIONAL = os.path.abspath(os.path.join(PATH_BASE_CONTRIB_SIGNET, "..", "..", "test", "functional")) -sys.path.insert(0, PATH_BASE_TEST_FUNCTIONAL) - -from test_framework.blocktools import get_witness_script, script_BIP34_coinbase_height # noqa: E402 -from test_framework.messages import CBlock, CBlockHeader, COutPoint, CTransaction, CTxIn, CTxInWitness, CTxOut, from_binary, from_hex, ser_string, ser_uint256, tx_from_hex # noqa: E402 -from test_framework.psbt import PSBT, PSBTMap, PSBT_GLOBAL_UNSIGNED_TX, PSBT_IN_FINAL_SCRIPTSIG, PSBT_IN_FINAL_SCRIPTWITNESS, PSBT_IN_NON_WITNESS_UTXO, PSBT_IN_SIGHASH_TYPE # noqa: E402 -from test_framework.script import CScriptOp # noqa: E402 - -logging.basicConfig( - format='%(asctime)s %(levelname)s %(message)s', - level=logging.INFO, - datefmt='%Y-%m-%d %H:%M:%S') - -SIGNET_HEADER = b"\xec\xc7\xda\xa2" -PSBT_SIGNET_BLOCK = b"\xfc\x06signetb" # proprietary PSBT global field holding the block being signed -RE_MULTIMINER = re.compile(r"^(\d+)(-(\d+))?/(\d+)$") - -def create_coinbase(height, value, spk): - cb = CTransaction() - cb.vin = [CTxIn(COutPoint(0, 0xffffffff), script_BIP34_coinbase_height(height), 0xffffffff)] - cb.vout = [CTxOut(value, spk)] - return cb - -def signet_txs(block, challenge): - # assumes signet solution has not been added yet so does not need - # to be removed - - txs = block.vtx[:] - txs[0] = CTransaction(txs[0]) - txs[0].vout[-1].scriptPubKey += CScriptOp.encode_op_pushdata(SIGNET_HEADER) - hashes = [] - for tx in txs: - tx.rehash() - hashes.append(ser_uint256(tx.sha256)) - mroot = block.get_merkle_root(hashes) - - sd = b"" - sd += struct.pack("> 24) & 0xff - return (nbits & 0x00ffffff) * 2**(8*(shift - 3)) - -def target_to_nbits(target): - tstr = "{0:x}".format(target) - if len(tstr) < 6: - tstr = ("000000"+tstr)[-6:] - if len(tstr) % 2 != 0: - tstr = "0" + tstr - if int(tstr[0],16) >= 0x8: - # avoid "negative" - tstr = "00" + tstr - fix = int(tstr[:6], 16) - sz = len(tstr)//2 - if tstr[6:] != "0"*(sz*2-6): - fix += 1 - - return int("%02x%06x" % (sz,fix), 16) - -def seconds_to_hms(s): - if s == 0: - return "0s" - neg = (s < 0) - if neg: - s = -s - out = "" - if s % 60 > 0: - out = "%ds" % (s % 60) - s //= 60 - if s % 60 > 0: - out = "%dm%s" % (s % 60, out) - s //= 60 - if s > 0: - out = "%dh%s" % (s, out) - if neg: - out = "-" + out - return out - -def next_block_delta(last_nbits, last_hash, ultimate_target, do_poisson, max_interval): - # strategy: - # 1) work out how far off our desired target we are - # 2) cap it to a factor of 4 since that's the best we can do in a single retarget period - # 3) use that to work out the desired average interval in this retarget period - # 4) if doing poisson, use the last hash to pick a uniformly random number in [0,1), and work out a random multiplier to vary the average by - # 5) cap the resulting interval between 1 second and 1 hour to avoid extremes - - INTERVAL = 600.0*2016/2015 # 10 minutes, adjusted for the off-by-one bug - - current_target = nbits_to_target(last_nbits) - retarget_factor = ultimate_target / current_target - retarget_factor = max(0.25, min(retarget_factor, 4.0)) - - avg_interval = INTERVAL * retarget_factor - - if do_poisson: - det_rand = int(last_hash[-8:], 16) * 2**-32 - this_interval_variance = -math.log1p(-det_rand) - else: - this_interval_variance = 1 - - this_interval = avg_interval * this_interval_variance - this_interval = max(1, min(this_interval, max_interval)) - - return this_interval - -def next_block_is_mine(last_hash, my_blocks): - det_rand = int(last_hash[-16:-8], 16) - return my_blocks[0] <= (det_rand % my_blocks[2]) < my_blocks[1] - -def do_generate(args): - if args.max_blocks is not None: - if args.ongoing: - logging.error("Cannot specify both --ongoing and --max-blocks") - return 1 - if args.max_blocks < 1: - logging.error("N must be a positive integer") - return 1 - max_blocks = args.max_blocks - elif args.ongoing: - max_blocks = None - else: - max_blocks = 1 - - if args.set_block_time is not None and max_blocks != 1: - logging.error("Cannot specify --ongoing or --max-blocks > 1 when using --set-block-time") - return 1 - if args.set_block_time is not None and args.set_block_time < 0: - args.set_block_time = time.time() - logging.info("Treating negative block time as current time (%d)" % (args.set_block_time)) - - if args.min_nbits: - if args.nbits is not None: - logging.error("Cannot specify --nbits and --min-nbits") - return 1 - args.nbits = "1e0377ae" - logging.info("Using nbits=%s" % (args.nbits)) - - if args.set_block_time is None: - if args.nbits is None or len(args.nbits) != 8: - logging.error("Must specify --nbits (use calibrate command to determine value)") - return 1 - - if args.multiminer is None: - my_blocks = (0,1,1) - else: - if not args.ongoing: - logging.error("Cannot specify --multiminer without --ongoing") - return 1 - m = RE_MULTIMINER.match(args.multiminer) - if m is None: - logging.error("--multiminer argument must be k/m or j-k/m") - return 1 - start,_,stop,total = m.groups() - if stop is None: - stop = start - start, stop, total = map(int, (start, stop, total)) - if stop < start or start <= 0 or total < stop or total == 0: - logging.error("Inconsistent values for --multiminer") - return 1 - my_blocks = (start-1, stop, total) - - if args.max_interval < 960: - logging.error("--max-interval must be at least 960 (16 minutes)") - return 1 - - ultimate_target = nbits_to_target(int(args.nbits,16)) - - mined_blocks = 0 - bestheader = {"hash": None} - lastheader = None - while max_blocks is None or mined_blocks < max_blocks: - - # current status? - bci = json.loads(args.bcli("getblockchaininfo")) - - if bestheader["hash"] != bci["bestblockhash"]: - bestheader = json.loads(args.bcli("getblockheader", bci["bestblockhash"])) - - if lastheader is None: - lastheader = bestheader["hash"] - elif bestheader["hash"] != lastheader: - next_delta = next_block_delta(int(bestheader["bits"], 16), bestheader["hash"], ultimate_target, args.poisson, args.max_interval) - next_delta += bestheader["time"] - time.time() - next_is_mine = next_block_is_mine(bestheader["hash"], my_blocks) - logging.info("Received new block at height %d; next in %s (%s)", bestheader["height"], seconds_to_hms(next_delta), ("mine" if next_is_mine else "backup")) - lastheader = bestheader["hash"] - - # when is the next block due to be mined? - now = time.time() - if args.set_block_time is not None: - logging.debug("Setting start time to %d", args.set_block_time) - mine_time = args.set_block_time - action_time = now - is_mine = True - elif bestheader["height"] == 0: - time_delta = next_block_delta(int(bestheader["bits"], 16), bci["bestblockhash"], ultimate_target, args.poisson, args.max_interval) - time_delta *= 100 # 100 blocks - logging.info("Backdating time for first block to %d minutes ago" % (time_delta/60)) - mine_time = now - time_delta - action_time = now - is_mine = True - else: - time_delta = next_block_delta(int(bestheader["bits"], 16), bci["bestblockhash"], ultimate_target, args.poisson, args.max_interval) - mine_time = bestheader["time"] + time_delta - - is_mine = next_block_is_mine(bci["bestblockhash"], my_blocks) - - action_time = mine_time - if not is_mine: - action_time += args.backup_delay - - if args.standby_delay > 0: - action_time += args.standby_delay - elif mined_blocks == 0: - # for non-standby, always mine immediately on startup, - # even if the next block shouldn't be ours - action_time = now - - # don't want fractional times so round down - mine_time = int(mine_time) - action_time = int(action_time) - - # can't mine a block 2h in the future; 1h55m for some safety - action_time = max(action_time, mine_time - 6900) - - # ready to go? otherwise sleep and check for new block - if now < action_time: - sleep_for = min(action_time - now, 60) - if mine_time < now: - # someone else might have mined the block, - # so check frequently, so we don't end up late - # mining the next block if it's ours - sleep_for = min(20, sleep_for) - minestr = "mine" if is_mine else "backup" - logging.debug("Sleeping for %s, next block due in %s (%s)" % (seconds_to_hms(sleep_for), seconds_to_hms(mine_time - now), minestr)) - time.sleep(sleep_for) - continue - - # gbt - tmpl = json.loads(args.bcli("getblocktemplate", '{"rules":["signet","segwit"]}')) - if tmpl["previousblockhash"] != bci["bestblockhash"]: - logging.warning("GBT based off unexpected block (%s not %s), retrying", tmpl["previousblockhash"], bci["bestblockhash"]) - time.sleep(1) - continue - - logging.debug("GBT template: %s", tmpl) - - if tmpl["mintime"] > mine_time: - logging.info("Updating block time from %d to %d", mine_time, tmpl["mintime"]) - mine_time = tmpl["mintime"] - if mine_time > now: - logging.error("GBT mintime is in the future: %d is %d seconds later than %d", mine_time, (mine_time-now), now) - return 1 - - # address for reward - reward_addr, reward_spk = get_reward_addr_spk(args, tmpl["height"]) - - # mine block - logging.debug("Mining block delta=%s start=%s mine=%s", seconds_to_hms(mine_time-bestheader["time"]), mine_time, is_mine) - mined_blocks += 1 - psbt = generate_psbt(tmpl, reward_spk, blocktime=mine_time) - input_stream = os.linesep.join([psbt, "true", "ALL"]).encode('utf8') - psbt_signed = json.loads(args.bcli("-stdin", "walletprocesspsbt", input=input_stream)) - if not psbt_signed.get("complete",False): - logging.debug("Generated PSBT: %s" % (psbt,)) - sys.stderr.write("PSBT signing failed\n") - return 1 - block, signet_solution = do_decode_psbt(psbt_signed["psbt"]) - block = finish_block(block, signet_solution, args.grind_cmd) - - # submit block - r = args.bcli("-stdin", "submitblock", input=block.serialize().hex().encode('utf8')) - - # report - bstr = "block" if is_mine else "backup block" - - next_delta = next_block_delta(block.nBits, block.hash, ultimate_target, args.poisson, args.max_interval) - next_delta += block.nTime - time.time() - next_is_mine = next_block_is_mine(block.hash, my_blocks) - - logging.debug("Block hash %s payout to %s", block.hash, reward_addr) - logging.info("Mined %s at height %d; next in %s (%s)", bstr, tmpl["height"], seconds_to_hms(next_delta), ("mine" if next_is_mine else "backup")) - if r != "": - logging.warning("submitblock returned %s for height %d hash %s", r, tmpl["height"], block.hash) - lastheader = block.hash - -def do_calibrate(args): - if args.nbits is not None and args.seconds is not None: - sys.stderr.write("Can only specify one of --nbits or --seconds\n") - return 1 - if args.nbits is not None and len(args.nbits) != 8: - sys.stderr.write("Must specify 8 hex digits for --nbits\n") - return 1 - - TRIALS = 600 # gets variance down pretty low - TRIAL_BITS = 0x1e3ea75f # takes about 5m to do 600 trials - - header = CBlockHeader() - header.nBits = TRIAL_BITS - targ = nbits_to_target(header.nBits) - - start = time.time() - count = 0 - for i in range(TRIALS): - header.nTime = i - header.nNonce = 0 - headhex = header.serialize().hex() - cmd = args.grind_cmd.split(" ") + [headhex] - newheadhex = subprocess.run(cmd, stdout=subprocess.PIPE, input=b"", check=True).stdout.strip() - - avg = (time.time() - start) * 1.0 / TRIALS - - if args.nbits is not None: - want_targ = nbits_to_target(int(args.nbits,16)) - want_time = avg*targ/want_targ - else: - want_time = args.seconds if args.seconds is not None else 25 - want_targ = int(targ*(avg/want_time)) - - print("nbits=%08x for %ds average mining time" % (target_to_nbits(want_targ), want_time)) - return 0 - -def bitcoin_cli(basecmd, args, **kwargs): - cmd = basecmd + ["-signet"] + args - logging.debug("Calling bitcoin-cli: %r", cmd) - out = subprocess.run(cmd, stdout=subprocess.PIPE, **kwargs, check=True).stdout - if isinstance(out, bytes): - out = out.decode('utf8') - return out.strip() - -def main(): - parser = argparse.ArgumentParser() - parser.add_argument("--cli", default="bitcoin-cli", type=str, help="bitcoin-cli command") - parser.add_argument("--debug", action="store_true", help="Print debugging info") - parser.add_argument("--quiet", action="store_true", help="Only print warnings/errors") - - cmds = parser.add_subparsers(help="sub-commands") - genpsbt = cmds.add_parser("genpsbt", help="Generate a block PSBT for signing") - genpsbt.set_defaults(fn=do_genpsbt) - - solvepsbt = cmds.add_parser("solvepsbt", help="Solve a signed block PSBT") - solvepsbt.set_defaults(fn=do_solvepsbt) - - generate = cmds.add_parser("generate", help="Mine blocks") - generate.set_defaults(fn=do_generate) - generate.add_argument("--ongoing", action="store_true", help="Keep mining blocks") - generate.add_argument("--max-blocks", default=None, type=int, help="Max blocks to mine (default=1)") - generate.add_argument("--set-block-time", default=None, type=int, help="Set block time (unix timestamp)") - generate.add_argument("--nbits", default=None, type=str, help="Target nBits (specify difficulty)") - generate.add_argument("--min-nbits", action="store_true", help="Target minimum nBits (use min difficulty)") - generate.add_argument("--poisson", action="store_true", help="Simulate randomised block times") - generate.add_argument("--multiminer", default=None, type=str, help="Specify which set of blocks to mine (eg: 1-40/100 for the first 40%%, 2/3 for the second 3rd)") - generate.add_argument("--backup-delay", default=300, type=int, help="Seconds to delay before mining blocks reserved for other miners (default=300)") - generate.add_argument("--standby-delay", default=0, type=int, help="Seconds to delay before mining blocks (default=0)") - generate.add_argument("--max-interval", default=1800, type=int, help="Maximum interblock interval (seconds)") - - calibrate = cmds.add_parser("calibrate", help="Calibrate difficulty") - calibrate.set_defaults(fn=do_calibrate) - calibrate.add_argument("--nbits", type=str, default=None) - calibrate.add_argument("--seconds", type=int, default=None) - - for sp in [genpsbt, generate]: - sp.add_argument("--address", default=None, type=str, help="Address for block reward payment") - sp.add_argument("--descriptor", default=None, type=str, help="Descriptor for block reward payment") - - for sp in [solvepsbt, generate, calibrate]: - sp.add_argument("--grind-cmd", default=None, type=str, required=(sp==calibrate), help="Command to grind a block header for proof-of-work") - - args = parser.parse_args(sys.argv[1:]) - - args.bcli = lambda *a, input=b"", **kwargs: bitcoin_cli(args.cli.split(" "), list(a), input=input, **kwargs) - - if hasattr(args, "address") and hasattr(args, "descriptor"): - if args.address is None and args.descriptor is None: - sys.stderr.write("Must specify --address or --descriptor\n") - return 1 - elif args.address is not None and args.descriptor is not None: - sys.stderr.write("Only specify one of --address or --descriptor\n") - return 1 - args.derived_addresses = {} - - if args.debug: - logging.getLogger().setLevel(logging.DEBUG) - elif args.quiet: - logging.getLogger().setLevel(logging.WARNING) - else: - logging.getLogger().setLevel(logging.INFO) - - if hasattr(args, "fn"): - return args.fn(args) - else: - logging.error("Must specify command") - return 1 - -if __name__ == "__main__": - main() diff --git a/contrib/testgen/README.md b/contrib/testgen/README.md deleted file mode 100644 index 5d689470ed..0000000000 --- a/contrib/testgen/README.md +++ /dev/null @@ -1,8 +0,0 @@ -### TestGen ### - -Utilities to generate test vectors for the data-driven BGL tests. - -To use inside a scripted-diff (or just execute directly): - - ./gen_key_io_test_vectors.py valid 70 > ../../src/test/data/key_io_valid.json - ./gen_key_io_test_vectors.py invalid 70 > ../../src/test/data/key_io_invalid.json diff --git a/contrib/testgen/base58.py b/contrib/testgen/base58.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/contrib/testgen/gen_key_io_test_vectors.py b/contrib/testgen/gen_key_io_test_vectors.py deleted file mode 100755 index 7bfb1d76a8..0000000000 --- a/contrib/testgen/gen_key_io_test_vectors.py +++ /dev/null @@ -1,265 +0,0 @@ -#!/usr/bin/env python3 -# Copyright (c) 2012-2022 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. -''' -Generate valid and invalid base58/bech32(m) address and private key test vectors. -''' - -from itertools import islice -import os -import random -import sys - -sys.path.append(os.path.join(os.path.dirname(__file__), '../../test/functional')) - -from test_framework.address import base58_to_byte, byte_to_base58, b58chars # noqa: E402 -from test_framework.script import OP_0, OP_1, OP_2, OP_3, OP_16, OP_DUP, OP_EQUAL, OP_EQUALVERIFY, OP_HASH160, OP_CHECKSIG # noqa: E402 -from test_framework.segwit_addr import bech32_encode, decode_segwit_address, convertbits, CHARSET, Encoding # noqa: E402 - -# key types -PUBKEY_ADDRESS = 0 -SCRIPT_ADDRESS = 5 -PUBKEY_ADDRESS_TEST = 111 -SCRIPT_ADDRESS_TEST = 196 -PUBKEY_ADDRESS_REGTEST = 111 -SCRIPT_ADDRESS_REGTEST = 196 -PRIVKEY = 128 -PRIVKEY_TEST = 239 -PRIVKEY_REGTEST = 239 - -# script -pubkey_prefix = (OP_DUP, OP_HASH160, 20) -pubkey_suffix = (OP_EQUALVERIFY, OP_CHECKSIG) -script_prefix = (OP_HASH160, 20) -script_suffix = (OP_EQUAL,) -p2wpkh_prefix = (OP_0, 20) -p2wsh_prefix = (OP_0, 32) -p2tr_prefix = (OP_1, 32) - -metadata_keys = ['isPrivkey', 'chain', 'isCompressed', 'tryCaseFlip'] -# templates for valid sequences -templates = [ - # prefix, payload_size, suffix, metadata, output_prefix, output_suffix - # None = N/A - ((PUBKEY_ADDRESS,), 20, (), (False, 'main', None, None), pubkey_prefix, pubkey_suffix), - ((SCRIPT_ADDRESS,), 20, (), (False, 'main', None, None), script_prefix, script_suffix), - ((PUBKEY_ADDRESS_TEST,), 20, (), (False, 'test', None, None), pubkey_prefix, pubkey_suffix), - ((SCRIPT_ADDRESS_TEST,), 20, (), (False, 'test', None, None), script_prefix, script_suffix), - ((PUBKEY_ADDRESS_TEST,), 20, (), (False, 'signet', None, None), pubkey_prefix, pubkey_suffix), - ((SCRIPT_ADDRESS_TEST,), 20, (), (False, 'signet', None, None), script_prefix, script_suffix), - ((PUBKEY_ADDRESS_REGTEST,), 20, (), (False, 'regtest', None, None), pubkey_prefix, pubkey_suffix), - ((SCRIPT_ADDRESS_REGTEST,), 20, (), (False, 'regtest', None, None), script_prefix, script_suffix), - ((PRIVKEY,), 32, (), (True, 'main', False, None), (), ()), - ((PRIVKEY,), 32, (1,), (True, 'main', True, None), (), ()), - ((PRIVKEY_TEST,), 32, (), (True, 'test', False, None), (), ()), - ((PRIVKEY_TEST,), 32, (1,), (True, 'test', True, None), (), ()), - ((PRIVKEY_TEST,), 32, (), (True, 'signet', False, None), (), ()), - ((PRIVKEY_TEST,), 32, (1,), (True, 'signet', True, None), (), ()), - ((PRIVKEY_REGTEST,), 32, (), (True, 'regtest', False, None), (), ()), - ((PRIVKEY_REGTEST,), 32, (1,), (True, 'regtest', True, None), (), ()) -] -# templates for valid bech32 sequences -bech32_templates = [ - # hrp, version, witprog_size, metadata, encoding, output_prefix - ('bc', 0, 20, (False, 'main', None, True), Encoding.BECH32, p2wpkh_prefix), - ('bc', 0, 32, (False, 'main', None, True), Encoding.BECH32, p2wsh_prefix), - ('bc', 1, 32, (False, 'main', None, True), Encoding.BECH32M, p2tr_prefix), - ('bc', 2, 2, (False, 'main', None, True), Encoding.BECH32M, (OP_2, 2)), - ('tb', 0, 20, (False, 'test', None, True), Encoding.BECH32, p2wpkh_prefix), - ('tb', 0, 32, (False, 'test', None, True), Encoding.BECH32, p2wsh_prefix), - ('tb', 1, 32, (False, 'test', None, True), Encoding.BECH32M, p2tr_prefix), - ('tb', 3, 16, (False, 'test', None, True), Encoding.BECH32M, (OP_3, 16)), - ('tb', 0, 20, (False, 'signet', None, True), Encoding.BECH32, p2wpkh_prefix), - ('tb', 0, 32, (False, 'signet', None, True), Encoding.BECH32, p2wsh_prefix), - ('tb', 1, 32, (False, 'signet', None, True), Encoding.BECH32M, p2tr_prefix), - ('tb', 3, 32, (False, 'signet', None, True), Encoding.BECH32M, (OP_3, 32)), - ('bcrt', 0, 20, (False, 'regtest', None, True), Encoding.BECH32, p2wpkh_prefix), - ('bcrt', 0, 32, (False, 'regtest', None, True), Encoding.BECH32, p2wsh_prefix), - ('bcrt', 1, 32, (False, 'regtest', None, True), Encoding.BECH32M, p2tr_prefix), - ('bcrt', 16, 40, (False, 'regtest', None, True), Encoding.BECH32M, (OP_16, 40)) -] -# templates for invalid bech32 sequences -bech32_ng_templates = [ - # hrp, version, witprog_size, encoding, invalid_bech32, invalid_checksum, invalid_char - ('tc', 0, 20, Encoding.BECH32, False, False, False), - ('bt', 1, 32, Encoding.BECH32M, False, False, False), - ('tb', 17, 32, Encoding.BECH32M, False, False, False), - ('bcrt', 3, 1, Encoding.BECH32M, False, False, False), - ('bc', 15, 41, Encoding.BECH32M, False, False, False), - ('tb', 0, 16, Encoding.BECH32, False, False, False), - ('bcrt', 0, 32, Encoding.BECH32, True, False, False), - ('bc', 0, 16, Encoding.BECH32, True, False, False), - ('tb', 0, 32, Encoding.BECH32, False, True, False), - ('bcrt', 0, 20, Encoding.BECH32, False, False, True), - ('bc', 0, 20, Encoding.BECH32M, False, False, False), - ('tb', 0, 32, Encoding.BECH32M, False, False, False), - ('bcrt', 0, 20, Encoding.BECH32M, False, False, False), - ('bc', 1, 32, Encoding.BECH32, False, False, False), - ('tb', 2, 16, Encoding.BECH32, False, False, False), - ('bcrt', 16, 20, Encoding.BECH32, False, False, False), -] - -def is_valid(v): - '''Check vector v for validity''' - if len(set(v) - set(b58chars)) > 0: - return is_valid_bech32(v) - try: - payload, version = base58_to_byte(v) - result = bytes([version]) + payload - except ValueError: # thrown if checksum doesn't match - return is_valid_bech32(v) - for template in templates: - prefix = bytearray(template[0]) - suffix = bytearray(template[2]) - if result.startswith(prefix) and result.endswith(suffix): - if (len(result) - len(prefix) - len(suffix)) == template[1]: - return True - return is_valid_bech32(v) - -def is_valid_bech32(v): - '''Check vector v for bech32 validity''' - for hrp in ['bc', 'tb', 'bcrt']: - if decode_segwit_address(hrp, v) != (None, None): - return True - return False - -def gen_valid_base58_vector(template): - '''Generate valid base58 vector''' - prefix = bytearray(template[0]) - payload = rand_bytes(size=template[1]) - suffix = bytearray(template[2]) - dst_prefix = bytearray(template[4]) - dst_suffix = bytearray(template[5]) - assert len(prefix) == 1 - rv = byte_to_base58(payload + suffix, prefix[0]) - return rv, dst_prefix + payload + dst_suffix - -def gen_valid_bech32_vector(template): - '''Generate valid bech32 vector''' - hrp = template[0] - witver = template[1] - witprog = rand_bytes(size=template[2]) - encoding = template[4] - dst_prefix = bytearray(template[5]) - rv = bech32_encode(encoding, hrp, [witver] + convertbits(witprog, 8, 5)) - return rv, dst_prefix + witprog - -def gen_valid_vectors(): - '''Generate valid test vectors''' - glist = [gen_valid_base58_vector, gen_valid_bech32_vector] - tlist = [templates, bech32_templates] - while True: - for template, valid_vector_generator in [(t, g) for g, l in zip(glist, tlist) for t in l]: - rv, payload = valid_vector_generator(template) - assert is_valid(rv) - metadata = {x: y for x, y in zip(metadata_keys,template[3]) if y is not None} - hexrepr = payload.hex() - yield (rv, hexrepr, metadata) - -def gen_invalid_base58_vector(template): - '''Generate possibly invalid vector''' - # kinds of invalid vectors: - # invalid prefix - # invalid payload length - # invalid (randomized) suffix (add random data) - # corrupt checksum - corrupt_prefix = randbool(0.2) - randomize_payload_size = randbool(0.2) - corrupt_suffix = randbool(0.2) - - if corrupt_prefix: - prefix = rand_bytes(size=1) - else: - prefix = bytearray(template[0]) - - if randomize_payload_size: - payload = rand_bytes(size=max(int(random.expovariate(0.5)), 50)) - else: - payload = rand_bytes(size=template[1]) - - if corrupt_suffix: - suffix = rand_bytes(size=len(template[2])) - else: - suffix = bytearray(template[2]) - - assert len(prefix) == 1 - val = byte_to_base58(payload + suffix, prefix[0]) - if random.randint(0,10)<1: # line corruption - if randbool(): # add random character to end - val += random.choice(b58chars) - else: # replace random character in the middle - n = random.randint(0, len(val)) - val = val[0:n] + random.choice(b58chars) + val[n+1:] - - return val - -def gen_invalid_bech32_vector(template): - '''Generate possibly invalid bech32 vector''' - no_data = randbool(0.1) - to_upper = randbool(0.1) - hrp = template[0] - witver = template[1] - witprog = rand_bytes(size=template[2]) - encoding = template[3] - - if no_data: - rv = bech32_encode(encoding, hrp, []) - else: - data = [witver] + convertbits(witprog, 8, 5) - if template[4] and not no_data: - if template[2] % 5 in {2, 4}: - data[-1] |= 1 - else: - data.append(0) - rv = bech32_encode(encoding, hrp, data) - - if template[5]: - i = len(rv) - random.randrange(1, 7) - rv = rv[:i] + random.choice(CHARSET.replace(rv[i], '')) + rv[i + 1:] - if template[6]: - i = len(hrp) + 1 + random.randrange(0, len(rv) - len(hrp) - 4) - rv = rv[:i] + rv[i:i + 4].upper() + rv[i + 4:] - - if to_upper: - rv = rv.swapcase() - - return rv - -def randbool(p = 0.5): - '''Return True with P(p)''' - return random.random() < p - -def rand_bytes(*, size): - return bytearray(random.getrandbits(8) for _ in range(size)) - -def gen_invalid_vectors(): - '''Generate invalid test vectors''' - # start with some manual edge-cases - yield "", - yield "x", - glist = [gen_invalid_base58_vector, gen_invalid_bech32_vector] - tlist = [templates, bech32_ng_templates] - while True: - for template, invalid_vector_generator in [(t, g) for g, l in zip(glist, tlist) for t in l]: - val = invalid_vector_generator(template) - if not is_valid(val): - yield val, - -if __name__ == '__main__': - import json - iters = {'valid':gen_valid_vectors, 'invalid':gen_invalid_vectors} - random.seed(42) - try: - uiter = iters[sys.argv[1]] - except IndexError: - uiter = gen_valid_vectors - try: - count = int(sys.argv[2]) - except IndexError: - count = 0 - - data = list(islice(uiter(), count)) - json.dump(data, sys.stdout, sort_keys=True, indent=4) - sys.stdout.write('\n') - diff --git a/contrib/tracing/README.md b/contrib/tracing/README.md deleted file mode 100644 index 206bec1647..0000000000 --- a/contrib/tracing/README.md +++ /dev/null @@ -1,338 +0,0 @@ -Example scripts for User-space, Statically Defined Tracing (USDT) -================================================================= - -This directory contains scripts showcasing User-space, Statically Defined -Tracing (USDT) support for Bitcoin Core on Linux using. For more information on -USDT support in Bitcoin Core see the [USDT documentation]. - -[USDT documentation]: ../../doc/tracing.md - - -Examples for the two main eBPF front-ends, [bpftrace] and -[BPF Compiler Collection (BCC)], with support for USDT, are listed. BCC is used -for complex tools and daemons and `bpftrace` is preferred for one-liners and -shorter scripts. - -[bpftrace]: https://github.com/iovisor/bpftrace -[BPF Compiler Collection (BCC)]: https://github.com/iovisor/bcc - - -To develop and run bpftrace and BCC scripts you need to install the -corresponding packages. See [installing bpftrace] and [installing BCC] for more -information. For development there exist a [bpftrace Reference Guide], a -[BCC Reference Guide], and a [bcc Python Developer Tutorial]. - -[installing bpftrace]: https://github.com/iovisor/bpftrace/blob/master/INSTALL.md -[installing BCC]: https://github.com/iovisor/bcc/blob/master/INSTALL.md -[bpftrace Reference Guide]: https://github.com/iovisor/bpftrace/blob/master/docs/reference_guide.md -[BCC Reference Guide]: https://github.com/iovisor/bcc/blob/master/docs/reference_guide.md -[bcc Python Developer Tutorial]: https://github.com/iovisor/bcc/blob/master/docs/tutorial_bcc_python_developer.md - -## Examples - -The bpftrace examples contain a relative path to the `bitcoind` binary. By -default, the scripts should be run from the repository-root and assume a -self-compiled `bitcoind` binary. The paths in the examples can be changed, for -example, to point to release builds if needed. See the -[Bitcoin Core USDT documentation] on how to list available tracepoints in your -`bitcoind` binary. - -[Bitcoin Core USDT documentation]: ../../doc/tracing.md#listing-available-tracepoints - -**WARNING: eBPF programs require root privileges to be loaded into a Linux -kernel VM. This means the bpftrace and BCC examples must be executed with root -privileges. Make sure to carefully review any scripts that you run with root -privileges first!** - -### log_p2p_traffic.bt - -A bpftrace script logging information about inbound and outbound P2P network -messages. Based on the `net:inbound_message` and `net:outbound_message` -tracepoints. - -By default, `bpftrace` limits strings to 64 bytes due to the limited stack size -in the eBPF VM. For example, Tor v3 addresses exceed the string size limit which -results in the port being cut off during logging. The string size limit can be -increased with the `BPFTRACE_STRLEN` environment variable (`BPFTRACE_STRLEN=70` -works fine). - -``` -$ bpftrace contrib/tracing/log_p2p_traffic.bt -``` - -Output -``` -outbound 'ping' msg to peer 11 (outbound-full-relay, [2a02:b10c:f747:1:ef:fake:ipv6:addr]:8333) with 8 bytes -inbound 'pong' msg from peer 11 (outbound-full-relay, [2a02:b10c:f747:1:ef:fake:ipv6:addr]:8333) with 8 bytes -inbound 'inv' msg from peer 16 (outbound-full-relay, XX.XX.XXX.121:8333) with 37 bytes -outbound 'getdata' msg to peer 16 (outbound-full-relay, XX.XX.XXX.121:8333) with 37 bytes -inbound 'tx' msg from peer 16 (outbound-full-relay, XX.XX.XXX.121:8333) with 222 bytes -outbound 'inv' msg to peer 9 (outbound-full-relay, faketorv3addressa2ufa6odvoi3s77j4uegey0xb10csyfyve2t33curbyd.onion:8333) with 37 bytes -outbound 'inv' msg to peer 7 (outbound-full-relay, XX.XX.XXX.242:8333) with 37 bytes -… -``` - -### p2p_monitor.py - -A BCC Python script using curses for an interactive P2P message monitor. Based -on the `net:inbound_message` and `net:outbound_message` tracepoints. - -Inbound and outbound traffic is listed for each peer together with information -about the connection. Peers can be selected individually to view recent P2P -messages. - -``` -$ python3 contrib/tracing/p2p_monitor.py ./src/bitcoind -``` - -Lists selectable peers and traffic and connection information. -``` - P2P Message Monitor - Navigate with UP/DOWN or J/K and select a peer with ENTER or SPACE to see individual P2P messages - - PEER OUTBOUND INBOUND TYPE ADDR - 0 46 398 byte 61 1407590 byte block-relay-only XX.XX.XXX.196:8333 - 11 1156 253570 byte 3431 2394924 byte outbound-full-relay XXX.X.XX.179:8333 - 13 3425 1809620 byte 1236 305458 byte inbound XXX.X.X.X:60380 - 16 1046 241633 byte 1589 1199220 byte outbound-full-relay 4faketorv2pbfu7x.onion:8333 - 19 577 181679 byte 390 148951 byte outbound-full-relay kfake4vctorjv2o2.onion:8333 - 20 11 1248 byte 13 1283 byte block-relay-only [2600:fake:64d9:b10c:4436:aaaa:fe:bb]:8333 - 21 11 1248 byte 13 1299 byte block-relay-only XX.XXX.X.155:8333 - 22 5 103 byte 1 102 byte feeler XX.XX.XXX.173:8333 - 23 11 1248 byte 12 1255 byte block-relay-only XX.XXX.XXX.220:8333 - 24 3 103 byte 1 102 byte feeler XXX.XXX.XXX.64:8333 -… -``` - -Showing recent P2P messages between our node and a selected peer. - -``` - ---------------------------------------------------------------------- - | PEER 16 (4faketorv2pbfu7x.onion:8333) | - | OUR NODE outbound-full-relay PEER | - | <--- sendcmpct (9 bytes) | - | inv (37 byte) ---> | - | <--- ping (8 bytes) | - | pong (8 byte) ---> | - | inv (37 byte) ---> | - | <--- addr (31 bytes) | - | inv (37 byte) ---> | - | <--- getheaders (1029 bytes) | - | headers (1 byte) ---> | - | <--- feefilter (8 bytes) | - | <--- pong (8 bytes) | - | <--- headers (82 bytes) | - | <--- addr (30003 bytes) | - | inv (1261 byte) ---> | - | … | - -``` - -### log_raw_p2p_msgs.py - -A BCC Python script showcasing eBPF and USDT limitations when passing data -larger than about 32kb. Based on the `net:inbound_message` and -`net:outbound_message` tracepoints. - -Bitcoin P2P messages can be larger than 32kb (e.g. `tx`, `block`, ...). The -eBPF VM's stack is limited to 512 bytes, and we can't allocate more than about -32kb for a P2P message in the eBPF VM. The **message data is cut off** when the -message is larger than MAX_MSG_DATA_LENGTH (see script). This can be detected -in user-space by comparing the data length to the message length variable. The -message is cut off when the data length is smaller than the message length. -A warning is included with the printed message data. - -Data is submitted to user-space (i.e. to this script) via a ring buffer. The -throughput of the ring buffer is limited. Each p2p_message is about 32kb in -size. In- or outbound messages submitted to the ring buffer in rapid -succession fill the ring buffer faster than it can be read. Some messages are -lost. BCC prints: `Possibly lost 2 samples` on lost messages. - - -``` -$ python3 contrib/tracing/log_raw_p2p_msgs.py ./src/bitcoind -``` - -``` -Logging raw P2P messages. -Messages larger that about 32kb will be cut off! -Some messages might be lost! - outbound msg 'inv' from peer 4 (outbound-full-relay, XX.XXX.XX.4:8333) with 253 bytes: 0705000000be2245c8f844c9f763748e1a7… -… -Warning: incomplete message (only 32568 out of 53552 bytes)! inbound msg 'tx' from peer 32 (outbound-full-relay, XX.XXX.XXX.43:8333) with 53552 bytes: 020000000001fd3c01939c85ad6756ed9fc… -… -Possibly lost 2 samples -``` - -### connectblock_benchmark.bt - -A `bpftrace` script to benchmark the `ConnectBlock()` function during, for -example, a blockchain re-index. Based on the `validation:block_connected` USDT -tracepoint. - -The script takes three positional arguments. The first two arguments, the start, -and end height indicate between which blocks the benchmark should be run. The -third acts as a duration threshold in milliseconds. When the `ConnectBlock()` -function takes longer than the threshold, information about the block, is -printed. For more details, see the header comment in the script. - -The following command can be used to benchmark, for example, `ConnectBlock()` -between height 20000 and 38000 on SigNet while logging all blocks that take -longer than 25ms to connect. - -``` -$ bpftrace contrib/tracing/connectblock_benchmark.bt 20000 38000 25 -``` - -In a different terminal, starting Bitcoin Core in SigNet mode and with -re-indexing enabled. - -``` -$ ./src/bitcoind -signet -reindex -``` - -This produces the following output. -``` -Attaching 5 probes... -ConnectBlock Benchmark between height 20000 and 38000 inclusive -Logging blocks taking longer than 25 ms to connect. -Starting Connect Block Benchmark between height 20000 and 38000. -BENCH 39 blk/s 59 tx/s 59 inputs/s 20 sigops/s (height 20038) -Block 20492 (000000f555653bb05e2f3c6e79925e01a20dd57033f4dc7c354b46e34735d32b) 20 tx 2319 ins 2318 sigops took 38 ms -BENCH 1840 blk/s 2117 tx/s 4478 inputs/s 2471 sigops/s (height 21879) -BENCH 1816 blk/s 4972 tx/s 4982 inputs/s 125 sigops/s (height 23695) -BENCH 2095 blk/s 2890 tx/s 2910 inputs/s 152 sigops/s (height 25790) -BENCH 1684 blk/s 3979 tx/s 4053 inputs/s 288 sigops/s (height 27474) -BENCH 1155 blk/s 3216 tx/s 3252 inputs/s 115 sigops/s (height 28629) -BENCH 1797 blk/s 2488 tx/s 2503 inputs/s 111 sigops/s (height 30426) -BENCH 1849 blk/s 6318 tx/s 6569 inputs/s 12189 sigops/s (height 32275) -BENCH 946 blk/s 20209 tx/s 20775 inputs/s 83809 sigops/s (height 33221) -Block 33406 (0000002adfe4a15cfcd53bd890a89bbae836e5bb7f38bac566f61ad4548c87f6) 25 tx 2045 ins 2090 sigops took 29 ms -Block 33687 (00000073231307a9828e5607ceb8156b402efe56747271a4442e75eb5b77cd36) 52 tx 1797 ins 1826 sigops took 26 ms -BENCH 582 blk/s 21581 tx/s 27673 inputs/s 60345 sigops/s (height 33803) -BENCH 1035 blk/s 19735 tx/s 19776 inputs/s 51355 sigops/s (height 34838) -Block 35625 (0000006b00b347390c4768ea9df2655e9ff4b120f29d78594a2a702f8a02c997) 20 tx 3374 ins 3371 sigops took 49 ms -BENCH 887 blk/s 17857 tx/s 22191 inputs/s 24404 sigops/s (height 35725) -Block 35937 (000000d816d13d6e39b471cd4368db60463a764ba1f29168606b04a22b81ea57) 75 tx 3943 ins 3940 sigops took 61 ms -BENCH 823 blk/s 16298 tx/s 21031 inputs/s 18440 sigops/s (height 36548) -Block 36583 (000000c3e260556dbf42968aae3f904dba8b8c1ff96a6f6e3aa5365d2e3ad317) 24 tx 2198 ins 2194 sigops took 34 ms -Block 36700 (000000b3b173de9e65a3cfa738d976af6347aaf83fa17ab3f2a4d2ede3ddfac4) 73 tx 1615 ins 1611 sigops took 31 ms -Block 36832 (0000007859578c02c1ac37dabd1b9ec19b98f350b56935f5dd3a41e9f79f836e) 34 tx 1440 ins 1436 sigops took 26 ms -BENCH 613 blk/s 16718 tx/s 25074 inputs/s 23022 sigops/s (height 37161) -Block 37870 (000000f5c1086291ba2d943fb0c3bc82e71c5ee341ee117681d1456fbf6c6c38) 25 tx 1517 ins 1514 sigops took 29 ms -BENCH 811 blk/s 16031 tx/s 20921 inputs/s 18696 sigops/s (height 37972) - -Took 14055 ms to connect the blocks between height 20000 and 38000. - -Histogram of block connection times in milliseconds (ms). -@durations: -[0] 16838 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| -[1] 882 |@@ | -[2, 4) 236 | | -[4, 8) 23 | | -[8, 16) 9 | | -[16, 32) 9 | | -[32, 64) 4 | | -``` - -### log_utxocache_flush.py - -A BCC Python script to log the UTXO cache flushes. Based on the -`utxocache:flush` tracepoint. - -```bash -$ python3 contrib/tracing/log_utxocache_flush.py ./src/bitcoind -``` - -``` -Logging utxocache flushes. Ctrl-C to end... -Duration (µs) Mode Coins Count Memory Usage Prune -730451 IF_NEEDED 22990 3323.54 kB True -637657 ALWAYS 122320 17124.80 kB False -81349 ALWAYS 0 1383.49 kB False -``` - -### log_utxos.bt - -A `bpftrace` script to log information about the coins that are added, spent, or -uncached from the UTXO set. Based on the `utxocache:add`, `utxocache:spend` and -`utxocache:uncache` tracepoints. - -```bash -$ bpftrace contrib/tracing/log_utxos.bt -``` - -This should produce an output similar to the following. If you see bpftrace -warnings like `Lost 24 events`, the eBPF perf ring-buffer is filled faster -than it is being read. You can increase the ring-buffer size by setting the -ENV variable `BPFTRACE_PERF_RB_PAGES` (default 64) at a cost of higher -memory usage. See the [bpftrace reference guide] for more information. - -[bpftrace reference guide]: https://github.com/iovisor/bpftrace/blob/master/docs/reference_guide.md#98-bpftrace_perf_rb_pages - -```bash -Attaching 4 probes... -OP Outpoint Value Height Coinbase -Added 6ba9ad857e1ef2eb2a2c94f06813c414c7ab273e3d6bd7ad64e000315a887e7c:1 10000 2094512 No -Spent fa7dc4db56637a151f6649d8f26732956d1c5424c82aae400a83d02b2cc2c87b:0 182264897 2094512 No -Added eeb2f099b1af6a2a12e6ddd2eeb16fc5968582241d7f08ba202d28b60ac264c7:0 10000 2094512 No -Added eeb2f099b1af6a2a12e6ddd2eeb16fc5968582241d7f08ba202d28b60ac264c7:1 182254756 2094512 No -Added a0c7f4ec9cccef2d89672a624a4e6c8237a17572efdd4679eea9e9ee70d2db04:0 10072679 2094513 Yes -Spent 25e0df5cc1aeb1b78e6056bf403e5e8b7e41f138060ca0a50a50134df0549a5e:2 540 2094508 No -Spent 42f383c04e09c26a2378272ec33aa0c1bf4883ca5ab739e8b7e06be5a5787d61:1 3848399 2007724 No -Added f85e3b4b89270863a389395cc9a4123e417ab19384cef96533c6649abd6b0561:0 3788399 2094513 No -Added f85e3b4b89270863a389395cc9a4123e417ab19384cef96533c6649abd6b0561:2 540 2094513 No -Spent a05880b8c77971ed0b9f73062c7c4cdb0ff3856ab14cbf8bc481ed571cd34b83:1 5591281046 2094511 No -Added eb689865f7d957938978d6207918748f74e6aa074f47874724327089445b0960:0 5589696005 2094513 No -Added eb689865f7d957938978d6207918748f74e6aa074f47874724327089445b0960:1 1565556 2094513 No -``` - -### mempool_monitor.py - -A BCC Python script producing mempool statistics and an event log. Based on the -`mempool:added`, `mempool:removed`, `mempool:replaced`, and `mempool:rejected` -tracepoints. - -Statistics include incidence and rate for each event type since the script was -started (`total`) as well as during the last minute (`1 min`) and ten minutes -(`10 min`). The event log shows mempool events in real time, each entry -comprising a timestamp along with all event data available via the event's -tracepoint. - -```console -$ python3 contrib/tracing/mempool_monitor.py ./src/bitcoind -``` - -``` - Mempool Monitor - Press CTRL-C to stop. - - ┌─Event count───────────────────────┐ ┌─Event rate──────────────────────────┐ - │ Event total 1 min 10 min │ │ Event total 1 min 10 min │ - │ added 1425tx 201tx 1425tx │ │ added 4.7tx/s 3.4tx/s 4.7tx/s │ - │ removed 35tx 4tx 35tx │ │ removed 0.1tx/s 0.1tx/s 0.1tx/s │ - │ replaced 35tx 4tx 35tx │ │ replaced 0.1tx/s 0.1tx/s 0.1tx/s │ - │ rejected 0tx 0tx 0tx │ │ rejected 0.0tx/s 0.0tx/s 0.0tx/s │ - └───────────────────────────────────┘ └─────────────────────────────────────┘ - - ┌─Event log────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ - │ 13:10:30Z added f9064ca5bfc87cdd191faa42bf697217cd920b2b94838c1f1192e4f06c4fd217 with feerate 8.92 sat/vB (981 sat, 110 vbytes) │ - │ 13:10:30Z added 53ffa3afbe57b1bfe423e1755ca2b52c5b6cb4aa91b8b7ee9cb694953f47f234 with feerate 5.00 sat/vB (550 sat, 110 vbytes) │ - │ 13:10:30Z added 4177df5e19465eb5e53c3f8b6830a293f57474921bc6c2ae89375e0986e1f0f9 with feerate 2.98 sat/vB (429 sat, 144 vbytes) │ - │ 13:10:30Z added 931a10d83f0a268768da75dc4b9e199f2f055f12979ae5491cc304ee10f890ea with feerate 3.55 sat/vB (500 sat, 141 vbytes) │ - │ 13:10:30Z added 4cf32b295723cc4ab73f2a2e51d4bb276c0042760a4c00a3eb9595b8ebb24721 with feerate 89.21 sat/vB (12668 sat, 142 vbytes) │ - │ 13:10:31Z replaced d1eecf9d662121322f4f31f0c2267a752d14bb3956e6016ba96e87f47890e1db with feerate 27.12 sat/vB received 23.3 seconds ago (7213 sat, 266 vbytes) with c412db908│ - │ 9b7ed53f3e5e36d2819dd291278b59ccaabaeb17fd37c3d87fdcd57 with feerate 28.12 sat/vB (8351 sat, 297 vbytes) │ - │ 13:10:31Z added c412db9089b7ed53f3e5e36d2819dd291278b59ccaabaeb17fd37c3d87fdcd57 with feerate 28.12 sat/vB (8351 sat, 297 vbytes) │ - │ 13:10:31Z added b8388a5bdc421b11460bdf477d5a85a1a39c2784e7dd7bffabe688740424ea57 with feerate 25.21 sat/vB (3554 sat, 141 vbytes) │ - │ 13:10:31Z added 4ddb88bc90a122cd9eae8a664e73bdf5bebe75f3ef901241b4a251245854a98e with feerate 24.15 sat/vB (5072 sat, 210 vbytes) │ - │ 13:10:31Z added 19101e4161bca5271ad5d03e7747f2faec7793b274dc2f3c4cf516b7cef1aac3 with feerate 7.06 sat/vB (1080 sat, 153 vbytes) │ - │ 13:10:31Z removed d1eecf9d662121322f4f31f0c2267a752d14bb3956e6016ba96e87f47890e1db with feerate 27.12 sat/vB (7213 sat, 266 vbytes): replaced │ - │ 13:10:31Z added 6c511c60d9b95b9eff81df6ecba5c86780f513fe62ce3ad6be2c5340d957025a with feerate 4.00 sat/vB (440 sat, 110 vbytes) │ - │ 13:10:31Z added 44d66f7f004bd52c46be4dff3067cab700e51c7866a84282bd8aab560a5bfb79 with feerate 3.15 sat/vB (448 sat, 142 vbytes) │ - │ 13:10:31Z added b17b7c9ec5acfbbf12f0eeef8e29826fad3105bb95eef7a47d2f1f22b4784643 with feerate 4.10 sat/vB (1348 sat, 329 vbytes) │ - │ 13:10:31Z added b7a4ad93554e57454e8a8049bfc0bd803fa962bd3f0a08926aa72e7cb23e2276 with feerate 1.01 sat/vB (205 sat, 202 vbytes) │ - │ 13:10:32Z added c78e87be86c828137a6e7e00a177c03b52202ce4c39029b99904c2a094b9da87 with feerate 11.00 sat/vB (1562 sat, 142 vbytes) │ - │ │ - └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ -``` diff --git a/contrib/tracing/connectblock_benchmark.bt b/contrib/tracing/connectblock_benchmark.bt deleted file mode 100755 index 121f3f6f93..0000000000 --- a/contrib/tracing/connectblock_benchmark.bt +++ /dev/null @@ -1,156 +0,0 @@ -#!/usr/bin/env bpftrace - -/* - - USAGE: - - bpftrace contrib/tracing/connectblock_benchmark.bt - - - sets the height at which the benchmark should start. Setting - the start height to 0 starts the benchmark immediately, even before the - first block is connected. - - sets the height after which the benchmark should end. Setting - the end height to 0 disables the benchmark. The script only logs blocks - over . - - Threshold - - This script requires a 'BGLd' binary compiled with eBPF support and the - 'validation:block_connected' USDT. By default, it's assumed that 'BGLd' is - located in './src/BGLd'. This can be modified in the script below. - - EXAMPLES: - - bpftrace contrib/tracing/connectblock_benchmark.bt 300000 680000 1000 - - When run together 'BGLd -reindex', this benchmarks the time it takes to - connect the blocks between height 300.000 and 680.000 (inclusive) and prints - details about all blocks that take longer than 1000ms to connect. Prints a - histogram with block connection times when the benchmark is finished. - - - bpftrace contrib/tracing/connectblock_benchmark.bt 0 0 500 - - When running together 'BGLd', all newly connected blocks that - take longer than 500ms to connect are logged. A histogram with block - connection times is shown when the script is terminated. - -*/ - -BEGIN -{ - $start_height = $1; - $end_height = $2; - $logging_threshold_ms = $3; - - if ($end_height < $start_height) { - printf("Error: start height (%d) larger than end height (%d)!\n", $start_height, $end_height); - exit(); - } - - if ($end_height > 0) { - printf("ConnectBlock benchmark between height %d and %d inclusive\n", $start_height, $end_height); - } else { - printf("ConnectBlock logging starting at height %d\n", $start_height); - } - - if ($logging_threshold_ms > 0) { - printf("Logging blocks taking longer than %d ms to connect.\n", $3); - } - - if ($start_height == 0) { - @start = nsecs; - } -} - -/* - Attaches to the 'validation:block_connected' USDT and collects stats when the - connected block is between the start and end height (or the end height is - unset). -*/ -usdt:./src/BGLd:validation:block_connected /arg1 >= $1 && (arg1 <= $2 || $2 == 0 )/ -{ - $height = arg1; - $transactions = arg2; - $inputs = arg3; - $sigops = arg4; - $duration = (uint64) arg5; - - @height = $height; - - @blocks = @blocks + 1; - @transactions = @transactions + $transactions; - @inputs = @inputs + $inputs; - @sigops = @sigops + $sigops; - - @durations = hist($duration / 1000); - - if ($height == $1 && $height != 0) { - @start = nsecs; - printf("Starting Connect Block Benchmark between height %d and %d.\n", $1, $2); - } - - if ($2 > 0 && $height >= $2) { - @end = nsecs; - $duration = @end - @start; - printf("\nTook %d ms to connect the blocks between height %d and %d.\n", $duration / 1000000, $1, $2); - exit(); - } -} - -/* - Attaches to the 'validation:block_connected' USDT and logs information about - blocks where the time it took to connect the block is above the - . -*/ -usdt:./src/BGLd:validation:block_connected / (uint64) arg5 / 1000> $3 / -{ - $hash = arg0; - $height = (int32) arg1; - $transactions = (uint64) arg2; - $inputs = (int32) arg3; - $sigops = (int64) arg4; - $duration = (int64) arg5; - - - printf("Block %d (", $height); - /* Prints each byte of the block hash as hex in big-endian (the block-explorer format) */ - $p = $hash + 31; - unroll(32) { - $b = *(uint8*)$p; - printf("%02x", $b); - $p -= 1; - } - printf(") %4d tx %5d ins %5d sigops took %4d ms\n", $transactions, $inputs, $sigops, (uint64) $duration / 1000); -} - - -/* - Prints stats about the blocks, transactions, inputs, and sigops processed in - the last second (if any). -*/ -interval:s:1 { - if (@blocks > 0) { - printf("BENCH %4d blk/s %6d tx/s %7d inputs/s %8d sigops/s (height %d)\n", @blocks, @transactions, @inputs, @sigops, @height); - - zero(@blocks); - zero(@transactions); - zero(@inputs); - zero(@sigops); - } -} - -END -{ - printf("\nHistogram of block connection times in milliseconds (ms).\n"); - print(@durations); - - clear(@durations); - clear(@blocks); - clear(@transactions); - clear(@inputs); - clear(@sigops); - clear(@height); - clear(@start); - clear(@end); -} - diff --git a/contrib/tracing/log_p2p_traffic.bt b/contrib/tracing/log_p2p_traffic.bt deleted file mode 100755 index 75738454f9..0000000000 --- a/contrib/tracing/log_p2p_traffic.bt +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env bpftrace - -BEGIN -{ - printf("Logging P2P traffic\n") -} - -usdt:./src/BGLd:net:inbound_message -{ - $peer_id = (int64) arg0; - $peer_addr = str(arg1); - $peer_type = str(arg2); - $msg_type = str(arg3); - $msg_len = arg4; - printf("inbound '%s' msg from peer %d (%s, %s) with %d bytes\n", $msg_type, $peer_id, $peer_type, $peer_addr, $msg_len); -} - -usdt:./src/BGLd:net:outbound_message -{ - $peer_id = (int64) arg0; - $peer_addr = str(arg1); - $peer_type = str(arg2); - $msg_type = str(arg3); - $msg_len = arg4; - - printf("outbound '%s' msg to peer %d (%s, %s) with %d bytes\n", $msg_type, $peer_id, $peer_type, $peer_addr, $msg_len); -} - diff --git a/contrib/tracing/log_raw_p2p_msgs.py b/contrib/tracing/log_raw_p2p_msgs.py deleted file mode 100755 index 9c52a9e710..0000000000 --- a/contrib/tracing/log_raw_p2p_msgs.py +++ /dev/null @@ -1,183 +0,0 @@ -#!/usr/bin/env python3 -# Copyright (c) 2021 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -""" Demonstration of eBPF limitations and the effect on USDT with the - net:inbound_message and net:outbound_message tracepoints. """ - -# This script shows a limitation of eBPF when data larger than 32kb is passed to -# user-space. It uses BCC (https://github.com/iovisor/bcc) to load a sandboxed -# eBPF program into the Linux kernel (root privileges are required). The eBPF -# program attaches to two statically defined tracepoints. The tracepoint -# 'net:inbound_message' is called when a new P2P message is received, and -# 'net:outbound_message' is called on outbound P2P messages. The eBPF program -# submits the P2P messages to this script via a BPF ring buffer. The submitted -# messages are printed. - -# eBPF Limitations: -# -# Bitcoin P2P messages can be larger than 32kb (e.g. tx, block, ...). The eBPF -# VM's stack is limited to 512 bytes, and we can't allocate more than about 32kb -# for a P2P message in the eBPF VM. The message data is cut off when the message -# is larger than MAX_MSG_DATA_LENGTH (see definition below). This can be detected -# in user-space by comparing the data length to the message length variable. The -# message is cut off when the data length is smaller than the message length. -# A warning is included with the printed message data. -# -# Data is submitted to user-space (i.e. to this script) via a ring buffer. The -# throughput of the ring buffer is limited. Each p2p_message is about 32kb in -# size. In- or outbound messages submitted to the ring buffer in rapid -# succession fill the ring buffer faster than it can be read. Some messages are -# lost. -# -# BCC prints: "Possibly lost 2 samples" on lost messages. - -import sys -from bcc import BPF, USDT - -# BCC: The C program to be compiled to an eBPF program (by BCC) and loaded into -# a sandboxed Linux kernel VM. -program = """ -#include - -#define MIN(a,b) ({ __typeof__ (a) _a = (a); __typeof__ (b) _b = (b); _a < _b ? _a : _b; }) - -// Maximum possible allocation size -// from include/linux/percpu.h in the Linux kernel -#define PCPU_MIN_UNIT_SIZE (32 << 10) - -// Tor v3 addresses are 62 chars + 6 chars for the port (':12345'). -#define MAX_PEER_ADDR_LENGTH 62 + 6 -#define MAX_PEER_CONN_TYPE_LENGTH 20 -#define MAX_MSG_TYPE_LENGTH 20 -#define MAX_MSG_DATA_LENGTH PCPU_MIN_UNIT_SIZE - 200 - -struct p2p_message -{ - u64 peer_id; - char peer_addr[MAX_PEER_ADDR_LENGTH]; - char peer_conn_type[MAX_PEER_CONN_TYPE_LENGTH]; - char msg_type[MAX_MSG_TYPE_LENGTH]; - u64 msg_size; - u8 msg[MAX_MSG_DATA_LENGTH]; -}; - -// We can't store the p2p_message struct on the eBPF stack as it is limited to -// 512 bytes and P2P message can be bigger than 512 bytes. However, we can use -// an BPF-array with a length of 1 to allocate up to 32768 bytes (this is -// defined by PCPU_MIN_UNIT_SIZE in include/linux/percpu.h in the Linux kernel). -// Also see https://github.com/iovisor/bcc/issues/2306 -BPF_ARRAY(msg_arr, struct p2p_message, 1); - -// Two BPF perf buffers for pushing data (here P2P messages) to user-space. -BPF_PERF_OUTPUT(inbound_messages); -BPF_PERF_OUTPUT(outbound_messages); - -int trace_inbound_message(struct pt_regs *ctx) { - int idx = 0; - struct p2p_message *msg = msg_arr.lookup(&idx); - - // lookup() does not return a NULL pointer. However, the BPF verifier - // requires an explicit check that that the `msg` pointer isn't a NULL - // pointer. See https://github.com/iovisor/bcc/issues/2595 - if (msg == NULL) return 1; - - bpf_usdt_readarg(1, ctx, &msg->peer_id); - bpf_usdt_readarg_p(2, ctx, &msg->peer_addr, MAX_PEER_ADDR_LENGTH); - bpf_usdt_readarg_p(3, ctx, &msg->peer_conn_type, MAX_PEER_CONN_TYPE_LENGTH); - bpf_usdt_readarg_p(4, ctx, &msg->msg_type, MAX_MSG_TYPE_LENGTH); - bpf_usdt_readarg(5, ctx, &msg->msg_size); - bpf_usdt_readarg_p(6, ctx, &msg->msg, MIN(msg->msg_size, MAX_MSG_DATA_LENGTH)); - - inbound_messages.perf_submit(ctx, msg, sizeof(*msg)); - return 0; -}; - -int trace_outbound_message(struct pt_regs *ctx) { - int idx = 0; - struct p2p_message *msg = msg_arr.lookup(&idx); - - // lookup() does not return a NULL pointer. However, the BPF verifier - // requires an explicit check that that the `msg` pointer isn't a NULL - // pointer. See https://github.com/iovisor/bcc/issues/2595 - if (msg == NULL) return 1; - - bpf_usdt_readarg(1, ctx, &msg->peer_id); - bpf_usdt_readarg_p(2, ctx, &msg->peer_addr, MAX_PEER_ADDR_LENGTH); - bpf_usdt_readarg_p(3, ctx, &msg->peer_conn_type, MAX_PEER_CONN_TYPE_LENGTH); - bpf_usdt_readarg_p(4, ctx, &msg->msg_type, MAX_MSG_TYPE_LENGTH); - bpf_usdt_readarg(5, ctx, &msg->msg_size); - bpf_usdt_readarg_p(6, ctx, &msg->msg, MIN(msg->msg_size, MAX_MSG_DATA_LENGTH)); - - outbound_messages.perf_submit(ctx, msg, sizeof(*msg)); - return 0; -}; -""" - - -def print_message(event, inbound): - print(f"%s %s msg '%s' from peer %d (%s, %s) with %d bytes: %s" % - ( - f"Warning: incomplete message (only %d out of %d bytes)!" % ( - len(event.msg), event.msg_size) if len(event.msg) < event.msg_size else "", - "inbound" if inbound else "outbound", - event.msg_type.decode("utf-8"), - event.peer_id, - event.peer_conn_type.decode("utf-8"), - event.peer_addr.decode("utf-8"), - event.msg_size, - bytes(event.msg[:event.msg_size]).hex(), - ) - ) - - -def main(BGLd_path): - BGLd_with_usdts = USDT(path=str(BGLd_path)) - - # attaching the trace functions defined in the BPF program to the tracepoints - BGLd_with_usdts.enable_probe( - probe="inbound_message", fn_name="trace_inbound_message") - BGLd_with_usdts.enable_probe( - probe="outbound_message", fn_name="trace_outbound_message") - bpf = BPF(text=program, usdt_contexts=[BGLd_with_usdts]) - - # BCC: perf buffer handle function for inbound_messages - def handle_inbound(_, data, size): - """ Inbound message handler. - - Called each time a message is submitted to the inbound_messages BPF table.""" - - event = bpf["inbound_messages"].event(data) - print_message(event, True) - - # BCC: perf buffer handle function for outbound_messages - - def handle_outbound(_, data, size): - """ Outbound message handler. - - Called each time a message is submitted to the outbound_messages BPF table.""" - - event = bpf["outbound_messages"].event(data) - print_message(event, False) - - # BCC: add handlers to the inbound and outbound perf buffers - bpf["inbound_messages"].open_perf_buffer(handle_inbound) - bpf["outbound_messages"].open_perf_buffer(handle_outbound) - - print("Logging raw P2P messages.") - print("Messages larger that about 32kb will be cut off!") - print("Some messages might be lost!") - while True: - try: - bpf.perf_buffer_poll() - except KeyboardInterrupt: - exit() - - -if __name__ == "__main__": - if len(sys.argv) < 2: - print("USAGE:", sys.argv[0], "path/to/BGLd") - exit() - path = sys.argv[1] - main(path) diff --git a/contrib/tracing/log_utxocache_flush.py b/contrib/tracing/log_utxocache_flush.py deleted file mode 100755 index 4afd5dcd74..0000000000 --- a/contrib/tracing/log_utxocache_flush.py +++ /dev/null @@ -1,107 +0,0 @@ -#!/usr/bin/env python3 -# Copyright (c) 2021-2022 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 sys -import ctypes -from bcc import BPF, USDT - -"""Example logging BGL Core utxo set cache flushes utilizing - the utxocache:flush tracepoint.""" - -# USAGE: ./contrib/tracing/log_utxocache_flush.py path/to/bitcoind - -# BCC: The C program to be compiled to an eBPF program (by BCC) and loaded into -# a sandboxed Linux kernel VM. -program = """ -# include - -struct data_t -{ - u64 duration; - u32 mode; - u64 coins_count; - u64 coins_mem_usage; - bool is_flush_for_prune; -}; - -// BPF perf buffer to push the data to user space. -BPF_PERF_OUTPUT(flush); - -int trace_flush(struct pt_regs *ctx) { - struct data_t data = {}; - bpf_usdt_readarg(1, ctx, &data.duration); - bpf_usdt_readarg(2, ctx, &data.mode); - bpf_usdt_readarg(3, ctx, &data.coins_count); - bpf_usdt_readarg(4, ctx, &data.coins_mem_usage); - bpf_usdt_readarg(5, ctx, &data.is_flush_for_prune); - flush.perf_submit(ctx, &data, sizeof(data)); - return 0; -} -""" - -FLUSH_MODES = [ - 'NONE', - 'IF_NEEDED', - 'PERIODIC', - 'ALWAYS' -] - - -class Data(ctypes.Structure): - # define output data structure corresponding to struct data_t - _fields_ = [ - ("duration", ctypes.c_uint64), - ("mode", ctypes.c_uint32), - ("coins_count", ctypes.c_uint64), - ("coins_mem_usage", ctypes.c_uint64), - ("is_flush_for_prune", ctypes.c_bool) - ] - - -def print_event(event): - print("%-15d %-10s %-15d %-15s %-8s" % ( - event.duration, - FLUSH_MODES[event.mode], - event.coins_count, - "%.2f kB" % (event.coins_mem_usage/1000), - event.is_flush_for_prune - )) - - -def main(BGLd_path): - BGLd_with_usdts = USDT(path=str(BGLd_path)) - - # attaching the trace functions defined in the BPF program - # to the tracepoints - BGLd_with_usdts.enable_probe( - probe="flush", fn_name="trace_flush") - b = BPF(text=program, usdt_contexts=[BGLd_with_usdts]) - - def handle_flush(_, data, size): - """ Coins Flush handler. - Called each time coin caches and indexes are flushed.""" - event = ctypes.cast(data, ctypes.POINTER(Data)).contents - print_event(event) - - b["flush"].open_perf_buffer(handle_flush) - print("Logging utxocache flushes. Ctrl-C to end...") - print("%-15s %-10s %-15s %-15s %-8s" % ("Duration (µs)", "Mode", - "Coins Count", "Memory Usage", - "Flush for Prune")) - - while True: - try: - b.perf_buffer_poll() - except KeyboardInterrupt: - exit(0) - - -if __name__ == "__main__": - if len(sys.argv) < 2: - print("USAGE: ", sys.argv[0], "path/to/BGLd") - exit(1) - - path = sys.argv[1] - main(path) diff --git a/contrib/tracing/log_utxos.bt b/contrib/tracing/log_utxos.bt deleted file mode 100755 index 9cc03a2ed5..0000000000 --- a/contrib/tracing/log_utxos.bt +++ /dev/null @@ -1,86 +0,0 @@ -#!/usr/bin/env bpftrace - -/* - - USAGE: - - bpftrace contrib/tracing/log_utxos.bt - - This script requires a 'bitcoind' binary compiled with eBPF support and the - 'utxocache' tracepoints. By default, it's assumed that 'bitcoind' is - located in './src/bitcoind'. This can be modified in the script below. - - NOTE: requires bpftrace v0.12.0 or above. -*/ - -BEGIN -{ - printf("%-7s %-71s %16s %7s %8s\n", - "OP", "Outpoint", "Value", "Height", "Coinbase"); -} - -/* - Attaches to the 'utxocache:add' tracepoint and prints additions to the UTXO set cache. -*/ -usdt:./src/BGLd:utxocache:add -{ - $txid = arg0; - $index = (uint32)arg1; - $height = (uint32)arg2; - $value = (int64)arg3; - $isCoinbase = arg4; - - printf("Added "); - $p = $txid + 31; - unroll(32) { - $b = *(uint8*)$p; - printf("%02x", $b); - $p-=1; - } - - printf(":%-6d %16ld %7d %s\n", $index, $value, $height, ($isCoinbase ? "Yes" : "No" )); -} - -/* - Attaches to the 'utxocache:spent' tracepoint and prints spents from the UTXO set cache. -*/ -usdt:./src/BGLd:utxocache:spent -{ - $txid = arg0; - $index = (uint32)arg1; - $height = (uint32)arg2; - $value = (int64)arg3; - $isCoinbase = arg4; - - printf("Spent "); - $p = $txid + 31; - unroll(32) { - $b = *(uint8*)$p; - printf("%02x", $b); - $p-=1; - } - - printf(":%-6d %16ld %7d %s\n", $index, $value, $height, ($isCoinbase ? "Yes" : "No" )); -} - -/* - Attaches to the 'utxocache:uncache' tracepoint and uncache UTXOs from the UTXO set cache. -*/ -usdt:./src/BGLd:utxocache:uncache -{ - $txid = arg0; - $index = (uint32)arg1; - $height = (uint32)arg2; - $value = (int64)arg3; - $isCoinbase = arg4; - - printf("Uncache "); - $p = $txid + 31; - unroll(32) { - $b = *(uint8*)$p; - printf("%02x", $b); - $p-=1; - } - - printf(":%-6d %16ld %7d %s\n", $index, $value, $height, ($isCoinbase ? "Yes" : "No" )); -} diff --git a/contrib/tracing/mempool_monitor.py b/contrib/tracing/mempool_monitor.py deleted file mode 100755 index afb5e60372..0000000000 --- a/contrib/tracing/mempool_monitor.py +++ /dev/null @@ -1,372 +0,0 @@ -#!/usr/bin/env python3 -# Copyright (c) 2022 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -""" Example logging Bitcoin Core mempool events using the mempool:added, - mempool:removed, mempool:replaced, and mempool:rejected tracepoints. """ - -import curses -import sys -from datetime import datetime, timezone - -from bcc import BPF, USDT - -# BCC: The C program to be compiled to an eBPF program (by BCC) and loaded into -# a sandboxed Linux kernel VM. -PROGRAM = """ -# include - -// The longest rejection reason is 118 chars and is generated in case of SCRIPT_ERR_EVAL_FALSE by -// strprintf("mandatory-script-verify-flag-failed (%s)", ScriptErrorString(check.GetScriptError())) -#define MAX_REJECT_REASON_LENGTH 118 -// The longest string returned by RemovalReasonToString() is 'sizelimit' -#define MAX_REMOVAL_REASON_LENGTH 9 -#define HASH_LENGTH 32 - -struct added_event -{ - u8 hash[HASH_LENGTH]; - s32 vsize; - s64 fee; -}; - -struct removed_event -{ - u8 hash[HASH_LENGTH]; - char reason[MAX_REMOVAL_REASON_LENGTH]; - s32 vsize; - s64 fee; - u64 entry_time; -}; - -struct rejected_event -{ - u8 hash[HASH_LENGTH]; - char reason[MAX_REJECT_REASON_LENGTH]; -}; - -struct replaced_event -{ - u8 replaced_hash[HASH_LENGTH]; - s32 replaced_vsize; - s64 replaced_fee; - u64 replaced_entry_time; - u8 replacement_hash[HASH_LENGTH]; - s32 replacement_vsize; - s64 replacement_fee; -}; - -// BPF perf buffer to push the data to user space. -BPF_PERF_OUTPUT(added_events); -BPF_PERF_OUTPUT(removed_events); -BPF_PERF_OUTPUT(rejected_events); -BPF_PERF_OUTPUT(replaced_events); - -int trace_added(struct pt_regs *ctx) { - struct added_event added = {}; - - bpf_usdt_readarg_p(1, ctx, &added.hash, HASH_LENGTH); - bpf_usdt_readarg(2, ctx, &added.vsize); - bpf_usdt_readarg(3, ctx, &added.fee); - - added_events.perf_submit(ctx, &added, sizeof(added)); - return 0; -} - -int trace_removed(struct pt_regs *ctx) { - struct removed_event removed = {}; - - bpf_usdt_readarg_p(1, ctx, &removed.hash, HASH_LENGTH); - bpf_usdt_readarg_p(2, ctx, &removed.reason, MAX_REMOVAL_REASON_LENGTH); - bpf_usdt_readarg(3, ctx, &removed.vsize); - bpf_usdt_readarg(4, ctx, &removed.fee); - bpf_usdt_readarg(5, ctx, &removed.entry_time); - - removed_events.perf_submit(ctx, &removed, sizeof(removed)); - return 0; -} - -int trace_rejected(struct pt_regs *ctx) { - struct rejected_event rejected = {}; - - bpf_usdt_readarg_p(1, ctx, &rejected.hash, HASH_LENGTH); - bpf_usdt_readarg_p(2, ctx, &rejected.reason, MAX_REJECT_REASON_LENGTH); - - rejected_events.perf_submit(ctx, &rejected, sizeof(rejected)); - return 0; -} - -int trace_replaced(struct pt_regs *ctx) { - struct replaced_event replaced = {}; - - bpf_usdt_readarg_p(1, ctx, &replaced.replaced_hash, HASH_LENGTH); - bpf_usdt_readarg(2, ctx, &replaced.replaced_vsize); - bpf_usdt_readarg(3, ctx, &replaced.replaced_fee); - bpf_usdt_readarg(4, ctx, &replaced.replaced_entry_time); - bpf_usdt_readarg_p(5, ctx, &replaced.replacement_hash, HASH_LENGTH); - bpf_usdt_readarg(6, ctx, &replaced.replacement_vsize); - bpf_usdt_readarg(7, ctx, &replaced.replacement_fee); - - replaced_events.perf_submit(ctx, &replaced, sizeof(replaced)); - return 0; -} -""" - - -def main(bitcoind_path): - bitcoind_with_usdts = USDT(path=str(bitcoind_path)) - - # attaching the trace functions defined in the BPF program - # to the tracepoints - bitcoind_with_usdts.enable_probe(probe="mempool:added", fn_name="trace_added") - bitcoind_with_usdts.enable_probe(probe="mempool:removed", fn_name="trace_removed") - bitcoind_with_usdts.enable_probe(probe="mempool:replaced", fn_name="trace_replaced") - bitcoind_with_usdts.enable_probe(probe="mempool:rejected", fn_name="trace_rejected") - bpf = BPF(text=PROGRAM, usdt_contexts=[bitcoind_with_usdts]) - - events = [] - - def get_timestamp(): - return datetime.now(timezone.utc) - - def handle_added(_, data, size): - event = bpf["added_events"].event(data) - events.append((get_timestamp(), "added", event)) - - def handle_removed(_, data, size): - event = bpf["removed_events"].event(data) - events.append((get_timestamp(), "removed", event)) - - def handle_rejected(_, data, size): - event = bpf["rejected_events"].event(data) - events.append((get_timestamp(), "rejected", event)) - - def handle_replaced(_, data, size): - event = bpf["replaced_events"].event(data) - events.append((get_timestamp(), "replaced", event)) - - bpf["added_events"].open_perf_buffer(handle_added) - # By default, open_perf_buffer uses eight pages for a buffer, making for a total - # buffer size of 32k on most machines. In practice, this size is insufficient: - # Each `mempool:removed` event takes up 57 bytes in the buffer (32 bytes for txid, - # 9 bytes for removal reason, and 8 bytes each for vsize and fee). Full blocks - # contain around 2k transactions, requiring a buffer size of around 114kB. To cover - # this amount, 32 4k pages are required. - bpf["removed_events"].open_perf_buffer(handle_removed, page_cnt=32) - bpf["rejected_events"].open_perf_buffer(handle_rejected) - bpf["replaced_events"].open_perf_buffer(handle_replaced) - - curses.wrapper(loop, bpf, events) - - -def loop(screen, bpf, events): - dashboard = Dashboard(screen) - while True: - try: - bpf.perf_buffer_poll(timeout=50) - dashboard.render(events) - except KeyboardInterrupt: - exit() - - -class Dashboard: - """Visualization of mempool state using ncurses.""" - - INFO_WIN_HEIGHT = 2 - EVENT_WIN_HEIGHT = 7 - - def __init__(self, screen): - screen.nodelay(True) - curses.curs_set(False) - self._screen = screen - self._time_started = datetime.now(timezone.utc) - self._timestamps = {"added": [], "removed": [], "rejected": [], "replaced": []} - self._event_history = {"added": 0, "removed": 0, "rejected": 0, "replaced": 0} - self._init_windows() - - def _init_windows(self): - """Initialize all windows.""" - self._init_info_win() - self._init_event_count_win() - self._init_event_rate_win() - self._init_event_log_win() - - @staticmethod - def create_win(x, y, height, width, title=None): - """Helper function to create generic windows and decorate them with box and title if requested.""" - win = curses.newwin(height, width, x, y) - if title: - win.box() - win.addstr(0, 2, title, curses.A_BOLD) - return win - - def _init_info_win(self): - """Create and populate the info window.""" - self._info_win = Dashboard.create_win( - x=0, y=1, height=Dashboard.INFO_WIN_HEIGHT, width=22 - ) - self._info_win.addstr(0, 0, "Mempool Monitor", curses.A_REVERSE) - self._info_win.addstr(1, 0, "Press CTRL-C to stop.", curses.A_NORMAL) - self._info_win.refresh() - - def _init_event_count_win(self): - """Create and populate the event count window.""" - self._event_count_win = Dashboard.create_win( - x=3, y=1, height=Dashboard.EVENT_WIN_HEIGHT, width=37, title="Event count" - ) - header = " {:<8} {:>8} {:>7} {:>7} " - self._event_count_win.addstr( - 1, 1, header.format("Event", "total", "1 min", "10 min"), curses.A_UNDERLINE - ) - self._event_count_win.refresh() - - def _init_event_rate_win(self): - """Create and populate the event rate window.""" - self._event_rate_win = Dashboard.create_win( - x=3, y=40, height=Dashboard.EVENT_WIN_HEIGHT, width=42, title="Event rate" - ) - header = " {:<8} {:>9} {:>9} {:>9} " - self._event_rate_win.addstr( - 1, 1, header.format("Event", "total", "1 min", "10 min"), curses.A_UNDERLINE - ) - self._event_rate_win.refresh() - - def _init_event_log_win(self): - """Create windows showing event log. This comprises a dummy boxed window and an - inset window so line breaks don't overwrite box.""" - # dummy boxed window - num_rows, num_cols = self._screen.getmaxyx() - space_above = Dashboard.INFO_WIN_HEIGHT + 1 + Dashboard.EVENT_WIN_HEIGHT + 1 - box_win_height = num_rows - space_above - box_win_width = num_cols - 2 - win_box = Dashboard.create_win( - x=space_above, - y=1, - height=box_win_height, - width=box_win_width, - title="Event log", - ) - # actual logging window - log_lines = box_win_height - 2 # top and bottom box lines - log_line_len = box_win_width - 2 - 1 # box lines and left padding - win = win_box.derwin(log_lines, log_line_len, 1, 2) - win.idlok(True) - win.scrollok(True) - win_box.refresh() - win.refresh() - self._event_log_win_box = win_box - self._event_log_win = win - - def calculate_metrics(self, events): - """Calculate count and rate metrics.""" - count, rate = {}, {} - for event_ts, event_type, event_data in events: - self._timestamps[event_type].append(event_ts) - for event_type, ts in self._timestamps.items(): - # remove timestamps older than ten minutes but keep track of their - # count for the 'total' metric - # - self._event_history[event_type] += len( - [t for t in ts if Dashboard.timestamp_age(t) >= 600] - ) - ts = [t for t in ts if Dashboard.timestamp_age(t) < 600] - self._timestamps[event_type] = ts - # count metric - count_1m = len([t for t in ts if Dashboard.timestamp_age(t) < 60]) - count_10m = len(ts) - count_total = self._event_history[event_type] + len(ts) - count[event_type] = (count_total, count_1m, count_10m) - # rate metric - runtime = Dashboard.timestamp_age(self._time_started) - rate_1m = count_1m / min(60, runtime) - rate_10m = count_10m / min(600, runtime) - rate_total = count_total / runtime - rate[event_type] = (rate_total, rate_1m, rate_10m) - return count, rate - - def _update_event_count(self, count): - """Update the event count window.""" - w = self._event_count_win - row_format = " {:<8} {:>6}tx {:>5}tx {:>5}tx " - for line, metric in enumerate(["added", "removed", "replaced", "rejected"]): - w.addstr(2 + line, 1, row_format.format(metric, *count[metric])) - w.refresh() - - def _update_event_rate(self, rate): - """Update the event rate window.""" - w = self._event_rate_win - row_format = " {:<8} {:>5.1f}tx/s {:>5.1f}tx/s {:>5.1f}tx/s " - for line, metric in enumerate(["added", "removed", "replaced", "rejected"]): - w.addstr(2 + line, 1, row_format.format(metric, *rate[metric])) - w.refresh() - - def _update_event_log(self, events): - """Update the event log window.""" - w = self._event_log_win - for event in events: - w.addstr(Dashboard.parse_event(event) + "\n") - w.refresh() - - def render(self, events): - """Render the dashboard.""" - count, rate = self.calculate_metrics(events) - self._update_event_count(count) - self._update_event_rate(rate) - self._update_event_log(events) - events.clear() - - @staticmethod - def parse_event(event): - """Converts events into human-readable messages""" - - ts_dt, type_, data = event - ts = ts_dt.strftime("%H:%M:%SZ") - if type_ == "added": - return ( - f"{ts} added {bytes(data.hash)[::-1].hex()}" - f" with feerate {data.fee/data.vsize:.2f} sat/vB" - f" ({data.fee} sat, {data.vsize} vbytes)" - ) - - if type_ == "removed": - return ( - f"{ts} removed {bytes(data.hash)[::-1].hex()}" - f" with feerate {data.fee/data.vsize:.2f} sat/vB" - f" ({data.fee} sat, {data.vsize} vbytes)" - f" received {ts_dt.timestamp()-data.entry_time:.1f} seconds ago" - f": {data.reason.decode('UTF-8')}" - ) - - if type_ == "rejected": - return ( - f"{ts} rejected {bytes(data.hash)[::-1].hex()}" - f": {data.reason.decode('UTF-8')}" - ) - - if type_ == "replaced": - return ( - f"{ts} replaced {bytes(data.replaced_hash)[::-1].hex()}" - f" with feerate {data.replaced_fee/data.replaced_vsize:.2f} sat/vB" - f" received {ts_dt.timestamp()-data.replaced_entry_time:.1f} seconds ago" - f" ({data.replaced_fee} sat, {data.replaced_vsize} vbytes)" - f" with {bytes(data.replacement_hash)[::-1].hex()}" - f" with feerate {data.replacement_fee/data.replacement_vsize:.2f} sat/vB" - f" ({data.replacement_fee} sat, {data.replacement_vsize} vbytes)" - ) - - raise NotImplementedError("Unsupported event type: {type_}") - - @staticmethod - def timestamp_age(timestamp): - """Return age of timestamp in seconds.""" - return (datetime.now(timezone.utc) - timestamp).total_seconds() - - -if __name__ == "__main__": - if len(sys.argv) < 2: - print("USAGE: ", sys.argv[0], "path/to/bitcoind") - exit(1) - - path = sys.argv[1] - main(path) diff --git a/contrib/tracing/p2p_monitor.py b/contrib/tracing/p2p_monitor.py deleted file mode 100755 index d6523b1a45..0000000000 --- a/contrib/tracing/p2p_monitor.py +++ /dev/null @@ -1,253 +0,0 @@ -#!/usr/bin/env python3 -# Copyright (c) 2021 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -""" Interactive BGLd P2P network traffic monitor utilizing USDT and the - net:inbound_message and net:outbound_message tracepoints. """ - -# This script demonstrates what USDT for Bitcoin Core can enable. It uses BCC -# (https://github.com/iovisor/bcc) to load a sandboxed eBPF program into the -# Linux kernel (root privileges are required). The eBPF program attaches to two -# statically defined tracepoints. The tracepoint 'net:inbound_message' is called -# when a new P2P message is received, and 'net:outbound_message' is called on -# outbound P2P messages. The eBPF program submits the P2P messages to -# this script via a BPF ring buffer. - -import sys -import curses -from curses import wrapper, panel -from bcc import BPF, USDT - -# BCC: The C program to be compiled to an eBPF program (by BCC) and loaded into -# a sandboxed Linux kernel VM. -program = """ -#include - -// Tor v3 addresses are 62 chars + 6 chars for the port (':12345'). -// I2P addresses are 60 chars + 6 chars for the port (':12345'). -#define MAX_PEER_ADDR_LENGTH 62 + 6 -#define MAX_PEER_CONN_TYPE_LENGTH 20 -#define MAX_MSG_TYPE_LENGTH 20 - -struct p2p_message -{ - u64 peer_id; - char peer_addr[MAX_PEER_ADDR_LENGTH]; - char peer_conn_type[MAX_PEER_CONN_TYPE_LENGTH]; - char msg_type[MAX_MSG_TYPE_LENGTH]; - u64 msg_size; -}; - - -// Two BPF perf buffers for pushing data (here P2P messages) to user space. -BPF_PERF_OUTPUT(inbound_messages); -BPF_PERF_OUTPUT(outbound_messages); - -int trace_inbound_message(struct pt_regs *ctx) { - struct p2p_message msg = {}; - - bpf_usdt_readarg(1, ctx, &msg.peer_id); - bpf_usdt_readarg_p(2, ctx, &msg.peer_addr, MAX_PEER_ADDR_LENGTH); - bpf_usdt_readarg_p(3, ctx, &msg.peer_conn_type, MAX_PEER_CONN_TYPE_LENGTH); - bpf_usdt_readarg_p(4, ctx, &msg.msg_type, MAX_MSG_TYPE_LENGTH); - bpf_usdt_readarg(5, ctx, &msg.msg_size); - - inbound_messages.perf_submit(ctx, &msg, sizeof(msg)); - return 0; -}; - -int trace_outbound_message(struct pt_regs *ctx) { - struct p2p_message msg = {}; - - bpf_usdt_readarg(1, ctx, &msg.peer_id); - bpf_usdt_readarg_p(2, ctx, &msg.peer_addr, MAX_PEER_ADDR_LENGTH); - bpf_usdt_readarg_p(3, ctx, &msg.peer_conn_type, MAX_PEER_CONN_TYPE_LENGTH); - bpf_usdt_readarg_p(4, ctx, &msg.msg_type, MAX_MSG_TYPE_LENGTH); - bpf_usdt_readarg(5, ctx, &msg.msg_size); - - outbound_messages.perf_submit(ctx, &msg, sizeof(msg)); - return 0; -}; -""" - - -class Message: - """ A P2P network message. """ - msg_type = "" - size = 0 - data = bytes() - inbound = False - - def __init__(self, msg_type, size, inbound): - self.msg_type = msg_type - self.size = size - self.inbound = inbound - - -class Peer: - """ A P2P network peer. """ - id = 0 - address = "" - connection_type = "" - last_messages = list() - - total_inbound_msgs = 0 - total_inbound_bytes = 0 - total_outbound_msgs = 0 - total_outbound_bytes = 0 - - def __init__(self, id, address, connection_type): - self.id = id - self.address = address - self.connection_type = connection_type - self.last_messages = list() - - def add_message(self, message): - self.last_messages.append(message) - if len(self.last_messages) > 25: - self.last_messages.pop(0) - if message.inbound: - self.total_inbound_bytes += message.size - self.total_inbound_msgs += 1 - else: - self.total_outbound_bytes += message.size - self.total_outbound_msgs += 1 - - -def main(BGLd_path): - peers = dict() - - BGLd_with_usdts = USDT(path=str(BGLd_path)) - - # attaching the trace functions defined in the BPF program to the tracepoints - BGLd_with_usdts.enable_probe( - probe="inbound_message", fn_name="trace_inbound_message") - BGLd_with_usdts.enable_probe( - probe="outbound_message", fn_name="trace_outbound_message") - bpf = BPF(text=program, usdt_contexts=[BGLd_with_usdts]) - - # BCC: perf buffer handle function for inbound_messages - def handle_inbound(_, data, size): - """ Inbound message handler. - - Called each time a message is submitted to the inbound_messages BPF table.""" - event = bpf["inbound_messages"].event(data) - if event.peer_id not in peers: - peer = Peer(event.peer_id, event.peer_addr.decode( - "utf-8"), event.peer_conn_type.decode("utf-8")) - peers[peer.id] = peer - peers[event.peer_id].add_message( - Message(event.msg_type.decode("utf-8"), event.msg_size, True)) - - # BCC: perf buffer handle function for outbound_messages - def handle_outbound(_, data, size): - """ Outbound message handler. - - Called each time a message is submitted to the outbound_messages BPF table.""" - event = bpf["outbound_messages"].event(data) - if event.peer_id not in peers: - peer = Peer(event.peer_id, event.peer_addr.decode( - "utf-8"), event.peer_conn_type.decode("utf-8")) - peers[peer.id] = peer - peers[event.peer_id].add_message( - Message(event.msg_type.decode("utf-8"), event.msg_size, False)) - - # BCC: add handlers to the inbound and outbound perf buffers - bpf["inbound_messages"].open_perf_buffer(handle_inbound) - bpf["outbound_messages"].open_perf_buffer(handle_outbound) - - wrapper(loop, bpf, peers) - - -def loop(screen, bpf, peers): - screen.nodelay(1) - cur_list_pos = 0 - win = curses.newwin(30, 70, 2, 7) - win.erase() - win.border(ord("|"), ord("|"), ord("-"), ord("-"), - ord("-"), ord("-"), ord("-"), ord("-")) - info_panel = panel.new_panel(win) - info_panel.hide() - - ROWS_AVALIABLE_FOR_LIST = curses.LINES - 5 - scroll = 0 - - while True: - try: - # BCC: poll the perf buffers for new events or timeout after 50ms - bpf.perf_buffer_poll(timeout=50) - - ch = screen.getch() - if (ch == curses.KEY_DOWN or ch == ord("j")) and cur_list_pos < len( - peers.keys()) -1 and info_panel.hidden(): - cur_list_pos += 1 - if cur_list_pos >= ROWS_AVALIABLE_FOR_LIST: - scroll += 1 - if (ch == curses.KEY_UP or ch == ord("k")) and cur_list_pos > 0 and info_panel.hidden(): - cur_list_pos -= 1 - if scroll > 0: - scroll -= 1 - if ch == ord('\n') or ch == ord(' '): - if info_panel.hidden(): - info_panel.show() - else: - info_panel.hide() - screen.erase() - render(screen, peers, cur_list_pos, scroll, ROWS_AVALIABLE_FOR_LIST, info_panel) - curses.panel.update_panels() - screen.refresh() - except KeyboardInterrupt: - exit() - - -def render(screen, peers, cur_list_pos, scroll, ROWS_AVALIABLE_FOR_LIST, info_panel): - """ renders the list of peers and details panel - - This code is unrelated to USDT, BCC and BPF. - """ - header_format = "%6s %-20s %-20s %-22s %-67s" - row_format = "%6s %-5d %9d byte %-5d %9d byte %-22s %-67s" - - screen.addstr(0, 1, (" P2P Message Monitor "), curses.A_REVERSE) - screen.addstr( - 1, 0, (" Navigate with UP/DOWN or J/K and select a peer with ENTER or SPACE to see individual P2P messages"), curses.A_NORMAL) - screen.addstr(3, 0, - header_format % ("PEER", "OUTBOUND", "INBOUND", "TYPE", "ADDR"), curses.A_BOLD | curses.A_UNDERLINE) - peer_list = sorted(peers.keys())[scroll:ROWS_AVALIABLE_FOR_LIST+scroll] - for i, peer_id in enumerate(peer_list): - peer = peers[peer_id] - screen.addstr(i + 4, 0, - row_format % (peer.id, peer.total_outbound_msgs, peer.total_outbound_bytes, - peer.total_inbound_msgs, peer.total_inbound_bytes, - peer.connection_type, peer.address), - curses.A_REVERSE if i + scroll == cur_list_pos else curses.A_NORMAL) - if i + scroll == cur_list_pos: - info_window = info_panel.window() - info_window.erase() - info_window.border( - ord("|"), ord("|"), ord("-"), ord("-"), - ord("-"), ord("-"), ord("-"), ord("-")) - - info_window.addstr( - 1, 1, f"PEER {peer.id} ({peer.address})".center(68), curses.A_REVERSE | curses.A_BOLD) - info_window.addstr( - 2, 1, f" OUR NODE{peer.connection_type:^54}PEER ", - curses.A_BOLD) - for i, msg in enumerate(peer.last_messages): - if msg.inbound: - info_window.addstr( - i + 3, 1, "%68s" % - (f"<--- {msg.msg_type} ({msg.size} bytes) "), curses.A_NORMAL) - else: - info_window.addstr( - i + 3, 1, " %s (%d byte) --->" % - (msg.msg_type, msg.size), curses.A_NORMAL) - - -if __name__ == "__main__": - if len(sys.argv) < 2: - print("USAGE:", sys.argv[0], "path/to/BGLd") - exit() - path = sys.argv[1] - main(path) diff --git a/contrib/travis.sh b/contrib/travis.sh deleted file mode 100755 index 88061b743a..0000000000 --- a/contrib/travis.sh +++ /dev/null @@ -1,68 +0,0 @@ -#!/bin/sh - -set -e -set -x - -if [ "$HOST" = "i686-linux-gnu" ] -then - export CC="$CC -m32" -fi -if [ "$TRAVIS_OS_NAME" = "osx" ] && [ "$TRAVIS_COMPILER" = "gcc" ] -then - export CC="gcc-9" -fi - -./configure \ - --enable-experimental="$EXPERIMENTAL" \ - --with-test-override-wide-multiply="$WIDEMUL" --with-asm="$ASM" \ - --with-ecmult-window="$ECMULTWINDOW" \ - --with-ecmult-gen-precision="$ECMULTGENPRECISION" \ - --enable-module-ecdh="$ECDH" --enable-module-recovery="$RECOVERY" \ - --enable-module-schnorrsig="$SCHNORRSIG" \ - --enable-examples="$EXAMPLES" \ - --with-valgrind="$WITH_VALGRIND" \ - --host="$HOST" $EXTRAFLAGS - -# We have set "-j" in MAKEFLAGS. -make - -# Print information about binaries so that we can see that the architecture is correct -file *tests* || true -file bench* || true -file .libs/* || true - -# This tells `make check` to wrap test invocations. -export LOG_COMPILER="$WRAPPER_CMD" - -make "$BUILD" - -if [ "$BENCH" = "yes" ] -then - # Using the local `libtool` because on macOS the system's libtool has nothing to do with GNU libtool - EXEC='./libtool --mode=execute' - if [ -n "$WRAPPER_CMD" ] - then - EXEC="$EXEC $WRAPPER_CMD" - fi - { - $EXEC ./bench_ecmult - $EXEC ./bench_internal - $EXEC ./bench - } >> bench.log 2>&1 -fi - -if [ "$CTIMETEST" = "yes" ] -then - ./libtool --mode=execute valgrind --error-exitcode=42 ./valgrind_ctime_test > valgrind_ctime_test.log 2>&1 -fi - -# Rebuild precomputed files (if not cross-compiling). -if [ -z "$HOST" ] -then - make clean-precomp - make precomp -fi - -# Check that no repo files have been modified by the build. -# (This fails for example if the precomp files need to be updated in the repo.) -git diff --exit-code diff --git a/contrib/valgrind.supp b/contrib/valgrind.supp deleted file mode 100644 index c4b8082b58..0000000000 --- a/contrib/valgrind.supp +++ /dev/null @@ -1,100 +0,0 @@ -# Valgrind suppressions file for BGL. -# -# Includes known Valgrind warnings in our dependencies that cannot be fixed -# in-tree. -# -# Example use: -# $ valgrind --suppressions=contrib/valgrind.supp src/test/test_BGL -# $ valgrind --suppressions=contrib/valgrind.supp --leak-check=full \ -# --show-leak-kinds=all src/test/test_BGL -# -# To create suppressions for found issues, use the --gen-suppressions=all option: -# $ valgrind --suppressions=contrib/valgrind.supp --leak-check=full \ -# --show-leak-kinds=all --gen-suppressions=all --show-reachable=yes \ -# --error-limit=no src/test/test_BGL -# -# Note that suppressions may depend on OS and/or library versions. -# Tested on: -# * aarch64 (Ubuntu Noble system libs, clang, without gui) -# * x86_64 (Ubuntu Noble system libs, clang, without gui) -{ - Suppress libdb warning - https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=662917 - Memcheck:Cond - obj:*/libdb_cxx-*.so - fun:__log_put -} -{ - Suppress libdb warning - Memcheck:Param - pwrite64(buf) - fun:pwrite - fun:__os_io -} -{ - Suppress libdb warning - Memcheck:Cond - fun:__log_putr.isra.1 -} -{ - Suppress libdb warning - Memcheck:Param - pwrite64(buf) - fun:pwrite - fun:__os_io - obj:*/libdb_cxx-*.so -} -{ - Suppress uninitialized bytes warning in compat code - Memcheck:Param - ioctl(TCSET{S,SW,SF}) - fun:tcsetattr -} -{ - Suppress libdb warning - Memcheck:Leak - fun:malloc - ... - obj:*/libdb_cxx-*.so -} -{ - Suppress leaks on shutdown - Memcheck:Leak - ... - fun:_Z8ShutdownR11NodeContext -} -{ - Suppress leveldb leak - Memcheck:Leak - match-leak-kinds: reachable - fun:_Znwm - ... - fun:_ZN7leveldb6DBImpl14BackgroundCallEv -} -{ - Suppress leveldb leak - Memcheck:Leak - fun:_Znwm - ... - fun:GetCoin -} -{ - Suppress LogInstance still reachable memory warning - Memcheck:Leak - match-leak-kinds: reachable - fun:_Znwm - fun:_Z11LogInstancev -} -{ - Suppress BCLog::Logger::StartLogging() still reachable memory warning - Memcheck:Leak - match-leak-kinds: reachable - fun:malloc - ... - fun:_ZN5BCLog6Logger12StartLoggingEv -} -{ - Suppress https://bugs.kde.org/show_bug.cgi?id=472219 - fixed in Valgrind 3.22. - Memcheck:Param - ppoll(ufds.events) - obj:/lib/ld-musl-aarch64.so.1 -} diff --git a/contrib/verify-binaries/README.md b/contrib/verify-binaries/README.md deleted file mode 100644 index 0f3e16a5bc..0000000000 --- a/contrib/verify-binaries/README.md +++ /dev/null @@ -1,90 +0,0 @@ -### Verify Binaries - -#### Preparation - -As of Bitcoin Core v22.0, releases are signed by a number of public keys on the basis -of the [guix.sigs repository](https://github.com/bitcoin-core/guix.sigs/). When -verifying binary downloads, you (the end user) decide which of these public keys you -trust and then use that trust model to evaluate the signature on a file that contains -hashes of the release binaries. The downloaded binaries are then hashed and compared to -the signed checksum file. - -First, you have to figure out which public keys to recognize. Browse the [list of frequent -builder-keys](https://github.com/bitcoin-core/guix.sigs/tree/main/builder-keys) and -decide which of these keys you would like to trust. For each key you want to trust, you -must obtain that key for your local GPG installation. - -You can obtain these keys by - - through a browser using a key server (e.g. keyserver.ubuntu.com), - - manually using the `gpg --keyserver --recv-keys ` command, or - - you can run the packaged `verify.py --import-keys ...` script to - have it automatically retrieve unrecognized keys. - -#### Usage - -This script attempts to download the checksum file (`SHA256SUMS`) and corresponding -signature file `SHA256SUMS.asc` from https://bitcoincore.org and https://bitcoin.org. - -It first checks if the checksum file is valid based upon a plurality of signatures, and -then downloads the release files specified in the checksum file, and checks if the -hashes of the release files are as expected. - -If we encounter pubkeys in the signature file that we do not recognize, the script -can prompt the user as to whether they'd like to download the pubkeys. To enable -this behavior, use the `--import-keys` flag. - -The script returns 0 if everything passes the checks. It returns 1 if either the -signature check or the hash check doesn't pass. An exit code of >2 indicates an error. - -See the `Config` object for various options. - -#### Examples - -Validate releases with default settings: -```sh -./contrib/verify-binaries/verify.py pub 22.0 -./contrib/verify-binaries/verify.py pub 22.0-rc3 -``` - -Get JSON output and don't prompt for user input (no auto key import): - -```sh -./contrib/verify-binaries/verify.py --json pub 22.0-x86 -./contrib/verify-binaries/verify.py --json pub 23.0-rc5-linux-gnu -``` - -Rely only on local GPG state and manually specified keys, while requiring a -threshold of at least 10 trusted signatures: -```sh -./contrib/verify-binaries/verify.py \ - --trusted-keys 74E2DEF5D77260B98BC19438099BAD163C70FBFA,9D3CC86A72F8494342EA5FD10A41BDC3F4FAFF1C \ - --min-good-sigs 10 pub 22.0-linux -``` - -If you only want to download the binaries for a certain architecture and/or platform, add the corresponding suffix, e.g.: - -```sh -./contrib/verify-binaries/verify.py pub 25.2-x86_64-linux -./contrib/verify-binaries/verify.py pub 24.1-rc1-darwin -./contrib/verify-binaries/verify.py pub 27.0-win64-setup.exe -``` - -If you do not want to keep the downloaded binaries, specify the cleanup option. - -```sh -./contrib/verify-binaries/verify.py pub --cleanup 22.0 -``` - -Use the bin subcommand to verify all files listed in a local checksum file - -```sh -./contrib/verify-binaries/verify.py bin SHA256SUMS -``` - -Verify only a subset of the files listed in a local checksum file - -```sh -./contrib/verify-binaries/verify.py bin ~/Downloads/SHA256SUMS \ - ~/Downloads/bitcoin-24.0.1-x86_64-linux-gnu.tar.gz \ - ~/Downloads/bitcoin-24.0.1-arm-linux-gnueabihf.tar.gz -``` diff --git a/contrib/verify-binaries/test.py b/contrib/verify-binaries/test.py deleted file mode 100755 index 1df0058fbf..0000000000 --- a/contrib/verify-binaries/test.py +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/env python3 - -import json -import sys -import subprocess -from pathlib import Path - - -def main(): - """Tests ordered roughly from faster to slower.""" - expect_code(run_verify('0.32'), 4, "Nonexistent version should fail") - expect_code(run_verify('0.32.awefa.12f9h'), 11, "Malformed version should fail") - expect_code(run_verify('22.0 --min-good-sigs 20'), 9, "--min-good-sigs 20 should fail") - - print("- testing verification (22.0-x86_64-linux-gnu.tar.gz)", flush=True) - _220_x86_64_linux_gnu = run_verify("--json", "pub", "22.0-x86_64-linux-gnu.tar.gz") - try: - result = json.loads(_220_x86_64_linux_gnu.stdout.decode()) - except Exception: - print("failed on 22.0-x86_64-linux-gnu.tar.gz --json:") - print_process_failure(_220_x86_64_linux_gnu) - raise - - expect_code(_220_x86_64_linux_gnu, 0, "22.0-x86_64-linux-gnu.tar.gz should succeed") - v = result['verified_binaries'] - assert result['good_trusted_sigs'] - assert len(v) == 1 - assert v['bitcoin-22.0-x86_64-linux-gnu.tar.gz'] == '59ebd25dd82a51638b7a6bb914586201e67db67b919b2a1ff08925a7936d1b16' - - print("- testing verification (22.0)", flush=True) - _220 = run_verify("--json", "pub", "22.0") - try: - result = json.loads(_220.stdout.decode()) - except Exception: - print("failed on 22.0 --json:") - print_process_failure(_220) - raise - - expect_code(_220, 0, "22.0 should succeed") - v = result['verified_binaries'] - assert result['good_trusted_sigs'] - assert v['bitcoin-22.0-aarch64-linux-gnu.tar.gz'] == 'ac718fed08570a81b3587587872ad85a25173afa5f9fbbd0c03ba4d1714cfa3e' - assert v['bitcoin-22.0-osx64.tar.gz'] == '2744d199c3343b2d94faffdfb2c94d75a630ba27301a70e47b0ad30a7e0155e9' - assert v['bitcoin-22.0-x86_64-linux-gnu.tar.gz'] == '59ebd25dd82a51638b7a6bb914586201e67db67b919b2a1ff08925a7936d1b16' - - -def run_verify(extra: str) -> subprocess.CompletedProcess: - maybe_here = Path.cwd() / 'verify.py' - path = maybe_here if maybe_here.exists() else Path.cwd() / 'contrib' / 'verify-binaries' / 'verify.py' - - return subprocess.run( - f"{path} --cleanup {extra}", - stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) - - -def expect_code(completed: subprocess.CompletedProcess, expected_code: int, msg: str): - if completed.returncode != expected_code: - print(f"{msg!r} failed: got code {completed.returncode}, expected {expected_code}") - print_process_failure(completed) - sys.exit(1) - else: - print(f"✓ {msg!r} passed") - - -def print_process_failure(completed: subprocess.CompletedProcess): - print(f"stdout:\n{completed.stdout.decode()}") - print(f"stderr:\n{completed.stderr.decode()}") - - -if __name__ == '__main__': - main() diff --git a/contrib/verify-binaries/verify.py b/contrib/verify-binaries/verify.py deleted file mode 100755 index 5f942c71b9..0000000000 --- a/contrib/verify-binaries/verify.py +++ /dev/null @@ -1,833 +0,0 @@ -#!/usr/bin/env python3 -# Copyright (c) 2020-2021 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. -"""Script for verifying Bitcoin Core release binaries. - -This script attempts to download the sum file SHA256SUMS and corresponding -signature file SHA256SUMS.asc from bitcoincore.org and bitcoin.org and -compares them. - -The sum-signature file is signed by a number of builder keys. This script -ensures that there is a minimum threshold of signatures from pubkeys that -we trust. This trust is articulated on the basis of configuration options -here, but by default is based upon local GPG trust settings. - -The builder keys are available in the guix.sigs repo: - - https://github.com/bitcoin-core/guix.sigs/tree/main/builder-keys - -If a minimum good, trusted signature threshold is met on the sum file, we then -download the files specified in SHA256SUMS, and check if the hashes of these -files match those that are specified. The script returns 0 if everything passes -the checks. It returns 1 if either the signature check or the hash check -doesn't pass. If an error occurs the return value is >= 2. - -Logging output goes to stderr and final binary verification data goes to stdout. - -JSON output can by obtained by setting env BINVERIFY_JSON=1. -""" -import argparse -import difflib -import json -import logging -import os -import subprocess -import typing as t -import re -import sys -import shutil -import tempfile -import textwrap -import urllib.request -import urllib.error -import enum -from hashlib import sha256 -from pathlib import PurePath, Path - -# The primary host; this will fail if we can't retrieve files from here. -HOST1 = "https://bitcoincore.org" -HOST2 = "https://bitcoin.org" -VERSIONPREFIX = "bitcoin-core-" -SUMS_FILENAME = 'SHA256SUMS' -SIGNATUREFILENAME = f"{SUMS_FILENAME}.asc" - - -class ReturnCode(enum.IntEnum): - SUCCESS = 0 - INTEGRITY_FAILURE = 1 - FILE_GET_FAILED = 4 - FILE_MISSING_FROM_ONE_HOST = 5 - FILES_NOT_EQUAL = 6 - NO_BINARIES_MATCH = 7 - NOT_ENOUGH_GOOD_SIGS = 9 - BINARY_DOWNLOAD_FAILED = 10 - BAD_VERSION = 11 - - -def set_up_logger(is_verbose: bool = True) -> logging.Logger: - """Set up a logger that writes to stderr.""" - log = logging.getLogger(__name__) - log.setLevel(logging.INFO if is_verbose else logging.WARNING) - console = logging.StreamHandler(sys.stderr) # log to stderr - console.setLevel(logging.DEBUG) - formatter = logging.Formatter('[%(levelname)s] %(message)s') - console.setFormatter(formatter) - log.addHandler(console) - return log - - -log = set_up_logger() - - -def indent(output: str) -> str: - return textwrap.indent(output, ' ') - - -def bool_from_env(key, default=False) -> bool: - if key not in os.environ: - return default - raw = os.environ[key] - - if raw.lower() in ('1', 'true'): - return True - elif raw.lower() in ('0', 'false'): - return False - raise ValueError(f"Unrecognized environment value {key}={raw!r}") - - -VERSION_FORMAT = ".[.][-rc[0-9]][-platform]" -VERSION_EXAMPLE = "22.0 or 23.1-rc1-darwin.dmg or 27.0-x86_64-linux-gnu" - -parser = argparse.ArgumentParser(description=__doc__) -parser.add_argument( - 'version', type=str, help=( - f'version of the bitcoin release to download; of the format ' - f'{VERSION_FORMAT}. Example: {VERSION_EXAMPLE}') -) -parser.add_argument( - '-v', '--verbose', action='store_true', - default=bool_from_env('BINVERIFY_VERBOSE'), -) -parser.add_argument( - '-q', '--quiet', action='store_true', - default=bool_from_env('BINVERIFY_QUIET'), -) -parser.add_argument( - '--cleanup', action='store_true', - default=bool_from_env('BINVERIFY_CLEANUP'), - help='if specified, clean up files afterwards' -) -parser.add_argument( - '--import-keys', action='store_true', - default=bool_from_env('BINVERIFY_IMPORTKEYS'), - help='if specified, ask to import each unknown builder key' -) -parser.add_argument( - '--require-all-hosts', action='store_true', - default=bool_from_env('BINVERIFY_REQUIRE_ALL_HOSTS'), - help=( - f'If set, require all hosts ({HOST1}, {HOST2}) to provide signatures. ' - '(Sometimes bitcoin.org lags behind bitcoincore.org.)') -) -parser.add_argument( - '--min-good-sigs', type=int, action='store', nargs='?', - default=int(os.environ.get('BINVERIFY_MIN_GOOD_SIGS', 3)), - help=( - 'The minimum number of good signatures to require successful termination.'), -) -parser.add_argument( - '--keyserver', action='store', nargs='?', - default=os.environ.get('BINVERIFY_KEYSERVER', 'hkp://keyserver.ubuntu.com'), - help='which keyserver to use', -) -parser.add_argument( - '--trusted-keys', action='store', nargs='?', - default=os.environ.get('BINVERIFY_TRUSTED_KEYS', ''), - help='A list of trusted signer GPG keys, separated by commas. Not "trusted keys" in the GPG sense.', -) -parser.add_argument( - '--json', action='store_true', - default=bool_from_env('BINVERIFY_JSON'), - help='If set, output the result as JSON', -) - - -class ReturnCode(enum.IntEnum): - SUCCESS = 0 - INTEGRITY_FAILURE = 1 - FILE_GET_FAILED = 4 - FILE_MISSING_FROM_ONE_HOST = 5 - FILES_NOT_EQUAL = 6 - NO_BINARIES_MATCH = 7 - NOT_ENOUGH_GOOD_SIGS = 9 - BINARY_DOWNLOAD_FAILED = 10 - BAD_VERSION = 11 - - -def set_up_logger(is_verbose: bool = True) -> logging.Logger: - """Set up a logger that writes to stderr.""" - log = logging.getLogger(__name__) - log.setLevel(logging.INFO if is_verbose else logging.WARNING) - console = logging.StreamHandler(sys.stderr) # log to stderr - console.setLevel(logging.DEBUG) - formatter = logging.Formatter('[%(levelname)s] %(message)s') - console.setFormatter(formatter) - log.addHandler(console) - return log - - -log = set_up_logger() - - -def indent(output: str) -> str: - return textwrap.indent(output, ' ') - - -def bool_from_env(key, default=False) -> bool: - if key not in os.environ: - return default - raw = os.environ[key] - - if raw.lower() in ('1', 'true'): - return True - elif raw.lower() in ('0', 'false'): - return False - raise ValueError(f"Unrecognized environment value {key}={raw!r}") - - -VERSION_FORMAT = ".[.][-rc[0-9]][-platform]" -VERSION_EXAMPLE = "22.0-x86_64 or 0.21.0-rc2-osx" - -def parse_version_string(version_str): - # "[-rcN][-platform]" - version_base, _, platform = version_str.partition('-') - rc = "" - if platform.startswith("rc"): # "-rcN[-platform]" - rc, _, platform = platform.partition('-') - # else "" or "-platform" - - return version_base, rc, platform - - -def download_with_wget(remote_file, local_file): - result = subprocess.run(['wget', '-O', local_file, remote_file], - stderr=subprocess.STDOUT, stdout=subprocess.PIPE) - return result.returncode == 0, result.stdout.decode().rstrip() - - -def download_lines_with_urllib(url) -> tuple[bool, list[str]]: - """Get (success, text lines of a file) over HTTP.""" - try: - return (True, [ - line.strip().decode() for line in urllib.request.urlopen(url).readlines()]) - except urllib.error.HTTPError as e: - log.warning(f"HTTP request to {url} failed (HTTPError): {e}") - except Exception as e: - log.warning(f"HTTP request to {url} failed ({e})") - return (False, []) - - -def verify_with_gpg( - filename, - signature_filename, - output_filename: t.Optional[str] = None -) -> tuple[int, str]: - with tempfile.NamedTemporaryFile() as status_file: - args = [ - 'gpg', '--yes', '--verify', '--verify-options', 'show-primary-uid-only', "--status-file", status_file.name, - '--output', output_filename if output_filename else '', signature_filename, filename] - - env = dict(os.environ, LANGUAGE='en') - result = subprocess.run(args, stderr=subprocess.STDOUT, stdout=subprocess.PIPE, env=env) - - gpg_data = status_file.read().decode().rstrip() - - log.debug(f'Result from GPG ({result.returncode}): {result.stdout.decode()}') - log.debug(f"{gpg_data}") - return result.returncode, gpg_data - - -def remove_files(filenames): - for filename in filenames: - os.remove(filename) - - -class SigData: - """GPG signature data as parsed from GPG stdout.""" - def __init__(self): - self.key = None - self.name = "" - self.trusted = False - self.status = "" - - def __bool__(self): - return self.key is not None - - def __repr__(self): - return ( - "SigData(%r, %r, trusted=%s, status=%r)" % - (self.key, self.name, self.trusted, self.status)) - - -def parse_gpg_result( - output: list[str] -) -> tuple[list[SigData], list[SigData], list[SigData]]: - """Returns good, unknown, and bad signatures from GPG stdout.""" - good_sigs: list[SigData] = [] - unknown_sigs: list[SigData] = [] - bad_sigs: list[SigData] = [] - total_resolved_sigs = 0 - - # Ensure that all lines we match on include a prefix that prevents malicious input - # from fooling the parser. - def line_begins_with(patt: str, line: str) -> t.Optional[re.Match]: - return re.match(r'^(\[GNUPG:\])\s+' + patt, line) - - curr_sigs = unknown_sigs - curr_sigdata = SigData() - - for line in output: - if line_begins_with(r"NEWSIG(?:\s|$)", line): - total_resolved_sigs += 1 - if curr_sigdata: - curr_sigs.append(curr_sigdata) - curr_sigdata = SigData() - newsig_split = line.split() - if len(newsig_split) == 3: - curr_sigdata.name = newsig_split[2] - - elif line_begins_with(r"GOODSIG(?:\s|$)", line): - curr_sigdata.key, curr_sigdata.name = line.split(maxsplit=3)[2:4] - curr_sigs = good_sigs - - elif line_begins_with(r"EXPKEYSIG(?:\s|$)", line): - curr_sigdata.key, curr_sigdata.name = line.split(maxsplit=3)[2:4] - curr_sigs = good_sigs - curr_sigdata.status = "expired" - - elif line_begins_with(r"REVKEYSIG(?:\s|$)", line): - curr_sigdata.key, curr_sigdata.name = line.split(maxsplit=3)[2:4] - curr_sigs = good_sigs - curr_sigdata.status = "revoked" - - elif line_begins_with(r"BADSIG(?:\s|$)", line): - curr_sigdata.key, curr_sigdata.name = line.split(maxsplit=3)[2:4] - curr_sigs = bad_sigs - - elif line_begins_with(r"ERRSIG(?:\s|$)", line): - curr_sigdata.key, _, _, _, _, _ = line.split()[2:8] - curr_sigs = unknown_sigs - - elif line_begins_with(r"TRUST_(UNDEFINED|NEVER)(?:\s|$)", line): - curr_sigdata.trusted = False - - elif line_begins_with(r"TRUST_(MARGINAL|FULLY|ULTIMATE)(?:\s|$)", line): - curr_sigdata.trusted = True - - # The last one won't have been added, so add it now - assert curr_sigdata - curr_sigs.append(curr_sigdata) - - all_found = len(good_sigs + bad_sigs + unknown_sigs) - if all_found != total_resolved_sigs: - raise RuntimeError( - f"failed to evaluate all signatures: found {all_found} " - f"but expected {total_resolved_sigs}") - - return (good_sigs, unknown_sigs, bad_sigs) - - -def files_are_equal(filename1, filename2): - with open(filename1, 'rb') as file1: - contents1 = file1.read() - with open(filename2, 'rb') as file2: - contents2 = file2.read() - eq = contents1 == contents2 - - if not eq: - with open(filename1, 'r', encoding='utf-8') as f1, \ - open(filename2, 'r', encoding='utf-8') as f2: - f1lines = f1.readlines() - f2lines = f2.readlines() - - diff = indent( - ''.join(difflib.unified_diff(f1lines, f2lines))) - log.warning(f"found diff in files ({filename1}, {filename2}):\n{diff}\n") - - return eq - - -def get_files_from_hosts_and_compare( - hosts: list[str], path: str, filename: str, require_all: bool = False -) -> ReturnCode: - """ - Retrieve the same file from a number of hosts and ensure they have the same contents. - The first host given will be treated as the "primary" host, and is required to succeed. - - Args: - filename: for writing the file locally. - """ - assert len(hosts) > 1 - primary_host = hosts[0] - other_hosts = hosts[1:] - got_files = [] - - def join_url(host: str) -> str: - return host.rstrip('/') + '/' + path.lstrip('/') - - url = join_url(primary_host) - success, output = download_with_wget(url, filename) - if not success: - log.error( - f"couldn't fetch file ({url}). " - "Have you specified the version number in the following format?\n" - f"{VERSION_FORMAT} " - f"(example: {VERSION_EXAMPLE})\n" - f"wget output:\n{indent(output)}") - return ReturnCode.FILE_GET_FAILED - else: - log.info(f"got file {url} as {filename}") - got_files.append(filename) - - for i, host in enumerate(other_hosts): - url = join_url(host) - fname = filename + f'.{i + 2}' - success, output = download_with_wget(url, fname) - - if require_all and not success: - log.error( - f"{host} failed to provide file ({url}), but {primary_host} did?\n" - f"wget output:\n{indent(output)}") - return ReturnCode.FILE_MISSING_FROM_ONE_HOST - elif not success: - log.warning( - f"{host} failed to provide file ({url}). " - f"Continuing based solely upon {primary_host}.") - else: - log.info(f"got file {url} as {fname}") - got_files.append(fname) - - for i, got_file in enumerate(got_files): - if got_file == got_files[-1]: - break # break on last file, nothing after it to compare to - - compare_to = got_files[i + 1] - if not files_are_equal(got_file, compare_to): - log.error(f"files not equal: {got_file} and {compare_to}") - return ReturnCode.FILES_NOT_EQUAL - - return ReturnCode.SUCCESS - - -def check_multisig(sums_file: str, sigfilename: str, args: argparse.Namespace) -> tuple[int, str, list[SigData], list[SigData], list[SigData]]: - # check signature - # - # We don't write output to a file because this command will almost certainly - # fail with GPG exit code '2' (and so not writing to --output) because of the - # likely presence of multiple untrusted signatures. - retval, output = verify_with_gpg(sums_file, sigfilename) - - if args.verbose: - log.info(f"gpg output:\n{indent(output)}") - - good, unknown, bad = parse_gpg_result(output.splitlines()) - - if unknown and args.import_keys: - # Retrieve unknown keys and then try GPG again. - for unsig in unknown: - if prompt_yn(f" ? Retrieve key {unsig.key} ({unsig.name})? (y/N) "): - ran = subprocess.run( - ["gpg", "--keyserver", args.keyserver, "--recv-keys", unsig.key]) - - if ran.returncode != 0: - log.warning(f"failed to retrieve key {unsig.key}") - - # Reparse the GPG output now that we have more keys - retval, output = verify_with_gpg(sums_file, sigfilename) - good, unknown, bad = parse_gpg_result(output.splitlines()) - - return retval, output, good, unknown, bad - - -def prompt_yn(prompt) -> bool: - """Return true if the user inputs 'y'.""" - got = '' - while got not in ['y', 'n']: - got = input(prompt).lower() - return got == 'y' - -def verify_shasums_signature( - signature_file_path: str, sums_file_path: str, args: argparse.Namespace -) -> tuple[ - ReturnCode, list[SigData], list[SigData], list[SigData], list[SigData] -]: - min_good_sigs = args.min_good_sigs - gpg_allowed_codes = [0, 2] # 2 is returned when untrusted signatures are present. - - gpg_retval, gpg_output, good, unknown, bad = check_multisig(sums_file_path, signature_file_path, args) - - if gpg_retval not in gpg_allowed_codes: - if gpg_retval == 1: - log.critical(f"Bad signature (code: {gpg_retval}).") - else: - log.critical(f"unexpected GPG exit code ({gpg_retval})") - - log.error(f"gpg output:\n{indent(gpg_output)}") - return (ReturnCode.INTEGRITY_FAILURE, [], [], [], []) - - # Decide which keys we trust, though not "trust" in the GPG sense, but rather - # which pubkeys convince us that this sums file is legitimate. In other words, - # which pubkeys within the Bitcoin community do we trust for the purposes of - # binary verification? - trusted_keys = set() - if args.trusted_keys: - trusted_keys |= set(args.trusted_keys.split(',')) - - # Tally signatures and make sure we have enough goods to fulfill - # our threshold. - good_trusted = [sig for sig in good if sig.trusted or sig.key in trusted_keys] - good_untrusted = [sig for sig in good if sig not in good_trusted] - num_trusted = len(good_trusted) + len(good_untrusted) - log.info(f"got {num_trusted} good signatures") - - if num_trusted < min_good_sigs: - log.info("Maybe you need to import " - f"(`gpg --keyserver {args.keyserver} --recv-keys `) " - "some of the following keys: ") - log.info('') - for sig in unknown: - log.info(f" {sig.key} ({sig.name})") - log.info('') - log.error( - "not enough trusted sigs to meet threshold " - f"({num_trusted} vs. {min_good_sigs})") - - return (ReturnCode.NOT_ENOUGH_GOOD_SIGS, [], [], [], []) - - for sig in good_trusted: - log.info(f"GOOD SIGNATURE: {sig}") - - for sig in good_untrusted: - log.info(f"GOOD SIGNATURE (untrusted): {sig}") - - for sig in [sig for sig in good if sig.status == 'expired']: - log.warning(f"key {sig.key} for {sig.name} is expired") - - for sig in bad: - log.warning(f"BAD SIGNATURE: {sig}") - - for sig in unknown: - log.warning(f"UNKNOWN SIGNATURE: {sig}") - - return (ReturnCode.SUCCESS, good_trusted, good_untrusted, unknown, bad) - - -def parse_sums_file(sums_file_path: str, filename_filter: list[str]) -> list[list[str]]: - # extract hashes/filenames of binaries to verify from hash file; - # each line has the following format: " " - with open(sums_file_path, 'r', encoding='utf8') as hash_file: - return [line.split()[:2] for line in hash_file if len(filename_filter) == 0 or any(f in line for f in filename_filter)] - - -def verify_binary_hashes(hashes_to_verify: list[list[str]]) -> tuple[ReturnCode, dict[str, str]]: - offending_files = [] - files_to_hashes = {} - - for hash_expected, binary_filename in hashes_to_verify: - with open(binary_filename, 'rb') as binary_file: - hash_calculated = sha256(binary_file.read()).hexdigest() - if hash_calculated != hash_expected: - offending_files.append(binary_filename) - else: - files_to_hashes[binary_filename] = hash_calculated - - if offending_files: - joined_files = '\n'.join(offending_files) - log.critical( - "Hashes don't match.\n" - f"Offending files:\n{joined_files}") - return (ReturnCode.INTEGRITY_FAILURE, files_to_hashes) - - return (ReturnCode.SUCCESS, files_to_hashes) - - - WORKINGDIR = Path(tempfile.gettempdir()) / f"bitcoin_verify_binaries.{args.version}" - - def cleanup(): - log.info("cleaning up files") - os.chdir(Path.home()) - shutil.rmtree(WORKINGDIR) - - # determine remote dir dependent on provided version string - try: - version_base, version_rc, os_filter = parse_version_string(args.version) - version_tuple = [int(i) for i in version_base.split('.')] - except Exception as e: - log.debug(e) - log.error(f"unable to parse version; expected format is {VERSION_FORMAT}") - log.error(f" e.g. {VERSION_EXAMPLE}") - return ReturnCode.BAD_VERSION - - remote_dir = f"/bin/{VERSIONPREFIX}{version_base}/" - if version_rc: - remote_dir += f"test.{version_rc}/" - remote_sigs_path = remote_dir + SIGNATUREFILENAME - remote_sums_path = remote_dir + SUMS_FILENAME - - # create working directory - os.makedirs(WORKINGDIR, exist_ok=True) - os.chdir(WORKINGDIR) - - hosts = [HOST1, HOST2] - - got_sig_status = get_files_from_hosts_and_compare( - hosts, remote_sigs_path, SIGNATUREFILENAME, args.require_all_hosts) - if got_sig_status != ReturnCode.SUCCESS: - return got_sig_status - - # Multi-sig verification is available after 22.0. - if version_tuple[0] >= 22: - min_good_sigs = args.min_good_sigs - gpg_allowed_codes = [0, 2] # 2 is returned when untrusted signatures are present. - - got_sums_status = get_files_from_hosts_and_compare( - hosts, remote_sums_path, SUMS_FILENAME, args.require_all_hosts) - if got_sums_status != ReturnCode.SUCCESS: - return got_sums_status - - gpg_retval, gpg_output, good, unknown, bad = check_multisig(SIGNATUREFILENAME, args) - else: - log.error("Version too old - single sig not supported. Use a previous " - "version of this script from the repo.") - return ReturnCode.BAD_VERSION - - if gpg_retval not in gpg_allowed_codes: - if gpg_retval == 1: - log.critical(f"Bad signature (code: {gpg_retval}).") - if gpg_retval == 2: - log.critical( - "gpg error. Do you have the Bitcoin Core binary release " - "signing key installed?") - else: - log.critical(f"unexpected GPG exit code ({gpg_retval})") - - log.error(f"gpg output:\n{indent(gpg_output)}") - cleanup() - return ReturnCode.INTEGRITY_FAILURE - - # Extract hashes and filenames - hashes_to_verify = parse_sums_file(SUMS_FILENAME, os_filter) - if not hashes_to_verify: - available_versions = ["-".join(line[1].split("-")[2:]) for line in parse_sums_file(SUMS_FILENAME, [])] - closest_match = difflib.get_close_matches(os_filter, available_versions, cutoff=0, n=1)[0] - log.error(f"No files matched the platform specified. Did you mean: {closest_match}") - return ReturnCode.NO_BINARIES_MATCH - - # remove binaries that are known not to be hosted by bitcoincore.org - fragments_to_remove = ['-unsigned', '-debug', '-codesignatures'] - for fragment in fragments_to_remove: - nobinaries = [i for i in hashes_to_verify if fragment in i[1]] - if nobinaries: - remove_str = ', '.join(i[1] for i in nobinaries) - log.info( - f"removing *{fragment} binaries ({remove_str}) from verification " - f"since {HOST1} does not host *{fragment} binaries") - hashes_to_verify = [i for i in hashes_to_verify if fragment not in i[1]] - - # download binaries - for _, binary_filename in hashes_to_verify: - log.info(f"downloading {binary_filename} to {WORKINGDIR}") - success, output = download_with_wget( - HOST1 + remote_dir + binary_filename, binary_filename) - - if not success: - log.error( - f"failed to download {binary_filename}\n" - f"wget output:\n{indent(output)}") - return ReturnCode.BINARY_DOWNLOAD_FAILED - - # verify hashes - offending_files = [] - files_to_hashes = {} - - for hash_expected, binary_filename in hashes_to_verify: - with open(binary_filename, 'rb') as binary_file: - hash_calculated = sha256(binary_file.read()).hexdigest() - if hash_calculated != hash_expected: - offending_files.append(binary_filename) - else: - files_to_hashes[binary_filename] = hash_calculated - - if offending_files: - joined_files = '\n'.join(offending_files) - log.critical( - "Hashes don't match.\n" - f"Offending files:\n{joined_files}") - return ReturnCode.INTEGRITY_FAILURE - - if args.cleanup: - cleanup() - else: - log.info(f"did not clean up {WORKINGDIR}") - - if args.json: - output = { - 'good_trusted_sigs': [str(s) for s in good_trusted], - 'good_untrusted_sigs': [str(s) for s in good_untrusted], - 'unknown_sigs': [str(s) for s in unknown], - 'bad_sigs': [str(s) for s in bad], - 'verified_binaries': files_to_hashes, - } - print(json.dumps(output, indent=2)) - else: - for filename in files_to_hashes: - print(f"VERIFIED: {filename}") - - return ReturnCode.SUCCESS - - -def verify_binaries_handler(args: argparse.Namespace) -> ReturnCode: - binary_to_basename = {} - for file in args.binary: - binary_to_basename[PurePath(file).name] = file - - sums_sig_path = None - if args.sums_sig_file: - sums_sig_path = Path(args.sums_sig_file) - else: - log.info(f"No signature file specified, assuming it is {args.sums_file}.asc") - sums_sig_path = Path(args.sums_file).with_suffix(".asc") - - # Verify the signature on the SHA256SUMS file - sigs_status, good_trusted, good_untrusted, unknown, bad = verify_shasums_signature(str(sums_sig_path), args.sums_file, args) - if sigs_status != ReturnCode.SUCCESS: - return sigs_status - - # Extract hashes and filenames - hashes_to_verify = parse_sums_file(args.sums_file, [k for k, n in binary_to_basename.items()]) - if not hashes_to_verify: - log.error(f"No files in {args.sums_file} match the specified binaries") - return ReturnCode.NO_BINARIES_MATCH - - # Make sure all files are accounted for - sums_file_path = Path(args.sums_file) - missing_files = [] - files_to_hash = [] - if len(binary_to_basename) > 0: - for file_hash, file in hashes_to_verify: - files_to_hash.append([file_hash, binary_to_basename[file]]) - del binary_to_basename[file] - if len(binary_to_basename) > 0: - log.error(f"Not all specified binaries are in {args.sums_file}") - return ReturnCode.NO_BINARIES_MATCH - else: - log.info(f"No binaries specified, assuming all files specified in {args.sums_file} are located relatively") - for file_hash, file in hashes_to_verify: - file_path = Path(sums_file_path.parent.joinpath(file)) - if file_path.exists(): - files_to_hash.append([file_hash, str(file_path)]) - else: - missing_files.append(file) - - # verify hashes - hashes_status, files_to_hashes = verify_binary_hashes(files_to_hash) - if hashes_status != ReturnCode.SUCCESS: - return hashes_status - - if args.json: - output = { - 'good_trusted_sigs': [str(s) for s in good_trusted], - 'good_untrusted_sigs': [str(s) for s in good_untrusted], - 'unknown_sigs': [str(s) for s in unknown], - 'bad_sigs': [str(s) for s in bad], - 'verified_binaries': files_to_hashes, - "missing_binaries": missing_files, - } - print(json.dumps(output, indent=2)) - else: - for filename in files_to_hashes: - print(f"VERIFIED: {filename}") - for filename in missing_files: - print(f"MISSING: {filename}") - - return ReturnCode.SUCCESS - - -def main(): - parser = argparse.ArgumentParser(description=__doc__) - parser.add_argument( - '-v', '--verbose', action='store_true', - default=bool_from_env('BINVERIFY_VERBOSE'), - ) - parser.add_argument( - '-q', '--quiet', action='store_true', - default=bool_from_env('BINVERIFY_QUIET'), - ) - parser.add_argument( - '--import-keys', action='store_true', - default=bool_from_env('BINVERIFY_IMPORTKEYS'), - help='if specified, ask to import each unknown builder key' - ) - parser.add_argument( - '--min-good-sigs', type=int, action='store', nargs='?', - default=int(os.environ.get('BINVERIFY_MIN_GOOD_SIGS', 3)), - help=( - 'The minimum number of good signatures to require successful termination.'), - ) - parser.add_argument( - '--keyserver', action='store', nargs='?', - default=os.environ.get('BINVERIFY_KEYSERVER', 'hkps://keys.openpgp.org'), - help='which keyserver to use', - ) - parser.add_argument( - '--trusted-keys', action='store', nargs='?', - default=os.environ.get('BINVERIFY_TRUSTED_KEYS', ''), - help='A list of trusted signer GPG keys, separated by commas. Not "trusted keys" in the GPG sense.', - ) - parser.add_argument( - '--json', action='store_true', - default=bool_from_env('BINVERIFY_JSON'), - help='If set, output the result as JSON', - ) - - subparsers = parser.add_subparsers(title="Commands", required=True, dest="command") - - pub_parser = subparsers.add_parser("pub", help="Verify a published release.") - pub_parser.set_defaults(func=verify_published_handler) - pub_parser.add_argument( - 'version', type=str, help=( - f'version of the bitcoin release to download; of the format ' - f'{VERSION_FORMAT}. Example: {VERSION_EXAMPLE}') - ) - pub_parser.add_argument( - '--cleanup', action='store_true', - default=bool_from_env('BINVERIFY_CLEANUP'), - help='if specified, clean up files afterwards' - ) - pub_parser.add_argument( - '--require-all-hosts', action='store_true', - default=bool_from_env('BINVERIFY_REQUIRE_ALL_HOSTS'), - help=( - f'If set, require all hosts ({HOST1}, {HOST2}) to provide signatures. ' - '(Sometimes bitcoin.org lags behind bitcoincore.org.)') - ) - - bin_parser = subparsers.add_parser("bin", help="Verify local binaries.") - bin_parser.set_defaults(func=verify_binaries_handler) - bin_parser.add_argument("--sums-sig-file", "-s", help="Path to the SHA256SUMS.asc file to verify") - bin_parser.add_argument("sums_file", help="Path to the SHA256SUMS file to verify") - bin_parser.add_argument( - "binary", nargs="*", - help="Path to a binary distribution file to verify. Can be specified multiple times for multiple files to verify." - ) - - args = parser.parse_args() - if args.quiet: - log.setLevel(logging.WARNING) - - return args.func(args) - - -if __name__ == '__main__': - sys.exit(main()) diff --git a/contrib/verify-commits/README.md b/contrib/verify-commits/README.md deleted file mode 100644 index 2327067843..0000000000 --- a/contrib/verify-commits/README.md +++ /dev/null @@ -1,61 +0,0 @@ -Tooling for verification of PGP signed commits ----------------------------------------------- - -This is an incomplete work in progress, but currently includes a pre-push hook -script (`pre-push-hook.sh`) for maintainers to ensure that their own commits -are PGP signed (nearly always merge commits), as well as a Python 3 script to verify -commits against a trusted keys list. - - -Using verify-commits.py safely ------------------------------- - -Remember that you can't use an untrusted script to verify itself. This means -that checking out code, then running `verify-commits.py` against `HEAD` is -_not_ safe, because the version of `verify-commits.py` that you just ran could -be backdoored. Instead, you need to use a trusted version of verify-commits -prior to checkout to make sure you're checking out only code signed by trusted -keys: - - ```sh - git fetch origin && \ - ./contrib/verify-commits/verify-commits.py origin/master && \ - git checkout origin/master - ``` - -Note that the above isn't a good UI/UX yet, and needs significant improvements -to make it more convenient and reduce the chance of errors; pull-reqs -improving this process would be much appreciated. - -Unless `--clean-merge 0` is specified, `verify-commits.py` will attempt to verify that -each merge commit applies cleanly (with some exceptions). This requires using at least -git v2.38.0. - -Configuration files -------------------- - -* `trusted-git-root`: This file should contain a single git commit hash which is the first unsigned git commit (hence it is the "root of trust"). -* `trusted-sha512-root-commit`: This file should contain a single git commit hash which is the first commit without a SHA512 root commitment. -* `trusted-keys`: This file should contain a \n-delimited list of all PGP fingerprints of authorized commit signers (primary, not subkeys). -* `allow-revsig-commits`: This file should contain a \n-delimited list of git commit hashes. See next section for more info. - -Import trusted keys -------------------- -In order to check the commit signatures, you must add the trusted PGP keys to your machine. [GnuPG](https://gnupg.org/) may be used to import the trusted keys by running the following command: - -```sh -gpg --keyserver hkps://keys.openpgp.org --recv-keys $(/dev/null - exit $? -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. - 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 - printf '%s\n' "$INPUT" | gpg --trust-model always "$@" 2>/dev/null - exit $? - ;; - # 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 - printf '%s\n' "$INPUT" | gpg --trust-model always --weak-digest sha1 "$@" 2>/dev/null - exit $? -fi diff --git a/contrib/verify-commits/pre-push-hook.sh b/contrib/verify-commits/pre-push-hook.sh deleted file mode 100755 index 539d326313..0000000000 --- a/contrib/verify-commits/pre-push-hook.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env bash -# Copyright (c) 2014-2021 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -export LC_ALL=C -if ! [[ "$2" =~ ^(git@)?(www.)?github.com(:|/)BGL/BGL(.git)?$ ]]; then - exit 0 -fi - -while read LINE; do - set -- A "$LINE" - if [ "$4" != "refs/heads/master" ]; then - continue - fi - if ! ./contrib/verify-commits/verify-commits.py "$3" > /dev/null 2>&1; then - echo "ERROR: A commit is not signed, can't push" - ./contrib/verify-commits/verify-commits.py - exit 1 - fi -done < /dev/stdin diff --git a/contrib/verify-commits/trusted-git-root b/contrib/verify-commits/trusted-git-root deleted file mode 100644 index 7ec318e1ea..0000000000 --- a/contrib/verify-commits/trusted-git-root +++ /dev/null @@ -1 +0,0 @@ -437dfe1c26e752c280014a30f809e62c684ad99e diff --git a/contrib/verify-commits/trusted-keys b/contrib/verify-commits/trusted-keys deleted file mode 100644 index f25486776f..0000000000 --- a/contrib/verify-commits/trusted-keys +++ /dev/null @@ -1,5 +0,0 @@ -E777299FC265DD04793070EB944D35F9AC3DB76A -D1DBF2C4B96F2DEBF4C16654410108112E7EA81F -152812300785C96444D3334D17565732E08E5E41 -6B002C6EA3F91B1B0DF0C9BC8F617F1200A6D25C -4D1B3D5ECBA1A7E05371EEBE46800E30FC748A66 diff --git a/contrib/verify-commits/trusted-sha512-root-commit b/contrib/verify-commits/trusted-sha512-root-commit deleted file mode 100644 index 7d41f90ad7..0000000000 --- a/contrib/verify-commits/trusted-sha512-root-commit +++ /dev/null @@ -1 +0,0 @@ -309bf16257b2395ce502017be627186b749ee749 diff --git a/contrib/verify-commits/verify-commits.py b/contrib/verify-commits/verify-commits.py deleted file mode 100755 index 2f4f6641a1..0000000000 --- a/contrib/verify-commits/verify-commits.py +++ /dev/null @@ -1,204 +0,0 @@ -#!/usr/bin/env python3 -# Copyright (c) 2018-2022 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. -"""Verify commits against a trusted keys list.""" -import argparse -import hashlib -import logging -import os -import subprocess -import sys -import time - -GIT = os.getenv('GIT', 'git') - -def tree_sha512sum(commit='HEAD'): - """Calculate the Tree-sha512 for the commit. - - This is copied from github-merge.py. See https://github.com/BGL-core/BGL-maintainer-tools.""" - - # request metadata for entire tree, recursively - files = [] - blob_by_name = {} - for line in subprocess.check_output([GIT, 'ls-tree', '--full-tree', '-r', commit]).splitlines(): - name_sep = line.index(b'\t') - metadata = line[:name_sep].split() # perms, 'blob', blobid - assert metadata[1] == b'blob' - name = line[name_sep + 1:] - files.append(name) - blob_by_name[name] = metadata[2] - - files.sort() - # open connection to git-cat-file in batch mode to request data for all blobs - # this is much faster than launching it per file - p = subprocess.Popen([GIT, 'cat-file', '--batch'], stdout=subprocess.PIPE, stdin=subprocess.PIPE) - overall = hashlib.sha512() - for f in files: - blob = blob_by_name[f] - # request blob - p.stdin.write(blob + b'\n') - p.stdin.flush() - # read header: blob, "blob", size - reply = p.stdout.readline().split() - assert reply[0] == blob and reply[1] == b'blob' - size = int(reply[2]) - # hash the blob data - intern = hashlib.sha512() - ptr = 0 - while ptr < size: - bs = min(65536, size - ptr) - piece = p.stdout.read(bs) - if len(piece) == bs: - intern.update(piece) - else: - raise IOError('Premature EOF reading git cat-file output') - ptr += bs - dig = intern.hexdigest() - assert p.stdout.read(1) == b'\n' # ignore LF that follows blob data - # update overall hash with file hash - overall.update(dig.encode("utf-8")) - overall.update(" ".encode("utf-8")) - overall.update(f) - overall.update("\n".encode("utf-8")) - p.stdin.close() - if p.wait(): - raise IOError('Non-zero return value executing git cat-file') - return overall.hexdigest() - -def main(): - - # Enable debug logging if running in CI - if 'CI' in os.environ and os.environ['CI'].lower() == "true": - logging.getLogger().setLevel(logging.DEBUG) - - # Parse arguments - parser = argparse.ArgumentParser(usage='%(prog)s [options] [commit id]') - parser.add_argument('--disable-tree-check', action='store_false', dest='verify_tree', help='disable SHA-512 tree check') - parser.add_argument('--clean-merge', type=float, dest='clean_merge', default=float('inf'), help='Only check clean merge after days ago (default: %(default)s)', metavar='NUMBER') - parser.add_argument('commit', nargs='?', default='HEAD', help='Check clean merge up to commit ') - args = parser.parse_args() - - # get directory of this program and read data files - dirname = os.path.dirname(os.path.abspath(__file__)) - print("Using verify-commits data from " + dirname) - with open(dirname + "/trusted-git-root", "r", encoding="utf8") as f: - verified_root = f.read().splitlines()[0] - with open(dirname + "/trusted-sha512-root-commit", "r", encoding="utf8") as f: - verified_sha512_root = f.read().splitlines()[0] - with open(dirname + "/allow-revsig-commits", "r", encoding="utf8") as f: - revsig_allowed = f.read().splitlines() - with open(dirname + "/allow-unclean-merge-commits", "r", encoding="utf8") as f: - unclean_merge_allowed = f.read().splitlines() - with open(dirname + "/allow-incorrect-sha512-commits", "r", encoding="utf8") as f: - incorrect_sha512_allowed = f.read().splitlines() - with open(dirname + "/trusted-keys", "r", encoding="utf8") as f: - trusted_keys = f.read().splitlines() - - # Set commit and variables - current_commit = args.commit - if ' ' in current_commit: - print("Commit must not contain spaces", file=sys.stderr) - sys.exit(1) - verify_tree = args.verify_tree - no_sha1 = True - prev_commit = "" - initial_commit = current_commit - - # Iterate through commits - while True: - - # Log a message to prevent Travis from timing out - logging.debug("verify-commits: [in-progress] processing commit {}".format(current_commit[:8])) - - if current_commit == verified_root: - print('There is a valid path from "{}" to {} where all commits are signed!'.format(initial_commit, verified_root)) - sys.exit(0) - else: - # Make sure this commit isn't older than trusted roots - check_root_older_res = subprocess.run([GIT, "merge-base", "--is-ancestor", verified_root, current_commit]) - if check_root_older_res.returncode != 0: - print(f"\"{current_commit}\" predates the trusted root, stopping!") - sys.exit(0) - - if verify_tree: - if current_commit == verified_sha512_root: - print("All Tree-SHA512s matched up to {}".format(verified_sha512_root), file=sys.stderr) - verify_tree = False - no_sha1 = False - else: - # Skip the tree check if we are older than the trusted root - check_root_older_res = subprocess.run([GIT, "merge-base", "--is-ancestor", verified_sha512_root, current_commit]) - if check_root_older_res.returncode != 0: - print(f"\"{current_commit}\" predates the trusted SHA512 root, disabling tree verification.") - verify_tree = False - no_sha1 = False - - - os.environ['BGL_VERIFY_COMMITS_ALLOW_SHA1'] = "0" if no_sha1 else "1" - allow_revsig = current_commit in revsig_allowed - - # Check that the commit (and parents) was signed with a trusted key - valid_sig = False - verify_res = subprocess.run([GIT, '-c', 'gpg.program={}/gpg.sh'.format(dirname), 'verify-commit', "--raw", current_commit], capture_output=True) - for line in verify_res.stderr.decode().splitlines(): - if line.startswith("[GNUPG:] VALIDSIG "): - key = line.split(" ")[-1] - valid_sig = key in trusted_keys - elif (line.startswith("[GNUPG:] REVKEYSIG ") or line.startswith("[GNUPG:] EXPKEYSIG ")) and not allow_revsig: - valid_sig = False - break - if not valid_sig: - if prev_commit != "": - print("No parent of {} was signed with a trusted key!".format(prev_commit), file=sys.stderr) - print("Parents are:", file=sys.stderr) - parents = subprocess.check_output([GIT, 'show', '-s', '--format=format:%P', prev_commit]).decode('utf8').splitlines()[0].split(' ') - for parent in parents: - subprocess.call([GIT, 'show', '-s', parent], stdout=sys.stderr) - else: - print("{} was not signed with a trusted key!".format(current_commit), file=sys.stderr) - sys.exit(1) - - # Check the Tree-SHA512 - if (verify_tree or prev_commit == "") and current_commit not in incorrect_sha512_allowed: - tree_hash = tree_sha512sum(current_commit) - if ("Tree-SHA512: {}".format(tree_hash)) not in subprocess.check_output([GIT, 'show', '-s', '--format=format:%B', current_commit]).decode('utf8').splitlines(): - print("Tree-SHA512 did not match for commit " + current_commit, file=sys.stderr) - sys.exit(1) - - # Merge commits should only have two parents - parents = subprocess.check_output([GIT, 'show', '-s', '--format=format:%P', current_commit]).decode('utf8').splitlines()[0].split(' ') - if len(parents) > 2: - print("Commit {} is an octopus merge".format(current_commit), file=sys.stderr) - sys.exit(1) - - # Check that the merge commit is clean - commit_time = int(subprocess.check_output([GIT, 'show', '-s', '--format=format:%ct', current_commit]).decode('utf8').splitlines()[0]) - check_merge = commit_time > time.time() - args.clean_merge * 24 * 60 * 60 # Only check commits in clean_merge days - allow_unclean = current_commit in unclean_merge_allowed - if len(parents) == 2 and check_merge and not allow_unclean: - current_tree = subprocess.check_output([GIT, 'show', '--format=%T', current_commit]).decode('utf8').splitlines()[0] - - # This merge-tree functionality requires git >= 2.38. The - # --write-tree option was added in order to opt-in to the new - # behavior. Older versions of git will not recognize the option and - # will instead exit with code 128. - try: - recreated_tree = subprocess.check_output([GIT, "merge-tree", "--write-tree", parents[0], parents[1]]).decode('utf8').splitlines()[0] - except subprocess.CalledProcessError as e: - if e.returncode == 128: - print("git v2.38+ is required for this functionality.", file=sys.stderr) - sys.exit(1) - else: - raise e - - if current_tree != recreated_tree: - print("Merge commit {} is not clean".format(current_commit), file=sys.stderr) - subprocess.call([GIT, 'diff', recreated_tree, current_tree]) - sys.exit(1) - - prev_commit = current_commit - current_commit = parents[0] - -if __name__ == '__main__': - main() diff --git a/contrib/windeploy/detached-sig-create.sh b/contrib/windeploy/detached-sig-create.sh deleted file mode 100755 index 82fcf2d406..0000000000 --- a/contrib/windeploy/detached-sig-create.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/sh -# Copyright (c) 2014-2021 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -export LC_ALL=C -if [ -z "$OSSLSIGNCODE" ]; then - OSSLSIGNCODE=osslsigncode -fi - -if [ -z "$1" ]; then - echo "usage: $0 " - echo "example: $0 -key codesign.key" - exit 1 -fi - -OUT=signature-win.tar.gz -SRCDIR=unsigned -WORKDIR=./.tmp -OUTDIR="${WORKDIR}/out" -OUTSUBDIR="${OUTDIR}/win" -TIMESERVER=http://timestamp.comodoca.com -CERTFILE="win-codesign.cert" - -mkdir -p "${OUTSUBDIR}" -# shellcheck disable=SC2046 -basename -a $(ls -1 "${SRCDIR}"/*-unsigned.exe) | while read UNSIGNED; do - echo Signing "${UNSIGNED}" - "${OSSLSIGNCODE}" sign -certs "${CERTFILE}" -t "${TIMESERVER}" -h sha256 -in "${SRCDIR}/${UNSIGNED}" -out "${WORKDIR}/${UNSIGNED}" "$@" - "${OSSLSIGNCODE}" extract-signature -pem -in "${WORKDIR}/${UNSIGNED}" -out "${OUTSUBDIR}/${UNSIGNED}.pem" && rm "${WORKDIR}/${UNSIGNED}" -done - -rm -f "${OUT}" -tar -C "${OUTDIR}" -czf "${OUT}" . -rm -rf "${WORKDIR}" -echo "Created ${OUT}" diff --git a/contrib/windeploy/win-codesign.cert b/contrib/windeploy/win-codesign.cert deleted file mode 100644 index ec60a3018d..0000000000 --- a/contrib/windeploy/win-codesign.cert +++ /dev/null @@ -1,112 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIHeTCCBWGgAwIBAgIQBzR46J2yq3g++NbQS/BBVDANBgkqhkiG9w0BAQsFADBp -MQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNVBAMT -OERpZ2lDZXJ0IFRydXN0ZWQgRzQgQ29kZSBTaWduaW5nIFJTQTQwOTYgU0hBMzg0 -IDIwMjEgQ0ExMB4XDTI0MDUyMjAwMDAwMFoXDTI3MDUzMTIzNTk1OVowgYAxCzAJ -BgNVBAYTAlVTMREwDwYDVQQIEwhEZWxhd2FyZTEOMAwGA1UEBxMFTGV3ZXMxJjAk -BgNVBAoTHUJpdGNvaW4gQ29yZSBDb2RlIFNpZ25pbmcgTExDMSYwJAYDVQQDEx1C -aXRjb2luIENvcmUgQ29kZSBTaWduaW5nIExMQzCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBALewxfjztuRTDNAGf7zkqqWNEt28CZmVJHoYltVRxtE1BP45 -BfmptH5eM1JC/XosTPytHRFeOkO4YVAtiELxK9S/82OZlKA7Mx7PW6vv1184u8+m -P3WpTN/KAZTaW9fB0ELTSCuqsvXq2crM2T7NudJnSyWh2VBjLfPPCAcYwzyGKQbl -jQWjFEJDJWFK83t9mK/v0WQgA3jGJeaz+V6CYXMS7UgpdG8dUhg9o63gYJZAW5pY -RIsNRcJCM5LHhwEMW5329UsTmYCfP7/53emepbQ0n8ijVZjgaJ+LZ8NspBLSeCiF -9UPCKX82uWiQAUTbYHCfSi3I0f3wQidXL9ZY+PXmalM7BMuQ+c2xEcl97CnhrDzx -EBwZvvOC9wGoG+8+epV4TjUZWf+7QN1ZYeg1rai7c7c8u9ILogE8su2xVoz333TH -CDvScIgnQXmk+cbKMBtg9kM0F+aLWsN2xVf0uAj3U7sdXLrfJeW0DZIktWtTBQzX -O/OE4Ka+1WFnDg0HJIih0cTjl9YYvfe53L4pCGy+qGt/XGBRqCMfXp3g+H9FGR5r -pensVVcsrv3GbTfYdlpdmp9OHH5G57GTAZueobCZg7r7RKK0zPU9EiTLJxzyXuai -v/Ksd8eIhHRjewMaQuAtQM1tO+oKAbLF0v2M7v7/aVT76X32JllYAizm3zjvAgMB -AAGjggIDMIIB/zAfBgNVHSMEGDAWgBRoN+Drtjv4XxGG+/5hewiIZfROQjAdBgNV -HQ4EFgQUvCpU58PIuofv0kHJ3Ty0YDKEy3cwPgYDVR0gBDcwNTAzBgZngQwBBAEw -KTAnBggrBgEFBQcCARYbaHR0cDovL3d3dy5kaWdpY2VydC5jb20vQ1BTMA4GA1Ud -DwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzCBtQYDVR0fBIGtMIGqMFOg -UaBPhk1odHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRD -b2RlU2lnbmluZ1JTQTQwOTZTSEEzODQyMDIxQ0ExLmNybDBToFGgT4ZNaHR0cDov -L2NybDQuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0Q29kZVNpZ25pbmdS -U0E0MDk2U0hBMzg0MjAyMUNBMS5jcmwwgZQGCCsGAQUFBwEBBIGHMIGEMCQGCCsG -AQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wXAYIKwYBBQUHMAKGUGh0 -dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVT -aWduaW5nUlNBNDA5NlNIQTM4NDIwMjFDQTEuY3J0MAkGA1UdEwQCMAAwDQYJKoZI -hvcNAQELBQADggIBADdniG9IY9oOfw1e3+uc2lR4hoZqquJQRrCnbWJ1npnCTavI -CfcEEMuQ5ztg4TR7tQNj2KcaHWKuPYxEz2bg8HpSPG27lnXaz4pLgfqvjdZWNH2v -W6DGRUAwuMQHSV0qhuRcJPZuhwSFx/8y4r++jIcBxCbt/Jprt/bqc8vZZZzTDPfG -M6cGaKMDvF//OkUPVzh4s557kV7+LoaX8CigiACZky3Zj3tkQfJYkEvdQseNvX49 -CMJ+cjN+fGweshbn/DszAT5oXW5l2PXeceyGrE+5Ex1ELXCPqNj8ZSn+S9IKZOag -zDFBA93RTVD438peXPz//xgusgnmSqSPS5tCp9KSvew81acu4v/+egg9EgSSx5Ho -9fkOX7JuygvN3r3UZqsddxdwf2dPvBDYlMdieF8qsR7H5DQPQoaTVrIhW4TFtJl/ -UPjVlnDwu+yvMC70F+CaVgQs01uZ0VKuG3KNkkEj6+V/SM54NVVgcY/Q7llKIFA8 -Qk8Ip8/83cVBptKW+OU+i2ZwoYskLbdfDE31X2knUIouNZgBBMhzc5WjJCEGXAPm -9xYZMn87cc+ejxCw6/WC4b6tDCziO8drq76Pl6LTNPOtRkEVqt12p8Uqi9PgznUB -bdHeoF5XHt1Ca2ySpSYuMz5djwIC2ws8kiMm44/AyTm6dwRcesiOTqnaRc+t ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGsDCCBJigAwIBAgIQCK1AsmDSnEyfXs2pvZOu2TANBgkqhkiG9w0BAQwFADBi -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg -RzQwHhcNMjEwNDI5MDAwMDAwWhcNMzYwNDI4MjM1OTU5WjBpMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRy -dXN0ZWQgRzQgQ29kZSBTaWduaW5nIFJTQTQwOTYgU0hBMzg0IDIwMjEgQ0ExMIIC -IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA1bQvQtAorXi3XdU5WRuxiEL1 -M4zrPYGXcMW7xIUmMJ+kjmjYXPXrNCQH4UtP03hD9BfXHtr50tVnGlJPDqFX/IiZ -wZHMgQM+TXAkZLON4gh9NH1MgFcSa0OamfLFOx/y78tHWhOmTLMBICXzENOLsvsI -8IrgnQnAZaf6mIBJNYc9URnokCF4RS6hnyzhGMIazMXuk0lwQjKP+8bqHPNlaJGi -TUyCEUhSaN4QvRRXXegYE2XFf7JPhSxIpFaENdb5LpyqABXRN/4aBpTCfMjqGzLm -ysL0p6MDDnSlrzm2q2AS4+jWufcx4dyt5Big2MEjR0ezoQ9uo6ttmAaDG7dqZy3S -vUQakhCBj7A7CdfHmzJawv9qYFSLScGT7eG0XOBv6yb5jNWy+TgQ5urOkfW+0/tv -k2E0XLyTRSiDNipmKF+wc86LJiUGsoPUXPYVGUztYuBeM/Lo6OwKp7ADK5GyNnm+ -960IHnWmZcy740hQ83eRGv7bUKJGyGFYmPV8AhY8gyitOYbs1LcNU9D4R+Z1MI3s -MJN2FKZbS110YU0/EpF23r9Yy3IQKUHw1cVtJnZoEUETWJrcJisB9IlNWdt4z4FK -PkBHX8mBUHOFECMhWWCKZFTBzCEa6DgZfGYczXg4RTCZT/9jT0y7qg0IU0F8WD1H -s/q27IwyCQLMbDwMVhECAwEAAaOCAVkwggFVMBIGA1UdEwEB/wQIMAYBAf8CAQAw -HQYDVR0OBBYEFGg34Ou2O/hfEYb7/mF7CIhl9E5CMB8GA1UdIwQYMBaAFOzX44LS -cV1kTN8uZz/nupiuHA9PMA4GA1UdDwEB/wQEAwIBhjATBgNVHSUEDDAKBggrBgEF -BQcDAzB3BggrBgEFBQcBAQRrMGkwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRp -Z2ljZXJ0LmNvbTBBBggrBgEFBQcwAoY1aHR0cDovL2NhY2VydHMuZGlnaWNlcnQu -Y29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcnQwQwYDVR0fBDwwOjA4oDagNIYy -aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5j -cmwwHAYDVR0gBBUwEzAHBgVngQwBAzAIBgZngQwBBAEwDQYJKoZIhvcNAQEMBQAD -ggIBADojRD2NCHbuj7w6mdNW4AIapfhINPMstuZ0ZveUcrEAyq9sMCcTEp6QRJ9L -/Z6jfCbVN7w6XUhtldU/SfQnuxaBRVD9nL22heB2fjdxyyL3WqqQz/WTauPrINHV -UHmImoqKwba9oUgYftzYgBoRGRjNYZmBVvbJ43bnxOQbX0P4PpT/djk9ntSZz0rd -KOtfJqGVWEjVGv7XJz/9kNF2ht0csGBc8w2o7uCJob054ThO2m67Np375SFTWsPK -6Wrxoj7bQ7gzyE84FJKZ9d3OVG3ZXQIUH0AzfAPilbLCIXVzUstG2MQ0HKKlS43N -b3Y3LIU/Gs4m6Ri+kAewQ3+ViCCCcPDMyu/9KTVcH4k4Vfc3iosJocsL6TEa/y4Z -XDlx4b6cpwoG1iZnt5LmTl/eeqxJzy6kdJKt2zyknIYf48FWGysj/4+16oh7cGvm -oLr9Oj9FpsToFpFSi0HASIRLlk2rREDjjfAVKM7t8RhWByovEMQMCGQ8M4+uKIw8 -y4+ICw2/O/TOHnuO77Xry7fwdxPm5yg/rBKupS8ibEH5glwVZsxsDsrFhsP2JjMM -B0ug0wcCampAMEhLNKhRILutG4UI4lkNbcoFUCvqShyepf2gpx8GdOfy1lKQ/a+F -SCH5Vzu0nAPthkX0tGFuv2jiJmCG6sivqf6UHedjGzqGVnhO ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg -RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y -ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If -xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV -ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO -DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ -jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ -CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi -EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM -fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY -uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK -chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t -9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD -ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 -SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd -+SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc -fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa -sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N -cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N -0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie -4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI -r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 -/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm -gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ ------END CERTIFICATE----- diff --git a/contrib/zmq/zmq_sub.py b/contrib/zmq/zmq_sub.py deleted file mode 100755 index 0fca6c5fcc..0000000000 --- a/contrib/zmq/zmq_sub.py +++ /dev/null @@ -1,89 +0,0 @@ -#!/usr/bin/env python3 -# Copyright (c) 2014-2021 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 - - BGL should be started with the command line arguments: - BGLd -testnet -daemon \ - -zmqpubrawtx=tcp://127.0.0.1:28332 \ - -zmqpubrawblock=tcp://127.0.0.1:28332 \ - -zmqpubhashtx=tcp://127.0.0.1:28332 \ - -zmqpubhashblock=tcp://127.0.0.1:28332 \ - -zmqpubsequence=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 asyncio -import zmq -import zmq.asyncio -import signal -import struct -import sys - -if (sys.version_info.major, sys.version_info.minor) < (3, 5): - print("This example only works with Python 3.5 and greater") - sys.exit(1) - -port = 28332 - -class ZMQHandler(): - def __init__(self): - self.loop = asyncio.get_event_loop() - self.zmqContext = zmq.asyncio.Context() - - self.zmqSubSocket = self.zmqContext.socket(zmq.SUB) - self.zmqSubSocket.setsockopt(zmq.RCVHWM, 0) - 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.setsockopt_string(zmq.SUBSCRIBE, "sequence") - self.zmqSubSocket.connect("tcp://127.0.0.1:%i" % port) - - async def handle(self) : - topic, body, seq = await self.zmqSubSocket.recv_multipart() - sequence = "Unknown" - if len(seq) == 4: - sequence = str(struct.unpack(' Sat, 03 Oct 2020 06:04:48 +0300 diff --git a/debian.minimal/build-in-docker.sh b/debian.minimal/build-in-docker.sh deleted file mode 100755 index 494fb6ea6e..0000000000 --- a/debian.minimal/build-in-docker.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash - -set -e - -debuild -S - -finish() { - docker stop $container >/dev/null - docker container rm $container >/dev/null -} - -docker pull ubuntu:22.04 -container=`docker run -dit -e TZ='Etc/UTC' -e DEBIAN_FRONTEND='noninteractive' ubuntu:22.04 ` -trap finish EXIT - -docker exec $container apt-get -y update -docker exec $container apt-get -y install apt-utils devscripts sudo #dpkg-dev -docker exec $container apt-get -y install libsqlite3-dev -docker exec $container mkdir -p /root/repo -docker exec $container useradd user -docker exec $container mkdir /home/user -docker exec $container chown user.user /home/user -docker exec $container sudo -u user mkdir /home/user/build -docker cp ../bitgesell_0.1.13.dsc $container:/root/repo/ -docker cp ../bitgesell_0.1.13.tar.xz $container:/root/repo/ -# docker exec -w /root/repo $container sh -c "dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz" -docker exec -w /root/repo $container sh -c "apt-ftparchive sources . > Sources" -docker exec $container sh -c "echo deb-src [trusted=yes] file:/root/repo ./ >> /etc/apt/sources.list" -docker exec $container apt-get -y -o APT::Sandbox::User=root update -docker exec $container apt-get -y build-dep bitgesell -docker exec $container chmod a+rX /root -docker exec $container chmod -R a+rX /root/repo -docker exec -w /home/user/build $container sudo -u user apt-get -y source bitgesell -docker exec -w /home/user/build/bitgesell-0.1.13 $container sudo -u user debuild -b -docker cp $container:/home/user/build/bitgesell_0.1.13_amd64.deb bitgesell_0.1.13_amd64.deb diff --git a/debian.minimal/changelog b/debian.minimal/changelog deleted file mode 100644 index cc411a4539..0000000000 --- a/debian.minimal/changelog +++ /dev/null @@ -1,62 +0,0 @@ -bitgesell (0.1.13) UNRELEASED; urgency=low - - * Bitcoin code synced - - -- Mathias van Orton Fri, 2 Aug 2024 08:50:00 +0000 - -bitgesell (0.1.12) UNRELEASED; urgency=low - - * Bitcoin code synced - - -- Mathias van Orton Mon, 29 Apr 2024 08:50:00 +0000 - -bitgesell (0.1.11) UNRELEASED; urgency=low - - * Bitcoin code synced - - -- Mathias van Orton Tue, 6 Feb 2024 15:35:00 +0000 - -bitgesell (0.1.10) UNRELEASED; urgency=low - - * Bitcoin code synced - - -- Mathias van Orton Tue, 18 Apr 2023 10:30:15 +0000 - -bitgesell (0.1.9) UNRELEASED; urgency=low - - * Bitcoin code synced - - -- Mathias van Orton Tue, 8 Nov 2022 10:00:00 +0000 - -bitgesell (0.1.8) UNRELEASED; urgency=low - - * Bitcoin code synced - - -- Mathias van Orton Wed, 20 Apr 2022 10:20:00 +0000 - -bitgesell (0.1.7) UNRELEASED; urgency=low - - * Taproot activation rescheduled with relaxed conditions - - -- Mathias van Orton Sun, 4 Jul 2021 14:40:01 +0000 - - -bitgesell (0.1.6) UNRELEASED; urgency=low - - * Code synced with BTC up to April 2021, Taproot activation scheduled - - -- Mathias van Orton Mon, 24 May 2021 11:24:11 +0000 - - -bitgesell (0.1.3) UNRELEASED; urgency=low - - * Updated all builds before testing BTC synced code. - - -- Mathias van Orton Thu, 26 Nov 2020 11:02:18 +0000 - - -bitgesell (0.1.2) UNRELEASED; urgency=low - - * Initial release. - - -- Victor Porton Sat, 03 Oct 2020 06:04:48 +0300 diff --git a/debian.minimal/compat b/debian.minimal/compat deleted file mode 100644 index 48082f72f0..0000000000 --- a/debian.minimal/compat +++ /dev/null @@ -1 +0,0 @@ -12 diff --git a/debian.minimal/control b/debian.minimal/control deleted file mode 100644 index 8995d832b7..0000000000 --- a/debian.minimal/control +++ /dev/null @@ -1,17 +0,0 @@ -Source: bitgesell -Section: misc -Priority: optional -Maintainer: Emma Wu -Build-Depends: debhelper (>=11~), g++-11, pkg-config, dh-autoreconf, libevent-dev, libssl-dev, fakeroot, wget -Standards-Version: 4.1.4 -Homepage: https://github.com/wu-emma/bitgesell - -Package: bitgesell -Architecture: any -Depends: libc6 (>= 2.27), libstdc++6 (>= 8.4.0), libbz2-1.0 (>= 1.0.6), liblzma5 (>= 5.2.2), zlib1g (>= 1:1.1.4), libsqlite3-dev, - openssl, perl-modules-5.34, ${misc:Depends} -Description: BGL is an experimental digital currency that enables instant payments to anyone, anywhere in the world - BGL is an experimental digital currency that enables instant payments to anyone, - anywhere in the world. BGL uses peer-to-peer technology to operate with no central authority: - managing transactions and issuing money are carried out collectively by the network. - BGL Core is the name of open source software which enables the use of this currency. diff --git a/debian.minimal/copyright b/debian.minimal/copyright deleted file mode 100644 index 7235ef128b..0000000000 --- a/debian.minimal/copyright +++ /dev/null @@ -1,3111 +0,0 @@ -Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ -Upstream-Name: bitgesell -Source: https://github.com/wu-emma/bitgesell -# -# Please double check copyright with the licensecheck(1) command. - -Files: Makefile.am - autogen.sh - build-aux/m4/BGL_find_bdb48.m4 - build-aux/m4/BGL_subdir_to_include.m4 - build_msvc/libsecp256k1_config.h - ci/lint/04_install.sh - ci/lint/05_before_script.sh - ci/lint/06_script.sh - ci/test/00_setup_env.sh - ci/test/00_setup_env_arm.sh - ci/test/00_setup_env_i686.sh - ci/test/00_setup_env_mac.sh - ci/test/00_setup_env_mac_host.sh - ci/test/00_setup_env_native_asan.sh - ci/test/00_setup_env_native_centos.sh - ci/test/00_setup_env_native_fuzz.sh - ci/test/00_setup_env_native_nowallet.sh - ci/test/00_setup_env_native_qt5.sh - ci/test/00_setup_env_native_tsan.sh - ci/test/00_setup_env_native_valgrind.sh - ci/test/00_setup_env_s390x.sh - ci/test/00_setup_env_win64.sh - ci/test/03_before_install.sh - ci/test/04_install.sh - ci/test/05_before_script.sh - ci/test/06_script_a.sh - ci/test/06_script_b.sh - ci/test/wrap-valgrind.sh - ci/test_run_all.sh - contrib/BGL-tx.bash-completion - contrib/BGLd.bash-completion - contrib/devtools/copyright_header.py - contrib/devtools/optimize-pngs.py - contrib/devtools/security-check.py - contrib/devtools/symbol-check.py - contrib/devtools/test-security-check.py - contrib/devtools/utxo_snapshot.sh - contrib/linearize/linearize-data.py - contrib/linearize/linearize-hashes.py - contrib/macdeploy/custom_dsstore.py - contrib/macdeploy/detached-sig-apply.sh - contrib/macdeploy/detached-sig-create.sh - contrib/macdeploy/extract-osx-sdk.sh - contrib/qos/tc.sh - contrib/seeds/generate-seeds.py - contrib/testgen/base58.py - contrib/testgen/gen_key_io_test_vectors.py - contrib/verify-commits/gpg.sh - contrib/verify-commits/pre-push-hook.sh - contrib/verify-commits/verify-commits.py - contrib/windeploy/detached-sig-create.sh - contrib/zmq/zmq_sub.py - share/genbuild.sh - share/qt/extract_strings_qt.py - share/rpcauth/rpcauth.py - src/BGL-cli.cpp - src/BGL-tx.cpp - src/BGL-wallet.cpp - src/BGLd.cpp - src/Makefile.am - src/Makefile.bench.include - src/Makefile.leveldb.include - src/Makefile.qt.include - src/Makefile.qttest.include - src/Makefile.test.include - src/Makefile.test_util.include - src/addrdb.cpp - src/addrdb.h - src/addrman.cpp - src/addrman.h - src/amount.h - src/arith_uint256.cpp - src/arith_uint256.h - src/attributes.h - src/banman.cpp - src/banman.h - src/base58.cpp - src/base58.h - src/bech32.cpp - src/bench/base58.cpp - src/bench/bech32.cpp - src/bench/bench.cpp - src/bench/bench.h - src/bench/bench_BGL.cpp - src/bench/block_assemble.cpp - src/bench/ccoins_caching.cpp - src/bench/chacha20.cpp - src/bench/chacha_poly_aead.cpp - src/bench/checkblock.cpp - src/bench/checkqueue.cpp - src/bench/coin_selection.cpp - src/bench/crypto_hash.cpp - src/bench/data.cpp - src/bench/data.h - src/bench/duplicate_inputs.cpp - src/bench/examples.cpp - src/bench/gcs_filter.cpp - src/bench/lockedpool.cpp - src/bench/mempool_eviction.cpp - src/bench/mempool_stress.cpp - src/bench/merkle_root.cpp - src/bench/poly1305.cpp - src/bench/prevector.cpp - src/bench/rollingbloom.cpp - src/bench/rpc_blockchain.cpp - src/bench/rpc_mempool.cpp - src/bench/util_time.cpp - src/bench/verify_script.cpp - src/bench/wallet_balance.cpp - src/blockencodings.cpp - src/blockencodings.h - src/blockfilter.cpp - src/blockfilter.h - src/bloom.cpp - src/bloom.h - src/chain.cpp - src/chain.h - src/chainparams.cpp - src/chainparams.h - src/chainparamsbase.cpp - src/chainparamsbase.h - src/checkqueue.h - src/clientversion.cpp - src/clientversion.h - src/coins.cpp - src/coins.h - src/compat.h - src/compat/byteswap.h - src/compat/cpuid.h - src/compat/endian.h - src/compat/glibc_compat.cpp - src/compat/glibc_sanity.cpp - src/compat/glibc_sanity_fdelt.cpp - src/compat/glibcxx_sanity.cpp - src/compat/sanity.h - src/compat/stdin.cpp - src/compat/stdin.h - src/compat/strnlen.cpp - src/compressor.cpp - src/compressor.h - src/consensus/consensus.h - src/consensus/merkle.cpp - src/consensus/merkle.h - src/consensus/params.h - src/consensus/tx_check.cpp - src/consensus/tx_check.h - src/consensus/tx_verify.cpp - src/consensus/tx_verify.h - src/consensus/validation.h - src/core_io.h - src/core_memusage.h - src/core_read.cpp - src/core_write.cpp - src/crypto/aes.cpp - src/crypto/chacha20.h - src/crypto/chacha_poly_aead.cpp - src/crypto/chacha_poly_aead.h - src/crypto/common.h - src/crypto/ctaes/ctaes.h - src/crypto/ctaes/test.c - src/crypto/hkdf_sha256_32.cpp - src/crypto/hkdf_sha256_32.h - src/crypto/hmac_sha256.cpp - src/crypto/hmac_sha256.h - src/crypto/hmac_sha512.cpp - src/crypto/hmac_sha512.h - src/crypto/poly1305.h - src/crypto/ripemd160.cpp - src/crypto/ripemd160.h - src/crypto/sha1.cpp - src/crypto/sha1.h - src/crypto/sha256.cpp - src/crypto/sha256.h - src/crypto/sha512.cpp - src/crypto/sha512.h - src/crypto/siphash.cpp - src/crypto/siphash.h - src/cuckoocache.h - src/dbwrapper.cpp - src/dbwrapper.h - src/dummywallet.cpp - src/flatfile.cpp - src/flatfile.h - src/fs.h - src/hash.cpp - src/hash.h - src/httprpc.cpp - src/httprpc.h - src/httpserver.cpp - src/httpserver.h - src/index/base.cpp - src/index/base.h - src/index/blockfilterindex.cpp - src/index/blockfilterindex.h - src/index/txindex.cpp - src/index/txindex.h - src/indirectmap.h - src/init.cpp - src/init.h - src/interfaces/chain.cpp - src/interfaces/chain.h - src/interfaces/handler.cpp - src/interfaces/handler.h - src/interfaces/node.cpp - src/interfaces/node.h - src/interfaces/wallet.cpp - src/interfaces/wallet.h - src/key.cpp - src/key.h - src/key_io.cpp - src/key_io.h - src/limitedmap.h - src/logging.cpp - src/logging.h - src/logging/timer.h - src/memusage.h - src/merkleblock.cpp - src/merkleblock.h - src/miner.cpp - src/miner.h - src/net.cpp - src/net.h - src/net_permissions.cpp - src/net_permissions.h - src/net_processing.cpp - src/net_processing.h - src/net_types.h - src/netaddress.cpp - src/netaddress.h - src/netbase.cpp - src/netbase.h - src/netmessagemaker.h - src/node/coin.cpp - src/node/coin.h - src/node/coinstats.cpp - src/node/coinstats.h - src/node/context.cpp - src/node/context.h - src/node/psbt.cpp - src/node/psbt.h - src/node/transaction.cpp - src/node/transaction.h - src/node/utxo_snapshot.h - src/noui.cpp - src/noui.h - src/optional.h - src/outputtype.cpp - src/outputtype.h - src/policy/feerate.cpp - src/policy/feerate.h - src/policy/fees.cpp - src/policy/fees.h - src/policy/policy.h - src/policy/rbf.cpp - src/policy/rbf.h - src/policy/settings.cpp - src/policy/settings.h - src/pow.cpp - src/pow.h - src/prevector.h - src/primitives/block.cpp - src/primitives/block.h - src/primitives/transaction.cpp - src/primitives/transaction.h - src/protocol.cpp - src/protocol.h - src/psbt.cpp - src/psbt.h - src/pubkey.cpp - src/pubkey.h - src/qt/BGL.cpp - src/qt/BGL.h - src/qt/BGLaddressvalidator.cpp - src/qt/BGLaddressvalidator.h - src/qt/BGLamountfield.cpp - src/qt/BGLamountfield.h - src/qt/BGLgui.cpp - src/qt/BGLgui.h - src/qt/BGLunits.cpp - src/qt/BGLunits.h - src/qt/addressbookpage.cpp - src/qt/addressbookpage.h - src/qt/addresstablemodel.cpp - src/qt/addresstablemodel.h - src/qt/askpassphrasedialog.cpp - src/qt/askpassphrasedialog.h - src/qt/bantablemodel.cpp - src/qt/bantablemodel.h - src/qt/clientmodel.cpp - src/qt/clientmodel.h - src/qt/coincontroldialog.cpp - src/qt/coincontroldialog.h - src/qt/coincontroltreewidget.cpp - src/qt/coincontroltreewidget.h - src/qt/createwalletdialog.cpp - src/qt/createwalletdialog.h - src/qt/csvmodelwriter.cpp - src/qt/csvmodelwriter.h - src/qt/editaddressdialog.cpp - src/qt/editaddressdialog.h - src/qt/guiconstants.h - src/qt/guiutil.cpp - src/qt/guiutil.h - src/qt/intro.cpp - src/qt/intro.h - src/qt/macdockiconhandler.h - src/qt/macdockiconhandler.mm - src/qt/macnotificationhandler.h - src/qt/macnotificationhandler.mm - src/qt/macos_appnap.h - src/qt/macos_appnap.mm - src/qt/main.cpp - src/qt/modaloverlay.cpp - src/qt/modaloverlay.h - src/qt/networkstyle.cpp - src/qt/networkstyle.h - src/qt/notificator.cpp - src/qt/notificator.h - src/qt/openuridialog.cpp - src/qt/openuridialog.h - src/qt/optionsdialog.cpp - src/qt/optionsdialog.h - src/qt/optionsmodel.cpp - src/qt/optionsmodel.h - src/qt/overviewpage.cpp - src/qt/overviewpage.h - src/qt/paymentserver.cpp - src/qt/paymentserver.h - src/qt/peertablemodel.cpp - src/qt/peertablemodel.h - src/qt/platformstyle.cpp - src/qt/platformstyle.h - src/qt/qrimagewidget.cpp - src/qt/qrimagewidget.h - src/qt/qvalidatedlineedit.cpp - src/qt/qvalidatedlineedit.h - src/qt/qvaluecombobox.cpp - src/qt/qvaluecombobox.h - src/qt/receivecoinsdialog.cpp - src/qt/receivecoinsdialog.h - src/qt/receiverequestdialog.cpp - src/qt/receiverequestdialog.h - src/qt/recentrequeststablemodel.cpp - src/qt/recentrequeststablemodel.h - src/qt/res/movies/makespinner.sh - src/qt/rpcconsole.cpp - src/qt/rpcconsole.h - src/qt/sendcoinsdialog.cpp - src/qt/sendcoinsdialog.h - src/qt/sendcoinsentry.cpp - src/qt/sendcoinsentry.h - src/qt/sendcoinsrecipient.h - src/qt/signverifymessagedialog.cpp - src/qt/signverifymessagedialog.h - src/qt/splashscreen.cpp - src/qt/splashscreen.h - src/qt/test/apptests.cpp - src/qt/test/apptests.h - src/qt/test/compattests.cpp - src/qt/test/compattests.h - src/qt/test/rpcnestedtests.cpp - src/qt/test/rpcnestedtests.h - src/qt/test/test_main.cpp - src/qt/test/uritests.cpp - src/qt/test/uritests.h - src/qt/trafficgraphwidget.cpp - src/qt/trafficgraphwidget.h - src/qt/transactiondesc.cpp - src/qt/transactiondesc.h - src/qt/transactiondescdialog.cpp - src/qt/transactiondescdialog.h - src/qt/transactionfilterproxy.cpp - src/qt/transactionfilterproxy.h - src/qt/transactionrecord.cpp - src/qt/transactionrecord.h - src/qt/transactiontablemodel.cpp - src/qt/transactiontablemodel.h - src/qt/transactionview.cpp - src/qt/transactionview.h - src/qt/utilitydialog.cpp - src/qt/utilitydialog.h - src/qt/walletcontroller.cpp - src/qt/walletcontroller.h - src/qt/walletframe.cpp - src/qt/walletframe.h - src/qt/walletmodel.cpp - src/qt/walletmodel.h - src/qt/walletmodeltransaction.cpp - src/qt/walletmodeltransaction.h - src/qt/walletview.cpp - src/qt/walletview.h - src/qt/winshutdownmonitor.cpp - src/qt/winshutdownmonitor.h - src/random.cpp - src/random.h - src/randomenv.cpp - src/randomenv.h - src/rest.cpp - src/reverselock.h - src/rpc/blockchain.cpp - src/rpc/blockchain.h - src/rpc/client.cpp - src/rpc/client.h - src/rpc/mining.cpp - src/rpc/misc.cpp - src/rpc/net.cpp - src/rpc/protocol.h - src/rpc/rawtransaction.cpp - src/rpc/rawtransaction_util.cpp - src/rpc/rawtransaction_util.h - src/rpc/register.h - src/rpc/request.cpp - src/rpc/request.h - src/rpc/server.cpp - src/rpc/server.h - src/rpc/util.cpp - src/rpc/util.h - src/scheduler.cpp - src/scheduler.h - src/script/BGLconsensus.cpp - src/script/BGLconsensus.h - src/script/descriptor.cpp - src/script/descriptor.h - src/script/interpreter.cpp - src/script/interpreter.h - src/script/keyorigin.h - src/script/script.cpp - src/script/script.h - src/script/script_error.cpp - src/script/script_error.h - src/script/sigcache.cpp - src/script/sigcache.h - src/script/sign.cpp - src/script/sign.h - src/script/signingprovider.cpp - src/script/signingprovider.h - src/script/standard.cpp - src/script/standard.h - src/secp256k1/contrib/lax_der_parsing.c - src/secp256k1/contrib/lax_der_privatekey_parsing.c - src/secp256k1/src/asm/field_10x26_arm.s - src/secp256k1/src/basic-config.h - src/secp256k1/src/bench.h - src/secp256k1/src/bench_ecdh.c - src/secp256k1/src/bench_ecmult.c - src/secp256k1/src/bench_internal.c - src/secp256k1/src/bench_recover.c - src/secp256k1/src/bench_sign.c - src/secp256k1/src/bench_verify.c - src/secp256k1/src/ecdsa.h - src/secp256k1/src/ecdsa_impl.h - src/secp256k1/src/eckey.h - src/secp256k1/src/eckey_impl.h - src/secp256k1/src/ecmult.h - src/secp256k1/src/ecmult_const.h - src/secp256k1/src/ecmult_const_impl.h - src/secp256k1/src/ecmult_gen.h - src/secp256k1/src/ecmult_gen_impl.h - src/secp256k1/src/ecmult_impl.h - src/secp256k1/src/field.h - src/secp256k1/src/field_10x26.h - src/secp256k1/src/field_10x26_impl.h - src/secp256k1/src/field_5x52.h - src/secp256k1/src/field_5x52_impl.h - src/secp256k1/src/field_5x52_int128_impl.h - src/secp256k1/src/field_impl.h - src/secp256k1/src/gen_context.c - src/secp256k1/src/group.h - src/secp256k1/src/group_impl.h - src/secp256k1/src/hash.h - src/secp256k1/src/hash_impl.h - src/secp256k1/src/modules/ecdh/main_impl.h - src/secp256k1/src/modules/ecdh/tests_impl.h - src/secp256k1/src/modules/recovery/main_impl.h - src/secp256k1/src/modules/recovery/tests_impl.h - src/secp256k1/src/num.h - src/secp256k1/src/num_gmp.h - src/secp256k1/src/num_gmp_impl.h - src/secp256k1/src/num_impl.h - src/secp256k1/src/scalar.h - src/secp256k1/src/scalar_4x64.h - src/secp256k1/src/scalar_4x64_impl.h - src/secp256k1/src/scalar_8x32.h - src/secp256k1/src/scalar_8x32_impl.h - src/secp256k1/src/scalar_impl.h - src/secp256k1/src/scalar_low.h - src/secp256k1/src/scalar_low_impl.h - src/secp256k1/src/scratch.h - src/secp256k1/src/scratch_impl.h - src/secp256k1/src/secp256k1.c - src/secp256k1/src/testrand.h - src/secp256k1/src/testrand_impl.h - src/secp256k1/src/tests.c - src/secp256k1/src/tests_exhaustive.c - src/secp256k1/src/util.h - src/serialize.h - src/shutdown.cpp - src/shutdown.h - src/span.h - src/streams.h - src/support/allocators/secure.h - src/support/allocators/zeroafterfree.h - src/support/cleanse.cpp - src/support/cleanse.h - src/support/events.h - src/support/lockedpool.cpp - src/support/lockedpool.h - src/sync.cpp - src/sync.h - src/test/addrman_tests.cpp - src/test/allocator_tests.cpp - src/test/amount_tests.cpp - src/test/arith_uint256_tests.cpp - src/test/base32_tests.cpp - src/test/base58_tests.cpp - src/test/base64_tests.cpp - src/test/bech32_tests.cpp - src/test/bip32_tests.cpp - src/test/blockencodings_tests.cpp - src/test/blockfilter_index_tests.cpp - src/test/blockfilter_tests.cpp - src/test/bloom_tests.cpp - src/test/bswap_tests.cpp - src/test/checkqueue_tests.cpp - src/test/coins_tests.cpp - src/test/compilerbug_tests.cpp - src/test/compress_tests.cpp - src/test/crypto_tests.cpp - src/test/cuckoocache_tests.cpp - src/test/dbwrapper_tests.cpp - src/test/descriptor_tests.cpp - src/test/flatfile_tests.cpp - src/test/fs_tests.cpp - src/test/fuzz/base_encode_decode.cpp - src/test/fuzz/bech32.cpp - src/test/fuzz/block.cpp - src/test/fuzz/descriptor_parse.cpp - src/test/fuzz/deserialize.cpp - src/test/fuzz/eval_script.cpp - src/test/fuzz/fuzz.cpp - src/test/fuzz/fuzz.h - src/test/fuzz/hex.cpp - src/test/fuzz/integer.cpp - src/test/fuzz/parse_hd_keypath.cpp - src/test/fuzz/parse_iso8601.cpp - src/test/fuzz/parse_numbers.cpp - src/test/fuzz/parse_script.cpp - src/test/fuzz/parse_univalue.cpp - src/test/fuzz/psbt.cpp - src/test/fuzz/script.cpp - src/test/fuzz/script_flags.cpp - src/test/fuzz/spanparsing.cpp - src/test/fuzz/transaction.cpp - src/test/fuzz/tx_in.cpp - src/test/fuzz/tx_out.cpp - src/test/gen/crypto_gen.cpp - src/test/gen/crypto_gen.h - src/test/getarg_tests.cpp - src/test/hash_tests.cpp - src/test/key_io_tests.cpp - src/test/key_properties.cpp - src/test/key_tests.cpp - src/test/limitedmap_tests.cpp - src/test/logging_tests.cpp - src/test/main.cpp - src/test/mempool_tests.cpp - src/test/merkle_tests.cpp - src/test/merkleblock_tests.cpp - src/test/miner_tests.cpp - src/test/multisig_tests.cpp - src/test/net_tests.cpp - src/test/netbase_tests.cpp - src/test/pmt_tests.cpp - src/test/policyestimator_tests.cpp - src/test/pow_tests.cpp - src/test/prevector_tests.cpp - src/test/raii_event_tests.cpp - src/test/random_tests.cpp - src/test/reverselock_tests.cpp - src/test/rpc_tests.cpp - src/test/sanity_tests.cpp - src/test/scheduler_tests.cpp - src/test/script_p2sh_tests.cpp - src/test/script_standard_tests.cpp - src/test/script_tests.cpp - src/test/scriptnum10.h - src/test/scriptnum_tests.cpp - src/test/serialize_tests.cpp - src/test/settings_tests.cpp - src/test/sighash_tests.cpp - src/test/sigopcount_tests.cpp - src/test/skiplist_tests.cpp - src/test/streams_tests.cpp - src/test/sync_tests.cpp - src/test/timedata_tests.cpp - src/test/torcontrol_tests.cpp - src/test/transaction_tests.cpp - src/test/txindex_tests.cpp - src/test/txvalidation_tests.cpp - src/test/txvalidationcache_tests.cpp - src/test/uint256_tests.cpp - src/test/util/blockfilter.cpp - src/test/util/blockfilter.h - src/test/util/logging.cpp - src/test/util/logging.h - src/test/util/mining.cpp - src/test/util/mining.h - src/test/util/setup_common.cpp - src/test/util/setup_common.h - src/test/util/str.cpp - src/test/util/str.h - src/test/util/transaction_utils.cpp - src/test/util/transaction_utils.h - src/test/util/wallet.cpp - src/test/util/wallet.h - src/test/util_tests.cpp - src/test/util_threadnames_tests.cpp - src/test/validation_block_tests.cpp - src/test/validation_tests.cpp - src/test/versionbits_tests.cpp - src/threadinterrupt.cpp - src/threadinterrupt.h - src/threadsafety.h - src/timedata.cpp - src/timedata.h - src/torcontrol.cpp - src/txdb.cpp - src/txdb.h - src/txmempool.cpp - src/txmempool.h - src/ui_interface.cpp - src/ui_interface.h - src/uint256.cpp - src/uint256.h - src/undo.h - src/univalue/include/univalue.h - src/univalue/lib/univalue.cpp - src/univalue/lib/univalue_get.cpp - src/univalue/lib/univalue_read.cpp - src/univalue/lib/univalue_utffilter.h - src/univalue/lib/univalue_write.cpp - src/univalue/test/object.cpp - src/univalue/test/unitester.cpp - src/util/bip32.cpp - src/util/bip32.h - src/util/bytevectorhash.cpp - src/util/bytevectorhash.h - src/util/check.h - src/util/error.cpp - src/util/error.h - src/util/fees.cpp - src/util/fees.h - src/util/macros.h - src/util/memory.h - src/util/moneystr.cpp - src/util/rbf.cpp - src/util/rbf.h - src/util/settings.cpp - src/util/settings.h - src/util/spanparsing.cpp - src/util/spanparsing.h - src/util/strencodings.cpp - src/util/string.cpp - src/util/string.h - src/util/system.cpp - src/util/threadnames.cpp - src/util/threadnames.h - src/util/time.cpp - src/util/time.h - src/util/translation.h - src/util/url.cpp - src/util/url.h - src/util/validation.cpp - src/util/validation.h - src/util/vector.h - src/validation.cpp - src/validation.h - src/validationinterface.cpp - src/validationinterface.h - src/version.h - src/versionbits.cpp - src/versionbits.h - src/versionbitsinfo.cpp - src/versionbitsinfo.h - src/wallet/coincontrol.cpp - src/wallet/coincontrol.h - src/wallet/coinselection.cpp - src/wallet/coinselection.h - src/wallet/crypter.cpp - src/wallet/crypter.h - src/wallet/db.cpp - src/wallet/db.h - src/wallet/feebumper.cpp - src/wallet/feebumper.h - src/wallet/fees.cpp - src/wallet/fees.h - src/wallet/init.cpp - src/wallet/ismine.h - src/wallet/load.cpp - src/wallet/load.h - src/wallet/psbtwallet.cpp - src/wallet/psbtwallet.h - src/wallet/rpcdump.cpp - src/wallet/rpcwallet.cpp - src/wallet/rpcwallet.h - src/wallet/scriptpubkeyman.cpp - src/wallet/scriptpubkeyman.h - src/wallet/test/coinselector_tests.cpp - src/wallet/test/db_tests.cpp - src/wallet/test/init_test_fixture.cpp - src/wallet/test/init_test_fixture.h - src/wallet/test/init_tests.cpp - src/wallet/test/ismine_tests.cpp - src/wallet/test/psbt_wallet_tests.cpp - src/wallet/test/wallet_crypto_tests.cpp - src/wallet/test/wallet_test_fixture.cpp - src/wallet/test/wallet_test_fixture.h - src/wallet/test/wallet_tests.cpp - src/wallet/wallet.cpp - src/wallet/wallet.h - src/wallet/walletdb.cpp - src/wallet/walletdb.h - src/wallet/wallettool.cpp - src/wallet/wallettool.h - src/wallet/walletutil.cpp - src/wallet/walletutil.h - src/walletinitinterface.h - src/warnings.cpp - src/warnings.h - src/zmq/zmqabstractnotifier.cpp - src/zmq/zmqabstractnotifier.h - src/zmq/zmqconfig.h - src/zmq/zmqnotificationinterface.cpp - src/zmq/zmqnotificationinterface.h - src/zmq/zmqpublishnotifier.cpp - src/zmq/zmqpublishnotifier.h - src/zmq/zmqrpc.cpp - src/zmq/zmqrpc.h - test/functional/create_cache.py - test/functional/data/invalid_txs.py - test/functional/example_test.py - test/functional/feature_abortnode.py - test/functional/feature_assumevalid.py - test/functional/feature_bip68_sequence.py - test/functional/feature_block.py - test/functional/feature_blocksdir.py - test/functional/feature_cltv.py - test/functional/feature_config_args.py - test/functional/feature_csv_activation.py - test/functional/feature_dbcrash.py - test/functional/feature_dersig.py - test/functional/feature_fee_estimation.py - test/functional/feature_filelock.py - test/functional/feature_help.py - test/functional/feature_includeconf.py - test/functional/feature_loadblock.py - test/functional/feature_logging.py - test/functional/feature_maxuploadtarget.py - test/functional/feature_minchainwork.py - test/functional/feature_notifications.py - test/functional/feature_nulldummy.py - test/functional/feature_proxy.py - test/functional/feature_pruning.py - test/functional/feature_rbf.py - test/functional/feature_reindex.py - test/functional/feature_segwit.py - test/functional/feature_shutdown.py - test/functional/feature_uacomment.py - test/functional/feature_versionbits_warning.py - test/functional/interface_BGL_cli.py - test/functional/interface_http.py - test/functional/interface_rest.py - test/functional/interface_rpc.py - test/functional/interface_zmq.py - test/functional/mempool_accept.py - test/functional/mempool_limit.py - test/functional/mempool_package_onemore.py - test/functional/mempool_packages.py - test/functional/mempool_persist.py - test/functional/mempool_reorg.py - test/functional/mempool_resurrect.py - test/functional/mempool_spend_coinbase.py - test/functional/mining_basic.py - test/functional/mining_getblocktemplate_longpoll.py - test/functional/mining_prioritisetransaction.py - test/functional/p2p_blocksonly.py - test/functional/p2p_compactblocks.py - test/functional/p2p_disconnect_ban.py - test/functional/p2p_dos_header_tree.py - test/functional/p2p_feefilter.py - test/functional/p2p_fingerprint.py - test/functional/p2p_invalid_block.py - test/functional/p2p_invalid_locator.py - test/functional/p2p_invalid_messages.py - test/functional/p2p_invalid_tx.py - test/functional/p2p_leak.py - test/functional/p2p_leak_tx.py - test/functional/p2p_mempool.py - test/functional/p2p_node_network_limited.py - test/functional/p2p_permissions.py - test/functional/p2p_segwit.py - test/functional/p2p_sendheaders.py - test/functional/p2p_timeouts.py - test/functional/p2p_tx_download.py - test/functional/p2p_unrequested_blocks.py - test/functional/rpc_bind.py - test/functional/rpc_blockchain.py - test/functional/rpc_createmultisig.py - test/functional/rpc_decodescript.py - test/functional/rpc_deprecated.py - test/functional/rpc_deriveaddresses.py - test/functional/rpc_dumptxoutset.py - test/functional/rpc_fundrawtransaction.py - test/functional/rpc_getblockfilter.py - test/functional/rpc_getchaintips.py - test/functional/rpc_help.py - test/functional/rpc_invalidateblock.py - test/functional/rpc_misc.py - test/functional/rpc_named_arguments.py - test/functional/rpc_net.py - test/functional/rpc_preciousblock.py - test/functional/rpc_psbt.py - test/functional/rpc_rawtransaction.py - test/functional/rpc_scantxoutset.py - test/functional/rpc_setban.py - test/functional/rpc_signmessage.py - test/functional/rpc_signrawtransaction.py - test/functional/rpc_txoutproof.py - test/functional/rpc_uptime.py - test/functional/rpc_users.py - test/functional/rpc_whitelist.py - test/functional/test_framework/address.py - test/functional/test_framework/blocktools.py - test/functional/test_framework/coverage.py - test/functional/test_framework/descriptors.py - test/functional/test_framework/key.py - test/functional/test_framework/messages.py - test/functional/test_framework/mininode.py - test/functional/test_framework/netutil.py - test/functional/test_framework/script.py - test/functional/test_framework/script_util.py - test/functional/test_framework/segwit_addr.py - test/functional/test_framework/siphash.py - test/functional/test_framework/socks5.py - test/functional/test_framework/test_framework.py - test/functional/test_framework/test_node.py - test/functional/test_framework/test_shell.py - test/functional/test_framework/util.py - test/functional/test_framework/wallet_util.py - test/functional/test_runner.py - test/functional/tool_wallet.py - test/functional/wallet_abandonconflict.py - test/functional/wallet_address_types.py - test/functional/wallet_avoidreuse.py - test/functional/wallet_backup.py - test/functional/wallet_balance.py - test/functional/wallet_basic.py - test/functional/wallet_bumpfee.py - test/functional/wallet_bumpfee_totalfee_deprecation.py - test/functional/wallet_coinbase_category.py - test/functional/wallet_create_tx.py - test/functional/wallet_createwallet.py - test/functional/wallet_disable.py - test/functional/wallet_dump.py - test/functional/wallet_encryption.py - test/functional/wallet_fallbackfee.py - test/functional/wallet_groups.py - test/functional/wallet_hd.py - test/functional/wallet_implicitsegwit.py - test/functional/wallet_import_rescan.py - test/functional/wallet_import_with_label.py - test/functional/wallet_importmulti.py - test/functional/wallet_importprunedfunds.py - test/functional/wallet_keypool.py - test/functional/wallet_keypool_topup.py - test/functional/wallet_labels.py - test/functional/wallet_listreceivedby.py - test/functional/wallet_listsinceblock.py - test/functional/wallet_listtransactions.py - test/functional/wallet_multiwallet.py - test/functional/wallet_reorgsrestore.py - test/functional/wallet_resendwallettransactions.py - test/functional/wallet_txn_clone.py - test/functional/wallet_txn_doublespend.py - test/functional/wallet_watchonly.py - test/functional/wallet_zapwallettxes.py - test/fuzz/test_runner.py - test/lint/check-doc.py - test/lint/check-rpc-mappings.py - test/lint/extended-lint-cppcheck.sh - test/lint/git-subtree-check.sh - test/lint/lint-filenames.sh - test/util/BGL-util-test.py - test/util/rpcauth-test.py -Copyright: 2009-2010 Satoshi Nakamoto - 2009-2018 The Bitcoin Core developers - 2009-2019 The Bitcoin Core developers Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. - 2010 ArtForz -- public domain half-a-node - 2012 Jeff Garzik - 2012 Pieter Wuille - 2013-2015 Pieter Wuille, Gregory Maxwell Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. - 2013-2015 Thomas Daede, Cory Fields Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. - 2013-2017 Pieter Wuille, Andrew Poelstra Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. - 2013-2017 Pieter Wuille, Andrew Poelstra, Jonas Nick Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. - 2013-2019 Pieter Wuille Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. - 2014 BitPay Inc. - 2014 BitPay Inc. Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. - 2014 BitPay Inc. Distributed under the MIT/X11 software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. - 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. - 2015 BGL Core Developers Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. - 2015-2017 Andrew Poelstra Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. - 2016 Jeremy Rubin Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. - 2017 The Zcash developers Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. - 2019 The BGL Core developers Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. -License: __NO_LICENSE__ - -Files: .appveyor.yml - .cirrus.yml - .gitattributes - .github/PULL_REQUEST_TEMPLATE.md - .gitignore - .python-version - .style.yapf - .tx/config - INSTALL.md - README.md - SECURITY.md - autom4te.cache/requests - autom4te.cache/traces.1 - autom4te.cache/traces.2 - build_msvc/.gitignore - build_msvc/BGL.sln - build_msvc/BGL_config.h - build_msvc/README.md - build_msvc/msvc-autogen.py - build_msvc/testconsensus/testconsensus.cpp - build_msvc/vcpkg-packages.txt - ci/README.md - ci/retry/README.md - ci/retry/retry - configure.ac - contrib/BGL-qt.pro - contrib/README.md - contrib/devtools/README.md - contrib/devtools/circular-dependencies.py - contrib/devtools/gen-manpages.sh - contrib/devtools/split-debug.sh.in - contrib/filter-lcov.py - contrib/gitian-build.py - contrib/gitian-descriptors/gitian-linux.yml - contrib/gitian-descriptors/gitian-osx-signer.yml - contrib/gitian-descriptors/gitian-osx.yml - contrib/gitian-descriptors/gitian-win-signer.yml - contrib/gitian-descriptors/gitian-win.yml - contrib/gitian-keys/README.md - contrib/gitian-keys/keys.txt - contrib/guix/README.md - contrib/guix/guix-build.sh - contrib/guix/libexec/build.sh - contrib/guix/manifest.scm - contrib/init/BGLd.conf - contrib/init/BGLd.init - contrib/init/BGLd.openrc - contrib/init/BGLd.openrcconf - contrib/init/BGLd.service - contrib/init/README.md - contrib/install_db4.sh - contrib/linearize/README.md - contrib/linearize/example-linearize.cfg - contrib/macdeploy/README.md - contrib/qos/README.md - contrib/seeds/README.md - contrib/seeds/nodes_main.txt - contrib/seeds/nodes_test.txt - contrib/testgen/README.md - contrib/valgrind.supp - contrib/verify-commits/README.md - contrib/verify-commits/allow-incorrect-sha512-commits - contrib/verify-commits/allow-revsig-commits - contrib/verify-commits/allow-unclean-merge-commits - contrib/verify-commits/trusted-git-root - contrib/verify-commits/trusted-keys - contrib/verify-commits/trusted-sha512-root-commit - contrib/verifybinaries/README.md - contrib/windeploy/win-codesign.cert - depends/.gitignore - depends/Makefile - depends/README.md - depends/builders/darwin.mk - depends/builders/default.mk - depends/builders/linux.mk - depends/config.site.in - depends/description.md - depends/funcs.mk - depends/hosts/android.mk - depends/hosts/darwin.mk - depends/hosts/default.mk - depends/hosts/linux.mk - depends/hosts/mingw32.mk - depends/packages.md - depends/packages/bdb.mk - depends/packages/boost.mk - depends/packages/expat.mk - depends/packages/fontconfig.mk - depends/packages/freetype.mk - depends/packages/libXau.mk - depends/packages/libevent.mk - depends/packages/libxcb.mk - depends/packages/miniupnpc.mk - depends/packages/native_biplist.mk - depends/packages/native_cctools.mk - depends/packages/native_cdrkit.mk - depends/packages/native_ds_store.mk - depends/packages/native_libdmg-hfsplus.mk - depends/packages/native_mac_alias.mk - depends/packages/packages.mk - depends/packages/qrencode.mk - depends/packages/qt.mk - depends/packages/rapidcheck.mk - depends/packages/xcb_proto.mk - depends/packages/xproto.mk - depends/packages/zeromq.mk - depends/packages/zlib.mk - depends/patches/native_cdrkit/cdrkit-deterministic.patch - depends/patches/native_libdmg-hfsplus/remove-libcrypto-dependency.patch - depends/patches/qt/fix_android_jni_static.patch - depends/patches/qt/fix_android_qmake_conf.patch - depends/patches/qt/fix_configure_mac.patch - depends/patches/qt/fix_no_printer.patch - depends/patches/qt/fix_qt_pkgconfig.patch - depends/patches/qt/fix_rcc_determinism.patch - depends/patches/qt/fix_riscv64_arch.patch - depends/patches/qt/mac-qmake.conf - depends/patches/qt/no-xlib.patch - depends/patches/qt/xkb-default.patch - depends/patches/zeromq/0001-fix-build-with-older-mingw64.patch - depends/patches/zeromq/0002-disable-pthread_set_name_np.patch - doc/.gitignore - doc/BGL-conf.md - doc/BGL_logo_doxygen.png - doc/Doxyfile.in - doc/JSON-RPC-interface.md - doc/README.md - doc/README_doxygen.md - doc/README_windows.txt - doc/REST-interface.md - doc/assets-attribution.md - doc/benchmarking.md - doc/bips.md - doc/build-freebsd.md - doc/build-netbsd.md - doc/build-openbsd.md - doc/build-unix.md - doc/build-windows.md - doc/dependencies.md - doc/descriptors.md - doc/developer-notes.md - doc/dnsseed-policy.md - doc/files.md - doc/fuzzing.md - doc/gitian-building.md - doc/init.md - doc/man/Makefile.am - doc/productivity.md - doc/psbt.md - doc/rapidcheck.md - doc/reduce-memory.md - doc/reduce-traffic.md - doc/release-notes-15437.md - doc/release-notes-15954.md - doc/release-notes-17056.md - doc/release-notes-17410.md - doc/release-notes-17437.md - doc/release-notes.md - doc/release-notes/release-notes-0.10.0.md - doc/release-notes/release-notes-0.10.1.md - doc/release-notes/release-notes-0.10.2.md - doc/release-notes/release-notes-0.10.3.md - doc/release-notes/release-notes-0.10.4.md - doc/release-notes/release-notes-0.11.0.md - doc/release-notes/release-notes-0.11.1.md - doc/release-notes/release-notes-0.11.2.md - doc/release-notes/release-notes-0.12.0.md - doc/release-notes/release-notes-0.12.1.md - doc/release-notes/release-notes-0.13.0.md - doc/release-notes/release-notes-0.13.1.md - doc/release-notes/release-notes-0.13.2.md - doc/release-notes/release-notes-0.14.0.md - doc/release-notes/release-notes-0.14.1.md - doc/release-notes/release-notes-0.14.2.md - doc/release-notes/release-notes-0.14.3.md - doc/release-notes/release-notes-0.15.0.1.md - doc/release-notes/release-notes-0.15.0.md - doc/release-notes/release-notes-0.15.1.md - doc/release-notes/release-notes-0.15.2.md - doc/release-notes/release-notes-0.16.0.md - doc/release-notes/release-notes-0.16.1.md - doc/release-notes/release-notes-0.16.2.md - doc/release-notes/release-notes-0.16.3.md - doc/release-notes/release-notes-0.17.0.1.md - doc/release-notes/release-notes-0.17.0.md - doc/release-notes/release-notes-0.17.1.md - doc/release-notes/release-notes-0.18.0.md - doc/release-notes/release-notes-0.18.1.md - doc/release-notes/release-notes-0.19.0.1.md - doc/release-notes/release-notes-0.19.0.md - doc/release-notes/release-notes-0.3.12.md - doc/release-notes/release-notes-0.3.13.md - doc/release-notes/release-notes-0.3.14.md - doc/release-notes/release-notes-0.3.15.md - doc/release-notes/release-notes-0.3.16.md - doc/release-notes/release-notes-0.3.17.md - doc/release-notes/release-notes-0.3.18.md - doc/release-notes/release-notes-0.3.19.md - doc/release-notes/release-notes-0.3.20.1.md - doc/release-notes/release-notes-0.3.20.2.md - doc/release-notes/release-notes-0.3.20.md - doc/release-notes/release-notes-0.3.21.md - doc/release-notes/release-notes-0.3.22.md - doc/release-notes/release-notes-0.3.23.md - doc/release-notes/release-notes-0.3.24.md - doc/release-notes/release-notes-0.4.0.md - doc/release-notes/release-notes-0.4.1.md - doc/release-notes/release-notes-0.4.2.md - doc/release-notes/release-notes-0.4.3.md - doc/release-notes/release-notes-0.4.4.md - doc/release-notes/release-notes-0.4.5.md - doc/release-notes/release-notes-0.4.6.md - doc/release-notes/release-notes-0.5.0.md - doc/release-notes/release-notes-0.5.1.md - doc/release-notes/release-notes-0.5.2.md - doc/release-notes/release-notes-0.5.3.md - doc/release-notes/release-notes-0.5.4.md - doc/release-notes/release-notes-0.5.5.md - doc/release-notes/release-notes-0.6.0.md - doc/release-notes/release-notes-0.6.1.md - doc/release-notes/release-notes-0.6.2.md - doc/release-notes/release-notes-0.6.3.md - doc/release-notes/release-notes-0.7.0.md - doc/release-notes/release-notes-0.7.1.md - doc/release-notes/release-notes-0.7.2.md - doc/release-notes/release-notes-0.8.0.md - doc/release-notes/release-notes-0.8.1.md - doc/release-notes/release-notes-0.8.2.md - doc/release-notes/release-notes-0.8.3.md - doc/release-notes/release-notes-0.8.4.md - doc/release-notes/release-notes-0.8.5.md - doc/release-notes/release-notes-0.8.6.md - doc/release-notes/release-notes-0.9.0.md - doc/release-notes/release-notes-0.9.1.md - doc/release-notes/release-notes-0.9.2.1.md - doc/release-notes/release-notes-0.9.2.md - doc/release-notes/release-notes-0.9.3.md - doc/release-notes/release-notes-0.9.4.md - doc/release-notes/release-notes-0.9.5.md - doc/release-process.md - doc/shared-libraries.md - doc/tor.md - doc/translation_process.md - doc/translation_strings_policy.md - doc/zmq.md - libBGLconsensus.pc.in - share/examples/BGL.conf - share/pixmaps/BGL.ico - share/pixmaps/BGL128.png - share/pixmaps/BGL128.xpm - share/pixmaps/BGL16.png - share/pixmaps/BGL16.xpm - share/pixmaps/BGL256.png - share/pixmaps/BGL256.xpm - share/pixmaps/BGL32.png - share/pixmaps/BGL32.xpm - share/pixmaps/BGL64.png - share/pixmaps/BGL64.xpm - share/pixmaps/nsis-header.bmp - share/pixmaps/nsis-wizard.bmp - share/rpcauth/README.md - share/setup-BGL-win.nsi - share/setup.nsi.in - src/.clang-format - src/.vscode/settings.json - src/BGL-cli-res.rc - src/BGL-tx-res.rc - src/BGL-wallet-res.rc - src/BGLd-res.rc - src/Makefile.qt_locale.include - src/bench/.gitignore - src/bench/data/block413567.raw - src/chainparamsseeds.h - src/config/.empty - src/config/BGL-config.h.in - src/config/BGL-config.h.in~ - src/crypto/ctaes/README.md - src/crypto/ctaes/bench.c - src/crypto/sha256_avx2.cpp - src/crypto/sha256_sse41.cpp - src/crypto/sha3/README.md - src/crypto/sha3/sha3.c - src/crypto/sha3/sha3.h - src/crypto/sha3/sha3sum.c - src/crypto/sha3/sha3test.c - src/fs.cpp - src/interfaces/README.md - src/leveldb/.gitignore - src/leveldb/.travis.yml - src/leveldb/AUTHORS - src/leveldb/CONTRIBUTING.md - src/leveldb/NEWS - src/leveldb/TODO - src/leveldb/WINDOWS.md - src/leveldb/build_detect_platform - src/leveldb/doc/impl.md - src/leveldb/doc/index.md - src/leveldb/doc/log_format.md - src/leveldb/doc/table_format.md - src/leveldb/port/README - src/leveldb/util/env_win.cc - src/node/README.md - src/qt/BGLstrings.cpp - src/qt/README.md - src/qt/res/BGL-qt-res.rc - src/qt/res/icons/BGL.icns - src/qt/res/icons/BGL.ico - src/qt/res/icons/BGL.png - src/qt/res/icons/BGL_testnet.ico - src/qt/res/icons/add.png - src/qt/res/icons/address-book.png - src/qt/res/icons/chevron.png - src/qt/res/icons/clock1.png - src/qt/res/icons/clock2.png - src/qt/res/icons/clock3.png - src/qt/res/icons/clock4.png - src/qt/res/icons/clock5.png - src/qt/res/icons/connect0.png - src/qt/res/icons/connect1.png - src/qt/res/icons/connect2.png - src/qt/res/icons/connect3.png - src/qt/res/icons/connect4.png - src/qt/res/icons/edit.png - src/qt/res/icons/editcopy.png - src/qt/res/icons/editpaste.png - src/qt/res/icons/export.png - src/qt/res/icons/eye.png - src/qt/res/icons/eye_minus.png - src/qt/res/icons/eye_plus.png - src/qt/res/icons/fontbigger.png - src/qt/res/icons/fontsmaller.png - src/qt/res/icons/hd_disabled.png - src/qt/res/icons/hd_enabled.png - src/qt/res/icons/history.png - src/qt/res/icons/lock_closed.png - src/qt/res/icons/lock_open.png - src/qt/res/icons/network_disabled.png - src/qt/res/icons/overview.png - src/qt/res/icons/proxy.png - src/qt/res/icons/receive.png - src/qt/res/icons/remove.png - src/qt/res/icons/send.png - src/qt/res/icons/synced.png - src/qt/res/icons/transaction0.png - src/qt/res/icons/transaction2.png - src/qt/res/icons/transaction_abandoned.png - src/qt/res/icons/transaction_conflicted.png - src/qt/res/icons/tx_inout.png - src/qt/res/icons/tx_input.png - src/qt/res/icons/tx_mined.png - src/qt/res/icons/tx_output.png - src/qt/res/icons/warning.png - src/qt/res/movies/spinner-000.png - src/qt/res/movies/spinner-001.png - src/qt/res/movies/spinner-002.png - src/qt/res/movies/spinner-003.png - src/qt/res/movies/spinner-004.png - src/qt/res/movies/spinner-005.png - src/qt/res/movies/spinner-006.png - src/qt/res/movies/spinner-007.png - src/qt/res/movies/spinner-008.png - src/qt/res/movies/spinner-009.png - src/qt/res/movies/spinner-010.png - src/qt/res/movies/spinner-011.png - src/qt/res/movies/spinner-012.png - src/qt/res/movies/spinner-013.png - src/qt/res/movies/spinner-014.png - src/qt/res/movies/spinner-015.png - src/qt/res/movies/spinner-016.png - src/qt/res/movies/spinner-017.png - src/qt/res/movies/spinner-018.png - src/qt/res/movies/spinner-019.png - src/qt/res/movies/spinner-020.png - src/qt/res/movies/spinner-021.png - src/qt/res/movies/spinner-022.png - src/qt/res/movies/spinner-023.png - src/qt/res/movies/spinner-024.png - src/qt/res/movies/spinner-025.png - src/qt/res/movies/spinner-026.png - src/qt/res/movies/spinner-027.png - src/qt/res/movies/spinner-028.png - src/qt/res/movies/spinner-029.png - src/qt/res/movies/spinner-030.png - src/qt/res/movies/spinner-031.png - src/qt/res/movies/spinner-032.png - src/qt/res/movies/spinner-033.png - src/qt/res/movies/spinner-034.png - src/qt/res/movies/spinner-035.png - src/qt/res/src/spinner.png - src/qt/test/addressbooktests.cpp - src/qt/test/addressbooktests.h - src/qt/test/util.cpp - src/qt/test/util.h - src/qt/test/wallettests.cpp - src/qt/test/wallettests.h - src/reverse_iterator.h - src/secp256k1/.gitignore - src/secp256k1/.travis.yml - src/secp256k1/Makefile.am - src/secp256k1/README.md - src/secp256k1/TODO - src/secp256k1/autogen.sh - src/secp256k1/autom4te.cache/requests - src/secp256k1/autom4te.cache/traces.1 - src/secp256k1/autom4te.cache/traces.2 - src/secp256k1/build-aux/m4/BGL_secp.m4 - src/secp256k1/configure.ac - src/secp256k1/include/secp256k1.h - src/secp256k1/include/secp256k1_ecdh.h - src/secp256k1/include/secp256k1_recovery.h - src/secp256k1/libsecp256k1.pc.in - src/secp256k1/obj/.gitignore - src/secp256k1/sage/group_prover.sage - src/secp256k1/sage/secp256k1.sage - src/secp256k1/sage/weierstrass_prover.sage - src/secp256k1/src/java/org/BGL/NativeSecp256k1Test.java - src/secp256k1/src/java/org_BGL_NativeSecp256k1.c - src/secp256k1/src/java/org_BGL_NativeSecp256k1.h - src/secp256k1/src/java/org_BGL_Secp256k1Context.c - src/secp256k1/src/java/org_BGL_Secp256k1Context.h - src/secp256k1/src/libsecp256k1-config.h.in - src/secp256k1/src/libsecp256k1-config.h.in~ - src/secp256k1/src/modules/ecdh/Makefile.am.include - src/secp256k1/src/modules/recovery/Makefile.am.include - src/test/README.md - src/test/blockchain_tests.cpp - src/test/data/README.md - src/test/data/base58_encode_decode.json - src/test/data/blockfilters.json - src/test/data/key_io_invalid.json - src/test/data/key_io_valid.json - src/test/data/script_tests.json - src/test/data/sighash.json - src/test/data/tx_invalid.json - src/test/data/tx_valid.json - src/test/fuzz/FuzzedDataProvider.h - src/test/util/README.md - src/univalue/.gitignore - src/univalue/.travis.yml - src/univalue/Makefile.am - src/univalue/README.md - src/univalue/TODO - src/univalue/autogen.sh - src/univalue/autom4te.cache/requests - src/univalue/autom4te.cache/traces.1 - src/univalue/autom4te.cache/traces.2 - src/univalue/build-aux/m4/.gitignore - src/univalue/configure.ac - src/univalue/lib/.gitignore - src/univalue/lib/univalue_escapes.h - src/univalue/pc/libunivalue-uninstalled.pc.in - src/univalue/pc/libunivalue.pc.in - src/univalue/test/.gitignore - src/univalue/test/fail1.json - src/univalue/test/fail10.json - src/univalue/test/fail11.json - src/univalue/test/fail12.json - src/univalue/test/fail13.json - src/univalue/test/fail14.json - src/univalue/test/fail15.json - src/univalue/test/fail16.json - src/univalue/test/fail17.json - src/univalue/test/fail18.json - src/univalue/test/fail19.json - src/univalue/test/fail2.json - src/univalue/test/fail20.json - src/univalue/test/fail21.json - src/univalue/test/fail22.json - src/univalue/test/fail23.json - src/univalue/test/fail24.json - src/univalue/test/fail25.json - src/univalue/test/fail26.json - src/univalue/test/fail27.json - src/univalue/test/fail28.json - src/univalue/test/fail29.json - src/univalue/test/fail3.json - src/univalue/test/fail30.json - src/univalue/test/fail31.json - src/univalue/test/fail32.json - src/univalue/test/fail33.json - src/univalue/test/fail34.json - src/univalue/test/fail35.json - src/univalue/test/fail36.json - src/univalue/test/fail37.json - src/univalue/test/fail38.json - src/univalue/test/fail39.json - src/univalue/test/fail4.json - src/univalue/test/fail40.json - src/univalue/test/fail41.json - src/univalue/test/fail42.json - src/univalue/test/fail44.json - src/univalue/test/fail5.json - src/univalue/test/fail6.json - src/univalue/test/fail7.json - src/univalue/test/fail8.json - src/univalue/test/fail9.json - src/univalue/test/no_nul.cpp - src/univalue/test/pass1.json - src/univalue/test/pass2.json - src/univalue/test/pass3.json - src/univalue/test/round1.json - src/univalue/test/round2.json - src/univalue/test/round3.json - src/univalue/test/round4.json - src/univalue/test/round5.json - src/univalue/test/round6.json - src/univalue/test/round7.json - src/univalue/test/test_json.cpp - src/univalue/univalue-config.h.in - src/univalue/univalue-config.h.in~ - test/README.md - test/functional/.gitignore - test/functional/README.md - test/functional/combine_logs.py - test/functional/data/blockheader_testnet3.hex - test/functional/data/rpc_bip67.json - test/functional/data/rpc_getblockstats.json - test/functional/data/rpc_psbt.json - test/functional/data/wallets/high_minversion/.walletlock - test/functional/data/wallets/high_minversion/GENERATE.md - test/functional/test-shell.md - test/functional/test_framework/__init__.py - test/functional/test_framework/bignum.py - test/lint/README.md - test/lint/lint-locale-dependence.sh - test/lint/lint-shebang.sh - test/lint/lint-spelling.ignore-words.txt - test/sanitizer_suppressions/lsan - test/sanitizer_suppressions/tsan - test/sanitizer_suppressions/ubsan - test/util/data/BGL-util-test.json - test/util/data/blanktxv1.hex - test/util/data/blanktxv1.json - test/util/data/blanktxv2.hex - test/util/data/blanktxv2.json - test/util/data/tt-delin1-out.hex - test/util/data/tt-delin1-out.json - test/util/data/tt-delout1-out.hex - test/util/data/tt-delout1-out.json - test/util/data/tt-locktime317000-out.hex - test/util/data/tt-locktime317000-out.json - test/util/data/tx394b54bb.hex - test/util/data/txcreate1.hex - test/util/data/txcreate1.json - test/util/data/txcreate2.hex - test/util/data/txcreate2.json - test/util/data/txcreatedata1.hex - test/util/data/txcreatedata1.json - test/util/data/txcreatedata2.hex - test/util/data/txcreatedata2.json - test/util/data/txcreatedata_seq0.hex - test/util/data/txcreatedata_seq0.json - test/util/data/txcreatedata_seq1.hex - test/util/data/txcreatedata_seq1.json - test/util/data/txcreatemultisig1.hex - test/util/data/txcreatemultisig1.json - test/util/data/txcreatemultisig2.hex - test/util/data/txcreatemultisig2.json - test/util/data/txcreatemultisig3.hex - test/util/data/txcreatemultisig3.json - test/util/data/txcreatemultisig4.hex - test/util/data/txcreatemultisig4.json - test/util/data/txcreatemultisig5.json - test/util/data/txcreateoutpubkey1.hex - test/util/data/txcreateoutpubkey1.json - test/util/data/txcreateoutpubkey2.hex - test/util/data/txcreateoutpubkey2.json - test/util/data/txcreateoutpubkey3.hex - test/util/data/txcreateoutpubkey3.json - test/util/data/txcreatescript1.hex - test/util/data/txcreatescript1.json - test/util/data/txcreatescript2.hex - test/util/data/txcreatescript2.json - test/util/data/txcreatescript3.hex - test/util/data/txcreatescript3.json - test/util/data/txcreatescript4.hex - test/util/data/txcreatescript4.json - test/util/data/txcreatesignv1.hex - test/util/data/txcreatesignv1.json - test/util/data/txcreatesignv2.hex -Copyright: __NO_COPYRIGHT_NOR_LICENSE__ -License: __NO_COPYRIGHT_NOR_LICENSE__ - -Files: src/leveldb/Makefile - src/leveldb/db/autocompact_test.cc - src/leveldb/db/builder.cc - src/leveldb/db/builder.h - src/leveldb/db/c.cc - src/leveldb/db/c_test.c - src/leveldb/db/corruption_test.cc - src/leveldb/db/db_bench.cc - src/leveldb/db/db_impl.cc - src/leveldb/db/db_impl.h - src/leveldb/db/db_iter.cc - src/leveldb/db/db_iter.h - src/leveldb/db/db_test.cc - src/leveldb/db/dbformat.cc - src/leveldb/db/dbformat.h - src/leveldb/db/dbformat_test.cc - src/leveldb/db/dumpfile.cc - src/leveldb/db/filename.cc - src/leveldb/db/filename_test.cc - src/leveldb/db/leveldbutil.cc - src/leveldb/db/log_reader.cc - src/leveldb/db/log_reader.h - src/leveldb/db/log_test.cc - src/leveldb/db/log_writer.cc - src/leveldb/db/log_writer.h - src/leveldb/db/memtable.cc - src/leveldb/db/memtable.h - src/leveldb/db/recovery_test.cc - src/leveldb/db/skiplist.h - src/leveldb/db/skiplist_test.cc - src/leveldb/db/snapshot.h - src/leveldb/db/table_cache.cc - src/leveldb/db/version_edit.cc - src/leveldb/db/version_edit.h - src/leveldb/db/version_edit_test.cc - src/leveldb/db/version_set.cc - src/leveldb/db/version_set_test.cc - src/leveldb/db/write_batch.cc - src/leveldb/db/write_batch_internal.h - src/leveldb/db/write_batch_test.cc - src/leveldb/doc/bench/db_bench_sqlite3.cc - src/leveldb/doc/bench/db_bench_tree_db.cc - src/leveldb/helpers/memenv/memenv.cc - src/leveldb/helpers/memenv/memenv.h - src/leveldb/helpers/memenv/memenv_test.cc - src/leveldb/include/leveldb/comparator.h - src/leveldb/include/leveldb/db.h - src/leveldb/include/leveldb/dumpfile.h - src/leveldb/include/leveldb/options.h - src/leveldb/include/leveldb/table.h - src/leveldb/port/port.h - src/leveldb/port/port_posix.cc - src/leveldb/port/port_posix.h - src/leveldb/port/thread_annotations.h - src/leveldb/table/block.cc - src/leveldb/table/block.h - src/leveldb/table/block_builder.h - src/leveldb/table/filter_block.cc - src/leveldb/table/filter_block_test.cc - src/leveldb/table/format.cc - src/leveldb/table/format.h - src/leveldb/table/iterator.cc - src/leveldb/table/iterator_wrapper.h - src/leveldb/table/merger.cc - src/leveldb/table/merger.h - src/leveldb/table/table.cc - src/leveldb/table/table_builder.cc - src/leveldb/table/table_test.cc - src/leveldb/table/two_level_iterator.cc - src/leveldb/table/two_level_iterator.h - src/leveldb/util/arena.cc - src/leveldb/util/arena.h - src/leveldb/util/arena_test.cc - src/leveldb/util/bloom.cc - src/leveldb/util/bloom_test.cc - src/leveldb/util/cache.cc - src/leveldb/util/cache_test.cc - src/leveldb/util/coding.cc - src/leveldb/util/coding_test.cc - src/leveldb/util/comparator.cc - src/leveldb/util/crc32c.h - src/leveldb/util/crc32c_test.cc - src/leveldb/util/env.cc - src/leveldb/util/env_posix.cc - src/leveldb/util/env_posix_test.cc - src/leveldb/util/env_posix_test_helper.h - src/leveldb/util/env_test.cc - src/leveldb/util/filter_policy.cc - src/leveldb/util/hash.cc - src/leveldb/util/hash_test.cc - src/leveldb/util/histogram.cc - src/leveldb/util/histogram.h - src/leveldb/util/logging.cc - src/leveldb/util/mutexlock.h - src/leveldb/util/options.cc - src/leveldb/util/random.h - src/leveldb/util/status.cc - src/leveldb/util/testharness.cc - src/leveldb/util/testharness.h - src/leveldb/util/testutil.cc - src/leveldb/util/testutil.h -Copyright: 2011-2017 The LevelDB Authors. -License: __UNKNOWN__ - Use of this source code is governed by a BSD-style license that can be - found in the LICENSE file. See the AUTHORS file for names of contributors. - -Files: Makefile.in - aclocal.m4 - build-aux/compile - build-aux/config.guess - build-aux/config.sub - build-aux/depcomp - build-aux/install-sh - build-aux/ltmain.sh - build-aux/m4/ax_boost_base.m4 - build-aux/m4/ax_boost_chrono.m4 - build-aux/m4/ax_boost_filesystem.m4 - build-aux/m4/ax_boost_system.m4 - build-aux/m4/ax_boost_thread.m4 - build-aux/m4/ax_boost_unit_test_framework.m4 - build-aux/m4/ax_cxx_compile_stdcxx.m4 - build-aux/m4/ax_gcc_func_attribute.m4 - build-aux/m4/l_atomic.m4 - build-aux/m4/libtool.m4 - build-aux/m4/ltoptions.m4 - build-aux/m4/ltsugar.m4 - build-aux/m4/ltversion.m4 - build-aux/m4/lt~obsolete.m4 - build-aux/missing - build-aux/test-driver - doc/man/Makefile.in - src/secp256k1/Makefile.in - src/univalue/Makefile.in -Copyright: 1992-2018 Free Software Foundation, Inc. - 1994 X Consortium - 2008 Benjamin Kosnik - 2008 Daniel Casimiro - 2008-2009 Michael Tindal - 2008-2009 Thomas Porschberg - 2009 Peter Adolphs - 2009 Roman Rybalko - 2012 Xiyue Deng - 2012 Zack Weinberg - 2013 Gabriele Svelto - 2013 Roy Stogner - 2014-2015 Google Inc.; contributed Alexey Sokolov - 2015 Moritz Klammler - 2015 Paul Norman - 2015 Tim Kosse -License: __AUTO_PERMISSIVE__ - Autogenerated files with permissive licenses. - -Files: src/secp256k1/build-aux/m4/libtool.m4 - src/secp256k1/build-aux/m4/ltoptions.m4 - src/secp256k1/build-aux/m4/ltsugar.m4 - src/secp256k1/build-aux/m4/ltversion.m4 - src/secp256k1/build-aux/m4/lt~obsolete.m4 - src/univalue/build-aux/m4/libtool.m4 - src/univalue/build-aux/m4/ltoptions.m4 - src/univalue/build-aux/m4/ltsugar.m4 - src/univalue/build-aux/m4/ltversion.m4 - src/univalue/build-aux/m4/lt~obsolete.m4 -Copyright: 1996-2015 Free Software Foundation, Inc. -License: PERMISSIVE - This file is free software; the Free Software Foundation gives - unlimited permission to copy and/or distribute it, with or without - modifications, as long as this notice is preserved. - -Files: src/secp256k1/autom4te.cache/output.0 - src/secp256k1/autom4te.cache/output.1 - src/secp256k1/autom4te.cache/output.2 - src/secp256k1/configure - src/univalue/autom4te.cache/output.0 - src/univalue/autom4te.cache/output.1 - src/univalue/autom4te.cache/output.2 - src/univalue/configure -Copyright: 1992-2012 Free Software Foundation, Inc. -License: PERMISSIVE - This configure script is free software; the Free Software Foundation - gives unlimited permission to copy, distribute and modify it. - -Files: src/secp256k1/build-aux/compile - src/secp256k1/build-aux/missing - src/secp256k1/build-aux/test-driver - src/univalue/build-aux/compile - src/univalue/build-aux/missing - src/univalue/build-aux/test-driver -Copyright: 1996-2018 Free Software Foundation, Inc. -License: GPL-2.0+ with autoconf exception - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - . - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - . - You should have received a copy of the GNU General Public License - along with this program. If not, see . - . - As a special exception to the GNU General Public License, if you - distribute this file as part of a program that contains a - configuration script generated by Autoconf, you may include it under - the same distribution terms that you use for the rest of that program. - . - On Debian systems, the complete text of the GNU General Public License - Version 2 can be found in `/usr/share/common-licenses/GPL-2'. - -Files: doc/man/BGL-cli.1 - doc/man/BGL-qt.1 - doc/man/BGL-tx.1 - doc/man/BGL-wallet.1 - doc/man/BGLd.1 -Copyright: 2009-2019 The Bitcoin Core developers -License: __UNKNOWN__ - Please contribute if you find BGL Core useful. Visit - for further information about the software. - The source code is available from . - . - This is experimental software. - Distributed under the MIT software license, see the accompanying file COPYING - or - -Files: build-aux/m4/ax_check_compile_flag.m4 - build-aux/m4/ax_check_link_flag.m4 - build-aux/m4/ax_check_preproc_flag.m4 - build-aux/m4/ax_pthread.m4 -Copyright: 2008 Guido U. Draheim - 2008 Steven G. Johnson - 2011 Daniel Richard G. - 2011 Maarten Bosmans -License: GPL-3.0+ with unknown exception *** check multiple exceptions *** - This program is free software: you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation, either version 3 of the License, or (at your - option) any later version. - . - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General - Public License for more details. - . - You should have received a copy of the GNU General Public License along - with this program. If not, see . - . - As a special exception, the respective Autoconf Macro's copyright owner - gives unlimited permission to copy, distribute and modify the configure - scripts that are the output of Autoconf when processing the Macro. You - need not follow the terms of the GNU General Public License when using - or distributing such scripts, even though portions of the text of the - Macro appear in them. The GNU General Public License (GPL) does govern - all other use of the material that constitutes the Autoconf Macro. - . - This special exception to the GPL applies to versions of the Autoconf - Macro released by the Autoconf Archive. When you make and distribute a - modified version of the Autoconf Macro, you may extend this special - exception to the GPL to apply to your modified version as well. - . - On Debian systems, the complete text of the GNU General Public License - Version 3 can be found in `/usr/share/common-licenses/GPL-3'. - -Files: src/secp256k1/src/java/org/BGL/NativeSecp256k1.java - src/secp256k1/src/java/org/BGL/NativeSecp256k1Util.java - src/secp256k1/src/java/org/BGL/Secp256k1Context.java -Copyright: 2013 Google Inc. - 2014-2016 the libsecp256k1 contributors -License: Apache-2.0 - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - . - http://www.apache.org/licenses/LICENSE-2.0 - . - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - . - On Debian systems, the complete text of the Apache License Version 2.0 - can be found in `/usr/share/common-licenses/Apache-2.0'. - -Files: autom4te.cache/traces.0 - src/secp256k1/autom4te.cache/traces.0 - src/univalue/autom4te.cache/traces.0 -Copyright: 2011 Free Software Foundation, Inc. -License: __UNKNOWN__ - This config.lt script is free software; the Free Software Foundation - gives unlimited permision to copy, distribute and modify it." - -Files: depends/config.guess - src/secp256k1/build-aux/config.guess - src/univalue/build-aux/config.guess -Copyright: 1992-2019 Free Software Foundation, Inc. -License: GPL-3.0+ with autoconf exception - This file is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - . - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - . - You should have received a copy of the GNU General Public License - along with this program; if not, see . - . - As a special exception to the GNU General Public License, if you - distribute this file as part of a program that contains a - configuration script generated by Autoconf, you may include it under - the same distribution terms that you use for the rest of that - program. This Exception is an additional permission under section 7 - of the GNU General Public License, version 3 ("GPLv3"). - . - Originally written by Per Bothner; maintained since 2000 by Ben Elliston. - . - On Debian systems, the complete text of the GNU General Public License - Version 3 can be found in `/usr/share/common-licenses/GPL-3'. - -Files: depends/config.sub - src/secp256k1/build-aux/config.sub - src/univalue/build-aux/config.sub -Copyright: 1992-2019 Free Software Foundation, Inc. -License: GPL-3.0+ with autoconf exception - This file is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - . - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - . - You should have received a copy of the GNU General Public License - along with this program; if not, see . - . - As a special exception to the GNU General Public License, if you - distribute this file as part of a program that contains a - configuration script generated by Autoconf, you may include it under - the same distribution terms that you use for the rest of that - program. This Exception is an additional permission under section 7 - of the GNU General Public License, version 3 ("GPLv3"). - . - On Debian systems, the complete text of the GNU General Public License - Version 3 can be found in `/usr/share/common-licenses/GPL-3'. - -Files: src/secp256k1/build-aux/install-sh - src/univalue/build-aux/install-sh -Copyright: 1994 X Consortium -License: MIT - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to - deal in the Software without restriction, including without limitation the - rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - sell copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - . - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - . - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN - AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- - TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - . - Except as contained in this notice, the name of the X Consortium shall not - be used in advertising or otherwise to promote the sale, use or other deal- - ings in this Software without prior written authorization from the X Consor- - tium. - . - FSF changes to this file are in the public domain. - . - Calling this script install-sh is preferred over install.sh, to prevent - 'make' implicit rules from creating a file called install from it - when there is no Makefile. - . - This script is compatible with the BSD install script, but was written - from scratch. - -Files: src/secp256k1/build-aux/m4/ax_jni_include_dir.m4 - src/secp256k1/build-aux/m4/ax_prog_cc_for_build.m4 -Copyright: 2008 Don Anderson - 2008 Paolo Bonzini -License: PERMISSIVE - Copying and distribution of this file, with or without modification, are - permitted in any medium without royalty provided the copyright notice - and this notice are preserved. This file is offered as-is, without any - warranty. - -Files: src/secp256k1/aclocal.m4 - src/univalue/aclocal.m4 -Copyright: 1996-2018 Free Software Foundation, Inc. -License: PERMISSIVE - This file is free software; the Free Software Foundation - gives unlimited permission to copy and/or distribute it, - with or without modifications, as long as this notice is preserved. - . - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY, to the extent permitted by law; without - even the implied warranty of MERCHANTABILITY or FITNESS FOR A - PARTICULAR PURPOSE. - -Files: src/leveldb/port/port_win.cc - src/leveldb/port/port_win.h -Copyright: __NO_COPYRIGHT__ in: src/leveldb/port/port_win.cc - __NO_COPYRIGHT__ in: src/leveldb/port/port_win.h -License: __UNKNOWN__ - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - . - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the University of California, Berkeley nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - . - THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -Files: test/lint/lint-format-strings.py - test/lint/lint-format-strings.sh -Copyright: 2018-2019 The Bitcoin Core developers Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. -License: __UNKNOWN__ - Lint format strings: This program checks that the number of arguments passed - to a variadic format string function matches the number of format specifiers - in the format string. - -Files: src/secp256k1/build-aux/ltmain.sh - src/univalue/build-aux/ltmain.sh -Copyright: 1996-2015 Free Software Foundation, Inc. -License: GPL-2.0+ with libtool exception - This is free software; see the source for copying conditions. There is NO - warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - . - GNU Libtool is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - . - As a special exception to the GNU General Public License, - if you distribute this file as part of a program or library that - is built using GNU Libtool, you may include this file under the - same distribution terms that you use for the rest of that program. - . - GNU Libtool is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - . - You should have received a copy of the GNU General Public License - along with this program. If not, see . - . - On Debian systems, the complete text of the GNU General Public License - Version 2 can be found in `/usr/share/common-licenses/GPL-2'. - -Files: src/secp256k1/build-aux/depcomp - src/univalue/build-aux/depcomp -Copyright: 1999-2018 Free Software Foundation, Inc. -License: GPL-2.0+ with autoconf exception - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - . - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - . - You should have received a copy of the GNU General Public License - along with this program. If not, see . - . - As a special exception to the GNU General Public License, if you - distribute this file as part of a program that contains a - configuration script generated by Autoconf, you may include it under - the same distribution terms that you use for the rest of that program. - . - Originally written by Alexandre Oliva . - . - On Debian systems, the complete text of the GNU General Public License - Version 2 can be found in `/usr/share/common-licenses/GPL-2'. - -Files: contrib/macdeploy/macdeployqtplus -Copyright: 2011 Patrick "p2k" Schneider -License: GPL-3.0+ - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - . - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - . - You should have received a copy of the GNU General Public License - along with this program. If not, see . - . - On Debian systems, the complete text of the GNU General Public License - Version 3 can be found in `/usr/share/common-licenses/GPL-3'. - -Files: test/functional/test_framework/authproxy.py -Copyright: 2007 Jan-Klaas Kollhof - 2011 Jeff Garzik -License: LGPL-2.1+ - Previous copyright, from python-jsonrpc/jsonrpc/proxy.py: - . - This file is part of jsonrpc. - . - jsonrpc is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation; either version 2.1 of the License, or - (at your option) any later version. - . - This software is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - . - You should have received a copy of the GNU Lesser General Public License - along with this software; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - . - The FSF address in the above text is the old one. - . - On Debian systems, the complete text of the GNU Lesser General Public License - Version 2.1 can be found in `/usr/share/common-licenses/LGPL-2.1'. - -Files: build-aux/m4/BGL_qt.m4 -Copyright: 2013-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. -License: __UNKNOWN__ - Helper for cases where a qt dependency is not met. - -Files: src/leveldb/util/crc32c.cc -Copyright: 2011 The LevelDB Authors. -License: __UNKNOWN__ - Use of this source code is governed by a BSD-style license that can be - found in the LICENSE file. See the AUTHORS file for names of contributors. - . - A portable implementation of crc32c, optimized to handle - four bytes at a time. - -Files: src/leveldb/include/leveldb/filter_policy.h -Copyright: 2012 The LevelDB Authors. -License: __UNKNOWN__ - Use of this source code is governed by a BSD-style license that can be - found in the LICENSE file. See the AUTHORS file for names of contributors. - . - A database can be configured with a custom FilterPolicy object. - This object is responsible for creating a small filter from a set - of keys. These filters are stored in leveldb and are consulted - automatically by leveldb to decide whether or not to read some - information from disk. In many cases, a filter can cut down the - number of disk seeks form a handful to a single disk seek per - DB::Get() call. - . - Most people will want to use the builtin bloom filter support (see - NewBloomFilterPolicy() below). - -Files: src/leveldb/issues/issue178_test.cc -Copyright: 2013 The LevelDB Authors. -License: __UNKNOWN__ - Use of this source code is governed by a BSD-style license that can be - found in the LICENSE file. See the AUTHORS file for names of contributors. - . - Test for issue 178: a manual compaction causes deleted data to reappear. - -Files: test/lint/lint-assertions.sh -Copyright: 2018 The Bitcoin Core developers Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. -License: __UNKNOWN__ - Check for assertions with obvious side effects. - -Files: test/lint/lint-whitespace.sh -Copyright: 2017-2019 The Bitcoin Core developers Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. -License: __UNKNOWN__ - Check for new lines in diff that introduce trailing whitespace. - . - We can't run this check unless we know the commit range for the PR. - -Files: src/leveldb/include/leveldb/env.h -Copyright: 2011 The LevelDB Authors. -License: __UNKNOWN__ - Use of this source code is governed by a BSD-style license that can be - found in the LICENSE file. See the AUTHORS file for names of contributors. - . - An Env is an interface used by the leveldb implementation to access - operating system functionality like the filesystem etc. Callers - may wish to provide a custom Env object when opening a database to - get fine gain control; e.g., to rate limit file system operations. - . - All Env implementations are safe for concurrent access from - multiple threads without any external synchronization. - -Files: config.log -Copyright: 2019 Free Software Foundation, Inc. -License: __UNKNOWN__ - This is free software; see the source for copying conditions. There is NO - warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -Files: src/leveldb/util/logging.h -Copyright: 2011 The LevelDB Authors. -License: __UNKNOWN__ - Use of this source code is governed by a BSD-style license that can be - found in the LICENSE file. See the AUTHORS file for names of contributors. - . - Must not be included from any .h files to avoid polluting the namespace - with macros. - -Files: src/leveldb/table/block_builder.cc -Copyright: 2011 The LevelDB Authors. -License: __UNKNOWN__ - Use of this source code is governed by a BSD-style license that can be - found in the LICENSE file. See the AUTHORS file for names of contributors. - . - BlockBuilder generates blocks where keys are prefix-compressed: - . - When we store a key, we drop the prefix shared with the previous - string. This helps reduce the space requirement significantly. - Furthermore, once every K keys, we do not apply the prefix - compression and store the entire key. We call this a "restart - point". The tail end of the block stores the offsets of all of the - restart points, and can be used to do a binary search when looking - for a particular key. Values are stored as-is (without compression) - immediately following the corresponding key. - . - An entry for a particular key-value pair has the form: - -Files: src/leveldb/port/atomic_pointer.h -Copyright: 2011 The LevelDB Authors. -License: __UNKNOWN__ - Use of this source code is governed by a BSD-style license that can be - found in the LICENSE file. See the AUTHORS file for names of contributors. - . - AtomicPointer provides storage for a lock-free pointer. - Platform-dependent implementation of AtomicPointer: - - If the platform provides a cheap barrier, we use it with raw pointers - - If is present (on newer versions of gcc, it is), we use - a -based AtomicPointer. However we prefer the memory - barrier based version, because at least on a gcc 4.4 32-bit build - on linux, we have encountered a buggy implementation. - Also, some implementations are much slower than a memory-barrier - based implementation (~16ns for based acquire-load vs. ~1ns for - a barrier based acquire-load). - This code is based on atomicops-internals-* in Google's perftools: - http://code.google.com/p/google-perftools/source/browse/#svn%2Ftrunk%2Fsrc%2Fbase - -Files: test/lint/lint-qt.sh -Copyright: 2018 The Bitcoin Core developers Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. -License: __UNKNOWN__ - Check for SIGNAL/SLOT connect style, removed since Qt4 support drop. - -Files: doc/build-osx.md -Copyright: __NO_COPYRIGHT__ in: doc/build-osx.md -License: __UNKNOWN__ - The DMG tool has the ability to create DMGs from scratch as well, but this functionality is - broken. Only the compression feature is currently used. Ideally, the creation could be fixed - and `genisoimage` would no longer be necessary. - . - Background images and other features can be added to DMG files by inserting a - -Files: src/crypto/ctaes/ctaes.c -Copyright: 2016 Pieter Wuille Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. -License: __UNKNOWN__ - Constant time, unoptimized, concise, plain C, AES implementation - Based On: - Emilia Kasper and Peter Schwabe, Faster and Timing-Attack Resistant AES-GCM - http://www.iacr.org/archive/ches2009/57470001/57470001.pdf - But using 8 16-bit integers representing a single AES state rather than 8 128-bit - integers representing 8 AES states. - -Files: src/leveldb/README.md -Copyright: __NO_COPYRIGHT__ in: src/leveldb/README.md -License: __UNKNOWN__ - # Features - * Keys and values are arbitrary byte arrays. - * Data is stored sorted by key. - * Callers can provide a custom comparison function to override the sort order. - * The basic operations are `Put(key,value)`, `Get(key)`, `Delete(key)`. - * Multiple changes can be made in one atomic batch. - * Users can create a transient snapshot to get a consistent view of data. - * Forward and backward iteration is supported over the data. - * Data is automatically compressed using the [Snappy compression library](http://google.github.io/snappy/). - * External activity (file system operations etc.) is relayed through a virtual interface so users can customize the operating system interactions. - . - # Documentation - [LevelDB library documentation](https://github.com/google/leveldb/blob/master/doc/index.md) is online and bundled with the source code. - . - # Limitations - * This is not a SQL database. It does not have a relational data model, it does not support SQL queries, and it has no support for indexes. - * Only a single process (possibly multi-threaded) can access a particular database at a time. - * There is no client-server support builtin to the library. An application that needs such support will have to wrap their own server around the library. - . - # Contributing to the leveldb Project - The leveldb project welcomes contributions. leveldb's primary goal is to be - a reliable and fast key/value store. Changes that are in line with the - features/limitations outlined above, and meet the requirements below, - will be considered. - . - Contribution requirements: - -Files: src/compat/assumptions.h -Copyright: 2009-2010 Satoshi Nakamoto - 2009-2019 The Bitcoin Core developers Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. -License: __UNKNOWN__ - Compile-time verification of assumptions we make. - -Files: src/leveldb/db/repair.cc -Copyright: 2011 The LevelDB Authors. -License: __UNKNOWN__ - Use of this source code is governed by a BSD-style license that can be - found in the LICENSE file. See the AUTHORS file for names of contributors. - . - We recover the contents of the descriptor from the other files we find. - (1) Any log files are first converted to tables - (2) We scan every table to compute - (a) smallest/largest for the table - (b) largest sequence number in the table - (3) We generate descriptor contents: - - log number is set to zero - - next-file-number is set to 1 + largest file number we found - - last-sequence-number is set to largest sequence# found across - all tables (see 2c) - - compaction pointers are cleared - - every table file is added at level 0 - . - Possible optimization 1: - (a) Compute total size and use to pick appropriate max-level M - (b) Sort tables by largest sequence# in the table - (c) For each table: if it overlaps earlier table, place in level-0, - else place in level-M. - Possible optimization 2: - Store per-table metadata (smallest, largest, largest-seq#, ...) - in the table's meta section to speed up ScanTable. - -Files: src/torcontrol.h -Copyright: 2015-2018 The Bitcoin Core developers Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. -License: __UNKNOWN__ - Functionality for communicating with Tor. - -Files: test/lint/lint-python.sh -Copyright: 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. -License: __UNKNOWN__ - Check for specified flake8 warnings in python files. - -Files: test/lint/lint-include-guards.sh -Copyright: 2018 The Bitcoin Core developers Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. -License: __UNKNOWN__ - Check include guards. - -Files: src/leveldb/util/hash.h -Copyright: 2011 The LevelDB Authors. -License: __UNKNOWN__ - Use of this source code is governed by a BSD-style license that can be - found in the LICENSE file. See the AUTHORS file for names of contributors. - . - Simple hash function used for internal data structures - -Files: src/leveldb/include/leveldb/table_builder.h -Copyright: 2011 The LevelDB Authors. -License: __UNKNOWN__ - Use of this source code is governed by a BSD-style license that can be - found in the LICENSE file. See the AUTHORS file for names of contributors. - . - TableBuilder provides the interface used to build a Table - (an immutable and sorted map from keys to values). - . - Multiple threads can invoke const methods on a TableBuilder without - external synchronization, but if any of the threads may call a - non-const method, all threads accessing the same TableBuilder must use - external synchronization. - -Files: src/tinyformat.h -Copyright: 2011 Chris Foster [chris42f (at) gmail (d0t) com] -License: __UNKNOWN__ - Boost Software License - Version 1.0 - . - Permission is hereby granted, free of charge, to any person or organization - obtaining a copy of the software and accompanying documentation covered by - this license (the "Software") to use, reproduce, display, distribute, - execute, and transmit the Software, and to prepare derivative works of the - Software, and to permit third-parties to whom the Software is furnished to - do so, all subject to the following: - . - The copyright notices in the Software and this entire statement, including - the above license grant, this restriction and the following disclaimer, - must be included in all copies of the Software, in whole or in part, and - all derivative works of the Software, unless such copies or derivative - works are solely in the form of machine-executable object code generated by - a source language processor. - . - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT - SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE - FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - -Files: CONTRIBUTING.md -Copyright: __NO_COPYRIGHT__ in: CONTRIBUTING.md -License: __UNKNOWN__ - In general, all pull requests must: - . - - Have a clear use case, fix a demonstrable bug or serve the greater good of - the project (for example refactoring for modularisation); - - Be well peer reviewed; - - Have unit tests and functional tests where appropriate; - - Follow code style guidelines ([C++](doc/developer-notes.md), [functional tests](test/functional/README.md)); - - Not break the existing test suite; - - Where bugs are fixed, where possible, there should be unit tests - demonstrating the bug and also proving the fix. This helps prevent regression. - - Change relevant comments and documentation when behaviour of code changes. - . - Patches that change BGL consensus rules are considerably more involved than - normal because they affect the entire ecosystem and so must be preceded by - extensive mailing list discussions and have a numbered BIP. While each case will - be different, one should be prepared to expend more time and effort than for - other kinds of patches because of increased peer review and consensus building - requirements. - . - ### Peer Review - . - Anyone may participate in peer review which is expressed by comments in the pull - request. Typically reviewers will review the code for obvious errors, as well as - test out the patch set and opine on the technical merits of the patch. Project - maintainers take into account the peer review when determining if there is - consensus to merge a pull request (remember that discussions may have been - spread out over GitHub, mailing list and IRC discussions). - . - #### Conceptual Review - . - A review can be a conceptual review, where the reviewer leaves a comment - * `Concept (N)ACK`, meaning "I do (not) agree in the general goal of this pull - request", - * `Approach (N)ACK`, meaning `Concept ACK`, but "I do (not) agree with the - approach of this change". - . - A `NACK` needs to include a rationale why the change is not worthwhile. - NACKs without accompanying reasoning may be disregarded. - . - #### Code Review - . - After conceptual agreement on the change, code review can be provided. It is - -Files: src/crypto/poly1305.cpp -Copyright: 2019 The Bitcoin Core developers Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. -License: __UNKNOWN__ - Based on the public domain implementation by Andrew Moon - poly1305-donna-unrolled.c from https://github.com/floodyberry/poly1305-donna - -Files: test/config.ini.in -Copyright: 2013-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. -License: __UNKNOWN__ - These environment variables are set by the build process and read by - -Files: test/lint/lint-all.sh -Copyright: 2017-2019 The Bitcoin Core developers Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. -License: __UNKNOWN__ - This script runs all contrib/devtools/lint-*.sh files, and fails if any exit - with a non-zero status code. - -Files: src/leveldb/db/log_format.h -Copyright: 2011 The LevelDB Authors. -License: __UNKNOWN__ - Use of this source code is governed by a BSD-style license that can be - found in the LICENSE file. See the AUTHORS file for names of contributors. - . - Log format information shared by reader and writer. - -Files: src/util/moneystr.h -Copyright: 2009-2010 Satoshi Nakamoto - 2009-2018 The Bitcoin Core developers Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. -License: __UNKNOWN__ - Money parsing/formatting utilities. - -Files: test/lint/lint-python-mutable-default-parameters.sh -Copyright: 2019 The Bitcoin Core developers Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. -License: __UNKNOWN__ - Detect when a mutable list or dict is used as a default parameter value in a Python function. - -Files: src/bech32.h -Copyright: 2017 Pieter Wuille Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. -License: __UNKNOWN__ - Bech32 is a string encoding format used in newer address types. - The output consists of a human-readable part (alphanumeric), a - separator character (1), and a base32 data section, the last - 6 characters of which are a checksum. - . - For more information, see BIP 173. - -Files: src/secp256k1/contrib/lax_der_parsing.h -Copyright: 2015 Pieter Wuille Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. -License: __UNKNOWN__ - Please do not link this file directly. It is not part of the libsecp256k1 - project and does not promise any stability in its API, functionality or - presence. Projects which use this code should instead copy this header - and its accompanying .c file directly into their codebase. - . - This file defines a function that parses DER with various errors and - violations. This is not a part of the library itself, because the allowed - violations are chosen arbitrarily and do not follow or establish any - standard. - . - In many places it matters that different implementations do not only accept - the same set of valid signatures, but also reject the same set of signatures. - The only means to accomplish that is by strictly obeying a standard, and not - accepting anything else. - . - Nonetheless, sometimes there is a need for compatibility with systems that - use signatures which do not strictly obey DER. The snippet below shows how - certain violations are easily supported. You may need to adapt it. - . - Do not use this for new systems. Use well-defined DER or compact signatures - -Files: src/leveldb/util/posix_logger.h -Copyright: 2011 The LevelDB Authors. -License: __UNKNOWN__ - Use of this source code is governed by a BSD-style license that can be - found in the LICENSE file. See the AUTHORS file for names of contributors. - . - Logger implementation that can be shared by all environments - where enough Posix functionality is available. - -Files: contrib/devtools/test_deterministic_coverage.sh -Copyright: 2019 The Bitcoin Core developers Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. -License: __UNKNOWN__ - Test for deterministic coverage across unit test runs. - -Files: src/crypto/chacha20.cpp -Copyright: 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. -License: __UNKNOWN__ - Based on the public domain implementation 'merged' by D. J. Bernstein - See https://cr.yp.to/chacha.html. - -Files: src/leveldb/util/coding.h -Copyright: 2011 The LevelDB Authors. -License: __UNKNOWN__ - Use of this source code is governed by a BSD-style license that can be - found in the LICENSE file. See the AUTHORS file for names of contributors. - . - Endian-neutral encoding: - * Fixed-length numbers are encoded with least-significant byte first - * In addition we support variable length "varint" encoding - * Strings are encoded prefixed by their length in varint format - -Files: test/lint/lint-shell-locale.sh -Copyright: 2018 The Bitcoin Core developers Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. -License: __UNKNOWN__ - Make sure all shell scripts: - a.) explicitly opt out of locale dependence using - -Files: src/crypto/sha256_sse4.cpp -Copyright: 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. -License: __UNKNOWN__ - This is a translation to GCC extended asm syntax from YASM code by Intel - (available at the bottom of this file). - -Files: test/lint/lint-tests.sh -Copyright: 2018 The Bitcoin Core developers Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. -License: __UNKNOWN__ - Check the test suite naming conventions - -Files: src/secp256k1/src/field_5x52_asm_impl.h -Copyright: 2013-2014 Diederik Huys, Pieter Wuille Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. -License: __UNKNOWN__ - Changelog: - - March 2013, Diederik Huys: original version - - November 2014, Pieter Wuille: updated to use Peter Dettman's parallel multiplication algorithm - - December 2014, Pieter Wuille: converted from YASM to GCC inline assembly - -Files: test/lint/lint-rpc-help.sh -Copyright: 2018 The Bitcoin Core developers Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. -License: __UNKNOWN__ - Check that all RPC help texts are generated by RPCHelpMan. - -Files: contrib/debian/copyright -Copyright: : 2009-2019, BGL Core Developers License: Expat Comment: The BGL Core Developers encompasses the current developers listed on BGL.org, as well as the numerous contributors to the project. -License: __UNKNOWN__ - Files: debian/* - Copyright: 2010-2011, Jonas Smedegaard - 2011, Matt Corallo - License: GPL-2+ - -Files: contrib/BGL-cli.bash-completion -Copyright: 2012-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. -License: __UNKNOWN__ - call $BGL-cli for RPC - -Files: src/leveldb/port/win/stdint.h -Copyright: 2011 The LevelDB Authors. -License: __UNKNOWN__ - Use of this source code is governed by a BSD-style license that can be - found in the LICENSE file. See the AUTHORS file for names of contributors. - . - MSVC didn't ship with this file until the 2010 version. - -Files: src/util/strencodings.h -Copyright: 2009-2010 Satoshi Nakamoto - 2009-2018 The Bitcoin Core developers Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. -License: __UNKNOWN__ - Utilities for converting data from/to strings. - -Files: src/util/system.h -Copyright: 2009-2010 Satoshi Nakamoto - 2009-2019 The Bitcoin Core developers Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. -License: __UNKNOWN__ - Server/client environment: argument handling, config file parsing, - thread wrappers, startup time - -Files: test/lint/lint-spelling.sh -Copyright: 2018 The Bitcoin Core developers Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. -License: __UNKNOWN__ - Warn in case of spelling errors. - Note: Will exit successfully regardless of spelling errors. - -Files: contrib/seeds/makeseeds.py -Copyright: 2013-2018 The Bitcoin Core developers Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. -License: __UNKNOWN__ - Generate seeds.txt from Pieter's DNS seeder - -Files: test/lint/lint-python-utf8-encoding.sh -Copyright: 2018 The Bitcoin Core developers Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. -License: __UNKNOWN__ - Make sure we explicitly open all text files using UTF-8 (or ASCII) encoding to - avoid potential issues on the BSDs where the locale is not always set. - -Files: src/leveldb/db/version_set.h -Copyright: 2011 The LevelDB Authors. -License: __UNKNOWN__ - Use of this source code is governed by a BSD-style license that can be - found in the LICENSE file. See the AUTHORS file for names of contributors. - . - The representation of a DBImpl consists of a set of Versions. The - newest version is called "current". Older versions may be kept - around to provide a consistent view to live iterators. - . - Each Version keeps track of a set of Table files per level. The - entire set of versions is maintained in a VersionSet. - . - Version,VersionSet are thread-compatible, but require external - synchronization on all accesses. - -Files: test/lint/lint-circular-dependencies.sh -Copyright: 2018 The Bitcoin Core developers Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. -License: __UNKNOWN__ - Check for circular dependencies - -Files: test/functional/rpc_getblockstats.py -Copyright: 2017-2019 The Bitcoin Core developers Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. -License: __UNKNOWN__ - Test getblockstats rpc call - -Files: src/leveldb/table/filter_block.h -Copyright: 2012 The LevelDB Authors. -License: __UNKNOWN__ - Use of this source code is governed by a BSD-style license that can be - found in the LICENSE file. See the AUTHORS file for names of contributors. - . - A filter block is stored near the end of a Table file. It contains - filters (e.g., bloom filters) for all data blocks in the table combined - into a single filter block. - -Files: src/leveldb/port/port_posix_sse.cc -Copyright: 2016 The LevelDB Authors. -License: __UNKNOWN__ - Use of this source code is governed by a BSD-style license that can be - found in the LICENSE file. See the AUTHORS file for names of contributors. - . - A portable implementation of crc32c, optimized to handle - four bytes at a time. - . - In a separate source file to allow this accelerated CRC32C function to be - compiled with the appropriate compiler flags to enable x86 SSE 4.2 - instructions. - -Files: .travis.yml -Copyright: __NO_COPYRIGHT__ in: .travis.yml -License: __UNKNOWN__ - Some builders use the dependency-generator in `./depends`, rather than using - apt-get to install build dependencies. This guarantees that the tester is - using the same versions as Gitian, so the build results are nearly identical - to what would be found in a final release. - . - In order to avoid rebuilding all dependencies for each build, the binaries - are cached and re-used when possible. Changes in the dependency-generator - will trigger cache-invalidation and rebuilds as necessary. - . - These caches can be manually removed if necessary. This is one of the very - few manual operations that is possible with Travis, and it can be done by a - BGL Core GitHub member via the Travis web interface [0]. - . - Travis CI uploads the cache after the script phase of the build [1]. - However, the build is terminated without saving the cache if it takes over - 50 minutes [2]. Thus, if we spent too much time in early build stages, fail - with an error and save the cache. - . - [0] https://travis-ci.org/BGL/BGL/caches - [1] https://docs.travis-ci.com/user/caching/#build-phases - [2] https://docs.travis-ci.com/user/customizing-the-build#build-timeouts - -Files: src/policy/policy.cpp -Copyright: 2009-2010 Satoshi Nakamoto - 2009-2018 The Bitcoin Core developers Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. -License: __UNKNOWN__ - NOTE: This file is intended to be customised by the end user, and includes only local node policy logic - -Files: contrib/verifybinaries/verify.sh -Copyright: 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. -License: __UNKNOWN__ - This script attempts to download the signature file SHA256SUMS.asc from - bitgesell.ca and BGL.org and compares them. - It first checks if the signature passes, and then downloads the files specified in - the file, and checks if the hashes of these files match those that are specified - in the signature file. - The script returns 0 if everything passes the checks. It returns 1 if either the - signature check or the hash check doesn't pass. If an error occurs the return value is 2 - -Files: src/secp256k1/contrib/lax_der_privatekey_parsing.h -Copyright: 2014-2015 Pieter Wuille Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. -License: __UNKNOWN__ - Please do not link this file directly. It is not part of the libsecp256k1 - project and does not promise any stability in its API, functionality or - presence. Projects which use this code should instead copy this header - and its accompanying .c file directly into their codebase. - . - This file contains code snippets that parse DER private keys with - various errors and violations. This is not a part of the library - itself, because the allowed violations are chosen arbitrarily and - do not follow or establish any standard. - . - It also contains code to serialize private keys in a compatible - manner. - . - These functions are meant for compatibility with applications - that require BER encoded keys. When working with secp256k1-specific - code, the simple 32-byte private keys normally used by the - library are sufficient. - -Files: src/leveldb/include/leveldb/iterator.h -Copyright: 2011 The LevelDB Authors. -License: __UNKNOWN__ - Use of this source code is governed by a BSD-style license that can be - found in the LICENSE file. See the AUTHORS file for names of contributors. - . - An iterator yields a sequence of key/value pairs from a source. - The following class defines the interface. Multiple implementations - are provided by this library. In particular, iterators are provided - to access the contents of a Table or a DB. - . - Multiple threads can invoke const methods on an Iterator without - external synchronization, but if any of the threads may call a - non-const method, all threads accessing the same Iterator must use - external synchronization. - -Files: src/leveldb/include/leveldb/write_batch.h -Copyright: 2011 The LevelDB Authors. -License: __UNKNOWN__ - Use of this source code is governed by a BSD-style license that can be - found in the LICENSE file. See the AUTHORS file for names of contributors. - . - WriteBatch holds a collection of updates to apply atomically to a DB. - . - The updates are applied in the order in which they are added - to the WriteBatch. For example, the value of "key" will be "v3" - after the following batch is written: - . - batch.Put("key", "v1"); - batch.Delete("key"); - batch.Put("key", "v2"); - batch.Put("key", "v3"); - . - Multiple threads can invoke const methods on a WriteBatch without - external synchronization, but if any of the threads may call a - non-const method, all threads accessing the same WriteBatch must use - external synchronization. - -Files: src/leveldb/include/leveldb/cache.h -Copyright: 2011 The LevelDB Authors. -License: __UNKNOWN__ - Use of this source code is governed by a BSD-style license that can be - found in the LICENSE file. See the AUTHORS file for names of contributors. - . - A Cache is an interface that maps keys to values. It has internal - synchronization and may be safely accessed concurrently from - multiple threads. It may automatically evict entries to make room - for new entries. Values have a specified charge against the cache - capacity. For example, a cache where the values are variable - length strings, may use the length of the string as the charge for - the string. - . - A builtin cache implementation with a least-recently-used eviction - policy is provided. Clients may use their own implementations if - they want something more sophisticated (like scan-resistance, a - custom eviction policy, variable cache sizing, etc.) - -Files: test/lint/lint-includes.sh -Copyright: 2018 The Bitcoin Core developers Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. -License: __UNKNOWN__ - Check for duplicate includes. - Guard against accidental introduction of new Boost dependencies. - Check includes: Check for duplicate includes. Enforce bracket syntax includes. - -Files: test/lint/lint-logs.sh -Copyright: 2018 The Bitcoin Core developers Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. -License: __UNKNOWN__ - Check that all logs are terminated with '\n' - . - Some logs are continued over multiple lines. They should be explicitly - commented with \* Continued *\ - . - There are some instances of LogPrintf() in comments. Those can be - ignored - -Files: src/leveldb/include/leveldb/slice.h -Copyright: 2011 The LevelDB Authors. -License: __UNKNOWN__ - Use of this source code is governed by a BSD-style license that can be - found in the LICENSE file. See the AUTHORS file for names of contributors. - . - Slice is a simple structure containing a pointer into some external - storage and a size. The user of a Slice must ensure that the slice - is not used after the corresponding external storage has been - deallocated. - . - Multiple threads can invoke const methods on a Slice without - external synchronization, but if any of the threads may call a - non-const method, all threads accessing the same Slice must use - external synchronization. - -Files: src/leveldb/db/table_cache.h -Copyright: 2011 The LevelDB Authors. -License: __UNKNOWN__ - Use of this source code is governed by a BSD-style license that can be - found in the LICENSE file. See the AUTHORS file for names of contributors. - . - Thread-safe (provides internal synchronization) - -Files: src/leveldb/port/port_example.h -Copyright: 2011 The LevelDB Authors. -License: __UNKNOWN__ - Use of this source code is governed by a BSD-style license that can be - found in the LICENSE file. See the AUTHORS file for names of contributors. - . - This file contains the specification, but not the implementations, - of the types/operations/etc. that should be defined by a platform - -Files: contrib/devtools/clang-format-diff.py -Copyright: 2007-2015 University of Illinois at Urbana-Champaign. -License: __UNKNOWN__ - Developed by: - . - LLVM Team - . - University of Illinois at Urbana-Champaign - . - http://llvm.org - . - Permission is hereby granted, free of charge, to any person obtaining a copy of - this software and associated documentation files (the "Software"), to deal with - the Software without restriction, including without limitation the rights to - use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies - of the Software, and to permit persons to whom the Software is furnished to do - so, subject to the following conditions: - . - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimers. - . - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimers in the - documentation and/or other materials provided with the distribution. - . - * Neither the names of the LLVM Team, University of Illinois at - Urbana-Champaign, nor the names of its contributors may be used to - endorse or promote products derived from this Software without specific - prior written permission. - . - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE - SOFTWARE. - -Files: test/lint/extended-lint-all.sh -Copyright: 2019 The Bitcoin Core developers Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. -License: __UNKNOWN__ - This script runs all contrib/devtools/extended-lint-*.sh files, and fails if - any exit with a non-zero status code. - -Files: src/crypto/aes.h -Copyright: 2015-2018 The Bitcoin Core developers Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. -License: __UNKNOWN__ - C++ wrapper around ctaes, a constant-time AES implementation - -Files: src/crypto/sha256_shani.cpp -Copyright: 2018 The Bitcoin Core developers Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. -License: __UNKNOWN__ - Based on https://github.com/noloader/SHA-Intrinsics/blob/master/sha256-x86.c, - Written and placed in public domain by Jeffrey Walton. - Based on code from Intel, and by Sean Gulley for the miTLS project. - -Files: test/lint/lint-shell.sh -Copyright: 2018-2019 The Bitcoin Core developers Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. -License: __UNKNOWN__ - Check for shellcheck warnings in shell scripts. - -Files: src/leveldb/include/leveldb/status.h -Copyright: 2011 The LevelDB Authors. -License: __UNKNOWN__ - Use of this source code is governed by a BSD-style license that can be - found in the LICENSE file. See the AUTHORS file for names of contributors. - . - A Status encapsulates the result of an operation. It may indicate success, - or it may indicate an error with an associated error message. - . - Multiple threads can invoke const methods on a Status without - external synchronization, but if any of the threads may call a - non-const method, all threads accessing the same Status must use - external synchronization. - -Files: src/leveldb/db/fault_injection_test.cc -Copyright: 2014 The LevelDB Authors. -License: __UNKNOWN__ - Use of this source code is governed by a BSD-style license that can be - found in the LICENSE file. See the AUTHORS file for names of contributors. - . - This test uses a custom Env to keep track of the state of a filesystem as of - the last "sync". It then checks for data loss errors by purposely dropping - file data (or entire files) not protected by a "sync". - -Files: src/leveldb/issues/issue200_test.cc -Copyright: 2013 The LevelDB Authors. -License: __UNKNOWN__ - Use of this source code is governed by a BSD-style license that can be - found in the LICENSE file. See the AUTHORS file for names of contributors. - . - Test for issue 200: when iterator switches direction from backward - to forward, the current key can be yielded unexpectedly if a new - mutation has been added just before the current key. - -Files: src/leveldb/include/leveldb/c.h -Copyright: 2011 The LevelDB Authors. -License: __UNKNOWN__ - Use of this source code is governed by a BSD-style license that can be - found in the LICENSE file. See the AUTHORS file for names of contributors. - . - C bindings for leveldb. May be useful as a stable ABI that can be - used by programs that keep leveldb in a shared library, or for - a JNI api. - . - Does not support: - . getters for the option types - . custom comparators that implement key shortening - . custom iter, db, env, cache implementations using just the C bindings - . - Some conventions: - . - (1) We expose just opaque struct pointers and functions to clients. - This allows us to change internal representations without having to - recompile clients. - . - (2) For simplicity, there is no equivalent to the Slice type. Instead, - the caller has to pass the pointer and length as separate - arguments. - . - (3) Errors are represented by a null-terminated c string. NULL - means no error. All operations that can raise an error are passed - a "char** errptr" as the last argument. One of the following must - be true on entry: - -Files: test/lint/commit-script-check.sh -Copyright: 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. -License: __UNKNOWN__ - This simple script checks for commits beginning with: scripted-diff: - If found, looks for a script between the lines -BEGIN VERIFY SCRIPT- and - -END VERIFY SCRIPT-. If no ending is found, it reads until the end of the - commit message. - . - The resulting script should exactly transform the previous commit into the current - one. Any remaining diff signals an error. - -Files: src/test/denialofservice_tests.cpp -Copyright: 2011-2019 The Bitcoin Core developers Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php. -License: __UNKNOWN__ - Unit tests for denial-of-service detection/prevention code - -Files: src/leveldb/db/filename.h -Copyright: 2011 The LevelDB Authors. -License: __UNKNOWN__ - Use of this source code is governed by a BSD-style license that can be - found in the LICENSE file. See the AUTHORS file for names of contributors. - . - File names used by DB code - -#---------------------------------------------------------------------------- -# xml and html files (skipped): -# share/qt/Info.plist.in -# src/qt/BGL_locale.qrc -# src/qt/BGL.qrc -# src/qt/res/src/clock_3.svg -# src/qt/res/src/connect-3.svg -# src/qt/res/src/hd_enabled.svg -# src/qt/res/src/clock_0.svg -# src/qt/res/src/connect-4.svg -# src/qt/res/src/transaction0.svg -# src/qt/res/src/clock_4.svg -# src/qt/res/src/connect-2.svg -# src/qt/res/src/proxy.svg -# src/qt/res/src/clock_1.svg -# src/qt/res/src/clock_2.svg -# src/qt/res/src/BGL.svg -# src/qt/res/src/connect-1.svg -# src/qt/res/src/connect-0.svg -# src/qt/res/src/qt.svg -# src/qt/res/src/tx_inout.svg -# src/qt/res/src/tx_in.svg -# src/qt/res/src/hd_disabled.svg -# src/qt/res/src/mine.svg -# src/qt/res/src/network_disabled.svg -# src/qt/locale/BGL_cs.ts -# src/qt/locale/BGL_en_GB.ts -# src/qt/locale/BGL_ca.ts -# src/qt/locale/BGL_cy.ts -# src/qt/locale/BGL_pt_BR.ts -# src/qt/locale/BGL_fil.ts -# src/qt/locale/BGL_sr@latin.ts -# src/qt/locale/BGL_ru.ts -# src/qt/locale/BGL_id_ID.ts -# src/qt/locale/BGL_ro_RO.ts -# src/qt/locale/BGL_th.ts -# src/qt/locale/BGL_hu_HU.ts -# src/qt/locale/BGL_es_CL.ts -# src/qt/locale/BGL_szl.ts -# src/qt/locale/BGL_et_EE.ts -# src/qt/locale/BGL_vi.ts -# src/qt/locale/BGL_lv_LV.ts -# src/qt/locale/BGL_nl_NL.ts -# src/qt/locale/BGL_fr_FR.ts -# src/qt/locale/BGL_fi.ts -# src/qt/locale/BGL_hu.ts -# src/qt/locale/BGL_pt.ts -# src/qt/locale/BGL_es_CO.ts -# src/qt/locale/BGL_uz@Cyrl.ts -# src/qt/locale/BGL_is.ts -# src/qt/locale/BGL_eo.ts -# src/qt/locale/BGL_zh_CN.ts -# src/qt/locale/BGL_ml.ts -# src/qt/locale/BGL_es_DO.ts -# src/qt/locale/BGL_da.ts -# src/qt/locale/BGL_sl_SI.ts -# src/qt/locale/BGL_lt.ts -# src/qt/locale/BGL_km.ts -# src/qt/locale/BGL_zh-Hans.ts -# src/qt/locale/BGL_sv.ts -# src/qt/locale/BGL_de.ts -# src/qt/locale/BGL_pl.ts -# src/qt/locale/BGL_ne.ts -# src/qt/locale/BGL_it_IT.ts -# src/qt/locale/BGL_id.ts -# src/qt/locale/BGL_si.ts -# src/qt/locale/BGL_he.ts -# src/qt/locale/BGL_fr.ts -# src/qt/locale/BGL_nl.ts -# src/qt/locale/BGL_vi_VN.ts -# src/qt/locale/BGL_ky.ts -# src/qt/locale/BGL_es.ts -# src/qt/locale/BGL_tr_TR.ts -# src/qt/locale/BGL_be_BY.ts -# src/qt/locale/BGL_el.ts -# src/qt/locale/BGL_zh_HK.ts -# src/qt/locale/BGL_lv.ts -# src/qt/locale/BGL_ka.ts -# src/qt/locale/BGL_ta.ts -# src/qt/locale/BGL_et.ts -# src/qt/locale/BGL_en_AU.ts -# src/qt/locale/BGL_hr.ts -# src/qt/locale/BGL_fr_CA.ts -# src/qt/locale/BGL_ku_IQ.ts -# src/qt/locale/BGL_it.ts -# src/qt/locale/BGL_sk.ts -# src/qt/locale/BGL_sn.ts -# src/qt/locale/BGL_en.ts -# src/qt/locale/BGL_ru_RU.ts -# src/qt/locale/BGL_ms_MY.ts -# src/qt/locale/BGL_ro.ts -# src/qt/locale/BGL_uk_UA.ts -# src/qt/locale/BGL_yo.ts -# src/qt/locale/BGL_ja.ts -# src/qt/locale/BGL_kk.ts -# src/qt/locale/BGL_mk.ts -# src/qt/locale/BGL_te.ts -# src/qt/locale/BGL_es_ES.ts -# src/qt/locale/BGL_ms.ts -# src/qt/locale/BGL_sl.ts -# src/qt/locale/BGL_mr_IN.ts -# src/qt/locale/BGL_ar.ts -# src/qt/locale/BGL_la.ts -# src/qt/locale/BGL_tr.ts -# src/qt/locale/BGL_zh_TW.ts -# src/qt/locale/BGL_ko.ts -# src/qt/locale/BGL_uk.ts -# src/qt/locale/BGL_sk_SK.ts -# src/qt/locale/BGL_el_GR.ts -# src/qt/locale/BGL_mn.ts -# src/qt/locale/BGL_nb.ts -# src/qt/locale/BGL_pam.ts -# src/qt/locale/BGL_cs_CZ.ts -# src/qt/locale/BGL_es_MX.ts -# src/qt/locale/BGL_sr.ts -# src/qt/locale/BGL_fa.ts -# src/qt/locale/BGL_ur.ts -# src/qt/locale/BGL_gl.ts -# src/qt/locale/BGL_es_VE.ts -# src/qt/locale/BGL_he_IL.ts -# src/qt/locale/BGL_pt_PT.ts -# src/qt/locale/BGL_hi.ts -# src/qt/locale/BGL_de_DE.ts -# src/qt/locale/BGL_eu.ts -# src/qt/forms/helpmessagedialog.ui -# src/qt/forms/receivecoinsdialog.ui -# src/qt/forms/askpassphrasedialog.ui -# src/qt/forms/openuridialog.ui -# src/qt/forms/receiverequestdialog.ui -# src/qt/forms/addressbookpage.ui -# src/qt/forms/optionsdialog.ui -# src/qt/forms/modaloverlay.ui -# src/qt/forms/createwalletdialog.ui -# src/qt/forms/sendcoinsdialog.ui -# src/qt/forms/signverifymessagedialog.ui -# src/qt/forms/overviewpage.ui -# src/qt/forms/debugwindow.ui -# src/qt/forms/transactiondescdialog.ui -# src/qt/forms/sendcoinsentry.ui -# src/qt/forms/intro.ui -# src/qt/forms/editaddressdialog.ui -# src/qt/forms/coincontroldialog.ui -# src/leveldb/doc/benchmark.html -# test/functional/combined_log_template.html -# contrib/macdeploy/background.svg -# build_msvc/libBGL_cli/libBGL_cli.vcxproj.in -# build_msvc/libBGL_crypto/libBGL_crypto.vcxproj.in -# build_msvc/libBGL_common/libBGL_common.vcxproj.in -# build_msvc/libBGL_util/libBGL_util.vcxproj.in -# build_msvc/bench_BGL/bench_BGL.vcxproj.in -# build_msvc/libBGL_wallet/libBGL_wallet.vcxproj.in -# build_msvc/libBGL_zmq/libBGL_zmq.vcxproj.in -# build_msvc/libBGL_wallet_tool/libBGL_wallet_tool.vcxproj.in -# build_msvc/msbuild/tasks/replaceinfile.targets -# build_msvc/msbuild/tasks/hexdump.targets -# build_msvc/libBGL_server/libBGL_server.vcxproj.in -# build_msvc/libtest_util/libtest_util.vcxproj.in - -#---------------------------------------------------------------------------- -# huge files (skipped): -# configure -# src/Makefile.in -# autom4te.cache/output.2 -# autom4te.cache/output.0 -# autom4te.cache/output.1 - -#---------------------------------------------------------------------------- -# Files marked as NO_LICENSE_TEXT_FOUND may be covered by the following -# license/copyright files. - -#---------------------------------------------------------------------------- -# License file: COPYING - The MIT License (MIT) - . - Copyright (c) 2009-2019 The Bitcoin Core developers - Copyright (c) 2009-2019 BGL Developers - . - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - . - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - . - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. diff --git a/debian.minimal/files b/debian.minimal/files deleted file mode 100644 index b3087511ce..0000000000 --- a/debian.minimal/files +++ /dev/null @@ -1 +0,0 @@ -bitgesell_0.1.13_source.buildinfo misc optional diff --git a/debian.minimal/rules b/debian.minimal/rules deleted file mode 100755 index f36ff9f369..0000000000 --- a/debian.minimal/rules +++ /dev/null @@ -1,95 +0,0 @@ -#!/usr/bin/make -f - -builddir = $(shell pwd) -destdir = $(builddir)/debian/bitgesell - -CC = gcc-11 -CXX = g++-11 - -.PHONY: distrib download-distrib unpack-distrib berkeleydb libevent miniupnpc - -%: - dh $@ --with autoreconf - -build: distrib - -distrib: unpack-distrib boost berkeleydb libevent miniupnpc - -download-distrib: distrib/boost_1_74_0.tar.gz distrib/db-4.8.30.tar.gz distrib/libevent-2.1.12-stable.tar.gz distrib/miniupnpc-2.1.orig.tar.gz - -unpack-distrib: download-distrib - cd distrib/ && for i in *.tar.gz; do tar -xzf $$i && rm "$$i"; done - -distrib/boost_1_74_0.tar.gz: - mkdir -p distrib/ - wget -O$@ https://boostorg.jfrog.io/artifactory/main/release/1.74.0/source/boost_1_74_0.tar.gz - -distrib/db-4.8.30.tar.gz: - mkdir -p distrib/ - wget -O$@ http://ftp.linuxfoundation.org/pub/lsb/app-battery/packages/db-4.8.30.tar.gz - -distrib/libevent-2.1.12-stable.tar.gz: - mkdir -p distrib/ - wget -O$@ https://github.com/libevent/libevent/releases/download/release-2.1.12-stable/libevent-2.1.12-stable.tar.gz - -distrib/miniupnpc-2.1.orig.tar.gz: - mkdir -p distrib/ - wget -O$@ https://launchpad.net/ubuntu/+archive/primary/+sourcefiles/miniupnpc/2.1-1/miniupnpc_2.1.orig.tar.gz - -boost: - cd distrib/boost_1_74_0 && \ - ./bootstrap.sh CC=$(CC) CXX=$(CXX) --prefix=$(builddir)/distrib/tmp/libboost && \ - ./b2 install - -# --disable-atomicsupport slows things down, but that's necessary to compile (at least on on Ubuntu 22.04.1) -# TODO: Modify libdb to make it faster. -berkeleydb: - cd distrib/db-4.8.30/build_unix && \ - ../dist/configure CC=$(CC) CXX=$(CXX) --disable-static --with-pic --with-gnu-ld --enable-cxx --disable-atomicsupport \ - --prefix=$(builddir)/distrib/tmp/libdb --includedir=$(builddir)/distrib/tmp/libdb/include/db && \ - make clean && \ - make && \ - make install - -libevent: - cd distrib/libevent-2.1.12-stable && \ - ./configure CC=$(CC) CXX=$(CXX) --disable-debug-mode --disable-samples --with-gnu-ld --disable-static \ - --prefix=$(builddir)/distrib/tmp/libevent && \ - make clean && \ - make && \ - make install - -miniupnpc: - cd distrib/miniupnpc-2.1 && \ - make && \ - make DESTDIR=$(builddir)/distrib/tmp/miniupnpc install - -override_dh_autoreconf: - dh_autoreconf -- ./autogen.sh - -# Flags in CXX is an Ubuntu 18.04 hack. # TODO: Can the below be more "ordered"? -# TODO: Manual providing of -I and -L/-l should not be necessary, but it does not work without this -# (at least on Ubuntu 18.04). -override_dh_auto_configure: - dh_auto_configure -- \ - CC=$(CC) CXX="$(CXX) -I$(builddir)/distrib/tmp/libboost/include -I$(builddir)/distrib/tmp/libdb/include -DHAVE_CXX_STDHEADERS -DBOOST_ERROR_CODE_HEADER_ONLY -L$(builddir)/distrib/tmp/libdb/lib -L$(builddir)/distrib/tmp/libboost/lib -L$(builddir)/distrib/tmp/libevent/lib -levent -levent_pthreads -L$(builddir)/distrib/tmp/miniupnpc/usr/lib -lminiupnpc -ldb -ldb_cxx" \ - PKG_CONFIG_PATH="$(builddir)/distrib/tmp/libevent/lib/pkgconfig:$(builddir)/distrib/tmp/miniupnpc/usr/lib/pkgconfig" \ - LDFLAGS="-Wl,-rpath=/usr/lib/bitgesell" \ - BOOST_LDFLAGS="-L$(builddir)/distrib/tmp/libboost/lib" \ - --disable-tests --disable-bench --disable-debug --disable-fuzz-binary --with-gnu-ld \ - --with-gui=no \ - --with-boost="$(builddir)/distrib/tmp/libboost" - -override_dh_auto_test: - DEB_BUILD_OPTIONS=nocheck dh_auto_test - -override_dh_install: - dh_install - mkdir -p $(destdir)/usr/lib/bitgesell - cp -a distrib/tmp/libboost/lib/* $(destdir)/usr/lib/bitgesell/ - cp -a distrib/tmp/libdb/lib/* $(destdir)/usr/lib/bitgesell/ - cp -a distrib/tmp/libevent/lib/* $(destdir)/usr/lib/bitgesell/ - cp -a distrib/tmp/miniupnpc/usr/lib/* $(destdir)/usr/lib/bitgesell/ - -override_dh_shlibdeps: - dh_shlibdeps -l/usr/lib/bitgesell diff --git a/debian.minimal/source/format b/debian.minimal/source/format deleted file mode 100644 index 89ae9db8f8..0000000000 --- a/debian.minimal/source/format +++ /dev/null @@ -1 +0,0 @@ -3.0 (native) diff --git a/debian.minimal/source/local-options b/debian.minimal/source/local-options deleted file mode 100644 index 00131ee8c4..0000000000 --- a/debian.minimal/source/local-options +++ /dev/null @@ -1,2 +0,0 @@ -#abort-on-upstream-changes -#unapply-patches diff --git a/debian.minimal/test.sh b/debian.minimal/test.sh deleted file mode 100755 index 6f0e177ba7..0000000000 --- a/debian.minimal/test.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash - -#finish() { -# docker stop $container >/dev/null -# docker container rm $container >/dev/null -#} - -docker pull ubuntu:22.04 -container=`docker run -dit -e TZ='Etc/UTC' -e DEBIAN_FRONTEND='noninteractive' ubuntu:22.04` -#trap finish EXIT - -docker exec $container apt-get -y update -docker exec $container apt-get -y install apt-utils #dpkg-dev -docker exec $container mkdir /root/repo -docker cp ./bitgesell_0.1.13_amd64.deb $container:/root/repo -# docker exec -w /root/repo $container sh -c "dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz" -docker exec -w /root/repo $container sh -c "apt-ftparchive packages . > Packages" -docker exec $container sh -c "echo deb [trusted=yes] file:/root/repo ./ >> /etc/apt/sources.list" -# docker exec $container rm -rf /var/lib/apt/lists/ # Why is this needed? -# docker exec $container apt-get -y clean -docker exec $container apt-get -y -o APT::Sandbox::User=root update -docker exec $container apt-get -y install bitgesell -docker exec $container sh -c \ - "if { BGL-cli --help && BGLd --help && BGL-tx --help; } > /dev/null; then \ - echo 'Test passed.'; \ - else - echo 'Test failed.'; \ - fi" diff --git a/debian.minimal/watch b/debian.minimal/watch deleted file mode 100644 index 76575dc53b..0000000000 --- a/debian.minimal/watch +++ /dev/null @@ -1,2 +0,0 @@ -# You must remove unused comment lines for the released package. -version=3 diff --git a/debian.qt/README.Debian b/debian.qt/README.Debian deleted file mode 100644 index e5f1622675..0000000000 --- a/debian.qt/README.Debian +++ /dev/null @@ -1,12 +0,0 @@ -To create the Debian package installable on multiple systems including -Ubuntu 22.04 (with Qt wallet), run: - -./debian/build-in-docker.sh - -Maintainers can run ./debian/test.sh to test if the generated Debian -package is correct. - -TODO: ./debian/build-in-docker.sh and ./debian/test.sh should not need to -be updated when the version of the package changes. - - -- Victor Porton Sat, 03 Oct 2020 06:04:48 +0300 diff --git a/debian.qt/build-in-docker.sh b/debian.qt/build-in-docker.sh deleted file mode 100755 index 014c7b885f..0000000000 --- a/debian.qt/build-in-docker.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/bash - -set -e - -debuild -S - -finish() { - docker stop $container >/dev/null - docker container rm $container >/dev/null -} - -docker pull ubuntu:22.04 -container=`docker run -dit -e TZ='Etc/UTC' -e DEBIAN_FRONTEND='noninteractive' ubuntu:22.04 ` -trap finish EXIT - -#docker cp ./debian/updateunattended.sh $container:/root/ -#docker exec $container /root/updateunattended.sh -docker exec $container apt-get update -docker exec $container apt-get -y install apt-utils devscripts sudo #dpkg-dev -docker exec $container apt-get -y install libqrencode-dev qttools5-dev qttools5-dev-tools libsqlite3-dev -docker exec $container mkdir -p /root/repo -docker exec $container useradd user -docker exec $container mkdir /home/user -docker exec $container chown user.user /home/user -docker exec $container sudo -u user mkdir /home/user/build -docker cp ../bitgesell-qt_0.1.13.dsc $container:/root/repo/ -docker cp ../bitgesell-qt_0.1.13.tar.xz $container:/root/repo/ -# docker exec -w /root/repo $container sh -c "dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz" - -docker exec -w /root/repo $container sh -c "apt-ftparchive sources . > Sources" -docker exec $container sh -c "echo deb-src [trusted=yes] file:/root/repo ./ >> /etc/apt/sources.list" -docker exec $container apt-get -y -o APT::Sandbox::User=root update -docker exec $container apt-get -y build-dep bitgesell-qt -docker exec $container chmod a+rX /root -docker exec $container chmod -R a+rX /root/repo -docker exec -w /home/user/build $container sudo -u user apt-get -y source bitgesell-qt -docker exec -w /home/user/build/bitgesell-qt-0.1.13 $container sudo -u user debuild -b -docker cp $container:/home/user/build/bitgesell-qt_0.1.13_amd64.deb bitgesell-qt_0.1.13_amd64.deb -docker cp $container:/home/user/build/bitgesell-qt-dbg_0.1.13_amd64.deb bitgesell-qt-dbg_0.1.13_amd64.deb diff --git a/debian.qt/changelog b/debian.qt/changelog deleted file mode 100644 index 6a80f79b8b..0000000000 --- a/debian.qt/changelog +++ /dev/null @@ -1,60 +0,0 @@ -bitgesell-qt (0.1.13) UNRELEASED; urgency=low - * Bitcoin code synced - - -- Mathias van Orton Fri, 2 Apr 2024 08:50:00 +0000 - -bitgesell-qt (0.1.12) UNRELEASED; urgency=low - * Bitcoin code synced - - -- Mathias van Orton Mon, 29 Apr 2024 08:50:00 +0000 - -bitgesell-qt (0.1.11) UNRELEASED; urgency=low - - * Bitcoin code synced - - -- Mathias van Orton Tue, 6 Feb 2024 15:35:00 +0000 - -bitgesell-qt (0.1.10) UNRELEASED; urgency=low - - * Bitcoin code synced - - -- Mathias van Orton Tue, 18 Apr 2023 10:30:15 +0000 - -bitgesell-qt (0.1.9) UNRELEASED; urgency=low - - * Bitcoin code synced - - -- Mathias van Orton Tue, 8 Nov 2022 10:00:00 +0000 - -bitgesell-qt (0.1.8) UNRELEASED; urgency=low - - * Bitcoin code synced - - -- Mathias van Orton Wed, 20 Apr 2022 10:20:00 +0000 - -bitgesell-qt (0.1.7) UNRELEASED; urgency=low - - * Taproot activation rescheduled with relaxed conditions - - -- Mathias van Orton Sun, 4 Jul 2021 14:40:01 +0000 - - -bitgesell-qt (0.1.6) UNRELEASED; urgency=low - - * Code synced with BTC up to April 2021, Taproot activation scheduled - - -- Mathias van Orton Mon, 24 May 2021 11:24:11 +0000 - - -bitgesell-qt (0.1.3) UNRELEASED; urgency=low - - * Updated all builds before testing BTC synced code. - - -- Mathias van Orton Thu, 26 Nov 2020 11:02:18 +0000 - - -bitgesell-qt (0.1.2) UNRELEASED; urgency=low - - * Initial release. - - -- Victor Porton Sat, 03 Oct 2020 06:04:48 +0300 diff --git a/debian.qt/compat b/debian.qt/compat deleted file mode 100644 index 48082f72f0..0000000000 --- a/debian.qt/compat +++ /dev/null @@ -1 +0,0 @@ -12 diff --git a/debian.qt/control b/debian.qt/control deleted file mode 100644 index 9103a8c8fb..0000000000 --- a/debian.qt/control +++ /dev/null @@ -1,29 +0,0 @@ -Source: bitgesell-qt -Section: misc -Priority: optional -Maintainer: Mathias van Orton -Build-Depends: debhelper (>=11~), g++-11, pkg-config, dh-autoreconf, libevent-dev, libssl-dev, fakeroot, wget -Standards-Version: 4.1.4 -Homepage: https://github.com/wu-emma/bitgesell - -Package: bitgesell-qt -Architecture: any -Depends: libc6 (>= 2.27), libstdc++6 (>= 8.4.0), libbz2-1.0 (>= 1.0.6), liblzma5 (>= 5.2.2), zlib1g (>= 1:1.1.4), - libqt5core5a (>= 5.9.5), libqt5dbus5 (>= 5.9.5), libqt5network5 (>= 5.9.5), libqt5gui5 (>= 5.9.5), libqrencode-dev, libsqlite3-dev, - openssl, perl-modules-5.34, ${misc:Depends} -Description: BGL is an experimental digital currency that enables instant payments to anyone, anywhere in the world - BGL is an experimental digital currency that enables instant payments to anyone, - anywhere in the world. BGL uses peer-to-peer technology to operate with no central authority: - managing transactions and issuing money are carried out collectively by the network. - BGL Core is the name of open source software which enables the use of this currency. - -Package: bitgesell-qt-dbg -Architecture: any -Depends: libc6 (>= 2.27), libstdc++6 (>= 8.4.0), libbz2-1.0 (>= 1.0.6), liblzma5 (>= 5.2.2), zlib1g (>= 1:1.1.4), - libqt5core5a (>= 5.9.5), libqt5dbus5 (>= 5.9.5), libqt5network5 (>= 5.9.5), libqt5gui5 (>= 5.9.5), libqrencode-dev, libsqlite3-dev, - openssl, ${misc:Depends} -Description: BGL is an experimental digital currency that enables instant payments to anyone, anywhere in the world - BGL is an experimental digital currency that enables instant payments to anyone, - anywhere in the world. BGL uses peer-to-peer technology to operate with no central authority: - managing transactions and issuing money are carried out collectively by the network. - BGL Core is the name of open source software which enables the use of this currency. diff --git a/debian.qt/files b/debian.qt/files deleted file mode 100644 index f68e9fd4b8..0000000000 --- a/debian.qt/files +++ /dev/null @@ -1 +0,0 @@ -bitgesell-qt_0.1.13_source.buildinfo misc optional diff --git a/debian.qt/rules b/debian.qt/rules deleted file mode 100755 index e9b20a9bc7..0000000000 --- a/debian.qt/rules +++ /dev/null @@ -1,103 +0,0 @@ -#!/usr/bin/make -f - -builddir = $(shell pwd) -destdir = $(builddir)/debian/bitgesell-qt - -CC = gcc-11 -CXX = g++-11 - -.PHONY: distrib download-distrib unpack-distrib berkeleydb libevent miniupnpc - -%: - dh $@ --with autoreconf - -build: distrib - -distrib: unpack-distrib boost berkeleydb libevent miniupnpc - -download-distrib: distrib/boost_1_74_0.tar.gz distrib/db-4.8.30.tar.gz distrib/libevent-2.1.11-stable.tar.gz distrib/miniupnpc-2.1.orig.tar.gz - -unpack-distrib: download-distrib - cd distrib/ && for i in *.tar.gz; do tar -xzf $$i && rm "$$i"; done - -distrib/boost_1_74_0.tar.gz: - mkdir -p distrib/ - wget -O$@ https://boostorg.jfrog.io/artifactory/main/release/1.74.0/source/boost_1_74_0.tar.gz - -distrib/db-4.8.30.tar.gz: - mkdir -p distrib/ - wget -O$@ http://ftp.linuxfoundation.org/pub/lsb/app-battery/packages/db-4.8.30.tar.gz - -distrib/libevent-2.1.11-stable.tar.gz: - mkdir -p distrib/ - wget -O$@ https://github.com/libevent/libevent/releases/download/release-2.1.11-stable/libevent-2.1.11-stable.tar.gz - -distrib/miniupnpc-2.1.orig.tar.gz: - mkdir -p distrib/ - wget -O$@ https://launchpad.net/ubuntu/+archive/primary/+sourcefiles/miniupnpc/2.1-1/miniupnpc_2.1.orig.tar.gz - -boost: - cd distrib/boost_1_74_0 && \ - ./bootstrap.sh CC=$(CC) CXX=$(CXX) --prefix=$(builddir)/distrib/tmp/libboost && \ - ./b2 install - -# --disable-atomicsupport slows things down, but that's necessary to compile (at least on on Ubuntu 22.04.1) -# TODO: Modify libdb to make it faster. -berkeleydb: - cd distrib/db-4.8.30/build_unix && \ - ../dist/configure CC=$(CC) CXX=$(CXX) --disable-static --with-pic --with-gnu-ld --enable-cxx --disable-atomicsupport \ - --prefix=$(builddir)/distrib/tmp/libdb --includedir=$(builddir)/distrib/tmp/libdb/include/db && \ - make clean && \ - make && \ - make install - -libevent: - cd distrib/libevent-2.1.11-stable && \ - ./configure CC=$(CC) CXX=$(CXX) --disable-debug-mode --disable-samples --with-gnu-ld --disable-static \ - --prefix=$(builddir)/distrib/tmp/libevent && \ - make clean && \ - make && \ - make install - -miniupnpc: - cd distrib/miniupnpc-2.1 && \ - make && \ - make DESTDIR=$(builddir)/distrib/tmp/miniupnpc install - -override_dh_autoreconf: - dh_autoreconf -- ./autogen.sh - -# Flags in CXX is an Ubuntu 18.04 hack. # TODO: Can the below be more "ordered"? -# TODO: Manual providing of -I and -L/-l should not be necessary, but it does not work without this -# (at least on Ubuntu 18.04). -override_dh_auto_configure: - dh_auto_configure -- \ - CC=$(CC) CXX="$(CXX) -I$(builddir)/distrib/tmp/libboost/include -I$(builddir)/distrib/tmp/libdb/include -DHAVE_CXX_STDHEADERS -DBOOST_ERROR_CODE_HEADER_ONLY -L$(builddir)/distrib/tmp/libdb/lib -L$(builddir)/distrib/tmp/libboost/lib -L$(builddir)/distrib/tmp/libevent/lib -levent -levent_pthreads -L$(builddir)/distrib/tmp/miniupnpc/usr/lib -lminiupnpc -ldb -ldb_cxx" \ - PKG_CONFIG_PATH="$(builddir)/distrib/tmp/libevent/lib/pkgconfig:$(builddir)/distrib/tmp/miniupnpc/usr/lib/pkgconfig" \ - LDFLAGS="-Wl,-rpath=/usr/lib/bitgesell-qt" \ - BOOST_LDFLAGS="-L$(builddir)/distrib/tmp/libboost/lib" \ - --disable-tests --disable-bench --disable-debug --with-gnu-ld \ - --with-gui=yes \ - --with-boost="$(builddir)/distrib/tmp/libboost" - -#override dh_auto_install: -# make -j1 install DESTDIR=$(destdir) AM_UPDATE_INFO_DIR=no - -override_dh_auto_test: - DEB_BUILD_OPTIONS=nocheck dh_auto_test - -override_dh_install: - dh_install -# In compat 15 or later, dh_auto_install will use debian/tmp as the -# default --destdir and should be moved from there to the -# appropriate package build directory using dh_install(1) or -# similar tools/ - mkdir -p $(destdir)/usr/lib/bitgesell-qt - cp -r $(builddir)/debian/tmp/usr $(destdir) - cp -a distrib/tmp/libboost/lib/* $(destdir)/usr/lib/bitgesell-qt/ - cp -a distrib/tmp/libdb/lib/* $(destdir)/usr/lib/bitgesell-qt/ - cp -a distrib/tmp/libevent/lib/* $(destdir)/usr/lib/bitgesell-qt/ - cp -a distrib/tmp/miniupnpc/usr/lib/* $(destdir)/usr/lib/bitgesell-qt/ - -override_dh_shlibdeps: - dh_shlibdeps -l/usr/lib/bitgesell-qt diff --git a/debian.qt/source/format b/debian.qt/source/format deleted file mode 100644 index 89ae9db8f8..0000000000 --- a/debian.qt/source/format +++ /dev/null @@ -1 +0,0 @@ -3.0 (native) diff --git a/debian.qt/source/local-options b/debian.qt/source/local-options deleted file mode 100644 index 00131ee8c4..0000000000 --- a/debian.qt/source/local-options +++ /dev/null @@ -1,2 +0,0 @@ -#abort-on-upstream-changes -#unapply-patches diff --git a/debian.qt/test.sh b/debian.qt/test.sh deleted file mode 100755 index 49aa7fcef9..0000000000 --- a/debian.qt/test.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash - -finish() { - docker stop $container >/dev/null - docker container rm $container >/dev/null -} - -docker pull ubuntu:22.04 -container=`docker run -dit -e TZ='Etc/UTC' -e DEBIAN_FRONTEND='noninteractive' ubuntu:22.04` -trap finish EXIT - -docker exec $container apt-get -y update -docker exec $container apt-get -y install apt-utils #dpkg-dev -docker exec $container mkdir /root/repo -docker cp ./bitgesell-qt_0.1.13_amd64.deb $container:/root/repo -# docker exec -w /root/repo $container sh -c "dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz" -docker exec -w /root/repo $container sh -c "apt-ftparchive packages . > Packages" -docker exec $container sh -c "echo deb [trusted=yes] file:/root/repo ./ >> /etc/apt/sources.list" -# docker exec $container rm -rf /var/lib/apt/lists/ # Why is this needed? -# docker exec $container apt-get -y clean -docker exec $container apt-get -y -o APT::Sandbox::User=root update -docker exec $container apt-get -y install bitgesell-qt -docker exec $container sh -c \ - "if { BGL-cli --help && BGLd --help && BGL-tx --help; } > /dev/null; then \ - echo 'Test passed.'; \ - else - echo 'Test failed.'; \ - fi" diff --git a/debian.qt/updateunattended.sh b/debian.qt/updateunattended.sh deleted file mode 100755 index 0078ab3d7b..0000000000 --- a/debian.qt/updateunattended.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -export DEBIAN_FRONTEND=noninteractive -export TZ=Etc/UTC -apt-get update && apt-get install -y tzdata -ln -fs /usr/share/zoneinfo/America/New_York /etc/localtime -dpkg-reconfigure --frontend noninteractive tzdata -#apt-get -y update -apt-get -y install apt-utils devscripts sudo #dpkg-dev -apt-get -y install libqrencode-dev qt5-default qttools5-dev-tools diff --git a/debian.qt/watch b/debian.qt/watch deleted file mode 100644 index 76575dc53b..0000000000 --- a/debian.qt/watch +++ /dev/null @@ -1,2 +0,0 @@ -# You must remove unused comment lines for the released package. -version=3 diff --git a/depends/.gitignore b/depends/.gitignore deleted file mode 100644 index 19c506ce54..0000000000 --- a/depends/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ -SDKs/ -work/ -built/ -sources/ -config.site -x86_64* -i686* -mips* -arm* -aarch64* -powerpc* -riscv32* -riscv64* -s390x* diff --git a/depends/Makefile b/depends/Makefile deleted file mode 100644 index 52a9a14e56..0000000000 --- a/depends/Makefile +++ /dev/null @@ -1,299 +0,0 @@ -.NOTPARALLEL : - -# Pattern rule to print variables, e.g. make print-top_srcdir -print-%: FORCE - @echo '$*'='$($*)' - -# When invoking a sub-make, keep only the command line variable definitions -# matching the pattern in the filter function. -# -# e.g. invoking: -# $ make A=1 C=1 print-MAKEOVERRIDES print-MAKEFLAGS -# -# with the following in the Makefile: -# MAKEOVERRIDES := $(filter A=% B=%,$(MAKEOVERRIDES)) -# -# will print: -# MAKEOVERRIDES = A=1 -# MAKEFLAGS = -- A=1 -# -# this is because as the GNU make manual says: -# The command line variable definitions really appear in the variable -# MAKEOVERRIDES, and MAKEFLAGS contains a reference to this variable. -# -# and since the GNU make manual also says: -# variables defined on the command line are passed to the sub-make through -# MAKEFLAGS -# -# this means that sub-makes will be invoked as if: -# $(MAKE) A=1 blah blah -MAKEOVERRIDES := $(filter V=%,$(MAKEOVERRIDES)) -SOURCES_PATH ?= $(BASEDIR)/sources -WORK_PATH = $(BASEDIR)/work -BASE_CACHE ?= $(BASEDIR)/built -SDK_PATH ?= $(BASEDIR)/SDKs -NO_BOOST ?= -NO_LIBEVENT ?= -NO_QT ?= -NO_QR ?= -NO_BDB ?= -NO_SQLITE ?= -NO_WALLET ?= -NO_ZMQ ?= -NO_UPNP ?= -NO_USDT ?= -NO_NATPMP ?= -MULTIPROCESS ?= -LTO ?= -NO_HARDEN ?= -FALLBACK_DOWNLOAD_PATH ?= https://bitcoincore.org/depends-sources - -C_STANDARD ?= c11 -CXX_STANDARD ?= c++20 - -BUILD = $(shell ./config.guess) -HOST ?= $(BUILD) -PATCHES_PATH = $(BASEDIR)/patches -BASEDIR = $(CURDIR) -HASH_LENGTH:=11 -DOWNLOAD_CONNECT_TIMEOUT:=30 -DOWNLOAD_RETRIES:=3 -HOST_ID_SALT ?= salt -BUILD_ID_SALT ?= salt - -host:=$(BUILD) -ifneq ($(HOST),) -host:=$(HOST) -endif - -ifneq ($(DEBUG),) -release_type=debug -else -release_type=release -endif - -base_build_dir=$(WORK_PATH)/build -base_staging_dir=$(WORK_PATH)/staging -base_download_dir=$(WORK_PATH)/download -canonical_host:=$(shell ./config.sub $(HOST)) -build:=$(shell ./config.sub $(BUILD)) - -build_arch =$(firstword $(subst -, ,$(build))) -build_vendor=$(word 2,$(subst -, ,$(build))) -full_build_os:=$(subst $(build_arch)-$(build_vendor)-,,$(build)) -build_os:=$(findstring linux,$(full_build_os)) -build_os+=$(findstring darwin,$(full_build_os)) -build_os+=$(findstring freebsd,$(full_build_os)) -build_os+=$(findstring netbsd,$(full_build_os)) -build_os+=$(findstring openbsd,$(full_build_os)) -build_os:=$(strip $(build_os)) -ifeq ($(build_os),) -build_os=$(full_build_os) -endif - -host_arch=$(firstword $(subst -, ,$(canonical_host))) -host_vendor=$(word 2,$(subst -, ,$(canonical_host))) -full_host_os:=$(subst $(host_arch)-$(host_vendor)-,,$(canonical_host)) -host_os:=$(findstring linux,$(full_host_os)) -host_os+=$(findstring darwin,$(full_host_os)) -host_os+=$(findstring freebsd,$(full_host_os)) -host_os+=$(findstring netbsd,$(full_host_os)) -host_os+=$(findstring openbsd,$(full_host_os)) -host_os+=$(findstring mingw32,$(full_host_os)) - -host_os:=$(strip $(host_os)) -ifeq ($(host_os),) -host_os=$(full_host_os) -endif - -$(host_arch)_$(host_os)_prefix=$(BASEDIR)/$(host) -$(host_arch)_$(host_os)_host=$(host) -host_prefix=$($(host_arch)_$(host_os)_prefix) -build_prefix=$(host_prefix)/native -build_host=$(build) - -all: install - -include hosts/$(host_os).mk -include hosts/default.mk -include builders/$(build_os).mk -include builders/default.mk -include packages/packages.mk - -# Previously, we directly invoked the well-known programs using $(shell ...) -# to construct build_id_string. However, that was problematic because: -# -# 1. When invoking a shell, GNU Make special-cases exit code 127 (command not -# found) by not capturing the output but instead passing it through. This is -# not done for any other exit code. -# -# 2. Characters like '#' (from these programs' output) would end up in make -# variables like build_id_string, which would be wrongly interpreted by make -# when these variables were used. -# -# Therefore, we should avoid having arbitrary strings in make variables where -# possible. The gen_id script used here hashes the output to construct a -# "make-safe" id. -# -# Also note that these lines need to be: -# -# 1. After including {hosts,builders}/*.mk, since they rely on the tool -# variables (e.g. build_CC, host_STRIP, etc.) to be set. -# -# 2. Before including packages/*.mk (excluding packages/packages.mk), since -# they rely on the build_id variables -# -build_id:=$(shell env CC='$(build_CC)' C_STANDARD='$(C_STANDARD)' CXX='$(build_CXX)' CXX_STANDARD='$(CXX_STANDARD)' AR='$(build_AR) 'NM='$(build_NM)' RANLIB='$(build_RANLIB)' STRIP='$(build_STRIP)' SHA256SUM='$(build_SHA256SUM)' DEBUG='$(DEBUG)' LTO='$(LTO)' NO_HARDEN='$(NO_HARDEN)' ./gen_id '$(BUILD_ID_SALT)' 'GUIX_ENVIRONMENT=$(realpath $(GUIX_ENVIRONMENT))') -$(host_arch)_$(host_os)_id:=$(shell env CC='$(host_CC)' C_STANDARD='$(C_STANDARD)' CXX='$(host_CXX)' CXX_STANDARD='$(CXX_STANDARD)' AR='$(host_AR)' NM='$(host_NM)' RANLIB='$(host_RANLIB)' STRIP='$(host_STRIP)' SHA256SUM='$(build_SHA256SUM)' DEBUG='$(DEBUG)' LTO='$(LTO)' NO_HARDEN='$(NO_HARDEN)' ./gen_id '$(HOST_ID_SALT)' 'GUIX_ENVIRONMENT=$(realpath $(GUIX_ENVIRONMENT))') - -boost_packages_$(NO_BOOST) = $(boost_packages) - -libevent_packages_$(NO_LIBEVENT) = $(libevent_packages) - -qrencode_packages_$(NO_QR) = $(qrencode_$(host_os)_packages) - -qt_packages_$(NO_QT) = $(qt_packages) $(qt_$(host_os)_packages) $(qt_$(host_arch)_$(host_os)_packages) $(qrencode_packages_) - -bdb_packages_$(NO_BDB) = $(bdb_packages) -sqlite_packages_$(NO_SQLITE) = $(sqlite_packages) -wallet_packages_$(NO_WALLET) = $(bdb_packages_) $(sqlite_packages_) - -upnp_packages_$(NO_UPNP) = $(upnp_packages) -natpmp_packages_$(NO_NATPMP) = $(natpmp_packages) - -zmq_packages_$(NO_ZMQ) = $(zmq_packages) -multiprocess_packages_$(MULTIPROCESS) = $(multiprocess_packages) -usdt_packages_$(NO_USDT) = $(usdt_$(host_os)_packages) - -packages += $($(host_arch)_$(host_os)_packages) $($(host_os)_packages) $(boost_packages_) $(libevent_packages_) $(qt_packages_) $(wallet_packages_) $(upnp_packages_) $(natpmp_packages_) $(usdt_packages_) -native_packages += $($(host_arch)_$(host_os)_native_packages) $($(host_os)_native_packages) - -ifneq ($(zmq_packages_),) -packages += $(zmq_packages) -endif - -ifeq ($(multiprocess_packages_),) -packages += $(multiprocess_packages) -native_packages += $(multiprocess_native_packages) -endif - -all_packages = $(packages) $(native_packages) - -meta_depends = Makefile config.guess config.sub funcs.mk builders/default.mk hosts/default.mk hosts/$(host_os).mk builders/$(build_os).mk - -include funcs.mk - -final_build_id_long+=$(shell $(build_SHA256SUM) config.site.in) -final_build_id+=$(shell echo -n "$(final_build_id_long)" | $(build_SHA256SUM) | cut -c-$(HASH_LENGTH)) -$(host_prefix)/.stamp_$(final_build_id): $(native_packages) $(packages) - rm -rf $(@D) - mkdir -p $(@D) - echo copying packages: $^ - echo to: $(@D) - cd $(@D); $(foreach package,$^, $(build_TAR) xf $($(package)_cached); ) - touch $@ - -# $PATH is not preserved between ./configure and make by convention. Its -# modification and overriding at ./configure time is (as I understand it) -# supposed to be captured by the AC_{PROG_{,OBJ}CXX,PATH_{PROG,TOOL}} macros, -# which will expand the program names to their full absolute paths. The notable -# exception is command line overriding: ./configure CC=clang, which skips the -# program name expansion step, and works because the user implicitly indicates -# with CC=clang that clang will be available in $PATH at all times, and is most -# likely part of the user's system. -# -# Therefore, when we "seed the autoconf cache"/"override well-known program -# vars" by setting AR= in our config.site, either one of two things needs -# to be true for the build system to work correctly: -# -# 1. If we refer to the program by name (e.g. AR=riscv64-gnu-linux-ar), the -# tool needs to be available in $PATH at all times. -# -# 2. If the tool is _**not**_ expected to be available in $PATH at all times -# it needs to be referred to by its absolute path, such as would be output -# by the AC_PATH_{PROG,TOOL} macros. -# -# Minor note: it is also okay to refer to tools by their absolute path even if -# we expect them to be available in $PATH at all times, more specificity does -# not hurt. -$(host_prefix)/share/config.site : config.site.in $(host_prefix)/.stamp_$(final_build_id) - @mkdir -p $(@D) - sed -e 's|@HOST@|$(host)|' \ - -e 's|@CC@|$(host_CC)|' \ - -e 's|@CXX@|$(host_CXX)|' \ - -e 's|@AR@|$(host_AR)|' \ - -e 's|@RANLIB@|$(host_RANLIB)|' \ - -e 's|@NM@|$(host_NM)|' \ - -e 's|@STRIP@|$(host_STRIP)|' \ - -e 's|@OBJDUMP@|$(host_OBJDUMP)|' \ - -e 's|@DSYMUTIL@|$(host_DSYMUTIL)|' \ - -e 's|@build_os@|$(build_os)|' \ - -e 's|@host_os@|$(host_os)|' \ - -e 's|@CFLAGS@|$(strip $(host_CFLAGS) $(host_$(release_type)_CFLAGS))|' \ - -e 's|@CXXFLAGS@|$(strip $(host_CXXFLAGS) $(host_$(release_type)_CXXFLAGS))|' \ - -e 's|@CPPFLAGS@|$(strip $(host_CPPFLAGS) $(host_$(release_type)_CPPFLAGS))|' \ - -e 's|@LDFLAGS@|$(strip $(host_LDFLAGS) $(host_$(release_type)_LDFLAGS))|' \ - -e 's|@no_qt@|$(NO_QT)|' \ - -e 's|@no_qr@|$(NO_QR)|' \ - -e 's|@no_zmq@|$(NO_ZMQ)|' \ - -e 's|@no_wallet@|$(NO_WALLET)|' \ - -e 's|@no_bdb@|$(NO_BDB)|' \ - -e 's|@no_sqlite@|$(NO_SQLITE)|' \ - -e 's|@no_upnp@|$(NO_UPNP)|' \ - -e 's|@no_usdt@|$(NO_USDT)|' \ - -e 's|@no_natpmp@|$(NO_NATPMP)|' \ - -e 's|@multiprocess@|$(MULTIPROCESS)|' \ - -e 's|@lto@|$(LTO)|' \ - -e 's|@no_harden@|$(NO_HARDEN)|' \ - -e 's|@debug@|$(DEBUG)|' \ - $< > $@ - touch $@ - - -define check_or_remove_cached - mkdir -p $(BASE_CACHE)/$(host)/$(package) && cd $(BASE_CACHE)/$(host)/$(package); \ - $(build_SHA256SUM) -c $($(package)_cached_checksum) >/dev/null 2>/dev/null || \ - ( rm -f $($(package)_cached_checksum); \ - if test -f "$($(package)_cached)"; then echo "Checksum mismatch for $(package). Forcing rebuild.."; rm -f $($(package)_cached_checksum) $($(package)_cached); fi ) -endef - -define check_or_remove_sources - mkdir -p $($(package)_source_dir); cd $($(package)_source_dir); \ - test -f $($(package)_fetched) && ( $(build_SHA256SUM) -c $($(package)_fetched) >/dev/null 2>/dev/null || \ - ( echo "Checksum missing or mismatched for $(package) source. Forcing re-download."; \ - rm -f $($(package)_all_sources) $($(1)_fetched))) || true -endef - -check-packages: - @$(foreach package,$(all_packages),$(call check_or_remove_cached,$(package));) -check-sources: - @$(foreach package,$(all_packages),$(call check_or_remove_sources,$(package));) - -$(host_prefix)/share/config.site: check-packages - -check-packages: check-sources - -clean-all: clean - @rm -rf $(SOURCES_PATH) x86_64* i686* mips* arm* aarch64* powerpc* riscv32* riscv64* s390x* - -clean: - @rm -rf $(WORK_PATH) $(BASE_CACHE) $(BUILD) *.log - -install: check-packages $(host_prefix)/share/config.site - - -download-one: check-sources $(all_sources) - -download-osx: - @$(MAKE) -s HOST=x86_64-apple-darwin download-one -download-linux: - @$(MAKE) -s HOST=x86_64-unknown-linux-gnu download-one -download-win: - @$(MAKE) -s HOST=x86_64-w64-mingw32 download-one -download: download-osx download-linux download-win - -$(foreach package,$(all_packages),$(eval $(call ext_add_stages,$(package)))) - -.PHONY: install cached clean clean-all download-one download-osx download-linux download-win download check-packages check-sources -.PHONY: FORCE -$(V).SILENT: diff --git a/depends/README.md b/depends/README.md deleted file mode 100644 index 53ecfa70cb..0000000000 --- a/depends/README.md +++ /dev/null @@ -1,142 +0,0 @@ -### Usage - -To build dependencies for the current arch+OS: - - make - -To build for another arch/OS: - - make HOST=host-platform-triplet - -For example: - - make HOST=x86_64-w64-mingw32 -j4 - -**BGL Core's `configure` script by default will ignore the depends output.** In -order for it to pick up libraries, tools, and settings from the depends build, -you must set the `CONFIG_SITE` environment variable to point to a `config.site` settings file. -Make sure that `CONFIG_SITE` is an absolute path. -In the above example, a file named `depends/x86_64-w64-mingw32/share/config.site` will be -created. To use it during compilation: - - CONFIG_SITE=$PWD/depends/x86_64-w64-mingw32/share/config.site ./configure - -The default install prefix when using `config.site` is `--prefix=depends/`, -so depends build outputs will be installed in that location. - -Common `host-platform-triplet`s for cross compilation are: - -- `i686-pc-linux-gnu` for Linux 32 bit -- `x86_64-pc-linux-gnu` for x86 Linux -- `x86_64-w64-mingw32` for Win64 -- `x86_64-apple-darwin` for macOS -- `arm64-apple-darwin` for ARM macOS -- `arm-linux-gnueabihf` for Linux ARM 32 bit -- `aarch64-linux-gnu` for Linux ARM 64 bit -- `powerpc64-linux-gnu` for Linux POWER 64-bit (big endian) -- `powerpc64le-linux-gnu` for Linux POWER 64-bit (little endian) -- `riscv32-linux-gnu` for Linux RISC-V 32 bit -- `riscv64-linux-gnu` for Linux RISC-V 64 bit -- `s390x-linux-gnu` for Linux S390X - -The paths are automatically configured and no other options are needed. - -### Install the required dependencies: Ubuntu & Debian - -#### Common - - apt install automake bison cmake curl libtool make patch pkg-config python3 xz-utils - -#### For macOS cross compilation - - apt install clang lld llvm g++ zip - -Clang 18 or later is required. You must also obtain the macOS SDK before -proceeding with a cross-compile. Under the depends directory, create a -subdirectory named `SDKs`. Then, place the extracted SDK under this new directory. -For more information, see [SDK Extraction](../contrib/macdeploy/README.md#sdk-extraction). - -#### For Win64 cross compilation - -- see [build-windows.md](../doc/build-windows.md#cross-compilation-for-ubuntu-and-windows-subsystem-for-linux) - -#### For linux (including i386, ARM) cross compilation - -Common linux dependencies: - - sudo apt-get install g++-multilib binutils - -For linux ARM cross compilation: - - sudo apt-get install g++-arm-linux-gnueabihf binutils-arm-linux-gnueabihf - -For linux AARCH64 cross compilation: - - sudo apt-get install g++-aarch64-linux-gnu binutils-aarch64-linux-gnu - -For linux POWER 64-bit cross compilation (there are no packages for 32-bit): - - sudo apt-get install g++-powerpc64-linux-gnu binutils-powerpc64-linux-gnu g++-powerpc64le-linux-gnu binutils-powerpc64le-linux-gnu - -For linux RISC-V 64-bit cross compilation (there are no packages for 32-bit): - - sudo apt-get install g++-riscv64-linux-gnu binutils-riscv64-linux-gnu - -For linux S390X cross compilation: - - sudo apt-get install g++-s390x-linux-gnu binutils-s390x-linux-gnu - -### Install the required dependencies: FreeBSD - - pkg install bash - -### Install the required dependencies: OpenBSD - - pkg_add bash gtar - -### Dependency Options - -The following can be set when running make: `make FOO=bar` - -- `SOURCES_PATH`: Downloaded sources will be placed here -- `BASE_CACHE`: Built packages will be placed here -- `SDK_PATH`: Path where SDKs can be found (used by macOS) -- `FALLBACK_DOWNLOAD_PATH`: If a source file can't be fetched, try here before giving up -- `C_STANDARD`: Set the C standard version used. Defaults to `c11`. -- `CXX_STANDARD`: Set the C++ standard version used. Defaults to `c++20`. -- `NO_BOOST`: Don't download/build/cache Boost -- `NO_LIBEVENT`: Don't download/build/cache Libevent -- `NO_QT`: Don't download/build/cache Qt and its dependencies -- `NO_QR`: Don't download/build/cache packages needed for enabling qrencode -- `NO_ZMQ`: Don't download/build/cache packages needed for enabling ZeroMQ -- `NO_WALLET`: Don't download/build/cache libs needed to enable the wallet -- `NO_BDB`: Don't download/build/cache BerkeleyDB -- `NO_SQLITE`: Don't download/build/cache SQLite -- `NO_UPNP`: Don't download/build/cache packages needed for enabling UPnP -- `NO_NATPMP`: Don't download/build/cache packages needed for enabling NAT-PMP -- `NO_USDT`: Don't download/build/cache packages needed for enabling USDT tracepoints -- `MULTIPROCESS`: Build libmultiprocess (experimental, requires CMake) -- `DEBUG`: Disable some optimizations and enable more runtime checking -- `HOST_ID_SALT`: Optional salt to use when generating host package ids -- `BUILD_ID_SALT`: Optional salt to use when generating build package ids -- `LOG`: Use file-based logging for individual packages. During a package build its log file - resides in the `depends` directory, and the log file is printed out automatically in case - of build error. After successful build log files are moved along with package archives -- `LTO`: Enable options needed for LTO. Does not add `-flto` related options to *FLAGS. -- `NO_HARDEN=1`: Don't use hardening options when building packages - -If some packages are not built, for example `make NO_WALLET=1`, the appropriate -options will be passed to BGL's configure. In this case, `--disable-wallet`. - -### Additional targets - - download: run 'make download' to fetch all sources without building them - download-osx: run 'make download-osx' to fetch all sources needed for macOS builds - download-win: run 'make download-win' to fetch all sources needed for win builds - download-linux: run 'make download-linux' to fetch all sources needed for linux builds - - -### Other documentation - -- [description.md](description.md): General description of the depends system -- [packages.md](packages.md): Steps for adding packages diff --git a/depends/builders/darwin.mk b/depends/builders/darwin.mk deleted file mode 100644 index 2b59353e84..0000000000 --- a/depends/builders/darwin.mk +++ /dev/null @@ -1,25 +0,0 @@ -build_darwin_CC:=$(shell xcrun -f clang) -isysroot$(shell xcrun --show-sdk-path) -build_darwin_CXX:=$(shell xcrun -f clang++) -isysroot$(shell xcrun --show-sdk-path) -build_darwin_AR:=$(shell xcrun -f ar) -build_darwin_RANLIB:=$(shell xcrun -f ranlib) -build_darwin_STRIP:=$(shell xcrun -f strip) -build_darwin_OBJDUMP:=$(shell xcrun -f objdump) -build_darwin_NM:=$(shell xcrun -f nm) -build_darwin_DSYMUTIL:=$(shell xcrun -f dsymutil) -build_darwin_SHA256SUM=shasum -a 256 -build_darwin_DOWNLOAD=curl --location --fail --connect-timeout $(DOWNLOAD_CONNECT_TIMEOUT) --retry $(DOWNLOAD_RETRIES) -o - -#darwin host on darwin builder. overrides darwin host preferences. -darwin_CC=$(shell xcrun -f clang) -isysroot$(shell xcrun --show-sdk-path) -darwin_CXX:=$(shell xcrun -f clang++) -stdlib=libc++ -isysroot$(shell xcrun --show-sdk-path) -darwin_AR:=$(shell xcrun -f ar) -darwin_RANLIB:=$(shell xcrun -f ranlib) -darwin_STRIP:=$(shell xcrun -f strip) -darwin_OBJDUMP:=$(shell xcrun -f objdump) -darwin_NM:=$(shell xcrun -f nm) -darwin_DSYMUTIL:=$(shell xcrun -f dsymutil) - -x86_64_darwin_CFLAGS += -arch x86_64 -x86_64_darwin_CXXFLAGS += -arch x86_64 -aarch64_darwin_CFLAGS += -arch arm64 -aarch64_darwin_CXXFLAGS += -arch arm64 diff --git a/depends/builders/default.mk b/depends/builders/default.mk deleted file mode 100644 index 2a1709d98a..0000000000 --- a/depends/builders/default.mk +++ /dev/null @@ -1,21 +0,0 @@ -default_build_CC = gcc -default_build_CXX = g++ -default_build_AR = ar -default_build_OBJDUMP = objdump -default_build_TAR = tar -default_build_RANLIB = ranlib -default_build_STRIP = strip -default_build_NM = nm -default_build_TOUCH = touch -h -m -t 200001011200 - -define add_build_tool_func -build_$(build_os)_$1 ?= $$(default_build_$1) -build_$(build_arch)_$(build_os)_$1 ?= $$(build_$(build_os)_$1) -build_$1=$$(build_$(build_arch)_$(build_os)_$1) -endef -$(foreach var,CC CXX AR TAR RANLIB NM STRIP SHA256SUM DOWNLOAD OBJDUMP DSYMUTIL TOUCH,$(eval $(call add_build_tool_func,$(var)))) -define add_build_flags_func -build_$(build_arch)_$(build_os)_$1 += $(build_$(build_os)_$1) -build_$1=$$(build_$(build_arch)_$(build_os)_$1) -endef -$(foreach flags, CFLAGS CXXFLAGS LDFLAGS, $(eval $(call add_build_flags_func,$(flags)))) diff --git a/depends/builders/freebsd.mk b/depends/builders/freebsd.mk deleted file mode 100644 index 465f58e04d..0000000000 --- a/depends/builders/freebsd.mk +++ /dev/null @@ -1,5 +0,0 @@ -build_freebsd_CC=clang -build_freebsd_CXX=clang++ - -build_freebsd_SHA256SUM = shasum -a 256 -build_freebsd_DOWNLOAD = curl --location --fail --connect-timeout $(DOWNLOAD_CONNECT_TIMEOUT) --retry $(DOWNLOAD_RETRIES) -o diff --git a/depends/builders/linux.mk b/depends/builders/linux.mk deleted file mode 100644 index b03f424010..0000000000 --- a/depends/builders/linux.mk +++ /dev/null @@ -1,2 +0,0 @@ -build_linux_SHA256SUM = sha256sum -build_linux_DOWNLOAD = curl --location --fail --connect-timeout $(DOWNLOAD_CONNECT_TIMEOUT) --retry $(DOWNLOAD_RETRIES) -o diff --git a/depends/builders/netbsd.mk b/depends/builders/netbsd.mk deleted file mode 100644 index b7cf1f7514..0000000000 --- a/depends/builders/netbsd.mk +++ /dev/null @@ -1,2 +0,0 @@ -build_netbsd_SHA256SUM = shasum -a 256 -build_netbsd_DOWNLOAD = curl --location --fail --connect-timeout $(DOWNLOAD_CONNECT_TIMEOUT) --retry $(DOWNLOAD_RETRIES) -o diff --git a/depends/builders/openbsd.mk b/depends/builders/openbsd.mk deleted file mode 100644 index 9c94c4baae..0000000000 --- a/depends/builders/openbsd.mk +++ /dev/null @@ -1,9 +0,0 @@ -build_openbsd_CC = clang -build_openbsd_CXX = clang++ - -build_openbsd_SHA256SUM = sha256 -build_openbsd_DOWNLOAD = curl --location --fail --connect-timeout $(DOWNLOAD_CONNECT_TIMEOUT) --retry $(DOWNLOAD_RETRIES) -o - -build_openbsd_TAR = gtar -# openBSD touch doesn't understand -h -build_openbsd_TOUCH = touch -m -t 200001011200 diff --git a/depends/config.guess b/depends/config.guess deleted file mode 100755 index cdfc439204..0000000000 --- a/depends/config.guess +++ /dev/null @@ -1,1807 +0,0 @@ -#! /bin/sh -# Attempt to guess a canonical system name. -# Copyright 1992-2023 Free Software Foundation, Inc. - -# shellcheck disable=SC2006,SC2268 # see below for rationale - -timestamp='2023-08-22' - -# This file is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, see . -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that -# program. This Exception is an additional permission under section 7 -# of the GNU General Public License, version 3 ("GPLv3"). -# -# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. -# -# You can get the latest version of this script from: -# https://git.savannah.gnu.org/cgit/config.git/plain/config.guess -# -# Please send patches to . - - -# The "shellcheck disable" line above the timestamp inhibits complaints -# about features and limitations of the classic Bourne shell that were -# superseded or lifted in POSIX. However, this script identifies a wide -# variety of pre-POSIX systems that do not have POSIX shells at all, and -# even some reasonably current systems (Solaris 10 as case-in-point) still -# have a pre-POSIX /bin/sh. - - -me=`echo "$0" | sed -e 's,.*/,,'` - -usage="\ -Usage: $0 [OPTION] - -Output the configuration name of the system '$me' is run on. - -Options: - -h, --help print this help, then exit - -t, --time-stamp print date of last modification, then exit - -v, --version print version number, then exit - -Report bugs and patches to ." - -version="\ -GNU config.guess ($timestamp) - -Originally written by Per Bothner. -Copyright 1992-2023 Free Software Foundation, Inc. - -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -help=" -Try '$me --help' for more information." - -# Parse command line -while test $# -gt 0 ; do - case $1 in - --time-stamp | --time* | -t ) - echo "$timestamp" ; exit ;; - --version | -v ) - echo "$version" ; exit ;; - --help | --h* | -h ) - echo "$usage"; exit ;; - -- ) # Stop option processing - shift; break ;; - - ) # Use stdin as input. - break ;; - -* ) - echo "$me: invalid option $1$help" >&2 - exit 1 ;; - * ) - break ;; - esac -done - -if test $# != 0; then - echo "$me: too many arguments$help" >&2 - exit 1 -fi - -# Just in case it came from the environment. -GUESS= - -# CC_FOR_BUILD -- compiler used by this script. Note that the use of a -# compiler to aid in system detection is discouraged as it requires -# temporary files to be created and, as you can see below, it is a -# headache to deal with in a portable fashion. - -# Historically, 'CC_FOR_BUILD' used to be named 'HOST_CC'. We still -# use 'HOST_CC' if defined, but it is deprecated. - -# Portable tmp directory creation inspired by the Autoconf team. - -tmp= -# shellcheck disable=SC2172 -trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15 - -set_cc_for_build() { - # prevent multiple calls if $tmp is already set - test "$tmp" && return 0 - : "${TMPDIR=/tmp}" - # shellcheck disable=SC2039,SC3028 - { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || - { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } || - { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || - { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } - dummy=$tmp/dummy - case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in - ,,) echo "int x;" > "$dummy.c" - for driver in cc gcc c89 c99 ; do - if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then - CC_FOR_BUILD=$driver - break - fi - done - if test x"$CC_FOR_BUILD" = x ; then - CC_FOR_BUILD=no_compiler_found - fi - ;; - ,,*) CC_FOR_BUILD=$CC ;; - ,*,*) CC_FOR_BUILD=$HOST_CC ;; - esac -} - -# This is needed to find uname on a Pyramid OSx when run in the BSD universe. -# (ghazi@noc.rutgers.edu 1994-08-24) -if test -f /.attbin/uname ; then - PATH=$PATH:/.attbin ; export PATH -fi - -UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown -UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown -UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown -UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown - -case $UNAME_SYSTEM in -Linux|GNU|GNU/*) - LIBC=unknown - - set_cc_for_build - cat <<-EOF > "$dummy.c" - #if defined(__ANDROID__) - LIBC=android - #else - #include - #if defined(__UCLIBC__) - LIBC=uclibc - #elif defined(__dietlibc__) - LIBC=dietlibc - #elif defined(__GLIBC__) - LIBC=gnu - #else - #include - /* First heuristic to detect musl libc. */ - #ifdef __DEFINED_va_list - LIBC=musl - #endif - #endif - #endif - EOF - cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` - eval "$cc_set_libc" - - # Second heuristic to detect musl libc. - if [ "$LIBC" = unknown ] && - command -v ldd >/dev/null && - ldd --version 2>&1 | grep -q ^musl; then - LIBC=musl - fi - - # If the system lacks a compiler, then just pick glibc. - # We could probably try harder. - if [ "$LIBC" = unknown ]; then - LIBC=gnu - fi - ;; -esac - -# Note: order is significant - the case branches are not exclusive. - -case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in - *:NetBSD:*:*) - # NetBSD (nbsd) targets should (where applicable) match one or - # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, - # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently - # switched to ELF, *-*-netbsd* would select the old - # object file format. This provides both forward - # compatibility and a consistent mechanism for selecting the - # object file format. - # - # Note: NetBSD doesn't particularly care about the vendor - # portion of the name. We always set it to "unknown". - UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ - /sbin/sysctl -n hw.machine_arch 2>/dev/null || \ - /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \ - echo unknown)` - case $UNAME_MACHINE_ARCH in - aarch64eb) machine=aarch64_be-unknown ;; - armeb) machine=armeb-unknown ;; - arm*) machine=arm-unknown ;; - sh3el) machine=shl-unknown ;; - sh3eb) machine=sh-unknown ;; - sh5el) machine=sh5le-unknown ;; - earmv*) - arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` - endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` - machine=${arch}${endian}-unknown - ;; - *) machine=$UNAME_MACHINE_ARCH-unknown ;; - esac - # The Operating System including object format, if it has switched - # to ELF recently (or will in the future) and ABI. - case $UNAME_MACHINE_ARCH in - earm*) - os=netbsdelf - ;; - arm*|i386|m68k|ns32k|sh3*|sparc|vax) - set_cc_for_build - if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ELF__ - then - # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). - # Return netbsd for either. FIX? - os=netbsd - else - os=netbsdelf - fi - ;; - *) - os=netbsd - ;; - esac - # Determine ABI tags. - case $UNAME_MACHINE_ARCH in - earm*) - expr='s/^earmv[0-9]/-eabi/;s/eb$//' - abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` - ;; - esac - # The OS release - # Debian GNU/NetBSD machines have a different userland, and - # thus, need a distinct triplet. However, they do not need - # kernel version information, so it can be replaced with a - # suitable tag, in the style of linux-gnu. - case $UNAME_VERSION in - Debian*) - release='-gnu' - ;; - *) - release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` - ;; - esac - # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: - # contains redundant information, the shorter form: - # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. - GUESS=$machine-${os}${release}${abi-} - ;; - *:Bitrig:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` - GUESS=$UNAME_MACHINE_ARCH-unknown-bitrig$UNAME_RELEASE - ;; - *:OpenBSD:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` - GUESS=$UNAME_MACHINE_ARCH-unknown-openbsd$UNAME_RELEASE - ;; - *:SecBSD:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/SecBSD.//'` - GUESS=$UNAME_MACHINE_ARCH-unknown-secbsd$UNAME_RELEASE - ;; - *:LibertyBSD:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` - GUESS=$UNAME_MACHINE_ARCH-unknown-libertybsd$UNAME_RELEASE - ;; - *:MidnightBSD:*:*) - GUESS=$UNAME_MACHINE-unknown-midnightbsd$UNAME_RELEASE - ;; - *:ekkoBSD:*:*) - GUESS=$UNAME_MACHINE-unknown-ekkobsd$UNAME_RELEASE - ;; - *:SolidBSD:*:*) - GUESS=$UNAME_MACHINE-unknown-solidbsd$UNAME_RELEASE - ;; - *:OS108:*:*) - GUESS=$UNAME_MACHINE-unknown-os108_$UNAME_RELEASE - ;; - macppc:MirBSD:*:*) - GUESS=powerpc-unknown-mirbsd$UNAME_RELEASE - ;; - *:MirBSD:*:*) - GUESS=$UNAME_MACHINE-unknown-mirbsd$UNAME_RELEASE - ;; - *:Sortix:*:*) - GUESS=$UNAME_MACHINE-unknown-sortix - ;; - *:Twizzler:*:*) - GUESS=$UNAME_MACHINE-unknown-twizzler - ;; - *:Redox:*:*) - GUESS=$UNAME_MACHINE-unknown-redox - ;; - mips:OSF1:*.*) - GUESS=mips-dec-osf1 - ;; - alpha:OSF1:*:*) - # Reset EXIT trap before exiting to avoid spurious non-zero exit code. - trap '' 0 - case $UNAME_RELEASE in - *4.0) - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` - ;; - *5.*) - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` - ;; - esac - # According to Compaq, /usr/sbin/psrinfo has been available on - # OSF/1 and Tru64 systems produced since 1995. I hope that - # covers most systems running today. This code pipes the CPU - # types through head -n 1, so we only detect the type of CPU 0. - ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` - case $ALPHA_CPU_TYPE in - "EV4 (21064)") - UNAME_MACHINE=alpha ;; - "EV4.5 (21064)") - UNAME_MACHINE=alpha ;; - "LCA4 (21066/21068)") - UNAME_MACHINE=alpha ;; - "EV5 (21164)") - UNAME_MACHINE=alphaev5 ;; - "EV5.6 (21164A)") - UNAME_MACHINE=alphaev56 ;; - "EV5.6 (21164PC)") - UNAME_MACHINE=alphapca56 ;; - "EV5.7 (21164PC)") - UNAME_MACHINE=alphapca57 ;; - "EV6 (21264)") - UNAME_MACHINE=alphaev6 ;; - "EV6.7 (21264A)") - UNAME_MACHINE=alphaev67 ;; - "EV6.8CB (21264C)") - UNAME_MACHINE=alphaev68 ;; - "EV6.8AL (21264B)") - UNAME_MACHINE=alphaev68 ;; - "EV6.8CX (21264D)") - UNAME_MACHINE=alphaev68 ;; - "EV6.9A (21264/EV69A)") - UNAME_MACHINE=alphaev69 ;; - "EV7 (21364)") - UNAME_MACHINE=alphaev7 ;; - "EV7.9 (21364A)") - UNAME_MACHINE=alphaev79 ;; - esac - # A Pn.n version is a patched version. - # A Vn.n version is a released version. - # A Tn.n version is a released field test version. - # A Xn.n version is an unreleased experimental baselevel. - # 1.2 uses "1.2" for uname -r. - OSF_REL=`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` - GUESS=$UNAME_MACHINE-dec-osf$OSF_REL - ;; - Amiga*:UNIX_System_V:4.0:*) - GUESS=m68k-unknown-sysv4 - ;; - *:[Aa]miga[Oo][Ss]:*:*) - GUESS=$UNAME_MACHINE-unknown-amigaos - ;; - *:[Mm]orph[Oo][Ss]:*:*) - GUESS=$UNAME_MACHINE-unknown-morphos - ;; - *:OS/390:*:*) - GUESS=i370-ibm-openedition - ;; - *:z/VM:*:*) - GUESS=s390-ibm-zvmoe - ;; - *:OS400:*:*) - GUESS=powerpc-ibm-os400 - ;; - arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) - GUESS=arm-acorn-riscix$UNAME_RELEASE - ;; - arm*:riscos:*:*|arm*:RISCOS:*:*) - GUESS=arm-unknown-riscos - ;; - SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) - GUESS=hppa1.1-hitachi-hiuxmpp - ;; - Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) - # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. - case `(/bin/universe) 2>/dev/null` in - att) GUESS=pyramid-pyramid-sysv3 ;; - *) GUESS=pyramid-pyramid-bsd ;; - esac - ;; - NILE*:*:*:dcosx) - GUESS=pyramid-pyramid-svr4 - ;; - DRS?6000:unix:4.0:6*) - GUESS=sparc-icl-nx6 - ;; - DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) - case `/usr/bin/uname -p` in - sparc) GUESS=sparc-icl-nx7 ;; - esac - ;; - s390x:SunOS:*:*) - SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` - GUESS=$UNAME_MACHINE-ibm-solaris2$SUN_REL - ;; - sun4H:SunOS:5.*:*) - SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` - GUESS=sparc-hal-solaris2$SUN_REL - ;; - sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) - SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` - GUESS=sparc-sun-solaris2$SUN_REL - ;; - i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) - GUESS=i386-pc-auroraux$UNAME_RELEASE - ;; - i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) - set_cc_for_build - SUN_ARCH=i386 - # If there is a compiler, see if it is configured for 64-bit objects. - # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. - # This test works for both compilers. - if test "$CC_FOR_BUILD" != no_compiler_found; then - if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS="" $CC_FOR_BUILD -m64 -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - SUN_ARCH=x86_64 - fi - fi - SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` - GUESS=$SUN_ARCH-pc-solaris2$SUN_REL - ;; - sun4*:SunOS:6*:*) - # According to config.sub, this is the proper way to canonicalize - # SunOS6. Hard to guess exactly what SunOS6 will be like, but - # it's likely to be more like Solaris than SunOS4. - SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` - GUESS=sparc-sun-solaris3$SUN_REL - ;; - sun4*:SunOS:*:*) - case `/usr/bin/arch -k` in - Series*|S4*) - UNAME_RELEASE=`uname -v` - ;; - esac - # Japanese Language versions have a version number like '4.1.3-JL'. - SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'` - GUESS=sparc-sun-sunos$SUN_REL - ;; - sun3*:SunOS:*:*) - GUESS=m68k-sun-sunos$UNAME_RELEASE - ;; - sun*:*:4.2BSD:*) - UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` - test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 - case `/bin/arch` in - sun3) - GUESS=m68k-sun-sunos$UNAME_RELEASE - ;; - sun4) - GUESS=sparc-sun-sunos$UNAME_RELEASE - ;; - esac - ;; - aushp:SunOS:*:*) - GUESS=sparc-auspex-sunos$UNAME_RELEASE - ;; - # The situation for MiNT is a little confusing. The machine name - # can be virtually everything (everything which is not - # "atarist" or "atariste" at least should have a processor - # > m68000). The system name ranges from "MiNT" over "FreeMiNT" - # to the lowercase version "mint" (or "freemint"). Finally - # the system name "TOS" denotes a system which is actually not - # MiNT. But MiNT is downward compatible to TOS, so this should - # be no problem. - atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) - GUESS=m68k-atari-mint$UNAME_RELEASE - ;; - atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) - GUESS=m68k-atari-mint$UNAME_RELEASE - ;; - *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) - GUESS=m68k-atari-mint$UNAME_RELEASE - ;; - milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) - GUESS=m68k-milan-mint$UNAME_RELEASE - ;; - hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) - GUESS=m68k-hades-mint$UNAME_RELEASE - ;; - *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) - GUESS=m68k-unknown-mint$UNAME_RELEASE - ;; - m68k:machten:*:*) - GUESS=m68k-apple-machten$UNAME_RELEASE - ;; - powerpc:machten:*:*) - GUESS=powerpc-apple-machten$UNAME_RELEASE - ;; - RISC*:Mach:*:*) - GUESS=mips-dec-mach_bsd4.3 - ;; - RISC*:ULTRIX:*:*) - GUESS=mips-dec-ultrix$UNAME_RELEASE - ;; - VAX*:ULTRIX*:*:*) - GUESS=vax-dec-ultrix$UNAME_RELEASE - ;; - 2020:CLIX:*:* | 2430:CLIX:*:*) - GUESS=clipper-intergraph-clix$UNAME_RELEASE - ;; - mips:*:*:UMIPS | mips:*:*:RISCos) - set_cc_for_build - sed 's/^ //' << EOF > "$dummy.c" -#ifdef __cplusplus -#include /* for printf() prototype */ - int main (int argc, char *argv[]) { -#else - int main (argc, argv) int argc; char *argv[]; { -#endif - #if defined (host_mips) && defined (MIPSEB) - #if defined (SYSTYPE_SYSV) - printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_SVR4) - printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) - printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); - #endif - #endif - exit (-1); - } -EOF - $CC_FOR_BUILD -o "$dummy" "$dummy.c" && - dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && - SYSTEM_NAME=`"$dummy" "$dummyarg"` && - { echo "$SYSTEM_NAME"; exit; } - GUESS=mips-mips-riscos$UNAME_RELEASE - ;; - Motorola:PowerMAX_OS:*:*) - GUESS=powerpc-motorola-powermax - ;; - Motorola:*:4.3:PL8-*) - GUESS=powerpc-harris-powermax - ;; - Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) - GUESS=powerpc-harris-powermax - ;; - Night_Hawk:Power_UNIX:*:*) - GUESS=powerpc-harris-powerunix - ;; - m88k:CX/UX:7*:*) - GUESS=m88k-harris-cxux7 - ;; - m88k:*:4*:R4*) - GUESS=m88k-motorola-sysv4 - ;; - m88k:*:3*:R3*) - GUESS=m88k-motorola-sysv3 - ;; - AViiON:dgux:*:*) - # DG/UX returns AViiON for all architectures - UNAME_PROCESSOR=`/usr/bin/uname -p` - if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110 - then - if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \ - test "$TARGET_BINARY_INTERFACE"x = x - then - GUESS=m88k-dg-dgux$UNAME_RELEASE - else - GUESS=m88k-dg-dguxbcs$UNAME_RELEASE - fi - else - GUESS=i586-dg-dgux$UNAME_RELEASE - fi - ;; - M88*:DolphinOS:*:*) # DolphinOS (SVR3) - GUESS=m88k-dolphin-sysv3 - ;; - M88*:*:R3*:*) - # Delta 88k system running SVR3 - GUESS=m88k-motorola-sysv3 - ;; - XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) - GUESS=m88k-tektronix-sysv3 - ;; - Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) - GUESS=m68k-tektronix-bsd - ;; - *:IRIX*:*:*) - IRIX_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/g'` - GUESS=mips-sgi-irix$IRIX_REL - ;; - ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. - GUESS=romp-ibm-aix # uname -m gives an 8 hex-code CPU id - ;; # Note that: echo "'`uname -s`'" gives 'AIX ' - i*86:AIX:*:*) - GUESS=i386-ibm-aix - ;; - ia64:AIX:*:*) - if test -x /usr/bin/oslevel ; then - IBM_REV=`/usr/bin/oslevel` - else - IBM_REV=$UNAME_VERSION.$UNAME_RELEASE - fi - GUESS=$UNAME_MACHINE-ibm-aix$IBM_REV - ;; - *:AIX:2:3) - if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then - set_cc_for_build - sed 's/^ //' << EOF > "$dummy.c" - #include - - main() - { - if (!__power_pc()) - exit(1); - puts("powerpc-ibm-aix3.2.5"); - exit(0); - } -EOF - if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` - then - GUESS=$SYSTEM_NAME - else - GUESS=rs6000-ibm-aix3.2.5 - fi - elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then - GUESS=rs6000-ibm-aix3.2.4 - else - GUESS=rs6000-ibm-aix3.2 - fi - ;; - *:AIX:*:[4567]) - IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` - if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then - IBM_ARCH=rs6000 - else - IBM_ARCH=powerpc - fi - if test -x /usr/bin/lslpp ; then - IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | \ - awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` - else - IBM_REV=$UNAME_VERSION.$UNAME_RELEASE - fi - GUESS=$IBM_ARCH-ibm-aix$IBM_REV - ;; - *:AIX:*:*) - GUESS=rs6000-ibm-aix - ;; - ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) - GUESS=romp-ibm-bsd4.4 - ;; - ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and - GUESS=romp-ibm-bsd$UNAME_RELEASE # 4.3 with uname added to - ;; # report: romp-ibm BSD 4.3 - *:BOSX:*:*) - GUESS=rs6000-bull-bosx - ;; - DPX/2?00:B.O.S.:*:*) - GUESS=m68k-bull-sysv3 - ;; - 9000/[34]??:4.3bsd:1.*:*) - GUESS=m68k-hp-bsd - ;; - hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) - GUESS=m68k-hp-bsd4.4 - ;; - 9000/[34678]??:HP-UX:*:*) - HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` - case $UNAME_MACHINE in - 9000/31?) HP_ARCH=m68000 ;; - 9000/[34]??) HP_ARCH=m68k ;; - 9000/[678][0-9][0-9]) - if test -x /usr/bin/getconf; then - sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` - sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` - case $sc_cpu_version in - 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 - 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 - 532) # CPU_PA_RISC2_0 - case $sc_kernel_bits in - 32) HP_ARCH=hppa2.0n ;; - 64) HP_ARCH=hppa2.0w ;; - '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 - esac ;; - esac - fi - if test "$HP_ARCH" = ""; then - set_cc_for_build - sed 's/^ //' << EOF > "$dummy.c" - - #define _HPUX_SOURCE - #include - #include - - int main () - { - #if defined(_SC_KERNEL_BITS) - long bits = sysconf(_SC_KERNEL_BITS); - #endif - long cpu = sysconf (_SC_CPU_VERSION); - - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1"); break; - case CPU_PA_RISC2_0: - #if defined(_SC_KERNEL_BITS) - switch (bits) - { - case 64: puts ("hppa2.0w"); break; - case 32: puts ("hppa2.0n"); break; - default: puts ("hppa2.0"); break; - } break; - #else /* !defined(_SC_KERNEL_BITS) */ - puts ("hppa2.0"); break; - #endif - default: puts ("hppa1.0"); break; - } - exit (0); - } -EOF - (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` - test -z "$HP_ARCH" && HP_ARCH=hppa - fi ;; - esac - if test "$HP_ARCH" = hppa2.0w - then - set_cc_for_build - - # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating - # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler - # generating 64-bit code. GNU and HP use different nomenclature: - # - # $ CC_FOR_BUILD=cc ./config.guess - # => hppa2.0w-hp-hpux11.23 - # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess - # => hppa64-hp-hpux11.23 - - if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | - grep -q __LP64__ - then - HP_ARCH=hppa2.0w - else - HP_ARCH=hppa64 - fi - fi - GUESS=$HP_ARCH-hp-hpux$HPUX_REV - ;; - ia64:HP-UX:*:*) - HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` - GUESS=ia64-hp-hpux$HPUX_REV - ;; - 3050*:HI-UX:*:*) - set_cc_for_build - sed 's/^ //' << EOF > "$dummy.c" - #include - int - main () - { - long cpu = sysconf (_SC_CPU_VERSION); - /* The order matters, because CPU_IS_HP_MC68K erroneously returns - true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct - results, however. */ - if (CPU_IS_PA_RISC (cpu)) - { - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; - case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; - default: puts ("hppa-hitachi-hiuxwe2"); break; - } - } - else if (CPU_IS_HP_MC68K (cpu)) - puts ("m68k-hitachi-hiuxwe2"); - else puts ("unknown-hitachi-hiuxwe2"); - exit (0); - } -EOF - $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && - { echo "$SYSTEM_NAME"; exit; } - GUESS=unknown-hitachi-hiuxwe2 - ;; - 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) - GUESS=hppa1.1-hp-bsd - ;; - 9000/8??:4.3bsd:*:*) - GUESS=hppa1.0-hp-bsd - ;; - *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) - GUESS=hppa1.0-hp-mpeix - ;; - hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) - GUESS=hppa1.1-hp-osf - ;; - hp8??:OSF1:*:*) - GUESS=hppa1.0-hp-osf - ;; - i*86:OSF1:*:*) - if test -x /usr/sbin/sysversion ; then - GUESS=$UNAME_MACHINE-unknown-osf1mk - else - GUESS=$UNAME_MACHINE-unknown-osf1 - fi - ;; - parisc*:Lites*:*:*) - GUESS=hppa1.1-hp-lites - ;; - C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) - GUESS=c1-convex-bsd - ;; - C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit ;; - C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) - GUESS=c34-convex-bsd - ;; - C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) - GUESS=c38-convex-bsd - ;; - C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) - GUESS=c4-convex-bsd - ;; - CRAY*Y-MP:*:*:*) - CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` - GUESS=ymp-cray-unicos$CRAY_REL - ;; - CRAY*[A-Z]90:*:*:*) - echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ - | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ - -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ - -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*TS:*:*:*) - CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` - GUESS=t90-cray-unicos$CRAY_REL - ;; - CRAY*T3E:*:*:*) - CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` - GUESS=alphaev5-cray-unicosmk$CRAY_REL - ;; - CRAY*SV1:*:*:*) - CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` - GUESS=sv1-cray-unicos$CRAY_REL - ;; - *:UNICOS/mp:*:*) - CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` - GUESS=craynv-cray-unicosmp$CRAY_REL - ;; - F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) - FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` - FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` - FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` - GUESS=${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} - ;; - 5000:UNIX_System_V:4.*:*) - FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` - FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` - GUESS=sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} - ;; - i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) - GUESS=$UNAME_MACHINE-pc-bsdi$UNAME_RELEASE - ;; - sparc*:BSD/OS:*:*) - GUESS=sparc-unknown-bsdi$UNAME_RELEASE - ;; - *:BSD/OS:*:*) - GUESS=$UNAME_MACHINE-unknown-bsdi$UNAME_RELEASE - ;; - arm:FreeBSD:*:*) - UNAME_PROCESSOR=`uname -p` - set_cc_for_build - if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ARM_PCS_VFP - then - FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` - GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabi - else - FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` - GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabihf - fi - ;; - *:FreeBSD:*:*) - UNAME_PROCESSOR=`uname -p` - case $UNAME_PROCESSOR in - amd64) - UNAME_PROCESSOR=x86_64 ;; - i386) - UNAME_PROCESSOR=i586 ;; - esac - FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` - GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL - ;; - i*:CYGWIN*:*) - GUESS=$UNAME_MACHINE-pc-cygwin - ;; - *:MINGW64*:*) - GUESS=$UNAME_MACHINE-pc-mingw64 - ;; - *:MINGW*:*) - GUESS=$UNAME_MACHINE-pc-mingw32 - ;; - *:MSYS*:*) - GUESS=$UNAME_MACHINE-pc-msys - ;; - i*:PW*:*) - GUESS=$UNAME_MACHINE-pc-pw32 - ;; - *:SerenityOS:*:*) - GUESS=$UNAME_MACHINE-pc-serenity - ;; - *:Interix*:*) - case $UNAME_MACHINE in - x86) - GUESS=i586-pc-interix$UNAME_RELEASE - ;; - authenticamd | genuineintel | EM64T) - GUESS=x86_64-unknown-interix$UNAME_RELEASE - ;; - IA64) - GUESS=ia64-unknown-interix$UNAME_RELEASE - ;; - esac ;; - i*:UWIN*:*) - GUESS=$UNAME_MACHINE-pc-uwin - ;; - amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) - GUESS=x86_64-pc-cygwin - ;; - prep*:SunOS:5.*:*) - SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` - GUESS=powerpcle-unknown-solaris2$SUN_REL - ;; - *:GNU:*:*) - # the GNU system - GNU_ARCH=`echo "$UNAME_MACHINE" | sed -e 's,[-/].*$,,'` - GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's,/.*$,,'` - GUESS=$GNU_ARCH-unknown-$LIBC$GNU_REL - ;; - *:GNU/*:*:*) - # other systems with GNU libc and userland - GNU_SYS=`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"` - GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` - GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC - ;; - x86_64:[Mm]anagarm:*:*|i?86:[Mm]anagarm:*:*) - GUESS="$UNAME_MACHINE-pc-managarm-mlibc" - ;; - *:[Mm]anagarm:*:*) - GUESS="$UNAME_MACHINE-unknown-managarm-mlibc" - ;; - *:Minix:*:*) - GUESS=$UNAME_MACHINE-unknown-minix - ;; - aarch64:Linux:*:*) - set_cc_for_build - CPU=$UNAME_MACHINE - LIBCABI=$LIBC - if test "$CC_FOR_BUILD" != no_compiler_found; then - ABI=64 - sed 's/^ //' << EOF > "$dummy.c" - #ifdef __ARM_EABI__ - #ifdef __ARM_PCS_VFP - ABI=eabihf - #else - ABI=eabi - #endif - #endif -EOF - cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | sed 's, ,,g'` - eval "$cc_set_abi" - case $ABI in - eabi | eabihf) CPU=armv8l; LIBCABI=$LIBC$ABI ;; - esac - fi - GUESS=$CPU-unknown-linux-$LIBCABI - ;; - aarch64_be:Linux:*:*) - UNAME_MACHINE=aarch64_be - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - alpha:Linux:*:*) - case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in - EV5) UNAME_MACHINE=alphaev5 ;; - EV56) UNAME_MACHINE=alphaev56 ;; - PCA56) UNAME_MACHINE=alphapca56 ;; - PCA57) UNAME_MACHINE=alphapca56 ;; - EV6) UNAME_MACHINE=alphaev6 ;; - EV67) UNAME_MACHINE=alphaev67 ;; - EV68*) UNAME_MACHINE=alphaev68 ;; - esac - objdump --private-headers /bin/sh | grep -q ld.so.1 - if test "$?" = 0 ; then LIBC=gnulibc1 ; fi - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - arc:Linux:*:* | arceb:Linux:*:* | arc32:Linux:*:* | arc64:Linux:*:*) - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - arm*:Linux:*:*) - set_cc_for_build - if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ARM_EABI__ - then - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - else - if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ARM_PCS_VFP - then - GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabi - else - GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabihf - fi - fi - ;; - avr32*:Linux:*:*) - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - cris:Linux:*:*) - GUESS=$UNAME_MACHINE-axis-linux-$LIBC - ;; - crisv32:Linux:*:*) - GUESS=$UNAME_MACHINE-axis-linux-$LIBC - ;; - e2k:Linux:*:*) - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - frv:Linux:*:*) - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - hexagon:Linux:*:*) - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - i*86:Linux:*:*) - GUESS=$UNAME_MACHINE-pc-linux-$LIBC - ;; - ia64:Linux:*:*) - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - k1om:Linux:*:*) - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - kvx:Linux:*:*) - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - kvx:cos:*:*) - GUESS=$UNAME_MACHINE-unknown-cos - ;; - kvx:mbr:*:*) - GUESS=$UNAME_MACHINE-unknown-mbr - ;; - loongarch32:Linux:*:* | loongarch64:Linux:*:*) - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - m32r*:Linux:*:*) - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - m68*:Linux:*:*) - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - mips:Linux:*:* | mips64:Linux:*:*) - set_cc_for_build - IS_GLIBC=0 - test x"${LIBC}" = xgnu && IS_GLIBC=1 - sed 's/^ //' << EOF > "$dummy.c" - #undef CPU - #undef mips - #undef mipsel - #undef mips64 - #undef mips64el - #if ${IS_GLIBC} && defined(_ABI64) - LIBCABI=gnuabi64 - #else - #if ${IS_GLIBC} && defined(_ABIN32) - LIBCABI=gnuabin32 - #else - LIBCABI=${LIBC} - #endif - #endif - - #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 - CPU=mipsisa64r6 - #else - #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 - CPU=mipsisa32r6 - #else - #if defined(__mips64) - CPU=mips64 - #else - CPU=mips - #endif - #endif - #endif - - #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) - MIPS_ENDIAN=el - #else - #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) - MIPS_ENDIAN= - #else - MIPS_ENDIAN= - #endif - #endif -EOF - cc_set_vars=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'` - eval "$cc_set_vars" - test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; } - ;; - mips64el:Linux:*:*) - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - openrisc*:Linux:*:*) - GUESS=or1k-unknown-linux-$LIBC - ;; - or32:Linux:*:* | or1k*:Linux:*:*) - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - padre:Linux:*:*) - GUESS=sparc-unknown-linux-$LIBC - ;; - parisc64:Linux:*:* | hppa64:Linux:*:*) - GUESS=hppa64-unknown-linux-$LIBC - ;; - parisc:Linux:*:* | hppa:Linux:*:*) - # Look for CPU level - case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in - PA7*) GUESS=hppa1.1-unknown-linux-$LIBC ;; - PA8*) GUESS=hppa2.0-unknown-linux-$LIBC ;; - *) GUESS=hppa-unknown-linux-$LIBC ;; - esac - ;; - ppc64:Linux:*:*) - GUESS=powerpc64-unknown-linux-$LIBC - ;; - ppc:Linux:*:*) - GUESS=powerpc-unknown-linux-$LIBC - ;; - ppc64le:Linux:*:*) - GUESS=powerpc64le-unknown-linux-$LIBC - ;; - ppcle:Linux:*:*) - GUESS=powerpcle-unknown-linux-$LIBC - ;; - riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*) - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - s390:Linux:*:* | s390x:Linux:*:*) - GUESS=$UNAME_MACHINE-ibm-linux-$LIBC - ;; - sh64*:Linux:*:*) - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - sh*:Linux:*:*) - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - sparc:Linux:*:* | sparc64:Linux:*:*) - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - tile*:Linux:*:*) - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - vax:Linux:*:*) - GUESS=$UNAME_MACHINE-dec-linux-$LIBC - ;; - x86_64:Linux:*:*) - set_cc_for_build - CPU=$UNAME_MACHINE - LIBCABI=$LIBC - if test "$CC_FOR_BUILD" != no_compiler_found; then - ABI=64 - sed 's/^ //' << EOF > "$dummy.c" - #ifdef __i386__ - ABI=x86 - #else - #ifdef __ILP32__ - ABI=x32 - #endif - #endif -EOF - cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | sed 's, ,,g'` - eval "$cc_set_abi" - case $ABI in - x86) CPU=i686 ;; - x32) LIBCABI=${LIBC}x32 ;; - esac - fi - GUESS=$CPU-pc-linux-$LIBCABI - ;; - xtensa*:Linux:*:*) - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - i*86:DYNIX/ptx:4*:*) - # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. - # earlier versions are messed up and put the nodename in both - # sysname and nodename. - GUESS=i386-sequent-sysv4 - ;; - i*86:UNIX_SV:4.2MP:2.*) - # Unixware is an offshoot of SVR4, but it has its own version - # number series starting with 2... - # I am not positive that other SVR4 systems won't match this, - # I just have to hope. -- rms. - # Use sysv4.2uw... so that sysv4* matches it. - GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION - ;; - i*86:OS/2:*:*) - # If we were able to find 'uname', then EMX Unix compatibility - # is probably installed. - GUESS=$UNAME_MACHINE-pc-os2-emx - ;; - i*86:XTS-300:*:STOP) - GUESS=$UNAME_MACHINE-unknown-stop - ;; - i*86:atheos:*:*) - GUESS=$UNAME_MACHINE-unknown-atheos - ;; - i*86:syllable:*:*) - GUESS=$UNAME_MACHINE-pc-syllable - ;; - i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) - GUESS=i386-unknown-lynxos$UNAME_RELEASE - ;; - i*86:*DOS:*:*) - GUESS=$UNAME_MACHINE-pc-msdosdjgpp - ;; - i*86:*:4.*:*) - UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` - if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then - GUESS=$UNAME_MACHINE-univel-sysv$UNAME_REL - else - GUESS=$UNAME_MACHINE-pc-sysv$UNAME_REL - fi - ;; - i*86:*:5:[678]*) - # UnixWare 7.x, OpenUNIX and OpenServer 6. - case `/bin/uname -X | grep "^Machine"` in - *486*) UNAME_MACHINE=i486 ;; - *Pentium) UNAME_MACHINE=i586 ;; - *Pent*|*Celeron) UNAME_MACHINE=i686 ;; - esac - GUESS=$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} - ;; - i*86:*:3.2:*) - if test -f /usr/options/cb.name; then - UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then - UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` - (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 - (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ - && UNAME_MACHINE=i586 - (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ - && UNAME_MACHINE=i686 - (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ - && UNAME_MACHINE=i686 - GUESS=$UNAME_MACHINE-pc-sco$UNAME_REL - else - GUESS=$UNAME_MACHINE-pc-sysv32 - fi - ;; - pc:*:*:*) - # Left here for compatibility: - # uname -m prints for DJGPP always 'pc', but it prints nothing about - # the processor, so we play safe by assuming i586. - # Note: whatever this is, it MUST be the same as what config.sub - # prints for the "djgpp" host, or else GDB configure will decide that - # this is a cross-build. - GUESS=i586-pc-msdosdjgpp - ;; - Intel:Mach:3*:*) - GUESS=i386-pc-mach3 - ;; - paragon:*:*:*) - GUESS=i860-intel-osf1 - ;; - i860:*:4.*:*) # i860-SVR4 - if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then - GUESS=i860-stardent-sysv$UNAME_RELEASE # Stardent Vistra i860-SVR4 - else # Add other i860-SVR4 vendors below as they are discovered. - GUESS=i860-unknown-sysv$UNAME_RELEASE # Unknown i860-SVR4 - fi - ;; - mini*:CTIX:SYS*5:*) - # "miniframe" - GUESS=m68010-convergent-sysv - ;; - mc68k:UNIX:SYSTEM5:3.51m) - GUESS=m68k-convergent-sysv - ;; - M680?0:D-NIX:5.3:*) - GUESS=m68k-diab-dnix - ;; - M68*:*:R3V[5678]*:*) - test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; - 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) - OS_REL='' - test -r /etc/.relid \ - && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } - /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; - 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4; exit; } ;; - NCR*:*:4.2:* | MPRAS*:*:4.2:*) - OS_REL='.3' - test -r /etc/.relid \ - && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } - /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } - /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ - && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; - m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) - GUESS=m68k-unknown-lynxos$UNAME_RELEASE - ;; - mc68030:UNIX_System_V:4.*:*) - GUESS=m68k-atari-sysv4 - ;; - TSUNAMI:LynxOS:2.*:*) - GUESS=sparc-unknown-lynxos$UNAME_RELEASE - ;; - rs6000:LynxOS:2.*:*) - GUESS=rs6000-unknown-lynxos$UNAME_RELEASE - ;; - PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) - GUESS=powerpc-unknown-lynxos$UNAME_RELEASE - ;; - SM[BE]S:UNIX_SV:*:*) - GUESS=mips-dde-sysv$UNAME_RELEASE - ;; - RM*:ReliantUNIX-*:*:*) - GUESS=mips-sni-sysv4 - ;; - RM*:SINIX-*:*:*) - GUESS=mips-sni-sysv4 - ;; - *:SINIX-*:*:*) - if uname -p 2>/dev/null >/dev/null ; then - UNAME_MACHINE=`(uname -p) 2>/dev/null` - GUESS=$UNAME_MACHINE-sni-sysv4 - else - GUESS=ns32k-sni-sysv - fi - ;; - PENTIUM:*:4.0*:*) # Unisys 'ClearPath HMP IX 4000' SVR4/MP effort - # says - GUESS=i586-unisys-sysv4 - ;; - *:UNIX_System_V:4*:FTX*) - # From Gerald Hewes . - # How about differentiating between stratus architectures? -djm - GUESS=hppa1.1-stratus-sysv4 - ;; - *:*:*:FTX*) - # From seanf@swdc.stratus.com. - GUESS=i860-stratus-sysv4 - ;; - i*86:VOS:*:*) - # From Paul.Green@stratus.com. - GUESS=$UNAME_MACHINE-stratus-vos - ;; - *:VOS:*:*) - # From Paul.Green@stratus.com. - GUESS=hppa1.1-stratus-vos - ;; - mc68*:A/UX:*:*) - GUESS=m68k-apple-aux$UNAME_RELEASE - ;; - news*:NEWS-OS:6*:*) - GUESS=mips-sony-newsos6 - ;; - R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) - if test -d /usr/nec; then - GUESS=mips-nec-sysv$UNAME_RELEASE - else - GUESS=mips-unknown-sysv$UNAME_RELEASE - fi - ;; - BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. - GUESS=powerpc-be-beos - ;; - BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. - GUESS=powerpc-apple-beos - ;; - BePC:BeOS:*:*) # BeOS running on Intel PC compatible. - GUESS=i586-pc-beos - ;; - BePC:Haiku:*:*) # Haiku running on Intel PC compatible. - GUESS=i586-pc-haiku - ;; - ppc:Haiku:*:*) # Haiku running on Apple PowerPC - GUESS=powerpc-apple-haiku - ;; - *:Haiku:*:*) # Haiku modern gcc (not bound by BeOS compat) - GUESS=$UNAME_MACHINE-unknown-haiku - ;; - SX-4:SUPER-UX:*:*) - GUESS=sx4-nec-superux$UNAME_RELEASE - ;; - SX-5:SUPER-UX:*:*) - GUESS=sx5-nec-superux$UNAME_RELEASE - ;; - SX-6:SUPER-UX:*:*) - GUESS=sx6-nec-superux$UNAME_RELEASE - ;; - SX-7:SUPER-UX:*:*) - GUESS=sx7-nec-superux$UNAME_RELEASE - ;; - SX-8:SUPER-UX:*:*) - GUESS=sx8-nec-superux$UNAME_RELEASE - ;; - SX-8R:SUPER-UX:*:*) - GUESS=sx8r-nec-superux$UNAME_RELEASE - ;; - SX-ACE:SUPER-UX:*:*) - GUESS=sxace-nec-superux$UNAME_RELEASE - ;; - Power*:Rhapsody:*:*) - GUESS=powerpc-apple-rhapsody$UNAME_RELEASE - ;; - *:Rhapsody:*:*) - GUESS=$UNAME_MACHINE-apple-rhapsody$UNAME_RELEASE - ;; - arm64:Darwin:*:*) - GUESS=aarch64-apple-darwin$UNAME_RELEASE - ;; - *:Darwin:*:*) - UNAME_PROCESSOR=`uname -p` - case $UNAME_PROCESSOR in - unknown) UNAME_PROCESSOR=powerpc ;; - esac - if command -v xcode-select > /dev/null 2> /dev/null && \ - ! xcode-select --print-path > /dev/null 2> /dev/null ; then - # Avoid executing cc if there is no toolchain installed as - # cc will be a stub that puts up a graphical alert - # prompting the user to install developer tools. - CC_FOR_BUILD=no_compiler_found - else - set_cc_for_build - fi - if test "$CC_FOR_BUILD" != no_compiler_found; then - if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - case $UNAME_PROCESSOR in - i386) UNAME_PROCESSOR=x86_64 ;; - powerpc) UNAME_PROCESSOR=powerpc64 ;; - esac - fi - # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc - if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ - (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_PPC >/dev/null - then - UNAME_PROCESSOR=powerpc - fi - elif test "$UNAME_PROCESSOR" = i386 ; then - # uname -m returns i386 or x86_64 - UNAME_PROCESSOR=$UNAME_MACHINE - fi - GUESS=$UNAME_PROCESSOR-apple-darwin$UNAME_RELEASE - ;; - *:procnto*:*:* | *:QNX:[0123456789]*:*) - UNAME_PROCESSOR=`uname -p` - if test "$UNAME_PROCESSOR" = x86; then - UNAME_PROCESSOR=i386 - UNAME_MACHINE=pc - fi - GUESS=$UNAME_PROCESSOR-$UNAME_MACHINE-nto-qnx$UNAME_RELEASE - ;; - *:QNX:*:4*) - GUESS=i386-pc-qnx - ;; - NEO-*:NONSTOP_KERNEL:*:*) - GUESS=neo-tandem-nsk$UNAME_RELEASE - ;; - NSE-*:NONSTOP_KERNEL:*:*) - GUESS=nse-tandem-nsk$UNAME_RELEASE - ;; - NSR-*:NONSTOP_KERNEL:*:*) - GUESS=nsr-tandem-nsk$UNAME_RELEASE - ;; - NSV-*:NONSTOP_KERNEL:*:*) - GUESS=nsv-tandem-nsk$UNAME_RELEASE - ;; - NSX-*:NONSTOP_KERNEL:*:*) - GUESS=nsx-tandem-nsk$UNAME_RELEASE - ;; - *:NonStop-UX:*:*) - GUESS=mips-compaq-nonstopux - ;; - BS2000:POSIX*:*:*) - GUESS=bs2000-siemens-sysv - ;; - DS/*:UNIX_System_V:*:*) - GUESS=$UNAME_MACHINE-$UNAME_SYSTEM-$UNAME_RELEASE - ;; - *:Plan9:*:*) - # "uname -m" is not consistent, so use $cputype instead. 386 - # is converted to i386 for consistency with other x86 - # operating systems. - if test "${cputype-}" = 386; then - UNAME_MACHINE=i386 - elif test "x${cputype-}" != x; then - UNAME_MACHINE=$cputype - fi - GUESS=$UNAME_MACHINE-unknown-plan9 - ;; - *:TOPS-10:*:*) - GUESS=pdp10-unknown-tops10 - ;; - *:TENEX:*:*) - GUESS=pdp10-unknown-tenex - ;; - KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) - GUESS=pdp10-dec-tops20 - ;; - XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) - GUESS=pdp10-xkl-tops20 - ;; - *:TOPS-20:*:*) - GUESS=pdp10-unknown-tops20 - ;; - *:ITS:*:*) - GUESS=pdp10-unknown-its - ;; - SEI:*:*:SEIUX) - GUESS=mips-sei-seiux$UNAME_RELEASE - ;; - *:DragonFly:*:*) - DRAGONFLY_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` - GUESS=$UNAME_MACHINE-unknown-dragonfly$DRAGONFLY_REL - ;; - *:*VMS:*:*) - UNAME_MACHINE=`(uname -p) 2>/dev/null` - case $UNAME_MACHINE in - A*) GUESS=alpha-dec-vms ;; - I*) GUESS=ia64-dec-vms ;; - V*) GUESS=vax-dec-vms ;; - esac ;; - *:XENIX:*:SysV) - GUESS=i386-pc-xenix - ;; - i*86:skyos:*:*) - SKYOS_REL=`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'` - GUESS=$UNAME_MACHINE-pc-skyos$SKYOS_REL - ;; - i*86:rdos:*:*) - GUESS=$UNAME_MACHINE-pc-rdos - ;; - i*86:Fiwix:*:*) - GUESS=$UNAME_MACHINE-pc-fiwix - ;; - *:AROS:*:*) - GUESS=$UNAME_MACHINE-unknown-aros - ;; - x86_64:VMkernel:*:*) - GUESS=$UNAME_MACHINE-unknown-esx - ;; - amd64:Isilon\ OneFS:*:*) - GUESS=x86_64-unknown-onefs - ;; - *:Unleashed:*:*) - GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE - ;; -esac - -# Do we have a guess based on uname results? -if test "x$GUESS" != x; then - echo "$GUESS" - exit -fi - -# No uname command or uname output not recognized. -set_cc_for_build -cat > "$dummy.c" < -#include -#endif -#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) -#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) -#include -#if defined(_SIZE_T_) || defined(SIGLOST) -#include -#endif -#endif -#endif -main () -{ -#if defined (sony) -#if defined (MIPSEB) - /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, - I don't know.... */ - printf ("mips-sony-bsd\n"); exit (0); -#else -#include - printf ("m68k-sony-newsos%s\n", -#ifdef NEWSOS4 - "4" -#else - "" -#endif - ); exit (0); -#endif -#endif - -#if defined (NeXT) -#if !defined (__ARCHITECTURE__) -#define __ARCHITECTURE__ "m68k" -#endif - int version; - version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; - if (version < 4) - printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); - else - printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); - exit (0); -#endif - -#if defined (MULTIMAX) || defined (n16) -#if defined (UMAXV) - printf ("ns32k-encore-sysv\n"); exit (0); -#else -#if defined (CMU) - printf ("ns32k-encore-mach\n"); exit (0); -#else - printf ("ns32k-encore-bsd\n"); exit (0); -#endif -#endif -#endif - -#if defined (__386BSD__) - printf ("i386-pc-bsd\n"); exit (0); -#endif - -#if defined (sequent) -#if defined (i386) - printf ("i386-sequent-dynix\n"); exit (0); -#endif -#if defined (ns32000) - printf ("ns32k-sequent-dynix\n"); exit (0); -#endif -#endif - -#if defined (_SEQUENT_) - struct utsname un; - - uname(&un); - if (strncmp(un.version, "V2", 2) == 0) { - printf ("i386-sequent-ptx2\n"); exit (0); - } - if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ - printf ("i386-sequent-ptx1\n"); exit (0); - } - printf ("i386-sequent-ptx\n"); exit (0); -#endif - -#if defined (vax) -#if !defined (ultrix) -#include -#if defined (BSD) -#if BSD == 43 - printf ("vax-dec-bsd4.3\n"); exit (0); -#else -#if BSD == 199006 - printf ("vax-dec-bsd4.3reno\n"); exit (0); -#else - printf ("vax-dec-bsd\n"); exit (0); -#endif -#endif -#else - printf ("vax-dec-bsd\n"); exit (0); -#endif -#else -#if defined(_SIZE_T_) || defined(SIGLOST) - struct utsname un; - uname (&un); - printf ("vax-dec-ultrix%s\n", un.release); exit (0); -#else - printf ("vax-dec-ultrix\n"); exit (0); -#endif -#endif -#endif -#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) -#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) -#if defined(_SIZE_T_) || defined(SIGLOST) - struct utsname *un; - uname (&un); - printf ("mips-dec-ultrix%s\n", un.release); exit (0); -#else - printf ("mips-dec-ultrix\n"); exit (0); -#endif -#endif -#endif - -#if defined (alliant) && defined (i860) - printf ("i860-alliant-bsd\n"); exit (0); -#endif - - exit (1); -} -EOF - -$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`"$dummy"` && - { echo "$SYSTEM_NAME"; exit; } - -# Apollos put the system type in the environment. -test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; } - -echo "$0: unable to guess system type" >&2 - -case $UNAME_MACHINE:$UNAME_SYSTEM in - mips:Linux | mips64:Linux) - # If we got here on MIPS GNU/Linux, output extra information. - cat >&2 <&2 <&2 </dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null` - -hostinfo = `(hostinfo) 2>/dev/null` -/bin/universe = `(/bin/universe) 2>/dev/null` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` -/bin/arch = `(/bin/arch) 2>/dev/null` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` - -UNAME_MACHINE = "$UNAME_MACHINE" -UNAME_RELEASE = "$UNAME_RELEASE" -UNAME_SYSTEM = "$UNAME_SYSTEM" -UNAME_VERSION = "$UNAME_VERSION" -EOF -fi - -exit 1 - -# Local variables: -# eval: (add-hook 'before-save-hook 'time-stamp) -# time-stamp-start: "timestamp='" -# time-stamp-format: "%:y-%02m-%02d" -# time-stamp-end: "'" -# End: diff --git a/depends/config.site.in b/depends/config.site.in deleted file mode 100644 index f6bed6a9d4..0000000000 --- a/depends/config.site.in +++ /dev/null @@ -1,147 +0,0 @@ -# shellcheck shell=sh disable=SC2034 # Many variables set will be used in - # ./configure but shellcheck doesn't know - # that, hence: disable=SC2034 - -true # Dummy command because shellcheck treats all directives before first - # command as file-wide, and we only want to disable for one line. - # - # See: https://github.com/koalaman/shellcheck/wiki/Directive - -# shellcheck disable=SC2154 -depends_prefix="$(cd "$(dirname "$ac_site_file")/.." && pwd)" - -cross_compiling=maybe -host_alias="@HOST@" -ac_tool_prefix="${host_alias}-" - -if test -z "$with_boost"; then - with_boost="$depends_prefix" -fi -if test -z "$with_qt_plugindir"; then - with_qt_plugindir="${depends_prefix}/plugins" -fi -if test -z "$with_qt_translationdir"; then - with_qt_translationdir="${depends_prefix}/translations" -fi -if test -z "$with_qt_bindir" && test -z "@no_qt@"; then - with_qt_bindir="${depends_prefix}/native/bin" -fi -if test -z "$with_mpgen" && test -n "@multiprocess@"; then - with_mpgen="${depends_prefix}/native" -fi - -if test -z "$with_qrencode" && test -n "@no_qr@"; then - with_qrencode=no -fi - -if test -z "$enable_wallet" && test -n "@no_wallet@"; then - enable_wallet=no -fi - -if test -z "$with_bdb" && test -n "@no_bdb@"; then - with_bdb=no -fi - -if test -z "$with_sqlite" && test -n "@no_sqlite@"; then - with_sqlite=no -fi - -if test -z "$enable_multiprocess" && test -n "@multiprocess@"; then - enable_multiprocess=yes -fi - -if test -z "$with_miniupnpc" && test -n "@no_upnp@"; then - with_miniupnpc=no -fi - -if test -z "$with_natpmp" && test -n "@no_natpmp@"; then - with_natpmp=no -fi - -if test -z "$with_gui" && test -n "@no_qt@"; then - with_gui=no -fi - -if test -n "@debug@" && test -z "@no_qt@" && test "$with_gui" != "no"; then - with_gui=qt5_debug -fi - -if test -z "$enable_zmq" && test -n "@no_zmq@"; then - enable_zmq=no -fi - -if test -z "$enable_usdt" && test -n "@no_usdt@"; then - enable_usdt=no -fi - -if test "@host_os@" = darwin; then - BREW=no -fi - -if test -z "$enable_hardening" && test -n "@no_harden@"; then - enable_hardening=no -fi - -PKG_CONFIG="$(which pkg-config) --static" - -PKG_CONFIG_PATH="${depends_prefix}/share/pkgconfig:${depends_prefix}/lib/pkgconfig" -PKG_CONFIG_LIBDIR="${depends_prefix}/lib/pkgconfig" - -CPPFLAGS="-I${depends_prefix}/include/ ${CPPFLAGS}" -LDFLAGS="-L${depends_prefix}/lib ${LDFLAGS}" - -if test -n "@CC@" -a -z "${CC}"; then - CC="@CC@" -fi -if test -n "@CXX@" -a -z "${CXX}"; then - CXX="@CXX@" -fi - -if test -n "@AR@"; then - AR="@AR@" - ac_cv_path_AR="${AR}" -fi - -if test -n "@RANLIB@"; then - RANLIB="@RANLIB@" - ac_cv_path_ac_pt_RANLIB="${RANLIB}" -fi - -if test -n "@NM@"; then - NM="@NM@" - ac_cv_path_ac_pt_NM="${NM}" -fi - -if test -n "@STRIP@"; then - STRIP="@STRIP@" - ac_cv_path_ac_pt_STRIP="${STRIP}" -fi - -if test "@host_os@" = darwin; then - if test -n "@OBJDUMP@"; then - OBJDUMP="@OBJDUMP@" - ac_cv_path_OBJDUMP="${OBJDUMP}" - fi - - if test -n "@DSYMUTIL@"; then - DSYMUTIL="@DSYMUTIL@" - ac_cv_path_DSYMUTIL="${DSYMUTIL}" - fi -fi - -if test -n "@debug@"; then - enable_reduce_exports=no -fi - -if test -n "@CFLAGS@"; then - CFLAGS="@CFLAGS@ ${CFLAGS}" -fi -if test -n "@CXXFLAGS@"; then - CXXFLAGS="@CXXFLAGS@ ${CXXFLAGS}" -fi -if test -n "@CPPFLAGS@"; then - CPPFLAGS="@CPPFLAGS@ ${CPPFLAGS}" -fi -if test -n "@LDFLAGS@"; then - LDFLAGS="@LDFLAGS@ ${LDFLAGS}" -fi diff --git a/depends/config.sub b/depends/config.sub deleted file mode 100755 index defe52c0c8..0000000000 --- a/depends/config.sub +++ /dev/null @@ -1,1960 +0,0 @@ -#! /bin/sh -# Configuration validation subroutine script. -# Copyright 1992-2023 Free Software Foundation, Inc. - -# shellcheck disable=SC2006,SC2268 # see below for rationale - -timestamp='2023-09-19' - -# This file is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, see . -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that -# program. This Exception is an additional permission under section 7 -# of the GNU General Public License, version 3 ("GPLv3"). - - -# Please send patches to . -# -# Configuration subroutine to validate and canonicalize a configuration type. -# Supply the specified configuration type as an argument. -# If it is invalid, we print an error message on stderr and exit with code 1. -# Otherwise, we print the canonical config type on stdout and succeed. - -# You can get the latest version of this script from: -# https://git.savannah.gnu.org/cgit/config.git/plain/config.sub - -# This file is supposed to be the same for all GNU packages -# and recognize all the CPU types, system types and aliases -# that are meaningful with *any* GNU software. -# Each package is responsible for reporting which valid configurations -# it does not support. The user should be able to distinguish -# a failure to support a valid configuration from a meaningless -# configuration. - -# The goal of this file is to map all the various variations of a given -# machine specification into a single specification in the form: -# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM -# or in some cases, the newer four-part form: -# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM -# It is wrong to echo any other type of specification. - -# The "shellcheck disable" line above the timestamp inhibits complaints -# about features and limitations of the classic Bourne shell that were -# superseded or lifted in POSIX. However, this script identifies a wide -# variety of pre-POSIX systems that do not have POSIX shells at all, and -# even some reasonably current systems (Solaris 10 as case-in-point) still -# have a pre-POSIX /bin/sh. - -me=`echo "$0" | sed -e 's,.*/,,'` - -usage="\ -Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS - -Canonicalize a configuration name. - -Options: - -h, --help print this help, then exit - -t, --time-stamp print date of last modification, then exit - -v, --version print version number, then exit - -Report bugs and patches to ." - -version="\ -GNU config.sub ($timestamp) - -Copyright 1992-2023 Free Software Foundation, Inc. - -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -help=" -Try '$me --help' for more information." - -# Parse command line -while test $# -gt 0 ; do - case $1 in - --time-stamp | --time* | -t ) - echo "$timestamp" ; exit ;; - --version | -v ) - echo "$version" ; exit ;; - --help | --h* | -h ) - echo "$usage"; exit ;; - -- ) # Stop option processing - shift; break ;; - - ) # Use stdin as input. - break ;; - -* ) - echo "$me: invalid option $1$help" >&2 - exit 1 ;; - - *local*) - # First pass through any local machine types. - echo "$1" - exit ;; - - * ) - break ;; - esac -done - -case $# in - 0) echo "$me: missing argument$help" >&2 - exit 1;; - 1) ;; - *) echo "$me: too many arguments$help" >&2 - exit 1;; -esac - -# Split fields of configuration type -# shellcheck disable=SC2162 -saved_IFS=$IFS -IFS="-" read field1 field2 field3 field4 <&2 - exit 1 - ;; - *-*-*-*) - basic_machine=$field1-$field2 - basic_os=$field3-$field4 - ;; - *-*-*) - # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two - # parts - maybe_os=$field2-$field3 - case $maybe_os in - nto-qnx* | linux-* | uclinux-uclibc* \ - | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ - | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ - | storm-chaos* | os2-emx* | rtmk-nova* | managarm-* \ - | windows-* ) - basic_machine=$field1 - basic_os=$maybe_os - ;; - android-linux) - basic_machine=$field1-unknown - basic_os=linux-android - ;; - *) - basic_machine=$field1-$field2 - basic_os=$field3 - ;; - esac - ;; - *-*) - # A lone config we happen to match not fitting any pattern - case $field1-$field2 in - decstation-3100) - basic_machine=mips-dec - basic_os= - ;; - *-*) - # Second component is usually, but not always the OS - case $field2 in - # Prevent following clause from handling this valid os - sun*os*) - basic_machine=$field1 - basic_os=$field2 - ;; - zephyr*) - basic_machine=$field1-unknown - basic_os=$field2 - ;; - # Manufacturers - dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \ - | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \ - | unicom* | ibm* | next | hp | isi* | apollo | altos* \ - | convergent* | ncr* | news | 32* | 3600* | 3100* \ - | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \ - | ultra | tti* | harris | dolphin | highlevel | gould \ - | cbm | ns | masscomp | apple | axis | knuth | cray \ - | microblaze* | sim | cisco \ - | oki | wec | wrs | winbond) - basic_machine=$field1-$field2 - basic_os= - ;; - *) - basic_machine=$field1 - basic_os=$field2 - ;; - esac - ;; - esac - ;; - *) - # Convert single-component short-hands not valid as part of - # multi-component configurations. - case $field1 in - 386bsd) - basic_machine=i386-pc - basic_os=bsd - ;; - a29khif) - basic_machine=a29k-amd - basic_os=udi - ;; - adobe68k) - basic_machine=m68010-adobe - basic_os=scout - ;; - alliant) - basic_machine=fx80-alliant - basic_os= - ;; - altos | altos3068) - basic_machine=m68k-altos - basic_os= - ;; - am29k) - basic_machine=a29k-none - basic_os=bsd - ;; - amdahl) - basic_machine=580-amdahl - basic_os=sysv - ;; - amiga) - basic_machine=m68k-unknown - basic_os= - ;; - amigaos | amigados) - basic_machine=m68k-unknown - basic_os=amigaos - ;; - amigaunix | amix) - basic_machine=m68k-unknown - basic_os=sysv4 - ;; - apollo68) - basic_machine=m68k-apollo - basic_os=sysv - ;; - apollo68bsd) - basic_machine=m68k-apollo - basic_os=bsd - ;; - aros) - basic_machine=i386-pc - basic_os=aros - ;; - aux) - basic_machine=m68k-apple - basic_os=aux - ;; - balance) - basic_machine=ns32k-sequent - basic_os=dynix - ;; - blackfin) - basic_machine=bfin-unknown - basic_os=linux - ;; - cegcc) - basic_machine=arm-unknown - basic_os=cegcc - ;; - convex-c1) - basic_machine=c1-convex - basic_os=bsd - ;; - convex-c2) - basic_machine=c2-convex - basic_os=bsd - ;; - convex-c32) - basic_machine=c32-convex - basic_os=bsd - ;; - convex-c34) - basic_machine=c34-convex - basic_os=bsd - ;; - convex-c38) - basic_machine=c38-convex - basic_os=bsd - ;; - cray) - basic_machine=j90-cray - basic_os=unicos - ;; - crds | unos) - basic_machine=m68k-crds - basic_os= - ;; - da30) - basic_machine=m68k-da30 - basic_os= - ;; - decstation | pmax | pmin | dec3100 | decstatn) - basic_machine=mips-dec - basic_os= - ;; - delta88) - basic_machine=m88k-motorola - basic_os=sysv3 - ;; - dicos) - basic_machine=i686-pc - basic_os=dicos - ;; - djgpp) - basic_machine=i586-pc - basic_os=msdosdjgpp - ;; - ebmon29k) - basic_machine=a29k-amd - basic_os=ebmon - ;; - es1800 | OSE68k | ose68k | ose | OSE) - basic_machine=m68k-ericsson - basic_os=ose - ;; - gmicro) - basic_machine=tron-gmicro - basic_os=sysv - ;; - go32) - basic_machine=i386-pc - basic_os=go32 - ;; - h8300hms) - basic_machine=h8300-hitachi - basic_os=hms - ;; - h8300xray) - basic_machine=h8300-hitachi - basic_os=xray - ;; - h8500hms) - basic_machine=h8500-hitachi - basic_os=hms - ;; - harris) - basic_machine=m88k-harris - basic_os=sysv3 - ;; - hp300 | hp300hpux) - basic_machine=m68k-hp - basic_os=hpux - ;; - hp300bsd) - basic_machine=m68k-hp - basic_os=bsd - ;; - hppaosf) - basic_machine=hppa1.1-hp - basic_os=osf - ;; - hppro) - basic_machine=hppa1.1-hp - basic_os=proelf - ;; - i386mach) - basic_machine=i386-mach - basic_os=mach - ;; - isi68 | isi) - basic_machine=m68k-isi - basic_os=sysv - ;; - m68knommu) - basic_machine=m68k-unknown - basic_os=linux - ;; - magnum | m3230) - basic_machine=mips-mips - basic_os=sysv - ;; - merlin) - basic_machine=ns32k-utek - basic_os=sysv - ;; - mingw64) - basic_machine=x86_64-pc - basic_os=mingw64 - ;; - mingw32) - basic_machine=i686-pc - basic_os=mingw32 - ;; - mingw32ce) - basic_machine=arm-unknown - basic_os=mingw32ce - ;; - monitor) - basic_machine=m68k-rom68k - basic_os=coff - ;; - morphos) - basic_machine=powerpc-unknown - basic_os=morphos - ;; - moxiebox) - basic_machine=moxie-unknown - basic_os=moxiebox - ;; - msdos) - basic_machine=i386-pc - basic_os=msdos - ;; - msys) - basic_machine=i686-pc - basic_os=msys - ;; - mvs) - basic_machine=i370-ibm - basic_os=mvs - ;; - nacl) - basic_machine=le32-unknown - basic_os=nacl - ;; - ncr3000) - basic_machine=i486-ncr - basic_os=sysv4 - ;; - netbsd386) - basic_machine=i386-pc - basic_os=netbsd - ;; - netwinder) - basic_machine=armv4l-rebel - basic_os=linux - ;; - news | news700 | news800 | news900) - basic_machine=m68k-sony - basic_os=newsos - ;; - news1000) - basic_machine=m68030-sony - basic_os=newsos - ;; - necv70) - basic_machine=v70-nec - basic_os=sysv - ;; - nh3000) - basic_machine=m68k-harris - basic_os=cxux - ;; - nh[45]000) - basic_machine=m88k-harris - basic_os=cxux - ;; - nindy960) - basic_machine=i960-intel - basic_os=nindy - ;; - mon960) - basic_machine=i960-intel - basic_os=mon960 - ;; - nonstopux) - basic_machine=mips-compaq - basic_os=nonstopux - ;; - os400) - basic_machine=powerpc-ibm - basic_os=os400 - ;; - OSE68000 | ose68000) - basic_machine=m68000-ericsson - basic_os=ose - ;; - os68k) - basic_machine=m68k-none - basic_os=os68k - ;; - paragon) - basic_machine=i860-intel - basic_os=osf - ;; - parisc) - basic_machine=hppa-unknown - basic_os=linux - ;; - psp) - basic_machine=mipsallegrexel-sony - basic_os=psp - ;; - pw32) - basic_machine=i586-unknown - basic_os=pw32 - ;; - rdos | rdos64) - basic_machine=x86_64-pc - basic_os=rdos - ;; - rdos32) - basic_machine=i386-pc - basic_os=rdos - ;; - rom68k) - basic_machine=m68k-rom68k - basic_os=coff - ;; - sa29200) - basic_machine=a29k-amd - basic_os=udi - ;; - sei) - basic_machine=mips-sei - basic_os=seiux - ;; - sequent) - basic_machine=i386-sequent - basic_os= - ;; - sps7) - basic_machine=m68k-bull - basic_os=sysv2 - ;; - st2000) - basic_machine=m68k-tandem - basic_os= - ;; - stratus) - basic_machine=i860-stratus - basic_os=sysv4 - ;; - sun2) - basic_machine=m68000-sun - basic_os= - ;; - sun2os3) - basic_machine=m68000-sun - basic_os=sunos3 - ;; - sun2os4) - basic_machine=m68000-sun - basic_os=sunos4 - ;; - sun3) - basic_machine=m68k-sun - basic_os= - ;; - sun3os3) - basic_machine=m68k-sun - basic_os=sunos3 - ;; - sun3os4) - basic_machine=m68k-sun - basic_os=sunos4 - ;; - sun4) - basic_machine=sparc-sun - basic_os= - ;; - sun4os3) - basic_machine=sparc-sun - basic_os=sunos3 - ;; - sun4os4) - basic_machine=sparc-sun - basic_os=sunos4 - ;; - sun4sol2) - basic_machine=sparc-sun - basic_os=solaris2 - ;; - sun386 | sun386i | roadrunner) - basic_machine=i386-sun - basic_os= - ;; - sv1) - basic_machine=sv1-cray - basic_os=unicos - ;; - symmetry) - basic_machine=i386-sequent - basic_os=dynix - ;; - t3e) - basic_machine=alphaev5-cray - basic_os=unicos - ;; - t90) - basic_machine=t90-cray - basic_os=unicos - ;; - toad1) - basic_machine=pdp10-xkl - basic_os=tops20 - ;; - tpf) - basic_machine=s390x-ibm - basic_os=tpf - ;; - udi29k) - basic_machine=a29k-amd - basic_os=udi - ;; - ultra3) - basic_machine=a29k-nyu - basic_os=sym1 - ;; - v810 | necv810) - basic_machine=v810-nec - basic_os=none - ;; - vaxv) - basic_machine=vax-dec - basic_os=sysv - ;; - vms) - basic_machine=vax-dec - basic_os=vms - ;; - vsta) - basic_machine=i386-pc - basic_os=vsta - ;; - vxworks960) - basic_machine=i960-wrs - basic_os=vxworks - ;; - vxworks68) - basic_machine=m68k-wrs - basic_os=vxworks - ;; - vxworks29k) - basic_machine=a29k-wrs - basic_os=vxworks - ;; - xbox) - basic_machine=i686-pc - basic_os=mingw32 - ;; - ymp) - basic_machine=ymp-cray - basic_os=unicos - ;; - *) - basic_machine=$1 - basic_os= - ;; - esac - ;; -esac - -# Decode 1-component or ad-hoc basic machines -case $basic_machine in - # Here we handle the default manufacturer of certain CPU types. It is in - # some cases the only manufacturer, in others, it is the most popular. - w89k) - cpu=hppa1.1 - vendor=winbond - ;; - op50n) - cpu=hppa1.1 - vendor=oki - ;; - op60c) - cpu=hppa1.1 - vendor=oki - ;; - ibm*) - cpu=i370 - vendor=ibm - ;; - orion105) - cpu=clipper - vendor=highlevel - ;; - mac | mpw | mac-mpw) - cpu=m68k - vendor=apple - ;; - pmac | pmac-mpw) - cpu=powerpc - vendor=apple - ;; - - # Recognize the various machine names and aliases which stand - # for a CPU type and a company and sometimes even an OS. - 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) - cpu=m68000 - vendor=att - ;; - 3b*) - cpu=we32k - vendor=att - ;; - bluegene*) - cpu=powerpc - vendor=ibm - basic_os=cnk - ;; - decsystem10* | dec10*) - cpu=pdp10 - vendor=dec - basic_os=tops10 - ;; - decsystem20* | dec20*) - cpu=pdp10 - vendor=dec - basic_os=tops20 - ;; - delta | 3300 | motorola-3300 | motorola-delta \ - | 3300-motorola | delta-motorola) - cpu=m68k - vendor=motorola - ;; - dpx2*) - cpu=m68k - vendor=bull - basic_os=sysv3 - ;; - encore | umax | mmax) - cpu=ns32k - vendor=encore - ;; - elxsi) - cpu=elxsi - vendor=elxsi - basic_os=${basic_os:-bsd} - ;; - fx2800) - cpu=i860 - vendor=alliant - ;; - genix) - cpu=ns32k - vendor=ns - ;; - h3050r* | hiux*) - cpu=hppa1.1 - vendor=hitachi - basic_os=hiuxwe2 - ;; - hp3k9[0-9][0-9] | hp9[0-9][0-9]) - cpu=hppa1.0 - vendor=hp - ;; - hp9k2[0-9][0-9] | hp9k31[0-9]) - cpu=m68000 - vendor=hp - ;; - hp9k3[2-9][0-9]) - cpu=m68k - vendor=hp - ;; - hp9k6[0-9][0-9] | hp6[0-9][0-9]) - cpu=hppa1.0 - vendor=hp - ;; - hp9k7[0-79][0-9] | hp7[0-79][0-9]) - cpu=hppa1.1 - vendor=hp - ;; - hp9k78[0-9] | hp78[0-9]) - # FIXME: really hppa2.0-hp - cpu=hppa1.1 - vendor=hp - ;; - hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) - # FIXME: really hppa2.0-hp - cpu=hppa1.1 - vendor=hp - ;; - hp9k8[0-9][13679] | hp8[0-9][13679]) - cpu=hppa1.1 - vendor=hp - ;; - hp9k8[0-9][0-9] | hp8[0-9][0-9]) - cpu=hppa1.0 - vendor=hp - ;; - i*86v32) - cpu=`echo "$1" | sed -e 's/86.*/86/'` - vendor=pc - basic_os=sysv32 - ;; - i*86v4*) - cpu=`echo "$1" | sed -e 's/86.*/86/'` - vendor=pc - basic_os=sysv4 - ;; - i*86v) - cpu=`echo "$1" | sed -e 's/86.*/86/'` - vendor=pc - basic_os=sysv - ;; - i*86sol2) - cpu=`echo "$1" | sed -e 's/86.*/86/'` - vendor=pc - basic_os=solaris2 - ;; - j90 | j90-cray) - cpu=j90 - vendor=cray - basic_os=${basic_os:-unicos} - ;; - iris | iris4d) - cpu=mips - vendor=sgi - case $basic_os in - irix*) - ;; - *) - basic_os=irix4 - ;; - esac - ;; - miniframe) - cpu=m68000 - vendor=convergent - ;; - *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) - cpu=m68k - vendor=atari - basic_os=mint - ;; - news-3600 | risc-news) - cpu=mips - vendor=sony - basic_os=newsos - ;; - next | m*-next) - cpu=m68k - vendor=next - case $basic_os in - openstep*) - ;; - nextstep*) - ;; - ns2*) - basic_os=nextstep2 - ;; - *) - basic_os=nextstep3 - ;; - esac - ;; - np1) - cpu=np1 - vendor=gould - ;; - op50n-* | op60c-*) - cpu=hppa1.1 - vendor=oki - basic_os=proelf - ;; - pa-hitachi) - cpu=hppa1.1 - vendor=hitachi - basic_os=hiuxwe2 - ;; - pbd) - cpu=sparc - vendor=tti - ;; - pbb) - cpu=m68k - vendor=tti - ;; - pc532) - cpu=ns32k - vendor=pc532 - ;; - pn) - cpu=pn - vendor=gould - ;; - power) - cpu=power - vendor=ibm - ;; - ps2) - cpu=i386 - vendor=ibm - ;; - rm[46]00) - cpu=mips - vendor=siemens - ;; - rtpc | rtpc-*) - cpu=romp - vendor=ibm - ;; - sde) - cpu=mipsisa32 - vendor=sde - basic_os=${basic_os:-elf} - ;; - simso-wrs) - cpu=sparclite - vendor=wrs - basic_os=vxworks - ;; - tower | tower-32) - cpu=m68k - vendor=ncr - ;; - vpp*|vx|vx-*) - cpu=f301 - vendor=fujitsu - ;; - w65) - cpu=w65 - vendor=wdc - ;; - w89k-*) - cpu=hppa1.1 - vendor=winbond - basic_os=proelf - ;; - none) - cpu=none - vendor=none - ;; - leon|leon[3-9]) - cpu=sparc - vendor=$basic_machine - ;; - leon-*|leon[3-9]-*) - cpu=sparc - vendor=`echo "$basic_machine" | sed 's/-.*//'` - ;; - - *-*) - # shellcheck disable=SC2162 - saved_IFS=$IFS - IFS="-" read cpu vendor <&2 - exit 1 - ;; - esac - ;; -esac - -# Here we canonicalize certain aliases for manufacturers. -case $vendor in - digital*) - vendor=dec - ;; - commodore*) - vendor=cbm - ;; - *) - ;; -esac - -# Decode manufacturer-specific aliases for certain operating systems. - -if test x"$basic_os" != x -then - -# First recognize some ad-hoc cases, or perhaps split kernel-os, or else just -# set os. -obj= -case $basic_os in - gnu/linux*) - kernel=linux - os=`echo "$basic_os" | sed -e 's|gnu/linux|gnu|'` - ;; - os2-emx) - kernel=os2 - os=`echo "$basic_os" | sed -e 's|os2-emx|emx|'` - ;; - nto-qnx*) - kernel=nto - os=`echo "$basic_os" | sed -e 's|nto-qnx|qnx|'` - ;; - *-*) - # shellcheck disable=SC2162 - saved_IFS=$IFS - IFS="-" read kernel os <&2 - fi - ;; - *) - echo "Invalid configuration '$1': OS '$os' not recognized" 1>&2 - exit 1 - ;; -esac - -case $obj in - aout* | coff* | elf* | pe*) - ;; - '') - # empty is fine - ;; - *) - echo "Invalid configuration '$1': Machine code format '$obj' not recognized" 1>&2 - exit 1 - ;; -esac - -# Here we handle the constraint that a (synthetic) cpu and os are -# valid only in combination with each other and nowhere else. -case $cpu-$os in - # The "javascript-unknown-ghcjs" triple is used by GHC; we - # accept it here in order to tolerate that, but reject any - # variations. - javascript-ghcjs) - ;; - javascript-* | *-ghcjs) - echo "Invalid configuration '$1': cpu '$cpu' is not valid with os '$os$obj'" 1>&2 - exit 1 - ;; -esac - -# As a final step for OS-related things, validate the OS-kernel combination -# (given a valid OS), if there is a kernel. -case $kernel-$os-$obj in - linux-gnu*- | linux-dietlibc*- | linux-android*- | linux-newlib*- \ - | linux-musl*- | linux-relibc*- | linux-uclibc*- | linux-mlibc*- ) - ;; - uclinux-uclibc*- ) - ;; - managarm-mlibc*- | managarm-kernel*- ) - ;; - windows*-msvc*-) - ;; - -dietlibc*- | -newlib*- | -musl*- | -relibc*- | -uclibc*- | -mlibc*- ) - # These are just libc implementations, not actual OSes, and thus - # require a kernel. - echo "Invalid configuration '$1': libc '$os' needs explicit kernel." 1>&2 - exit 1 - ;; - -kernel*- ) - echo "Invalid configuration '$1': '$os' needs explicit kernel." 1>&2 - exit 1 - ;; - *-kernel*- ) - echo "Invalid configuration '$1': '$kernel' does not support '$os'." 1>&2 - exit 1 - ;; - *-msvc*- ) - echo "Invalid configuration '$1': '$os' needs 'windows'." 1>&2 - exit 1 - ;; - kfreebsd*-gnu*- | kopensolaris*-gnu*-) - ;; - vxworks-simlinux- | vxworks-simwindows- | vxworks-spe-) - ;; - nto-qnx*-) - ;; - os2-emx-) - ;; - *-eabi*- | *-gnueabi*-) - ;; - none--*) - # None (no kernel, i.e. freestanding / bare metal), - # can be paired with an machine code file format - ;; - -*-) - # Blank kernel with real OS is always fine. - ;; - --*) - # Blank kernel and OS with real machine code file format is always fine. - ;; - *-*-*) - echo "Invalid configuration '$1': Kernel '$kernel' not known to work with OS '$os'." 1>&2 - exit 1 - ;; -esac - -# Here we handle the case where we know the os, and the CPU type, but not the -# manufacturer. We pick the logical manufacturer. -case $vendor in - unknown) - case $cpu-$os in - *-riscix*) - vendor=acorn - ;; - *-sunos*) - vendor=sun - ;; - *-cnk* | *-aix*) - vendor=ibm - ;; - *-beos*) - vendor=be - ;; - *-hpux*) - vendor=hp - ;; - *-mpeix*) - vendor=hp - ;; - *-hiux*) - vendor=hitachi - ;; - *-unos*) - vendor=crds - ;; - *-dgux*) - vendor=dg - ;; - *-luna*) - vendor=omron - ;; - *-genix*) - vendor=ns - ;; - *-clix*) - vendor=intergraph - ;; - *-mvs* | *-opened*) - vendor=ibm - ;; - *-os400*) - vendor=ibm - ;; - s390-* | s390x-*) - vendor=ibm - ;; - *-ptx*) - vendor=sequent - ;; - *-tpf*) - vendor=ibm - ;; - *-vxsim* | *-vxworks* | *-windiss*) - vendor=wrs - ;; - *-aux*) - vendor=apple - ;; - *-hms*) - vendor=hitachi - ;; - *-mpw* | *-macos*) - vendor=apple - ;; - *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*) - vendor=atari - ;; - *-vos*) - vendor=stratus - ;; - esac - ;; -esac - -echo "$cpu-$vendor${kernel:+-$kernel}${os:+-$os}${obj:+-$obj}" -exit - -# Local variables: -# eval: (add-hook 'before-save-hook 'time-stamp) -# time-stamp-start: "timestamp='" -# time-stamp-format: "%:y-%02m-%02d" -# time-stamp-end: "'" -# End: diff --git a/depends/description.md b/depends/description.md deleted file mode 100644 index fa345bfe85..0000000000 --- a/depends/description.md +++ /dev/null @@ -1,52 +0,0 @@ -This is a system of building and caching dependencies necessary for building Bitcoin. -There are several features that make it different from most similar systems: - -### It is designed to be builder and host agnostic - -In theory, binaries for any target OS/architecture can be created, from a -builder running any OS/architecture. In practice, build-side tools must be -specified when the defaults don't fit, and packages must be amended to work -on new hosts. - -### No reliance on timestamps - -File presence is used to determine what needs to be built. This makes the -results distributable and easily digestible by automated builders. - -### Each build only has its specified dependencies available at build-time. - -For each build, the sysroot is wiped and the (recursive) dependencies are -installed. This makes each build deterministic, since there will never be any -unknown files available to cause side-effects. - -### Each package is cached and only rebuilt as needed. - -Before building, a unique build-id is generated for each package. This id -consists of a hash of all files used to build the package (Makefiles, packages, -etc), and as well as a hash of the same data for each recursive dependency. If -any portion of a package's build recipe changes, it will be rebuilt as well as -any other package that depends on it. If any of the main makefiles (Makefile, -funcs.mk, etc) are changed, all packages will be rebuilt. After building, the -results are cached into a tarball that can be reused and distributed. - -### Package build results are (relatively) deterministic. - -Each package is configured and patched so that it will yield the same -build-results with each consequent build, within a reasonable set of -constraints. Some things like timestamp insertion are unavoidable, and are -beyond the scope of this system. Additionally, the toolchain itself must be -capable of deterministic results. When revisions are properly bumped, a cached -build should represent an exact single payload. - -### Sources are fetched and verified automatically - -Each package must define its source location and checksum. The build will fail -if the fetched source does not match. Sources may be pre-seeded and/or cached -as desired. - -### Self-cleaning - -Build and staging dirs are wiped after use, and any previous version of a -cached result is removed following a successful build. Automated builders -should be able to build each revision and store the results with no further -intervention. diff --git a/depends/funcs.mk b/depends/funcs.mk deleted file mode 100644 index 3c0dc7a7fc..0000000000 --- a/depends/funcs.mk +++ /dev/null @@ -1,299 +0,0 @@ -define int_vars -#Set defaults for vars which may be overridden per-package -$(1)_cc=$$($$($(1)_type)_CC) -$(1)_cxx=$$($$($(1)_type)_CXX) -$(1)_objc=$$($$($(1)_type)_OBJC) -$(1)_objcxx=$$($$($(1)_type)_OBJCXX) -$(1)_ar=$$($$($(1)_type)_AR) -$(1)_ranlib=$$($$($(1)_type)_RANLIB) -$(1)_nm=$$($$($(1)_type)_NM) -$(1)_cflags=$$($$($(1)_type)_CFLAGS) \ - $$($$($(1)_type)_$$(release_type)_CFLAGS) -$(1)_cxxflags=$$($$($(1)_type)_CXXFLAGS) \ - $$($$($(1)_type)_$$(release_type)_CXXFLAGS) -$(1)_ldflags=$$($$($(1)_type)_LDFLAGS) \ - $$($$($(1)_type)_$$(release_type)_LDFLAGS) \ - -L$$($($(1)_type)_prefix)/lib -$(1)_cppflags=$$($$($(1)_type)_CPPFLAGS) \ - $$($$($(1)_type)_$$(release_type)_CPPFLAGS) \ - -I$$($$($(1)_type)_prefix)/include -$(1)_recipe_hash:= -endef - -define int_get_all_dependencies -$(sort $(foreach dep,$(2),$(2) $(call int_get_all_dependencies,$(1),$($(dep)_dependencies)))) -endef - -define fetch_file_inner - ( mkdir -p $$($(1)_download_dir) && echo Fetching $(3) from $(2) && \ - $(build_DOWNLOAD) "$$($(1)_download_dir)/$(4).temp" "$(2)/$(3)" && \ - echo "$(5) $$($(1)_download_dir)/$(4).temp" > $$($(1)_download_dir)/.$(4).hash && \ - $(build_SHA256SUM) -c $$($(1)_download_dir)/.$(4).hash && \ - mv $$($(1)_download_dir)/$(4).temp $$($(1)_source_dir)/$(4) && \ - rm -rf $$($(1)_download_dir) ) -endef - -define fetch_file - ( test -f $$($(1)_source_dir)/$(4) || \ - ( $(call fetch_file_inner,$(1),$(2),$(3),$(4),$(5)) || \ - $(call fetch_file_inner,$(1),$(FALLBACK_DOWNLOAD_PATH),$(3),$(4),$(5)))) -endef - -define int_get_build_recipe_hash -$(eval $(1)_all_file_checksums:=$(shell $(build_SHA256SUM) $(meta_depends) packages/$(1).mk $(addprefix $(PATCHES_PATH)/$(1)/,$($(1)_patches)) | cut -d" " -f1)) -$(eval $(1)_recipe_hash:=$(shell echo -n "$($(1)_all_file_checksums)" | $(build_SHA256SUM) | cut -d" " -f1)) -endef - -define int_get_build_id -$(eval $(1)_dependencies += $($(1)_$(host_arch)_$(host_os)_dependencies) $($(1)_$(host_os)_dependencies)) -$(eval $(1)_all_dependencies:=$(call int_get_all_dependencies,$(1),$($(1)_dependencies))) -$(foreach dep,$($(1)_all_dependencies),$(eval $(1)_build_id_deps+=$(dep)-$($(dep)_version)-$($(dep)_recipe_hash))) -$(eval $(1)_build_id_long:=$(1)-$($(1)_version)-$($(1)_recipe_hash)-$(release_type) $($(1)_build_id_deps) $($($(1)_type)_id)) -$(eval $(1)_build_id:=$(shell echo -n "$($(1)_build_id_long)" | $(build_SHA256SUM) | cut -c-$(HASH_LENGTH))) -final_build_id_long+=$($(package)_build_id_long) - -#compute package-specific paths -$(1)_build_subdir?=. -$(1)_download_file?=$($(1)_file_name) -$(1)_source_dir:=$(SOURCES_PATH) -$(1)_source:=$$($(1)_source_dir)/$($(1)_file_name) -$(1)_staging_dir=$(base_staging_dir)/$(host)/$(1)/$($(1)_version)-$($(1)_build_id) -$(1)_staging_prefix_dir:=$$($(1)_staging_dir)$($($(1)_type)_prefix) -$(1)_extract_dir:=$(base_build_dir)/$(host)/$(1)/$($(1)_version)-$($(1)_build_id) -$(1)_download_dir:=$(base_download_dir)/$(1)-$($(1)_version) -$(1)_build_dir:=$$($(1)_extract_dir)/$$($(1)_build_subdir) -$(1)_cached_checksum:=$(BASE_CACHE)/$(host)/$(1)/$(1)-$($(1)_version)-$($(1)_build_id).tar.gz.hash -$(1)_patch_dir:=$(base_build_dir)/$(host)/$(1)/$($(1)_version)-$($(1)_build_id)/.patches-$($(1)_build_id) -$(1)_prefixbin:=$($($(1)_type)_prefix)/bin/ -$(1)_cached:=$(BASE_CACHE)/$(host)/$(1)/$(1)-$($(1)_version)-$($(1)_build_id).tar.gz -$(1)_build_log:=$(BASEDIR)/$(1)-$($(1)_version)-$($(1)_build_id).log -$(1)_all_sources=$($(1)_file_name) $($(1)_extra_sources) - -#stamps -$(1)_fetched=$(SOURCES_PATH)/download-stamps/.stamp_fetched-$(1)-$($(1)_file_name).hash -$(1)_extracted=$$($(1)_extract_dir)/.stamp_extracted -$(1)_preprocessed=$$($(1)_extract_dir)/.stamp_preprocessed -$(1)_cleaned=$$($(1)_extract_dir)/.stamp_cleaned -$(1)_built=$$($(1)_build_dir)/.stamp_built -$(1)_configured=$(host_prefix)/.$(1)_stamp_configured -$(1)_staged=$$($(1)_staging_dir)/.stamp_staged -$(1)_postprocessed=$$($(1)_staging_prefix_dir)/.stamp_postprocessed -$(1)_download_path_fixed=$(subst :,\:,$$($(1)_download_path)) - - -#default commands -# The default behavior for tar will try to set ownership when running as uid 0 and may not succeed, --no-same-owner disables this behavior -$(1)_fetch_cmds ?= $(call fetch_file,$(1),$(subst \:,:,$$($(1)_download_path_fixed)),$$($(1)_download_file),$($(1)_file_name),$($(1)_sha256_hash)) -$(1)_extract_cmds ?= mkdir -p $$($(1)_extract_dir) && echo "$$($(1)_sha256_hash) $$($(1)_source)" > $$($(1)_extract_dir)/.$$($(1)_file_name).hash && $(build_SHA256SUM) -c $$($(1)_extract_dir)/.$$($(1)_file_name).hash && $(build_TAR) --no-same-owner --strip-components=1 -xf $$($(1)_source) -$(1)_preprocess_cmds ?= true -$(1)_build_cmds ?= true -$(1)_config_cmds ?= true -$(1)_stage_cmds ?= true -$(1)_set_vars ?= - - -all_sources+=$$($(1)_fetched) -endef -#$(foreach dep_target,$($(1)_all_dependencies),$(eval $(1)_dependency_targets=$($(dep_target)_cached))) - - -define int_config_attach_build_config -$(eval $(call $(1)_set_vars,$(1))) -$(1)_cflags+=$($(1)_cflags_$(release_type)) -$(1)_cflags+=$($(1)_cflags_$(host_arch)) $($(1)_cflags_$(host_arch)_$(release_type)) -$(1)_cflags+=$($(1)_cflags_$(host_os)) $($(1)_cflags_$(host_os)_$(release_type)) -$(1)_cflags+=$($(1)_cflags_$(host_arch)_$(host_os)) $($(1)_cflags_$(host_arch)_$(host_os)_$(release_type)) - -$(1)_cxxflags+=$($(1)_cxxflags_$(release_type)) -$(1)_cxxflags+=$($(1)_cxxflags_$(host_arch)) $($(1)_cxxflags_$(host_arch)_$(release_type)) -$(1)_cxxflags+=$($(1)_cxxflags_$(host_os)) $($(1)_cxxflags_$(host_os)_$(release_type)) -$(1)_cxxflags+=$($(1)_cxxflags_$(host_arch)_$(host_os)) $($(1)_cxxflags_$(host_arch)_$(host_os)_$(release_type)) - -$(1)_cppflags+=$($(1)_cppflags_$(release_type)) -$(1)_cppflags+=$($(1)_cppflags_$(host_arch)) $($(1)_cppflags_$(host_arch)_$(release_type)) -$(1)_cppflags+=$($(1)_cppflags_$(host_os)) $($(1)_cppflags_$(host_os)_$(release_type)) -$(1)_cppflags+=$($(1)_cppflags_$(host_arch)_$(host_os)) $($(1)_cppflags_$(host_arch)_$(host_os)_$(release_type)) - -$(1)_ldflags+=$($(1)_ldflags_$(release_type)) -$(1)_ldflags+=$($(1)_ldflags_$(host_arch)) $($(1)_ldflags_$(host_arch)_$(release_type)) -$(1)_ldflags+=$($(1)_ldflags_$(host_os)) $($(1)_ldflags_$(host_os)_$(release_type)) -$(1)_ldflags+=$($(1)_ldflags_$(host_arch)_$(host_os)) $($(1)_ldflags_$(host_arch)_$(host_os)_$(release_type)) - -$(1)_build_opts+=$$($(1)_build_opts_$(release_type)) -$(1)_build_opts+=$$($(1)_build_opts_$(host_arch)) $$($(1)_build_opts_$(host_arch)_$(release_type)) -$(1)_build_opts+=$$($(1)_build_opts_$(host_os)) $$($(1)_build_opts_$(host_os)_$(release_type)) -$(1)_build_opts+=$$($(1)_build_opts_$(host_arch)_$(host_os)) $$($(1)_build_opts_$(host_arch)_$(host_os)_$(release_type)) - -$(1)_config_opts+=$$($(1)_config_opts_$(release_type)) -$(1)_config_opts+=$$($(1)_config_opts_$(host_arch)) $$($(1)_config_opts_$(host_arch)_$(release_type)) -$(1)_config_opts+=$$($(1)_config_opts_$(host_os)) $$($(1)_config_opts_$(host_os)_$(release_type)) -$(1)_config_opts+=$$($(1)_config_opts_$(host_arch)_$(host_os)) $$($(1)_config_opts_$(host_arch)_$(host_os)_$(release_type)) - -$(1)_config_env+=$$($(1)_config_env_$(release_type)) -$(1)_config_env+=$($(1)_config_env_$(host_arch)) $($(1)_config_env_$(host_arch)_$(release_type)) -$(1)_config_env+=$($(1)_config_env_$(host_os)) $($(1)_config_env_$(host_os)_$(release_type)) -$(1)_config_env+=$($(1)_config_env_$(host_arch)_$(host_os)) $($(1)_config_env_$(host_arch)_$(host_os)_$(release_type)) - -$(1)_config_env+=PKG_CONFIG_LIBDIR=$($($(1)_type)_prefix)/lib/pkgconfig -$(1)_config_env+=PKG_CONFIG_PATH=$($($(1)_type)_prefix)/share/pkgconfig -$(1)_config_env+=PKG_CONFIG_SYSROOT_DIR=/ -$(1)_config_env+=CMAKE_MODULE_PATH=$($($(1)_type)_prefix)/lib/cmake -$(1)_config_env+=PATH="$(build_prefix)/bin:$(PATH)" -$(1)_build_env+=PATH="$(build_prefix)/bin:$(PATH)" -$(1)_stage_env+=PATH="$(build_prefix)/bin:$(PATH)" - -# Setting a --build type that differs from --host will explicitly enable -# cross-compilation mode. Note that --build defaults to the output of -# config.guess, which is what we set it too here. This also quells autoconf -# warnings, "If you wanted to set the --build type, don't use --host.", -# when using versions older than 2.70. -$(1)_autoconf=./configure --build=$(BUILD) --host=$($($(1)_type)_host) --prefix=$($($(1)_type)_prefix) --with-pic $$($(1)_config_opts) CC="$$($(1)_cc)" CXX="$$($(1)_cxx)" -ifneq ($($(1)_nm),) -$(1)_autoconf += NM="$$($(1)_nm)" -endif -ifneq ($($(1)_ranlib),) -$(1)_autoconf += RANLIB="$$($(1)_ranlib)" -endif -ifneq ($($(1)_ar),) -$(1)_autoconf += AR="$$($(1)_ar)" -endif -ifneq ($($(1)_cflags),) -$(1)_autoconf += CFLAGS="$$($(1)_cflags)" -endif -ifneq ($($(1)_cxxflags),) -$(1)_autoconf += CXXFLAGS="$$($(1)_cxxflags)" -endif -ifneq ($($(1)_cppflags),) -$(1)_autoconf += CPPFLAGS="$$($(1)_cppflags)" -endif -ifneq ($($(1)_ldflags),) -$(1)_autoconf += LDFLAGS="$$($(1)_ldflags)" -endif - -# We hardcode the library install path to "lib" to match the PKG_CONFIG_PATH -# setting in depends/config.site.in, which also hardcodes "lib". -# Without this setting, CMake by default would use the OS library -# directory, which might be "lib64" or something else, not "lib", on multiarch systems. -$(1)_cmake=env CC="$$($(1)_cc)" \ - CFLAGS="$$($(1)_cppflags) $$($(1)_cflags)" \ - CXX="$$($(1)_cxx)" \ - CXXFLAGS="$$($(1)_cppflags) $$($(1)_cxxflags)" \ - LDFLAGS="$$($(1)_ldflags)" \ - cmake -DCMAKE_INSTALL_PREFIX:PATH="$$($($(1)_type)_prefix)" \ - -DCMAKE_AR=`which $$($(1)_ar)` \ - -DCMAKE_NM=`which $$($(1)_nm)` \ - -DCMAKE_RANLIB=`which $$($(1)_ranlib)` \ - -DCMAKE_INSTALL_LIBDIR=lib/ \ - -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ - -DCMAKE_VERBOSE_MAKEFILE:BOOL=$(V) \ - $$($(1)_config_opts) -ifeq ($($(1)_type),build) -$(1)_cmake += -DCMAKE_INSTALL_RPATH:PATH="$$($($(1)_type)_prefix)/lib" -else -ifneq ($(host),$(build)) -$(1)_cmake += -DCMAKE_SYSTEM_NAME=$($(host_os)_cmake_system) -$(1)_cmake += -DCMAKE_C_COMPILER_TARGET=$(host) -$(1)_cmake += -DCMAKE_CXX_COMPILER_TARGET=$(host) -endif -endif -endef - -define int_add_cmds -ifneq ($(LOG),) -$(1)_logging = >>$$($(1)_build_log) 2>&1 || { if test -f $$($(1)_build_log); then cat $$($(1)_build_log); fi; exit 1; } -endif - -$($(1)_fetched): - mkdir -p $$(@D) $(SOURCES_PATH) - rm -f $$@ - touch $$@ - cd $$(@D); $($(1)_fetch_cmds) - cd $($(1)_source_dir); $(foreach source,$($(1)_all_sources),$(build_SHA256SUM) $(source) >> $$(@);) - touch $$@ -$($(1)_extracted): | $($(1)_fetched) - echo Extracting $(1)... - mkdir -p $$(@D) - cd $$(@D); $($(1)_extract_cmds) - touch $$@ -$($(1)_preprocessed): | $($(1)_extracted) - echo Preprocessing $(1)... - mkdir -p $$(@D) $($(1)_patch_dir) - $(foreach patch,$($(1)_patches),cd $(PATCHES_PATH)/$(1); cp $(patch) $($(1)_patch_dir) ;) - { cd $$(@D); $($(1)_preprocess_cmds); } $$($(1)_logging) - touch $$@ -$($(1)_configured): | $($(1)_dependencies) $($(1)_preprocessed) - echo Configuring $(1)... - rm -rf $(host_prefix); mkdir -p $(host_prefix)/lib; cd $(host_prefix); $(foreach package,$($(1)_all_dependencies), $(build_TAR) --no-same-owner -xf $($(package)_cached); ) - mkdir -p $$($(1)_build_dir) - +{ cd $$($(1)_build_dir); export $($(1)_config_env); $($(1)_config_cmds); } $$($(1)_logging) - touch $$@ -$($(1)_built): | $($(1)_configured) - echo Building $(1)... - mkdir -p $$(@D) - +{ cd $$(@D); export $($(1)_build_env); $($(1)_build_cmds); } $$($(1)_logging) - touch $$@ -$($(1)_staged): | $($(1)_built) - echo Staging $(1)... - mkdir -p $($(1)_staging_dir)/$(host_prefix) - +{ cd $($(1)_build_dir); export $($(1)_stage_env); $($(1)_stage_cmds); } $$($(1)_logging) - rm -rf $($(1)_extract_dir) - touch $$@ -$($(1)_postprocessed): | $($(1)_staged) - echo Postprocessing $(1)... - cd $($(1)_staging_prefix_dir); $($(1)_postprocess_cmds) - touch $$@ -$($(1)_cached): | $($(1)_dependencies) $($(1)_postprocessed) - echo Caching $(1)... - cd $$($(1)_staging_dir)/$(host_prefix); \ - find . ! -name '.stamp_postprocessed' -print0 | TZ=UTC xargs -0r $(build_TOUCH); \ - find . ! -name '.stamp_postprocessed' | LC_ALL=C sort | $(build_TAR) --numeric-owner --no-recursion -czf $$($(1)_staging_dir)/$$(@F) -T - - mkdir -p $$(@D) - rm -rf $$(@D) && mkdir -p $$(@D) - mv $$($(1)_staging_dir)/$$(@F) $$(@) - rm -rf $($(1)_staging_dir) - if test -f $($(1)_build_log); then mv $($(1)_build_log) $$(@D); fi -$($(1)_cached_checksum): $($(1)_cached) - cd $$(@D); $(build_SHA256SUM) $$( $$(@) - -.PHONY: $(1) -$(1): | $($(1)_cached_checksum) -.SECONDARY: $($(1)_cached) $($(1)_postprocessed) $($(1)_staged) $($(1)_built) $($(1)_configured) $($(1)_preprocessed) $($(1)_extracted) $($(1)_fetched) - -endef - -stages = fetched extracted preprocessed configured built staged postprocessed cached cached_checksum - -define ext_add_stages -$(foreach stage,$(stages), - $(1)_$(stage): $($(1)_$(stage)) - .PHONY: $(1)_$(stage)) -endef - -# These functions create the build targets for each package. They must be -# broken down into small steps so that each part is done for all packages -# before moving on to the next step. Otherwise, a package's info -# (build-id for example) would only be available to another package if it -# happened to be computed already. - -#set the type for host/build packages. -$(foreach native_package,$(native_packages),$(eval $(native_package)_type=build)) -$(foreach package,$(packages),$(eval $(package)_type=$(host_arch)_$(host_os))) - -#set overridable defaults -$(foreach package,$(all_packages),$(eval $(call int_vars,$(package)))) - -#include package files -$(foreach native_package,$(native_packages),$(eval include packages/$(native_package).mk)) -$(foreach package,$(packages),$(eval include packages/$(package).mk)) - -#compute a hash of all files that comprise this package's build recipe -$(foreach package,$(all_packages),$(eval $(call int_get_build_recipe_hash,$(package)))) - -#generate a unique id for this package, incorporating its dependencies as well -$(foreach package,$(all_packages),$(eval $(call int_get_build_id,$(package)))) - -#compute final vars after reading package vars -$(foreach package,$(all_packages),$(eval $(call int_config_attach_build_config,$(package)))) - -#create build targets -$(foreach package,$(all_packages),$(eval $(call int_add_cmds,$(package)))) diff --git a/depends/gen_id b/depends/gen_id deleted file mode 100755 index e2e2273b2d..0000000000 --- a/depends/gen_id +++ /dev/null @@ -1,89 +0,0 @@ -#!/usr/bin/env bash - -# Usage: env [ CC=... ] [ C_STANDARD=...] [ CXX=... ] [CXX_STANDARD=...] \ -# [ AR=... ] [ NM=... ] [ RANLIB=... ] [ STRIP=... ] [ DEBUG=... ] \ -# [ LTO=... ] [ NO_HARDEN=... ] ./build-id [ID_SALT]... -# -# Prints to stdout a SHA256 hash representing the current toolset, used by -# depends/Makefile as a build id for caching purposes (detecting when the -# toolset has changed and the cache needs to be invalidated). -# -# If the DEBUG environment variable is non-empty and the system has `tee` -# available in its $PATH, the pre-image to the SHA256 hash will be printed to -# stderr. This is to help developers debug caching issues in depends. - -# This script explicitly does not `set -e` because id determination is mostly -# opportunistic: it is fine that things fail, as long as they fail consistently. - -# Command variables (CC/CXX/AR) which can be blank are invoked with `bash -c`, -# because the "command not found" error message printed by shells often include -# the line number, like so: -# -# ./depends/gen_id: line 43: --version: command not found -# -# By invoking with `bash -c`, we ensure that the line number is always 1 - -( - # Redirect stderr to stdout - exec 2>&1 - - echo "BEGIN ALL" - - # Include any ID salts supplied via command line - echo "BEGIN ID SALT" - echo "$@" - echo "END ID SALT" - - # GCC only prints COLLECT_LTO_WRAPPER when invoked with just "-v", but we want - # the information from "-v -E -" as well, so just include both. - echo "BEGIN CC" - bash -c "${CC} -v" - bash -c "${CC} -v -E -xc -o /dev/null - < /dev/null" - bash -c "${CC} -v -E -xobjective-c -o /dev/null - < /dev/null" - echo "C_STANDARD=${C_STANDARD}" - echo "END CC" - - echo "BEGIN CXX" - bash -c "${CXX} -v" - bash -c "${CXX} -v -E -xc++ -o /dev/null - < /dev/null" - bash -c "${CXX} -v -E -xobjective-c++ -o /dev/null - < /dev/null" - echo "CXX_STANDARD=${CXX_STANDARD}" - echo "END CXX" - - echo "BEGIN AR" - bash -c "${AR} --version" - env | grep '^AR_' - echo "END AR" - - echo "BEGIN NM" - bash -c "${NM} --version" - env | grep '^NM_' - echo "END NM" - - echo "BEGIN RANLIB" - bash -c "${RANLIB} --version" - env | grep '^RANLIB_' - echo "END RANLIB" - - echo "BEGIN STRIP" - bash -c "${STRIP} --version" - env | grep '^STRIP_' - echo "END STRIP" - - echo "BEGIN LTO" - echo "LTO=${LTO}" - echo "END LTO" - - echo "BEGIN NO_HARDEN" - echo "NO_HARDEN=${NO_HARDEN}" - echo "END NO_HARDEN" - - echo "END ALL" -) | if [ -n "$DEBUG" ] && command -v tee > /dev/null 2>&1; then - # When debugging and `tee` is available, output the preimage to stderr - # in addition to passing through stdin to stdout - tee >(cat 1>&2) - else - # Otherwise, passthrough stdin to stdout - cat - fi | ${SHA256SUM} - | cut -d' ' -f1 diff --git a/depends/hosts/darwin.mk b/depends/hosts/darwin.mk deleted file mode 100644 index 564381d1e9..0000000000 --- a/depends/hosts/darwin.mk +++ /dev/null @@ -1,84 +0,0 @@ -OSX_MIN_VERSION=11.0 -OSX_SDK_VERSION=14.0 -XCODE_VERSION=15.0 -XCODE_BUILD_ID=15A240d -LLD_VERSION=711 - -OSX_SDK=$(SDK_PATH)/Xcode-$(XCODE_VERSION)-$(XCODE_BUILD_ID)-extracted-SDK-with-libcxx-headers - -# We can't just use $(shell command -v clang) because GNU Make handles builtins -# in a special way and doesn't know that `command` is a POSIX-standard builtin -# prior to 1af314465e5dfe3e8baa839a32a72e83c04f26ef, first released in v4.2.90. -# At the time of writing, GNU Make v4.2.1 is still being used in supported -# distro releases. -# -# Source: https://lists.gnu.org/archive/html/bug-make/2017-11/msg00017.html -clang_prog=$(shell $(SHELL) $(.SHELLFLAGS) "command -v clang") -clangxx_prog=$(shell $(SHELL) $(.SHELLFLAGS) "command -v clang++") - -darwin_AR=$(shell $(SHELL) $(.SHELLFLAGS) "command -v llvm-ar") -darwin_DSYMUTIL=$(shell $(SHELL) $(.SHELLFLAGS) "command -v dsymutil") -darwin_NM=$(shell $(SHELL) $(.SHELLFLAGS) "command -v llvm-nm") -darwin_OBJDUMP=$(shell $(SHELL) $(.SHELLFLAGS) "command -v llvm-objdump") -darwin_RANLIB=$(shell $(SHELL) $(.SHELLFLAGS) "command -v llvm-ranlib") -darwin_STRIP=$(shell $(SHELL) $(.SHELLFLAGS) "command -v llvm-strip") - -# Flag explanations: -# -# -mlinker-version -# -# Ensures that modern linker features are enabled. See here for more -# details: https://github.com/bitcoin/bitcoin/pull/19407. -# -# -isysroot$(OSX_SDK) -nostdlibinc -# -# Disable default include paths built into the compiler as well as -# those normally included for libc and libc++. The only path that -# remains implicitly is the clang resource dir. -# -# -iwithsysroot / -iframeworkwithsysroot -# -# Adds the desired paths from the SDK -# -# -platform_version -# -# Indicate to the linker the platform, the oldest supported version, -# and the SDK used. -# -# -no_adhoc_codesign -# -# Disable adhoc codesigning (for now) when using LLVM tooling, to avoid -# non-determinism issues with the Identifier field. - -darwin_CC=env -u C_INCLUDE_PATH -u CPLUS_INCLUDE_PATH \ - -u OBJC_INCLUDE_PATH -u OBJCPLUS_INCLUDE_PATH -u CPATH \ - -u LIBRARY_PATH \ - $(clang_prog) --target=$(host) \ - -isysroot$(OSX_SDK) -nostdlibinc \ - -iwithsysroot/usr/include -iframeworkwithsysroot/System/Library/Frameworks - -darwin_CXX=env -u C_INCLUDE_PATH -u CPLUS_INCLUDE_PATH \ - -u OBJC_INCLUDE_PATH -u OBJCPLUS_INCLUDE_PATH -u CPATH \ - -u LIBRARY_PATH \ - $(clangxx_prog) --target=$(host) \ - -isysroot$(OSX_SDK) -nostdlibinc \ - -iwithsysroot/usr/include/c++/v1 \ - -iwithsysroot/usr/include -iframeworkwithsysroot/System/Library/Frameworks - -darwin_CFLAGS=-pipe -std=$(C_STANDARD) -mmacos-version-min=$(OSX_MIN_VERSION) -darwin_CXXFLAGS=-pipe -std=$(CXX_STANDARD) -mmacos-version-min=$(OSX_MIN_VERSION) -darwin_LDFLAGS=-Wl,-platform_version,macos,$(OSX_MIN_VERSION),$(OSX_SDK_VERSION) - -ifneq ($(build_os),darwin) -darwin_CFLAGS += -mlinker-version=$(LLD_VERSION) -darwin_CXXFLAGS += -mlinker-version=$(LLD_VERSION) -darwin_LDFLAGS += -Wl,-no_adhoc_codesign -fuse-ld=lld -endif - -darwin_release_CFLAGS=-O2 -darwin_release_CXXFLAGS=$(darwin_release_CFLAGS) - -darwin_debug_CFLAGS=-O1 -g -darwin_debug_CXXFLAGS=$(darwin_debug_CFLAGS) - -darwin_cmake_system=Darwin diff --git a/depends/hosts/default.mk b/depends/hosts/default.mk deleted file mode 100644 index d82c33f29c..0000000000 --- a/depends/hosts/default.mk +++ /dev/null @@ -1,42 +0,0 @@ -ifneq ($(host),$(build)) -host_toolchain:=$(host)- -endif - -default_host_CC = $(host_toolchain)gcc -default_host_CXX = $(host_toolchain)g++ -default_host_AR = $(host_toolchain)ar -default_host_RANLIB = $(host_toolchain)ranlib -default_host_STRIP = $(host_toolchain)strip -default_host_NM = $(host_toolchain)nm -default_host_OBJCOPY = $(host_toolchain)objcopy - -define add_host_tool_func -ifneq ($(filter $(origin $1),undefined default),) -# Do not consider the well-known var $1 if it is undefined or is taking a value -# that is predefined by "make" (e.g. the make variable "CC" has a predefined -# value of "cc") -$(host_os)_$1?=$$(default_host_$1) -$(host_arch)_$(host_os)_$1?=$$($(host_os)_$1) -$(host_arch)_$(host_os)_$(release_type)_$1?=$$($(host_os)_$1) -else -$(host_os)_$1=$(or $($1),$($(host_os)_$1),$(default_host_$1)) -$(host_arch)_$(host_os)_$1=$(or $($1),$($(host_arch)_$(host_os)_$1),$$($(host_os)_$1)) -$(host_arch)_$(host_os)_$(release_type)_$1=$(or $($1),$($(host_arch)_$(host_os)_$(release_type)_$1),$$($(host_os)_$1)) -endif -host_$1=$$($(host_arch)_$(host_os)_$1) -endef - -define add_host_flags_func -ifeq ($(filter $(origin $1),undefined default),) -$(host_arch)_$(host_os)_$1 = -$(host_arch)_$(host_os)_$(release_type)_$1 = $($1) -else -$(host_arch)_$(host_os)_$1 += $($(host_os)_$1) -$(host_arch)_$(host_os)_$(release_type)_$1 += $($(host_os)_$(release_type)_$1) -endif -host_$1 = $$($(host_arch)_$(host_os)_$1) -host_$(release_type)_$1 = $$($(host_arch)_$(host_os)_$(release_type)_$1) -endef - -$(foreach tool,CC CXX AR RANLIB STRIP NM OBJCOPY OBJDUMP DSYMUTIL,$(eval $(call add_host_tool_func,$(tool)))) -$(foreach flags,CFLAGS CXXFLAGS CPPFLAGS LDFLAGS, $(eval $(call add_host_flags_func,$(flags)))) diff --git a/depends/hosts/freebsd.mk b/depends/hosts/freebsd.mk deleted file mode 100644 index 055097b03d..0000000000 --- a/depends/hosts/freebsd.mk +++ /dev/null @@ -1,31 +0,0 @@ -freebsd_CFLAGS=-pipe -std=$(C_STANDARD) -freebsd_CXXFLAGS=-pipe -std=$(CXX_STANDARD) - -freebsd_release_CFLAGS=-O2 -freebsd_release_CXXFLAGS=$(freebsd_release_CFLAGS) - -freebsd_debug_CFLAGS=-O1 -freebsd_debug_CXXFLAGS=$(freebsd_debug_CFLAGS) - -ifeq (86,$(findstring 86,$(build_arch))) -i686_freebsd_CC=clang -m32 -i686_freebsd_CXX=clang++ -m32 -i686_freebsd_AR=ar -i686_freebsd_RANLIB=ranlib -i686_freebsd_NM=nm -i686_freebsd_STRIP=strip - -x86_64_freebsd_CC=clang -m64 -x86_64_freebsd_CXX=clang++ -m64 -x86_64_freebsd_AR=ar -x86_64_freebsd_RANLIB=ranlib -x86_64_freebsd_NM=nm -x86_64_freebsd_STRIP=strip -else -i686_freebsd_CC=$(default_host_CC) -m32 -i686_freebsd_CXX=$(default_host_CXX) -m32 -x86_64_freebsd_CC=$(default_host_CC) -m64 -x86_64_freebsd_CXX=$(default_host_CXX) -m64 -endif - -freebsd_cmake_system=FreeBSD diff --git a/depends/hosts/linux.mk b/depends/hosts/linux.mk deleted file mode 100644 index f5ce2bb0b8..0000000000 --- a/depends/hosts/linux.mk +++ /dev/null @@ -1,42 +0,0 @@ -linux_CFLAGS=-pipe -std=$(C_STANDARD) -linux_CXXFLAGS=-pipe -std=$(CXX_STANDARD) - -ifneq ($(LTO),) -linux_AR = $(host_toolchain)gcc-ar -linux_NM = $(host_toolchain)gcc-nm -linux_RANLIB = $(host_toolchain)gcc-ranlib -endif - -linux_release_CFLAGS=-O2 -linux_release_CXXFLAGS=$(linux_release_CFLAGS) - -linux_debug_CFLAGS=-O1 -g -linux_debug_CXXFLAGS=$(linux_debug_CFLAGS) - -# https://gcc.gnu.org/onlinedocs/libstdc++/manual/debug_mode.html -linux_debug_CPPFLAGS=-D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC - -# https://libcxx.llvm.org/Hardening.html -linux_debug_CPPFLAGS+=-D_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_DEBUG - -ifeq (86,$(findstring 86,$(build_arch))) -i686_linux_CC=gcc -m32 -i686_linux_CXX=g++ -m32 -i686_linux_AR=ar -i686_linux_RANLIB=ranlib -i686_linux_NM=nm -i686_linux_STRIP=strip - -x86_64_linux_CC=gcc -m64 -x86_64_linux_CXX=g++ -m64 -x86_64_linux_AR=ar -x86_64_linux_RANLIB=ranlib -x86_64_linux_NM=nm -x86_64_linux_STRIP=strip -else -i686_linux_CC=$(default_host_CC) -m32 -i686_linux_CXX=$(default_host_CXX) -m32 -x86_64_linux_CC=$(default_host_CC) -m64 -x86_64_linux_CXX=$(default_host_CXX) -m64 -endif -linux_cmake_system=Linux diff --git a/depends/hosts/mingw32.mk b/depends/hosts/mingw32.mk deleted file mode 100644 index 4c657358f6..0000000000 --- a/depends/hosts/mingw32.mk +++ /dev/null @@ -1,22 +0,0 @@ -ifneq ($(shell $(SHELL) $(.SHELLFLAGS) "command -v $(host)-g++-posix"),) -mingw32_CXX := $(host)-g++-posix -endif - -mingw32_CFLAGS=-pipe -std=$(C_STANDARD) -mingw32_CXXFLAGS=-pipe -std=$(CXX_STANDARD) - -ifneq ($(LTO),) -mingw32_AR = $(host_toolchain)gcc-ar -mingw32_NM = $(host_toolchain)gcc-nm -mingw32_RANLIB = $(host_toolchain)gcc-ranlib -endif - -mingw32_release_CFLAGS=-O2 -mingw32_release_CXXFLAGS=$(mingw32_release_CFLAGS) - -mingw32_debug_CFLAGS=-O1 -g -mingw32_debug_CXXFLAGS=$(mingw32_debug_CFLAGS) - -mingw32_debug_CPPFLAGS=-D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC - -mingw32_cmake_system=Windows diff --git a/depends/hosts/netbsd.mk b/depends/hosts/netbsd.mk deleted file mode 100644 index f33b2d2889..0000000000 --- a/depends/hosts/netbsd.mk +++ /dev/null @@ -1,39 +0,0 @@ -netbsd_CFLAGS=-pipe -std=$(C_STANDARD) -netbsd_CXXFLAGS=-pipe -std=$(CXX_STANDARD) - -ifneq ($(LTO),) -netbsd_AR = $(host_toolchain)gcc-ar -netbsd_NM = $(host_toolchain)gcc-nm -netbsd_RANLIB = $(host_toolchain)gcc-ranlib -endif - -netbsd_CXXFLAGS=$(netbsd_CFLAGS) - -netbsd_release_CFLAGS=-O2 -netbsd_release_CXXFLAGS=$(netbsd_release_CFLAGS) - -netbsd_debug_CFLAGS=-O1 -netbsd_debug_CXXFLAGS=$(netbsd_debug_CFLAGS) - -ifeq (86,$(findstring 86,$(build_arch))) -i686_netbsd_CC=gcc -m32 -i686_netbsd_CXX=g++ -m32 -i686_netbsd_AR=ar -i686_netbsd_RANLIB=ranlib -i686_netbsd_NM=nm -i686_netbsd_STRIP=strip - -x86_64_netbsd_CC=gcc -m64 -x86_64_netbsd_CXX=g++ -m64 -x86_64_netbsd_AR=ar -x86_64_netbsd_RANLIB=ranlib -x86_64_netbsd_NM=nm -x86_64_netbsd_STRIP=strip -else -i686_netbsd_CC=$(default_host_CC) -m32 -i686_netbsd_CXX=$(default_host_CXX) -m32 -x86_64_netbsd_CC=$(default_host_CC) -m64 -x86_64_netbsd_CXX=$(default_host_CXX) -m64 -endif - -netbsd_cmake_system=NetBSD diff --git a/depends/hosts/openbsd.mk b/depends/hosts/openbsd.mk deleted file mode 100644 index bdd36dc9b3..0000000000 --- a/depends/hosts/openbsd.mk +++ /dev/null @@ -1,31 +0,0 @@ -openbsd_CFLAGS=-pipe -std=$(C_STANDARD) -openbsd_CXXFLAGS=-pipe -std=$(CXX_STANDARD) - -openbsd_release_CFLAGS=-O2 -openbsd_release_CXXFLAGS=$(openbsd_release_CFLAGS) - -openbsd_debug_CFLAGS=-O1 -openbsd_debug_CXXFLAGS=$(openbsd_debug_CFLAGS) - -ifeq (86,$(findstring 86,$(build_arch))) -i686_openbsd_CC=clang -m32 -i686_openbsd_CXX=clang++ -m32 -i686_openbsd_AR=ar -i686_openbsd_RANLIB=ranlib -i686_openbsd_NM=nm -i686_openbsd_STRIP=strip - -x86_64_openbsd_CC=clang -m64 -x86_64_openbsd_CXX=clang++ -m64 -x86_64_openbsd_AR=ar -x86_64_openbsd_RANLIB=ranlib -x86_64_openbsd_NM=nm -x86_64_openbsd_STRIP=strip -else -i686_openbsd_CC=$(default_host_CC) -m32 -i686_openbsd_CXX=$(default_host_CXX) -m32 -x86_64_openbsd_CC=$(default_host_CC) -m64 -x86_64_openbsd_CXX=$(default_host_CXX) -m64 -endif - -openbsd_cmake_system=OpenBSD diff --git a/depends/packages.md b/depends/packages.md deleted file mode 100644 index 7a7a42afa1..0000000000 --- a/depends/packages.md +++ /dev/null @@ -1,200 +0,0 @@ -Each recipe consists of 3 main parts: defining identifiers, setting build -variables, and defining build commands. - -The package "mylib" will be used here as an example - -General tips: -- mylib_foo is written as $(package)_foo in order to make recipes more similar. -- Secondary dependency packages relative to the bitcoin binaries/libraries (i.e. - those not in `ALLOWED_LIBRARIES` in `contrib/devtools/symbol-check.py`) don't - need to be shared and should be built statically whenever possible. See - [below](#secondary-dependencies) for more details. - -## Identifiers -Each package is required to define at least these variables: - - $(package)_version: - Version of the upstream library or program. If there is no version, a - placeholder such as 1.0 can be used. - - $(package)_download_path: - Location of the upstream source, without the file-name. Usually http, https - or ftp. Secure transmission options like https should be preferred if - available. - - $(package)_file_name: - The upstream source filename available at the download path. - - $(package)_sha256_hash: - The sha256 hash of the upstream file - -These variables are optional: - - $(package)_build_subdir: - cd to this dir before running configure/build/stage commands. - - $(package)_download_file: - The file-name of the upstream source if it differs from how it should be - stored locally. This can be used to avoid storing file-names with strange - characters. - - $(package)_dependencies: - Names of any other packages that this one depends on. - - $(package)_patches: - Filenames of any patches needed to build the package - - $(package)_extra_sources: - Any extra files that will be fetched via $(package)_fetch_cmds. These are - specified so that they can be fetched and verified via 'make download'. - - -## Build Variables: -After defining the main identifiers, build variables may be added or customized -before running the build commands. They should be added to a function called -$(package)_set_vars. For example: - - define $(package)_set_vars - ... - endef - -Most variables can be prefixed with the host, architecture, or both, to make -the modifications specific to that case. For example: - - Universal: $(package)_cc=gcc - Linux only: $(package)_linux_cc=gcc - x86_64 only: $(package)_x86_64_cc = gcc - x86_64 linux only: $(package)_x86_64_linux_cc = gcc - -These variables may be set to override or append their default values. - - $(package)_cc - $(package)_cxx - $(package)_objc - $(package)_objcxx - $(package)_ar - $(package)_ranlib - $(package)_nm - $(package)_cflags - $(package)_cxxflags - $(package)_ldflags - $(package)_cppflags - $(package)_config_env - $(package)_build_env - $(package)_stage_env - $(package)_build_opts - $(package)_config_opts - -The *_env variables are used to add environment variables to the respective -commands. - -Many variables respect a debug/release suffix as well, in order to use them for -only the appropriate build config. For example: - - $(package)_cflags_release = -O3 - $(package)_cflags_i686_debug = -g - $(package)_config_opts_release = --disable-debug - -These will be used in addition to the options that do not specify -debug/release. All builds are considered to be release unless DEBUG=1 is set by -the user. Other variables may be defined as needed. - -## Build commands: - - For each build, a unique build dir and staging dir are created. For example, - `work/build/mylib/1.0-1adac830f6e` and `work/staging/mylib/1.0-1adac830f6e`. - - The following build commands are available for each recipe: - - $(package)_fetch_cmds: - Runs from: build dir - Fetch the source file. If undefined, it will be fetched and verified - against its hash. - - $(package)_extract_cmds: - Runs from: build dir - Verify the source file against its hash and extract it. If undefined, the - source is assumed to be a tarball. - - $(package)_preprocess_cmds: - Runs from: build dir/$(package)_build_subdir - Preprocess the source as necessary. If undefined, does nothing. - - $(package)_config_cmds: - Runs from: build dir/$(package)_build_subdir - Configure the source. If undefined, does nothing. - - $(package)_build_cmds: - Runs from: build dir/$(package)_build_subdir - Build the source. If undefined, does nothing. - - $(package)_stage_cmds: - Runs from: build dir/$(package)_build_subdir - Stage the build results. If undefined, does nothing. - - The following variables are available for each recipe: - - $(1)_staging_dir: package's destination sysroot path - $(1)_staging_prefix_dir: prefix path inside of the package's staging dir - $(1)_extract_dir: path to the package's extracted sources - $(1)_build_dir: path where configure/build/stage commands will be run - $(1)_patch_dir: path where the package's patches (if any) are found - -Notes on build commands: - -For packages built with autotools, $($(package)_autoconf) can be used in the -configure step to (usually) correctly configure automatically. Any -$($(package)_config_opts) will be appended. - -Most autotools projects can be properly staged using: - - $(MAKE) DESTDIR=$($(package)_staging_dir) install - -## Build outputs: - -In general, the output of a depends package should not contain any libtool -archives. Instead, the package should output `.pc` (`pkg-config`) files where -possible. - -From the [Gentoo Wiki entry](https://wiki.gentoo.org/wiki/Project:Quality_Assurance/Handling_Libtool_Archives): - -> Libtool pulls in all direct and indirect dependencies into the .la files it -> creates. This leads to massive overlinking, which is toxic to the Gentoo -> ecosystem, as it leads to a massive number of unnecessary rebuilds. - -Where possible, packages are built with Position Independent Code. Either using -the Autotools `--with-pic` flag, or `CMAKE_POSITION_INDEPENDENT_CODE` with CMake. - -## Secondary dependencies: - -Secondary dependency packages relative to the bitcoin binaries/libraries (i.e. -those not in `ALLOWED_LIBRARIES` in `contrib/devtools/symbol-check.py`) don't -need to be shared and should be built statically whenever possible. This -improves general build reliability as illustrated by the following example: - -When linking an executable against a shared library `libprimary` that has its -own shared dependency `libsecondary`, we may need to specify the path to -`libsecondary` on the link command using the `-rpath/-rpath-link` options, it is -not sufficient to just say `libprimary`. - -For us, it's much easier to just link a static `libsecondary` into a shared -`libprimary`. Especially because in our case, we are linking against a dummy -`libprimary` anyway that we'll throw away. We don't care if the end-user has a -static or dynamic `libsecondary`, that's not our concern. With a static -`libsecondary`, when we need to link `libprimary` into our executable, there's no -dependency chain to worry about as `libprimary` has all the symbols. - -## Build targets: - -To build an individual package (useful for debugging), following build targets are available. - - make ${package} - make ${package}_fetched - make ${package}_extracted - make ${package}_preprocessed - make ${package}_configured - make ${package}_built - make ${package}_staged - make ${package}_postprocessed - make ${package}_cached - make ${package}_cached_checksum diff --git a/depends/packages/bdb.mk b/depends/packages/bdb.mk deleted file mode 100644 index 1a21238152..0000000000 --- a/depends/packages/bdb.mk +++ /dev/null @@ -1,38 +0,0 @@ -package=bdb -$(package)_version=4.8.30 -$(package)_download_path=https://download.oracle.com/berkeley-db -$(package)_file_name=db-$($(package)_version).NC.tar.gz -$(package)_sha256_hash=12edc0df75bf9abd7f82f821795bcee50f42cb2e5f76a6a281b85732798364ef -$(package)_build_subdir=build_unix -$(package)_patches=clang_cxx_11.patch - -define $(package)_set_vars -$(package)_config_opts=--disable-shared --enable-cxx --disable-replication --enable-option-checking -$(package)_config_opts_mingw32=--enable-mingw -$(package)_config_opts_linux=--with-pic -$(package)_config_opts_freebsd=--with-pic -$(package)_config_opts_netbsd=--with-pic -$(package)_config_opts_openbsd=--with-pic -$(package)_config_opts_android=--with-pic -$(package)_cflags+=-Wno-error=implicit-function-declaration -Wno-error=format-security -Wno-error=implicit-int -$(package)_cppflags_freebsd=-D_XOPEN_SOURCE=600 -D__BSD_VISIBLE=1 -$(package)_cppflags_netbsd=-D_XOPEN_SOURCE=600 -$(package)_cppflags_mingw32=-DUNICODE -D_UNICODE -endef - -define $(package)_preprocess_cmds - patch -p1 < $($(package)_patch_dir)/clang_cxx_11.patch && \ - cp -f $(BASEDIR)/config.guess $(BASEDIR)/config.sub dist -endef - -define $(package)_config_cmds - ../dist/$($(package)_autoconf) -endef - -define $(package)_build_cmds - $(MAKE) libdb_cxx-4.8.a libdb-4.8.a -endef - -define $(package)_stage_cmds - $(MAKE) DESTDIR=$($(package)_staging_dir) install_lib install_include -endef diff --git a/depends/packages/boost.mk b/depends/packages/boost.mk deleted file mode 100644 index 938e9971ba..0000000000 --- a/depends/packages/boost.mk +++ /dev/null @@ -1,10 +0,0 @@ -package=boost -$(package)_version=1.81.0 -$(package)_download_path=https://archives.boost.io/release/$($(package)_version)/source/ -$(package)_file_name=boost_$(subst .,_,$($(package)_version)).tar.gz -$(package)_sha256_hash=205666dea9f6a7cfed87c7a6dfbeb52a2c1b9de55712c9c1a87735d7181452b6 - -define $(package)_stage_cmds - mkdir -p $($(package)_staging_prefix_dir)/include && \ - cp -r boost $($(package)_staging_prefix_dir)/include -endef diff --git a/depends/packages/capnp.mk b/depends/packages/capnp.mk deleted file mode 100644 index 6d792db711..0000000000 --- a/depends/packages/capnp.mk +++ /dev/null @@ -1,28 +0,0 @@ -package=capnp -$(package)_version=$(native_$(package)_version) -$(package)_download_path=$(native_$(package)_download_path) -$(package)_download_file=$(native_$(package)_download_file) -$(package)_file_name=$(native_$(package)_file_name) -$(package)_sha256_hash=$(native_$(package)_sha256_hash) - -define $(package)_set_vars := - $(package)_config_opts := -DBUILD_TESTING=OFF - $(package)_config_opts += -DWITH_OPENSSL=OFF - $(package)_config_opts += -DWITH_ZLIB=OFF -endef - -define $(package)_config_cmds - $($(package)_cmake) . -endef - -define $(package)_build_cmds - $(MAKE) -endef - -define $(package)_stage_cmds - $(MAKE) DESTDIR=$($(package)_staging_dir) install -endef - -define $(package)_postprocess_cmds - rm -rf lib/pkgconfig -endef diff --git a/depends/packages/expat.mk b/depends/packages/expat.mk deleted file mode 100644 index f36a353e8b..0000000000 --- a/depends/packages/expat.mk +++ /dev/null @@ -1,32 +0,0 @@ -package=expat -$(package)_version=2.4.8 -$(package)_download_path=https://github.com/libexpat/libexpat/releases/download/R_$(subst .,_,$($(package)_version))/ -$(package)_file_name=$(package)-$($(package)_version).tar.xz -$(package)_sha256_hash=f79b8f904b749e3e0d20afeadecf8249c55b2e32d4ebb089ae378df479dcaf25 - -# -D_DEFAULT_SOURCE defines __USE_MISC, which exposes additional -# definitions in endian.h, which are required for a working -# endianness check in configure when building with -flto. -define $(package)_set_vars - $(package)_config_opts=--disable-shared --without-docbook --without-tests --without-examples - $(package)_config_opts += --disable-dependency-tracking --enable-option-checking - $(package)_config_opts += --without-xmlwf - $(package)_config_opts_linux=--with-pic - $(package)_cppflags += -D_DEFAULT_SOURCE -endef - -define $(package)_config_cmds - $($(package)_autoconf) -endef - -define $(package)_build_cmds - $(MAKE) -endef - -define $(package)_stage_cmds - $(MAKE) DESTDIR=$($(package)_staging_dir) install -endef - -define $(package)_postprocess_cmds - rm -rf share lib/cmake lib/*.la -endef diff --git a/depends/packages/fontconfig.mk b/depends/packages/fontconfig.mk deleted file mode 100644 index 6baaecc55a..0000000000 --- a/depends/packages/fontconfig.mk +++ /dev/null @@ -1,33 +0,0 @@ -package=fontconfig -$(package)_version=2.12.6 -$(package)_download_path=https://www.freedesktop.org/software/fontconfig/release/ -$(package)_file_name=$(package)-$($(package)_version).tar.gz -$(package)_sha256_hash=064b9ebf060c9e77011733ac9dc0e2ce92870b574cca2405e11f5353a683c334 -$(package)_dependencies=freetype expat -$(package)_patches=gperf_header_regen.patch - -define $(package)_set_vars - $(package)_config_opts=--disable-docs --disable-static --disable-libxml2 --disable-iconv - $(package)_config_opts += --disable-dependency-tracking --enable-option-checking - $(package)_cflags += -Wno-implicit-function-declaration -endef - -define $(package)_preprocess_cmds - patch -p1 < $($(package)_patch_dir)/gperf_header_regen.patch -endef - -define $(package)_config_cmds - $($(package)_autoconf) -endef - -define $(package)_build_cmds - $(MAKE) -endef - -define $(package)_stage_cmds - $(MAKE) DESTDIR=$($(package)_staging_dir) install -endef - -define $(package)_postprocess_cmds - rm -rf var lib/*.la -endef diff --git a/depends/packages/freetype.mk b/depends/packages/freetype.mk deleted file mode 100644 index 6f5dbe0f01..0000000000 --- a/depends/packages/freetype.mk +++ /dev/null @@ -1,27 +0,0 @@ -package=freetype -$(package)_version=2.11.0 -$(package)_download_path=https://download.savannah.gnu.org/releases/$(package) -$(package)_file_name=$(package)-$($(package)_version).tar.xz -$(package)_sha256_hash=8bee39bd3968c4804b70614a0a3ad597299ad0e824bc8aad5ce8aaf48067bde7 - -define $(package)_set_vars - $(package)_config_opts=--without-zlib --without-png --without-harfbuzz --without-bzip2 --disable-static - $(package)_config_opts += --enable-option-checking --without-brotli - $(package)_config_opts_linux=--with-pic -endef - -define $(package)_config_cmds - $($(package)_autoconf) -endef - -define $(package)_build_cmds - $(MAKE) -endef - -define $(package)_stage_cmds - $(MAKE) DESTDIR=$($(package)_staging_dir) install -endef - -define $(package)_postprocess_cmds - rm -rf share/man lib/*.la -endef diff --git a/depends/packages/libXau.mk b/depends/packages/libXau.mk deleted file mode 100644 index 161c2c42d0..0000000000 --- a/depends/packages/libXau.mk +++ /dev/null @@ -1,34 +0,0 @@ -package=libXau -$(package)_version=1.0.9 -$(package)_download_path=https://xorg.freedesktop.org/releases/individual/lib/ -$(package)_file_name=$(package)-$($(package)_version).tar.gz -$(package)_sha256_hash=1f123d8304b082ad63a9e89376400a3b1d4c29e67e3ea07b3f659cccca690eea -$(package)_dependencies=xproto - -# When updating this package, check the default value of -# --disable-xthreads. It is currently enabled. -define $(package)_set_vars - $(package)_config_opts=--disable-shared --disable-lint-library --without-lint - $(package)_config_opts += --disable-dependency-tracking --enable-option-checking - $(package)_config_opts_linux=--with-pic -endef - -define $(package)_preprocess_cmds - cp -f $(BASEDIR)/config.guess $(BASEDIR)/config.sub . -endef - -define $(package)_config_cmds - $($(package)_autoconf) -endef - -define $(package)_build_cmds - $(MAKE) -endef - -define $(package)_stage_cmds - $(MAKE) DESTDIR=$($(package)_staging_dir) install -endef - -define $(package)_postprocess_cmds - rm -rf share lib/*.la -endef diff --git a/depends/packages/libevent.mk b/depends/packages/libevent.mk deleted file mode 100644 index 60e1ee469e..0000000000 --- a/depends/packages/libevent.mk +++ /dev/null @@ -1,43 +0,0 @@ -package=libevent -$(package)_version=2.1.12-stable -$(package)_download_path=https://github.com/libevent/libevent/releases/download/release-$($(package)_version)/ -$(package)_file_name=$(package)-$($(package)_version).tar.gz -$(package)_sha256_hash=92e6de1be9ec176428fd2367677e61ceffc2ee1cb119035037a27d346b0403bb -$(package)_patches=cmake_fixups.patch -$(package)_build_subdir=build - -# When building for Windows, we set _WIN32_WINNT to target the same Windows -# version as we do in configure. Due to quirks in libevents build system, this -# is also required to enable support for ipv6. See #19375. -define $(package)_set_vars - $(package)_config_opts=-DEVENT__DISABLE_BENCHMARK=ON -DEVENT__DISABLE_OPENSSL=ON - $(package)_config_opts+=-DEVENT__DISABLE_SAMPLES=ON -DEVENT__DISABLE_REGRESS=ON - $(package)_config_opts+=-DEVENT__DISABLE_TESTS=ON -DEVENT__LIBRARY_TYPE=STATIC - $(package)_cppflags_mingw32=-D_WIN32_WINNT=0x0601 - - ifeq ($(NO_HARDEN),) - $(package)_cppflags+=-D_FORTIFY_SOURCE=3 - endif -endef - -define $(package)_preprocess_cmds - patch -p1 < $($(package)_patch_dir)/cmake_fixups.patch -endef - -define $(package)_config_cmds - $($(package)_cmake) -S .. -B . -endef - -define $(package)_build_cmds - $(MAKE) -endef - -define $(package)_stage_cmds - $(MAKE) DESTDIR=$($(package)_staging_dir) install -endef - -define $(package)_postprocess_cmds - rm bin/event_rpcgen.py && \ - rm include/ev*.h && \ - rm include/event2/*_compat.h -endef diff --git a/depends/packages/libmultiprocess.mk b/depends/packages/libmultiprocess.mk deleted file mode 100644 index c292c49bfb..0000000000 --- a/depends/packages/libmultiprocess.mk +++ /dev/null @@ -1,28 +0,0 @@ -package=libmultiprocess -$(package)_version=$(native_$(package)_version) -$(package)_download_path=$(native_$(package)_download_path) -$(package)_file_name=$(native_$(package)_file_name) -$(package)_sha256_hash=$(native_$(package)_sha256_hash) -$(package)_dependencies=native_$(package) capnp -ifneq ($(host),$(build)) -$(package)_dependencies += native_capnp -endif - -define $(package)_set_vars := -ifneq ($(host),$(build)) -$(package)_config_opts := -DCAPNP_EXECUTABLE="$$(native_capnp_prefixbin)/capnp" -$(package)_config_opts += -DCAPNPC_CXX_EXECUTABLE="$$(native_capnp_prefixbin)/capnpc-c++" -endif -endef - -define $(package)_config_cmds - $($(package)_cmake) . -endef - -define $(package)_build_cmds - $(MAKE) multiprocess -endef - -define $(package)_stage_cmds - $(MAKE) DESTDIR=$($(package)_staging_dir) install-lib -endef diff --git a/depends/packages/libnatpmp.mk b/depends/packages/libnatpmp.mk deleted file mode 100644 index 5a573a18e7..0000000000 --- a/depends/packages/libnatpmp.mk +++ /dev/null @@ -1,20 +0,0 @@ -package=libnatpmp -$(package)_version=f2433bec24ca3d3f22a8a7840728a3ac177f94ba -$(package)_download_path=https://github.com/miniupnp/libnatpmp/archive -$(package)_file_name=$($(package)_version).tar.gz -$(package)_sha256_hash=ef84979950dfb3556705b63c9cd6c95501b75e887fba466234b187f3c9029669 -$(package)_build_subdir=build - -define $(package)_config_cmds - $($(package)_cmake) -S .. -B . -endef - -define $(package)_build_cmds - $(MAKE) natpmp -endef - -define $(package)_stage_cmds - mkdir -p $($(package)_staging_prefix_dir)/include $($(package)_staging_prefix_dir)/lib && \ - install ../natpmp.h ../natpmp_declspec.h $($(package)_staging_prefix_dir)/include && \ - install libnatpmp.a $($(package)_staging_prefix_dir)/lib -endef diff --git a/depends/packages/libxcb.mk b/depends/packages/libxcb.mk deleted file mode 100644 index 036eaf6560..0000000000 --- a/depends/packages/libxcb.mk +++ /dev/null @@ -1,41 +0,0 @@ -package=libxcb -$(package)_version=1.14 -$(package)_download_path=https://xcb.freedesktop.org/dist -$(package)_file_name=$(package)-$($(package)_version).tar.xz -$(package)_sha256_hash=a55ed6db98d43469801262d81dc2572ed124edc3db31059d4e9916eb9f844c34 -$(package)_dependencies=xcb_proto libXau -$(package)_patches = remove_pthread_stubs.patch - -define $(package)_set_vars -$(package)_config_opts=--disable-static --disable-devel-docs --without-doxygen --without-launchd -$(package)_config_opts += --disable-dependency-tracking --enable-option-checking -# Disable unneeded extensions. -# More info is available from: https://doc.qt.io/qt-5.15/linux-requirements.html -$(package)_config_opts += --disable-composite --disable-damage --disable-dpms -$(package)_config_opts += --disable-dri2 --disable-dri3 --disable-glx -$(package)_config_opts += --disable-present --disable-record --disable-resource -$(package)_config_opts += --disable-screensaver --disable-xevie --disable-xfree86-dri -$(package)_config_opts += --disable-xinput --disable-xprint --disable-selinux -$(package)_config_opts += --disable-xtest --disable-xv --disable-xvmc -endef - -define $(package)_preprocess_cmds - cp -f $(BASEDIR)/config.guess $(BASEDIR)/config.sub build-aux && \ - patch -p1 -i $($(package)_patch_dir)/remove_pthread_stubs.patch -endef - -define $(package)_config_cmds - $($(package)_autoconf) -endef - -define $(package)_build_cmds - $(MAKE) -endef - -define $(package)_stage_cmds - $(MAKE) DESTDIR=$($(package)_staging_dir) install -endef - -define $(package)_postprocess_cmds - rm -rf share lib/*.la -endef diff --git a/depends/packages/libxcb_util.mk b/depends/packages/libxcb_util.mk deleted file mode 100644 index 284e8ca9eb..0000000000 --- a/depends/packages/libxcb_util.mk +++ /dev/null @@ -1,32 +0,0 @@ -package=libxcb_util -$(package)_version=0.4.0 -$(package)_download_path=https://xcb.freedesktop.org/dist -$(package)_file_name=xcb-util-$($(package)_version).tar.gz -$(package)_sha256_hash=0ed0934e2ef4ddff53fcc70fc64fb16fe766cd41ee00330312e20a985fd927a7 -$(package)_dependencies=libxcb - -define $(package)_set_vars -$(package)_config_opts = --disable-shared --disable-devel-docs --without-doxygen -$(package)_config_opts += --disable-dependency-tracking --enable-option-checking -$(package)_config_opts += --with-pic -endef - -define $(package)_preprocess_cmds - cp -f $(BASEDIR)/config.guess $(BASEDIR)/config.sub . -endef - -define $(package)_config_cmds - $($(package)_autoconf) -endef - -define $(package)_build_cmds - $(MAKE) -endef - -define $(package)_stage_cmds - $(MAKE) DESTDIR=$($(package)_staging_dir) install -endef - -define $(package)_postprocess_cmds - rm -rf share/man share/doc lib/*.la -endef diff --git a/depends/packages/libxcb_util_image.mk b/depends/packages/libxcb_util_image.mk deleted file mode 100644 index 2228250fec..0000000000 --- a/depends/packages/libxcb_util_image.mk +++ /dev/null @@ -1,31 +0,0 @@ -package=libxcb_util_image -$(package)_version=0.4.0 -$(package)_download_path=https://xcb.freedesktop.org/dist -$(package)_file_name=xcb-util-image-$($(package)_version).tar.gz -$(package)_sha256_hash=cb2c86190cf6216260b7357a57d9100811bb6f78c24576a3a5bfef6ad3740a42 -$(package)_dependencies=libxcb libxcb_util - -define $(package)_set_vars -$(package)_config_opts=--disable-static --disable-devel-docs --without-doxygen -$(package)_config_opts+= --disable-dependency-tracking --enable-option-checking -endef - -define $(package)_preprocess_cmds - cp -f $(BASEDIR)/config.guess $(BASEDIR)/config.sub . -endef - -define $(package)_config_cmds - $($(package)_autoconf) -endef - -define $(package)_build_cmds - $(MAKE) -endef - -define $(package)_stage_cmds - $(MAKE) DESTDIR=$($(package)_staging_dir) install -endef - -define $(package)_postprocess_cmds - rm -rf share/man share/doc lib/*.la -endef diff --git a/depends/packages/libxcb_util_keysyms.mk b/depends/packages/libxcb_util_keysyms.mk deleted file mode 100644 index 56bc33d258..0000000000 --- a/depends/packages/libxcb_util_keysyms.mk +++ /dev/null @@ -1,31 +0,0 @@ -package=libxcb_util_keysyms -$(package)_version=0.4.0 -$(package)_download_path=https://xcb.freedesktop.org/dist -$(package)_file_name=xcb-util-keysyms-$($(package)_version).tar.gz -$(package)_sha256_hash=0807cf078fbe38489a41d755095c58239e1b67299f14460dec2ec811e96caa96 -$(package)_dependencies=libxcb xproto - -define $(package)_set_vars -$(package)_config_opts=--disable-static --disable-devel-docs --without-doxygen -$(package)_config_opts += --disable-dependency-tracking --enable-option-checking -endef - -define $(package)_preprocess_cmds - cp -f $(BASEDIR)/config.guess $(BASEDIR)/config.sub . -endef - -define $(package)_config_cmds - $($(package)_autoconf) -endef - -define $(package)_build_cmds - $(MAKE) -endef - -define $(package)_stage_cmds - $(MAKE) DESTDIR=$($(package)_staging_dir) install -endef - -define $(package)_postprocess_cmds - rm -rf share/man share/doc lib/*.la -endef diff --git a/depends/packages/libxcb_util_render.mk b/depends/packages/libxcb_util_render.mk deleted file mode 100644 index ee2883feda..0000000000 --- a/depends/packages/libxcb_util_render.mk +++ /dev/null @@ -1,31 +0,0 @@ -package=libxcb_util_render -$(package)_version=0.3.9 -$(package)_download_path=https://xcb.freedesktop.org/dist -$(package)_file_name=xcb-util-renderutil-$($(package)_version).tar.gz -$(package)_sha256_hash=55eee797e3214fe39d0f3f4d9448cc53cffe06706d108824ea37bb79fcedcad5 -$(package)_dependencies=libxcb - -define $(package)_set_vars -$(package)_config_opts=--disable-static --disable-devel-docs --without-doxygen -$(package)_config_opts += --disable-dependency-tracking --enable-option-checking -endef - -define $(package)_preprocess_cmds - cp -f $(BASEDIR)/config.guess $(BASEDIR)/config.sub . -endef - -define $(package)_config_cmds - $($(package)_autoconf) -endef - -define $(package)_build_cmds - $(MAKE) -endef - -define $(package)_stage_cmds - $(MAKE) DESTDIR=$($(package)_staging_dir) install -endef - -define $(package)_postprocess_cmds - rm -rf share/man share/doc lib/*.la -endef diff --git a/depends/packages/libxcb_util_wm.mk b/depends/packages/libxcb_util_wm.mk deleted file mode 100644 index a68fd23f8a..0000000000 --- a/depends/packages/libxcb_util_wm.mk +++ /dev/null @@ -1,31 +0,0 @@ -package=libxcb_util_wm -$(package)_version=0.4.1 -$(package)_download_path=https://xcb.freedesktop.org/dist -$(package)_file_name=xcb-util-wm-$($(package)_version).tar.gz -$(package)_sha256_hash=038b39c4bdc04a792d62d163ba7908f4bb3373057208c07110be73c1b04b8334 -$(package)_dependencies=libxcb - -define $(package)_set_vars -$(package)_config_opts=--disable-static --disable-devel-docs --without-doxygen -$(package)_config_opts += --disable-dependency-tracking --enable-option-checking -endef - -define $(package)_preprocess_cmds - cp -f $(BASEDIR)/config.guess $(BASEDIR)/config.sub . -endef - -define $(package)_config_cmds - $($(package)_autoconf) -endef - -define $(package)_build_cmds - $(MAKE) -endef - -define $(package)_stage_cmds - $(MAKE) DESTDIR=$($(package)_staging_dir) install -endef - -define $(package)_postprocess_cmds - rm -rf share/man share/doc lib/*.la -endef diff --git a/depends/packages/libxkbcommon.mk b/depends/packages/libxkbcommon.mk deleted file mode 100644 index 90409819dc..0000000000 --- a/depends/packages/libxkbcommon.mk +++ /dev/null @@ -1,36 +0,0 @@ -package=libxkbcommon -$(package)_version=0.8.4 -$(package)_download_path=https://xkbcommon.org/download/ -$(package)_file_name=$(package)-$($(package)_version).tar.xz -$(package)_sha256_hash=60ddcff932b7fd352752d51a5c4f04f3d0403230a584df9a2e0d5ed87c486c8b -$(package)_dependencies=libxcb - -# This package explicitly enables -Werror=array-bounds, which causes build failures -# with GCC 12.1+. Work around that by turning errors back into warnings. -# This workaround would be dropped if the package was updated, as that would require -# a different build system (Meson) -define $(package)_set_vars -$(package)_config_opts = --enable-option-checking --disable-dependency-tracking -$(package)_config_opts += --disable-static --disable-docs -$(package)_cflags += -Wno-error=array-bounds -endef - -define $(package)_preprocess_cmds - cp -f $(BASEDIR)/config.guess $(BASEDIR)/config.sub build-aux -endef - -define $(package)_config_cmds - $($(package)_autoconf) -endef - -define $(package)_build_cmds - $(MAKE) -endef - -define $(package)_stage_cmds - $(MAKE) DESTDIR=$($(package)_staging_dir) install -endef - -define $(package)_postprocess_cmds - rm lib/*.la -endef diff --git a/depends/packages/miniupnpc.mk b/depends/packages/miniupnpc.mk deleted file mode 100644 index 341031b5f8..0000000000 --- a/depends/packages/miniupnpc.mk +++ /dev/null @@ -1,31 +0,0 @@ -package=miniupnpc -$(package)_version=2.2.7 -$(package)_download_path=http://miniupnp.free.fr/files/ -$(package)_file_name=$(package)-$($(package)_version).tar.gz -$(package)_sha256_hash=b0c3a27056840fd0ec9328a5a9bac3dc5e0ec6d2e8733349cf577b0aa1e70ac1 -$(package)_patches=dont_leak_info.patch cmake_get_src_addr.patch fix_windows_snprintf.patch -$(package)_build_subdir=build - -define $(package)_set_vars -$(package)_config_opts = -DUPNPC_BUILD_SAMPLE=OFF -DUPNPC_BUILD_SHARED=OFF -$(package)_config_opts += -DUPNPC_BUILD_STATIC=ON -DUPNPC_BUILD_TESTS=OFF -$(package)_config_opts_mingw32 += -DMINIUPNPC_TARGET_WINDOWS_VERSION=0x0601 -endef - -define $(package)_preprocess_cmds - patch -p1 < $($(package)_patch_dir)/dont_leak_info.patch && \ - patch -p1 < $($(package)_patch_dir)/cmake_get_src_addr.patch && \ - patch -p1 < $($(package)_patch_dir)/fix_windows_snprintf.patch -endef - -define $(package)_config_cmds - $($(package)_cmake) -S .. -B . -endef - -define $(package)_build_cmds - $(MAKE) -endef - -define $(package)_stage_cmds - cmake --install . --prefix $($(package)_staging_prefix_dir) -endef diff --git a/depends/packages/native_capnp.mk b/depends/packages/native_capnp.mk deleted file mode 100644 index 484e78d5d9..0000000000 --- a/depends/packages/native_capnp.mk +++ /dev/null @@ -1,28 +0,0 @@ -package=native_capnp -$(package)_version=1.0.1 -$(package)_download_path=https://capnproto.org/ -$(package)_download_file=capnproto-c++-$($(package)_version).tar.gz -$(package)_file_name=capnproto-cxx-$($(package)_version).tar.gz -$(package)_sha256_hash=0f7f4b8a76a2cdb284fddef20de8306450df6dd031a47a15ac95bc43c3358e09 - -define $(package)_set_vars - $(package)_config_opts := -DBUILD_TESTING=OFF - $(package)_config_opts += -DWITH_OPENSSL=OFF - $(package)_config_opts += -DWITH_ZLIB=OFF -endef - -define $(package)_config_cmds - $($(package)_cmake) . -endef - -define $(package)_build_cmds - $(MAKE) -endef - -define $(package)_stage_cmds - $(MAKE) DESTDIR=$($(package)_staging_dir) install -endef - -define $(package)_postprocess_cmds - rm -rf lib/pkgconfig -endef diff --git a/depends/packages/native_libmultiprocess.mk b/depends/packages/native_libmultiprocess.mk deleted file mode 100644 index bcdb1f9e7c..0000000000 --- a/depends/packages/native_libmultiprocess.mk +++ /dev/null @@ -1,18 +0,0 @@ -package=native_libmultiprocess -$(package)_version=8da797c5f1644df1bffd84d10c1ae9836dc70d60 -$(package)_download_path=https://github.com/chaincodelabs/libmultiprocess/archive -$(package)_file_name=$($(package)_version).tar.gz -$(package)_sha256_hash=030f4d393d2ac9deba98d2e1973e22fc439ffc009d5f8ae3225c90639f86beb0 -$(package)_dependencies=native_capnp - -define $(package)_config_cmds - $($(package)_cmake) . -endef - -define $(package)_build_cmds - $(MAKE) -endef - -define $(package)_stage_cmds - $(MAKE) DESTDIR=$($(package)_staging_dir) install-bin -endef diff --git a/depends/packages/packages.mk b/depends/packages/packages.mk deleted file mode 100644 index 01ed0d7a92..0000000000 --- a/depends/packages/packages.mk +++ /dev/null @@ -1,26 +0,0 @@ -packages:= - -boost_packages = boost - -libevent_packages = libevent - -qrencode_linux_packages = qrencode -qrencode_darwin_packages = qrencode -qrencode_mingw32_packages = qrencode - -qt_linux_packages:=qt expat libxcb xcb_proto libXau xproto freetype fontconfig libxkbcommon libxcb_util libxcb_util_render libxcb_util_keysyms libxcb_util_image libxcb_util_wm -qt_darwin_packages=qt -qt_mingw32_packages=qt - -bdb_packages=bdb -sqlite_packages=sqlite - -zmq_packages=zeromq - -upnp_packages=miniupnpc -natpmp_packages=libnatpmp - -multiprocess_packages = libmultiprocess capnp -multiprocess_native_packages = native_libmultiprocess native_capnp - -usdt_linux_packages=systemtap diff --git a/depends/packages/qrencode.mk b/depends/packages/qrencode.mk deleted file mode 100644 index 4216646063..0000000000 --- a/depends/packages/qrencode.mk +++ /dev/null @@ -1,30 +0,0 @@ -package=qrencode -$(package)_version=4.1.1 -$(package)_download_path=https://fukuchi.org/works/qrencode/ -$(package)_file_name=$(package)-$($(package)_version).tar.gz -$(package)_sha256_hash=da448ed4f52aba6bcb0cd48cac0dd51b8692bccc4cd127431402fca6f8171e8e -$(package)_patches=cmake_fixups.patch - -define $(package)_set_vars -$(package)_config_opts := -DWITH_TOOLS=NO -DWITH_TESTS=NO -DGPROF=OFF -DCOVERAGE=OFF -$(package)_config_opts += -DCMAKE_DISABLE_FIND_PACKAGE_PNG=TRUE -DWITHOUT_PNG=ON -$(package)_config_opts += -DCMAKE_DISABLE_FIND_PACKAGE_ICONV=TRUE -$(package)_cflags += -Wno-int-conversion -Wno-implicit-function-declaration -endef - -define $(package)_preprocess_cmds - patch -p1 < $($(package)_patch_dir)/cmake_fixups.patch -endef - - -define $(package)_config_cmds - $($(package)_cmake) -S . -B . -endef - -define $(package)_build_cmds - $(MAKE) -endef - -define $(package)_stage_cmds - $(MAKE) DESTDIR=$($(package)_staging_dir) install -endef diff --git a/depends/packages/qt.mk b/depends/packages/qt.mk deleted file mode 100644 index d35139dd2d..0000000000 --- a/depends/packages/qt.mk +++ /dev/null @@ -1,275 +0,0 @@ -package=qt -$(package)_version=5.15.14 -$(package)_download_path=https://download.qt.io/official_releases/qt/5.15/$($(package)_version)/submodules -$(package)_suffix=everywhere-opensource-src-$($(package)_version).tar.xz -$(package)_file_name=qtbase-$($(package)_suffix) -$(package)_sha256_hash=500d3b390048e9538c28b5f523dfea6936f9c2e10d24ab46580ff57d430b98be -$(package)_linux_dependencies=freetype fontconfig libxcb libxkbcommon libxcb_util libxcb_util_render libxcb_util_keysyms libxcb_util_image libxcb_util_wm -$(package)_qt_libs=corelib network widgets gui plugins testlib -$(package)_linguist_tools = lrelease lupdate lconvert -$(package)_patches = qt.pro -$(package)_patches += qttools_src.pro -$(package)_patches += mac-qmake.conf -$(package)_patches += fix_qt_pkgconfig.patch -$(package)_patches += no-xlib.patch -$(package)_patches += dont_hardcode_pwd.patch -$(package)_patches += qtbase-moc-ignore-gcc-macro.patch -$(package)_patches += no_warnings_for_symbols.patch -$(package)_patches += rcc_hardcode_timestamp.patch -$(package)_patches += duplicate_lcqpafonts.patch -$(package)_patches += guix_cross_lib_path.patch -$(package)_patches += fix-macos-linker.patch -$(package)_patches += memory_resource.patch -$(package)_patches += clang_18_libpng.patch -$(package)_patches += utc_from_string_no_optimize.patch -$(package)_patches += windows_lto.patch -$(package)_patches += zlib-timebits64.patch - -$(package)_qttranslations_file_name=qttranslations-$($(package)_suffix) -$(package)_qttranslations_sha256_hash=5b94d1a11b566908622fcca2f8b799744d2f8a68da20be4caa5953ed63b10489 - -$(package)_qttools_file_name=qttools-$($(package)_suffix) -$(package)_qttools_sha256_hash=12061a85baf5f4de8fbc795e1d3872b706f340211b9e70962caeffc6f5e89563 - -$(package)_extra_sources = $($(package)_qttranslations_file_name) -$(package)_extra_sources += $($(package)_qttools_file_name) - -define $(package)_set_vars -$(package)_config_env = QT_MAC_SDK_NO_VERSION_CHECK=1 -$(package)_config_opts_release = -release -$(package)_config_opts_release += -silent -$(package)_config_opts_debug = -debug -$(package)_config_opts_debug += -optimized-tools -$(package)_config_opts += -bindir $(build_prefix)/bin -$(package)_config_opts += -c++std c++2a -$(package)_config_opts += -confirm-license -$(package)_config_opts += -hostprefix $(build_prefix) -$(package)_config_opts += -no-compile-examples -$(package)_config_opts += -no-cups -$(package)_config_opts += -no-egl -$(package)_config_opts += -no-eglfs -$(package)_config_opts += -no-evdev -$(package)_config_opts += -no-gif -$(package)_config_opts += -no-glib -$(package)_config_opts += -no-icu -$(package)_config_opts += -no-ico -$(package)_config_opts += -no-iconv -$(package)_config_opts += -no-kms -$(package)_config_opts += -no-linuxfb -$(package)_config_opts += -no-libjpeg -$(package)_config_opts += -no-libproxy -$(package)_config_opts += -no-libudev -$(package)_config_opts += -no-mimetype-database -$(package)_config_opts += -no-mtdev -$(package)_config_opts += -no-openssl -$(package)_config_opts += -no-openvg -$(package)_config_opts += -no-reduce-relocations -$(package)_config_opts += -no-schannel -$(package)_config_opts += -no-sctp -$(package)_config_opts += -no-securetransport -$(package)_config_opts += -no-sql-db2 -$(package)_config_opts += -no-sql-ibase -$(package)_config_opts += -no-sql-oci -$(package)_config_opts += -no-sql-tds -$(package)_config_opts += -no-sql-mysql -$(package)_config_opts += -no-sql-odbc -$(package)_config_opts += -no-sql-psql -$(package)_config_opts += -no-sql-sqlite -$(package)_config_opts += -no-sql-sqlite2 -$(package)_config_opts += -no-system-proxies -$(package)_config_opts += -no-use-gold-linker -$(package)_config_opts += -no-zstd -$(package)_config_opts += -nomake examples -$(package)_config_opts += -nomake tests -$(package)_config_opts += -nomake tools -$(package)_config_opts += -opensource -$(package)_config_opts += -pkg-config -$(package)_config_opts += -prefix $(host_prefix) -$(package)_config_opts += -qt-libpng -$(package)_config_opts += -qt-pcre -$(package)_config_opts += -qt-harfbuzz -$(package)_config_opts += -qt-zlib -$(package)_config_opts += -static -$(package)_config_opts += -v -$(package)_config_opts += -no-feature-bearermanagement -$(package)_config_opts += -no-feature-colordialog -$(package)_config_opts += -no-feature-commandlineparser -$(package)_config_opts += -no-feature-concurrent -$(package)_config_opts += -no-feature-dial -$(package)_config_opts += -no-feature-fontcombobox -$(package)_config_opts += -no-feature-ftp -$(package)_config_opts += -no-feature-http -$(package)_config_opts += -no-feature-image_heuristic_mask -$(package)_config_opts += -no-feature-keysequenceedit -$(package)_config_opts += -no-feature-lcdnumber -$(package)_config_opts += -no-feature-networkdiskcache -$(package)_config_opts += -no-feature-networkproxy -$(package)_config_opts += -no-feature-pdf -$(package)_config_opts += -no-feature-printdialog -$(package)_config_opts += -no-feature-printer -$(package)_config_opts += -no-feature-printpreviewdialog -$(package)_config_opts += -no-feature-printpreviewwidget -$(package)_config_opts += -no-feature-sessionmanager -$(package)_config_opts += -no-feature-socks5 -$(package)_config_opts += -no-feature-sql -$(package)_config_opts += -no-feature-sqlmodel -$(package)_config_opts += -no-feature-statemachine -$(package)_config_opts += -no-feature-syntaxhighlighter -$(package)_config_opts += -no-feature-textbrowser -$(package)_config_opts += -no-feature-textmarkdownwriter -$(package)_config_opts += -no-feature-textodfwriter -$(package)_config_opts += -no-feature-topleveldomain -$(package)_config_opts += -no-feature-udpsocket -$(package)_config_opts += -no-feature-undocommand -$(package)_config_opts += -no-feature-undogroup -$(package)_config_opts += -no-feature-undostack -$(package)_config_opts += -no-feature-undoview -$(package)_config_opts += -no-feature-vnc -$(package)_config_opts += -no-feature-wizard -$(package)_config_opts += -no-feature-xml - -$(package)_config_opts_darwin = -no-dbus -$(package)_config_opts_darwin += -no-opengl -$(package)_config_opts_darwin += -pch -$(package)_config_opts_darwin += -no-feature-corewlan -$(package)_config_opts_darwin += -no-freetype -$(package)_config_opts_darwin += QMAKE_MACOSX_DEPLOYMENT_TARGET=$(OSX_MIN_VERSION) - -ifneq ($(build_os),darwin) -$(package)_config_opts_darwin += -xplatform macx-clang-linux -$(package)_config_opts_darwin += -device-option MAC_SDK_PATH=$(OSX_SDK) -$(package)_config_opts_darwin += -device-option MAC_SDK_VERSION=$(OSX_SDK_VERSION) -$(package)_config_opts_darwin += -device-option CROSS_COMPILE="llvm-" -$(package)_config_opts_darwin += -device-option MAC_TARGET=$(host) -$(package)_config_opts_darwin += -device-option XCODE_VERSION=$(XCODE_VERSION) -endif - -ifneq ($(build_arch),$(host_arch)) -$(package)_config_opts_aarch64_darwin += -device-option QMAKE_APPLE_DEVICE_ARCHS=arm64 -$(package)_config_opts_x86_64_darwin += -device-option QMAKE_APPLE_DEVICE_ARCHS=x86_64 -endif - -$(package)_config_opts_linux = -xcb -$(package)_config_opts_linux += -no-xcb-xlib -$(package)_config_opts_linux += -no-feature-xlib -$(package)_config_opts_linux += -system-freetype -$(package)_config_opts_linux += -fontconfig -$(package)_config_opts_linux += -no-opengl -$(package)_config_opts_linux += -no-feature-vulkan -$(package)_config_opts_linux += -dbus-runtime -ifneq ($(LTO),) -$(package)_config_opts_linux += -ltcg -endif - -ifneq (,$(findstring clang,$($(package)_cxx))) - ifneq (,$(findstring -stdlib=libc++,$($(package)_cxx))) - $(package)_config_opts_linux += -platform linux-clang-libc++ -xplatform linux-clang-libc++ - else - $(package)_config_opts_linux += -platform linux-clang -xplatform linux-clang - endif -else - $(package)_config_opts_linux += -platform linux-g++ -xplatform bitcoin-linux-g++ -endif - -$(package)_config_opts_mingw32 = -no-opengl -$(package)_config_opts_mingw32 += -no-dbus -$(package)_config_opts_mingw32 += -no-freetype -$(package)_config_opts_mingw32 += -xplatform win32-g++ -$(package)_config_opts_mingw32 += "QMAKE_CFLAGS = '$($(package)_cflags) $($(package)_cppflags)'" -$(package)_config_opts_mingw32 += "QMAKE_CXX = '$($(package)_cxx)'" -$(package)_config_opts_mingw32 += "QMAKE_CXXFLAGS = '$($(package)_cxxflags) $($(package)_cppflags)'" -$(package)_config_opts_mingw32 += "QMAKE_LINK = '$($(package)_cxx)'" -$(package)_config_opts_mingw32 += "QMAKE_LFLAGS = '$($(package)_ldflags)'" -$(package)_config_opts_mingw32 += "QMAKE_LIB = '$($(package)_ar) rc'" -$(package)_config_opts_mingw32 += -device-option CROSS_COMPILE="$(host)-" -$(package)_config_opts_mingw32 += -pch -ifneq ($(LTO),) -$(package)_config_opts_mingw32 += -ltcg -endif -endef - -define $(package)_fetch_cmds -$(call fetch_file,$(package),$($(package)_download_path),$($(package)_download_file),$($(package)_file_name),$($(package)_sha256_hash)) && \ -$(call fetch_file,$(package),$($(package)_download_path),$($(package)_qttranslations_file_name),$($(package)_qttranslations_file_name),$($(package)_qttranslations_sha256_hash)) && \ -$(call fetch_file,$(package),$($(package)_download_path),$($(package)_qttools_file_name),$($(package)_qttools_file_name),$($(package)_qttools_sha256_hash)) -endef - -define $(package)_extract_cmds - mkdir -p $($(package)_extract_dir) && \ - echo "$($(package)_sha256_hash) $($(package)_source)" > $($(package)_extract_dir)/.$($(package)_file_name).hash && \ - echo "$($(package)_qttranslations_sha256_hash) $($(package)_source_dir)/$($(package)_qttranslations_file_name)" >> $($(package)_extract_dir)/.$($(package)_file_name).hash && \ - echo "$($(package)_qttools_sha256_hash) $($(package)_source_dir)/$($(package)_qttools_file_name)" >> $($(package)_extract_dir)/.$($(package)_file_name).hash && \ - $(build_SHA256SUM) -c $($(package)_extract_dir)/.$($(package)_file_name).hash && \ - mkdir qtbase && \ - $(build_TAR) --no-same-owner --strip-components=1 -xf $($(package)_source) -C qtbase && \ - mkdir qttranslations && \ - $(build_TAR) --no-same-owner --strip-components=1 -xf $($(package)_source_dir)/$($(package)_qttranslations_file_name) -C qttranslations && \ - mkdir qttools && \ - $(build_TAR) --no-same-owner --strip-components=1 -xf $($(package)_source_dir)/$($(package)_qttools_file_name) -C qttools -endef - -# Preprocessing steps work as follows: -# -# 1. Apply our patches to the extracted source. See each patch for more info. -# -# 2. Create a macOS-Clang-Linux mkspec using our mac-qmake.conf. -# -# 3. After making a copy of the mkspec for the linux-arm-gnueabi host, named -# bitcoin-linux-g++, replace tool names with $($($(package)_type)_TOOL). -# -# 4. Put our C, CXX and LD FLAGS into gcc-base.conf. Only used for non-host builds. -# -# 5. In clang.conf, swap out clang & clang++, for our compiler + flags. See #17466. -define $(package)_preprocess_cmds - cp $($(package)_patch_dir)/qt.pro qt.pro && \ - cp $($(package)_patch_dir)/qttools_src.pro qttools/src/src.pro && \ - patch -p1 -i $($(package)_patch_dir)/fix-macos-linker.patch && \ - patch -p1 -i $($(package)_patch_dir)/dont_hardcode_pwd.patch && \ - patch -p1 -i $($(package)_patch_dir)/fix_qt_pkgconfig.patch && \ - patch -p1 -i $($(package)_patch_dir)/no-xlib.patch && \ - patch -p1 -i $($(package)_patch_dir)/qtbase-moc-ignore-gcc-macro.patch && \ - patch -p1 -i $($(package)_patch_dir)/memory_resource.patch && \ - patch -p1 -i $($(package)_patch_dir)/no_warnings_for_symbols.patch && \ - patch -p1 -i $($(package)_patch_dir)/clang_18_libpng.patch && \ - patch -p1 -i $($(package)_patch_dir)/rcc_hardcode_timestamp.patch && \ - patch -p1 -i $($(package)_patch_dir)/duplicate_lcqpafonts.patch && \ - patch -p1 -i $($(package)_patch_dir)/utc_from_string_no_optimize.patch && \ - patch -p1 -i $($(package)_patch_dir)/guix_cross_lib_path.patch && \ - patch -p1 -i $($(package)_patch_dir)/windows_lto.patch && \ - patch -p1 -i $($(package)_patch_dir)/zlib-timebits64.patch && \ - mkdir -p qtbase/mkspecs/macx-clang-linux &&\ - cp -f qtbase/mkspecs/macx-clang/qplatformdefs.h qtbase/mkspecs/macx-clang-linux/ &&\ - cp -f $($(package)_patch_dir)/mac-qmake.conf qtbase/mkspecs/macx-clang-linux/qmake.conf && \ - cp -r qtbase/mkspecs/linux-arm-gnueabi-g++ qtbase/mkspecs/bitcoin-linux-g++ && \ - sed -i.old "s|arm-linux-gnueabi-gcc|$($($(package)_type)_CC)|" qtbase/mkspecs/bitcoin-linux-g++/qmake.conf && \ - sed -i.old "s|arm-linux-gnueabi-g++|$($($(package)_type)_CXX)|" qtbase/mkspecs/bitcoin-linux-g++/qmake.conf && \ - sed -i.old "s|arm-linux-gnueabi-ar|$($($(package)_type)_AR)|" qtbase/mkspecs/bitcoin-linux-g++/qmake.conf && \ - sed -i.old "s|arm-linux-gnueabi-objcopy|$($($(package)_type)_OBJCOPY)|" qtbase/mkspecs/bitcoin-linux-g++/qmake.conf && \ - sed -i.old "s|arm-linux-gnueabi-nm|$($($(package)_type)_NM)|" qtbase/mkspecs/bitcoin-linux-g++/qmake.conf && \ - sed -i.old "s|arm-linux-gnueabi-strip|$($($(package)_type)_STRIP)|" qtbase/mkspecs/bitcoin-linux-g++/qmake.conf && \ - echo "!host_build: QMAKE_CFLAGS += $($(package)_cflags) $($(package)_cppflags)" >> qtbase/mkspecs/common/gcc-base.conf && \ - echo "!host_build: QMAKE_CXXFLAGS += $($(package)_cxxflags) $($(package)_cppflags)" >> qtbase/mkspecs/common/gcc-base.conf && \ - echo "!host_build: QMAKE_LFLAGS += $($(package)_ldflags)" >> qtbase/mkspecs/common/gcc-base.conf && \ - sed -i.old "s|QMAKE_CC = \$$$$\$$$${CROSS_COMPILE}clang|QMAKE_CC = $($(package)_cc)|" qtbase/mkspecs/common/clang.conf && \ - sed -i.old "s|QMAKE_CXX = \$$$$\$$$${CROSS_COMPILE}clang++|QMAKE_CXX = $($(package)_cxx)|" qtbase/mkspecs/common/clang.conf -endef - -define $(package)_config_cmds - cd qtbase && \ - ./configure -top-level $($(package)_config_opts) -endef - -define $(package)_build_cmds - $(MAKE) -endef - -define $(package)_stage_cmds - $(MAKE) -C qtbase/src INSTALL_ROOT=$($(package)_staging_dir) $(addsuffix -install_subtargets,$(addprefix sub-,$($(package)_qt_libs))) && \ - $(MAKE) -C qttools/src/linguist INSTALL_ROOT=$($(package)_staging_dir) $(addsuffix -install_subtargets,$(addprefix sub-,$($(package)_linguist_tools))) && \ - $(MAKE) -C qttranslations INSTALL_ROOT=$($(package)_staging_dir) install_subtargets -endef - -define $(package)_postprocess_cmds - rm -rf native/mkspecs/ native/lib/ lib/cmake/ && \ - rm -f lib/lib*.la -endef diff --git a/depends/packages/sqlite.mk b/depends/packages/sqlite.mk deleted file mode 100644 index 15bc0f4d7a..0000000000 --- a/depends/packages/sqlite.mk +++ /dev/null @@ -1,35 +0,0 @@ -package=sqlite -$(package)_version=3380500 -$(package)_download_path=https://sqlite.org/2022/ -$(package)_file_name=sqlite-autoconf-$($(package)_version).tar.gz -$(package)_sha256_hash=5af07de982ba658fd91a03170c945f99c971f6955bc79df3266544373e39869c - -define $(package)_set_vars -$(package)_config_opts=--disable-shared --disable-readline --disable-dynamic-extensions --enable-option-checking -$(package)_config_opts+= --disable-rtree --disable-fts4 --disable-fts5 -# We avoid using `--enable-debug` because it overrides CFLAGS, a behavior we want to prevent. -$(package)_cppflags_debug += -DSQLITE_DEBUG -$(package)_cppflags+=-DSQLITE_DQS=0 -DSQLITE_DEFAULT_MEMSTATUS=0 -DSQLITE_OMIT_DEPRECATED -$(package)_cppflags+=-DSQLITE_OMIT_SHARED_CACHE -DSQLITE_OMIT_JSON -DSQLITE_LIKE_DOESNT_MATCH_BLOBS -$(package)_cppflags+=-DSQLITE_OMIT_DECLTYPE -DSQLITE_OMIT_PROGRESS_CALLBACK -DSQLITE_OMIT_AUTOINIT -endef - -define $(package)_preprocess_cmds - cp -f $(BASEDIR)/config.guess $(BASEDIR)/config.sub . -endef - -define $(package)_config_cmds - $($(package)_autoconf) -endef - -define $(package)_build_cmds - $(MAKE) libsqlite3.la -endef - -define $(package)_stage_cmds - $(MAKE) DESTDIR=$($(package)_staging_dir) install-libLTLIBRARIES install-includeHEADERS install-pkgconfigDATA -endef - -define $(package)_postprocess_cmds - rm lib/*.la -endef diff --git a/depends/packages/systemtap.mk b/depends/packages/systemtap.mk deleted file mode 100644 index c912e18c31..0000000000 --- a/depends/packages/systemtap.mk +++ /dev/null @@ -1,12 +0,0 @@ -package=systemtap -$(package)_version=4.8 -$(package)_download_path=https://sourceware.org/ftp/systemtap/releases/ -$(package)_file_name=$(package)-$($(package)_version).tar.gz -$(package)_sha256_hash=cbd50a4eba5b261394dc454c12448ddec73e55e6742fda7f508f9fbc1331c223 -$(package)_patches=remove_SDT_ASM_SECTION_AUTOGROUP_SUPPORT_check.patch - -define $(package)_preprocess_cmds - patch -p1 < $($(package)_patch_dir)/remove_SDT_ASM_SECTION_AUTOGROUP_SUPPORT_check.patch && \ - mkdir -p $($(package)_staging_prefix_dir)/include/sys && \ - cp includes/sys/sdt.h $($(package)_staging_prefix_dir)/include/sys/sdt.h -endef diff --git a/depends/packages/xcb_proto.mk b/depends/packages/xcb_proto.mk deleted file mode 100644 index 6e1c5a10a8..0000000000 --- a/depends/packages/xcb_proto.mk +++ /dev/null @@ -1,21 +0,0 @@ -package=xcb_proto -$(package)_version=1.15.2 -$(package)_download_path=https://xorg.freedesktop.org/archive/individual/proto -$(package)_file_name=xcb-proto-$($(package)_version).tar.xz -$(package)_sha256_hash=7072beb1f680a2fe3f9e535b797c146d22528990c72f63ddb49d2f350a3653ed - -define $(package)_config_cmds - $($(package)_autoconf) -endef - -define $(package)_build_cmds - $(MAKE) -endef - -define $(package)_stage_cmds - $(MAKE) DESTDIR=$($(package)_staging_dir) install -endef - -define $(package)_postprocess_cmds - rm -rf lib/python*/site-packages/xcbgen/__pycache__ -endef diff --git a/depends/packages/xproto.mk b/depends/packages/xproto.mk deleted file mode 100644 index 29c349a21b..0000000000 --- a/depends/packages/xproto.mk +++ /dev/null @@ -1,26 +0,0 @@ -package=xproto -$(package)_version=7.0.31 -$(package)_download_path=https://xorg.freedesktop.org/releases/individual/proto -$(package)_file_name=$(package)-$($(package)_version).tar.gz -$(package)_sha256_hash=6d755eaae27b45c5cc75529a12855fed5de5969b367ed05003944cf901ed43c7 - -define $(package)_set_vars -$(package)_config_opts=--without-fop --without-xmlto --without-xsltproc --disable-specs -$(package)_config_opts += --disable-dependency-tracking --enable-option-checking -endef - -define $(package)_preprocess_cmds - cp -f $(BASEDIR)/config.guess $(BASEDIR)/config.sub . -endef - -define $(package)_config_cmds - $($(package)_autoconf) -endef - -define $(package)_build_cmds - $(MAKE) -endef - -define $(package)_stage_cmds - $(MAKE) DESTDIR=$($(package)_staging_dir) install -endef diff --git a/depends/packages/zeromq.mk b/depends/packages/zeromq.mk deleted file mode 100644 index bfa5e97c60..0000000000 --- a/depends/packages/zeromq.mk +++ /dev/null @@ -1,36 +0,0 @@ -package=zeromq -$(package)_version=4.3.5 -$(package)_download_path=https://github.com/zeromq/libzmq/releases/download/v$($(package)_version)/ -$(package)_file_name=$(package)-$($(package)_version).tar.gz -$(package)_sha256_hash=6653ef5910f17954861fe72332e68b03ca6e4d9c7160eb3a8de5a5a913bfab43 -$(package)_patches=remove_libstd_link.patch - -define $(package)_set_vars - $(package)_config_opts = --without-docs --disable-shared --disable-valgrind - $(package)_config_opts += --disable-perf --disable-curve-keygen --disable-curve --disable-libbsd - $(package)_config_opts += --without-libsodium --without-libgssapi_krb5 --without-pgm --without-norm --without-vmci - $(package)_config_opts += --disable-libunwind --disable-radix-tree --without-gcov --disable-dependency-tracking - $(package)_config_opts += --disable-Werror --disable-drafts --enable-option-checking -endef - -define $(package)_preprocess_cmds - patch -p1 < $($(package)_patch_dir)/remove_libstd_link.patch -endef - -define $(package)_config_cmds - ./autogen.sh && \ - cp -f $(BASEDIR)/config.guess $(BASEDIR)/config.sub config && \ - $($(package)_autoconf) -endef - -define $(package)_build_cmds - $(MAKE) src/libzmq.la -endef - -define $(package)_stage_cmds - $(MAKE) DESTDIR=$($(package)_staging_dir) install-libLTLIBRARIES install-includeHEADERS install-pkgconfigDATA -endef - -define $(package)_postprocess_cmds - rm -rf bin share lib/*.la -endef diff --git a/depends/patches/bdb/clang_cxx_11.patch b/depends/patches/bdb/clang_cxx_11.patch deleted file mode 100644 index 58f7ddc7d5..0000000000 --- a/depends/patches/bdb/clang_cxx_11.patch +++ /dev/null @@ -1,147 +0,0 @@ -commit 3311d68f11d1697565401eee6efc85c34f022ea7 -Author: fanquake -Date: Mon Aug 17 20:03:56 2020 +0800 - - Fix C++11 compatibility - -diff --git a/dbinc/atomic.h b/dbinc/atomic.h -index 0034dcc..7c11d4a 100644 ---- a/dbinc/atomic.h -+++ b/dbinc/atomic.h -@@ -70,7 +70,7 @@ typedef struct { - * These have no memory barriers; the caller must include them when necessary. - */ - #define atomic_read(p) ((p)->value) --#define atomic_init(p, val) ((p)->value = (val)) -+#define atomic_init_db(p, val) ((p)->value = (val)) - - #ifdef HAVE_ATOMIC_SUPPORT - -@@ -144,7 +144,7 @@ typedef LONG volatile *interlocked_val; - #define atomic_inc(env, p) __atomic_inc(p) - #define atomic_dec(env, p) __atomic_dec(p) - #define atomic_compare_exchange(env, p, o, n) \ -- __atomic_compare_exchange((p), (o), (n)) -+ __atomic_compare_exchange_db((p), (o), (n)) - static inline int __atomic_inc(db_atomic_t *p) - { - int temp; -@@ -176,7 +176,7 @@ static inline int __atomic_dec(db_atomic_t *p) - * http://gcc.gnu.org/onlinedocs/gcc-4.1.0/gcc/Atomic-Builtins.html - * which configure could be changed to use. - */ --static inline int __atomic_compare_exchange( -+static inline int __atomic_compare_exchange_db( - db_atomic_t *p, atomic_value_t oldval, atomic_value_t newval) - { - atomic_value_t was; -@@ -206,7 +206,7 @@ static inline int __atomic_compare_exchange( - #define atomic_dec(env, p) (--(p)->value) - #define atomic_compare_exchange(env, p, oldval, newval) \ - (DB_ASSERT(env, atomic_read(p) == (oldval)), \ -- atomic_init(p, (newval)), 1) -+ atomic_init_db(p, (newval)), 1) - #else - #define atomic_inc(env, p) __atomic_inc(env, p) - #define atomic_dec(env, p) __atomic_dec(env, p) -diff --git a/mp/mp_fget.c b/mp/mp_fget.c -index 5fdee5a..0b75f57 100644 ---- a/mp/mp_fget.c -+++ b/mp/mp_fget.c -@@ -617,7 +617,7 @@ alloc: /* Allocate a new buffer header and data space. */ - - /* Initialize enough so we can call __memp_bhfree. */ - alloc_bhp->flags = 0; -- atomic_init(&alloc_bhp->ref, 1); -+ atomic_init_db(&alloc_bhp->ref, 1); - #ifdef DIAGNOSTIC - if ((uintptr_t)alloc_bhp->buf & (sizeof(size_t) - 1)) { - __db_errx(env, -@@ -911,7 +911,7 @@ alloc: /* Allocate a new buffer header and data space. */ - MVCC_MPROTECT(bhp->buf, mfp->stat.st_pagesize, - PROT_READ); - -- atomic_init(&alloc_bhp->ref, 1); -+ atomic_init_db(&alloc_bhp->ref, 1); - MUTEX_LOCK(env, alloc_bhp->mtx_buf); - alloc_bhp->priority = bhp->priority; - alloc_bhp->pgno = bhp->pgno; -diff --git a/mp/mp_mvcc.c b/mp/mp_mvcc.c -index 34467d2..f05aa0c 100644 ---- a/mp/mp_mvcc.c -+++ b/mp/mp_mvcc.c -@@ -276,7 +276,7 @@ __memp_bh_freeze(dbmp, infop, hp, bhp, need_frozenp) - #else - memcpy(frozen_bhp, bhp, SSZA(BH, buf)); - #endif -- atomic_init(&frozen_bhp->ref, 0); -+ atomic_init_db(&frozen_bhp->ref, 0); - if (mutex != MUTEX_INVALID) - frozen_bhp->mtx_buf = mutex; - else if ((ret = __mutex_alloc(env, MTX_MPOOL_BH, -@@ -428,7 +428,7 @@ __memp_bh_thaw(dbmp, infop, hp, frozen_bhp, alloc_bhp) - #endif - alloc_bhp->mtx_buf = mutex; - MUTEX_LOCK(env, alloc_bhp->mtx_buf); -- atomic_init(&alloc_bhp->ref, 1); -+ atomic_init_db(&alloc_bhp->ref, 1); - F_CLR(alloc_bhp, BH_FROZEN); - } - -diff --git a/mp/mp_region.c b/mp/mp_region.c -index e6cece9..ddbe906 100644 ---- a/mp/mp_region.c -+++ b/mp/mp_region.c -@@ -224,7 +224,7 @@ __memp_init(env, dbmp, reginfo_off, htab_buckets, max_nreg) - MTX_MPOOL_FILE_BUCKET, 0, &htab[i].mtx_hash)) != 0) - return (ret); - SH_TAILQ_INIT(&htab[i].hash_bucket); -- atomic_init(&htab[i].hash_page_dirty, 0); -+ atomic_init_db(&htab[i].hash_page_dirty, 0); - } - - /* -@@ -269,7 +269,7 @@ __memp_init(env, dbmp, reginfo_off, htab_buckets, max_nreg) - hp->mtx_hash = (mtx_base == MUTEX_INVALID) ? MUTEX_INVALID : - mtx_base + i; - SH_TAILQ_INIT(&hp->hash_bucket); -- atomic_init(&hp->hash_page_dirty, 0); -+ atomic_init_db(&hp->hash_page_dirty, 0); - #ifdef HAVE_STATISTICS - hp->hash_io_wait = 0; - hp->hash_frozen = hp->hash_thawed = hp->hash_frozen_freed = 0; -diff --git a/mutex/mut_method.c b/mutex/mut_method.c -index 2588763..5c6d516 100644 ---- a/mutex/mut_method.c -+++ b/mutex/mut_method.c -@@ -426,7 +426,7 @@ atomic_compare_exchange(env, v, oldval, newval) - MUTEX_LOCK(env, mtx); - ret = atomic_read(v) == oldval; - if (ret) -- atomic_init(v, newval); -+ atomic_init_db(v, newval); - MUTEX_UNLOCK(env, mtx); - - return (ret); -diff --git a/mutex/mut_tas.c b/mutex/mut_tas.c -index f3922e0..e40fcdf 100644 ---- a/mutex/mut_tas.c -+++ b/mutex/mut_tas.c -@@ -46,7 +46,7 @@ __db_tas_mutex_init(env, mutex, flags) - - #ifdef HAVE_SHARED_LATCHES - if (F_ISSET(mutexp, DB_MUTEX_SHARED)) -- atomic_init(&mutexp->sharecount, 0); -+ atomic_init_db(&mutexp->sharecount, 0); - else - #endif - if (MUTEX_INIT(&mutexp->tas)) { -@@ -486,7 +486,7 @@ __db_tas_mutex_unlock(env, mutex) - F_CLR(mutexp, DB_MUTEX_LOCKED); - /* Flush flag update before zeroing count */ - MEMBAR_EXIT(); -- atomic_init(&mutexp->sharecount, 0); -+ atomic_init_db(&mutexp->sharecount, 0); - } else { - DB_ASSERT(env, sharecount > 0); - MEMBAR_EXIT(); diff --git a/depends/patches/fontconfig/gperf_header_regen.patch b/depends/patches/fontconfig/gperf_header_regen.patch deleted file mode 100644 index b1a70d5fb1..0000000000 --- a/depends/patches/fontconfig/gperf_header_regen.patch +++ /dev/null @@ -1,24 +0,0 @@ -commit 7b6eb33ecd88768b28c67ce5d2d68a7eed5936b6 -Author: fanquake -Date: Tue Aug 25 14:34:53 2020 +0800 - - Remove rule that causes inadvertent header regeneration - - Otherwise the makefile will needlessly attempt to re-generate the - headers with gperf. This can be dropped once the upstream build is fixed. - - See #10851. - -diff --git a/src/Makefile.in b/src/Makefile.in -index f4626ad..4ae1b00 100644 ---- a/src/Makefile.in -+++ b/src/Makefile.in -@@ -912,7 +912,7 @@ - ' - > $@.tmp && \ - mv -f $@.tmp fcobjshash.gperf && touch $@ || ( $(RM) $@.tmp && false ) - --fcobjshash.h: Makefile fcobjshash.gperf -+fcobjshash.h: - $(AM_V_GEN) $(GPERF) --pic -m 100 fcobjshash.gperf > $@.tmp && \ - mv -f $@.tmp $@ || ( $(RM) $@.tmp && false ) - diff --git a/depends/patches/libevent/cmake_fixups.patch b/depends/patches/libevent/cmake_fixups.patch deleted file mode 100644 index d80c1a9489..0000000000 --- a/depends/patches/libevent/cmake_fixups.patch +++ /dev/null @@ -1,35 +0,0 @@ -cmake: set minimum version to 3.5 - -Fix generated pkg-config files, see -https://github.com/libevent/libevent/pull/1165. - ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -19,7 +19,7 @@ - # start libevent.sln - # - --cmake_minimum_required(VERSION 3.1 FATAL_ERROR) -+cmake_minimum_required(VERSION 3.5 FATAL_ERROR) - - if (POLICY CMP0054) - cmake_policy(SET CMP0054 NEW) -diff --git a/cmake/AddEventLibrary.cmake b/cmake/AddEventLibrary.cmake -index 04f5837e..d8ea42c4 100644 ---- a/cmake/AddEventLibrary.cmake -+++ b/cmake/AddEventLibrary.cmake -@@ -20,12 +20,12 @@ macro(generate_pkgconfig LIB_NAME) - - set(LIBS "") - foreach (LIB ${LIB_PLATFORM}) -- set(LIBS "${LIBS} -L${LIB}") -+ set(LIBS "${LIBS} -l${LIB}") - endforeach() - - set(OPENSSL_LIBS "") - foreach(LIB ${OPENSSL_LIBRARIES}) -- set(OPENSSL_LIBS "${OPENSSL_LIBS} -L${LIB}") -+ set(OPENSSL_LIBS "${OPENSSL_LIBS} -l${LIB}") - endforeach() - - configure_file("lib${LIB_NAME}.pc.in" "lib${LIB_NAME}.pc" @ONLY) diff --git a/depends/patches/libxcb/remove_pthread_stubs.patch b/depends/patches/libxcb/remove_pthread_stubs.patch deleted file mode 100644 index 1f32dea527..0000000000 --- a/depends/patches/libxcb/remove_pthread_stubs.patch +++ /dev/null @@ -1,12 +0,0 @@ -Remove uneeded pthread-stubs dependency ---- a/configure -+++ b/configure -@@ -19695,7 +19695,7 @@ fi - NEEDED="xau >= 0.99.2" - case $host_os in - linux*) ;; -- *) NEEDED="$NEEDED pthread-stubs" ;; -+ *) NEEDED="$NEEDED" ;; - esac - - pkg_failed=no diff --git a/depends/patches/miniupnpc/cmake_get_src_addr.patch b/depends/patches/miniupnpc/cmake_get_src_addr.patch deleted file mode 100644 index bae1b738f3..0000000000 --- a/depends/patches/miniupnpc/cmake_get_src_addr.patch +++ /dev/null @@ -1,22 +0,0 @@ -commit cb2026239c2a3aff393952ccb0ee1c448189402d -Author: fanquake -Date: Fri Mar 22 14:03:54 2024 +0000 - - build: add MINIUPNPC_GET_SRC_ADDR to CMake build - - This mirrors the autotools build. - - See https://github.com/miniupnp/miniupnp/pull/721. - -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 1aa95a8..0cacf3e 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -31,6 +31,7 @@ endif () - if (NOT WIN32) - target_compile_definitions(miniupnpc-private INTERFACE - MINIUPNPC_SET_SOCKET_TIMEOUT -+ MINIUPNPC_GET_SRC_ADDR - _BSD_SOURCE _DEFAULT_SOURCE) - if (NOT APPLE AND NOT CMAKE_SYSTEM_NAME MATCHES ".*BSD" AND NOT CMAKE_SYSTEM_NAME STREQUAL "SunOS") - # add_definitions (-D_POSIX_C_SOURCE=200112L) diff --git a/depends/patches/miniupnpc/dont_leak_info.patch b/depends/patches/miniupnpc/dont_leak_info.patch deleted file mode 100644 index 95a09a26dc..0000000000 --- a/depends/patches/miniupnpc/dont_leak_info.patch +++ /dev/null @@ -1,32 +0,0 @@ -commit 51f6dd991c29af66fb4f64c6feb2787cce23a1a7 -Author: fanquake -Date: Mon Jan 8 11:21:40 2024 +0000 - - Don't leak OS and miniupnpc version info in User-Agent - -diff --git a/src/minisoap.c b/src/minisoap.c -index 903ac5f..046e0ea 100644 ---- a/src/minisoap.c -+++ b/src/minisoap.c -@@ -90,7 +90,7 @@ int soapPostSubmit(SOCKET fd, - headerssize = snprintf(headerbuf, sizeof(headerbuf), - "POST %s HTTP/%s\r\n" - "Host: %s%s\r\n" -- "User-Agent: " OS_STRING " " UPNP_VERSION_STRING " MiniUPnPc/" MINIUPNPC_VERSION_STRING "\r\n" -+ "User-Agent: " UPNP_VERSION_STRING "\r\n" - "Content-Length: %d\r\n" - #if (UPNP_VERSION_MAJOR == 1) && (UPNP_VERSION_MINOR == 0) - "Content-Type: text/xml\r\n" -diff --git a/src/miniwget.c b/src/miniwget.c -index e76a5e5..0cc36fe 100644 ---- a/src/miniwget.c -+++ b/src/miniwget.c -@@ -444,7 +444,7 @@ miniwget3(const char * host, - "GET %s HTTP/%s\r\n" - "Host: %s:%d\r\n" - "Connection: Close\r\n" -- "User-Agent: " OS_STRING " " UPNP_VERSION_STRING " MiniUPnPc/" MINIUPNPC_VERSION_STRING "\r\n" -+ "User-Agent: " UPNP_VERSION_STRING "\r\n" - - "\r\n", - path, httpversion, host, port); diff --git a/depends/patches/miniupnpc/fix_windows_snprintf.patch b/depends/patches/miniupnpc/fix_windows_snprintf.patch deleted file mode 100644 index ff9e26231e..0000000000 --- a/depends/patches/miniupnpc/fix_windows_snprintf.patch +++ /dev/null @@ -1,25 +0,0 @@ -commit a1e9de80ab99b4c956a6a4e21d3e0de6f7a1014d -Author: Hennadii Stepanov <32963518+hebasto@users.noreply.github.com> -Date: Sat Apr 20 15:14:47 2024 +0100 - - Fix macro expression that guards `snprintf` for Windows - - Otherwise, the `snprintf` is still wrongly emulated for the following - cases: - - mingw-w64 6.0.0 or new with ucrt - - mingw-w64 8.0.0 or new with iso c ext - ---- a/src/win32_snprintf.h -+++ b/src/win32_snprintf.h -@@ -23,9 +23,9 @@ - (defined(_MSC_VER) && _MSC_VER < 1900) /* Visual Studio older than 2015 */ || \ - (defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR) && defined(__NO_ISOCEXT)) /* mingw32 without iso c ext */ || \ - (defined(__MINGW64_VERSION_MAJOR) && /* mingw-w64 not ... */ !( \ -- (defined (__USE_MINGW_ANSI_STDIO) && __USE_MINGW_ANSI_STDIO != 0)) /* ... with ansi stdio */ || \ -+ (defined (__USE_MINGW_ANSI_STDIO) && __USE_MINGW_ANSI_STDIO != 0) /* ... with ansi stdio */ || \ - (__MINGW64_VERSION_MAJOR >= 6 && defined(_UCRT)) /* ... at least 6.0.0 with ucrt */ || \ -- (__MINGW64_VERSION_MAJOR >= 8 && !defined(__NO_ISOCEXT)) /* ... at least 8.0.0 with iso c ext */ || \ -+ (__MINGW64_VERSION_MAJOR >= 8 && !defined(__NO_ISOCEXT))) /* ... at least 8.0.0 with iso c ext */ || \ - 0) || \ - 0) - diff --git a/depends/patches/qrencode/cmake_fixups.patch b/depends/patches/qrencode/cmake_fixups.patch deleted file mode 100644 index 7518d756cb..0000000000 --- a/depends/patches/qrencode/cmake_fixups.patch +++ /dev/null @@ -1,23 +0,0 @@ -cmake: set minimum version to 3.5 - -Correct some dev warning output. - -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 773e037..a558145 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -1,4 +1,4 @@ --cmake_minimum_required(VERSION 3.1.0) -+cmake_minimum_required(VERSION 3.5) - - project(QRencode VERSION 4.1.1 LANGUAGES C) - -@@ -20,7 +20,7 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") - set(CMAKE_THREAD_PREFER_PTHREAD ON) - find_package(Threads) - find_package(PNG) --find_package(Iconv) -+find_package(ICONV) - - if(CMAKE_USE_PTHREADS_INIT) - add_definitions(-DHAVE_LIBPTHREAD=1) diff --git a/depends/patches/qt/clang_18_libpng.patch b/depends/patches/qt/clang_18_libpng.patch deleted file mode 100644 index e807905b32..0000000000 --- a/depends/patches/qt/clang_18_libpng.patch +++ /dev/null @@ -1,40 +0,0 @@ -fix Qt macOS build with Clang 18 - - See: - https://github.com/pnggroup/libpng/commit/893b8113f04d408cc6177c6de19c9889a48faa24. - - In a similar manner as zlib (madler/zlib#895), - libpng contains a header configuration that's no longer valid and - hasn't been exercised for the macOS target. - - - The target OS conditional macros are misused. Specifically - `TARGET_OS_MAC` covers all Apple targets, including iOS, and it - should not be checked with `#if defined` as they would always be - defined (to either 1 or 0) on Apple platforms. - - `#include ` no longer works for the macOS target and results - in a compilation failure. macOS ships all required functions in - `math.h`, and clients should use `math.h` instead. - ---- a/qtbase/src/3rdparty/libpng/pngpriv.h -+++ b/qtbase/src/3rdparty/libpng/pngpriv.h -@@ -514,18 +514,8 @@ - */ - # include - --# if (defined(__MWERKS__) && defined(macintosh)) || defined(applec) || \ -- defined(THINK_C) || defined(__SC__) || defined(TARGET_OS_MAC) -- /* We need to check that hasn't already been included earlier -- * as it seems it doesn't agree with , yet we should really use -- * if possible. -- */ --# if !defined(__MATH_H__) && !defined(__MATH_H) && !defined(__cmath__) --# include --# endif --# else --# include --# endif -+# include -+ - # if defined(_AMIGA) && defined(__SASC) && defined(_M68881) - /* Amiga SAS/C: We must include builtin FPU functions when compiling using - * MATH=68881 diff --git a/depends/patches/qt/dont_hardcode_pwd.patch b/depends/patches/qt/dont_hardcode_pwd.patch deleted file mode 100644 index f6955b2f20..0000000000 --- a/depends/patches/qt/dont_hardcode_pwd.patch +++ /dev/null @@ -1,27 +0,0 @@ -Do not assume FHS in scripts - -On systems that do not follow the Filesystem Hierarchy Standard, such as -guix, the hardcoded `/bin/pwd` will fail to be found so that the script -will fail. - -Use `pwd`, instead, so that the command can be found through the normal -path search mechanism. - -See https://github.com/qt/qtbase/commit/3388de698bfb9bbc456c08f03e83bf3e749df35c. - -diff --git a/qtbase/configure b/qtbase/configure -index 08b49a8d..faea5b55 100755 ---- a/qtbase/configure -+++ b/qtbase/configure -@@ -36,9 +36,9 @@ - relconf=`basename $0` - # the directory of this script is the "source tree" - relpath=`dirname $0` --relpath=`(cd "$relpath"; /bin/pwd)` -+relpath=`(cd "$relpath"; pwd)` - # the current directory is the "build tree" or "object tree" --outpath=`/bin/pwd` -+outpath=`pwd` - - WHICH="which" - diff --git a/depends/patches/qt/duplicate_lcqpafonts.patch b/depends/patches/qt/duplicate_lcqpafonts.patch deleted file mode 100644 index c460b51dcf..0000000000 --- a/depends/patches/qt/duplicate_lcqpafonts.patch +++ /dev/null @@ -1,104 +0,0 @@ -QtGui: Fix duplication of logging category lcQpaFonts - -Move it to qplatformfontdatabase.h. - -Upstream commit: - - Qt 6.0: ab01885e48873fb2ad71841a3f1627fe4d9cd835 - ---- a/qtbase/src/gui/text/qplatformfontdatabase.cpp -+++ b/qtbase/src/gui/text/qplatformfontdatabase.cpp -@@ -52,6 +52,8 @@ - - QT_BEGIN_NAMESPACE - -+Q_LOGGING_CATEGORY(lcQpaFonts, "qt.qpa.fonts") -+ - void qt_registerFont(const QString &familyname, const QString &stylename, - const QString &foundryname, int weight, - QFont::Style style, int stretch, bool antialiased, - ---- a/qtbase/src/gui/text/qplatformfontdatabase.h -+++ b/qtbase/src/gui/text/qplatformfontdatabase.h -@@ -50,6 +50,7 @@ - // - - #include -+#include - #include - #include - #include -@@ -62,6 +63,7 @@ - - QT_BEGIN_NAMESPACE - -+Q_DECLARE_LOGGING_CATEGORY(lcQpaFonts) - - class QWritingSystemsPrivate; - - ---- a/qtbase/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm -+++ b/qtbase/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm -@@ -86,8 +86,6 @@ - - QT_BEGIN_NAMESPACE - --Q_LOGGING_CATEGORY(lcQpaFonts, "qt.qpa.fonts") -- - static float SYNTHETIC_ITALIC_SKEW = std::tan(14.f * std::acos(0.f) / 90.f); - - bool QCoreTextFontEngine::ct_getSfntTable(void *user_data, uint tag, uchar *buffer, uint *length) - ---- a/qtbase/src/platformsupport/fontdatabases/mac/qfontengine_coretext_p.h -+++ b/qtbase/src/platformsupport/fontdatabases/mac/qfontengine_coretext_p.h -@@ -64,8 +64,6 @@ - - QT_BEGIN_NAMESPACE - --Q_DECLARE_LOGGING_CATEGORY(lcQpaFonts) -- - class QCoreTextFontEngine : public QFontEngine - { - Q_GADGET - ---- a/qtbase/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp -+++ b/qtbase/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp -@@ -68,8 +68,6 @@ - - QT_BEGIN_NAMESPACE - --Q_LOGGING_CATEGORY(lcQpaFonts, "qt.qpa.fonts") -- - #ifndef QT_NO_DIRECTWRITE - // ### fixme: Consider direct linking of dwrite.dll once Windows Vista pre SP2 is dropped (QTBUG-49711) - - ---- a/qtbase/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_p.h -+++ b/qtbase/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_p.h -@@ -63,8 +63,6 @@ - - QT_BEGIN_NAMESPACE - --Q_DECLARE_LOGGING_CATEGORY(lcQpaFonts) -- - class QWindowsFontEngineData - { - Q_DISABLE_COPY_MOVE(QWindowsFontEngineData) - ---- a/qtbase/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp -+++ b/qtbase/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp -@@ -40,6 +40,7 @@ - #include "qgenericunixthemes_p.h" - - #include "qpa/qplatformtheme_p.h" -+#include "qpa/qplatformfontdatabase.h" - - #include - #include -@@ -76,7 +77,6 @@ - QT_BEGIN_NAMESPACE - - Q_DECLARE_LOGGING_CATEGORY(qLcTray) --Q_LOGGING_CATEGORY(lcQpaFonts, "qt.qpa.fonts") - - ResourceHelper::ResourceHelper() - { diff --git a/depends/patches/qt/fix-macos-linker.patch b/depends/patches/qt/fix-macos-linker.patch deleted file mode 100644 index e439685656..0000000000 --- a/depends/patches/qt/fix-macos-linker.patch +++ /dev/null @@ -1,55 +0,0 @@ -qmake: Don't error out if QMAKE_DEFAULT_LIBDIRS is empty on macOS - -The new linker in Xcode 15 doesn't provide any default linker or -framework paths when requested via -v, but still seems to use the -default paths documented in the ld man page. - -We trust that linker will do the right thing, even if we don't -know of its default linker paths. - -We also need to opt out of the default fallback logic to -set the libdirs to /lib and /usr/lib. - -This may result in UnixMakefileGenerator::findLibraries finding -different libraries than expected, if additional paths are -passed with -L, which will then take precedence for qmake, -even if the linker itself will use the library from the -SDK's default paths. This should hopefully not be an issue -in practice, as we don't turn -lFoo into absolute paths in -qmake, so the only risk is that we're picking up the wrong -prl files and adding additional dependencies that the lib -in the SDK doesn't have. - -Upstream commits: - - Qt 5.15.16: Not yet publicly available. - - Qt dev: cdf64b0e47115cc473e1afd1472b4b09e130b2a5 - -For other Qt branches see -https://codereview.qt-project.org/q/I2347b26e2df0828471373b0e15b8c9089274c65d - ---- old/qtbase/mkspecs/features/toolchain.prf -+++ new/qtbase/mkspecs/features/toolchain.prf -@@ -288,9 +288,12 @@ isEmpty($${target_prefix}.INCDIRS) { - } - } - } -- isEmpty(QMAKE_DEFAULT_LIBDIRS)|isEmpty(QMAKE_DEFAULT_INCDIRS): \ -+ isEmpty(QMAKE_DEFAULT_INCDIRS): \ - !integrity: \ -- error("failed to parse default search paths from compiler output") -+ error("failed to parse default include paths from compiler output") -+ isEmpty(QMAKE_DEFAULT_LIBDIRS): \ -+ !integrity:!darwin: \ -+ error("failed to parse default library paths from compiler output") - QMAKE_DEFAULT_LIBDIRS = $$unique(QMAKE_DEFAULT_LIBDIRS) - } else: ghs { - cmd = $$QMAKE_CXX $$QMAKE_CXXFLAGS -$${LITERAL_HASH} -o /tmp/fake_output /tmp/fake_input.cpp -@@ -412,7 +415,7 @@ isEmpty($${target_prefix}.INCDIRS) { - QMAKE_DEFAULT_INCDIRS = $$split(INCLUDE, $$QMAKE_DIRLIST_SEP) - } - -- unix:if(!cross_compile|host_build) { -+ unix:!darwin:if(!cross_compile|host_build) { - isEmpty(QMAKE_DEFAULT_INCDIRS): QMAKE_DEFAULT_INCDIRS = /usr/include /usr/local/include - isEmpty(QMAKE_DEFAULT_LIBDIRS): QMAKE_DEFAULT_LIBDIRS = /lib /usr/lib - } diff --git a/depends/patches/qt/fix_qt_pkgconfig.patch b/depends/patches/qt/fix_qt_pkgconfig.patch deleted file mode 100644 index 73f4d89f73..0000000000 --- a/depends/patches/qt/fix_qt_pkgconfig.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- old/qtbase/mkspecs/features/qt_module.prf -+++ new/qtbase/mkspecs/features/qt_module.prf -@@ -269,7 +269,7 @@ load(qt_installs) - load(qt_targets) - - # this builds on top of qt_common --!internal_module:if(unix|mingw):!if(darwin:debug_and_release:CONFIG(debug, debug|release)) { -+if(unix|mingw):!if(darwin:debug_and_release:CONFIG(debug, debug|release)) { - CONFIG += create_pc - QMAKE_PKGCONFIG_DESTDIR = pkgconfig - host_build: \ diff --git a/depends/patches/qt/guix_cross_lib_path.patch b/depends/patches/qt/guix_cross_lib_path.patch deleted file mode 100644 index 7911dc21d7..0000000000 --- a/depends/patches/qt/guix_cross_lib_path.patch +++ /dev/null @@ -1,17 +0,0 @@ -Facilitate guix building with CROSS_LIBRARY_PATH - -See discussion in https://github.com/bitcoin/bitcoin/pull/15277. - ---- a/qtbase/mkspecs/features/toolchain.prf -+++ b/qtbase/mkspecs/features/toolchain.prf -@@ -236,8 +236,8 @@ isEmpty($${target_prefix}.INCDIRS) { - add_libraries = false - for (line, output) { - line ~= s/^[ \\t]*// # remove leading spaces -- contains(line, "LIBRARY_PATH=.*") { -- line ~= s/^LIBRARY_PATH=// # remove leading LIBRARY_PATH= -+ contains(line, "(CROSS_)?LIBRARY_PATH=.*") { -+ line ~= s/^(CROSS_)?LIBRARY_PATH=// # remove leading (CROSS_)?LIBRARY_PATH= - equals(QMAKE_HOST.os, Windows): \ - paths = $$split(line, ;) - else: \ diff --git a/depends/patches/qt/mac-qmake.conf b/depends/patches/qt/mac-qmake.conf deleted file mode 100644 index a29db20004..0000000000 --- a/depends/patches/qt/mac-qmake.conf +++ /dev/null @@ -1,23 +0,0 @@ -MAKEFILE_GENERATOR = UNIX -CONFIG += app_bundle incremental lib_version_first absolute_library_soname -QMAKE_INCREMENTAL_STYLE = sublib -include(../common/macx.conf) -include(../common/gcc-base-mac.conf) -include(../common/clang.conf) -include(../common/clang-mac.conf) -QMAKE_MAC_SDK_PATH=$${MAC_SDK_PATH} -QMAKE_XCODE_VERSION = $${XCODE_VERSION} -QMAKE_XCODE_DEVELOPER_PATH=/Developer -QMAKE_MAC_SDK=macosx -QMAKE_MAC_SDK.macosx.Path = $${MAC_SDK_PATH} -QMAKE_MAC_SDK.macosx.platform_name = macosx -QMAKE_MAC_SDK.macosx.SDKVersion = $${MAC_SDK_VERSION} -QMAKE_MAC_SDK.macosx.PlatformPath = /phony -QMAKE_CXXFLAGS += -fuse-ld=lld -!host_build: QMAKE_CFLAGS += -target $${MAC_TARGET} -!host_build: QMAKE_OBJECTIVE_CFLAGS += $$QMAKE_CFLAGS -!host_build: QMAKE_CXXFLAGS += -target $${MAC_TARGET} -!host_build: QMAKE_LFLAGS += -target $${MAC_TARGET} -QMAKE_AR = $${CROSS_COMPILE}ar cq -QMAKE_RANLIB=$${CROSS_COMPILE}ranlib -load(qt_config) diff --git a/depends/patches/qt/memory_resource.patch b/depends/patches/qt/memory_resource.patch deleted file mode 100644 index 312f0669f6..0000000000 --- a/depends/patches/qt/memory_resource.patch +++ /dev/null @@ -1,49 +0,0 @@ -Fix unusable memory_resource on macos - -See https://bugreports.qt.io/browse/QTBUG-117484 -and https://bugreports.qt.io/browse/QTBUG-114316 - ---- a/qtbase/src/corelib/tools/qduplicatetracker_p.h -+++ b/qtbase/src/corelib/tools/qduplicatetracker_p.h -@@ -52,7 +52,7 @@ - - #include - --#if QT_HAS_INCLUDE() && __cplusplus > 201402L -+#ifdef __cpp_lib_memory_resource - # include - # include - #else - ---- a/qtbase/src/corelib/global/qcompilerdetection.h -+++ b/qtbase/src/corelib/global/qcompilerdetection.h -@@ -1055,16 +1055,22 @@ - # endif // !_HAS_CONSTEXPR - # endif // !__GLIBCXX__ && !_LIBCPP_VERSION - # endif // Q_OS_QNX --# if (defined(Q_CC_CLANG) || defined(Q_CC_INTEL)) && defined(Q_OS_MAC) && defined(__GNUC_LIBSTD__) \ -- && ((__GNUC_LIBSTD__-0) * 100 + __GNUC_LIBSTD_MINOR__-0 <= 402) -+# if (defined(Q_CC_CLANG) || defined(Q_CC_INTEL)) && defined(Q_OS_MAC) -+# if defined(__GNUC_LIBSTD__) && ((__GNUC_LIBSTD__-0) * 100 + __GNUC_LIBSTD_MINOR__-0 <= 402) - // Apple has not updated libstdc++ since 2007, which means it does not have - // or std::move. Let's disable these features --# undef Q_COMPILER_INITIALIZER_LISTS --# undef Q_COMPILER_RVALUE_REFS --# undef Q_COMPILER_REF_QUALIFIERS -+# undef Q_COMPILER_INITIALIZER_LISTS -+# undef Q_COMPILER_RVALUE_REFS -+# undef Q_COMPILER_REF_QUALIFIERS - // Also disable , since it's clearly not there --# undef Q_COMPILER_ATOMICS --# endif -+# undef Q_COMPILER_ATOMICS -+# endif -+# if defined(__cpp_lib_memory_resource) \ -+ && ((defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED < 140000) \ -+ || (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED < 170000)) -+# undef __cpp_lib_memory_resource // Only supported on macOS 14 and iOS 17 -+# endif -+# endif // (defined(Q_CC_CLANG) || defined(Q_CC_INTEL)) && defined(Q_OS_MAC) - # if defined(Q_CC_CLANG) && defined(Q_CC_INTEL) && Q_CC_INTEL >= 1500 - // ICC 15.x and 16.0 have their own implementation of std::atomic, which is activated when in Clang mode - // (probably because libc++'s on OS X failed to compile), but they're missing some diff --git a/depends/patches/qt/no-xlib.patch b/depends/patches/qt/no-xlib.patch deleted file mode 100644 index 0f7965d2ea..0000000000 --- a/depends/patches/qt/no-xlib.patch +++ /dev/null @@ -1,61 +0,0 @@ -From 9563cef873ae82e06f60708d706d054717e801ce Mon Sep 17 00:00:00 2001 -From: Carl Dong -Date: Thu, 18 Jul 2019 17:22:05 -0400 -Subject: [PATCH] Wrap xlib related code blocks in #if's - -They are not necessary to compile QT. - ---- a/qtbase/src/plugins/platforms/xcb/qxcbcursor.cpp -+++ b/qtbase/src/plugins/platforms/xcb/qxcbcursor.cpp -@@ -49,7 +49,9 @@ - #include - #include - #include -+#if QT_CONFIG(xcb_xlib) && QT_CONFIG(library) - #include -+#endif - #include - #include - -@@ -391,6 +393,7 @@ void QXcbCursor::changeCursor(QCursor *cursor, QWindow *window) - xcb_flush(xcb_connection()); - } - -+#if QT_CONFIG(xcb_xlib) && QT_CONFIG(library) - static int cursorIdForShape(int cshape) - { - int cursorId = 0; -@@ -444,6 +447,7 @@ static int cursorIdForShape(int cshape) - } - return cursorId; - } -+#endif - - xcb_cursor_t QXcbCursor::createNonStandardCursor(int cshape) - { -@@ -558,7 +562,9 @@ static xcb_cursor_t loadCursor(void *dpy, int cshape) - xcb_cursor_t QXcbCursor::createFontCursor(int cshape) - { - xcb_connection_t *conn = xcb_connection(); -+#if QT_CONFIG(xcb_xlib) && QT_CONFIG(library) - int cursorId = cursorIdForShape(cshape); -+#endif - xcb_cursor_t cursor = XCB_NONE; - - #if QT_CONFIG(xcb_xlib) && QT_CONFIG(library) -@@ -590,6 +596,7 @@ xcb_cursor_t QXcbCursor::createFontCursor(int cshape) - // Non-standard X11 cursors are created from bitmaps - cursor = createNonStandardCursor(cshape); - -+#if QT_CONFIG(xcb_xlib) && QT_CONFIG(library) - // Create a glpyh cursor if everything else failed - if (!cursor && cursorId) { - cursor = xcb_generate_id(conn); -@@ -597,6 +604,7 @@ xcb_cursor_t QXcbCursor::createFontCursor(int cshape) - cursorId, cursorId + 1, - 0xFFFF, 0xFFFF, 0xFFFF, 0, 0, 0); - } -+#endif - - if (cursor && cshape >= 0 && cshape < Qt::LastCursor && connection()->hasXFixes()) { - const char *name = cursorNames[cshape].front(); diff --git a/depends/patches/qt/no_warnings_for_symbols.patch b/depends/patches/qt/no_warnings_for_symbols.patch deleted file mode 100644 index 11cdc599ed..0000000000 --- a/depends/patches/qt/no_warnings_for_symbols.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/qtbase/mkspecs/features/mac/no_warn_empty_obj_files.prf -+++ b/qtbase/mkspecs/features/mac/no_warn_empty_obj_files.prf -@@ -1,7 +1,7 @@ - # Prevent warnings about object files without any symbols. This is a common - # thing in Qt as we tend to build files unconditionally, and then use ifdefs - # to compile out parts that are not relevant. --QMAKE_RANLIB += -no_warning_for_no_symbols -+# QMAKE_RANLIB += -no_warning_for_no_symbols - - # We have to tell 'ar' to not run ranlib by itself - QMAKE_AR += -S diff --git a/depends/patches/qt/qt.pro b/depends/patches/qt/qt.pro deleted file mode 100644 index 8f2e900a84..0000000000 --- a/depends/patches/qt/qt.pro +++ /dev/null @@ -1,16 +0,0 @@ -# Create the super cache so modules will add themselves to it. -cache(, super) - -!QTDIR_build: cache(CONFIG, add, $$list(QTDIR_build)) - -prl = no_install_prl -CONFIG += $$prl -cache(CONFIG, add stash, prl) - -TEMPLATE = subdirs -SUBDIRS = qtbase qttools qttranslations - -qttools.depends = qtbase -qttranslations.depends = qttools - -load(qt_configure) diff --git a/depends/patches/qt/qtbase-moc-ignore-gcc-macro.patch b/depends/patches/qt/qtbase-moc-ignore-gcc-macro.patch deleted file mode 100644 index f0c14a9400..0000000000 --- a/depends/patches/qt/qtbase-moc-ignore-gcc-macro.patch +++ /dev/null @@ -1,17 +0,0 @@ -The moc executable loops through headers on CPLUS_INCLUDE_PATH and stumbles -on the GCC internal _GLIBCXX_VISIBILITY macro. Tell it to ignore it as it is -not supposed to be looking there to begin with. - -Upstream report: https://bugreports.qt.io/browse/QTBUG-83160 - -diff --git a/qtbase/src/tools/moc/main.cpp b/qtbase/src/tools/moc/main.cpp ---- a/qtbase/src/tools/moc/main.cpp -+++ b/qtbase/src/tools/moc/main.cpp -@@ -238,6 +238,7 @@ int runMoc(int argc, char **argv) - dummyVariadicFunctionMacro.arguments += Symbol(0, PP_IDENTIFIER, "__VA_ARGS__"); - pp.macros["__attribute__"] = dummyVariadicFunctionMacro; - pp.macros["__declspec"] = dummyVariadicFunctionMacro; -+ pp.macros["_GLIBCXX_VISIBILITY"] = dummyVariadicFunctionMacro; - - QString filename; - QString output; diff --git a/depends/patches/qt/qttools_src.pro b/depends/patches/qt/qttools_src.pro deleted file mode 100644 index 6ef71a0942..0000000000 --- a/depends/patches/qt/qttools_src.pro +++ /dev/null @@ -1,6 +0,0 @@ -TEMPLATE = subdirs -SUBDIRS = linguist - -fb = force_bootstrap -CONFIG += $$fb -cache(CONFIG, add, fb) diff --git a/depends/patches/qt/rcc_hardcode_timestamp.patch b/depends/patches/qt/rcc_hardcode_timestamp.patch deleted file mode 100644 index 03f3897975..0000000000 --- a/depends/patches/qt/rcc_hardcode_timestamp.patch +++ /dev/null @@ -1,24 +0,0 @@ -Hardcode last modified timestamp in Qt RCC - -This change allows the already built qt package to be reused even with -the SOURCE_DATE_EPOCH variable set, e.g., for Guix builds. - - ---- old/qtbase/src/tools/rcc/rcc.cpp -+++ new/qtbase/src/tools/rcc/rcc.cpp -@@ -227,14 +227,7 @@ void RCCFileInfo::writeDataInfo(RCCResourceLibrary &lib) - - if (lib.formatVersion() >= 2) { - // last modified time stamp -- const QDateTime lastModified = m_fileInfo.lastModified(); -- quint64 lastmod = quint64(lastModified.isValid() ? lastModified.toMSecsSinceEpoch() : 0); -- static const quint64 sourceDate = 1000 * qgetenv("QT_RCC_SOURCE_DATE_OVERRIDE").toULongLong(); -- if (sourceDate != 0) -- lastmod = sourceDate; -- static const quint64 sourceDate2 = 1000 * qgetenv("SOURCE_DATE_EPOCH").toULongLong(); -- if (sourceDate2 != 0) -- lastmod = sourceDate2; -+ quint64 lastmod = quint64(1); - lib.writeNumber8(lastmod); - if (text || pass1) - lib.writeChar('\n'); diff --git a/depends/patches/qt/utc_from_string_no_optimize.patch b/depends/patches/qt/utc_from_string_no_optimize.patch deleted file mode 100644 index 533ef59b37..0000000000 --- a/depends/patches/qt/utc_from_string_no_optimize.patch +++ /dev/null @@ -1,84 +0,0 @@ -Modify optimisation flags for various functions. -This fixes non-determinism issues in the asm produced for -these function when cross-compiling on x86_64 and aarch64 for -the arm64-apple-darwin HOST. - ---- a/qtbase/src/corelib/itemmodels/qitemselectionmodel.cpp -+++ b/qtbase/src/corelib/itemmodels/qitemselectionmodel.cpp -@@ -1078,9 +1078,9 @@ void QItemSelectionModelPrivate::_q_layoutChanged(const QList &parents = QList(), QAbstractItemModel::LayoutChangeHint hint = QAbstractItemModel::NoLayoutChangeHint); -- void _q_layoutChanged(const QList &parents = QList(), QAbstractItemModel::LayoutChangeHint hint = QAbstractItemModel::NoLayoutChangeHint); -+ __attribute__ ((optnone)) void _q_layoutChanged(const QList &parents = QList(), QAbstractItemModel::LayoutChangeHint hint = QAbstractItemModel::NoLayoutChangeHint); - - inline void remove(QList &r) - { - ---- a/qtbase/src/corelib/time/qdatetimeparser_p.h -+++ b/qtbase/src/corelib/time/qdatetimeparser_p.h -@@ -215,7 +215,7 @@ private: - : value(ok == Invalid ? -1 : val), used(read), zeroes(zs), state(ok) - {} - }; -- ParsedSection parseSection(const QDateTime ¤tValue, int sectionIndex, -+ __attribute__ ((optnone)) ParsedSection parseSection(const QDateTime ¤tValue, int sectionIndex, - int offset, QString *text) const; - int findMonth(const QString &str1, int monthstart, int sectionIndex, - int year, QString *monthName = nullptr, int *used = nullptr) const; - ---- a/qtbase/src/corelib/time/qtimezoneprivate_p.h -+++ b/qtbase/src/corelib/time/qtimezoneprivate_p.h -@@ -191,7 +191,7 @@ public: - virtual ~QUtcTimeZonePrivate(); - - // Fall-back for UTC[+-]\d+(:\d+){,2} IDs. -- static qint64 offsetFromUtcString(const QByteArray &id); -+ static __attribute__ ((optnone)) qint64 offsetFromUtcString(const QByteArray &id); - - QUtcTimeZonePrivate *clone() const override; - ---- a/qtbase/src/widgets/widgets/qcalendarwidget.cpp -+++ b/qtbase/src/widgets/widgets/qcalendarwidget.cpp -@@ -329,13 +329,13 @@ class QCalendarYearValidator : public QCalendarDateSectionValidator - - public: - QCalendarYearValidator(); -- virtual Section handleKey(int key) override; -+ __attribute__ ((optnone)) virtual Section handleKey(int key) override; - virtual QDate applyToDate(QDate date, QCalendar cal) const override; - virtual void setDate(QDate date, QCalendar cal) override; - virtual QString text() const override; - virtual QString text(QDate date, QCalendar cal, int repeat) const override; - private: -- int pow10(int n); -+ __attribute__ ((optnone)) int pow10(int n); - int m_pos; - int m_year; - int m_oldYear; diff --git a/depends/patches/qt/windows_lto.patch b/depends/patches/qt/windows_lto.patch deleted file mode 100644 index ea379a60f1..0000000000 --- a/depends/patches/qt/windows_lto.patch +++ /dev/null @@ -1,31 +0,0 @@ -Qt (for Windows) fails to build under LTO, due to multiple definition issues, i.e - -multiple definition of `QAccessibleLineEdit::~QAccessibleLineEdit()'; - -Possibly related to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94156. - -diff --git a/qtbase/src/widgets/accessible/simplewidgets.cpp b/qtbase/src/widgets/accessible/simplewidgets.cpp -index 107fd729fe..0e61878f39 100644 ---- a/qtbase/src/widgets/accessible/simplewidgets.cpp -+++ b/qtbase/src/widgets/accessible/simplewidgets.cpp -@@ -109,6 +109,8 @@ QString qt_accHotKey(const QString &text); - \ingroup accessibility - */ - -+QAccessibleLineEdit::~QAccessibleLineEdit(){}; -+ - /*! - Creates a QAccessibleButton object for \a w. - */ -diff --git a/qtbase/src/widgets/accessible/simplewidgets_p.h b/qtbase/src/widgets/accessible/simplewidgets_p.h -index 73572e3059..658da86143 100644 ---- a/qtbase/src/widgets/accessible/simplewidgets_p.h -+++ b/qtbase/src/widgets/accessible/simplewidgets_p.h -@@ -155,6 +155,7 @@ class QAccessibleLineEdit : public QAccessibleWidget, public QAccessibleTextInte - public: - explicit QAccessibleLineEdit(QWidget *o, const QString &name = QString()); - -+ ~QAccessibleLineEdit(); - QString text(QAccessible::Text t) const override; - void setText(QAccessible::Text t, const QString &text) override; - QAccessible::State state() const override; diff --git a/depends/patches/qt/zlib-timebits64.patch b/depends/patches/qt/zlib-timebits64.patch deleted file mode 100644 index 139c1dfa77..0000000000 --- a/depends/patches/qt/zlib-timebits64.patch +++ /dev/null @@ -1,31 +0,0 @@ -From a566e156b3fa07b566ddbf6801b517a9dba04fa3 Mon Sep 17 00:00:00 2001 -From: Mark Adler -Date: Sat, 29 Jul 2023 22:13:09 -0700 -Subject: [PATCH] Avoid compiler complaints if _TIME_BITS defined when building - zlib. - -zlib does not use time_t, so _TIME_BITS is irrelevant. However it -may be defined anyway as part of a sledgehammer indiscriminately -applied to all builds. - -From https://github.com/madler/zlib/commit/a566e156b3fa07b566ddbf6801b517a9dba04fa3.patch ---- - qtbase/src/3rdparty/zlib/src/gzguts.h | 5 ++--- - 1 file changed, 2 insertions(+), 3 deletions(-) - -diff --git a/qtbase/src/3rdparty/zlib/src/gzguts.h b/qtbase/src/3rdparty/zlib/src/gzguts.h -index e23f831f5..f9375047e 100644 ---- a/qtbase/src/3rdparty/zlib/src/gzguts.h -+++ b/qtbase/src/3rdparty/zlib/src/gzguts.h -@@ -26,9 +26,8 @@ - # ifndef _LARGEFILE_SOURCE - # define _LARGEFILE_SOURCE 1 - # endif --# ifdef _FILE_OFFSET_BITS --# undef _FILE_OFFSET_BITS --# endif -+# undef _FILE_OFFSET_BITS -+# undef _TIME_BITS - #endif - - #ifdef HAVE_HIDDEN diff --git a/depends/patches/systemtap/remove_SDT_ASM_SECTION_AUTOGROUP_SUPPORT_check.patch b/depends/patches/systemtap/remove_SDT_ASM_SECTION_AUTOGROUP_SUPPORT_check.patch deleted file mode 100644 index c115bc43e8..0000000000 --- a/depends/patches/systemtap/remove_SDT_ASM_SECTION_AUTOGROUP_SUPPORT_check.patch +++ /dev/null @@ -1,27 +0,0 @@ -Remove _SDT_ASM_SECTION_AUTOGROUP_SUPPORT check - -We assume that the assembler supports "?" in .pushsection directives. -This enables us to skip configure and make. - -See https://github.com/bitcoin/bitcoin/issues/23297. - -diff --git a/includes/sys/sdt.h b/includes/sys/sdt.h -index ca0162b..f96e0ee 100644 ---- a/includes/sys/sdt.h -+++ b/includes/sys/sdt.h -@@ -241,12 +241,10 @@ __extension__ extern unsigned long long __sdt_unsp; - nice with code in COMDAT sections, which comes up in C++ code. - Without that assembler support, some combinations of probe placements - in certain kinds of C++ code may produce link-time errors. */ --#include "sdt-config.h" --#if _SDT_ASM_SECTION_AUTOGROUP_SUPPORT -+/* PATCH: We assume that the assembler supports the feature. This -+ enables us to skip configure and make. In turn, this means we -+ require fewer dependencies and have shorter depend build times. */ - # define _SDT_ASM_AUTOGROUP "?" --#else --# define _SDT_ASM_AUTOGROUP "" --#endif - - #define _SDT_DEF_MACROS \ - _SDT_ASM_1(.altmacro) \ diff --git a/depends/patches/zeromq/remove_libstd_link.patch b/depends/patches/zeromq/remove_libstd_link.patch deleted file mode 100644 index 33467146d0..0000000000 --- a/depends/patches/zeromq/remove_libstd_link.patch +++ /dev/null @@ -1,25 +0,0 @@ -commit 47d4cd12a2c051815ddda78adebdb3923b260d8a -Author: fanquake -Date: Tue Aug 18 14:45:40 2020 +0800 - - Remove needless linking against libstdc++ - - This is broken for a number of reasons, including: - - g++ understands "static-libstdc++ -lstdc++" to mean "link against - whatever libstdc++ exists, probably shared", which in itself is buggy. - - another stdlib (libc++ for example) may be in use - - See #11981. - -diff --git a/src/libzmq.pc.in b/src/libzmq.pc.in -index 233bc3a..3c2bf0d 100644 ---- a/src/libzmq.pc.in -+++ b/src/libzmq.pc.in -@@ -7,6 +7,6 @@ Name: libzmq - Description: 0MQ c++ library - Version: @VERSION@ - Libs: -L${libdir} -lzmq --Libs.private: -lstdc++ @pkg_config_libs_private@ -+Libs.private: @pkg_config_libs_private@ - Requires.private: @pkg_config_names_private@ - Cflags: -I${includedir} @pkg_config_defines@ \ No newline at end of file diff --git a/doc/.gitignore b/doc/.gitignore deleted file mode 100644 index 38498103bb..0000000000 --- a/doc/.gitignore +++ /dev/null @@ -1 +0,0 @@ -Doxyfile diff --git a/doc/BGL-conf.md b/doc/BGL-conf.md deleted file mode 100644 index 1d82a2395b..0000000000 --- a/doc/BGL-conf.md +++ /dev/null @@ -1,74 +0,0 @@ -# `BGL.conf` Configuration File - -The configuration file is used by `BGLd`, `BGL-qt` and `BGL-cli`. - -All command-line options (except for `-?`, `-help`, `-version` and `-conf`) may be specified in a configuration file, and all configuration file options (except for `includeconf`) may also be specified on the command line. Command-line options override values set in the configuration file and configuration file options override values set in the GUI. - -Changes to the configuration file while `BGLd` or `BGL-qt` is running only take effect after restarting. - -Users should never make any configuration changes which they do not understand. Furthermore, users should always be wary of accepting any configuration changes provided to them by another source (even if they believe that they do understand them). - -## Configuration File Format - -The configuration file is a plain text file and consists of `option=value` entries, one per line. Leading and trailing whitespaces are removed. - -In contrast to the command-line usage: -- an option must be specified without leading `-`; -- a value of the given option is mandatory; e.g., `testnet=1` (for chain selection options), `noconnect=1` (for negated options). - -### Blank lines - -Blank lines are allowed and ignored by the parser. - -### Comments - -A comment starts with a number sign (`#`) and extends to the end of the line. All comments are ignored by the parser. - -Comments may appear in two ways: -- on their own on an otherwise empty line (_preferable_); -- after an `option=value` entry. - -### Network specific options - -Network specific options can be: -- placed into sections with headers `[main]` (not `[mainnet]`), `[test]` (not `[testnet]`), `[signet]` or `[regtest]`; -- prefixed with a chain name; e.g., `regtest.maxmempool=100`. - -Network specific options take precedence over non-network specific options. -If multiple values for the same option are found with the same precedence, the -first one is generally chosen. - -This means that given the following configuration, `regtest.rpcport` is set to `3000`: - -``` -regtest=1 -rpcport=2000 -regtest.rpcport=3000 - -[regtest] -rpcport=4000 -``` - -## Configuration File Path - -The configuration file is not automatically created; you can create it using your favorite text editor. By default, the configuration file name is `BGL.conf` and it is located in the BGL data directory, but both the BGL data directory and the configuration file path may be changed using the `-datadir` and `-conf` command-line options. - -The `includeconf=` option in the `BGL.conf` file can be used to include additional configuration files. - -### Default configuration file locations - -Operating System | Data Directory | Example Path --- | -- | -- -Windows | `%LOCALAPPDATA%\BGL\` | `C:\Users\username\AppData\Local\BGL\BGL.conf` -Linux | `$HOME/.BGL/` | `/home/username/.BGL/BGL.conf` -macOS | `$HOME/Library/Application Support/BGL/` | `/Users/username/Library/Application Support/BGL/BGL.conf` - -An example configuration file can be generated by [contrib/devtools/gen-BGL-conf.sh](../contrib/devtools/gen-BGL-conf.sh). -Run this script after compiling to generate an up-to-date configuration file. -The output is placed under `share/examples/BGL.conf`. -To use the generated configuration file, copy the example file into your data directory and edit it there, like so: - -``` -# example copy command for linux user -cp share/examples/BGL.conf ~/.BGL -``` diff --git a/doc/BGL_logo_doxygen.png b/doc/BGL_logo_doxygen.png deleted file mode 100644 index 258be86ede..0000000000 Binary files a/doc/BGL_logo_doxygen.png and /dev/null differ diff --git a/doc/CHANGELOG.md b/doc/CHANGELOG.md deleted file mode 100644 index 3c4c2e4583..0000000000 --- a/doc/CHANGELOG.md +++ /dev/null @@ -1,12 +0,0 @@ -# Changelog - -This file is currently only a template for future use. - -Each change falls into one of the following categories: Added, Changed, Deprecated, Removed, Fixed or Security. - -## [Unreleased] - -## [MAJOR.MINOR.PATCH] - YYYY-MM-DD - -### Added/Changed/Deprecated/Removed/Fixed/Security -- [Title with link to Pull Request](https://link-to-pr) diff --git a/doc/Doxyfile.in b/doc/Doxyfile.in deleted file mode 100644 index 03992d1fb8..0000000000 --- a/doc/Doxyfile.in +++ /dev/null @@ -1,2459 +0,0 @@ -# Doxyfile 1.8.12 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project. -# -# All text after a double hash (##) is considered a comment and is placed in -# front of the TAG it is preceding. -# -# All text after a single hash (#) is considered a comment and will be ignored. -# The format is: -# TAG = value [value, ...] -# For lists, items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (\" \"). - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- - -# This tag specifies the encoding used for all characters in the config file -# that follow. The default is UTF-8 which is also the encoding used for all text -# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv -# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv -# for the list of possible encodings. -# The default value is: UTF-8. - -DOXYFILE_ENCODING = UTF-8 - -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by -# double-quotes, unless you are using Doxywizard) that should identify the -# project for which the documentation is generated. This name is used in the -# title of most generated pages and in a few other places. -# The default value is: My Project. - -PROJECT_NAME = "BGL Core" - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. This -# could be handy for archiving the generated documentation or if some version -# control system is used. - -PROJECT_NUMBER = @PACKAGE_VERSION@ - -# Using the PROJECT_BRIEF tag one can provide an optional one line description -# for a project that appears at the top of each page and should give viewer a -# quick idea about the purpose of the project. Keep the description short. - -PROJECT_BRIEF = "P2P Digital Currency" - -# With the PROJECT_LOGO tag one can specify a logo or an icon that is included -# in the documentation. The maximum height of the logo should not exceed 55 -# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy -# the logo to the output directory. - -PROJECT_LOGO = doc/BGL_logo_doxygen.png - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path -# into which the generated documentation will be written. If a relative path is -# entered, it will be relative to the location where doxygen was started. If -# left blank the current directory will be used. - -OUTPUT_DIRECTORY = doc/doxygen - -# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- -# directories (in 2 levels) under the output directory of each output format and -# will distribute the generated files over these directories. Enabling this -# option can be useful when feeding doxygen a huge amount of source files, where -# putting all generated files in the same directory would otherwise causes -# performance problems for the file system. -# The default value is: NO. - -CREATE_SUBDIRS = NO - -# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII -# characters to appear in the names of generated files. If set to NO, non-ASCII -# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode -# U+3044. -# The default value is: NO. - -ALLOW_UNICODE_NAMES = NO - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, -# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), -# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, -# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), -# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, -# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, -# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, -# Ukrainian and Vietnamese. -# The default value is: English. - -OUTPUT_LANGUAGE = English - -# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member -# descriptions after the members that are listed in the file and class -# documentation (similar to Javadoc). Set to NO to disable this. -# The default value is: YES. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief -# description of a member or function before the detailed description -# -# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. -# The default value is: YES. - -REPEAT_BRIEF = YES - -# This tag implements a quasi-intelligent brief description abbreviator that is -# used to form the text in various listings. Each string in this list, if found -# as the leading text of the brief description, will be stripped from the text -# and the result, after processing the whole list, is used as the annotated -# text. Otherwise, the brief description is used as-is. If left blank, the -# following values are used ($name is automatically replaced with the name of -# the entity):The $name class, The $name widget, The $name file, is, provides, -# specifies, contains, represents, a, an and the. - -ABBREVIATE_BRIEF = "The $name class" \ - "The $name widget" \ - "The $name file" \ - is \ - provides \ - specifies \ - contains \ - represents \ - a \ - an \ - the - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# doxygen will generate a detailed section even if there is only a brief -# description. -# The default value is: NO. - -ALWAYS_DETAILED_SEC = NO - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all -# inherited members of a class in the documentation of that class as if those -# members were ordinary class members. Constructors, destructors and assignment -# operators of the base classes will not be shown. -# The default value is: NO. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path -# before files name in the file list and in the header files. If set to NO the -# shortest path that makes the file name unique will be used -# The default value is: YES. - -FULL_PATH_NAMES = YES - -# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. -# Stripping is only done if one of the specified strings matches the left-hand -# part of the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the path to -# strip. -# -# Note that you can specify absolute paths here, but also relative paths, which -# will be relative from the directory where doxygen is started. -# This tag requires that the tag FULL_PATH_NAMES is set to YES. - -STRIP_FROM_PATH = - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the -# path mentioned in the documentation of a class, which tells the reader which -# header file to include in order to use a class. If left blank only the name of -# the header file containing the class definition is used. Otherwise one should -# specify the list of include paths that are normally passed to the compiler -# using the -I flag. - -STRIP_FROM_INC_PATH = - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but -# less readable) file names. This can be useful is your file systems doesn't -# support long names like on DOS, Mac, or CD-ROM. -# The default value is: NO. - -SHORT_NAMES = NO - -# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the -# first line (until the first dot) of a Javadoc-style comment as the brief -# description. If set to NO, the Javadoc-style will behave just like regular Qt- -# style comments (thus requiring an explicit @brief command for a brief -# description.) -# The default value is: NO. - -JAVADOC_AUTOBRIEF = YES - -# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first -# line (until the first dot) of a Qt-style comment as the brief description. If -# set to NO, the Qt-style will behave just like regular Qt-style comments (thus -# requiring an explicit \brief command for a brief description.) -# The default value is: NO. - -QT_AUTOBRIEF = NO - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a -# multi-line C++ special comment block (i.e. a block of //! or /// comments) as -# a brief description. This used to be the default behavior. The new default is -# to treat a multi-line C++ comment block as a detailed description. Set this -# tag to YES if you prefer the old behavior instead. -# -# Note that setting this tag to YES also means that rational rose comments are -# not recognized any more. -# The default value is: NO. - -MULTILINE_CPP_IS_BRIEF = NO - -# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the -# documentation from any documented member that it re-implements. -# The default value is: YES. - -INHERIT_DOCS = YES - -# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new -# page for each member. If set to NO, the documentation of a member will be part -# of the file/class/namespace that contains it. -# The default value is: NO. - -SEPARATE_MEMBER_PAGES = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen -# uses this value to replace tabs by spaces in code fragments. -# Minimum value: 1, maximum value: 16, default value: 4. - -TAB_SIZE = 8 - -# This tag can be used to specify a number of aliases that act as commands in -# the documentation. An alias has the form: -# name=value -# For example adding -# "sideeffect=@par Side Effects:\n" -# will allow you to put the command \sideeffect (or @sideeffect) in the -# documentation, which will result in a user-defined paragraph with heading -# "Side Effects:". You can put \n's in the value part of an alias to insert -# newlines. - -ALIASES = - -# This tag can be used to specify a number of word-keyword mappings (TCL only). -# A mapping has the form "name=value". For example adding "class=itcl::class" -# will allow you to use the command class in the itcl::class meaning. - -TCL_SUBST = - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources -# only. Doxygen will then generate output that is more tailored for C. For -# instance, some of the names that are used will be different. The list of all -# members will be omitted, etc. -# The default value is: NO. - -OPTIMIZE_OUTPUT_FOR_C = NO - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or -# Python sources only. Doxygen will then generate output that is more tailored -# for that language. For instance, namespaces will be presented as packages, -# qualified scopes will look different, etc. -# The default value is: NO. - -OPTIMIZE_OUTPUT_JAVA = NO - -# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran -# sources. Doxygen will then generate output that is tailored for Fortran. -# The default value is: NO. - -OPTIMIZE_FOR_FORTRAN = NO - -# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL -# sources. Doxygen will then generate output that is tailored for VHDL. -# The default value is: NO. - -OPTIMIZE_OUTPUT_VHDL = NO - -# Doxygen selects the parser to use depending on the extension of the files it -# parses. With this tag you can assign which parser to use for a given -# extension. Doxygen has a built-in mapping, but you can override or extend it -# using this tag. The format is ext=language, where ext is a file extension, and -# language is one of the parsers supported by doxygen: IDL, Java, Javascript, -# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: -# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: -# Fortran. In the later case the parser tries to guess whether the code is fixed -# or free formatted code, this is the default for Fortran type files), VHDL. For -# instance to make doxygen treat .inc files as Fortran files (default is PHP), -# and .f files as C (default is Fortran), use: inc=Fortran f=C. -# -# Note: For files without extension you can use no_extension as a placeholder. -# -# Note that for custom extensions you also need to set FILE_PATTERNS otherwise -# the files are not read by doxygen. - -EXTENSION_MAPPING = - -# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments -# according to the Markdown format, which allows for more readable -# documentation. See http://daringfireball.net/projects/markdown/ for details. -# The output of markdown processing is further processed by doxygen, so you can -# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in -# case of backward compatibilities issues. -# The default value is: YES. - -MARKDOWN_SUPPORT = YES - -# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up -# to that level are automatically included in the table of contents, even if -# they do not have an id attribute. -# Note: This feature currently applies only to Markdown headings. -# Minimum value: 0, maximum value: 99, default value: 0. -# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. - -TOC_INCLUDE_HEADINGS = 0 - -# When enabled doxygen tries to link words that correspond to documented -# classes, or namespaces to their corresponding documentation. Such a link can -# be prevented in individual cases by putting a % sign in front of the word or -# globally by setting AUTOLINK_SUPPORT to NO. -# The default value is: YES. - -AUTOLINK_SUPPORT = YES - -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want -# to include (a tag file for) the STL sources as input, then you should set this -# tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); -# versus func(std::string) {}). This also make the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. -# The default value is: NO. - -BUILTIN_STL_SUPPORT = NO - -# If you use Microsoft's C++/CLI language, you should set this option to YES to -# enable parsing support. -# The default value is: NO. - -CPP_CLI_SUPPORT = NO - -# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: -# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen -# will parse them like normal C++ but will assume all classes use public instead -# of private inheritance when no explicit protection keyword is present. -# The default value is: NO. - -SIP_SUPPORT = NO - -# For Microsoft's IDL there are propget and propput attributes to indicate -# getter and setter methods for a property. Setting this option to YES will make -# doxygen to replace the get and set methods by a property in the documentation. -# This will only work if the methods are indeed getting or setting a simple -# type. If this is not the case, or you want to show the methods anyway, you -# should set this option to NO. -# The default value is: YES. - -IDL_PROPERTY_SUPPORT = YES - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. -# The default value is: NO. - -DISTRIBUTE_GROUP_DOC = NO - -# If one adds a struct or class to a group and this option is enabled, then also -# any nested class or struct is added to the same group. By default this option -# is disabled and one has to add nested compounds explicitly via \ingroup. -# The default value is: NO. - -GROUP_NESTED_COMPOUNDS = NO - -# Set the SUBGROUPING tag to YES to allow class member groups of the same type -# (for instance a group of public functions) to be put as a subgroup of that -# type (e.g. under the Public Functions section). Set it to NO to prevent -# subgrouping. Alternatively, this can be done per class using the -# \nosubgrouping command. -# The default value is: YES. - -SUBGROUPING = YES - -# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions -# are shown inside the group in which they are included (e.g. using \ingroup) -# instead of on a separate page (for HTML and Man pages) or section (for LaTeX -# and RTF). -# -# Note that this feature does not work in combination with -# SEPARATE_MEMBER_PAGES. -# The default value is: NO. - -INLINE_GROUPED_CLASSES = NO - -# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions -# with only public data fields or simple typedef fields will be shown inline in -# the documentation of the scope in which they are defined (i.e. file, -# namespace, or group documentation), provided this scope is documented. If set -# to NO, structs, classes, and unions are shown on a separate page (for HTML and -# Man pages) or section (for LaTeX and RTF). -# The default value is: NO. - -INLINE_SIMPLE_STRUCTS = NO - -# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or -# enum is documented as struct, union, or enum with the name of the typedef. So -# typedef struct TypeS {} TypeT, will appear in the documentation as a struct -# with name TypeT. When disabled the typedef will appear as a member of a file, -# namespace, or class. And the struct will be named TypeS. This can typically be -# useful for C code in case the coding convention dictates that all compound -# types are typedef'ed and only the typedef is referenced, never the tag name. -# The default value is: NO. - -TYPEDEF_HIDES_STRUCT = NO - -# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This -# cache is used to resolve symbols given their name and scope. Since this can be -# an expensive process and often the same symbol appears multiple times in the -# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small -# doxygen will become slower. If the cache is too large, memory is wasted. The -# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range -# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 -# symbols. At the end of a run doxygen will report the cache usage and suggest -# the optimal cache size from a speed point of view. -# Minimum value: 0, maximum value: 9, default value: 0. - -LOOKUP_CACHE_SIZE = 0 - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in -# documentation are documented, even if no documentation was available. Private -# class members and static file members will be hidden unless the -# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. -# Note: This will also disable the warnings about undocumented members that are -# normally produced when WARNINGS is set to YES. -# The default value is: NO. - -EXTRACT_ALL = YES - -# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will -# be included in the documentation. -# The default value is: NO. - -EXTRACT_PRIVATE = YES - -# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal -# scope will be included in the documentation. -# The default value is: NO. - -EXTRACT_PACKAGE = NO - -# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be -# included in the documentation. -# The default value is: NO. - -EXTRACT_STATIC = YES - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined -# locally in source files will be included in the documentation. If set to NO, -# only classes defined in header files are included. Does not have any effect -# for Java sources. -# The default value is: YES. - -EXTRACT_LOCAL_CLASSES = YES - -# This flag is only useful for Objective-C code. If set to YES, local methods, -# which are defined in the implementation section but not in the interface are -# included in the documentation. If set to NO, only methods in the interface are -# included. -# The default value is: NO. - -EXTRACT_LOCAL_METHODS = NO - -# If this flag is set to YES, the members of anonymous namespaces will be -# extracted and appear in the documentation as a namespace called -# 'anonymous_namespace{file}', where file will be replaced with the base name of -# the file that contains the anonymous namespace. By default anonymous namespace -# are hidden. -# The default value is: NO. - -EXTRACT_ANON_NSPACES = NO - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all -# undocumented members inside documented classes or files. If set to NO these -# members will be included in the various overviews, but no documentation -# section is generated. This option has no effect if EXTRACT_ALL is enabled. -# The default value is: NO. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. If set -# to NO, these classes will be included in the various overviews. This option -# has no effect if EXTRACT_ALL is enabled. -# The default value is: NO. - -HIDE_UNDOC_CLASSES = NO - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend -# (class|struct|union) declarations. If set to NO, these declarations will be -# included in the documentation. -# The default value is: NO. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any -# documentation blocks found inside the body of a function. If set to NO, these -# blocks will be appended to the function's detailed documentation block. -# The default value is: NO. - -HIDE_IN_BODY_DOCS = NO - -# The INTERNAL_DOCS tag determines if documentation that is typed after a -# \internal command is included. If the tag is set to NO then the documentation -# will be excluded. Set it to YES to include the internal documentation. -# The default value is: NO. - -INTERNAL_DOCS = NO - -# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file -# names in lower-case letters. If set to YES, upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# and Mac users are advised to set this option to NO. -# The default value is: system dependent. - -CASE_SENSE_NAMES = NO - -# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with -# their full class and namespace scopes in the documentation. If set to YES, the -# scope will be hidden. -# The default value is: NO. - -HIDE_SCOPE_NAMES = NO - -# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will -# append additional text to a page's title, such as Class Reference. If set to -# YES the compound reference will be hidden. -# The default value is: NO. - -HIDE_COMPOUND_REFERENCE= NO - -# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of -# the files that are included by a file in the documentation of that file. -# The default value is: YES. - -SHOW_INCLUDE_FILES = YES - -# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each -# grouped member an include statement to the documentation, telling the reader -# which file to include in order to use the member. -# The default value is: NO. - -SHOW_GROUPED_MEMB_INC = NO - -# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include -# files with double quotes in the documentation rather than with sharp brackets. -# The default value is: NO. - -FORCE_LOCAL_INCLUDES = NO - -# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the -# documentation for inline members. -# The default value is: YES. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the -# (detailed) documentation of file and class members alphabetically by member -# name. If set to NO, the members will appear in declaration order. -# The default value is: YES. - -SORT_MEMBER_DOCS = YES - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief -# descriptions of file, namespace and class members alphabetically by member -# name. If set to NO, the members will appear in declaration order. Note that -# this will also influence the order of the classes in the class list. -# The default value is: NO. - -SORT_BRIEF_DOCS = NO - -# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the -# (brief and detailed) documentation of class members so that constructors and -# destructors are listed first. If set to NO the constructors will appear in the -# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. -# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief -# member documentation. -# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting -# detailed member documentation. -# The default value is: NO. - -SORT_MEMBERS_CTORS_1ST = NO - -# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy -# of group names into alphabetical order. If set to NO the group names will -# appear in their defined order. -# The default value is: NO. - -SORT_GROUP_NAMES = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by -# fully-qualified names, including namespaces. If set to NO, the class list will -# be sorted only by class name, not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the alphabetical -# list. -# The default value is: NO. - -SORT_BY_SCOPE_NAME = NO - -# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper -# type resolution of all parameters of a function it will reject a match between -# the prototype and the implementation of a member function even if there is -# only one candidate or it is obvious which candidate to choose by doing a -# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still -# accept a match between prototype and implementation in such cases. -# The default value is: NO. - -STRICT_PROTO_MATCHING = NO - -# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo -# list. This list is created by putting \todo commands in the documentation. -# The default value is: YES. - -GENERATE_TODOLIST = YES - -# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test -# list. This list is created by putting \test commands in the documentation. -# The default value is: YES. - -GENERATE_TESTLIST = YES - -# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug -# list. This list is created by putting \bug commands in the documentation. -# The default value is: YES. - -GENERATE_BUGLIST = YES - -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) -# the deprecated list. This list is created by putting \deprecated commands in -# the documentation. -# The default value is: YES. - -GENERATE_DEPRECATEDLIST= YES - -# The ENABLED_SECTIONS tag can be used to enable conditional documentation -# sections, marked by \if ... \endif and \cond -# ... \endcond blocks. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the -# initial value of a variable or macro / define can have for it to appear in the -# documentation. If the initializer consists of more lines than specified here -# it will be hidden. Use a value of 0 to hide initializers completely. The -# appearance of the value of individual variables and macros / defines can be -# controlled using \showinitializer or \hideinitializer command in the -# documentation regardless of this setting. -# Minimum value: 0, maximum value: 10000, default value: 30. - -MAX_INITIALIZER_LINES = 30 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at -# the bottom of the documentation of classes and structs. If set to YES, the -# list will mention the files that were used to generate the documentation. -# The default value is: YES. - -SHOW_USED_FILES = YES - -# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This -# will remove the Files entry from the Quick Index and from the Folder Tree View -# (if specified). -# The default value is: YES. - -SHOW_FILES = YES - -# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces -# page. This will remove the Namespaces entry from the Quick Index and from the -# Folder Tree View (if specified). -# The default value is: YES. - -SHOW_NAMESPACES = YES - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from -# the version control system). Doxygen will invoke the program by executing (via -# popen()) the command command input-file, where command is the value of the -# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided -# by doxygen. Whatever the program writes to standard output is used as the file -# version. For an example see the documentation. - -FILE_VERSION_FILTER = - -# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed -# by doxygen. The layout file controls the global structure of the generated -# output files in an output format independent way. To create the layout file -# that represents doxygen's defaults, run doxygen with the -l option. You can -# optionally specify a file name after the option, if omitted DoxygenLayout.xml -# will be used as the name of the layout file. -# -# Note that if you run doxygen from a directory containing a file called -# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE -# tag is left empty. - -LAYOUT_FILE = - -# The CITE_BIB_FILES tag can be used to specify one or more bib files containing -# the reference definitions. This must be a list of .bib files. The .bib -# extension is automatically appended if omitted. This requires the bibtex tool -# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. -# For LaTeX the style of the bibliography can be controlled using -# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the -# search path. See also \cite for info how to create references. - -CITE_BIB_FILES = - -#--------------------------------------------------------------------------- -# Configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated to -# standard output by doxygen. If QUIET is set to YES this implies that the -# messages are off. -# The default value is: NO. - -QUIET = NO - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES -# this implies that the warnings are on. -# -# Tip: Turn warnings on while writing the documentation. -# The default value is: YES. - -WARNINGS = YES - -# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate -# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag -# will automatically be disabled. -# The default value is: YES. - -WARN_IF_UNDOCUMENTED = YES - -# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some parameters -# in a documented function, or documenting parameters that don't exist or using -# markup commands wrongly. -# The default value is: YES. - -WARN_IF_DOC_ERROR = YES - -# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that -# are documented, but have no documentation for their parameters or return -# value. If set to NO, doxygen will only warn about wrong or incomplete -# parameter documentation, but not about the absence of documentation. -# The default value is: NO. - -WARN_NO_PARAMDOC = NO - -# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when -# a warning is encountered. -# The default value is: NO. - -WARN_AS_ERROR = NO - -# The WARN_FORMAT tag determines the format of the warning messages that doxygen -# can produce. The string should contain the $file, $line, and $text tags, which -# will be replaced by the file and line number from which the warning originated -# and the warning text. Optionally the format may contain $version, which will -# be replaced by the version of the file (if it could be obtained via -# FILE_VERSION_FILTER) -# The default value is: $file:$line: $text. - -WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning and error -# messages should be written. If left blank the output is written to standard -# error (stderr). - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# Configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag is used to specify the files and/or directories that contain -# documented source files. You may enter file names like myfile.cpp or -# directories like /usr/src/myproject. Separate the files or directories with -# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING -# Note: If this tag is empty the current directory is searched. - -INPUT = src doc/README_doxygen.md - -# This tag can be used to specify the character encoding of the source files -# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses -# libiconv (or the iconv built into libc) for the transcoding. See the libiconv -# documentation (see: http://www.gnu.org/software/libiconv) for the list of -# possible encodings. -# The default value is: UTF-8. - -INPUT_ENCODING = UTF-8 - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and -# *.h) to filter out the source-files in the directories. -# -# Note that for custom extensions or not directly supported extensions you also -# need to set EXTENSION_MAPPING for the extension otherwise the files are not -# read by doxygen. -# -# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, -# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, -# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, -# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, -# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf and *.qsf. - -FILE_PATTERNS = *.c \ - *.cc \ - *.cxx \ - *.cpp \ - *.c++ \ - *.d \ - *.java \ - *.ii \ - *.ixx \ - *.ipp \ - *.i++ \ - *.inl \ - *.h \ - *.hh \ - *.hxx \ - *.hpp \ - *.h++ \ - *.idl \ - *.odl \ - *.cs \ - *.php \ - *.php3 \ - *.inc \ - *.m \ - *.mm \ - *.dox \ - *.py \ - *.f90 \ - *.f \ - *.for \ - *.vhd \ - *.vhdl - -# The RECURSIVE tag can be used to specify whether or not subdirectories should -# be searched for input files as well. -# The default value is: NO. - -RECURSIVE = YES - -# The EXCLUDE tag can be used to specify files and/or directories that should be -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. -# -# Note that relative paths are relative to the directory from which doxygen is -# run. - -EXCLUDE = src/crc32c \ - src/leveldb \ - src/json - -# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or -# directories that are symbolic links (a Unix file system feature) are excluded -# from the input. -# The default value is: NO. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. -# -# Note that the wildcards are matched against the file with absolute path, so to -# exclude all test directories for example use the pattern */test/* - -EXCLUDE_PATTERNS = - -# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names -# (namespaces, classes, functions, etc.) that should be excluded from the -# output. The symbol name can be a fully qualified name, a word, or if the -# wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test -# -# Note that the wildcards are matched against the file with absolute path, so to -# exclude all test directories use the pattern */test/* - -EXCLUDE_SYMBOLS = boost \ - google - -# The EXAMPLE_PATH tag can be used to specify one or more files or directories -# that contain example code fragments that are included (see the \include -# command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and -# *.h) to filter out the source-files in the directories. If left blank all -# files are included. - -EXAMPLE_PATTERNS = * - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude commands -# irrespective of the value of the RECURSIVE tag. -# The default value is: NO. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or directories -# that contain images that are to be included in the documentation (see the -# \image command). - -IMAGE_PATH = - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command: -# -# -# -# where is the value of the INPUT_FILTER tag, and is the -# name of an input file. Doxygen will then use the output that the filter -# program writes to standard output. If FILTER_PATTERNS is specified, this tag -# will be ignored. -# -# Note that the filter must not add or remove lines; it is applied before the -# code is scanned, but not when the output code is generated. If lines are added -# or removed, the anchors will not be placed correctly. -# -# Note that for custom extensions or not directly supported extensions you also -# need to set EXTENSION_MAPPING for the extension otherwise the files are not -# properly processed by doxygen. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. The filters are a list of the form: pattern=filter -# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how -# filters are used. If the FILTER_PATTERNS tag is empty or if none of the -# patterns match the file name, INPUT_FILTER is applied. -# -# Note that for custom extensions or not directly supported extensions you also -# need to set EXTENSION_MAPPING for the extension otherwise the files are not -# properly processed by doxygen. - -FILTER_PATTERNS = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will also be used to filter the input files that are used for -# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). -# The default value is: NO. - -FILTER_SOURCE_FILES = NO - -# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file -# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and -# it is also possible to disable source filtering for a specific pattern using -# *.ext= (so without naming a filter). -# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. - -FILTER_SOURCE_PATTERNS = - -# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that -# is part of the input, its contents will be placed on the main page -# (index.html). This can be useful if you have a project on for instance GitHub -# and want to reuse the introduction page also for the doxygen output. - -USE_MDFILE_AS_MAINPAGE = doc/README_doxygen.md - -#--------------------------------------------------------------------------- -# Configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will be -# generated. Documented entities will be cross-referenced with these sources. -# -# Note: To get rid of all source code in the generated output, make sure that -# also VERBATIM_HEADERS is set to NO. -# The default value is: NO. - -SOURCE_BROWSER = YES - -# Setting the INLINE_SOURCES tag to YES will include the body of functions, -# classes and enums directly into the documentation. -# The default value is: NO. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any -# special comment blocks from generated source code fragments. Normal C, C++ and -# Fortran comments will always remain visible. -# The default value is: YES. - -STRIP_CODE_COMMENTS = YES - -# If the REFERENCED_BY_RELATION tag is set to YES then for each documented -# function all documented functions referencing it will be listed. -# The default value is: NO. - -REFERENCED_BY_RELATION = NO - -# If the REFERENCES_RELATION tag is set to YES then for each documented function -# all documented entities called/used by that function will be listed. -# The default value is: NO. - -REFERENCES_RELATION = NO - -# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set -# to YES then the hyperlinks from functions in REFERENCES_RELATION and -# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will -# link to the documentation. -# The default value is: YES. - -REFERENCES_LINK_SOURCE = YES - -# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the -# source code will show a tooltip with additional information such as prototype, -# brief description and links to the definition and documentation. Since this -# will make the HTML file larger and loading of large files a bit slower, you -# can opt to disable this feature. -# The default value is: YES. -# This tag requires that the tag SOURCE_BROWSER is set to YES. - -SOURCE_TOOLTIPS = YES - -# If the USE_HTAGS tag is set to YES then the references to source code will -# point to the HTML generated by the htags(1) tool instead of doxygen built-in -# source browser. The htags tool is part of GNU's global source tagging system -# (see http://www.gnu.org/software/global/global.html). You will need version -# 4.8.6 or higher. -# -# To use it do the following: -# - Install the latest version of global -# - Enable SOURCE_BROWSER and USE_HTAGS in the config file -# - Make sure the INPUT points to the root of the source tree -# - Run doxygen as normal -# -# Doxygen will invoke htags (and that will in turn invoke gtags), so these -# tools must be available from the command line (i.e. in the search path). -# -# The result: instead of the source browser generated by doxygen, the links to -# source code will now point to the output of htags. -# The default value is: NO. -# This tag requires that the tag SOURCE_BROWSER is set to YES. - -USE_HTAGS = NO - -# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a -# verbatim copy of the header file for each class for which an include is -# specified. Set to NO to disable this. -# See also: Section \class. -# The default value is: YES. - -VERBATIM_HEADERS = YES - -#--------------------------------------------------------------------------- -# Configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all -# compounds will be generated. Enable this if the project contains a lot of -# classes, structs, unions or interfaces. -# The default value is: YES. - -ALPHABETICAL_INDEX = YES - -# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in -# which the alphabetical index list will be split. -# Minimum value: 1, maximum value: 20, default value: 5. -# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. - -COLS_IN_ALPHA_INDEX = 5 - -# In case all classes in a project start with a common prefix, all classes will -# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag -# can be used to specify a prefix (or a list of prefixes) that should be ignored -# while generating the index headers. -# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output -# The default value is: YES. - -GENERATE_HTML = YES - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a -# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of -# it. -# The default directory is: html. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_OUTPUT = html - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each -# generated HTML page (for example: .htm, .php, .asp). -# The default value is: .html. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a user-defined HTML header file for -# each generated HTML page. If the tag is left blank doxygen will generate a -# standard header. -# -# To get valid HTML the header file that includes any scripts and style sheets -# that doxygen needs, which is dependent on the configuration options used (e.g. -# the setting GENERATE_TREEVIEW). It is highly recommended to start with a -# default header using -# doxygen -w html new_header.html new_footer.html new_stylesheet.css -# YourConfigFile -# and then modify the file new_header.html. See also section "Doxygen usage" -# for information on how to generate the default header that doxygen normally -# uses. -# Note: The header is subject to change so you typically have to regenerate the -# default header when upgrading to a newer version of doxygen. For a description -# of the possible markers and block names see the documentation. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_HEADER = - -# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each -# generated HTML page. If the tag is left blank doxygen will generate a standard -# footer. See HTML_HEADER for more information on how to generate a default -# footer and what special commands can be used inside the footer. See also -# section "Doxygen usage" for information on how to generate the default footer -# that doxygen normally uses. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_FOOTER = - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style -# sheet that is used by each HTML page. It can be used to fine-tune the look of -# the HTML output. If left blank doxygen will generate a default style sheet. -# See also section "Doxygen usage" for information on how to generate the style -# sheet that doxygen normally uses. -# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as -# it is more robust and this tag (HTML_STYLESHEET) will in the future become -# obsolete. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_STYLESHEET = - -# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined -# cascading style sheets that are included after the standard style sheets -# created by doxygen. Using this option one can overrule certain style aspects. -# This is preferred over using HTML_STYLESHEET since it does not replace the -# standard style sheet and is therefore more robust against future updates. -# Doxygen will copy the style sheet files to the output directory. -# Note: The order of the extra style sheet files is of importance (e.g. the last -# style sheet in the list overrules the setting of the previous ones in the -# list). For an example see the documentation. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_EXTRA_STYLESHEET = - -# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or -# other source files which should be copied to the HTML output directory. Note -# that these files will be copied to the base HTML output directory. Use the -# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these -# files. In the HTML_STYLESHEET file, use the file name only. Also note that the -# files will be copied as-is; there are no commands or markers available. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_EXTRA_FILES = - -# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen -# will adjust the colors in the style sheet and background images according to -# this color. Hue is specified as an angle on a colorwheel, see -# http://en.wikipedia.org/wiki/Hue for more information. For instance the value -# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 -# purple, and 360 is red again. -# Minimum value: 0, maximum value: 359, default value: 220. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_HUE = 220 - -# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors -# in the HTML output. For a value of 0 the output will use grayscales only. A -# value of 255 will produce the most vivid colors. -# Minimum value: 0, maximum value: 255, default value: 100. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_SAT = 100 - -# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the -# luminance component of the colors in the HTML output. Values below 100 -# gradually make the output lighter, whereas values above 100 make the output -# darker. The value divided by 100 is the actual gamma applied, so 80 represents -# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not -# change the gamma. -# Minimum value: 40, maximum value: 240, default value: 80. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_GAMMA = 80 - -# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML -# page will contain the date and time when the page was generated. Setting this -# to YES can help to show when doxygen was last run and thus if the -# documentation is up to date. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_TIMESTAMP = YES - -# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML -# documentation will contain sections that can be hidden and shown after the -# page has loaded. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_DYNAMIC_SECTIONS = NO - -# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries -# shown in the various tree structured indices initially; the user can expand -# and collapse entries dynamically later on. Doxygen will expand the tree to -# such a level that at most the specified number of entries are visible (unless -# a fully collapsed tree already exceeds this amount). So setting the number of -# entries 1 will produce a full collapsed tree by default. 0 is a special value -# representing an infinite number of entries and will result in a full expanded -# tree by default. -# Minimum value: 0, maximum value: 9999, default value: 100. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_INDEX_NUM_ENTRIES = 100 - -# If the GENERATE_DOCSET tag is set to YES, additional index files will be -# generated that can be used as input for Apple's Xcode 3 integrated development -# environment (see: http://developer.apple.com/tools/xcode/), introduced with -# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a -# Makefile in the HTML output directory. Running make will produce the docset in -# that directory and running make install will install the docset in -# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at -# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html -# for more information. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_DOCSET = NO - -# This tag determines the name of the docset feed. A documentation feed provides -# an umbrella under which multiple documentation sets from a single provider -# (such as a company or product suite) can be grouped. -# The default value is: Doxygen generated docs. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_FEEDNAME = "Doxygen generated docs" - -# This tag specifies a string that should uniquely identify the documentation -# set bundle. This should be a reverse domain-name style string, e.g. -# com.mycompany.MyDocSet. Doxygen will append .docset to the name. -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_BUNDLE_ID = org.BGL.BGL-Core - -# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify -# the documentation publisher. This should be a reverse domain-name style -# string, e.g. com.mycompany.MyDocSet.documentation. -# The default value is: org.doxygen.Publisher. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_PUBLISHER_ID = org.BGL.BGL-Core - -# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. -# The default value is: Publisher. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_PUBLISHER_NAME = Publisher - -# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three -# additional HTML index files: index.hhp, index.hhc, and index.hhk. The -# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop -# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on -# Windows. -# -# The HTML Help Workshop contains a compiler that can convert all HTML output -# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML -# files are now used as the Windows 98 help format, and will replace the old -# Windows help format (.hlp) on all Windows platforms in the future. Compressed -# HTML files also contain an index, a table of contents, and you can search for -# words in the documentation. The HTML workshop also contains a viewer for -# compressed HTML files. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_HTMLHELP = NO - -# The CHM_FILE tag can be used to specify the file name of the resulting .chm -# file. You can add a path in front of the file if the result should not be -# written to the html output directory. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -CHM_FILE = - -# The HHC_LOCATION tag can be used to specify the location (absolute path -# including file name) of the HTML help compiler (hhc.exe). If non-empty, -# doxygen will try to run the HTML help compiler on the generated index.hhp. -# The file has to be specified with full path. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -HHC_LOCATION = - -# The GENERATE_CHI flag controls if a separate .chi index file is generated -# (YES) or that it should be included in the master .chm file (NO). -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -GENERATE_CHI = NO - -# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) -# and project file content. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -CHM_INDEX_ENCODING = - -# The BINARY_TOC flag controls whether a binary table of contents is generated -# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it -# enables the Previous and Next buttons. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members to -# the table of contents of the HTML help documentation and to the tree view. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -TOC_EXPAND = NO - -# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and -# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that -# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help -# (.qch) of the generated HTML documentation. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_QHP = NO - -# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify -# the file name of the resulting .qch file. The path specified is relative to -# the HTML output folder. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QCH_FILE = - -# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help -# Project output. For more information please see Qt Help Project / Namespace -# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_NAMESPACE = org.doxygen.Project - -# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt -# Help Project output. For more information please see Qt Help Project / Virtual -# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- -# folders). -# The default value is: doc. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_VIRTUAL_FOLDER = doc - -# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom -# filter to add. For more information please see Qt Help Project / Custom -# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- -# filters). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_CUST_FILTER_NAME = - -# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the -# custom filter to add. For more information please see Qt Help Project / Custom -# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- -# filters). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_CUST_FILTER_ATTRS = - -# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this -# project's filter section matches. Qt Help Project / Filter Attributes (see: -# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_SECT_FILTER_ATTRS = - -# The QHG_LOCATION tag can be used to specify the location of Qt's -# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the -# generated .qhp file. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHG_LOCATION = - -# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be -# generated, together with the HTML files, they form an Eclipse help plugin. To -# install this plugin and make it available under the help contents menu in -# Eclipse, the contents of the directory containing the HTML and XML files needs -# to be copied into the plugins directory of eclipse. The name of the directory -# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. -# After copying Eclipse needs to be restarted before the help appears. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_ECLIPSEHELP = NO - -# A unique identifier for the Eclipse help plugin. When installing the plugin -# the directory name containing the HTML and XML files should also have this -# name. Each documentation set should have its own identifier. -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. - -ECLIPSE_DOC_ID = org.doxygen.Project - -# If you want full control over the layout of the generated HTML pages it might -# be necessary to disable the index and replace it with your own. The -# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top -# of each HTML page. A value of NO enables the index and the value YES disables -# it. Since the tabs in the index contain the same information as the navigation -# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -DISABLE_INDEX = NO - -# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index -# structure should be generated to display hierarchical information. If the tag -# value is set to YES, a side panel will be generated containing a tree-like -# index structure (just like the one that is generated for HTML Help). For this -# to work a browser that supports JavaScript, DHTML, CSS and frames is required -# (i.e. any modern browser). Windows users are probably better off using the -# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can -# further fine-tune the look of the index. As an example, the default style -# sheet generated by doxygen has an example that shows how to put an image at -# the root of the tree instead of the PROJECT_NAME. Since the tree basically has -# the same information as the tab index, you could consider setting -# DISABLE_INDEX to YES when enabling this option. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_TREEVIEW = NO - -# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that -# doxygen will group on one line in the generated HTML documentation. -# -# Note that a value of 0 will completely suppress the enum values from appearing -# in the overview section. -# Minimum value: 0, maximum value: 20, default value: 4. -# This tag requires that the tag GENERATE_HTML is set to YES. - -ENUM_VALUES_PER_LINE = 4 - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used -# to set the initial width (in pixels) of the frame in which the tree is shown. -# Minimum value: 0, maximum value: 1500, default value: 250. -# This tag requires that the tag GENERATE_HTML is set to YES. - -TREEVIEW_WIDTH = 250 - -# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to -# external symbols imported via tag files in a separate window. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -EXT_LINKS_IN_WINDOW = NO - -# Use this tag to change the font size of LaTeX formulas included as images in -# the HTML documentation. When you change the font size after a successful -# doxygen run you need to manually remove any form_*.png images from the HTML -# output directory to force them to be regenerated. -# Minimum value: 8, maximum value: 50, default value: 10. -# This tag requires that the tag GENERATE_HTML is set to YES. - -FORMULA_FONTSIZE = 10 - -# Use the FORMULA_TRANPARENT tag to determine whether or not the images -# generated for formulas are transparent PNGs. Transparent PNGs are not -# supported properly for IE 6.0, but are supported on all modern browsers. -# -# Note that when changing this option you need to delete any form_*.png files in -# the HTML output directory before the changes have effect. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -FORMULA_TRANSPARENT = YES - -# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see -# http://www.mathjax.org) which uses client side Javascript for the rendering -# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX -# installed or if you want to formulas look prettier in the HTML output. When -# enabled you may also need to install MathJax separately and configure the path -# to it using the MATHJAX_RELPATH option. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -USE_MATHJAX = NO - -# When MathJax is enabled you can set the default output format to be used for -# the MathJax output. See the MathJax site (see: -# http://docs.mathjax.org/en/latest/output.html) for more details. -# Possible values are: HTML-CSS (which is slower, but has the best -# compatibility), NativeMML (i.e. MathML) and SVG. -# The default value is: HTML-CSS. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_FORMAT = HTML-CSS - -# When MathJax is enabled you need to specify the location relative to the HTML -# output directory using the MATHJAX_RELPATH option. The destination directory -# should contain the MathJax.js script. For instance, if the mathjax directory -# is located at the same level as the HTML output directory, then -# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax -# Content Delivery Network so you can quickly see the result without installing -# MathJax. However, it is strongly recommended to install a local copy of -# MathJax from http://www.mathjax.org before deployment. -# The default value is: http://cdn.mathjax.org/mathjax/latest. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_RELPATH = http://www.mathjax.org/mathjax - -# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax -# extension names that should be enabled during MathJax rendering. For example -# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_EXTENSIONS = - -# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces -# of code that will be used on startup of the MathJax code. See the MathJax site -# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an -# example see the documentation. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_CODEFILE = - -# When the SEARCHENGINE tag is enabled doxygen will generate a search box for -# the HTML output. The underlying search engine uses javascript and DHTML and -# should work on any modern browser. Note that when using HTML help -# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) -# there is already a search function so this one should typically be disabled. -# For large projects the javascript based search engine can be slow, then -# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to -# search using the keyboard; to jump to the search box use + S -# (what the is depends on the OS and browser, but it is typically -# , /