diff --git a/.cirrus.yml b/.cirrus.yml deleted file mode 100644 index 5e06b56d232..00000000000 --- a/.cirrus.yml +++ /dev/null @@ -1,224 +0,0 @@ -env: # Global defaults - SECP256K1_TEST_ITERS: 16 # ELEMENTS: avoid test timeouts on arm - CIRRUS_CLONE_DEPTH: 1 - CIRRUS_LOG_TIMESTAMP: true - MAKEJOBS: "-j3" # ELEMENTS: reduced from j4 - TEST_RUNNER_PORT_MIN: "14000" # Must be larger than 12321, which is used for the http cache. See https://cirrus-ci.org/guide/writing-tasks/#http-cache - CI_FAILFAST_TEST_LEAVE_DANGLING: "1" # Cirrus CI does not care about dangling processes and setting this variable avoids killing the CI script itself on error - -cirrus_ephemeral_worker_template_env: &CIRRUS_EPHEMERAL_WORKER_TEMPLATE_ENV - DANGER_RUN_CI_ON_HOST: "1" # Containers will be discarded after the run, so there is no risk that the ci scripts modify the system - -# 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, with at least 2 vCPUs and 8 GB of memory. -# - medium: For an x86_64 machine, with at least 4 vCPUs and 16 GB of memory. -# - arm64: For an aarch64 machine, with at least 2 vCPUs 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: -# - 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 uidmap slirp4netns 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: - # Require git (used in fingerprint_script). - - git --version || ( apt-get update && apt-get install -y git ) - - rsync --version || bash -c "$PACKAGE_MANAGER_INSTALL rsync" # ELEMENTS - - if [ "$CIRRUS_PR" = "" ]; then exit 0; fi - - git fetch --depth=1 $CIRRUS_REPO_CLONE_URL "pull/${CIRRUS_PR}/merge" - - git checkout FETCH_HEAD # Use merged changes to detect silent merge conflicts - # Also, the merge commit is used to lint COMMIT_RANGE="HEAD~..HEAD" - -main_template: &MAIN_TEMPLATE - timeout_in: 120m # https://cirrus-ci.org/faq/#instance-timed-out - ci_script: - - ./ci/test_run_all.sh - -global_task_template: &GLOBAL_TASK_TEMPLATE - << : *BASE_TEMPLATE - << : *MAIN_TEMPLATE - -compute_credits_template: &CREDITS_TEMPLATE - # https://cirrus-ci.org/pricing/#compute-credits - # Only use credits for pull requests to the main repo - use_compute_credits: $CIRRUS_REPO_FULL_NAME == 'ElementsProject/elements' && $CIRRUS_PR != "" - -task: - name: 'lint' - << : *BASE_TEMPLATE - container: - image: debian:bookworm - cpu: 1 - memory: 1G - # For faster CI feedback, immediately schedule the linters - << : *CREDITS_TEMPLATE - test_runner_cache: - folder: "/lint_test_runner" - fingerprint_script: echo $CIRRUS_TASK_NAME $(git rev-parse HEAD:test/lint/test_runner) - python_cache: - folder: "/python_build" - fingerprint_script: cat .python-version /etc/os-release - unshallow_script: - - git fetch --unshallow --no-tags - lint_script: - - ./ci/lint_run_all.sh - -task: - name: 'tidy' - << : *GLOBAL_TASK_TEMPLATE - timeout_in: 180m # ELEMENTS - container: - image: docker.io/ubuntu:24.04 - env: - << : *CIRRUS_EPHEMERAL_WORKER_TEMPLATE_ENV - FILE_ENV: "./ci/test/00_setup_env_native_tidy.sh" - -task: - name: 'ARM, unit tests, no functional tests' - << : *GLOBAL_TASK_TEMPLATE - arm_container: - image: docker.io/arm64v8/debian:bookworm - env: - << : *CIRRUS_EPHEMERAL_WORKER_TEMPLATE_ENV - FILE_ENV: "./ci/test/00_setup_env_arm.sh" - -task: - name: 'Win64-cross' - << : *GLOBAL_TASK_TEMPLATE - container: - image: docker.io/amd64/ubuntu:22.04 - env: - << : *CIRRUS_EPHEMERAL_WORKER_TEMPLATE_ENV - FILE_ENV: "./ci/test/00_setup_env_win64.sh" - -task: - name: 'CentOS, depends, gui' - << : *GLOBAL_TASK_TEMPLATE - container: - image: quay.io/rockylinux/rockylinux:9 - env: - FILE_ENV: "./ci/test/00_setup_env_native_centos.sh" - -task: - name: 'previous releases, depends DEBUG' - << : *GLOBAL_TASK_TEMPLATE - container: - image: docker.io/debian:bullseye - env: - << : *CIRRUS_EPHEMERAL_WORKER_TEMPLATE_ENV - FILE_ENV: "./ci/test/00_setup_env_native_previous_releases.sh" - -task: - name: 'TSan, depends, gui' - << : *GLOBAL_TASK_TEMPLATE - container: - image: docker.io/ubuntu:24.04 - cpu: 6 - memory: 24G - env: - << : *CIRRUS_EPHEMERAL_WORKER_TEMPLATE_ENV - FILE_ENV: "./ci/test/00_setup_env_native_tsan.sh" - -task: - name: 'MSan, depends' - << : *GLOBAL_TASK_TEMPLATE - container: - image: ubuntu:24.04 - cpu: 4 - memory: 16G - env: - << : *CIRRUS_EPHEMERAL_WORKER_TEMPLATE_ENV - FILE_ENV: "./ci/test/00_setup_env_native_msan.sh" - -task: - name: 'fuzzer,address,undefined,integer, no depends' - << : *GLOBAL_TASK_TEMPLATE - container: - image: docker.io/ubuntu:24.04 - cpu: 8 - memory: 16G - timeout_in: 240m # larger timeout, due to the high CPU demand - env: - << : *CIRRUS_EPHEMERAL_WORKER_TEMPLATE_ENV - FILE_ENV: "./ci/test/00_setup_env_native_fuzz.sh" - -task: - name: 'multiprocess, i686, DEBUG' - << : *GLOBAL_TASK_TEMPLATE - container: - image: docker.io/amd64/ubuntu:22.04 - env: - << : *CIRRUS_EPHEMERAL_WORKER_TEMPLATE_ENV - FILE_ENV: "./ci/test/00_setup_env_i686_multiprocess.sh" - -task: - name: 'no wallet, libbitcoinkernel' - << : *GLOBAL_TASK_TEMPLATE - container: - image: docker.io/ubuntu:22.04 - env: - << : *CIRRUS_EPHEMERAL_WORKER_TEMPLATE_ENV - FILE_ENV: "./ci/test/00_setup_env_native_nowallet_libbitcoinkernel.sh" - -task: - name: 'macOS-cross, gui, no tests' - << : *GLOBAL_TASK_TEMPLATE - container: - image: docker.io/ubuntu:22.04 - env: - << : *CIRRUS_EPHEMERAL_WORKER_TEMPLATE_ENV - FILE_ENV: "./ci/test/00_setup_env_mac_cross.sh" diff --git a/.editorconfig b/.editorconfig index c5f3028c503..d7fe7ad5e24 100644 --- a/.editorconfig +++ b/.editorconfig @@ -13,7 +13,7 @@ trim_trailing_whitespace = true [*.{h,cpp,rs,py,sh}] indent_size = 4 -# .cirrus.yml, etc. +# ci.yml, etc. [*.yml] indent_size = 2 diff --git a/.github/actions/configure-docker/action.yml b/.github/actions/configure-docker/action.yml new file mode 100644 index 00000000000..af667f0fdb5 --- /dev/null +++ b/.github/actions/configure-docker/action.yml @@ -0,0 +1,51 @@ +name: 'Configure Docker' +description: 'Set up Docker build driver and configure build cache args' +inputs: + use-warp: + description: 'Use cirrus cache' + required: true +runs: + using: 'composite' + steps: + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + with: + # Use host network to allow access to cirrus gha cache running on the host + driver-opts: | + network=host + + # This is required to allow buildkit to access the actions cache + - name: Expose actions cache variables + uses: actions/github-script@v8 + with: + script: | + Object.keys(process.env).forEach(function (key) { + if (key.startsWith('ACTIONS_')) { + core.info(`Exporting ${key}`); + core.exportVariable(key, process.env[key]); + } + }); + + - name: Construct docker build cache args + shell: bash + run: | + # Configure docker build cache backend + # + # On forks the gha cache will work but will use Github's cache backend. + # Docker will check for variables $ACTIONS_CACHE_URL, $ACTIONS_RESULTS_URL and $ACTIONS_RUNTIME_TOKEN + # which are set automatically when running on GitHub infra: https://docs.docker.com/build/cache/backends/gha/#synopsis + + url_args="" + + # Always optimistically --cache‑from in case a cache blob exists + args=(--cache-from "type=gha${url_args:+,${url_args}},scope=${CONTAINER_NAME}") + + # If this is a push to the default branch, also add --cache‑to to save the cache + if [[ ${{ github.event_name }} == "push" && ${{ github.ref_name }} == ${{ github.event.repository.default_branch }} ]]; then + args+=(--cache-to "type=gha${url_args:+,${url_args}},mode=max,ignore-error=true,scope=${CONTAINER_NAME}") + fi + + # Always `--load` into docker images (needed when using the `docker-container` build driver). + args+=(--load) + + echo "DOCKER_BUILD_CACHE_ARG=${args[*]}" >> $GITHUB_ENV diff --git a/.github/actions/configure-environment/action.yml b/.github/actions/configure-environment/action.yml new file mode 100644 index 00000000000..e2a26b7184d --- /dev/null +++ b/.github/actions/configure-environment/action.yml @@ -0,0 +1,27 @@ +name: 'Configure environment' +description: 'Configure CI, cache and container name environment variables' +runs: + using: 'composite' + steps: + - name: Set CI and cache directories + shell: bash + run: | + echo "BASE_ROOT_DIR=${{ runner.temp }}" >> "$GITHUB_ENV" + echo "BASE_BUILD_DIR=${{ runner.temp }}/build" >> "$GITHUB_ENV" + echo "CCACHE_DIR=${{ runner.temp }}/ccache_dir" >> $GITHUB_ENV + echo "DEPENDS_DIR=${{ runner.temp }}/depends" >> "$GITHUB_ENV" + echo "BASE_CACHE=${{ runner.temp }}/depends/built" >> $GITHUB_ENV + echo "SOURCES_PATH=${{ runner.temp }}/depends/sources" >> $GITHUB_ENV + echo "PREVIOUS_RELEASES_DIR=${{ runner.temp }}/previous_releases" >> $GITHUB_ENV + + - name: Set cache hashes + shell: bash + run: | + echo "DEPENDS_HASH=$(git ls-tree HEAD depends "$FILE_ENV" | sha256sum | cut -d' ' -f1)" >> $GITHUB_ENV + echo "PREVIOUS_RELEASES_HASH=$(git ls-tree HEAD test/get_previous_releases.py | sha256sum | cut -d' ' -f1)" >> $GITHUB_ENV + + - name: Get container name + shell: bash + run: | + source $FILE_ENV + echo "CONTAINER_NAME=$CONTAINER_NAME" >> "$GITHUB_ENV" diff --git a/.github/actions/restore-caches/action.yml b/.github/actions/restore-caches/action.yml new file mode 100644 index 00000000000..8dc35d4902e --- /dev/null +++ b/.github/actions/restore-caches/action.yml @@ -0,0 +1,47 @@ +name: 'Restore Caches' +description: 'Restore ccache, depends sources, and built depends caches' +runs: + using: 'composite' + steps: + - name: Restore Ccache cache + id: ccache-cache + uses: cirruslabs/cache/restore@v4 + with: + path: ${{ env.CCACHE_DIR }} + key: ccache-${{ env.CONTAINER_NAME }}-${{ github.run_id }} + restore-keys: | + ccache-${{ env.CONTAINER_NAME }}- + + - name: Restore depends sources cache + id: depends-sources + uses: cirruslabs/cache/restore@v4 + with: + path: ${{ env.SOURCES_PATH }} + key: depends-sources-${{ env.CONTAINER_NAME }}-${{ env.DEPENDS_HASH }} + restore-keys: | + depends-sources-${{ env.CONTAINER_NAME }}- + + - name: Restore built depends cache + id: depends-built + uses: cirruslabs/cache/restore@v4 + with: + path: ${{ env.BASE_CACHE }} + key: depends-built-${{ env.CONTAINER_NAME }}-${{ env.DEPENDS_HASH }} + restore-keys: | + depends-built-${{ env.CONTAINER_NAME }}- + + - name: Restore previous releases cache + id: previous-releases + uses: cirruslabs/cache/restore@v4 + with: + path: ${{ env.PREVIOUS_RELEASES_DIR }} + key: previous-releases-${{ env.CONTAINER_NAME }}-${{ env.PREVIOUS_RELEASES_HASH }} + restore-keys: | + previous-releases-${{ env.CONTAINER_NAME }}- + + - name: export cache hits + shell: bash + run: | + echo "depends-sources-cache-hit=${{ steps.depends-sources.outputs.cache-hit }}" >> $GITHUB_ENV + echo "depends-built-cache-hit=${{ steps.depends-built.outputs.cache-hit }}" >> $GITHUB_ENV + echo "previous-releases-cache-hit=${{ steps.previous-releases.outputs.cache-hit }}" >> $GITHUB_ENV diff --git a/.github/actions/save-caches/action.yml b/.github/actions/save-caches/action.yml new file mode 100644 index 00000000000..0e3b31246c6 --- /dev/null +++ b/.github/actions/save-caches/action.yml @@ -0,0 +1,39 @@ +name: 'Save Caches' +description: 'Save ccache, depends sources, and built depends caches' +runs: + using: 'composite' + steps: + - name: debug cache hit inputs + shell: bash + run: | + echo "depends sources direct cache hit to primary key: ${{ env.depends-sources-cache-hit }}" + echo "depends built direct cache hit to primary key: ${{ env.depends-built-cache-hit }}" + echo "previous releases direct cache hit to primary key: ${{ env.previous-releases-cache-hit }}" + + - name: Save Ccache cache + uses: cirruslabs/cache/save@v4 + if: ${{ (github.event_name == 'push') && (github.ref_name == github.event.repository.default_branch) }} + with: + path: ${{ env.CCACHE_DIR }} + key: ccache-${{ env.CONTAINER_NAME }}-${{ github.run_id }} + + - name: Save depends sources cache + uses: cirruslabs/cache/save@v4 + if: ${{ (github.event_name == 'push') && (github.ref_name == github.event.repository.default_branch) && (env.depends-sources-cache-hit != 'true') }} + with: + path: ${{ env.SOURCES_PATH }} + key: depends-sources-${{ env.CONTAINER_NAME }}-${{ env.DEPENDS_HASH }} + + - name: Save built depends cache + uses: cirruslabs/cache/save@v4 + if: ${{ (github.event_name == 'push') && (github.ref_name == github.event.repository.default_branch) && (env.depends-built-cache-hit != 'true' )}} + with: + path: ${{ env.BASE_CACHE }} + key: depends-built-${{ env.CONTAINER_NAME }}-${{ env.DEPENDS_HASH }} + + - name: Save previous releases cache + uses: cirruslabs/cache/save@v4 + if: ${{ (github.event_name == 'push') && (github.ref_name == github.event.repository.default_branch) && (env.previous-releases-cache-hit != 'true' )}} + with: + path: ${{ env.PREVIOUS_RELEASES_DIR }} + key: previous-releases-${{ env.CONTAINER_NAME }}-${{ env.PREVIOUS_RELEASES_HASH }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 88835964eb7..0264cb2fbc7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,12 +19,29 @@ concurrency: env: CI_FAILFAST_TEST_LEAVE_DANGLING: 1 # GHA does not care about dangling processes and setting this variable avoids killing the CI script itself on error - MAKEJOBS: '-j10' + REPO_USE_WARP_RUNNERS: 'bitcoin/bitcoin' # Use warp runners for this repo, instead of falling back to the slow GHA runners jobs: + runners: + name: 'determine runners' + runs-on: ubuntu-latest + outputs: + use-warp-runners: ${{ steps.runners.outputs.use-warp-runners }} + steps: + - id: runners + run: | + if [[ "${REPO_USE_WARP_RUNNERS}" == "${{ github.repository }}" ]]; then + echo "provider=warp" >> "$GITHUB_OUTPUT" + echo "::notice title=Runner Selection::Using Warp Runners" + else + echo "use-warp-runners=false" >> "$GITHUB_OUTPUT" + echo "::notice title=Runner Selection::Using GitHub-hosted runners" + fi + test-each-commit: name: 'test each commit' - runs-on: ubuntu-24.04 + needs: runners + runs-on: ${{ needs.runners.outputs.provider == 'warp' && 'warp-ubuntu-latest-x64-8x' || 'ubuntu-latest' }} 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/writing-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: @@ -32,7 +49,7 @@ jobs: steps: - name: Determine fetch depth run: echo "FETCH_DEPTH=$((${{ github.event.pull_request.commits }} + 2))" >> "$GITHUB_ENV" - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: ref: ${{ github.event.pull_request.head.sha }} fetch-depth: ${{ env.FETCH_DEPTH }} @@ -106,8 +123,12 @@ jobs: BASE_ROOT_DIR: ${{ github.workspace }} steps: - - name: Checkout - uses: actions/checkout@v4 + - &CHECKOUT + name: Checkout + uses: actions/checkout@v6 + with: + # Ensure the latest merged pull request state is used, even on re-runs. + ref: &CHECKOUT_REF_TMPL ${{ github.event_name == 'pull_request' && github.ref || '' }} - name: Clang version run: | @@ -151,7 +172,7 @@ jobs: FILE_ENV: ${{ matrix.file-env }} - name: Save Ccache cache - uses: actions/cache/save@v4 + uses: actions/cache/save@v5 if: github.event_name != 'pull_request' && steps.ccache-cache.outputs.cache-hit != 'true' with: path: ${{ env.CCACHE_DIR }} @@ -183,14 +204,17 @@ jobs: job-name: 'Win64 native fuzz, VS 2022' steps: - - name: Checkout - uses: actions/checkout@v4 + - *CHECKOUT - - name: Configure Developer Command Prompt for Microsoft Visual C++ - # Using microsoft/setup-msbuild is not enough. - uses: ilammy/msvc-dev-cmd@v1 - with: - arch: x64 + - name: Set up VS Developer Prompt + shell: pwsh -Command "$PSVersionTable; $PSNativeCommandUseErrorActionPreference = $true; $ErrorActionPreference = 'Stop'; & '{0}'" + run: | + $vswherePath = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" + $installationPath = & $vswherePath -latest -property installationPath + & "${env:COMSPEC}" /s /c "`"$installationPath\Common7\Tools\vsdevcmd.bat`" -arch=x64 -no_logo && set" | foreach-object { + $name, $value = $_ -split '=', 2 + echo "$name=$value" >> $env:GITHUB_ENV + } - name: Get tool information run: | @@ -202,19 +226,21 @@ jobs: Write-Host "PowerShell version $($PSVersionTable.PSVersion.ToString())" - name: Using vcpkg with MSBuild + shell: bash run: | - Set-Location "$env:VCPKG_INSTALLATION_ROOT" - Add-Content -Path "triplets\x64-windows.cmake" -Value "set(VCPKG_BUILD_TYPE release)" - Add-Content -Path "triplets\x64-windows-static.cmake" -Value "set(VCPKG_BUILD_TYPE release)" + echo "set(VCPKG_BUILD_TYPE release)" >> "${VCPKG_INSTALLATION_ROOT}/triplets/x64-windows.cmake" + echo "set(VCPKG_BUILD_TYPE release)" >> "${VCPKG_INSTALLATION_ROOT}/triplets/x64-windows-static.cmake" + # Workaround for libevent, which requires CMake 3.1 but is incompatible with CMake >= 4.0. + sed -i '1s/^/set(ENV{CMAKE_POLICY_VERSION_MINIMUM} 3.5)\n/' "${VCPKG_INSTALLATION_ROOT}/scripts/ports.cmake" - name: vcpkg tools cache - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: C:/vcpkg/downloads/tools key: ${{ github.job }}-vcpkg-tools - name: Restore vcpkg binary cache - uses: actions/cache/restore@v4 + uses: actions/cache/restore@v5 id: vcpkg-binary-cache with: path: ~/AppData/Local/vcpkg/archives @@ -225,7 +251,7 @@ jobs: cmake -B build --preset vs2022-static -DCMAKE_TOOLCHAIN_FILE="$env:VCPKG_INSTALLATION_ROOT\scripts\buildsystems\vcpkg.cmake" -DCMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE="${{ github.workspace }}/build/bin" ${{ matrix.generate-options }} - name: Save vcpkg binary cache - uses: actions/cache/save@v4 + uses: actions/cache/save@v5 if: github.event_name != 'pull_request' && steps.vcpkg-binary-cache.outputs.cache-hit != 'true' && matrix.job-type == 'standard' with: path: ~/AppData/Local/vcpkg/archives @@ -271,44 +297,133 @@ jobs: run: | py -3 test\fuzz\test_runner.py --par %NUMBER_OF_PROCESSORS% --loglevel DEBUG %RUNNER_TEMP%\qa-assets\fuzz_corpora - 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 + ci-matrix: + name: ${{ matrix.name }} + needs: runners + runs-on: ${{ needs.runners.outputs.provider == 'warp' && matrix.warp-runner || matrix.fallback-runner }} if: ${{ vars.SKIP_BRANCH_PUSH != 'true' || github.event_name == 'pull_request' }} - timeout-minutes: 120 + timeout-minutes: ${{ matrix.timeout-minutes }} + env: - FILE_ENV: "./ci/test/00_setup_env_native_asan.sh" DANGER_CI_ON_HOST_FOLDERS: 1 + FILE_ENV: ${{ matrix.file-env }} + + strategy: + fail-fast: false + matrix: + include: + - name: '32 bit ARM, unit tests, no functional tests' + warp-runner: 'ubuntu-24.04-arm' # Warp's Arm runners don't support 32-bit mode currently + fallback-runner: 'ubuntu-24.04-arm' + timeout-minutes: 120 + file-env: './ci/test/00_setup_env_arm.sh' + + - name: 'win64 Cross' + warp-runner: 'warp-ubuntu-latest-x64-4x' + fallback-runner: 'ubuntu-latest' + timeout-minutes: 120 + file-env: './ci/test/00_setup_env_win64.sh' + + - name: 'ASan + LSan + UBSan + integer, no depends, USDT' + warp-runner: 'warp-ubuntu-2404-x64-8x' # has to match container in ci/test/00_setup_env_native_asan.sh for tracing tools + fallback-runner: 'ubuntu-latest' + timeout-minutes: 120 + file-env: './ci/test/00_setup_env_native_asan.sh' + + - name: 'macOS-cross, gui, no tests' + warp-runner: 'warp-ubuntu-latest-x64-4x' + fallback-runner: 'ubuntu-latest' + timeout-minutes: 120 + file-env: './ci/test/00_setup_env_mac_cross.sh' + + - name: 'No wallet, libbitcoinkernel' + warp-runner: 'warp-ubuntu-latest-x64-4x' + fallback-runner: 'ubuntu-latest' + timeout-minutes: 120 + file-env: './ci/test/00_setup_env_native_nowallet_libbitcoinkernel.sh' + + - name: 'i686, multiprocess, DEBUG' + warp-runner: 'warp-ubuntu-latest-x64-8x' + fallback-runner: 'ubuntu-latest' + timeout-minutes: 120 + file-env: './ci/test/00_setup_env_i686_multiprocess.sh' + + - name: 'fuzzer,address,undefined,integer, no depends' + warp-runner: 'warp-ubuntu-latest-x64-16x' + fallback-runner: 'ubuntu-latest' + timeout-minutes: 240 + file-env: './ci/test/00_setup_env_native_fuzz.sh' + + - name: 'previous releases, depends DEBUG' + warp-runner: 'warp-ubuntu-latest-x64-8x' + fallback-runner: 'ubuntu-latest' + timeout-minutes: 120 + file-env: './ci/test/00_setup_env_native_previous_releases.sh' + + - name: 'CentOS, depends, gui' + warp-runner: 'warp-ubuntu-latest-x64-16x' + fallback-runner: 'ubuntu-latest' + timeout-minutes: 120 + file-env: './ci/test/00_setup_env_native_centos.sh' + + - name: 'tidy' + warp-runner: 'warp-ubuntu-latest-x64-8x' + fallback-runner: 'ubuntu-latest' + timeout-minutes: 120 + file-env: './ci/test/00_setup_env_native_tidy.sh' + + - name: 'TSan, depends, no gui' + warp-runner: 'warp-ubuntu-latest-x64-8x' + fallback-runner: 'ubuntu-latest' + timeout-minutes: 120 + file-env: './ci/test/00_setup_env_native_tsan.sh' + + - name: 'MSan, depends' + warp-runner: 'warp-ubuntu-latest-x64-16x' + fallback-runner: 'ubuntu-latest' + timeout-minutes: 120 + file-env: './ci/test/00_setup_env_native_msan.sh' + steps: - - name: Checkout - uses: actions/checkout@v4 + - *CHECKOUT - - name: Set CI directories - run: | - echo "CCACHE_DIR=${{ runner.temp }}/ccache_dir" >> "$GITHUB_ENV" - echo "BASE_ROOT_DIR=${{ runner.temp }}" >> "$GITHUB_ENV" - echo "BASE_BUILD_DIR=${{ runner.temp }}/build-asan" >> "$GITHUB_ENV" + - name: Configure environment + uses: ./.github/actions/configure-environment - - name: Restore Ccache cache - id: ccache-cache - uses: actions/cache/restore@v4 + - name: Restore caches + id: restore-cache + uses: ./.github/actions/restore-caches + + - name: Configure Docker + uses: ./.github/actions/configure-docker with: - path: ${{ env.CCACHE_DIR }} - key: ${{ github.job }}-ccache-${{ github.run_id }} - restore-keys: ${{ github.job }}-ccache- + use-warp: ${{ needs.runners.outputs.use-warp-runners }} - name: Enable bpfcc script + if: ${{ env.CONTAINER_NAME == 'ci_native_asan' }} # 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: Set mmap_rnd_bits + if: ${{ env.CONTAINER_NAME == 'ci_native_tsan' || env.CONTAINER_NAME == 'ci_native_msan' }} + # Prevents crashes due to high ASLR entropy + run: sudo sysctl -w vm.mmap_rnd_bits=28 + - 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' + - name: Save caches + uses: ./.github/actions/save-caches + + lint: + name: 'lint' + runs-on: ubuntu-24.04 + steps: + - uses: actions/checkout@v4 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 }} + fetch-depth: 0 + - name: Build lint Docker image + run: DOCKER_BUILDKIT=1 docker build -t bitcoin-linter --file "./ci/lint_imagefile" ./ + - name: Run linter + run: docker run --rm -v $(pwd):/bitcoin bitcoin-linter diff --git a/CMakeLists.txt b/CMakeLists.txt index 3b183c93ce7..a1a9be3f5d6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,15 +19,19 @@ if(POLICY CMP0171) cmake_policy(SET CMP0171 NEW) endif() +# When adjusting CMake flag variables, we must not override those explicitly +# set by the user. These are a subset of the CACHE_VARIABLES property. +get_directory_property(precious_variables CACHE_VARIABLES) + #============================= # Project / Package metadata #============================= set(CLIENT_NAME "Elements Core") -set(CLIENT_VERSION_MAJOR 28) -set(CLIENT_VERSION_MINOR 99) +set(CLIENT_VERSION_MAJOR 29) +set(CLIENT_VERSION_MINOR 4) set(CLIENT_VERSION_BUILD 0) -set(CLIENT_VERSION_RC 0) -set(CLIENT_VERSION_IS_RELEASE "false") +set(CLIENT_VERSION_RC 1) +set(CLIENT_VERSION_IS_RELEASE "true") set(COPYRIGHT_YEAR "2025") # During the enabling of the CXX and CXXOBJ languages, we modify @@ -107,8 +111,12 @@ if(WITH_SQLITE) if(VCPKG_TARGET_TRIPLET) # Use of the `unofficial::` namespace is a vcpkg package manager convention. find_package(unofficial-sqlite3 CONFIG REQUIRED) + add_library(SQLite3::SQLite3 ALIAS unofficial::sqlite3::sqlite3) else() find_package(SQLite3 3.7.17 REQUIRED) + if(NOT TARGET SQLite3::SQLite3) # CMake < 4.3 + add_library(SQLite3::SQLite3 ALIAS SQLite::SQLite3) + endif() endif() set(USE_SQLITE ON) endif() @@ -158,7 +166,7 @@ if(WITH_QRENCODE) set(USE_QRCODE TRUE) endif() -cmake_dependent_option(WITH_DBUS "Enable DBus support." ON "CMAKE_SYSTEM_NAME STREQUAL \"Linux\" AND BUILD_GUI" OFF) +cmake_dependent_option(WITH_DBUS "Enable DBus support." ON "NOT CMAKE_SYSTEM_NAME MATCHES \"(Windows|Darwin)\" AND BUILD_GUI" OFF) option(WITH_MULTIPROCESS "Build multiprocess elements-node and elements-gui executables in addition to monolithic elementsd and elements-qt executables. Requires libmultiprocess library. Experimental." OFF) if(WITH_MULTIPROCESS) @@ -384,6 +392,7 @@ if(SANITIZERS) int main() { return 0; } " RESULT_VAR linker_supports_sanitizers + NO_CACHE_IF_FAILED ) if(NOT linker_supports_sanitizers) message(FATAL_ERROR "Linker did not accept requested flags, you are missing required libraries.") @@ -668,7 +677,7 @@ message(" external signer ..................... ${ENABLE_EXTERNAL_SIGNER}") message(" ZeroMQ .............................. ${WITH_ZMQ}") message(" USDT tracing ........................ ${WITH_USDT}") message(" QR code (GUI) ....................... ${WITH_QRENCODE}") -message(" DBus (GUI, Linux only) .............. ${WITH_DBUS}") +message(" DBus (GUI) .......................... ${WITH_DBUS}") message("Tests:") message(" test_elements ........................ ${BUILD_TESTS}") message(" test_elements-qt .................... ${BUILD_GUI_TESTS}") diff --git a/CMakePresets.json b/CMakePresets.json index da838f2b0e3..a94cfa895ca 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -1,6 +1,5 @@ { "version": 3, - "cmakeMinimumRequired": {"major": 3, "minor": 21, "patch": 0}, "configurePresets": [ { "name": "vs2022", diff --git a/ci/README.md b/ci/README.md index 377aae7fa0b..a73c8df5e75 100644 --- a/ci/README.md +++ b/ci/README.md @@ -1,8 +1,8 @@ -## CI Scripts +# CI Scripts This directory contains scripts for each build step in each build stage. -### Running a Stage Locally +## 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. @@ -27,7 +27,7 @@ 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 +## 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 @@ -49,8 +49,30 @@ env -i HOME="$HOME" PATH="$PATH" USER="$USER" bash -c 'MAKEJOBS="-j1" FILE_ENV=" The files starting with `0n` (`n` greater than 0) are the scripts that are run in order. -### Cache +## 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. + +## Configuring a repository for CI + +### Primary repository + +To configure the primary repository, follow these steps: + +1. Register with [WarpBuild](https://www.warpbuild.com/) and purchase runners. +2. Install the WarpBuild GitHub app against the GitHub organization. +3. Enable organisation-level runners to be used in public repositories: + 1. `Org settings -> Actions -> Runner Groups -> Default -> Allow public repos` +4. Permit the following actions to run: + 1. docker/setup-buildx-action@\* + 1. actions/github-script@\* + +### Forked repositories + +When used in a fork the CI will run on GitHub's free hosted runners by default. +In this case, due to GitHub's 10GB-per-repo cache size limitations caches will be frequently evicted and missed, but the workflows will run (slowly). + +It is also possible to use your own WarpBuild Runners in your own fork with an appropriate patch to the `REPO_USE_WARP_RUNNERS` variable in ../.github/workflows/ci.yml +NB that WarpBuild Runners only work at an organisation level, therefore in order to use your own WarpBuild Runners, *the fork must be within your own organisation*. diff --git a/ci/lint_run_all.sh b/ci/lint_run_all.sh deleted file mode 100755 index c57261d21a6..00000000000 --- a/ci/lint_run_all.sh +++ /dev/null @@ -1,17 +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 - -# Only used in .cirrus.yml. Refer to test/lint/README.md on how to run locally. - -cp "./ci/retry/retry" "/ci_retry" -cp "./.python-version" "/.python-version" -mkdir --parents "/test/lint" -cp --recursive "./test/lint/test_runner" "/test/lint/" -set -o errexit; source ./ci/lint/04_install.sh -set -o errexit -./ci/lint/06_script.sh diff --git a/ci/test/00_setup_env.sh b/ci/test/00_setup_env.sh index 9f794c25235..8a5cd4b2435 100755 --- a/ci/test/00_setup_env.sh +++ b/ci/test/00_setup_env.sh @@ -35,7 +35,7 @@ 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} +export MAKEJOBS=${MAKEJOBS:--j$(if command -v nproc > /dev/null 2>&1; then nproc; else sysctl -n hw.logicalcpu; fi)} # Whether to prefer BusyBox over GNU utilities export USE_BUSY_BOX=${USE_BUSY_BOX:-false} diff --git a/ci/test/00_setup_env_i686_multiprocess.sh b/ci/test/00_setup_env_i686_multiprocess.sh index c4d5e10a7a7..82dcf191860 100755 --- a/ci/test/00_setup_env_i686_multiprocess.sh +++ b/ci/test/00_setup_env_i686_multiprocess.sh @@ -10,6 +10,7 @@ export HOST=i686-pc-linux-gnu export CONTAINER_NAME=ci_i686_multiprocess export CI_IMAGE_NAME_TAG="mirror.gcr.io/ubuntu:24.04" export CI_IMAGE_PLATFORM="linux/amd64" +export CI_CONTAINER_CAP="--security-opt seccomp=unconfined" export PACKAGES="llvm clang g++-multilib" export DEP_OPTS="DEBUG=1 MULTIPROCESS=1" export GOAL="install" diff --git a/ci/test/00_setup_env_mac_native.sh b/ci/test/00_setup_env_mac_native.sh index c568dc234f2..9b7054796be 100755 --- a/ci/test/00_setup_env_mac_native.sh +++ b/ci/test/00_setup_env_mac_native.sh @@ -8,6 +8,7 @@ export LC_ALL=C.UTF-8 # Homebrew's python@3.12 is marked as externally managed (PEP 668). # Therefore, `--break-system-packages` is needed. +export CONTAINER_NAME="ci_mac_native" # macos does not use a container, but the env var is needed for logging export PIP_PACKAGES="--break-system-packages zmq" export GOAL="install" export CMAKE_GENERATOR="Ninja" diff --git a/ci/test/00_setup_env_mac_native_fuzz.sh b/ci/test/00_setup_env_mac_native_fuzz.sh index cacf2423ac3..22b6bc97ab3 100755 --- a/ci/test/00_setup_env_mac_native_fuzz.sh +++ b/ci/test/00_setup_env_mac_native_fuzz.sh @@ -6,6 +6,7 @@ export LC_ALL=C.UTF-8 +export CONTAINER_NAME="ci_mac_native_fuzz" # macos does not use a container, but the env var is needed for logging export CMAKE_GENERATOR="Ninja" export BITCOIN_CONFIG="-DBUILD_FOR_FUZZING=ON" export CI_OS_NAME="macos" diff --git a/ci/test/00_setup_env_native_asan.sh b/ci/test/00_setup_env_native_asan.sh index ead550a43ce..dbfcc259d66 100755 --- a/ci/test/00_setup_env_native_asan.sh +++ b/ci/test/00_setup_env_native_asan.sh @@ -19,15 +19,15 @@ else fi export CONTAINER_NAME=ci_native_asan -export APT_LLVM_V="20" +export APT_LLVM_V="21" export PACKAGES="systemtap-sdt-dev clang-${APT_LLVM_V} llvm-${APT_LLVM_V} libclang-rt-${APT_LLVM_V}-dev python3-zmq qtbase5-dev qttools5-dev qttools5-dev-tools libevent-dev libboost-dev libdb5.3++-dev libzmq3-dev libqrencode-dev libsqlite3-dev ${BPFCC_PACKAGE}" export NO_DEPENDS=1 export GOAL="install" export BITCOIN_CONFIG="\ -DWITH_USDT=ON -DWITH_ZMQ=ON -DWITH_BDB=ON -DWARN_INCOMPATIBLE_BDB=OFF -DBUILD_GUI=ON \ -DSANITIZERS=address,float-divide-by-zero,integer,undefined \ - -DCMAKE_C_COMPILER=clang-${APT_LLVM_V} \ - -DCMAKE_CXX_COMPILER=clang++-${APT_LLVM_V} \ + -DCMAKE_C_COMPILER=clang \ + -DCMAKE_CXX_COMPILER=clang++ \ -DCMAKE_C_FLAGS='-ftrivial-auto-var-init=pattern' \ -DCMAKE_CXX_FLAGS='-ftrivial-auto-var-init=pattern -Wno-error=deprecated-declarations' \ -DAPPEND_CXXFLAGS='-std=c++23' \ diff --git a/ci/test/00_setup_env_native_centos.sh b/ci/test/00_setup_env_native_centos.sh index c423d788eb8..af27a5ebe1b 100755 --- a/ci/test/00_setup_env_native_centos.sh +++ b/ci/test/00_setup_env_native_centos.sh @@ -8,7 +8,7 @@ export LC_ALL=C.UTF-8 export CONTAINER_NAME=ci_native_centos export CI_IMAGE_NAME_TAG="quay.io/centos/centos:stream10" -export CI_BASE_PACKAGES="gcc-c++ glibc-devel libstdc++-devel ccache make git python3 python3-pip which patch xz procps-ng ksh rsync coreutils bison e2fsprogs cmake" +export CI_BASE_PACKAGES="gcc-c++ glibc-devel libstdc++-devel ccache make git python3 python3-pip which patch xz procps-ng rsync coreutils bison e2fsprogs cmake dash" export PIP_PACKAGES="pyzmq" export DEP_OPTS="DEBUG=1" # Temporarily enable a DEBUG=1 build to check for GCC-bug-117966 regressions. This can be removed once the minimum GCC version is bumped to 12 in the previous releases task, see https://github.com/bitcoin/bitcoin/issues/31436#issuecomment-2530717875 export GOAL="install" diff --git a/ci/test/00_setup_env_native_fuzz.sh b/ci/test/00_setup_env_native_fuzz.sh index d581c97245b..1ecc0fdc225 100755 --- a/ci/test/00_setup_env_native_fuzz.sh +++ b/ci/test/00_setup_env_native_fuzz.sh @@ -8,7 +8,7 @@ export LC_ALL=C.UTF-8 export CI_IMAGE_NAME_TAG="mirror.gcr.io/ubuntu:24.04" export CONTAINER_NAME=ci_native_fuzz -export APT_LLVM_V="20" +export APT_LLVM_V="21" export PACKAGES="clang-${APT_LLVM_V} llvm-${APT_LLVM_V} libclang-rt-${APT_LLVM_V}-dev libevent-dev libboost-dev libsqlite3-dev" export NO_DEPENDS=1 export RUN_UNIT_TESTS=false @@ -20,10 +20,9 @@ export CI_CONTAINER_CAP="--cap-add SYS_PTRACE" # If run with (ASan + LSan), the export BITCOIN_CONFIG="\ -DBUILD_FOR_FUZZING=ON \ -DSANITIZERS=fuzzer,address,undefined,float-divide-by-zero,integer \ - -DCMAKE_C_COMPILER=clang-${APT_LLVM_V} \ - -DCMAKE_CXX_COMPILER=clang++-${APT_LLVM_V} \ + -DCMAKE_C_COMPILER=clang \ + -DCMAKE_CXX_COMPILER=clang++ \ -DCMAKE_C_FLAGS='-ftrivial-auto-var-init=pattern' \ -DCMAKE_CXX_FLAGS='-ftrivial-auto-var-init=pattern' \ " -export LLVM_SYMBOLIZER_PATH="/usr/bin/llvm-symbolizer-${APT_LLVM_V}" export FUZZ_TESTS_CONFIG="${FUZZ_TESTS_CONFIG},wallet_notifications,addrman_serdeser" # ELEMENTS: these take really long diff --git a/ci/test/00_setup_env_native_fuzz_with_msan.sh b/ci/test/00_setup_env_native_fuzz_with_msan.sh index a6e53dc8a2f..655fe609c0d 100755 --- a/ci/test/00_setup_env_native_fuzz_with_msan.sh +++ b/ci/test/00_setup_env_native_fuzz_with_msan.sh @@ -7,14 +7,16 @@ export LC_ALL=C.UTF-8 export CI_IMAGE_NAME_TAG="mirror.gcr.io/ubuntu:24.04" -LIBCXX_DIR="/msan/cxx_build/" +export APT_LLVM_V="21" +LIBCXX_DIR="/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" +# -lstdc++ to resolve link issues due to upstream packaging +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 -lstdc++" 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 PACKAGES="ninja-build clang-${APT_LLVM_V} llvm-${APT_LLVM_V} llvm-${APT_LLVM_V}-dev libclang-${APT_LLVM_V}-dev libclang-rt-${APT_LLVM_V}-dev" 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="all" # Setting CMAKE_{C,CXX}_FLAGS_DEBUG flags to an empty string ensures that the flags set in MSAN_FLAGS remain unaltered. @@ -27,7 +29,7 @@ export BITCOIN_CONFIG="\ -DSANITIZERS=fuzzer,memory \ -DAPPEND_CPPFLAGS='-DBOOST_MULTI_INDEX_ENABLE_SAFE_MODE -U_FORTIFY_SOURCE' \ " -export USE_MEMORY_SANITIZER="true" +export USE_INSTRUMENTED_LIBCPP="MemoryWithOrigins" export RUN_UNIT_TESTS="false" export RUN_FUNCTIONAL_TESTS="false" export RUN_FUZZ_TESTS=true diff --git a/ci/test/00_setup_env_native_msan.sh b/ci/test/00_setup_env_native_msan.sh index 8784aaa5b7b..879e82d55a4 100755 --- a/ci/test/00_setup_env_native_msan.sh +++ b/ci/test/00_setup_env_native_msan.sh @@ -7,13 +7,14 @@ export LC_ALL=C.UTF-8 export CI_IMAGE_NAME_TAG="mirror.gcr.io/ubuntu:24.04" -LIBCXX_DIR="/msan/cxx_build/" +export APT_LLVM_V="21" +LIBCXX_DIR="/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" +export PACKAGES="clang-${APT_LLVM_V} llvm-${APT_LLVM_V} llvm-${APT_LLVM_V}-dev libclang-${APT_LLVM_V}-dev libclang-rt-${APT_LLVM_V}-dev 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" @@ -26,4 +27,4 @@ export BITCOIN_CONFIG="\ -DSANITIZERS=memory \ -DAPPEND_CPPFLAGS='-U_FORTIFY_SOURCE' \ " -export USE_MEMORY_SANITIZER="true" +export USE_INSTRUMENTED_LIBCPP="MemoryWithOrigins" diff --git a/ci/test/00_setup_env_native_previous_releases.sh b/ci/test/00_setup_env_native_previous_releases.sh index a83a4031ab8..92540e0aa99 100755 --- a/ci/test/00_setup_env_native_previous_releases.sh +++ b/ci/test/00_setup_env_native_previous_releases.sh @@ -11,7 +11,7 @@ export CI_IMAGE_NAME_TAG="mirror.gcr.io/ubuntu:22.04" # Use minimum supported python3.10 and gcc-11, see doc/dependencies.md export PACKAGES="gcc-11 g++-11 python3-zmq" export DEP_OPTS="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 TEST_RUNNER_EXTRA="--previous-releases --coverage --extended --exclude wallet_inactive_hdchains" # Run extended tests so that coverage does not fail export RUN_UNIT_TESTS_SEQUENTIAL="true" export RUN_UNIT_TESTS="false" export GOAL="install" @@ -25,4 +25,4 @@ export BITCOIN_CONFIG="\ -DCMAKE_CXX_FLAGS_DEBUG='-g0 -O2' \ -DAPPEND_CPPFLAGS='-DBOOST_MULTI_INDEX_ENABLE_SAFE_MODE' \ " -export TEST_RUNNER_EXTRA="${TEST_RUNNER_EXTRA},feature_fee_estimation,wallet_inactive_hdchains,wallet_elements_regression_fundrawtransaction,feature_txindex_compatibility,feature_unsupported_utxo_db" # ELEMENTS +export TEST_RUNNER_EXTRA="${TEST_RUNNER_EXTRA},wallet_elements_regression_fundrawtransaction,feature_unsupported_utxo_db" # ELEMENTS diff --git a/ci/test/00_setup_env_native_tsan.sh b/ci/test/00_setup_env_native_tsan.sh index b341adfec53..6286e39d842 100755 --- a/ci/test/00_setup_env_native_tsan.sh +++ b/ci/test/00_setup_env_native_tsan.sh @@ -8,9 +8,12 @@ export LC_ALL=C.UTF-8 export CONTAINER_NAME=ci_native_tsan export CI_IMAGE_NAME_TAG="mirror.gcr.io/ubuntu:24.04" -export APT_LLVM_V="20" -export PACKAGES="clang-${APT_LLVM_V} llvm-${APT_LLVM_V} libclang-rt-${APT_LLVM_V}-dev libc++abi-${APT_LLVM_V}-dev libc++-${APT_LLVM_V}-dev python3-zmq" -export DEP_OPTS="CC=clang-${APT_LLVM_V} CXX='clang++-${APT_LLVM_V} -stdlib=libc++'" +export APT_LLVM_V="21" +LIBCXX_DIR="/cxx_build/" +LIBCXX_FLAGS="-fsanitize=thread -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 PACKAGES="clang-${APT_LLVM_V} llvm-${APT_LLVM_V} llvm-${APT_LLVM_V}-dev libclang-${APT_LLVM_V}-dev libclang-rt-${APT_LLVM_V}-dev python3-zmq ninja-build" +export DEP_OPTS="CC=clang CXX=clang++ CXXFLAGS='${LIBCXX_FLAGS}' NO_QT=1" export GOAL="install" export BITCOIN_CONFIG="-DWITH_ZMQ=ON -DSANITIZERS=thread \ --DAPPEND_CPPFLAGS='-DARENA_DEBUG -DDEBUG_LOCKORDER -DDEBUG_LOCKCONTENTION -D_LIBCPP_REMOVE_TRANSITIVE_INCLUDES'" +-DAPPEND_CPPFLAGS='-DARENA_DEBUG -DDEBUG_LOCKCONTENTION -D_LIBCPP_REMOVE_TRANSITIVE_INCLUDES'" +export USE_INSTRUMENTED_LIBCPP="Thread" diff --git a/ci/test/01_base_install.sh b/ci/test/01_base_install.sh index 15ad2d39c97..ba5a55e174f 100755 --- a/ci/test/01_base_install.sh +++ b/ci/test/01_base_install.sh @@ -43,32 +43,24 @@ elif [ "$CI_OS_NAME" != "macos" ]; then ${CI_RETRY_EXE} bash -c "apt-get install --no-install-recommends --no-upgrade -y $PACKAGES $CI_BASE_PACKAGES" fi +if [ -n "${APT_LLVM_V}" ]; then + update-alternatives --install /usr/bin/clang++ clang++ "/usr/bin/clang++-${APT_LLVM_V}" 100 + update-alternatives --install /usr/bin/clang clang "/usr/bin/clang-${APT_LLVM_V}" 100 + update-alternatives --install /usr/bin/llvm-symbolizer llvm-symbolizer "/usr/bin/llvm-symbolizer-${APT_LLVM_V}" 100 +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-20.1.0" /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/ "$MAKEJOBS" - 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 +if [[ -n "${USE_INSTRUMENTED_LIBCPP}" ]]; then + ${CI_RETRY_EXE} git clone --depth=1 https://github.com/llvm/llvm-project -b "llvmorg-21.1.1" /llvm-project - cmake -G Ninja -B /msan/cxx_build/ \ + cmake -G Ninja -B /cxx_build/ \ -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi;libunwind" \ -DCMAKE_BUILD_TYPE=Release \ - -DLLVM_USE_SANITIZER=MemoryWithOrigins \ + -DLLVM_USE_SANITIZER="${USE_INSTRUMENTED_LIBCPP}" \ -DCMAKE_C_COMPILER=clang \ -DCMAKE_CXX_COMPILER=clang++ \ -DLLVM_TARGETS_TO_BUILD=Native \ @@ -76,13 +68,13 @@ if [[ ${USE_MEMORY_SANITIZER} == "true" ]]; then -DLIBCXXABI_USE_LLVM_UNWINDER=OFF \ -DLIBCXX_ABI_DEFINES="_LIBCPP_ABI_BOUNDED_ITERATORS;_LIBCPP_ABI_BOUNDED_ITERATORS_IN_STD_ARRAY;_LIBCPP_ABI_BOUNDED_ITERATORS_IN_STRING;_LIBCPP_ABI_BOUNDED_ITERATORS_IN_VECTOR;_LIBCPP_ABI_BOUNDED_UNIQUE_PTR" \ -DLIBCXX_HARDENING_MODE=debug \ - -S /msan/llvm-project/runtimes + -S /llvm-project/runtimes - ninja -C /msan/cxx_build/ "$MAKEJOBS" + ninja -C /cxx_build/ "$MAKEJOBS" # Clear no longer needed source folder - du -sh /msan/llvm-project - rm -rf /msan/llvm-project + du -sh /llvm-project + rm -rf /llvm-project fi if [[ "${RUN_TIDY}" == "true" ]]; then diff --git a/ci/test/02_run_container.sh b/ci/test/02_run_container.sh index 8351fd4e02a..131b3c61481 100755 --- a/ci/test/02_run_container.sh +++ b/ci/test/02_run_container.sh @@ -23,34 +23,14 @@ if [ -z "$DANGER_RUN_CI_ON_HOST" ]; then fi echo "Creating $CI_IMAGE_NAME_TAG container to run in" - DOCKER_BUILD_CACHE_ARG="" - DOCKER_BUILD_CACHE_TEMPDIR="" - DOCKER_BUILD_CACHE_OLD_DIR="" - DOCKER_BUILD_CACHE_NEW_DIR="" - # If set, use an `docker build` cache directory on the CI host - # to cache docker image layers for the CI container image. - # This cache can be multiple GB in size. Prefixed with DANGER - # as setting it removes (old cache) files from the host. - if [ "$DANGER_DOCKER_BUILD_CACHE_HOST_DIR" ]; then - # Directory where the current cache for this run could be. If not existing - # or empty, "docker build" will warn, but treat it as cache-miss and continue. - DOCKER_BUILD_CACHE_OLD_DIR="${DANGER_DOCKER_BUILD_CACHE_HOST_DIR}/${CONTAINER_NAME}" - # Temporary directory for a newly created cache. We can't write the new - # cache into OLD_DIR directly, as old cache layers would not be removed. - # The NEW_DIR contents are moved to OLD_DIR after OLD_DIR has been cleared. - # This happens after `docker build`. If a task fails or is aborted, the - # DOCKER_BUILD_CACHE_TEMPDIR might be retained on the host. If the host isn't - # ephemeral, it has to take care of cleaning old TEMPDIR's up. - DOCKER_BUILD_CACHE_TEMPDIR="$(mktemp --directory ci-docker-build-cache-XXXXXXXXXX)" - DOCKER_BUILD_CACHE_NEW_DIR="${DOCKER_BUILD_CACHE_TEMPDIR}/${CONTAINER_NAME}" - DOCKER_BUILD_CACHE_ARG="--cache-from type=local,src=${DOCKER_BUILD_CACHE_OLD_DIR} --cache-to type=local,dest=${DOCKER_BUILD_CACHE_NEW_DIR},mode=max" - fi - + # Use buildx unconditionally + # Using buildx is required to properly load the correct driver, for use with registry caching. Neither build, nor BUILDKIT=1 currently do this properly # shellcheck disable=SC2086 - DOCKER_BUILDKIT=1 docker build \ + docker buildx 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}" \ + --build-arg "BASE_ROOT_DIR=${BASE_ROOT_DIR}" \ $MAYBE_CPUSET \ --platform="${CI_IMAGE_PLATFORM}" \ --label="${CI_IMAGE_LABEL}" \ @@ -58,15 +38,6 @@ if [ -z "$DANGER_RUN_CI_ON_HOST" ]; then $DOCKER_BUILD_CACHE_ARG \ "${BASE_READ_ONLY_DIR}" - if [ "$DANGER_DOCKER_BUILD_CACHE_HOST_DIR" ]; then - if [ -e "${DOCKER_BUILD_CACHE_NEW_DIR}/index.json" ]; then - echo "Removing the existing docker build cache in ${DOCKER_BUILD_CACHE_OLD_DIR}" - rm -rf "${DOCKER_BUILD_CACHE_OLD_DIR}" - echo "Moving the contents of ${DOCKER_BUILD_CACHE_NEW_DIR} to ${DOCKER_BUILD_CACHE_OLD_DIR}" - mv "${DOCKER_BUILD_CACHE_NEW_DIR}" "${DOCKER_BUILD_CACHE_OLD_DIR}" - fi - fi - docker volume create "${CONTAINER_NAME}_ccache" || true docker volume create "${CONTAINER_NAME}_depends" || true docker volume create "${CONTAINER_NAME}_depends_sources" || true diff --git a/ci/test/03_test_script.sh b/ci/test/03_test_script.sh index 1e8b8292ce3..4ede8e43110 100755 --- a/ci/test/03_test_script.sh +++ b/ci/test/03_test_script.sh @@ -24,6 +24,14 @@ fi echo "Free disk space:" df -h +# We force an install of linux-headers again here via $PACKAGES to fix any +# kernel mismatch between a cached docker image and the underlying host. +# This can happen occasionally on hosted runners if the runner image is updated. +if [[ "$CONTAINER_NAME" == "ci_native_asan" ]]; then + $CI_RETRY_EXE apt-get update + ${CI_RETRY_EXE} bash -c "apt-get install --no-install-recommends --no-upgrade -y $PACKAGES" +fi + # 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 @@ -93,7 +101,7 @@ fi if [ -z "$NO_DEPENDS" ]; then case "${CI_IMAGE_NAME_TAG}" in *centos*|*rocky*) - SHELL_OPTS="CONFIG_SHELL=/bin/ksh" # Temporarily use ksh instead of dash, until https://bugzilla.redhat.com/show_bug.cgi?id=2335416 is fixed. + SHELL_OPTS="CONFIG_SHELL=/bin/dash" ;; *) SHELL_OPTS="CONFIG_SHELL=" @@ -101,6 +109,9 @@ if [ -z "$NO_DEPENDS" ]; then esac 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="-DBUILD_BENCH=ON -DBUILD_FUZZ_BINARY=ON" if [ -z "$NO_DEPENDS" ]; then @@ -113,60 +124,12 @@ fi ccache --zero-stats PRINT_CCACHE_STATISTICS="ccache --version | head -n 1 && ccache --show-stats" -if [ -z "$NO_DEPENDS" ]; then - # legacy autotools path (depends builds) - BITCOIN_CONFIG_ALL="${BITCOIN_CONFIG_ALL} --enable-external-signer --prefix=$BASE_OUTDIR" -else - # modern CMake path (native macOS + NO_DEPENDS=1) - BITCOIN_CONFIG_ALL="${BITCOIN_CONFIG_ALL} -DENABLE_EXTERNAL_SIGNER=ON" -fi - -# === CMake build (modern path used by the fork) === -if [ -n "$NO_DEPENDS" ]; then - echo "Building with CMake (NO_DEPENDS=1)..." - cmake -B build -S . ${CMAKE_GENERATOR:+-G "$CMAKE_GENERATOR"} $BITCOIN_CONFIG_ALL -else - # depends path (still uses configure in some jobs) - ./autogen.sh - ./configure $BITCOIN_CONFIG_ALL -fi - -cmake --build build --config Release --parallel "$MAKEJOBS" - -if [ -n "$NO_DEPENDS" ]; then - bash -c "${PRINT_CCACHE_STATISTICS}" - - if [ "$RUN_UNIT_TESTS" = "true" ]; then - DIR_UNIT_TEST_DATA="${DIR_UNIT_TEST_DATA}" CTEST_OUTPUT_ON_FAILURE=ON ctest --stop-on-failure "${MAKEJOBS}" --timeout $(( TEST_RUNNER_TIMEOUT_FACTOR * 60 )) - fi - - if [ "$RUN_FUNCTIONAL_TESTS" = "true" ]; then - eval "TEST_RUNNER_EXTRA=($TEST_RUNNER_EXTRA)" - 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 - - exit 0 -fi - +# Folder where the build is done. +BASE_BUILD_DIR=${BASE_BUILD_DIR:-$BASE_SCRATCH_DIR/build-$HOST} 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}/elements-$HOST" - -bash -c "./configure --cache-file=../config.cache $BITCOIN_CONFIG_ALL $BITCOIN_CONFIG" || ( (cat config.log) && false) - -# ELEMENTS FIXME: fix fix in order to correctly run it #30454 -# # Folder where the build is done. -# BASE_BUILD_DIR=${BASE_BUILD_DIR:-$BASE_SCRATCH_DIR/build-$HOST} -# mkdir -p "${BASE_BUILD_DIR}" -# cd "${BASE_BUILD_DIR}" -# -# BITCOIN_CONFIG_ALL="$BITCOIN_CONFIG_ALL -DENABLE_EXTERNAL_SIGNER=ON -DCMAKE_INSTALL_PREFIX=$BASE_OUTDIR" - +BITCOIN_CONFIG_ALL="$BITCOIN_CONFIG_ALL -DENABLE_EXTERNAL_SIGNER=ON -DCMAKE_INSTALL_PREFIX=$BASE_OUTDIR" if [[ "${RUN_TIDY}" == "true" ]]; then BITCOIN_CONFIG_ALL="$BITCOIN_CONFIG_ALL -DCMAKE_EXPORT_COMPILE_COMMANDS=ON" @@ -177,6 +140,12 @@ bash -c "cmake -S $BASE_ROOT_DIR $BITCOIN_CONFIG_ALL $BITCOIN_CONFIG || ( (cat $ bash -c "cmake --build . $MAKEJOBS --target all $GOAL" || ( echo "Build failure. Verbose build follows." && cmake --build . --target all "$GOAL" --verbose ; false ) bash -c "${PRINT_CCACHE_STATISTICS}" +if [ "$CI" = "true" ]; then + hit_rate=$(ccache -s | grep "Hits:" | head -1 | sed 's/.*(\(.*\)%).*/\1/') + if [ "${hit_rate%.*}" -lt 75 ]; then + echo "::notice title=low ccache hitrate::Ccache hit-rate in $CONTAINER_NAME was $hit_rate%" + fi +fi du -sh "${DEPENDS_DIR}"/*/ du -sh "${PREVIOUS_RELEASES_DIR}" @@ -217,17 +186,17 @@ if [ "${RUN_TIDY}" = "true" ]; then jq 'map(select(.file | test("src/qt/.*_autogen/.*\\.cpp$") | not))' "${BASE_BUILD_DIR}/compile_commands.json" > tmp.json mv tmp.json "${BASE_BUILD_DIR}/compile_commands.json" - cd "${BASE_BUILD_DIR}/elements-$HOST/src/" + cd "${BASE_BUILD_DIR}/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 - cd "${BASE_BUILD_DIR}/elements-$HOST/" + cd "${BASE_ROOT_DIR}" python3 "/include-what-you-use/iwyu_tool.py" \ - -p . "${MAKEJOBS}" \ - -- -Xiwyu --cxx17ns -Xiwyu --mapping_file="${BASE_BUILD_DIR}/elements-$HOST/contrib/devtools/iwyu/bitcoin.core.imp" \ + -p "${BASE_BUILD_DIR}" "${MAKEJOBS}" \ + -- -Xiwyu --cxx17ns -Xiwyu --mapping_file="${BASE_ROOT_DIR}/contrib/devtools/iwyu/bitcoin.core.imp" \ -Xiwyu --max_line_length=160 \ 2>&1 | tee /tmp/iwyu_ci.out cd "${BASE_ROOT_DIR}/src" @@ -238,4 +207,4 @@ 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 +fi \ No newline at end of file diff --git a/ci/test_imagefile b/ci/test_imagefile index f8b5eea1c88..f9cf3187a25 100644 --- a/ci/test_imagefile +++ b/ci/test_imagefile @@ -4,12 +4,16 @@ # See ci/README.md for usage. -ARG CI_IMAGE_NAME_TAG +# We never want scratch, but default arg silences a Warning +ARG CI_IMAGE_NAME_TAG=scratch FROM ${CI_IMAGE_NAME_TAG} ARG FILE_ENV ENV FILE_ENV=${FILE_ENV} +ARG BASE_ROOT_DIR +ENV BASE_ROOT_DIR=${BASE_ROOT_DIR} + 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/ diff --git a/cmake/module/AddBoostIfNeeded.cmake b/cmake/module/AddBoostIfNeeded.cmake index 589c88bf744..1939c7da04b 100644 --- a/cmake/module/AddBoostIfNeeded.cmake +++ b/cmake/module/AddBoostIfNeeded.cmake @@ -17,6 +17,18 @@ function(add_boost_if_needed) directory and other added INTERFACE properties. ]=] + if(CMAKE_HOST_APPLE) + find_program(HOMEBREW_EXECUTABLE brew) + if(HOMEBREW_EXECUTABLE) + execute_process( + COMMAND ${HOMEBREW_EXECUTABLE} --prefix boost + OUTPUT_VARIABLE Boost_ROOT + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + endif() + endif() + # We cannot rely on find_package(Boost ...) to work properly without # Boost_NO_BOOST_CMAKE set until we require a more recent Boost because # upstream did not ship proper CMake files until 1.82.0. diff --git a/cmake/module/FindQRencode.cmake b/cmake/module/FindQRencode.cmake index 39e3b8b679b..575bfecc8b1 100644 --- a/cmake/module/FindQRencode.cmake +++ b/cmake/module/FindQRencode.cmake @@ -21,16 +21,16 @@ endif() find_path(QRencode_INCLUDE_DIR NAMES qrencode.h - PATHS ${PC_QRencode_INCLUDE_DIRS} + HINTS ${PC_QRencode_INCLUDE_DIRS} ) find_library(QRencode_LIBRARY_RELEASE NAMES qrencode - PATHS ${PC_QRencode_LIBRARY_DIRS} + HINTS ${PC_QRencode_LIBRARY_DIRS} ) find_library(QRencode_LIBRARY_DEBUG NAMES qrencoded qrencode - PATHS ${PC_QRencode_LIBRARY_DIRS} + HINTS ${PC_QRencode_LIBRARY_DIRS} ) include(SelectLibraryConfigurations) select_library_configurations(QRencode) diff --git a/cmake/module/FindUSDT.cmake b/cmake/module/FindUSDT.cmake index 0be7c28ff58..234a099f3fd 100644 --- a/cmake/module/FindUSDT.cmake +++ b/cmake/module/FindUSDT.cmake @@ -36,6 +36,10 @@ if(USDT_INCLUDE_DIR) include(CheckCXXSourceCompiles) set(CMAKE_REQUIRED_INCLUDES ${USDT_INCLUDE_DIR}) check_cxx_source_compiles(" + #if defined(__arm__) + # define STAP_SDT_ARG_CONSTRAINT g + #endif + // Setting SDT_USE_VARIADIC lets systemtap (sys/sdt.h) know that we want to use // the optional variadic macros to define tracepoints. #define SDT_USE_VARIADIC 1 diff --git a/cmake/module/Maintenance.cmake b/cmake/module/Maintenance.cmake index 13e6b95ac7e..621c76b4715 100644 --- a/cmake/module/Maintenance.cmake +++ b/cmake/module/Maintenance.cmake @@ -83,6 +83,7 @@ function(add_macos_deploy_target) COMMAND ${CMAKE_COMMAND} --install ${PROJECT_BINARY_DIR} --config $ --component elements-qt --prefix ${macos_app}/Contents/MacOS --strip COMMAND ${CMAKE_COMMAND} -E rename ${macos_app}/Contents/MacOS/bin/$ ${macos_app}/Contents/MacOS/Elements-Qt COMMAND ${CMAKE_COMMAND} -E rm -rf ${macos_app}/Contents/MacOS/bin + COMMAND ${CMAKE_COMMAND} -E rm -rf ${macos_app}/Contents/MacOS/share VERBATIM ) diff --git a/cmake/module/ProcessConfigurations.cmake b/cmake/module/ProcessConfigurations.cmake index 9a510a00a55..d5426f6e08f 100644 --- a/cmake/module/ProcessConfigurations.cmake +++ b/cmake/module/ProcessConfigurations.cmake @@ -105,14 +105,13 @@ function(remove_cxx_flag_from_all_configs flag) endfunction() function(replace_cxx_flag_in_config config old_flag new_flag) - string(TOUPPER "${config}" config_uppercase) - string(REGEX REPLACE "(^| )${old_flag}( |$)" "\\1${new_flag}\\2" new_flags "${CMAKE_CXX_FLAGS_${config_uppercase}}") - set(CMAKE_CXX_FLAGS_${config_uppercase} "${new_flags}" PARENT_SCOPE) - set(CMAKE_CXX_FLAGS_${config_uppercase} "${new_flags}" - CACHE STRING - "Flags used by the CXX compiler during ${config_uppercase} builds." - FORCE - ) + string(TOUPPER "CMAKE_CXX_FLAGS_${config}" var_name) + if("${var_name}" IN_LIST precious_variables) + return() + endif() + string(REGEX REPLACE "(^| )${old_flag}( |$)" "\\1${new_flag}\\2" ${var_name} "${${var_name}}") + set(${var_name} "${${var_name}}" PARENT_SCOPE) + set_property(CACHE ${var_name} PROPERTY VALUE "${${var_name}}") endfunction() set_default_config(RelWithDebInfo) diff --git a/cmake/module/TryAppendLinkerFlag.cmake b/cmake/module/TryAppendLinkerFlag.cmake index be41a2e1cc2..fe7c2bce51e 100644 --- a/cmake/module/TryAppendLinkerFlag.cmake +++ b/cmake/module/TryAppendLinkerFlag.cmake @@ -20,7 +20,7 @@ In configuration output, this function prints a string by the following pattern: function(try_append_linker_flag flag) cmake_parse_arguments(PARSE_ARGV 1 TALF # prefix - "" # options + "NO_CACHE_IF_FAILED" # options "TARGET;VAR;SOURCE;RESULT_VAR" # one_value_keywords "IF_CHECK_PASSED" # multi_value_keywords ) @@ -68,6 +68,10 @@ function(try_append_linker_flag flag) if(DEFINED TALF_RESULT_VAR) set(${TALF_RESULT_VAR} "${${result}}" PARENT_SCOPE) endif() + + if(NOT ${result} AND TALF_NO_CACHE_IF_FAILED) + unset(${result} CACHE) + endif() endfunction() if(MSVC) diff --git a/contrib/devtools/check-deps.sh b/contrib/devtools/check-deps.sh index 25e948647c0..04c7fad88ee 100755 --- a/contrib/devtools/check-deps.sh +++ b/contrib/devtools/check-deps.sh @@ -51,6 +51,69 @@ SUPPRESS["init.cpp.o bdb.cpp.o _ZN6wallet27BerkeleyDatabaseSanityCheckEv"]=1 SUPPRESS["common.cpp.o interface_ui.cpp.o _Z11InitWarningRK13bilingual_str"]=1 SUPPRESS["common.cpp.o interface_ui.cpp.o _Z9InitErrorRK13bilingual_str"]=1 +# ELEMENTS: wallet fee/balance verification depends on confidential-transaction +# validation logic (fee map, amount/CT-balance checks), which lives alongside +# consensus validation rather than in the wallet library. +SUPPRESS["transactions.cpp.o confidential_validation.cpp.o _Z11HasValidFeeRK12CTransaction"]=1 +SUPPRESS["wallet.cpp.o confidential_validation.cpp.o _Z13VerifyAmountsRKSt6vectorI6CTxOutSaIS0_EERK12CTransactionPS_IP6CCheckSaIS9_EEb"]=1 +SUPPRESS["feebumper.cpp.o confidential_validation.cpp.o _Z9GetFeeMapRK12CTransaction"]=1 +SUPPRESS["receive.cpp.o confidential_validation.cpp.o _Z9GetFeeMapRK12CTransaction"]=1 +SUPPRESS["transactions.cpp.o confidential_validation.cpp.o _Z9GetFeeMapRK12CTransaction"]=1 + +# ELEMENTS: RPC and wallet code that constructs or verifies peg-in transactions +# depends directly on the peg-in logic (SPV proof checking, fedpeg script +# resolution, witness construction/decomposition). +SUPPRESS["elements.cpp.o pegins.cpp.o _Z18CreatePeginWitnessRKlRK6CAssetRK7uint256RK7CScriptRKSt10shared_ptrIK12CTransactionERK12CMerkleBlock"]=1 +SUPPRESS["wallet.cpp.o pegins.cpp.o _Z18CreatePeginWitnessRKlRK6CAssetRK7uint256RK7CScriptRKSt10shared_ptrIK12CTransactionERK12CMerkleBlock"]=1 +SUPPRESS["psbt.cpp.o pegins.cpp.o _Z18CreatePeginWitnessRKlRK6CAssetRK7uint256RK7CScriptRKSt10shared_ptrIK12CTransactionERK12CMerkleBlock"]=1 +SUPPRESS["rawtransaction_util.cpp.o pegins.cpp.o _Z18CreatePeginWitnessRKlRK6CAssetRK7uint256RK7CScriptRKSt10shared_ptrIK12CTransactionERK12CMerkleBlock"]=1 +SUPPRESS["wallet.cpp.o pegins.cpp.o _Z18CreatePeginWitnessRKlRK6CAssetRK7uint256RK7CScriptRKSt10shared_ptrIKN9Sidechain7Bitcoin12CTransactionEERKNSC_12CMerkleBlockE"]=1 +SUPPRESS["psbt.cpp.o pegins.cpp.o _Z18CreatePeginWitnessRKlRK6CAssetRK7uint256RK7CScriptRKSt10shared_ptrIKN9Sidechain7Bitcoin12CTransactionEERKNSC_12CMerkleBlockE"]=1 +SUPPRESS["rawtransaction_util.cpp.o pegins.cpp.o _Z18CreatePeginWitnessRKlRK6CAssetRK7uint256RK7CScriptRKSt10shared_ptrIKN9Sidechain7Bitcoin12CTransactionEERKNSC_12CMerkleBlockE"]=1 +SUPPRESS["elements.cpp.o pegins.cpp.o _Z18calculate_contractRK7CScriptS1_"]=1 +SUPPRESS["rawtransaction_util.cpp.o pegins.cpp.o _Z18calculate_contractRK7CScriptS1_"]=1 +SUPPRESS["elements.cpp.o pegins.cpp.o _Z19IsValidPeginWitnessRK14CScriptWitnessRKSt6vectorISt4pairI7CScriptS4_ESaIS5_EERK9COutPointRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEbPb"]=1 +SUPPRESS["spend.cpp.o pegins.cpp.o _Z19IsValidPeginWitnessRK14CScriptWitnessRKSt6vectorISt4pairI7CScriptS4_ESaIS5_EERK9COutPointRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEbPb"]=1 +SUPPRESS["rawtransaction_util.cpp.o pegins.cpp.o _Z19IsValidPeginWitnessRK14CScriptWitnessRKSt6vectorISt4pairI7CScriptS4_ESaIS5_EERK9COutPointRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEbPb"]=1 +SUPPRESS["elements.cpp.o pegins.cpp.o _Z21GetValidFedpegScriptsPK11CBlockIndexRKN9Consensus6ParamsEb"]=1 +SUPPRESS["spend.cpp.o pegins.cpp.o _Z21GetValidFedpegScriptsPK11CBlockIndexRKN9Consensus6ParamsEb"]=1 +SUPPRESS["rawtransaction_util.cpp.o pegins.cpp.o _Z21GetValidFedpegScriptsPK11CBlockIndexRKN9Consensus6ParamsEb"]=1 +SUPPRESS["psbt.cpp.o pegins.cpp.o _Z21DecomposePeginWitnessRK14CScriptWitnessRlR6CAssetR7uint256R7CScriptRSt7variantIJSt9monostateSt10shared_ptrIKN9Sidechain7Bitcoin12CTransactionEESB_IK12CTransactionEEERS9_IJSA_NSD_12CMerkleBlockE12CMerkleBlockEE"]=1 +SUPPRESS["elements.cpp.o pegins.cpp.o _Z22CheckParentProofOfWork7uint256jRKN9Consensus6ParamsE"]=1 +SUPPRESS["rawtransaction_util.cpp.o pegins.cpp.o _Z22CheckParentProofOfWork7uint256jRKN9Consensus6ParamsE"]=1 +SUPPRESS["elements.cpp.o pegins.cpp.o _Z29GetAmountFromParentChainPeginRlRK12CTransactionj"]=1 +SUPPRESS["rawtransaction_util.cpp.o pegins.cpp.o _Z29GetAmountFromParentChainPeginRlRK12CTransactionj"]=1 +SUPPRESS["elements.cpp.o pegins.cpp.o _Z29GetAmountFromParentChainPeginRlRKN9Sidechain7Bitcoin12CTransactionEj"]=1 +SUPPRESS["rawtransaction_util.cpp.o pegins.cpp.o _Z29GetAmountFromParentChainPeginRlRKN9Sidechain7Bitcoin12CTransactionEj"]=1 + +# ELEMENTS: RPC's peg-in verification needs a client to query the parent +# (mainchain) node for block confirmation in the non-SPV verification path. +SUPPRESS["elements.cpp.o mainchainrpc.cpp.o _Z16CallMainChainRPCRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERK8UniValue"]=1 +SUPPRESS["elements.cpp.o mainchainrpc.cpp.o _Z23IsConfirmedBitcoinBlockRK7uint256ii"]=1 + +# ELEMENTS: RPC needs the active Pegout Authorization Key list and PAK-proof +# verification for pegout-related RPCs. +SUPPRESS["elements.cpp.o pak.cpp.o _Z16GetActivePAKListPK11CBlockIndexRKN9Consensus6ParamsE"]=1 +SUPPRESS["elements.cpp.o pak.cpp.o _Z22ScriptHasValidPAKProofRK7CScriptRK7uint256RK8CPAKList"]=1 + +# ELEMENTS: RPC needs to parse the federation quorum out of a fedpeg script +# for dynamic federation RPCs. +SUPPRESS["elements.cpp.o dynafed.cpp.o _Z17ParseFedPegQuorumRK7CScriptRiS2_"]=1 + +# ELEMENTS: RPC needs to verify the parent chain's proof-of-work signature +# for federated peg verification. +SUPPRESS["elements.cpp.o block_proof.cpp.o _Z22CheckProofSignedParentRK12CBlockHeaderRKN9Consensus6ParamsE"]=1 +SUPPRESS["rawtransaction_util.cpp.o block_proof.cpp.o _Z22CheckProofSignedParentRK12CBlockHeaderRKN9Consensus6ParamsE"]=1 + +# ELEMENTS: RPC needs deployment/versionbits state for dynamic federation +# related RPCs. +SUPPRESS["elements.cpp.o versionbits.cpp.o _ZN16VersionBitsCache5StateEPK11CBlockIndexRKN9Consensus6ParamsENS3_13DeploymentPosE"]=1 + +# Upstream gap: node/chain.cpp depends on kernel/blockstorage.cpp's block-index +# regeneration helper. Not yet suppressed upstream as of this merge; worth +# checking if a newer upstream commit already added this suppression. +SUPPRESS["chain.cpp.o blockstorage.cpp.o _ZNK6kernel11BlockTreeDB19RegenerateFullIndexEPK11CBlockIndexPS1_"]=1 + usage() { echo "Usage: $(basename "${BASH_SOURCE[0]}") [BUILD_DIR]" } diff --git a/contrib/devtools/deterministic-fuzz-coverage/src/main.rs b/contrib/devtools/deterministic-fuzz-coverage/src/main.rs index adf6333324b..3ebcb7570e3 100644 --- a/contrib/devtools/deterministic-fuzz-coverage/src/main.rs +++ b/contrib/devtools/deterministic-fuzz-coverage/src/main.rs @@ -165,7 +165,7 @@ fn deterministic_coverage( .success(); if !same { eprintln!(); - eprintln!("The coverage was not determinstic between runs."); + eprintln!("The coverage was not deterministic between runs."); eprintln!("{}", err); eprintln!("Exiting."); exit(1); diff --git a/contrib/devtools/gen-bitcoin-conf.sh b/contrib/devtools/gen-bitcoin-conf.sh index 234318e1a14..d31f5462956 100755 --- a/contrib/devtools/gen-bitcoin-conf.sh +++ b/contrib/devtools/gen-bitcoin-conf.sh @@ -50,7 +50,8 @@ EOF # 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 '1,/Options:/d' \ + | sed -E '/^[[:space:]]{2}-help/,/^[[:space:]]*$/d' \ | sed -E 's/^[[:space:]]{2}\-/#/' \ | sed -E 's/^[[:space:]]{7}/# /' \ | sed -E '/[=[:space:]]/!s/#.*$/&=1/' \ diff --git a/contrib/guix/INSTALL.md b/contrib/guix/INSTALL.md index 515d4487d6e..df2728332af 100644 --- a/contrib/guix/INSTALL.md +++ b/contrib/guix/INSTALL.md @@ -71,13 +71,13 @@ 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). +Currently, the `guix` package is no longer present in recent Debian or Ubuntu +repositories. Any other installation option mentioned in this document may be +used. -To install: +If you previously installed `guix` via `apt`, you can remove it with: ```sh -sudo apt install guix +sudo apt purge guix ``` ### Arch Linux @@ -319,7 +319,7 @@ Source: https://logs.guix.gnu.org/guix/2020-11-12.log#232527 Start by cloning Guix: ``` -git clone https://git.savannah.gnu.org/git/guix.git +git clone https://codeberg.org/guix/guix.git cd guix ``` @@ -607,7 +607,7 @@ checklist. ``` Generation 38 Feb 22 2021 16:39:31 (current) guix f350df4 - repository URL: https://git.savannah.gnu.org/git/guix.git + repository URL: https://codeberg.org/guix/guix.git branch: version-1.2.0 commit: f350df405fbcd5b9e27e6b6aa500da7f101f41e7 ``` @@ -760,8 +760,8 @@ 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) +- A commit to skip this test is included since Guix 1.4.0: +[codeberg/guix@6ba1058](https://codeberg.org/guix/guix/commit/6ba1058df0c4ce5611c2367531ae5c3cdc729ab4) [install-script]: #options-1-and-2-using-the-official-shell-installer-script-or-binary-tarball diff --git a/contrib/guix/guix-build b/contrib/guix/guix-build index 2ea574fe4b9..ee285bf322c 100755 --- a/contrib/guix/guix-build +++ b/contrib/guix/guix-build @@ -69,6 +69,12 @@ fi mkdir -p "$VERSION_BASE" +################ +# SOURCE_DATE_EPOCH should not unintentionally be set +################ + +check_source_date_epoch + ################ # Build directories should not exist ################ diff --git a/contrib/guix/guix-codesign b/contrib/guix/guix-codesign index dedee135b4a..ac7aae3a180 100755 --- a/contrib/guix/guix-codesign +++ b/contrib/guix/guix-codesign @@ -67,6 +67,12 @@ EOF exit 1 fi +################ +# SOURCE_DATE_EPOCH should not unintentionally be set +################ + +check_source_date_epoch + ################ # The codesignature git worktree should not be dirty ################ diff --git a/contrib/guix/libexec/build.sh b/contrib/guix/libexec/build.sh old mode 100644 new mode 100755 diff --git a/contrib/guix/libexec/prelude.bash b/contrib/guix/libexec/prelude.bash index 4192fa9e05f..0ba48c788a1 100644 --- a/contrib/guix/libexec/prelude.bash +++ b/contrib/guix/libexec/prelude.bash @@ -21,6 +21,26 @@ check_tools() { done } +################ +# SOURCE_DATE_EPOCH should not unintentionally be set +################ + +check_source_date_epoch() { + if [ -n "$SOURCE_DATE_EPOCH" ] && [ -z "$FORCE_SOURCE_DATE_EPOCH" ]; then + cat << EOF +ERR: Environment variable SOURCE_DATE_EPOCH is set which may break reproducibility. + + Aborting... + +Hint: You may want to: + 1. Unset this variable: \`unset SOURCE_DATE_EPOCH\` before rebuilding + 2. Set the 'FORCE_SOURCE_DATE_EPOCH' environment variable if you insist on + using your own epoch +EOF + exit 1 + fi +} + check_tools cat env readlink dirname basename git ################ diff --git a/contrib/macdeploy/macdeployqtplus b/contrib/macdeploy/macdeployqtplus index d79ecbb7aea..7b6ee9f2f7f 100755 --- a/contrib/macdeploy/macdeployqtplus +++ b/contrib/macdeploy/macdeployqtplus @@ -465,18 +465,18 @@ if config.translations_dir: sys.stderr.write(f"Error: Could not find translation dir \"{config.translations_dir[0]}\"\n") sys.exit(1) -print("+ Adding Qt translations +") + print("+ Adding Qt translations +") -translations = Path(config.translations_dir[0]) + translations = Path(config.translations_dir[0]) -regex = re.compile('qt_[a-z]*(.qm|_[A-Z]*.qm)') + regex = re.compile('qt_[a-z]*(.qm|_[A-Z]*.qm)') -lang_files = [x for x in translations.iterdir() if regex.match(x.name)] + 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)) + 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)) # ------------------------------------------------ diff --git a/contrib/merge-prs.sh b/contrib/merge-prs.sh index 1c1c9e96e2f..ccc425ddc7b 100755 --- a/contrib/merge-prs.sh +++ b/contrib/merge-prs.sh @@ -23,7 +23,7 @@ PR_PREFIX="bitcoin/bitcoin" # Set your git worktree location here. This is where the merges will be done, and where you should checkout the merged-master branch. WORKTREE="/home/byron/code/elements-worktree" -# Set your parallellism during build/test. You probably want as many cores as possible. +# Set your parallelism during build/test. You probably want as many cores as possible. # Parallel functional tests can somewhat exceed your core count, depends on the build machine CPU/RAM. PARALLEL_BUILD=23 # passed to make -j PARALLEL_TEST=46 # passed to test_runner.py --jobs @@ -142,7 +142,7 @@ echo start > merge.log quietly () { if [[ "$VERBOSE" == "1" ]]; then - date | tee --append merge.log + date | tee --append merge.log time "$@" 2>&1 | tee --append merge.log else chronic "$@" @@ -158,7 +158,7 @@ notify () { echo "$MESSAGE" fi if [[ "$2" == "1" ]]; then - exit 1 + exit 1 fi } @@ -170,7 +170,7 @@ do CHAIN=$(echo "$line" | cut -d ' ' -f 4) PR_ID=$(echo "$line" | grep -o -P "#\d+") - GIT_HEAD=$(git rev-parse HEAD) + GIT_HEAD=$(git rev-parse HEAD) ## Do it if [[ "$1" == "list-only" ]]; then @@ -207,13 +207,13 @@ do ) for STOPPER in "${STOPPERS[@]}" do - if [[ "$PR_ID" == *"$STOPPER"* ]]; then - echo "Found $STOPPER in $PR_ID! Exiting." - notify "hit stopper, exiting" - exit 1 - else - echo "Didn't find $STOPPER in $PR_ID. Continuing." - fi + if [[ "$PR_ID" == *"$STOPPER"* ]]; then + echo "Found $STOPPER in $PR_ID! Exiting." + notify "hit stopper, exiting" + exit 1 + else + echo "Didn't find $STOPPER in $PR_ID. Continuing." + fi done if [[ "$SKIP_MERGE" == "1" ]]; then diff --git a/contrib/seeds/README.md b/contrib/seeds/README.md index a1a2e34b5de..58d7f41130f 100644 --- a/contrib/seeds/README.md +++ b/contrib/seeds/README.md @@ -10,14 +10,13 @@ to addrman with). Update `MIN_BLOCKS` in `makeseeds.py` and the `-m`/`--minblocks` arguments below, as needed. -The seeds compiled into the release are created from sipa's, achow101's and luke-jr's +The seeds compiled into the release are created from sipa's and achow101's DNS seed, virtu's crawler, and asmap community 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://21.ninja/seeds.txt.gz | gzip -dc >> seeds_main.txt -curl https://luke.dashjr.org/programs/bitcoin/files/charts/seeds.txt >> seeds_main.txt curl https://mainnet.achownodes.xyz/seeds.txt.gz | gzip -dc >> seeds_main.txt curl https://signet.achownodes.xyz/seeds.txt.gz | gzip -dc > seeds_signet.txt curl https://testnet.achownodes.xyz/seeds.txt.gz | gzip -dc > seeds_test.txt diff --git a/contrib/tracing/README.md b/contrib/tracing/README.md index 252053e7b87..192182e17d6 100644 --- a/contrib/tracing/README.md +++ b/contrib/tracing/README.md @@ -22,7 +22,7 @@ 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 bpftrace]: https://github.com/bpftrace/bpftrace/blob/master/README.md#quick-start [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 diff --git a/contrib/tracing/mempool_monitor.py b/contrib/tracing/mempool_monitor.py index 7c184cce46e..eb29b374158 100755 --- a/contrib/tracing/mempool_monitor.py +++ b/contrib/tracing/mempool_monitor.py @@ -66,7 +66,7 @@ int trace_added(struct pt_regs *ctx) { struct added_event added = {}; void *phash = NULL; - bpf_usdt_readarg(1, ctx, phash); + bpf_usdt_readarg(1, ctx, &phash); bpf_probe_read_user(&added.hash, sizeof(added.hash), phash); bpf_usdt_readarg(2, ctx, &added.vsize); bpf_usdt_readarg(3, ctx, &added.fee); @@ -78,9 +78,9 @@ int trace_removed(struct pt_regs *ctx) { struct removed_event removed = {}; void *phash = NULL, *preason = NULL; - bpf_usdt_readarg(1, ctx, phash); + bpf_usdt_readarg(1, ctx, &phash); bpf_probe_read_user(&removed.hash, sizeof(removed.hash), phash); - bpf_usdt_readarg(1, ctx, preason); + bpf_usdt_readarg(2, ctx, &preason); bpf_probe_read_user_str(&removed.reason, sizeof(removed.reason), preason); bpf_usdt_readarg(3, ctx, &removed.vsize); bpf_usdt_readarg(4, ctx, &removed.fee); @@ -93,9 +93,9 @@ int trace_rejected(struct pt_regs *ctx) { struct rejected_event rejected = {}; void *phash = NULL, *preason = NULL; - bpf_usdt_readarg(1, ctx, phash); + bpf_usdt_readarg(1, ctx, &phash); bpf_probe_read_user(&rejected.hash, sizeof(rejected.hash), phash); - bpf_usdt_readarg(1, ctx, preason); + bpf_usdt_readarg(2, ctx, &preason); bpf_probe_read_user_str(&rejected.reason, sizeof(rejected.reason), preason); rejected_events.perf_submit(ctx, &rejected, sizeof(rejected)); return 0; @@ -104,12 +104,12 @@ int trace_replaced(struct pt_regs *ctx) { struct replaced_event replaced = {}; void *phash_replaced = NULL, *phash_replacement = NULL; - bpf_usdt_readarg(1, ctx, phash_replaced); + bpf_usdt_readarg(1, ctx, &phash_replaced); bpf_probe_read_user(&replaced.replaced_hash, sizeof(replaced.replaced_hash), phash_replaced); 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(5, ctx, phash_replacement); + bpf_usdt_readarg(5, ctx, &phash_replacement); bpf_probe_read_user(&replaced.replacement_hash, sizeof(replaced.replacement_hash), phash_replacement); bpf_usdt_readarg(6, ctx, &replaced.replacement_vsize); bpf_usdt_readarg(7, ctx, &replaced.replacement_fee); diff --git a/contrib/tracing/p2p_monitor.py b/contrib/tracing/p2p_monitor.py index 78225366d9c..7a7cc20e86c 100755 --- a/contrib/tracing/p2p_monitor.py +++ b/contrib/tracing/p2p_monitor.py @@ -54,7 +54,7 @@ bpf_probe_read_user_str(&msg.peer_addr, sizeof(msg.peer_addr), paddr); bpf_usdt_readarg(3, ctx, &pconn_type); bpf_probe_read_user_str(&msg.peer_conn_type, sizeof(msg.peer_conn_type), pconn_type); - bpf_usdt_readarg(4, ctx, &pconn_type); + bpf_usdt_readarg(4, ctx, &pmsg_type); bpf_probe_read_user_str(&msg.msg_type, sizeof(msg.msg_type), pmsg_type); bpf_usdt_readarg(5, ctx, &msg.msg_size); @@ -71,7 +71,7 @@ bpf_probe_read_user_str(&msg.peer_addr, sizeof(msg.peer_addr), paddr); bpf_usdt_readarg(3, ctx, &pconn_type); bpf_probe_read_user_str(&msg.peer_conn_type, sizeof(msg.peer_conn_type), pconn_type); - bpf_usdt_readarg(4, ctx, &pconn_type); + bpf_usdt_readarg(4, ctx, &pmsg_type); bpf_probe_read_user_str(&msg.msg_type, sizeof(msg.msg_type), pmsg_type); bpf_usdt_readarg(5, ctx, &msg.msg_size); diff --git a/depends/Makefile b/depends/Makefile index 25c86467394..3dbd69221aa 100644 --- a/depends/Makefile +++ b/depends/Makefile @@ -206,6 +206,7 @@ endif $(host_prefix)/toolchain.cmake : toolchain.cmake.in $(host_prefix)/.stamp_$(final_build_id) @mkdir -p $(@D) sed -e 's|@depends_crosscompiling@|$(crosscompiling)|' \ + -e 's|@host@|$(host)|' \ -e 's|@host_system_name@|$($(host_os)_cmake_system_name)|' \ -e 's|@host_system_version@|$($(host_os)_cmake_system_version)|' \ -e 's|@host_arch@|$(host_arch)|' \ diff --git a/depends/README.md b/depends/README.md index 848137f03fa..e0aef7c1789 100644 --- a/depends/README.md +++ b/depends/README.md @@ -90,15 +90,15 @@ For linux S390X cross compilation: ### Install the required dependencies: FreeBSD - pkg install bash + pkg install bash cmake curl gmake ### Install the required dependencies: NetBSD - pkgin install bash gmake + pkgin install bash cmake curl gmake perl ### Install the required dependencies: OpenBSD - pkg_add bash gmake gtar + pkg_add bash cmake curl gmake gtar ### Dependency Options diff --git a/depends/builders/freebsd.mk b/depends/builders/freebsd.mk index 18316f492ee..910de28bf36 100644 --- a/depends/builders/freebsd.mk +++ b/depends/builders/freebsd.mk @@ -3,3 +3,7 @@ build_freebsd_CXX=clang++ build_freebsd_SHA256SUM = sha256sum build_freebsd_DOWNLOAD = curl --location --fail --connect-timeout $(DOWNLOAD_CONNECT_TIMEOUT) --retry $(DOWNLOAD_RETRIES) -o + +# freebsd host on freebsd builder: override freebsd host preferences. +freebsd_CC = clang +freebsd_CXX = clang++ diff --git a/depends/builders/openbsd.mk b/depends/builders/openbsd.mk index 9c94c4baae7..6aeb1431258 100644 --- a/depends/builders/openbsd.mk +++ b/depends/builders/openbsd.mk @@ -1,9 +1,13 @@ build_openbsd_CC = clang build_openbsd_CXX = clang++ -build_openbsd_SHA256SUM = sha256 +build_openbsd_SHA256SUM = sha256 -r 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 + +# openbsd host on openbsd builder: override openbsd host preferences. +openbsd_CC = clang +openbsd_CXX = clang++ diff --git a/depends/funcs.mk b/depends/funcs.mk index b07432adec9..dce45af9611 100644 --- a/depends/funcs.mk +++ b/depends/funcs.mk @@ -187,6 +187,7 @@ $(1)_cmake=env CC="$$($(1)_cc)" \ -DCMAKE_INSTALL_LIBDIR=lib/ \ -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ -DCMAKE_VERBOSE_MAKEFILE:BOOL=$(V) \ + -DCMAKE_EXPORT_NO_PACKAGE_REGISTRY:BOOL=TRUE \ $$($(1)_config_opts) ifeq ($($(1)_type),build) $(1)_cmake += -DCMAKE_INSTALL_RPATH:PATH="$$($($(1)_type)_prefix)/lib" diff --git a/depends/gen_id b/depends/gen_id index fe6d163547a..ab5b6fb58c6 100755 --- a/depends/gen_id +++ b/depends/gen_id @@ -28,6 +28,10 @@ # Redirect stderr to stdout exec 2>&1 + # Unset SOURCE_DATE_EPOCH to prevent it from leaking into tool + # outputs and to maximize reuse of the built package cache. + unset SOURCE_DATE_EPOCH + echo "BEGIN ALL" # Include any ID salts supplied via command line diff --git a/depends/packages/capnp.mk b/depends/packages/capnp.mk index 7f41d3b5a4e..542bf126297 100644 --- a/depends/packages/capnp.mk +++ b/depends/packages/capnp.mk @@ -5,7 +5,7 @@ $(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 := +define $(package)_set_vars $(package)_config_opts := -DBUILD_TESTING=OFF $(package)_config_opts += -DWITH_OPENSSL=OFF $(package)_config_opts += -DWITH_ZLIB=OFF diff --git a/depends/packages/freetype.mk b/depends/packages/freetype.mk index fef0beaa7b4..a97f82e7fea 100644 --- a/depends/packages/freetype.mk +++ b/depends/packages/freetype.mk @@ -4,6 +4,7 @@ $(package)_download_path=https://download.savannah.gnu.org/releases/$(package) $(package)_file_name=$(package)-$($(package)_version).tar.xz $(package)_sha256_hash=8bee39bd3968c4804b70614a0a3ad597299ad0e824bc8aad5ce8aaf48067bde7 $(package)_build_subdir=build +$(package)_patches += cmake_minimum.patch define $(package)_set_vars $(package)_config_opts := -DCMAKE_BUILD_TYPE=None -DBUILD_SHARED_LIBS=TRUE @@ -12,6 +13,10 @@ define $(package)_set_vars $(package)_config_opts += -DCMAKE_DISABLE_FIND_PACKAGE_BrotliDec=TRUE endef +define $(package)_preprocess_cmds + patch -p1 < $($(package)_patch_dir)/cmake_minimum.patch +endef + define $(package)_config_cmds $($(package)_cmake) -S .. -B . endef diff --git a/depends/packages/libevent.mk b/depends/packages/libevent.mk index 43c1f741b2d..1f139b1eec8 100644 --- a/depends/packages/libevent.mk +++ b/depends/packages/libevent.mk @@ -5,6 +5,7 @@ $(package)_file_name=$(package)-$($(package)_version).tar.gz $(package)_sha256_hash=92e6de1be9ec176428fd2367677e61ceffc2ee1cb119035037a27d346b0403bb $(package)_patches=cmake_fixups.patch $(package)_patches += netbsd_fixup.patch +$(package)_patches += winver_fixup.patch $(package)_build_subdir=build # When building for Windows, we set _WIN32_WINNT to target the same Windows @@ -25,7 +26,8 @@ endef define $(package)_preprocess_cmds patch -p1 < $($(package)_patch_dir)/cmake_fixups.patch && \ - patch -p1 < $($(package)_patch_dir)/netbsd_fixup.patch + patch -p1 < $($(package)_patch_dir)/netbsd_fixup.patch && \ + patch -p1 < $($(package)_patch_dir)/winver_fixup.patch endef define $(package)_config_cmds diff --git a/depends/packages/libmultiprocess.mk b/depends/packages/libmultiprocess.mk index afbd315e388..47064a9bb6c 100644 --- a/depends/packages/libmultiprocess.mk +++ b/depends/packages/libmultiprocess.mk @@ -8,7 +8,7 @@ ifneq ($(host),$(build)) $(package)_dependencies += native_capnp endif -define $(package)_set_vars := +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++" diff --git a/depends/packages/native_capnp.mk b/depends/packages/native_capnp.mk index e67b103716f..a3a089d4faa 100644 --- a/depends/packages/native_capnp.mk +++ b/depends/packages/native_capnp.mk @@ -1,9 +1,9 @@ package=native_capnp -$(package)_version=1.1.0 +$(package)_version=1.2.0 $(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=07167580e563f5e821e3b2af1c238c16ec7181612650c5901330fa9a0da50939 +$(package)_sha256_hash=ed00e44ecbbda5186bc78a41ba64a8dc4a861b5f8d4e822959b0144ae6fd42ef define $(package)_set_vars $(package)_config_opts := -DBUILD_TESTING=OFF diff --git a/depends/packages/native_libmultiprocess.mk b/depends/packages/native_libmultiprocess.mk index 4467dee76f5..a76304f9f05 100644 --- a/depends/packages/native_libmultiprocess.mk +++ b/depends/packages/native_libmultiprocess.mk @@ -1,8 +1,8 @@ package=native_libmultiprocess -$(package)_version=1954f7f65661d49e700c344eae0fc8092decf975 +$(package)_version=v5.0 $(package)_download_path=https://github.com/bitcoin-core/libmultiprocess/archive $(package)_file_name=$($(package)_version).tar.gz -$(package)_sha256_hash=fc014bd74727c1d5d30b396813685012c965d079244dd07b53bc1c75c610a2cb +$(package)_sha256_hash=401984715b271a3446e1910f21adf048ba390d31cc93cc3073742e70d56fa3ea $(package)_dependencies=native_capnp define $(package)_config_cmds diff --git a/depends/packages/qt.mk b/depends/packages/qt.mk index d41ac4e784e..abd8a6fa8d2 100644 --- a/depends/packages/qt.mk +++ b/depends/packages/qt.mk @@ -1,6 +1,6 @@ package=qt $(package)_version=5.15.16 -$(package)_download_path=https://download.qt.io/official_releases/qt/5.15/$($(package)_version)/submodules +$(package)_download_path=https://download.qt.io/archive/qt/5.15/$($(package)_version)/submodules $(package)_suffix=everywhere-opensource-src-$($(package)_version).tar.xz $(package)_file_name=qtbase-$($(package)_suffix) $(package)_sha256_hash=b04815058c18058b6ba837206756a2c87d1391f07a0dcb0dd314f970fd041592 diff --git a/depends/packages/xproto.mk b/depends/packages/xproto.mk index 29c349a21b5..0a534556ee4 100644 --- a/depends/packages/xproto.mk +++ b/depends/packages/xproto.mk @@ -21,6 +21,8 @@ define $(package)_build_cmds $(MAKE) endef +# mkdir detection is broken on Alpine. Set MKDIRPROG to ensure we always +# use "mkdir -p", and avoid parallelism issues during install. define $(package)_stage_cmds - $(MAKE) DESTDIR=$($(package)_staging_dir) install + $(MAKE) MKDIRPROG="mkdir -p" DESTDIR=$($(package)_staging_dir) install endef diff --git a/depends/patches/freetype/cmake_minimum.patch b/depends/patches/freetype/cmake_minimum.patch new file mode 100644 index 00000000000..0a976f8ab8d --- /dev/null +++ b/depends/patches/freetype/cmake_minimum.patch @@ -0,0 +1,13 @@ +build: set minimum required CMake to 3.12 + +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -97,7 +97,7 @@ + # FreeType explicitly marks the API to be exported and relies on the compiler + # to hide all other symbols. CMake supports a C_VISBILITY_PRESET property + # starting with 2.8.12. +-cmake_minimum_required(VERSION 2.8.12) ++cmake_minimum_required(VERSION 3.12) + + if (NOT CMAKE_VERSION VERSION_LESS 3.3) + # Allow symbol visibility settings also on static libraries. CMake < 3.3 diff --git a/depends/patches/libevent/winver_fixup.patch b/depends/patches/libevent/winver_fixup.patch new file mode 100644 index 00000000000..4995c356f94 --- /dev/null +++ b/depends/patches/libevent/winver_fixup.patch @@ -0,0 +1,122 @@ +Cherry-picked from a14ff91254f40cf36e0fee199e26fb11260fab49. + +move _WIN32_WINNT defintions before first #include + +_WIN32_WINNT and WIN32_LEAN_AND_MEAN need to be defined +before the windows.h is included for the first time. +Avoid the confusion of indirect #include by defining +before any. + +diff --git a/event_iocp.c b/event_iocp.c +index 6b2a2e15..4955e426 100644 +--- a/event_iocp.c ++++ b/event_iocp.c +@@ -23,12 +23,14 @@ + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +-#include "evconfig-private.h" + + #ifndef _WIN32_WINNT + /* Minimum required for InitializeCriticalSectionAndSpinCount */ + #define _WIN32_WINNT 0x0403 + #endif ++ ++#include "evconfig-private.h" ++ + #include + #include + #include +diff --git a/evthread_win32.c b/evthread_win32.c +index 2ec80560..8647f72b 100644 +--- a/evthread_win32.c ++++ b/evthread_win32.c +@@ -23,18 +23,21 @@ + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +-#include "event2/event-config.h" +-#include "evconfig-private.h" + + #ifdef _WIN32 + #ifndef _WIN32_WINNT + /* Minimum required for InitializeCriticalSectionAndSpinCount */ + #define _WIN32_WINNT 0x0403 + #endif +-#include + #define WIN32_LEAN_AND_MEAN ++#endif ++ ++#include "event2/event-config.h" ++#include "evconfig-private.h" ++ ++#ifdef _WIN32 ++#include + #include +-#undef WIN32_LEAN_AND_MEAN + #include + #endif + +diff --git a/evutil.c b/evutil.c +index 9817f086..8537ffe8 100644 +--- a/evutil.c ++++ b/evutil.c +@@ -24,6 +24,14 @@ + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + ++#ifdef _WIN32 ++#ifndef _WIN32_WINNT ++/* For structs needed by GetAdaptersAddresses */ ++#define _WIN32_WINNT 0x0501 ++#endif ++#define WIN32_LEAN_AND_MEAN ++#endif ++ + #include "event2/event-config.h" + #include "evconfig-private.h" + +@@ -31,15 +39,10 @@ + #include + #include + #include +-#define WIN32_LEAN_AND_MEAN + #include +-#undef WIN32_LEAN_AND_MEAN + #include + #include + #include +-#undef _WIN32_WINNT +-/* For structs needed by GetAdaptersAddresses */ +-#define _WIN32_WINNT 0x0501 + #include + #include + #endif +diff --git a/listener.c b/listener.c +index f5c00c9c..d1080e76 100644 +--- a/listener.c ++++ b/listener.c +@@ -24,16 +24,19 @@ + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + ++#ifdef _WIN32 ++#ifndef _WIN32_WINNT ++/* Minimum required for InitializeCriticalSectionAndSpinCount */ ++#define _WIN32_WINNT 0x0403 ++#endif ++#endif ++ + #include "event2/event-config.h" + #include "evconfig-private.h" + + #include + + #ifdef _WIN32 +-#ifndef _WIN32_WINNT +-/* Minimum required for InitializeCriticalSectionAndSpinCount */ +-#define _WIN32_WINNT 0x0403 +-#endif + #include + #include + #include diff --git a/depends/toolchain.cmake.in b/depends/toolchain.cmake.in index 89a6e369690..c68de84b22e 100644 --- a/depends/toolchain.cmake.in +++ b/depends/toolchain.cmake.in @@ -13,6 +13,10 @@ if(@depends_crosscompiling@) set(CMAKE_SYSTEM_NAME @host_system_name@) set(CMAKE_SYSTEM_VERSION @host_system_version@) set(CMAKE_SYSTEM_PROCESSOR @host_arch@) + + set(CMAKE_C_COMPILER_TARGET @host@) + set(CMAKE_CXX_COMPILER_TARGET @host@) + set(CMAKE_OBJCXX_COMPILER_TARGET @host@) endif() if(NOT DEFINED CMAKE_C_FLAGS_INIT) @@ -88,6 +92,22 @@ set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) set(QT_TRANSLATIONS_DIR "${CMAKE_CURRENT_LIST_DIR}/translations") +# The following is only necessary when using cmake from Nix or NixOS, because +# Nix patches cmake to remove the root directory `/` from +# CMAKE_SYSTEM_PREFIX_PATH. Adding it back is harmless on other platforms and +# necessary on Nix because without it cmake find_path, find_package, etc +# functions do not know where to look in CMAKE_FIND_ROOT_PATH for dependencies +# (https://github.com/bitcoin/bitcoin/issues/32428). +# +# TODO: longer term, it may be possible to use a dependency provider, which +# would bring the find_package calls completely under our control, making this +# patch unnecessary. +# +# Make sure we only append once, as this file may be called repeatedly. +if(NOT "/" IN_LIST CMAKE_PREFIX_PATH) + list(APPEND CMAKE_PREFIX_PATH "/") +endif() + if(CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND NOT CMAKE_HOST_APPLE) # The find_package(Qt ...) function internally uses find_library() # calls for all dependencies to ensure their availability. diff --git a/doc/bips.md b/doc/bips.md index a95b3159ecb..97645d0eebe 100644 --- a/doc/bips.md +++ b/doc/bips.md @@ -58,7 +58,8 @@ BIPs that are implemented by Bitcoin Core: Validation rules for Taproot (including Schnorr signatures and Tapscript leaves) are implemented as of **v0.21.0** ([PR 19953](https://github.com/bitcoin/bitcoin/pull/19953)), with mainnet activation as of **v0.21.1** ([PR 21377](https://github.com/bitcoin/bitcoin/pull/21377), - [PR 21686](https://github.com/bitcoin/bitcoin/pull/21686)). + [PR 21686](https://github.com/bitcoin/bitcoin/pull/21686)), + always active as of **v24.0** ([PR 23536](https://github.com/bitcoin/bitcoin/pull/23536)). * [`BIP 350`](https://github.com/bitcoin/bips/blob/master/bip-0350.mediawiki): Addresses for native v1+ segregated Witness outputs use Bech32m instead of Bech32 as of **v22.0** ([PR 20861](https://github.com/bitcoin/bitcoin/pull/20861)). * [`BIP 371`](https://github.com/bitcoin/bips/blob/master/bip-0371.mediawiki): Taproot fields for PSBT as of **v24.0** ([PR 22558](https://github.com/bitcoin/bitcoin/pull/22558)). * [`BIP 379`](https://github.com/bitcoin/bips/blob/master/bip-0379.md): Miniscript was partially implemented in **v24.0** ([PR 24148](https://github.com/bitcoin/bitcoin/pull/24148)), and fully implemented as of **v26.0** ([PR 27255](https://github.com/bitcoin/bitcoin/pull/27255)). diff --git a/doc/build-freebsd.md b/doc/build-freebsd.md index 694224621eb..63318840119 100644 --- a/doc/build-freebsd.md +++ b/doc/build-freebsd.md @@ -86,7 +86,7 @@ Otherwise, if you don't need QR encoding support, use the `-DWITH_QRENCODE=OFF` #### Notifications ###### ZeroMQ -Bitcoin Core can provide notifications via ZeroMQ. If the package is installed, support will be compiled in. +Bitcoin Core can provide notifications via ZeroMQ. To compile ZMQ support, install the following dependency and pass `-DWITH_ZMQ=ON` when configuring. ```bash pkg install libzmq4 ``` @@ -129,6 +129,6 @@ cmake -B build -DENABLE_WALLET=OFF ### 2. Compile ```bash -cmake --build build # Use "-j N" for N parallel jobs. -ctest --test-dir build # Use "-j N" for N parallel tests. Some tests are disabled if Python 3 is not available. +cmake --build build # Append "-j N" for N parallel jobs. +ctest --test-dir build # Append "-j N" for N parallel tests. Some tests are disabled if Python 3 is not available. ``` diff --git a/doc/build-netbsd.md b/doc/build-netbsd.md index 988f3b93a7a..5b01d7b912c 100644 --- a/doc/build-netbsd.md +++ b/doc/build-netbsd.md @@ -86,7 +86,7 @@ Otherwise, if you don't need QR encoding support, use the `-DWITH_QRENCODE=OFF` #### Notifications ###### ZeroMQ -Bitcoin Core can provide notifications via ZeroMQ. If the package is installed, support will be compiled in. +Bitcoin Core can provide notifications via ZeroMQ. To compile ZMQ support, install the following dependency and pass `-DWITH_ZMQ=ON` when configuring. ```bash pkgin zeromq ``` @@ -118,6 +118,6 @@ Run `cmake -B build -LH` to see the full list of available options. Build and run the tests: ```bash -cmake --build build # Use "-j N" for N parallel jobs. -ctest --test-dir build # Use "-j N" for N parallel tests. Some tests are disabled if Python 3 is not available. +cmake --build build # Append "-j N" for N parallel jobs. +ctest --test-dir build # Append "-j N" for N parallel tests. Some tests are disabled if Python 3 is not available. ``` diff --git a/doc/build-openbsd.md b/doc/build-openbsd.md index 1ad90f23bcc..e2a15f67c86 100644 --- a/doc/build-openbsd.md +++ b/doc/build-openbsd.md @@ -80,7 +80,7 @@ Otherwise, if you don't need QR encoding support, use the `-DWITH_QRENCODE=OFF` #### Notifications ###### ZeroMQ -Bitcoin Core can provide notifications via ZeroMQ. If the package is installed, support will be compiled in. +Bitcoin Core can provide notifications via ZeroMQ. To compile ZMQ support, install the following dependency and pass `-DWITH_ZMQ=ON` when configuring. ```bash pkg_add zeromq ``` @@ -118,8 +118,8 @@ cmake -B build -DBerkeleyDB_INCLUDE_DIR:PATH="${BDB_PREFIX}/include" -DWITH_BDB= ### 2. Compile ```bash -cmake --build build # Use "-j N" for N parallel jobs. -ctest --test-dir build # Use "-j N" for N parallel tests. Some tests are disabled if Python 3 is not available. +cmake --build build # Append "-j N" for N parallel jobs. +ctest --test-dir build # Append "-j N" for N parallel tests. Some tests are disabled if Python 3 is not available. ``` ## Resource limits diff --git a/doc/build-osx.md b/doc/build-osx.md index 2e07f324bdd..ed791fbc43c 100644 --- a/doc/build-osx.md +++ b/doc/build-osx.md @@ -188,8 +188,8 @@ After configuration, you are ready to compile. Run the following in your terminal to compile Elements Core: ``` bash -cmake --build build # Use "-j N" here for N parallel jobs. -ctest --test-dir build # Use "-j N" for N parallel tests. Some tests are disabled if Python 3 is not available. +cmake --build build # Append "-j N" here for N parallel jobs. +ctest --test-dir build # Append "-j N" for N parallel tests. Some tests are disabled if Python 3 is not available. ``` ### 3. Deploy (optional) diff --git a/doc/build-unix.md b/doc/build-unix.md index 7ee1aee9a35..37c81beded2 100644 --- a/doc/build-unix.md +++ b/doc/build-unix.md @@ -9,8 +9,12 @@ To Build ```bash cmake -B build -cmake --build build # use "-j N" for N parallel jobs -cmake --install build # optional +``` +Run `cmake -B build -LH` to see the full list of available options. + +```bash +cmake --build build # Append "-j N" for N parallel jobs +cmake --install build # Optional ``` See below for instructions on how to [install the dependencies on popular Linux @@ -60,7 +64,7 @@ executables, which are based on BerkeleyDB 4.8. Otherwise, you can build Berkele To build Bitcoin Core without wallet, see [*Disable-wallet mode*](#disable-wallet-mode) -ZMQ dependencies (provides ZMQ API): +ZMQ-enabled binaries are compiled with `-DWITH_ZMQ=ON` and require the following dependency: sudo apt-get install libzmq3-dev @@ -114,7 +118,7 @@ are based on Berkeley DB 4.8. Otherwise, you can build Berkeley DB [yourself](#b To build Bitcoin Core without wallet, see [*Disable-wallet mode*](#disable-wallet-mode) -ZMQ dependencies (provides ZMQ API): +ZMQ-enabled binaries are compiled with `-DWITH_ZMQ=ON` and require the following dependency: sudo dnf install zeromq-devel @@ -177,13 +181,6 @@ In this case there is no dependency on SQLite or Berkeley DB. Mining is also possible in disable-wallet mode using the `getblocktemplate` RPC call. -Additional Configure Flags --------------------------- -A list of additional configure flags can be displayed with: - - cmake -B build -LH - - Setup and Build Example: Arch Linux ----------------------------------- This example lists the steps necessary to setup and build a command line only distribution of the latest changes on Arch Linux: diff --git a/doc/build-windows-msvc.md b/doc/build-windows-msvc.md index 915cf4f04b5..0d10fecd855 100644 --- a/doc/build-windows-msvc.md +++ b/doc/build-windows-msvc.md @@ -54,33 +54,43 @@ In the following instructions, the "Debug" configuration can be specified instea ``` cmake -B build --preset vs2022-static # It might take a while if the vcpkg binary cache is unpopulated or invalidated. -cmake --build build --config Release # Use "-j N" for N parallel jobs. -ctest --test-dir build --build-config Release # Use "-j N" for N parallel tests. Some tests are disabled if Python 3 is not available. +cmake --build build --config Release # Append "-j N" for N parallel jobs. +ctest --test-dir build --build-config Release # Append "-j N" for N parallel tests. Some tests are disabled if Python 3 is not available. cmake --install build --config Release # Optional. ``` -If building with `BUILD_GUI=ON`, vcpkg installation during the build -configuration step might fail because of extremely long paths required during -vcpkg installation if your vcpkg instance is installed in the default Visual -Studio directory. This can be avoided without modifying your vcpkg root -directory by changing vcpkg's intermediate build directory with the -`--x-buildtrees-root` argument to something shorter, for example: +### 5. Building with Dynamic Linking without GUI + +``` +cmake -B build --preset vs2022 -DBUILD_GUI=OFF # It might take a while if the vcpkg binary cache is unpopulated or invalidated. +cmake --build build --config Release # Append "-j N" for N parallel jobs. +ctest --test-dir build --build-config Release # Append "-j N" for N parallel tests. Some tests are disabled if Python 3 is not available. +``` + +### 6. vcpkg-specific Issues and Workarounds + +vcpkg installation during the configuration step might fail for various reasons unrelated to Bitcoin Core. + +If the failure is due to a "Buildtrees path … is too long" error, which is often encountered when building +with `BUILD_GUI=ON` and using the default vcpkg installation provided by Visual Studio, you can +specify a shorter path to store intermediate build files by using +the [`--x-buildtrees-root`](https://learn.microsoft.com/en-us/vcpkg/commands/common-options#buildtrees-root) option: ```powershell cmake -B build --preset vs2022-static -DVCPKG_INSTALL_OPTIONS="--x-buildtrees-root=C:\vcpkg" ``` -### 5. Building with Dynamic Linking without GUI +If vcpkg installation fails with the message "Paths with embedded space may be handled incorrectly", which +can occur if your local Bitcoin Core repository path contains spaces, you can override the vcpkg install directory +by setting the [`VCPKG_INSTALLED_DIR`](https://github.com/microsoft/vcpkg-docs/blob/main/vcpkg/users/buildsystems/cmake-integration.md#vcpkg_installed_dir) variable: -``` -cmake -B build --preset vs2022 -DBUILD_GUI=OFF # It might take a while if the vcpkg binary cache is unpopulated or invalidated. -cmake --build build --config Release # Use "-j N" for N parallel jobs. -ctest --test-dir build --build-config Release # Use "-j N" for N parallel tests. Some tests are disabled if Python 3 is not available. +```powershell +cmake -B build --preset vs2022-static -DVCPKG_INSTALLED_DIR="C:\path_without_spaces" ``` ## Performance Notes -### 6. vcpkg Manifest Default Features +### 7. vcpkg Manifest Default Features One can skip vcpkg manifest default features to speedup the configuration step. For example, the following invocation will skip all features except for "wallet" and "tests" and their dependencies: @@ -90,6 +100,6 @@ cmake -B build --preset vs2022 -DVCPKG_MANIFEST_NO_DEFAULT_FEATURES=ON -DVCPKG_M Available features are listed in the [`vcpkg.json`](/vcpkg.json) file. -### 7. Antivirus Software +### 8. Antivirus Software To improve the build process performance, one might add the Bitcoin repository directory to the Microsoft Defender Antivirus exclusions. diff --git a/doc/build-windows.md b/doc/build-windows.md index 03af0654cea..84db7fa4b5f 100644 --- a/doc/build-windows.md +++ b/doc/build-windows.md @@ -47,9 +47,9 @@ This means you cannot use a directory that is located directly on the host Windo Build using: - gmake -C depends HOST=x86_64-w64-mingw32 # Use "-j N" for N parallel jobs. + gmake -C depends HOST=x86_64-w64-mingw32 # Append "-j N" for N parallel jobs. cmake -B build --toolchain depends/x86_64-w64-mingw32/toolchain.cmake - cmake --build build # Use "-j N" for N parallel jobs. + cmake --build build # Append "-j N" for N parallel jobs. ## Depends system diff --git a/doc/dependencies.md b/doc/dependencies.md index 7c866a433db..a042f8f2ea7 100644 --- a/doc/dependencies.md +++ b/doc/dependencies.md @@ -30,9 +30,13 @@ Bitcoin Core requires one of the following compilers. | [Fontconfig](../depends/packages/fontconfig.mk) (gui) | [link](https://www.freedesktop.org/wiki/Software/fontconfig/) | [2.12.6](https://github.com/bitcoin/bitcoin/pull/23495) | 2.6 | Yes | | [FreeType](../depends/packages/freetype.mk) (gui) | [link](https://freetype.org) | [2.11.0](https://github.com/bitcoin/bitcoin/commit/01544dd78ccc0b0474571da854e27adef97137fb) | 2.3.0 | Yes | | [qrencode](../depends/packages/qrencode.mk) (gui) | [link](https://fukuchi.org/works/qrencode/) | [4.1.1](https://github.com/bitcoin/bitcoin/pull/27312) | N/A | No | -| [Qt](../depends/packages/qt.mk) (gui) | [link](https://download.qt.io/official_releases/qt/) | [5.15.16](https://github.com/bitcoin/bitcoin/pull/30774) | [5.11.3](https://github.com/bitcoin/bitcoin/pull/24132) | No | +| [Qt](../depends/packages/qt.mk) (gui) | [link](https://download.qt.io/archive/qt/) | [5.15.16](https://github.com/bitcoin/bitcoin/pull/30774) | [5.11.3](https://github.com/bitcoin/bitcoin/pull/24132) | No | | [ZeroMQ](../depends/packages/zeromq.mk) (notifications) | [link](https://github.com/zeromq/libzmq/releases) | [4.3.4](https://github.com/bitcoin/bitcoin/pull/23956) | 4.0.0 | No | | [Berkeley DB](../depends/packages/bdb.mk) (legacy wallet) | [link](https://www.oracle.com/technetwork/database/database-technologies/berkeleydb/downloads/index.html) | 4.8.30 | 4.8.x | No | | [SQLite](../depends/packages/sqlite.mk) (wallet) | [link](https://sqlite.org) | [3.38.5](https://github.com/bitcoin/bitcoin/pull/25378) | [3.7.17](https://github.com/bitcoin/bitcoin/pull/19077) | No | | Python (scripts, tests) | [link](https://www.python.org) | N/A | [3.10](https://github.com/bitcoin/bitcoin/pull/30527) | No | | [systemtap](../depends/packages/systemtap.mk) ([tracing](tracing.md)) | [link](https://sourceware.org/systemtap/) | [4.8](https://github.com/bitcoin/bitcoin/pull/26945)| N/A | No | +| [capnproto](../depends/packages/capnp.mk) ([multiprocess](multiprocess.md)) | [link](https://capnproto.org/) | [1.2.0](https://github.com/bitcoin/bitcoin/pull/32760)| [0.7.0](https://github.com/bitcoin-core/libmultiprocess/pull/88) | No | +| [libmultiprocess](../depends/packages/libmultiprocess.mk) ([multiprocess](multiprocess.md)) | [link](https://github.com/bitcoin-core/libmultiprocess) | [5.0](https://github.com/bitcoin/bitcoin/pull/31945)| [v5.0-pre1](https://github.com/bitcoin/bitcoin/pull/31740)* | No | + +\* Libmultiprocess 5.x versions should be compatible, but 6.0 and later are not due to bitcoin-core/libmultiprocess#160. diff --git a/doc/fuzzing.md b/doc/fuzzing.md index d3a0e42e9b3..20dfdc5e924 100644 --- a/doc/fuzzing.md +++ b/doc/fuzzing.md @@ -19,7 +19,7 @@ One can use `--preset=libfuzzer-nosan` to do the same without common sanitizers See [further](#run-without-sanitizers-for-increased-throughput) for more information. There is also a runner script to execute all fuzz targets. Refer to -`./test/fuzz/test_runner.py --help` for more details. +`./build_fuzz/test/fuzz/test_runner.py --help` for more details. ## Overview of Bitcoin Core fuzzing diff --git a/doc/man/bitcoin-cli.1 b/doc/man/bitcoin-cli.1 new file mode 100644 index 00000000000..33f28d1ac0a --- /dev/null +++ b/doc/man/bitcoin-cli.1 @@ -0,0 +1,201 @@ +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3. +.TH BITCOIN-CLI "1" "June 2026" "bitcoin-cli v29.4.0rc1" "User Commands" +.SH NAME +bitcoin-cli \- manual page for bitcoin-cli v29.4.0rc1 +.SH SYNOPSIS +.B bitcoin-cli +[\fI\,options\/\fR] \fI\, \/\fR[\fI\,params\/\fR] +.br +.B bitcoin-cli +[\fI\,options\/\fR] \fI\,-named \/\fR[\fI\,name=value\/\fR]... +.br +.B bitcoin-cli +[\fI\,options\/\fR] \fI\,help\/\fR +.br +.B bitcoin-cli +[\fI\,options\/\fR] \fI\,help \/\fR +.SH DESCRIPTION +Bitcoin Core RPC client version v29.4.0rc1 +.PP +The bitcoin\-cli utility provides a command line interface to interact with a Bitcoin Core RPC server. +.PP +It can be used to query network information, manage wallets, create or broadcast transactions, and control the Bitcoin Core server. +.PP +Use the "help" command to list all commands. Use "help " to show help for that command. +The \fB\-named\fR option allows you to specify parameters using the key=value format, eliminating the need to pass unused positional parameters. +.SH OPTIONS +.HP +\fB\-color=\fR +.IP +Color setting for CLI output (default: auto). Valid values: always, auto +(add color codes when standard output is connected to a terminal +and OS is not WIN32), never. Only applies to the output of +\fB\-getinfo\fR. +.HP +\fB\-conf=\fR +.IP +Specify configuration file. Relative paths will be prefixed by datadir +location. (default: bitcoin.conf) +.HP +\fB\-datadir=\fR +.IP +Specify data directory +.HP +\fB\-help\fR +.IP +Print this help message and exit (also \fB\-h\fR or \-?) +.HP +\fB\-named\fR +.IP +Pass named instead of positional arguments (default: false) +.HP +\fB\-rpcclienttimeout=\fR +.IP +Timeout in seconds during HTTP requests, or 0 for no timeout. (default: +900) +.HP +\fB\-rpcconnect=\fR +.IP +Send commands to node running on (default: 127.0.0.1) +.HP +\fB\-rpccookiefile=\fR +.IP +Location of the auth cookie. Relative paths will be prefixed by a +net\-specific datadir location. (default: data dir) +.HP +\fB\-rpcpassword=\fR +.IP +Password for JSON\-RPC connections +.HP +\fB\-rpcport=\fR +.IP +Connect to JSON\-RPC on (default: 8332, testnet: 18332, testnet4: +48332, signet: 38332, regtest: 18443) +.HP +\fB\-rpcuser=\fR +.IP +Username for JSON\-RPC connections +.HP +\fB\-rpcwait\fR +.IP +Wait for RPC server to start +.HP +\fB\-rpcwaittimeout=\fR +.IP +Timeout in seconds to wait for the RPC server to start, or 0 for no +timeout. (default: 0) +.HP +\fB\-rpcwallet=\fR +.IP +Send RPC for non\-default wallet on RPC server (needs to exactly match +corresponding \fB\-wallet\fR option passed to bitcoind). This changes +the RPC endpoint used, e.g. +http://127.0.0.1:8332/wallet/ +.HP +\fB\-stdin\fR +.IP +Read extra arguments from standard input, one per line until EOF/Ctrl\-D +(recommended for sensitive information such as passphrases). When +combined with \fB\-stdinrpcpass\fR, the first line from standard input +is used for the RPC password. +.HP +\fB\-stdinrpcpass\fR +.IP +Read RPC password from standard input as a single line. When combined +with \fB\-stdin\fR, the first line from standard input is used for the +RPC password. When combined with \fB\-stdinwalletpassphrase\fR, +\fB\-stdinrpcpass\fR consumes the first line, and \fB\-stdinwalletpassphrase\fR +consumes the second. +.HP +\fB\-stdinwalletpassphrase\fR +.IP +Read wallet passphrase from standard input as a single line. When +combined with \fB\-stdin\fR, the first line from standard input is used +for the wallet passphrase. +.HP +\fB\-version\fR +.IP +Print version and exit +.PP +Debugging/Testing options: +.PP +Chain selection options: +.HP +\fB\-chain=\fR +.IP +Use the chain (default: main). Allowed values: main, test, +testnet4, signet, regtest +.HP +\fB\-signet\fR +.IP +Use the signet chain. Equivalent to \fB\-chain\fR=\fI\,signet\/\fR. Note that the network +is defined by the \fB\-signetchallenge\fR parameter +.HP +\fB\-signetchallenge\fR +.IP +Blocks must satisfy the given script to be considered valid (only for +signet networks; defaults to the global default signet test +network challenge) +.HP +\fB\-signetseednode\fR +.IP +Specify a seed node for the signet network, in the hostname[:port] +format, e.g. sig.net:1234 (may be used multiple times to specify +multiple seed nodes; defaults to the global default signet test +network seed node(s)) +.HP +\fB\-testnet\fR +.IP +Use the testnet3 chain. Equivalent to \fB\-chain\fR=\fI\,test\/\fR. Support for testnet3 +is deprecated and will be removed in an upcoming release. +Consider moving to testnet4 now by using \fB\-testnet4\fR. +.HP +\fB\-testnet4\fR +.IP +Use the testnet4 chain. Equivalent to \fB\-chain\fR=\fI\,testnet4\/\fR. +.PP +CLI Commands: +.HP +\fB\-addrinfo\fR +.IP +Get the number of addresses known to the node, per network and total, +after filtering for quality and recency. The total number of +addresses known to the node may be higher. +.HP +\fB\-generate\fR +.IP +Generate blocks, equivalent to RPC getnewaddress followed by RPC +generatetoaddress. Optional positional integer arguments are +number of blocks to generate (default: 1) and maximum iterations +to try (default: 1000000), equivalent to RPC generatetoaddress +nblocks and maxtries arguments. Example: bitcoin\-cli \fB\-generate\fR 4 +1000 +.HP +\fB\-getinfo\fR +.IP +Get general information from the remote server. Note that unlike +server\-side RPC calls, the output of \fB\-getinfo\fR is the result of +multiple non\-atomic requests. Some entries in the output may +represent results from different states (e.g. wallet balance may +be as of a different block from the chain state reported) +.HP +\fB\-netinfo\fR +.IP +Get network peer connection information from the remote server. An +optional argument from 0 to 4 can be passed for different peers +listings (default: 0). If a non\-zero value is passed, an +additional "outonly" (or "o") argument can be passed to see +outbound peers only. Pass "help" (or "h") for detailed help +documentation. +.SH COPYRIGHT +Copyright (C) 2009-2025 The Bitcoin Core developers + +Please contribute if you find Bitcoin 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 +.SH "SEE ALSO" +bitcoind(1), bitcoin-cli(1), bitcoin-tx(1), bitcoin-wallet(1), bitcoin-util(1), bitcoin-qt(1) diff --git a/doc/man/bitcoin-qt.1 b/doc/man/bitcoin-qt.1 new file mode 100644 index 00000000000..ab57dd61d73 --- /dev/null +++ b/doc/man/bitcoin-qt.1 @@ -0,0 +1,852 @@ +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3. +.TH BITCOIN-QT "1" "June 2026" "bitcoin-qt v29.4.0rc1" "User Commands" +.SH NAME +bitcoin-qt \- manual page for bitcoin-qt v29.4.0rc1 +.SH SYNOPSIS +.B bitcoin-qt +[\fI\,options\/\fR] [\fI\,URI\/\fR] +.SH DESCRIPTION +Bitcoin Core version v29.4.0rc1 +.PP +The bitcoin\-qt application provides a graphical interface for interacting with Bitcoin Core. +.PP +It combines the core functionalities of bitcoind with a user\-friendly interface for wallet management, transaction history, and network statistics. +.PP +It is suitable for users who prefer a graphical over a command\-line interface. +.PP +You can optionally specify a payment [URI], in e.g. the BIP21 URI format. +.SH OPTIONS +.HP +\fB\-alertnotify=\fR +.IP +Execute command when an alert is raised (%s in cmd is replaced by +message) +.HP +\fB\-allowignoredconf\fR +.IP +For backwards compatibility, treat an unused bitcoin.conf file in the +datadir as a warning, not an error. +.HP +\fB\-assumevalid=\fR +.IP +If this block is in the chain assume that it and its ancestors are valid +and potentially skip their script verification (0 to verify all, +default: +00000000000000000001b658dd1120e82e66d2790811f89ede9742ada3ed6d77, +testnet3: +00000000000003fc7967410ba2d0a8a8d50daedc318d43e8baf1a9782c236a57, +testnet4: +0000000000003ed4f08dbdf6f7d6b271a6bcffce25675cb40aa9fa43179a89f3, +signet: +000000895a110f46e59eb82bbc5bfb67fa314656009c295509c21b4999f5180a) +.HP +\fB\-blockfilterindex=\fR +.IP +Maintain an index of compact filters by block (default: 0, values: +basic). If is not supplied or if = 1, indexes for +all known types are enabled. +.HP +\fB\-blocknotify=\fR +.IP +Execute command when the best block changes (%s in cmd is replaced by +block hash) +.HP +\fB\-blockreconstructionextratxn=\fR +.IP +Extra transactions to keep in memory for compact block reconstructions +(default: 100) +.HP +\fB\-blocksdir=\fR +.IP +Specify directory to hold blocks subdirectory for *.dat files (default: +) +.HP +\fB\-blocksonly\fR +.IP +Whether to reject transactions from network peers. Disables automatic +broadcast and rebroadcast of transactions, unless the source peer +has the 'forcerelay' permission. RPC transactions are not +affected. (default: 0) +.HP +\fB\-blocksxor\fR +.IP +Whether an XOR\-key applies to blocksdir *.dat files. The created XOR\-key +will be zeros for an existing blocksdir or when `\-blocksxor=0` is +set, and random for a freshly initialized blocksdir. (default: 1) +.HP +\fB\-coinstatsindex\fR +.IP +Maintain coinstats index used by the gettxoutsetinfo RPC (default: 0) +.HP +\fB\-conf=\fR +.IP +Specify path to read\-only configuration file. Relative paths will be +prefixed by datadir location (only useable from command line, not +configuration file) (default: bitcoin.conf) +.HP +\fB\-daemon\fR +.IP +Run in the background as a daemon and accept commands (default: 0) +.HP +\fB\-daemonwait\fR +.IP +Wait for initialization to be finished before exiting. This implies +\fB\-daemon\fR (default: 0) +.HP +\fB\-datadir=\fR +.IP +Specify data directory +.HP +\fB\-dbcache=\fR +.IP +Maximum database cache size MiB (minimum 4, default: 450). Make sure +you have enough RAM. In addition, unused memory allocated to the +mempool is shared with this cache (see \fB\-maxmempool\fR). +.HP +\fB\-debuglogfile=\fR +.IP +Specify location of debug log file (default: debug.log). Relative paths +will be prefixed by a net\-specific datadir location. Pass +\fB\-nodebuglogfile\fR to disable writing the log to a file. +.HP +\fB\-help\fR +.IP +Print this help message and exit (also \fB\-h\fR or \-?) +.HP +\fB\-includeconf=\fR +.IP +Specify additional configuration file, relative to the \fB\-datadir\fR path +(only useable from configuration file, not command line) +.HP +\fB\-loadblock=\fR +.IP +Imports blocks from external file on startup +.HP +\fB\-maxmempool=\fR +.IP +Keep the transaction memory pool below megabytes (default: 300) +.HP +\fB\-maxorphantx=\fR +.IP +Keep at most unconnectable transactions in memory (default: 100) +.HP +\fB\-mempoolexpiry=\fR +.IP +Do not keep transactions in the mempool longer than hours (default: +336) +.HP +\fB\-par=\fR +.IP +Set the number of script verification threads (0 = auto, up to 15, <0 = +leave that many cores free, default: 0) +.HP +\fB\-persistmempool\fR +.IP +Whether to save the mempool on shutdown and load on restart (default: 1) +.HP +\fB\-persistmempoolv1\fR +.IP +Whether a mempool.dat file created by \fB\-persistmempool\fR or the savemempool +RPC will be written in the legacy format (version 1) or the +current format (version 2). This temporary option will be removed +in the future. (default: 0) +.HP +\fB\-pid=\fR +.IP +Specify pid file. Relative paths will be prefixed by a net\-specific +datadir location. (default: bitcoind.pid) +.HP +\fB\-prune=\fR +.IP +Reduce storage requirements by enabling pruning (deleting) of old +blocks. This allows the pruneblockchain RPC to be called to +delete specific blocks and enables automatic pruning of old +blocks if a target size in MiB is provided. This mode is +incompatible with \fB\-txindex\fR. Warning: Reverting this setting +requires re\-downloading the entire blockchain. (default: 0 = +disable pruning blocks, 1 = allow manual pruning via RPC, >=550 = +automatically prune block files to stay under the specified +target size in MiB) +.HP +\fB\-reindex\fR +.IP +If enabled, wipe chain state and block index, and rebuild them from +blk*.dat files on disk. Also wipe and rebuild other optional +indexes that are active. If an assumeutxo snapshot was loaded, +its chainstate will be wiped as well. The snapshot can then be +reloaded via RPC. +.HP +\fB\-reindex\-chainstate\fR +.IP +If enabled, wipe chain state, and rebuild it from blk*.dat files on +disk. If an assumeutxo snapshot was loaded, its chainstate will +be wiped as well. The snapshot can then be reloaded via RPC. +.HP +\fB\-settings=\fR +.IP +Specify path to dynamic settings data file. Can be disabled with +\fB\-nosettings\fR. File is written at runtime and not meant to be +edited by users (use bitcoin.conf instead for custom settings). +Relative paths will be prefixed by datadir location. (default: +settings.json) +.HP +\fB\-shutdownnotify=\fR +.IP +Execute command immediately before beginning shutdown. The need for +shutdown may be urgent, so be careful not to delay it long (if +the command doesn't require interaction with the server, consider +having it fork into the background). +.HP +\fB\-startupnotify=\fR +.IP +Execute command on startup. +.HP +\fB\-txindex\fR +.IP +Maintain a full transaction index, used by the getrawtransaction rpc +call (default: 0) +.HP +\fB\-version\fR +.IP +Print version and exit +.PP +Connection options: +.HP +\fB\-addnode=\fR +.IP +Add a node to connect to and attempt to keep the connection open (see +the addnode RPC help for more info). This option can be specified +multiple times to add multiple nodes; connections are limited to +8 at a time and are counted separately from the \fB\-maxconnections\fR +limit. +.HP +\fB\-asmap=\fR +.IP +Specify asn mapping used for bucketing of the peers (default: +ip_asn.map). Relative paths will be prefixed by the net\-specific +datadir location. +.HP +\fB\-bantime=\fR +.IP +Default duration (in seconds) of manually configured bans (default: +86400) +.HP +\fB\-bind=\fR[:][=onion] +.IP +Bind to given address and always listen on it (default: 0.0.0.0). Use +[host]:port notation for IPv6. Append =onion to tag any incoming +connections to that address and port as incoming Tor connections +(default: 127.0.0.1:8334=onion, testnet3: 127.0.0.1:18334=onion, +testnet4: 127.0.0.1:48334=onion, signet: 127.0.0.1:38334=onion, +regtest: 127.0.0.1:18445=onion) +.HP +\fB\-cjdnsreachable\fR +.IP +If set, then this host is configured for CJDNS (connecting to fc00::/8 +addresses would lead us to the CJDNS network, see doc/cjdns.md) +(default: 0) +.HP +\fB\-connect=\fR +.IP +Connect only to the specified node; \fB\-noconnect\fR disables automatic +connections (the rules for this peer are the same as for +\fB\-addnode\fR). This option can be specified multiple times to connect +to multiple nodes. +.HP +\fB\-discover\fR +.IP +Discover own IP addresses (default: 1 when listening and no \fB\-externalip\fR +or \fB\-proxy\fR) +.HP +\fB\-dns\fR +.IP +Allow DNS lookups for \fB\-addnode\fR, \fB\-seednode\fR and \fB\-connect\fR (default: 1) +.HP +\fB\-dnsseed\fR +.IP +Query for peer addresses via DNS lookup, if low on addresses (default: 1 +unless \fB\-connect\fR used or \fB\-maxconnections\fR=\fI\,0\/\fR) +.HP +\fB\-externalip=\fR +.IP +Specify your own public address +.HP +\fB\-fixedseeds\fR +.IP +Allow fixed seeds if DNS seeds don't provide peers (default: 1) +.HP +\fB\-forcednsseed\fR +.IP +Always query for peer addresses via DNS lookup (default: 0) +.HP +\fB\-i2pacceptincoming\fR +.IP +Whether to accept inbound I2P connections (default: 1). Ignored if +\fB\-i2psam\fR is not set. Listening for inbound I2P connections is done +through the SAM proxy, not by binding to a local address and +port. +.HP +\fB\-i2psam=\fR +.IP +I2P SAM proxy to reach I2P peers and accept I2P connections (default: +none) +.HP +\fB\-listen\fR +.IP +Accept connections from outside (default: 1 if no \fB\-proxy\fR, \fB\-connect\fR or +\fB\-maxconnections\fR=\fI\,0\/\fR) +.HP +\fB\-listenonion\fR +.IP +Automatically create Tor onion service (default: 1) +.HP +\fB\-maxconnections=\fR +.IP +Maintain at most automatic connections to peers (default: 125). This +limit does not apply to connections manually added via \fB\-addnode\fR +or the addnode RPC, which have a separate limit of 8. +.HP +\fB\-maxreceivebuffer=\fR +.IP +Maximum per\-connection receive buffer, *1000 bytes (default: 5000) +.HP +\fB\-maxsendbuffer=\fR +.IP +Maximum per\-connection memory usage for the send buffer, *1000 bytes +(default: 1000) +.HP +\fB\-maxuploadtarget=\fR +.IP +Tries to keep outbound traffic under the given target per 24h. Limit +does not apply to peers with 'download' permission or blocks +created within past week. 0 = no limit (default: 0M). Optional +suffix units [k|K|m|M|g|G|t|T] (default: M). Lowercase is 1000 +base while uppercase is 1024 base +.HP +\fB\-natpmp\fR +.IP +Use PCP or NAT\-PMP to map the listening port (default: 0) +.HP +\fB\-networkactive\fR +.IP +Enable all P2P network activity (default: 1). Can be changed by the +setnetworkactive RPC command +.HP +\fB\-onion=\fR +.IP +Use separate SOCKS5 proxy to reach peers via Tor onion services, set +\fB\-noonion\fR to disable (default: \fB\-proxy\fR). May be a local file path +prefixed with 'unix:'. +.HP +\fB\-onlynet=\fR +.IP +Make automatic outbound connections only to network (ipv4, ipv6, +onion, i2p, cjdns). Inbound and manual connections are not +affected by this option. It can be specified multiple times to +allow multiple networks. +.HP +\fB\-peerblockfilters\fR +.IP +Serve compact block filters to peers per BIP 157 (default: 0) +.HP +\fB\-peerbloomfilters\fR +.IP +Support filtering of blocks and transaction with bloom filters (default: +0) +.HP +\fB\-port=\fR +.IP +Listen for connections on (default: 8333, testnet3: 18333, +testnet4: 48333, signet: 38333, regtest: 18444). Not relevant for +I2P (see doc/i2p.md). If set to a value x, the default onion +listening port will be set to x+1. +.HP +\fB\-proxy=\fR +.IP +Connect through SOCKS5 proxy, set \fB\-noproxy\fR to disable (default: +disabled). May be a local file path prefixed with 'unix:' if the +proxy supports it. +.HP +\fB\-proxyrandomize\fR +.IP +Randomize credentials for every proxy connection. This enables Tor +stream isolation (default: 1) +.HP +\fB\-seednode=\fR +.IP +Connect to a node to retrieve peer addresses, and disconnect. This +option can be specified multiple times to connect to multiple +nodes. During startup, seednodes will be tried before dnsseeds. +.HP +\fB\-timeout=\fR +.IP +Specify socket connection timeout in milliseconds. If an initial attempt +to connect is unsuccessful after this amount of time, drop it +(minimum: 1, default: 5000) +.HP +\fB\-torcontrol=\fR: +.IP +Tor control host and port to use if onion listening enabled (default: +127.0.0.1:9051). If no port is specified, the default port of +9051 will be used. +.HP +\fB\-torpassword=\fR +.IP +Tor control port password (default: empty) +.HP +\fB\-v2transport\fR +.IP +Support v2 transport (default: 1) +.HP +\fB\-whitebind=\fR<[permissions@]addr> +.IP +Bind to the given address and add permission flags to the peers +connecting to it. Use [host]:port notation for IPv6. Allowed +permissions: bloomfilter (allow requesting BIP37 filtered blocks +and transactions), noban (do not ban for misbehavior; implies +download), forcerelay (relay transactions that are already in the +mempool; implies relay), relay (relay even in \fB\-blocksonly\fR mode, +and unlimited transaction announcements), mempool (allow +requesting BIP35 mempool contents), download (allow getheaders +during IBD, no disconnect after maxuploadtarget limit), addr +(responses to GETADDR avoid hitting the cache and contain random +records with the most up\-to\-date info). Specify multiple +permissions separated by commas (default: +download,noban,mempool,relay). Can be specified multiple times. +.HP +\fB\-whitelist=\fR<[permissions@]IP address or network> +.IP +Add permission flags to the peers using the given IP address (e.g. +1.2.3.4) or CIDR\-notated network (e.g. 1.2.3.0/24). Uses the same +permissions as \fB\-whitebind\fR. Additional flags "in" and "out" +control whether permissions apply to incoming connections and/or +manual (default: incoming only). Can be specified multiple times. +.PP +Wallet options: +.HP +\fB\-addresstype\fR +.IP +What type of addresses to use ("legacy", "p2sh\-segwit", "bech32", or +"bech32m", default: "bech32") +.HP +\fB\-avoidpartialspends\fR +.IP +Group outputs by address, selecting many (possibly all) or none, instead +of selecting on a per\-output basis. Privacy is improved as +addresses are mostly swept with fewer transactions and outputs +are aggregated in clean change addresses. It may result in higher +fees due to less optimal coin selection caused by this added +limitation and possibly a larger\-than\-necessary number of inputs +being used. Always enabled for wallets with "avoid_reuse" +enabled, otherwise default: 0. +.HP +\fB\-changetype\fR +.IP +What type of change to use ("legacy", "p2sh\-segwit", "bech32", or +"bech32m"). Default is "legacy" when \fB\-addresstype\fR=\fI\,legacy\/\fR, else it +is an implementation detail. +.HP +\fB\-consolidatefeerate=\fR +.IP +The maximum feerate (in BTC/kvB) at which transaction building may use +more inputs than strictly necessary so that the wallet's UTXO +pool can be reduced (default: 0.0001). +.HP +\fB\-disablewallet\fR +.IP +Do not load the wallet and disable wallet RPC calls +.HP +\fB\-discardfee=\fR +.IP +The fee rate (in BTC/kvB) that indicates your tolerance for discarding +change by adding it to the fee (default: 0.0001). Note: An output +is discarded if it is dust at this rate, but we will always +discard up to the dust relay fee and a discard fee above that is +limited by the fee estimate for the longest target +.HP +\fB\-fallbackfee=\fR +.IP +A fee rate (in BTC/kvB) that will be used when fee estimation has +insufficient data. 0 to entirely disable the fallbackfee feature. +(default: 0.00) +.HP +\fB\-keypool=\fR +.IP +Set key pool size to (default: 1000). Warning: Smaller sizes may +increase the risk of losing funds when restoring from an old +backup, if none of the addresses in the original keypool have +been used. +.HP +\fB\-maxapsfee=\fR +.IP +Spend up to this amount in additional (absolute) fees (in BTC) if it +allows the use of partial spend avoidance (default: 0.00) +.HP +\fB\-mintxfee=\fR +.IP +Fee rates (in BTC/kvB) smaller than this are considered zero fee for +transaction creation (default: 0.00001) +.HP +\fB\-paytxfee=\fR +.IP +Fee rate (in BTC/kvB) to add to transactions you send (default: 0.00) +.HP +\fB\-signer=\fR +.IP +External signing tool, see doc/external\-signer.md +.HP +\fB\-spendzeroconfchange\fR +.IP +Spend unconfirmed change when sending transactions (default: 1) +.HP +\fB\-txconfirmtarget=\fR +.IP +If paytxfee is not set, include enough fee so transactions begin +confirmation on average within n blocks (default: 6) +.HP +\fB\-wallet=\fR +.IP +Specify wallet path to load at startup. Can be used multiple times to +load multiple wallets. Path is to a directory containing wallet +data and log files. If the path is not absolute, it is +interpreted relative to . This only loads existing +wallets and does not create new ones. For backwards compatibility +this also accepts names of existing top\-level data files in +. +.HP +\fB\-walletbroadcast\fR +.IP +Make the wallet broadcast transactions (default: 1) +.HP +\fB\-walletdir=\fR +.IP +Specify directory to hold wallets (default: /wallets if it +exists, otherwise ) +.HP +\fB\-walletnotify=\fR +.IP +Execute command when a wallet transaction changes. %s in cmd is replaced +by TxID, %w is replaced by wallet name, %b is replaced by the +hash of the block including the transaction (set to 'unconfirmed' +if the transaction is not included) and %h is replaced by the +block height (\fB\-1\fR if not included). %w is not currently +implemented on windows. On systems where %w is supported, it +should NOT be quoted because this would break shell escaping used +to invoke the command. +.HP +\fB\-walletrbf\fR +.IP +Send transactions with full\-RBF opt\-in enabled (RPC only, default: 1) +.PP +ZeroMQ notification options: +.HP +\fB\-zmqpubhashblock=\fR
+.IP +Enable publish hash block in
+.HP +\fB\-zmqpubhashblockhwm=\fR +.IP +Set publish hash block outbound message high water mark (default: 1000) +.HP +\fB\-zmqpubhashtx=\fR
+.IP +Enable publish hash transaction in
+.HP +\fB\-zmqpubhashtxhwm=\fR +.IP +Set publish hash transaction outbound message high water mark (default: +1000) +.HP +\fB\-zmqpubrawblock=\fR
+.IP +Enable publish raw block in
+.HP +\fB\-zmqpubrawblockhwm=\fR +.IP +Set publish raw block outbound message high water mark (default: 1000) +.HP +\fB\-zmqpubrawtx=\fR
+.IP +Enable publish raw transaction in
+.HP +\fB\-zmqpubrawtxhwm=\fR +.IP +Set publish raw transaction outbound message high water mark (default: +1000) +.HP +\fB\-zmqpubsequence=\fR
+.IP +Enable publish hash block and tx sequence in
+.HP +\fB\-zmqpubsequencehwm=\fR +.IP +Set publish hash sequence message high water mark (default: 1000) +.PP +Debugging/Testing options: +.HP +\fB\-debug=\fR +.IP +Output debug and trace logging (default: \fB\-nodebug\fR, supplying +is optional). If is not supplied or if is 1 +or "all", output all debug logging. If is 0 or "none", +any other categories are ignored. Other valid values for + are: addrman, bench, blockstorage, cmpctblock, coindb, +estimatefee, http, i2p, ipc, leveldb, libevent, mempool, +mempoolrej, net, proxy, prune, qt, rand, reindex, rpc, scan, +selectcoins, tor, txpackages, txreconciliation, validation, +walletdb, zmq. This option can be specified multiple times to +output multiple categories. +.HP +\fB\-debugexclude=\fR +.IP +Exclude debug and trace logging for a category. Can be used in +conjunction with \fB\-debug\fR=\fI\,1\/\fR to output debug and trace logging for +all categories except the specified category. This option can be +specified multiple times to exclude multiple categories. This +takes priority over "\-debug" +.HP +\fB\-help\-debug\fR +.IP +Print help message with debugging options and exit +.HP +\fB\-logips\fR +.IP +Include IP addresses in debug output (default: 0) +.HP +\fB\-loglevelalways\fR +.IP +Always prepend a category and level (default: 0) +.HP +\fB\-logsourcelocations\fR +.IP +Prepend debug output with name of the originating source location +(source file, line number and function name) (default: 0) +.HP +\fB\-logthreadnames\fR +.IP +Prepend debug output with name of the originating thread (default: 0) +.HP +\fB\-logtimestamps\fR +.IP +Prepend debug output with timestamp (default: 1) +.HP +\fB\-maxtxfee=\fR +.IP +Maximum total fees (in BTC) to use in a single wallet transaction; +setting this too low may abort large transactions (default: 0.10) +.HP +\fB\-printtoconsole\fR +.IP +Send trace/debug info to console (default: 1 when no \fB\-daemon\fR. To disable +logging to file, set \fB\-nodebuglogfile\fR) +.HP +\fB\-shrinkdebugfile\fR +.IP +Shrink debug.log file on client startup (default: 1 when no \fB\-debug\fR) +.HP +\fB\-uacomment=\fR +.IP +Append comment to the user agent string +.PP +Chain selection options: +.HP +\fB\-chain=\fR +.IP +Use the chain (default: main). Allowed values: main, test, +testnet4, signet, regtest +.HP +\fB\-signet\fR +.IP +Use the signet chain. Equivalent to \fB\-chain\fR=\fI\,signet\/\fR. Note that the network +is defined by the \fB\-signetchallenge\fR parameter +.HP +\fB\-signetchallenge\fR +.IP +Blocks must satisfy the given script to be considered valid (only for +signet networks; defaults to the global default signet test +network challenge) +.HP +\fB\-signetseednode\fR +.IP +Specify a seed node for the signet network, in the hostname[:port] +format, e.g. sig.net:1234 (may be used multiple times to specify +multiple seed nodes; defaults to the global default signet test +network seed node(s)) +.HP +\fB\-testnet\fR +.IP +Use the testnet3 chain. Equivalent to \fB\-chain\fR=\fI\,test\/\fR. Support for testnet3 +is deprecated and will be removed in an upcoming release. +Consider moving to testnet4 now by using \fB\-testnet4\fR. +.HP +\fB\-testnet4\fR +.IP +Use the testnet4 chain. Equivalent to \fB\-chain\fR=\fI\,testnet4\/\fR. +.PP +Node relay options: +.HP +\fB\-bytespersigop\fR +.IP +Equivalent bytes per sigop in transactions for relay and mining +(default: 20) +.HP +\fB\-datacarrier\fR +.IP +Relay and mine data carrier transactions (default: 1) +.HP +\fB\-datacarriersize\fR +.IP +Relay and mine transactions whose data\-carrying raw scriptPubKey is of +this size or less (default: 83) +.HP +\fB\-minrelaytxfee=\fR +.IP +Fees (in BTC/kvB) smaller than this are considered zero fee for +relaying, mining and transaction creation (default: 0.000001) +.HP +\fB\-permitbaremultisig\fR +.IP +Relay transactions creating non\-P2SH multisig outputs (default: 1) +.HP +\fB\-whitelistforcerelay\fR +.IP +Add 'forcerelay' permission to whitelisted peers with default +permissions. This will relay transactions even if the +transactions were already in the mempool. (default: 0) +.HP +\fB\-whitelistrelay\fR +.IP +Add 'relay' permission to whitelisted peers with default permissions. +This will accept relayed transactions even when not relaying +transactions (default: 1) +.PP +Block creation options: +.HP +\fB\-blockmaxweight=\fR +.IP +Set maximum BIP141 block weight (default: 4000000) +.HP +\fB\-blockmintxfee=\fR +.IP +Set lowest fee rate (in BTC/kvB) for transactions to be included in +block creation. (default: 0.00000001) +.HP +\fB\-blockreservedweight=\fR +.IP +Reserve space for the fixed\-size block header plus the largest coinbase +transaction the mining software may add to the block. (default: +8000). +.PP +RPC server options: +.HP +\fB\-rest\fR +.IP +Accept public REST requests (default: 0) +.HP +\fB\-rpcallowip=\fR +.IP +Allow JSON\-RPC connections from specified source. Valid values for +are a single IP (e.g. 1.2.3.4), a network/netmask (e.g. +1.2.3.4/255.255.255.0), a network/CIDR (e.g. 1.2.3.4/24), all +ipv4 (0.0.0.0/0), or all ipv6 (::/0). This option can be +specified multiple times +.HP +\fB\-rpcauth=\fR +.IP +Username and HMAC\-SHA\-256 hashed password for JSON\-RPC connections. The +field comes in the format: :$. A +canonical python script is included in share/rpcauth. The client +then connects normally using the +rpcuser=/rpcpassword= pair of arguments. This +option can be specified multiple times +.HP +\fB\-rpcbind=\fR[:port] +.IP +Bind to given address to listen for JSON\-RPC connections. Do not expose +the RPC server to untrusted networks such as the public internet! +This option is ignored unless \fB\-rpcallowip\fR is also passed. Port is +optional and overrides \fB\-rpcport\fR. Use [host]:port notation for +IPv6. This option can be specified multiple times (default: +127.0.0.1 and ::1 i.e., localhost) +.HP +\fB\-rpccookiefile=\fR +.IP +Location of the auth cookie. Relative paths will be prefixed by a +net\-specific datadir location. (default: data dir) +.HP +\fB\-rpccookieperms=\fR +.IP +Set permissions on the RPC auth cookie file so that it is readable by +[owner|group|all] (default: owner [via umask 0077]) +.HP +\fB\-rpcpassword=\fR +.IP +Password for JSON\-RPC connections +.HP +\fB\-rpcport=\fR +.IP +Listen for JSON\-RPC connections on (default: 8332, testnet3: +18332, testnet4: 48332, signet: 38332, regtest: 18443) +.HP +\fB\-rpcthreads=\fR +.IP +Set the number of threads to service RPC calls (default: 16) +.HP +\fB\-rpcuser=\fR +.IP +Username for JSON\-RPC connections +.HP +\fB\-rpcwhitelist=\fR +.IP +Set a whitelist to filter incoming RPC calls for a specific user. The +field comes in the format: :,,...,. If multiple whitelists are set for a given user, +they are set\-intersected. See \fB\-rpcwhitelistdefault\fR documentation +for information on default whitelist behavior. +.HP +\fB\-rpcwhitelistdefault\fR +.IP +Sets default behavior for rpc whitelisting. Unless rpcwhitelistdefault +is set to 0, if any \fB\-rpcwhitelist\fR is set, the rpc server acts as +if all rpc users are subject to empty\-unless\-otherwise\-specified +whitelists. If rpcwhitelistdefault is set to 1 and no +\fB\-rpcwhitelist\fR is set, rpc server acts as if all rpc users are +subject to empty whitelists. +.HP +\fB\-server\fR +.IP +Accept command line and JSON\-RPC commands +.PP +UI Options: +.HP +\fB\-choosedatadir\fR +.IP +Choose data directory on startup (default: 0) +.HP +\fB\-lang=\fR +.IP +Set language, for example "de_DE" (default: system locale) +.HP +\fB\-min\fR +.IP +Start minimized +.HP +\fB\-resetguisettings\fR +.IP +Reset all settings changed in the GUI +.HP +\fB\-splash\fR +.IP +Show splash screen on startup (default: 1) +.SH COPYRIGHT +Copyright (C) 2009-2025 The Bitcoin Core developers + +Please contribute if you find Bitcoin 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 +.SH "SEE ALSO" +bitcoind(1), bitcoin-cli(1), bitcoin-tx(1), bitcoin-wallet(1), bitcoin-util(1), bitcoin-qt(1) diff --git a/doc/man/bitcoin-tx.1 b/doc/man/bitcoin-tx.1 new file mode 100644 index 00000000000..de043b7142a --- /dev/null +++ b/doc/man/bitcoin-tx.1 @@ -0,0 +1,159 @@ +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3. +.TH BITCOIN-TX "1" "June 2026" "bitcoin-tx v29.4.0rc1" "User Commands" +.SH NAME +bitcoin-tx \- manual page for bitcoin-tx v29.4.0rc1 +.SH SYNOPSIS +.B bitcoin-tx +[\fI\,options\/\fR] \fI\, \/\fR[\fI\,commands\/\fR] +.br +.B bitcoin-tx +[\fI\,options\/\fR] \fI\,-create \/\fR[\fI\,commands\/\fR] +.SH DESCRIPTION +Bitcoin Core bitcoin\-tx utility version v29.4.0rc1 +.PP +The bitcoin\-tx tool is used for creating and modifying bitcoin transactions. +.PP +bitcoin\-tx can be used with " [commands]" to update a hex\-encoded bitcoin transaction, or with "\-create [commands]" to create a hex\-encoded bitcoin transaction. +.SH OPTIONS +.HP +\fB\-create\fR +.IP +Create new, empty TX. +.HP +\fB\-help\fR +.IP +Print this help message and exit (also \fB\-h\fR or \-?) +.HP +\fB\-json\fR +.IP +Select JSON output +.HP +\fB\-txid\fR +.IP +Output only the hex\-encoded transaction id of the resultant transaction. +.HP +\fB\-version\fR +.IP +Print version and exit +.PP +Debugging/Testing options: +.PP +Chain selection options: +.HP +\fB\-chain=\fR +.IP +Use the chain (default: main). Allowed values: main, test, +testnet4, signet, regtest +.HP +\fB\-signet\fR +.IP +Use the signet chain. Equivalent to \fB\-chain\fR=\fI\,signet\/\fR. Note that the network +is defined by the \fB\-signetchallenge\fR parameter +.HP +\fB\-signetchallenge\fR +.IP +Blocks must satisfy the given script to be considered valid (only for +signet networks; defaults to the global default signet test +network challenge) +.HP +\fB\-signetseednode\fR +.IP +Specify a seed node for the signet network, in the hostname[:port] +format, e.g. sig.net:1234 (may be used multiple times to specify +multiple seed nodes; defaults to the global default signet test +network seed node(s)) +.HP +\fB\-testnet\fR +.IP +Use the testnet3 chain. Equivalent to \fB\-chain\fR=\fI\,test\/\fR. Support for testnet3 +is deprecated and will be removed in an upcoming release. +Consider moving to testnet4 now by using \fB\-testnet4\fR. +.HP +\fB\-testnet4\fR +.IP +Use the testnet4 chain. Equivalent to \fB\-chain\fR=\fI\,testnet4\/\fR. +.PP +Commands: +.IP +delin=N +.IP +Delete input N from TX +.IP +delout=N +.IP +Delete output N from TX +.IP +in=TXID:VOUT(:SEQUENCE_NUMBER) +.IP +Add input to TX +.IP +locktime=N +.IP +Set TX lock time to N +.IP +nversion=N +.IP +Set TX version to N +.IP +outaddr=VALUE:ADDRESS +.IP +Add address\-based output to TX +.IP +outdata=[VALUE:]DATA +.IP +Add data\-based output to TX +.IP +outmultisig=VALUE:REQUIRED:PUBKEYS:PUBKEY1:PUBKEY2:....[:FLAGS] +.IP +Add Pay To n\-of\-m Multi\-sig output to TX. n = REQUIRED, m = PUBKEYS. +Optionally add the "W" flag to produce a +pay\-to\-witness\-script\-hash output. Optionally add the "S" flag to +wrap the output in a pay\-to\-script\-hash. +.IP +outpubkey=VALUE:PUBKEY[:FLAGS] +.IP +Add pay\-to\-pubkey output to TX. Optionally add the "W" flag to produce a +pay\-to\-witness\-pubkey\-hash output. Optionally add the "S" flag to +wrap the output in a pay\-to\-script\-hash. +.IP +outscript=VALUE:SCRIPT[:FLAGS] +.IP +Add raw script output to TX. Optionally add the "W" flag to produce a +pay\-to\-witness\-script\-hash output. Optionally add the "S" flag to +wrap the output in a pay\-to\-script\-hash. +.IP +replaceable(=N) +.IP +Sets Replace\-By\-Fee (RBF) opt\-in sequence number for input N. If N is +not provided, the command attempts to opt\-in all available inputs +for RBF. If the transaction has no inputs, this option is +ignored. +.IP +sign=SIGHASH\-FLAGS +.IP +Add zero or more signatures to transaction. This command requires JSON +registers:prevtxs=JSON object, privatekeys=JSON object. See +signrawtransactionwithkey docs for format of sighash flags, JSON +objects. +.PP +Register Commands: +.IP +load=NAME:FILENAME +.IP +Load JSON file FILENAME into register NAME +.IP +set=NAME:JSON\-STRING +.IP +Set register NAME to given JSON\-STRING +.SH COPYRIGHT +Copyright (C) 2009-2025 The Bitcoin Core developers + +Please contribute if you find Bitcoin 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 +.SH "SEE ALSO" +bitcoind(1), bitcoin-cli(1), bitcoin-tx(1), bitcoin-wallet(1), bitcoin-util(1), bitcoin-qt(1) diff --git a/doc/man/bitcoin-util.1 b/doc/man/bitcoin-util.1 new file mode 100644 index 00000000000..063e05883a5 --- /dev/null +++ b/doc/man/bitcoin-util.1 @@ -0,0 +1,78 @@ +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3. +.TH BITCOIN-UTIL "1" "June 2026" "bitcoin-util v29.4.0rc1" "User Commands" +.SH NAME +bitcoin-util \- manual page for bitcoin-util v29.4.0rc1 +.SH SYNOPSIS +.B bitcoin-util +[\fI\,options\/\fR] [\fI\,command\/\fR] +.br +.B bitcoin-util +[\fI\,options\/\fR] \fI\,grind \/\fR +.SH DESCRIPTION +Bitcoin Core bitcoin\-util utility version v29.4.0rc1 +.PP +The bitcoin\-util tool provides bitcoin related functionality that does not rely on the ability to access a running node. Available [commands] are listed below. +.SH OPTIONS +.HP +\fB\-help\fR +.IP +Print this help message and exit (also \fB\-h\fR or \-?) +.HP +\fB\-version\fR +.IP +Print version and exit +.PP +Debugging/Testing options: +.PP +Chain selection options: +.HP +\fB\-chain=\fR +.IP +Use the chain (default: main). Allowed values: main, test, +testnet4, signet, regtest +.HP +\fB\-signet\fR +.IP +Use the signet chain. Equivalent to \fB\-chain\fR=\fI\,signet\/\fR. Note that the network +is defined by the \fB\-signetchallenge\fR parameter +.HP +\fB\-signetchallenge\fR +.IP +Blocks must satisfy the given script to be considered valid (only for +signet networks; defaults to the global default signet test +network challenge) +.HP +\fB\-signetseednode\fR +.IP +Specify a seed node for the signet network, in the hostname[:port] +format, e.g. sig.net:1234 (may be used multiple times to specify +multiple seed nodes; defaults to the global default signet test +network seed node(s)) +.HP +\fB\-testnet\fR +.IP +Use the testnet3 chain. Equivalent to \fB\-chain\fR=\fI\,test\/\fR. Support for testnet3 +is deprecated and will be removed in an upcoming release. +Consider moving to testnet4 now by using \fB\-testnet4\fR. +.HP +\fB\-testnet4\fR +.IP +Use the testnet4 chain. Equivalent to \fB\-chain\fR=\fI\,testnet4\/\fR. +.PP +Commands: +.IP +grind +.IP +Perform proof of work on hex header string +.SH COPYRIGHT +Copyright (C) 2009-2025 The Bitcoin Core developers + +Please contribute if you find Bitcoin 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 +.SH "SEE ALSO" +bitcoind(1), bitcoin-cli(1), bitcoin-tx(1), bitcoin-wallet(1), bitcoin-util(1), bitcoin-qt(1) diff --git a/doc/man/bitcoin-wallet.1 b/doc/man/bitcoin-wallet.1 new file mode 100644 index 00000000000..8f7f721406a --- /dev/null +++ b/doc/man/bitcoin-wallet.1 @@ -0,0 +1,136 @@ +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3. +.TH BITCOIN-WALLET "1" "June 2026" "bitcoin-wallet v29.4.0rc1" "User Commands" +.SH NAME +bitcoin-wallet \- manual page for bitcoin-wallet v29.4.0rc1 +.SH SYNOPSIS +.B bitcoin-wallet +[\fI\,options\/\fR] \fI\,\/\fR +.SH DESCRIPTION +Bitcoin Core bitcoin\-wallet utility version v29.4.0rc1 +.PP +bitcoin\-wallet is an offline tool for creating and interacting with Bitcoin Core wallet files. +.PP +By default bitcoin\-wallet will act on wallets in the default mainnet wallet directory in the datadir. +.PP +To change the target wallet, use the \fB\-datadir\fR, \fB\-wallet\fR and (test)chain selection arguments. +.SH OPTIONS +.HP +\fB\-datadir=\fR +.IP +Specify data directory +.HP +\fB\-descriptors\fR +.IP +Create descriptors wallet. Only for 'create' +.HP +\fB\-dumpfile=\fR +.IP +When used with 'dump', writes out the records to this file. When used +with 'createfromdump', loads the records into a new wallet. +.HP +\fB\-format=\fR +.IP +The format of the wallet file to create. Either "bdb" or "sqlite". Only +used with 'createfromdump' +.HP +\fB\-help\fR +.IP +Print this help message and exit (also \fB\-h\fR or \-?) +.HP +\fB\-legacy\fR +.IP +Create legacy wallet. Only for 'create' +.HP +\fB\-version\fR +.IP +Print version and exit +.HP +\fB\-wallet=\fR +.IP +Specify wallet name +.PP +Debugging/Testing options: +.HP +\fB\-debug=\fR +.IP +Output debugging information (default: 0). +.HP +\fB\-printtoconsole\fR +.IP +Send trace/debug info to console (default: 1 when no \fB\-debug\fR is true, 0 +otherwise). +.HP +\fB\-withinternalbdb\fR +.IP +Use the internal Berkeley DB parser when dumping a Berkeley DB wallet +file (default: false) +.PP +Chain selection options: +.HP +\fB\-chain=\fR +.IP +Use the chain (default: main). Allowed values: main, test, +testnet4, signet, regtest +.HP +\fB\-signet\fR +.IP +Use the signet chain. Equivalent to \fB\-chain\fR=\fI\,signet\/\fR. Note that the network +is defined by the \fB\-signetchallenge\fR parameter +.HP +\fB\-signetchallenge\fR +.IP +Blocks must satisfy the given script to be considered valid (only for +signet networks; defaults to the global default signet test +network challenge) +.HP +\fB\-signetseednode\fR +.IP +Specify a seed node for the signet network, in the hostname[:port] +format, e.g. sig.net:1234 (may be used multiple times to specify +multiple seed nodes; defaults to the global default signet test +network seed node(s)) +.HP +\fB\-testnet\fR +.IP +Use the testnet3 chain. Equivalent to \fB\-chain\fR=\fI\,test\/\fR. Support for testnet3 +is deprecated and will be removed in an upcoming release. +Consider moving to testnet4 now by using \fB\-testnet4\fR. +.HP +\fB\-testnet4\fR +.IP +Use the testnet4 chain. Equivalent to \fB\-chain\fR=\fI\,testnet4\/\fR. +.PP +Commands: +.IP +create +.IP +Create new wallet file +.IP +createfromdump +.IP +Create new wallet file from dumped records +.IP +dump +.IP +Print out all of the wallet key\-value records +.IP +info +.IP +Get wallet info +.IP +salvage +.IP +Attempt to recover private keys from a corrupt wallet. Warning: +\&'salvage' is experimental. +.SH COPYRIGHT +Copyright (C) 2009-2025 The Bitcoin Core developers + +Please contribute if you find Bitcoin 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 +.SH "SEE ALSO" +bitcoind(1), bitcoin-cli(1), bitcoin-tx(1), bitcoin-wallet(1), bitcoin-util(1), bitcoin-qt(1) diff --git a/doc/man/bitcoind.1 b/doc/man/bitcoind.1 new file mode 100644 index 00000000000..7a8c4c3e1bf --- /dev/null +++ b/doc/man/bitcoind.1 @@ -0,0 +1,830 @@ +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3. +.TH BITCOIND "1" "June 2026" "bitcoind v29.4.0rc1" "User Commands" +.SH NAME +bitcoind \- manual page for bitcoind v29.4.0rc1 +.SH SYNOPSIS +.B bitcoind +[\fI\,options\/\fR] +.SH DESCRIPTION +Bitcoin Core daemon version v29.4.0rc1 +.PP +The Bitcoin Core daemon (bitcoind) is a headless program that connects to the Bitcoin network to validate and relay transactions and blocks, as well as relaying addresses. +.PP +It provides the backbone of the Bitcoin network and its RPC, REST and ZMQ services can provide various transaction, block and address\-related services. +.PP +There is an optional wallet component which provides transaction services. +.PP +It can be used in a headless environment or as part of a server setup. +.SH OPTIONS +.HP +\fB\-alertnotify=\fR +.IP +Execute command when an alert is raised (%s in cmd is replaced by +message) +.HP +\fB\-allowignoredconf\fR +.IP +For backwards compatibility, treat an unused bitcoin.conf file in the +datadir as a warning, not an error. +.HP +\fB\-assumevalid=\fR +.IP +If this block is in the chain assume that it and its ancestors are valid +and potentially skip their script verification (0 to verify all, +default: +00000000000000000001b658dd1120e82e66d2790811f89ede9742ada3ed6d77, +testnet3: +00000000000003fc7967410ba2d0a8a8d50daedc318d43e8baf1a9782c236a57, +testnet4: +0000000000003ed4f08dbdf6f7d6b271a6bcffce25675cb40aa9fa43179a89f3, +signet: +000000895a110f46e59eb82bbc5bfb67fa314656009c295509c21b4999f5180a) +.HP +\fB\-blockfilterindex=\fR +.IP +Maintain an index of compact filters by block (default: 0, values: +basic). If is not supplied or if = 1, indexes for +all known types are enabled. +.HP +\fB\-blocknotify=\fR +.IP +Execute command when the best block changes (%s in cmd is replaced by +block hash) +.HP +\fB\-blockreconstructionextratxn=\fR +.IP +Extra transactions to keep in memory for compact block reconstructions +(default: 100) +.HP +\fB\-blocksdir=\fR +.IP +Specify directory to hold blocks subdirectory for *.dat files (default: +) +.HP +\fB\-blocksonly\fR +.IP +Whether to reject transactions from network peers. Disables automatic +broadcast and rebroadcast of transactions, unless the source peer +has the 'forcerelay' permission. RPC transactions are not +affected. (default: 0) +.HP +\fB\-blocksxor\fR +.IP +Whether an XOR\-key applies to blocksdir *.dat files. The created XOR\-key +will be zeros for an existing blocksdir or when `\-blocksxor=0` is +set, and random for a freshly initialized blocksdir. (default: 1) +.HP +\fB\-coinstatsindex\fR +.IP +Maintain coinstats index used by the gettxoutsetinfo RPC (default: 0) +.HP +\fB\-conf=\fR +.IP +Specify path to read\-only configuration file. Relative paths will be +prefixed by datadir location (only useable from command line, not +configuration file) (default: bitcoin.conf) +.HP +\fB\-daemon\fR +.IP +Run in the background as a daemon and accept commands (default: 0) +.HP +\fB\-daemonwait\fR +.IP +Wait for initialization to be finished before exiting. This implies +\fB\-daemon\fR (default: 0) +.HP +\fB\-datadir=\fR +.IP +Specify data directory +.HP +\fB\-dbcache=\fR +.IP +Maximum database cache size MiB (minimum 4, default: 450). Make sure +you have enough RAM. In addition, unused memory allocated to the +mempool is shared with this cache (see \fB\-maxmempool\fR). +.HP +\fB\-debuglogfile=\fR +.IP +Specify location of debug log file (default: debug.log). Relative paths +will be prefixed by a net\-specific datadir location. Pass +\fB\-nodebuglogfile\fR to disable writing the log to a file. +.HP +\fB\-help\fR +.IP +Print this help message and exit (also \fB\-h\fR or \-?) +.HP +\fB\-includeconf=\fR +.IP +Specify additional configuration file, relative to the \fB\-datadir\fR path +(only useable from configuration file, not command line) +.HP +\fB\-loadblock=\fR +.IP +Imports blocks from external file on startup +.HP +\fB\-maxmempool=\fR +.IP +Keep the transaction memory pool below megabytes (default: 300) +.HP +\fB\-maxorphantx=\fR +.IP +Keep at most unconnectable transactions in memory (default: 100) +.HP +\fB\-mempoolexpiry=\fR +.IP +Do not keep transactions in the mempool longer than hours (default: +336) +.HP +\fB\-par=\fR +.IP +Set the number of script verification threads (0 = auto, up to 15, <0 = +leave that many cores free, default: 0) +.HP +\fB\-persistmempool\fR +.IP +Whether to save the mempool on shutdown and load on restart (default: 1) +.HP +\fB\-persistmempoolv1\fR +.IP +Whether a mempool.dat file created by \fB\-persistmempool\fR or the savemempool +RPC will be written in the legacy format (version 1) or the +current format (version 2). This temporary option will be removed +in the future. (default: 0) +.HP +\fB\-pid=\fR +.IP +Specify pid file. Relative paths will be prefixed by a net\-specific +datadir location. (default: bitcoind.pid) +.HP +\fB\-prune=\fR +.IP +Reduce storage requirements by enabling pruning (deleting) of old +blocks. This allows the pruneblockchain RPC to be called to +delete specific blocks and enables automatic pruning of old +blocks if a target size in MiB is provided. This mode is +incompatible with \fB\-txindex\fR. Warning: Reverting this setting +requires re\-downloading the entire blockchain. (default: 0 = +disable pruning blocks, 1 = allow manual pruning via RPC, >=550 = +automatically prune block files to stay under the specified +target size in MiB) +.HP +\fB\-reindex\fR +.IP +If enabled, wipe chain state and block index, and rebuild them from +blk*.dat files on disk. Also wipe and rebuild other optional +indexes that are active. If an assumeutxo snapshot was loaded, +its chainstate will be wiped as well. The snapshot can then be +reloaded via RPC. +.HP +\fB\-reindex\-chainstate\fR +.IP +If enabled, wipe chain state, and rebuild it from blk*.dat files on +disk. If an assumeutxo snapshot was loaded, its chainstate will +be wiped as well. The snapshot can then be reloaded via RPC. +.HP +\fB\-settings=\fR +.IP +Specify path to dynamic settings data file. Can be disabled with +\fB\-nosettings\fR. File is written at runtime and not meant to be +edited by users (use bitcoin.conf instead for custom settings). +Relative paths will be prefixed by datadir location. (default: +settings.json) +.HP +\fB\-shutdownnotify=\fR +.IP +Execute command immediately before beginning shutdown. The need for +shutdown may be urgent, so be careful not to delay it long (if +the command doesn't require interaction with the server, consider +having it fork into the background). +.HP +\fB\-startupnotify=\fR +.IP +Execute command on startup. +.HP +\fB\-txindex\fR +.IP +Maintain a full transaction index, used by the getrawtransaction rpc +call (default: 0) +.HP +\fB\-version\fR +.IP +Print version and exit +.PP +Connection options: +.HP +\fB\-addnode=\fR +.IP +Add a node to connect to and attempt to keep the connection open (see +the addnode RPC help for more info). This option can be specified +multiple times to add multiple nodes; connections are limited to +8 at a time and are counted separately from the \fB\-maxconnections\fR +limit. +.HP +\fB\-asmap=\fR +.IP +Specify asn mapping used for bucketing of the peers (default: +ip_asn.map). Relative paths will be prefixed by the net\-specific +datadir location. +.HP +\fB\-bantime=\fR +.IP +Default duration (in seconds) of manually configured bans (default: +86400) +.HP +\fB\-bind=\fR[:][=onion] +.IP +Bind to given address and always listen on it (default: 0.0.0.0). Use +[host]:port notation for IPv6. Append =onion to tag any incoming +connections to that address and port as incoming Tor connections +(default: 127.0.0.1:8334=onion, testnet3: 127.0.0.1:18334=onion, +testnet4: 127.0.0.1:48334=onion, signet: 127.0.0.1:38334=onion, +regtest: 127.0.0.1:18445=onion) +.HP +\fB\-cjdnsreachable\fR +.IP +If set, then this host is configured for CJDNS (connecting to fc00::/8 +addresses would lead us to the CJDNS network, see doc/cjdns.md) +(default: 0) +.HP +\fB\-connect=\fR +.IP +Connect only to the specified node; \fB\-noconnect\fR disables automatic +connections (the rules for this peer are the same as for +\fB\-addnode\fR). This option can be specified multiple times to connect +to multiple nodes. +.HP +\fB\-discover\fR +.IP +Discover own IP addresses (default: 1 when listening and no \fB\-externalip\fR +or \fB\-proxy\fR) +.HP +\fB\-dns\fR +.IP +Allow DNS lookups for \fB\-addnode\fR, \fB\-seednode\fR and \fB\-connect\fR (default: 1) +.HP +\fB\-dnsseed\fR +.IP +Query for peer addresses via DNS lookup, if low on addresses (default: 1 +unless \fB\-connect\fR used or \fB\-maxconnections\fR=\fI\,0\/\fR) +.HP +\fB\-externalip=\fR +.IP +Specify your own public address +.HP +\fB\-fixedseeds\fR +.IP +Allow fixed seeds if DNS seeds don't provide peers (default: 1) +.HP +\fB\-forcednsseed\fR +.IP +Always query for peer addresses via DNS lookup (default: 0) +.HP +\fB\-i2pacceptincoming\fR +.IP +Whether to accept inbound I2P connections (default: 1). Ignored if +\fB\-i2psam\fR is not set. Listening for inbound I2P connections is done +through the SAM proxy, not by binding to a local address and +port. +.HP +\fB\-i2psam=\fR +.IP +I2P SAM proxy to reach I2P peers and accept I2P connections (default: +none) +.HP +\fB\-listen\fR +.IP +Accept connections from outside (default: 1 if no \fB\-proxy\fR, \fB\-connect\fR or +\fB\-maxconnections\fR=\fI\,0\/\fR) +.HP +\fB\-listenonion\fR +.IP +Automatically create Tor onion service (default: 1) +.HP +\fB\-maxconnections=\fR +.IP +Maintain at most automatic connections to peers (default: 125). This +limit does not apply to connections manually added via \fB\-addnode\fR +or the addnode RPC, which have a separate limit of 8. +.HP +\fB\-maxreceivebuffer=\fR +.IP +Maximum per\-connection receive buffer, *1000 bytes (default: 5000) +.HP +\fB\-maxsendbuffer=\fR +.IP +Maximum per\-connection memory usage for the send buffer, *1000 bytes +(default: 1000) +.HP +\fB\-maxuploadtarget=\fR +.IP +Tries to keep outbound traffic under the given target per 24h. Limit +does not apply to peers with 'download' permission or blocks +created within past week. 0 = no limit (default: 0M). Optional +suffix units [k|K|m|M|g|G|t|T] (default: M). Lowercase is 1000 +base while uppercase is 1024 base +.HP +\fB\-natpmp\fR +.IP +Use PCP or NAT\-PMP to map the listening port (default: 0) +.HP +\fB\-networkactive\fR +.IP +Enable all P2P network activity (default: 1). Can be changed by the +setnetworkactive RPC command +.HP +\fB\-onion=\fR +.IP +Use separate SOCKS5 proxy to reach peers via Tor onion services, set +\fB\-noonion\fR to disable (default: \fB\-proxy\fR). May be a local file path +prefixed with 'unix:'. +.HP +\fB\-onlynet=\fR +.IP +Make automatic outbound connections only to network (ipv4, ipv6, +onion, i2p, cjdns). Inbound and manual connections are not +affected by this option. It can be specified multiple times to +allow multiple networks. +.HP +\fB\-peerblockfilters\fR +.IP +Serve compact block filters to peers per BIP 157 (default: 0) +.HP +\fB\-peerbloomfilters\fR +.IP +Support filtering of blocks and transaction with bloom filters (default: +0) +.HP +\fB\-port=\fR +.IP +Listen for connections on (default: 8333, testnet3: 18333, +testnet4: 48333, signet: 38333, regtest: 18444). Not relevant for +I2P (see doc/i2p.md). If set to a value x, the default onion +listening port will be set to x+1. +.HP +\fB\-proxy=\fR +.IP +Connect through SOCKS5 proxy, set \fB\-noproxy\fR to disable (default: +disabled). May be a local file path prefixed with 'unix:' if the +proxy supports it. +.HP +\fB\-proxyrandomize\fR +.IP +Randomize credentials for every proxy connection. This enables Tor +stream isolation (default: 1) +.HP +\fB\-seednode=\fR +.IP +Connect to a node to retrieve peer addresses, and disconnect. This +option can be specified multiple times to connect to multiple +nodes. During startup, seednodes will be tried before dnsseeds. +.HP +\fB\-timeout=\fR +.IP +Specify socket connection timeout in milliseconds. If an initial attempt +to connect is unsuccessful after this amount of time, drop it +(minimum: 1, default: 5000) +.HP +\fB\-torcontrol=\fR: +.IP +Tor control host and port to use if onion listening enabled (default: +127.0.0.1:9051). If no port is specified, the default port of +9051 will be used. +.HP +\fB\-torpassword=\fR +.IP +Tor control port password (default: empty) +.HP +\fB\-v2transport\fR +.IP +Support v2 transport (default: 1) +.HP +\fB\-whitebind=\fR<[permissions@]addr> +.IP +Bind to the given address and add permission flags to the peers +connecting to it. Use [host]:port notation for IPv6. Allowed +permissions: bloomfilter (allow requesting BIP37 filtered blocks +and transactions), noban (do not ban for misbehavior; implies +download), forcerelay (relay transactions that are already in the +mempool; implies relay), relay (relay even in \fB\-blocksonly\fR mode, +and unlimited transaction announcements), mempool (allow +requesting BIP35 mempool contents), download (allow getheaders +during IBD, no disconnect after maxuploadtarget limit), addr +(responses to GETADDR avoid hitting the cache and contain random +records with the most up\-to\-date info). Specify multiple +permissions separated by commas (default: +download,noban,mempool,relay). Can be specified multiple times. +.HP +\fB\-whitelist=\fR<[permissions@]IP address or network> +.IP +Add permission flags to the peers using the given IP address (e.g. +1.2.3.4) or CIDR\-notated network (e.g. 1.2.3.0/24). Uses the same +permissions as \fB\-whitebind\fR. Additional flags "in" and "out" +control whether permissions apply to incoming connections and/or +manual (default: incoming only). Can be specified multiple times. +.PP +Wallet options: +.HP +\fB\-addresstype\fR +.IP +What type of addresses to use ("legacy", "p2sh\-segwit", "bech32", or +"bech32m", default: "bech32") +.HP +\fB\-avoidpartialspends\fR +.IP +Group outputs by address, selecting many (possibly all) or none, instead +of selecting on a per\-output basis. Privacy is improved as +addresses are mostly swept with fewer transactions and outputs +are aggregated in clean change addresses. It may result in higher +fees due to less optimal coin selection caused by this added +limitation and possibly a larger\-than\-necessary number of inputs +being used. Always enabled for wallets with "avoid_reuse" +enabled, otherwise default: 0. +.HP +\fB\-changetype\fR +.IP +What type of change to use ("legacy", "p2sh\-segwit", "bech32", or +"bech32m"). Default is "legacy" when \fB\-addresstype\fR=\fI\,legacy\/\fR, else it +is an implementation detail. +.HP +\fB\-consolidatefeerate=\fR +.IP +The maximum feerate (in BTC/kvB) at which transaction building may use +more inputs than strictly necessary so that the wallet's UTXO +pool can be reduced (default: 0.0001). +.HP +\fB\-disablewallet\fR +.IP +Do not load the wallet and disable wallet RPC calls +.HP +\fB\-discardfee=\fR +.IP +The fee rate (in BTC/kvB) that indicates your tolerance for discarding +change by adding it to the fee (default: 0.0001). Note: An output +is discarded if it is dust at this rate, but we will always +discard up to the dust relay fee and a discard fee above that is +limited by the fee estimate for the longest target +.HP +\fB\-fallbackfee=\fR +.IP +A fee rate (in BTC/kvB) that will be used when fee estimation has +insufficient data. 0 to entirely disable the fallbackfee feature. +(default: 0.00) +.HP +\fB\-keypool=\fR +.IP +Set key pool size to (default: 1000). Warning: Smaller sizes may +increase the risk of losing funds when restoring from an old +backup, if none of the addresses in the original keypool have +been used. +.HP +\fB\-maxapsfee=\fR +.IP +Spend up to this amount in additional (absolute) fees (in BTC) if it +allows the use of partial spend avoidance (default: 0.00) +.HP +\fB\-mintxfee=\fR +.IP +Fee rates (in BTC/kvB) smaller than this are considered zero fee for +transaction creation (default: 0.00001) +.HP +\fB\-paytxfee=\fR +.IP +Fee rate (in BTC/kvB) to add to transactions you send (default: 0.00) +.HP +\fB\-signer=\fR +.IP +External signing tool, see doc/external\-signer.md +.HP +\fB\-spendzeroconfchange\fR +.IP +Spend unconfirmed change when sending transactions (default: 1) +.HP +\fB\-txconfirmtarget=\fR +.IP +If paytxfee is not set, include enough fee so transactions begin +confirmation on average within n blocks (default: 6) +.HP +\fB\-wallet=\fR +.IP +Specify wallet path to load at startup. Can be used multiple times to +load multiple wallets. Path is to a directory containing wallet +data and log files. If the path is not absolute, it is +interpreted relative to . This only loads existing +wallets and does not create new ones. For backwards compatibility +this also accepts names of existing top\-level data files in +. +.HP +\fB\-walletbroadcast\fR +.IP +Make the wallet broadcast transactions (default: 1) +.HP +\fB\-walletdir=\fR +.IP +Specify directory to hold wallets (default: /wallets if it +exists, otherwise ) +.HP +\fB\-walletnotify=\fR +.IP +Execute command when a wallet transaction changes. %s in cmd is replaced +by TxID, %w is replaced by wallet name, %b is replaced by the +hash of the block including the transaction (set to 'unconfirmed' +if the transaction is not included) and %h is replaced by the +block height (\fB\-1\fR if not included). %w is not currently +implemented on windows. On systems where %w is supported, it +should NOT be quoted because this would break shell escaping used +to invoke the command. +.HP +\fB\-walletrbf\fR +.IP +Send transactions with full\-RBF opt\-in enabled (RPC only, default: 1) +.PP +ZeroMQ notification options: +.HP +\fB\-zmqpubhashblock=\fR
+.IP +Enable publish hash block in
+.HP +\fB\-zmqpubhashblockhwm=\fR +.IP +Set publish hash block outbound message high water mark (default: 1000) +.HP +\fB\-zmqpubhashtx=\fR
+.IP +Enable publish hash transaction in
+.HP +\fB\-zmqpubhashtxhwm=\fR +.IP +Set publish hash transaction outbound message high water mark (default: +1000) +.HP +\fB\-zmqpubrawblock=\fR
+.IP +Enable publish raw block in
+.HP +\fB\-zmqpubrawblockhwm=\fR +.IP +Set publish raw block outbound message high water mark (default: 1000) +.HP +\fB\-zmqpubrawtx=\fR
+.IP +Enable publish raw transaction in
+.HP +\fB\-zmqpubrawtxhwm=\fR +.IP +Set publish raw transaction outbound message high water mark (default: +1000) +.HP +\fB\-zmqpubsequence=\fR
+.IP +Enable publish hash block and tx sequence in
+.HP +\fB\-zmqpubsequencehwm=\fR +.IP +Set publish hash sequence message high water mark (default: 1000) +.PP +Debugging/Testing options: +.HP +\fB\-debug=\fR +.IP +Output debug and trace logging (default: \fB\-nodebug\fR, supplying +is optional). If is not supplied or if is 1 +or "all", output all debug logging. If is 0 or "none", +any other categories are ignored. Other valid values for + are: addrman, bench, blockstorage, cmpctblock, coindb, +estimatefee, http, i2p, ipc, leveldb, libevent, mempool, +mempoolrej, net, proxy, prune, qt, rand, reindex, rpc, scan, +selectcoins, tor, txpackages, txreconciliation, validation, +walletdb, zmq. This option can be specified multiple times to +output multiple categories. +.HP +\fB\-debugexclude=\fR +.IP +Exclude debug and trace logging for a category. Can be used in +conjunction with \fB\-debug\fR=\fI\,1\/\fR to output debug and trace logging for +all categories except the specified category. This option can be +specified multiple times to exclude multiple categories. This +takes priority over "\-debug" +.HP +\fB\-help\-debug\fR +.IP +Print help message with debugging options and exit +.HP +\fB\-logips\fR +.IP +Include IP addresses in debug output (default: 0) +.HP +\fB\-loglevelalways\fR +.IP +Always prepend a category and level (default: 0) +.HP +\fB\-logsourcelocations\fR +.IP +Prepend debug output with name of the originating source location +(source file, line number and function name) (default: 0) +.HP +\fB\-logthreadnames\fR +.IP +Prepend debug output with name of the originating thread (default: 0) +.HP +\fB\-logtimestamps\fR +.IP +Prepend debug output with timestamp (default: 1) +.HP +\fB\-maxtxfee=\fR +.IP +Maximum total fees (in BTC) to use in a single wallet transaction; +setting this too low may abort large transactions (default: 0.10) +.HP +\fB\-printtoconsole\fR +.IP +Send trace/debug info to console (default: 1 when no \fB\-daemon\fR. To disable +logging to file, set \fB\-nodebuglogfile\fR) +.HP +\fB\-shrinkdebugfile\fR +.IP +Shrink debug.log file on client startup (default: 1 when no \fB\-debug\fR) +.HP +\fB\-uacomment=\fR +.IP +Append comment to the user agent string +.PP +Chain selection options: +.HP +\fB\-chain=\fR +.IP +Use the chain (default: main). Allowed values: main, test, +testnet4, signet, regtest +.HP +\fB\-signet\fR +.IP +Use the signet chain. Equivalent to \fB\-chain\fR=\fI\,signet\/\fR. Note that the network +is defined by the \fB\-signetchallenge\fR parameter +.HP +\fB\-signetchallenge\fR +.IP +Blocks must satisfy the given script to be considered valid (only for +signet networks; defaults to the global default signet test +network challenge) +.HP +\fB\-signetseednode\fR +.IP +Specify a seed node for the signet network, in the hostname[:port] +format, e.g. sig.net:1234 (may be used multiple times to specify +multiple seed nodes; defaults to the global default signet test +network seed node(s)) +.HP +\fB\-testnet\fR +.IP +Use the testnet3 chain. Equivalent to \fB\-chain\fR=\fI\,test\/\fR. Support for testnet3 +is deprecated and will be removed in an upcoming release. +Consider moving to testnet4 now by using \fB\-testnet4\fR. +.HP +\fB\-testnet4\fR +.IP +Use the testnet4 chain. Equivalent to \fB\-chain\fR=\fI\,testnet4\/\fR. +.PP +Node relay options: +.HP +\fB\-bytespersigop\fR +.IP +Equivalent bytes per sigop in transactions for relay and mining +(default: 20) +.HP +\fB\-datacarrier\fR +.IP +Relay and mine data carrier transactions (default: 1) +.HP +\fB\-datacarriersize\fR +.IP +Relay and mine transactions whose data\-carrying raw scriptPubKey is of +this size or less (default: 83) +.HP +\fB\-minrelaytxfee=\fR +.IP +Fees (in BTC/kvB) smaller than this are considered zero fee for +relaying, mining and transaction creation (default: 0.000001) +.HP +\fB\-permitbaremultisig\fR +.IP +Relay transactions creating non\-P2SH multisig outputs (default: 1) +.HP +\fB\-whitelistforcerelay\fR +.IP +Add 'forcerelay' permission to whitelisted peers with default +permissions. This will relay transactions even if the +transactions were already in the mempool. (default: 0) +.HP +\fB\-whitelistrelay\fR +.IP +Add 'relay' permission to whitelisted peers with default permissions. +This will accept relayed transactions even when not relaying +transactions (default: 1) +.PP +Block creation options: +.HP +\fB\-blockmaxweight=\fR +.IP +Set maximum BIP141 block weight (default: 4000000) +.HP +\fB\-blockmintxfee=\fR +.IP +Set lowest fee rate (in BTC/kvB) for transactions to be included in +block creation. (default: 0.00000001) +.HP +\fB\-blockreservedweight=\fR +.IP +Reserve space for the fixed\-size block header plus the largest coinbase +transaction the mining software may add to the block. (default: +8000). +.PP +RPC server options: +.HP +\fB\-rest\fR +.IP +Accept public REST requests (default: 0) +.HP +\fB\-rpcallowip=\fR +.IP +Allow JSON\-RPC connections from specified source. Valid values for +are a single IP (e.g. 1.2.3.4), a network/netmask (e.g. +1.2.3.4/255.255.255.0), a network/CIDR (e.g. 1.2.3.4/24), all +ipv4 (0.0.0.0/0), or all ipv6 (::/0). This option can be +specified multiple times +.HP +\fB\-rpcauth=\fR +.IP +Username and HMAC\-SHA\-256 hashed password for JSON\-RPC connections. The +field comes in the format: :$. A +canonical python script is included in share/rpcauth. The client +then connects normally using the +rpcuser=/rpcpassword= pair of arguments. This +option can be specified multiple times +.HP +\fB\-rpcbind=\fR[:port] +.IP +Bind to given address to listen for JSON\-RPC connections. Do not expose +the RPC server to untrusted networks such as the public internet! +This option is ignored unless \fB\-rpcallowip\fR is also passed. Port is +optional and overrides \fB\-rpcport\fR. Use [host]:port notation for +IPv6. This option can be specified multiple times (default: +127.0.0.1 and ::1 i.e., localhost) +.HP +\fB\-rpccookiefile=\fR +.IP +Location of the auth cookie. Relative paths will be prefixed by a +net\-specific datadir location. (default: data dir) +.HP +\fB\-rpccookieperms=\fR +.IP +Set permissions on the RPC auth cookie file so that it is readable by +[owner|group|all] (default: owner [via umask 0077]) +.HP +\fB\-rpcpassword=\fR +.IP +Password for JSON\-RPC connections +.HP +\fB\-rpcport=\fR +.IP +Listen for JSON\-RPC connections on (default: 8332, testnet3: +18332, testnet4: 48332, signet: 38332, regtest: 18443) +.HP +\fB\-rpcthreads=\fR +.IP +Set the number of threads to service RPC calls (default: 16) +.HP +\fB\-rpcuser=\fR +.IP +Username for JSON\-RPC connections +.HP +\fB\-rpcwhitelist=\fR +.IP +Set a whitelist to filter incoming RPC calls for a specific user. The +field comes in the format: :,,...,. If multiple whitelists are set for a given user, +they are set\-intersected. See \fB\-rpcwhitelistdefault\fR documentation +for information on default whitelist behavior. +.HP +\fB\-rpcwhitelistdefault\fR +.IP +Sets default behavior for rpc whitelisting. Unless rpcwhitelistdefault +is set to 0, if any \fB\-rpcwhitelist\fR is set, the rpc server acts as +if all rpc users are subject to empty\-unless\-otherwise\-specified +whitelists. If rpcwhitelistdefault is set to 1 and no +\fB\-rpcwhitelist\fR is set, rpc server acts as if all rpc users are +subject to empty whitelists. +.HP +\fB\-server\fR +.IP +Accept command line and JSON\-RPC commands +.SH COPYRIGHT +Copyright (C) 2009-2025 The Bitcoin Core developers + +Please contribute if you find Bitcoin 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 +.SH "SEE ALSO" +bitcoind(1), bitcoin-cli(1), bitcoin-tx(1), bitcoin-wallet(1), bitcoin-util(1), bitcoin-qt(1) diff --git a/doc/man/elements-cli.1 b/doc/man/elements-cli.1 index afd86f2b7e7..9c4927966a3 100644 --- a/doc/man/elements-cli.1 +++ b/doc/man/elements-cli.1 @@ -2,4 +2,12 @@ .SH NAME elements-cli \- manual page for elements-cli -This is a placeholder file. Please follow the instructions in \fIcontrib/devtools/README.md\fR to generate the manual pages after a release. +Please contribute if you find Bitcoin 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 +.SH "SEE ALSO" +bitcoind(1), bitcoin-cli(1), bitcoin-tx(1), bitcoin-wallet(1), bitcoin-util(1), bitcoin-qt(1) diff --git a/doc/man/elements-qt.1 b/doc/man/elements-qt.1 index 738374031d2..a3056a19b5a 100644 --- a/doc/man/elements-qt.1 +++ b/doc/man/elements-qt.1 @@ -2,4 +2,12 @@ .SH NAME elements-qt \- manual page for elements-qt -This is a placeholder file. Please follow the instructions in \fIcontrib/devtools/README.md\fR to generate the manual pages after a release. +Please contribute if you find Bitcoin 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 +.SH "SEE ALSO" +bitcoind(1), bitcoin-cli(1), bitcoin-tx(1), bitcoin-wallet(1), bitcoin-util(1), bitcoin-qt(1) diff --git a/doc/man/elements-tx.1 b/doc/man/elements-tx.1 index b54eef991b6..6d540371283 100644 --- a/doc/man/elements-tx.1 +++ b/doc/man/elements-tx.1 @@ -2,4 +2,12 @@ .SH NAME elements-tx \- manual page for elements-tx -This is a placeholder file. Please follow the instructions in \fIcontrib/devtools/README.md\fR to generate the manual pages after a release. +Please contribute if you find Bitcoin 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 +.SH "SEE ALSO" +bitcoind(1), bitcoin-cli(1), bitcoin-tx(1), bitcoin-wallet(1), bitcoin-util(1), bitcoin-qt(1) diff --git a/doc/man/elements-util.1 b/doc/man/elements-util.1 index bc9824ad574..597b451d576 100644 --- a/doc/man/elements-util.1 +++ b/doc/man/elements-util.1 @@ -2,4 +2,12 @@ .SH NAME elements-util \- manual page for elements-util -This is a placeholder file. Please follow the instructions in \fIcontrib/devtools/README.md\fR to generate the manual pages after a release. +Please contribute if you find Bitcoin 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 +.SH "SEE ALSO" +bitcoind(1), bitcoin-cli(1), bitcoin-tx(1), bitcoin-wallet(1), bitcoin-util(1), bitcoin-qt(1) diff --git a/doc/man/elementsd.1 b/doc/man/elementsd.1 index ca14100fc17..7ef8d68b548 100644 --- a/doc/man/elementsd.1 +++ b/doc/man/elementsd.1 @@ -2,4 +2,12 @@ .SH NAME elementsd \- manual page for elementsd -This is a placeholder file. Please follow the instructions in \fIcontrib/devtools/README.md\fR to generate the manual pages after a release. +Please contribute if you find Bitcoin 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 +.SH "SEE ALSO" +bitcoind(1), bitcoin-cli(1), bitcoin-tx(1), bitcoin-wallet(1), bitcoin-util(1), bitcoin-qt(1) diff --git a/doc/p2p-bad-ports.md b/doc/p2p-bad-ports.md index 4f717f97a29..5e78eb799d3 100644 --- a/doc/p2p-bad-ports.md +++ b/doc/p2p-bad-ports.md @@ -87,10 +87,14 @@ incoming connections. 1720: h323hostcall 1723: pptp 2049: nfs + 3306: MySQL + 3389: RDP / Windows Remote Desktop 3659: apple-sasl / PasswordServer 4045: lockd 5060: sip 5061: sips + 5432: PostgreSQL + 5900: VNC 6000: X11 6566: sane-port 6665: Alternate IRC @@ -100,6 +104,7 @@ incoming connections. 6669: Alternate IRC 6697: IRC + TLS 10080: Amanda + 27017: MongoDB For further information see: diff --git a/doc/release-notes-empty-template.md b/doc/release-notes-empty-template.md deleted file mode 100644 index fdb0d7c8b13..00000000000 --- a/doc/release-notes-empty-template.md +++ /dev/null @@ -1,99 +0,0 @@ -*The release notes draft is a temporary file that can be added to by anyone. See -[/doc/developer-notes.md#release-notes](/doc/developer-notes.md#release-notes) -for the process.* - -*version* Release Notes Draft -=============================== - -Bitcoin Core version *version* is now available from: - - - -This release includes new features, various bug fixes and performance -improvements, as well as updated translations. - -Please report bugs using the issue tracker at GitHub: - - - -To receive security and update notifications, please subscribe to: - - - -How to Upgrade -============== - -If you are running an older version, shut it down. Wait until it has completely -shut down (which might take a few minutes in some cases), then run the -installer (on Windows) or just copy over `/Applications/Bitcoin-Qt` (on macOS) -or `bitcoind`/`bitcoin-qt` (on Linux). - -Upgrading directly from a version of Bitcoin Core that has reached its EOL is -possible, but it might take some time if the data directory needs to be migrated. Old -wallet versions of Bitcoin Core are generally supported. - -Compatibility -============== - -Bitcoin Core is supported and tested on operating systems using the -Linux Kernel 3.17+, macOS 13+, and Windows 10+. Bitcoin -Core should also work on most other Unix-like systems but is not as -frequently tested on them. It is not recommended to use Bitcoin Core on -unsupported systems. - -Notable changes -=============== - -P2P and network changes ------------------------ - -Updated RPCs ------------- - - -Changes to wallet related RPCs can be found in the Wallet section below. - -New RPCs --------- - -Build System ------------- - -Updated settings ----------------- - - -Changes to GUI or wallet related settings can be found in the GUI or Wallet section below. - -New settings ------------- - -Tools and Utilities -------------------- - -Wallet ------- - -GUI changes ------------ - -Low-level changes -================= - -RPC ---- - -Tests ------ - -*version* change log -==================== - -Credits -======= - -Thanks to everyone who directly contributed to this release: - - -As well as to everyone that helped with translations on -[Transifex](https://www.transifex.com/bitcoin/bitcoin/). diff --git a/doc/release-notes.md b/doc/release-notes.md new file mode 100644 index 00000000000..c59434e8c4b --- /dev/null +++ b/doc/release-notes.md @@ -0,0 +1,107 @@ +Bitcoin Core version 29.4rc1 is now available from: + + + +This release includes various bug fixes and performance +improvements, as well as updated translations. + +Please report bugs using the issue tracker at GitHub: + + + +To receive security and update notifications, please subscribe to: + + + +How to Upgrade +============== + +If you are running an older version, shut it down. Wait until it has completely +shut down (which might take a few minutes in some cases), then run the +installer (on Windows) or just copy over `/Applications/Bitcoin-Qt` (on macOS) +or `bitcoind`/`bitcoin-qt` (on Linux). + +Upgrading directly from a version of Bitcoin Core that has reached its EOL is +possible, but it might take some time if the data directory needs to be migrated. Old +wallet versions of Bitcoin Core are generally supported. + +Compatibility +============== + +Bitcoin Core is supported and tested on operating systems using the +Linux Kernel 3.17+, macOS 13+, and Windows 10+. Bitcoin +Core should also work on most other Unix-like systems but is not as +frequently tested on them. It is not recommended to use Bitcoin Core on +unsupported systems. + +Notable changes +=============== + +This release fixes an issue where the chainstate database would repeatedly +rewrite large portions of itself, causing excessive disk reads and writes +during normal operation. + +### Validation + +- #35209 validation: correct lifetime of precomputed tx data +- #35465 coins: compact chainstate regularly + +### Leveldb + +- #61(bitcoin-core/leveldb): Disable seek compaction + +### Net + +- #34093 netif: fix compilation warning in QueryDefaultGatewayImpl() + +### Wallet + +- #35228 wallet: use outpoint when estimating input size + +### Build + +- #34228 depends: Unset SOURCE_DATE_EPOCH in gen_id script +- #34848 cmake: Migrate away from deprecated SQLite3 target + +### Test + +- #34918 fuzz: [refactor] Remove unused g_setup pointers + +### Doc + +- #34510 doc: fix broken bpftrace installation link +- #34561 wallet: rpc: manpage: fix example missing `fee_rate` argument +- #34671 doc: Update Guix install for Debian/Ubuntu +- #35283 doc: mention -DWITH_ZMQ=ON in BSD build guides + +### CI + +- #35202 ci: restore sockets in i686, no IPC job +- #35378 ci: switch runners from cirrus to warpbuild +- #35408 ci: 35378 followups + +### Misc + +- #35175 multi_index: fix compilation failure with boost >= 1.91 + +Credits +======= + +Thanks to everyone who directly contributed to this release: + +- andrewtoth +- Cory Fields +- Daniel Pfeifer +- darosior +- fanquake +- Hennadii Stepanov +- jayvaliya +- junbyjun1238 +- Lőrinc +- MarcoFalke +- SomberNight +- ToRyVand +- willcl-ark + +As well as to everyone that helped with translations on +[Transifex](https://explore.transifex.com/bitcoin/bitcoin/). diff --git a/doc/release-process.md b/doc/release-process.md index 1c5810d0238..9159b8cc8c8 100644 --- a/doc/release-process.md +++ b/doc/release-process.md @@ -57,10 +57,10 @@ Release Process - Clear the release notes and move them to the wiki (see "Write the release notes" below). - Translations on Transifex: - Pull translations from Transifex into the master branch. - - Create [a new resource](https://www.transifex.com/bitcoin/bitcoin/content/) named after the major version with the slug `qt-translation-x`, where `RRR` is the major branch number padded with zeros. Use `src/qt/locale/bitcoin_en.xlf` to create it. + - Create [a new resource](https://app.transifex.com/bitcoin/bitcoin/content/) named after the major version with the slug `qt-translation-x`, where `RRR` is the major branch number padded with zeros. Use `src/qt/locale/bitcoin_en.xlf` to create it. - In the project workflow settings, ensure that [Translation Memory Fill-up](https://help.transifex.com/en/articles/6224817-setting-up-translation-memory-fill-up) is enabled and that [Translation Memory Context Matching](https://help.transifex.com/en/articles/6224753-translation-memory-with-context) is disabled. - Update the Transifex slug in [`.tx/config`](/.tx/config) to the slug of the resource created in the first step. This identifies which resource the translations will be synchronized from. - - Make an announcement that translators can start translating for the new version. You can use one of the [previous announcements](https://www.transifex.com/bitcoin/communication/) as a template. + - Make an announcement that translators can start translating for the new version. You can use one of the [previous announcements](https://app.transifex.com/bitcoin/communication/) as a template. - Change the auto-update URL for the resource to `master`, e.g. `https://raw.githubusercontent.com/bitcoin/bitcoin/master/src/qt/locale/bitcoin_en.xlf`. (Do this only after the previous steps, to prevent an auto-update from interfering.) #### After branch-off (on the major release branch) diff --git a/doc/tor.md b/doc/tor.md index 30c2381049a..30eddb91e32 100644 --- a/doc/tor.md +++ b/doc/tor.md @@ -62,7 +62,7 @@ outgoing connections, but more is possible. In a typical situation, this suffices to run behind a Tor proxy: - ./bitcoind -proxy=127.0.0.1:9050 + bitcoind -proxy=127.0.0.1:9050 ## 2. Automatically create a Bitcoin Core onion service @@ -187,25 +187,25 @@ should be equal to binding address and port for inbound Tor connections (127.0.0 In a typical situation, where you're only reachable via Tor, this should suffice: - ./bitcoind -proxy=127.0.0.1:9050 -externalip=7zvj7a2imdgkdbg4f2dryd5rgtrn7upivr5eeij4cicjh65pooxeshid.onion -listen + bitcoind -proxy=127.0.0.1:9050 -externalip=7zvj7a2imdgkdbg4f2dryd5rgtrn7upivr5eeij4cicjh65pooxeshid.onion -listen (obviously, replace the .onion address with your own). It should be noted that you still listen on all devices and another node could establish a clearnet connection, when knowing your address. To mitigate this, additionally bind the address of your Tor proxy: - ./bitcoind ... -bind=127.0.0.1:8334=onion + bitcoind ... -bind=127.0.0.1:8334=onion If you don't care too much about hiding your node, and want to be reachable on IPv4 as well, use `discover` instead: - ./bitcoind ... -discover + bitcoind ... -discover and open port 8333 on your firewall (or use port mapping, i.e., `-natpmp`). If you only want to use Tor to reach .onion addresses, but not use it as a proxy for normal IPv4/IPv6 communication, use: - ./bitcoind -onion=127.0.0.1:9050 -externalip=7zvj7a2imdgkdbg4f2dryd5rgtrn7upivr5eeij4cicjh65pooxeshid.onion -discover + bitcoind -onion=127.0.0.1:9050 -externalip=7zvj7a2imdgkdbg4f2dryd5rgtrn7upivr5eeij4cicjh65pooxeshid.onion -discover ## 4. Privacy recommendations diff --git a/doc/translation_process.md b/doc/translation_process.md index 429e92b2b32..9bd7b142409 100644 --- a/doc/translation_process.md +++ b/doc/translation_process.md @@ -41,7 +41,7 @@ git commit ### Creating a Transifex account Visit the [Transifex Signup](https://www.transifex.com/signup/) page to create an account. Take note of your username and password, as they will be required to configure the command-line tool. -You can find the Bitcoin translation project at [https://www.transifex.com/bitcoin/bitcoin/](https://www.transifex.com/bitcoin/bitcoin/). +You can find the Bitcoin translation project at [https://explore.transifex.com/bitcoin/bitcoin/](https://explore.transifex.com/bitcoin/bitcoin/). ### Installing the Transifex client command-line tool The client is used to fetch updated translations. Please check installation instructions and any other details at https://developers.transifex.com/docs/cli. diff --git a/doc/zmq.md b/doc/zmq.md index 0a74d6eef97..44cdc0e2c26 100644 --- a/doc/zmq.md +++ b/doc/zmq.md @@ -84,7 +84,7 @@ For instance: $ bitcoind -zmqpubhashtx=tcp://127.0.0.1:28332 \ -zmqpubhashtx=tcp://192.168.1.2:28332 \ -zmqpubhashblock="tcp://[::1]:28333" \ - -zmqpubrawtx=ipc:///tmp/bitcoind.tx.raw \ + -zmqpubrawtx=unix:/tmp/bitcoind.tx.raw \ -zmqpubhashtxhwm=10000 Each PUB notification has a topic and body, where the header diff --git a/share/examples/bitcoin.conf b/share/examples/bitcoin.conf index 5bee4bf92e7..d7c170da358 100644 --- a/share/examples/bitcoin.conf +++ b/share/examples/bitcoin.conf @@ -1 +1,706 @@ -# This is a placeholder file. Please follow the instructions in `contrib/devtools/README.md` to generate a bitcoin.conf file. +## +## 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 + + +# Execute command when an alert is raised (%s in cmd is replaced by +# message) +#alertnotify= + +# For backwards compatibility, treat an unused bitcoin.conf file in the +# datadir as a warning, not an error. +#allowignoredconf=1 + +# If this block is in the chain assume that it and its ancestors are valid +# and potentially skip their script verification (0 to verify all, +# default: +# 00000000000000000001b658dd1120e82e66d2790811f89ede9742ada3ed6d77, +# testnet3: +# 00000000000003fc7967410ba2d0a8a8d50daedc318d43e8baf1a9782c236a57, +# testnet4: +# 0000000000003ed4f08dbdf6f7d6b271a6bcffce25675cb40aa9fa43179a89f3, +# signet: +# 000000895a110f46e59eb82bbc5bfb67fa314656009c295509c21b4999f5180a) +#assumevalid= + +# Maintain an index of compact filters by block (default: 0, values: +# basic). If is not supplied or if = 1, indexes for +# all known types are enabled. +#blockfilterindex= + +# Execute command when the best block changes (%s in cmd is replaced by +# block hash) +#blocknotify= + +# Extra transactions to keep in memory for compact block reconstructions +# (default: 100) +#blockreconstructionextratxn= + +# Specify directory to hold blocks subdirectory for *.dat files (default: +# ) +#blocksdir= + +# Whether to reject transactions from network peers. Disables automatic +# broadcast and rebroadcast of transactions, unless the source peer +# has the 'forcerelay' permission. RPC transactions are not +# affected. (default: 0) +#blocksonly=1 + +# Whether an XOR-key applies to blocksdir *.dat files. The created XOR-key +# will be zeros for an existing blocksdir or when `-blocksxor=0` is +# set, and random for a freshly initialized blocksdir. (default: 1) +#blocksxor=1 + +# Maintain coinstats index used by the gettxoutsetinfo RPC (default: 0) +#coinstatsindex=1 + +# Specify path to read-only configuration file. Relative paths will be +# prefixed by datadir location (only useable from command line, not +# configuration file) (default: bitcoin.conf) +#conf= + +# Run in the background as a daemon and accept commands (default: 0) +#daemon=1 + +# Wait for initialization to be finished before exiting. This implies +# -daemon (default: 0) +#daemonwait=1 + +# Specify data directory +#datadir= + +# Maximum database cache size MiB (minimum 4, default: 450). Make sure +# you have enough RAM. In addition, unused memory allocated to the +# mempool is shared with this cache (see -maxmempool). +#dbcache= + +# Specify location of debug log file (default: debug.log). Relative paths +# will be prefixed by a net-specific datadir location. Pass +# -nodebuglogfile to disable writing the log to a file. +#debuglogfile= + +# Specify additional configuration file, relative to the -datadir path +# (only useable from configuration file, not command line) +#includeconf= + +# Imports blocks from external file on startup +#loadblock= + +# Keep the transaction memory pool below megabytes (default: 300) +#maxmempool= + +# Keep at most unconnectable transactions in memory (default: 100) +#maxorphantx= + +# Do not keep transactions in the mempool longer than hours (default: +# 336) +#mempoolexpiry= + +# Set the number of script verification threads (0 = auto, up to 15, <0 = +# leave that many cores free, default: 0) +#par= + +# Whether to save the mempool on shutdown and load on restart (default: 1) +#persistmempool=1 + +# Whether a mempool.dat file created by -persistmempool or the savemempool +# RPC will be written in the legacy format (version 1) or the +# current format (version 2). This temporary option will be removed +# in the future. (default: 0) +#persistmempoolv1=1 + +# Specify pid file. Relative paths will be prefixed by a net-specific +# datadir location. (default: bitcoind.pid) +#pid= + +# Reduce storage requirements by enabling pruning (deleting) of old +# blocks. This allows the pruneblockchain RPC to be called to +# delete specific blocks and enables automatic pruning of old +# blocks if a target size in MiB is provided. This mode is +# incompatible with -txindex. Warning: Reverting this setting +# requires re-downloading the entire blockchain. (default: 0 = +# disable pruning blocks, 1 = allow manual pruning via RPC, >=550 = +# automatically prune block files to stay under the specified +# target size in MiB) +#prune= + +# If enabled, wipe chain state and block index, and rebuild them from +# blk*.dat files on disk. Also wipe and rebuild other optional +# indexes that are active. If an assumeutxo snapshot was loaded, +# its chainstate will be wiped as well. The snapshot can then be +# reloaded via RPC. +#reindex=1 + +# If enabled, wipe chain state, and rebuild it from blk*.dat files on +# disk. If an assumeutxo snapshot was loaded, its chainstate will +# be wiped as well. The snapshot can then be reloaded via RPC. +#reindex-chainstate=1 + +# Specify path to dynamic settings data file. Can be disabled with +# -nosettings. File is written at runtime and not meant to be +# edited by users (use bitcoin.conf instead for custom settings). +# Relative paths will be prefixed by datadir location. (default: +# settings.json) +#settings= + +# Execute command immediately before beginning shutdown. The need for +# shutdown may be urgent, so be careful not to delay it long (if +# the command doesn't require interaction with the server, consider +# having it fork into the background). +#shutdownnotify= + +# Execute command on startup. +#startupnotify= + +# Maintain a full transaction index, used by the getrawtransaction rpc +# call (default: 0) +#txindex=1 + +# Print version and exit +#version=1 + + +### Connection options + + +# Add a node to connect to and attempt to keep the connection open (see +# the addnode RPC help for more info). This option can be specified +# multiple times to add multiple nodes; connections are limited to +# 8 at a time and are counted separately from the -maxconnections +# limit. +#addnode= + +# Specify asn mapping used for bucketing of the peers (default: +# ip_asn.map). Relative paths will be prefixed by the net-specific +# datadir location. +#asmap= + +# Default duration (in seconds) of manually configured bans (default: +# 86400) +#bantime= + +# Bind to given address and always listen on it (default: 0.0.0.0). Use +# [host]:port notation for IPv6. Append =onion to tag any incoming +# connections to that address and port as incoming Tor connections +# (default: 127.0.0.1:8334=onion, testnet3: 127.0.0.1:18334=onion, +# testnet4: 127.0.0.1:48334=onion, signet: 127.0.0.1:38334=onion, +# regtest: 127.0.0.1:18445=onion) +#bind=[:][=onion] + +# If set, then this host is configured for CJDNS (connecting to fc00::/8 +# addresses would lead us to the CJDNS network, see doc/cjdns.md) +# (default: 0) +#cjdnsreachable=1 + +# Connect only to the specified node; -noconnect disables automatic +# connections (the rules for this peer are the same as for +# -addnode). This option can be specified multiple times to connect +# to multiple nodes. +#connect= + +# Discover own IP addresses (default: 1 when listening and no -externalip +# or -proxy) +#discover=1 + +# Allow DNS lookups for -addnode, -seednode and -connect (default: 1) +#dns=1 + +# Query for peer addresses via DNS lookup, if low on addresses (default: 1 +# unless -connect used or -maxconnections=0) +#dnsseed=1 + +# Specify your own public address +#externalip= + +# Allow fixed seeds if DNS seeds don't provide peers (default: 1) +#fixedseeds=1 + +# Always query for peer addresses via DNS lookup (default: 0) +#forcednsseed=1 + +# Whether to accept inbound I2P connections (default: 1). Ignored if +# -i2psam is not set. Listening for inbound I2P connections is done +# through the SAM proxy, not by binding to a local address and +# port. +#i2pacceptincoming=1 + +# I2P SAM proxy to reach I2P peers and accept I2P connections (default: +# none) +#i2psam= + +# Accept connections from outside (default: 1 if no -proxy, -connect or +# -maxconnections=0) +#listen=1 + +# Automatically create Tor onion service (default: 1) +#listenonion=1 + +# Maintain at most automatic connections to peers (default: 125). This +# limit does not apply to connections manually added via -addnode +# or the addnode RPC, which have a separate limit of 8. +#maxconnections= + +# Maximum per-connection receive buffer, *1000 bytes (default: 5000) +#maxreceivebuffer= + +# Maximum per-connection memory usage for the send buffer, *1000 bytes +# (default: 1000) +#maxsendbuffer= + +# Tries to keep outbound traffic under the given target per 24h. Limit +# does not apply to peers with 'download' permission or blocks +# created within past week. 0 = no limit (default: 0M). Optional +# suffix units [k|K|m|M|g|G|t|T] (default: M). Lowercase is 1000 +# base while uppercase is 1024 base +#maxuploadtarget= + +# Use PCP or NAT-PMP to map the listening port (default: 0) +#natpmp=1 + +# Enable all P2P network activity (default: 1). Can be changed by the +# setnetworkactive RPC command +#networkactive=1 + +# Use separate SOCKS5 proxy to reach peers via Tor onion services, set +# -noonion to disable (default: -proxy). May be a local file path +# prefixed with 'unix:'. +#onion= + +# Make automatic outbound connections only to network (ipv4, ipv6, +# onion, i2p, cjdns). Inbound and manual connections are not +# affected by this option. It can be specified multiple times to +# allow multiple networks. +#onlynet= + +# Serve compact block filters to peers per BIP 157 (default: 0) +#peerblockfilters=1 + +# Support filtering of blocks and transaction with bloom filters (default: +# 0) +#peerbloomfilters=1 + +# Listen for connections on (default: 8333, testnet3: 18333, +# testnet4: 48333, signet: 38333, regtest: 18444). Not relevant for +# I2P (see doc/i2p.md). If set to a value x, the default onion +# listening port will be set to x+1. +#port= + +# Connect through SOCKS5 proxy, set -noproxy to disable (default: +# disabled). May be a local file path prefixed with 'unix:' if the +# proxy supports it. +#proxy= + +# Randomize credentials for every proxy connection. This enables Tor +# stream isolation (default: 1) +#proxyrandomize=1 + +# Connect to a node to retrieve peer addresses, and disconnect. This +# option can be specified multiple times to connect to multiple +# nodes. During startup, seednodes will be tried before dnsseeds. +#seednode= + +# Specify socket connection timeout in milliseconds. If an initial attempt +# to connect is unsuccessful after this amount of time, drop it +# (minimum: 1, default: 5000) +#timeout= + +# Tor control host and port to use if onion listening enabled (default: +# 127.0.0.1:9051). If no port is specified, the default port of +# 9051 will be used. +#torcontrol=: + +# Tor control port password (default: empty) +#torpassword= + +# Support v2 transport (default: 1) +#v2transport=1 + +# Bind to the given address and add permission flags to the peers +# connecting to it. Use [host]:port notation for IPv6. Allowed +# permissions: bloomfilter (allow requesting BIP37 filtered blocks +# and transactions), noban (do not ban for misbehavior; implies +# download), forcerelay (relay transactions that are already in the +# mempool; implies relay), relay (relay even in -blocksonly mode, +# and unlimited transaction announcements), mempool (allow +# requesting BIP35 mempool contents), download (allow getheaders +# during IBD, no disconnect after maxuploadtarget limit), addr +# (responses to GETADDR avoid hitting the cache and contain random +# records with the most up-to-date info). Specify multiple +# permissions separated by commas (default: +# download,noban,mempool,relay). Can be specified multiple times. +#whitebind=<[permissions@]addr> + +# Add permission flags to the peers using the given IP address (e.g. +# 1.2.3.4) or CIDR-notated network (e.g. 1.2.3.0/24). Uses the same +# permissions as -whitebind. Additional flags "in" and "out" +# control whether permissions apply to incoming connections and/or +# manual (default: incoming only). Can be specified multiple times. +#whitelist=<[permissions@]IP address or network> + + +### Wallet options + + +# What type of addresses to use ("legacy", "p2sh-segwit", "bech32", or +# "bech32m", default: "bech32") +#addresstype=1 + +# Group outputs by address, selecting many (possibly all) or none, instead +# of selecting on a per-output basis. Privacy is improved as +# addresses are mostly swept with fewer transactions and outputs +# are aggregated in clean change addresses. It may result in higher +# fees due to less optimal coin selection caused by this added +# limitation and possibly a larger-than-necessary number of inputs +# being used. Always enabled for wallets with "avoid_reuse" +# enabled, otherwise default: 0. +#avoidpartialspends=1 + +# What type of change to use ("legacy", "p2sh-segwit", "bech32", or +# "bech32m"). Default is "legacy" when -addresstype=legacy, else it +# is an implementation detail. +#changetype=1 + +# The maximum feerate (in BTC/kvB) at which transaction building may use +# more inputs than strictly necessary so that the wallet's UTXO +# pool can be reduced (default: 0.0001). +#consolidatefeerate= + +# Do not load the wallet and disable wallet RPC calls +#disablewallet=1 + +# The fee rate (in BTC/kvB) that indicates your tolerance for discarding +# change by adding it to the fee (default: 0.0001). Note: An output +# is discarded if it is dust at this rate, but we will always +# discard up to the dust relay fee and a discard fee above that is +# limited by the fee estimate for the longest target +#discardfee= + +# A fee rate (in BTC/kvB) that will be used when fee estimation has +# insufficient data. 0 to entirely disable the fallbackfee feature. +# (default: 0.00) +#fallbackfee= + +# Set key pool size to (default: 1000). Warning: Smaller sizes may +# increase the risk of losing funds when restoring from an old +# backup, if none of the addresses in the original keypool have +# been used. +#keypool= + +# Spend up to this amount in additional (absolute) fees (in BTC) if it +# allows the use of partial spend avoidance (default: 0.00) +#maxapsfee= + +# Fee rates (in BTC/kvB) smaller than this are considered zero fee for +# transaction creation (default: 0.00001) +#mintxfee= + +# Fee rate (in BTC/kvB) to add to transactions you send (default: 0.00) +#paytxfee= + +# External signing tool, see doc/external-signer.md +#signer= + +# Spend unconfirmed change when sending transactions (default: 1) +#spendzeroconfchange=1 + +# If paytxfee is not set, include enough fee so transactions begin +# confirmation on average within n blocks (default: 6) +#txconfirmtarget= + +# Specify wallet path to load at startup. Can be used multiple times to +# load multiple wallets. Path is to a directory containing wallet +# data and log files. If the path is not absolute, it is +# interpreted relative to . This only loads existing +# wallets and does not create new ones. For backwards compatibility +# this also accepts names of existing top-level data files in +# . +#wallet= + +# Make the wallet broadcast transactions (default: 1) +#walletbroadcast=1 + +# Specify directory to hold wallets (default: /wallets if it +# exists, otherwise ) +#walletdir= + +# Execute command when a wallet transaction changes. %s in cmd is replaced +# by TxID, %w is replaced by wallet name, %b is replaced by the +# hash of the block including the transaction (set to 'unconfirmed' +# if the transaction is not included) and %h is replaced by the +# block height (-1 if not included). %w is not currently +# implemented on windows. On systems where %w is supported, it +# should NOT be quoted because this would break shell escaping used +# to invoke the command. +#walletnotify= + +# Send transactions with full-RBF opt-in enabled (RPC only, default: 1) +#walletrbf=1 + + +### ZeroMQ notification options + + +# Enable publish hash block in
+#zmqpubhashblock=
+ +# Set publish hash block outbound message high water mark (default: 1000) +#zmqpubhashblockhwm= + +# Enable publish hash transaction in
+#zmqpubhashtx=
+ +# Set publish hash transaction outbound message high water mark (default: +# 1000) +#zmqpubhashtxhwm= + +# Enable publish raw block in
+#zmqpubrawblock=
+ +# Set publish raw block outbound message high water mark (default: 1000) +#zmqpubrawblockhwm= + +# Enable publish raw transaction in
+#zmqpubrawtx=
+ +# Set publish raw transaction outbound message high water mark (default: +# 1000) +#zmqpubrawtxhwm= + +# Enable publish hash block and tx sequence in
+#zmqpubsequence=
+ +# Set publish hash sequence message high water mark (default: 1000) +#zmqpubsequencehwm= + + +### Debugging/Testing options + + +# Output debug and trace logging (default: -nodebug, supplying +# is optional). If is not supplied or if is 1 +# or "all", output all debug logging. If is 0 or "none", +# any other categories are ignored. Other valid values for +# are: addrman, bench, blockstorage, cmpctblock, coindb, +# estimatefee, http, i2p, ipc, leveldb, libevent, mempool, +# mempoolrej, net, proxy, prune, qt, rand, reindex, rpc, scan, +# selectcoins, tor, txpackages, txreconciliation, validation, +# walletdb, zmq. This option can be specified multiple times to +# output multiple categories. +#debug= + +# Exclude debug and trace logging for a category. Can be used in +# conjunction with -debug=1 to output debug and trace logging for +# all categories except the specified category. This option can be +# specified multiple times to exclude multiple categories. This +# takes priority over "-debug" +#debugexclude= + +# Include IP addresses in debug output (default: 0) +#logips=1 + +# Always prepend a category and level (default: 0) +#loglevelalways=1 + +# Prepend debug output with name of the originating source location +# (source file, line number and function name) (default: 0) +#logsourcelocations=1 + +# Prepend debug output with name of the originating thread (default: 0) +#logthreadnames=1 + +# Prepend debug output with timestamp (default: 1) +#logtimestamps=1 + +# Maximum total fees (in BTC) to use in a single wallet transaction; +# setting this too low may abort large transactions (default: 0.10) +#maxtxfee= + +# Send trace/debug info to console (default: 1 when no -daemon. To disable +# logging to file, set -nodebuglogfile) +#printtoconsole=1 + +# Shrink debug.log file on client startup (default: 1 when no -debug) +#shrinkdebugfile=1 + +# Append comment to the user agent string +#uacomment= + + +### Chain selection options + + +# Use the chain (default: main). Allowed values: main, test, +# testnet4, signet, regtest +#chain= + +# Use the signet chain. Equivalent to -chain=signet. Note that the network +# is defined by the -signetchallenge parameter +#signet=1 + +# Blocks must satisfy the given script to be considered valid (only for +# signet networks; defaults to the global default signet test +# network challenge) +#signetchallenge=1 + +# Specify a seed node for the signet network, in the hostname[:port] +# format, e.g. sig.net:1234 (may be used multiple times to specify +# multiple seed nodes; defaults to the global default signet test +# network seed node(s)) +#signetseednode=1 + +# Use the testnet3 chain. Equivalent to -chain=test. Support for testnet3 +# is deprecated and will be removed in an upcoming release. +# Consider moving to testnet4 now by using -testnet4. +#testnet=1 + +# Use the testnet4 chain. Equivalent to -chain=testnet4. +#testnet4=1 + + +### Node relay options + + +# Equivalent bytes per sigop in transactions for relay and mining +# (default: 20) +#bytespersigop=1 + +# Relay and mine data carrier transactions (default: 1) +#datacarrier=1 + +# Relay and mine transactions whose data-carrying raw scriptPubKey is of +# this size or less (default: 83) +#datacarriersize=1 + +# Fees (in BTC/kvB) smaller than this are considered zero fee for +# relaying, mining and transaction creation (default: 0.000001) +#minrelaytxfee= + +# Relay transactions creating non-P2SH multisig outputs (default: 1) +#permitbaremultisig=1 + +# Add 'forcerelay' permission to whitelisted peers with default +# permissions. This will relay transactions even if the +# transactions were already in the mempool. (default: 0) +#whitelistforcerelay=1 + +# Add 'relay' permission to whitelisted peers with default permissions. +# This will accept relayed transactions even when not relaying +# transactions (default: 1) +#whitelistrelay=1 + + +### Block creation options + + +# Set maximum BIP141 block weight (default: 4000000) +#blockmaxweight= + +# Set lowest fee rate (in BTC/kvB) for transactions to be included in +# block creation. (default: 0.00000001) +#blockmintxfee= + +# Reserve space for the fixed-size block header plus the largest coinbase +# transaction the mining software may add to the block. (default: +# 8000). +#blockreservedweight= + + +### RPC server options + + +# Accept public REST requests (default: 0) +#rest=1 + +# Allow JSON-RPC connections from specified source. Valid values for +# are a single IP (e.g. 1.2.3.4), a network/netmask (e.g. +# 1.2.3.4/255.255.255.0), a network/CIDR (e.g. 1.2.3.4/24), all +# ipv4 (0.0.0.0/0), or all ipv6 (::/0). This option can be +# specified multiple times +#rpcallowip= + +# Username and HMAC-SHA-256 hashed password for JSON-RPC connections. The +# field comes in the format: :$. A +# canonical python script is included in share/rpcauth. The client +# then connects normally using the +# rpcuser=/rpcpassword= pair of arguments. This +# option can be specified multiple times +#rpcauth= + +# Bind to given address to listen for JSON-RPC connections. Do not expose +# the RPC server to untrusted networks such as the public internet! +# This option is ignored unless -rpcallowip is also passed. Port is +# optional and overrides -rpcport. Use [host]:port notation for +# IPv6. This option can be specified multiple times (default: +# 127.0.0.1 and ::1 i.e., localhost) +#rpcbind=[:port] + +# Location of the auth cookie. Relative paths will be prefixed by a +# net-specific datadir location. (default: data dir) +#rpccookiefile= + +# Set permissions on the RPC auth cookie file so that it is readable by +# [owner|group|all] (default: owner [via umask 0077]) +#rpccookieperms= + +# Password for JSON-RPC connections +#rpcpassword= + +# Listen for JSON-RPC connections on (default: 8332, testnet3: +# 18332, testnet4: 48332, signet: 38332, regtest: 18443) +#rpcport= + +# Set the number of threads to service RPC calls (default: 16) +#rpcthreads= + +# Username for JSON-RPC connections +#rpcuser= + +# Set a whitelist to filter incoming RPC calls for a specific user. The +# field comes in the format: :,,...,. If multiple whitelists are set for a given user, +# they are set-intersected. See -rpcwhitelistdefault documentation +# for information on default whitelist behavior. +#rpcwhitelist= + +# Sets default behavior for rpc whitelisting. Unless rpcwhitelistdefault +# is set to 0, if any -rpcwhitelist is set, the rpc server acts as +# if all rpc users are subject to empty-unless-otherwise-specified +# whitelists. If rpcwhitelistdefault is set to 1 and no +# -rpcwhitelist is set, rpc server acts as if all rpc users are +# subject to empty whitelists. +#rpcwhitelistdefault=1 + +# Accept command line and JSON-RPC commands +#server=1 + + +# [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 testnet3 +[test] + +# Options for testnet4 +[testnet4] + +# Options for signet +[signet] + +# Options for regtest +[regtest] diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 806566e45e2..bf3bb441dd3 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -113,14 +113,24 @@ target_link_libraries(elementssimplicity core_interface ) -# macOS Apple Clang is stricter than Linux GCC on this vendored code -if(APPLE) +# Clang (Apple of upstream) is stricter than Linux GCC on this vendored code +if(CMAKE_C_COMPILER_ID MATCHES "Clang") target_compile_options(elementssimplicity PRIVATE -Wno-error=conditional-uninitialized -Wno-error=implicit-fallthrough ) endif() +# GCC's -Wtype-limits (via -Wextra) flags some of Simplicity's defensive +# runtime asserts as tautological on LLP64 targets (e.g. mingw-w64 win64), +# where uint_fast32_t is narrower than size_t. The checks are intentional, +# not bugs. +if(CMAKE_C_COMPILER_ID STREQUAL "GNU") + target_compile_options(elementssimplicity PRIVATE + -Wno-error=type-limits + ) +endif() + # Set top-level target output locations. if(NOT CMAKE_RUNTIME_OUTPUT_DIRECTORY) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin) @@ -267,6 +277,9 @@ if(ENABLE_WALLET) init/bitcoin-wallet.cpp wallet/wallettool.cpp ) + set_target_properties(elements-wallet PROPERTIES + SKIP_BUILD_RPATH OFF + ) add_windows_resources(elements-wallet bitcoin-wallet-res.rc) target_link_libraries(elements-wallet core_interface @@ -408,6 +421,9 @@ if(BUILD_DAEMON) bitcoind.cpp init/bitcoind.cpp ) + set_target_properties(elementsd PROPERTIES + SKIP_BUILD_RPATH OFF + ) add_windows_resources(elementsd bitcoind-res.rc) target_link_libraries(elementsd core_interface @@ -422,6 +438,9 @@ if(WITH_MULTIPROCESS AND BUILD_DAEMON) bitcoind.cpp init/bitcoin-node.cpp ) + set_target_properties(elements-node PROPERTIES + SKIP_BUILD_RPATH OFF + ) target_link_libraries(elements-node core_interface bitcoin_node @@ -463,6 +482,9 @@ target_link_libraries(bitcoin_cli # Elements Core RPC client if(BUILD_CLI) add_executable(elements-cli bitcoin-cli.cpp) + set_target_properties(elements-cli PROPERTIES + SKIP_BUILD_RPATH OFF + ) add_windows_resources(elements-cli bitcoin-cli-res.rc) target_link_libraries(elements-cli core_interface @@ -479,6 +501,9 @@ endif() if(BUILD_TX) add_executable(elements-tx bitcoin-tx.cpp) add_windows_resources(elements-tx bitcoin-tx-res.rc) + set_target_properties(elements-tx PROPERTIES + SKIP_BUILD_RPATH OFF + ) target_link_libraries(elements-tx core_interface bitcoin_common @@ -493,6 +518,9 @@ endif() if(BUILD_UTIL) add_executable(elements-util bitcoin-util.cpp) add_windows_resources(elements-util bitcoin-util-res.rc) + set_target_properties(elements-util PROPERTIES + SKIP_BUILD_RPATH OFF + ) target_link_libraries(elements-util core_interface bitcoin_common diff --git a/src/assetsdir.cpp b/src/assetsdir.cpp index f69aab80e15..39d8ee6506c 100644 --- a/src/assetsdir.cpp +++ b/src/assetsdir.cpp @@ -36,7 +36,7 @@ void CAssetsDir::SetHex(const std::string& assetHex, const std::string& label) void CAssetsDir::InitFromStrings(const std::vector& assetsToInit, const std::string& pegged_asset_name) { - for (std::string strToSplit : assetsToInit) { + for (const std::string& strToSplit : assetsToInit) { std::vector vAssets; const auto pos = strToSplit.find(':'); if (pos != std::string::npos) { diff --git a/src/bench/CMakeLists.txt b/src/bench/CMakeLists.txt index 1556cc94121..f22f18480c4 100644 --- a/src/bench/CMakeLists.txt +++ b/src/bench/CMakeLists.txt @@ -52,6 +52,10 @@ add_executable(bench_bitcoin xor.cpp ) +set_target_properties(bench_bitcoin PROPERTIES + SKIP_BUILD_RPATH OFF +) + include(TargetDataSources) target_raw_data_sources(bench_bitcoin NAMESPACE benchmark::data data/block413567.raw diff --git a/src/bench/checkqueue.cpp b/src/bench/checkqueue.cpp index 10bd25b6994..6d779d90507 100644 --- a/src/bench/checkqueue.cpp +++ b/src/bench/checkqueue.cpp @@ -52,14 +52,22 @@ static void CCheckQueueSpeedPrevectorJob(benchmark::Bench& bench) vChecks.reserve(BATCH_SIZE); // ELEMENTS: allocate new jobs... for (size_t x = 0; x < BATCH_SIZE; ++x) - vChecks[x] = new PrevectorJob(insecure_rand); + vChecks.push_back(new PrevectorJob(insecure_rand)); } bench.minEpochIterations(10).batch(BATCH_SIZE * BATCHES).unit("job").run([&] { // Make insecure_rand here so that each iteration is identical. CCheckQueueControl control(&queue); - for (auto vChecks : vBatches) { - control.Add(std::move(vChecks)); + for (const auto& vChecks : vBatches) { + // ELEMENTS: the queue takes ownership and deletes each check after + // processing it, so we must give it fresh copies every iteration — + // vBatches itself must stay untouched as the template for all runs. + std::vector vChecksCopy; + vChecksCopy.reserve(vChecks.size()); + for (const auto* check : vChecks) { + vChecksCopy.push_back(new PrevectorJob(*check)); + } + control.Add(std::move(vChecksCopy)); } // control waits for completion by RAII, but // it is done explicitly here for clarity diff --git a/src/bench/mempool_eviction.cpp b/src/bench/mempool_eviction.cpp index de07afaeed3..7e191faede4 100644 --- a/src/bench/mempool_eviction.cpp +++ b/src/bench/mempool_eviction.cpp @@ -18,8 +18,6 @@ #include #include -#include - static void AddTx(const CTransactionRef& tx, const CAmount& nFee, CTxMemPool& pool) EXCLUSIVE_LOCKS_REQUIRED(cs_main, pool.cs) { int64_t nTime = 0; diff --git a/src/bitcoin-cli-res.rc b/src/bitcoin-cli-res.rc index be349cafaa4..7f6ca6e41a0 100644 --- a/src/bitcoin-cli-res.rc +++ b/src/bitcoin-cli-res.rc @@ -14,7 +14,7 @@ BEGIN BEGIN BLOCK "040904E4" // U.S. English - multilingual (hex) BEGIN - VALUE "CompanyName", "Elements Project" + VALUE "CompanyName", CLIENT_NAME " project" VALUE "FileDescription", "elements-cli (JSON-RPC client for " CLIENT_NAME ")" VALUE "FileVersion", CLIENT_VERSION_STRING VALUE "InternalName", "elements-cli" diff --git a/src/bitcoin-tx-res.rc b/src/bitcoin-tx-res.rc index ff9e6a23e29..e14750c05e6 100644 --- a/src/bitcoin-tx-res.rc +++ b/src/bitcoin-tx-res.rc @@ -14,7 +14,7 @@ BEGIN BEGIN BLOCK "040904E4" // U.S. English - multilingual (hex) BEGIN - VALUE "CompanyName", "Elements Project" + VALUE "CompanyName", CLIENT_NAME " project" VALUE "FileDescription", "bitcoin-tx (CLI Elements transaction editor utility)" VALUE "FileVersion", CLIENT_VERSION_STRING VALUE "InternalName", "bitcoin-tx" diff --git a/src/bitcoin-tx.cpp b/src/bitcoin-tx.cpp index 83e6435fc40..8e91a1f7722 100644 --- a/src/bitcoin-tx.cpp +++ b/src/bitcoin-tx.cpp @@ -467,20 +467,20 @@ static void MutateTxAddOutData(CMutableTransaction& tx, const std::string& strIn CAsset asset(Params().GetConsensus().pegged_asset); if (vStrInputParts.size()==1) { - std::string strData = vStrInputParts[0]; + const std::string& strData = vStrInputParts[0]; if (!IsHex(strData)) throw std::runtime_error("invalid TX output data"); data = ParseHex(strData); } else { value = ExtractAndValidateValue(vStrInputParts[0]); - std::string strData = vStrInputParts[1]; + const std::string& strData = vStrInputParts[1]; if (!IsHex(strData)) throw std::runtime_error("invalid TX output data"); data = ParseHex(strData); if (vStrInputParts.size()==3) { - std::string strAsset = vStrInputParts[2]; + const std::string& strAsset = vStrInputParts[2]; if (!IsHex(strAsset)) throw std::runtime_error("invalid TX output asset type"); diff --git a/src/bitcoin-util-res.rc b/src/bitcoin-util-res.rc index e121d17f233..8dda22b77f0 100644 --- a/src/bitcoin-util-res.rc +++ b/src/bitcoin-util-res.rc @@ -14,7 +14,7 @@ BEGIN BEGIN BLOCK "040904E4" // U.S. English - multilingual (hex) BEGIN - VALUE "CompanyName", "Bitcoin" + VALUE "CompanyName", CLIENT_NAME " project" VALUE "FileDescription", "bitcoin-util (CLI Bitcoin utility)" VALUE "FileVersion", CLIENT_VERSION_STRING VALUE "InternalName", "bitcoin-util" diff --git a/src/bitcoin-wallet-res.rc b/src/bitcoin-wallet-res.rc index 4c7895f48d1..cc3f272b3a9 100644 --- a/src/bitcoin-wallet-res.rc +++ b/src/bitcoin-wallet-res.rc @@ -14,7 +14,7 @@ BEGIN BEGIN BLOCK "040904E4" // U.S. English - multilingual (hex) BEGIN - VALUE "CompanyName", "Bitcoin" + VALUE "CompanyName", CLIENT_NAME " project" VALUE "FileDescription", "bitcoin-wallet (CLI tool for " CLIENT_NAME " wallets)" VALUE "FileVersion", CLIENT_VERSION_STRING VALUE "InternalName", "bitcoin-wallet" diff --git a/src/bitcoind-res.rc b/src/bitcoind-res.rc index c7067dd52c0..f6228580549 100644 --- a/src/bitcoind-res.rc +++ b/src/bitcoind-res.rc @@ -14,7 +14,7 @@ BEGIN BEGIN BLOCK "040904E4" // U.S. English - multilingual (hex) BEGIN - VALUE "CompanyName", "Elements Project" + VALUE "CompanyName", CLIENT_NAME " project" VALUE "FileDescription", "elementsd (Elements node with a JSON-RPC server)" VALUE "FileVersion", CLIENT_VERSION_STRING VALUE "InternalName", "elementsd" diff --git a/src/blockencodings.cpp b/src/blockencodings.cpp index 1acc8081074..82bfd8fab30 100644 --- a/src/blockencodings.cpp +++ b/src/blockencodings.cpp @@ -186,7 +186,7 @@ bool PartiallyDownloadedBlock::IsTxAvailable(size_t index) const return txn_available[index] != nullptr; } -ReadStatus PartiallyDownloadedBlock::FillBlock(CBlock& block, const std::vector& vtx_missing, bool check_pow) +ReadStatus PartiallyDownloadedBlock::FillBlock(CBlock& block, const std::vector& vtx_missing, bool segwit_active) { if (header.IsNull()) return READ_STATUS_INVALID; @@ -211,16 +211,11 @@ ReadStatus PartiallyDownloadedBlock::FillBlock(CBlock& block, const std::vector< if (vtx_missing.size() != tx_missing_offset) return READ_STATUS_INVALID; - BlockValidationState state; - CheckBlockFn check_block = m_check_block_mock ? m_check_block_mock : CheckBlock; - if (!check_block(block, state, Params().GetConsensus(), /*fCheckPoW=*/check_pow, /*fCheckMerkleRoot=*/true)) { - // TODO: We really want to just check merkle tree manually here, - // but that is expensive, and CheckBlock caches a block's - // "checked-status" (in the CBlock?). CBlock should be able to - // check its own merkle root and cache that check. - if (state.GetResult() == BlockValidationResult::BLOCK_MUTATED) - return READ_STATUS_FAILED; // Possible Short ID collision - return READ_STATUS_CHECKBLOCK_FAILED; + // Check for possible mutations early now that we have a seemingly good block + IsBlockMutatedFn check_mutated{m_check_block_mutated_mock ? m_check_block_mutated_mock : IsBlockMutated}; + if (check_mutated(/*block=*/block, + /*check_witness_root=*/segwit_active)) { + return READ_STATUS_FAILED; // Possible Short ID collision } LogDebug(BCLog::CMPCTBLOCK, "Successfully reconstructed block %s with %lu txn prefilled, %lu txn from mempool (incl at least %lu from extra pool) and %lu txn requested\n", hash.ToString(), prefilled_count, mempool_count, extra_count, vtx_missing.size()); diff --git a/src/blockencodings.h b/src/blockencodings.h index 187a0bcb174..3a8e2eb4a64 100644 --- a/src/blockencodings.h +++ b/src/blockencodings.h @@ -84,8 +84,6 @@ typedef enum ReadStatus_t READ_STATUS_OK, READ_STATUS_INVALID, // Invalid object, peer is sending bogus crap READ_STATUS_FAILED, // Failed to process object - READ_STATUS_CHECKBLOCK_FAILED, // Used only by FillBlock to indicate a - // failure in CheckBlock. } ReadStatus; class CBlockHeaderAndShortTxIDs { @@ -141,8 +139,8 @@ class PartiallyDownloadedBlock { CBlockHeader header; // Can be overridden for testing - using CheckBlockFn = std::function; - CheckBlockFn m_check_block_mock{nullptr}; + using IsBlockMutatedFn = std::function; + IsBlockMutatedFn m_check_block_mutated_mock{nullptr}; explicit PartiallyDownloadedBlock(CTxMemPool* poolIn) : pool(poolIn) {} @@ -150,7 +148,8 @@ class PartiallyDownloadedBlock { // extra_txn is a list of extra orphan/conflicted/etc transactions to look at ReadStatus InitData(const CBlockHeaderAndShortTxIDs& cmpctblock, const std::vector& extra_txn); bool IsTxAvailable(size_t index) const; - ReadStatus FillBlock(CBlock& block, const std::vector& vtx_missing, bool check_pow = true); + // segwit_active enforces witness mutation checks just before reporting a healthy status + ReadStatus FillBlock(CBlock& block, const std::vector& vtx_missing, bool segwit_active); }; #endif // BITCOIN_BLOCKENCODINGS_H diff --git a/src/chainparams.cpp b/src/chainparams.cpp index f81711e2476..e0484a323fa 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -22,13 +22,13 @@ #include #include #include -#include #include #include #include #include #include +#include // IWYU pragma: keep using util::SplitString; diff --git a/src/chainparamsbase.cpp b/src/chainparamsbase.cpp index 79c0311cd20..aaa7f65f1da 100644 --- a/src/chainparamsbase.cpp +++ b/src/chainparamsbase.cpp @@ -14,6 +14,7 @@ #include #include +#include // IWYU pragma: keep void SetupChainParamsBaseOptions(ArgsManager& argsman) { diff --git a/src/chainparamsbase.h b/src/chainparamsbase.h index 54a35249a66..f52092e11de 100644 --- a/src/chainparamsbase.h +++ b/src/chainparamsbase.h @@ -8,7 +8,6 @@ #include #include -#include #include #include diff --git a/src/checkqueue.h b/src/checkqueue.h index 44d4b308744..0309f82cd92 100644 --- a/src/checkqueue.h +++ b/src/checkqueue.h @@ -128,10 +128,13 @@ class CCheckQueue // execute work if (do_work) { for (T* check : vChecks) { - local_result = (*check)(); - if (local_result.has_value()) break; - delete check; + if (!local_result.has_value()) { + local_result = (*check)(); + } + delete check; // ELEMENTS: always take ownership of popped checks, even ones skipped after a failure } + } else { + for (T* check : vChecks) delete check; // ELEMENTS: queue already failed; still own and free these } vChecks.clear(); } while (true); diff --git a/src/coins.h b/src/coins.h index 8e797087836..83055bb5399 100644 --- a/src/coins.h +++ b/src/coins.h @@ -131,7 +131,7 @@ struct CCoinsCacheEntry //! Adding a flag requires a reference to the sentinel of the flagged pair linked list. static void AddFlags(uint8_t flags, CoinsCachePair& pair, CoinsCachePair& sentinel) noexcept { - Assume(flags & (DIRTY | FRESH)); + Assume(flags & (DIRTY | FRESH | PEGIN)); // ELEMENTS: PEGIN may be set on its own if (!pair.second.m_flags) { Assume(!pair.second.m_prev && !pair.second.m_next); pair.second.m_prev = sentinel.second.m_prev; @@ -388,7 +388,7 @@ class CCoinsViewCache : public CCoinsViewBacked * declared as "const". */ mutable uint256 hashBlock; - mutable CCoinsMapMemoryResource m_cache_coins_memory_resource{}; + mutable CCoinsMapMemoryResource m_cache_coins_memory_resource{ /*chunk_size_bytes=*/(sizeof(CoinsCachePair) + sizeof(void*) * 4) * 1024}; /* The starting sentinel of the flagged entry circular doubly linked list. */ mutable CoinsCachePair m_sentinel; mutable CCoinsMap cacheCoins; diff --git a/src/common/args.cpp b/src/common/args.cpp index 80e353ec925..0fb2369a1fb 100644 --- a/src/common/args.cpp +++ b/src/common/args.cpp @@ -39,6 +39,7 @@ #include #include #include +#include // IWYU pragma: keep #ifdef LIQUID const char * const BITCOIN_CONF_FILENAME = "liquid.conf"; diff --git a/src/common/netif.cpp b/src/common/netif.cpp index 7424f977c7e..276be8e2f6a 100644 --- a/src/common/netif.cpp +++ b/src/common/netif.cpp @@ -29,6 +29,8 @@ #include #endif +#include + namespace { // Linux and FreeBSD 14.0+. For FreeBSD 13.2 the code can be compiled but @@ -93,7 +95,9 @@ std::optional QueryDefaultGatewayImpl(sa_family_t family) return std::nullopt; } - for (nlmsghdr* hdr = (nlmsghdr*)response; NLMSG_OK(hdr, recv_result); hdr = NLMSG_NEXT(hdr, recv_result)) { + using recv_result_t = std::conditional_t, int64_t, decltype(NLMSG_HDRLEN)>; + + for (nlmsghdr* hdr = (nlmsghdr*)response; NLMSG_OK(hdr, static_cast(recv_result)); hdr = NLMSG_NEXT(hdr, recv_result)) { rtmsg* r = (rtmsg*)NLMSG_DATA(hdr); int remaining_len = RTM_PAYLOAD(hdr); diff --git a/src/confidential_validation.cpp b/src/confidential_validation.cpp index 359b93ea9fc..915bbb48a7f 100644 --- a/src/confidential_validation.cpp +++ b/src/confidential_validation.cpp @@ -86,7 +86,7 @@ std::optional> CSurjectionCheck::operator()( error = SCRIPT_ERR_SURJECTION; return std::make_pair(error, std::move(debug_str)); } - + return std::nullopt; } diff --git a/src/crypto/CMakeLists.txt b/src/crypto/CMakeLists.txt index 1109806a776..92653ade5a7 100644 --- a/src/crypto/CMakeLists.txt +++ b/src/crypto/CMakeLists.txt @@ -47,7 +47,7 @@ if(HAVE_SSE41 AND HAVE_X86_SHANI) target_compile_definitions(bitcoin_crypto PRIVATE ENABLE_SSE41 ENABLE_X86_SHANI) target_sources(bitcoin_crypto PRIVATE sha256_x86_shani.cpp) set_property(SOURCE sha256_x86_shani.cpp PROPERTY - COMPILE_OPTIONS ${X86_SHANI_CXXFLAGS} + COMPILE_OPTIONS ${SSE41_CXXFLAGS} ${X86_SHANI_CXXFLAGS} ) endif() diff --git a/src/crypto/sha256.cpp b/src/crypto/sha256.cpp index f5cb7fa80fc..97d5b5568fa 100644 --- a/src/crypto/sha256.cpp +++ b/src/crypto/sha256.cpp @@ -627,7 +627,7 @@ std::string SHA256AutoDetect(sha256_implementation::UseImplementation use_implem Transform = sha256_x86_shani::Transform; TransformD64 = TransformD64Wrapper; TransformD64_2way = sha256d64_x86_shani::Transform_2way; - ret = "x86_shani(1way,2way)"; + ret = "x86_shani(1way;2way)"; have_sse4 = false; // Disable SSE4/AVX2; have_avx2 = false; } @@ -641,14 +641,14 @@ std::string SHA256AutoDetect(sha256_implementation::UseImplementation use_implem #endif #if defined(ENABLE_SSE41) TransformD64_4way = sha256d64_sse41::Transform_4way; - ret += ",sse41(4way)"; + ret += ";sse41(4way)"; #endif } #if defined(ENABLE_AVX2) if (have_avx2 && have_avx && enabled_avx) { TransformD64_8way = sha256d64_avx2::Transform_8way; - ret += ",avx2(8way)"; + ret += ";avx2(8way)"; } #endif #endif // defined(HAVE_GETCPUID) @@ -682,7 +682,7 @@ std::string SHA256AutoDetect(sha256_implementation::UseImplementation use_implem Transform = sha256_arm_shani::Transform; TransformD64 = TransformD64Wrapper; TransformD64_2way = sha256d64_arm_shani::Transform_2way; - ret = "arm_shani(1way,2way)"; + ret = "arm_shani(1way;2way)"; } #endif #endif // DISABLE_OPTIMIZED_SHA256 diff --git a/src/crypto/sha256_sse4.cpp b/src/crypto/sha256_sse4.cpp index f0e255a23cb..f68e226138e 100644 --- a/src/crypto/sha256_sse4.cpp +++ b/src/crypto/sha256_sse4.cpp @@ -13,13 +13,17 @@ namespace sha256_sse4 { void Transform(uint32_t* s, const unsigned char* chunk, size_t blocks) -#if defined(__clang__) && !defined(__OPTIMIZE__) +#if defined(__clang__) /* clang is unable to compile this with -O0 and -fsanitize=address. - See upstream bug: https://github.com/llvm/llvm-project/issues/92182 + See upstream bug: https://github.com/llvm/llvm-project/issues/92182. + This also fails to compile with -O2, -fcf-protection & -fsanitize=address. + See https://github.com/bitcoin/bitcoin/issues/31913. */ +#if __has_feature(address_sanitizer) __attribute__((no_sanitize("address"))) #endif +#endif { static const uint32_t K256 alignas(16) [] = { 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, diff --git a/src/dbwrapper.cpp b/src/dbwrapper.cpp index 8fb366515af..2341545b631 100644 --- a/src/dbwrapper.cpp +++ b/src/dbwrapper.cpp @@ -251,7 +251,7 @@ CDBWrapper::CDBWrapper(const DBParams& params) if (params.options.force_compact) { LogPrintf("Starting database compaction of %s\n", fs::PathToString(params.path)); - DBContext().pdb->CompactRange(nullptr, nullptr); + CompactFull(); LogPrintf("Finished database compaction of %s\n", fs::PathToString(params.path)); } @@ -306,11 +306,18 @@ bool CDBWrapper::WriteBatch(CDBBatch& batch, bool fSync) return true; } +std::optional CDBWrapper::GetProperty(const std::string& property) const +{ + if (std::string value; DBContext().pdb->GetProperty(property, &value)) return value; + return std::nullopt; +} + +void CDBWrapper::CompactFull() { DBContext().pdb->CompactRange(nullptr, nullptr); } + size_t CDBWrapper::DynamicMemoryUsage() const { - std::string memory; std::optional parsed; - if (!DBContext().pdb->GetProperty("leveldb.approximate-memory-usage", &memory) || !(parsed = ToIntegral(memory))) { + if (auto memory{GetProperty("leveldb.approximate-memory-usage")}; !memory || !(parsed = ToIntegral(*memory))) { LogDebug(BCLog::LEVELDB, "Failed to get approximate-memory-usage property\n"); return 0; } diff --git a/src/dbwrapper.h b/src/dbwrapper.h index dd5daa7a1fc..08081c1a0d4 100644 --- a/src/dbwrapper.h +++ b/src/dbwrapper.h @@ -273,6 +273,12 @@ class CDBWrapper bool WriteBatch(CDBBatch& batch, bool fSync = false); + //! Perform a blocking full compaction of the underlying LevelDB. + void CompactFull(); + + //! Return a LevelDB property value, if available. + std::optional GetProperty(const std::string& property) const; + // Get an estimate of LevelDB memory usage (in bytes). size_t DynamicMemoryUsage() const; diff --git a/src/index/base.cpp b/src/index/base.cpp index 1169a1c86b7..e08f9083992 100644 --- a/src/index/base.cpp +++ b/src/index/base.cpp @@ -253,18 +253,13 @@ bool BaseIndex::Rewind(const CBlockIndex* current_tip, const CBlockIndex* new_ti return false; } - // In the case of a reorg, ensure persisted block locator is not stale. + // Don't commit here - the committed index state must never be ahead of the + // flushed chainstate, otherwise unclean restarts would lead to index corruption. // Pruning has a minimum of 288 blocks-to-keep and getting the index // out of sync may be possible but a users fault. // In case we reorg beyond the pruned depth, ReadBlock would // throw and lead to a graceful shutdown SetBestBlockIndex(new_tip); - if (!Commit()) { - // If commit fails, revert the best block index to avoid corruption. - SetBestBlockIndex(current_tip); - return false; - } - return true; } diff --git a/src/init.cpp b/src/init.cpp index 971796080ed..cd8b3967d99 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -983,7 +983,7 @@ bool AppInitParameterInteraction(const ArgsManager& args) if (chain.chain_type == ChainType::TESTNET) { LogInfo("Warning: Support for testnet3 is deprecated and will be removed in an upcoming release. Consider switching to testnet4.\n"); } - + if (!fs::is_directory(args.GetBlocksDirPath())) { return InitError(strprintf(_("Specified blocks directory \"%s\" does not exist."), args.GetArg("-blocksdir", ""))); } @@ -1146,7 +1146,7 @@ bool AppInitParameterInteraction(const ArgsManager& args) } catch (const std::exception& e) { return InitError(Untranslated(strprintf("Error in -assetdir: %s\n", e.what()))); } - + const std::vector test_options = args.GetArgs("-test"); if (!test_options.empty()) { if (chainparams.GetChainTypeMeta().chain_type != ChainType::REGTEST && chainparams.GetChainTypeMeta().chain_type != ChainType::CUSTOM) { @@ -1515,7 +1515,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info) node.scheduler = std::make_unique(); assert(!node.reverification_scheduler); node.reverification_scheduler = std::make_unique(); - + auto& scheduler = *node.scheduler; // Start the lightweight task scheduler thread @@ -1537,6 +1537,15 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info) } }, std::chrono::minutes{5}); + if (args.GetBoolArg("-logratelimit", BCLog::DEFAULT_LOGRATELIMIT)) { + LogInstance().SetRateLimiting(BCLog::LogRateLimiter::Create( + [&scheduler](auto func, auto window) { scheduler.scheduleEvery(std::move(func), window); }, + BCLog::RATELIMIT_MAX_BYTES, + BCLog::RATELIMIT_WINDOW)); + } else { + LogInfo("Log rate limiting disabled"); + } + assert(!node.validation_signals); node.validation_signals = std::make_unique(std::make_unique(scheduler)); auto& validation_signals = *node.validation_signals; @@ -1572,7 +1581,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info) // ELEMENTS: policyAsset = CAsset(uint256S(gArgs.GetArg("-feeasset", chainparams.GetConsensus().pegged_asset.GetHex()))); - + // Check port numbers if (!CheckHostPortOptions(args)) return false; diff --git a/src/init/common.cpp b/src/init/common.cpp index 7191854c747..362db9d40d0 100644 --- a/src/init/common.cpp +++ b/src/init/common.cpp @@ -38,6 +38,7 @@ void AddLoggingArgs(ArgsManager& argsman) argsman.AddArg("-logsourcelocations", strprintf("Prepend debug output with name of the originating source location (source file, line number and function name) (default: %u)", DEFAULT_LOGSOURCELOCATIONS), ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST); argsman.AddArg("-logtimemicros", strprintf("Add microsecond precision to debug timestamps (default: %u)", DEFAULT_LOGTIMEMICROS), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST); argsman.AddArg("-loglevelalways", strprintf("Always prepend a category and level (default: %u)", DEFAULT_LOGLEVELALWAYS), ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST); + argsman.AddArg("-logratelimit", strprintf("Apply rate limiting to unconditional logging to mitigate disk-filling attacks (default: %u)", BCLog::DEFAULT_LOGRATELIMIT), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST); argsman.AddArg("-printtoconsole", "Send trace/debug info to console (default: 1 when no -daemon. To disable logging to file, set -nodebuglogfile)", ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST); argsman.AddArg("-shrinkdebugfile", "Shrink debug.log file on client startup (default: 1 when no -debug)", ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST); } diff --git a/src/kernel/CMakeLists.txt b/src/kernel/CMakeLists.txt index dd9333fbb82..692cac0af44 100644 --- a/src/kernel/CMakeLists.txt +++ b/src/kernel/CMakeLists.txt @@ -27,6 +27,13 @@ add_library(bitcoinkernel ../chainparams.cpp ../coins.cpp ../common/bloom.cpp + ../common/args.cpp + ../mainchainrpc.cpp + ../chainparams.cpp + ../chainparamsbase.cpp + ../coins.cpp + ../common/config.cpp + ../common/settings.cpp ../compressor.cpp ../confidential_validation.cpp ../consensus/merkle.cpp @@ -41,7 +48,8 @@ add_library(bitcoinkernel ../hash.cpp ../issuance.cpp ../logging.cpp - ../mainchainrpc.cpp + ../addresstype.cpp + ../key.cpp ../merkleblock.cpp ../node/blockstorage.cpp ../node/chainstate.cpp @@ -76,6 +84,7 @@ add_library(bitcoinkernel ../script/sign.cpp ../script/signingprovider.cpp ../script/solver.cpp + ../script/miniscript.cpp ../signet.cpp ../streams.cpp ../support/lockedpool.cpp @@ -113,6 +122,10 @@ target_link_libraries(bitcoinkernel elementssimplicity univalue $ + $ + $ + $ + $ PUBLIC Boost::headers ) diff --git a/src/kernel/chainparams.cpp b/src/kernel/chainparams.cpp index c677917adc9..a704746ba27 100644 --- a/src/kernel/chainparams.cpp +++ b/src/kernel/chainparams.cpp @@ -34,6 +34,7 @@ #include #include +#include // IWYU pragma: keep using util::SplitString; using namespace util::hex_literals; @@ -299,7 +300,6 @@ class CMainParams : public CChainParams { // release ASAP to avoid it where possible. vSeeds.emplace_back("seed.bitcoin.sipa.be."); // Pieter Wuille, only supports x1, x5, x9, and xd vSeeds.emplace_back("dnsseed.bluematt.me."); // Matt Corallo, only supports x9 - vSeeds.emplace_back("dnsseed.bitcoin.dashjr-list-of-p2p-nodes.us."); // Luke Dashjr vSeeds.emplace_back("seed.bitcoin.jonasschnelli.ch."); // Jonas Schnelli, only supports x1, x5, x9, and xd vSeeds.emplace_back("seed.btc.petertodd.net."); // Peter Todd, only supports x1, x5, x9, and xd vSeeds.emplace_back("seed.bitcoin.sprovoost.nl."); // Sjors Provoost @@ -538,10 +538,24 @@ class CTestNet4Params : public CChainParams { consensus.vDeployments[Consensus::DEPLOYMENT_SIMPLICITY].nStartTime = Consensus::BIP9Deployment::NEVER_ACTIVE; consensus.vDeployments[Consensus::DEPLOYMENT_SIMPLICITY].nTimeout = Consensus::BIP9Deployment::NO_TIMEOUT; consensus.vDeployments[Consensus::DEPLOYMENT_SIMPLICITY].min_activation_height = 0; // No activation delay - + consensus.nMinimumChainWork = uint256{"0000000000000000000000000000000000000000000001d6dce8651b6094e4c1"}; consensus.defaultAssumeValid = uint256{"0000000000003ed4f08dbdf6f7d6b271a6bcffce25675cb40aa9fa43179a89f3"}; // 72600 + consensus.genesis_subsidy = 50*COIN; + consensus.connect_genesis_outputs = false; + consensus.subsidy_asset = CAsset(); + anyonecanspend_aremine = false; + enforce_pak = false; + accept_unlimited_issuances = false; + multi_data_permitted = false; + accept_discount_ct = false; + create_discount_ct = false; + pegin_subsidy = PeginSubsidy(); + pegin_minimum = PeginMinimum(); + consensus.has_parent_chain = false; + g_signed_blocks = false; + pchMessageStart[0] = 0x1c; pchMessageStart[1] = 0x16; pchMessageStart[2] = 0x3f; diff --git a/src/kernel/chainparams.h b/src/kernel/chainparams.h index 7e684219bee..b71d1ac459e 100644 --- a/src/kernel/chainparams.h +++ b/src/kernel/chainparams.h @@ -28,6 +28,7 @@ #include #include #include +#include // IWYU pragma: keep typedef std::map MapCheckpoints; @@ -106,6 +107,7 @@ struct PeginMinimum { class CChainParams { public: + virtual ~CChainParams() = default; // required: subclasses are stored and destroyed via std::unique_ptr enum Base58Type { PUBKEY_ADDRESS, SCRIPT_ADDRESS, diff --git a/src/kernel/mempool_entry.h b/src/kernel/mempool_entry.h index d7761308748..08eff52fff2 100644 --- a/src/kernel/mempool_entry.h +++ b/src/kernel/mempool_entry.h @@ -105,7 +105,7 @@ class CTxMemPoolEntry int64_t nSizeWithAncestors; CAmount nModFeesWithAncestors; int64_t nSigOpCostWithAncestors; - uint64_t discountSizeWithAncestors; // ELEMENTS + int64_t discountSizeWithAncestors; // ELEMENTS public: CTxMemPoolEntry(const CTransactionRef& tx, CAmount fee, @@ -129,7 +129,7 @@ class CTxMemPoolEntry nSizeWithAncestors{GetTxSize()}, nModFeesWithAncestors{nFee}, nSigOpCostWithAncestors{sigOpCost}, - discountSizeWithAncestors{GetDiscountTxSize()}, + discountSizeWithAncestors{static_cast(GetDiscountTxSize())}, setPeginsSpent(setPeginsSpent) {}; CTxMemPoolEntry(ExplicitCopyTag, const CTxMemPoolEntry& entry) : CTxMemPoolEntry(entry) {} @@ -190,7 +190,7 @@ class CTxMemPoolEntry uint64_t GetCountWithAncestors() const { return m_count_with_ancestors; } int64_t GetSizeWithAncestors() const { return nSizeWithAncestors; } - uint64_t GetDiscountSizeWithAncestors() const { return discountSizeWithAncestors; } + int64_t GetDiscountSizeWithAncestors() const { return discountSizeWithAncestors; } CAmount GetModFeesWithAncestors() const { return nModFeesWithAncestors; } int64_t GetSigOpCostWithAncestors() const { return nSigOpCostWithAncestors; } diff --git a/src/leveldb/db/autocompact_test.cc b/src/leveldb/db/autocompact_test.cc index e6c97a05a6b..f6e714c6524 100644 --- a/src/leveldb/db/autocompact_test.cc +++ b/src/leveldb/db/autocompact_test.cc @@ -54,8 +54,8 @@ static const int kValueSize = 200 * 1024; static const int kTotalSize = 100 * 1024 * 1024; static const int kCount = kTotalSize / kValueSize; -// Read through the first n keys repeatedly and check that they get -// compacted (verified by checking the size of the key space). +// Read through the first n keys repeatedly and check that reads do NOT +// trigger compaction (seek compaction is disabled in this fork). void AutoCompactTest::DoReads(int n) { std::string value(kValueSize, 'x'); DBImpl* dbi = reinterpret_cast(db_); @@ -76,25 +76,23 @@ void AutoCompactTest::DoReads(int n) { const int64_t initial_size = Size(Key(0), Key(n)); const int64_t initial_other_size = Size(Key(n), Key(kCount)); - // Read until size drops significantly. + // Read repeatedly. The size of the read range must NOT shrink: with + // seek compaction disabled, reads never schedule a compaction. std::string limit_key = Key(n); - for (int read = 0; true; read++) { - ASSERT_LT(read, 100) << "Taking too long to compact"; + for (int read = 0; read < 100; read++) { Iterator* iter = db_->NewIterator(ReadOptions()); for (iter->SeekToFirst(); iter->Valid() && iter->key().ToString() < limit_key; iter->Next()) { // Drop data } delete iter; - // Wait a little bit to allow any triggered compactions to complete. - Env::Default()->SleepForMicroseconds(1000000); uint64_t size = Size(Key(0), Key(n)); fprintf(stderr, "iter %3d => %7.3f MB [other %7.3f MB]\n", read + 1, size / 1048576.0, Size(Key(n), Key(kCount)) / 1048576.0); - if (size <= initial_size / 10) { - break; - } } + // Give any background work a chance to run, even though none should. + Env::Default()->SleepForMicroseconds(1000000); + ASSERT_EQ(Size(Key(0), Key(n)), static_cast(initial_size)); // Verify that the size of the key space not touched by the reads // is pretty much unchanged. diff --git a/src/leveldb/db/db_test.cc b/src/leveldb/db/db_test.cc index beb1d3bdef6..81fb9e94ebf 100644 --- a/src/leveldb/db/db_test.cc +++ b/src/leveldb/db/db_test.cc @@ -735,15 +735,14 @@ TEST(DBTest, GetPicksCorrectFile) { } while (ChangeOptions()); } -TEST(DBTest, GetEncountersEmptyLevel) { +TEST(DBTest, GetDoesNotTriggerSeekCompaction) { do { // Arrange for the following to happen: // * sstable A in level 0 // * nothing in level 1 // * sstable B in level 2 - // Then do enough Get() calls to arrange for an automatic compaction - // of sstable A. A bug would cause the compaction to be marked as - // occurring at level 1 (instead of the correct level 0). + // Seek compaction is disabled in this fork, so repeated reads must + // not change the level layout. A manual compaction must still work. // Step 1: First place sstables in levels 0 and 2 int compaction_count = 0; @@ -761,14 +760,17 @@ TEST(DBTest, GetEncountersEmptyLevel) { ASSERT_EQ(NumTableFilesAtLevel(1), 0); ASSERT_EQ(NumTableFilesAtLevel(2), 1); - // Step 3: read a bunch of times + // Step 3: many read misses must not schedule any compaction. for (int i = 0; i < 1000; i++) { ASSERT_EQ("NOT_FOUND", Get("missing")); } - - // Step 4: Wait for compaction to finish DelayMilliseconds(1000); + ASSERT_EQ(NumTableFilesAtLevel(0), 1); + ASSERT_EQ(NumTableFilesAtLevel(1), 0); + ASSERT_EQ(NumTableFilesAtLevel(2), 1); + // Step 4: a manual compaction still moves the L0 file down. + dbfull()->TEST_CompactRange(0, nullptr, nullptr); ASSERT_EQ(NumTableFilesAtLevel(0), 0); } while (ChangeOptions()); } diff --git a/src/leveldb/db/version_set.cc b/src/leveldb/db/version_set.cc index cd07346ea8a..8dc73295b84 100644 --- a/src/leveldb/db/version_set.cc +++ b/src/leveldb/db/version_set.cc @@ -400,16 +400,11 @@ Status Version::Get(const ReadOptions& options, const LookupKey& k, return state.found ? state.s : Status::NotFound(Slice()); } -bool Version::UpdateStats(const GetStats& stats) { - FileMetaData* f = stats.seek_file; - if (f != nullptr) { - f->allowed_seeks--; - if (f->allowed_seeks <= 0 && file_to_compact_ == nullptr) { - file_to_compact_ = f; - file_to_compact_level_ = stats.seek_file_level; - return true; - } - } +bool Version::UpdateStats(const GetStats& /*stats*/) { + // Disable automatic compactions triggered by read seek counters. + // The heuristic was tuned for expensive random seeks and can create + // severe write amplification on large random-key databases. + // Size and manual compactions still run. return false; } @@ -661,6 +656,8 @@ class VersionSet::Builder { // same as the compaction of 40KB of data. We are a little // conservative and allow approximately one seek for every 16KB // of data before triggering a compaction. + // + // Note: seek compactions are disabled. See Version::UpdateStats. f->allowed_seeks = static_cast((f->file_size / 16384U)); if (f->allowed_seeks < 100) f->allowed_seeks = 100; diff --git a/src/logging.cpp b/src/logging.cpp index 5f055566ef5..2ed6835197b 100644 --- a/src/logging.cpp +++ b/src/logging.cpp @@ -12,8 +12,10 @@ #include #include +#include #include #include +#include using util::Join; using util::RemovePrefixView; @@ -73,12 +75,12 @@ bool BCLog::Logger::StartLogging() // dump buffered messages from before we opened the log m_buffering = false; if (m_buffer_lines_discarded > 0) { - LogPrintStr_(strprintf("Early logging buffer overflowed, %d log lines discarded.\n", m_buffer_lines_discarded), __func__, __FILE__, __LINE__, BCLog::ALL, Level::Info); + LogPrintStr_(strprintf("Early logging buffer overflowed, %d log lines discarded.\n", m_buffer_lines_discarded), std::source_location::current(), BCLog::ALL, Level::Info, /*should_ratelimit=*/false); } while (!m_msgs_before_open.empty()) { const auto& buflog = m_msgs_before_open.front(); std::string s{buflog.str}; - FormatLogStrInPlace(s, buflog.category, buflog.level, buflog.source_file, buflog.source_line, buflog.logging_function, buflog.threadname, buflog.now, buflog.mocktime); + FormatLogStrInPlace(s, buflog.category, buflog.level, buflog.source_loc, buflog.threadname, buflog.now, buflog.mocktime); m_msgs_before_open.pop_front(); if (m_print_to_file) FileWriteStr(s, m_fileout); @@ -364,17 +366,50 @@ std::string BCLog::Logger::GetLogPrefix(BCLog::LogFlags category, BCLog::Level l static size_t MemUsage(const BCLog::Logger::BufferedLog& buflog) { - return buflog.str.size() + buflog.logging_function.size() + buflog.source_file.size() + buflog.threadname.size() + memusage::MallocUsage(sizeof(memusage::list_node)); + return memusage::DynamicUsage(buflog.str) + + memusage::DynamicUsage(buflog.threadname) + + memusage::MallocUsage(sizeof(memusage::list_node)); } -void BCLog::Logger::FormatLogStrInPlace(std::string& str, BCLog::LogFlags category, BCLog::Level level, std::string_view source_file, int source_line, std::string_view logging_function, std::string_view threadname, SystemClock::time_point now, std::chrono::seconds mocktime) const +BCLog::LogRateLimiter::LogRateLimiter(uint64_t max_bytes, std::chrono::seconds reset_window) + : m_max_bytes{max_bytes}, m_reset_window{reset_window} {} + +std::shared_ptr BCLog::LogRateLimiter::Create( + SchedulerFunction&& scheduler_func, uint64_t max_bytes, std::chrono::seconds reset_window) +{ + auto limiter{std::shared_ptr(new LogRateLimiter(max_bytes, reset_window))}; + std::weak_ptr weak_limiter{limiter}; + auto reset = [weak_limiter] { + if (auto shared_limiter{weak_limiter.lock()}) shared_limiter->Reset(); + }; + scheduler_func(reset, limiter->m_reset_window); + return limiter; +} + +BCLog::LogRateLimiter::Status BCLog::LogRateLimiter::Consume( + const std::source_location& source_loc, + const std::string& str) +{ + StdLockGuard scoped_lock(m_mutex); + auto& stats{m_source_locations.try_emplace(source_loc, m_max_bytes).first->second}; + Status status{stats.m_dropped_bytes > 0 ? Status::STILL_SUPPRESSED : Status::UNSUPPRESSED}; + + if (!stats.Consume(str.size()) && status == Status::UNSUPPRESSED) { + status = Status::NEWLY_SUPPRESSED; + m_suppression_active = true; + } + + return status; +} + +void BCLog::Logger::FormatLogStrInPlace(std::string& str, BCLog::LogFlags category, BCLog::Level level, const std::source_location& source_loc, std::string_view threadname, SystemClock::time_point now, std::chrono::seconds mocktime) const { if (!str.ends_with('\n')) str.push_back('\n'); str.insert(0, GetLogPrefix(category, level)); if (m_log_sourcelocations) { - str.insert(0, strprintf("[%s:%d] [%s] ", RemovePrefixView(source_file, "./"), source_line, logging_function)); + str.insert(0, strprintf("[%s:%d] [%s] ", RemovePrefixView(source_loc.file_name(), "./"), source_loc.line(), source_loc.function_name())); } if (m_log_threadnames) { @@ -384,28 +419,27 @@ void BCLog::Logger::FormatLogStrInPlace(std::string& str, BCLog::LogFlags catego str.insert(0, LogTimestampStr(now, mocktime)); } -void BCLog::Logger::LogPrintStr(std::string_view str, std::string_view logging_function, std::string_view source_file, int source_line, BCLog::LogFlags category, BCLog::Level level) +void BCLog::Logger::LogPrintStr(std::string_view str, std::source_location&& source_loc, BCLog::LogFlags category, BCLog::Level level, bool should_ratelimit) { StdLockGuard scoped_lock(m_cs); - return LogPrintStr_(str, logging_function, source_file, source_line, category, level); + return LogPrintStr_(str, std::move(source_loc), category, level, should_ratelimit); } -void BCLog::Logger::LogPrintStr_(std::string_view str, std::string_view logging_function, std::string_view source_file, int source_line, BCLog::LogFlags category, BCLog::Level level) +// NOLINTNEXTLINE(misc-no-recursion) +void BCLog::Logger::LogPrintStr_(std::string_view str, std::source_location&& source_loc, BCLog::LogFlags category, BCLog::Level level, bool should_ratelimit) { std::string str_prefixed = LogEscapeMessage(str); if (m_buffering) { { BufferedLog buf{ - .now=SystemClock::now(), - .mocktime=GetMockTime(), - .str=str_prefixed, - .logging_function=std::string(logging_function), - .source_file=std::string(source_file), - .threadname=util::ThreadGetInternalName(), - .source_line=source_line, - .category=category, - .level=level, + .now = SystemClock::now(), + .mocktime = GetMockTime(), + .str = str_prefixed, + .threadname = util::ThreadGetInternalName(), + .source_loc = std::move(source_loc), + .category = category, + .level = level, }; m_cur_buffer_memusage += MemUsage(buf); m_msgs_before_open.push_back(std::move(buf)); @@ -424,7 +458,31 @@ void BCLog::Logger::LogPrintStr_(std::string_view str, std::string_view logging_ return; } - FormatLogStrInPlace(str_prefixed, category, level, source_file, source_line, logging_function, util::ThreadGetInternalName(), SystemClock::now(), GetMockTime()); + FormatLogStrInPlace(str_prefixed, category, level, source_loc, util::ThreadGetInternalName(), SystemClock::now(), GetMockTime()); + bool ratelimit{false}; + if (should_ratelimit && m_limiter) { + auto status{m_limiter->Consume(source_loc, str_prefixed)}; + if (status == LogRateLimiter::Status::NEWLY_SUPPRESSED) { + // NOLINTNEXTLINE(misc-no-recursion) + LogPrintStr_(strprintf( + "Excessive logging detected from %s:%d (%s): >%d bytes logged during " + "the last time window of %is. Suppressing logging to disk from this " + "source location until time window resets. Console logging " + "unaffected. Last log entry.", + source_loc.file_name(), source_loc.line(), source_loc.function_name(), + m_limiter->m_max_bytes, + Ticks(m_limiter->m_reset_window)), + std::source_location::current(), LogFlags::ALL, Level::Warning, /*should_ratelimit=*/false); // with should_ratelimit=false, this cannot lead to infinite recursion + } else if (status == LogRateLimiter::Status::STILL_SUPPRESSED) { + ratelimit = true; + } + } + + // To avoid confusion caused by dropped log messages when debugging an issue, + // we prefix log lines with "[*]" when there are any suppressed source locations. + if (m_limiter && m_limiter->SuppressionsActive()) { + str_prefixed.insert(0, "[*] "); + } if (m_print_to_console) { // print to console @@ -434,7 +492,7 @@ void BCLog::Logger::LogPrintStr_(std::string_view str, std::string_view logging_ for (const auto& cb : m_print_callbacks) { cb(str_prefixed); } - if (m_print_to_file) { + if (m_print_to_file && !ratelimit) { assert(m_fileout != nullptr); // reopen the log file, if requested @@ -492,6 +550,36 @@ void BCLog::Logger::ShrinkDebugFile() fclose(file); } +void BCLog::LogRateLimiter::Reset() +{ + decltype(m_source_locations) source_locations; + { + StdLockGuard scoped_lock(m_mutex); + source_locations.swap(m_source_locations); + m_suppression_active = false; + } + for (const auto& [source_loc, stats] : source_locations) { + if (stats.m_dropped_bytes == 0) continue; + LogPrintLevel_( + LogFlags::ALL, Level::Warning, /*should_ratelimit=*/false, + "Restarting logging from %s:%d (%s): %d bytes were dropped during the last %ss.", + source_loc.file_name(), source_loc.line(), source_loc.function_name(), + stats.m_dropped_bytes, Ticks(m_reset_window)); + } +} + +bool BCLog::LogRateLimiter::Stats::Consume(uint64_t bytes) +{ + if (bytes > m_available_bytes) { + m_dropped_bytes += bytes; + m_available_bytes = 0; + return false; + } + + m_available_bytes -= bytes; + return true; +} + bool BCLog::Logger::SetLogLevel(std::string_view level_str) { const auto level = GetLogLevel(level_str); diff --git a/src/logging.h b/src/logging.h index fdc12c79b32..723aeb790fb 100644 --- a/src/logging.h +++ b/src/logging.h @@ -6,6 +6,7 @@ #ifndef BITCOIN_LOGGING_H #define BITCOIN_LOGGING_H +#include #include #include #include @@ -14,11 +15,15 @@ #include #include +#include #include #include +#include #include +#include #include #include +#include #include static const bool DEFAULT_LOGTIMEMICROS = false; @@ -31,6 +36,24 @@ extern const char * const DEFAULT_DEBUGLOGFILE; extern bool fLogIPs; +struct SourceLocationEqual { + bool operator()(const std::source_location& lhs, const std::source_location& rhs) const noexcept + { + return lhs.line() == rhs.line() && std::string_view(lhs.file_name()) == std::string_view(rhs.file_name()); + } +}; + +struct SourceLocationHasher { + size_t operator()(const std::source_location& s) const noexcept + { + // Use CSipHasher(0, 0) as a simple way to get uniform distribution. + return size_t(CSipHasher(0, 0) + .Write(s.line()) + .Write(MakeUCharSpan(std::string_view{s.file_name()})) + .Finalize()); + } +}; + struct LogCategory { std::string category; bool active; @@ -82,6 +105,69 @@ namespace BCLog { }; constexpr auto DEFAULT_LOG_LEVEL{Level::Debug}; constexpr size_t DEFAULT_MAX_LOG_BUFFER{1'000'000}; // buffer up to 1MB of log data prior to StartLogging + constexpr uint64_t RATELIMIT_MAX_BYTES{1024 * 1024}; // maximum number of bytes per source location that can be logged within the RATELIMIT_WINDOW + constexpr auto RATELIMIT_WINDOW{1h}; // time window after which log ratelimit stats are reset + constexpr bool DEFAULT_LOGRATELIMIT{true}; + + //! Fixed window rate limiter for logging. + class LogRateLimiter + { + public: + //! Keeps track of an individual source location and how many available bytes are left for logging from it. + struct Stats { + //! Remaining bytes + uint64_t m_available_bytes; + //! Number of bytes that were consumed but didn't fit in the available bytes. + uint64_t m_dropped_bytes{0}; + + Stats(uint64_t max_bytes) : m_available_bytes{max_bytes} {} + //! Updates internal accounting and returns true if enough available_bytes were remaining + bool Consume(uint64_t bytes); + }; + + private: + mutable StdMutex m_mutex; + + //! Stats for each source location that has attempted to log something. + std::unordered_map m_source_locations GUARDED_BY(m_mutex); + //! Whether any log locations are suppressed. Cached view on m_source_locations for performance reasons. + std::atomic m_suppression_active{false}; + LogRateLimiter(uint64_t max_bytes, std::chrono::seconds reset_window); + + public: + using SchedulerFunction = std::function, std::chrono::milliseconds)>; + /** + * @param scheduler_func Callable object used to schedule resetting the window. The first + * parameter is the function to be executed, and the second is the + * reset_window interval. + * @param max_bytes Maximum number of bytes that can be logged for each source + * location. + * @param reset_window Time window after which the stats are reset. + */ + static std::shared_ptr Create( + SchedulerFunction&& scheduler_func, + uint64_t max_bytes, + std::chrono::seconds reset_window); + //! Maximum number of bytes logged per location per window. + const uint64_t m_max_bytes; + //! Interval after which the window is reset. + const std::chrono::seconds m_reset_window; + //! Suppression status of a source log location. + enum class Status { + UNSUPPRESSED, // string fits within the limit + NEWLY_SUPPRESSED, // suppression has started since this string + STILL_SUPPRESSED, // suppression is still ongoing + }; + //! Consumes `source_loc`'s available bytes corresponding to the size of the (formatted) + //! `str` and returns its status. + [[nodiscard]] Status Consume( + const std::source_location& source_loc, + const std::string& str) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex); + //! Resets all usage to zero. Called periodically by the scheduler. + void Reset() EXCLUSIVE_LOCKS_REQUIRED(!m_mutex); + //! Returns true if any log locations are currently being suppressed. + bool SuppressionsActive() const { return m_suppression_active; } + }; class Logger { @@ -89,8 +175,8 @@ namespace BCLog { struct BufferedLog { SystemClock::time_point now; std::chrono::seconds mocktime; - std::string str, logging_function, source_file, threadname; - int source_line; + std::string str, threadname; + std::source_location source_loc; LogFlags category; Level level; }; @@ -105,6 +191,9 @@ namespace BCLog { size_t m_cur_buffer_memusage GUARDED_BY(m_cs){0}; size_t m_buffer_lines_discarded GUARDED_BY(m_cs){0}; + //! Manages the rate limiting of each log location. + std::shared_ptr m_limiter GUARDED_BY(m_cs); + //! Category-specific log level. Overrides `m_log_level`. std::unordered_map m_category_log_levels GUARDED_BY(m_cs); @@ -115,7 +204,7 @@ namespace BCLog { /** Log categories bitfield. */ std::atomic m_categories{BCLog::NONE}; - void FormatLogStrInPlace(std::string& str, LogFlags category, Level level, std::string_view source_file, int source_line, std::string_view logging_function, std::string_view threadname, SystemClock::time_point now, std::chrono::seconds mocktime) const; + void FormatLogStrInPlace(std::string& str, LogFlags category, Level level, const std::source_location& source_loc, std::string_view threadname, SystemClock::time_point now, std::chrono::seconds mocktime) const; std::string LogTimestampStr(SystemClock::time_point now, std::chrono::seconds mocktime) const; @@ -123,7 +212,7 @@ namespace BCLog { std::list> m_print_callbacks GUARDED_BY(m_cs) {}; /** Send a string to the log output (internal) */ - void LogPrintStr_(std::string_view str, std::string_view logging_function, std::string_view source_file, int source_line, BCLog::LogFlags category, BCLog::Level level) + void LogPrintStr_(std::string_view str, std::source_location&& source_loc, BCLog::LogFlags category, BCLog::Level level, bool should_ratelimit) EXCLUSIVE_LOCKS_REQUIRED(m_cs); std::string GetLogPrefix(LogFlags category, Level level) const; @@ -142,7 +231,7 @@ namespace BCLog { std::atomic m_reopen_file{false}; /** Send a string to the log output */ - void LogPrintStr(std::string_view str, std::string_view logging_function, std::string_view source_file, int source_line, BCLog::LogFlags category, BCLog::Level level) + void LogPrintStr(std::string_view str, std::source_location&& source_loc, BCLog::LogFlags category, BCLog::Level level, bool should_ratelimit) EXCLUSIVE_LOCKS_REQUIRED(!m_cs); /** Returns whether logs will be written to any output */ @@ -172,6 +261,12 @@ namespace BCLog { /** Only for testing */ void DisconnectTestLogger() EXCLUSIVE_LOCKS_REQUIRED(!m_cs); + void SetRateLimiting(std::shared_ptr limiter) EXCLUSIVE_LOCKS_REQUIRED(!m_cs) + { + StdLockGuard scoped_lock(m_cs); + m_limiter = std::move(limiter); + } + /** Disable logging * This offers a slight speedup and slightly smaller memory usage * compared to leaving the logging system in its default state. @@ -239,7 +334,7 @@ static inline bool LogAcceptCategory(BCLog::LogFlags category, BCLog::Level leve bool GetLogCategory(BCLog::LogFlags& flag, std::string_view str); template -inline void LogPrintFormatInternal(std::string_view logging_function, std::string_view source_file, const int source_line, const BCLog::LogFlags flag, const BCLog::Level level, util::ConstevalFormatString fmt, const Args&... args) +inline void LogPrintFormatInternal(std::source_location&& source_loc, BCLog::LogFlags flag, BCLog::Level level, bool should_ratelimit, util::ConstevalFormatString fmt, const Args&... args) { if (LogInstance().Enabled()) { std::string log_msg; @@ -248,19 +343,19 @@ inline void LogPrintFormatInternal(std::string_view logging_function, std::strin } catch (tinyformat::format_error& fmterr) { log_msg = "Error \"" + std::string{fmterr.what()} + "\" while formatting log message: " + fmt.fmt; } - LogInstance().LogPrintStr(log_msg, logging_function, source_file, source_line, flag, level); + LogInstance().LogPrintStr(log_msg, std::move(source_loc), flag, level, should_ratelimit); } } -#define LogPrintLevel_(category, level, ...) LogPrintFormatInternal(__func__, __FILE__, __LINE__, category, level, __VA_ARGS__) +#define LogPrintLevel_(category, level, should_ratelimit, ...) LogPrintFormatInternal(std::source_location::current(), category, level, should_ratelimit, __VA_ARGS__) -// Log unconditionally. +// Log unconditionally. Uses basic rate limiting to mitigate disk filling attacks. // Be conservative when using functions that unconditionally log to debug.log! // It should not be the case that an inbound peer can fill up a user's storage // with debug.log entries. -#define LogInfo(...) LogPrintLevel_(BCLog::LogFlags::ALL, BCLog::Level::Info, __VA_ARGS__) -#define LogWarning(...) LogPrintLevel_(BCLog::LogFlags::ALL, BCLog::Level::Warning, __VA_ARGS__) -#define LogError(...) LogPrintLevel_(BCLog::LogFlags::ALL, BCLog::Level::Error, __VA_ARGS__) +#define LogInfo(...) LogPrintLevel_(BCLog::LogFlags::ALL, BCLog::Level::Info, /*should_ratelimit=*/true, __VA_ARGS__) +#define LogWarning(...) LogPrintLevel_(BCLog::LogFlags::ALL, BCLog::Level::Warning, /*should_ratelimit=*/true, __VA_ARGS__) +#define LogError(...) LogPrintLevel_(BCLog::LogFlags::ALL, BCLog::Level::Error, /*should_ratelimit=*/true, __VA_ARGS__) // Deprecated unconditional logging. #define LogPrintf(...) LogInfo(__VA_ARGS__) @@ -268,12 +363,18 @@ inline void LogPrintFormatInternal(std::string_view logging_function, std::strin // Use a macro instead of a function for conditional logging to prevent // evaluating arguments when logging for the category is not enabled. -// Log conditionally, prefixing the output with the passed category name and severity level. -#define LogPrintLevel(category, level, ...) \ - do { \ - if (LogAcceptCategory((category), (level))) { \ - LogPrintLevel_(category, level, __VA_ARGS__); \ - } \ +// Log by prefixing the output with the passed category name and severity level. This can either +// log conditionally if the category is allowed or unconditionally if level >= BCLog::Level::Info +// is passed. If this function logs unconditionally, logging to disk is rate-limited. This is +// important so that callers don't need to worry about accidentally introducing a disk-fill +// vulnerability if level >= Info is used. Additionally, users specifying -debug are assumed to be +// developers or power users who are aware that -debug may cause excessive disk usage due to logging. +#define LogPrintLevel(category, level, ...) \ + do { \ + if (LogAcceptCategory((category), (level))) { \ + bool rate_limit{level >= BCLog::Level::Info}; \ + LogPrintLevel_(category, level, rate_limit, __VA_ARGS__); \ + } \ } while (0) // Log conditionally, prefixing the output with the passed category name. diff --git a/src/net.cpp b/src/net.cpp index 94159714a3a..9de594cbbb4 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -575,9 +575,9 @@ void CNode::CloseSocketDisconnect() m_i2p_sam_session.reset(); } -void CConnman::AddWhitelistPermissionFlags(NetPermissionFlags& flags, const CNetAddr &addr, const std::vector& ranges) const { +void CConnman::AddWhitelistPermissionFlags(NetPermissionFlags& flags, std::optional addr, const std::vector& ranges) const { for (const auto& subnet : ranges) { - if (subnet.m_subnet.Match(addr)) { + if (addr.has_value() && subnet.m_subnet.Match(addr.value())) { NetPermissions::AddFlag(flags, subnet.m_flags); } } @@ -1767,7 +1767,11 @@ void CConnman::CreateNodeFromAcceptedSocket(std::unique_ptr&& sock, { int nInbound = 0; - AddWhitelistPermissionFlags(permission_flags, addr, vWhitelistedRangeIncoming); + const bool inbound_onion = std::find(m_onion_binds.begin(), m_onion_binds.end(), addr_bind) != m_onion_binds.end(); + + // Tor inbound connections do not reveal the peer's actual network address. + // Therefore do not apply address-based whitelist permissions to them. + AddWhitelistPermissionFlags(permission_flags, inbound_onion ? std::optional{} : addr, vWhitelistedRangeIncoming); { LOCK(m_nodes_mutex); @@ -1822,7 +1826,6 @@ void CConnman::CreateNodeFromAcceptedSocket(std::unique_ptr&& sock, NodeId id = GetNewNodeId(); uint64_t nonce = GetDeterministicRandomizer(RANDOMIZER_ID_LOCALHOSTNONCE).Write(id).Finalize(); - const bool inbound_onion = std::find(m_onion_binds.begin(), m_onion_binds.end(), addr_bind) != m_onion_binds.end(); // The V2Transport transparently falls back to V1 behavior when an incoming V1 connection is // detected, so use it whenever we signal NODE_P2P_V2. ServiceFlags local_services = GetLocalServices(); diff --git a/src/net.h b/src/net.h index 86e8a022b2a..0233ba8716e 100644 --- a/src/net.h +++ b/src/net.h @@ -1364,7 +1364,7 @@ class CConnman bool AttemptToEvictConnection(); CNode* ConnectNode(CAddress addrConnect, const char *pszDest, bool fCountFailure, ConnectionType conn_type, bool use_v2transport) EXCLUSIVE_LOCKS_REQUIRED(!m_unused_i2p_sessions_mutex); - void AddWhitelistPermissionFlags(NetPermissionFlags& flags, const CNetAddr &addr, const std::vector& ranges) const; + void AddWhitelistPermissionFlags(NetPermissionFlags& flags, std::optional addr, const std::vector& ranges) const; void DeleteNode(CNode* pnode); diff --git a/src/net_processing.cpp b/src/net_processing.cpp index 3cbfff00f39..ad594b54136 100644 --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -553,12 +553,6 @@ class PeerManagerImpl final : public PeerManager bool via_compact_block, const std::string& message = "") EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex); - /** - * Potentially disconnect and discourage a node based on the contents of a TxValidationState object - */ - void MaybePunishNodeForTx(NodeId nodeid, const TxValidationState& state) - EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex); - /** Maybe disconnect a peer and discourage future connections from its address. * * @param[in] pnode The node to check. @@ -1809,32 +1803,6 @@ void PeerManagerImpl::MaybePunishNodeForBlock(NodeId nodeid, const BlockValidati } } -void PeerManagerImpl::MaybePunishNodeForTx(NodeId nodeid, const TxValidationState& state) -{ - PeerRef peer{GetPeerRef(nodeid)}; - switch (state.GetResult()) { - case TxValidationResult::TX_RESULT_UNSET: - break; - // The node is providing invalid data: - case TxValidationResult::TX_CONSENSUS: - if (peer) Misbehaving(*peer, ""); - return; - // Conflicting (but not necessarily invalid) data or different policy: - case TxValidationResult::TX_INPUTS_NOT_STANDARD: - case TxValidationResult::TX_NOT_STANDARD: - case TxValidationResult::TX_MISSING_INPUTS: - case TxValidationResult::TX_PREMATURE_SPEND: - case TxValidationResult::TX_WITNESS_MUTATED: - case TxValidationResult::TX_WITNESS_STRIPPED: - case TxValidationResult::TX_CONFLICT: - case TxValidationResult::TX_MEMPOOL_POLICY: - case TxValidationResult::TX_NO_MEMPOOL: - case TxValidationResult::TX_RECONSIDERABLE: - case TxValidationResult::TX_UNKNOWN: - break; - } -} - bool PeerManagerImpl::BlockRequestAllowed(const CBlockIndex* pindex) { AssertLockHeld(cs_main); @@ -2634,6 +2602,15 @@ bool PeerManagerImpl::TryLowWorkHeadersSync(Peer& peer, CNode& pfrom, const CBlo // otherwise they don't have more headers after this so no point in // trying to sync their too-little-work chain. if (headers.size() == m_opts.max_headers_result) { + // chain_start_header may refer to a block deep in the chain that + // has been trimmed from memory by -trim_headers. The HeadersSyncState + // constructor calls GetBlockHeader() on it via m_last_header_received, + // which asserts untrimmed. Reload from disk first if needed. + CBlockIndex tmpBlockIndexFull; + const CBlockIndex* chain_start_untrimmed = chain_start_header->trimmed() + ? chain_start_header->untrim_to(&tmpBlockIndexFull) + : chain_start_header; + // Note: we could advance to the last header in this set that is // known to us, rather than starting at the first header (which we // may already have); however this is unlikely to matter much since @@ -2645,7 +2622,7 @@ bool PeerManagerImpl::TryLowWorkHeadersSync(Peer& peer, CNode& pfrom, const CBlo // advancing to the first unknown header would be a small effect. LOCK(peer.m_headers_sync_mutex); peer.m_headers_sync.reset(new HeadersSyncState(peer.m_id, m_chainparams.GetConsensus(), - chain_start_header, minimum_chain_work)); + chain_start_untrimmed, minimum_chain_work)); // Now a HeadersSyncState object for tracking this synchronization // is created, process the headers using it as normal. Failures are @@ -3039,8 +3016,6 @@ std::optional PeerManagerImpl::ProcessInvalidTx(NodeId if (peer) AddKnownTx(*peer, parent_txid); } - MaybePunishNodeForTx(nodeid, state); - return package_to_validate; } @@ -3366,7 +3341,21 @@ void PeerManagerImpl::ProcessCompactBlockTxns(CNode& pfrom, Peer& peer, const Bl } PartiallyDownloadedBlock& partialBlock = *range_flight.first->second.second->partialBlock; - ReadStatus status = partialBlock.FillBlock(*pblock, block_transactions.txn); + + if (partialBlock.header.IsNull()) { + // It is possible for the header to be empty if a previous call to FillBlock wiped the header, but left + // the PartiallyDownloadedBlock pointer around (i.e. did not call RemoveBlockRequest). In this case, we + // should not call LookupBlockIndex below. + RemoveBlockRequest(block_transactions.blockhash, pfrom.GetId()); + Misbehaving(peer, "previous compact block reconstruction attempt failed"); + LogDebug(BCLog::NET, "Peer %d sent compact block transactions multiple times", pfrom.GetId()); + return; + } + + // We should not have gotten this far in compact block processing unless it's attached to a known header + const CBlockIndex* prev_block{Assume(m_chainman.m_blockman.LookupBlockIndex(partialBlock.header.hashPrevBlock))}; + ReadStatus status = partialBlock.FillBlock(*pblock, block_transactions.txn, + /*segwit_active=*/DeploymentActiveAfter(prev_block, m_chainman, Consensus::DEPLOYMENT_SEGWIT)); if (status == READ_STATUS_INVALID) { RemoveBlockRequest(block_transactions.blockhash, pfrom.GetId()); // Reset in-flight state in case Misbehaving does not result in a disconnect Misbehaving(peer, "invalid compact block/non-matching block transactions"); @@ -3374,6 +3363,9 @@ void PeerManagerImpl::ProcessCompactBlockTxns(CNode& pfrom, Peer& peer, const Bl } else if (status == READ_STATUS_FAILED) { if (first_in_flight) { // Might have collided, fall back to getdata now :( + // We keep the failed partialBlock to disallow processing another compact block announcement from the same + // peer for the same block. We let the full block download below continue under the same m_downloading_since + // timer. std::vector invs; invs.emplace_back(MSG_BLOCK | GetFetchFlags(peer), block_transactions.blockhash); MakeAndPushMessage(pfrom, NetMsgType::GETDATA, invs); @@ -3383,23 +3375,7 @@ void PeerManagerImpl::ProcessCompactBlockTxns(CNode& pfrom, Peer& peer, const Bl return; } } else { - // Block is either okay, or possibly we received - // READ_STATUS_CHECKBLOCK_FAILED. - // Note that CheckBlock can only fail for one of a few reasons: - // 1. bad-proof-of-work (impossible here, because we've already - // accepted the header) - // 2. merkleroot doesn't match the transactions given (already - // caught in FillBlock with READ_STATUS_FAILED, so - // impossible here) - // 3. the block is otherwise invalid (eg invalid coinbase, - // block is too big, too many legacy sigops, etc). - // So if CheckBlock failed, #3 is the only possibility. - // Under BIP 152, we don't discourage the peer unless proof of work is - // invalid (we don't require all the stateless checks to have - // been run). This is handled below, so just treat this as - // though the block was successfully read, and rely on the - // handling in ProcessNewBlock to ensure the block index is - // updated, etc. + // Block is okay for further processing RemoveBlockRequest(block_transactions.blockhash, pfrom.GetId()); // it is now an empty pointer fBlockRead = true; // mapBlockSource is used for potentially punishing peers and @@ -4529,7 +4505,9 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type, return; } std::vector dummy; - status = tempBlock.FillBlock(*pblock, dummy); + const CBlockIndex* prev_block{Assume(m_chainman.m_blockman.LookupBlockIndex(cmpctblock.header.hashPrevBlock))}; + status = tempBlock.FillBlock(*pblock, dummy, + /*segwit_active=*/DeploymentActiveAfter(prev_block, m_chainman, Consensus::DEPLOYMENT_SEGWIT)); if (status == READ_STATUS_OK) { fBlockReconstructed = true; } diff --git a/src/netbase.cpp b/src/netbase.cpp index eaca5a16c10..d3d54048272 100644 --- a/src/netbase.cpp +++ b/src/netbase.cpp @@ -861,10 +861,14 @@ bool IsBadPort(uint16_t port) case 1720: // h323hostcall case 1723: // pptp case 2049: // nfs + case 3306: // MySQL + case 3389: // RDP / Windows Remote Desktop case 3659: // apple-sasl / PasswordServer case 4045: // lockd case 5060: // sip case 5061: // sips + case 5432: // PostgreSQL + case 5900: // VNC case 6000: // X11 case 6566: // sane-port case 6665: // Alternate IRC @@ -874,6 +878,7 @@ bool IsBadPort(uint16_t port) case 6669: // Alternate IRC case 6697: // IRC + TLS case 10080: // Amanda + case 27017: // MongoDB return true; } return false; diff --git a/src/node/caches.cpp b/src/node/caches.cpp index 8b432637c73..d5d69fc2044 100644 --- a/src/node/caches.cpp +++ b/src/node/caches.cpp @@ -19,6 +19,8 @@ static constexpr size_t MAX_TX_INDEX_CACHE{1024_MiB}; //! Max memory allocated to all block filter index caches combined in bytes. static constexpr size_t MAX_FILTER_INDEX_CACHE{1024_MiB}; +//! Maximum dbcache size on 32-bit systems. +static constexpr size_t MAX_32BIT_DBCACHE{1024_MiB}; namespace node { CacheSizes CalculateCacheSizes(const ArgsManager& args, size_t n_indexes) @@ -28,7 +30,8 @@ CacheSizes CalculateCacheSizes(const ArgsManager& args, size_t n_indexes) if (std::optional db_cache = args.GetIntArg("-dbcache")) { if (*db_cache < 0) db_cache = 0; uint64_t db_cache_bytes = SaturatingLeftShift(*db_cache, 20); - total_cache = std::max(MIN_DB_CACHE, std::min(db_cache_bytes, std::numeric_limits::max())); + constexpr auto max_db_cache{sizeof(void*) == 4 ? MAX_32BIT_DBCACHE : std::numeric_limits::max()}; + total_cache = std::max(MIN_DB_CACHE, std::min(db_cache_bytes, max_db_cache)); } IndexCacheSizes index_sizes; diff --git a/src/node/mempool_args.cpp b/src/node/mempool_args.cpp index e3bf5fb57cb..f2241f0caf5 100644 --- a/src/node/mempool_args.cpp +++ b/src/node/mempool_args.cpp @@ -25,6 +25,9 @@ using common::AmountErrMsg; using kernel::MemPoolLimits; using kernel::MemPoolOptions; +//! Maximum mempool size on 32-bit systems. +static constexpr int MAX_32BIT_MEMPOOL_MB{500}; + namespace { void ApplyArgsManOptions(const ArgsManager& argsman, MemPoolLimits& mempool_limits) { @@ -42,7 +45,13 @@ util::Result ApplyArgsManOptions(const ArgsManager& argsman, const CChainP { mempool_opts.check_ratio = argsman.GetIntArg("-checkmempool", mempool_opts.check_ratio); - if (auto mb = argsman.GetIntArg("-maxmempool")) mempool_opts.max_size_bytes = *mb * 1'000'000; + if (auto mb = argsman.GetIntArg("-maxmempool")) { + constexpr bool is_32bit{sizeof(void*) == 4}; + if (is_32bit && *mb > MAX_32BIT_MEMPOOL_MB) { + return util::Error{Untranslated(strprintf("-maxmempool is set to %i but can't be over %i MB on 32-bit systems", *mb, MAX_32BIT_MEMPOOL_MB))}; + } + mempool_opts.max_size_bytes = *mb * 1'000'000; + } if (auto hours = argsman.GetIntArg("-mempoolexpiry")) mempool_opts.expiry = std::chrono::hours{*hours}; @@ -56,6 +65,7 @@ util::Result ApplyArgsManOptions(const ArgsManager& argsman, const CChainP } } + static_assert(DEFAULT_MIN_RELAY_TX_FEE == DEFAULT_INCREMENTAL_RELAY_FEE); if (argsman.IsArgSet("-minrelaytxfee")) { if (std::optional min_relay_feerate = ParseMoney(argsman.GetArg("-minrelaytxfee", ""))) { // High fee check is done afterward in CWallet::Create() diff --git a/src/node/miner.cpp b/src/node/miner.cpp index b194025430b..801cadce7cc 100644 --- a/src/node/miner.cpp +++ b/src/node/miner.cpp @@ -463,8 +463,8 @@ void BlockAssembler::addPackageTxs(int& nPackagesSelected, int& nDescendantsUpda ++nConsecutiveFailed; - if (nConsecutiveFailed > MAX_CONSECUTIVE_FAILURES && nBlockWeight > - m_options.nBlockMaxWeight - m_options.block_reserved_weight) { + if (nConsecutiveFailed > MAX_CONSECUTIVE_FAILURES && nBlockWeight + + m_options.block_reserved_weight > m_options.nBlockMaxWeight) { // Give up if we're close to full and haven't succeeded in a while break; } diff --git a/src/node/miner.h b/src/node/miner.h index 85db75dda79..b9916399501 100644 --- a/src/node/miner.h +++ b/src/node/miner.h @@ -106,7 +106,9 @@ struct CompareTxIterByAncestorCount { }; -struct CTxMemPoolModifiedEntry_Indices final : boost::multi_index::indexed_by< +using indexed_modified_transaction_set = boost::multi_index_container< + CTxMemPoolModifiedEntry, + boost::multi_index::indexed_by< boost::multi_index::ordered_unique< modifiedentry_iter, CompareCTxMemPoolIter @@ -125,12 +127,7 @@ struct CTxMemPoolModifiedEntry_Indices final : boost::multi_index::indexed_by< CompareTxMemPoolEntryByConfidentialFee > > -{}; - -typedef boost::multi_index_container< - CTxMemPoolModifiedEntry, - CTxMemPoolModifiedEntry_Indices -> indexed_modified_transaction_set; +>; typedef indexed_modified_transaction_set::nth_index<0>::type::iterator modtxiter; typedef indexed_modified_transaction_set::index::type::iterator modtxscoreiter; diff --git a/src/policy/feerate.h b/src/policy/feerate.h index d742a43acc7..6bcb5ddf5b6 100644 --- a/src/policy/feerate.h +++ b/src/policy/feerate.h @@ -44,9 +44,6 @@ class CFeeRate /** * Construct a fee rate from a fee in satoshis and a vsize in vB. - * - * param@[in] nFeePaid The fee paid by a transaction, in satoshis - * param@[in] num_bytes The vsize of a transaction, in vbytes */ CFeeRate(const CAmount& nFeePaid, uint32_t num_bytes); diff --git a/src/policy/policy.cpp b/src/policy/policy.cpp index 2289da47421..c6c424a5cf8 100644 --- a/src/policy/policy.cpp +++ b/src/policy/policy.cpp @@ -83,7 +83,7 @@ std::vector GetDust(const CTransaction& tx, CFeeRate dust_relay_rate) { std::vector dust_outputs; for (uint32_t i{0}; i < tx.vout.size(); ++i) { - // ELEMENTS: check explicity + // ELEMENTS: check explicitly const auto& output = tx.vout[i]; if (output.nAsset.IsExplicit() && output.nAsset.GetAsset() != ::policyAsset) continue; if (IsDust(output, dust_relay_rate)) dust_outputs.push_back(i); @@ -189,6 +189,35 @@ bool IsStandardTx(const CTransaction& tx, const std::optional& max_dat return true; } +/** + * Check the total number of non-witness sigops across the whole transaction, as per BIP54. + */ +static bool CheckSigopsBIP54(const CTransaction& tx, const CCoinsViewCache& inputs) +{ + Assert(!tx.IsCoinBase()); + + unsigned int sigops{0}; + for (const auto& txin: tx.vin) { + const auto& prev_txo{inputs.AccessCoin(txin.prevout).out}; + + // Unlike the existing block wide sigop limit which counts sigops present in the block + // itself (including the scriptPubKey which is not executed until spending later), BIP54 + // counts sigops in the block where they are potentially executed (only). + // This means sigops in the spent scriptPubKey count toward the limit. + // `fAccurate` means correctly accounting sigops for CHECKMULTISIGs(VERIFY) with 16 pubkeys + // or fewer. This method of accounting was introduced by BIP16, and BIP54 reuses it. + // The GetSigOpCount call on the previous scriptPubKey counts both bare and P2SH sigops. + sigops += txin.scriptSig.GetSigOpCount(/*fAccurate=*/true); + sigops += prev_txo.scriptPubKey.GetSigOpCount(txin.scriptSig); + + if (sigops > MAX_TX_LEGACY_SIGOPS) { + return false; + } + } + + return true; +} + /** * Check transaction inputs to mitigate two * potential denial-of-service attacks: @@ -206,6 +235,8 @@ bool IsStandardTx(const CTransaction& tx, const std::optional& max_dat * DUP CHECKSIG DROP ... repeated 100 times... OP_1 * * Note that only the non-witness portion of the transaction is checked here. + * + * We also check the total number of non-witness sigops across the whole transaction, as per BIP54. */ bool AreInputsStandard(const CTransaction& tx, const CCoinsViewCache& mapInputs) { @@ -213,6 +244,10 @@ bool AreInputsStandard(const CTransaction& tx, const CCoinsViewCache& mapInputs) return true; // Coinbases don't use vin normally } + if (!CheckSigopsBIP54(tx, mapInputs)) { + return false; + } + for (unsigned int i = 0; i < tx.vin.size(); i++) { if (tx.vin[i].m_is_pegin) { // This deals with p2sh in general only @@ -359,6 +394,42 @@ bool IsIssuanceInMoneyRange(const CTransaction& tx) return true; } +bool SpendsNonAnchorWitnessProg(const CTransaction& tx, const CCoinsViewCache& prevouts) +{ + if (tx.IsCoinBase()) { + return false; + } + + int version; + std::vector program; + for (const auto& txin: tx.vin) { + const auto& prev_spk{prevouts.AccessCoin(txin.prevout).out.scriptPubKey}; + + // Note this includes not-yet-defined witness programs. + if (prev_spk.IsWitnessProgram(version, program) && !prev_spk.IsPayToAnchor(version, program)) { + return true; + } + + // For P2SH extract the redeem script and check if it spends a non-Taproot witness program. Note + // this is fine to call EvalScript (as done in AreInputsStandard/IsWitnessStandard) because this + // function is only ever called after IsStandardTx, which checks the scriptsig is pushonly. + if (prev_spk.IsPayToScriptHash()) { + // If EvalScript fails or results in an empty stack, the transaction is invalid by consensus. + std::vector > stack; + if (!EvalScript(stack, txin.scriptSig, SCRIPT_VERIFY_NONE, BaseSignatureChecker{}, SigVersion::BASE) + || stack.empty()) { + continue; + } + const CScript redeem_script{stack.back().begin(), stack.back().end()}; + if (redeem_script.IsWitnessProgram(version, program)) { + return true; + } + } + } + + return false; +} + int64_t GetVirtualTransactionSize(int64_t nWeight, int64_t nSigOpCost, unsigned int bytes_per_sigop) { return (std::max(nWeight, nSigOpCost * bytes_per_sigop) + WITNESS_SCALE_FACTOR - 1) / WITNESS_SCALE_FACTOR; diff --git a/src/policy/policy.h b/src/policy/policy.h index f6534ae4de4..8a8ed8f9378 100644 --- a/src/policy/policy.h +++ b/src/policy/policy.h @@ -33,7 +33,7 @@ static constexpr unsigned int DEFAULT_BLOCK_RESERVED_WEIGHT{8000}; * Setting a lower value is prevented at startup. */ static constexpr unsigned int MINIMUM_BLOCK_RESERVED_WEIGHT{2000}; /** Default for -blockmintxfee, which sets the minimum feerate for a transaction in blocks created by mining code **/ -static constexpr unsigned int DEFAULT_BLOCK_MIN_TX_FEE{100}; +static constexpr unsigned int DEFAULT_BLOCK_MIN_TX_FEE{1}; /** The maximum weight for transactions we're willing to relay/mine */ static constexpr int32_t MAX_STANDARD_TX_WEIGHT{400000}; /** The minimum non-witness size for transactions we're willing to relay/mine: one larger than 64 */ @@ -42,6 +42,8 @@ static constexpr unsigned int MIN_STANDARD_TX_NONWITNESS_SIZE{65}; static constexpr unsigned int MAX_P2SH_SIGOPS{15}; /** The maximum number of sigops we're willing to relay/mine in a single tx */ static constexpr unsigned int MAX_STANDARD_TX_SIGOPS_COST{MAX_BLOCK_SIGOPS_COST/5}; +/** The maximum number of potentially executed legacy signature operations in a single standard tx */ +static constexpr unsigned int MAX_TX_LEGACY_SIGOPS{2'500}; /** Default for -incrementalrelayfee, which sets the minimum feerate increase for mempool limiting or replacement **/ static constexpr unsigned int DEFAULT_INCREMENTAL_RELAY_FEE{100}; /** Default for -bytespersigop */ @@ -176,6 +178,11 @@ bool AreInputsStandard(const CTransaction& tx, const CCoinsViewCache& mapInputs) * Also enforce a maximum stack item size limit and no annexes for tapscript spends. */ bool IsWitnessStandard(const CTransaction& tx, const CCoinsViewCache& mapInputs); +/** + * Check whether this transaction spends any witness program but P2A, including not-yet-defined ones. + * May return `false` early for consensus-invalid transactions. + */ +bool SpendsNonAnchorWitnessProg(const CTransaction& tx, const CCoinsViewCache& prevouts); /* ELEMENTS * Check if unblinded issuance/reissuance is in MoneyRange diff --git a/src/primitives/bitcoin/merkleblock.cpp b/src/primitives/bitcoin/merkleblock.cpp index 7267af4f949..d78cf930fc9 100644 --- a/src/primitives/bitcoin/merkleblock.cpp +++ b/src/primitives/bitcoin/merkleblock.cpp @@ -39,7 +39,7 @@ CMerkleBlock::CMerkleBlock(const CBlock& block, CBloomFilter* filter, const std: txn = CPartialMerkleTree(vHashes, vMatch); } */ -uint256 CPartialMerkleTree::CalcHash(int height, unsigned int pos, const std::vector &vTxid) { +uint256 CPartialMerkleTree::CalcHash(int height, unsigned int pos, const std::vector &vTxid) { // NOLINT(misc-no-recursion) //we can never have zero txs in a merkle block, we always need the coinbase tx //if we do not have this assert, we can hit a memory access violation when indexing into vTxid assert(vTxid.size() != 0); @@ -59,7 +59,7 @@ uint256 CPartialMerkleTree::CalcHash(int height, unsigned int pos, const std::ve } } -void CPartialMerkleTree::TraverseAndBuild(int height, unsigned int pos, const std::vector &vTxid, const std::vector &vMatch) { +void CPartialMerkleTree::TraverseAndBuild(int height, unsigned int pos, const std::vector &vTxid, const std::vector &vMatch) { // NOLINT(misc-no-recursion) // determine whether this node is the parent of at least one matched txid bool fParentOfMatch = false; for (unsigned int p = pos << height; p < (pos+1) << height && p < nTransactions; p++) @@ -77,7 +77,7 @@ void CPartialMerkleTree::TraverseAndBuild(int height, unsigned int pos, const st } } -uint256 CPartialMerkleTree::TraverseAndExtract(int height, unsigned int pos, unsigned int &nBitsUsed, unsigned int &nHashUsed, std::vector &vMatch, std::vector &vnIndex) { +uint256 CPartialMerkleTree::TraverseAndExtract(int height, unsigned int pos, unsigned int &nBitsUsed, unsigned int &nHashUsed, std::vector &vMatch, std::vector &vnIndex) { // NOLINT(misc-no-recursion) if (nBitsUsed >= vBits.size()) { // overflowed the bits array - failure fBad = true; diff --git a/src/pubkey.cpp b/src/pubkey.cpp index 909c54eee81..88559831d2b 100644 --- a/src/pubkey.cpp +++ b/src/pubkey.cpp @@ -232,7 +232,7 @@ bool XOnlyPubKey::VerifySchnorr(const Span msg, Spanlocale/bitcoin_fil.qm locale/bitcoin_fo.qm locale/bitcoin_fr.qm - locale/bitcoin_fr_CM.qm - locale/bitcoin_fr_LU.qm locale/bitcoin_ga.qm locale/bitcoin_ga_IE.qm locale/bitcoin_gd.qm diff --git a/src/qt/guiconstants.h b/src/qt/guiconstants.h index 35fd7e7078a..778d1db653e 100644 --- a/src/qt/guiconstants.h +++ b/src/qt/guiconstants.h @@ -11,6 +11,7 @@ #include #include +#include // IWYU pragma: keep using namespace std::chrono_literals; diff --git a/src/qt/guiutil.cpp b/src/qt/guiutil.cpp index a0bc7a6e112..745dd8d97ad 100644 --- a/src/qt/guiutil.cpp +++ b/src/qt/guiutil.cpp @@ -78,6 +78,7 @@ #include #include #include +#include // IWYU pragma: keep #if defined(Q_OS_MACOS) diff --git a/src/qt/locale/bitcoin_ar.ts b/src/qt/locale/bitcoin_ar.ts index f2d1b608fdf..3fe688b277e 100644 --- a/src/qt/locale/bitcoin_ar.ts +++ b/src/qt/locale/bitcoin_ar.ts @@ -782,6 +782,10 @@ OptionsDialog + + Automatically open the Bitcoin client port on the router. This only works when your router supports PCP or NAT-PMP and it is enabled. The external port could be random. + افتح تلقائيًا منفذ عميل البتكوين على جهاز التوجيه. يعمل هذا فقط عندما يدعم جهاز التوجيه الخاص بك PCP أو NAT-PMP ويتم تمكينه. يمكن أن يكون المنفذ الخارجي عشوائيًا + Options set in this dialog are overridden by the command line: ‫التفضيلات المعينة عن طريق سطر الأوامر لها أولوية أكبر وتتجاوز التفضيلات المختارة هنا:‬ @@ -1471,6 +1475,14 @@ If you are receiving this error you should request the merchant provide a BIP21 bitcoin-core + + Error starting/committing db txn for wallet transactions removal process + خطأ بدء/ارتكاب DB TXN لعملية إزالة معاملات المحفظة + + + Invalid value detected for '-wallet' or '-nowallet'. '-wallet' requires a string value, while '-nowallet' accepts only '1' to disable all wallets + قيمة غير صالحة تم اكتشافها لـ "-wallet" أو "-Nowallet". يتطلب "-wallet" قيمة سلسلة ، في حين أن "-Nowallet" تقبل فقط "1" لتعطيل جميع المحافظ + More than one onion bind address is provided. Using %s for the automatically created Tor onion service. أكثر من عنوان مربوط بالonion مقدم. استخدام %s من أجل خدمة تور (Tor) المنشأة تلقائيا. @@ -1479,5 +1491,29 @@ If you are receiving this error you should request the merchant provide a BIP21 Maximum transaction weight is too low, can not accommodate change output الحد الأقصى لوزن المعاملة منخفض جدًا، ولا يمكنه استيعاب مخرجات التغيير + + Error loading databases + خطأ تحميل قواعد البيانات + + + Error opening coins database + خطأ فتح قاعدة بيانات العملات المعدنية + + + The transactions removal process can only be executed within a db txn + لا يمكن تنفيذ عملية إزالة المعاملات إلا داخل DB TXN + + + Do you want to rebuild the databases now? + هل تريد إعادة بناء قواعد البيانات الآن؟ + + + Error: Wallet does not exist + خطأ: محفظة غير موجودة + + + Error: cannot remove legacy wallet records + خطأ: لا يمكن إزالة سجلات المحفظة القديمة + \ No newline at end of file diff --git a/src/qt/locale/bitcoin_bg.ts b/src/qt/locale/bitcoin_bg.ts index 72faaa2f169..ab209c70245 100644 --- a/src/qt/locale/bitcoin_bg.ts +++ b/src/qt/locale/bitcoin_bg.ts @@ -1039,7 +1039,7 @@ Signing is only possible with addresses of the type 'legacy'. Creating Wallet <b>%1</b>… Descriptive text of the create wallet progress window which indicates to the user which wallet is currently being created. - Създаване на уолет 1 1%1 1 + Създаване на уолет <b>%1</b>… Create wallet failed diff --git a/src/qt/locale/bitcoin_bn.ts b/src/qt/locale/bitcoin_bn.ts index a4f8fb031d8..36d4e207c64 100644 --- a/src/qt/locale/bitcoin_bn.ts +++ b/src/qt/locale/bitcoin_bn.ts @@ -163,7 +163,7 @@ Signing is only possible with addresses of the type 'legacy'. BitcoinApplication Settings file %1 might be corrupt or invalid. - 1%1 সেটিংস ফাইল টি সম্ভবত নষ্ট বা করাপ্ট + %1 সেটিংস ফাইল টি সম্ভবত নষ্ট বা করাপ্ট Runaway exception diff --git a/src/qt/locale/bitcoin_cmn.ts b/src/qt/locale/bitcoin_cmn.ts index 703de4da3d3..acb9eef6316 100644 --- a/src/qt/locale/bitcoin_cmn.ts +++ b/src/qt/locale/bitcoin_cmn.ts @@ -9,6 +9,10 @@ Create a new address 创建新地址 + + &New + 新建(&N) + Copy the currently selected address to the system clipboard 把目前选择的地址复制到系统粘贴板中 @@ -146,6 +150,10 @@ Signing is only possible with addresses of the type 'legacy'. This operation needs your wallet passphrase to unlock the wallet. 這個動作需要你的錢包密碼來解鎖錢包。 + + Unlock wallet + 解鎖錢包 + Change passphrase 修改密码 diff --git a/src/qt/locale/bitcoin_da.ts b/src/qt/locale/bitcoin_da.ts index 78ce4e7155b..973f3b5b994 100644 --- a/src/qt/locale/bitcoin_da.ts +++ b/src/qt/locale/bitcoin_da.ts @@ -242,7 +242,7 @@ Signing is only possible with addresses of the type 'legacy'. BitcoinApplication Settings file %1 might be corrupt or invalid. - Indstillings filen 1%1 kan være korrupt eller invalid. + Indstillings filen %1 kan være korrupt eller invalid. Runaway exception diff --git a/src/qt/locale/bitcoin_es.ts b/src/qt/locale/bitcoin_es.ts index 265447fbcde..96e8c723a58 100644 --- a/src/qt/locale/bitcoin_es.ts +++ b/src/qt/locale/bitcoin_es.ts @@ -3,11 +3,11 @@ AddressBookPage Right-click to edit address or label - Hacer clic derecho para editar la dirección o etiqueta + Pulsación secundaria para editar la dirección o etiqueta Create a new address - Crear una nueva dirección + Crea una dirección nueva &New @@ -64,8 +64,8 @@ These are your Bitcoin addresses for receiving payments. Use the 'Create new receiving address' button in the receive tab to create new addresses. Signing is only possible with addresses of the type 'legacy'. - Estas son tus direcciones de Bitcoin para recibir pagos. Usa el botón "Crear nueva dirección de recepción" en la pestaña "Recibir" para crear nuevas direcciones. -Solo es posible firmar con direcciones de tipo "legacy". + Estas son tus direcciones de Bitcoin para recibir pagos. Usa el botón «Crear nueva dirección de recepción» en la pestaña «Recibir» para crear nuevas direcciones. +Solo es posible firmar con direcciones de tipo «heredero». &Copy Address @@ -103,7 +103,7 @@ Solo es posible firmar con direcciones de tipo "legacy". Exporting Failed - Error al exportar + Exportación incorrecta @@ -165,11 +165,11 @@ Solo es posible firmar con direcciones de tipo "legacy". Warning: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! - Atención: Si cifras el monedero y pierdes la frase de contraseña, <b>¡PERDERÁS TODOS TUS BITCOINS</b>! + Atención: Si cifras el monedero y pierdes la frase de contraseña, <b>¡PERDERÁS TODOS TUS BITCOIN</b>! Are you sure you wish to encrypt your wallet? - ¿Seguro deseas cifrar el monedero? + ¿Seguro que deseas cifrar el monedero? Wallet encrypted @@ -177,7 +177,7 @@ Solo es posible firmar con direcciones de tipo "legacy". Enter the new passphrase for the wallet.<br/>Please use a passphrase of <b>ten or more random characters</b>, or <b>eight or more words</b>. - Introduce la nueva frase de contraseña para el monedero. <br/>Usa una frase de contraseña de <b>diez o más caracteres aleatorios</b>, u <b>ocho o más palabras</b>. + Introduce la nueva frase de contraseña para el monedero. <br/>Utilice una frase de contraseña de <b>diez o más caracteres aleatorios</b>, u <b>ocho o más palabras</b>. Enter the old passphrase and new passphrase for the wallet. @@ -197,7 +197,7 @@ Solo es posible firmar con direcciones de tipo "legacy". Wallet to be encrypted - Monedero para cifrar + Monedero para ser cifrado Your wallet is about to be encrypted. @@ -241,7 +241,7 @@ Solo es posible firmar con direcciones de tipo "legacy". Passphrase change failed - Error al cambiar la frase de contraseña + El cambio de la frase de contraseña es incorrecto The old passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. @@ -249,7 +249,7 @@ Solo es posible firmar con direcciones de tipo "legacy". Warning: The Caps Lock key is on! - Advertencia: ¡La tecla Bloq Mayus está activada! + Advertencia: ¡La tecla Bloq Mayús está activada! @@ -283,7 +283,7 @@ Solo es posible firmar con direcciones de tipo "legacy". An internal error occurred. %1 will attempt to continue safely. This is an unexpected bug which can be reported as described below. - Ha ocurrido un error interno. %1 intentará continuar de manera segura. Este es un error inesperado que puede ser comunicado de las formas que se muestran debajo. + Ha ocurrido un error interno. %1 intentará continuar de manera segura. Esto es un defecto inesperado que puede ser comunicado de las formas que se muestran debajo. @@ -296,11 +296,11 @@ Solo es posible firmar con direcciones de tipo "legacy". A fatal error occurred. Check that settings file is writable, or try running with -nosettings. Explanatory text shown on startup when the settings file could not be written. Prompts user to check that we have the ability to write to the file. Explains that the user has the option of running without a settings file. - Un error fatal ha ocurrido. Comprueba que el archivo de configuración admite escritura, o intenta ejecutar de nuevo el programa con -nosettings + Ha sucedido un error fatal. Comprueba que el archivo de configuración admite escritura, o intenta ejecutar de nuevo el programa con -nosettings. %1 didn't yet exit safely… - %1 todavía no ha terminado de forma segura... + %1 aún no ha terminado de forma segura... unknown @@ -308,11 +308,11 @@ Solo es posible firmar con direcciones de tipo "legacy". Embedded "%1" - "%1" insertado + «%1» empotrado Default system font "%1" - Fuente predeterminada del sistema "%1" + Fuente predeterminada del sistema «%1» Custom… @@ -348,7 +348,7 @@ Solo es posible firmar con direcciones de tipo "legacy". Block Relay Peer connection type that relays network information about blocks and not transactions or addresses. - Retransmisión de bloques + Retransmisión de bloque Feeler @@ -358,7 +358,7 @@ Solo es posible firmar con direcciones de tipo "legacy". Address Fetch Short-lived peer connection type that solicits known addresses from a peer. - Recuperación de direcciones + Recuperación de dirección None @@ -467,7 +467,7 @@ Solo es posible firmar con direcciones de tipo "legacy". Create a new wallet - Crear monedero nuevo + Crea un monedero nuevo &Minimize @@ -492,7 +492,7 @@ Solo es posible firmar con direcciones de tipo "legacy". Backup wallet to another location - Respaldar monedero en otra ubicación + Respaldar monedero en otro lugar Change the passphrase used for wallet encryption @@ -512,11 +512,15 @@ Solo es posible firmar con direcciones de tipo "legacy". &Encrypt Wallet… - &Cifrar monedero + &Cifrar monedero… + + + Encrypt the private keys that belong to your wallet + Cifra las claves privadas que pertenecen a su monedero &Backup Wallet… - &Copia de seguridad del monedero + &Respaldar monedero… &Change Passphrase… @@ -526,10 +530,18 @@ Solo es posible firmar con direcciones de tipo "legacy". Sign &message… Firmar &mensaje... + + Sign messages with your Bitcoin addresses to prove you own them + Firma mensajes con sus direcciones Bitcoin para proporcionarle sus propias + &Verify message… &Verificar mensaje... + + Verify messages to ensure they were signed with specified Bitcoin addresses + Verifique mensajes para asegurar que fueron firmados con direcciones especificadas de Bitcoin + &Load PSBT from file… &Cargar TBPF desde archivo... @@ -550,13 +562,25 @@ Solo es posible firmar con direcciones de tipo "legacy". Close All Wallets… Cerrar todos los monederos... + + &File + &Archivo + + + &Settings + &Parámetros + &Help - &Ayuda + Ay&uda + + + Tabs toolbar + Barra de pestañas Syncing Headers (%1%)… - Sincronizando cabeceras (1%1%) + Sincronizando cabeceras (%1%)… Synchronizing with network… @@ -572,19 +596,19 @@ Solo es posible firmar con direcciones de tipo "legacy". Connecting to peers… - Conectando con pares... + Conectando con parejas... Request payments (generates QR codes and bitcoin: URIs) - Solicitar pagos (genera código QR y URI's de Bitcoin) + Solicitar pagos (genera código QR y las URI de Bitcoin) Show the list of used sending addresses and labels - Editar la lista de las direcciones y etiquetas almacenadas + Muestra la lista de las direcciones y etiquetas enviadas utilizadas Show the list of used receiving addresses and labels - Mostrar la lista de direcciones de envío y etiquetas + Muestra la lista de direcciones de recepción y etiquetas &Command-line options @@ -607,7 +631,7 @@ Solo es posible firmar con direcciones de tipo "legacy". Last received block was generated %1 ago. - El último bloque recibido fue generado hace %1 horas. + El último bloque recibido fue generado hace %1 . Transactions after this will not yet be visible. @@ -635,12 +659,16 @@ Solo es posible firmar con direcciones de tipo "legacy". Load Partially Signed Bitcoin Transaction from clipboard - Cargar una transacción de Bitcoin parcialmente firmada desde el Portapapeles + Cargar Transacción de Bitcoin Parcialmente Firmada desde el portapapeles Node window Ventana del nodo + + Open node debugging and diagnostic console + Abrir nodo depurando y diagnosticando consola + &Sending addresses Direcciones de &envío @@ -659,7 +687,7 @@ Solo es posible firmar con direcciones de tipo "legacy". Open a wallet - Abrir un monedero + Abre un monedero Close wallet @@ -673,7 +701,7 @@ Solo es posible firmar con direcciones de tipo "legacy". Restore a wallet from a backup file Status tip for Restore Wallet menu item - Restaurar monedero desde un archivo de respaldo + Restaura un monedero desde un archivo de respaldo Close all wallets @@ -685,11 +713,11 @@ Solo es posible firmar con direcciones de tipo "legacy". Migrate a wallet - Migrar un monedero + Migra un monedero Show the %1 help message to get a list with possible Bitcoin command-line options - Muestra el mensaje de ayuda %1 para obtener una lista con posibles opciones de línea de comandos de Bitcoin. + Muestra el mensaje de ayuda %1 para obtener una lista con posibles opciones de línea de comandos de Bitcoin &Mask values @@ -697,7 +725,7 @@ Solo es posible firmar con direcciones de tipo "legacy". Mask the values in the Overview tab - Ocultar los valores de la ventana de previsualización + Ocultar los valores en la pestaña de previsualización No wallets available @@ -711,7 +739,7 @@ Solo es posible firmar con direcciones de tipo "legacy". Load Wallet Backup The title for Restore Wallet File Windows - Cargar copia de seguridad del monedero + Cargar respaldo del monedero Restore Wallet @@ -758,12 +786,12 @@ Solo es posible firmar con direcciones de tipo "legacy". Click for more actions. A substring of the tooltip. "More actions" are available via the context menu. - Haz clic para ver más acciones. + Pulse para ver más acciones. Show Peers tab A context menu item. The "Peers tab" is an element of the "Node window". - Mostrar pestaña de pares + Mostrar pestaña de parejas Disable network activity @@ -777,7 +805,7 @@ Solo es posible firmar con direcciones de tipo "legacy". Pre-syncing Headers (%1%)… - Presincronizando cabeceras (%1%)... + Pre-sincronizando cabeceras (%1%)... Error creating wallet @@ -785,7 +813,7 @@ Solo es posible firmar con direcciones de tipo "legacy". Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets) - No se puede crear un nuevo monedero, ya que el software se compiló sin compatibilidad con sqlite (requerido para monederos basados en descriptores) + No se puede crear un nuevo monedero, ya que el software fue compilado sin compatibilidad con sqlite (requerido para descriptor de monederos) Warning: %1 @@ -833,7 +861,7 @@ Solo es posible firmar con direcciones de tipo "legacy". Incoming transaction - Transacción entrante + Transacción recibida HD key generation is <b>enabled</b> @@ -887,7 +915,7 @@ Solo es posible firmar con direcciones de tipo "legacy". After Fee: - Después de la comisión: + Tras comisión: Change: @@ -911,11 +939,11 @@ Solo es posible firmar con direcciones de tipo "legacy". Received with label - Recibido con dirección + Recibido con etiqueta Received with address - Recibido con etiqueta + Recibido con dirección Date @@ -967,7 +995,7 @@ Solo es posible firmar con direcciones de tipo "legacy". Copy after fee - Copiar después de la comisión + Copiar tras comisión Copy bytes @@ -983,7 +1011,7 @@ Solo es posible firmar con direcciones de tipo "legacy". Can vary +/- %1 satoshi(s) per input. - Puede variar en +/- %1 satoshi(s) por entrada. + Puede variar en ± %1 satoshi(s) por entrada. (no label) @@ -1048,7 +1076,7 @@ Solo es posible firmar con direcciones de tipo "legacy". Are you sure you wish to migrate the wallet <i>%1</i>? - ¿Seguro deseas migrar el monedero <i>%1</i>? + ¿Seguro que deseas migrar el monedero <i>%1</i>? Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made. @@ -1060,7 +1088,7 @@ The migration process will create a backup of the wallet before migrating. This Si este monedero contiene scripts solo de observación, se creará un nuevo monedero que los contenga. Si este monedero contiene scripts solucionables pero no de observación, se creará un nuevo monedero diferente que los contenga. -El proceso de migración creará un respaldo del monedero antes de migrar. Este archivo de respaldo se llamará <wallet name>-<timestamp>.legacy.bak y se encontrará en el directorio de este monedero. En el caso de una migración incorrecta, el respaldo puede restaurarse con la funcionalidad "Restaurar monedero". +El proceso de migración creará un respaldo del monedero antes de migrar. Este archivo de respaldo se llamará <wallet name>-<timestamp>.legacy.bak y se encontrará en el directorio de este monedero. En el caso de una migración incorrecta, el respaldo puede restaurarse con la funcionalidad «Restaurar monedero». Migrate Wallet @@ -1072,11 +1100,11 @@ El proceso de migración creará un respaldo del monedero antes de migrar. Este The wallet '%1' was migrated successfully. - La migración del monedero "%1" se ha realizado correctamente. + La migración del monedero «%1» se ha realizado correctamente. Watchonly scripts have been migrated to a new wallet named '%1'. - Los scripts solo de observación se han migrado a un nuevo monedero llamado "%1". + Los guiones solo de observación se han migrado a un monedero nuevo llamado «%1». Solvable but not watched scripts have been migrated to a new wallet named '%1'. @@ -1084,7 +1112,7 @@ El proceso de migración creará un respaldo del monedero antes de migrar. Este Migration failed - Migración errónea + Migración incorrecta Migration Successful @@ -1095,7 +1123,7 @@ El proceso de migración creará un respaldo del monedero antes de migrar. Este OpenWalletActivity Open wallet failed - Error al abrir monedero + Apertura de monedero incorrecta Open wallet warning @@ -1148,7 +1176,7 @@ El proceso de migración creará un respaldo del monedero antes de migrar. Este Are you sure you wish to close the wallet <i>%1</i>? - ¿Seguro deseas cerrar el monedero <i>%1</i>? + ¿Seguro que deseas cerrar el monedero <i>%1</i>? Closing the wallet for too long can result in having to resync the entire chain if pruning is enabled. @@ -1199,7 +1227,7 @@ El proceso de migración creará un respaldo del monedero antes de migrar. Este Disable private keys for this wallet. Wallets with private keys disabled will have no private keys and cannot have an HD seed or imported private keys. This is ideal for watch-only wallets. - Deshabilita las claves privadas para este monedero. Los monederos con claves privadas deshabilitadas no tendrán claves privadas y no podrán tener ni una semilla HD ni claves privadas importadas. Esto es ideal para monederos solo de observación. + Deshabilita las claves privadas para este monedero. Los monederos con claves privadas deshabilitadas no tendrán claves privadas y no podrán tener ni una semilla HD ni claves privadas importadas. Esto es ideal para monederos solo de vigilancia. Disable Private Keys @@ -1243,11 +1271,11 @@ El proceso de migración creará un respaldo del monedero antes de migrar. Este The label associated with this address list entry - La etiqueta asociada con esta entrada en la lista de direcciones + La etiqueta asociada con este apunte en la lista de direcciones The address associated with this address list entry. This can only be modified for sending addresses. - La dirección asociada con esta entrada en la lista de direcciones. Solo se puede modificar para las direcciones de envío. + La dirección asociada con este apunte en la lista de direcciones. Solo se puede modificar para las direcciones de envío. &Address @@ -1267,11 +1295,11 @@ El proceso de migración creará un respaldo del monedero antes de migrar. Este The entered address "%1" is not a valid Bitcoin address. - La dirección introducida "%1" no es una dirección Bitcoin válida. + La dirección introducida «%1» no es una dirección Bitcoin válida. Address "%1" already exists as a receiving address with label "%2" and so cannot be added as a sending address. - La dirección "%1" ya existe como dirección de recepción con la etiqueta "%2" y, por lo tanto, no se puede agregar como dirección de envío. + La dirección «%1» ya existe como dirección de recepción con la etiqueta «%2» y, por lo tanto, no se puede agregar como dirección de envío. The entered address "%1" is already in the address book with label "%2". @@ -1390,7 +1418,7 @@ El proceso de migración creará un respaldo del monedero antes de migrar. Este When you click OK, %1 will begin to download and process the full %4 block chain (%2 GB) starting with the earliest transactions in %3 when %4 initially launched. - Al hacer clic en "Aceptar", %1 iniciará el proceso de descarga y procesará la cadena de bloques %4 completa (%2 GB), empezando con la transacción más antigua en %3 cuando %4 se ejecutó inicialmente. + Cuando pulse «Aceptar», %1 iniciará el proceso de descarga y procesará la cadena del bloque %4 completa (%2 GB), empezando con la transacción más antigua en %3 cuando %4 se ejecutó inicialmente. If you have chosen to limit block chain storage (pruning), the historical data must still be downloaded and processed, but will be deleted afterward to keep your disk usage low. @@ -1443,7 +1471,7 @@ El proceso de migración creará un respaldo del monedero antes de migrar. Este Attempting to spend bitcoins that are affected by not-yet-displayed transactions will not be accepted by the network. - La red no aceptará intentar gastar bitcoins que se vean afectados por transacciones aún no mostradas. + La red no aceptará intentar gastar los bitcoin que se vean afectados por transacciones aún no mostradas. Number of blocks left @@ -1451,11 +1479,11 @@ El proceso de migración creará un respaldo del monedero antes de migrar. Este Unknown… - Desconocido... + Desconocido… calculating… - calculando... + calculando… Last block time @@ -1563,7 +1591,7 @@ El proceso de migración creará un respaldo del monedero antes de migrar. Este Font in the Overview tab: - Fuente en la pestaña de vista general: + Tipografía en la pestaña de vista general: Options set in this dialog are overridden by the command line: @@ -1722,7 +1750,7 @@ El proceso de migración creará un respaldo del monedero antes de migrar. Este &Display - &Visualización + &Exhibir User Interface &language: @@ -1794,7 +1822,7 @@ El proceso de migración creará un respaldo del monedero antes de migrar. Este Current settings will be backed up at "%1". Text explaining to the user that the client's current settings will be backed up at a specific location. %1 is a stand-in argument for the backup location's path. - Los parámetros actuales se guardarán en "%1". + Los parámetros actuales se guardarán en «%1». Client will be shut down. Do you want to proceed? @@ -1809,7 +1837,7 @@ El proceso de migración creará un respaldo del monedero antes de migrar. Este The configuration file is used to specify advanced user options which override GUI settings. Additionally, any command-line options will override this configuration file. Explanatory text about the priority order of instructions considered by client. The order from high to low being: command-line, configuration file, GUI settings. - El archivo de configuración se usa para especificar opciones avanzadas del usuario, que remplazan la configuración de la GUI. Además, las opciones de la línea de comandos remplazarán este archivo de configuración. + El archivo de configuración se usa para especificar opciones avanzadas del usuario, que remplazan la configuración de la IGU. Además, las opciones de la línea de comandos remplazarán este archivo de configuración. Continue @@ -1836,7 +1864,7 @@ El proceso de migración creará un respaldo del monedero antes de migrar. Este OptionsModel Could not read setting "%1", %2. - No se puede leer la configuración "%1", %2. + No se puede leer la configuración «%1», %2. @@ -1911,7 +1939,7 @@ El proceso de migración creará un respaldo del monedero antes de migrar. Este Privacy mode activated for the Overview tab. To unmask the values, uncheck Settings->Mask values. - Modo de privacidad activado para la pestaña de vista general. Para mostrar los valores, anula la selección de "Configuración->Ocultar valores". + Modo de privacidad activado para la pestaña de vista general. Para mostrar los valores, anula la selección de «Configuración → Ocultar valores». @@ -2082,7 +2110,7 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI Payment request file handling - Gestión de archivos de solicitud de pago + Negociación del archivo de solicitud de pago @@ -2095,7 +2123,7 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI Peer Title of Peers Table column which contains a unique number used to identify a connection. - Par + Pareja Age @@ -2195,7 +2223,7 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI To specify a non-default location of the data directory use the '%1' option. - Para especificar una localización personalizada del directorio de datos, usa la opción "%1". + Para especificar un lugar personalizado del directorio de datos, utiliza la opción «%1». Blocksdir @@ -2267,11 +2295,11 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI &Peers - &Pares + &Parejas Banned peers - Pares bloqueados + Parejas bloqueadas Select a peer to view detailed information. @@ -2323,7 +2351,7 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI The mapped Autonomous System used for diversifying peer selection. - El sistema autónomo asignado que se usó para diversificar la selección de pares. + El sistema autónomo asignado que se usó para diversificar la selección de parejas. Mapped AS @@ -2332,7 +2360,7 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI Whether we relay addresses to this peer. Tooltip text for the Address Relay field in the peer details area, which displays whether we relay addresses to this peer (Yes/No). - Si retransmitimos las direcciones a este par. + Si retransmitimos las direcciones a esta pareja. Address Relay @@ -2342,12 +2370,12 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI The total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting). Tooltip text for the Addresses Processed field in the peer details area, which displays the total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting). - El número total de direcciones recibidas desde este par que han sido procesadas (excluyendo las direcciones que han sido desestimadas debido a la limitación de volumen). + El número total de direcciones recibidas desde este par que han sido procesadas (excluyendo las direcciones que han sido desestimadas debido a la limitación de proporción). The total number of addresses received from this peer that were dropped (not processed) due to rate-limiting. Tooltip text for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting. - El número total de direcciones recibidas desde este par que han sido desestimadas (no procesadas) debido a la limitación de volumen. + El número total de direcciones recibidas desde esta pareja que han sido desestimadas (no procesadas) debido a la limitación de proporción. Addresses Processed @@ -2357,7 +2385,7 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI Addresses Rate-Limited Text title for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting. - Direcciones desestimadas por limitación de volumen + Direcciones desestimadas por proporción limitada User Agent @@ -2373,15 +2401,15 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI Open the %1 debug log file from the current data directory. This can take a few seconds for large log files. - Abre el archivo de registro de depuración %1 del directorio de datos actual. Esto puede tomar unos segundos para archivos de registro grandes. + Abre el archivo de registro de depuración %1 del directorio de datos actual. Esto puede tomar unos segundos para boletines grandes. Decrease font size - Reducir el tamaño de la fuente + Reducir el tamaño de la tipografía Increase font size - Aumentar el tamaño de la fuente + Aumentar el tamaño de la tipografía Permissions @@ -2389,11 +2417,11 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI The direction and type of peer connection: %1 - El sentido y el tipo de conexión entre pares: %1 + La dirección y el tipo de conexión entre parejas: %1 Direction/Type - Sentido/Tipo + Dirección/Tipo The BIP324 session ID string in hex. @@ -2519,7 +2547,7 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI Outbound Feeler: short-lived, for testing addresses Explanatory text for a short-lived outbound peer connection that is used to test the aliveness of known addresses. - Sensor saliente: de corta duración para probar direcciones + Sensor saliente: de duración breve para probar direcciones Outbound Address Fetch: short-lived, for soliciting addresses @@ -2529,7 +2557,7 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI detecting: peer could be v1 or v2 Explanatory text for "detecting" transport type. - Detectando: el par puede ser v1 o v2 + detectando: el par puede ser v1 o v2 v1: unencrypted, plaintext transport protocol @@ -2543,15 +2571,15 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI we selected the peer for high bandwidth relay - Seleccionamos el par para la retransmisión de banda ancha + seleccionamos el par para la retransmisión de banda ancha the peer selected us for high bandwidth relay - El par nos seleccionó para la retransmisión de banda ancha + el par nos seleccionó para la retransmisión de banda ancha no high bandwidth relay selected - No se seleccionó la retransmisión de banda ancha + no se seleccionó la retransmisión de banda ancha &Copy address @@ -2605,7 +2633,7 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI Executing command using "%1" wallet - Ejecutar comando con el monedero "%1" + Ejecutar comando con el monedero «%1» Welcome to the %1 RPC console. @@ -2631,7 +2659,7 @@ Para obtener más información sobre cómo usar esta consola, escribe %6. (peer: %1) - (par: %1) + (pareja: %1) via %1 @@ -2643,11 +2671,11 @@ Para obtener más información sobre cómo usar esta consola, escribe %6. To - A + Destino From - De + Remite Ban for @@ -2678,7 +2706,7 @@ Para obtener más información sobre cómo usar esta consola, escribe %6. An optional message to attach to the payment request, which will be displayed when the request is opened. Note: The message will not be sent with the payment over the Bitcoin network. - Mensaje opcional para adjuntar a la solicitud de pago, que se mostrará cuando se abra la solicitud. Nota: Este mensaje no se enviará con el pago a través de la red de Bitcoin. + Mensaje opcional para adjuntar a la solicitud de pago, que se mostrará cuando se abra la solicitud. Nota: El mensaje no se enviará con el pago a través de la red de Bitcoin. An optional label to associate with the new receiving address. @@ -2706,11 +2734,11 @@ Para obtener más información sobre cómo usar esta consola, escribe %6. Clear all fields of the form. - Borrar todos los campos del formulario. + Vaciar todos los campos del formulario. Clear - Borrar + Vaciar Requested payments history @@ -2718,7 +2746,7 @@ Para obtener más información sobre cómo usar esta consola, escribe %6. Show the selected request (does the same as double clicking an entry) - Mostrar la solicitud seleccionada (equivale a hacer doble clic en una entrada) + Mostrar la solicitud seleccionada (equivale a pulsación doble en un apunte) Show @@ -2726,7 +2754,7 @@ Para obtener más información sobre cómo usar esta consola, escribe %6. Remove the selected entries from the list - Eliminar las entradas seleccionadas de la lista + Elimina los apuntes seleccionados de la lista Remove @@ -2752,6 +2780,10 @@ Para obtener más información sobre cómo usar esta consola, escribe %6. Copy &amount Copiar &importe + + Base58 (Legacy) + Base58 (Heredada) + Not recommended due to higher fees and less protection against typos. No se recomienda debido a las altas comisiones y la poca protección contra errores tipográficos. @@ -2766,7 +2798,7 @@ Para obtener más información sobre cómo usar esta consola, escribe %6. Bech32m (BIP-350) is an upgrade to Bech32, wallet support is still limited. - Bech32m (BIP-350) es una actualización de Bech32. La compatibilidad con el monedero todavía es limitada. + Bech32m (BIP-350) es una actualización de Bech32. La compatibilidad con el monedero aún está limitada. Could not unlock wallet. @@ -2875,7 +2907,7 @@ Para obtener más información sobre cómo usar esta consola, escribe %6. automatically selected - Seleccionado automáticamente + auto-seleccionado Insufficient funds! @@ -2903,7 +2935,7 @@ Para obtener más información sobre cómo usar esta consola, escribe %6. If this is activated, but the change address is empty or invalid, change will be sent to a newly generated address. - Si se activa, pero la dirección de cambio está vacía o es inválida, el cambio se enviará a una dirección generada recientemente. + Si se activa, pero la dirección de cambio está vacía o no es válida, el cambio se enviará a una dirección generada recientemente. Custom change address @@ -2965,9 +2997,9 @@ Para obtener más información sobre cómo usar esta consola, escribe %6. Specify a custom fee per kB (1,000 bytes) of the transaction's virtual size. Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satoshis per kvB" for a transaction size of 500 virtual bytes (half of 1 kvB) would ultimately yield a fee of only 50 satoshis. - Especifica una comisión personalizada por kB (1000 bytes) del tamaño virtual de la transacción. + Especifica una comisión personalizada por kB (1.000 bytes) del tamaño virtual de la transacción. -Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por kvB" para una transacción de 500 bytes virtuales (la mitad de 1 kvB) supondría finalmente una comisión de solo 50 satoshis. +Nota: Dado que la comisión se calcula por byte, una tasa de «100 satoshis por kvB» para una transacción de 500 bytes virtuales (la mitad de 1 kvB) supondría finalmente una comisión de solo 50 satoshis. When there is less transaction volume than space in the blocks, miners as well as relaying nodes may enforce a minimum fee. Paying only this minimum fee is just fine, but be aware that this can result in a never confirming transaction once there is more demand for bitcoin transactions than the network can process. @@ -2975,27 +3007,27 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k A too low fee might result in a never confirming transaction (read the tooltip) - Si la comisión es demasiado baja, es posible que la transacción nunca se confirme (leer la información en pantalla). + Si la comisión es demasiado baja, es posible que la transacción nunca se confirme (lea el consejo). (Smart fee not initialized yet. This usually takes a few blocks…) - (La comisión inteligente no se ha inicializado todavía. Esto tarda normalmente algunos bloques…) + (La comisión inteligente aún no se ha inicializado. Esto tarda normalmente algunos bloques…) Confirmation time target: - Objetivo de tiempo de confirmación: + Hora de confirmación del destino: Enable Replace-By-Fee - Activar "Reemplazar por comisión" + Activar «Reemplazar por comisión» With Replace-By-Fee (BIP-125) you can increase a transaction's fee after it is sent. Without this, a higher fee may be recommended to compensate for increased transaction delay risk. - Con la función "Reemplazar por comisión" (BIP-125), puedes aumentar la comisión de una transacción después de enviarla. Sin esta, es posible que se recomiende una comisión más alta para compensar el mayor riesgo de retraso de la transacción. + Con la función «Reemplazar por comisión» (BIP-125), puedes aumentar la comisión de una transacción después de enviarla. Sin ésta, es posible que se recomiende una comisión más alta para compensar el mayor riesgo de retraso de la transacción. Clear &All - Borrar &todo + Vaciar &todo Balance: @@ -3023,7 +3055,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k Copy after fee - Copiar después de la comisión + Copiar tras comisión Copy bytes @@ -3044,12 +3076,12 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k Connect your hardware wallet first. - Conecta primero tu monedero de hardware. + Conecta primero tu monedero hardware. Set external signer script path in Options -> Wallet "External signer" means using devices such as hardware wallets. - Establecer la ruta al script del firmante externo en "Opciones -> Monedero" + Establecer la ruta al script del firmante externo en «Opciones → Monedero» Cr&eate Unsigned @@ -3057,11 +3089,11 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet. - Crea una transacción de Bitcoin parcialmente firmada (TBPF) para usarla, por ejemplo, con un monedero %1 sin conexión o un monedero de hardware compatible con TBPF. + Crea una transacción de Bitcoin parcialmente firmada (TBPF) para usarla, por ejemplo, con un monedero %1 sin conexión o un monedero hardware compatible con TBPF. %1 to '%2' - %1 a "%2" + %1 a ‘%2’ %1 to %2 @@ -3069,21 +3101,21 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k To review recipient list click "Show Details…" - Para consultar la lista de destinatarios, haz clic en "Mostrar detalles..." + Para consultar la lista de destinatarios, pulse en «Mostrar detalles…» Sign failed - Error de firma + Firma incorrecta External signer not found "External signer" means using devices such as hardware wallets. - No se encontró el dispositivo firmante externo + No se encontró el firmante externo External signer failure "External signer" means using devices such as hardware wallets. - Error de firmante externo + Firmante externo incorrecto Save Transaction Data @@ -3109,7 +3141,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k You can increase the fee later (signals Replace-By-Fee, BIP-125). - Puedes aumentar la comisión después (indica "Reemplazar por comisión", BIP-125). + Puedes aumentar la comisión después (indica «Reemplazar por comisión», BIP-125). Please, review your transaction proposal. This will produce a Partially Signed Bitcoin Transaction (PSBT) which you can save or copy and then sign with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet. @@ -3118,7 +3150,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k %1 from wallet '%2' - %1 desde el monedero "%2" + %1 desde el monedero «%2» Do you want to create this transaction? @@ -3133,7 +3165,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k Please, review your transaction. Text to prompt a user to review the details of the transaction they are attempting to send. - Revisa la transacción. + Revisa su transacción. Transaction fee @@ -3141,7 +3173,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k Not signalling Replace-By-Fee, BIP-125. - No indica "Reemplazar por comisión", BIP-125. + No indica «Reemplazar por comisión», BIP-125. Total Amount @@ -3253,7 +3285,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k Remove this entry - Eliminar esta entrada + Eliminar este apunte The amount to send in the selected unit @@ -3281,7 +3313,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k A message that was attached to the bitcoin: URI which will be stored with the transaction for your reference. Note: This message will not be sent over the Bitcoin network. - Un mensaje adjunto al URI de tipo "bitcoin:" que se almacenará con la transacción a modo de referencia. Nota: Este mensaje no se enviará por la red de Bitcoin. + Un mensaje adjunto al URI de tipo «bitcoin:» que se almacenará con la transacción a modo de referencia. Nota: Este mensaje no se enviará por la red de Bitcoin. @@ -3307,7 +3339,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k You can sign messages/agreements with your legacy (P2PKH) addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. - Puedes firmar mensajes o acuerdos con tus direcciones tipo legacy (P2PKH) para demostrar que puedes recibir los bitcoins que se envíen a ellas. Ten cuidado de no firmar cosas confusas o al azar, ya que los ataques de phishing pueden tratar de engañarte para que les envíes la firma con tu identidad. Firma solo declaraciones totalmente detalladas con las que estés de acuerdo. + Puedes firmar mensajes o acuerdos con tus direcciones tipo heredado (P2PKH) para demostrar que puedes recibir los bitcoin que se envíen a ellas. Ten cuidado de no firmar cosas confusas o al azar, ya que los ataques de phishing pueden tratar de engañarte para que les envíes la firma con tu identidad. Firma solo declaraciones totalmente detalladas con las que estés de acuerdo. The Bitcoin address to sign the message with @@ -3347,7 +3379,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k Clear &All - Borrar &todo + Vaciar &todo &Verify Message @@ -3371,7 +3403,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k Verify the message to ensure it was signed with the specified Bitcoin address - Verifica el mensaje para asegurarte de que se firmó con la dirección de Bitcoin especificada. + Verifica el mensaje para asegurarte que se firmó con la dirección de Bitcoin especificada. Verify &Message @@ -3383,7 +3415,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k Click "Sign Message" to generate signature - Hacer clic en "Firmar mensaje" para generar una firma + Pulse en «Firmar mensaje» para generar una firma The entered address is invalid. @@ -3395,7 +3427,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again. - La dirección ingresada no se refiere a una clave tipo legacy (P2PKH). La firma de mensajes para direcciones SegWit y de otros tipos que no sean P2PKH no es compatible con esta versión de %1. Comprueba la dirección e inténtalo de nuevo. + La dirección ingresada no se refiere a una clave tipo heredado (P2PKH). La firma de mensajes para direcciones SegWit y de otros tipos que no sean P2PKH no es compatible con esta versión de %1. Comprueba la dirección e inténtalo de nuevo. Wallet unlock was cancelled. @@ -3442,11 +3474,11 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k SplashScreen (press q to shutdown and continue later) - (Presionar q para apagar y seguir luego) + (presione q para apagar y seguir luego) press q to shutdown - Presionar q para apagar + presionar q para apagar @@ -3454,7 +3486,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k conflicted with a transaction with %1 confirmations Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that conflicts with a confirmed transaction. - Hay un conflicto con una transacción con %1 confirmaciones + hay un conflicto con una transacción con %1 confirmaciones 0/unconfirmed, in memory pool @@ -3499,7 +3531,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k From - De + Remite unknown @@ -3507,7 +3539,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k To - A + Destino own address @@ -3590,7 +3622,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. - Las monedas generadas deben madurar %1 bloques antes de que se puedan gastar. Cuando generaste este bloque, se transmitió a la red para agregarlo a la cadena de bloques. Si no logra entrar a la cadena, su estado cambiará a "no aceptado" y no se podrá gastar. Esto puede ocurrir ocasionalmente si otro nodo genera un bloque a pocos segundos del tuyo. + Las monedas generadas deben madurar %1 bloques antes de que se puedan gastar. Cuando generaste este bloque, se transmitió a la red para agregarlo a la cadena de bloques. Si no logra entrar a la cadena, su estado cambiará a «no aceptado» y no se podrá gastar. Esto puede ocurrir ocasionalmente si otro nodo genera un bloque a pocos segundos del tuyo. Debug information @@ -3767,7 +3799,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k Enter address, transaction id, or label to search - Ingresar la dirección, el identificador de transacción o la etiqueta para buscar + Ingresar la dirección, el ID de transacción o la etiqueta para buscar Min amount @@ -3837,7 +3869,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k Watch-only - Solo de observación + Solo observación Date @@ -3855,13 +3887,9 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k Address Dirección - - ID - Identificador - Exporting Failed - Error al exportar + Exportación incorrecta There was an error trying to save the transaction history to %1. @@ -3891,7 +3919,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k Go to File > Open Wallet to load a wallet. - OR - No se ha cargado ningún monedero. -Ve a "Archivo > Abrir monedero" para cargar uno. +Ve a Archivo > Abrir monedero para cargar uno. - O - @@ -3984,7 +4012,7 @@ Ve a "Archivo > Abrir monedero" para cargar uno. Can't display address - No se puede mostrar la dirección + No puede exhibir la dirección @@ -4075,11 +4103,11 @@ Ve a "Archivo > Abrir monedero" para cargar uno. Error: Dumpfile format record is incorrect. Got "%s", expected "format". - Error: El registro del formato del archivo de volcado es incorrecto. Se obtuvo "%s", mientras que se esperaba "formato". + Error: El registro del formato del archivo de volcado es incorrecto. Se obtuvo «%s», mientras que se esperaba «formato». Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s". - Error: El registro del identificador del archivo de volcado es incorrecto. Se obtuvo "%s", mientras que se esperaba "%s". + Error: El registro del identificador del archivo de volcado es incorrecto. Se obtuvo «%s», mientras que se esperaba «%s». Error: Dumpfile version is not supported. This version of bitcoin-wallet only supports version 1 dumpfiles. Got dumpfile with version %s @@ -4087,11 +4115,11 @@ Ve a "Archivo > Abrir monedero" para cargar uno. Error: Legacy wallets only support the "legacy", "p2sh-segwit", and "bech32" address types - Error: Los monederos de tipo "legacy" solo admiten los tipos de dirección "legacy", "p2sh-segwit" y "bech32". + Error: Los monederos de tipo heredado solo admiten los tipos de dirección heredado, "p2sh-segwit" y "bech32". Error: Unable to produce descriptors for this legacy wallet. Make sure to provide the wallet's passphrase if it is encrypted. - Error: No se pueden producir descriptores para este monedero de tipo "legacy". Asegúrate de proporcionar la frase de contraseña del monedero si está encriptada. + Error: No se pueden producir descriptores para este monedero de tipo heredado. Asegúrate de proporcionar la frase de contraseña del monedero si está encriptada. File %s already exists. If you are sure this is what you want, move it out of the way first. @@ -4099,7 +4127,7 @@ Ve a "Archivo > Abrir monedero" para cargar uno. Invalid or corrupt peers.dat (%s). If you believe this is a bug, please report it to %s. As a workaround, you can move the file (%s) out of the way (rename, move, or delete) to have a new one created on the next start. - Archivo "peers.dat" inválido o corrupto (%s). Si crees que se trata de un error, infórmalo a %s. Como alternativa, puedes quitar el archivo %s (renombrarlo, moverlo o eliminarlo) para que se cree uno nuevo en el siguiente inicio. + Archivo «peers.dat» inválido o corrupto (%s). Si crees que se trata de un error, infórmalo a %s. Como alternativa, puedes quitar el archivo %s (renombrarlo, moverlo o eliminarlo) para que se cree uno nuevo en el siguiente inicio. Invalid value detected for '-wallet' or '-nowallet'. '-wallet' requires a string value, while '-nowallet' accepts only '1' to disable all wallets @@ -4107,7 +4135,7 @@ Ve a "Archivo > Abrir monedero" para cargar uno. More than one onion bind address is provided. Using %s for the automatically created Tor onion service. - Se proporciona más de una dirección de enlace onion. Se está usando %s para el servicio onion de Tor creado automáticamente. + Se proporciona más de una dirección de vínculo onion. Se está usando %s para el servicio onion de Tor creado automáticamente. No dump file provided. To use createfromdump, -dumpfile=<filename> must be provided. @@ -4143,7 +4171,7 @@ Ve a "Archivo > Abrir monedero" para cargar uno. Rename of '%s' -> '%s' failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup. - Error al cambiar el nombre de "%s" a "%s". Para resolverlo, mueve o elimina manualmente el directorio %s de la instantánea no válida. De lo contrario, encontrarás el mismo error de nuevo en el siguiente inicio. + Error al cambiar el nombre de ‘%s’ a ‘%s’. Para resolverlo, mueve o elimina manualmente el directorio %s de la instantánea no válida. De lo contrario, encontrarás el mismo error de nuevo en el siguiente inicio. SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported @@ -4289,11 +4317,11 @@ Ve a "Archivo > Abrir monedero" para cargar uno. Failed to rename invalid peers.dat file. Please move or delete it and try again. - No se ha podido cambiar el nombre del archivo "peers.dat" inválido. Muévelo o elimínalo, e intenta de nuevo. + No se ha podido cambiar el nombre del archivo «peers.dat» no válido. Muévelo o elimínalo, e intenta de nuevo. Fee estimation failed. Fallbackfee is disabled. Wait a few blocks or enable %s. - Error al calcular la comisión. La opción "fallbackfee" está desactivada. Espera algunos bloques o activa %s. + Error al calcular la comisión. La opción «fallbackfee» está desactivada. Espera algunos bloques o activa %s. Flushing block file to disk failed. This is likely the result of an I/O error. @@ -4309,15 +4337,15 @@ Ve a "Archivo > Abrir monedero" para cargar uno. Invalid amount for %s=<amount>: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions) - Importe inválido para %s=<amount>: "%s" (debe ser al menos la comisión mínima de retransmisión de %s para evitar transacciones atascadas) + Importe inválido para %s=<amount>: «%s» (debe ser al menos la comisión mínima de retransmisión de %s para evitar transacciones atascadas) Maximum transaction weight is less than transaction weight without inputs - El peso máximo de la transacción es menor que el peso de la transacción sin entradas. + La ponderación máxima de la transacción es menor que la ponderación de la transacción sin entradas. Maximum transaction weight is too low, can not accommodate change output - El peso máximo de la transacción es demasiado bajo, por lo que no puede incluir la salida de cambio. + La ponderación máxima de la transacción es demasiado bajo, por lo que no puede incluir la salida de cambio. Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided @@ -4337,7 +4365,7 @@ Ve a "Archivo > Abrir monedero" para cargar uno. Rename of '%s' -> '%s' failed. Cannot clean up the background chainstate leveldb directory. - Ha fallado el cambio de nombre de ''%s" a ''%s". No se puede limpiar el directorio leveldb del estado de la cadena de fondo. + Ha fallado el cambio de nombre de ‘%s’ a ‘%s’. No se puede limpiar el directorio leveldb del estado de la cadena de fondo. The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs @@ -4411,7 +4439,7 @@ No se puede restaurar el respaldo del monedero. Assumeutxo data not found for the given blockhash '%s'. - No se han encontrado datos assumeutxo para el blockhash indicado "%s". + No se han encontrado datos assumeutxo para el blockhash indicado ‘%s’. Block verification was interrupted @@ -4427,7 +4455,7 @@ No se puede restaurar el respaldo del monedero. Copyright (C) %i-%i - Derechos de autor (C) %i-%i + © %i-%i Corrupt block found indicating potential hardware failure. @@ -4435,7 +4463,7 @@ No se puede restaurar el respaldo del monedero. Corrupted block database detected - Se ha detectado que la base de datos de bloques está dañada. + Se ha detectado que la base de datos de bloques está dañada Could not find asmap file %s @@ -4479,15 +4507,15 @@ No se puede restaurar el respaldo del monedero. Error loading %s: Private keys can only be disabled during creation - Error al cargar %s: Las claves privadas solo se pueden deshabilitar durante la creación. + Error al cargar %s: Las claves privadas solo se pueden deshabilitar durante la creación Error loading %s: Wallet corrupted - Error al cargar %s: monedero dañado. + Error al cargar %s: monedero corrupto Error loading %s: Wallet requires newer version of %s - Error al cargar %s: el monedero requiere una versión más reciente de %s. + Error al cargar %s: el monedero requiere una versión más reciente de %s Error loading block database @@ -4691,39 +4719,39 @@ No se puede restaurar el respaldo del monedero. Invalid -i2psam address or hostname: '%s' - Dirección o nombre de host de -i2psam inválido: "%s" + Dirección o nombre de host de -i2psam no válido: ‘%s’ Invalid -onion address or hostname: '%s' - Dirección o nombre de host de -onion inválido: "%s" + Dirección o nombre de host de -onion no válido: ‘%s’ Invalid -proxy address or hostname: '%s' - Dirección o nombre de host de -proxy inválido: "%s" + Dirección o nombre de host de -proxy inválido: ‘%s’ Invalid P2P permission: '%s' - Permiso P2P inválido: "%s" + Permiso P2P inválido: ‘%s’ Invalid amount for %s=<amount>: '%s' (must be at least %s) - Importe inválido para %s=<amount>: "%s" (debe ser por lo menos %s) + Importe inválido para %s=<amount>: ‘%s’ (debe ser por lo menos %s) Invalid amount for %s=<amount>: '%s' - Importe inválido para %s=<amount>: "%s" + Importe inválido para %s=<amount>: ‘%s’ Invalid amount for -%s=<amount>: '%s' - Importe inválido para -%s=<amount>: "%s" + Importe inválido para -%s=<amount>: ‘%s’ Invalid netmask specified in -whitelist: '%s' - Máscara de red inválida especificada en -whitelist: "%s" + Máscara de red inválida especificada en -whitelist: ‘%s’ Invalid port specified in %s: '%s' - Puerto no válido especificado en %s: "%s" + Puerto no válido especificado en %s: ‘%s’ Invalid pre-selected input %s @@ -4811,7 +4839,7 @@ No se puede restaurar el respaldo del monedero. SQLiteDatabase: Failed to prepare statement to verify database: %s - SQLiteDatabase: Fallo al preparar la instrucción para verificar la base de datos (%s) + SQLiteDatabase: Fallo al preparar la instrucción para verificar la base de datos: %s SQLiteDatabase: Failed to read database verification error: %s @@ -4843,23 +4871,23 @@ No se puede restaurar el respaldo del monedero. Specified -walletdir "%s" does not exist - El valor especificado de -walletdir "%s" no existe + El valor especificado de -walletdir «%s» no existe Specified -walletdir "%s" is a relative path - El valor especificado de -walletdir "%s" es una ruta relativa + El valor especificado de -walletdir «%s» es una ruta relativa Specified -walletdir "%s" is not a directory - El valor especificado de -walletdir "%s" no es un directorio + El valor especificado de -walletdir «%s» no es un directorio Specified blocks directory "%s" does not exist. - El directorio de bloques especificado "%s" no existe. + El directorio de bloques especificado «%s» no existe. Specified data directory "%s" does not exist. - El directorio de datos especificado "%s" no existe. + El directorio de datos especificado «%s» no existe. Starting network threads… @@ -4951,7 +4979,7 @@ No se puede restaurar el respaldo del monedero. Unable to create the PID file '%s': %s - No se puede crear el archivo PID "%s": %s + No se puede crear el archivo PID «%s»: %s Unable to find UTXO for external input @@ -4987,11 +5015,11 @@ No se puede restaurar el respaldo del monedero. Unknown address type '%s' - Se desconoce el tipo de dirección "%s" + Se desconoce el tipo de dirección «%s» Unknown change type '%s' - Se desconoce el tipo de cambio "%s" + Se desconoce el tipo de cambio «%s» Unknown network specified in -onlynet: '%s' @@ -5003,7 +5031,7 @@ No se puede restaurar el respaldo del monedero. Unrecognised option "%s" provided in -test=<option>. - Opción no reconocida "%s" proporcionada en -test=<option>. + Opción no reconocida «%s» proporcionada en -test=<option>. Unsupported global logging level %s=%s. Valid values: %s. @@ -5031,7 +5059,7 @@ No se puede restaurar el respaldo del monedero. Error: Could not delete watchonly transactions. - Error: No se pueden eliminar las transacciones solo de observación + Error: No se pueden eliminar las transacciones solo de observación. Error: Wallet does not exist @@ -5059,7 +5087,7 @@ No se puede restaurar el respaldo del monedero. Wallet needed to be rewritten: restart %s to complete - Es necesario reescribir el monedero: reiniciar %s para completar + Es necesario reescribir el monedero: reinicie %s para completar Settings file could not be read @@ -5067,7 +5095,7 @@ No se puede restaurar el respaldo del monedero. Settings file could not be written - El archivo de configuración no ha podido escribirse + El archivo de configuración no pudo escribirse \ No newline at end of file diff --git a/src/qt/locale/bitcoin_es_CL.ts b/src/qt/locale/bitcoin_es_CL.ts index 2bfd8e0ac1e..db3766ec56c 100644 --- a/src/qt/locale/bitcoin_es_CL.ts +++ b/src/qt/locale/bitcoin_es_CL.ts @@ -5,6 +5,10 @@ Right-click to edit address or label Click derecho para editar la dirección o etiqueta + + Create a new address + Crea una dirección nueva + &New &Nuevo @@ -560,7 +564,7 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p Syncing Headers (%1%)… - Sincronizando cabeceras (1%1%) + Sincronizando cabeceras (%1%)… Synchronizing with network… diff --git a/src/qt/locale/bitcoin_es_CO.ts b/src/qt/locale/bitcoin_es_CO.ts index ae1ad76f0e2..41996365b34 100644 --- a/src/qt/locale/bitcoin_es_CO.ts +++ b/src/qt/locale/bitcoin_es_CO.ts @@ -575,7 +575,7 @@ Solo es posible firmar con direcciones de tipo "legacy". Syncing Headers (%1%)… - Sincronizando cabeceras (1%1%) + Sincronizando cabeceras (%1%)… Synchronizing with network… diff --git a/src/qt/locale/bitcoin_es_DO.ts b/src/qt/locale/bitcoin_es_DO.ts index 1fa874a6819..a64b698c193 100644 --- a/src/qt/locale/bitcoin_es_DO.ts +++ b/src/qt/locale/bitcoin_es_DO.ts @@ -571,7 +571,7 @@ Solo es posible firmar con direcciones de tipo legacy. Syncing Headers (%1%)… - Sincronizando cabeceras (1%1%) + Sincronizando cabeceras (%1%)… Synchronizing with network… diff --git a/src/qt/locale/bitcoin_es_SV.ts b/src/qt/locale/bitcoin_es_SV.ts index 319037a258f..109665a1a3f 100644 --- a/src/qt/locale/bitcoin_es_SV.ts +++ b/src/qt/locale/bitcoin_es_SV.ts @@ -555,7 +555,7 @@ Solo es posible firmar con direcciones de tipo legacy. Syncing Headers (%1%)… - Sincronizando cabeceras (1%1%) + Sincronizando cabeceras (%1%)… Synchronizing with network… diff --git a/src/qt/locale/bitcoin_es_VE.ts b/src/qt/locale/bitcoin_es_VE.ts index 4b465cdb815..4eac9d6056a 100644 --- a/src/qt/locale/bitcoin_es_VE.ts +++ b/src/qt/locale/bitcoin_es_VE.ts @@ -571,7 +571,7 @@ Solo es posible firmar con direcciones de tipo legacy. Syncing Headers (%1%)… - Sincronizando cabeceras (1%1%) + Sincronizando cabeceras (%1%)… Synchronizing with network… diff --git a/src/qt/locale/bitcoin_et.ts b/src/qt/locale/bitcoin_et.ts index 729251de22f..98eac4acf19 100644 --- a/src/qt/locale/bitcoin_et.ts +++ b/src/qt/locale/bitcoin_et.ts @@ -406,10 +406,18 @@ Signing is only possible with addresses of the type 'legacy'. &Change Passphrase… &Muuda Salasõna... + + Sign &message… + Allkirjuta &sõnum... + Sign messages with your Bitcoin addresses to prove you own them Omandi tõestamiseks allkirjasta sõnumid oma Bitcoini aadressiga + + &Verify message… + &Kinnita sõnum... + Verify messages to ensure they were signed with specified Bitcoin addresses Kinnita sõnumid kindlustamaks et need allkirjastati määratud Bitcoini aadressiga @@ -489,14 +497,48 @@ Signing is only possible with addresses of the type 'legacy'. Open Wallet Ava Rahakott + + Open a wallet + Ava Rahakott + + + Close wallet + Sulge rahakott + + + Restore Wallet… + Name of the menu item that restores wallet from a backup file. + Taasta Rahakoti... + + + Restore a wallet from a backup file + Status tip for Restore Wallet menu item + Taasta rahakoti varukoopiafailist + + + Close all wallets + Sulge rkõik rahakotid + + + Migrate Wallet + Migreeri rahakott + &Window &Aken + + Main Window + Pea Aken + %1 client %1 klient + + &Hide + &Peida + %n active connection(s) to Bitcoin network. A substring of the tooltip. @@ -505,6 +547,10 @@ Signing is only possible with addresses of the type 'legacy'. + + Error creating wallet + Viga rahakoti loomisel + Error: %1 Tõrge %1 @@ -647,6 +693,13 @@ Signing is only possible with addresses of the type 'legacy'. (vahetusraha) + + MigrateWalletActivity + + Migrate Wallet + Migreeri rahakott + + OpenWalletActivity @@ -655,6 +708,17 @@ Signing is only possible with addresses of the type 'legacy'. Ava Rahakott + + WalletController + + Close wallet + Sulge rahakott + + + Close all wallets + Sulge rkõik rahakotid + + CreateWalletDialog diff --git a/src/qt/locale/bitcoin_fa.ts b/src/qt/locale/bitcoin_fa.ts index 561c2277af1..36ecbe2ddad 100644 --- a/src/qt/locale/bitcoin_fa.ts +++ b/src/qt/locale/bitcoin_fa.ts @@ -1360,6 +1360,17 @@ If you are receiving this error you should request the merchant provide a BIP21 خطا + + WalletModel + + Fee-bump PSBT copied to clipboard + PSBT با هزینه اضافه شده، در بریده‌دان کپی شد + + + Signer error + خطای امضا کننده + + WalletView diff --git a/src/qt/locale/bitcoin_fi.ts b/src/qt/locale/bitcoin_fi.ts index 128148224d4..7c447233f66 100644 --- a/src/qt/locale/bitcoin_fi.ts +++ b/src/qt/locale/bitcoin_fi.ts @@ -2272,6 +2272,14 @@ Jos saat tämän virheen, pyydä kauppiasta antamaan BIP21-yhteensopiva URI.Number of connections Yhteyksien lukumäärä + + Local Addresses + Paikalliset osoitteet + + + Network addresses that your Bitcoin node is currently using to communicate with other nodes. + Verkko-osoitteet, joita Bitcoin-solmusi käyttää tällä hetkellä kommunikoidakseen muiden solmujen kanssa. + Block chain Lohkoketju @@ -2320,6 +2328,10 @@ Jos saat tämän virheen, pyydä kauppiasta antamaan BIP21-yhteensopiva URI.Select a peer to view detailed information. Valitse vertainen eriteltyjä tietoja varten. + + Hide Peers Detail + Piilota vertaisten yksityiskohdat + The transport layer version: %1 Kuljetuskerroksen versio: %1 @@ -2434,6 +2446,10 @@ Jos saat tämän virheen, pyydä kauppiasta antamaan BIP21-yhteensopiva URI.Direction/Type Suunta/Tyyppi + + The BIP324 session ID string in hex. + BIP324-istunnon ID-merkkijono heksana. + The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS. Verkkoprotokolla, jonka kautta tämä vertaisverkko on yhdistetty: IPv4, IPv6, Onion, I2P tai CJDNS. @@ -3341,6 +3357,10 @@ Huom: Koska maksu lasketaan per tavu, "100 satoshin per kB" maksunopeus 500 virt &Sign Message &Allekirjoita viesti + + You can sign messages/agreements with your legacy (P2PKH) addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. + Voit allekirjoittaa viestejä/sopimuksia vanhojen (P2PKH) osoitteidesi kanssa todistaaksesi, että voit vastaanottaa niihin lähetettyjä bitcoineja. Varo allekirjoittamasta mitään epämääräistä tai satunnaista, sillä phishing-hyökkäykset voivat yrittää huijata sinua allekirjoittamaan henkilöllisyytesi heille. Allekirjoita vain täysin yksityiskohtaiset lausunnot, joihin suostut. + The Bitcoin address to sign the message with Bitcoin-osoite jolla viesti allekirjoitetaan @@ -3995,6 +4015,10 @@ Varoitus: Tämä voi maksaa ylimääräisen maksun vähentämällä vaihtotuloja PSBT copied PSBT kopioitu + + Fee-bump PSBT copied to clipboard + Siirtokulujen nosto PSBT kopioitu leikepöydälle + Can't sign transaction. Siirtoa ei voida allekirjoittaa. @@ -4003,6 +4027,10 @@ Varoitus: Tämä voi maksaa ylimääräisen maksun vähentämällä vaihtotuloja Could not commit transaction Siirtoa ei voitu tehdä + + Signer error + Signaalivirhe + Can't display address Osoitetta ei voida näyttää @@ -4063,6 +4091,10 @@ Varoitus: Tämä voi maksaa ylimääräisen maksun vähentämällä vaihtotuloja %s virheellinen -assumeutxo-snapshot-tila. Tämä viittaa laitteistoon liittyvään ongelmaan, ohjelmistovirheeseen tai huonoon ohjelmistomuutokseen, joka on sallinut virheellisen snapshotin lataamisen. Tämän seurauksena solmu sulkeutuu ja lopettaa kaiken sen tilan käytön, joka perustui snapshottiin, ja nollaa lohkokorkeuden%darvoon%d. Seuraavassa uudelleenkäynnistyksessä solmu jatkaa synkronointia kohdasta%d   ilman, että käytetään mitään snapshot-tietoja. Ilmoita tästä tapauksesta osoitteeseen%s, mukaan lukien se, miten sait snapshotin. Virheellinen snapshot-tilatiedosto jätetään levylle, jos se on hyödyllinen ongelman diagnosoinnissa, joka aiheutti tämän virheen. + + %s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list. + %s pyyntö kuunnella porttia %u. Tätä porttia pidetään ”huonona”, joten on epätodennäköistä, että mikään vertaisohjelma muodostaa siihen yhteyden. Katso lisätietoja ja täydellinen luettelo doc/p2p-bad-ports.md-tiedostosta. + Cannot downgrade wallet from version %i to version %i. Wallet version unchanged. Ei voida alentaa lompakon versiota versiosta %i versioon %i. Lompakon versio pysyy ennallaan. diff --git a/src/qt/locale/bitcoin_fr_CM.ts b/src/qt/locale/bitcoin_fr_CM.ts deleted file mode 100644 index a267f0b7d91..00000000000 --- a/src/qt/locale/bitcoin_fr_CM.ts +++ /dev/null @@ -1,5093 +0,0 @@ - - - AddressBookPage - - Right-click to edit address or label - Clic droit pour modifier l'adresse ou l'étiquette - - - Create a new address - Créer une nouvelle adresse - - - &New - &Nouvelle - - - Copy the currently selected address to the system clipboard - Copier l’adresse sélectionnée actuellement dans le presse-papiers - - - &Copy - &Copier - - - C&lose - &Fermer - - - Delete the currently selected address from the list - Supprimer l’adresse sélectionnée actuellement de la liste - - - Enter address or label to search - Saisir une adresse ou une étiquette à rechercher - - - Export the data in the current tab to a file - Exporter les données de l’onglet actuel vers un fichier - - - &Export - &Exporter - - - &Delete - &Supprimer - - - Choose the address to send coins to - Choisir l’adresse à laquelle envoyer des pièces - - - Choose the address to receive coins with - Choisir l’adresse avec laquelle recevoir des pièces - - - C&hoose - C&hoisir - - - These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins. - Ce sont vos adresses Bitcoin pour envoyer des paiements. Vérifiez toujours le montant et l’adresse du destinataire avant d’envoyer des pièces. - - - These are your Bitcoin addresses for receiving payments. Use the 'Create new receiving address' button in the receive tab to create new addresses. -Signing is only possible with addresses of the type 'legacy'. - Il s'agit de vos adresses Bitcoin pour la réception des paiements. Utilisez le bouton "Créer une nouvelle adresse de réception" dans l'onglet "Recevoir" pour créer de nouvelles adresses. -La signature n'est possible qu'avec les adresses de type "patrimoine". - - - &Copy Address - &Copier l’adresse - - - Copy &Label - Copier l’é&tiquette - - - &Edit - &Modifier - - - Export Address List - Exporter la liste d’adresses - - - Comma separated file - Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values. - Fichier séparé par des virgules - - - There was an error trying to save the address list to %1. Please try again. - An error message. %1 is a stand-in argument for the name of the file we attempted to save to. - Une erreur est survenue lors de l'enregistrement de la liste d'adresses vers %1. Veuillez réessayer plus tard. - - - Receiving addresses - %1 - Adresses de réceptions - %1 - - - Exporting Failed - Échec d’exportation - - - - AddressTableModel - - Label - Étiquette - - - Address - Adresse - - - (no label) - (aucune étiquette) - - - - AskPassphraseDialog - - Passphrase Dialog - Fenêtre de dialogue de la phrase de passe - - - Enter passphrase - Saisir la phrase de passe - - - New passphrase - Nouvelle phrase de passe - - - Repeat new passphrase - Répéter la phrase de passe - - - Show passphrase - Afficher la phrase de passe - - - Encrypt wallet - Chiffrer le porte-monnaie - - - This operation needs your wallet passphrase to unlock the wallet. - Cette opération nécessite votre phrase de passe pour déverrouiller le porte-monnaie. - - - Unlock wallet - Déverrouiller le porte-monnaie - - - Change passphrase - Changer la phrase de passe - - - Confirm wallet encryption - Confirmer le chiffrement du porte-monnaie - - - Warning: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! - Avertissement : Si vous chiffrez votre porte-monnaie et perdez votre phrase de passe, vous <b>PERDREZ TOUS VOS BITCOINS</b> ! - - - Are you sure you wish to encrypt your wallet? - Voulez-vous vraiment chiffrer votre porte-monnaie ? - - - Wallet encrypted - Le porte-monnaie est chiffré - - - Enter the new passphrase for the wallet.<br/>Please use a passphrase of <b>ten or more random characters</b>, or <b>eight or more words</b>. - Saisissez la nouvelle phrase de passe du porte-monnaie.<br/>Veuillez utiliser une phrase de passe composée de <b>dix caractères aléatoires ou plus</b>, ou de <b>huit mots ou plus</b>. - - - Enter the old passphrase and new passphrase for the wallet. - Saisir l’ancienne puis la nouvelle phrase de passe du porte-monnaie. - - - Continue - Poursuivre - - - Back - Retour - - - Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer. - N’oubliez pas que le chiffrement de votre porte-monnaie ne peut pas protéger entièrement vos bitcoins contre le vol par des programmes malveillants qui infecteraient votre ordinateur. - - - Wallet to be encrypted - Porte-monnaie à chiffrer - - - Your wallet is about to be encrypted. - Votre porte-monnaie est sur le point d’être chiffré. - - - Your wallet is now encrypted. - Votre porte-monnaie est désormais chiffré. - - - IMPORTANT: Any previous backups you have made of your wallet file should be replaced with the newly generated, encrypted wallet file. For security reasons, previous backups of the unencrypted wallet file will become useless as soon as you start using the new, encrypted wallet. - IMPORTANT : Toutes les sauvegardes précédentes du fichier de votre porte-monnaie devraient être remplacées par le fichier du porte-monnaie chiffré nouvellement généré. Pour des raisons de sécurité, les sauvegardes précédentes de votre fichier de porte-monnaie non chiffré deviendront inutilisables dès que vous commencerez à utiliser le nouveau porte-monnaie chiffré. - - - Wallet encryption failed - Échec de chiffrement du porte-monnaie - - - Wallet encryption failed due to an internal error. Your wallet was not encrypted. - Le chiffrement du porte-monnaie a échoué en raison d’une erreur interne. Votre porte-monnaie n’a pas été chiffré. - - - The supplied passphrases do not match. - Les phrases de passe saisies ne correspondent pas. - - - Wallet unlock failed - Échec de déverrouillage du porte-monnaie - - - The passphrase entered for the wallet decryption was incorrect. - La phrase de passe saisie pour déchiffrer le porte-monnaie était erronée. - - - The passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. If this is successful, please set a new passphrase to avoid this issue in the future. - La phrase secrète saisie pour le décryptage du portefeuille est incorrecte. Elle contient un caractère nul (c'est-à-dire un octet de zéro). Si la phrase secrète a été définie avec une version de ce logiciel antérieure à la version 25.0, veuillez réessayer en ne saisissant que les caractères jusqu'au premier caractère nul (non compris). Si vous y parvenez, définissez une nouvelle phrase secrète afin d'éviter ce problème à l'avenir. - - - Wallet passphrase was successfully changed. - La phrase de passe du porte-monnaie a été modifiée avec succès. - - - Passphrase change failed - Le changement de phrase secrète a échoué - - - The old passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. - L'ancienne phrase secrète introduite pour le décryptage du portefeuille est incorrecte. Elle contient un caractère nul (c'est-à-dire un octet de zéro). Si la phrase secrète a été définie avec une version de ce logiciel antérieure à la version 25.0, veuillez réessayer en ne saisissant que les caractères jusqu'au premier caractère nul (non compris). - - - Warning: The Caps Lock key is on! - Avertissement : La touche Verr. Maj. est activée - - - - BanTableModel - - IP/Netmask - IP/masque réseau - - - Banned Until - Banni jusqu’au - - - - BitcoinApplication - - Settings file %1 might be corrupt or invalid. - Le fichier de paramètres %1 est peut-être corrompu ou non valide. - - - Runaway exception - Exception excessive - - - A fatal error occurred. %1 can no longer continue safely and will quit. - Une erreur fatale est survenue. %1 ne peut plus poursuivre de façon sûre et va s’arrêter. - - - Internal error - Eurrer interne - - - An internal error occurred. %1 will attempt to continue safely. This is an unexpected bug which can be reported as described below. - Une erreur interne est survenue. %1 va tenter de poursuivre avec sécurité. Il s’agit d’un bogue inattendu qui peut être signalé comme décrit ci-dessous. - - - - QObject - - Do you want to reset settings to default values, or to abort without making changes? - Explanatory text shown on startup when the settings file cannot be read. Prompts user to make a choice between resetting or aborting. - Voulez-vous réinitialiser les paramètres à leur valeur par défaut ou abandonner sans aucun changement ? - - - A fatal error occurred. Check that settings file is writable, or try running with -nosettings. - Explanatory text shown on startup when the settings file could not be written. Prompts user to check that we have the ability to write to the file. Explains that the user has the option of running without a settings file. - Une erreur fatale est survenue. Vérifiez que le fichier des paramètres est modifiable ou essayer d’exécuter avec -nosettings. - - - Error: %1 - Erreur : %1 - - - %1 didn't yet exit safely… - %1 ne s’est pas encore fermer en toute sécurité… - - - unknown - inconnue - - - Embedded "%1" - Intégré « %1 » - - - Default system font "%1" - Police système par défaut « %1 » - - - Custom… - Persnnalisé… - - - Amount - Montant - - - Enter a Bitcoin address (e.g. %1) - Saisir une adresse Bitcoin (p. ex. %1) - - - Unroutable - Non routable - - - Inbound - An inbound connection from a peer. An inbound connection is a connection initiated by a peer. - Entrant - - - Outbound - An outbound connection to a peer. An outbound connection is a connection initiated by us. - Sortant - - - Full Relay - Peer connection type that relays all network information. - Relais intégral - - - Block Relay - Peer connection type that relays network information about blocks and not transactions or addresses. - Relais de blocs - - - Manual - Peer connection type established manually through one of several methods. - Manuelle - - - Feeler - Short-lived peer connection type that tests the aliveness of known addresses. - Palpeur - - - Address Fetch - Short-lived peer connection type that solicits known addresses from a peer. - Récupération d’adresses - - - %1 d - %1 j - - - %1 m - %1 min - - - None - Aucun - - - N/A - N.D. - - - %n second(s) - - %n seconde - %n secondes - - - - %n minute(s) - - %n minute - %n minutes - - - - %n hour(s) - - %n heure - %n heures - - - - %n day(s) - - %n jour - %n jours - - - - %n week(s) - - %n semaine - %n semaines - - - - %1 and %2 - %1 et %2 - - - %n year(s) - - %n an - %n ans - - - - %1 B - %1 o - - - %1 kB - %1 ko - - - %1 MB - %1 Mo - - - %1 GB - %1 Go - - - default wallet - porte-monnaie par défaut - - - - BitcoinGUI - - &Overview - &Vue d’ensemble - - - Show general overview of wallet - Afficher une vue d’ensemble du porte-monnaie - - - Browse transaction history - Parcourir l’historique transactionnel - - - E&xit - Q&uitter - - - Quit application - Fermer l’application - - - &About %1 - À &propos de %1 - - - Show information about %1 - Afficher des renseignements à propos de %1 - - - About &Qt - À propos de &Qt - - - Show information about Qt - Afficher des renseignements sur Qt - - - Modify configuration options for %1 - Modifier les options de configuration de %1 - - - Create a new wallet - Créer un nouveau porte-monnaie - - - &Minimize - &Réduire - - - Wallet: - Porte-monnaie : - - - Network activity disabled. - A substring of the tooltip. - L’activité réseau est désactivée. - - - Proxy is <b>enabled</b>: %1 - Le serveur mandataire est <b>activé</b> : %1 - - - Send coins to a Bitcoin address - Envoyer des pièces à une adresse Bitcoin - - - Backup wallet to another location - Sauvegarder le porte-monnaie vers un autre emplacement - - - Change the passphrase used for wallet encryption - Modifier la phrase de passe utilisée pour le chiffrement du porte-monnaie - - - &Send - &Envoyer - - - &Receive - &Recevoir - - - &Options… - &Choix - - - &Encrypt Wallet… - &Chiffrer le porte-monnaie… - - - Encrypt the private keys that belong to your wallet - Chiffrer les clés privées qui appartiennent à votre porte-monnaie - - - &Backup Wallet… - &auvegarder le porte-monnaie… - - - &Change Passphrase… - &Changer la phrase de passe… - - - Sign &message… - Signer un &message… - - - Sign messages with your Bitcoin addresses to prove you own them - Signer les messages avec vos adresses Bitcoin pour prouver que vous les détenez - - - &Verify message… - &Vérifier un message… - - - Verify messages to ensure they were signed with specified Bitcoin addresses - Vérifier les messages pour s’assurer qu’ils ont été signés avec les adresses Bitcoin indiquées - - - &Load PSBT from file… - &Charger une TBSP d’un fichier… - - - Open &URI… - Ouvrir une &URI… - - - Close Wallet… - Fermer le porte-monnaie… - - - Create Wallet… - Créer un porte-monnaie… - - - Close All Wallets… - Fermer tous les porte-monnaie… - - - &File - &Fichier - - - &Settings - &Paramètres - - - &Help - &Aide - - - Tabs toolbar - Barre d’outils des onglets - - - Syncing Headers (%1%)… - Synchronisation des en-têtes (%1)… - - - Synchronizing with network… - Synchronisation avec le réseau… - - - Indexing blocks on disk… - Indexation des blocs sur le disque… - - - Processing blocks on disk… - Traitement des blocs sur le disque… - - - Connecting to peers… - Connexion aux pairs… - - - Request payments (generates QR codes and bitcoin: URIs) - Demander des paiements (génère des codes QR et des URI bitcoin:) - - - Show the list of used sending addresses and labels - Afficher la liste d’adresses et d’étiquettes d’envoi utilisées - - - Show the list of used receiving addresses and labels - Afficher la liste d’adresses et d’étiquettes de réception utilisées - - - &Command-line options - Options de ligne de &commande - - - Processed %n block(s) of transaction history. - - %n bloc d’historique transactionnel a été traité. - %n blocs d’historique transactionnel ont été traités. - - - - %1 behind - en retard de %1 - - - Catching up… - Rattrapage… - - - Last received block was generated %1 ago. - Le dernier bloc reçu avait été généré il y a %1. - - - Transactions after this will not yet be visible. - Les transactions suivantes ne seront pas déjà visibles. - - - Error - Erreur - - - Warning - Avertissement - - - Information - Renseignements - - - Up to date - À jour - - - Load Partially Signed Bitcoin Transaction - Charger une transaction Bitcoin signée partiellement - - - Load PSBT from &clipboard… - Charger la TBSP du &presse-papiers… - - - Load Partially Signed Bitcoin Transaction from clipboard - Charger du presse-papiers une transaction Bitcoin signée partiellement - - - Node window - Fenêtre des nœuds - - - Open node debugging and diagnostic console - Ouvrir une console de débogage de nœuds et de diagnostic - - - &Sending addresses - &Adresses d’envoi - - - &Receiving addresses - &Adresses de réception - - - Open a bitcoin: URI - Ouvrir une URI bitcoin: - - - Open Wallet - Ouvrir le porte-monnaie - - - Open a wallet - Ouvrir un porte-monnaie - - - Close wallet - Fermer le porte-monnaie - - - Restore Wallet… - Name of the menu item that restores wallet from a backup file. - Restaurer le Portefeuille... - - - Restore a wallet from a backup file - Status tip for Restore Wallet menu item - Restaurer le Portefeuille depuis un fichier de sauvegarde - - - Close all wallets - Fermer tous les porte-monnaie - - - Migrate Wallet - Migrer le portefeuille - - - Migrate a wallet - Migrer un portefeuilles - - - Show the %1 help message to get a list with possible Bitcoin command-line options - Afficher le message d’aide de %1 pour obtenir la liste des options possibles en ligne de commande Bitcoin - - - &Mask values - &Masquer les montants - - - Mask the values in the Overview tab - Masquer les montants dans l’onglet Vue d’ensemble - - - No wallets available - Aucun porte-monnaie n’est disponible - - - Wallet Data - Name of the wallet data file format. - Données du porte-monnaie - - - Load Wallet Backup - The title for Restore Wallet File Windows - Lancer un Portefeuille de sauvegarde - - - Restore Wallet - Title of pop-up window shown when the user is attempting to restore a wallet. - Restaurer le portefeuille - - - Wallet Name - Label of the input field where the name of the wallet is entered. - Nom du porte-monnaie - - - &Window - &Fenêtre - - - Zoom - Zoomer - - - Main Window - Fenêtre principale - - - %1 client - Client %1 - - - &Hide - &Cacher - - - S&how - A&fficher - - - %n active connection(s) to Bitcoin network. - A substring of the tooltip. - - %n connexion active avec le réseau Bitcoin. - %n connexions actives avec le réseau Bitcoin. - - - - Click for more actions. - A substring of the tooltip. "More actions" are available via the context menu. - Cliquez pour afficher plus d’actions. - - - Show Peers tab - A context menu item. The "Peers tab" is an element of the "Node window". - Afficher l’onglet Pairs - - - Disable network activity - A context menu item. - Désactiver l’activité réseau - - - Enable network activity - A context menu item. The network activity was disabled previously. - Activer l’activité réseau - - - Pre-syncing Headers (%1%)… - En-têtes de pré-synchronisation (%1%)... - - - Error creating wallet - Erreur lors de la création du portefeuille - - - Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets) - Impossible de créer un nouveau portefeuilles, le logiciel a été compilé sans support pour sqlite (nécessaire pour le portefeuille décris) - - - Error: %1 - Erreur : %1 - - - Warning: %1 - Avertissement : %1 - - - Date: %1 - - Date : %1 - - - - Amount: %1 - - Montant : %1 - - - - Wallet: %1 - - Porte-monnaie : %1 - - - - Type: %1 - - Type  : %1 - - - - Label: %1 - - Étiquette : %1 - - - - Address: %1 - - Adresse : %1 - - - - Sent transaction - Transaction envoyée - - - Incoming transaction - Transaction entrante - - - HD key generation is <b>enabled</b> - La génération de clé HD est <b>activée</b> - - - HD key generation is <b>disabled</b> - La génération de clé HD est <b>désactivée</b> - - - Private key <b>disabled</b> - La clé privée est <b>désactivée</b> - - - Wallet is <b>encrypted</b> and currently <b>unlocked</b> - Le porte-monnaie est <b>chiffré</b> et est actuellement <b>déverrouillé</b> - - - Wallet is <b>encrypted</b> and currently <b>locked</b> - Le porte-monnaie est <b>chiffré</b> et actuellement <b>verrouillé</b> - - - Original message: - Message original : - - - - UnitDisplayStatusBarControl - - Unit to show amounts in. Click to select another unit. - Unité d’affichage des montants. Cliquez pour sélectionner une autre unité. - - - - CoinControlDialog - - Coin Selection - Sélection des pièces - - - Quantity: - Quantité : - - - Bytes: - Octets : - - - Amount: - Montant : - - - Fee: - Frais : - - - After Fee: - Après les frais : - - - Change: - Monnaie : - - - (un)select all - Tout (des)sélectionner - - - Tree mode - Mode arborescence - - - List mode - Mode liste - - - Amount - Montant - - - Received with label - Reçu avec une étiquette - - - Received with address - Reçu avec une adresse - - - Confirmed - Confirmée - - - Copy amount - Copier le montant - - - &Copy address - &Copier l’adresse - - - Copy &label - Copier l’&étiquette - - - Copy &amount - Copier le &montant - - - Copy transaction &ID and output index - Copier l’ID de la transaction et l’index des sorties - - - L&ock unspent - &Verrouillé ce qui n’est pas dépensé - - - &Unlock unspent - &Déverrouiller ce qui n’est pas dépensé - - - Copy quantity - Copier la quantité - - - Copy fee - Copier les frais - - - Copy after fee - Copier après les frais - - - Copy bytes - Copier les octets - - - Copy change - Copier la monnaie - - - (%1 locked) - (%1 verrouillée) - - - Can vary +/- %1 satoshi(s) per input. - Peut varier +/- %1 satoshi(s) par entrée. - - - (no label) - (aucune étiquette) - - - change from %1 (%2) - monnaie de %1 (%2) - - - (change) - (monnaie) - - - - CreateWalletActivity - - Create Wallet - Title of window indicating the progress of creation of a new wallet. - Créer un porte-monnaie - - - Creating Wallet <b>%1</b>… - Descriptive text of the create wallet progress window which indicates to the user which wallet is currently being created. - Création du porte-monnaie <b>%1</b>… - - - Create wallet failed - Échec de création du porte-monnaie - - - Create wallet warning - Avertissement de création du porte-monnaie - - - Can't list signers - Impossible de lister les signataires - - - Too many external signers found - Trop de signataires externes trouvés - - - - LoadWalletsActivity - - Load Wallets - Title of progress window which is displayed when wallets are being loaded. - Charger les porte-monnaie - - - Loading wallets… - Descriptive text of the load wallets progress window which indicates to the user that wallets are currently being loaded. - Chargement des porte-monnaie… - - - - MigrateWalletActivity - - Migrate wallet - Migrer le portefeuille - - - Are you sure you wish to migrate the wallet <i>%1</i>? - Êtes-vous sûr de vouloir migrer le portefeuille <i>%1</i> - - - Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made. -If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts. -If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts. - -The migration process will create a backup of the wallet before migrating. This backup file will be named <wallet name>-<timestamp>.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality. - La migration du porte-monnaie convertira ce porte-monnaie en un ou plusieurs porte-monnaie de descripteurs. Une nouvelle sauvegarde du porte-monnaie devra être effectuée. -Si ce porte-monnaie contient des scripts en lecture seule, un nouveau porte-monnaie sera créé contenant ces scripts en lecture seule. -Si ce porte-monnaie contient des scripts solvables mais non surveillés, un autre nouveau porte-monnaie sera créé contenant ces scripts. - -Le processus de migration créera une sauvegarde du porte-monnaie avant la migration. Ce fichier de sauvegarde sera nommé <nom du porte-monnaie>-<horodatage>.legacy.bak et pourra être trouvé dans le répertoire de ce porte-monnaie. En cas de migration incorrecte, la sauvegarde peut être restaurée avec la fonctionnalité "Restaurer le porte-monnaie". - - - Migrate Wallet - Migrer le portefeuille - - - Migrating Wallet <b>%1</b>… - Migration du portefeuille <b>%1</b>… - - - The wallet '%1' was migrated successfully. - Le porte-monnaie '%1' a été migré avec succès. - - - Watchonly scripts have been migrated to a new wallet named '%1'. - Les scripts juste-regarder ont été migrés vers un nouveau porte-monnaie nommé « %1 ». - - - Solvable but not watched scripts have been migrated to a new wallet named '%1'. - Les scripts solubles, mais non surveillés ont été migrés vers un nouveau porte-monnaie nommé « %1 ». - - - Migration failed - La migration a échoué - - - Migration Successful - Migration réussie - - - - OpenWalletActivity - - Open wallet failed - Échec d’ouverture du porte-monnaie - - - Open wallet warning - Avertissement d’ouverture du porte-monnaie - - - Open Wallet - Title of window indicating the progress of opening of a wallet. - Ouvrir un porte-monnaie - - - Opening Wallet <b>%1</b>… - Descriptive text of the open wallet progress window which indicates to the user which wallet is currently being opened. - Ouverture du porte-monnaie <b>%1</b>… - - - - RestoreWalletActivity - - Restore Wallet - Title of progress window which is displayed when wallets are being restored. - Restaurer le portefeuille - - - Restoring Wallet <b>%1</b>… - Descriptive text of the restore wallets progress window which indicates to the user that wallets are currently being restored. - Restauration du Portefeuille<b>%1</b>... - - - Restore wallet failed - Title of message box which is displayed when the wallet could not be restored. - Échec de la restauration du portefeuille - - - Restore wallet warning - Title of message box which is displayed when the wallet is restored with some warning. - Avertissement de la récupération du Portefeuille - - - Restore wallet message - Title of message box which is displayed when the wallet is successfully restored. - Message du Portefeuille restauré - - - - WalletController - - Close wallet - Fermer le porte-monnaie - - - Are you sure you wish to close the wallet <i>%1</i>? - Voulez-vous vraiment fermer le porte-monnaie <i>%1</i> ? - - - Closing the wallet for too long can result in having to resync the entire chain if pruning is enabled. - Fermer le porte-monnaie trop longtemps peut impliquer de devoir resynchroniser la chaîne entière si l’élagage est activé. - - - Close all wallets - Fermer tous les porte-monnaie - - - Are you sure you wish to close all wallets? - Voulez-vous vraiment fermer tous les porte-monnaie ? - - - - CreateWalletDialog - - Create Wallet - Créer un porte-monnaie - - - You are one step away from creating your new wallet! - Vous n'êtes qu'à un pas de la création de votre nouveau portefeuille ! - - - Please provide a name and, if desired, enable any advanced options - Veuillez fournir un nom et, si désiré, activer toutes les options avancées. - - - Wallet Name - Nom du porte-monnaie - - - Wallet - Porte-monnaie - - - Encrypt the wallet. The wallet will be encrypted with a passphrase of your choice. - Chiffrer le porte-monnaie. Le porte-monnaie sera chiffré avec une phrase de passe de votre choix. - - - Encrypt Wallet - Chiffrer le porte-monnaie - - - Advanced Options - Options avancées - - - Disable private keys for this wallet. Wallets with private keys disabled will have no private keys and cannot have an HD seed or imported private keys. This is ideal for watch-only wallets. - Désactiver les clés privées pour ce porte-monnaie. Les porte-monnaie pour lesquels les clés privées sont désactivées n’auront aucune clé privée et ne pourront ni avoir de graine HD ni de clés privées importées. Cela est idéal pour les porte-monnaie juste-regarder. - - - Disable Private Keys - Désactiver les clés privées - - - Make a blank wallet. Blank wallets do not initially have private keys or scripts. Private keys and addresses can be imported, or an HD seed can be set, at a later time. - Créer un porte-monnaie vide. Les porte-monnaie vides n’ont initialement ni clé privée ni script. Ultérieurement, des clés privées et des adresses peuvent être importées ou une graine HD peut être définie. - - - Make Blank Wallet - Créer un porte-monnaie vide - - - Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first. - Utiliser un appareil externe de signature tel qu’un porte-monnaie matériel. Configurer d’abord le script signataire externe dans les préférences du porte-monnaie. - - - External signer - Signataire externe - - - Create - Créer - - - Compiled without external signing support (required for external signing) - "External signing" means using devices such as hardware wallets. - Compilé sans prise en charge des signatures externes (requis pour la signature externe) - - - - EditAddressDialog - - Edit Address - Modifier l’adresse - - - &Label - É&tiquette - - - The label associated with this address list entry - L’étiquette associée à cette entrée de la liste d’adresses - - - The address associated with this address list entry. This can only be modified for sending addresses. - L’adresse associée à cette entrée de la liste d’adresses. Ne peut être modifié que pour les adresses d’envoi. - - - &Address - &Adresse - - - New sending address - Nouvelle adresse d’envoi - - - Edit receiving address - Modifier l’adresse de réception - - - Edit sending address - Modifier l’adresse d’envoi - - - The entered address "%1" is not a valid Bitcoin address. - L’adresse saisie « %1 » n’est pas une adresse Bitcoin valide. - - - Address "%1" already exists as a receiving address with label "%2" and so cannot be added as a sending address. - L’adresse « %1 » existe déjà en tant qu’adresse de réception avec l’étiquette « %2 » et ne peut donc pas être ajoutée en tant qu’adresse d’envoi. - - - The entered address "%1" is already in the address book with label "%2". - L’adresse saisie « %1 » est déjà présente dans le carnet d’adresses avec l’étiquette « %2 ». - - - Could not unlock wallet. - Impossible de déverrouiller le porte-monnaie. - - - New key generation failed. - Échec de génération de la nouvelle clé. - - - - FreespaceChecker - - A new data directory will be created. - Un nouveau répertoire de données sera créé. - - - name - nom - - - Directory already exists. Add %1 if you intend to create a new directory here. - Le répertoire existe déjà. Ajouter %1 si vous comptez créer un nouveau répertoire ici. - - - Path already exists, and is not a directory. - Le chemin existe déjà et n’est pas un répertoire. - - - Cannot create data directory here. - Impossible de créer un répertoire de données ici. - - - - Intro - - %n GB of space available - - %n Go d’espace libre - %n Go d’espace libre - - - - (of %n GB needed) - - (of %n GB needed) - (of %n GB needed) - - - - (%n GB needed for full chain) - - (%n GB needed for full chain) - (%n GB needed for full chain) - - - - Choose data directory - Choisissez un répertoire de donnée - - - At least %1 GB of data will be stored in this directory, and it will grow over time. - Au moins %1 Go de données seront stockés dans ce répertoire et sa taille augmentera avec le temps. - - - Approximately %1 GB of data will be stored in this directory. - Approximativement %1 Go de données seront stockés dans ce répertoire. - - - (sufficient to restore backups %n day(s) old) - Explanatory text on the capability of the current prune target. - - (suffisant pour restaurer les sauvegardes âgées de %n jour) - (suffisant pour restaurer les sauvegardes âgées de %n jours) - - - - %1 will download and store a copy of the Bitcoin block chain. - %1 téléchargera et stockera une copie de la chaîne de blocs Bitcoin. - - - The wallet will also be stored in this directory. - Le porte-monnaie sera aussi stocké dans ce répertoire. - - - Error: Specified data directory "%1" cannot be created. - Erreur : Le répertoire de données indiqué « %1 » ne peut pas être créé. - - - Error - Erreur - - - Welcome - Bienvenue - - - Welcome to %1. - Bienvenue à %1. - - - As this is the first time the program is launched, you can choose where %1 will store its data. - Comme le logiciel est lancé pour la première fois, vous pouvez choisir où %1 stockera ses données. - - - Limit block chain storage to - Limiter l’espace de stockage de chaîne de blocs à - - - Reverting this setting requires re-downloading the entire blockchain. It is faster to download the full chain first and prune it later. Disables some advanced features. - Rétablir ce paramètre à sa valeur antérieure exige de retélécharger la chaîne de blocs dans son intégralité. Il est plus rapide de télécharger la chaîne complète dans un premier temps et de l’élaguer ultérieurement. Désactive certaines fonctions avancées. - - - GB -  Go - - - This initial synchronisation is very demanding, and may expose hardware problems with your computer that had previously gone unnoticed. Each time you run %1, it will continue downloading where it left off. - Cette synchronisation initiale est très exigeante et pourrait exposer des problèmes matériels dans votre ordinateur passés inaperçus auparavant. Chaque fois que vous exécuterez %1, le téléchargement reprendra où il s’était arrêté. - - - When you click OK, %1 will begin to download and process the full %4 block chain (%2 GB) starting with the earliest transactions in %3 when %4 initially launched. - Quand vous cliquerez sur Valider, %1 commencera à télécharger et à traiter l’intégralité de la chaîne de blocs %4 (%2 Go) en débutant avec les transactions les plus anciennes de %3, quand %4 a été lancé initialement. - - - If you have chosen to limit block chain storage (pruning), the historical data must still be downloaded and processed, but will be deleted afterward to keep your disk usage low. - Si vous avez choisi de limiter le stockage de la chaîne de blocs (élagage), les données historiques doivent quand même être téléchargées et traitées, mais seront supprimées par la suite pour minimiser l’utilisation de votre espace disque. - - - Use the default data directory - Utiliser le répertoire de données par défaut - - - Use a custom data directory: - Utiliser un répertoire de données personnalisé : - - - - HelpMessageDialog - - About %1 - À propos de %1 - - - Command-line options - Options de ligne de commande - - - - ShutdownWindow - - %1 is shutting down… - %1 est en cours de fermeture… - - - Do not shut down the computer until this window disappears. - Ne pas éteindre l’ordinateur jusqu’à la disparition de cette fenêtre. - - - - ModalOverlay - - Form - Formulaire - - - Recent transactions may not yet be visible, and therefore your wallet's balance might be incorrect. This information will be correct once your wallet has finished synchronizing with the bitcoin network, as detailed below. - Les transactions récentes ne sont peut-être pas encore visibles et par conséquent le solde de votre porte-monnaie est peut-être erroné. Ces renseignements seront justes quand votre porte-monnaie aura fini de se synchroniser avec le réseau Bitcoin, comme décrit ci-dessous. - - - Attempting to spend bitcoins that are affected by not-yet-displayed transactions will not be accepted by the network. - Toute tentative de dépense de bitcoins affectés par des transactions qui ne sont pas encore affichées ne sera pas acceptée par le réseau. - - - Number of blocks left - Nombre de blocs restants - - - Unknown… - Inconnu… - - - calculating… - calcul en cours… - - - Last block time - Estampille temporelle du dernier bloc - - - Progress - Progression - - - Progress increase per hour - Avancement de la progression par heure - - - Estimated time left until synced - Temps estimé avant la fin de la synchronisation - - - Hide - Cacher - - - Esc - Échap - - - %1 is currently syncing. It will download headers and blocks from peers and validate them until reaching the tip of the block chain. - %1 est en cours de synchronisation. Il téléchargera les en-têtes et les blocs des pairs, et les validera jusqu’à ce qu’il atteigne la fin de la chaîne de blocs. - - - Unknown. Syncing Headers (%1, %2%)… - Inconnu. Synchronisation des en-têtes (%1, %2 %)… - - - Unknown. Pre-syncing Headers (%1, %2%)… - Inconnu. En-têtes de présynchronisation (%1, %2%)... - - - - OpenURIDialog - - Open bitcoin URI - Ouvrir une URI bitcoin - - - URI: - URI : - - - Paste address from clipboard - Tooltip text for button that allows you to paste an address that is in your clipboard. - Collez l’adresse du presse-papiers - - - - OptionsDialog - - &Main - &Principales - - - Automatically start %1 after logging in to the system. - Démarrer %1 automatiquement après avoir ouvert une session sur l’ordinateur. - - - &Start %1 on system login - &Démarrer %1 lors de l’ouverture d’une session - - - Enabling pruning significantly reduces the disk space required to store transactions. All blocks are still fully validated. Reverting this setting requires re-downloading the entire blockchain. - L’activation de l’élagage réduit considérablement l’espace disque requis pour stocker les transactions. Tous les blocs sont encore entièrement validés. L’annulation de ce paramètre exige de retélécharger la chaîne de blocs dans son intégralité. - - - Maximum database cache size. Make sure you have enough RAM. A larger cache can contribute to faster sync, after which the benefit is less pronounced for most use cases. Lowering the cache size will reduce memory usage. Unused mempool memory is shared for this cache. - Tooltip text for Options window setting that sets the size of the database cache. Explains the corresponding effects of increasing/decreasing this value. - Taille maximale du cache de la base de données. Assurez-vous d’avoir suffisamment de mémoire vive. Un cache plus grand peut accélérer la synchronisation, avec des avantages moindres par la suite dans la plupart des cas. Diminuer la taille du cache réduira l’utilisation de la mémoire. La mémoire non utilisée de la réserve de mémoire est partagée avec ce cache. - - - Size of &database cache - Taille du cache de la base de &données - - - Number of script &verification threads - Nombre de fils de &vérification de script - - - Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins! - Chemin complet vers un %1 script compatible (par exemple, C:\Downloads\hwi.exe ou /Users/you/Downloads/hwi.py). Attention : les malwares peuvent voler vos pièces ! - - - Automatically open the Bitcoin client port on the router. This only works when your router supports PCP or NAT-PMP and it is enabled. The external port could be random. - Ouvrir automatiquement le port du client Bitcoin sur le routeur. Cela ne fonctionne que si votre routeur prend en charge PCP ou NAT-PMP. Le port externe peut être aléatoire. - - - Map port using PCP or NA&T-PMP - Mapper le port avec PCP ou NA&T-PMP - - - IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1) - Adresse IP du mandataire (p. ex. IPv4 : 127.0.0.1 / IPv6 : ::1) - - - Shows if the supplied default SOCKS5 proxy is used to reach peers via this network type. - Indique si le mandataire SOCKS5 par défaut fourni est utilisé pour atteindre des pairs par ce type de réseau. - - - Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Exit in the menu. - Quand la fenêtre est fermée, la réduire au lieu de quitter l’application. Si cette option est activée, l’application ne sera fermée qu’en sélectionnant Quitter dans le menu. - - - Font in the Overview tab: - Police de l’onglet Vue d’ensemble : - - - Options set in this dialog are overridden by the command line: - Les options définies dans cette boîte de dialogue sont remplacées par la ligne de commande : - - - Open the %1 configuration file from the working directory. - Ouvrir le fichier de configuration %1 du répertoire de travail. - - - Open Configuration File - Ouvrir le fichier de configuration - - - Reset all client options to default. - Réinitialiser toutes les options du client aux valeurs par défaut. - - - &Reset Options - &Réinitialiser les options - - - &Network - &Réseau - - - Prune &block storage to - Élaguer l’espace de stockage des &blocs jusqu’à - - - GB - Go - - - Reverting this setting requires re-downloading the entire blockchain. - L’annulation de ce paramètre exige de retélécharger la chaîne de blocs dans son intégralité. - - - MiB - Mio - - - Set the number of script verification threads. Negative values correspond to the number of cores you want to leave free to the system. - Tooltip text for Options window setting that sets the number of script verification threads. Explains that negative values mean to leave these many cores free to the system. - Définissez le nombre de fils de vérification de script. Les valeurs négatives correspondent au nombre de cœurs que vous voulez laisser disponibles pour le système. - - - (0 = auto, <0 = leave that many cores free) - (0 = auto, < 0 = laisser ce nombre de cœurs inutilisés) - - - This allows you or a third party tool to communicate with the node through command-line and JSON-RPC commands. - Tooltip text for Options window setting that enables the RPC server. - Ceci vous permet ou permet à un outil tiers de communiquer avec le nœud grâce à la ligne de commande ou des commandes JSON-RPC. - - - Enable R&PC server - An Options window setting to enable the RPC server. - Activer le serveur R&PC - - - W&allet - &Porte-monnaie - - - Whether to set subtract fee from amount as default or not. - Tooltip text for Options window setting that sets subtracting the fee from a sending amount as default. - Définissez s’il faut soustraire par défaut les frais du montant ou non. - - - Subtract &fee from amount by default - An Options window setting to set subtracting the fee from a sending amount as default. - Soustraire par défaut les &frais du montant - - - Enable coin &control features - Activer les fonctions de &contrôle des pièces - - - If you disable the spending of unconfirmed change, the change from a transaction cannot be used until that transaction has at least one confirmation. This also affects how your balance is computed. - Si vous désactivé la dépense de la monnaie non confirmée, la monnaie d’une transaction ne peut pas être utilisée tant que cette transaction n’a pas reçu au moins une confirmation. Celai affecte aussi le calcul de votre solde. - - - &Spend unconfirmed change - &Dépenser la monnaie non confirmée - - - Enable &PSBT controls - An options window setting to enable PSBT controls. - Activer les contrôles &TBPS - - - Whether to show PSBT controls. - Tooltip text for options window setting that enables PSBT controls. - Affichez ou non les contrôles TBPS. - - - External Signer (e.g. hardware wallet) - Signataire externe (p. ex. porte-monnaie matériel) - - - &External signer script path - &Chemin du script signataire externe - - - Accept connections from outside. - Accepter les connexions provenant de l’extérieur. - - - Allow incomin&g connections - Permettre les connexions e&ntrantes - - - Connect to the Bitcoin network through a SOCKS5 proxy. - Se connecter au réseau Bitcoin par un mandataire SOCKS5. - - - &Connect through SOCKS5 proxy (default proxy): - Se &connecter par un mandataire SOCKS5 (mandataire par défaut) : - - - Proxy &IP: - &IP du mandataire : - - - &Port: - &Port : - - - Port of the proxy (e.g. 9050) - Port du mandataire (p. ex. 9050) - - - Used for reaching peers via: - Utilisé pour rejoindre les pairs par : - - - &Window - &Fenêtre - - - Show the icon in the system tray. - Afficher l’icône dans la zone de notification. - - - &Show tray icon - &Afficher l’icône dans la zone de notification - - - Show only a tray icon after minimizing the window. - Après réduction, n’afficher qu’une icône dans la zone de notification. - - - &Minimize to the tray instead of the taskbar - &Réduire dans la zone de notification au lieu de la barre des tâches - - - M&inimize on close - Ré&duire lors de la fermeture - - - &Display - &Affichage - - - User Interface &language: - &Langue de l’interface utilisateur : - - - The user interface language can be set here. This setting will take effect after restarting %1. - La langue de l’interface utilisateur peut être définie ici. Ce réglage sera pris en compte après redémarrage de %1. - - - &Unit to show amounts in: - &Unité d’affichage des montants : - - - Choose the default subdivision unit to show in the interface and when sending coins. - Choisir la sous-unité par défaut d’affichage dans l’interface et lors d’envoi de pièces. - - - Third-party URLs (e.g. a block explorer) that appear in the transactions tab as context menu items. %s in the URL is replaced by transaction hash. Multiple URLs are separated by vertical bar |. - Les URL de tiers (p. ex. un explorateur de blocs) qui apparaissent dans l’onglet des transactions comme éléments du menu contextuel. Dans l’URL, %s est remplacé par le hachage de la transaction. Les URL multiples sont séparées par une barre verticale |. - - - &Third-party transaction URLs - URL de transaction de $tiers - - - Whether to show coin control features or not. - Afficher ou non les fonctions de contrôle des pièces. - - - Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor onion services. - Se connecter au réseau Bitcoin par un mandataire SOCKS5 séparé pour les services oignon de Tor. - - - Use separate SOCKS&5 proxy to reach peers via Tor onion services: - Utiliser un mandataire SOCKS&5 séparé pour atteindre les pairs par les services oignon de Tor : - - - &OK - &Valider - - - &Cancel - A&nnuler - - - Compiled without external signing support (required for external signing) - "External signing" means using devices such as hardware wallets. - Compilé sans prise en charge des signatures externes (requis pour la signature externe) - - - default - par défaut - - - none - aucune - - - Confirm options reset - Window title text of pop-up window shown when the user has chosen to reset options. - Confirmer la réinitialisation des options - - - Client restart required to activate changes. - Text explaining that the settings changed will not come into effect until the client is restarted. - Le redémarrage du client est exigé pour activer les changements. - - - Current settings will be backed up at "%1". - Text explaining to the user that the client's current settings will be backed up at a specific location. %1 is a stand-in argument for the backup location's path. - Les paramètres actuels vont être restaurés à "%1". - - - Client will be shut down. Do you want to proceed? - Text asking the user to confirm if they would like to proceed with a client shutdown. - Le client sera arrêté. Voulez-vous continuer ? - - - Configuration options - Window title text of pop-up box that allows opening up of configuration file. - Options de configuration - - - The configuration file is used to specify advanced user options which override GUI settings. Additionally, any command-line options will override this configuration file. - Explanatory text about the priority order of instructions considered by client. The order from high to low being: command-line, configuration file, GUI settings. - Le fichier de configuration est utilisé pour indiquer aux utilisateurs experts quelles options remplacent les paramètres de l’IUG. De plus, toute option de ligne de commande remplacera ce fichier de configuration. - - - Continue - Poursuivre - - - Cancel - Annuler - - - Error - Erreur - - - The configuration file could not be opened. - Impossible d’ouvrir le fichier de configuration. - - - This change would require a client restart. - Ce changement demanderait un redémarrage du client. - - - The supplied proxy address is invalid. - L’adresse de serveur mandataire fournie est invalide. - - - - OptionsModel - - Could not read setting "%1", %2. - Impossible de lire le paramètre "%1", %2. - - - - OverviewPage - - Form - Formulaire - - - The displayed information may be out of date. Your wallet automatically synchronizes with the Bitcoin network after a connection is established, but this process has not completed yet. - Les renseignements affichés peuvent être obsolètes. Votre porte-monnaie se synchronise automatiquement avec le réseau Bitcoin dès qu’une connexion est établie, mais ce processus n’est pas encore achevé. - - - Watch-only: - Juste-regarder : - - - Available: - Disponible : - - - Your current spendable balance - Votre solde actuel disponible - - - Pending: - En attente : - - - Total of transactions that have yet to be confirmed, and do not yet count toward the spendable balance - Total des transactions qui doivent encore être confirmées et qui ne sont pas prises en compte dans le solde disponible - - - Immature: - Immature : - - - Mined balance that has not yet matured - Le solde miné n’est pas encore mûr - - - Balances - Soldes - - - Total: - Total : - - - Your current total balance - Votre solde total actuel - - - Your current balance in watch-only addresses - Votre balance actuelle en adresses juste-regarder - - - Spendable: - Disponible : - - - Recent transactions - Transactions récentes - - - Unconfirmed transactions to watch-only addresses - Transactions non confirmées vers des adresses juste-regarder - - - Mined balance in watch-only addresses that has not yet matured - Le solde miné dans des adresses juste-regarder, qui n’est pas encore mûr - - - Current total balance in watch-only addresses - Solde total actuel dans des adresses juste-regarder - - - Privacy mode activated for the Overview tab. To unmask the values, uncheck Settings->Mask values. - Le mode privé est activé dans l’onglet Vue d’ensemble. Pour afficher les montants, décocher Paramètres -> Masquer les montants. - - - - PSBTOperationsDialog - - PSBT Operations - Opération PSBT - - - Sign Tx - Signer la transaction - - - Broadcast Tx - Diffuser la transaction - - - Copy to Clipboard - Copier dans le presse-papiers - - - Save… - Enregistrer… - - - Close - Fermer - - - Failed to load transaction: %1 - Échec de chargement de la transaction : %1 - - - Failed to sign transaction: %1 - Échec de signature de la transaction : %1 - - - Cannot sign inputs while wallet is locked. - Impossible de signer des entrées quand le porte-monnaie est verrouillé. - - - Could not sign any more inputs. - Aucune autre entrée n’a pu être signée. - - - Signed %1 inputs, but more signatures are still required. - %1 entrées ont été signées, mais il faut encore d’autres signatures. - - - Signed transaction successfully. Transaction is ready to broadcast. - La transaction a été signée avec succès et est prête à être diffusée. - - - Unknown error processing transaction. - Erreur inconnue lors de traitement de la transaction - - - Transaction broadcast successfully! Transaction ID: %1 - La transaction a été diffusée avec succès. ID de la transaction : %1 - - - Transaction broadcast failed: %1 - Échec de diffusion de la transaction : %1 - - - PSBT copied to clipboard. - La TBSP a été copiée dans le presse-papiers. - - - Save Transaction Data - Enregistrer les données de la transaction - - - Partially Signed Transaction (Binary) - Expanded name of the binary PSBT file format. See: BIP 174. - Transaction signée partiellement (fichier binaire) - - - PSBT saved to disk. - La TBSP a été enregistrée sur le disque. - - - Sends %1 to %2 - Envoie %1 à %2 - - - own address - votre adresse - - - Unable to calculate transaction fee or total transaction amount. - Impossible de calculer les frais de la transaction ou le montant total de la transaction. - - - Pays transaction fee: - Paye des frais de transaction : - - - Total Amount - Montant total - - - or - ou - - - Transaction has %1 unsigned inputs. - La transaction a %1 entrées non signées. - - - Transaction is missing some information about inputs. - Il manque des renseignements sur les entrées dans la transaction. - - - Transaction still needs signature(s). - La transaction a encore besoin d’une ou de signatures. - - - (But no wallet is loaded.) - (Mais aucun porte-monnaie n’est chargé.) - - - (But this wallet cannot sign transactions.) - (Mais ce porte-monnaie ne peut pas signer de transactions.) - - - (But this wallet does not have the right keys.) - (Mais ce porte-monnaie n’a pas les bonnes clés.) - - - Transaction is fully signed and ready for broadcast. - La transaction est complètement signée et prête à être diffusée. - - - Transaction status is unknown. - L’état de la transaction est inconnu. - - - - PaymentServer - - Payment request error - Erreur de demande de paiement - - - Cannot start bitcoin: click-to-pay handler - Impossible de démarrer le gestionnaire de cliquer-pour-payer bitcoin: - - - URI handling - Gestion des URI - - - 'bitcoin://' is not a valid URI. Use 'bitcoin:' instead. - 'bitcoin://' n’est pas une URI valide. Utilisez plutôt 'bitcoin:'. - - - Cannot process payment request because BIP70 is not supported. -Due to widespread security flaws in BIP70 it's strongly recommended that any merchant instructions to switch wallets be ignored. -If you are receiving this error you should request the merchant provide a BIP21 compatible URI. - Impossible de traiter la demande de paiement, car BIP70 n’est pas pris en charge. En raison des failles de sécurité généralisées de BIP70, il est fortement recommandé d’ignorer toute demande de marchand de changer de porte-monnaie. Si vous recevez cette erreur, vous devriez demander au marchand de vous fournir une URI compatible BIP21. - - - URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters. - L’URI ne peut pas être analysée. Cela peut être causé par une adresse Bitcoin invalide ou par des paramètres d’URI mal formés. - - - Payment request file handling - Gestion des fichiers de demande de paiement - - - - PeerTableModel - - User Agent - Title of Peers Table column which contains the peer's User Agent string. - Agent utilisateur - - - Peer - Title of Peers Table column which contains a unique number used to identify a connection. - Pair - - - Sent - Title of Peers Table column which indicates the total amount of network information we have sent to the peer. - Envoyé - - - Received - Title of Peers Table column which indicates the total amount of network information we have received from the peer. - Reçus - - - Address - Title of Peers Table column which contains the IP/Onion/I2P address of the connected peer. - Adresse - - - Network - Title of Peers Table column which states the network the peer connected through. - Réseau - - - Inbound - An Inbound Connection from a Peer. - Entrant - - - Outbound - An Outbound Connection to a Peer. - Sortant - - - - QRImageWidget - - &Save Image… - &Enregistrer l’image… - - - &Copy Image - &Copier l’image - - - Resulting URI too long, try to reduce the text for label / message. - L’URI résultante est trop longue. Essayez de réduire le texte de l’étiquette ou du message. - - - Error encoding URI into QR Code. - Erreur d’encodage de l’URI en code QR. - - - QR code support not available. - La prise en charge des codes QR n’est pas proposée. - - - Save QR Code - Enregistrer le code QR - - - PNG Image - Expanded name of the PNG file format. See: https://en.wikipedia.org/wiki/Portable_Network_Graphics. - Image PNG - - - - RPCConsole - - N/A - N.D. - - - Client version - Version du client - - - &Information - &Renseignements - - - General - Générales - - - Datadir - Répertoire des données - - - To specify a non-default location of the data directory use the '%1' option. - Pour indiquer un emplacement du répertoire des données différent de celui par défaut, utiliser l’option ’%1’. - - - Blocksdir - Répertoire des blocs - - - To specify a non-default location of the blocks directory use the '%1' option. - Pour indiquer un emplacement du répertoire des blocs différent de celui par défaut, utiliser l’option ’%1’. - - - Startup time - Heure de démarrage - - - Network - Réseau - - - Name - Nom - - - Number of connections - Nombre de connexions - - - Local Addresses - Adresses locales - - - Network addresses that your Bitcoin node is currently using to communicate with other nodes. - Adresses réseau que votre nœud Bitcoin utilise actuellement pour communiquer avec d’autres nœuds. - - - Block chain - Chaîne de blocs - - - Memory Pool - Réserve de mémoire - - - Current number of transactions - Nombre actuel de transactions - - - Memory usage - Utilisation de la mémoire - - - Wallet: - Porte-monnaie : - - - (none) - (aucun) - - - &Reset - &Réinitialiser - - - Received - Reçus - - - Sent - Envoyé - - - &Peers - &Pairs - - - Banned peers - Pairs bannis - - - Select a peer to view detailed information. - Sélectionnez un pair pour afficher des renseignements détaillés. - - - Hide Peers Detail - Cacher les détails des pairs - - - The transport layer version: %1 - La version de la couche de transport : %1 - - - Session ID - ID de session - - - Whether we relay transactions to this peer. - Si nous relayons des transactions à ce pair. - - - Transaction Relay - Relais de transaction - - - Starting Block - Bloc de départ - - - Synced Headers - En-têtes synchronisés - - - Synced Blocks - Blocs synchronisés - - - Last Transaction - Dernière transaction - - - The mapped Autonomous System used for diversifying peer selection. - Le système autonome mappé utilisé pour diversifier la sélection des pairs. - - - Mapped AS - SA mappé - - - Whether we relay addresses to this peer. - Tooltip text for the Address Relay field in the peer details area, which displays whether we relay addresses to this peer (Yes/No). - Reliez ou non des adresses à ce pair. - - - Address Relay - Text title for the Address Relay field in the peer details area, which displays whether we relay addresses to this peer (Yes/No). - Relais d’adresses - - - The total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting). - Tooltip text for the Addresses Processed field in the peer details area, which displays the total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting). - Nombre total d'adresses reçues de ce pair qui ont été traitées (à l'exclusion des adresses qui ont été abandonnées en raison de la limitation du débit). - - - The total number of addresses received from this peer that were dropped (not processed) due to rate-limiting. - Tooltip text for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting. - Nombre total d'adresses reçues de ce pair qui ont été abandonnées (non traitées) en raison de la limitation du débit. - - - Addresses Processed - Text title for the Addresses Processed field in the peer details area, which displays the total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting). - Adresses traitées - - - Addresses Rate-Limited - Text title for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting. - Adresses ciblées par la limite de débit - - - User Agent - Agent utilisateur - - - Node window - Fenêtre des nœuds - - - Current block height - Hauteur du bloc courant - - - Open the %1 debug log file from the current data directory. This can take a few seconds for large log files. - Ouvrir le fichier journal de débogage de %1 à partir du répertoire de données actuel. Cela peut prendre quelques secondes pour les fichiers journaux de grande taille. - - - Decrease font size - Diminuer la taille de police - - - Increase font size - Augmenter la taille de police - - - Permissions - Autorisations - - - The direction and type of peer connection: %1 - La direction et le type de la connexion au pair : %1 - - - The BIP324 session ID string in hex. - ID hexadécimale de la session BIP324. - - - The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS. - Le protocole réseau par lequel ce pair est connecté : IPv4, IPv6, Oignon, I2P ou CJDNS. - - - High bandwidth BIP152 compact block relay: %1 - Relais de blocs BIP152 compact à large bande passante : %1 - - - High Bandwidth - Large bande passante - - - Connection Time - Temps de connexion - - - Elapsed time since a novel block passing initial validity checks was received from this peer. - Temps écoulé depuis qu’un nouveau bloc qui a réussi les vérifications initiales de validité a été reçu par ce pair. - - - Last Block - Dernier bloc - - - Elapsed time since a novel transaction accepted into our mempool was received from this peer. - Tooltip text for the Last Transaction field in the peer details area. - Temps écoulé depuis qu’une nouvelle transaction acceptée dans notre réserve de mémoire a été reçue par ce pair. - - - Last Send - Dernier envoi - - - Last Receive - Dernière réception - - - Ping Time - Temps de ping - - - The duration of a currently outstanding ping. - La durée d’un ping en cours. - - - Ping Wait - Attente du ping - - - Min Ping - Ping min. - - - Time Offset - Décalage temporel - - - Last block time - Estampille temporelle du dernier bloc - - - &Open - &Ouvrir - - - &Network Traffic - Trafic &réseau - - - Totals - Totaux - - - Debug log file - Fichier journal de débogage - - - Clear console - Effacer la console - - - In: - Entrant : - - - Out: - Sortant : - - - Inbound: initiated by peer - Explanatory text for an inbound peer connection. - Entrant : établie par le pair - - - Outbound Full Relay: default - Explanatory text for an outbound peer connection that relays all network information. This is the default behavior for outbound connections. - Relais intégral sortant : par défaut - - - Outbound Block Relay: does not relay transactions or addresses - Explanatory text for an outbound peer connection that relays network information about blocks and not transactions or addresses. - Relais de bloc sortant : ne relaye ni transactions ni adresses - - - Outbound Manual: added using RPC %1 or %2/%3 configuration options - Explanatory text for an outbound peer connection that was established manually through one of several methods. The numbered arguments are stand-ins for the methods available to establish manual connections. - Manuelle sortante : ajoutée avec un RPC %1 ou les options de configuration %2/%3 - - - Outbound Feeler: short-lived, for testing addresses - Explanatory text for a short-lived outbound peer connection that is used to test the aliveness of known addresses. - Palpeur sortant : de courte durée, pour tester des adresses - - - Outbound Address Fetch: short-lived, for soliciting addresses - Explanatory text for a short-lived outbound peer connection that is used to request addresses from a peer. - Récupération d’adresse sortante : de courte durée, pour solliciter des adresses - - - detecting: peer could be v1 or v2 - Explanatory text for "detecting" transport type. - détection : paires pourrait être v1 ou v2 - - - v1: unencrypted, plaintext transport protocol - Explanatory text for v1 transport type. - v1: protocole de transport non chiffré en texte clair - - - v2: BIP324 encrypted transport protocol - Explanatory text for v2 transport type. - v2: Protocole de transport chiffré BIP324 - - - we selected the peer for high bandwidth relay - nous avons sélectionné le pair comme relais à large bande passante - - - the peer selected us for high bandwidth relay - le pair nous avons sélectionné comme relais à large bande passante - - - no high bandwidth relay selected - aucun relais à large bande passante n’a été sélectionné - - - &Copy address - Context menu action to copy the address of a peer. - &Copier l’adresse - - - &Disconnect - &Déconnecter - - - 1 &hour - 1 &heure - - - 1 d&ay - 1 &jour - - - 1 &week - 1 &semaine - - - 1 &year - 1 &an - - - &Copy IP/Netmask - Context menu action to copy the IP/Netmask of a banned peer. IP/Netmask is the combination of a peer's IP address and its Netmask. For IP address, see: https://en.wikipedia.org/wiki/IP_address. - &Copier l’IP, le masque réseau - - - &Unban - &Réhabiliter - - - Network activity disabled - L’activité réseau est désactivée - - - None - Aucun - - - Executing command without any wallet - Exécution de la commande sans aucun porte-monnaie - - - Node window - [%1] - Fenêtre des nœuds – [%1] - - - Executing command using "%1" wallet - Exécution de la commande en utilisant le porte-monnaie « %1 » - - - Welcome to the %1 RPC console. -Use up and down arrows to navigate history, and %2 to clear screen. -Use %3 and %4 to increase or decrease the font size. -Type %5 for an overview of available commands. -For more information on using this console, type %6. - -%7WARNING: Scammers have been active, telling users to type commands here, stealing their wallet contents. Do not use this console without fully understanding the ramifications of a command.%8 - RPC console welcome message. Placeholders %7 and %8 are style tags for the warning content, and they are not space separated from the rest of the text intentionally. - Bienvenue dans la console RPC de %1. -Utilisez les touches de déplacement vers le haut et vers le bas pour parcourir l’historique et %2 pour effacer l’écran. -Utilisez %3 et %4 pour augmenter ou diminuer la taille de la police. -Tapez %5 pour un aperçu des commandes proposées. -Pour plus de précisions sur cette console, tapez %6. -%7AVERTISSEMENT : des escrocs sont à l’œuvre et demandent aux utilisateurs de taper des commandes ici, volant ainsi le contenu de leur porte-monnaie. N’utilisez pas cette console sans entièrement comprendre les ramifications d’une commande. %8 - - - Executing… - A console message indicating an entered command is currently being executed. - Éxécution… - - - (peer: %1) - (pair : %1) - - - via %1 - par %1 - - - Yes - Oui - - - No - Non - - - To - À - - - From - De - - - Ban for - Bannir pendant - - - Never - Jamais - - - Unknown - Inconnu - - - - ReceiveCoinsDialog - - &Amount: - &Montant : - - - &Label: - &Étiquette : - - - &Message: - M&essage : - - - An optional message to attach to the payment request, which will be displayed when the request is opened. Note: The message will not be sent with the payment over the Bitcoin network. - Un message facultatif à joindre à la demande de paiement et qui sera affiché à l’ouverture de celle-ci. Note : Le message ne sera pas envoyé avec le paiement par le réseau Bitcoin. - - - An optional label to associate with the new receiving address. - Un étiquette facultative à associer à la nouvelle adresse de réception. - - - Use this form to request payments. All fields are <b>optional</b>. - Utiliser ce formulaire pour demander des paiements. Tous les champs sont <b>facultatifs</b>. - - - An optional amount to request. Leave this empty or zero to not request a specific amount. - Un montant facultatif à demander. Ne rien saisir ou un zéro pour ne pas demander de montant précis. - - - An optional label to associate with the new receiving address (used by you to identify an invoice). It is also attached to the payment request. - Une étiquette facultative à associer à la nouvelle adresse de réception (utilisée par vous pour identifier une facture). Elle est aussi jointe à la demande de paiement. - - - An optional message that is attached to the payment request and may be displayed to the sender. - Un message facultatif joint à la demande de paiement et qui peut être présenté à l’expéditeur. - - - &Create new receiving address - &Créer une nouvelle adresse de réception - - - Clear all fields of the form. - Effacer tous les champs du formulaire. - - - Clear - Effacer - - - Requested payments history - Historique des paiements demandés - - - Show the selected request (does the same as double clicking an entry) - Afficher la demande sélectionnée (comme double-cliquer sur une entrée) - - - Show - Afficher - - - Remove the selected entries from the list - Retirer les entrées sélectionnées de la liste - - - Remove - Retirer - - - Copy &URI - Copier l’&URI - - - &Copy address - &Copier l’adresse - - - Copy &label - Copier l’&étiquette - - - Copy &message - Copier le &message - - - Copy &amount - Copier le &montant - - - Not recommended due to higher fees and less protection against typos. - Non recommandé en raison de frais élevés et d'une faible protection contre les fautes de frappe. - - - Generates an address compatible with older wallets. - Génère une adresse compatible avec les anciens portefeuilles. - - - Generates a native segwit address (BIP-173). Some old wallets don't support it. - Génère une adresse segwit native (BIP-173). Certains anciens portefeuilles ne le supportent pas. - - - Bech32m (BIP-350) is an upgrade to Bech32, wallet support is still limited. - Bech32m (BIP-350) est une mise à jour de Bech32, la prise en charge du portefeuille est encore limitée. - - - Could not unlock wallet. - Impossible de déverrouiller le porte-monnaie. - - - Could not generate new %1 address - Impossible de générer la nouvelle adresse %1 - - - - ReceiveRequestDialog - - Request payment to … - Demander de paiement à… - - - Address: - Adresse : - - - Amount: - Montant : - - - Label: - Étiquette : - - - Message: - Message : - - - Wallet: - Porte-monnaie : - - - Copy &URI - Copier l’&URI - - - Copy &Address - Copier l’&adresse - - - &Verify - &Vérifier - - - Verify this address on e.g. a hardware wallet screen - Confirmer p. ex. cette adresse sur l’écran d’un porte-monnaie matériel - - - &Save Image… - &Enregistrer l’image… - - - Payment information - Renseignements de paiement - - - Request payment to %1 - Demande de paiement à %1 - - - - RecentRequestsTableModel - - Label - Étiquette - - - (no label) - (aucune étiquette) - - - (no message) - (aucun message) - - - (no amount requested) - (aucun montant demandé) - - - Requested - Demandée - - - - SendCoinsDialog - - Send Coins - Envoyer des pièces - - - Coin Control Features - Fonctions de contrôle des pièces - - - automatically selected - sélectionné automatiquement - - - Insufficient funds! - Les fonds sont insuffisants - - - Quantity: - Quantité : - - - Bytes: - Octets : - - - Amount: - Montant : - - - Fee: - Frais : - - - After Fee: - Après les frais : - - - Change: - Monnaie : - - - If this is activated, but the change address is empty or invalid, change will be sent to a newly generated address. - Si cette option est activée et l’adresse de monnaie est vide ou invalide, la monnaie sera envoyée vers une adresse nouvellement générée. - - - Custom change address - Adresse personnalisée de monnaie - - - Transaction Fee: - Frais de transaction : - - - Using the fallbackfee can result in sending a transaction that will take several hours or days (or never) to confirm. Consider choosing your fee manually or wait until you have validated the complete chain. - L’utilisation de l’option « fallbackfee » (frais de repli) peut avoir comme effet d’envoyer une transaction qui prendra plusieurs heures ou jours pour être confirmée, ou qui ne le sera jamais. Envisagez de choisir vos frais manuellement ou attendez d’avoir validé l’intégralité de la chaîne. - - - Warning: Fee estimation is currently not possible. - Avertissement : L’estimation des frais n’est actuellement pas possible. - - - per kilobyte - par kilo-octet - - - Hide - Cacher - - - Recommended: - Recommandés : - - - Custom: - Personnalisés : - - - Send to multiple recipients at once - Envoyer à plusieurs destinataires à la fois - - - Add &Recipient - Ajouter un &destinataire - - - Clear all fields of the form. - Effacer tous les champs du formulaire. - - - Choose… - Choisir… - - - Hide transaction fee settings - Cacher les paramètres de frais de transaction - - - Specify a custom fee per kB (1,000 bytes) of the transaction's virtual size. - -Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satoshis per kvB" for a transaction size of 500 virtual bytes (half of 1 kvB) would ultimately yield a fee of only 50 satoshis. - Indiquer des frais personnalisés par Ko (1 000 octets) de la taille virtuelle de la transaction. - -Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshis par Kov » pour une transaction d’une taille de 500 octets (la moitié de 1 Kov) donneront des frais de seulement 50 satoshis. - - - When there is less transaction volume than space in the blocks, miners as well as relaying nodes may enforce a minimum fee. Paying only this minimum fee is just fine, but be aware that this can result in a never confirming transaction once there is more demand for bitcoin transactions than the network can process. - Quand le volume des transactions est inférieur à l’espace dans les blocs, les mineurs et les nœuds de relais peuvent imposer des frais minimaux. Il est correct de payer ces frais minimaux, mais soyez conscient que cette transaction pourrait n’être jamais confirmée si la demande en transactions de bitcoins dépassait la capacité de traitement du réseau. - - - A too low fee might result in a never confirming transaction (read the tooltip) - Si les frais sont trop bas, cette transaction pourrait n’être jamais confirmée (lire l’infobulle) - - - (Smart fee not initialized yet. This usually takes a few blocks…) - (Les frais intelligents ne sont pas encore initialisés. Cela prend habituellement quelques blocs…) - - - Confirmation time target: - Estimation du délai de confirmation : - - - Enable Replace-By-Fee - Activer Remplacer-par-des-frais - - - With Replace-By-Fee (BIP-125) you can increase a transaction's fee after it is sent. Without this, a higher fee may be recommended to compensate for increased transaction delay risk. - Avec Remplacer-par-des-frais (BIP-125), vous pouvez augmenter les frais de transaction après qu’elle est envoyée. Sans cela, des frais plus élevés peuvent être recommandés pour compenser le risque accru de retard transactionnel. - - - Clear &All - &Tout effacer - - - Balance: - Solde : - - - Confirm the send action - Confirmer l’action d’envoi - - - S&end - E&nvoyer - - - Copy quantity - Copier la quantité - - - Copy amount - Copier le montant - - - Copy fee - Copier les frais - - - Copy after fee - Copier après les frais - - - Copy bytes - Copier les octets - - - Copy change - Copier la monnaie - - - %1 (%2 blocks) - %1 (%2 blocs) - - - Sign on device - "device" usually means a hardware wallet. - Signer sur l’appareil externe - - - Connect your hardware wallet first. - Connecter d’abord le porte-monnaie matériel. - - - Set external signer script path in Options -> Wallet - "External signer" means using devices such as hardware wallets. - Définir le chemin script du signataire externe dans Options -> Porte-monnaie - - - Cr&eate Unsigned - Cr&éer une transaction non signée - - - Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet. - Crée une transaction Bitcoin signée partiellement (TBSP) à utiliser, par exemple, avec un porte-monnaie %1 hors ligne ou avec un porte-monnaie matériel compatible TBSP. - - - %1 to '%2' - %1 à '%2' - - - %1 to %2 - %1 à %2 - - - To review recipient list click "Show Details…" - Pour réviser la liste des destinataires, cliquez sur « Afficher les détails… » - - - Sign failed - Échec de signature - - - External signer not found - "External signer" means using devices such as hardware wallets. - Le signataire externe est introuvable - - - External signer failure - "External signer" means using devices such as hardware wallets. - Échec du signataire externe - - - Save Transaction Data - Enregistrer les données de la transaction - - - Partially Signed Transaction (Binary) - Expanded name of the binary PSBT file format. See: BIP 174. - Transaction signée partiellement (fichier binaire) - - - PSBT saved - Popup message when a PSBT has been saved to a file - La TBSP a été enregistrée - - - External balance: - Solde externe : - - - or - ou - - - You can increase the fee later (signals Replace-By-Fee, BIP-125). - Vous pouvez augmenter les frais ultérieurement (signale Remplacer-par-des-frais, BIP-125). - - - Please, review your transaction proposal. This will produce a Partially Signed Bitcoin Transaction (PSBT) which you can save or copy and then sign with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet. - Text to inform a user attempting to create a transaction of their current options. At this stage, a user can only create a PSBT. This string is displayed when private keys are disabled and an external signer is not available. - Veuillez réviser votre proposition de transaction. Une transaction Bitcoin partiellement signée (TBSP) sera produite, que vous pourrez enregistrer ou copier puis signer avec, par exemple, un porte-monnaie %1 hors ligne ou avec un porte-monnaie matériel compatible TBSP. - - - %1 from wallet '%2' - %1 du porte-monnaie « %2 ». - - - Do you want to create this transaction? - Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create. - Voulez-vous créer cette transaction ? - - - Please, review your transaction. You can create and send this transaction or create a Partially Signed Bitcoin Transaction (PSBT), which you can save or copy and then sign with, e.g., an offline %1 wallet, or a PSBT-compatible hardware wallet. - Text to inform a user attempting to create a transaction of their current options. At this stage, a user can send their transaction or create a PSBT. This string is displayed when both private keys and PSBT controls are enabled. - Veuillez réviser votre transaction. Vous pouvez créer et envoyer cette transaction ou créer une transaction Bitcoin partiellement signée (TBSP), que vous pouvez enregistrer ou copier, et ensuite avec laquelle signer, par ex., un porte-monnaie %1 hors ligne ou avec un porte-monnaie matériel compatible TBSP. - - - Please, review your transaction. - Text to prompt a user to review the details of the transaction they are attempting to send. - Veuillez vérifier votre transaction. - - - Transaction fee - Frais de transaction - - - Not signalling Replace-By-Fee, BIP-125. - Ne signale pas Remplacer-par-des-frais, BIP-125. - - - Total Amount - Montant total - - - Unsigned Transaction - PSBT copied - Caption of "PSBT has been copied" messagebox - Transaction non signée - - - The PSBT has been copied to the clipboard. You can also save it. - Le PSBT a été copié dans le presse-papiers. Vous pouvez également le sauvegarder. - - - PSBT saved to disk - PSBT sauvegardé sur le disque - - - Confirm send coins - Confirmer l’envoi de pièces - - - Watch-only balance: - Solde juste-regarder : - - - The recipient address is not valid. Please recheck. - L’adresse du destinataire est invalide. Veuillez la revérifier. - - - The amount to pay must be larger than 0. - Le montant à payer doit être supérieur à 0. - - - The amount exceeds your balance. - Le montant dépasse votre solde. - - - The total exceeds your balance when the %1 transaction fee is included. - Le montant dépasse votre solde quand les frais de transaction de %1 sont compris. - - - Duplicate address found: addresses should only be used once each. - Une adresse identique a été trouvée : chaque adresse ne devrait être utilisée qu’une fois. - - - Transaction creation failed! - Échec de création de la transaction - - - A fee higher than %1 is considered an absurdly high fee. - Des frais supérieurs à %1 sont considérés comme ridiculement élevés. - - - Estimated to begin confirmation within %n block(s). - - Début de confirmation estimé à %n bloc. - Début de confirmation estimé à %n blocs. - - - - Warning: Invalid Bitcoin address - Avertissement : L’adresse Bitcoin est invalide - - - Warning: Unknown change address - Avertissement : L’adresse de monnaie est inconnue - - - Confirm custom change address - Confirmer l’adresse personnalisée de monnaie - - - The address you selected for change is not part of this wallet. Any or all funds in your wallet may be sent to this address. Are you sure? - L’adresse que vous avez sélectionnée pour la monnaie ne fait pas partie de ce porte-monnaie. Les fonds de ce porte-monnaie peuvent en partie ou en totalité être envoyés vers cette adresse. Êtes-vous certain ? - - - (no label) - (aucune étiquette) - - - - SendCoinsEntry - - A&mount: - &Montant : - - - Pay &To: - &Payer à : - - - &Label: - &Étiquette : - - - Choose previously used address - Choisir une adresse utilisée précédemment - - - The Bitcoin address to send the payment to - L’adresse Bitcoin à laquelle envoyer le paiement - - - Paste address from clipboard - Collez l’adresse du presse-papiers - - - Remove this entry - Supprimer cette entrée - - - The amount to send in the selected unit - Le montant à envoyer dans l’unité sélectionnée - - - The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally. - Les frais seront déduits du montant envoyé. Le destinataire recevra moins de bitcoins que le montant saisi dans le champ de montant. Si plusieurs destinataires sont sélectionnés, les frais seront partagés également. - - - S&ubtract fee from amount - S&oustraire les frais du montant - - - Use available balance - Utiliser le solde disponible - - - Message: - Message : - - - Enter a label for this address to add it to the list of used addresses - Saisir une étiquette pour cette adresse afin de l’ajouter à la liste d’adresses utilisées - - - A message that was attached to the bitcoin: URI which will be stored with the transaction for your reference. Note: This message will not be sent over the Bitcoin network. - Un message qui était joint à l’URI bitcoin: et qui sera stocké avec la transaction pour référence. Note : Ce message ne sera pas envoyé par le réseau Bitcoin. - - - - SendConfirmationDialog - - Send - Envoyer - - - Create Unsigned - Créer une transaction non signée - - - - SignVerifyMessageDialog - - Signatures - Sign / Verify a Message - Signatures – Signer ou vérifier un message - - - &Sign Message - &Signer un message - - - You can sign messages/agreements with your legacy (P2PKH) addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. - Vous pouvez signer des messages ou des accords avec vos anciennes adresses (P2PKH) pour prouver que vous pouvez recevoir des bitcoins à ces dernières. Ne signer rien de vague ou au hasard, car des attaques d’hameçonnage pourraient essayer de vous faire signer avec votre identité afin de l’usurper. Ne signez que des déclarations entièrement détaillées et que vous acceptez. - - - The Bitcoin address to sign the message with - L’adresse Bitcoin avec laquelle signer le message - - - Choose previously used address - Choisir une adresse utilisée précédemment - - - Paste address from clipboard - Collez l’adresse du presse-papiers - - - Enter the message you want to sign here - Saisir ici le message que vous voulez signer - - - Copy the current signature to the system clipboard - Copier la signature actuelle dans le presse-papiers - - - Sign the message to prove you own this Bitcoin address - Signer le message afin de prouver que vous détenez cette adresse Bitcoin - - - Sign &Message - Signer le &message - - - Reset all sign message fields - Réinitialiser tous les champs de signature de message - - - Clear &All - &Tout effacer - - - &Verify Message - &Vérifier un message - - - Enter the receiver's address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack. Note that this only proves the signing party receives with the address, it cannot prove sendership of any transaction! - Saisissez ci-dessous l’adresse du destinataire, le message (assurez-vous de copier fidèlement les retours à la ligne, les espaces, les tabulations, etc.) et la signature pour vérifier le message. Faites attention à ne pas déduire davantage de la signature que ce qui est contenu dans le message signé même, pour éviter d’être trompé par une attaque de l’intercepteur. Notez que cela ne fait que prouver que le signataire reçoit avec l’adresse et ne peut pas prouver la provenance d’une transaction. - - - The Bitcoin address the message was signed with - L’adresse Bitcoin avec laquelle le message a été signé - - - The signed message to verify - Le message signé à vérifier - - - The signature given when the message was signed - La signature donnée quand le message a été signé - - - Verify the message to ensure it was signed with the specified Bitcoin address - Vérifier le message pour s’assurer qu’il a été signé avec l’adresse Bitcoin indiquée - - - Verify &Message - Vérifier le &message - - - Reset all verify message fields - Réinitialiser tous les champs de vérification de message - - - Click "Sign Message" to generate signature - Cliquez sur « Signer le message » pour générer la signature - - - The entered address is invalid. - L’adresse saisie est invalide. - - - Please check the address and try again. - Veuillez vérifier l’adresse et réessayer. - - - The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again. - L’adresse saisie ne fait pas référence à une ancienne clé (P2PKH). La signature des messages n’est pas prise en charge pour SegWit ni pour les autres types d’adresses non P2PKH dans cette version de %1. Vérifiez l’adresse et réessayez. - - - Wallet unlock was cancelled. - Le déverrouillage du porte-monnaie a été annulé. - - - No error - Aucune erreur - - - Private key for the entered address is not available. - La clé privée pour l’adresse saisie n’est pas disponible. - - - Message signing failed. - Échec de signature du message. - - - Message signed. - Le message a été signé. - - - The signature could not be decoded. - La signature n’a pu être décodée. - - - Please check the signature and try again. - Veuillez vérifier la signature et réessayer. - - - The signature did not match the message digest. - La signature ne correspond pas au condensé du message. - - - Message verification failed. - Échec de vérification du message. - - - Message verified. - Le message a été vérifié. - - - - SplashScreen - - (press q to shutdown and continue later) - (appuyer sur q pour fermer et poursuivre plus tard) - - - press q to shutdown - Appuyer sur q pour fermer - - - - TrafficGraphWidget - - kB/s - Ko/s - - - - TransactionDesc - - conflicted with a transaction with %1 confirmations - Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that conflicts with a confirmed transaction. - est en conflit avec une transaction ayant %1 confirmations - - - 0/unconfirmed, in memory pool - Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that is in the memory pool. - 0/non confirmé, dans la pool de mémoire - - - 0/unconfirmed, not in memory pool - Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that is not in the memory pool. - 0/non confirmé, pas dans la pool de mémoire - - - abandoned - Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an abandoned transaction. - abandonnée - - - %1/unconfirmed - Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents a transaction confirmed in at least one block, but less than 6 blocks. - %1/non confirmée - - - Status - État - - - Generated - Générée - - - From - De - - - unknown - inconnue - - - To - À - - - own address - votre adresse - - - watch-only - juste-regarder - - - label - étiquette - - - Credit - Crédit - - - matures in %n more block(s) - - arrivera à maturité dans %n bloc - arrivera à maturité dans %n blocs - - - - not accepted - non acceptée - - - Debit - Débit - - - Total debit - Débit total - - - Total credit - Crédit total - - - Transaction fee - Frais de transaction - - - Net amount - Montant net - - - Comment - Commentaire - - - Transaction ID - ID de la transaction - - - Transaction total size - Taille totale de la transaction - - - Transaction virtual size - Taille virtuelle de la transaction - - - Output index - Index des sorties - - - %1 (Certificate was not verified) - %1 (ce certificat n’a pas été vérifié) - - - Merchant - Marchand - - - Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. - Les pièces générées doivent mûrir pendant %1 blocs avant de pouvoir être dépensées. Quand vous avez généré ce bloc, il a été diffusé sur le réseau pour être ajouté à la chaîne de blocs. Si son intégration à la chaîne échoue, son état sera modifié en « non acceptée » et il ne sera pas possible de le dépenser. Cela peut arriver occasionnellement si un autre nœud génère un bloc à quelques secondes du vôtre. - - - Debug information - Renseignements de débogage - - - Inputs - Entrées - - - Amount - Montant - - - true - vrai - - - false - faux - - - - TransactionDescDialog - - This pane shows a detailed description of the transaction - Ce panneau affiche une description détaillée de la transaction - - - Details for %1 - Détails de %1 - - - - TransactionTableModel - - Label - Étiquette - - - Unconfirmed - Non confirmée - - - Abandoned - Abandonnée - - - Confirming (%1 of %2 recommended confirmations) - Confirmation (%1 sur %2 confirmations recommandées) - - - Confirmed (%1 confirmations) - Confirmée (%1 confirmations) - - - Conflicted - En conflit - - - Immature (%1 confirmations, will be available after %2) - Immature (%1 confirmations, sera disponible après %2) - - - Generated but not accepted - Générée mais non acceptée - - - Received with - Reçue avec - - - Received from - Reçue de - - - Sent to - Envoyée à - - - Mined - Miné - - - watch-only - juste-regarder - - - (n/a) - (n.d) - - - (no label) - (aucune étiquette) - - - Transaction status. Hover over this field to show number of confirmations. - État de la transaction. Survoler ce champ avec la souris pour afficher le nombre de confirmations. - - - Date and time that the transaction was received. - Date et heure de réception de la transaction. - - - Type of transaction. - Type de transaction. - - - Whether or not a watch-only address is involved in this transaction. - Une adresse juste-regarder est-elle ou non impliquée dans cette transaction. - - - User-defined intent/purpose of the transaction. - Intention, but de la transaction défini par l’utilisateur. - - - Amount removed from or added to balance. - Le montant a été ajouté ou soustrait du solde. - - - - TransactionView - - All - Toutes - - - Today - Aujourd’hui - - - This week - Cette semaine - - - This month - Ce mois - - - Last month - Le mois dernier - - - This year - Cette année - - - Received with - Reçue avec - - - Sent to - Envoyée à - - - Mined - Miné - - - Other - Autres - - - Enter address, transaction id, or label to search - Saisir l’adresse, l’ID de transaction ou l’étiquette à chercher - - - Min amount - Montant min. - - - Range… - Plage… - - - &Copy address - &Copier l’adresse - - - Copy &label - Copier l’&étiquette - - - Copy &amount - Copier le &montant - - - Copy transaction &ID - Copier l’&ID de la transaction - - - Copy &raw transaction - Copier la transaction &brute - - - Copy full transaction &details - Copier tous les &détails de la transaction - - - &Show transaction details - &Afficher les détails de la transaction - - - Increase transaction &fee - Augmenter les &frais de transaction - - - A&bandon transaction - A&bandonner la transaction - - - &Edit address label - &Modifier l’adresse de l’étiquette - - - Show in %1 - Transactions table context menu action to show the selected transaction in a third-party block explorer. %1 is a stand-in argument for the URL of the explorer. - Afficher dans %1 - - - Export Transaction History - Exporter l’historique transactionnel - - - Comma separated file - Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values. - Fichier séparé par des virgules - - - Confirmed - Confirmée - - - Watch-only - Juste-regarder - - - Label - Étiquette - - - Address - Adresse - - - ID - ID - - - Exporting Failed - Échec d’exportation - - - There was an error trying to save the transaction history to %1. - Une erreur est survenue lors de l’enregistrement de l’historique transactionnel vers %1. - - - Exporting Successful - L’exportation est réussie - - - The transaction history was successfully saved to %1. - L’historique transactionnel a été enregistré avec succès vers %1. - - - Range: - Plage : - - - to - à - - - - WalletFrame - - No wallet has been loaded. -Go to File > Open Wallet to load a wallet. -- OR - - Aucun porte-monnaie n’a été chargé. -Accédez à Fichier > Ouvrir un porte-monnaie pour en charger un. -– OU – - - - Create a new wallet - Créer un nouveau porte-monnaie - - - Error - Erreur - - - Unable to decode PSBT from clipboard (invalid base64) - Impossible de décoder la TBSP du presse-papiers (le Base64 est invalide) - - - Load Transaction Data - Charger les données de la transaction - - - Partially Signed Transaction (*.psbt) - Transaction signée partiellement (*.psbt) - - - PSBT file must be smaller than 100 MiB - Le fichier de la TBSP doit être inférieur à 100 Mio - - - Unable to decode PSBT - Impossible de décoder la TBSP - - - - WalletModel - - Send Coins - Envoyer des pièces - - - Fee bump error - Erreur d’augmentation des frais - - - Increasing transaction fee failed - Échec d’augmentation des frais de transaction - - - Do you want to increase the fee? - Asks a user if they would like to manually increase the fee of a transaction that has already been created. - Voulez-vous augmenter les frais ? - - - Current fee: - Frais actuels : - - - Increase: - Augmentation : - - - New fee: - Nouveaux frais : - - - Warning: This may pay the additional fee by reducing change outputs or adding inputs, when necessary. It may add a new change output if one does not already exist. These changes may potentially leak privacy. - Avertissement : Ceci pourrait payer les frais additionnel en réduisant les sorties de monnaie ou en ajoutant des entrées, si nécessaire. Une nouvelle sortie de monnaie pourrait être ajoutée si aucune n’existe déjà. Ces changements pourraient altérer la confidentialité. - - - Confirm fee bump - Confirmer l’augmentation des frais - - - Can't draft transaction. - Impossible de créer une ébauche de la transaction. - - - PSBT copied - La TBPS a été copiée - - - Fee-bump PSBT copied to clipboard - La TBSP des augmentations de frais a été copiée dans le presse-papiers. - - - Can't sign transaction. - Impossible de signer la transaction. - - - Could not commit transaction - Impossible de valider la transaction - - - Signer error - Erreur de signataire - - - Can't display address - Impossible d’afficher l’adresse - - - - WalletView - - &Export - &Exporter - - - Export the data in the current tab to a file - Exporter les données de l’onglet actuel vers un fichier - - - Backup Wallet - Sauvegarder le porte-monnaie - - - Wallet Data - Name of the wallet data file format. - Données du porte-monnaie - - - Backup Failed - Échec de sauvegarde - - - There was an error trying to save the wallet data to %1. - Une erreur est survenue lors de l’enregistrement des données du porte-monnaie vers %1. - - - Backup Successful - La sauvegarde est réussie - - - The wallet data was successfully saved to %1. - Les données du porte-monnaie ont été enregistrées avec succès vers %1. - - - Cancel - Annuler - - - - bitcoin-core - - The %s developers - Les développeurs de %s - - - %s corrupt. Try using the wallet tool bitcoin-wallet to salvage or restoring a backup. - %s est corrompu. Essayez l’outil bitcoin-wallet pour le sauver ou restaurez une sauvegarde. - - - %s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error. - %s a échoué à valider l'état instantané -assumeutxo. Cela indique un problème matériel, ou un bug dans le logiciel, ou une mauvaise modification du logiciel qui a permis de charger un instantané invalide. En conséquence, le nœud s'arrêtera et cessera d'utiliser tout état qui a été construit sur l'instantané, réinitialisant la hauteur de la chaîne de %d à %d. Au prochain redémarrage, le nœud reprendra la synchronisation à partir de %d sans utiliser de données d'instantané. Veuillez signaler cet incident à %s, en précisant comment vous avez obtenu l'instantané. L'état de chaîne d'instantané invalide sera conservé sur le disque au cas où il serait utile pour diagnostiquer le problème qui a causé cette erreur. - - - %s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list. - %s demande d'écouter sur le port %u. Ce port est considéré comme "mauvais" et il est donc peu probable qu'un pair s'y connecte. Voir doc/p2p-bad-ports.md pour plus de détails et une liste complète. - - - Cannot downgrade wallet from version %i to version %i. Wallet version unchanged. - Impossible de rétrograder le porte-monnaie de la version %i à la version %i. La version du porte-monnaie reste inchangée. - - - Cannot upgrade a non HD split wallet from version %i to version %i without upgrading to support pre-split keypool. Please use version %i or no version specified. - Impossible de mettre à niveau un porte-monnaie divisé non-HD de la version %i vers la version %i sans mise à niveau pour prendre en charge la réserve de clés antérieure à la division. Veuillez utiliser la version %i ou ne pas indiquer de version. - - - Disk space for %s may not accommodate the block files. Approximately %u GB of data will be stored in this directory. - L'espace disque %s peut ne pas être suffisant pour les fichiers en bloc. Environ %u Go de données seront stockés dans ce répertoire. - - - Distributed under the MIT software license, see the accompanying file %s or %s - Distribué sous la licence MIT d’utilisation d’un logiciel, consultez le fichier joint %s ou %s - - - Error loading wallet. Wallet requires blocks to be downloaded, and software does not currently support loading wallets while blocks are being downloaded out of order when using assumeutxo snapshots. Wallet should be able to load successfully after node sync reaches height %s - Erreur de chargement du portefeuille. Le portefeuille nécessite le téléchargement de blocs, et le logiciel ne prend pas actuellement en charge le chargement de portefeuilles lorsque les blocs sont téléchargés dans le désordre lors de l'utilisation de snapshots assumeutxo. Le portefeuille devrait pouvoir être chargé avec succès une fois que la synchronisation des nœuds aura atteint la hauteur %s - - - Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet. - Erreur de lecture de %s : soit les données de la transaction manquent soit elles sont incorrectes. Réanalyse du porte-monnaie. - - - Error starting/committing db txn for wallet transactions removal process - Erreur de lancement, de validation de la transaction de base de données pour la suppression des transactions du portemonnaie - - - Error: Dumpfile format record is incorrect. Got "%s", expected "format". - Erreur : L’enregistrement du format du fichier de vidage est incorrect. Est « %s », mais « format » est attendu. - - - Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s". - Erreur : L’enregistrement de l’identificateur du fichier de vidage est incorrect. Est « %s », mais « %s » est attendu. - - - Error: Dumpfile version is not supported. This version of bitcoin-wallet only supports version 1 dumpfiles. Got dumpfile with version %s - Erreur : La version du fichier de vidage n’est pas prise en charge. Cette version de bitcoin-wallet ne prend en charge que les fichiers de vidage version 1. Le fichier de vidage obtenu est de la version %s. - - - Error: Legacy wallets only support the "legacy", "p2sh-segwit", and "bech32" address types - Erreur : les porte-monnaie hérités ne prennent en charge que les types d’adresse « legacy », « p2sh-segwit », et « bech32 » - - - Error: Unable to produce descriptors for this legacy wallet. Make sure to provide the wallet's passphrase if it is encrypted. - Erreur : Impossible de produire des descripteurs pour ce portefeuille existant. Veillez à fournir la phrase secrète du portefeuille s'il est crypté. - - - File %s already exists. If you are sure this is what you want, move it out of the way first. - Le fichier %s existe déjà. Si vous confirmez l’opération, déplacez-le avant. - - - Invalid or corrupt peers.dat (%s). If you believe this is a bug, please report it to %s. As a workaround, you can move the file (%s) out of the way (rename, move, or delete) to have a new one created on the next start. - peers.dat est invalide ou corrompu (%s). Si vous pensez que c’est un bogue, veuillez le signaler à %s. Pour y remédier, vous pouvez soit renommer, soit déplacer soit supprimer le fichier (%s) et un nouveau sera créé lors du prochain démarrage. - - - Invalid value detected for '-wallet' or '-nowallet'. '-wallet' requires a string value, while '-nowallet' accepts only '1' to disable all wallets - Une valeur invalide a été détectée pour « -wallet » ou pour « -nowallet ». « -wallet » nécessite une valeur de chaine alors que « -nowallet » n’accepte que « 1 » pour désactiver tous les portemonnaies - - - More than one onion bind address is provided. Using %s for the automatically created Tor onion service. - Plus d’une adresse oignon de liaison est indiquée. %s sera utilisée pour le service oignon de Tor créé automatiquement. - - - No dump file provided. To use createfromdump, -dumpfile=<filename> must be provided. - Aucun fichier de vidage n’a été indiqué. Pour utiliser createfromdump, -dumpfile=<filename> doit être indiqué. - - - No dump file provided. To use dump, -dumpfile=<filename> must be provided. - Aucun fichier de vidage n’a été indiqué. Pour utiliser dump, -dumpfile=<filename> doit être indiqué. - - - No wallet file format provided. To use createfromdump, -format=<format> must be provided. - Aucun format de fichier de porte-monnaie n’a été indiqué. Pour utiliser createfromdump, -format=<format> doit être indiqué. - - - Option '-upnp' is set but UPnP support was dropped in version 29.0. Consider using '-natpmp' instead. - L’option « -upnp » est définie, mais la prise en charge d’UPnP a été abandonnée dans la version 29.0. Envisagez de la remplacer par « -natpmp ». - - - Please contribute if you find %s useful. Visit %s for further information about the software. - Si vous trouvez %s utile, veuillez y contribuer. Pour de plus de précisions sur le logiciel, rendez-vous sur %s. - - - Prune configured below the minimum of %d MiB. Please use a higher number. - L’élagage est configuré au-dessous du minimum de %d Mio. Veuillez utiliser un nombre plus élevé. - - - Prune mode is incompatible with -reindex-chainstate. Use full -reindex instead. - Le mode Prune est incompatible avec -reindex-chainstate. Utilisez plutôt -reindex complet. - - - Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node) - Élagage : la dernière synchronisation de porte-monnaie va par-delà les données élaguées. Vous devez -reindex (réindexer, télécharger de nouveau toute la chaîne de blocs en cas de nœud élagué) - - - Rename of '%s' -> '%s' failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup. - La modification de '%s' -> '%s' a échoué. Vous devriez résoudre cela en déplaçant ou en supprimant manuellement le répertoire de snapshot invalide %s, sinon vous rencontrerez la même erreur à nouveau au prochain démarrage. - - - SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported - SQLiteDatabase : la version %d du schéma de porte-monnaie sqlite est inconnue. Seule la version %d est prise en charge - - - The block database contains a block which appears to be from the future. This may be due to your computer's date and time being set incorrectly. Only rebuild the block database if you are sure that your computer's date and time are correct - La base de données des blocs comprend un bloc qui semble provenir du futur. Cela pourrait être causé par la date et l’heure erronées de votre ordinateur. Ne reconstruisez la base de données des blocs que si vous êtes certain que la date et l’heure de votre ordinateur sont justes. - - - The transaction amount is too small to send after the fee has been deducted - Le montant de la transaction est trop bas pour être envoyé une fois que les frais ont été déduits - - - This error could occur if this wallet was not shutdown cleanly and was last loaded using a build with a newer version of Berkeley DB. If so, please use the software that last loaded this wallet - Cette erreur pourrait survenir si ce porte-monnaie n’a pas été fermé proprement et s’il a été chargé en dernier avec une nouvelle version de Berkeley DB. Si c’est le cas, veuillez utiliser le logiciel qui a chargé ce porte-monnaie en dernier. - - - This is a pre-release test build - use at your own risk - do not use for mining or merchant applications - Ceci est une préversion de test — son utilisation est entièrement à vos risques — ne l’utilisez pour miner ou pour des applications marchandes - - - This is the maximum transaction fee you pay (in addition to the normal fee) to prioritize partial spend avoidance over regular coin selection. - Les frais maximaux de transaction que vous payez (en plus des frais habituels) afin de prioriser une dépense non partielle plutôt qu’une sélection normale de pièces. - - - This is the transaction fee you may discard if change is smaller than dust at this level - Les frais de transaction que vous pouvez ignorer si la monnaie rendue est inférieure à la poussière à ce niveau - - - This is the transaction fee you may pay when fee estimates are not available. - Il s’agit des frais de transaction que vous pourriez payer si aucune estimation de frais n’est proposée. - - - Total length of network version string (%i) exceeds maximum length (%i). Reduce the number or size of uacomments. - La taille totale de la chaîne de version de réseau (%i) dépasse la longueur maximale (%i). Réduire le nombre ou la taille de uacomments. - - - Unable to replay blocks. You will need to rebuild the database using -reindex-chainstate. - Impossible de relire les blocs. Vous devrez reconstruire la base de données avec -reindex-chainstate. - - - Unknown wallet file format "%s" provided. Please provide one of "bdb" or "sqlite". - Le format de fichier porte-monnaie « %s » indiqué est inconnu. Veuillez soit indiquer « bdb » soit « sqlite ». - - - Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=<category>:<loglevel>. Valid categories: %3$s. Valid loglevels: %4$s. - Niveau de journalisation spécifique à la catégorie non pris en charge %1$s=%2$s. Attendu %1$s=<catégorie>:<niveaudejournal>. Catégories valides : %3$s. Niveaux de journalisation valides : %4$s. - - - Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database. - Le format de la base de données chainstate n'est pas supporté. Veuillez redémarrer avec -reindex-chainstate. Cela reconstruira la base de données chainstate. - - - Wallet created successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. - Portefeuille créé avec succès. Le type de portefeuille ancien est en cours de suppression et la prise en charge de la création et de l'ouverture des portefeuilles anciens sera supprimée à l'avenir. - - - Wallet loaded successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. Legacy wallets can be migrated to a descriptor wallet with migratewallet. - Portefeuille chargé avec succès. Le type de portefeuille existant est obsolète et la prise en charge de la création et de l'ouverture de portefeuilles existants sera supprimée à l'avenir. Les anciens portefeuilles peuvent être migrés vers un portefeuille descripteur avec migratewallet. - - - Warning: Dumpfile wallet format "%s" does not match command line specified format "%s". - Avertissement : Le format du fichier de vidage de porte-monnaie « %s » ne correspond pas au format « %s » indiqué dans la ligne de commande. - - - Warning: Private keys detected in wallet {%s} with disabled private keys - Avertissement : Des clés privées ont été détectées dans le porte-monnaie {%s} avec des clés privées désactivées - - - Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade. - Avertissement : Nous ne semblons pas être en accord complet avec nos pairs. Une mise à niveau pourrait être nécessaire pour vous ou pour d’autres nœuds du réseau. - - - Witness data for blocks after height %d requires validation. Please restart with -reindex. - Les données témoin pour les blocs postérieurs à la hauteur %d exigent une validation. Veuillez redémarrer avec -reindex. - - - You need to rebuild the database using -reindex to go back to unpruned mode. This will redownload the entire blockchain - Vous devez reconstruire la base de données en utilisant -reindex afin de revenir au mode sans élagage. Ceci retéléchargera complètement la chaîne de blocs. - - - %s is set very high! - La valeur %s est très élevée - - - -maxmempool must be at least %d MB - -maxmempool doit être d’au moins %d Mo - - - Cannot obtain a lock on directory %s. %s is probably already running. - Impossible d’obtenir un verrou sur le dossier %s. %s fonctionne probablement déjà. - - - Cannot resolve -%s address: '%s' - Impossible de résoudre l’adresse -%s : « %s » - - - Cannot set -forcednsseed to true when setting -dnsseed to false. - Impossible de définir -forcednsseed comme vrai si -dnsseed est défini comme faux. - - - Cannot set -peerblockfilters without -blockfilterindex. - Impossible de définir -peerblockfilters sans -blockfilterindex - - - %s is set very high! Fees this large could be paid on a single transaction. - %s est très élevé ! Des frais aussi importants pourraient être payés sur une seule transaction. - - - Cannot provide specific connections and have addrman find outgoing connections at the same time. - Il est impossible d’indiquer des connexions précises et en même temps de demander à addrman de trouver les connexions sortantes. - - - Error loading %s: External signer wallet being loaded without external signer support compiled - Erreur de chargement de %s : le porte-monnaie signataire externe est chargé sans que la prise en charge de signataires externes soit compilée - - - Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect. - Erreur de lecture de %s! Toutes les clés ont été lues correctement, mais les données de transaction ou les métadonnées d'adresse peuvent être manquantes ou incorrectes. - - - Error: Address book data in wallet cannot be identified to belong to migrated wallets - Erreur : Les données du carnet d'adresses du portefeuille ne peuvent pas être identifiées comme appartenant à des portefeuilles migrés - - - Error: Duplicate descriptors created during migration. Your wallet may be corrupted. - Erreur : Descripteurs en double créés pendant la migration. Votre portefeuille est peut-être corrompu. - - - Error: Transaction %s in wallet cannot be identified to belong to migrated wallets - Erreur : La transaction %s dans le portefeuille ne peut pas être identifiée comme appartenant aux portefeuilles migrés. - - - Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions. - Échec du calcul des frais de majoration, car les UTXO non confirmés dépendent d'un énorme groupe de transactions non confirmées. - - - Failed to remove snapshot chainstate dir (%s). Manually remove it before restarting. - - Échec de suppression du répertoire de l’instantané d’état de la chaîne (%s). Supprimez-le manuellement avant de redémarrer. - - - Failed to rename invalid peers.dat file. Please move or delete it and try again. - Échec de renommage du fichier peers.dat invalide. Veuillez le déplacer ou le supprimer, puis réessayer. - - - Fee estimation failed. Fallbackfee is disabled. Wait a few blocks or enable %s. - L'estimation des frais a échoué. Fallbackfee est désactivé. Attendez quelques blocs ou activez %s. - - - Flushing block file to disk failed. This is likely the result of an I/O error. - Échec de vidage du fichier des blocs sur le disque, probablement à cause d’une erreur d’E/S. - - - Flushing undo file to disk failed. This is likely the result of an I/O error. - Échec de vidage du fichier d’annulation sur le disque, probablement à cause d’une erreur d’E/S. - - - Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6 - Options incompatibles : -dnsseed=1 a été explicitement spécifié, mais -onlynet interdit les connexions vers IPv4/IPv6 - - - Invalid amount for %s=<amount>: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions) - Montant non valide pour %s=<amount> : '%s' (doit être au moins égal au minrelay fee de %s pour éviter les transactions bloquées) - - - Maximum transaction weight is less than transaction weight without inputs - Le poids maximal de la transaction est inférieur au poids de la transaction sans entrées - - - Maximum transaction weight is too low, can not accommodate change output - Le poids maximal de la transaction est trop faible et ne permet pas les sorties de monnaie - - - Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided - Connexions sortantes limitées à CJDNS (-onlynet=cjdns) mais -cjdnsreachable n'est pas fourni - - - Outbound connections restricted to Tor (-onlynet=onion) but the proxy for reaching the Tor network is explicitly forbidden: -onion=0 - Connexions sortantes limitées à Tor (-onlynet=onion) mais le proxy pour atteindre le réseau Tor est explicitement interdit : -onion=0 - - - Outbound connections restricted to Tor (-onlynet=onion) but the proxy for reaching the Tor network is not provided: none of -proxy, -onion or -listenonion is given - Connexions sortantes limitées à Tor (-onlynet=onion) mais le proxy pour atteindre le réseau Tor n'est pas fourni : aucun des paramètres -proxy, -onion ou -listenonion n'est donné - - - Outbound connections restricted to i2p (-onlynet=i2p) but -i2psam is not provided - Connexions sortantes limitées à i2p (-onlynet=i2p) mais -i2psam n'est pas fourni - - - Rename of '%s' -> '%s' failed. Cannot clean up the background chainstate leveldb directory. - Échec de renommage de « %s » en « %s ». Impossible de nettoyer le répertoire de la base de données d’état de chaîne d’arrière-plan. - - - Specified -blockmaxweight (%d) exceeds consensus maximum block weight (%d) - Le poids maximal de bloc -blockmaxweight indiqué (%d) dépasse le poids maximal de bloc du consensus (%d). - - - Specified -blockreservedweight (%d) exceeds consensus maximum block weight (%d) - Le poids réservé de bloc -blockreservedweight indiqué (%d) dépasse le poids maximal de bloc du consensus (%d). - - - Specified -blockreservedweight (%d) is lower than minimum safety value of (%d) - Le poids réservé de bloc -blockreservedweight indiqué (%d) est inférieur à la valeur minimale de sécurité de (%d) - - - The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs - La combinaison des entrées présélectionnées et de la sélection automatique des entrées du porte-monnaie dépasse le poids maximal de la transaction. Essayez d’envoyer un montant inférieur ou de consolider manuellement les UTXO de votre porte-monnaie. - - - The inputs size exceeds the maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs - La taille des entrées dépasse le poids maximum. Veuillez essayer d'envoyer un montant plus petit ou de consolider manuellement les UTXOs de votre portefeuille - - - The preselected coins total amount does not cover the transaction target. Please allow other inputs to be automatically selected or include more coins manually - Le montant total des pièces présélectionnées ne couvre pas l'objectif de la transaction. Veuillez permettre à d'autres entrées d'être sélectionnées automatiquement ou inclure plus de pièces manuellement - - - Transaction requires one destination of non-0 value, a non-0 feerate, or a pre-selected input - La transaction nécessite une destination d'une valeur non nulle, un ratio de frais non nul, ou une entrée présélectionnée. - - - UTXO snapshot failed to validate. Restart to resume normal initial block download, or try loading a different snapshot. - La validation de la snapshot UTXO a échoué. Redémarrez pour reprendre le téléchargement normal du bloc initial, ou essayez de charger une autre snapshot. - - - Unconfirmed UTXOs are available, but spending them creates a chain of transactions that will be rejected by the mempool - Les UTXO non confirmés sont disponibles, mais les dépenser crée une chaîne de transactions qui sera rejetée par le mempool - - - Unexpected legacy entry in descriptor wallet found. Loading wallet %s - -The wallet might have been tampered with or created with malicious intent. - - Une entrée héritée inattendue dans le portefeuille de descripteurs a été trouvée. Chargement du portefeuille %s - -Le portefeuille peut avoir été altéré ou créé avec des intentions malveillantes. - - - - Unrecognized descriptor found. Loading wallet %s - -The wallet might had been created on a newer version. -Please try running the latest software version. - - Descripteur non reconnu trouvé. Chargement du portefeuille %s - -Le portefeuille a peut-être été créé avec une version plus récente. -Veuillez essayer d'utiliser la dernière version du logiciel. - - - - Your computer's date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you've confirmed your computer's clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you've connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info. - La date et l’heure de votre ordinateur semblent décalées de plus de %d minutes par rapport au réseau, ce qui peut entraîner un échec de consensus. Après avoir confirmé l’heure de votre ordinateur, ce message ne devrait plus s’afficher après redémarrage de votre nœud. Sans redémarrage, il devrait cesser de s’afficher automatiquement si vous vous connectez à suffisamment de nouveaux pairs sortants, ce qui peut prendre du temps. Pour plus de précisions, vous pouvez inspecter le champ `timeoffset` des méthodes RPC `getpeerinfo` et `getnetworkinfo`. - - - -Unable to cleanup failed migration - -Impossible de corriger l'échec de la migration - - - -Unable to restore backup of wallet. - -Impossible de restaurer la sauvegarde du portefeuille. - - - whitebind may only be used for incoming connections ("out" was passed) - « whitebind » ne peut être utilisé que pour les connexions entrantes (« out » a été passé) - - - A fatal internal error occurred, see debug.log for details: - Une erreur interne fatale est survenue. Pour plus de précisions, consultez debug.log : - - - Assumeutxo data not found for the given blockhash '%s'. - Les données Assumeutxo sont introuvables pour l’empreinte de bloc « %s » donnée. - - - Block verification was interrupted - La vérification des blocs a été interrompue - - - Cannot write to directory '%s'; check permissions. - Impossible d’écrire dans le dossier « %s » ; vérifiez les droits. - - - Config setting for %s only applied on %s network when in [%s] section. - Paramètre de configuration pour %s qui n’est appliqué sur le réseau %s que s’il se trouve dans la section [%s]. - - - Copyright (C) %i-%i - Tous droits réservés © %i à %i - - - Corrupt block found indicating potential hardware failure. - Un bloc corrompu a été détecté, ce qui indique une défaillance matérielle possible. - - - Corrupted block database detected - Une base de données des blocs corrompue a été détectée - - - Could not find asmap file %s - Le fichier asmap %s est introuvable - - - Could not parse asmap file %s - Impossible d’analyser le fichier asmap %s - - - Disk space is too low! - L’espace disque est trop faible - - - Done loading - Le chargement est terminé - - - Dump file %s does not exist. - Le fichier de vidage %s n’existe pas. - - - Elliptic curve cryptography sanity check failure. %s is shutting down. - Échec du contrôle d’intégrité de la cryptographie à courbe elliptique. Fermeture de %s. - - - Error creating %s - Erreur de création de %s - - - Error initializing block database - Erreur d’initialisation de la base de données des blocs - - - Error initializing wallet database environment %s! - Erreur d’initialisation de l’environnement de la base de données du porte-monnaie %s  - - - Error loading %s - Erreur de chargement de %s - - - Error loading %s: Private keys can only be disabled during creation - Erreur de chargement de %s : les clés privées ne peuvent être désactivées qu’à la création - - - Error loading %s: Wallet corrupted - Erreur de chargement de %s : le porte-monnaie est corrompu - - - Error loading %s: Wallet requires newer version of %s - Erreur de chargement de %s : le porte-monnaie exige une version plus récente de %s - - - Error loading block database - Erreur de chargement de la base de données des blocs - - - Error loading databases - Erreur de chargement des bases de données - - - Error opening block database - Erreur d’ouverture de la base de données des blocs - - - Error opening coins database - Erreur d’ouverture de la base de données des pièces - - - Error reading configuration file: %s - Erreur de lecture du fichier de configuration : %s - - - Error reading from database, shutting down. - Erreur de lecture de la base de données, fermeture en cours - - - Error reading next record from wallet database - Erreur de lecture de l’enregistrement suivant de la base de données du porte-monnaie - - - Error: Cannot extract destination from the generated scriptpubkey - Erreur : Impossible d'extraire la destination du scriptpubkey généré - - - Error: Couldn't create cursor into database - Erreur : Impossible de créer le curseur dans la base de données - - - Error: Disk space is low for %s - Erreur : Il reste peu d’espace disque sur %s - - - Error: Dumpfile checksum does not match. Computed %s, expected %s - Erreur : La somme de contrôle du fichier de vidage ne correspond pas. Calculée %s, attendue %s - - - Error: Failed to create new watchonly wallet - Erreur : Echec de la création d'un nouveau porte-monnaie Watchonly - - - Error: Got key that was not hex: %s - Erreur : La clé obtenue n’était pas hexadécimale : %s - - - Error: Got value that was not hex: %s - Erreur : La valeur obtenue n’était pas hexadécimale : %s - - - Error: Keypool ran out, please call keypoolrefill first - Erreur : La réserve de clés est épuisée, veuillez d’abord appeler « keypoolrefill » - - - Error: Missing checksum - Erreur : Aucune somme de contrôle n’est indiquée - - - Error: No %s addresses available. - Erreur : Aucune adresse %s n’est disponible. - - - Error: This wallet already uses SQLite - Erreur : Ce portefeuille utilise déjà SQLite - - - Error: This wallet is already a descriptor wallet - Erreur : Ce portefeuille est déjà un portefeuille de descripteurs - - - Error: Unable to begin reading all records in the database - Erreur : Impossible de commencer à lire tous les enregistrements de la base de données - - - Error: Unable to make a backup of your wallet - Erreur : Impossible d'effectuer une sauvegarde de votre portefeuille - - - Error: Unable to parse version %u as a uint32_t - Erreur : Impossible d’analyser la version %u en tant que uint32_t - - - Error: Unable to read all records in the database - Erreur : Impossible de lire tous les enregistrements de la base de données - - - Error: Unable to read wallet's best block locator record - Erreur : Impossible de lire l’enregistrement du meilleur bloc du porte-monnaie. - - - Error: Unable to remove watchonly address book data - Erreur : Impossible de supprimer les données du carnet d'adresses en mode veille - - - Error: Unable to write data to disk for wallet %s - Erreur : Impossible d’écrire les données sur le disque pour le portemonnaie %s - - - Error: Unable to write record to new wallet - Erreur : Impossible d’écrire l’enregistrement dans le nouveau porte-monnaie - - - Error: Unable to write solvable wallet best block locator record - Erreur : Impossible d’écrire l’enregistrement du localisateur du meilleur bloc soluble du porte-monnaie - - - Error: Unable to write watchonly wallet best block locator record - Erreur : Impossible d’écrire l’enregistrement du localisateur du meilleur bloc du porte-monnaie juste-regarder - - - Error: database transaction cannot be executed for wallet %s - Erreur ; La transaction de la base de données ne peut pas être exécutée pour le porte-monnaie %s - - - Failed to connect best block (%s). - Échec de connexion du meilleur bloc (%s). - - - Failed to disconnect block. - Échec de déconnexion du bloc. - - - Failed to listen on any port. Use -listen=0 if you want this. - Échec d'écoute sur tous les ports. Si cela est voulu, utiliser -listen=0. - - - Failed to read block. - Échec de lecture du bloc. - - - Failed to rescan the wallet during initialization - Échec de réanalyse du porte-monnaie lors de l’initialisation - - - Failed to start indexes, shutting down.. - Échec du démarrage des index, arrêt. - - - Failed to verify database - Échec de vérification de la base de données - - - Failed to write block. - Échec d’écriture du bloc. - - - Failed to write to block index database. - Échec d’écriture dans la base de données d’index des blocs. - - - Failed to write to coin database. - Échec d’écriture dans la base de données des pièces. - - - Failed to write undo data. - Échec d’écriture des données d’annulation. - - - Failure removing transaction: %s - Échec de suppression de la transaction :%s - - - Fee rate (%s) is lower than the minimum fee rate setting (%s) - Le taux de frais (%s) est inférieur au taux minimal de frais défini (%s) - - - Ignoring duplicate -wallet %s. - Ignore -wallet %s en double. - - - Importing… - Importation… - - - Incorrect or no genesis block found. Wrong datadir for network? - Bloc de genèse incorrect ou introuvable. Mauvais datadir pour le réseau ? - - - Initialization sanity check failed. %s is shutting down. - Échec d’initialisation du test de cohérence. %s est en cours de fermeture. - - - Input not found or already spent - L’entrée est introuvable ou a déjà été dépensée - - - Insufficient dbcache for block verification - Insuffisance de dbcache pour la vérification des blocs - - - Insufficient funds - Les fonds sont insuffisants - - - Invalid -i2psam address or hostname: '%s' - L’adresse ou le nom d’hôte -i2psam est invalide : « %s » - - - Invalid -onion address or hostname: '%s' - L’adresse ou le nom d’hôte -onion est invalide : « %s » - - - Invalid -proxy address or hostname: '%s' - L’adresse ou le nom d’hôte -proxy est invalide : « %s » - - - Invalid P2P permission: '%s' - L’autorisation P2P est invalide : « %s » - - - Invalid amount for %s=<amount>: '%s' (must be at least %s) - Montant non valide pour %s=<amount> : '%s' (doit être au moins %s) - - - Invalid amount for %s=<amount>: '%s' - Montant non valide pour %s=<amount> : '%s' - - - Invalid amount for -%s=<amount>: '%s' - Le montant est invalide pour -%s=<amount> : « %s » - - - Invalid netmask specified in -whitelist: '%s' - Le masque réseau indiqué dans -whitelist est invalide : « %s » - - - Invalid port specified in %s: '%s' - Port non valide spécifié dans %s: '%s' - - - Invalid pre-selected input %s - Entrée présélectionnée non valide %s - - - Listening for incoming connections failed (listen returned error %s) - L'écoute des connexions entrantes a échoué ( l'écoute a renvoyé une erreur %s) - - - Loading P2P addresses… - Chargement des adresses P2P… - - - Loading banlist… - Chargement de la liste d’interdiction… - - - Loading block index… - Chargement de l’index des blocs… - - - Loading wallet… - Chargement du porte-monnaie… - - - Maximum transaction weight must be between %d and %d - Le poids maximal de la transaction doit être compris entre %d et %d - - - Missing amount - Le montant manque - - - Missing solving data for estimating transaction size - Il manque des données de résolution pour estimer la taille de la transaction - - - Need to specify a port with -whitebind: '%s' - Un port doit être indiqué avec -whitebind : « %s » - - - No addresses available - Aucune adresse n’est disponible - - - Not found pre-selected input %s - Entrée présélectionnée introuvable %s - - - Not solvable pre-selected input %s - Entrée présélectionnée non solvable %s - - - Only direction was set, no permissions: '%s' - Seule la direction a été définie, sans permissions : « %s » - - - Prune cannot be configured with a negative value. - L’élagage ne peut pas être configuré avec une valeur négative - - - Prune mode is incompatible with -txindex. - Le mode élagage n’est pas compatible avec -txindex - - - Pruning blockstore… - Élagage du magasin de blocs… - - - Reducing -maxconnections from %d to %d, because of system limitations. - Réduction de -maxconnections de %d à %d, due aux restrictions du système. - - - Replaying blocks… - Relecture des blocs… - - - Rescanning… - Réanalyse… - - - SQLiteDatabase: Failed to execute statement to verify database: %s - SQLiteDatabase : échec d’exécution de l’instruction pour vérifier la base de données : %s - - - SQLiteDatabase: Failed to prepare statement to verify database: %s - SQLiteDatabase : échec de préparation de l’instruction pour vérifier la base de données : %s - - - SQLiteDatabase: Failed to read database verification error: %s - SQLiteDatabase : échec de lecture de l’erreur de vérification de la base de données : %s - - - SQLiteDatabase: Unexpected application id. Expected %u, got %u - SQLiteDatabase : l’ID de l’application est inattendu. %u attendu, %u retourné - - - Section [%s] is not recognized. - La section [%s] n’est pas reconnue - - - Signer did not echo address - Le signataire n’a pas fait écho à l’adresse - - - Signer echoed unexpected address %s - Le signataire a renvoyé une adresse inattendue %s - - - Signer returned error: %s - Le signataire a renvoyé une erreur : %s - - - Signing transaction failed - Échec de signature de la transaction - - - Specified -walletdir "%s" does not exist - Le -walletdir indiqué « %s » n’existe pas - - - Specified -walletdir "%s" is a relative path - Le -walletdir indiqué « %s » est un chemin relatif - - - Specified -walletdir "%s" is not a directory - Le -walletdir indiqué « %s » n’est pas un répertoire - - - Specified blocks directory "%s" does not exist. - Le répertoire des blocs indiqué « %s » n’existe pas - - - Specified data directory "%s" does not exist. - Le répertoire de données spécifié "%s" n'existe pas. - - - Starting network threads… - Démarrage des processus réseau… - - - System error while flushing: %s - Erreur système lors du vidage : %s - - - System error while loading external block file: %s - Erreur système lors du chargement d’un fichier de blocs externe : %s - - - System error while saving block to disk: %s - Erreur système lors de l’enregistrement du bloc sur le disque : %s - - - The source code is available from %s. - Le code source est publié sur %s. - - - The specified config file %s does not exist - Le fichier de configuration indiqué %s n’existe pas - - - The transaction amount is too small to pay the fee - Le montant de la transaction est trop bas pour que les frais soient payés - - - The transactions removal process can only be executed within a db txn - Le processus de suppression des transactions ne peut être exécuté que dans une transaction .de base de données - - - The wallet will avoid paying less than the minimum relay fee. - Le porte-monnaie évitera de payer moins que les frais minimaux de relais. - - - There is no ScriptPubKeyManager for this address - Il n’y a pas de « ScriptPubKeyManager » pour cette adresse. - - - This is experimental software. - Ce logiciel est expérimental. - - - This is the minimum transaction fee you pay on every transaction. - Il s’agit des frais minimaux que vous payez pour chaque transaction. - - - This is the transaction fee you will pay if you send a transaction. - Il s’agit des frais minimaux que vous payerez si vous envoyez une transaction. - - - Transaction %s does not belong to this wallet - La transaction %s n’appartient pas à ce porte-monnaie - - - Transaction amount too small - Le montant de la transaction est trop bas - - - Transaction amounts must not be negative - Les montants des transactions ne doivent pas être négatifs - - - Transaction change output index out of range - L’index des sorties de monnaie des transactions est hors échelle - - - Transaction must have at least one recipient - La transaction doit comporter au moins un destinataire - - - Transaction needs a change address, but we can't generate it. - Une adresse de monnaie est nécessaire à la transaction, mais nous ne pouvons pas la générer. - - - Transaction too large - La transaction est trop grosse - - - Unable to bind to %s on this computer (bind returned error %s) - Impossible de se lier à %s sur cet ordinateur (la liaison a retourné l’erreur %s) - - - Unable to bind to %s on this computer. %s is probably already running. - Impossible de se lier à %s sur cet ordinateur. %s fonctionne probablement déjà - - - Unable to create the PID file '%s': %s - Impossible de créer le fichier PID « %s » : %s - - - Unable to find UTXO for external input - Impossible de trouver l'UTXO pour l'entrée externe - - - Unable to generate initial keys - Impossible de générer les clés initiales - - - Unable to generate keys - Impossible de générer les clés - - - Unable to open %s for writing - Impossible d’ouvrir %s en écriture - - - Unable to parse -maxuploadtarget: '%s' - Impossible d’analyser -maxuploadtarget : « %s » - - - Unable to start HTTP server. See debug log for details. - Impossible de démarrer le serveur HTTP. Consulter le journal de débogage pour plus de précisions. - - - Unable to unload the wallet before migrating - Impossible de vider le portefeuille avant la migration - - - Unknown -blockfilterindex value %s. - La valeur -blockfilterindex %s est inconnue. - - - Unknown address type '%s' - Le type d’adresse « %s » est inconnu - - - Unknown change type '%s' - Le type de monnaie « %s » est inconnu - - - Unknown network specified in -onlynet: '%s' - Un réseau inconnu est indiqué dans -onlynet : « %s » - - - Unknown new rules activated (versionbit %i) - Les nouvelles règles inconnues sont activées (versionbit %i) - - - Unrecognised option "%s" provided in -test=<option>. - Une option non reconnue « %s » a été indiquée dans -test=<option>. - - - Unsupported global logging level %s=%s. Valid values: %s. - Niveau de journalisation global non pris en charge %s=%s. Valeurs valides : %s. - - - Wallet file creation failed: %s - Échec de création du fichier du porte-monnaie : %s - - - acceptstalefeeestimates is not supported on %s chain. - acceptstalefeeestimates n'est pas pris en charge sur la chaîne %s. - - - Unsupported logging category %s=%s. - La catégorie de journalisation %s=%s n’est pas prise en charge - - - Do you want to rebuild the databases now? - Voulez-vous reconstruire les bases de données maintenant ? - - - Error: Could not add watchonly tx %s to watchonly wallet - Erreur : Impossible d’ajouter la transaction juste-regarder %s au portefeuille juste-regarder - - - Error: Could not delete watchonly transactions. - Erreur : Impossible d’effacer les transactions juste-regarder. - - - Error: Wallet does not exist - Erreur : Le portemonnaie n’existe pas - - - Error: cannot remove legacy wallet records - Erreur : Impossible de supprimer les enregistrements d’anciens portemonnaies - - - Not enough file descriptors available. %d available, %d required. - Trop peu de descripteurs de fichiers sont proposés. %d proposés, %d requis - - - User Agent comment (%s) contains unsafe characters. - Le commentaire de l’agent utilisateur (%s) comporte des caractères dangereux - - - Verifying blocks… - Vérification des blocs… - - - Verifying wallet(s)… - Vérification des porte-monnaie… - - - Wallet needed to be rewritten: restart %s to complete - Le porte-monnaie devait être réécrit : redémarrer %s pour terminer l’opération. - - - Settings file could not be read - Impossible de lire le fichier des paramètres - - - Settings file could not be written - Impossible d’écrire le fichier de paramètres - - - \ No newline at end of file diff --git a/src/qt/locale/bitcoin_fr_LU.ts b/src/qt/locale/bitcoin_fr_LU.ts deleted file mode 100644 index cf77a0360be..00000000000 --- a/src/qt/locale/bitcoin_fr_LU.ts +++ /dev/null @@ -1,5093 +0,0 @@ - - - AddressBookPage - - Right-click to edit address or label - Clic droit pour modifier l'adresse ou l'étiquette - - - Create a new address - Créer une nouvelle adresse - - - &New - &Nouvelle - - - Copy the currently selected address to the system clipboard - Copier l’adresse sélectionnée actuellement dans le presse-papiers - - - &Copy - &Copier - - - C&lose - &Fermer - - - Delete the currently selected address from the list - Supprimer l’adresse sélectionnée actuellement de la liste - - - Enter address or label to search - Saisir une adresse ou une étiquette à rechercher - - - Export the data in the current tab to a file - Exporter les données de l’onglet actuel vers un fichier - - - &Export - &Exporter - - - &Delete - &Supprimer - - - Choose the address to send coins to - Choisir l’adresse à laquelle envoyer des pièces - - - Choose the address to receive coins with - Choisir l’adresse avec laquelle recevoir des pièces - - - C&hoose - C&hoisir - - - These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins. - Ce sont vos adresses Bitcoin pour envoyer des paiements. Vérifiez toujours le montant et l’adresse du destinataire avant d’envoyer des pièces. - - - These are your Bitcoin addresses for receiving payments. Use the 'Create new receiving address' button in the receive tab to create new addresses. -Signing is only possible with addresses of the type 'legacy'. - Il s'agit de vos adresses Bitcoin pour la réception des paiements. Utilisez le bouton "Créer une nouvelle adresse de réception" dans l'onglet "Recevoir" pour créer de nouvelles adresses. -La signature n'est possible qu'avec les adresses de type "patrimoine". - - - &Copy Address - &Copier l’adresse - - - Copy &Label - Copier l’é&tiquette - - - &Edit - &Modifier - - - Export Address List - Exporter la liste d’adresses - - - Comma separated file - Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values. - Fichier séparé par des virgules - - - There was an error trying to save the address list to %1. Please try again. - An error message. %1 is a stand-in argument for the name of the file we attempted to save to. - Une erreur est survenue lors de l'enregistrement de la liste d'adresses vers %1. Veuillez réessayer plus tard. - - - Receiving addresses - %1 - Adresses de réceptions - %1 - - - Exporting Failed - Échec d’exportation - - - - AddressTableModel - - Label - Étiquette - - - Address - Adresse - - - (no label) - (aucune étiquette) - - - - AskPassphraseDialog - - Passphrase Dialog - Fenêtre de dialogue de la phrase de passe - - - Enter passphrase - Saisir la phrase de passe - - - New passphrase - Nouvelle phrase de passe - - - Repeat new passphrase - Répéter la phrase de passe - - - Show passphrase - Afficher la phrase de passe - - - Encrypt wallet - Chiffrer le porte-monnaie - - - This operation needs your wallet passphrase to unlock the wallet. - Cette opération nécessite votre phrase de passe pour déverrouiller le porte-monnaie. - - - Unlock wallet - Déverrouiller le porte-monnaie - - - Change passphrase - Changer la phrase de passe - - - Confirm wallet encryption - Confirmer le chiffrement du porte-monnaie - - - Warning: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! - Avertissement : Si vous chiffrez votre porte-monnaie et perdez votre phrase de passe, vous <b>PERDREZ TOUS VOS BITCOINS</b> ! - - - Are you sure you wish to encrypt your wallet? - Voulez-vous vraiment chiffrer votre porte-monnaie ? - - - Wallet encrypted - Le porte-monnaie est chiffré - - - Enter the new passphrase for the wallet.<br/>Please use a passphrase of <b>ten or more random characters</b>, or <b>eight or more words</b>. - Saisissez la nouvelle phrase de passe du porte-monnaie.<br/>Veuillez utiliser une phrase de passe composée de <b>dix caractères aléatoires ou plus</b>, ou de <b>huit mots ou plus</b>. - - - Enter the old passphrase and new passphrase for the wallet. - Saisir l’ancienne puis la nouvelle phrase de passe du porte-monnaie. - - - Continue - Poursuivre - - - Back - Retour - - - Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer. - N’oubliez pas que le chiffrement de votre porte-monnaie ne peut pas protéger entièrement vos bitcoins contre le vol par des programmes malveillants qui infecteraient votre ordinateur. - - - Wallet to be encrypted - Porte-monnaie à chiffrer - - - Your wallet is about to be encrypted. - Votre porte-monnaie est sur le point d’être chiffré. - - - Your wallet is now encrypted. - Votre porte-monnaie est désormais chiffré. - - - IMPORTANT: Any previous backups you have made of your wallet file should be replaced with the newly generated, encrypted wallet file. For security reasons, previous backups of the unencrypted wallet file will become useless as soon as you start using the new, encrypted wallet. - IMPORTANT : Toutes les sauvegardes précédentes du fichier de votre porte-monnaie devraient être remplacées par le fichier du porte-monnaie chiffré nouvellement généré. Pour des raisons de sécurité, les sauvegardes précédentes de votre fichier de porte-monnaie non chiffré deviendront inutilisables dès que vous commencerez à utiliser le nouveau porte-monnaie chiffré. - - - Wallet encryption failed - Échec de chiffrement du porte-monnaie - - - Wallet encryption failed due to an internal error. Your wallet was not encrypted. - Le chiffrement du porte-monnaie a échoué en raison d’une erreur interne. Votre porte-monnaie n’a pas été chiffré. - - - The supplied passphrases do not match. - Les phrases de passe saisies ne correspondent pas. - - - Wallet unlock failed - Échec de déverrouillage du porte-monnaie - - - The passphrase entered for the wallet decryption was incorrect. - La phrase de passe saisie pour déchiffrer le porte-monnaie était erronée. - - - The passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. If this is successful, please set a new passphrase to avoid this issue in the future. - La phrase secrète saisie pour le décryptage du portefeuille est incorrecte. Elle contient un caractère nul (c'est-à-dire un octet de zéro). Si la phrase secrète a été définie avec une version de ce logiciel antérieure à la version 25.0, veuillez réessayer en ne saisissant que les caractères jusqu'au premier caractère nul (non compris). Si vous y parvenez, définissez une nouvelle phrase secrète afin d'éviter ce problème à l'avenir. - - - Wallet passphrase was successfully changed. - La phrase de passe du porte-monnaie a été modifiée avec succès. - - - Passphrase change failed - Le changement de phrase secrète a échoué - - - The old passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. - L'ancienne phrase secrète introduite pour le décryptage du portefeuille est incorrecte. Elle contient un caractère nul (c'est-à-dire un octet de zéro). Si la phrase secrète a été définie avec une version de ce logiciel antérieure à la version 25.0, veuillez réessayer en ne saisissant que les caractères jusqu'au premier caractère nul (non compris). - - - Warning: The Caps Lock key is on! - Avertissement : La touche Verr. Maj. est activée - - - - BanTableModel - - IP/Netmask - IP/masque réseau - - - Banned Until - Banni jusqu’au - - - - BitcoinApplication - - Settings file %1 might be corrupt or invalid. - Le fichier de paramètres %1 est peut-être corrompu ou non valide. - - - Runaway exception - Exception excessive - - - A fatal error occurred. %1 can no longer continue safely and will quit. - Une erreur fatale est survenue. %1 ne peut plus poursuivre de façon sûre et va s’arrêter. - - - Internal error - Eurrer interne - - - An internal error occurred. %1 will attempt to continue safely. This is an unexpected bug which can be reported as described below. - Une erreur interne est survenue. %1 va tenter de poursuivre avec sécurité. Il s’agit d’un bogue inattendu qui peut être signalé comme décrit ci-dessous. - - - - QObject - - Do you want to reset settings to default values, or to abort without making changes? - Explanatory text shown on startup when the settings file cannot be read. Prompts user to make a choice between resetting or aborting. - Voulez-vous réinitialiser les paramètres à leur valeur par défaut ou abandonner sans aucun changement ? - - - A fatal error occurred. Check that settings file is writable, or try running with -nosettings. - Explanatory text shown on startup when the settings file could not be written. Prompts user to check that we have the ability to write to the file. Explains that the user has the option of running without a settings file. - Une erreur fatale est survenue. Vérifiez que le fichier des paramètres est modifiable ou essayer d’exécuter avec -nosettings. - - - Error: %1 - Erreur : %1 - - - %1 didn't yet exit safely… - %1 ne s’est pas encore fermer en toute sécurité… - - - unknown - inconnue - - - Embedded "%1" - Intégré « %1 » - - - Default system font "%1" - Police système par défaut « %1 » - - - Custom… - Persnnalisé… - - - Amount - Montant - - - Enter a Bitcoin address (e.g. %1) - Saisir une adresse Bitcoin (p. ex. %1) - - - Unroutable - Non routable - - - Inbound - An inbound connection from a peer. An inbound connection is a connection initiated by a peer. - Entrant - - - Outbound - An outbound connection to a peer. An outbound connection is a connection initiated by us. - Sortant - - - Full Relay - Peer connection type that relays all network information. - Relais intégral - - - Block Relay - Peer connection type that relays network information about blocks and not transactions or addresses. - Relais de blocs - - - Manual - Peer connection type established manually through one of several methods. - Manuelle - - - Feeler - Short-lived peer connection type that tests the aliveness of known addresses. - Palpeur - - - Address Fetch - Short-lived peer connection type that solicits known addresses from a peer. - Récupération d’adresses - - - %1 d - %1 j - - - %1 m - %1 min - - - None - Aucun - - - N/A - N.D. - - - %n second(s) - - %n seconde - %n secondes - - - - %n minute(s) - - %n minute - %n minutes - - - - %n hour(s) - - %n heure - %n heures - - - - %n day(s) - - %n jour - %n jours - - - - %n week(s) - - %n semaine - %n semaines - - - - %1 and %2 - %1 et %2 - - - %n year(s) - - %n an - %n ans - - - - %1 B - %1 o - - - %1 kB - %1 ko - - - %1 MB - %1 Mo - - - %1 GB - %1 Go - - - default wallet - porte-monnaie par défaut - - - - BitcoinGUI - - &Overview - &Vue d’ensemble - - - Show general overview of wallet - Afficher une vue d’ensemble du porte-monnaie - - - Browse transaction history - Parcourir l’historique transactionnel - - - E&xit - Q&uitter - - - Quit application - Fermer l’application - - - &About %1 - À &propos de %1 - - - Show information about %1 - Afficher des renseignements à propos de %1 - - - About &Qt - À propos de &Qt - - - Show information about Qt - Afficher des renseignements sur Qt - - - Modify configuration options for %1 - Modifier les options de configuration de %1 - - - Create a new wallet - Créer un nouveau porte-monnaie - - - &Minimize - &Réduire - - - Wallet: - Porte-monnaie : - - - Network activity disabled. - A substring of the tooltip. - L’activité réseau est désactivée. - - - Proxy is <b>enabled</b>: %1 - Le serveur mandataire est <b>activé</b> : %1 - - - Send coins to a Bitcoin address - Envoyer des pièces à une adresse Bitcoin - - - Backup wallet to another location - Sauvegarder le porte-monnaie vers un autre emplacement - - - Change the passphrase used for wallet encryption - Modifier la phrase de passe utilisée pour le chiffrement du porte-monnaie - - - &Send - &Envoyer - - - &Receive - &Recevoir - - - &Options… - &Choix - - - &Encrypt Wallet… - &Chiffrer le porte-monnaie… - - - Encrypt the private keys that belong to your wallet - Chiffrer les clés privées qui appartiennent à votre porte-monnaie - - - &Backup Wallet… - &auvegarder le porte-monnaie… - - - &Change Passphrase… - &Changer la phrase de passe… - - - Sign &message… - Signer un &message… - - - Sign messages with your Bitcoin addresses to prove you own them - Signer les messages avec vos adresses Bitcoin pour prouver que vous les détenez - - - &Verify message… - &Vérifier un message… - - - Verify messages to ensure they were signed with specified Bitcoin addresses - Vérifier les messages pour s’assurer qu’ils ont été signés avec les adresses Bitcoin indiquées - - - &Load PSBT from file… - &Charger une TBSP d’un fichier… - - - Open &URI… - Ouvrir une &URI… - - - Close Wallet… - Fermer le porte-monnaie… - - - Create Wallet… - Créer un porte-monnaie… - - - Close All Wallets… - Fermer tous les porte-monnaie… - - - &File - &Fichier - - - &Settings - &Paramètres - - - &Help - &Aide - - - Tabs toolbar - Barre d’outils des onglets - - - Syncing Headers (%1%)… - Synchronisation des en-têtes (%1)… - - - Synchronizing with network… - Synchronisation avec le réseau… - - - Indexing blocks on disk… - Indexation des blocs sur le disque… - - - Processing blocks on disk… - Traitement des blocs sur le disque… - - - Connecting to peers… - Connexion aux pairs… - - - Request payments (generates QR codes and bitcoin: URIs) - Demander des paiements (génère des codes QR et des URI bitcoin:) - - - Show the list of used sending addresses and labels - Afficher la liste d’adresses et d’étiquettes d’envoi utilisées - - - Show the list of used receiving addresses and labels - Afficher la liste d’adresses et d’étiquettes de réception utilisées - - - &Command-line options - Options de ligne de &commande - - - Processed %n block(s) of transaction history. - - %n bloc d’historique transactionnel a été traité. - %n blocs d’historique transactionnel ont été traités. - - - - %1 behind - en retard de %1 - - - Catching up… - Rattrapage… - - - Last received block was generated %1 ago. - Le dernier bloc reçu avait été généré il y a %1. - - - Transactions after this will not yet be visible. - Les transactions suivantes ne seront pas déjà visibles. - - - Error - Erreur - - - Warning - Avertissement - - - Information - Renseignements - - - Up to date - À jour - - - Load Partially Signed Bitcoin Transaction - Charger une transaction Bitcoin signée partiellement - - - Load PSBT from &clipboard… - Charger la TBSP du &presse-papiers… - - - Load Partially Signed Bitcoin Transaction from clipboard - Charger du presse-papiers une transaction Bitcoin signée partiellement - - - Node window - Fenêtre des nœuds - - - Open node debugging and diagnostic console - Ouvrir une console de débogage de nœuds et de diagnostic - - - &Sending addresses - &Adresses d’envoi - - - &Receiving addresses - &Adresses de réception - - - Open a bitcoin: URI - Ouvrir une URI bitcoin: - - - Open Wallet - Ouvrir le porte-monnaie - - - Open a wallet - Ouvrir un porte-monnaie - - - Close wallet - Fermer le porte-monnaie - - - Restore Wallet… - Name of the menu item that restores wallet from a backup file. - Restaurer le Portefeuille... - - - Restore a wallet from a backup file - Status tip for Restore Wallet menu item - Restaurer le Portefeuille depuis un fichier de sauvegarde - - - Close all wallets - Fermer tous les porte-monnaie - - - Migrate Wallet - Migrer le portefeuille - - - Migrate a wallet - Migrer un portefeuilles - - - Show the %1 help message to get a list with possible Bitcoin command-line options - Afficher le message d’aide de %1 pour obtenir la liste des options possibles en ligne de commande Bitcoin - - - &Mask values - &Masquer les montants - - - Mask the values in the Overview tab - Masquer les montants dans l’onglet Vue d’ensemble - - - No wallets available - Aucun porte-monnaie n’est disponible - - - Wallet Data - Name of the wallet data file format. - Données du porte-monnaie - - - Load Wallet Backup - The title for Restore Wallet File Windows - Lancer un Portefeuille de sauvegarde - - - Restore Wallet - Title of pop-up window shown when the user is attempting to restore a wallet. - Restaurer le portefeuille - - - Wallet Name - Label of the input field where the name of the wallet is entered. - Nom du porte-monnaie - - - &Window - &Fenêtre - - - Zoom - Zoomer - - - Main Window - Fenêtre principale - - - %1 client - Client %1 - - - &Hide - &Cacher - - - S&how - A&fficher - - - %n active connection(s) to Bitcoin network. - A substring of the tooltip. - - %n connexion active avec le réseau Bitcoin. - %n connexions actives avec le réseau Bitcoin. - - - - Click for more actions. - A substring of the tooltip. "More actions" are available via the context menu. - Cliquez pour afficher plus d’actions. - - - Show Peers tab - A context menu item. The "Peers tab" is an element of the "Node window". - Afficher l’onglet Pairs - - - Disable network activity - A context menu item. - Désactiver l’activité réseau - - - Enable network activity - A context menu item. The network activity was disabled previously. - Activer l’activité réseau - - - Pre-syncing Headers (%1%)… - En-têtes de pré-synchronisation (%1%)... - - - Error creating wallet - Erreur lors de la création du portefeuille - - - Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets) - Impossible de créer un nouveau portefeuilles, le logiciel a été compilé sans support pour sqlite (nécessaire pour le portefeuille décris) - - - Error: %1 - Erreur : %1 - - - Warning: %1 - Avertissement : %1 - - - Date: %1 - - Date : %1 - - - - Amount: %1 - - Montant : %1 - - - - Wallet: %1 - - Porte-monnaie : %1 - - - - Type: %1 - - Type  : %1 - - - - Label: %1 - - Étiquette : %1 - - - - Address: %1 - - Adresse : %1 - - - - Sent transaction - Transaction envoyée - - - Incoming transaction - Transaction entrante - - - HD key generation is <b>enabled</b> - La génération de clé HD est <b>activée</b> - - - HD key generation is <b>disabled</b> - La génération de clé HD est <b>désactivée</b> - - - Private key <b>disabled</b> - La clé privée est <b>désactivée</b> - - - Wallet is <b>encrypted</b> and currently <b>unlocked</b> - Le porte-monnaie est <b>chiffré</b> et est actuellement <b>déverrouillé</b> - - - Wallet is <b>encrypted</b> and currently <b>locked</b> - Le porte-monnaie est <b>chiffré</b> et actuellement <b>verrouillé</b> - - - Original message: - Message original : - - - - UnitDisplayStatusBarControl - - Unit to show amounts in. Click to select another unit. - Unité d’affichage des montants. Cliquez pour sélectionner une autre unité. - - - - CoinControlDialog - - Coin Selection - Sélection des pièces - - - Quantity: - Quantité : - - - Bytes: - Octets : - - - Amount: - Montant : - - - Fee: - Frais : - - - After Fee: - Après les frais : - - - Change: - Monnaie : - - - (un)select all - Tout (des)sélectionner - - - Tree mode - Mode arborescence - - - List mode - Mode liste - - - Amount - Montant - - - Received with label - Reçu avec une étiquette - - - Received with address - Reçu avec une adresse - - - Confirmed - Confirmée - - - Copy amount - Copier le montant - - - &Copy address - &Copier l’adresse - - - Copy &label - Copier l’&étiquette - - - Copy &amount - Copier le &montant - - - Copy transaction &ID and output index - Copier l’ID de la transaction et l’index des sorties - - - L&ock unspent - &Verrouillé ce qui n’est pas dépensé - - - &Unlock unspent - &Déverrouiller ce qui n’est pas dépensé - - - Copy quantity - Copier la quantité - - - Copy fee - Copier les frais - - - Copy after fee - Copier après les frais - - - Copy bytes - Copier les octets - - - Copy change - Copier la monnaie - - - (%1 locked) - (%1 verrouillée) - - - Can vary +/- %1 satoshi(s) per input. - Peut varier +/- %1 satoshi(s) par entrée. - - - (no label) - (aucune étiquette) - - - change from %1 (%2) - monnaie de %1 (%2) - - - (change) - (monnaie) - - - - CreateWalletActivity - - Create Wallet - Title of window indicating the progress of creation of a new wallet. - Créer un porte-monnaie - - - Creating Wallet <b>%1</b>… - Descriptive text of the create wallet progress window which indicates to the user which wallet is currently being created. - Création du porte-monnaie <b>%1</b>… - - - Create wallet failed - Échec de création du porte-monnaie - - - Create wallet warning - Avertissement de création du porte-monnaie - - - Can't list signers - Impossible de lister les signataires - - - Too many external signers found - Trop de signataires externes trouvés - - - - LoadWalletsActivity - - Load Wallets - Title of progress window which is displayed when wallets are being loaded. - Charger les porte-monnaie - - - Loading wallets… - Descriptive text of the load wallets progress window which indicates to the user that wallets are currently being loaded. - Chargement des porte-monnaie… - - - - MigrateWalletActivity - - Migrate wallet - Migrer le portefeuille - - - Are you sure you wish to migrate the wallet <i>%1</i>? - Êtes-vous sûr de vouloir migrer le portefeuille <i>%1</i> - - - Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made. -If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts. -If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts. - -The migration process will create a backup of the wallet before migrating. This backup file will be named <wallet name>-<timestamp>.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality. - La migration du porte-monnaie convertira ce porte-monnaie en un ou plusieurs porte-monnaie de descripteurs. Une nouvelle sauvegarde du porte-monnaie devra être effectuée. -Si ce porte-monnaie contient des scripts en lecture seule, un nouveau porte-monnaie sera créé contenant ces scripts en lecture seule. -Si ce porte-monnaie contient des scripts solvables mais non surveillés, un autre nouveau porte-monnaie sera créé contenant ces scripts. - -Le processus de migration créera une sauvegarde du porte-monnaie avant la migration. Ce fichier de sauvegarde sera nommé <nom du porte-monnaie>-<horodatage>.legacy.bak et pourra être trouvé dans le répertoire de ce porte-monnaie. En cas de migration incorrecte, la sauvegarde peut être restaurée avec la fonctionnalité "Restaurer le porte-monnaie". - - - Migrate Wallet - Migrer le portefeuille - - - Migrating Wallet <b>%1</b>… - Migration du portefeuille <b>%1</b>… - - - The wallet '%1' was migrated successfully. - Le porte-monnaie '%1' a été migré avec succès. - - - Watchonly scripts have been migrated to a new wallet named '%1'. - Les scripts juste-regarder ont été migrés vers un nouveau porte-monnaie nommé « %1 ». - - - Solvable but not watched scripts have been migrated to a new wallet named '%1'. - Les scripts solubles, mais non surveillés ont été migrés vers un nouveau porte-monnaie nommé « %1 ». - - - Migration failed - La migration a échoué - - - Migration Successful - Migration réussie - - - - OpenWalletActivity - - Open wallet failed - Échec d’ouverture du porte-monnaie - - - Open wallet warning - Avertissement d’ouverture du porte-monnaie - - - Open Wallet - Title of window indicating the progress of opening of a wallet. - Ouvrir un porte-monnaie - - - Opening Wallet <b>%1</b>… - Descriptive text of the open wallet progress window which indicates to the user which wallet is currently being opened. - Ouverture du porte-monnaie <b>%1</b>… - - - - RestoreWalletActivity - - Restore Wallet - Title of progress window which is displayed when wallets are being restored. - Restaurer le portefeuille - - - Restoring Wallet <b>%1</b>… - Descriptive text of the restore wallets progress window which indicates to the user that wallets are currently being restored. - Restauration du Portefeuille<b>%1</b>... - - - Restore wallet failed - Title of message box which is displayed when the wallet could not be restored. - Échec de la restauration du portefeuille - - - Restore wallet warning - Title of message box which is displayed when the wallet is restored with some warning. - Avertissement de la récupération du Portefeuille - - - Restore wallet message - Title of message box which is displayed when the wallet is successfully restored. - Message du Portefeuille restauré - - - - WalletController - - Close wallet - Fermer le porte-monnaie - - - Are you sure you wish to close the wallet <i>%1</i>? - Voulez-vous vraiment fermer le porte-monnaie <i>%1</i> ? - - - Closing the wallet for too long can result in having to resync the entire chain if pruning is enabled. - Fermer le porte-monnaie trop longtemps peut impliquer de devoir resynchroniser la chaîne entière si l’élagage est activé. - - - Close all wallets - Fermer tous les porte-monnaie - - - Are you sure you wish to close all wallets? - Voulez-vous vraiment fermer tous les porte-monnaie ? - - - - CreateWalletDialog - - Create Wallet - Créer un porte-monnaie - - - You are one step away from creating your new wallet! - Vous n'êtes qu'à un pas de la création de votre nouveau portefeuille ! - - - Please provide a name and, if desired, enable any advanced options - Veuillez fournir un nom et, si désiré, activer toutes les options avancées. - - - Wallet Name - Nom du porte-monnaie - - - Wallet - Porte-monnaie - - - Encrypt the wallet. The wallet will be encrypted with a passphrase of your choice. - Chiffrer le porte-monnaie. Le porte-monnaie sera chiffré avec une phrase de passe de votre choix. - - - Encrypt Wallet - Chiffrer le porte-monnaie - - - Advanced Options - Options avancées - - - Disable private keys for this wallet. Wallets with private keys disabled will have no private keys and cannot have an HD seed or imported private keys. This is ideal for watch-only wallets. - Désactiver les clés privées pour ce porte-monnaie. Les porte-monnaie pour lesquels les clés privées sont désactivées n’auront aucune clé privée et ne pourront ni avoir de graine HD ni de clés privées importées. Cela est idéal pour les porte-monnaie juste-regarder. - - - Disable Private Keys - Désactiver les clés privées - - - Make a blank wallet. Blank wallets do not initially have private keys or scripts. Private keys and addresses can be imported, or an HD seed can be set, at a later time. - Créer un porte-monnaie vide. Les porte-monnaie vides n’ont initialement ni clé privée ni script. Ultérieurement, des clés privées et des adresses peuvent être importées ou une graine HD peut être définie. - - - Make Blank Wallet - Créer un porte-monnaie vide - - - Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first. - Utiliser un appareil externe de signature tel qu’un porte-monnaie matériel. Configurer d’abord le script signataire externe dans les préférences du porte-monnaie. - - - External signer - Signataire externe - - - Create - Créer - - - Compiled without external signing support (required for external signing) - "External signing" means using devices such as hardware wallets. - Compilé sans prise en charge des signatures externes (requis pour la signature externe) - - - - EditAddressDialog - - Edit Address - Modifier l’adresse - - - &Label - É&tiquette - - - The label associated with this address list entry - L’étiquette associée à cette entrée de la liste d’adresses - - - The address associated with this address list entry. This can only be modified for sending addresses. - L’adresse associée à cette entrée de la liste d’adresses. Ne peut être modifié que pour les adresses d’envoi. - - - &Address - &Adresse - - - New sending address - Nouvelle adresse d’envoi - - - Edit receiving address - Modifier l’adresse de réception - - - Edit sending address - Modifier l’adresse d’envoi - - - The entered address "%1" is not a valid Bitcoin address. - L’adresse saisie « %1 » n’est pas une adresse Bitcoin valide. - - - Address "%1" already exists as a receiving address with label "%2" and so cannot be added as a sending address. - L’adresse « %1 » existe déjà en tant qu’adresse de réception avec l’étiquette « %2 » et ne peut donc pas être ajoutée en tant qu’adresse d’envoi. - - - The entered address "%1" is already in the address book with label "%2". - L’adresse saisie « %1 » est déjà présente dans le carnet d’adresses avec l’étiquette « %2 ». - - - Could not unlock wallet. - Impossible de déverrouiller le porte-monnaie. - - - New key generation failed. - Échec de génération de la nouvelle clé. - - - - FreespaceChecker - - A new data directory will be created. - Un nouveau répertoire de données sera créé. - - - name - nom - - - Directory already exists. Add %1 if you intend to create a new directory here. - Le répertoire existe déjà. Ajouter %1 si vous comptez créer un nouveau répertoire ici. - - - Path already exists, and is not a directory. - Le chemin existe déjà et n’est pas un répertoire. - - - Cannot create data directory here. - Impossible de créer un répertoire de données ici. - - - - Intro - - %n GB of space available - - %n Go d’espace libre - %n Go d’espace libre - - - - (of %n GB needed) - - (of %n GB needed) - (of %n GB needed) - - - - (%n GB needed for full chain) - - (%n GB needed for full chain) - (%n GB needed for full chain) - - - - Choose data directory - Choisissez un répertoire de donnée - - - At least %1 GB of data will be stored in this directory, and it will grow over time. - Au moins %1 Go de données seront stockés dans ce répertoire et sa taille augmentera avec le temps. - - - Approximately %1 GB of data will be stored in this directory. - Approximativement %1 Go de données seront stockés dans ce répertoire. - - - (sufficient to restore backups %n day(s) old) - Explanatory text on the capability of the current prune target. - - (suffisant pour restaurer les sauvegardes âgées de %n jour) - (suffisant pour restaurer les sauvegardes âgées de %n jours) - - - - %1 will download and store a copy of the Bitcoin block chain. - %1 téléchargera et stockera une copie de la chaîne de blocs Bitcoin. - - - The wallet will also be stored in this directory. - Le porte-monnaie sera aussi stocké dans ce répertoire. - - - Error: Specified data directory "%1" cannot be created. - Erreur : Le répertoire de données indiqué « %1 » ne peut pas être créé. - - - Error - Erreur - - - Welcome - Bienvenue - - - Welcome to %1. - Bienvenue à %1. - - - As this is the first time the program is launched, you can choose where %1 will store its data. - Comme le logiciel est lancé pour la première fois, vous pouvez choisir où %1 stockera ses données. - - - Limit block chain storage to - Limiter l’espace de stockage de chaîne de blocs à - - - Reverting this setting requires re-downloading the entire blockchain. It is faster to download the full chain first and prune it later. Disables some advanced features. - Rétablir ce paramètre à sa valeur antérieure exige de retélécharger la chaîne de blocs dans son intégralité. Il est plus rapide de télécharger la chaîne complète dans un premier temps et de l’élaguer ultérieurement. Désactive certaines fonctions avancées. - - - GB -  Go - - - This initial synchronisation is very demanding, and may expose hardware problems with your computer that had previously gone unnoticed. Each time you run %1, it will continue downloading where it left off. - Cette synchronisation initiale est très exigeante et pourrait exposer des problèmes matériels dans votre ordinateur passés inaperçus auparavant. Chaque fois que vous exécuterez %1, le téléchargement reprendra où il s’était arrêté. - - - When you click OK, %1 will begin to download and process the full %4 block chain (%2 GB) starting with the earliest transactions in %3 when %4 initially launched. - Quand vous cliquerez sur Valider, %1 commencera à télécharger et à traiter l’intégralité de la chaîne de blocs %4 (%2 Go) en débutant avec les transactions les plus anciennes de %3, quand %4 a été lancé initialement. - - - If you have chosen to limit block chain storage (pruning), the historical data must still be downloaded and processed, but will be deleted afterward to keep your disk usage low. - Si vous avez choisi de limiter le stockage de la chaîne de blocs (élagage), les données historiques doivent quand même être téléchargées et traitées, mais seront supprimées par la suite pour minimiser l’utilisation de votre espace disque. - - - Use the default data directory - Utiliser le répertoire de données par défaut - - - Use a custom data directory: - Utiliser un répertoire de données personnalisé : - - - - HelpMessageDialog - - About %1 - À propos de %1 - - - Command-line options - Options de ligne de commande - - - - ShutdownWindow - - %1 is shutting down… - %1 est en cours de fermeture… - - - Do not shut down the computer until this window disappears. - Ne pas éteindre l’ordinateur jusqu’à la disparition de cette fenêtre. - - - - ModalOverlay - - Form - Formulaire - - - Recent transactions may not yet be visible, and therefore your wallet's balance might be incorrect. This information will be correct once your wallet has finished synchronizing with the bitcoin network, as detailed below. - Les transactions récentes ne sont peut-être pas encore visibles et par conséquent le solde de votre porte-monnaie est peut-être erroné. Ces renseignements seront justes quand votre porte-monnaie aura fini de se synchroniser avec le réseau Bitcoin, comme décrit ci-dessous. - - - Attempting to spend bitcoins that are affected by not-yet-displayed transactions will not be accepted by the network. - Toute tentative de dépense de bitcoins affectés par des transactions qui ne sont pas encore affichées ne sera pas acceptée par le réseau. - - - Number of blocks left - Nombre de blocs restants - - - Unknown… - Inconnu… - - - calculating… - calcul en cours… - - - Last block time - Estampille temporelle du dernier bloc - - - Progress - Progression - - - Progress increase per hour - Avancement de la progression par heure - - - Estimated time left until synced - Temps estimé avant la fin de la synchronisation - - - Hide - Cacher - - - Esc - Échap - - - %1 is currently syncing. It will download headers and blocks from peers and validate them until reaching the tip of the block chain. - %1 est en cours de synchronisation. Il téléchargera les en-têtes et les blocs des pairs, et les validera jusqu’à ce qu’il atteigne la fin de la chaîne de blocs. - - - Unknown. Syncing Headers (%1, %2%)… - Inconnu. Synchronisation des en-têtes (%1, %2 %)… - - - Unknown. Pre-syncing Headers (%1, %2%)… - Inconnu. En-têtes de présynchronisation (%1, %2%)... - - - - OpenURIDialog - - Open bitcoin URI - Ouvrir une URI bitcoin - - - URI: - URI : - - - Paste address from clipboard - Tooltip text for button that allows you to paste an address that is in your clipboard. - Collez l’adresse du presse-papiers - - - - OptionsDialog - - &Main - &Principales - - - Automatically start %1 after logging in to the system. - Démarrer %1 automatiquement après avoir ouvert une session sur l’ordinateur. - - - &Start %1 on system login - &Démarrer %1 lors de l’ouverture d’une session - - - Enabling pruning significantly reduces the disk space required to store transactions. All blocks are still fully validated. Reverting this setting requires re-downloading the entire blockchain. - L’activation de l’élagage réduit considérablement l’espace disque requis pour stocker les transactions. Tous les blocs sont encore entièrement validés. L’annulation de ce paramètre exige de retélécharger la chaîne de blocs dans son intégralité. - - - Maximum database cache size. Make sure you have enough RAM. A larger cache can contribute to faster sync, after which the benefit is less pronounced for most use cases. Lowering the cache size will reduce memory usage. Unused mempool memory is shared for this cache. - Tooltip text for Options window setting that sets the size of the database cache. Explains the corresponding effects of increasing/decreasing this value. - Taille maximale du cache de la base de données. Assurez-vous d’avoir suffisamment de mémoire vive. Un cache plus grand peut accélérer la synchronisation, avec des avantages moindres par la suite dans la plupart des cas. Diminuer la taille du cache réduira l’utilisation de la mémoire. La mémoire non utilisée de la réserve de mémoire est partagée avec ce cache. - - - Size of &database cache - Taille du cache de la base de &données - - - Number of script &verification threads - Nombre de fils de &vérification de script - - - Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins! - Chemin complet vers un %1 script compatible (par exemple, C:\Downloads\hwi.exe ou /Users/you/Downloads/hwi.py). Attention : les malwares peuvent voler vos pièces ! - - - Automatically open the Bitcoin client port on the router. This only works when your router supports PCP or NAT-PMP and it is enabled. The external port could be random. - Ouvrir automatiquement le port du client Bitcoin sur le routeur. Cela ne fonctionne que si votre routeur prend en charge PCP ou NAT-PMP. Le port externe peut être aléatoire. - - - Map port using PCP or NA&T-PMP - Mapper le port avec PCP ou NA&T-PMP - - - IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1) - Adresse IP du mandataire (p. ex. IPv4 : 127.0.0.1 / IPv6 : ::1) - - - Shows if the supplied default SOCKS5 proxy is used to reach peers via this network type. - Indique si le mandataire SOCKS5 par défaut fourni est utilisé pour atteindre des pairs par ce type de réseau. - - - Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Exit in the menu. - Quand la fenêtre est fermée, la réduire au lieu de quitter l’application. Si cette option est activée, l’application ne sera fermée qu’en sélectionnant Quitter dans le menu. - - - Font in the Overview tab: - Police de l’onglet Vue d’ensemble : - - - Options set in this dialog are overridden by the command line: - Les options définies dans cette boîte de dialogue sont remplacées par la ligne de commande : - - - Open the %1 configuration file from the working directory. - Ouvrir le fichier de configuration %1 du répertoire de travail. - - - Open Configuration File - Ouvrir le fichier de configuration - - - Reset all client options to default. - Réinitialiser toutes les options du client aux valeurs par défaut. - - - &Reset Options - &Réinitialiser les options - - - &Network - &Réseau - - - Prune &block storage to - Élaguer l’espace de stockage des &blocs jusqu’à - - - GB - Go - - - Reverting this setting requires re-downloading the entire blockchain. - L’annulation de ce paramètre exige de retélécharger la chaîne de blocs dans son intégralité. - - - MiB - Mio - - - Set the number of script verification threads. Negative values correspond to the number of cores you want to leave free to the system. - Tooltip text for Options window setting that sets the number of script verification threads. Explains that negative values mean to leave these many cores free to the system. - Définissez le nombre de fils de vérification de script. Les valeurs négatives correspondent au nombre de cœurs que vous voulez laisser disponibles pour le système. - - - (0 = auto, <0 = leave that many cores free) - (0 = auto, < 0 = laisser ce nombre de cœurs inutilisés) - - - This allows you or a third party tool to communicate with the node through command-line and JSON-RPC commands. - Tooltip text for Options window setting that enables the RPC server. - Ceci vous permet ou permet à un outil tiers de communiquer avec le nœud grâce à la ligne de commande ou des commandes JSON-RPC. - - - Enable R&PC server - An Options window setting to enable the RPC server. - Activer le serveur R&PC - - - W&allet - &Porte-monnaie - - - Whether to set subtract fee from amount as default or not. - Tooltip text for Options window setting that sets subtracting the fee from a sending amount as default. - Définissez s’il faut soustraire par défaut les frais du montant ou non. - - - Subtract &fee from amount by default - An Options window setting to set subtracting the fee from a sending amount as default. - Soustraire par défaut les &frais du montant - - - Enable coin &control features - Activer les fonctions de &contrôle des pièces - - - If you disable the spending of unconfirmed change, the change from a transaction cannot be used until that transaction has at least one confirmation. This also affects how your balance is computed. - Si vous désactivé la dépense de la monnaie non confirmée, la monnaie d’une transaction ne peut pas être utilisée tant que cette transaction n’a pas reçu au moins une confirmation. Celai affecte aussi le calcul de votre solde. - - - &Spend unconfirmed change - &Dépenser la monnaie non confirmée - - - Enable &PSBT controls - An options window setting to enable PSBT controls. - Activer les contrôles &TBPS - - - Whether to show PSBT controls. - Tooltip text for options window setting that enables PSBT controls. - Affichez ou non les contrôles TBPS. - - - External Signer (e.g. hardware wallet) - Signataire externe (p. ex. porte-monnaie matériel) - - - &External signer script path - &Chemin du script signataire externe - - - Accept connections from outside. - Accepter les connexions provenant de l’extérieur. - - - Allow incomin&g connections - Permettre les connexions e&ntrantes - - - Connect to the Bitcoin network through a SOCKS5 proxy. - Se connecter au réseau Bitcoin par un mandataire SOCKS5. - - - &Connect through SOCKS5 proxy (default proxy): - Se &connecter par un mandataire SOCKS5 (mandataire par défaut) : - - - Proxy &IP: - &IP du mandataire : - - - &Port: - &Port : - - - Port of the proxy (e.g. 9050) - Port du mandataire (p. ex. 9050) - - - Used for reaching peers via: - Utilisé pour rejoindre les pairs par : - - - &Window - &Fenêtre - - - Show the icon in the system tray. - Afficher l’icône dans la zone de notification. - - - &Show tray icon - &Afficher l’icône dans la zone de notification - - - Show only a tray icon after minimizing the window. - Après réduction, n’afficher qu’une icône dans la zone de notification. - - - &Minimize to the tray instead of the taskbar - &Réduire dans la zone de notification au lieu de la barre des tâches - - - M&inimize on close - Ré&duire lors de la fermeture - - - &Display - &Affichage - - - User Interface &language: - &Langue de l’interface utilisateur : - - - The user interface language can be set here. This setting will take effect after restarting %1. - La langue de l’interface utilisateur peut être définie ici. Ce réglage sera pris en compte après redémarrage de %1. - - - &Unit to show amounts in: - &Unité d’affichage des montants : - - - Choose the default subdivision unit to show in the interface and when sending coins. - Choisir la sous-unité par défaut d’affichage dans l’interface et lors d’envoi de pièces. - - - Third-party URLs (e.g. a block explorer) that appear in the transactions tab as context menu items. %s in the URL is replaced by transaction hash. Multiple URLs are separated by vertical bar |. - Les URL de tiers (p. ex. un explorateur de blocs) qui apparaissent dans l’onglet des transactions comme éléments du menu contextuel. Dans l’URL, %s est remplacé par le hachage de la transaction. Les URL multiples sont séparées par une barre verticale |. - - - &Third-party transaction URLs - URL de transaction de $tiers - - - Whether to show coin control features or not. - Afficher ou non les fonctions de contrôle des pièces. - - - Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor onion services. - Se connecter au réseau Bitcoin par un mandataire SOCKS5 séparé pour les services oignon de Tor. - - - Use separate SOCKS&5 proxy to reach peers via Tor onion services: - Utiliser un mandataire SOCKS&5 séparé pour atteindre les pairs par les services oignon de Tor : - - - &OK - &Valider - - - &Cancel - A&nnuler - - - Compiled without external signing support (required for external signing) - "External signing" means using devices such as hardware wallets. - Compilé sans prise en charge des signatures externes (requis pour la signature externe) - - - default - par défaut - - - none - aucune - - - Confirm options reset - Window title text of pop-up window shown when the user has chosen to reset options. - Confirmer la réinitialisation des options - - - Client restart required to activate changes. - Text explaining that the settings changed will not come into effect until the client is restarted. - Le redémarrage du client est exigé pour activer les changements. - - - Current settings will be backed up at "%1". - Text explaining to the user that the client's current settings will be backed up at a specific location. %1 is a stand-in argument for the backup location's path. - Les paramètres actuels vont être restaurés à "%1". - - - Client will be shut down. Do you want to proceed? - Text asking the user to confirm if they would like to proceed with a client shutdown. - Le client sera arrêté. Voulez-vous continuer ? - - - Configuration options - Window title text of pop-up box that allows opening up of configuration file. - Options de configuration - - - The configuration file is used to specify advanced user options which override GUI settings. Additionally, any command-line options will override this configuration file. - Explanatory text about the priority order of instructions considered by client. The order from high to low being: command-line, configuration file, GUI settings. - Le fichier de configuration est utilisé pour indiquer aux utilisateurs experts quelles options remplacent les paramètres de l’IUG. De plus, toute option de ligne de commande remplacera ce fichier de configuration. - - - Continue - Poursuivre - - - Cancel - Annuler - - - Error - Erreur - - - The configuration file could not be opened. - Impossible d’ouvrir le fichier de configuration. - - - This change would require a client restart. - Ce changement demanderait un redémarrage du client. - - - The supplied proxy address is invalid. - L’adresse de serveur mandataire fournie est invalide. - - - - OptionsModel - - Could not read setting "%1", %2. - Impossible de lire le paramètre "%1", %2. - - - - OverviewPage - - Form - Formulaire - - - The displayed information may be out of date. Your wallet automatically synchronizes with the Bitcoin network after a connection is established, but this process has not completed yet. - Les renseignements affichés peuvent être obsolètes. Votre porte-monnaie se synchronise automatiquement avec le réseau Bitcoin dès qu’une connexion est établie, mais ce processus n’est pas encore achevé. - - - Watch-only: - Juste-regarder : - - - Available: - Disponible : - - - Your current spendable balance - Votre solde actuel disponible - - - Pending: - En attente : - - - Total of transactions that have yet to be confirmed, and do not yet count toward the spendable balance - Total des transactions qui doivent encore être confirmées et qui ne sont pas prises en compte dans le solde disponible - - - Immature: - Immature : - - - Mined balance that has not yet matured - Le solde miné n’est pas encore mûr - - - Balances - Soldes - - - Total: - Total : - - - Your current total balance - Votre solde total actuel - - - Your current balance in watch-only addresses - Votre balance actuelle en adresses juste-regarder - - - Spendable: - Disponible : - - - Recent transactions - Transactions récentes - - - Unconfirmed transactions to watch-only addresses - Transactions non confirmées vers des adresses juste-regarder - - - Mined balance in watch-only addresses that has not yet matured - Le solde miné dans des adresses juste-regarder, qui n’est pas encore mûr - - - Current total balance in watch-only addresses - Solde total actuel dans des adresses juste-regarder - - - Privacy mode activated for the Overview tab. To unmask the values, uncheck Settings->Mask values. - Le mode privé est activé dans l’onglet Vue d’ensemble. Pour afficher les montants, décocher Paramètres -> Masquer les montants. - - - - PSBTOperationsDialog - - PSBT Operations - Opération PSBT - - - Sign Tx - Signer la transaction - - - Broadcast Tx - Diffuser la transaction - - - Copy to Clipboard - Copier dans le presse-papiers - - - Save… - Enregistrer… - - - Close - Fermer - - - Failed to load transaction: %1 - Échec de chargement de la transaction : %1 - - - Failed to sign transaction: %1 - Échec de signature de la transaction : %1 - - - Cannot sign inputs while wallet is locked. - Impossible de signer des entrées quand le porte-monnaie est verrouillé. - - - Could not sign any more inputs. - Aucune autre entrée n’a pu être signée. - - - Signed %1 inputs, but more signatures are still required. - %1 entrées ont été signées, mais il faut encore d’autres signatures. - - - Signed transaction successfully. Transaction is ready to broadcast. - La transaction a été signée avec succès et est prête à être diffusée. - - - Unknown error processing transaction. - Erreur inconnue lors de traitement de la transaction - - - Transaction broadcast successfully! Transaction ID: %1 - La transaction a été diffusée avec succès. ID de la transaction : %1 - - - Transaction broadcast failed: %1 - Échec de diffusion de la transaction : %1 - - - PSBT copied to clipboard. - La TBSP a été copiée dans le presse-papiers. - - - Save Transaction Data - Enregistrer les données de la transaction - - - Partially Signed Transaction (Binary) - Expanded name of the binary PSBT file format. See: BIP 174. - Transaction signée partiellement (fichier binaire) - - - PSBT saved to disk. - La TBSP a été enregistrée sur le disque. - - - Sends %1 to %2 - Envoie %1 à %2 - - - own address - votre adresse - - - Unable to calculate transaction fee or total transaction amount. - Impossible de calculer les frais de la transaction ou le montant total de la transaction. - - - Pays transaction fee: - Paye des frais de transaction : - - - Total Amount - Montant total - - - or - ou - - - Transaction has %1 unsigned inputs. - La transaction a %1 entrées non signées. - - - Transaction is missing some information about inputs. - Il manque des renseignements sur les entrées dans la transaction. - - - Transaction still needs signature(s). - La transaction a encore besoin d’une ou de signatures. - - - (But no wallet is loaded.) - (Mais aucun porte-monnaie n’est chargé.) - - - (But this wallet cannot sign transactions.) - (Mais ce porte-monnaie ne peut pas signer de transactions.) - - - (But this wallet does not have the right keys.) - (Mais ce porte-monnaie n’a pas les bonnes clés.) - - - Transaction is fully signed and ready for broadcast. - La transaction est complètement signée et prête à être diffusée. - - - Transaction status is unknown. - L’état de la transaction est inconnu. - - - - PaymentServer - - Payment request error - Erreur de demande de paiement - - - Cannot start bitcoin: click-to-pay handler - Impossible de démarrer le gestionnaire de cliquer-pour-payer bitcoin: - - - URI handling - Gestion des URI - - - 'bitcoin://' is not a valid URI. Use 'bitcoin:' instead. - 'bitcoin://' n’est pas une URI valide. Utilisez plutôt 'bitcoin:'. - - - Cannot process payment request because BIP70 is not supported. -Due to widespread security flaws in BIP70 it's strongly recommended that any merchant instructions to switch wallets be ignored. -If you are receiving this error you should request the merchant provide a BIP21 compatible URI. - Impossible de traiter la demande de paiement, car BIP70 n’est pas pris en charge. En raison des failles de sécurité généralisées de BIP70, il est fortement recommandé d’ignorer toute demande de marchand de changer de porte-monnaie. Si vous recevez cette erreur, vous devriez demander au marchand de vous fournir une URI compatible BIP21. - - - URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters. - L’URI ne peut pas être analysée. Cela peut être causé par une adresse Bitcoin invalide ou par des paramètres d’URI mal formés. - - - Payment request file handling - Gestion des fichiers de demande de paiement - - - - PeerTableModel - - User Agent - Title of Peers Table column which contains the peer's User Agent string. - Agent utilisateur - - - Peer - Title of Peers Table column which contains a unique number used to identify a connection. - Pair - - - Sent - Title of Peers Table column which indicates the total amount of network information we have sent to the peer. - Envoyé - - - Received - Title of Peers Table column which indicates the total amount of network information we have received from the peer. - Reçus - - - Address - Title of Peers Table column which contains the IP/Onion/I2P address of the connected peer. - Adresse - - - Network - Title of Peers Table column which states the network the peer connected through. - Réseau - - - Inbound - An Inbound Connection from a Peer. - Entrant - - - Outbound - An Outbound Connection to a Peer. - Sortant - - - - QRImageWidget - - &Save Image… - &Enregistrer l’image… - - - &Copy Image - &Copier l’image - - - Resulting URI too long, try to reduce the text for label / message. - L’URI résultante est trop longue. Essayez de réduire le texte de l’étiquette ou du message. - - - Error encoding URI into QR Code. - Erreur d’encodage de l’URI en code QR. - - - QR code support not available. - La prise en charge des codes QR n’est pas proposée. - - - Save QR Code - Enregistrer le code QR - - - PNG Image - Expanded name of the PNG file format. See: https://en.wikipedia.org/wiki/Portable_Network_Graphics. - Image PNG - - - - RPCConsole - - N/A - N.D. - - - Client version - Version du client - - - &Information - &Renseignements - - - General - Générales - - - Datadir - Répertoire des données - - - To specify a non-default location of the data directory use the '%1' option. - Pour indiquer un emplacement du répertoire des données différent de celui par défaut, utiliser l’option ’%1’. - - - Blocksdir - Répertoire des blocs - - - To specify a non-default location of the blocks directory use the '%1' option. - Pour indiquer un emplacement du répertoire des blocs différent de celui par défaut, utiliser l’option ’%1’. - - - Startup time - Heure de démarrage - - - Network - Réseau - - - Name - Nom - - - Number of connections - Nombre de connexions - - - Local Addresses - Adresses locales - - - Network addresses that your Bitcoin node is currently using to communicate with other nodes. - Adresses réseau que votre nœud Bitcoin utilise actuellement pour communiquer avec d’autres nœuds. - - - Block chain - Chaîne de blocs - - - Memory Pool - Réserve de mémoire - - - Current number of transactions - Nombre actuel de transactions - - - Memory usage - Utilisation de la mémoire - - - Wallet: - Porte-monnaie : - - - (none) - (aucun) - - - &Reset - &Réinitialiser - - - Received - Reçus - - - Sent - Envoyé - - - &Peers - &Pairs - - - Banned peers - Pairs bannis - - - Select a peer to view detailed information. - Sélectionnez un pair pour afficher des renseignements détaillés. - - - Hide Peers Detail - Cacher les détails des pairs - - - The transport layer version: %1 - La version de la couche de transport : %1 - - - Session ID - ID de session - - - Whether we relay transactions to this peer. - Si nous relayons des transactions à ce pair. - - - Transaction Relay - Relais de transaction - - - Starting Block - Bloc de départ - - - Synced Headers - En-têtes synchronisés - - - Synced Blocks - Blocs synchronisés - - - Last Transaction - Dernière transaction - - - The mapped Autonomous System used for diversifying peer selection. - Le système autonome mappé utilisé pour diversifier la sélection des pairs. - - - Mapped AS - SA mappé - - - Whether we relay addresses to this peer. - Tooltip text for the Address Relay field in the peer details area, which displays whether we relay addresses to this peer (Yes/No). - Reliez ou non des adresses à ce pair. - - - Address Relay - Text title for the Address Relay field in the peer details area, which displays whether we relay addresses to this peer (Yes/No). - Relais d’adresses - - - The total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting). - Tooltip text for the Addresses Processed field in the peer details area, which displays the total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting). - Nombre total d'adresses reçues de ce pair qui ont été traitées (à l'exclusion des adresses qui ont été abandonnées en raison de la limitation du débit). - - - The total number of addresses received from this peer that were dropped (not processed) due to rate-limiting. - Tooltip text for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting. - Nombre total d'adresses reçues de ce pair qui ont été abandonnées (non traitées) en raison de la limitation du débit. - - - Addresses Processed - Text title for the Addresses Processed field in the peer details area, which displays the total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting). - Adresses traitées - - - Addresses Rate-Limited - Text title for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting. - Adresses ciblées par la limite de débit - - - User Agent - Agent utilisateur - - - Node window - Fenêtre des nœuds - - - Current block height - Hauteur du bloc courant - - - Open the %1 debug log file from the current data directory. This can take a few seconds for large log files. - Ouvrir le fichier journal de débogage de %1 à partir du répertoire de données actuel. Cela peut prendre quelques secondes pour les fichiers journaux de grande taille. - - - Decrease font size - Diminuer la taille de police - - - Increase font size - Augmenter la taille de police - - - Permissions - Autorisations - - - The direction and type of peer connection: %1 - La direction et le type de la connexion au pair : %1 - - - The BIP324 session ID string in hex. - ID hexadécimale de la session BIP324. - - - The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS. - Le protocole réseau par lequel ce pair est connecté : IPv4, IPv6, Oignon, I2P ou CJDNS. - - - High bandwidth BIP152 compact block relay: %1 - Relais de blocs BIP152 compact à large bande passante : %1 - - - High Bandwidth - Large bande passante - - - Connection Time - Temps de connexion - - - Elapsed time since a novel block passing initial validity checks was received from this peer. - Temps écoulé depuis qu’un nouveau bloc qui a réussi les vérifications initiales de validité a été reçu par ce pair. - - - Last Block - Dernier bloc - - - Elapsed time since a novel transaction accepted into our mempool was received from this peer. - Tooltip text for the Last Transaction field in the peer details area. - Temps écoulé depuis qu’une nouvelle transaction acceptée dans notre réserve de mémoire a été reçue par ce pair. - - - Last Send - Dernier envoi - - - Last Receive - Dernière réception - - - Ping Time - Temps de ping - - - The duration of a currently outstanding ping. - La durée d’un ping en cours. - - - Ping Wait - Attente du ping - - - Min Ping - Ping min. - - - Time Offset - Décalage temporel - - - Last block time - Estampille temporelle du dernier bloc - - - &Open - &Ouvrir - - - &Network Traffic - Trafic &réseau - - - Totals - Totaux - - - Debug log file - Fichier journal de débogage - - - Clear console - Effacer la console - - - In: - Entrant : - - - Out: - Sortant : - - - Inbound: initiated by peer - Explanatory text for an inbound peer connection. - Entrant : établie par le pair - - - Outbound Full Relay: default - Explanatory text for an outbound peer connection that relays all network information. This is the default behavior for outbound connections. - Relais intégral sortant : par défaut - - - Outbound Block Relay: does not relay transactions or addresses - Explanatory text for an outbound peer connection that relays network information about blocks and not transactions or addresses. - Relais de bloc sortant : ne relaye ni transactions ni adresses - - - Outbound Manual: added using RPC %1 or %2/%3 configuration options - Explanatory text for an outbound peer connection that was established manually through one of several methods. The numbered arguments are stand-ins for the methods available to establish manual connections. - Manuelle sortante : ajoutée avec un RPC %1 ou les options de configuration %2/%3 - - - Outbound Feeler: short-lived, for testing addresses - Explanatory text for a short-lived outbound peer connection that is used to test the aliveness of known addresses. - Palpeur sortant : de courte durée, pour tester des adresses - - - Outbound Address Fetch: short-lived, for soliciting addresses - Explanatory text for a short-lived outbound peer connection that is used to request addresses from a peer. - Récupération d’adresse sortante : de courte durée, pour solliciter des adresses - - - detecting: peer could be v1 or v2 - Explanatory text for "detecting" transport type. - détection : paires pourrait être v1 ou v2 - - - v1: unencrypted, plaintext transport protocol - Explanatory text for v1 transport type. - v1: protocole de transport non chiffré en texte clair - - - v2: BIP324 encrypted transport protocol - Explanatory text for v2 transport type. - v2: Protocole de transport chiffré BIP324 - - - we selected the peer for high bandwidth relay - nous avons sélectionné le pair comme relais à large bande passante - - - the peer selected us for high bandwidth relay - le pair nous avons sélectionné comme relais à large bande passante - - - no high bandwidth relay selected - aucun relais à large bande passante n’a été sélectionné - - - &Copy address - Context menu action to copy the address of a peer. - &Copier l’adresse - - - &Disconnect - &Déconnecter - - - 1 &hour - 1 &heure - - - 1 d&ay - 1 &jour - - - 1 &week - 1 &semaine - - - 1 &year - 1 &an - - - &Copy IP/Netmask - Context menu action to copy the IP/Netmask of a banned peer. IP/Netmask is the combination of a peer's IP address and its Netmask. For IP address, see: https://en.wikipedia.org/wiki/IP_address. - &Copier l’IP, le masque réseau - - - &Unban - &Réhabiliter - - - Network activity disabled - L’activité réseau est désactivée - - - None - Aucun - - - Executing command without any wallet - Exécution de la commande sans aucun porte-monnaie - - - Node window - [%1] - Fenêtre des nœuds – [%1] - - - Executing command using "%1" wallet - Exécution de la commande en utilisant le porte-monnaie « %1 » - - - Welcome to the %1 RPC console. -Use up and down arrows to navigate history, and %2 to clear screen. -Use %3 and %4 to increase or decrease the font size. -Type %5 for an overview of available commands. -For more information on using this console, type %6. - -%7WARNING: Scammers have been active, telling users to type commands here, stealing their wallet contents. Do not use this console without fully understanding the ramifications of a command.%8 - RPC console welcome message. Placeholders %7 and %8 are style tags for the warning content, and they are not space separated from the rest of the text intentionally. - Bienvenue dans la console RPC de %1. -Utilisez les touches de déplacement vers le haut et vers le bas pour parcourir l’historique et %2 pour effacer l’écran. -Utilisez %3 et %4 pour augmenter ou diminuer la taille de la police. -Tapez %5 pour un aperçu des commandes proposées. -Pour plus de précisions sur cette console, tapez %6. -%7AVERTISSEMENT : des escrocs sont à l’œuvre et demandent aux utilisateurs de taper des commandes ici, volant ainsi le contenu de leur porte-monnaie. N’utilisez pas cette console sans entièrement comprendre les ramifications d’une commande. %8 - - - Executing… - A console message indicating an entered command is currently being executed. - Éxécution… - - - (peer: %1) - (pair : %1) - - - via %1 - par %1 - - - Yes - Oui - - - No - Non - - - To - À - - - From - De - - - Ban for - Bannir pendant - - - Never - Jamais - - - Unknown - Inconnu - - - - ReceiveCoinsDialog - - &Amount: - &Montant : - - - &Label: - &Étiquette : - - - &Message: - M&essage : - - - An optional message to attach to the payment request, which will be displayed when the request is opened. Note: The message will not be sent with the payment over the Bitcoin network. - Un message facultatif à joindre à la demande de paiement et qui sera affiché à l’ouverture de celle-ci. Note : Le message ne sera pas envoyé avec le paiement par le réseau Bitcoin. - - - An optional label to associate with the new receiving address. - Un étiquette facultative à associer à la nouvelle adresse de réception. - - - Use this form to request payments. All fields are <b>optional</b>. - Utiliser ce formulaire pour demander des paiements. Tous les champs sont <b>facultatifs</b>. - - - An optional amount to request. Leave this empty or zero to not request a specific amount. - Un montant facultatif à demander. Ne rien saisir ou un zéro pour ne pas demander de montant précis. - - - An optional label to associate with the new receiving address (used by you to identify an invoice). It is also attached to the payment request. - Une étiquette facultative à associer à la nouvelle adresse de réception (utilisée par vous pour identifier une facture). Elle est aussi jointe à la demande de paiement. - - - An optional message that is attached to the payment request and may be displayed to the sender. - Un message facultatif joint à la demande de paiement et qui peut être présenté à l’expéditeur. - - - &Create new receiving address - &Créer une nouvelle adresse de réception - - - Clear all fields of the form. - Effacer tous les champs du formulaire. - - - Clear - Effacer - - - Requested payments history - Historique des paiements demandés - - - Show the selected request (does the same as double clicking an entry) - Afficher la demande sélectionnée (comme double-cliquer sur une entrée) - - - Show - Afficher - - - Remove the selected entries from the list - Retirer les entrées sélectionnées de la liste - - - Remove - Retirer - - - Copy &URI - Copier l’&URI - - - &Copy address - &Copier l’adresse - - - Copy &label - Copier l’&étiquette - - - Copy &message - Copier le &message - - - Copy &amount - Copier le &montant - - - Not recommended due to higher fees and less protection against typos. - Non recommandé en raison de frais élevés et d'une faible protection contre les fautes de frappe. - - - Generates an address compatible with older wallets. - Génère une adresse compatible avec les anciens portefeuilles. - - - Generates a native segwit address (BIP-173). Some old wallets don't support it. - Génère une adresse segwit native (BIP-173). Certains anciens portefeuilles ne le supportent pas. - - - Bech32m (BIP-350) is an upgrade to Bech32, wallet support is still limited. - Bech32m (BIP-350) est une mise à jour de Bech32, la prise en charge du portefeuille est encore limitée. - - - Could not unlock wallet. - Impossible de déverrouiller le porte-monnaie. - - - Could not generate new %1 address - Impossible de générer la nouvelle adresse %1 - - - - ReceiveRequestDialog - - Request payment to … - Demander de paiement à… - - - Address: - Adresse : - - - Amount: - Montant : - - - Label: - Étiquette : - - - Message: - Message : - - - Wallet: - Porte-monnaie : - - - Copy &URI - Copier l’&URI - - - Copy &Address - Copier l’&adresse - - - &Verify - &Vérifier - - - Verify this address on e.g. a hardware wallet screen - Confirmer p. ex. cette adresse sur l’écran d’un porte-monnaie matériel - - - &Save Image… - &Enregistrer l’image… - - - Payment information - Renseignements de paiement - - - Request payment to %1 - Demande de paiement à %1 - - - - RecentRequestsTableModel - - Label - Étiquette - - - (no label) - (aucune étiquette) - - - (no message) - (aucun message) - - - (no amount requested) - (aucun montant demandé) - - - Requested - Demandée - - - - SendCoinsDialog - - Send Coins - Envoyer des pièces - - - Coin Control Features - Fonctions de contrôle des pièces - - - automatically selected - sélectionné automatiquement - - - Insufficient funds! - Les fonds sont insuffisants - - - Quantity: - Quantité : - - - Bytes: - Octets : - - - Amount: - Montant : - - - Fee: - Frais : - - - After Fee: - Après les frais : - - - Change: - Monnaie : - - - If this is activated, but the change address is empty or invalid, change will be sent to a newly generated address. - Si cette option est activée et l’adresse de monnaie est vide ou invalide, la monnaie sera envoyée vers une adresse nouvellement générée. - - - Custom change address - Adresse personnalisée de monnaie - - - Transaction Fee: - Frais de transaction : - - - Using the fallbackfee can result in sending a transaction that will take several hours or days (or never) to confirm. Consider choosing your fee manually or wait until you have validated the complete chain. - L’utilisation de l’option « fallbackfee » (frais de repli) peut avoir comme effet d’envoyer une transaction qui prendra plusieurs heures ou jours pour être confirmée, ou qui ne le sera jamais. Envisagez de choisir vos frais manuellement ou attendez d’avoir validé l’intégralité de la chaîne. - - - Warning: Fee estimation is currently not possible. - Avertissement : L’estimation des frais n’est actuellement pas possible. - - - per kilobyte - par kilo-octet - - - Hide - Cacher - - - Recommended: - Recommandés : - - - Custom: - Personnalisés : - - - Send to multiple recipients at once - Envoyer à plusieurs destinataires à la fois - - - Add &Recipient - Ajouter un &destinataire - - - Clear all fields of the form. - Effacer tous les champs du formulaire. - - - Choose… - Choisir… - - - Hide transaction fee settings - Cacher les paramètres de frais de transaction - - - Specify a custom fee per kB (1,000 bytes) of the transaction's virtual size. - -Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satoshis per kvB" for a transaction size of 500 virtual bytes (half of 1 kvB) would ultimately yield a fee of only 50 satoshis. - Indiquer des frais personnalisés par Ko (1 000 octets) de la taille virtuelle de la transaction. - -Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshis par Kov » pour une transaction d’une taille de 500 octets (la moitié de 1 Kov) donneront des frais de seulement 50 satoshis. - - - When there is less transaction volume than space in the blocks, miners as well as relaying nodes may enforce a minimum fee. Paying only this minimum fee is just fine, but be aware that this can result in a never confirming transaction once there is more demand for bitcoin transactions than the network can process. - Quand le volume des transactions est inférieur à l’espace dans les blocs, les mineurs et les nœuds de relais peuvent imposer des frais minimaux. Il est correct de payer ces frais minimaux, mais soyez conscient que cette transaction pourrait n’être jamais confirmée si la demande en transactions de bitcoins dépassait la capacité de traitement du réseau. - - - A too low fee might result in a never confirming transaction (read the tooltip) - Si les frais sont trop bas, cette transaction pourrait n’être jamais confirmée (lire l’infobulle) - - - (Smart fee not initialized yet. This usually takes a few blocks…) - (Les frais intelligents ne sont pas encore initialisés. Cela prend habituellement quelques blocs…) - - - Confirmation time target: - Estimation du délai de confirmation : - - - Enable Replace-By-Fee - Activer Remplacer-par-des-frais - - - With Replace-By-Fee (BIP-125) you can increase a transaction's fee after it is sent. Without this, a higher fee may be recommended to compensate for increased transaction delay risk. - Avec Remplacer-par-des-frais (BIP-125), vous pouvez augmenter les frais de transaction après qu’elle est envoyée. Sans cela, des frais plus élevés peuvent être recommandés pour compenser le risque accru de retard transactionnel. - - - Clear &All - &Tout effacer - - - Balance: - Solde : - - - Confirm the send action - Confirmer l’action d’envoi - - - S&end - E&nvoyer - - - Copy quantity - Copier la quantité - - - Copy amount - Copier le montant - - - Copy fee - Copier les frais - - - Copy after fee - Copier après les frais - - - Copy bytes - Copier les octets - - - Copy change - Copier la monnaie - - - %1 (%2 blocks) - %1 (%2 blocs) - - - Sign on device - "device" usually means a hardware wallet. - Signer sur l’appareil externe - - - Connect your hardware wallet first. - Connecter d’abord le porte-monnaie matériel. - - - Set external signer script path in Options -> Wallet - "External signer" means using devices such as hardware wallets. - Définir le chemin script du signataire externe dans Options -> Porte-monnaie - - - Cr&eate Unsigned - Cr&éer une transaction non signée - - - Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet. - Crée une transaction Bitcoin signée partiellement (TBSP) à utiliser, par exemple, avec un porte-monnaie %1 hors ligne ou avec un porte-monnaie matériel compatible TBSP. - - - %1 to '%2' - %1 à '%2' - - - %1 to %2 - %1 à %2 - - - To review recipient list click "Show Details…" - Pour réviser la liste des destinataires, cliquez sur « Afficher les détails… » - - - Sign failed - Échec de signature - - - External signer not found - "External signer" means using devices such as hardware wallets. - Le signataire externe est introuvable - - - External signer failure - "External signer" means using devices such as hardware wallets. - Échec du signataire externe - - - Save Transaction Data - Enregistrer les données de la transaction - - - Partially Signed Transaction (Binary) - Expanded name of the binary PSBT file format. See: BIP 174. - Transaction signée partiellement (fichier binaire) - - - PSBT saved - Popup message when a PSBT has been saved to a file - La TBSP a été enregistrée - - - External balance: - Solde externe : - - - or - ou - - - You can increase the fee later (signals Replace-By-Fee, BIP-125). - Vous pouvez augmenter les frais ultérieurement (signale Remplacer-par-des-frais, BIP-125). - - - Please, review your transaction proposal. This will produce a Partially Signed Bitcoin Transaction (PSBT) which you can save or copy and then sign with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet. - Text to inform a user attempting to create a transaction of their current options. At this stage, a user can only create a PSBT. This string is displayed when private keys are disabled and an external signer is not available. - Veuillez réviser votre proposition de transaction. Une transaction Bitcoin partiellement signée (TBSP) sera produite, que vous pourrez enregistrer ou copier puis signer avec, par exemple, un porte-monnaie %1 hors ligne ou avec un porte-monnaie matériel compatible TBSP. - - - %1 from wallet '%2' - %1 du porte-monnaie « %2 ». - - - Do you want to create this transaction? - Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create. - Voulez-vous créer cette transaction ? - - - Please, review your transaction. You can create and send this transaction or create a Partially Signed Bitcoin Transaction (PSBT), which you can save or copy and then sign with, e.g., an offline %1 wallet, or a PSBT-compatible hardware wallet. - Text to inform a user attempting to create a transaction of their current options. At this stage, a user can send their transaction or create a PSBT. This string is displayed when both private keys and PSBT controls are enabled. - Veuillez réviser votre transaction. Vous pouvez créer et envoyer cette transaction ou créer une transaction Bitcoin partiellement signée (TBSP), que vous pouvez enregistrer ou copier, et ensuite avec laquelle signer, par ex., un porte-monnaie %1 hors ligne ou avec un porte-monnaie matériel compatible TBSP. - - - Please, review your transaction. - Text to prompt a user to review the details of the transaction they are attempting to send. - Veuillez vérifier votre transaction. - - - Transaction fee - Frais de transaction - - - Not signalling Replace-By-Fee, BIP-125. - Ne signale pas Remplacer-par-des-frais, BIP-125. - - - Total Amount - Montant total - - - Unsigned Transaction - PSBT copied - Caption of "PSBT has been copied" messagebox - Transaction non signée - - - The PSBT has been copied to the clipboard. You can also save it. - Le PSBT a été copié dans le presse-papiers. Vous pouvez également le sauvegarder. - - - PSBT saved to disk - PSBT sauvegardé sur le disque - - - Confirm send coins - Confirmer l’envoi de pièces - - - Watch-only balance: - Solde juste-regarder : - - - The recipient address is not valid. Please recheck. - L’adresse du destinataire est invalide. Veuillez la revérifier. - - - The amount to pay must be larger than 0. - Le montant à payer doit être supérieur à 0. - - - The amount exceeds your balance. - Le montant dépasse votre solde. - - - The total exceeds your balance when the %1 transaction fee is included. - Le montant dépasse votre solde quand les frais de transaction de %1 sont compris. - - - Duplicate address found: addresses should only be used once each. - Une adresse identique a été trouvée : chaque adresse ne devrait être utilisée qu’une fois. - - - Transaction creation failed! - Échec de création de la transaction - - - A fee higher than %1 is considered an absurdly high fee. - Des frais supérieurs à %1 sont considérés comme ridiculement élevés. - - - Estimated to begin confirmation within %n block(s). - - Début de confirmation estimé à %n bloc. - Début de confirmation estimé à %n blocs. - - - - Warning: Invalid Bitcoin address - Avertissement : L’adresse Bitcoin est invalide - - - Warning: Unknown change address - Avertissement : L’adresse de monnaie est inconnue - - - Confirm custom change address - Confirmer l’adresse personnalisée de monnaie - - - The address you selected for change is not part of this wallet. Any or all funds in your wallet may be sent to this address. Are you sure? - L’adresse que vous avez sélectionnée pour la monnaie ne fait pas partie de ce porte-monnaie. Les fonds de ce porte-monnaie peuvent en partie ou en totalité être envoyés vers cette adresse. Êtes-vous certain ? - - - (no label) - (aucune étiquette) - - - - SendCoinsEntry - - A&mount: - &Montant : - - - Pay &To: - &Payer à : - - - &Label: - &Étiquette : - - - Choose previously used address - Choisir une adresse utilisée précédemment - - - The Bitcoin address to send the payment to - L’adresse Bitcoin à laquelle envoyer le paiement - - - Paste address from clipboard - Collez l’adresse du presse-papiers - - - Remove this entry - Supprimer cette entrée - - - The amount to send in the selected unit - Le montant à envoyer dans l’unité sélectionnée - - - The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally. - Les frais seront déduits du montant envoyé. Le destinataire recevra moins de bitcoins que le montant saisi dans le champ de montant. Si plusieurs destinataires sont sélectionnés, les frais seront partagés également. - - - S&ubtract fee from amount - S&oustraire les frais du montant - - - Use available balance - Utiliser le solde disponible - - - Message: - Message : - - - Enter a label for this address to add it to the list of used addresses - Saisir une étiquette pour cette adresse afin de l’ajouter à la liste d’adresses utilisées - - - A message that was attached to the bitcoin: URI which will be stored with the transaction for your reference. Note: This message will not be sent over the Bitcoin network. - Un message qui était joint à l’URI bitcoin: et qui sera stocké avec la transaction pour référence. Note : Ce message ne sera pas envoyé par le réseau Bitcoin. - - - - SendConfirmationDialog - - Send - Envoyer - - - Create Unsigned - Créer une transaction non signée - - - - SignVerifyMessageDialog - - Signatures - Sign / Verify a Message - Signatures – Signer ou vérifier un message - - - &Sign Message - &Signer un message - - - You can sign messages/agreements with your legacy (P2PKH) addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. - Vous pouvez signer des messages ou des accords avec vos anciennes adresses (P2PKH) pour prouver que vous pouvez recevoir des bitcoins à ces dernières. Ne signer rien de vague ou au hasard, car des attaques d’hameçonnage pourraient essayer de vous faire signer avec votre identité afin de l’usurper. Ne signez que des déclarations entièrement détaillées et que vous acceptez. - - - The Bitcoin address to sign the message with - L’adresse Bitcoin avec laquelle signer le message - - - Choose previously used address - Choisir une adresse utilisée précédemment - - - Paste address from clipboard - Collez l’adresse du presse-papiers - - - Enter the message you want to sign here - Saisir ici le message que vous voulez signer - - - Copy the current signature to the system clipboard - Copier la signature actuelle dans le presse-papiers - - - Sign the message to prove you own this Bitcoin address - Signer le message afin de prouver que vous détenez cette adresse Bitcoin - - - Sign &Message - Signer le &message - - - Reset all sign message fields - Réinitialiser tous les champs de signature de message - - - Clear &All - &Tout effacer - - - &Verify Message - &Vérifier un message - - - Enter the receiver's address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack. Note that this only proves the signing party receives with the address, it cannot prove sendership of any transaction! - Saisissez ci-dessous l’adresse du destinataire, le message (assurez-vous de copier fidèlement les retours à la ligne, les espaces, les tabulations, etc.) et la signature pour vérifier le message. Faites attention à ne pas déduire davantage de la signature que ce qui est contenu dans le message signé même, pour éviter d’être trompé par une attaque de l’intercepteur. Notez que cela ne fait que prouver que le signataire reçoit avec l’adresse et ne peut pas prouver la provenance d’une transaction. - - - The Bitcoin address the message was signed with - L’adresse Bitcoin avec laquelle le message a été signé - - - The signed message to verify - Le message signé à vérifier - - - The signature given when the message was signed - La signature donnée quand le message a été signé - - - Verify the message to ensure it was signed with the specified Bitcoin address - Vérifier le message pour s’assurer qu’il a été signé avec l’adresse Bitcoin indiquée - - - Verify &Message - Vérifier le &message - - - Reset all verify message fields - Réinitialiser tous les champs de vérification de message - - - Click "Sign Message" to generate signature - Cliquez sur « Signer le message » pour générer la signature - - - The entered address is invalid. - L’adresse saisie est invalide. - - - Please check the address and try again. - Veuillez vérifier l’adresse et réessayer. - - - The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again. - L’adresse saisie ne fait pas référence à une ancienne clé (P2PKH). La signature des messages n’est pas prise en charge pour SegWit ni pour les autres types d’adresses non P2PKH dans cette version de %1. Vérifiez l’adresse et réessayez. - - - Wallet unlock was cancelled. - Le déverrouillage du porte-monnaie a été annulé. - - - No error - Aucune erreur - - - Private key for the entered address is not available. - La clé privée pour l’adresse saisie n’est pas disponible. - - - Message signing failed. - Échec de signature du message. - - - Message signed. - Le message a été signé. - - - The signature could not be decoded. - La signature n’a pu être décodée. - - - Please check the signature and try again. - Veuillez vérifier la signature et réessayer. - - - The signature did not match the message digest. - La signature ne correspond pas au condensé du message. - - - Message verification failed. - Échec de vérification du message. - - - Message verified. - Le message a été vérifié. - - - - SplashScreen - - (press q to shutdown and continue later) - (appuyer sur q pour fermer et poursuivre plus tard) - - - press q to shutdown - Appuyer sur q pour fermer - - - - TrafficGraphWidget - - kB/s - Ko/s - - - - TransactionDesc - - conflicted with a transaction with %1 confirmations - Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that conflicts with a confirmed transaction. - est en conflit avec une transaction ayant %1 confirmations - - - 0/unconfirmed, in memory pool - Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that is in the memory pool. - 0/non confirmé, dans la pool de mémoire - - - 0/unconfirmed, not in memory pool - Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that is not in the memory pool. - 0/non confirmé, pas dans la pool de mémoire - - - abandoned - Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an abandoned transaction. - abandonnée - - - %1/unconfirmed - Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents a transaction confirmed in at least one block, but less than 6 blocks. - %1/non confirmée - - - Status - État - - - Generated - Générée - - - From - De - - - unknown - inconnue - - - To - À - - - own address - votre adresse - - - watch-only - juste-regarder - - - label - étiquette - - - Credit - Crédit - - - matures in %n more block(s) - - arrivera à maturité dans %n bloc - arrivera à maturité dans %n blocs - - - - not accepted - non acceptée - - - Debit - Débit - - - Total debit - Débit total - - - Total credit - Crédit total - - - Transaction fee - Frais de transaction - - - Net amount - Montant net - - - Comment - Commentaire - - - Transaction ID - ID de la transaction - - - Transaction total size - Taille totale de la transaction - - - Transaction virtual size - Taille virtuelle de la transaction - - - Output index - Index des sorties - - - %1 (Certificate was not verified) - %1 (ce certificat n’a pas été vérifié) - - - Merchant - Marchand - - - Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. - Les pièces générées doivent mûrir pendant %1 blocs avant de pouvoir être dépensées. Quand vous avez généré ce bloc, il a été diffusé sur le réseau pour être ajouté à la chaîne de blocs. Si son intégration à la chaîne échoue, son état sera modifié en « non acceptée » et il ne sera pas possible de le dépenser. Cela peut arriver occasionnellement si un autre nœud génère un bloc à quelques secondes du vôtre. - - - Debug information - Renseignements de débogage - - - Inputs - Entrées - - - Amount - Montant - - - true - vrai - - - false - faux - - - - TransactionDescDialog - - This pane shows a detailed description of the transaction - Ce panneau affiche une description détaillée de la transaction - - - Details for %1 - Détails de %1 - - - - TransactionTableModel - - Label - Étiquette - - - Unconfirmed - Non confirmée - - - Abandoned - Abandonnée - - - Confirming (%1 of %2 recommended confirmations) - Confirmation (%1 sur %2 confirmations recommandées) - - - Confirmed (%1 confirmations) - Confirmée (%1 confirmations) - - - Conflicted - En conflit - - - Immature (%1 confirmations, will be available after %2) - Immature (%1 confirmations, sera disponible après %2) - - - Generated but not accepted - Générée mais non acceptée - - - Received with - Reçue avec - - - Received from - Reçue de - - - Sent to - Envoyée à - - - Mined - Miné - - - watch-only - juste-regarder - - - (n/a) - (n.d) - - - (no label) - (aucune étiquette) - - - Transaction status. Hover over this field to show number of confirmations. - État de la transaction. Survoler ce champ avec la souris pour afficher le nombre de confirmations. - - - Date and time that the transaction was received. - Date et heure de réception de la transaction. - - - Type of transaction. - Type de transaction. - - - Whether or not a watch-only address is involved in this transaction. - Une adresse juste-regarder est-elle ou non impliquée dans cette transaction. - - - User-defined intent/purpose of the transaction. - Intention, but de la transaction défini par l’utilisateur. - - - Amount removed from or added to balance. - Le montant a été ajouté ou soustrait du solde. - - - - TransactionView - - All - Toutes - - - Today - Aujourd’hui - - - This week - Cette semaine - - - This month - Ce mois - - - Last month - Le mois dernier - - - This year - Cette année - - - Received with - Reçue avec - - - Sent to - Envoyée à - - - Mined - Miné - - - Other - Autres - - - Enter address, transaction id, or label to search - Saisir l’adresse, l’ID de transaction ou l’étiquette à chercher - - - Min amount - Montant min. - - - Range… - Plage… - - - &Copy address - &Copier l’adresse - - - Copy &label - Copier l’&étiquette - - - Copy &amount - Copier le &montant - - - Copy transaction &ID - Copier l’&ID de la transaction - - - Copy &raw transaction - Copier la transaction &brute - - - Copy full transaction &details - Copier tous les &détails de la transaction - - - &Show transaction details - &Afficher les détails de la transaction - - - Increase transaction &fee - Augmenter les &frais de transaction - - - A&bandon transaction - A&bandonner la transaction - - - &Edit address label - &Modifier l’adresse de l’étiquette - - - Show in %1 - Transactions table context menu action to show the selected transaction in a third-party block explorer. %1 is a stand-in argument for the URL of the explorer. - Afficher dans %1 - - - Export Transaction History - Exporter l’historique transactionnel - - - Comma separated file - Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values. - Fichier séparé par des virgules - - - Confirmed - Confirmée - - - Watch-only - Juste-regarder - - - Label - Étiquette - - - Address - Adresse - - - ID - ID - - - Exporting Failed - Échec d’exportation - - - There was an error trying to save the transaction history to %1. - Une erreur est survenue lors de l’enregistrement de l’historique transactionnel vers %1. - - - Exporting Successful - L’exportation est réussie - - - The transaction history was successfully saved to %1. - L’historique transactionnel a été enregistré avec succès vers %1. - - - Range: - Plage : - - - to - à - - - - WalletFrame - - No wallet has been loaded. -Go to File > Open Wallet to load a wallet. -- OR - - Aucun porte-monnaie n’a été chargé. -Accédez à Fichier > Ouvrir un porte-monnaie pour en charger un. -– OU – - - - Create a new wallet - Créer un nouveau porte-monnaie - - - Error - Erreur - - - Unable to decode PSBT from clipboard (invalid base64) - Impossible de décoder la TBSP du presse-papiers (le Base64 est invalide) - - - Load Transaction Data - Charger les données de la transaction - - - Partially Signed Transaction (*.psbt) - Transaction signée partiellement (*.psbt) - - - PSBT file must be smaller than 100 MiB - Le fichier de la TBSP doit être inférieur à 100 Mio - - - Unable to decode PSBT - Impossible de décoder la TBSP - - - - WalletModel - - Send Coins - Envoyer des pièces - - - Fee bump error - Erreur d’augmentation des frais - - - Increasing transaction fee failed - Échec d’augmentation des frais de transaction - - - Do you want to increase the fee? - Asks a user if they would like to manually increase the fee of a transaction that has already been created. - Voulez-vous augmenter les frais ? - - - Current fee: - Frais actuels : - - - Increase: - Augmentation : - - - New fee: - Nouveaux frais : - - - Warning: This may pay the additional fee by reducing change outputs or adding inputs, when necessary. It may add a new change output if one does not already exist. These changes may potentially leak privacy. - Avertissement : Ceci pourrait payer les frais additionnel en réduisant les sorties de monnaie ou en ajoutant des entrées, si nécessaire. Une nouvelle sortie de monnaie pourrait être ajoutée si aucune n’existe déjà. Ces changements pourraient altérer la confidentialité. - - - Confirm fee bump - Confirmer l’augmentation des frais - - - Can't draft transaction. - Impossible de créer une ébauche de la transaction. - - - PSBT copied - La TBPS a été copiée - - - Fee-bump PSBT copied to clipboard - La TBSP des augmentations de frais a été copiée dans le presse-papiers. - - - Can't sign transaction. - Impossible de signer la transaction. - - - Could not commit transaction - Impossible de valider la transaction - - - Signer error - Erreur de signataire - - - Can't display address - Impossible d’afficher l’adresse - - - - WalletView - - &Export - &Exporter - - - Export the data in the current tab to a file - Exporter les données de l’onglet actuel vers un fichier - - - Backup Wallet - Sauvegarder le porte-monnaie - - - Wallet Data - Name of the wallet data file format. - Données du porte-monnaie - - - Backup Failed - Échec de sauvegarde - - - There was an error trying to save the wallet data to %1. - Une erreur est survenue lors de l’enregistrement des données du porte-monnaie vers %1. - - - Backup Successful - La sauvegarde est réussie - - - The wallet data was successfully saved to %1. - Les données du porte-monnaie ont été enregistrées avec succès vers %1. - - - Cancel - Annuler - - - - bitcoin-core - - The %s developers - Les développeurs de %s - - - %s corrupt. Try using the wallet tool bitcoin-wallet to salvage or restoring a backup. - %s est corrompu. Essayez l’outil bitcoin-wallet pour le sauver ou restaurez une sauvegarde. - - - %s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error. - %s a échoué à valider l'état instantané -assumeutxo. Cela indique un problème matériel, ou un bug dans le logiciel, ou une mauvaise modification du logiciel qui a permis de charger un instantané invalide. En conséquence, le nœud s'arrêtera et cessera d'utiliser tout état qui a été construit sur l'instantané, réinitialisant la hauteur de la chaîne de %d à %d. Au prochain redémarrage, le nœud reprendra la synchronisation à partir de %d sans utiliser de données d'instantané. Veuillez signaler cet incident à %s, en précisant comment vous avez obtenu l'instantané. L'état de chaîne d'instantané invalide sera conservé sur le disque au cas où il serait utile pour diagnostiquer le problème qui a causé cette erreur. - - - %s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list. - %s demande d'écouter sur le port %u. Ce port est considéré comme "mauvais" et il est donc peu probable qu'un pair s'y connecte. Voir doc/p2p-bad-ports.md pour plus de détails et une liste complète. - - - Cannot downgrade wallet from version %i to version %i. Wallet version unchanged. - Impossible de rétrograder le porte-monnaie de la version %i à la version %i. La version du porte-monnaie reste inchangée. - - - Cannot upgrade a non HD split wallet from version %i to version %i without upgrading to support pre-split keypool. Please use version %i or no version specified. - Impossible de mettre à niveau un porte-monnaie divisé non-HD de la version %i vers la version %i sans mise à niveau pour prendre en charge la réserve de clés antérieure à la division. Veuillez utiliser la version %i ou ne pas indiquer de version. - - - Disk space for %s may not accommodate the block files. Approximately %u GB of data will be stored in this directory. - L'espace disque %s peut ne pas être suffisant pour les fichiers en bloc. Environ %u Go de données seront stockés dans ce répertoire. - - - Distributed under the MIT software license, see the accompanying file %s or %s - Distribué sous la licence MIT d’utilisation d’un logiciel, consultez le fichier joint %s ou %s - - - Error loading wallet. Wallet requires blocks to be downloaded, and software does not currently support loading wallets while blocks are being downloaded out of order when using assumeutxo snapshots. Wallet should be able to load successfully after node sync reaches height %s - Erreur de chargement du portefeuille. Le portefeuille nécessite le téléchargement de blocs, et le logiciel ne prend pas actuellement en charge le chargement de portefeuilles lorsque les blocs sont téléchargés dans le désordre lors de l'utilisation de snapshots assumeutxo. Le portefeuille devrait pouvoir être chargé avec succès une fois que la synchronisation des nœuds aura atteint la hauteur %s - - - Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet. - Erreur de lecture de %s : soit les données de la transaction manquent soit elles sont incorrectes. Réanalyse du porte-monnaie. - - - Error starting/committing db txn for wallet transactions removal process - Erreur de lancement, de validation de la transaction de base de données pour la suppression des transactions du portemonnaie - - - Error: Dumpfile format record is incorrect. Got "%s", expected "format". - Erreur : L’enregistrement du format du fichier de vidage est incorrect. Est « %s », mais « format » est attendu. - - - Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s". - Erreur : L’enregistrement de l’identificateur du fichier de vidage est incorrect. Est « %s », mais « %s » est attendu. - - - Error: Dumpfile version is not supported. This version of bitcoin-wallet only supports version 1 dumpfiles. Got dumpfile with version %s - Erreur : La version du fichier de vidage n’est pas prise en charge. Cette version de bitcoin-wallet ne prend en charge que les fichiers de vidage version 1. Le fichier de vidage obtenu est de la version %s. - - - Error: Legacy wallets only support the "legacy", "p2sh-segwit", and "bech32" address types - Erreur : les porte-monnaie hérités ne prennent en charge que les types d’adresse « legacy », « p2sh-segwit », et « bech32 » - - - Error: Unable to produce descriptors for this legacy wallet. Make sure to provide the wallet's passphrase if it is encrypted. - Erreur : Impossible de produire des descripteurs pour ce portefeuille existant. Veillez à fournir la phrase secrète du portefeuille s'il est crypté. - - - File %s already exists. If you are sure this is what you want, move it out of the way first. - Le fichier %s existe déjà. Si vous confirmez l’opération, déplacez-le avant. - - - Invalid or corrupt peers.dat (%s). If you believe this is a bug, please report it to %s. As a workaround, you can move the file (%s) out of the way (rename, move, or delete) to have a new one created on the next start. - peers.dat est invalide ou corrompu (%s). Si vous pensez que c’est un bogue, veuillez le signaler à %s. Pour y remédier, vous pouvez soit renommer, soit déplacer soit supprimer le fichier (%s) et un nouveau sera créé lors du prochain démarrage. - - - Invalid value detected for '-wallet' or '-nowallet'. '-wallet' requires a string value, while '-nowallet' accepts only '1' to disable all wallets - Une valeur invalide a été détectée pour « -wallet » ou pour « -nowallet ». « -wallet » nécessite une valeur de chaine alors que « -nowallet » n’accepte que « 1 » pour désactiver tous les portemonnaies - - - More than one onion bind address is provided. Using %s for the automatically created Tor onion service. - Plus d’une adresse oignon de liaison est indiquée. %s sera utilisée pour le service oignon de Tor créé automatiquement. - - - No dump file provided. To use createfromdump, -dumpfile=<filename> must be provided. - Aucun fichier de vidage n’a été indiqué. Pour utiliser createfromdump, -dumpfile=<filename> doit être indiqué. - - - No dump file provided. To use dump, -dumpfile=<filename> must be provided. - Aucun fichier de vidage n’a été indiqué. Pour utiliser dump, -dumpfile=<filename> doit être indiqué. - - - No wallet file format provided. To use createfromdump, -format=<format> must be provided. - Aucun format de fichier de porte-monnaie n’a été indiqué. Pour utiliser createfromdump, -format=<format> doit être indiqué. - - - Option '-upnp' is set but UPnP support was dropped in version 29.0. Consider using '-natpmp' instead. - L’option « -upnp » est définie, mais la prise en charge d’UPnP a été abandonnée dans la version 29.0. Envisagez de la remplacer par « -natpmp ». - - - Please contribute if you find %s useful. Visit %s for further information about the software. - Si vous trouvez %s utile, veuillez y contribuer. Pour de plus de précisions sur le logiciel, rendez-vous sur %s. - - - Prune configured below the minimum of %d MiB. Please use a higher number. - L’élagage est configuré au-dessous du minimum de %d Mio. Veuillez utiliser un nombre plus élevé. - - - Prune mode is incompatible with -reindex-chainstate. Use full -reindex instead. - Le mode Prune est incompatible avec -reindex-chainstate. Utilisez plutôt -reindex complet. - - - Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node) - Élagage : la dernière synchronisation de porte-monnaie va par-delà les données élaguées. Vous devez -reindex (réindexer, télécharger de nouveau toute la chaîne de blocs en cas de nœud élagué) - - - Rename of '%s' -> '%s' failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup. - La modification de '%s' -> '%s' a échoué. Vous devriez résoudre cela en déplaçant ou en supprimant manuellement le répertoire de snapshot invalide %s, sinon vous rencontrerez la même erreur à nouveau au prochain démarrage. - - - SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported - SQLiteDatabase : la version %d du schéma de porte-monnaie sqlite est inconnue. Seule la version %d est prise en charge - - - The block database contains a block which appears to be from the future. This may be due to your computer's date and time being set incorrectly. Only rebuild the block database if you are sure that your computer's date and time are correct - La base de données des blocs comprend un bloc qui semble provenir du futur. Cela pourrait être causé par la date et l’heure erronées de votre ordinateur. Ne reconstruisez la base de données des blocs que si vous êtes certain que la date et l’heure de votre ordinateur sont justes. - - - The transaction amount is too small to send after the fee has been deducted - Le montant de la transaction est trop bas pour être envoyé une fois que les frais ont été déduits - - - This error could occur if this wallet was not shutdown cleanly and was last loaded using a build with a newer version of Berkeley DB. If so, please use the software that last loaded this wallet - Cette erreur pourrait survenir si ce porte-monnaie n’a pas été fermé proprement et s’il a été chargé en dernier avec une nouvelle version de Berkeley DB. Si c’est le cas, veuillez utiliser le logiciel qui a chargé ce porte-monnaie en dernier. - - - This is a pre-release test build - use at your own risk - do not use for mining or merchant applications - Ceci est une préversion de test — son utilisation est entièrement à vos risques — ne l’utilisez pour miner ou pour des applications marchandes - - - This is the maximum transaction fee you pay (in addition to the normal fee) to prioritize partial spend avoidance over regular coin selection. - Les frais maximaux de transaction que vous payez (en plus des frais habituels) afin de prioriser une dépense non partielle plutôt qu’une sélection normale de pièces. - - - This is the transaction fee you may discard if change is smaller than dust at this level - Les frais de transaction que vous pouvez ignorer si la monnaie rendue est inférieure à la poussière à ce niveau - - - This is the transaction fee you may pay when fee estimates are not available. - Il s’agit des frais de transaction que vous pourriez payer si aucune estimation de frais n’est proposée. - - - Total length of network version string (%i) exceeds maximum length (%i). Reduce the number or size of uacomments. - La taille totale de la chaîne de version de réseau (%i) dépasse la longueur maximale (%i). Réduire le nombre ou la taille de uacomments. - - - Unable to replay blocks. You will need to rebuild the database using -reindex-chainstate. - Impossible de relire les blocs. Vous devrez reconstruire la base de données avec -reindex-chainstate. - - - Unknown wallet file format "%s" provided. Please provide one of "bdb" or "sqlite". - Le format de fichier porte-monnaie « %s » indiqué est inconnu. Veuillez soit indiquer « bdb » soit « sqlite ». - - - Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=<category>:<loglevel>. Valid categories: %3$s. Valid loglevels: %4$s. - Niveau de journalisation spécifique à la catégorie non pris en charge %1$s=%2$s. Attendu %1$s=<catégorie>:<niveaudejournal>. Catégories valides : %3$s. Niveaux de journalisation valides : %4$s. - - - Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database. - Le format de la base de données chainstate n'est pas supporté. Veuillez redémarrer avec -reindex-chainstate. Cela reconstruira la base de données chainstate. - - - Wallet created successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. - Portefeuille créé avec succès. Le type de portefeuille ancien est en cours de suppression et la prise en charge de la création et de l'ouverture des portefeuilles anciens sera supprimée à l'avenir. - - - Wallet loaded successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. Legacy wallets can be migrated to a descriptor wallet with migratewallet. - Portefeuille chargé avec succès. Le type de portefeuille existant est obsolète et la prise en charge de la création et de l'ouverture de portefeuilles existants sera supprimée à l'avenir. Les anciens portefeuilles peuvent être migrés vers un portefeuille descripteur avec migratewallet. - - - Warning: Dumpfile wallet format "%s" does not match command line specified format "%s". - Avertissement : Le format du fichier de vidage de porte-monnaie « %s » ne correspond pas au format « %s » indiqué dans la ligne de commande. - - - Warning: Private keys detected in wallet {%s} with disabled private keys - Avertissement : Des clés privées ont été détectées dans le porte-monnaie {%s} avec des clés privées désactivées - - - Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade. - Avertissement : Nous ne semblons pas être en accord complet avec nos pairs. Une mise à niveau pourrait être nécessaire pour vous ou pour d’autres nœuds du réseau. - - - Witness data for blocks after height %d requires validation. Please restart with -reindex. - Les données témoin pour les blocs postérieurs à la hauteur %d exigent une validation. Veuillez redémarrer avec -reindex. - - - You need to rebuild the database using -reindex to go back to unpruned mode. This will redownload the entire blockchain - Vous devez reconstruire la base de données en utilisant -reindex afin de revenir au mode sans élagage. Ceci retéléchargera complètement la chaîne de blocs. - - - %s is set very high! - La valeur %s est très élevée - - - -maxmempool must be at least %d MB - -maxmempool doit être d’au moins %d Mo - - - Cannot obtain a lock on directory %s. %s is probably already running. - Impossible d’obtenir un verrou sur le dossier %s. %s fonctionne probablement déjà. - - - Cannot resolve -%s address: '%s' - Impossible de résoudre l’adresse -%s : « %s » - - - Cannot set -forcednsseed to true when setting -dnsseed to false. - Impossible de définir -forcednsseed comme vrai si -dnsseed est défini comme faux. - - - Cannot set -peerblockfilters without -blockfilterindex. - Impossible de définir -peerblockfilters sans -blockfilterindex - - - %s is set very high! Fees this large could be paid on a single transaction. - %s est très élevé ! Des frais aussi importants pourraient être payés sur une seule transaction. - - - Cannot provide specific connections and have addrman find outgoing connections at the same time. - Il est impossible d’indiquer des connexions précises et en même temps de demander à addrman de trouver les connexions sortantes. - - - Error loading %s: External signer wallet being loaded without external signer support compiled - Erreur de chargement de %s : le porte-monnaie signataire externe est chargé sans que la prise en charge de signataires externes soit compilée - - - Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect. - Erreur de lecture de %s! Toutes les clés ont été lues correctement, mais les données de transaction ou les métadonnées d'adresse peuvent être manquantes ou incorrectes. - - - Error: Address book data in wallet cannot be identified to belong to migrated wallets - Erreur : Les données du carnet d'adresses du portefeuille ne peuvent pas être identifiées comme appartenant à des portefeuilles migrés - - - Error: Duplicate descriptors created during migration. Your wallet may be corrupted. - Erreur : Descripteurs en double créés pendant la migration. Votre portefeuille est peut-être corrompu. - - - Error: Transaction %s in wallet cannot be identified to belong to migrated wallets - Erreur : La transaction %s dans le portefeuille ne peut pas être identifiée comme appartenant aux portefeuilles migrés. - - - Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions. - Échec du calcul des frais de majoration, car les UTXO non confirmés dépendent d'un énorme groupe de transactions non confirmées. - - - Failed to remove snapshot chainstate dir (%s). Manually remove it before restarting. - - Échec de suppression du répertoire de l’instantané d’état de la chaîne (%s). Supprimez-le manuellement avant de redémarrer. - - - Failed to rename invalid peers.dat file. Please move or delete it and try again. - Échec de renommage du fichier peers.dat invalide. Veuillez le déplacer ou le supprimer, puis réessayer. - - - Fee estimation failed. Fallbackfee is disabled. Wait a few blocks or enable %s. - L'estimation des frais a échoué. Fallbackfee est désactivé. Attendez quelques blocs ou activez %s. - - - Flushing block file to disk failed. This is likely the result of an I/O error. - Échec de vidage du fichier des blocs sur le disque, probablement à cause d’une erreur d’E/S. - - - Flushing undo file to disk failed. This is likely the result of an I/O error. - Échec de vidage du fichier d’annulation sur le disque, probablement à cause d’une erreur d’E/S. - - - Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6 - Options incompatibles : -dnsseed=1 a été explicitement spécifié, mais -onlynet interdit les connexions vers IPv4/IPv6 - - - Invalid amount for %s=<amount>: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions) - Montant non valide pour %s=<amount> : '%s' (doit être au moins égal au minrelay fee de %s pour éviter les transactions bloquées) - - - Maximum transaction weight is less than transaction weight without inputs - Le poids maximal de la transaction est inférieur au poids de la transaction sans entrées - - - Maximum transaction weight is too low, can not accommodate change output - Le poids maximal de la transaction est trop faible et ne permet pas les sorties de monnaie - - - Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided - Connexions sortantes limitées à CJDNS (-onlynet=cjdns) mais -cjdnsreachable n'est pas fourni - - - Outbound connections restricted to Tor (-onlynet=onion) but the proxy for reaching the Tor network is explicitly forbidden: -onion=0 - Connexions sortantes limitées à Tor (-onlynet=onion) mais le proxy pour atteindre le réseau Tor est explicitement interdit : -onion=0 - - - Outbound connections restricted to Tor (-onlynet=onion) but the proxy for reaching the Tor network is not provided: none of -proxy, -onion or -listenonion is given - Connexions sortantes limitées à Tor (-onlynet=onion) mais le proxy pour atteindre le réseau Tor n'est pas fourni : aucun des paramètres -proxy, -onion ou -listenonion n'est donné - - - Outbound connections restricted to i2p (-onlynet=i2p) but -i2psam is not provided - Connexions sortantes limitées à i2p (-onlynet=i2p) mais -i2psam n'est pas fourni - - - Rename of '%s' -> '%s' failed. Cannot clean up the background chainstate leveldb directory. - Échec de renommage de « %s » en « %s ». Impossible de nettoyer le répertoire de la base de données d’état de chaîne d’arrière-plan. - - - Specified -blockmaxweight (%d) exceeds consensus maximum block weight (%d) - Le poids maximal de bloc -blockmaxweight indiqué (%d) dépasse le poids maximal de bloc du consensus (%d). - - - Specified -blockreservedweight (%d) exceeds consensus maximum block weight (%d) - Le poids réservé de bloc -blockreservedweight indiqué (%d) dépasse le poids maximal de bloc du consensus (%d). - - - Specified -blockreservedweight (%d) is lower than minimum safety value of (%d) - Le poids réservé de bloc -blockreservedweight indiqué (%d) est inférieur à la valeur minimale de sécurité de (%d) - - - The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs - La combinaison des entrées présélectionnées et de la sélection automatique des entrées du porte-monnaie dépasse le poids maximal de la transaction. Essayez d’envoyer un montant inférieur ou de consolider manuellement les UTXO de votre porte-monnaie. - - - The inputs size exceeds the maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs - La taille des entrées dépasse le poids maximum. Veuillez essayer d'envoyer un montant plus petit ou de consolider manuellement les UTXOs de votre portefeuille. - - - The preselected coins total amount does not cover the transaction target. Please allow other inputs to be automatically selected or include more coins manually - Le montant total des pièces présélectionnées ne couvre pas l'objectif de la transaction. Veuillez permettre à d'autres entrées d'être sélectionnées automatiquement ou inclure plus de pièces manuellement - - - Transaction requires one destination of non-0 value, a non-0 feerate, or a pre-selected input - La transaction nécessite une destination d'une valeur non nulle, un ratio de frais non nul, ou une entrée présélectionnée. - - - UTXO snapshot failed to validate. Restart to resume normal initial block download, or try loading a different snapshot. - La validation de la snapshot UTXO a échoué. Redémarrez pour reprendre le téléchargement normal du bloc initial, ou essayez de charger une autre snapshot. - - - Unconfirmed UTXOs are available, but spending them creates a chain of transactions that will be rejected by the mempool - Les UTXO non confirmés sont disponibles, mais les dépenser crée une chaîne de transactions qui sera rejetée par le mempool. - - - Unexpected legacy entry in descriptor wallet found. Loading wallet %s - -The wallet might have been tampered with or created with malicious intent. - - Une entrée héritée inattendue dans le portefeuille de descripteurs a été trouvée. Chargement du portefeuille %s - -Le portefeuille peut avoir été altéré ou créé avec des intentions malveillantes. - - - - Unrecognized descriptor found. Loading wallet %s - -The wallet might had been created on a newer version. -Please try running the latest software version. - - Descripteur non reconnu trouvé. Chargement du portefeuille %s - -Le portefeuille a peut-être été créé avec une version plus récente. -Veuillez essayer d'utiliser la dernière version du logiciel. - - - - Your computer's date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you've confirmed your computer's clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you've connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info. - La date et l’heure de votre ordinateur semblent décalées de plus de %d minutes par rapport au réseau, ce qui peut entraîner un échec de consensus. Après avoir confirmé l’heure de votre ordinateur, ce message ne devrait plus s’afficher après redémarrage de votre nœud. Sans redémarrage, il devrait cesser de s’afficher automatiquement si vous vous connectez à suffisamment de nouveaux pairs sortants, ce qui peut prendre du temps. Pour plus de précisions, vous pouvez inspecter le champ `timeoffset` des méthodes RPC `getpeerinfo` et `getnetworkinfo`. - - - -Unable to cleanup failed migration - -Impossible de corriger l'échec de la migration - - - -Unable to restore backup of wallet. - -Impossible de restaurer la sauvegarde du portefeuille. - - - whitebind may only be used for incoming connections ("out" was passed) - « whitebind » ne peut être utilisé que pour les connexions entrantes (« out » a été passé) - - - A fatal internal error occurred, see debug.log for details: - Une erreur interne fatale est survenue. Pour plus de précisions, consultez debug.log : - - - Assumeutxo data not found for the given blockhash '%s'. - Les données Assumeutxo sont introuvables pour l’empreinte de bloc « %s » donnée. - - - Block verification was interrupted - La vérification des blocs a été interrompue - - - Cannot write to directory '%s'; check permissions. - Impossible d’écrire dans le dossier « %s » ; vérifiez les droits. - - - Config setting for %s only applied on %s network when in [%s] section. - Paramètre de configuration pour %s qui n’est appliqué sur le réseau %s que s’il se trouve dans la section [%s]. - - - Copyright (C) %i-%i - Tous droits réservés © %i à %i - - - Corrupt block found indicating potential hardware failure. - Un bloc corrompu a été détecté, ce qui indique une défaillance matérielle possible. - - - Corrupted block database detected - Une base de données des blocs corrompue a été détectée - - - Could not find asmap file %s - Le fichier asmap %s est introuvable - - - Could not parse asmap file %s - Impossible d’analyser le fichier asmap %s - - - Disk space is too low! - L’espace disque est trop faible - - - Done loading - Le chargement est terminé - - - Dump file %s does not exist. - Le fichier de vidage %s n’existe pas. - - - Elliptic curve cryptography sanity check failure. %s is shutting down. - Échec du contrôle d’intégrité de la cryptographie à courbe elliptique. Fermeture de %s. - - - Error creating %s - Erreur de création de %s - - - Error initializing block database - Erreur d’initialisation de la base de données des blocs - - - Error initializing wallet database environment %s! - Erreur d’initialisation de l’environnement de la base de données du porte-monnaie %s  - - - Error loading %s - Erreur de chargement de %s - - - Error loading %s: Private keys can only be disabled during creation - Erreur de chargement de %s : les clés privées ne peuvent être désactivées qu’à la création - - - Error loading %s: Wallet corrupted - Erreur de chargement de %s : le porte-monnaie est corrompu - - - Error loading %s: Wallet requires newer version of %s - Erreur de chargement de %s : le porte-monnaie exige une version plus récente de %s - - - Error loading block database - Erreur de chargement de la base de données des blocs - - - Error loading databases - Erreur de chargement des bases de données - - - Error opening block database - Erreur d’ouverture de la base de données des blocs - - - Error opening coins database - Erreur d’ouverture de la base de données des pièces - - - Error reading configuration file: %s - Erreur de lecture du fichier de configuration : %s - - - Error reading from database, shutting down. - Erreur de lecture de la base de données, fermeture en cours - - - Error reading next record from wallet database - Erreur de lecture de l’enregistrement suivant de la base de données du porte-monnaie - - - Error: Cannot extract destination from the generated scriptpubkey - Erreur : Impossible d'extraire la destination du scriptpubkey généré - - - Error: Couldn't create cursor into database - Erreur : Impossible de créer le curseur dans la base de données - - - Error: Disk space is low for %s - Erreur : Il reste peu d’espace disque sur %s - - - Error: Dumpfile checksum does not match. Computed %s, expected %s - Erreur : La somme de contrôle du fichier de vidage ne correspond pas. Calculée %s, attendue %s - - - Error: Failed to create new watchonly wallet - Erreur : Echec de la création d'un nouveau portefeuille watchonly - - - Error: Got key that was not hex: %s - Erreur : La clé obtenue n’était pas hexadécimale : %s - - - Error: Got value that was not hex: %s - Erreur : La valeur obtenue n’était pas hexadécimale : %s - - - Error: Keypool ran out, please call keypoolrefill first - Erreur : La réserve de clés est épuisée, veuillez d’abord appeler « keypoolrefill » - - - Error: Missing checksum - Erreur : Aucune somme de contrôle n’est indiquée - - - Error: No %s addresses available. - Erreur : Aucune adresse %s n’est disponible. - - - Error: This wallet already uses SQLite - Erreur : Ce portefeuille utilise déjà SQLite - - - Error: This wallet is already a descriptor wallet - Erreur : Ce portefeuille est déjà un portefeuille de descripteurs - - - Error: Unable to begin reading all records in the database - Erreur : Impossible de commencer à lire tous les enregistrements de la base de données - - - Error: Unable to make a backup of your wallet - Erreur : Impossible d'effectuer une sauvegarde de votre portefeuille - - - Error: Unable to parse version %u as a uint32_t - Erreur : Impossible d’analyser la version %u en tant que uint32_t - - - Error: Unable to read all records in the database - Erreur : Impossible de lire tous les enregistrements de la base de données - - - Error: Unable to read wallet's best block locator record - Erreur : Impossible de lire l’enregistrement du meilleur bloc du porte-monnaie. - - - Error: Unable to remove watchonly address book data - Erreur : Impossible de supprimer les données du carnet d'adresses en mode veille - - - Error: Unable to write data to disk for wallet %s - Erreur : Impossible d’écrire les données sur le disque pour le portemonnaie %s - - - Error: Unable to write record to new wallet - Erreur : Impossible d’écrire l’enregistrement dans le nouveau porte-monnaie - - - Error: Unable to write solvable wallet best block locator record - Erreur : Impossible d’écrire l’enregistrement du localisateur du meilleur bloc soluble du porte-monnaie - - - Error: Unable to write watchonly wallet best block locator record - Erreur : Impossible d’écrire l’enregistrement du localisateur du meilleur bloc du porte-monnaie juste-regarder - - - Error: database transaction cannot be executed for wallet %s - Erreur ; La transaction de la base de données ne peut pas être exécutée pour le porte-monnaie %s - - - Failed to connect best block (%s). - Échec de connexion du meilleur bloc (%s). - - - Failed to disconnect block. - Échec de déconnexion du bloc. - - - Failed to listen on any port. Use -listen=0 if you want this. - Échec d'écoute sur tous les ports. Si cela est voulu, utiliser -listen=0. - - - Failed to read block. - Échec de lecture du bloc. - - - Failed to rescan the wallet during initialization - Échec de réanalyse du porte-monnaie lors de l’initialisation - - - Failed to start indexes, shutting down.. - Échec du démarrage des index, arrêt. - - - Failed to verify database - Échec de vérification de la base de données - - - Failed to write block. - Échec d’écriture du bloc. - - - Failed to write to block index database. - Échec d’écriture dans la base de données d’index des blocs. - - - Failed to write to coin database. - Échec d’écriture dans la base de données des pièces. - - - Failed to write undo data. - Échec d’écriture des données d’annulation. - - - Failure removing transaction: %s - Échec de suppression de la transaction :%s - - - Fee rate (%s) is lower than the minimum fee rate setting (%s) - Le taux de frais (%s) est inférieur au taux minimal de frais défini (%s) - - - Ignoring duplicate -wallet %s. - Ignore -wallet %s en double. - - - Importing… - Importation… - - - Incorrect or no genesis block found. Wrong datadir for network? - Bloc de genèse incorrect ou introuvable. Mauvais datadir pour le réseau ? - - - Initialization sanity check failed. %s is shutting down. - Échec d’initialisation du test de cohérence. %s est en cours de fermeture. - - - Input not found or already spent - L’entrée est introuvable ou a déjà été dépensée - - - Insufficient dbcache for block verification - Insuffisance de dbcache pour la vérification des blocs - - - Insufficient funds - Les fonds sont insuffisants - - - Invalid -i2psam address or hostname: '%s' - L’adresse ou le nom d’hôte -i2psam est invalide : « %s » - - - Invalid -onion address or hostname: '%s' - L’adresse ou le nom d’hôte -onion est invalide : « %s » - - - Invalid -proxy address or hostname: '%s' - L’adresse ou le nom d’hôte -proxy est invalide : « %s » - - - Invalid P2P permission: '%s' - L’autorisation P2P est invalide : « %s » - - - Invalid amount for %s=<amount>: '%s' (must be at least %s) - Montant non valide pour %s=<amount> : '%s' (doit être au moins %s) - - - Invalid amount for %s=<amount>: '%s' - Montant non valide pour %s=<amount> : '%s' - - - Invalid amount for -%s=<amount>: '%s' - Le montant est invalide pour -%s=<amount> : « %s » - - - Invalid netmask specified in -whitelist: '%s' - Le masque réseau indiqué dans -whitelist est invalide : « %s » - - - Invalid port specified in %s: '%s' - Port non valide spécifié dans %s: '%s' - - - Invalid pre-selected input %s - Entrée présélectionnée non valide %s - - - Listening for incoming connections failed (listen returned error %s) - L'écoute des connexions entrantes a échoué ( l'écoute a renvoyé une erreur %s) - - - Loading P2P addresses… - Chargement des adresses P2P… - - - Loading banlist… - Chargement de la liste d’interdiction… - - - Loading block index… - Chargement de l’index des blocs… - - - Loading wallet… - Chargement du porte-monnaie… - - - Maximum transaction weight must be between %d and %d - Le poids maximal de la transaction doit être compris entre %d et %d - - - Missing amount - Le montant manque - - - Missing solving data for estimating transaction size - Il manque des données de résolution pour estimer la taille de la transaction - - - Need to specify a port with -whitebind: '%s' - Un port doit être indiqué avec -whitebind : « %s » - - - No addresses available - Aucune adresse n’est disponible - - - Not found pre-selected input %s - Entrée présélectionnée introuvable %s - - - Not solvable pre-selected input %s - Entrée présélectionnée non solvable %s - - - Only direction was set, no permissions: '%s' - Seule la direction a été définie, sans permissions : « %s » - - - Prune cannot be configured with a negative value. - L’élagage ne peut pas être configuré avec une valeur négative - - - Prune mode is incompatible with -txindex. - Le mode élagage n’est pas compatible avec -txindex - - - Pruning blockstore… - Élagage du magasin de blocs… - - - Reducing -maxconnections from %d to %d, because of system limitations. - Réduction de -maxconnections de %d à %d, due aux restrictions du système. - - - Replaying blocks… - Relecture des blocs… - - - Rescanning… - Réanalyse… - - - SQLiteDatabase: Failed to execute statement to verify database: %s - SQLiteDatabase : échec d’exécution de l’instruction pour vérifier la base de données : %s - - - SQLiteDatabase: Failed to prepare statement to verify database: %s - SQLiteDatabase : échec de préparation de l’instruction pour vérifier la base de données : %s - - - SQLiteDatabase: Failed to read database verification error: %s - SQLiteDatabase : échec de lecture de l’erreur de vérification de la base de données : %s - - - SQLiteDatabase: Unexpected application id. Expected %u, got %u - SQLiteDatabase : l’ID de l’application est inattendu. %u attendu, %u retourné - - - Section [%s] is not recognized. - La section [%s] n’est pas reconnue - - - Signer did not echo address - Le signataire n’a pas fait écho à l’adresse - - - Signer echoed unexpected address %s - Le signataire a renvoyé une adresse inattendue %s - - - Signer returned error: %s - Le signataire a renvoyé une erreur : %s - - - Signing transaction failed - Échec de signature de la transaction - - - Specified -walletdir "%s" does not exist - Le -walletdir indiqué « %s » n’existe pas - - - Specified -walletdir "%s" is a relative path - Le -walletdir indiqué « %s » est un chemin relatif - - - Specified -walletdir "%s" is not a directory - Le -walletdir indiqué « %s » n’est pas un répertoire - - - Specified blocks directory "%s" does not exist. - Le répertoire des blocs indiqué « %s » n’existe pas - - - Specified data directory "%s" does not exist. - Le répertoire de données spécifié "%s" n'existe pas. - - - Starting network threads… - Démarrage des processus réseau… - - - System error while flushing: %s - Erreur système lors du vidage : %s - - - System error while loading external block file: %s - Erreur système lors du chargement d’un fichier de blocs externe : %s - - - System error while saving block to disk: %s - Erreur système lors de l’enregistrement du bloc sur le disque : %s - - - The source code is available from %s. - Le code source est publié sur %s. - - - The specified config file %s does not exist - Le fichier de configuration indiqué %s n’existe pas - - - The transaction amount is too small to pay the fee - Le montant de la transaction est trop bas pour que les frais soient payés - - - The transactions removal process can only be executed within a db txn - Le processus de suppression des transactions ne peut être exécuté que dans une transaction .de base de données - - - The wallet will avoid paying less than the minimum relay fee. - Le porte-monnaie évitera de payer moins que les frais minimaux de relais. - - - There is no ScriptPubKeyManager for this address - Il n’y a pas de « ScriptPubKeyManager » pour cette adresse. - - - This is experimental software. - Ce logiciel est expérimental. - - - This is the minimum transaction fee you pay on every transaction. - Il s’agit des frais minimaux que vous payez pour chaque transaction. - - - This is the transaction fee you will pay if you send a transaction. - Il s’agit des frais minimaux que vous payerez si vous envoyez une transaction. - - - Transaction %s does not belong to this wallet - La transaction %s n’appartient pas à ce porte-monnaie - - - Transaction amount too small - Le montant de la transaction est trop bas - - - Transaction amounts must not be negative - Les montants des transactions ne doivent pas être négatifs - - - Transaction change output index out of range - L’index des sorties de monnaie des transactions est hors échelle - - - Transaction must have at least one recipient - La transaction doit comporter au moins un destinataire - - - Transaction needs a change address, but we can't generate it. - Une adresse de monnaie est nécessaire à la transaction, mais nous ne pouvons pas la générer. - - - Transaction too large - La transaction est trop grosse - - - Unable to bind to %s on this computer (bind returned error %s) - Impossible de se lier à %s sur cet ordinateur (la liaison a retourné l’erreur %s) - - - Unable to bind to %s on this computer. %s is probably already running. - Impossible de se lier à %s sur cet ordinateur. %s fonctionne probablement déjà - - - Unable to create the PID file '%s': %s - Impossible de créer le fichier PID « %s » : %s - - - Unable to find UTXO for external input - Impossible de trouver l'UTXO pour l'entrée externe - - - Unable to generate initial keys - Impossible de générer les clés initiales - - - Unable to generate keys - Impossible de générer les clés - - - Unable to open %s for writing - Impossible d’ouvrir %s en écriture - - - Unable to parse -maxuploadtarget: '%s' - Impossible d’analyser -maxuploadtarget : « %s » - - - Unable to start HTTP server. See debug log for details. - Impossible de démarrer le serveur HTTP. Consulter le journal de débogage pour plus de précisions. - - - Unable to unload the wallet before migrating - Impossible de vider le portefeuille avant la migration - - - Unknown -blockfilterindex value %s. - La valeur -blockfilterindex %s est inconnue. - - - Unknown address type '%s' - Le type d’adresse « %s » est inconnu - - - Unknown change type '%s' - Le type de monnaie « %s » est inconnu - - - Unknown network specified in -onlynet: '%s' - Un réseau inconnu est indiqué dans -onlynet : « %s » - - - Unknown new rules activated (versionbit %i) - Les nouvelles règles inconnues sont activées (versionbit %i) - - - Unrecognised option "%s" provided in -test=<option>. - Une option non reconnue « %s » a été indiquée dans -test=<option>. - - - Unsupported global logging level %s=%s. Valid values: %s. - Niveau de journalisation global non pris en charge %s=%s. Valeurs valides : %s. - - - Wallet file creation failed: %s - Échec de création du fichier du porte-monnaie : %s - - - acceptstalefeeestimates is not supported on %s chain. - acceptstalefeeestimates n'est pas pris en charge sur la chaîne %s. - - - Unsupported logging category %s=%s. - La catégorie de journalisation %s=%s n’est pas prise en charge - - - Do you want to rebuild the databases now? - Voulez-vous reconstruire les bases de données maintenant ? - - - Error: Could not add watchonly tx %s to watchonly wallet - Erreur : Impossible d’ajouter la transaction juste-regarder %s au portefeuille juste-regarder - - - Error: Could not delete watchonly transactions. - Erreur : Impossible d’effacer les transactions juste-regarder. - - - Error: Wallet does not exist - Erreur : Le portemonnaie n’existe pas - - - Error: cannot remove legacy wallet records - Erreur : Impossible de supprimer les enregistrements d’anciens portemonnaies - - - Not enough file descriptors available. %d available, %d required. - Trop peu de descripteurs de fichiers sont proposés. %d proposés, %d requis - - - User Agent comment (%s) contains unsafe characters. - Le commentaire de l’agent utilisateur (%s) comporte des caractères dangereux - - - Verifying blocks… - Vérification des blocs… - - - Verifying wallet(s)… - Vérification des porte-monnaie… - - - Wallet needed to be rewritten: restart %s to complete - Le porte-monnaie devait être réécrit : redémarrer %s pour terminer l’opération. - - - Settings file could not be read - Impossible de lire le fichier des paramètres - - - Settings file could not be written - Impossible d’écrire le fichier de paramètres - - - \ No newline at end of file diff --git a/src/qt/locale/bitcoin_hi.ts b/src/qt/locale/bitcoin_hi.ts index be431c33b37..19fe178d499 100644 --- a/src/qt/locale/bitcoin_hi.ts +++ b/src/qt/locale/bitcoin_hi.ts @@ -286,10 +286,40 @@ Signing is only possible with addresses of the type 'legacy'. unknown अनजान + + Embedded "%1" + अंतर्निहित "%1" + + + Default system font "%1" + डिफ़ॉल्ट सिस्टम फोंट "%1" + + + Custom… + पसंद के अनुसार + Amount राशि + + Onion + network name + Name of Tor network in peer info + अनियन + + + I2P + network name + Name of I2P network in peer info + आई२पी + + + CJDNS + network name + Name of CJDNS network in peer info + सीजेडीएनएस + %n second(s) @@ -675,6 +705,10 @@ The migration process will create a backup of the wallet before migrating. This You are one step away from creating your new wallet! आपके नए बटवे के निर्माण से आप सिर्फ एक कदम दूर है + + Please provide a name and, if desired, enable any advanced options + कृपया एक नाम प्रदान करें और अगर जरूरत हो तो किसी अन्य उच्च विकल्प को सक्षम करें + Intro @@ -727,9 +761,17 @@ The migration process will create a backup of the wallet before migrating. This Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins! %1 संगत स्क्रिप्ट का पूर्ण पथ (उदा. C:\Downloads\hwi.exe या /Users/you/Downloads/hwi.py). सावधान: मैलवेयर आपके सिक्के चुरा सकता है! + + Font in the Overview tab: + ओवरव्यू टैब का फोंट + PSBTOperationsDialog + + PSBT Operations + पीएसबीटी संचालन + Save Transaction Data लेन-देन डेटा सहेजें @@ -739,6 +781,10 @@ The migration process will create a backup of the wallet before migrating. This Expanded name of the binary PSBT file format. See: BIP 174. आंशिक रूप से हस्ताक्षरित लेनदेन (बाइनरी) + + Sends %1 to %2 + %1 को %2 के पास भेजता है + own address खुद का पता @@ -822,6 +868,14 @@ The migration process will create a backup of the wallet before migrating. This Number of connections कनेक्शन की संख्या + + Local Addresses + स्थानीय पते + + + Network addresses that your Bitcoin node is currently using to communicate with other nodes. + नेटवर्क पते जो आपका बिटकॉइन नोड वर्तमान में अन्य नोड्स के साथ संचार करने के लिए उपयोग कर रहा है। + Block chain ब्लॉक चेन @@ -870,6 +924,14 @@ The migration process will create a backup of the wallet before migrating. This Select a peer to view detailed information. विस्तृत जानकारी देखने के लिए किसी सहकर्मी का चयन करें। + + Hide Peers Detail + पियर विवरण छिपाएँ + + + Transport + परिवहन + Version संस्करण @@ -1280,6 +1342,14 @@ For more information on using this console, type %6. Copy &amount कॉपी &अमाउंट + + Not recommended due to higher fees and less protection against typos. + उच्च शुल्क और टाइपिंग त्रुटियों के प्रति कम सुरक्षा के कारण इसकी अनुशंसा नहीं की जाती। + + + Generates an address compatible with older wallets. + पुराने वॉलेट के साथ संगत पता बनाता है। + Could not generate new %1 address नया पता उत्पन्न नहीं कर सका %1 diff --git a/src/qt/locale/bitcoin_hu.ts b/src/qt/locale/bitcoin_hu.ts index 3add3b3c06a..de4793f2fce 100644 --- a/src/qt/locale/bitcoin_hu.ts +++ b/src/qt/locale/bitcoin_hu.ts @@ -1589,6 +1589,11 @@ A migrációs folyamat készít biztonsági mentést a tárcáról migrálás el Enabling pruning significantly reduces the disk space required to store transactions. All blocks are still fully validated. Reverting this setting requires re-downloading the entire blockchain. A tárolt blokkok számának ritkításával jelentősen csökken a tranzakció történet tárolásához szükséges tárhely. Minden blokk továbbra is érvényesítve lesz. Ha ezt a beállítást később törölni szeretné újra le kell majd tölteni a teljes blokkláncot. + + Maximum database cache size. Make sure you have enough RAM. A larger cache can contribute to faster sync, after which the benefit is less pronounced for most use cases. Lowering the cache size will reduce memory usage. Unused mempool memory is shared for this cache. + Tooltip text for Options window setting that sets the size of the database cache. Explains the corresponding effects of increasing/decreasing this value. + Adatbázis gyorsítótár maximális mérete. Győződjön meg róla, hogy van elég RAM. Nagyobb gyorsítótár gyorsabb szinkronizálást eredményez utána viszont az előnyei kevésbé számottevők. A gyorsítótár méretének csökkentése a memóriafelhasználást is mérsékli. A használaton kívüli mempool memória is osztozik ezen a táron. + Size of &database cache A&datbázis gyorsítótár mérete @@ -1601,6 +1606,14 @@ A migrációs folyamat készít biztonsági mentést a tárcáról migrálás el Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins! Teljes elérési útvonal a %1 kompatibilis szkripthez (pl. C:\Downloads\hwi.exe vagy /Users/felhasznalo/Downloads/hwi.py). Vigyázat: rosszindulatú programok ellophatják az érméit! + + Automatically open the Bitcoin client port on the router. This only works when your router supports PCP or NAT-PMP and it is enabled. The external port could be random. + A Bitcoin kliens port automatikus megnyitása a routeren. Ez csak akkor működik, ha a router támogatja a PCP-t vagy NAT-PMP-t és engedélyezve is van. A külső port lehet véletlenszerűen választott. + + + Map port using PCP or NA&T-PMP + Külső port megnyitása PCP-vel vagy NA&T-PMP-vel + IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1) A proxy IP címe (pl.: IPv4: 127.0.0.1 / IPv6: ::1) @@ -4176,6 +4189,10 @@ A "Fájl > Tárca megnyitása" menüben tölthet be egyet. No wallet file format provided. To use createfromdump, -format=<format> must be provided. Nincs tárca fájlformátum megadva. A createfromdump használatához -format=<format> megadása kötelező. + + Option '-upnp' is set but UPnP support was dropped in version 29.0. Consider using '-natpmp' instead. + Az '-upnp' kapcsoló beállítva, de az UPnP támogatás megszűnt a 29.0 verzióval. Kérjük használja a '-natpmp' kapcsolót. + Please contribute if you find %s useful. Visit %s for further information about the software. Kérjük támogasson, ha hasznosnak találta a %s-t. Az alábbi linken további információt találhat a szoftverről: %s. @@ -4284,6 +4301,10 @@ A "Fájl > Tárca megnyitása" menüben tölthet be egyet. -maxmempool must be at least %d MB -maxmempool legalább %d MB kell legyen. + + Cannot obtain a lock on directory %s. %s is probably already running. + Nem zárolható ez a könyvtár: %s. A %s valószínűleg fut már. + Cannot resolve -%s address: '%s' -%s cím feloldása nem sikerült: '%s' @@ -4386,6 +4407,10 @@ A "Fájl > Tárca megnyitása" menüben tölthet be egyet. Rename of '%s' -> '%s' failed. Cannot clean up the background chainstate leveldb directory. Nem sikerült az '%s' -> '%s' átnevezés. Nem lehet kitisztítani a háttér láncállapot leveldb könyvtárat. + + Specified -blockmaxweight (%d) exceeds consensus maximum block weight (%d) + A megadott -blockmaxweight (%d) meghaladja a konszenzus maximum blokk súlyt (%d) + The combination of the pre-selected inputs and the wallet automatic inputs selection exceeds the transaction maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs Az előre kiválasztott bemenetek és a tárca automatikus bemeneteinek kombinációja meghaladja a maximális tranzakciós súlyt. Kérjük próbáljon kisebb összeget küldeni vagy kézzel egyesítse a tárca UTXO-it. @@ -4540,6 +4565,10 @@ A tárca biztonsági mentésének visszaállítása sikertelen. Error opening block database Hiba a blokk-adatbázis megnyitása közben. + + Error opening coins database + Hiba az érme-adatbázis megnyitása közben + Error reading configuration file: %s Hiba a konfigurációs fájl olvasása közben: %s @@ -5048,6 +5077,10 @@ A tárca biztonsági mentésének visszaállítása sikertelen. Unsupported logging category %s=%s. Nem támogatott naplózási kategória %s=%s + + Do you want to rebuild the databases now? + Újra akarja építeni az adatbázisokat most? + Error: Could not add watchonly tx %s to watchonly wallet Hiba: Nem sikerült hozzáadni a megfigyelt %s tranzakciót a figyelő tárcához @@ -5056,6 +5089,14 @@ A tárca biztonsági mentésének visszaállítása sikertelen. Error: Could not delete watchonly transactions. Hiba: Nem lehet törölni csak megfigyelt tranzakciókat. + + Error: Wallet does not exist + Hiba: Tárca nem létezik + + + Error: cannot remove legacy wallet records + Hiba: nem lehet eltávolítani a régi típusú tárca bejegyzéseit + User Agent comment (%s) contains unsafe characters. A felhasználói ügynök megjegyzés (%s) veszélyes karaktert tartalmaz. diff --git a/src/qt/locale/bitcoin_it.ts b/src/qt/locale/bitcoin_it.ts index f15d363a470..7946c67e5a0 100644 --- a/src/qt/locale/bitcoin_it.ts +++ b/src/qt/locale/bitcoin_it.ts @@ -572,7 +572,7 @@ E' possibile firmare solo con indirizzi di tipo "legacy". Syncing Headers (%1%)… - Sincronizzazione Intestazioni in corso (1%1%)... + Sincronizzazione Intestazioni in corso (%1%)... Synchronizing with network… diff --git a/src/qt/locale/bitcoin_kn.ts b/src/qt/locale/bitcoin_kn.ts index 1ef8b69c2c0..fd047e939ef 100644 --- a/src/qt/locale/bitcoin_kn.ts +++ b/src/qt/locale/bitcoin_kn.ts @@ -728,6 +728,18 @@ Signing is only possible with addresses of the type 'legacy'.     + + Specified -blockmaxweight (%d) exceeds consensus maximum block weight (%d) + ನಿರ್ದಿಷ್ಟ -ಬ್ಲಾಕ್‌ಮ್ಯಾಕ್ಸ್‌ವೈಟ್ (%d) ಸಮ್ಮತಿಯ ಗರಿಷ್ಠ ಬ್ಲಾಕ್ ತೂಕವನ್ನು (%d) ಮೀರಿದೆ + + + Specified -blockreservedweight (%d) exceeds consensus maximum block weight (%d) + ನಿರ್ದಿಷ್ಟ -ಬ್ಲಾಕ್‌ರಿಸರ್ವ್ಡ್‌ವೈಟ್ (%d) ಸಮ್ಮತಿಯ ಗರಿಷ್ಠ ಬ್ಲಾಕ್ ತೂಕವನ್ನು (%d) ಮೀರಿದೆ + + + Specified -blockreservedweight (%d) is lower than minimum safety value of (%d) + ನಿರ್ದಿಷ್ಟ -ಬ್ಲಾಕ್‌ರಿಸರ್ವ್ಡ್‌ವೈಟ್ (%d) ಕನಿಷ್ಠ ಸುರಕ್ಷತಾ ಮೌಲ್ಯಕ್ಕಿಂತ (%d) ಕಡಿಮೆಯಾಗಿದೆ + The wallet will avoid paying less than the minimum relay fee. ನೆಲೆಯ ರೆಲೇ ಶುಲ್ಕದಿಂದ ಕಡಿಮೆ ಶುಲ್ಕವನ್ನು ಕೊಡದಂತೆ ವಾಲೆಟ್ ನುಡಿಮುಟ್ಟುವುದು. diff --git a/src/qt/locale/bitcoin_ko.ts b/src/qt/locale/bitcoin_ko.ts index 2337ac42a0d..c62775b8aa7 100644 --- a/src/qt/locale/bitcoin_ko.ts +++ b/src/qt/locale/bitcoin_ko.ts @@ -2471,7 +2471,7 @@ BIP70의 광범위한 보안 결함으로 인해 모든 가맹점에서는 지 Outbound Manual: added using RPC %1 or %2/%3 configuration options Explanatory text for an outbound peer connection that was established manually through one of several methods. The numbered arguments are stand-ins for the methods available to establish manual connections. - 아웃바운드 매뉴얼 : RPC 1%1 이나 2%2/3%3 을 사용해서 환경설정 옵션을 추가 + 아웃바운드 매뉴얼 : RPC %1 이나 %2/%3 을 사용해서 환경설정 옵션을 추가 Outbound Feeler: short-lived, for testing addresses @@ -2555,12 +2555,12 @@ For more information on using this console, type %6. %7WARNING: Scammers have been active, telling users to type commands here, stealing their wallet contents. Do not use this console without fully understanding the ramifications of a command.%8 RPC console welcome message. Placeholders %7 and %8 are style tags for the warning content, and they are not space separated from the rest of the text intentionally. - 1%1 RPC 콘솔에 오신 것을 환영합니다. -위쪽 및 아래쪽 화살표를 사용하여 기록 탐색을하고 2%2를 사용하여 화면을 지우세요. -3%3과 4%4을 사용하여 글꼴 크기 증가 또는 감소하세요 -사용 가능한 명령의 개요를 보려면 5%5를 입력하십시오. -이 콘솔 사용에 대한 자세한 내용을 보려면 6%6을 입력하십시오. -7%7 경고: 사기꾼들은 사용자들에게 여기에 명령을 입력하라고 말하고 활발히 금품을 훔칩니다. 완전히 이해하지 않고 이 콘솔을 사용하지 마십시오. 8%8 + %1 RPC 콘솔에 오신 것을 환영합니다. +위쪽 및 아래쪽 화살표를 사용하여 기록 탐색을하고 %2를 사용하여 화면을 지우세요. +%3과 %4을 사용하여 글꼴 크기 증가 또는 감소하세요 +사용 가능한 명령의 개요를 보려면 %5를 입력하십시오. +이 콘솔 사용에 대한 자세한 내용을 보려면 %6을 입력하십시오. +%7 경고: 사기꾼들은 사용자들에게 여기에 명령을 입력하라고 말하고 활발히 금품을 훔칩니다. 완전히 이해하지 않고 이 콘솔을 사용하지 마십시오. %8 Executing… diff --git a/src/qt/locale/bitcoin_ml.ts b/src/qt/locale/bitcoin_ml.ts index 15cb5e8cfa6..9b732a3dacd 100644 --- a/src/qt/locale/bitcoin_ml.ts +++ b/src/qt/locale/bitcoin_ml.ts @@ -178,6 +178,14 @@ Signing is only possible with addresses of the type 'legacy'. Enter the old passphrase and new passphrase for the wallet. വാലെറ്റിന്റെ പഴയ രഹസ്യപദവും പുതിയ രഹസ്യപദവും നൽകുക. + + Continue + തുടരുക + + + Back + മടങ്ങിപ്പോവുക + Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer. നിങ്ങളുടെ വാലറ്റ് എൻ‌ക്രിപ്റ്റ് ചെയ്യുന്നതിലൂടെ നിങ്ങളുടെ കമ്പ്യൂട്ടറിനെ ബാധിക്കുന്ന ക്ഷുദ്രവെയർ‌ മോഷ്ടിക്കുന്നതിൽ‌ നിന്നും നിങ്ങളുടെ ബിറ്റ്കോയിനുകളെ പൂർണ്ണമായി സംരക്ഷിക്കാൻ‌ കഴിയില്ല. @@ -482,6 +490,14 @@ Signing is only possible with addresses of the type 'legacy'. Close Wallet… വാലറ്റ് അടയ്ക്കുക + + Create Wallet… + വാലറ്റ് സൃഷ്ടിക്കുക + + + Close All Wallets… + എല്ലാ വാലറ്റുകളും അടയ്ക്കുക + &File & ഫയൽ @@ -502,6 +518,10 @@ Signing is only possible with addresses of the type 'legacy'. Synchronizing with network… നെറ്റ്‌വർക്കുമായി സമന്വയിപ്പിക്കുന്നു... + + Connecting to peers… + സമപ്രായക്കാരുമായി ബന്ധിപ്പിക്കുന്നു... + Request payments (generates QR codes and bitcoin: URIs) പേയ്‌മെന്റുകൾ അഭ്യർത്ഥിക്കുക (QR കോഡുകളും ബിറ്റ്കോയിനും സൃഷ്ടിക്കുന്നു: URI- കൾ) @@ -598,6 +618,10 @@ Signing is only possible with addresses of the type 'legacy'. Close all wallets എല്ലാ വാലറ്റുകളും അടയ്‌ക്കുക ... + + Migrate Wallet + വാലറ്റ് മൈഗ്രേറ്റ് ചെയ്യുക + Show the %1 help message to get a list with possible Bitcoin command-line options സാധ്യമായ ബിറ്റ്കോയിൻ കമാൻഡ്-ലൈൻ ഓപ്ഷനുകളുള്ള ഒരു ലിസ്റ്റ് ലഭിക്കുന്നതിന് %1 സഹായ സന്ദേശം കാണിക്കുക @@ -614,6 +638,11 @@ Signing is only possible with addresses of the type 'legacy'. No wallets available വാലറ്റ് ഒന്നും ലഭ്യം അല്ല + + Wallet Data + Name of the wallet data file format. + വാലറ്റ് അടിസ്ഥാനവിവരം + Load Wallet Backup The title for Restore Wallet File Windows @@ -862,6 +891,13 @@ Signing is only possible with addresses of the type 'legacy'. വാലറ്റ് രൂപീകരണത്തിലെ മുന്നറിയിപ്പ് + + MigrateWalletActivity + + Migrate Wallet + വാലറ്റ് മൈഗ്രേറ്റ് ചെയ്യുക + + OpenWalletActivity @@ -1081,6 +1117,10 @@ Signing is only possible with addresses of the type 'legacy'. &Window &ജാലകം + + Continue + തുടരുക + Error പിശക് @@ -1490,6 +1530,11 @@ Signing is only possible with addresses of the type 'legacy'. Export the data in the current tab to a file നിലവിലുള്ള ടാബിലെ വിവരങ്ങൾ ഒരു ഫയലിലേക്ക് എക്സ്പോർട്ട് ചെയ്യുക + + Wallet Data + Name of the wallet data file format. + വാലറ്റ് അടിസ്ഥാനവിവരം + bitcoin-core diff --git a/src/qt/locale/bitcoin_ne.ts b/src/qt/locale/bitcoin_ne.ts index 5c08b545569..2fb6abc6548 100644 --- a/src/qt/locale/bitcoin_ne.ts +++ b/src/qt/locale/bitcoin_ne.ts @@ -184,6 +184,14 @@ Signing is only possible with addresses of the type 'legacy'. Enter the old passphrase and new passphrase for the wallet. वालेटको लागि पुरानो पासफ्रेज र नयाँ पासफ्रेज प्रविष्ट गर्नुहोस्। + + Continue + जारी राख्नुहोस् + + + Back + फिर्ता जानुहोस् + Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer. याद गर्नुहोस् कि तपाईको वालेट इन्क्रिप्ट गर्नाले तपाईको बिटकोइनलाई तपाईको कम्प्युटरमा मालवेयरले चोरी हुनबाट पूर्णतया सुरक्षित गर्न सक्दैन। @@ -282,6 +290,11 @@ Signing is only possible with addresses of the type 'legacy'. Explanatory text shown on startup when the settings file cannot be read. Prompts user to make a choice between resetting or aborting. के तपाइँ पूर्वनिर्धारित मानहरूमा सेटिङहरू रिसेट गर्न चाहनुहुन्छ, वा परिवर्तन नगरी रद्द गर्न चाहनुहुन्छ? + + A fatal error occurred. Check that settings file is writable, or try running with -nosettings. + Explanatory text shown on startup when the settings file could not be written. Prompts user to check that we have the ability to write to the file. Explains that the user has the option of running without a settings file. + एउटा ठूलो त्रुटि भयो। सेटिङ फाइल लेख्न मिल्छ कि मिल्दैन जाँच गर्नुहोस्, वा -nosettings लेखेर चलाउने प्रयास गर्नुहोस्। + Error: %1 त्रुटि: %1 @@ -684,6 +697,10 @@ Signing is only possible with addresses of the type 'legacy'. &OK &ठिक छ + + Continue + जारी राख्नुहोस् + OverviewPage diff --git a/src/qt/locale/bitcoin_pl.ts b/src/qt/locale/bitcoin_pl.ts index 3f9496981c4..900c3e29490 100644 --- a/src/qt/locale/bitcoin_pl.ts +++ b/src/qt/locale/bitcoin_pl.ts @@ -57,19 +57,49 @@ C&hoose Wybierz + + These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins. + To są twoje adresy Bitcoin do wysyłania płatności. Zawsze sprawdzaj kwotę oraz adres odbiorczy przed wysłaniem monet. + These are your Bitcoin addresses for receiving payments. Use the 'Create new receiving address' button in the receive tab to create new addresses. Signing is only possible with addresses of the type 'legacy'. To są twoje adresy Bitcoin do otrzymywania płatności. Użyj przycisku 'Utwórz nowy adres odbioru' na karcie odbioru, aby utworzyć nowe adresy. Podpisywanie jest możliwe tylko z adresami typu 'legacy'. + + &Copy Address + &Skopiuj adres + + + Copy &Label + Skopiuj &etykietę + + + &Edit + &Edytuj + + + Export Address List + Eksportuj listę adresów + + + Comma separated file + Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values. + Plik rozdzielany przecinkami + + + There was an error trying to save the address list to %1. Please try again. + An error message. %1 is a stand-in argument for the name of the file we attempted to save to. + Wystąpił błąd podczas próby zapisania listy adresów do %1. Spróbuj ponownie. + Sending addresses - %1 Wysyłające adresy - %1 Receiving addresses - %1 - Odbierające adresy - %1 + Adresy odbiorcze - %1 Exporting Failed @@ -95,11 +125,11 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'. AskPassphraseDialog Passphrase Dialog - Okienko Hasła + Okienko Hasła Enter passphrase - Wpisz hasło + Wpisz hasło New passphrase @@ -107,16 +137,24 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'. Repeat new passphrase - Powtórz nowe hasło + Powtórz nowe hasło Show passphrase - Pokaż hasło + Pokaż hasło Encrypt wallet Zaszyfruj portfel + + This operation needs your wallet passphrase to unlock the wallet. + Ta operacja wymaga hasła do twojego portfela, aby go odblokować. + + + Unlock wallet + Odblokuj portfel + Change passphrase Zmień hasło @@ -127,7 +165,7 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'. Warning: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! - hasłoOstrzeżenie: Jeśli zaszyfrujesz swój portfel i zgubisz hasło - <b>STRACISZ WSZYSTKIE SWOJE BITCONY</b>! + Uwaga: Jeśli zaszyfrujesz swój portfel i zgubisz swoje hasło, <b>STRACISZ WSZYSTKIE SWOJE BITCOINY</b>! Are you sure you wish to encrypt your wallet? @@ -159,7 +197,7 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'. Wallet to be encrypted - Portfel do zaszyfrowania + Portfel do zaszyfrowania Your wallet is about to be encrypted. @@ -222,22 +260,22 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'. Banned Until - Blokada do + Zablokowany do BitcoinApplication Settings file %1 might be corrupt or invalid. - Plik ustawień 1%1 może być uszkodzony lub nieprawidłowy + Plik ustawień %1 może być uszkodzony lub nieprawidłowy Runaway exception - Błąd zapisu do portfela + Nieobsługiwany wyjątek A fatal error occurred. %1 can no longer continue safely and will quit. - Wystąpił fatalny błąd. %1 nie może być kontynuowany i zostanie zakończony. + Wystąpił krytyczny błąd. %1 nie może już bezpiecznie kontynuować i zostanie zamknięty. Internal error @@ -324,7 +362,7 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'. Feeler Short-lived peer connection type that tests the aliveness of known addresses. - Szczelinomierz + Połączenie testowe Address Fetch @@ -343,7 +381,7 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'. %n second(s) %n sekunda - %n sekund + %n sekundy %n sekund @@ -351,7 +389,7 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'. %n minute(s) %n minuta - %n minut + %n minuty %n minut @@ -359,7 +397,7 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'. %n hour(s) %n godzina - %n godzin + %n godziny %n godzin @@ -376,7 +414,7 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'. %n tydzień %n tygodnie - %n tygodnie + %n tygodni @@ -388,7 +426,7 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'. %n rok %n lata - %n lata + %n lat @@ -521,7 +559,7 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'. &Load PSBT from file… - Wczytaj PSBT z pliku... + &Wczytaj PSBT z pliku... Open &URI… @@ -533,7 +571,7 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'. Create Wallet… - Utwórz portfel... + Stwórz portfel... Close All Wallets… @@ -577,7 +615,7 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'. Request payments (generates QR codes and bitcoin: URIs) - Zażądaj płatności (wygeneruj QE code i bitcoin: URI) + Zażądaj płatności (generuje kody QR i URI bitcoin:) Show the list of used sending addresses and labels @@ -595,8 +633,8 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'. Processed %n block(s) of transaction history. Przetworzono %n blok historii transakcji. - Przetworzono 1%n bloków historii transakcji. - Przetworzono 1%n bloków historii transakcji. + Przetworzono %n bloki historii transakcji. + Przetworzono %n bloków historii transakcji. @@ -657,7 +695,7 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'. &Receiving addresses - &Adresy odbioru + &Adresy odbiorcze Open a bitcoin: URI @@ -699,7 +737,7 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'. Show the %1 help message to get a list with possible Bitcoin command-line options - Pokaż pomoc %1 aby zobaczyć listę wszystkich opcji lnii poleceń. + Pokaż pomoc dla %1 aby zobaczyć listę możliwych opcji linii poleceń &Mask values @@ -753,12 +791,16 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'. &Hide &Ukryj + + S&how + &Wyświetl + %n active connection(s) to Bitcoin network. A substring of the tooltip. %n aktywne połączenie z siecią Bitcoin. - %n aktywnych połączeń z siecią Bitcoin. + %n aktywne połączenia z siecią Bitcoin. %n aktywnych połączeń z siecią Bitcoin. @@ -942,11 +984,11 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'. Confirmed - Potwerdzone + Potwierdzone Copy amount - Kopiuj kwote + Skopiuj kwotę &Copy address @@ -958,7 +1000,7 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'. Copy &amount - Kopiuj kwotę + Skopiuj &kwotę Copy transaction &ID and output index @@ -978,7 +1020,7 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'. Copy fee - Skopiuj prowizję + Skopiuj opłatę Copy after fee @@ -986,7 +1028,7 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'. Copy bytes - Skopiuj ilość bajtów + Skopiuj bajty Copy change @@ -1018,7 +1060,7 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'. Create Wallet Title of window indicating the progress of creation of a new wallet. - Stwórz potrfel + Stwórz portfel Creating Wallet <b>%1</b>… @@ -1027,7 +1069,7 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'. Create wallet failed - Nieudane tworzenie potrfela + Utworzenie portfela nie powiodło się Create wallet warning @@ -1114,7 +1156,7 @@ Proces migracji utworzy kopię zapasową portfela przed migracją. Plik kopii za Open wallet warning - Ostrzeżenie przy otworzeniu potrfela + Ostrzeżenie podczas otwierania portfela Open Wallet @@ -1182,7 +1224,7 @@ Proces migracji utworzy kopię zapasową portfela przed migracją. Plik kopii za CreateWalletDialog Create Wallet - Stwórz potrfel + Stwórz portfel You are one step away from creating your new wallet! @@ -1243,7 +1285,7 @@ Proces migracji utworzy kopię zapasową portfela przed migracją. Plik kopii za Compiled without external signing support (required for external signing) "External signing" means using devices such as hardware wallets. - Skompilowany bez obsługi podpisywania zewnętrznego (wymagany do podpisywania zewnętrzengo) + Skompilowany bez obsługi podpisywania zewnętrznego (wymagany do podpisywania zewnętrznego) @@ -1274,7 +1316,7 @@ Proces migracji utworzy kopię zapasową portfela przed migracją. Plik kopii za Edit receiving address - Zmień adres odbioru + Zmień adres odbiorczy Edit sending address @@ -1510,11 +1552,11 @@ Proces migracji utworzy kopię zapasową portfela przed migracją. Plik kopii za %1 is currently syncing. It will download headers and blocks from peers and validate them until reaching the tip of the block chain. - %1 jest w trakcie synchronizacji. Trwa pobieranie i weryfikacja nagłówków oraz bloków z sieci w celu uzyskania aktualnego stanu łańcucha. + %1 jest w trakcie synchronizacji. Będzie pobierał oraz weryfikował nagłówki i bloki z sieci w celu uzyskania aktualnego stanu łańcucha. Unknown. Syncing Headers (%1, %2%)… - nieznany, Synchronizowanie nagłówków (1%1, 2%2%) + nieznany, Synchronizowanie nagłówków (%1, %2%) Unknown. Pre-syncing Headers (%1, %2%)… @@ -1555,6 +1597,11 @@ Proces migracji utworzy kopię zapasową portfela przed migracją. Plik kopii za Enabling pruning significantly reduces the disk space required to store transactions. All blocks are still fully validated. Reverting this setting requires re-downloading the entire blockchain. Włączenie czyszczenia znacznie zmniejsza ilość miejsca na dysku wymaganego do przechowywania transakcji. Wszystkie bloki są nadal w pełni zweryfikowane. Przywrócenie tego ustawienia wymaga ponownego pobrania całego łańcucha bloków. + + Maximum database cache size. Make sure you have enough RAM. A larger cache can contribute to faster sync, after which the benefit is less pronounced for most use cases. Lowering the cache size will reduce memory usage. Unused mempool memory is shared for this cache. + Tooltip text for Options window setting that sets the size of the database cache. Explains the corresponding effects of increasing/decreasing this value. + Maksymalna wielkość pamięci podręcznej dla bazy danych osiągnięta. Upewnij się, że masz odpowiednią ilość pamięci RAM. Większa ilość pamięci podręcznej może przyśpieszyć synchronizację, z mniejszym wpływem w większości przypadków. Zmniejszenie wielkości tej pamięci zredukuje użycie pamięci. Nieużywana pamięć mempool jest współdzielona z cache. + Size of &database cache Wielkość bufora bazy &danych @@ -1567,6 +1614,10 @@ Proces migracji utworzy kopię zapasową portfela przed migracją. Plik kopii za Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins! Pełna ścieżka do skryptu zgodnego z %1 (np. C:\Downloads\hwi.exe lub /Users/you/Downloads/hwi.py). Uwaga: złośliwe oprogramowanie może ukraść Twoje monety! + + Automatically open the Bitcoin client port on the router. This only works when your router supports PCP or NAT-PMP and it is enabled. The external port could be random. + Automatycznie przekieruj porty dla klienta Bitcoin na routerze. Ta opcja działa tylko i wyłącznie, jeżeli twój router wspiera PCP lub NAT-PMP oraz jest ono włączone. Zewnętrzny port może być losowy. + Map port using PCP or NA&T-PMP Mapuj port używając PCP lub NA&T-PMP @@ -1645,12 +1696,12 @@ Proces migracji utworzy kopię zapasową portfela przed migracją. Plik kopii za Whether to set subtract fee from amount as default or not. Tooltip text for Options window setting that sets subtracting the fee from a sending amount as default. - Czy ustawić opłatę odejmowaną od kwoty jako domyślną, czy nie. + Ustawić domyślne odejmowanie opłaty od kwoty czy nie. Subtract &fee from amount by default An Options window setting to set subtracting the fee from a sending amount as default. - Domyślnie odejmij opłatę od kwoty + Domyślnie odejmuj &opłatę od kwoty Expert @@ -1658,7 +1709,7 @@ Proces migracji utworzy kopię zapasową portfela przed migracją. Plik kopii za Enable coin &control features - Włącz funk&cje kontoli monet + Włącz funk&cje kontroli monet If you disable the spending of unconfirmed change, the change from a transaction cannot be used until that transaction has at least one confirmation. This also affects how your balance is computed. @@ -1708,7 +1759,7 @@ Proces migracji utworzy kopię zapasową portfela przed migracją. Plik kopii za Port of the proxy (e.g. 9050) - Port proxy (np. 9050) + Port serwera proxy (np. 9050) Used for reaching peers via: @@ -1768,7 +1819,7 @@ Proces migracji utworzy kopię zapasową portfela przed migracją. Plik kopii za Whether to show coin control features or not. - Wybierz pokazywanie lub nie funkcji kontroli monet. + Czy wyświetlać funkcje kontroli monet, czy nie. Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor onion services. @@ -1785,7 +1836,7 @@ Proces migracji utworzy kopię zapasową portfela przed migracją. Plik kopii za Compiled without external signing support (required for external signing) "External signing" means using devices such as hardware wallets. - Skompilowany bez obsługi podpisywania zewnętrznego (wymagany do podpisywania zewnętrzengo) + Skompilowany bez obsługi podpisywania zewnętrznego (wymagany do podpisywania zewnętrznego) default @@ -1869,7 +1920,7 @@ Proces migracji utworzy kopię zapasową portfela przed migracją. Plik kopii za Watch-only: - Tylko podglądaj: + Tylko do obserwacji: Available: @@ -1909,7 +1960,7 @@ Proces migracji utworzy kopię zapasową portfela przed migracją. Plik kopii za Your current balance in watch-only addresses - Twoje obecne saldo na podglądanym adresie + Twoje obecne saldo na adresie tylko do obserwacji Spendable: @@ -1921,15 +1972,15 @@ Proces migracji utworzy kopię zapasową portfela przed migracją. Plik kopii za Unconfirmed transactions to watch-only addresses - Niepotwierdzone transakcje na podglądanych adresach + Niepotwierdzone transakcje na adresach tylko do obserwacji Mined balance in watch-only addresses that has not yet matured - Wykopane monety na podglądanych adresach które jeszcze nie dojrzały + Saldo wydobytych monet na adresach tylko do obserwacji, które nie są jeszcze dojrzałe Current total balance in watch-only addresses - Łączna kwota na podglądanych adresach + Łączna kwota na adresach tylko do obserwacji Privacy mode activated for the Overview tab. To unmask the values, uncheck Settings->Mask values. @@ -1984,12 +2035,16 @@ Proces migracji utworzy kopię zapasową portfela przed migracją. Plik kopii za Signed transaction successfully. Transaction is ready to broadcast. - transakcja + Transakcja została podpisana pomyślnie. Transakcja jest gotowa do rozgłoszenia. Unknown error processing transaction. Nieznany błąd podczas przetwarzania transakcji. + + Transaction broadcast successfully! Transaction ID: %1 + Transakcja została rozgłoszona pomyślnie! ID transakcji: %1 + Transaction broadcast failed: %1 Nie udało się rozgłosić transakscji: %1 @@ -2053,7 +2108,7 @@ Proces migracji utworzy kopię zapasową portfela przed migracją. Plik kopii za (But this wallet cannot sign transactions.) - (Ale ten portfel nie może podipisać transakcji.) + (Ale ten portfel nie może podpisywać transakcji.) (But this wallet does not have the right keys.) @@ -2173,7 +2228,7 @@ Jeśli pojawia się ten błąd, poproś sprzedawcę o podanie URI zgodnego z BIP Resulting URI too long, try to reduce the text for label / message. - Wynikowy URI jest zbyt długi, spróbuj zmniejszyć tekst etykiety / wiadomości + Wynikowy URI jest zbyt długi, spróbuj skrócić tekst etykiety / wiadomości Error encoding URI into QR Code. @@ -2356,12 +2411,12 @@ Jeśli pojawia się ten błąd, poproś sprzedawcę o podanie URI zgodnego z BIP The total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting). Tooltip text for the Addresses Processed field in the peer details area, which displays the total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting). - Całkowita liczba adresów otrzymanych od tego węzła, które zostały przetworzone (wyklucza adresy, które zostały odrzucone ze względu na ograniczenie szybkości). + Łączna liczba adresów otrzymanych od tego węzła, które zostały przetworzone (z wyłączeniem adresów odrzuconych z powodu ograniczenia prędkości). The total number of addresses received from this peer that were dropped (not processed) due to rate-limiting. Tooltip text for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting. - Całkowita liczba adresów otrzymanych od tego węzła, które zostały odrzucone (nieprzetworzone) z powodu ograniczenia szybkości. + Łączna liczba adresów otrzymanych od tego węzła, które zostały odrzucone (nieprzetworzone) z powodu ograniczenia prędkości. Addresses Processed @@ -2371,7 +2426,7 @@ Jeśli pojawia się ten błąd, poproś sprzedawcę o podanie URI zgodnego z BIP Addresses Rate-Limited Text title for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting. - Wskaźnik-Ograniczeń Adresów + Adresy ograniczone limitem User Agent @@ -2383,7 +2438,7 @@ Jeśli pojawia się ten błąd, poproś sprzedawcę o podanie URI zgodnego z BIP Current block height - Obecna ilość bloków + Bieżąca wysokość bloku Open the %1 debug log file from the current data directory. This can take a few seconds for large log files. @@ -2423,7 +2478,7 @@ Jeśli pojawia się ten błąd, poproś sprzedawcę o podanie URI zgodnego z BIP High bandwidth BIP152 compact block relay: %1 - Kompaktowy przekaźnik blokowy BIP152 o dużej przepustowości: 1 %1 + Przekaźnik skompaktowanych bloków o wysokiej przepustowości BIP152: %1 High Bandwidth @@ -2444,7 +2499,7 @@ Jeśli pojawia się ten błąd, poproś sprzedawcę o podanie URI zgodnego z BIP Elapsed time since a novel transaction accepted into our mempool was received from this peer. Tooltip text for the Last Transaction field in the peer details area. - Czas, który upłynął od otrzymania nowej transakcji przyjętej do naszej pamięci od tego partnera. + Czas, który upłynął od otrzymania nowej transakcji przyjętej do naszego mempoola od tego partnera. Last Send @@ -2460,7 +2515,7 @@ Jeśli pojawia się ten błąd, poproś sprzedawcę o podanie URI zgodnego z BIP The duration of a currently outstanding ping. - Czas trwania nadmiarowego pingu + Czas trwania aktualnie oczekującego pinga. Ping Wait @@ -2496,7 +2551,7 @@ Jeśli pojawia się ten błąd, poproś sprzedawcę o podanie URI zgodnego z BIP Debug log file - Plik logowania debugowania + Plik dziennika debugowania Clear console @@ -2523,17 +2578,17 @@ Jeśli pojawia się ten błąd, poproś sprzedawcę o podanie URI zgodnego z BIP Outbound Block Relay: does not relay transactions or addresses Explanatory text for an outbound peer connection that relays network information about blocks and not transactions or addresses. - Outbound Block Relay: nie przekazuje transakcji ani adresów + Wychodzący przekaźnik bloków: nie przekazuje transakcji ani adresów Outbound Manual: added using RPC %1 or %2/%3 configuration options Explanatory text for an outbound peer connection that was established manually through one of several methods. The numbered arguments are stand-ins for the methods available to establish manual connections. - Outbound Manual: dodano przy użyciu opcji konfiguracyjnych RPC 1%1 lub 2%2/3%3 + Połączenie wychodzące ręczne: dodano przy użyciu opcji konfiguracyjnych RPC %1 lub %2/%3 Outbound Feeler: short-lived, for testing addresses Explanatory text for a short-lived outbound peer connection that is used to test the aliveness of known addresses. - Outbound Feeler: krótkotrwały, do testowania adresów + Wychodzące połączenie testowe: krótkotrwałe, do testowania adresów Outbound Address Fetch: short-lived, for soliciting addresses @@ -2728,7 +2783,7 @@ Aby uzyskać więcej informacji na temat używania tej konsoli wpisz %6. Requested payments history - Żądanie historii płatności + Żądana historia płatności Show the selected request (does the same as double clicking an entry) @@ -2764,7 +2819,7 @@ Aby uzyskać więcej informacji na temat używania tej konsoli wpisz %6. Copy &amount - Kopiuj kwotę + Skopiuj &kwotę Not recommended due to higher fees and less protection against typos. @@ -3034,11 +3089,11 @@ Uwaga: Ponieważ opłata jest naliczana za każdy bajt, opłata "100 satoshi za Copy amount - Kopiuj kwote + Skopiuj kwotę Copy fee - Skopiuj prowizję + Skopiuj opłatę Copy after fee @@ -3054,7 +3109,7 @@ Uwaga: Ponieważ opłata jest naliczana za każdy bajt, opłata "100 satoshi za %1 (%2 blocks) - %1 (%2 bloków)github.com + %1 (%2 bloków) Sign on device @@ -3080,7 +3135,7 @@ Uwaga: Ponieważ opłata jest naliczana za każdy bajt, opłata "100 satoshi za %1 to '%2' - %1 do '%2'8f0451c0-ec7d-4357-a370-eff72fb0685f + %1 do '%2' %1 to %2 @@ -3147,7 +3202,7 @@ Uwaga: Ponieważ opłata jest naliczana za każdy bajt, opłata "100 satoshi za Please, review your transaction. You can create and send this transaction or create a Partially Signed Bitcoin Transaction (PSBT), which you can save or copy and then sign with, e.g., an offline %1 wallet, or a PSBT-compatible hardware wallet. Text to inform a user attempting to create a transaction of their current options. At this stage, a user can send their transaction or create a PSBT. This string is displayed when both private keys and PSBT controls are enabled. - Proszę przejrzeć propozycję transakcji. Zostanie utworzona częściowo podpisana transakcja (ang. PSBT), którą można skopiować, a następnie podpisać np. offline z portfelem %1 lub z innym portfelem zgodnym z PSBT. + Proszę przejrzeć transakcję. Możesz utworzyć i wysłać tę transakcję lub utworzyć częściowo podpisaną transakcję Bitcoin (PSBT), którą możesz zapisać lub skopiować, a następnie podpisać np. offline z portfelem %1 lub z kompatybilnym sprzętowo portfelem PSBT. Please, review your transaction. @@ -3186,11 +3241,11 @@ Uwaga: Ponieważ opłata jest naliczana za każdy bajt, opłata "100 satoshi za Watch-only balance: - Kwota na obserwowanych kontach: + Saldo na kontach tylko do obserwacji: The recipient address is not valid. Please recheck. - Adres odbiorcy jest nieprawidłowy, proszę sprawić ponownie. + Adres odbiorcy jest nieprawidłowy, proszę sprawdzić ponownie. The amount to pay must be larger than 0. @@ -3219,9 +3274,9 @@ Uwaga: Ponieważ opłata jest naliczana za każdy bajt, opłata "100 satoshi za Estimated to begin confirmation within %n block(s). - Szacuje się, że potwierdzenie rozpocznie się w %n bloku. - Szacuje się, że potwierdzenie rozpocznie się w %n bloków. - Szacuje się, że potwierdzenie rozpocznie się w %n bloków. + Szacuje się, że potwierdzenie rozpocznie się w ciągu %n bloku. + Szacuje się, że potwierdzenie rozpocznie się w ciągu %n bloków. + Szacuje się, że potwierdzenie rozpocznie się w ciągu %n bloków. @@ -3253,7 +3308,7 @@ Uwaga: Ponieważ opłata jest naliczana za każdy bajt, opłata "100 satoshi za Pay &To: - Zapłać &dla: + Płatność &dla: &Label: @@ -3281,11 +3336,11 @@ Uwaga: Ponieważ opłata jest naliczana za każdy bajt, opłata "100 satoshi za The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally. - Opłata zostanie odjęta od kwoty wysyłane.Odbiorca otrzyma mniej niż bitcoins wpisz w polu kwoty. Jeśli wybrano kilku odbiorców, opłata jest podzielona równo. + Opłata zostanie odjęta od kwoty wysyłanej. Odbiorca otrzyma mniej bitcoinów, niż wpiszesz w polu kwoty. Jeśli wybrano wielu odbiorców, opłata zostanie podzielona równo. S&ubtract fee from amount - Odejmij od wysokości opłaty + Odejmij opłatę od kwoty Use available balance @@ -3495,7 +3550,7 @@ Zwróć uwagę, że poprawnie zweryfikowana wiadomość potwierdza to, że nadaw %1/unconfirmed Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents a transaction confirmed in at least one block, but less than 6 blocks. - %1/niezatwierdzone + %1/niepotwierdzone %1 confirmations @@ -3532,7 +3587,7 @@ Zwróć uwagę, że poprawnie zweryfikowana wiadomość potwierdza to, że nadaw watch-only - tylko-obserwowany + tylko do obserwacji label @@ -3706,7 +3761,7 @@ Zwróć uwagę, że poprawnie zweryfikowana wiadomość potwierdza to, że nadaw watch-only - tylko-obserwowany + tylko do obserwacji (n/a) @@ -3730,7 +3785,7 @@ Zwróć uwagę, że poprawnie zweryfikowana wiadomość potwierdza to, że nadaw Whether or not a watch-only address is involved in this transaction. - Czy adres tylko-obserwowany jest lub nie użyty w tej transakcji. + Czy w transakcji jest użyty adres tylko do obserwacji. User-defined intent/purpose of the transaction. @@ -3805,11 +3860,11 @@ Zwróć uwagę, że poprawnie zweryfikowana wiadomość potwierdza to, że nadaw Copy &amount - Kopiuj kwotę + Skopiuj &kwotę Copy transaction &ID - transakcjaSkopiuj &ID transakcji + Skopiuj &ID transakcji Copy &raw transaction @@ -3833,7 +3888,7 @@ Zwróć uwagę, że poprawnie zweryfikowana wiadomość potwierdza to, że nadaw &Edit address label - Wy&edytuj adres etykiety + Wy&edytuj etykietę adresu Show in %1 @@ -3846,11 +3901,11 @@ Zwróć uwagę, że poprawnie zweryfikowana wiadomość potwierdza to, że nadaw Confirmed - Potwerdzone + Potwierdzone Watch-only - Tylko-obserwowany + Tylko do obserwacji Date @@ -3924,7 +3979,7 @@ Przejdź do Plik > Otwórz Portfel aby wgrać portfel. PSBT file must be smaller than 100 MiB - PSBT musi być mniejsze niż 100MB + PSBT musi być mniejsze niż 100MiB Unable to decode PSBT @@ -4049,6 +4104,14 @@ Przejdź do Plik > Otwórz Portfel aby wgrać portfel. %s corrupt. Try using the wallet tool bitcoin-wallet to salvage or restoring a backup. %s jest uszkodzony. Spróbuj użyć narzędzia bitcoin-portfel, aby uratować portfel lub przywrócić kopię zapasową. + + %s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error. + %snie udało się zwalidować stanu migawki -assumeutxo. Wskazuje to na problem ze sprzętem, błąd w oprogramowaniu lub nieprawidłową modyfikacją programu, która zezwoliła na załadowanie nieprawidłowej migawki. Z tego powodu węzeł zostanie zamknięty i przestanie używać danych zbudowanych na bazie migawki, resetując wysokość łańcucha z %d do %d. Po ponownym uruchomieniu, węzeł wznowi synchronizację od %d, bez wykorzystania jakichkolwiek danych z migawki. Prosimy zgłosić ten incydent do %s, wliczając w to jak wszedłeś w posiadanie tej migawki. Nieprawidłowy stan łańcucha w oparciu o tą migawkę zostanie zachowany na dysku w przypadku, gdyby okazał się przydatny w diagnostyce problemu, który spowodował ten błąd. + + + %s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list. + %sżąda nasłuchiwania na porcie %u. Ten port jest uznany za "zły" i nie jest zbyt prawdopodobne, aby jakikolwiek węzeł połączył się do niego. Zobacz doc/p2p-bad-ports.md, aby dowiedzieć się więcej i zobaczyć pełną listę. + Cannot downgrade wallet from version %i to version %i. Wallet version unchanged. Nie można zmienić wersji portfela z wersji %ina wersje %i. Wersja portfela pozostaje niezmieniona. @@ -4071,15 +4134,19 @@ Przejdź do Plik > Otwórz Portfel aby wgrać portfel. Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet. - Błąd odczytu 1%s! Może brakować danych transakcji lub mogą być one nieprawidłowe. Ponowne skanowanie portfela. + Błąd odczytu %s! Może brakować danych transakcji lub mogą być one nieprawidłowe. Ponowne skanowanie portfela. + + + Error starting/committing db txn for wallet transactions removal process + Wystąpił błąd podczas uruchamiania/przesyłania bazy danych transakcji dla procesu usuwania transakcji w portfelu Error: Dumpfile format record is incorrect. Got "%s", expected "format". - Błąd: rekord formatu pliku zrzutu jest nieprawidłowy. Otrzymano „1%s”, oczekiwany „format”. + Błąd: rekord formatu pliku zrzutu jest nieprawidłowy. Otrzymano „%s”, oczekiwany „format”. Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s". - Błąd: rekord identyfikatora pliku zrzutu jest nieprawidłowy. Otrzymano „1%s”, oczekiwano „1%s”. + Błąd: rekord identyfikatora pliku zrzutu jest nieprawidłowy. Otrzymano „%s”, oczekiwano „%s”. Error: Dumpfile version is not supported. This version of bitcoin-wallet only supports version 1 dumpfiles. Got dumpfile with version %s @@ -4095,27 +4162,31 @@ Przejdź do Plik > Otwórz Portfel aby wgrać portfel. File %s already exists. If you are sure this is what you want, move it out of the way first. - Plik 1%s już istnieje. Jeśli jesteś pewien, że tego chcesz, najpierw usuń to z drogi. + Plik %s już istnieje. Jeśli jesteś pewien, że tego chcesz, najpierw go przenieś. Invalid or corrupt peers.dat (%s). If you believe this is a bug, please report it to %s. As a workaround, you can move the file (%s) out of the way (rename, move, or delete) to have a new one created on the next start. - Nieprawidłowy lub uszkodzony plik peers.dat (1%s). Jeśli uważasz, że to błąd, zgłoś go do 1%s. Jako obejście, możesz przenieść plik (1%s) z drogi (zmień nazwę, przenieś lub usuń), aby przy następnym uruchomieniu utworzyć nowy. + Nieprawidłowy lub uszkodzony plik peers.dat (%s). Jeśli uważasz, że to błąd, zgłoś go do %s. Jako obejście, możesz przenieść plik (%s) z drogi (zmień nazwę, przenieś lub usuń), aby przy następnym uruchomieniu utworzyć nowy. Invalid value detected for '-wallet' or '-nowallet'. '-wallet' requires a string value, while '-nowallet' accepts only '1' to disable all wallets Nieprawidłowa wartość wykryta dla '-wallet' lub '-nowallet'. '-wallet' wymaga ciągu znaków, podczas gdy '-nowallet' akceptuje jedynie '1' dla wyłączenia wszystkich portfeli + + More than one onion bind address is provided. Using %s for the automatically created Tor onion service. + Podano więcej niż jeden adres onion. Używam %s dla automatycznie utworzonej usługi Tor onion. + No dump file provided. To use createfromdump, -dumpfile=<filename> must be provided. - Nie dostarczono pliku zrzutu. Aby użyć funkcji createfromdump, należy podać -dumpfile=<filename>. + Nie podano pliku zrzutu. Aby użyć funkcji -createfromdump, należy podać -dumpfile=<filename> No dump file provided. To use dump, -dumpfile=<filename> must be provided. - Nie dostarczono pliku zrzutu. Aby użyć funkcji createfromdump, należy podać -dumpfile=1. + Nie podano pliku zrzutu. Aby go użyć, należy podać -dumpfile=<filename> No wallet file format provided. To use createfromdump, -format=<format> must be provided. - Nie dostarczono pliku zrzutu. Aby użyć funkcji createfromdump, należy podać -dumpfile=<format>. + Nie podano formatu pliku portfela. Aby użyć funkcji -createfromdump, należy podać -format=<format> Option '-upnp' is set but UPnP support was dropped in version 29.0. Consider using '-natpmp' instead. @@ -4187,7 +4258,7 @@ Przejdź do Plik > Otwórz Portfel aby wgrać portfel. Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=<category>:<loglevel>. Valid categories: %3$s. Valid loglevels: %4$s. - Nieobsługiwany poziom rejestrowania specyficzny dla kategorii %1$s=%2$s. Oczekiwano %1$s=<category>:<loglevel>. Poprawne kategorie %3$s. Poprawne poziomy logowania: %4 $s. + Nieobsługiwany poziom logowania specyficzny dla kategorii %1$s=%2$s. Oczekiwano %1$s=<category>:<loglevel>. Poprawne kategorie %3$s. Poprawne poziomy logowania: %4 $s. Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database. @@ -4229,6 +4300,10 @@ Przejdź do Plik > Otwórz Portfel aby wgrać portfel. -maxmempool must be at least %d MB -maxmempool musi być przynajmniej %d MB + + Cannot obtain a lock on directory %s. %s is probably already running. + Nie można uzyskać blokady w katalogu %s. %s najprawdopodobniej jest już uruchomiony. + Cannot resolve -%s address: '%s' Nie można rozpoznać -%s adresu: '%s' @@ -4253,9 +4328,13 @@ Przejdź do Plik > Otwórz Portfel aby wgrać portfel. Error loading %s: External signer wallet being loaded without external signer support compiled Błąd ładowania %s: Ładowanie portfela zewnętrznego podpisu bez skompilowania wsparcia dla zewnętrznego podpisu. + + Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect. + Błąd podczas odczytywania %s! Wszystkie klucze zostały odczytane poprawnie, ale może brakować danych transakcji lub wpisów w książce adresowej, albo mogą one być nieprawidłowe. + Error: Address book data in wallet cannot be identified to belong to migrated wallets - Błąd: Dane książki adresowej w portfelu nie można zidentyfikować jako należące do migrowanego portfela + Błąd: Danych książki adresowej w portfelu nie można zidentyfikować jako należących do zmigrowanych portfeli Error: Duplicate descriptors created during migration. Your wallet may be corrupted. @@ -4275,7 +4354,7 @@ Przejdź do Plik > Otwórz Portfel aby wgrać portfel. Fee estimation failed. Fallbackfee is disabled. Wait a few blocks or enable %s. - Estymacja opłat nieudana. Domyślna opłata jest wyłączona. Poczekaj kilka bloków lub włącz -%s. + Estymacja opłat nie powiodła się. Fallbackfee jest wyłączone. Poczekaj kilka bloków lub włącz %s. Flushing block file to disk failed. This is likely the result of an I/O error. @@ -4313,13 +4392,37 @@ Przejdź do Plik > Otwórz Portfel aby wgrać portfel. Outbound connections restricted to i2p (-onlynet=i2p) but -i2psam is not provided Połączenia wychodzące ograniczone do i2p (-onlynet=i2p), lecz nie podano -i2psam + + Rename of '%s' -> '%s' failed. Cannot clean up the background chainstate leveldb directory. + Zmiana nazwy z '%s' na '%s' nie powiodła się. Nie można wyczyścić katalogu chainstate leveldb. + + + Specified -blockmaxweight (%d) exceeds consensus maximum block weight (%d) + Podany -blockmaxweight (%d) przekracza przekracza maksymalną wagę bloku dopuszczoną przez konsensus (%d) + + + Specified -blockreservedweight (%d) exceeds consensus maximum block weight (%d) + Podany -blockreservedweight (%d) przekracza przekracza maksymalną wagę bloku dopuszczoną przez konsensus (%d) + + + Specified -blockreservedweight (%d) is lower than minimum safety value of (%d) + Podany -blockreservedweight (%d) jest niższy niż minimalna bezpieczna wartrość (%d) + The preselected coins total amount does not cover the transaction target. Please allow other inputs to be automatically selected or include more coins manually Suma wstępnie wybranych monet nie pokrywa kwoty transakcji. Zezwól na automatyczne wybranie wejść lub ręcznie dołącz więcej monet Transaction requires one destination of non-0 value, a non-0 feerate, or a pre-selected input - Transakcja wymagana jednego celu o niezerowej wartości, niezerowej opłacie lub wstępnie wybranego wejścia + Transakcja wymaga jednego adresu docelowego z niezerową wartością, niezerowej stawki opłaty lub wcześniej wybranego wejścia. + + + Unconfirmed UTXOs are available, but spending them creates a chain of transactions that will be rejected by the mempool + Niepotwierdzone UTXO są dostępne, ale ich wydanie tworzy łańcuch transakcji, który zostanie odrzucony przez mempool. + + + Your computer's date and time appear to be more than %d minutes out of sync with the network, this may lead to consensus failure. After you've confirmed your computer's clock, this message should no longer appear when you restart your node. Without a restart, it should stop showing automatically after you've connected to a sufficient number of new outbound peers, which may take some time. You can inspect the `timeoffset` field of the `getpeerinfo` and `getnetworkinfo` RPC methods to get more info. + Data i godzina Twojego komputera wydają się być przesunięte o więcej %d minut względem sieci, co może prowadzić do błędów konsensusu. Po upewnieniu się, że zegar Twojego komputera jest poprawny, ta wiadomość nie powinna się już pojawiać po ponownym uruchomieniu Twojego węzła. Bez ponownego uruchamiania komunikat powinien zniknąć automatycznie po nawiązaniu przez węzeł wystarczającej liczby nowych połączeń wychodzących, co może zająć trochę czasu. Możesz sprawdzić pole timeoffset w metodach RPC getpeerinfo oraz getnetworkinfo, aby uzyskać więcej informacji. @@ -4455,7 +4558,7 @@ Nie można przywrócić kopii zapasowej portfela Error: Dumpfile checksum does not match. Computed %s, expected %s - Błąd: Plik zrzutu suma kontrolna nie pasuje. Obliczone %s, spodziewane %s + Błąd: Suma kontrolna pliku zrzutu nie zgadza się. Obliczona %s, oczekiwana %s Error: Failed to create new watchonly wallet @@ -4475,11 +4578,11 @@ Nie można przywrócić kopii zapasowej portfela Error: Missing checksum - Bład: Brak suma kontroly + Błąd: Brakuje sumy kontrolnej Error: No %s addresses available. - Błąd: %s adres nie dostępny + Błąd: Brak dostępnych adresów %s Error: This wallet already uses SQLite @@ -4521,6 +4624,10 @@ Nie można przywrócić kopii zapasowej portfela Error: Unable to write record to new wallet Błąd: Wpisanie rekordu do nowego portfela jest niemożliwe + + Error: Unable to write watchonly wallet best block locator record + Błąd: nie można zapisać rekordu lokalizatora najlepszego bloku portfela tylko do obserwacji + Error: database transaction cannot be executed for wallet %s Błąd: transakcja bazy danych nie może zostać wykonana dla portfela%s @@ -4639,7 +4746,7 @@ Nie można przywrócić kopii zapasowej portfela Invalid port specified in %s: '%s' - Nieprawidłowa maska sieci określona w %s: '%s' + Nieprawidłowy port podany w %s: '%s' Invalid pre-selected input %s @@ -4805,6 +4912,10 @@ Nie można przywrócić kopii zapasowej portfela The transaction amount is too small to pay the fee Zbyt niska kwota transakcji by zapłacić opłatę + + The transactions removal process can only be executed within a db txn + Proces usuwania transakcji może być wykonany tylko w ramach transakcji bazy danych. + The wallet will avoid paying less than the minimum relay fee. Portfel będzie unikał płacenia mniejszej niż przekazana opłaty. @@ -4931,7 +5042,7 @@ Nie można przywrócić kopii zapasowej portfela Unsupported logging category %s=%s. - Nieobsługiwana kategoria rejestrowania %s=%s. + Nieobsługiwana kategoria logowania %s=%s. Do you want to rebuild the databases now? @@ -4963,11 +5074,11 @@ Nie można przywrócić kopii zapasowej portfela Verifying blocks… - Weryfikowanie bloków... + Sprawdzanie bloków… Verifying wallet(s)… - Weryfikowanie porfela(li)... + Sprawdzanie portfela / portfeli… Wallet needed to be rewritten: restart %s to complete diff --git a/src/qt/locale/bitcoin_ro.ts b/src/qt/locale/bitcoin_ro.ts index 477680c81a1..3e7f2feefaf 100644 --- a/src/qt/locale/bitcoin_ro.ts +++ b/src/qt/locale/bitcoin_ro.ts @@ -184,6 +184,10 @@ Semnarea este posibilă numai cu adrese de tip "legacy". Continue Continua + + Back + Înapoi + Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer. Reţineti: criptarea portofelului dvs. nu vă poate proteja în totalitate bitcoin-urile împotriva furtului de malware care vă infectează computerul. @@ -291,6 +295,18 @@ Semnarea este posibilă numai cu adrese de tip "legacy". unknown necunoscut + + Embedded "%1" + „%1” încorporat + + + Default system font "%1" + Font de sistem implicit „%1” + + + Custom… + Personalizat... + Amount Sumă @@ -299,6 +315,10 @@ Semnarea este posibilă numai cu adrese de tip "legacy". Enter a Bitcoin address (e.g. %1) Introduceţi o adresă Bitcoin (de exemplu %1) + + Unroutable + Nu poate fi rutabil + Inbound An inbound connection from a peer. An inbound connection is a connection initiated by a peer. @@ -761,6 +781,20 @@ Semnarea este posibilă numai cu adrese de tip "legacy". A substring of the tooltip. "More actions" are available via the context menu. Pulsează pentru mai multe acțiuni. + + Disable network activity + A context menu item. + Dezactivați activitatea în rețea + + + Enable network activity + A context menu item. The network activity was disabled previously. + Activați activitatea în rețea + + + Pre-syncing Headers (%1%)… + Se pre-sincronizează antetele (%1%)... + Error creating wallet Eroare creare portofel @@ -1469,6 +1503,10 @@ Semnarea este posibilă numai cu adrese de tip "legacy". Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Exit in the menu. Minimizează fereastra în locul părăsirii programului în momentul închiderii ferestrei. Cînd acestă opţiune e activă, aplicaţia se va opri doar în momentul selectării comenzii 'Închide aplicaţia' din menu. + + Font in the Overview tab: + Font în fila Prezentare generală: + Open the %1 configuration file from the working directory. Deschide fisierul de configurare %1 din directorul curent. @@ -1757,10 +1795,22 @@ Semnarea este posibilă numai cu adrese de tip "legacy". Failed to sign transaction: %1 Nu s-a reusit semnarea tranzactiei: %1 + + Could not sign any more inputs. + Nu s-au mai putut semna alte intrări. + + + Unknown error processing transaction. + Eroare necunoscută la procesarea tranzacției. + Save Transaction Data Salvați datele tranzacției + + Sends %1 to %2 + Trimite %1 la %2 + own address adresa proprie @@ -1781,6 +1831,10 @@ Semnarea este posibilă numai cu adrese de tip "legacy". or sau + + Transaction has %1 unsigned inputs. + Tranzacția are %1 intrări nesemnate. + Transaction status is unknown. Starea tranzacției este necunoscută. @@ -2012,6 +2066,10 @@ Semnarea este posibilă numai cu adrese de tip "legacy". Node window Fereastra nodului + + Current block height + Înălțimea actuală a blocului + Open the %1 debug log file from the current data directory. This can take a few seconds for large log files. Deschide fişierul jurnal depanare %1 din directorul curent. Aceasta poate dura cateva secunde pentru fişierele mai mari. @@ -2040,6 +2098,10 @@ Semnarea este posibilă numai cu adrese de tip "legacy". Connection Time Timp conexiune + + Last Block + Ultimul bloc + Last Send Ultima trimitere @@ -2141,6 +2203,11 @@ Semnarea este posibilă numai cu adrese de tip "legacy". Executing command using "%1" wallet Executarea comenzii folosind portofelul "%1" + + Executing… + A console message indicating an entered command is currently being executed. + Se execută… + Yes Da @@ -2240,6 +2307,10 @@ Semnarea este posibilă numai cu adrese de tip "legacy". Copy &label Copiaza si eticheteaza + + Copy &message + Copie și mesaj + Copy &amount copiaza &valoarea @@ -2251,6 +2322,10 @@ Semnarea este posibilă numai cu adrese de tip "legacy". ReceiveRequestDialog + + Request payment to … + Solicitați plata către... + Address: Adresa: @@ -2259,6 +2334,10 @@ Semnarea este posibilă numai cu adrese de tip "legacy". Amount: Sumă: + + Label: + Eticheta: + Message: Mesaj: @@ -2413,6 +2492,10 @@ Semnarea este posibilă numai cu adrese de tip "legacy". Clear all fields of the form. Şterge toate câmpurile formularului. + + Inputs… + Intrări… + Choose… Alege... @@ -2493,6 +2576,11 @@ Semnarea este posibilă numai cu adrese de tip "legacy". You can increase the fee later (signals Replace-By-Fee, BIP-125). Puteti creste taxa mai tarziu (semnaleaza Replace-By-Fee, BIP-125). + + Do you want to create this transaction? + Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create. + Doriți să creați această tranzacție? + Please, review your transaction. Text to prompt a user to review the details of the transaction they are attempting to send. @@ -2695,6 +2783,10 @@ Semnarea este posibilă numai cu adrese de tip "legacy". The Bitcoin address the message was signed with Introduceţi o adresă Bitcoin + + The signed message to verify + Mesajul semnat de verificat + Verify the message to ensure it was signed with the specified Bitcoin address Verificaţi mesajul pentru a vă asigura că a fost semnat cu adresa Bitcoin specificată diff --git a/src/qt/locale/bitcoin_ru.ts b/src/qt/locale/bitcoin_ru.ts index 7ce4367d1ab..cc8c1b4e33b 100644 --- a/src/qt/locale/bitcoin_ru.ts +++ b/src/qt/locale/bitcoin_ru.ts @@ -5,6 +5,10 @@ Right-click to edit address or label Нажмите правой кнопкой мыши, чтобы изменить адрес или метку + + Create a new address + Создать новые адрес + &New &Новый @@ -93,6 +97,10 @@ Signing is only possible with addresses of the type 'legacy'. Sending addresses - %1 Адреса отправки - %1 + + Receiving addresses - %1 + Адреса получения - %1 + Exporting Failed Ошибка при экспорте diff --git a/src/qt/locale/bitcoin_sr.ts b/src/qt/locale/bitcoin_sr.ts index 2fa339132fa..48f1c11a55a 100644 --- a/src/qt/locale/bitcoin_sr.ts +++ b/src/qt/locale/bitcoin_sr.ts @@ -271,7 +271,7 @@ Signing is only possible with addresses of the type 'legacy'. A fatal error occurred. %1 can no longer continue safely and will quit. - Дошло је до фаталне грешке. 1%1 даље не може безбедно да настави, те ће се угасити. + Дошло је до фаталне грешке. %1 даље не може безбедно да настави, те ће се угасити. Internal error @@ -300,7 +300,7 @@ Signing is only possible with addresses of the type 'legacy'. %1 didn't yet exit safely… - 1%1 још увек није изашао безбедно… + %1 још увек није изашао безбедно… unknown diff --git a/src/qt/locale/bitcoin_sr@ijekavianlatin.ts b/src/qt/locale/bitcoin_sr@ijekavianlatin.ts index 38214ae8458..ce53ad65dc7 100644 --- a/src/qt/locale/bitcoin_sr@ijekavianlatin.ts +++ b/src/qt/locale/bitcoin_sr@ijekavianlatin.ts @@ -267,7 +267,7 @@ Signing is only possible with addresses of the type 'legacy'. A fatal error occurred. %1 can no longer continue safely and will quit. - Дошло је до фаталне грешке. 1%1 даље не може безбедно да настави, те ће се угасити. + Дошло је до фаталне грешке. %1 даље не може безбедно да настави, те ће се угасити. Internal error @@ -296,7 +296,7 @@ Signing is only possible with addresses of the type 'legacy'. %1 didn't yet exit safely… - 1%1 још увек није изашао безбедно… + %1 још увек није изашао безбедно… unknown diff --git a/src/qt/locale/bitcoin_sr@latin.ts b/src/qt/locale/bitcoin_sr@latin.ts index dd1df971e92..cf745a30290 100644 --- a/src/qt/locale/bitcoin_sr@latin.ts +++ b/src/qt/locale/bitcoin_sr@latin.ts @@ -267,7 +267,7 @@ Signing is only possible with addresses of the type 'legacy'. A fatal error occurred. %1 can no longer continue safely and will quit. - Дошло је до фаталне грешке. 1%1 даље не може безбедно да настави, те ће се угасити. + Дошло је до фаталне грешке. %1 даље не може безбедно да настави, те ће се угасити. Internal error @@ -296,7 +296,7 @@ Signing is only possible with addresses of the type 'legacy'. %1 didn't yet exit safely… - 1%1 још увек није изашао безбедно… + %1 још увек није изашао безбедно… unknown diff --git a/src/qt/locale/bitcoin_sv.ts b/src/qt/locale/bitcoin_sv.ts index 49aa64f1aa8..cbc1daa5241 100644 --- a/src/qt/locale/bitcoin_sv.ts +++ b/src/qt/locale/bitcoin_sv.ts @@ -25,6 +25,10 @@ C&lose S&täng + + Delete the currently selected address from the list + Radera den markerade adressen från listan + Enter address or label to search Ange en adress eller etikett att söka efter @@ -45,6 +49,10 @@ Choose the address to send coins to Välj en adress att skicka transaktionen till + + Choose the address to receive coins with + Välj en adress att ` emot transaktionen med + C&hoose V&älj @@ -293,6 +301,10 @@ Försök igen. unknown okänd + + Embedded "%1" + Inbäddad "%1" + Custom… Anpassad... @@ -2119,6 +2131,10 @@ Om den här plånboken innehåller lösbara Number of connections Antalet anslutningar + + Local Addresses + Lokala adresser + Block chain Blockkedja @@ -3184,6 +3200,10 @@ Om den här plånboken innehåller lösbara Output index Utmatningsindex + + %1 (Certificate was not verified) + %1 (certifikatet verifierades inte) + Merchant Handlare @@ -3684,6 +3704,14 @@ Gå till Fil > Öppna plånbok för att läsa in en plånbok. Cannot set -peerblockfilters without -blockfilterindex. Kan inte använda -peerblockfilters utan -blockfilterindex. + + Maximum transaction weight is less than transaction weight without inputs + Maximal transaktionsvikt är mindre än transaktionsvikten utan inmatningar + + + Maximum transaction weight is too low, can not accommodate change output + Maximal transaktionsvikt är för låg, kan inte tillgodose ändrad utdata + Config setting for %s only applied on %s network when in [%s] section. Konfigurationsinställningar för %s tillämpas bara på nätverket %s när de är i avsnitt [%s]. diff --git a/src/qt/locale/bitcoin_ta.ts b/src/qt/locale/bitcoin_ta.ts index 6fd6c5214a6..f7b40d39357 100644 --- a/src/qt/locale/bitcoin_ta.ts +++ b/src/qt/locale/bitcoin_ta.ts @@ -93,6 +93,10 @@ Signing is only possible with addresses of the type 'legacy'. An error message. %1 is a stand-in argument for the name of the file we attempted to save to. முகவரி பட்டியலை %1 க்கு சேமிக்க முயற்சிக்கும் ஒரு பிழை ஏற்பட்டது. தயவுசெய்து மீண்டும் முயற்சிக்கவும். + + Receiving addresses - %1 + வரவேற்கும் முகவரிகள் - %1 + Exporting Failed ஏக்ஸ்போர்ட் தோல்வியடைந்தது @@ -175,6 +179,14 @@ Signing is only possible with addresses of the type 'legacy'. Enter the old passphrase and new passphrase for the wallet. பழைய கடவுச்சொல் மற்றும் புதிய கடுவுசொல்லை உள்ளிடுக. + + Continue + தொடரவும் + + + Back + பின் செல் + Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer. வாலட்டை குறியாக்கம் செய்தால் மட்டும் உங்கள் பிட்காயினை வைரஸிடம் இருந்து பாதுகாக்க இயலாது. @@ -219,6 +231,10 @@ Signing is only possible with addresses of the type 'legacy'. Wallet passphrase was successfully changed. Wallet குறியாக்கம் தோல்வியடைந்தது + + Passphrase change failed + கடவுச்சொல் மாற்றம் தோல்வியடைந்தது + Warning: The Caps Lock key is on! எச்சரிக்கை: Caps Lock விசை இயக்கத்தில் உள்ளது! @@ -247,7 +263,7 @@ Signing is only possible with addresses of the type 'legacy'. An internal error occurred. %1 will attempt to continue safely. This is an unexpected bug which can be reported as described below. - உள் பிழை ஏற்பட்டது. 1%1 தொடர முயற்சிக்கும். இது எதிர்பாராத பிழை, கீழே விவரிக்கப்பட்டுள்ளபடி புகாரளிக்கலாம். + உள் பிழை ஏற்பட்டது. %1 தொடர முயற்சிக்கும். இது எதிர்பாராத பிழை, கீழே விவரிக்கப்பட்டுள்ளபடி புகாரளிக்கலாம். @@ -446,6 +462,10 @@ Signing is only possible with addresses of the type 'legacy'. &Backup Wallet… &பேக்கப் வாலட்... + + &Change Passphrase… + &கடவுச்சொல்லை மாற்றுக… + Sign messages with your Bitcoin addresses to prove you own them உங்கள் பிட்டினின் முகவரியுடன் செய்திகளை உங்களிடம் வைத்திருப்பதை நிரூபிக்க @@ -582,6 +602,11 @@ Signing is only possible with addresses of the type 'legacy'. No wallets available வாலட் எதுவும் இல்லை + + Restore Wallet + Title of pop-up window shown when the user is attempting to restore a wallet. + பணப்பையை மீட்டெடுக்க + Wallet Name Label of the input field where the name of the wallet is entered. @@ -603,6 +628,10 @@ Signing is only possible with addresses of the type 'legacy'. %1 client %1 கிளையன் + + S&how + காண்பி + %n active connection(s) to Bitcoin network. A substring of the tooltip. @@ -611,6 +640,15 @@ Signing is only possible with addresses of the type 'legacy'. + + Enable network activity + A context menu item. The network activity was disabled previously. + இணைய செயல்பாட்டை இயக்கு + + + Error creating wallet + பணப்பை உருவாக்க பிழை ஏற்பட்டது + Error: %1 பிழை: %1 @@ -838,6 +876,14 @@ Signing is only possible with addresses of the type 'legacy'. வாலட்டை திற + + RestoreWalletActivity + + Restore Wallet + Title of progress window which is displayed when wallets are being restored. + பணப்பையை மீட்டெடுக்க + + WalletController @@ -899,6 +945,10 @@ Signing is only possible with addresses of the type 'legacy'. Make Blank Wallet காலியான வாலட்டை உருவாக்கு + + Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first. + ஹார்ட்வேர் பணப்பை போன்ற வெளிப்புற கையொப்ப சாதனத்தை பயன்படுத்துங்கள். முதலில் பணப்பை விருப்பங்களில் வெளிப்புற கையொப்ப ஸ்கிரிப்டை உள்ளமைக்கவும். + Create உருவாக்கு @@ -1103,6 +1153,10 @@ Signing is only possible with addresses of the type 'legacy'. Number of blocks left மீதமுள்ள தொகுதிகள் உள்ளன + + calculating… + கணக்கிடுகிறது... + Last block time கடைசி தடுப்பு நேரம் @@ -1343,6 +1397,10 @@ Signing is only possible with addresses of the type 'legacy'. Explanatory text about the priority order of instructions considered by client. The order from high to low being: command-line, configuration file, GUI settings. GUI அமைப்புகளை மேலெழுதக்கூடிய மேம்பட்ட பயனர் விருப்பங்களைக் குறிப்பிட கட்டமைப்பு கோப்பு பயன்படுத்தப்படுகிறது. கூடுதலாக, எந்த கட்டளை வரி விருப்பங்கள் இந்த கட்டமைப்பு கோப்பு புறக்கணிக்க வேண்டும். + + Continue + தொடரவும் + Cancel ரத்து @@ -1691,6 +1749,10 @@ Signing is only possible with addresses of the type 'legacy'. Connection Time இணைப்பு நேரம் + + Last Block + கடைசி தொகுதி + Last Send கடைசி அனுப்பவும் @@ -1811,6 +1873,10 @@ Signing is only possible with addresses of the type 'legacy'. Ban for தடை செய் + + Never + ஒருபோதும் இல்லை + Unknown அறியப்படாத @@ -2900,6 +2966,10 @@ Signing is only possible with addresses of the type 'legacy'. Unable to replay blocks. You will need to rebuild the database using -reindex-chainstate. பிளாக்களை இயக்க முடியவில்லை. -reindex-chainstate ஐப் பயன்படுத்தி டேட்டாபேசை மீண்டும் உருவாக்க வேண்டும். + + Wallet created successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. + பணப்பை வெற்றிகரமாக உருவாக்கப்பட்டது. பாரம்பரிய பணப்பை வகை படிப்படியாக கைவிடப்படுகிறது, மேலும் எதிர்காலத்தில் அதை உருவாக்கவும் திறக்கவும் ஆதரவு நீக்கப்படும். + Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade. எச்சரிக்கை: நாங்கள் எங்கள் பீர்களுடன் முழுமையாக உடன்படுவதாகத் தெரியவில்லை! நீங்கள் அப்க்ரேட் செய்ய வேண்டியிருக்கலாம், அல்லது மற்ற நோடுகள் அப்க்ரேட் செய்ய வேண்டியிருக்கலாம். diff --git a/src/qt/locale/bitcoin_th.ts b/src/qt/locale/bitcoin_th.ts index 464e39cbac0..1cae9d0af96 100644 --- a/src/qt/locale/bitcoin_th.ts +++ b/src/qt/locale/bitcoin_th.ts @@ -1,315 +1,2500 @@ + + AddressBookPage + + Right-click to edit address or label + คลิกขวาเพื่อแก้ไขที่อยู่หรือตัวระบุ + + + Create a new address + สร้างที่อยู่ใหม่ + + + &New + &ใหม่ + + + Copy the currently selected address to the system clipboard + คัดลอกที่อยู่ที่เลือกปัจจุบันไปยังคลิปบอร์ดของระบบ + + + &Copy + &คัดลอก + + + C&lose + &ปิด + + + Delete the currently selected address from the list + ลบที่อยู่ที่เลือกไว้ในปัจจุบันออกจากรายการ + + + Enter address or label to search + ป้อนที่อยู่หรือป้ายกำกับเพื่อค้นหา + + + Export the data in the current tab to a file + ส่งออกข้อมูลในแท็บปัจจุบันไปยังไฟล์ + + + &Export + &ส่งออก + + + &Delete + &ลบ + + + Choose the address to send coins to + เลือกที่อยู่เพื่อส่งเหรียญไป + + + Choose the address to receive coins with + เลือกที่อยู่เพื่อรับเหรียญ + + + C&hoose + เลือก + + + These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins. + นี่คือลิงก์ที่อยู่ Bitcoin ของคุณสำหรับการส่งการชำระเงิน ควรตรวจสอบจำนวนเงินและที่อยู่ผู้รับก่อนการส่งเหรียญ + + + These are your Bitcoin addresses for receiving payments. Use the 'Create new receiving address' button in the receive tab to create new addresses. +Signing is only possible with addresses of the type 'legacy'. + นี่คือที่อยู่บิตคอยน์ของคุณสำหรับรับการชำระเงิน ใช้ปุ่ม 'สร้างที่อยู่รับใหม่' ในแท็บรับเพื่อสร้างที่อยู่ใหม่ การลงนามทำได้เฉพาะกับที่อยู่ประเภท 'legacy' + + + &Copy Address + ที่อยู่ + + + Copy &Label + คัดลอกและติดป้ายกำกับ + + + &Edit + &แก้ไข + + + Export Address List + รายชื่อที่อยู่ที่ส่งออก + + + Comma separated file + Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values. + ไฟล์ที่แยกด้วยเครื่องหมายจุลภาค + + + There was an error trying to save the address list to %1. Please try again. + An error message. %1 is a stand-in argument for the name of the file we attempted to save to. + เกิดข้อผิดพลาดในการพยายามบันทึกรายชื่อที่อยู่ไปยัง %1 กรุณาลองอีกครั้ง + + + Sending addresses - %1 + กำลังส่งที่อยู่ - %1 + + + Receiving addresses - %1 + กำลังรับที่อยู่ - %1 + + + Exporting Failed + การส่งออกล้มเหลว + + + + AddressTableModel + + Label + การส่งออกล้มเหลว + + + Address + ที่อยู่ + + + (no label) + ไม่มีป้ายกำกับ + + AskPassphraseDialog - Back - ย้อนกลับ + Passphrase Dialog + กล่องโต้ตอบรหัสผ่าน + + + Enter passphrase + ป้อนรหัสผ่านลับ + + + New passphrase + รหัสผ่านใหม่ + + + Repeat new passphrase + กรุณาใส่วลีผ่านใหม่อีกครั้ง + + + Show passphrase + แสดงรหัสผ่าน + + + Encrypt wallet + เข้ารหัสกระเป๋าเงิน + + + This operation needs your wallet passphrase to unlock the wallet. + การดำเนินการนี้ต้องใช้รหัสผ่านกระเป๋าเงินของคุณเพื่อปลดล็อกกระเป๋าเงิน + + + Unlock wallet + ปลดล็อกกระเป๋าเงิน + + + Change passphrase + เปลี่ยนรหัสผ่าน + + + Confirm wallet encryption + ยืนยันการเข้ารหัสกระเป๋าเงิน + + + Warning: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! + คำเตือน: หากคุณเข้ารหัสกระเป๋าของคุณและสูญเสียรหัสผ่านของคุณ คุณจะสูญเสียบิตคอยน์ทั้งหมดของคุณ! + + + Are you sure you wish to encrypt your wallet? + คุณแน่ใจหรือว่าคุณต้องการเข้ารหัสกระเป๋าของคุณ? + + + Wallet encrypted + กระเป๋าเงินถูกเข้ารหัส + + + Enter the new passphrase for the wallet.<br/>Please use a passphrase of <b>ten or more random characters</b>, or <b>eight or more words</b>. + ป้อนวลีรหัสใหม่สำหรับกระเป๋าสตางค์. 1.กรุณาใช้วลีรหัสผ่านของ 2.สิบตัวอักษรสุ่มหรือมากกว่า 2,หรือ 3แปดคำหรือมากกว่านั้น3 + + + Enter the old passphrase and new passphrase for the wallet. + ป้อนรหัสผ่านเก่าและรหัสผ่านใหม่สำหรับกระเป๋าเงิน + + + Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer. + จำไว้ว่าการเข้ารหัสกระเป๋าของคุณไม่สามารถปกป้องบิตคอยน์ของคุณจากการถูกขโมยโดยมัลแวร์ที่ติดเชื้อคอมพิวเตอร์ของคุณได้อย่างสมบูรณ์ + + + Wallet to be encrypted + กระเป๋าเงินจะถูกเข้ารหัส + + + Your wallet is about to be encrypted. + กระเป๋าเงินของคุณกำลังจะถูกเข้ารหัส + + + Your wallet is now encrypted. + กระเป๋าเงินของคุณได้รับการเข้ารหัสแล้ว + + + IMPORTANT: Any previous backups you have made of your wallet file should be replaced with the newly generated, encrypted wallet file. For security reasons, previous backups of the unencrypted wallet file will become useless as soon as you start using the new, encrypted wallet. + สำคัญ: สำรองข้อมูลที่คุณได้ทำไว้ก่อนหน้านี้ของไฟล์กระเป๋าเงินของคุณควรถูกแทนที่ด้วยไฟล์กระเป๋าเงินที่ถูกเข้ารหัสที่สร้างขึ้นใหม่ สำหรับเหตุผลด้านความปลอดภัย สำรองข้อมูลก่อนหน้านี้ของไฟล์กระเป๋าเงินที่ไม่ได้เข้ารหัสจะไม่สามารถใช้ได้ทันทีที่คุณเริ่มใช้ไฟล์กระเป๋าเงินที่เข้ารหัสใหม่ + + + Wallet encryption failed + การเข้ารหัสกระเป๋าเงินล้มเหลว + + + Wallet encryption failed due to an internal error. Your wallet was not encrypted. + การเข้ารหัสกระเป๋าเงินล้มเหลวเนื่องจากข้อผิดพลาดภายใน กระเป๋าเงินของคุณไม่ได้ถูกเข้ารหัส + + + The supplied passphrases do not match. + รหัสผ่านที่ให้มาทั้งหมดไม่ตรงกัน + + + Wallet unlock failed + การปลดล็อกกระเป๋าเงินล้มเหลว + + + The passphrase entered for the wallet decryption was incorrect. + วลีรหัสที่ป้อนสำหรับถอดรหัสกระเป๋าเงินไม่ถูกต้อง + + + The passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. If this is successful, please set a new passphrase to avoid this issue in the future. + วลีผ่านที่ป้อนเพื่อถอดรหัสกระเป๋าสตางค์ไม่ถูกต้อง เนื่องจากมีอักขระว่าง (เช่น ไบต์ศูนย์) หากวลีผ่านถูกตั้งค่าด้วยซอฟต์แวร์เวอร์ชันก่อนหน้า 25.0 กรุณาลองอีกครั้งโดยป้อนเฉพาะอักขระก่อนหน้าอักขระว่างตัวแรกเท่านั้น หากสำเร็จ กรุณาตั้งวลีผ่านใหม่เพื่อหลีกเลี่ยงปัญหานี้ในอนาคต + + + Wallet passphrase was successfully changed. + รหัสผ่านกระเป๋าเงินถูกเปลี่ยนสำเร็จเรียบร้อยแล้ว. + + + Passphrase change failed + การเปลี่ยนรหัสผ่านล้มเหลว + + + The old passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. + รหัสผ่านเก่าที่ป้อนเพื่อถอดรหัสกระเป๋าไม่ถูกต้อง มันมีอักขระว่าง (เช่น - ไบต์ศูนย์) หากรหัสผ่านถูกตั้งด้วยเวอร์ชันของซอฟต์แวร์ก่อนเวอร์ชัน 25.0 กรุณาลองใหม่โดยใช้เฉพาะอักขระจนถึง — แต่ไม่รวม — อักขระว่างตัวแรก. + + + Warning: The Caps Lock key is on! + คำเตือน: ปุ่ม Caps Lock เปิดอยู่! + + + + BanTableModel + + IP/Netmask + ไอพี/หน้ากากเครือข่าย + + + Banned Until + ถูกแบนจนถึง + + + + BitcoinApplication + + Settings file %1 might be corrupt or invalid. + ไฟล์การตั้งค่า %1 อาจเสียหายหรือไม่ถูกต้อง + + + Runaway exception + ข้อยกเว้นที่ควบคุมไม่ได้ + + + A fatal error occurred. %1 can no longer continue safely and will quit. + เกิดข้อผิดพลาดร้ายแรง %1 ไม่สามารถดำเนินการต่อได้อย่างปลอดภัยและจะปิดตัวลง + + + Internal error + ข้อผิดพลาดภายใน + + + An internal error occurred. %1 will attempt to continue safely. This is an unexpected bug which can be reported as described below. + เกิดข้อผิดพลาดภายใน %1 จะพยายามดำเนินการต่ออย่างปลอดภัย นี่คือข้อผิดพลาดที่ไม่คาดคิดซึ่งสามารถรายงานได้ตามที่อธิบายไว้ด้านล่าง + + + + QObject + + Do you want to reset settings to default values, or to abort without making changes? + Explanatory text shown on startup when the settings file cannot be read. Prompts user to make a choice between resetting or aborting. + คุณต้องการรีเซ็ตการตั้งค่าเป็นค่าพื้นฐาน หรือยกเลิกโดยไม่ทำการเปลี่ยนแปลง? + + + A fatal error occurred. Check that settings file is writable, or try running with -nosettings. + Explanatory text shown on startup when the settings file could not be written. Prompts user to check that we have the ability to write to the file. Explains that the user has the option of running without a settings file. + เกิดข้อผิดพลาดร้ายแรง กรุณาตรวจสอบว่าไฟล์การตั้งค่าสามารถเขียนได้หรือไม่ หรือลองรันด้วยคำสั่ง + + + Error: %1 + ข้อผิดพลาด: %1 + + + %1 didn't yet exit safely… + %1 ยังไม่ได้ออกอย่างปลอดภัย… + + + Embedded "%1" + ฝัง "%1" + + + Default system font "%1" + ฟอนต์ระบบเริ่มต้น "%1" + + + Custom… + กำหนดเอง + + + Amount + จำนวน: + + + Enter a Bitcoin address (e.g. %1) + กรอกที่อยู่ Bitcoin (เช่น %1) + + + Unroutable + ไม่สามารถกำหนดเส้นทางได้ (Mai Samart Kamnot Sen Thang Dai) + + + IPv4 + network name + Name of IPv4 network in peer info + ไอพีวี4 + + + IPv6 + network name + Name of IPv6 network in peer info + ไอพีวี6 + + + Onion + network name + Name of Tor network in peer info + หัวหอม (Hua Khom) + + + CJDNS + network name + Name of CJDNS network in peer info + CJDNS (แปลงชื่อย่อ) + + + Inbound + An inbound connection from a peer. An inbound connection is a connection initiated by a peer. + ขาเข้า +(Pronunciation: kǎa-kâo) + + + Outbound + An outbound connection to a peer. An outbound connection is a connection initiated by us. + ออกเดินทาง (òk dern thāng) + + + Full Relay + Peer connection type that relays all network information. + การแข่งขันรีเลย์เต็มรูปแบบ + + + Block Relay + Peer connection type that relays network information about blocks and not transactions or addresses. + การวิ่งผลัดบล็อก + + + Manual + Peer connection type established manually through one of several methods. + คู่มือ + + + Feeler + Short-lived peer connection type that tests the aliveness of known addresses. + ตัวตรวจจับ (tua dtruat jap) + + + Address Fetch + Short-lived peer connection type that solicits known addresses from a peer. + ดึงที่อยู่ + + + %1 d + %1 วัน + + + %1 h + %1 ชม. + + + %1 m + %1 เมตร + + + %1 s + %1 วินาที + + + None + ไม่มี (Mai mee) + + + N/A + ไม่มี + + + %1 ms + %1 มิลลิวินาที + + + %n second(s) + + %n วินาที + + + + %n minute(s) + + %n นาที + + + + %n hour(s) + + %n ชั่วโมง + + + + %n day(s) + + %n วัน + + + + %n week(s) + + %n สัปดาห์ + + + + %1 and %2 + %1 และ %2 + + + %n year(s) + + %n ปี + + + + %1 B + %1 บ + + + %1 kB + %1 กิโลไบต์ + + + %1 MB + %1 เมกะไบต์ + + + %1 GB + %1 กิกะไบต์ + + + default wallet + กระเป๋าเงินเริ่มต้น + + + + BitcoinGUI + + &Overview + ภาพรวม + + + Show general overview of wallet + แสดงภาพรวมทั่วไปของกระเป๋าเงิน + + + &Transactions + ธุรกรรม + + + Browse transaction history + เรียกดูประวัติการทำธุรกรรม + + + E&xit + ออก + + + Quit application + ออกจากแอปพลิเคชัน + + + &About %1 + เกี่ยวกับ %1 + + + Show information about %1 + แสดงข้อมูลเกี่ยวกับ %1 + + + About &Qt + เกี่ยวกับ &Qt + + + Show information about Qt + แสดงข้อมูลเกี่ยวกับ Qt + + + Modify configuration options for %1 + แก้ไขตัวเลือกการตั้งค่าของ %1 + + + Create a new wallet + สร้างกระเป๋าใหม่ + + + &Minimize + ย่อ + + + Wallet: + กระเป๋าสตางค์ + + + Network activity disabled. + A substring of the tooltip. + กิจกรรมเครือข่ายถูกปิดใช้งาน + + + Proxy is <b>enabled</b>: %1 + เปิดใช้พร็อกซี: %1 + + + Send coins to a Bitcoin address + ส่งเหรียญไปยังที่อยู่บิตคอยน์ + + + Backup wallet to another location + สำรองกระเป๋าเงินไปยังตำแหน่งอื่น + + + Change the passphrase used for wallet encryption + เปลี่ยนรหัสผ่านที่ใช้สำหรับการเข้ารหัสกระเป๋าสตางค์ + + + &Send + ส่ง + + + &Receive + รับ + + + &Options… + ตัวเลือก + + + &Encrypt Wallet… + เข้ารหัสกระเป๋าเงิน + + + Encrypt the private keys that belong to your wallet + เข้ารหัสกุญแจส่วนตัวที่เป็นของกระเป๋าของคุณ + + + &Backup Wallet… + สำรองกระเป๋าเงิน + + + &Change Passphrase… + เปลี่ยนรหัสผ่าน... + + + Sign &message… + ป้าย & ข้อความ… + + + Sign messages with your Bitcoin addresses to prove you own them + ลงนามข้อความด้วยที่อยู่ Bitcoin ของคุณเพื่อพิสูจน์ว่าคุณเป็นเจ้าของ + + + &Verify message… + ตรวจสอบข้อความ... + + + Verify messages to ensure they were signed with specified Bitcoin addresses + ตรวจสอบข้อความเพื่อให้แน่ใจว่าข้อความเหล่านั้นได้รับการลงชื่อด้วยที่อยู่ Bitcoin ที่ระบุไว้ + + + &Load PSBT from file… + &โหลด PSBT จากไฟล์… + + + Open &URI… + เปิด &URI... + + + Close Wallet… + ปิดกระเป๋าสตางค์ + + + Create Wallet… + สร้างกระเป๋า... + + + Close All Wallets… + ปิดกระเป๋าทั้งหมด… + + + &File + &ไฟล์ + + + &Settings + &การตั้งค่า + + + &Help + &ช่วยเหลือ + + + Tabs toolbar + แถบเครื่องมือแท็บ + + + Syncing Headers (%1%)… + กำลังซิงค์หัวข้อ (%1%)… + + + Synchronizing with network… + กำลังซิงโครไนซ์กับเครือข่าย... + + + Indexing blocks on disk… + กำลังดัชนีบล็อกบนดิสก์… + + + Processing blocks on disk… + กำลังประมวลผลบล็อกบนดิสก์... + + + Connecting to peers… + กำลังเชื่อมต่อกับเพื่อนร่วมงาน... + + + Request payments (generates QR codes and bitcoin: URIs) + ขอการชำระเงิน (สร้างรหัส QR และ URI ของบิตคอยน์) + + + Show the list of used sending addresses and labels + แสดงรายการที่อยู่ที่ใช้ส่งและป้ายกำกับ + + + Show the list of used receiving addresses and labels + แสดงรายการที่อยู่รับและป้ายที่ใช้แล้ว + + + &Command-line options + &ตัวเลือกคำสั่งในบรรทัดคำสั่ง + + + Processed %n block(s) of transaction history. + + ประมวลผล %n บล็อกของประวัติการทำธุรกรรม. + + + + %1 behind + %1 ตามหลัง + + + Catching up… + ตามทัน... + + + Last received block was generated %1 ago. + บล็อกที่ได้รับล่าสุดถูกสร้างขึ้นเมื่อ %1 ที่แล้ว. + + + Transactions after this will not yet be visible. + ธุรกรรมหลังจากนี้จะยังไม่สามารถมองเห็นได้. + + + Error + ข้อผิดพลาด + + + Warning + คำเตือน + + + Information + ข้อมูล + + + Up to date + ทันสมัย + + + Load Partially Signed Bitcoin Transaction + โหลดธุรกรรม Bitcoin ที่ลงนามบางส่วน + + + Load PSBT from &clipboard… + โหลด PSBT จาก &คลิปบอร์ด… + + + Load Partially Signed Bitcoin Transaction from clipboard + โหลดธุรกรรม Bitcoin ที่ลงนามบางส่วนจากคลิปบอร์ด + + + Node window + หน้าต่างโหนด + + + Open node debugging and diagnostic console + เปิดคอนโซลดีบักและวินิจฉัยของโหนด + + + &Sending addresses + &ที่อยู่สำหรับการส่ง + + + &Receiving addresses + &ตัวเลือกคำสั่งในบรรทัดคำสั่ง + + + Open a bitcoin: URI + เปิดบิตคอยน์: URI + + + Open Wallet + เปิดกระเป๋า + + + Open a wallet + เปิดกระเป๋า + + + Close wallet + ปิดกระเป๋า + + + Restore Wallet… + Name of the menu item that restores wallet from a backup file. + กู้กระเป๋าเงิน… + + + Restore a wallet from a backup file + Status tip for Restore Wallet menu item + กู้คืนกระเป๋าเงินจากไฟล์สำรอง + + + Close all wallets + ปิดกระเป๋าทั้งหมด + + + Migrate Wallet + ย้ายกระเป๋าเงิน + + + Migrate a wallet + ย้ายกระเป๋าเงิน + + + Show the %1 help message to get a list with possible Bitcoin command-line options + แสดงข้อความช่วยเหลือ %1 เพื่อดูรายการตัวเลือกคำสั่งบิตคอยน์ที่เป็นไปได้ + + + &Mask values + &ค่าหน้ากาก + + + Mask the values in the Overview tab + ปิดบังค่าในแท็บภาพรวม + + + No wallets available + ไม่มีกระเป๋าสตางค์วางจำหน่าย + + + Wallet Data + Name of the wallet data file format. + ข้อมูลกระเป๋าเงิน + + + Load Wallet Backup + The title for Restore Wallet File Windows + โหลดสำรองกระเป๋าเงิน + + + Restore Wallet + Title of pop-up window shown when the user is attempting to restore a wallet. + กู้กระเป๋าเงิน + + + Wallet Name + Label of the input field where the name of the wallet is entered. + ชื่อกระเป๋าเงิน + + + &Window + หน้าต่าง + + + Ctrl+M + Ctrl+M (แป้นพิมพ์ลัด) + + + Main Window + หน้าต่างหลัก + + + %1 client + %1 ลูกค้า + + + &Hide + ซ่อน + + + %n active connection(s) to Bitcoin network. + A substring of the tooltip. + + การเชื่อมต่อที่ใช้งานอยู่ %n รายการไปยังเครือข่ายบิตคอยน์ + + + + Click for more actions. + A substring of the tooltip. "More actions" are available via the context menu. + คลิกเพื่อดูการกระทำเพิ่มเติม + + + Show Peers tab + A context menu item. The "Peers tab" is an element of the "Node window". + แสดงแท็บเพื่อนร่วมงาน + + + Disable network activity + A context menu item. + ปิดการใช้งานเครือข่าย + + + Enable network activity + A context menu item. The network activity was disabled previously. + เปิดใช้งานกิจกรรมเครือข่าย + + + Pre-syncing Headers (%1%)… + กำลังซิงค์หัวเรื่องล่วงหน้า (%1%)… + + + Error creating wallet + เกิดข้อผิดพลาดในการสร้างกระเป๋าเงิน + + + Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets) + ไม่สามารถสร้างกระเป๋าใหม่ได้, ซอฟต์แวร์ถูกคอมไพล์โดยไม่มีการสนับสนุน sqlite (ซึ่งจำเป็นสำหรับกระเป๋า descriptor) + + + Error: %1 + ข้อผิดพลาด: %1 + + + Warning: %1 + คำเตือน: %1 + + + Date: %1 + + วันที่: %1 + + + Amount: %1 + + จำนวน: %1 + + + Wallet: %1 + + กระเป๋าเงิน: %1 + + + + Type: %1 + + ประเภท: %1 + + + + Label: %1 + + ป้ายกำกับ: %1 + + + + Address: %1 + + ที่อยู่: %1 + + + + Sent transaction + การทำธุรกรรมที่ส่งออก + + + Incoming transaction + การทำธุรกรรมที่เข้ามา + + + HD key generation is <b>enabled</b> + การสร้างคีย์ HD ถูกเปิดใช้งาน + + + HD key generation is <b>disabled</b> + การสร้างคีย์ HD คือ<b>พิการ</b> + + + Private key <b>disabled</b> + กุญแจส่วนตัว <b>พิการ</b> + + + Wallet is <b>encrypted</b> and currently <b>unlocked</b> + กระเป๋าเงินคือ <b>เข้ารหัส</b> และปัจจุบัน <b>ปลดล็อก</b> + + + Wallet is <b>encrypted</b> and currently <b>locked</b> + กระเป๋าสตางค์คือ <b>เข้ารหัส</b> และปัจจุบัน <b>ล็อค</b> + + + Original message: + ข้อความต้นฉบับ + + + + UnitDisplayStatusBarControl + + Unit to show amounts in. Click to select another unit. + หน่วยเพื่อแสดงจำนวนใน. คลิกเพื่อเลือกหน่วยอื่น. + + + + CoinControlDialog + + Coin Selection + การเลือกเหรียญ + + + Quantity: + ปริมาณ: + + + Bytes: + ไบต์ + + + Amount: + จำนวน + + + Fee: + ค่าธรรมเนียม + + + After Fee: + หลังค่าธรรมเนียม: + + + Change: + การเปลี่ยนแปลง + + + (un)select all + เลือกทั้งหมด (ยกเลิก) + + + List mode + โหมดรายการ + + + Amount + จำนวน: + + + Received with label + ได้รับพร้อมป้าย + + + Received with address + รับพร้อมที่อยู่ + + + Date + วันที่ + + + Confirmations + การยืนยัน + + + Confirmed + ยืนยัน + + + Copy amount + จำนวนคัดลอก + + + &Copy address + ที่อยู่ &Copy + + + Copy &label + คัดลอก & ป้าย + + + Copy &amount + คัดลอก &จำนวน + + + Copy transaction &ID and output index + คัดลอกธุรกรรม &ID และดัชนีผลลัพธ์ + + + L&ock unspent + ปิดการใช้ที่ยังไม่ถูกใช้ + + + &Unlock unspent + &ปลดล็อกที่ยังไม่ได้ใช้ + + + Copy quantity + จำนวนสำเนา + + + Copy after fee + คัดลอกหลังค่าธรรมเนียม + + + Copy bytes + คัดลอกไบต์ + + + Copy change + การเปลี่ยนแปลงข้อความ + + + (%1 locked) + (*%1 ถูกล็อค) + + + Can vary +/- %1 satoshi(s) per input. + สามารถเปลี่ยนแปลงได้ +/- %1 ซาโตชิ (s) ต่อการป้อนข้อมูล + + + (no label) + ไม่มีป้ายกำกับ + + + change from %1 (%2) + เปลี่ยนจาก %1 (%2) + + + (change) + (เปลี่ยน) + + + + CreateWalletActivity + + Create Wallet + Title of window indicating the progress of creation of a new wallet. + สร้างกระเป๋า + + + Creating Wallet <b>%1</b>… + Descriptive text of the create wallet progress window which indicates to the user which wallet is currently being created. + การสร้างกระเป๋า <b>%1</b>… + + + Create wallet failed + สร้างกระเป๋าเงินล้มเหลว + + + Create wallet warning + คำเตือนการสร้างกระเป๋า + + + Can't list signers + ไม่สามารถระบุผู้ลงชื่อได้ + + + Too many external signers found + พบผู้ลงชื่อภายนอกมากเกินไป + + + + LoadWalletsActivity + + Load Wallets + Title of progress window which is displayed when wallets are being loaded. + โหลดกระเป๋า + + + Loading wallets… + Descriptive text of the load wallets progress window which indicates to the user that wallets are currently being loaded. + กำลังโหลดกระเป๋าเงิน… + + + + MigrateWalletActivity + + Migrate wallet + ย้ายกระเป๋าเงิน + + + Are you sure you wish to migrate the wallet <i>%1</i>? + คุณแน่ใจไหมว่าคุณต้องการย้ายกระเป๋า %1? + + + Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made. +If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts. +If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts. + +The migration process will create a backup of the wallet before migrating. This backup file will be named <wallet name>-<timestamp>.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality. + การย้ายกระเป๋าจะทำให้กระเป๋านี้กลายเป็นกระเป๋าหรือหลายๆ กระเป๋าที่มีคำอธิบาย (descriptor wallets) กระเป๋าสำรองใหม่จะต้องถูกสร้างขึ้น +หากกระเป๋านี้มีสคริปต์ที่ดูได้เท่านั้น (watchonly scripts) จะมีกระเป๋าใหม่ที่สร้างขึ้นซึ่งมีสคริปต์เหล่านั้น +หากกระเป๋านี้มีสคริปต์ที่แก้ไขได้แต่ไม่ได้ติดตาม (solvable but not watched scripts) จะมีกระเป๋าใหม่ที่แตกต่างออกไปซึ่งมีสคริปต์เหล่านั้น + + + Migrate Wallet + ย้ายกระเป๋าเงิน + + + Migrating Wallet <b>%1</b>… + กำลังย้ายกระเป๋าเงิน %1… + + + The wallet '%1' was migrated successfully. + กระเป๋าเงิน '%1' ถูกย้ายเรียบร้อยแล้ว + + + Watchonly scripts have been migrated to a new wallet named '%1'. + สคริปต์แบบดูเฉยๆ ถูกย้ายไปยังกระเป๋าใหม่ที่ชื่อว่า '%1' + + + Solvable but not watched scripts have been migrated to a new wallet named '%1'. + สคริปต์ที่สามารถแก้ไขได้แต่ไม่ได้ติดตามได้ถูกย้ายไปยังกระเป๋าใหม่ที่ชื่อว่า '%1' + + + Migration failed + การย้ายล้มเหลว + + + Migration Successful + การย้ายสำเร็จ + + + + OpenWalletActivity + + Open wallet failed + เปิดกระเป๋าล้มเหลว + + + Open wallet warning + คำเตือนเปิดกระเป๋า + + + Open Wallet + Title of window indicating the progress of opening of a wallet. + เปิดกระเป๋า + + + + RestoreWalletActivity + + Restore Wallet + Title of progress window which is displayed when wallets are being restored. + กู้กระเป๋าเงิน + + + Restore wallet failed + Title of message box which is displayed when the wallet could not be restored. + การกู้คืนกระเป๋าเงินล้มเหลว + + + Restore wallet warning + Title of message box which is displayed when the wallet is restored with some warning. + คำเตือนการกู้คืนกระเป๋าเงิน + + + Restore wallet message + Title of message box which is displayed when the wallet is successfully restored. + กู้คืนข้อความกระเป๋าเงิน + + + + WalletController + + Close wallet + ปิดกระเป๋า + + + Closing the wallet for too long can result in having to resync the entire chain if pruning is enabled. + การปิดกระเป๋าไว้เป็นเวลานานเกินไปอาจทำให้ต้องซิงค์ข้อมูลทั้งสายอีกครั้งหากเปิดใช้งานการตัดทอน + + + Close all wallets + ปิดกระเป๋าทั้งหมด + + + Are you sure you wish to close all wallets? + คุณมั่นใจไหมว่าคุณต้องการปิดกระเป๋าทั้งหมด? + + + + CreateWalletDialog + + Create Wallet + สร้างกระเป๋า + + + You are one step away from creating your new wallet! + คุณอยู่แค่ก้าวเดียวจากการสร้างกระเป๋าเงินใหม่ของคุณ! + + + Please provide a name and, if desired, enable any advanced options + กรุณาระบุชื่อและหากต้องการ โปรดเปิดใช้งานตัวเลือกขั้นสูง + + + Wallet Name + ชื่อกระเป๋าเงิน + + + Wallet + กระเป๋าสตางค์ + + + Encrypt the wallet. The wallet will be encrypted with a passphrase of your choice. + เข้ารหัสกระเป๋าเงิน กระเป๋าเงินจะถูกเข้ารหัสด้วยรหัสผ่านที่คุณเลือก + + + Encrypt Wallet + เข้ารหัสกระเป๋าเงิน + + + Advanced Options + ตัวเลือกขั้นสูง + + + Disable private keys for this wallet. Wallets with private keys disabled will have no private keys and cannot have an HD seed or imported private keys. This is ideal for watch-only wallets. + "ปิดการใช้งานคีย์ส่วนตัวสำหรับกระเป๋านี้ กระเป๋าที่ปิดการใช้งานคีย์ส่วนตัวจะไม่มีคีย์ส่วนตัวและไม่สามารถมีเมล็ด HD หรือคีย์ส่วนตัวที่นำเข้าได้ นี่เหมาะสำหรับกระเป๋าที่ดูอย่างเดียว" + + + Disable Private Keys + ปิดกุญแจส่วนตัว + + + Make a blank wallet. Blank wallets do not initially have private keys or scripts. Private keys and addresses can be imported, or an HD seed can be set, at a later time. + สร้างกระเป๋าเปล่า กระเป๋าเปล่าเริ่มต้นจะไม่มีคีย์ส่วนตัวหรือสคริปต์ คีย์ส่วนตัวและที่อยู่สามารถนำเข้าได้ หรือสามารถตั้งค่า HD seed ในภายหลัง + + + Make Blank Wallet + ทำกระเป๋าว่าง + + + Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first. + ใช้อุปกรณ์เซ็นต์ภายนอก เช่น กระเป๋าเงินฮาร์ดแวร์ กำหนดสคริปต์เซ็นต์ภายนอกในการตั้งค่ากระเป๋าเงินก่อน + + + External signer + ผู้เซ็นภายนอก + + + Create + สร้าง + + + Compiled without external signing support (required for external signing) + "External signing" means using devices such as hardware wallets. + คอมไพล์โดยไม่มีการสนับสนุนการลงชื่อภายนอก (ซึ่งจำเป็นสำหรับการลงชื่อภายนอก) + + + + EditAddressDialog + + Edit Address + แก้ไขที่อยู่ + + + &Label + ป้าย + + + The label associated with this address list entry + ป้ายกำกับที่เกี่ยวข้องกับรายการที่อยู่ในรายการนี้ + + + The address associated with this address list entry. This can only be modified for sending addresses. + ที่อยู่ที่เชื่อมโยงกับรายการที่อยู่ในลิสต์นี้ นี้สามารถแก้ไขได้เฉพาะสำหรับที่อยู่ในการส่ง + + + New sending address + ที่อยู่สำหรับการส่งใหม่ + + + Edit receiving address + แก้ไขที่อยู่สำหรับการรับ + + + Edit sending address + แก้ไขที่อยู่การส่ง + + + The entered address "%1" is not a valid Bitcoin address. + อยู่ที่ป้อน "%1" ไม่ใช่ที่อยู่ Bitcoin ที่ถูกต้อง + + + Address "%1" already exists as a receiving address with label "%2" and so cannot be added as a sending address. + ที่อยู่ "%1" มีอยู่แล้วในฐานะที่อยู่รับที่มีป้ายชื่อ "%2" และดังนั้นจึงไม่สามารถเพิ่มเป็นที่อยู่ส่งได้ + + + The entered address "%1" is already in the address book with label "%2". + ที่อยู่ "%1" ที่ป้อนเข้าไปมีอยู่ในสมุดที่อยู่แล้วพร้อมป้ายกำกับ "%2" + + + Could not unlock wallet. + ไม่สามารถปลดล็อกกระเป๋าเงินได้ + + + New key generation failed. + การสร้างคีย์ใหม่ล้มเหลว + + + + FreespaceChecker + + A new data directory will be created. + ไดเรกทอรีข้อมูลใหม่จะถูกสร้างขึ้น + + + name + ชื่อ + + + Directory already exists. Add %1 if you intend to create a new directory here. + ไดเรกทอรีมีอยู่แล้ว เพิ่ม %1 หากคุณต้องการสร้างไดเรกทอรีใหม่ที่นี่ + + + Path already exists, and is not a directory. + เส้นทางมีอยู่แล้วและไม่ใช่ไดเรกทอรี + + + Cannot create data directory here. + ไม่สามารถสร้างไดเรกทอรีข้อมูลที่นี่ได้ + + + + Intro + + %n GB of space available + + %n GB ของพื้นที่ที่ว่าง + + + + (of %n GB needed) + + (ของ %n GB ที่ต้องการ) + + + + (%n GB needed for full chain) + + (%n GB ที่ต้องการสำหรับโซ่ทั้งหมด) + + + + Choose data directory + เลือกไดเรกทอรีข้อมูล + + + At least %1 GB of data will be stored in this directory, and it will grow over time. + อย่างน้อย %1 GB ของข้อมูลจะถูกจัดเก็บในไดเรกทอรีนี้ และมันจะเติบโตขึ้นตามเวลา + + + Approximately %1 GB of data will be stored in this directory. + ประมาณ %1 GB ของข้อมูลจะถูกเก็บไว้ในไดเรกทอรีนี้ + + + (sufficient to restore backups %n day(s) old) + Explanatory text on the capability of the current prune target. + + (เพียงพอสำหรับการกู้คืนข้อมูลสำรองที่มีอายุ %n วัน) + + + + %1 will download and store a copy of the Bitcoin block chain. + %1 จะดาวน์โหลดและเก็บสำเนาของบล็อกเชนของบิตคอยน์ + + + The wallet will also be stored in this directory. + กระเป๋าเงินจะถูกเก็บไว้ในไดเรกทอรี่นี้ด้วย + + + Error: Specified data directory "%1" cannot be created. + ข้อผิดพลาด: ไม่สามารถสร้างไดเรกทอรีข้อมูลที่ระบุ "%1" ได้ + + + Error + ข้อผิดพลาด + + + Welcome + ยินดีต้อนรับ + + + Welcome to %1. + ยินดีต้อนรับสู่ %1 + + + As this is the first time the program is launched, you can choose where %1 will store its data. + เนื่องจากนี่เป็นครั้งแรกที่โปรแกรมถูกเปิดใช้งาน, คุณสามารถเลือกที่ที่ %1 จะเก็บข้อมูลของมัน + + + Limit block chain storage to + จำกัดการจัดเก็บบล็อกเชนถึง + + + Reverting this setting requires re-downloading the entire blockchain. It is faster to download the full chain first and prune it later. Disables some advanced features. + การย้อนกลับการตั้งค่านี้ต้องการการดาวน์โหลดบล็อกเชนทั้งหมดใหม่ การดาวน์โหลดทั้งชุดเชนก่อนแล้วค่อยตัดทอนภายหลังจะเร็วกว่า ปิดการใช้งานคุณสมบัติขั้นสูงบางอย่าง + + + GB + กิกะไบต์ + + + This initial synchronisation is very demanding, and may expose hardware problems with your computer that had previously gone unnoticed. Each time you run %1, it will continue downloading where it left off. + การซิงโครไนซ์เริ่มต้นนี้ต้องการทรัพยากรมาก และอาจเปิดเผยปัญหาฮาร์ดแวร์ที่เกิดขึ้นกับคอมพิวเตอร์ของคุณซึ่งก่อนหน้านี้อาจไม่ถูกสังเกตเห็น ทุกครั้งที่คุณเรียกใช้ %1 มันจะดำเนินการดาวน์โหลดต่อจากจุดที่มันหยุดไว้ + + + When you click OK, %1 will begin to download and process the full %4 block chain (%2 GB) starting with the earliest transactions in %3 when %4 initially launched. + "เมื่อคุณคลิกตกลง, %1 จะเริ่มดาวน์โหลดและประมวลผลบล็อกเชน %4 ทั้งหมด (%2 GB) โดยเริ่มจากธุรกรรมแรกสุดใน %3 เมื่อ %4 เริ่มต้นเปิดตัว" + + + If you have chosen to limit block chain storage (pruning), the historical data must still be downloaded and processed, but will be deleted afterward to keep your disk usage low. + "ถ้าคุณได้เลือกที่จะจำกัดการจัดเก็บบล็อกเชน (การตัดทอน), ข้อมูลประวัติยังคงต้องถูกดาวน์โหลดและประมวลผล, แต่จะถูกลบหลังจากนั้นเพื่อรักษาการใช้งานดิสก์ของคุณให้ต่ำ." + + + Use the default data directory + ใช้ไดเร็กทอรีข้อมูลเริ่มต้น + + + Use a custom data directory: + ใช้ไดเรกทอรีข้อมูลที่กำหนดเอง: + + + + HelpMessageDialog + + version + เวอร์ชัน + + + About %1 + เกี่ยวกับ %1 + + + Command-line options + ตัวเลือกบรรทัดคำสั่ง + + + + ShutdownWindow + + %1 is shutting down… + %1 กำลังปิดการทำงาน… + + + Do not shut down the computer until this window disappears. + อย่าปิดเครื่องคอมพิวเตอร์จนกว่าหน้าต่างนี้จะหายไป + + + + ModalOverlay + + Recent transactions may not yet be visible, and therefore your wallet's balance might be incorrect. This information will be correct once your wallet has finished synchronizing with the bitcoin network, as detailed below. + ธุรกรรมล่าสุดอาจยังไม่ปรากฏ และดังนั้นยอดคงเหลือในกระเป๋าของคุณอาจไม่ถูกต้อง ข้อมูลนี้จะถูกต้องเมื่อกระเป๋าของคุณเสร็จสิ้นการซิงค์กับเครือข่ายบิตคอยน์ ตามที่อธิบายไว้ด้านล่าง + + + Attempting to spend bitcoins that are affected by not-yet-displayed transactions will not be accepted by the network. + การพยายามใช้บิตคอยน์ที่ได้รับผลกระทบจากธุรกรรมที่ยังไม่ได้แสดงจะไม่ได้รับการยอมรับจากเครือข่าย + + + Number of blocks left + จำนวนบล็อกที่เหลือ + + + calculating… + กำลังคำนวณ + + + Last block time + เวลาบล็อกสุดท้าย + + + Progress + ความก้าวหน้า + + + Progress increase per hour + ความก้าวหน้าที่เพิ่มขึ้นต่อชั่วโมง + + + Estimated time left until synced + เวลาที่เหลือที่คาดการณ์จนกว่าจะซิงค์เสร็จ + + + Hide + ซ่อน + + + Esc + "Esc" (อีสเคป) + + + %1 is currently syncing. It will download headers and blocks from peers and validate them until reaching the tip of the block chain. + %1 กำลังซิงค์อยู่ในขณะนี้ มันจะดาวน์โหลดหัวข้อและบล็อกจากเพื่อนและตรวจสอบพวกมันจนกว่าจะถึงจุดสูงสุดของบล็อกเชน + + + Unknown. Syncing Headers (%1, %2%)… + ไม่ทราบ กำลังซิงค์ส่วนหัว (%1, %2%)… + + + Unknown. Pre-syncing Headers (%1, %2%)… + ไม่รู้จัก กำลังเตรียมข้อมูลหัวข้อ (%1, %2%)… + + + + OpenURIDialog + + Open bitcoin URI + เปิด URI ของบิตคอยน์ + + + URI: + ยูอาร์ไอ: + + + Paste address from clipboard + Tooltip text for button that allows you to paste an address that is in your clipboard. + วางที่อยู่จากคลิปบอร์ด + + + + OptionsDialog + + Options + ตัวเลือก + + + &Main + &หลัก + + + Automatically start %1 after logging in to the system. + เริ่ม %1 อัตโนมัติหลังจากเข้าสู่ระบบ + + + &Start %1 on system login + เริ่ม %1 เมื่อเข้าสู่ระบบ + + + Enabling pruning significantly reduces the disk space required to store transactions. All blocks are still fully validated. Reverting this setting requires re-downloading the entire blockchain. + การเปิดใช้งานการตัดข้อมูลจะลดพื้นที่ดิสก์ที่จำเป็นในการเก็บข้อมูลธุรกรรมอย่างมีนัยสำคัญ บล็อกทั้งหมดยังคงได้รับการตรวจสอบความถูกต้องอย่างเต็มที่ การย้อนกลับการตั้งค่านี้ต้องดาวน์โหลดบล็อกเชนทั้งหมดใหม่อีกครั้ง + + + Size of &database cache + ขนาดของแคชฐานข้อมูล + + + Number of script &verification threads + จำนวนของสคริปต์และเธรดการตรวจสอบ + + + Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins! + เส้นทางเต็มไปยังสคริปต์ที่เข้ากันได้กับ %1 (เช่น C:\Downloads\hwi.exe หรือ /Users/you/Downloads/hwi.py). ระวัง: มัลแวร์อาจขโมยเหรียญของคุณ! + + + IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1) + ที่อยู่ IP ของพร็อกซี (เช่น IPv4: 127.0.0.1 / IPv6: ::1) + + + Shows if the supplied default SOCKS5 proxy is used to reach peers via this network type. + แสดงว่าการใช้พร็อกซี SOCKS5 ค่าเริ่มต้นที่จัดเตรียมไว้ถูกใช้เพื่อเข้าถึงเพื่อนผ่านประเภทเครือข่ายนี้ + + + Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Exit in the menu. + ลดขนาดแทนที่จะปิดแอปพลิเคชันเมื่อปิดหน้าต่าง เมื่อเปิดใช้งานตัวเลือกนี้ แอปพลิเคชันจะถูกปิดเฉพาะเมื่อเลือก Exit ในเมนู + + + Font in the Overview tab: + ฟอนต์ในแท็บภาพรวม: + + + Options set in this dialog are overridden by the command line: + ตัวเลือกที่ตั้งค่าในกล่องโต้ตอบนี้จะถูกเขียนทับโดยบรรทัดคำสั่ง: + + + Open the %1 configuration file from the working directory. + เปิดไฟล์การตั้งค่า %1 จากไดเรกทอรีทำงาน + + + Open Configuration File + เปิดไฟล์การตั้งค่า + + + Reset all client options to default. + รีเซ็ตตัวเลือกทั้งหมดของลูกค้าเป็นค่าเริ่มต้น + + + &Reset Options + ตัวเลือกการรีเซ็ต + + + &Network + และเครือข่าย + + + Prune &block storage to + ตัดทอนและบล็อกที่เก็บข้อมูลไปที่ + + + Reverting this setting requires re-downloading the entire blockchain. + การคืนค่านี้ต้องการการดาวน์โหลดบล็อกเชนทั้งหมดอีกครั้ง + + + Connect to the Bitcoin network through a SOCKS5 proxy. + เชื่อมต่อกับเครือข่าย Bitcoin ผ่านพร็อกซี SOCKS5. + + + &Connect through SOCKS5 proxy (default proxy): + เชื่อมต่อผ่านพร็อกซี่ SOCKS5 (พร็อกซี่เริ่มต้น): + + + Proxy &IP: + พร็อกซี & ไอพี + + + Used for reaching peers via: + ใช้สำหรับการติดต่อเพื่อนร่วมงานผ่าน: + + + IPv4 + ไอพีวี4 + + + IPv6 + ไอพีวี6 + + + Tor + ทอร์. + + + &Window + หน้าต่าง + + + Show the icon in the system tray. + แสดงไอคอนในถาดระบบ + + + &Show tray icon + แสดงไอคอนถาด + + + Show only a tray icon after minimizing the window. + แสดงเฉพาะไอคอนถาดหลังจากย่อหน้าต่าง + + + &Minimize to the tray instead of the taskbar + ย่อไปที่ถาดแทนที่จะเป็นแถบงาน + + + &Display + แสดงผล + + + User Interface &language: + อินเตอร์เฟซผู้ใช้ & ภาษา + + + The user interface language can be set here. This setting will take effect after restarting %1. + คุณสามารถตั้งค่าภาษาอินเตอร์เฟซผู้ใช้ที่นี่ การตั้งค่านี้จะมีผลหลังจากการรีสตาร์ท %1 + + + &Unit to show amounts in: + หน่วยที่จะแสดงจำนวนใน: + + + Choose the default subdivision unit to show in the interface and when sending coins. + เลือกหน่วยย่อยเริ่มต้นที่จะแสดงในอินเทอร์เฟซและเมื่อส่งเหรียญ + + + Third-party URLs (e.g. a block explorer) that appear in the transactions tab as context menu items. %s in the URL is replaced by transaction hash. Multiple URLs are separated by vertical bar |. + URL ของบุคคลที่สาม (เช่น ตัวสำรวจบล็อก) ที่ปรากฏในแท็บการทำธุรกรรมในฐานะตัวเลือกในเมนูบริบท โดยที่ %s ใน URL จะถูกแทนที่ด้วยแฮชของธุรกรรม และ URL หลายรายการจะถูกแยกด้วยเครื่องหมาย | + + + &Third-party transaction URLs + ลิงก์ธุรกรรมของบุคคลที่สาม + + + Whether to show coin control features or not. + จะแสดงคุณสมบัติการควบคุมเหรียญหรือไม่ + + + Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor onion services. + เชื่อมต่อกับเครือข่าย Bitcoin ผ่านพร็อกซี SOCKS5 แยกต่างหากสำหรับบริการ Tor onion + + + Use separate SOCKS&5 proxy to reach peers via Tor onion services: + ใช้พร็อกซี่ SOCKS5 แยกต่างหากเพื่อเชื่อมต่อกับเพื่อนผ่านบริการ Tor onion + + + &OK + โอเค + + + &Cancel + ยกเลิก + + + Compiled without external signing support (required for external signing) + "External signing" means using devices such as hardware wallets. + คอมไพล์โดยไม่มีการสนับสนุนการลงชื่อภายนอก (ซึ่งจำเป็นสำหรับการลงชื่อภายนอก) + + + default + ค่าเริ่มต้น + + + none + ไม่มี + + + Confirm options reset + Window title text of pop-up window shown when the user has chosen to reset options. + ยืนยันการรีเซ็ตตัวเลือก + + + Client restart required to activate changes. + Text explaining that the settings changed will not come into effect until the client is restarted. + จำเป็นต้องรีสตาร์ทไคลเอนต์เพื่อเปิดใช้งานการเปลี่ยนแปลง + + + Current settings will be backed up at "%1". + Text explaining to the user that the client's current settings will be backed up at a specific location. %1 is a stand-in argument for the backup location's path. + การตั้งค่าปัจจุบันจะถูกสำรองไว้ที่ "%1" + + + Client will be shut down. Do you want to proceed? + Text asking the user to confirm if they would like to proceed with a client shutdown. + ลูกค้าจะถูกปิดลง คุณต้องการดำเนินการต่อไหม? + + + Configuration options + Window title text of pop-up box that allows opening up of configuration file. + ตัวเลือกการกำหนดค่า + + + The configuration file is used to specify advanced user options which override GUI settings. Additionally, any command-line options will override this configuration file. + Explanatory text about the priority order of instructions considered by client. The order from high to low being: command-line, configuration file, GUI settings. + ไฟล์การตั้งค่าถูกใช้เพื่อระบุทางเลือกผู้ใช้ขั้นสูงที่จะแทนที่การตั้งค่าของ GUI นอกจากนี้ ตัวเลือกจากบรรทัดคำสั่งใดๆ จะทับไฟล์การตั้งค่านี้ + + + Cancel + ยกเลิก + + + Error + ข้อผิดพลาด + + + The configuration file could not be opened. + ไม่สามารถเปิดไฟล์การตั้งค่าได้ + + + This change would require a client restart. + การเปลี่ยนแปลงนี้จะต้องการการรีสตาร์ทของไคลเอนต์ + + + The supplied proxy address is invalid. + ที่อยู่พร็อกซีที่ให้มานั้นไม่ถูกต้อง + + + + OptionsModel + + Could not read setting "%1", %2. + "ไม่สามารถอ่านการตั้งค่า "%1" ได้, %2" + + + + OverviewPage + + The displayed information may be out of date. Your wallet automatically synchronizes with the Bitcoin network after a connection is established, but this process has not completed yet. + ข้อมูลที่แสดงอาจจะล้าสมัย กระเป๋าของคุณจะทำการซิงค์อัตโนมัติกับเครือข่าย Bitcoin หลังจากที่เชื่อมต่อเสร็จสิ้นแล้ว แต่กระบวนการนี้ยังไม่เสร็จสมบูรณ์ + + + Watch-only: + ดูอย่างเดียว + + + Available: + พร้อมใช้งาน + + + Your current spendable balance + ยอดคงเหลือที่สามารถใช้ได้ในปัจจุบัน + + + Pending: + รอดำเนินการ + + + Total of transactions that have yet to be confirmed, and do not yet count toward the spendable balance + ยอดรวมของธุรกรรมที่ยังไม่ได้รับการยืนยัน และยังไม่นับรวมในยอดคงเหลือที่สามารถใช้จ่ายได้ + + + Immature: + ยังไม่โต + + + Mined balance that has not yet matured + ยอดที่ขุดได้ซึ่งยังไม่ครบกำหนด + + + Balances + ยอดคงเหลือ + + + Total: + รวม: + + + Your current total balance + ยอดคงเหลือทั้งหมดของคุณในปัจจุบัน + + + Your current balance in watch-only addresses + ยอดคงเหลือปัจจุบันของคุณในที่อยู่สำหรับดูอย่างเดียว + + + Spendable: + ใช้จ่ายได้ + + + Recent transactions + การทำธุรกรรมล่าสุด + + + Mined balance in watch-only addresses that has not yet matured + ยอดคงเหลือที่ถูกขุดในที่อยู่ที่ดูได้เท่านั้นซึ่งยังไม่ครบกำหนด + + + Current total balance in watch-only addresses + ยอดคงเหลือทั้งหมดปัจจุบันในที่อยู่ที่ดูได้อย่างเดียว + + + Privacy mode activated for the Overview tab. To unmask the values, uncheck Settings->Mask values. + โหมดความเป็นส่วนตัวถูกเปิดใช้งานสำหรับแท็บภาพรวม หากต้องการแสดงค่า ให้ยกเลิกการเลือก การตั้งค่า->ปิดการซ่อนค่า + + + + PSBTOperationsDialog + + PSBT Operations + การดำเนินงาน + + + Sign Tx + ลงชื่อ Tx + + + Broadcast Tx + การออกอากาศ Tx + + + Copy to Clipboard + คัดลอกไปยังคลิปบอร์ด (Khat-lok pai yang klip-bord) + + + Save… + บันทึก... + + + Close + ปิด (bpit) + + + Failed to load transaction: %1 + ไม่สามารถโหลดธุรกรรมได้: %1 + + + Failed to sign transaction: %1 + ล้มเหลวในการเซ็นต์ธุรกรรม: %1 + + + Cannot sign inputs while wallet is locked. + ไม่สามารถเซ็นข้อมูลขาเข้าได้เมื่อกระเป๋าสตางค์ถูกล็อก + + + Could not sign any more inputs. + ไม่สามารถลงนามการป้อนข้อมูลเพิ่มเติมได้ (Mai samart long nam kan phon khomooht permum dai). + + + Signed %1 inputs, but more signatures are still required. + ลงชื่อ %1 ข้อมูลเข้าแล้ว แต่ยังต้องการลายเซ็นเพิ่มเติม + + + Signed transaction successfully. Transaction is ready to broadcast. + เซ็นธุรกรรมสำเร็จแล้ว ธุรกรรมพร้อมที่จะถ่ายทอด + + + Unknown error processing transaction. + เกิดข้อผิดพลาดที่ไม่รู้จักในการประมวลผลธุรกรรม + + + Transaction broadcast successfully! Transaction ID: %1 + การถ่ายทอดธุรกรรมสำเร็จ! รหัสธุรกรรม: %1 + + + Transaction broadcast failed: %1 + การส่งธุรกรรมล้มเหลว: %1 + + + PSBT copied to clipboard. + PSBT คัดลอกไปยังคลิปบอร์ดแล้ว + + + Save Transaction Data + บันทึกข้อมูลธุรกรรม + + + Partially Signed Transaction (Binary) + Expanded name of the binary PSBT file format. See: BIP 174. + ธุรกรรมที่ลงนามบางส่วน (ไบนารี) + + + PSBT saved to disk. + PSBT ถูกบันทึกลงดิสก์. + + + Sends %1 to %2 + ส่ง %1 ไปยัง %2 + + + own address + ที่อยู่ของตนเอง + + + Unable to calculate transaction fee or total transaction amount. + ไม่สามารถคำนวณค่าธรรมเนียมการทำรายการหรือยอดรวมการทำรายการได้ + + + Pays transaction fee: + ชำระค่าธรรมเนียมการทำธุรกรรม: + + + or + หรือ + + + Transaction has %1 unsigned inputs. + ธุรกรรมมีอินพุตที่ไม่ได้เซ็น %1 รายการ + + + Transaction is missing some information about inputs. + การทำธุรกรรมขาดข้อมูลบางอย่างเกี่ยวกับอินพุต + + + Transaction still needs signature(s). + การทำธุรกรรมยังต้องการลายเซ็น(s). + + + (But no wallet is loaded.) + (แต่ว่าไม่มีกระเป๋าเงินถูกโหลด.) + + + (But this wallet cannot sign transactions.) + (แต่กระเป๋าเงินนี้ไม่สามารถลงนามธุรกรรมได้) + + + (But this wallet does not have the right keys.) + (แต่กระเป๋าเงินนี้ไม่มีคีย์ที่ถูกต้อง) + + + Transaction is fully signed and ready for broadcast. + การทำธุรกรรมลงนามครบถ้วนแล้วและพร้อมสำหรับการประกาศ + + + Transaction status is unknown. + สถานะของธุรกรรมไม่ทราบแน่ชัด + + + + PaymentServer + + Payment request error + ข้อผิดพลาดในการขอชำระเงิน + + + Cannot start bitcoin: click-to-pay handler + ไม่สามารถเริ่มต้นบิตคอยน์: ตัวจัดการคลิกเพื่อจ่าย + + + URI handling + การจัดการ URI + + + 'bitcoin://' is not a valid URI. Use 'bitcoin:' instead. + 'bitcoin://' ไม่ใช่ URI ที่ถูกต้อง ใช้ 'bitcoin:' แทน + + + Cannot process payment request because BIP70 is not supported. +Due to widespread security flaws in BIP70 it's strongly recommended that any merchant instructions to switch wallets be ignored. +If you are receiving this error you should request the merchant provide a BIP21 compatible URI. + ไม่สามารถดำเนินการคำขอชำระเงินได้เนื่องจาก BIP70 ไม่ได้รับการรองรับ +เนื่องจากมีข้อบกพร่องด้านความปลอดภัยอย่างแพร่หลายในการใช้ BIP70 จึงขอแนะนำอย่างยิ่งให้เพิกเฉยต่อคำแนะนำของพ่อค้าในการเปลี่ยนกระเป๋าเงิน +หากคุณได้รับข้อผิดพลาดนี้คุณควรขอให้พ่อค้าจัดเตรียม URI ที่รองรับ BIP21 + + + URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters. + ไม่สามารถแยก URI ได้! สิ่งนี้อาจเกิดจากที่อยู่ Bitcoin ที่ไม่ถูกต้องหรือพารามิเตอร์ URI ที่ผิดรูปแบบ + + + Payment request file handling + การจัดการไฟล์คำขอการชำระเงิน + + + + PeerTableModel + + Peer + Title of Peers Table column which contains a unique number used to identify a connection. + เพื่อน (Phûuean) + + + Age + Title of Peers Table column which indicates the duration (length of time) since the peer connection started. + อายุ + + + Direction + Title of Peers Table column which indicates the direction the peer connection was initiated from. + ทิศทาง (Thít-thāng) + + + Sent + Title of Peers Table column which indicates the total amount of network information we have sent to the peer. + ส่ง (sòng) + + + Received + Title of Peers Table column which indicates the total amount of network information we have received from the peer. + ได้รับ + + + Address + Title of Peers Table column which contains the IP/Onion/I2P address of the connected peer. + ที่อยู่ + + + Type + Title of Peers Table column which describes the type of peer connection. The "type" describes why the connection exists. + ประเภท + + + Inbound + An Inbound Connection from a Peer. + ขาเข้า +(Pronunciation: kǎa-kâo) + + + Outbound + An Outbound Connection to a Peer. + ออกเดินทาง (òk dern thāng) + + + + RPCConsole + + Local Addresses + ที่อยู่ท้องถิ่น + + + Network addresses that your Bitcoin node is currently using to communicate with other nodes. + ที่อยู่เครือข่ายที่โหนด Bitcoin ของคุณกำลังใช้ในการสื่อสารกับโหนดอื่นๆ + + + Block chain + บล็อกเชน + + + Memory Pool + หน่วยความจำพูล + + + Current number of transactions + จำนวนธุรกรรมปัจจุบัน + + + Memory usage + การใช้งานหน่วยความจำ + + + Wallet: + กระเป๋าสตางค์ + + + (none) + (ไม่มี) + + + Received + ได้รับ + + + Sent + ส่ง (sòng) - - - QObject - %1 didn't yet exit safely… - %1 ยังไม่ออกอย่างปลอดภัย... + &Peers + เพื่อนร่วมงาน - - %n second(s) - - %n second(s) - + + Banned peers + เพื่อนที่ถูกแบน (Phuean thi thuk baen) - - %n minute(s) - - %n minute(s) - + + Select a peer to view detailed information. + เลือกเพื่อนร่วมงานเพื่อดูข้อมูลรายละเอียด - - %n hour(s) - - %n hour(s) - + + Hide Peers Detail + ซ่อนรายละเอียดเพื่อนร่วมงาน - - %n day(s) - - %n day(s) - + + Ctrl+X + ตัด (Tàd) - - %n week(s) - - %n week(s) - + + The transport layer version: %1 + เวอร์ชันของชั้นการขนส่ง: %1 - - %n year(s) - - %n year(s) - + + Session ID + รหัสเซสชัน (Rát sét-chân) - - - BitcoinGUI - Change the passphrase used for wallet encryption - เปลี่ยนรหัสผ่านที่ใช้สำหรับการเข้ารหัสกระเป๋าเงิน + Whether we relay transactions to this peer. + ไม่ว่าความเราจะส่งการทำธุรกรรมไปยังเพื่อนนี้หรือไม่ - Encrypt the private keys that belong to your wallet - เข้ารหัสกุญแจส่วนตัวที่เป็นของกระเป๋าสตางค์ของคุณ + Transaction Relay + การส่งต่อธุรกรรม (Kan song tor thurakham) - Sign messages with your Bitcoin addresses to prove you own them - เซ็นชื่อด้วยข้อความ ที่เก็บ Bitcoin เพื่อแสดงว่าท่านเป็นเจ้าของ bitcoin นี้จริง + Starting Block + บล็อกเริ่มต้น (Blók Rêrm Tôn) - Verify messages to ensure they were signed with specified Bitcoin addresses - ตรวจสอบ ข้อความ เพื่อให้แน่ใจว่า การเซ็นต์ชื่อ ด้วยที่เก็บ Bitcoin แล้ว + Synced Headers + หัวข้อที่ซิงค์ (Huākhāo thī sìngk) - &File - &ไฟล์ + Synced Blocks + บล็อกที่ซิงค์ (Blok thi sing) - &Settings - &การตั้งค่า + Last Transaction + ธุรกรรมล่าสุด (Thurakam lasut) - &Help - &ช่วยเหลือ + The mapped Autonomous System used for diversifying peer selection. + ระบบอัตโนมัติที่ทำการแมปเพื่อใช้ในการกระจายการเลือกเพื่อน - Tabs toolbar - แถบเครื่องมือแท็บ + Whether we relay addresses to this peer. + Tooltip text for the Address Relay field in the peer details area, which displays whether we relay addresses to this peer (Yes/No). + เราจะส่งที่อยู่ให้กับเพื่อนคนนี้หรือไม่ - Connecting to peers… - กำลังเชื่อมต่อ ไปยัง peers… + Address Relay + Text title for the Address Relay field in the peer details area, which displays whether we relay addresses to this peer (Yes/No). + การส่งต่อที่อยู่ (Kān sòng tōr thī̀ yùu) - Request payments (generates QR codes and bitcoin: URIs) - ขอการชำระเงิน (สร้างรหัส QR และ bitcoin: URIs) + The total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting). + Tooltip text for the Addresses Processed field in the peer details area, which displays the total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting). + จำนวนที่อยู่ทั้งหมดที่ได้รับจากเพื่อนนี้ที่ได้รับการประมวลผล (ไม่รวมที่อยู่ที่ถูกยกเลิกเนื่องจากการจำกัดอัตรา) - Show the list of used sending addresses and labels - แสดงรายการที่ใช้ในการส่งแอดเดรสและเลเบลที่ใช้แล้ว + The total number of addresses received from this peer that were dropped (not processed) due to rate-limiting. + Tooltip text for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting. + จำนวนที่อยู่ทั้งหมดที่ได้รับจากเพื่อนนี้ที่ถูกทิ้ง (ไม่ได้ประมวลผล) เนื่องจากการจำกัดอัตรา - Show the list of used receiving addresses and labels - แสดงรายการที่ได้ใช้ในการรับแอดเดรสและเลเบล + Addresses Processed + Text title for the Addresses Processed field in the peer details area, which displays the total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting). + ที่อยู่ที่ประมวลผล - &Command-line options - &ตัวเลือก Command-line + Addresses Rate-Limited + Text title for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting. + ที่อยู่ถูกจำกัดอัตรา - - Processed %n block(s) of transaction history. - - ประมวลผล %n บล็อกของประวัติการทำธุรกรรม - + + Node window + หน้าต่างโหนด - %1 behind - %1 เบื้องหลัง + Current block height + ความสูงของบล็อกปัจจุบัน (Khwam sung khong blok pachuban) - Catching up… - กำลังติดตามถึงรายการล่าสุด… + Open the %1 debug log file from the current data directory. This can take a few seconds for large log files. + เปิดไฟล์บันทึกการดีบัก %1 จากไดเรกทอรีข้อมูลปัจจุบัน ซึ่งอาจใช้เวลาสักครู่สำหรับไฟล์บันทึกขนาดใหญ่ - Last received block was generated %1 ago. - บล็อกที่ได้รับล่าสุดถูกสร้างขึ้นเมื่อ %1 ที่แล้ว + Decrease font size + ลดขนาดตัวอักษร - Transactions after this will not yet be visible. - ธุรกรรมหลังจากนี้จะยังไม่ปรากฏให้เห็น + Increase font size + เพิ่มขนาดตัวอักษร (Pêr̂m khà-nàd tûa-òk-sŏn) - Error - ข้อผิดพลาด + Permissions + สิทธิ์ (Sìt) or การอนุญาต (Kān Anuyāt) - Warning - คำเตือน + The direction and type of peer connection: %1 + ทิศทางและประเภทของการเชื่อมต่อระหว่างเพื่อน: %1 - Information - ข้อมูล + Direction/Type + ทิศทาง/ประเภท (Títhāng / Bpràphêd) - Up to date - ปัจจุบัน + The BIP324 session ID string in hex. + สตริง ID เซสชัน BIP324 ในรูปแบบเฮกซ์ - Load PSBT from &clipboard… - โหลด PSBT จากคลิปบอร์ด... + The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS. + โปรโตคอลเครือข่ายที่เพื่อนนี้เชื่อมต่อผ่าน: IPv4, IPv6, Onion, I2P, หรือ CJDNS. - Node window - หน้าต่างโหนด + Services + บริการ (Borisat) - &Sending addresses - &ที่อยู่การส่ง + High bandwidth BIP152 compact block relay: %1 + การส่งข้อมูลบล็อกแบบคอมแพค BIP152 ความกว้างแบนด์วิธสูง: %1 - &Receiving addresses - &ที่อยู่การรับ + Connection Time + เวลาเชื่อมต่อ (Wela Chueamto) - Open Wallet - เปิดกระเป๋าสตางค์ + Elapsed time since a novel block passing initial validity checks was received from this peer. + เวลาที่ผ่านไปตั้งแต่ได้รับบล็อกใหม่ที่ผ่านการตรวจสอบความถูกต้องเบื้องต้นจากเพื่อนนี้ - Open a wallet - เปิดกระเป๋าสตางค์ + Last Block + บล็อกสุดท้าย (Blók Sùt Tái) - Close wallet - ปิดกระเป๋าสตางค์ + Elapsed time since a novel transaction accepted into our mempool was received from this peer. + Tooltip text for the Last Transaction field in the peer details area. + เวลาที่ผ่านไปตั้งแต่การทำธุรกรรมใหม่ที่ได้รับการยอมรับเข้าสู่ mempool ของเราได้รับจากเพื่อนนี้ - Restore Wallet… - Name of the menu item that restores wallet from a backup file. - กู้คืนวอลเล็ต… + Last Send + ส่งสุดท้าย (Song Soot Thai) - Restore a wallet from a backup file - Status tip for Restore Wallet menu item - กู้คืนวอลเล็ตจากไฟล์สำรองข้อมูล + Last Receive + ได้รับล่าสุด - Close all wallets - ปิด วอลเล็ต ทั้งหมด + Ping Time + เวลาในการปิง - &Mask values - &ค่ามาสก์ + The duration of a currently outstanding ping. + ระยะเวลาของปิงที่ยังค้างอยู่ในขณะนี้ - Load Wallet Backup - The title for Restore Wallet File Windows - โหลดสำรองข้อมูลวอลเล็ต + Ping Wait + รอปิง - - %n active connection(s) to Bitcoin network. - A substring of the tooltip. - - %n active connection(s) to Bitcoin network. - + + Min Ping + มินผิง - Click for more actions. - A substring of the tooltip. "More actions" are available via the context menu. - คลิกเพื่อดูการดำเนินการเพิ่มเติม + Time Offset + เวลาออฟเซ็ต - - - CoinControlDialog - L&ock unspent - L&ock ที่ไม่ได้ใข้ + Last block time + เวลาบล็อกสุดท้าย - &Unlock unspent - &ปลดล็อค ที่ไม่ไดใช้ + &Open + เปิด - (no label) - (ไม่มีเลเบล) + &Console + &คอนโซล - change from %1 (%2) - เปลี่ยน จาก %1 (%2) + &Network Traffic + การรับส่งข้อมูลเครือข่าย - (change) - (เปลี่ยน) + Totals + ผลรวม - - - CreateWalletActivity - Create Wallet - Title of window indicating the progress of creation of a new wallet. - สร้าง วอลเล็ต + Debug log file + ไฟล์บันทึกดีบัก - Creating Wallet <b>%1</b>… - Descriptive text of the create wallet progress window which indicates to the user which wallet is currently being created. - กำลังสร้าง วอลเล็ต <b>%1</b>… + Clear console + ล้างคอนโซล - Create wallet failed - การสร้าง วอลเล็ต ล้มเหลว + In: + ใน - Create wallet warning - คำเตือน การสร้าง วอลเล็ต + Out: + ออก - Can't list signers - ไม่สามารถ จัดรายการ ผู้เซ็น + Inbound: initiated by peer + Explanatory text for an inbound peer connection. + ขาเข้า: เริ่มต้นโดยปัสสาวะ - - - LoadWalletsActivity - Load Wallets - Title of progress window which is displayed when wallets are being loaded. - โหลด วอลเล็ต + Outbound Full Relay: default + Explanatory text for an outbound peer connection that relays all network information. This is the default behavior for outbound connections. + การส่งต่อแบบเต็มขาออก: ค่าเริ่มต้น - Loading wallets… - Descriptive text of the load wallets progress window which indicates to the user that wallets are currently being loaded. - กำลังโหลด วอลเล็ต... + Outbound Block Relay: does not relay transactions or addresses + Explanatory text for an outbound peer connection that relays network information about blocks and not transactions or addresses. + การส่งบล็อกขาออก: ไม่ส่งต่อธุรกรรมหรือที่อยู่ - + + &Copy address + Context menu action to copy the address of a peer. + ที่อยู่ &Copy + + + None + ไม่มี (Mai mee) + + - Intro - - %n GB of space available - - %n GB of space available - + ReceiveCoinsDialog + + &Copy address + ที่อยู่ &Copy - - (of %n GB needed) - - (of %n GB needed) - + + Copy &label + คัดลอก & ป้าย - - (%n GB needed for full chain) - - (%n GB needed for full chain) - + + Copy &amount + คัดลอก &จำนวน - - (sufficient to restore backups %n day(s) old) - Explanatory text on the capability of the current prune target. - - (sufficient to restore backups %n day(s) old) - + + Could not unlock wallet. + ไม่สามารถปลดล็อกกระเป๋าเงินได้ - RPCConsole + ReceiveRequestDialog - Node window - หน้าต่างโหนด + Amount: + จำนวน + + + Wallet: + กระเป๋าสตางค์ + + + &Save Image… + บันทึกรูปภาพ... RecentRequestsTableModel + + Date + วันที่ + + + Label + การส่งออกล้มเหลว + (no label) - (ไม่มีเลเบล) + ไม่มีป้ายกำกับ SendCoinsDialog + + Quantity: + ปริมาณ: + + + Bytes: + ไบต์ + + + Amount: + จำนวน + + + Fee: + ค่าธรรมเนียม + + + After Fee: + หลังค่าธรรมเนียม: + + + Change: + การเปลี่ยนแปลง + + + Hide + ซ่อน + + + Copy quantity + จำนวนสำเนา + + + Copy amount + จำนวนคัดลอก + + + Copy fee + ค่าลอกสำเนา (kâa lók sàm-náo) + + + Copy after fee + คัดลอกหลังค่าธรรมเนียม + + + Copy bytes + คัดลอกไบต์ + + + Copy change + การเปลี่ยนแปลงข้อความ + + + Save Transaction Data + บันทึกข้อมูลธุรกรรม + + + Partially Signed Transaction (Binary) + Expanded name of the binary PSBT file format. See: BIP 174. + ธุรกรรมที่ลงนามบางส่วน (ไบนารี) + + + or + หรือ + Estimated to begin confirmation within %n block(s). @@ -318,23 +2503,140 @@ (no label) - (ไม่มีเลเบล) + ไม่มีป้ายกำกับ + + SendCoinsEntry + + Paste address from clipboard + วางที่อยู่จากคลิปบอร์ด + + + + SignVerifyMessageDialog + + Paste address from clipboard + วางที่อยู่จากคลิปบอร์ด + + TransactionDesc + + Date + วันที่ + + + unknown + ไม่ทราบ (mai saap) + + + own address + ที่อยู่ของตนเอง + matures in %n more block(s) matures in %n more block(s) + + Amount + จำนวน: + TransactionTableModel + + Date + วันที่ + + + Type + ประเภท + + + Label + การส่งออกล้มเหลว + (no label) - (ไม่มีเลเบล) + ไม่มีป้ายกำกับ + + + + TransactionView + + &Copy address + ที่อยู่ &Copy + + + Copy &label + คัดลอก & ป้าย + + + Copy &amount + คัดลอก &จำนวน + + + Comma separated file + Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values. + ไฟล์ที่แยกด้วยเครื่องหมายจุลภาค + + + Confirmed + ยืนยัน + + + Date + วันที่ + + + Type + ประเภท + + + Label + การส่งออกล้มเหลว + + + Address + ที่อยู่ + + + Exporting Failed + การส่งออกล้มเหลว + + + + WalletFrame + + Create a new wallet + สร้างกระเป๋าใหม่ + + + Error + ข้อผิดพลาด + + WalletView + + &Export + &ส่งออก + + + Export the data in the current tab to a file + ส่งออกข้อมูลในแท็บปัจจุบันไปยังไฟล์ + + + Wallet Data + Name of the wallet data file format. + ข้อมูลกระเป๋าเงิน + + + Cancel + ยกเลิก + + \ No newline at end of file diff --git a/src/qt/locale/bitcoin_tl.ts b/src/qt/locale/bitcoin_tl.ts index f0e34993c48..49ce14378ad 100644 --- a/src/qt/locale/bitcoin_tl.ts +++ b/src/qt/locale/bitcoin_tl.ts @@ -90,7 +90,7 @@ Signing is only possible with addresses of the type 'legacy'. There was an error trying to save the address list to %1. Please try again. An error message. %1 is a stand-in argument for the name of the file we attempted to save to. - May mali sa pagsubok na i-save ang listahan ng address sa 1%1. Pakisubukan ulit. + May mali sa pagsubok na i-save ang listahan ng address sa %1. Pakisubukan ulit. Exporting Failed @@ -242,7 +242,7 @@ Signing is only possible with addresses of the type 'legacy'. A fatal error occurred. %1 can no longer continue safely and will quit. - Malubhang pagkakamali ay naganap. 1%1 hindi na pwedeng magpatuloy ng ligtas at ihihinto na. + Malubhang pagkakamali ay naganap. %1 hindi na pwedeng magpatuloy ng ligtas at ihihinto na. Internal error @@ -250,7 +250,7 @@ Signing is only possible with addresses of the type 'legacy'. An internal error occurred. %1 will attempt to continue safely. This is an unexpected bug which can be reported as described below. - May panloob na pagkakamali ang naganap. 1%1 ay magtatangkang ituloy na ligtas. Ito ay hindi inaasahan na problema na maaaring i-ulat katulad ng pagkalarawan sa ibaba. + May panloob na pagkakamali ang naganap. %1 ay magtatangkang ituloy na ligtas. Ito ay hindi inaasahan na problema na maaaring i-ulat katulad ng pagkalarawan sa ibaba. @@ -267,11 +267,11 @@ Signing is only possible with addresses of the type 'legacy'. Error: %1 - Pagkakamali: 1%1 + Pagkakamali: %1 %1 didn't yet exit safely… - 1%1 hindi pa nag-exit ng ligtas... + %1 hindi pa nag-exit ng ligtas... Amount @@ -352,11 +352,11 @@ Signing is only possible with addresses of the type 'legacy'. &About %1 - &Tungkol sa 1%1 + &Tungkol sa %1 Show information about %1 - Ipakita ang impormasyon tungkol sa 1%1 + Ipakita ang impormasyon tungkol sa %1 About &Qt @@ -368,7 +368,7 @@ Signing is only possible with addresses of the type 'legacy'. Modify configuration options for %1 - Baguhin ang mga pagpipilian sa ♦configuration♦ para sa 1%1 + Baguhin ang mga pagpipilian sa ♦configuration♦ para sa %1 Create a new wallet @@ -669,7 +669,7 @@ Signing is only possible with addresses of the type 'legacy'. Error: %1 - Pagkakamali: 1%1 + Pagkakamali: %1 Warning: %1 diff --git a/src/qt/locale/bitcoin_ur.ts b/src/qt/locale/bitcoin_ur.ts index 1bf6208f8ce..7e3f8630f7d 100644 --- a/src/qt/locale/bitcoin_ur.ts +++ b/src/qt/locale/bitcoin_ur.ts @@ -747,24 +747,24 @@ Signing is only possible with addresses of the type 'legacy'. Warning: %1 - 1%1 انتباہ + %1 انتباہ Date: %1 - 1%1' تاریخ۔ + %1' تاریخ۔ Amount: %1 - 1%1' مقدار + %1' مقدار Wallet: %1 - 1%1' والیٹ + %1' والیٹ @@ -776,13 +776,13 @@ Signing is only possible with addresses of the type 'legacy'. Label: %1 - 1%1'لیبل + %1'لیبل Address: %1 - 1%1' پتہ + %1' پتہ diff --git a/src/qt/locale/bitcoin_zh_CN.ts b/src/qt/locale/bitcoin_zh_CN.ts index ae29726a14a..bc0592b2ea0 100644 --- a/src/qt/locale/bitcoin_zh_CN.ts +++ b/src/qt/locale/bitcoin_zh_CN.ts @@ -3355,6 +3355,10 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos &Sign Message 消息签名(&S) + + You can sign messages/agreements with your legacy (P2PKH) addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. + 您可以使用您的 (P2PKH)格式 地址签署消息 / 协议,以证明您对这个地址有发送或接收比特币的权限。钓鱼攻击可能试图欺骗您签署您的身份,所以请仔细分辨,不要签署任何含混不清的协议。只签署你完全认同并理解的协议 。 + The Bitcoin address to sign the message with 用来对消息签名的地址 diff --git a/src/qt/networkstyle.cpp b/src/qt/networkstyle.cpp index 78ab4c1efa7..b37d1fe84e0 100644 --- a/src/qt/networkstyle.cpp +++ b/src/qt/networkstyle.cpp @@ -14,6 +14,7 @@ #include #include +#include // IWYU pragma: keep static const struct { const ChainType networkId; @@ -84,7 +85,7 @@ NetworkStyle::NetworkStyle(const QString &_appName, const int iconColorHueShift, trayAndWindowIcon = QIcon(pixmap.scaled(QSize(256,256))); } -const NetworkStyle* NetworkStyle::instantiate(const ChainType networkId) +const NetworkStyle* NetworkStyle::instantiate(const ChainType networkId) // NOLINT(misc-no-recursion) { std::string titleAddText = networkId == ChainType::LIQUID1 ? "" : strprintf("[%s]", ChainTypeToString(networkId)); for (const auto& network_style : network_styles) { diff --git a/src/qt/res/bitcoin-qt-res.rc b/src/qt/res/bitcoin-qt-res.rc index cebd8f31697..53eb1fb7f07 100644 --- a/src/qt/res/bitcoin-qt-res.rc +++ b/src/qt/res/bitcoin-qt-res.rc @@ -21,7 +21,7 @@ BEGIN BEGIN BLOCK "040904E4" // U.S. English - multilingual (hex) BEGIN - VALUE "CompanyName", "Elements" + VALUE "CompanyName", CLIENT_NAME " project" VALUE "FileDescription", CLIENT_NAME VALUE "FileVersion", VER_FILEVERSION_STR VALUE "InternalName", "elements-qt" diff --git a/src/qt/sendcoinsdialog.cpp b/src/qt/sendcoinsdialog.cpp index d3205f9004c..70ad009621a 100644 --- a/src/qt/sendcoinsdialog.cpp +++ b/src/qt/sendcoinsdialog.cpp @@ -34,6 +34,7 @@ #include #include +#include #include #include #include @@ -474,7 +475,7 @@ bool SendCoinsDialog::signWithExternalSigner(PartiallySignedTransaction& psbtx, return false; } if (err) { - tfm::format(std::cerr, "Failed to sign PSBT"); + qWarning() << "Failed to sign PSBT"; processSendCoinsReturn(WalletModel::TransactionCreationFailed); return false; } @@ -868,6 +869,10 @@ void SendCoinsDialog::updateCoinControlState() } void SendCoinsDialog::updateNumberOfBlocks(int count, const QDateTime& blockDate, double nVerificationProgress, SyncType synctype, SynchronizationState sync_state) { + // During shutdown, clientModel will be nullptr. Attempting to update views at this point may cause a crash + // due to accessing backend models that might no longer exist. + if (!clientModel) return; + // Process event if (sync_state == SynchronizationState::POST_INIT) { updateSmartFeeLabel(); } diff --git a/src/qt/test/CMakeLists.txt b/src/qt/test/CMakeLists.txt index 549b74613c6..f36d3a61466 100644 --- a/src/qt/test/CMakeLists.txt +++ b/src/qt/test/CMakeLists.txt @@ -14,6 +14,10 @@ add_executable(test_elements-qt ../../init/bitcoin-qt.cpp ) +set_target_properties(test_elements-qt PROPERTIES + SKIP_BUILD_RPATH OFF +) + target_link_libraries(test_elements-qt core_interface bitcoinqt diff --git a/src/qt/test/wallettests.cpp b/src/qt/test/wallettests.cpp index bf4a377bd82..b509d07ebf1 100644 --- a/src/qt/test/wallettests.cpp +++ b/src/qt/test/wallettests.cpp @@ -271,9 +271,9 @@ struct MiniGUI { // // This also requires overriding the default minimal Qt platform: // -// QT_QPA_PLATFORM=xcb src/qt/test/test_bitcoin-qt # Linux -// QT_QPA_PLATFORM=windows src/qt/test/test_bitcoin-qt # Windows -// QT_QPA_PLATFORM=cocoa src/qt/test/test_bitcoin-qt # macOS +// QT_QPA_PLATFORM=xcb build/bin/test_bitcoin-qt # Linux +// QT_QPA_PLATFORM=windows build/bin/test_bitcoin-qt # Windows +// QT_QPA_PLATFORM=cocoa build/bin/test_bitcoin-qt # macOS void TestGUI(interfaces::Node& node, const std::shared_ptr& wallet) { // Create widgets for sending coins and listing transactions. diff --git a/src/random.cpp b/src/random.cpp index 5b605e988d0..685beb1fdba 100644 --- a/src/random.cpp +++ b/src/random.cpp @@ -41,9 +41,6 @@ #ifdef HAVE_SYSCTL_ARND #include #endif -#if defined(HAVE_STRONG_GETAUXVAL) && defined(__aarch64__) -#include -#endif namespace { @@ -189,62 +186,6 @@ uint64_t GetRdSeed() noexcept #endif } -#elif defined(__aarch64__) && defined(HWCAP2_RNG) - -bool g_rndr_supported = false; - -void InitHardwareRand() -{ - if (getauxval(AT_HWCAP2) & HWCAP2_RNG) { - g_rndr_supported = true; - } -} - -void ReportHardwareRand() -{ - // This must be done in a separate function, as InitHardwareRand() may be indirectly called - // from global constructors, before logging is initialized. - if (g_rndr_supported) { - LogPrintf("Using RNDR and RNDRRS as additional entropy sources\n"); - } -} - -/** Read 64 bits of entropy using rndr. - * - * Must only be called when RNDR is supported. - */ -uint64_t GetRNDR() noexcept -{ - uint8_t ok = 0; - uint64_t r1; - do { - // https://developer.arm.com/documentation/ddi0601/2022-12/AArch64-Registers/RNDR--Random-Number - __asm__ volatile("mrs %0, s3_3_c2_c4_0; cset %w1, ne;" - : "=r"(r1), "=r"(ok)::"cc"); - if (ok) break; - __asm__ volatile("yield"); - } while (true); - return r1; -} - -/** Read 64 bits of entropy using rndrrs. - * - * Must only be called when RNDRRS is supported. - */ -uint64_t GetRNDRRS() noexcept -{ - uint8_t ok = 0; - uint64_t r1; - do { - // https://developer.arm.com/documentation/ddi0601/2022-12/AArch64-Registers/RNDRRS--Reseeded-Random-Number - __asm__ volatile("mrs %0, s3_3_c2_c4_1; cset %w1, ne;" - : "=r"(r1), "=r"(ok)::"cc"); - if (ok) break; - __asm__ volatile("yield"); - } while (true); - return r1; -} - #else /* Access to other hardware random number generators could be added here later, * assuming it is sufficiently fast (in the order of a few hundred CPU cycles). @@ -263,12 +204,6 @@ void SeedHardwareFast(CSHA512& hasher) noexcept { hasher.Write((const unsigned char*)&out, sizeof(out)); return; } -#elif defined(__aarch64__) && defined(HWCAP2_RNG) - if (g_rndr_supported) { - uint64_t out = GetRNDR(); - hasher.Write((const unsigned char*)&out, sizeof(out)); - return; - } #endif } @@ -294,14 +229,6 @@ void SeedHardwareSlow(CSHA512& hasher) noexcept { } return; } -#elif defined(__aarch64__) && defined(HWCAP2_RNG) - if (g_rndr_supported) { - for (int i = 0; i < 4; ++i) { - uint64_t out = GetRNDRRS(); - hasher.Write((const unsigned char*)&out, sizeof(out)); - } - return; - } #endif } diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp index 84ceaafa299..d6fd5fc33e8 100644 --- a/src/rpc/blockchain.cpp +++ b/src/rpc/blockchain.cpp @@ -229,6 +229,7 @@ UniValue blockheaderToJSON(const CBlockIndex& tip, const CBlockIndex& blockindex if (!g_signed_blocks) { result.pushKV("nonce", (uint64_t)blockindex->nNonce); result.pushKV("bits", strprintf("%08x", blockindex->nBits)); + result.pushKV("target", GetTarget(*blockindex, pow_limit).GetHex()); result.pushKV("difficulty", GetDifficulty(*blockindex)); result.pushKV("chainwork", blockindex->nChainWork.GetHex()); } else { @@ -641,7 +642,6 @@ static RPCHelpMan getblockheader() {RPCResult::Type::NUM_TIME, "mediantime", "The median block time expressed in " + UNIX_EPOCH_TIME}, {RPCResult::Type::NUM, "nonce", /*optional=*/true, "The nonce"}, {RPCResult::Type::STR_HEX, "bits", /*optional=*/true, "The bits"}, - {RPCResult::Type::STR_HEX, "target", /*optional=*/true, "The difficulty target"}, {RPCResult::Type::NUM, "difficulty", /*optional=*/true, "The difficulty"}, {RPCResult::Type::STR_HEX, "chainwork", /*optional=*/true, "Expected number of hashes required to produce the current chain"}, {RPCResult::Type::NUM, "nTx", "The number of transactions in the block"}, @@ -843,7 +843,6 @@ static RPCHelpMan getblock() {RPCResult::Type::NUM_TIME, "mediantime", "The median block time expressed in " + UNIX_EPOCH_TIME}, {RPCResult::Type::NUM, "nonce", /*optional=*/true, "The nonce"}, {RPCResult::Type::STR_HEX, "bits", /*optional=*/true, "The bits"}, - {RPCResult::Type::STR_HEX, "target", /*optional=*/true, "The difficulty target"}, {RPCResult::Type::NUM, "difficulty", /*optional=*/true, "The difficulty"}, {RPCResult::Type::STR_HEX, "chainwork", /*optional=*/true, "Expected number of hashes required to produce the chain up to this block"}, {RPCResult::Type::NUM, "nTx", "The number of transactions in the block"}, @@ -867,7 +866,7 @@ static RPCHelpMan getblock() {RPCResult::Type::ELISION, "", ""} }}, }}, - {RPCResult::Type::OBJ, "proposed", "Proposed parameters. Uninforced. Must be published in full", + {RPCResult::Type::OBJ, "proposed", "Proposed parameters. Unenforced. Must be published in full", { {RPCResult::Type::ELISION, "", "same entries as \"current\""} }}, @@ -976,7 +975,9 @@ std::optional GetPruneHeight(const BlockManager& blockman, const CChain& ch static RPCHelpMan pruneblockchain() { - return RPCHelpMan{"pruneblockchain", "", + return RPCHelpMan{"pruneblockchain", + "Attempts to delete block and undo data up to a specified height or timestamp, if eligible for pruning.\n" + "Requires `-prune` to be enabled at startup. While pruned data may be re-fetched in some cases (e.g., via `getblockfrompeer`), local deletion is irreversible.\n", { {"height", RPCArg::Type::NUM, RPCArg::Optional::NO, "The block height to prune up to. May be set to a discrete height, or to a " + UNIX_EPOCH_TIME + "\n" " to prune blocks whose block time is at least 2 hours older than the provided timestamp."}, @@ -1454,14 +1455,14 @@ RPCHelpMan getblockchaininfo() {RPCResult::Type::NUM, "blocks", "the height of the most-work fully-validated chain. The genesis block has height 0"}, {RPCResult::Type::NUM, "headers", "the current number of headers we have validated"}, {RPCResult::Type::STR, "bestblockhash", "the hash of the currently best block"}, - /* ELEMENTS: not present {RPCResult::Type::NUM, "difficulty", "the current difficulty"}, */ - {RPCResult::Type::STR_HEX, "bits", "nBits: compact representation of the block difficulty target"}, - {RPCResult::Type::STR_HEX, "target", "The difficulty target"}, + {RPCResult::Type::STR_HEX, "bits", /*optional=*/true, "nBits: compact representation of the block difficulty target"}, + {RPCResult::Type::STR_HEX, "target", /*optional=*/true, "The difficulty target"}, + {RPCResult::Type::NUM, "difficulty", /*optional=*/true, "the current difficulty"}, {RPCResult::Type::NUM_TIME, "time", "The block time expressed in " + UNIX_EPOCH_TIME}, {RPCResult::Type::NUM_TIME, "mediantime", "The median block time expressed in " + UNIX_EPOCH_TIME}, {RPCResult::Type::NUM, "verificationprogress", "estimate of verification progress [0..1]"}, {RPCResult::Type::BOOL, "initialblockdownload", "(debug information) estimate of whether this node is in Initial Block Download mode"}, - /* ELEMENTS: not present {RPCResult::Type::STR_HEX, "chainwork", "total amount of work in active chain, in hexadecimal"}, */ + {RPCResult::Type::STR_HEX, "chainwork", /*optional=*/true, "total amount of work in active chain, in hexadecimal"}, {RPCResult::Type::NUM, "size_on_disk", "the estimated size of the block and undo files on disk"}, {RPCResult::Type::BOOL, "pruned", "if the blocks are subject to pruning"}, {RPCResult::Type::BOOL, "trim_headers", "whether header trimming is enabled (-trim-headers)"}, @@ -2477,7 +2478,7 @@ static RPCHelpMan scantxoutset() {RPCResult::Type::STR_HEX, "scriptPubKey", "The output script"}, {RPCResult::Type::STR, "desc", "A specialized descriptor for the matched output script"}, {RPCResult::Type::STR_AMOUNT, "amount", "The total amount in " + CURRENCY_UNIT + " of the unspent output"}, - {RPCResult::Type::STR_HEX, "asset", "The asset ID"}, + {RPCResult::Type::STR_HEX, "asset", /*optional=*/true, "The asset ID"}, {RPCResult::Type::BOOL, "coinbase", "Whether this is a coinbase output"}, {RPCResult::Type::NUM, "height", "Height of the unspent transaction output"}, {RPCResult::Type::STR_HEX, "blockhash", "Blockhash of the unspent transaction output"}, @@ -2526,7 +2527,7 @@ static RPCHelpMan scantxoutset() throw JSONRPCError(RPC_INVALID_PARAMETER, "Scan already in progress, use action \"abort\" or \"status\""); } - if (request.params.size() < 2) { + if (request.params[1].isNull()) { throw JSONRPCError(RPC_MISC_ERROR, "scanobjects argument is required for the start action"); } @@ -2900,7 +2901,7 @@ static RPCHelpMan getdescriptoractivity() {RPCResult::Type::STR_HEX, "blockhash", /*optional=*/true, "The blockhash this spend appears in (omitted if unconfirmed)"}, {RPCResult::Type::NUM, "height", /*optional=*/true, "Height of the spend (omitted if unconfirmed)"}, {RPCResult::Type::STR_HEX, "spend_txid", "The txid of the spending transaction"}, - {RPCResult::Type::NUM, "spend_vout", "The vout of the spend"}, + {RPCResult::Type::NUM, "spend_vin", "The input index of the spend"}, {RPCResult::Type::STR_HEX, "prevout_txid", "The txid of the prevout"}, {RPCResult::Type::NUM, "prevout_vout", "The vout of the prevout"}, {RPCResult::Type::OBJ, "prevout_spk", "", ScriptPubKeyDoc()}, @@ -3679,10 +3680,10 @@ static RPCHelpMan getsidechaininfo() RPCResult::Type::OBJ, "", "", { {RPCResult::Type::STR_HEX, "fedpegscript", "The fedpegscript from genesis block"}, - {RPCResult::Type::ARR, "current_fedpegscripts", "The currently-enforced fedpegscripts in hex. Peg-ins for any entries on this list are honored by consensus and policy. Newest first. Two total entries are possible", - {{RPCResult::Type::STR_HEX, "", "active fedpegscript"}}}, {RPCResult::Type::ARR, "current_fedpeg_programs", "The currently-enforced fedpegscript scriptPubKeys in hex. Prior to a transition this may be P2SH scriptpubkey, otherwise it will be a native segwit script. Results are paired in-order with current_fedpegscripts", {{RPCResult::Type::STR_HEX, "", "active fedpegscript scriptPubKeys"}}}, + {RPCResult::Type::ARR, "current_fedpegscripts", "The currently-enforced fedpegscripts in hex. Peg-ins for any entries on this list are honored by consensus and policy. Newest first. Two total entries are possible", + {{RPCResult::Type::STR_HEX, "", "active fedpegscript"}}}, {RPCResult::Type::STR_HEX, "pegged_asset", "Pegged asset type"}, {RPCResult::Type::STR, "min_peg_diff", "The minimum difficulty parent chain header target. Peg-in headers that have less work will be rejected as an anti-Dos measure"}, {RPCResult::Type::STR_HEX, "parent_blockhash", "The parent genesis blockhash as source of pegged-in funds"}, diff --git a/src/rpc/mempool.cpp b/src/rpc/mempool.cpp index bc1ddb341e0..14ff773af18 100644 --- a/src/rpc/mempool.cpp +++ b/src/rpc/mempool.cpp @@ -695,7 +695,7 @@ UniValue MempoolInfoToJSON(const CTxMemPool& pool) ret.pushKV("minrelaytxfee", ValueFromAmount(pool.m_opts.min_relay_feerate.GetFeePerK())); ret.pushKV("incrementalrelayfee", ValueFromAmount(pool.m_opts.incremental_relay_feerate.GetFeePerK())); ret.pushKV("unbroadcastcount", uint64_t{pool.GetUnbroadcastTxs().size()}); - ret.pushKV("fullrbf", true); + ret.pushKV("fullrbf", false); return ret; } @@ -717,7 +717,7 @@ static RPCHelpMan getmempoolinfo() {RPCResult::Type::STR_AMOUNT, "minrelaytxfee", "Current minimum relay fee for transactions"}, {RPCResult::Type::NUM, "incrementalrelayfee", "minimum fee rate increment for mempool limiting or replacement in " + CURRENCY_UNIT + "/kvB"}, {RPCResult::Type::NUM, "unbroadcastcount", "Current number of transactions that haven't passed initial broadcast yet"}, - {RPCResult::Type::BOOL, "fullrbf", "True if the mempool accepts RBF without replaceability signaling inspection (DEPRECATED)"}, + {RPCResult::Type::BOOL, "fullrbf", "True if the mempool accepts RBF without replaceability signaling inspection (DEPRECATED). Always false: this mempool requires BIP125 opt-in signaling for replacement, except for TRUC transactions."}, }}, RPCExamples{ HelpExampleCli("getmempoolinfo", "") diff --git a/src/rpc/mining.cpp b/src/rpc/mining.cpp index d620a286ff4..ac1b7c30a68 100644 --- a/src/rpc/mining.cpp +++ b/src/rpc/mining.cpp @@ -450,14 +450,14 @@ static RPCHelpMan getmininginfo() {RPCResult::Type::NUM, "networkhashps", /*optional=*/true, "The network hashes per second"}, {RPCResult::Type::NUM, "pooledtx", "The size of the mempool"}, {RPCResult::Type::STR, "chain", "current network name (" LIST_CHAIN_NAMES ")"}, - {RPCResult::Type::STR_HEX, "signet_challenge", /*optional=*/true, "The block challenge (aka. block script), in hexadecimal (only present if the current network is a signet)"}, - {RPCResult::Type::OBJ, "next", "The next block", + {RPCResult::Type::OBJ, "next", /*optional=*/true, "The next block", { {RPCResult::Type::NUM, "height", "The next height"}, {RPCResult::Type::STR_HEX, "bits", "The next target nBits"}, {RPCResult::Type::NUM, "difficulty", "The next difficulty"}, {RPCResult::Type::STR_HEX, "target", "The next target"} }}, + {RPCResult::Type::STR_HEX, "signet_challenge", /*optional=*/true, "The block challenge (aka. block script), in hexadecimal (only present if the current network is a signet)"}, (IsDeprecatedRPCEnabled("warnings") ? RPCResult{RPCResult::Type::STR, "warnings", "any network and blockchain warnings (DEPRECATED)"} : RPCResult{RPCResult::Type::ARR, "warnings", "any network and blockchain warnings (run with `-deprecatedrpc=warnings` to return the latest warning as a single string)", @@ -663,6 +663,10 @@ static RPCHelpMan getblocktemplate() RPCResult{"If the proposal was not accepted with mode=='proposal'", RPCResult::Type::STR, "", "According to BIP22"}, RPCResult{"Otherwise", RPCResult::Type::OBJ, "", "", { + {RPCResult::Type::ARR, "capabilities", "", + { + {RPCResult::Type::STR, "value", "A supported feature, for example 'proposal'"}, + }}, {RPCResult::Type::NUM, "version", "The preferred block version"}, {RPCResult::Type::ARR, "rules", "specific block rules that are to be enforced", { @@ -672,10 +676,6 @@ static RPCHelpMan getblocktemplate() { {RPCResult::Type::NUM, "rulename", "identifies the bit number as indicating acceptance and readiness for the named softfork rule"}, }}, - {RPCResult::Type::ARR, "capabilities", "", - { - {RPCResult::Type::STR, "value", "A supported feature, for example 'proposal'"}, - }}, {RPCResult::Type::NUM, "vbrequired", "bit mask of versionbits the server requires set in submissions"}, {RPCResult::Type::STR, "previousblockhash", "The hash of current highest block"}, {RPCResult::Type::ARR, "transactions", "contents of non-coinbase transactions that should be included in the next block", @@ -1259,10 +1259,10 @@ static RPCHelpMan getnewblockhex() options.min_tx_age = std::chrono::seconds(required_wait); options.proposed_entry = proposed; options.commit_scripts = data_commitments; - + std::unique_ptr pblocktemplate(BlockAssembler(chainman.ActiveChainstate(), node.mempool.get(), options).CreateNewBlock()); if (!pblocktemplate.get()) { - throw JSONRPCError(RPC_INTERNAL_ERROR, "Wallet keypool empty"); + throw JSONRPCError(RPC_INTERNAL_ERROR, "Block template empty"); } { @@ -1310,7 +1310,7 @@ static RPCHelpMan combineblocksigs() }, }, }, - {"witnessScript", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "The hex-encoded witnessScript for the signblockscript"}, + {"witnessScript", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "The hex-encoded witnessScript for the signblockscript. Required for dynafed blocks; omitted for non-dynafed blocks."}, }, RPCResult{ RPCResult::Type::OBJ, "", "", @@ -1391,7 +1391,7 @@ static RPCHelpMan getcompactsketch() {"block_hex", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "Hex serialized block proposal from `getnewblockhex`."}, }, RPCResult{ - RPCResult::Type::STR, "sketch", "serialized block sketch", + RPCResult::Type::STR_HEX, "sketch", "serialized block sketch", }, RPCExamples{ HelpExampleCli("getcompactsketch", ""), @@ -1471,13 +1471,11 @@ static RPCHelpMan consumecompactsketch() if (req.indexes.empty()) { std::shared_ptr pblock = std::make_shared(); std::vector dummy; - ReadStatus status = partialBlock.FillBlock(*pblock, dummy, false /* don't get pow */); + ReadStatus status = partialBlock.FillBlock(*pblock, dummy, /*segwit_active=*/true); if (status == READ_STATUS_INVALID) { throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "Bogus crap sketch."); } else if (status == READ_STATUS_FAILED) { throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "Failed to complete block though all transactions were apparently found. Could be random short ID collision; requires full block instead."); - } else if (status == READ_STATUS_CHECKBLOCK_FAILED) { - throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "Checkblock failed."); } DataStream ssBlock{}; ssBlock << TX_WITH_WITNESS(*pblock); diff --git a/src/rpc/net.cpp b/src/rpc/net.cpp index bc7081a625c..43c40ae5c53 100644 --- a/src/rpc/net.cpp +++ b/src/rpc/net.cpp @@ -80,7 +80,7 @@ static RPCHelpMan ping() { return RPCHelpMan{"ping", "\nRequests that a ping be sent to all other nodes, to measure ping time.\n" - "Results provided in getpeerinfo, pingtime and pingwait fields are decimal seconds.\n" + "Results are provided in getpeerinfo.\n" "Ping command is handled in queue with all other commands, so it measures processing backlog, not just network ping.\n", {}, RPCResult{RPCResult::Type::NONE, "", ""}, @@ -145,9 +145,9 @@ static RPCHelpMan getpeerinfo() {RPCResult::Type::NUM, "bytesrecv", "The total bytes received"}, {RPCResult::Type::NUM_TIME, "conntime", "The " + UNIX_EPOCH_TIME + " of the connection"}, {RPCResult::Type::NUM, "timeoffset", "The time offset in seconds"}, - {RPCResult::Type::NUM, "pingtime", /*optional=*/true, "The last ping time in milliseconds (ms), if any"}, - {RPCResult::Type::NUM, "minping", /*optional=*/true, "The minimum observed ping time in milliseconds (ms), if any"}, - {RPCResult::Type::NUM, "pingwait", /*optional=*/true, "The duration in milliseconds (ms) of an outstanding ping (if non-zero)"}, + {RPCResult::Type::NUM, "pingtime", /*optional=*/true, "The last ping time in seconds, if any"}, + {RPCResult::Type::NUM, "minping", /*optional=*/true, "The minimum observed ping time in seconds, if any"}, + {RPCResult::Type::NUM, "pingwait", /*optional=*/true, "The duration in seconds of an outstanding ping (if non-zero)"}, {RPCResult::Type::NUM, "version", "The peer version, such as 70001"}, {RPCResult::Type::STR, "subver", "The string version"}, {RPCResult::Type::BOOL, "inbound", "Inbound (true) or Outbound (false)"}, diff --git a/src/rpc/node.cpp b/src/rpc/node.cpp index 2dccb4827ae..895e930481f 100644 --- a/src/rpc/node.cpp +++ b/src/rpc/node.cpp @@ -333,7 +333,7 @@ static RPCHelpMan echoipc() // and spawn bitcoin-echo below instead of bitcoin-node. But // using bitcoin-node avoids the need to build and install a // new executable just for this one test. - auto init = ipc->spawnProcess("bitcoin-node"); + auto init = ipc->spawnProcess("elements-node"); echo = init->makeEcho(); ipc->addCleanup(*echo, [init = init.release()] { delete init; }); } else { @@ -422,7 +422,8 @@ static RPCHelpMan tweakfedpegscript() RPCResult::Type::OBJ, "", "", { {RPCResult::Type::STR_HEX, "script", "The fedpegscript tweaked with claim_script"}, - {RPCResult::Type::STR, "address", "The address corresponding to the tweaked fedpegscript"}, + {RPCResult::Type::STR, "p2wsh", "The native segwit address for the tweaked fedpegscript"}, + {RPCResult::Type::STR, "p2shwsh", "The P2SH-wrapped segwit address for the tweaked fedpegscript"}, } }, RPCExamples{""}, @@ -492,7 +493,11 @@ static RPCHelpMan getpakinfo() { {RPCResult::Type::OBJ, "block_paklist", "The PAK list loaded from latest epoch", { - {RPCResult::Type::ELISION, "", ""} + {RPCResult::Type::ARR, "online", "Online PAK pubkeys in hex", + {{RPCResult::Type::STR_HEX, "", "online pubkey"}}}, + {RPCResult::Type::ARR, "offline", "Offline PAK pubkeys in hex", + {{RPCResult::Type::STR_HEX, "", "offline pubkey"}}}, + {RPCResult::Type::BOOL, "reject", "Whether peg-outs are rejected (no offline keys)"}, }}, } }, @@ -516,9 +521,9 @@ static RPCHelpMan calcfastmerkleroot() return RPCHelpMan{"calcfastmerkleroot", "\nhidden utility RPC for computing sha2 midstates\n", { - {"leaves", RPCArg::Type::ARR, RPCArg::Optional::NO, "array of data to compute the fast merkle root of.", + {"leaves", RPCArg::Type::ARR, RPCArg::Optional::NO, "Array of 32-byte hashes to compute the fast merkle root of.", { - {"data", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "hex-encoded data"}, + {"hash", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "32-byte hex-encoded hash"}, }}, }, RPCResult{ @@ -548,12 +553,12 @@ static RPCHelpMan calcfastmerkleroot() static RPCHelpMan dumpassetlabels() { return RPCHelpMan{"dumpassetlabels", - "\nLists all known asset id/label pairs in this wallet. This list can be modified with `-assetdir` configuration argument.\n", + "\nLists all known asset label/id pairs known to this node. This list can be modified with the `-assetdir` configuration argument.\n", {}, RPCResult{ RPCResult::Type::OBJ, "labels", "", { - {RPCResult::Type::ELISION, "", "the label for each asset id"}, + {RPCResult::Type::ELISION, "", "the asset id (hex) for each label"}, }, }, RPCExamples{ @@ -623,7 +628,7 @@ static RPCHelpMan createblindedaddress() {"blinding_key", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "The blinding public key. This can be obtained for a given address using `getaddressinfo` (`confidential_key` field)."}, }, RPCResult{ - RPCResult::Type::STR, "blinded_address", "The blinded address" + RPCResult::Type::STR, "", "The blinded address" }, RPCExamples{ "\nCreate a blinded address\n" diff --git a/src/rpc/output_script.cpp b/src/rpc/output_script.cpp index 4605f8129c0..21d069e90a9 100644 --- a/src/rpc/output_script.cpp +++ b/src/rpc/output_script.cpp @@ -51,7 +51,7 @@ static RPCHelpMan validateaddress() {RPCResult::Type::STR, "address", ""}, {RPCResult::Type::STR_HEX, "scriptPubKey", "The hex-encoded scriptPubKey generated by the address"}, {RPCResult::Type::STR_HEX, "confidential_key", "The raw blinding public key for that address, if any. \"\" if none"}, - {RPCResult::Type::STR_HEX, "unconfidential", "The address without confidentiality key"}, + {RPCResult::Type::STR, "unconfidential", "The address without confidentiality key"}, {RPCResult::Type::BOOL, "isscript", "If the key is a script"}, {RPCResult::Type::BOOL, "iswitness", "If the address is a witness address"}, {RPCResult::Type::NUM, "witness_version", /*optional=*/true, "The version number of the witness program"}, @@ -353,7 +353,7 @@ static RPCHelpMan deriveaddresses() throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, error); } auto& desc = descs.at(0); - if (!desc->IsRange() && request.params.size() > 1) { + if (!desc->IsRange() && !request.params[1].isNull()) { throw JSONRPCError(RPC_INVALID_PARAMETER, "Range should not be specified for an un-ranged descriptor"); } diff --git a/src/rpc/rawtransaction.cpp b/src/rpc/rawtransaction.cpp index 2ea9c3e21c4..8be5d3d5e66 100644 --- a/src/rpc/rawtransaction.cpp +++ b/src/rpc/rawtransaction.cpp @@ -98,17 +98,16 @@ static std::vector DecodeTxDoc(const std::string& txid_field_doc) { return { // When updating this documentation, update `getrawtransaction` in the same way. - {RPCResult::Type::STR_HEX, "txid", "The transaction id"}, + {RPCResult::Type::STR_HEX, "txid", txid_field_doc}, {RPCResult::Type::STR_HEX, "hash", "The transaction hash (differs from txid for witness transactions)"}, - {RPCResult::Type::OBJ, "fee", "The fee specified in the transaction", {}, /*skip_type_check=*/true}, // Elements: this is an object + {RPCResult::Type::STR_HEX, "wtxid", /*optional=*/true, "The witness transaction id"}, + {RPCResult::Type::STR_HEX, "withash", /*optional=*/true, "Hash of witness serialization only"}, + {RPCResult::Type::NUM, "version", "The version"}, {RPCResult::Type::NUM, "size", "The serialized transaction size"}, {RPCResult::Type::NUM, "vsize", "The virtual transaction size (differs from size for witness transactions)"}, {RPCResult::Type::NUM, "weight", "The transaction's weight (between vsize*4-3 and vsize*4)"}, {RPCResult::Type::NUM, "discountvsize", /*optional=*/true, "The discounted virtual transaction size, only differs from vsize for Confidential Transactions"}, {RPCResult::Type::NUM, "discountweight", /*optional=*/true, "The discounted transaction weight, only differs from weight for Confidential Transactions"}, - {RPCResult::Type::STR_HEX, "withash", /*optional=*/true, "The hash of the witness"}, - {RPCResult::Type::STR_HEX, "wtxid", /*optional=*/true, "Hash of the serialized transaction, including witness data"}, - {RPCResult::Type::NUM, "version", "The version"}, {RPCResult::Type::NUM_TIME, "locktime", "The lock time"}, {RPCResult::Type::ARR, "vin", "", { @@ -122,27 +121,27 @@ static std::vector DecodeTxDoc(const std::string& txid_field_doc) {RPCResult::Type::STR, "asm", "Disassembly of the signature script"}, {RPCResult::Type::STR_HEX, "hex", "The raw signature script bytes, hex-encoded"}, }}, + {RPCResult::Type::BOOL, "is_pegin", /*optional=*/true, "Whether this input is a peg-in (if not coinbase transaction)"}, + {RPCResult::Type::NUM, "sequence", "The script sequence number"}, {RPCResult::Type::ARR, "txinwitness", /*optional=*/true, "", { - {RPCResult::Type::STR_HEX, "hex", "hex-encoded witness data (if any)"}, + {RPCResult::Type::STR_HEX, "", "hex-encoded witness stack item (if any)"}, }}, - {RPCResult::Type::NUM, "sequence", "The script sequence number"}, - {RPCResult::Type::BOOL, "is_pegin", /*optional=*/true, "Is this input a pegin"}, {RPCResult::Type::ARR, "pegin_witness", /*optional=*/true, "", { - {RPCResult::Type::STR_HEX, "", "hex-encoded witness data (if any)"}, + {RPCResult::Type::STR_HEX, "", "hex-encoded peg-in witness stack item (if any)"}, }}, - {RPCResult::Type::OBJ, "issuance", /*optional=*/true, "", + {RPCResult::Type::OBJ, "issuance", /*optional=*/true, "Asset issuance data (if present on input)", { - {RPCResult::Type::STR_HEX, "assetBlindingNonce", /*optional=*/true, ""}, - {RPCResult::Type::STR_HEX, "assetEntropy", /*optional=*/true, ""}, - {RPCResult::Type::BOOL, "isreissuance", /*optional=*/true, ""}, - {RPCResult::Type::STR_HEX, "token", /*optional=*/true, ""}, - {RPCResult::Type::STR_HEX, "asset", /*optional=*/true, ""}, - {RPCResult::Type::STR_AMOUNT, "assetamount", /*optional=*/true, ""}, - {RPCResult::Type::STR_HEX, "assetamountcommitment", /*optional=*/true, ""}, - {RPCResult::Type::STR_AMOUNT, "tokenamount", /*optional=*/true, ""}, - {RPCResult::Type::STR_HEX, "tokenamountcommitment", /*optional=*/true, ""}, + {RPCResult::Type::STR_HEX, "assetBlindingNonce", "The asset blinding nonce"}, + {RPCResult::Type::STR_HEX, "assetEntropy", "The asset entropy"}, + {RPCResult::Type::BOOL, "isreissuance", "Whether this is a reissuance"}, + {RPCResult::Type::STR_HEX, "token", /*optional=*/true, "The reissuance token id (omitted for reissuances)"}, + {RPCResult::Type::STR_HEX, "asset", "The asset id"}, + {RPCResult::Type::STR_AMOUNT, "assetamount", /*optional=*/true, "The explicit issued asset amount"}, + {RPCResult::Type::STR_HEX, "assetamountcommitment", /*optional=*/true, "The blinded issued asset amount commitment"}, + {RPCResult::Type::STR_AMOUNT, "tokenamount", /*optional=*/true, "The explicit reissuance token amount"}, + {RPCResult::Type::STR_HEX, "tokenamountcommitment", /*optional=*/true, "The blinded reissuance token amount commitment"}, }}, }}, }}, @@ -150,22 +149,33 @@ static std::vector DecodeTxDoc(const std::string& txid_field_doc) { {RPCResult::Type::OBJ, "", "", { - {RPCResult::Type::NUM, "value", "The value in " + CURRENCY_UNIT}, - {RPCResult::Type::STR_AMOUNT, "value", /*optional=*/true, "The value in " + CURRENCY_UNIT}, + {RPCResult::Type::STR_AMOUNT, "value", /*optional=*/true, "The value in " + CURRENCY_UNIT + " (explicit outputs, or decoded confidential value)"}, {RPCResult::Type::STR_AMOUNT, "value-minimum", /*optional=*/true, "Minimum decoded value for confidential outputs"}, {RPCResult::Type::STR_AMOUNT, "value-maximum", /*optional=*/true, "Maximum decoded value for confidential outputs"}, - {RPCResult::Type::NUM, "ct-exponent", /*optional=*/true, "Confidential transaction exponent"}, - {RPCResult::Type::NUM, "ct-bits", /*optional=*/true, "Confidential transaction mantissa bits"}, - {RPCResult::Type::STR_HEX, "valuecommitment", /*optional=*/true, "Hex value commitment for confidential outputs"}, - {RPCResult::Type::STR_HEX, "surjectionproof", /*optional=*/true, "Asset surjection proof"}, + {RPCResult::Type::NUM, "ct-exponent", /*optional=*/true, "Confidential transaction value exponent"}, + {RPCResult::Type::NUM, "ct-bits", /*optional=*/true, "Confidential transaction value mantissa bits"}, + {RPCResult::Type::STR_HEX, "valuecommitment", /*optional=*/true, "Hex-encoded value commitment for confidential outputs"}, + {RPCResult::Type::STR_HEX, "surjectionproof", /*optional=*/true, "Hex-encoded asset surjection proof"}, {RPCResult::Type::STR_HEX, "asset", /*optional=*/true, "Explicit asset id"}, - {RPCResult::Type::STR_HEX, "assetcommitment", /*optional=*/true, "Asset commitment"}, - {RPCResult::Type::STR_HEX, "commitmentnonce", /*optional=*/true, "Nonce commitment for confidential outputs"}, + {RPCResult::Type::STR_HEX, "assetcommitment", /*optional=*/true, "Hex-encoded asset commitment"}, + {RPCResult::Type::STR_HEX, "commitmentnonce", /*optional=*/true, "Hex-encoded output blinding pubkey or nonce commitment"}, {RPCResult::Type::BOOL, "commitmentnonce_fully_valid", /*optional=*/true, "Whether the nonce commitment parses as a valid pubkey"}, - {RPCResult::Type::NUM, "n", "index"}, - {RPCResult::Type::OBJ, "scriptPubKey", "", ScriptPubKeyDoc()}, + {RPCResult::Type::NUM, "n", "The output index"}, + {RPCResult::Type::OBJ, "scriptPubKey", "", Cat>(ScriptPubKeyDoc(), { + {RPCResult::Type::STR_HEX, "pegout_chain", /*optional=*/true, "Parent chain genesis block hash (peg-out outputs only)"}, + {RPCResult::Type::STR, "pegout_asm", /*optional=*/true, "Disassembly of the peg-out output script"}, + {RPCResult::Type::STR, "pegout_desc", /*optional=*/true, "Inferred descriptor for the peg-out output script"}, + {RPCResult::Type::STR_HEX, "pegout_hex", /*optional=*/true, "The peg-out output script bytes, hex-encoded"}, + {RPCResult::Type::STR, "pegout_address", /*optional=*/true, "The peg-out address on the parent chain"}, + {RPCResult::Type::STR, "pegout_type", /*optional=*/true, "The peg-out output script type"}, + })}, }}, }}, + {RPCResult::Type::OBJ, "fee", /*optional=*/true, "Fee output totals mapped by asset id", { + {RPCResult::Type::ELISION, "", "fee amount for each asset"}, + }, /*skip_type_check=*/true}, + {RPCResult::Type::STR_HEX, "blockhash", /*optional=*/true, "The block hash"}, + {RPCResult::Type::STR_HEX, "hex", /*optional=*/true, "The serialized, hex-encoded transaction"}, }; } @@ -333,19 +343,16 @@ static RPCHelpMan getrawtransaction() }, { RPCResult{"if verbosity is not set or set to 0", - RPCResult::Type::STR, "data", "The serialized transaction as a hex-encoded string for 'txid'" + RPCResult::Type::STR_HEX, "data", "The serialized transaction as a hex-encoded string for 'txid'" }, RPCResult{"if verbosity is set to 1", RPCResult::Type::OBJ, "", "", Cat>( { {RPCResult::Type::BOOL, "in_active_chain", /*optional=*/true, "Whether specified block is in the active chain or not (only present with explicit \"blockhash\" argument)"}, - {RPCResult::Type::STR_HEX, "blockhash", /*optional=*/true, "the block hash"}, {RPCResult::Type::NUM, "confirmations", /*optional=*/true, "The confirmations"}, {RPCResult::Type::NUM_TIME, "blocktime", /*optional=*/true, "The block time expressed in " + UNIX_EPOCH_TIME}, {RPCResult::Type::NUM, "time", /*optional=*/true, "Same as \"blocktime\""}, - {RPCResult::Type::OBJ, "fee", "The fee supplied for the transaction.", {}, /*skip_type_check=*/true}, // ELEMENTS: this is an object (assetId and value), but in bitcoin this is a STR_AMOUNT - {RPCResult::Type::STR_HEX, "hex", "The serialized, hex-encoded data for 'txid'"}, }, DecodeTxDoc(/*txid_field_doc=*/"The transaction id (same as provided)")), }, @@ -353,7 +360,6 @@ static RPCHelpMan getrawtransaction() RPCResult::Type::OBJ, "", "", { {RPCResult::Type::ELISION, "", "Same output as verbosity = 1"}, - {RPCResult::Type::NUM, "fee", /*optional=*/true, "transaction fee in " + CURRENCY_UNIT + ", omitted if block undo data is not available"}, {RPCResult::Type::ARR, "vin", "", { {RPCResult::Type::OBJ, "", "utxo being spent", @@ -705,7 +711,7 @@ static RPCHelpMan combinerawtransaction() }, }, RPCResult{ - RPCResult::Type::STR, "", "The hex-encoded raw transaction with signature(s)" + RPCResult::Type::STR_HEX, "", "The hex-encoded raw transaction with signature(s)" }, RPCExamples{ HelpExampleCli("combinerawtransaction", R"('["myhex1", "myhex2", "myhex3"]')") @@ -789,7 +795,7 @@ static RPCHelpMan signrawtransactionwithkey() {"hexstring", RPCArg::Type::STR, RPCArg::Optional::NO, "The transaction hex string"}, {"privkeys", RPCArg::Type::ARR, RPCArg::Optional::NO, "The base58-encoded private keys for signing", { - {"privatekey", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "private key in base58-encoding"}, + {"privatekey", RPCArg::Type::STR, RPCArg::Optional::OMITTED, "private key in base58-encoding"}, }, }, {"prevtxs", RPCArg::Type::ARR, RPCArg::Optional::OMITTED, "The previous dependent transaction outputs", @@ -951,6 +957,35 @@ const RPCResult decodepsbt_inputs{ { {RPCResult::Type::STR_HEX, "", "hex-encoded witness data (if any)"}, }}, + {RPCResult::Type::STR_HEX, "previous_txid", /*optional=*/ true, "The TXID of the prevout"}, + {RPCResult::Type::NUM, "previous_vout", /*optional=*/ true, "The output index of the prevout"}, + {RPCResult::Type::NUM, "sequence", /*optional=*/ true, "The sequence number"}, + {RPCResult::Type::NUM, "time_locktime", /*optional=*/ true, "The required time-based locktime for this input"}, + {RPCResult::Type::NUM, "height_locktime", /*optional=*/ true, "The required height-based locktime for this input"}, + {RPCResult::Type::STR_AMOUNT, "issuance_value", /*optional=*/ true, "The explicit issuance value"}, + {RPCResult::Type::STR_HEX, "issuance_value_commitment", /*optional=*/ true, "The issuance value commitment"}, + {RPCResult::Type::STR_HEX, "issuance_value_rangeproof", /*optional=*/ true, "The issuance value rangeproof"}, + {RPCResult::Type::STR_HEX, "blind_issuance_value_proof", /*optional=*/ true, "The blind issuance value proof"}, + {RPCResult::Type::STR_AMOUNT, "issuance_reissuance_amount", /*optional=*/ true, "The explicit reissuance token amount"}, + {RPCResult::Type::STR_HEX, "issuance_reissuance_amount_commitment", /*optional=*/ true, "The reissuance token amount commitment"}, + {RPCResult::Type::STR_HEX, "issuance_reissuance_amount_rangeproof", /*optional=*/ true, "The reissuance token amount rangeproof"}, + {RPCResult::Type::STR_HEX, "blind_reissuance_amount_proof", /*optional=*/ true, "The blind reissuance token amount proof"}, + {RPCResult::Type::STR_HEX, "issuance_blinding_nonce", /*optional=*/ true, "The issuance blinding nonce"}, + {RPCResult::Type::STR_HEX, "issuance_asset_entropy", /*optional=*/ true, "The issuance asset entropy"}, + {RPCResult::Type::STR_HEX, "pegin_bitcoin_tx", /*optional=*/ true, "The hex-encoded Bitcoin transaction"}, + {RPCResult::Type::STR_HEX, "pegin_txout_proof", /*optional=*/ true, "The hex-encoded raw txout proof"}, + {RPCResult::Type::STR_HEX, "pegin_claim_script", /*optional=*/ true, "The peg-in claim script"}, + {RPCResult::Type::STR_HEX, "pegin_genesis_hash", /*optional=*/ true, "The hex-encoded genesis block hash of the parent chain"}, + {RPCResult::Type::STR_AMOUNT, "pegin_value", /*optional=*/ true, "The peg-in value"}, + {RPCResult::Type::ARR, "pegin_witness", /*optional=*/ true, "The peg-in witness stack", + {{RPCResult::Type::STR_HEX, "", "hex-encoded witness item"}}}, + {RPCResult::Type::STR_HEX, "utxo_rangeproof", /*optional=*/ true, "The UTXO range proof"}, + {RPCResult::Type::STR_HEX, "asset_proof", /*optional=*/ true, "The asset proof"}, + {RPCResult::Type::STR_HEX, "explicit_asset", /*optional=*/ true, "The explicit asset type"}, + {RPCResult::Type::STR_AMOUNT, "explicit_value", /*optional=*/ true, "The explicit value"}, + {RPCResult::Type::STR_HEX, "value_proof", /*optional=*/ true, "The value proof"}, + {RPCResult::Type::BOOL, "blinded_issuance", /*optional=*/ true, "Whether the issuance is blinded"}, + {RPCResult::Type::STR, "status", /*optional=*/true, "Status"}, {RPCResult::Type::OBJ_DYN, "ripemd160_preimages", /*optional=*/ true, "", { {RPCResult::Type::STR, "hash", "The hash and preimage that corresponds to it."}, @@ -1004,35 +1039,21 @@ const RPCResult decodepsbt_inputs{ }}, {RPCResult::Type::STR_HEX, "taproot_internal_key", /*optional=*/ true, "The hex-encoded Taproot x-only internal key"}, {RPCResult::Type::STR_HEX, "taproot_merkle_root", /*optional=*/ true, "The hex-encoded Taproot merkle root"}, - {RPCResult::Type::OBJ_DYN, "unknown", /*optional=*/ true, "The unknown input fields", - { - {RPCResult::Type::STR_HEX, "key", "(key-value pair) An unknown key-value pair"}, - }}, {RPCResult::Type::ARR, "proprietary", /*optional=*/true, "The input proprietary map", - { - {RPCResult::Type::OBJ, "", "", { - {RPCResult::Type::STR_HEX, "identifier", "The hex string for the proprietary identifier"}, - {RPCResult::Type::NUM, "subtype", "The number for the subtype"}, - {RPCResult::Type::STR_HEX, "key", "The hex for the key"}, - {RPCResult::Type::STR_HEX, "value", "The hex for the value"}, + {RPCResult::Type::OBJ, "", "", + { + {RPCResult::Type::STR_HEX, "identifier", "The hex string for the proprietary identifier"}, + {RPCResult::Type::NUM, "subtype", "The number for the subtype"}, + {RPCResult::Type::STR_HEX, "key", "The hex for the key"}, + {RPCResult::Type::STR_HEX, "value", "The hex for the value"}, + }}, + }}, + }}, + {RPCResult::Type::OBJ_DYN, "unknown", /*optional=*/ true, "The unknown input fields", + { + {RPCResult::Type::STR_HEX, "key", "(key-value pair) An unknown key-value pair"}, }}, - }}, - {RPCResult::Type::STR_HEX, "previous_txid", /*optional=*/ true, "The TXID of the prevout"}, - {RPCResult::Type::NUM, "previous_vout", /*optional=*/ true, "The output index of the prevout"}, - {RPCResult::Type::NUM, "sequence", /*optional=*/ true, "The sequence number"}, - {RPCResult::Type::STR_HEX, "pegin_bitcoin_tx", /*optional=*/ true, "The hex-encoded Bitcoin transaction"}, - {RPCResult::Type::STR_HEX, "pegin_claim_script", /*optional=*/ true, "The peg-in claim script"}, - {RPCResult::Type::STR_HEX, "pegin_genesis_hash", /*optional=*/ true, "The hex-encoded genesis block hash of the parent chain"}, - {RPCResult::Type::STR_HEX, "pegin_txout_proof", /*optional=*/ true, "The hex-encoded raw txout proof"}, - {RPCResult::Type::STR_AMOUNT, "pegin_value", /*optional=*/ true, "The peg-in value"}, - {RPCResult::Type::STR_HEX, "utxo_rangeproof", /*optional=*/ true, "The UTXO range proof"}, - {RPCResult::Type::STR_HEX, "asset_proof", /*optional=*/ true, "The asset proof"}, - {RPCResult::Type::STR_HEX, "explicit_asset", /*optional=*/ true, "The explicit asset type"}, - {RPCResult::Type::STR_AMOUNT, "explicit_value", /*optional=*/ true, "The explicit value"}, - {RPCResult::Type::STR_HEX, "value_proof", /*optional=*/ true, "The value proof"}, - {RPCResult::Type::STR, "status", /*optional=*/true, "Status"}, - }}, } }; @@ -1062,6 +1083,26 @@ const RPCResult decodepsbt_outputs{ {RPCResult::Type::STR, "path", "The path"}, }}, }}, + {RPCResult::Type::STR_AMOUNT, "amount", /*optional=*/true, "The value in " + CURRENCY_UNIT}, + {RPCResult::Type::OBJ, "script", /*optional=*/true, "The output script (scriptPubKey) for this output", + { + {RPCResult::Type::STR, "asm", "Disassembly of the public key script"}, + {RPCResult::Type::STR, "desc", "Inferred descriptor for the output"}, + {RPCResult::Type::STR_HEX, "hex", "The raw public key script bytes, hex-encoded"}, + {RPCResult::Type::STR, "type", "The type, eg 'pubkeyhash'"}, + {RPCResult::Type::STR, "address", /*optional=*/true, "The Bitcoin address (only if a well-defined address exists)"}, + }}, + {RPCResult::Type::STR_HEX, "value_commitment", /*optional=*/true, "The value commitment"}, + {RPCResult::Type::STR_HEX, "asset_commitment", /*optional=*/true, "The asset commitment"}, + {RPCResult::Type::STR_HEX, "asset", /*optional=*/true, "The asset type"}, + {RPCResult::Type::STR_HEX, "rangeproof", /*optional=*/true, "The rangeproof"}, + {RPCResult::Type::STR_HEX, "surjection_proof", /*optional=*/true, "The surjection proof"}, + {RPCResult::Type::STR_HEX, "ecdh_pubkey", /*optional=*/true, "The ECDH pubkey"}, + {RPCResult::Type::STR_HEX, "blinding_pubkey", /*optional=*/true, "The blinding pubkey"}, + {RPCResult::Type::NUM, "blinder_index", /*optional=*/true, "Output index of the blinder for this output"}, + {RPCResult::Type::STR_HEX, "blind_value_proof", /*optional=*/true, "The blind value proof"}, + {RPCResult::Type::STR_HEX, "blind_asset_proof", /*optional=*/true, "The blind asset proof"}, + {RPCResult::Type::STR, "status", /*optional=*/true, "Status"}, {RPCResult::Type::STR_HEX, "taproot_internal_key", /*optional=*/ true, "The hex-encoded Taproot x-only internal key"}, {RPCResult::Type::ARR, "taproot_tree", /*optional=*/ true, "The tuples that make up the Taproot tree, in depth first search order", { @@ -1085,10 +1126,6 @@ const RPCResult decodepsbt_outputs{ }}, }}, }}, - {RPCResult::Type::OBJ_DYN, "unknown", /*optional=*/true, "The unknown output fields", - { - {RPCResult::Type::STR_HEX, "key", "(key-value pair) An unknown key-value pair"}, - }}, {RPCResult::Type::ARR, "proprietary", /*optional=*/true, "The output proprietary map", { {RPCResult::Type::OBJ, "", "", @@ -1099,26 +1136,10 @@ const RPCResult decodepsbt_outputs{ {RPCResult::Type::STR_HEX, "value", "The hex for the value"}, }}, }}, - {RPCResult::Type::NUM, "amount", /*optional=*/true, "The value in " + CURRENCY_UNIT}, - {RPCResult::Type::STR_HEX, "asset", /*optional=*/true, "The asset type"}, - {RPCResult::Type::OBJ, "script", "", + {RPCResult::Type::OBJ_DYN, "unknown", /*optional=*/true, "The unknown output fields", { - {RPCResult::Type::STR, "asm", "Disassembly of the public key script"}, - {RPCResult::Type::STR, "desc", "Inferred descriptor for the output"}, - {RPCResult::Type::STR_HEX, "hex", "The raw public key script bytes, hex-encoded"}, - {RPCResult::Type::STR, "type", "The type, eg 'pubkeyhash'"}, - {RPCResult::Type::STR, "address", /*optional=*/true, "The Bitcoin address (only if a well-defined address exists)"}, + {RPCResult::Type::STR_HEX, "key", "(key-value pair) An unknown key-value pair"}, }}, - {RPCResult::Type::NUM, "blinder_index", /*optional=*/true, "Output index of the blinder for this output"}, - {RPCResult::Type::STR_HEX, "blinding_pubkey", /*optional=*/true, "The blinding pubkey"}, - {RPCResult::Type::STR, "status", /*optional=*/true, "Status"}, - {RPCResult::Type::STR, "asset_commitment", /*optional=*/true, "The asset commitment"}, - {RPCResult::Type::STR, "blind_asset_proof", /*optional=*/true, "The blind asset proof"}, - {RPCResult::Type::STR, "blind_value_proof", /*optional=*/true, "The blind value proof"}, - {RPCResult::Type::STR, "ecdh_pubkey", /*optional=*/true, "The ECDH pubkey"}, - {RPCResult::Type::STR, "rangeproof", /*optional=*/true, "The rangeproof"}, - {RPCResult::Type::STR, "surjection_proof", /*optional=*/true, "The surjection proof"}, - {RPCResult::Type::STR, "value_commitment", /*optional=*/true, "The value commitment"}, }}, } }; @@ -1148,20 +1169,17 @@ static RPCHelpMan decodepsbt() {RPCResult::Type::STR, "path", "The path"}, }}, }}, - {RPCResult::Type::NUM, "tx_version", "The version number of the unsigned transaction. Not to be confused with PSBT version"}, + {RPCResult::Type::NUM, "tx_version", /*optional=*/true, "The version number of the unsigned transaction. Not to be confused with PSBT version"}, {RPCResult::Type::NUM, "fallback_locktime", /*optional=*/true, "The locktime to fallback to if no inputs specify a required locktime."}, - {RPCResult::Type::NUM, "fees", "The fees specified in this psbt.", {}, /*skip_type_check=*/true}, // ELEMENTS has an explicit fee output, bitcoin does not (they are implicit) - {RPCResult::Type::NUM, "input_count", "The number of inputs in this psbt"}, - {RPCResult::Type::NUM, "output_count", "The number of outputs in this psbt."}, - {RPCResult::Type::NUM, "inputs_modifiable", /*optional=*/true, "Whether inputs can be modified"}, - {RPCResult::Type::NUM, "outputs_modifiable", /*optional=*/true, "Whether outputs can be modified"}, - {RPCResult::Type::ARR, "sighash_single_indexes", /*optional=*/true, "The indexes which have SIGHASH_SINGLE signatures", - {{RPCResult::Type::NUM, "", "Index of an input with a SIGHASH_SINGLE signature"}}, - }, + {RPCResult::Type::NUM, "input_count", /*optional=*/true, "The number of inputs in this psbt"}, + {RPCResult::Type::NUM, "output_count", /*optional=*/true, "The number of outputs in this psbt."}, + {RPCResult::Type::BOOL, "inputs_modifiable", /*optional=*/true, "Whether inputs can be modified"}, + {RPCResult::Type::BOOL, "outputs_modifiable", /*optional=*/true, "Whether outputs can be modified"}, + {RPCResult::Type::BOOL, "has_sighash_single", /*optional=*/true, "Whether this PSBT has SIGHASH_SINGLE inputs"}, {RPCResult::Type::NUM, "psbt_version", "The PSBT version number. Not to be confused with the unsigned transaction version"}, {RPCResult::Type::ARR, "scalar_offsets", /*optional=*/true, "The PSET scalar elements", { - {RPCResult::Type::STR_HEX, "scalar", "A scalar offset stored in the PSET"}, + {RPCResult::Type::STR_HEX, "", "A scalar offset stored in the PSET"}, }}, {RPCResult::Type::ARR, "proprietary", "The global proprietary map", { @@ -1173,13 +1191,16 @@ static RPCHelpMan decodepsbt() {RPCResult::Type::STR_HEX, "value", "The hex for the value"}, }}, }}, - {RPCResult::Type::OBJ_DYN, "unknown", /*optional=*/true, "The unknown global fields", + {RPCResult::Type::OBJ, "fees", "The fees specified in this psbt, mapped by asset label or id", + { + {RPCResult::Type::ELISION, "", "fee amount for each asset"}, + }}, + {RPCResult::Type::OBJ_DYN, "unknown", "The unknown global fields", { {RPCResult::Type::STR_HEX, "key", "(key-value pair) An unknown key-value pair"}, }}, decodepsbt_inputs, decodepsbt_outputs, - {RPCResult::Type::STR_AMOUNT, "fee", /*optional=*/true, "The transaction fee paid if all UTXOs slots in the PSBT have been filled."}, } }, RPCExamples{ @@ -1936,7 +1957,7 @@ static RPCHelpMan finalizepsbt() return RPCHelpMan{"finalizepsbt", "Finalize the inputs of a PSBT. If the transaction is fully signed, it will produce a\n" "network serialized transaction which can be broadcast with sendrawtransaction. Otherwise a PSBT will be\n" - "created which has the final_scriptSig and final_scriptWitness fields filled for inputs that are complete.\n" + "created which has the final_scriptSig and final_scriptwitness fields filled for inputs that are complete.\n" "Implements the Finalizer and Extractor roles.\n", { {"psbt", RPCArg::Type::STR, RPCArg::Optional::NO, "A base64 string of a PSBT"}, @@ -2557,7 +2578,7 @@ static RPCHelpMan rawblindrawtransaction() "Returns the hex-encoded raw transaction.\n" "The input raw transaction cannot have already-blinded outputs.\n" "The output keys used can be specified by using a confidential address in createrawtransaction.\n" - "If an additional blinded output is required to make a balanced blinding, a 0-value unspendable output will be added. Since there is no access to the wallet the blinding pubkey from the last output with blinding key will be repeated.\n" + "If blinded inputs exist but no output has a blinding pubkey, the caller must add another blindable output; this RPC cannot derive a wallet blinding key and will fail instead of adding a dummy output.\n" "You can not blind issuances with this call.\n", { {"hexstring", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "A hex-encoded raw transaction."}, @@ -2586,7 +2607,7 @@ static RPCHelpMan rawblindrawtransaction() {"ignoreblindfail", RPCArg::Type::BOOL, RPCArg::Default{true}, "Return a transaction even when a blinding attempt fails due to number of blinded inputs/outputs."}, }, RPCResult{ - RPCResult::Type::STR, "transaction", "hex string of the transaction" + RPCResult::Type::STR_HEX, "transaction", "hex string of the transaction" }, RPCExamples{""}, [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue @@ -2620,7 +2641,7 @@ static RPCHelpMan rawblindrawtransaction() } if (inputAmounts.size() != tx.vin.size()) { throw JSONRPCError(RPC_INVALID_PARAMETER, - "Invalid parameter: one (potentially empty) input blind for each input must be provided"); + "Invalid parameter: one (potentially empty) input amount for each input must be provided"); } if (inputAssets.size() != tx.vin.size()) { throw JSONRPCError(RPC_INVALID_PARAMETER, @@ -2672,7 +2693,7 @@ static RPCHelpMan rawblindrawtransaction() if (!IsHex(assetblind) || assetblind.length() != 32*2) throw JSONRPCError(RPC_INVALID_PARAMETER, "input asset blinds must be an array of 32-byte hex-encoded strings"); if (!IsHex(asset) || asset.length() != 32*2) - throw JSONRPCError(RPC_INVALID_PARAMETER, "input asset blinds must be an array of 32-byte hex-encoded strings"); + throw JSONRPCError(RPC_INVALID_PARAMETER, "input asset IDs must be an array of 32-byte hex-encoded strings"); input_blinds.push_back(uint256S(blind)); input_asset_blinds.push_back(uint256S(assetblind)); diff --git a/src/rpc/request.cpp b/src/rpc/request.cpp index adb4fd7ad25..f58ea0ef7aa 100644 --- a/src/rpc/request.cpp +++ b/src/rpc/request.cpp @@ -21,6 +21,7 @@ #include #include #include +#include // IWYU pragma: keep /** * JSON-RPC protocol. Bitcoin speaks version 1.0 for maximum compatibility, diff --git a/src/rpc/server.cpp b/src/rpc/server.cpp index 34f19df2564..a51908999e3 100644 --- a/src/rpc/server.cpp +++ b/src/rpc/server.cpp @@ -139,7 +139,7 @@ static RPCHelpMan help() [&](const RPCHelpMan& self, const JSONRPCRequest& jsonRequest) -> UniValue { std::string strCommand; - if (jsonRequest.params.size() > 0) { + if (!jsonRequest.params[0].isNull()) { strCommand = jsonRequest.params[0].get_str(); } if (strCommand == "dump_all_command_conversions") { diff --git a/src/rpc/util.cpp b/src/rpc/util.cpp index d783204eb91..022f6bde52a 100644 --- a/src/rpc/util.cpp +++ b/src/rpc/util.cpp @@ -1406,7 +1406,7 @@ std::vector EvalDescriptorStringOrObject(const UniValue& scanobject, Fl class BlindingPubkeyVisitor { public: - explicit BlindingPubkeyVisitor() {} + explicit BlindingPubkeyVisitor() = default; CPubKey operator()(const CNoDestination& dest) const { @@ -1466,7 +1466,7 @@ class DescribeBlindAddressVisitor { public: - explicit DescribeBlindAddressVisitor() {} + explicit DescribeBlindAddressVisitor() = default; UniValue operator()(const CNoDestination& dest) const { return UniValue(UniValue::VOBJ); } UniValue operator()(const PubKeyDestination& dest) const { return UniValue(UniValue::VOBJ); } diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index bd888e43629..64a214a4eb0 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -2802,11 +2802,57 @@ bool SignatureHashSchnorr(uint256& hash_out, ScriptExecutionData& execdata, cons return true; } +int SigHashCache::CacheIndex(int32_t hash_type) const noexcept +{ + // Note that we do not distinguish between BASE and WITNESS_V0 to determine the cache index, + // because no input can simultaneously use both. + return 3 * !!(hash_type & SIGHASH_ANYONECANPAY) + + 2 * ((hash_type & 0x1f) == SIGHASH_SINGLE) + + 1 * ((hash_type & 0x1f) == SIGHASH_NONE); +} + +bool SigHashCache::Load(int32_t hash_type, const CScript& script_code, HashWriter& writer) const noexcept +{ + auto& entry = m_cache_entries[CacheIndex(hash_type)]; + if (entry.has_value()) { + if (script_code == entry->first) { + writer = HashWriter(entry->second); + return true; + } + } + return false; +} + +void SigHashCache::Store(int32_t hash_type, const CScript& script_code, const HashWriter& writer) noexcept +{ + auto& entry = m_cache_entries[CacheIndex(hash_type)]; + entry.emplace(script_code, writer); +} + template -uint256 SignatureHash(const CScript& scriptCode, const T& txTo, unsigned int nIn, int32_t nHashType, const CConfidentialValue& amount, SigVersion sigversion, unsigned int flags, const PrecomputedTransactionData* cache) +uint256 SignatureHash(const CScript& scriptCode, const T& txTo, unsigned int nIn, int32_t nHashType, const CConfidentialValue& amount, SigVersion sigversion, unsigned int flags, const PrecomputedTransactionData* cache, SigHashCache* sighash_cache) { assert(nIn < txTo.vin.size()); + if (sigversion != SigVersion::WITNESS_V0) { + // Check for invalid use of SIGHASH_SINGLE + if ((nHashType & 0x1f) == SIGHASH_SINGLE) { + if (nIn >= txTo.vout.size()) { + // nOut out of range + return uint256::ONE; + } + } + } + + HashWriter ss{}; + + // Try to compute using cached SHA256 midstate. + if (sighash_cache && sighash_cache->Load(nHashType, scriptCode, ss)) { + // Add sighash type and hash. + ss << nHashType; + return ss.GetHash(); + } + if (sigversion == SigVersion::WITNESS_V0) { uint256 hashPrevouts; uint256 hashSequence; @@ -2835,24 +2881,23 @@ uint256 SignatureHash(const CScript& scriptCode, const T& txTo, unsigned int nIn hashRangeproofs = cacheready ? cache->hashRangeproofs : GetRangeproofsHash(txTo); } } else if ((nHashType & 0x1f) == SIGHASH_SINGLE && nIn < txTo.vout.size()) { - HashWriter ss{}; - ss << txTo.vout[nIn]; - hashOutputs = ss.GetHash(); + HashWriter inner_ss{}; + inner_ss << txTo.vout[nIn]; + hashOutputs = inner_ss.GetHash(); if (fRangeproof) { - HashWriter ss{}; + HashWriter rp_ss{}; if (nIn < txTo.witness.vtxoutwit.size()) { - ss << txTo.witness.vtxoutwit[nIn].vchRangeproof; - ss << txTo.witness.vtxoutwit[nIn].vchSurjectionproof; + rp_ss << txTo.witness.vtxoutwit[nIn].vchRangeproof; + rp_ss << txTo.witness.vtxoutwit[nIn].vchSurjectionproof; } else { - ss << (unsigned char) 0; - ss << (unsigned char) 0; + rp_ss << (unsigned char) 0; + rp_ss << (unsigned char) 0; } - hashRangeproofs = ss.GetHash(); + hashRangeproofs = rp_ss.GetHash(); } } - HashWriter ss{}; // Version ss << txTo.version; // Input prevouts/nSequence (none/all, depending on flags) @@ -2885,26 +2930,21 @@ uint256 SignatureHash(const CScript& scriptCode, const T& txTo, unsigned int nIn } // Locktime ss << txTo.nLockTime; - // Sighash type - ss << nHashType; + } else { + // Wrapper to serialize only the necessary parts of the transaction being signed + CTransactionSignatureSerializer txTmp(txTo, scriptCode, nIn, nHashType, flags); - return ss.GetHash(); + // Serialize + ss << txTmp; } - // Check for invalid use of SIGHASH_SINGLE - if ((nHashType & 0x1f) == SIGHASH_SINGLE) { - if (nIn >= txTo.vout.size()) { - // nOut out of range - return uint256::ONE; - } + // If a cache object was provided, store the midstate there. + if (sighash_cache != nullptr) { + sighash_cache->Store(nHashType, scriptCode, ss); } - // Wrapper to serialize only the necessary parts of the transaction being signed - CTransactionSignatureSerializer txTmp(txTo, scriptCode, nIn, nHashType, flags); - - // Serialize and hash - HashWriter ss{}; - ss << txTmp << nHashType; + // Add sighash type and hash. + ss << nHashType; return ss.GetHash(); } @@ -2937,7 +2977,7 @@ bool GenericTransactionSignatureChecker::CheckECDSASignature(const std::vecto // Witness sighashes need the amount. if (sigversion == SigVersion::WITNESS_V0 && amount.IsNull()) return HandleMissingData(m_mdb); - uint256 sighash = SignatureHash(scriptCode, *txTo, nIn, nHashType, amount, sigversion, flags, this->txdata); + uint256 sighash = SignatureHash(scriptCode, *txTo, nIn, nHashType, amount, sigversion, flags, this->txdata, &m_sighash_cache); if (!VerifyECDSASignature(vchSig, pubkey, sighash)) return false; diff --git a/src/script/interpreter.h b/src/script/interpreter.h index b1a510bd621..87bd8c11ab7 100644 --- a/src/script/interpreter.h +++ b/src/script/interpreter.h @@ -289,8 +289,27 @@ extern const HashWriter HASHER_TAPSIGHASH_ELEMENTS; //!< Hasher with tag "TapSig extern const HashWriter HASHER_TAPLEAF_ELEMENTS; //!< Hasher with tag "TapLeaf" pre-fed to it. extern const HashWriter HASHER_TAPBRANCH_ELEMENTS; //!< Hasher with tag "TapBranch" pre-fed to it. +/** Data structure to cache SHA256 midstates for the ECDSA sighash calculations + * (bare, P2SH, P2WPKH, P2WSH). */ +class SigHashCache +{ + /** For each sighash mode (ALL, SINGLE, NONE, ALL|ANYONE, SINGLE|ANYONE, NONE|ANYONE), + * optionally store a scriptCode which the hash is for, plus a midstate for the SHA256 + * computation just before adding the hash_type itself. */ + std::optional> m_cache_entries[6]; + + /** Given a hash_type, find which of the 6 cache entries is to be used. */ + int CacheIndex(int32_t hash_type) const noexcept; + +public: + /** Load into writer the SHA256 midstate if found in this cache. */ + [[nodiscard]] bool Load(int32_t hash_type, const CScript& script_code, HashWriter& writer) const noexcept; + /** Store into this cache object the provided SHA256 midstate. */ + void Store(int32_t hash_type, const CScript& script_code, const HashWriter& writer) noexcept; +}; + template -uint256 SignatureHash(const CScript& scriptCode, const T& txTo, unsigned int nIn, int32_t nHashType, const CConfidentialValue& amount, SigVersion sigversion, unsigned int flags, const PrecomputedTransactionData* cache = nullptr); +uint256 SignatureHash(const CScript& scriptCode, const T& txTo, unsigned int nIn, int32_t nHashType, const CConfidentialValue& amount, SigVersion sigversion, unsigned int flags, const PrecomputedTransactionData* cache = nullptr, SigHashCache* sighash_cache = nullptr); class BaseSignatureChecker { @@ -374,6 +393,7 @@ class GenericTransactionSignatureChecker : public BaseSignatureChecker unsigned int nIn; const CConfidentialValue amount; const PrecomputedTransactionData* txdata; + mutable SigHashCache m_sighash_cache; protected: virtual bool VerifyECDSASignature(const std::vector& vchSig, const CPubKey& vchPubKey, const uint256& sighash) const; diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt index 073bea63040..0adeb970b0e 100644 --- a/src/test/CMakeLists.txt +++ b/src/test/CMakeLists.txt @@ -129,6 +129,10 @@ add_executable(test_elements versionbits_tests.cpp ) +set_target_properties(test_elements PROPERTIES + SKIP_BUILD_RPATH OFF +) + include(TargetDataSources) target_json_data_sources(test_elements data/base58_encode_decode.json diff --git a/src/test/README.md b/src/test/README.md index c7e7ab911dc..6c49762ab3e 100644 --- a/src/test/README.md +++ b/src/test/README.md @@ -22,7 +22,7 @@ and tests weren't explicitly disabled. The unit tests can be run with `ctest --test-dir build`, which includes unit tests from subtrees. -Run `test_bitcoin --list_content` for the full list of tests. +Run `build/bin/test_bitcoin --list_content` for the full list of tests. To run the unit tests manually, launch `build/bin/test_bitcoin`. To recompile after a test file was modified, run `cmake --build build` and then run the test again. If you @@ -44,7 +44,7 @@ The `test_bitcoin` runner accepts command line arguments from the Boost framework. To see the list of arguments that may be passed, run: ``` -test_bitcoin --help +build/bin/test_bitcoin --help ``` For example, to run only the tests in the `getarg_tests` file, with full logging: diff --git a/src/test/argsman_tests.cpp b/src/test/argsman_tests.cpp index 16b5d255f39..2d494cfb39f 100644 --- a/src/test/argsman_tests.cpp +++ b/src/test/argsman_tests.cpp @@ -23,6 +23,7 @@ #include #include +#include // IWYU pragma: keep using util::ToString; diff --git a/src/test/blind_tests.cpp b/src/test/blind_tests.cpp index 42dded0ddca..46d7a4c462a 100644 --- a/src/test/blind_tests.cpp +++ b/src/test/blind_tests.cpp @@ -320,6 +320,7 @@ BOOST_AUTO_TEST_CASE(naive_blinding_test) input_amounts.push_back(500); input_assets.push_back(bitcoinID); input_assets.push_back(otherID); + output_pubkeys.reserve(6); for (unsigned int i = 0; i < 6; i++) { output_pubkeys.push_back(pubkey2); } diff --git a/src/test/blockencodings_tests.cpp b/src/test/blockencodings_tests.cpp index ed95a8831e3..d40a0a94aef 100644 --- a/src/test/blockencodings_tests.cpp +++ b/src/test/blockencodings_tests.cpp @@ -95,21 +95,21 @@ BOOST_AUTO_TEST_CASE(SimpleRoundTripTest) CBlock block2; { PartiallyDownloadedBlock tmp = partialBlock; - BOOST_CHECK(partialBlock.FillBlock(block2, {}) == READ_STATUS_INVALID); // No transactions + BOOST_CHECK(partialBlock.FillBlock(block2, {}, /*segwit_active=*/true) == READ_STATUS_INVALID); // No transactions partialBlock = tmp; } // Wrong transaction { PartiallyDownloadedBlock tmp = partialBlock; - partialBlock.FillBlock(block2, {block.vtx[2]}); // Current implementation doesn't check txn here, but don't require that + partialBlock.FillBlock(block2, {block.vtx[2]}, /*segwit_active=*/true); // Current implementation doesn't check txn here, but don't require that partialBlock = tmp; } bool mutated; BOOST_CHECK(block.hashMerkleRoot != BlockMerkleRoot(block2, &mutated)); CBlock block3; - BOOST_CHECK(partialBlock.FillBlock(block3, {block.vtx[1]}) == READ_STATUS_OK); + BOOST_CHECK(partialBlock.FillBlock(block3, {block.vtx[1]}, /*segwit_active=*/true) == READ_STATUS_OK); BOOST_CHECK_EQUAL(block.GetHash().ToString(), block3.GetHash().ToString()); BOOST_CHECK_EQUAL(block.hashMerkleRoot.ToString(), BlockMerkleRoot(block3, &mutated).ToString()); BOOST_CHECK(!mutated); @@ -182,14 +182,14 @@ BOOST_AUTO_TEST_CASE(NonCoinbasePreforwardRTTest) CBlock block2; { PartiallyDownloadedBlock tmp = partialBlock; - BOOST_CHECK(partialBlock.FillBlock(block2, {}) == READ_STATUS_INVALID); // No transactions + BOOST_CHECK(partialBlock.FillBlock(block2, {}, /*segwit_active=*/true) == READ_STATUS_INVALID); // No transactions partialBlock = tmp; } // Wrong transaction { PartiallyDownloadedBlock tmp = partialBlock; - partialBlock.FillBlock(block2, {block.vtx[1]}); // Current implementation doesn't check txn here, but don't require that + partialBlock.FillBlock(block2, {block.vtx[1]}, /*segwit_active=*/true); // Current implementation doesn't check txn here, but don't require that partialBlock = tmp; } BOOST_CHECK_EQUAL(pool.get(block.vtx[2]->GetHash()).use_count(), SHARED_TX_OFFSET + 2); // +2 because of partialBlock and block2 @@ -198,7 +198,7 @@ BOOST_AUTO_TEST_CASE(NonCoinbasePreforwardRTTest) CBlock block3; PartiallyDownloadedBlock partialBlockCopy = partialBlock; - BOOST_CHECK(partialBlock.FillBlock(block3, {block.vtx[0]}) == READ_STATUS_OK); + BOOST_CHECK(partialBlock.FillBlock(block3, {block.vtx[0]}, /*segwit_active=*/true) == READ_STATUS_OK); BOOST_CHECK_EQUAL(block.GetHash().ToString(), block3.GetHash().ToString()); BOOST_CHECK_EQUAL(block.hashMerkleRoot.ToString(), BlockMerkleRoot(block3, &mutated).ToString()); BOOST_CHECK(!mutated); @@ -252,7 +252,7 @@ BOOST_AUTO_TEST_CASE(SufficientPreforwardRTTest) CBlock block2; PartiallyDownloadedBlock partialBlockCopy = partialBlock; - BOOST_CHECK(partialBlock.FillBlock(block2, {}) == READ_STATUS_OK); + BOOST_CHECK(partialBlock.FillBlock(block2, {}, /*segwit_active=*/true) == READ_STATUS_OK); BOOST_CHECK_EQUAL(block.GetHash().ToString(), block2.GetHash().ToString()); bool mutated; BOOST_CHECK_EQUAL(block.hashMerkleRoot.ToString(), BlockMerkleRoot(block2, &mutated).ToString()); @@ -300,7 +300,7 @@ BOOST_AUTO_TEST_CASE(EmptyBlockRoundTripTest) CBlock block2; std::vector vtx_missing; - BOOST_CHECK(partialBlock.FillBlock(block2, vtx_missing) == READ_STATUS_OK); + BOOST_CHECK(partialBlock.FillBlock(block2, vtx_missing, /*segwit_active=*/true) == READ_STATUS_OK); BOOST_CHECK_EQUAL(block.GetHash().ToString(), block2.GetHash().ToString()); BOOST_CHECK_EQUAL(block.hashMerkleRoot.ToString(), BlockMerkleRoot(block2, &mutated).ToString()); BOOST_CHECK(!mutated); diff --git a/src/test/coins_tests.cpp b/src/test/coins_tests.cpp index b91b1c5464c..9164ced4056 100644 --- a/src/test/coins_tests.cpp +++ b/src/test/coins_tests.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include @@ -1054,9 +1055,33 @@ BOOST_FIXTURE_TEST_CASE(ccoins_flush_behavior, FlushTest) } } +BOOST_FIXTURE_TEST_CASE(coins_db_leveldb_layout, FlushTest) +{ + auto level2_files{[](CCoinsViewDB& base) { + return *Assert(ToIntegral(*Assert(base.GetDBProperty("leveldb.num-files-at-level2")))); + }}; + const COutPoint outpoint{Txid::FromUint256(m_rng.rand256()), 0}; + const Coin coin{MakeCoin()}; + const uint256 block_hash{m_rng.rand256()}; + + CCoinsViewDB base{{.path = m_args.GetDataDirBase() / "coins_db_leveldb_layout", .cache_bytes = 1_MiB, .wipe_data = true}, {}}; + CCoinsViewCache cache{&base}; + + cache.EmplaceCoinInternalDANGER(COutPoint{outpoint}, Coin{coin}); + cache.SetBestBlock(block_hash); + cache.Sync(); + + BOOST_CHECK_EQUAL(level2_files(base), 0); + WITH_LOCK(::cs_main, return base.CompactFull()).wait(); + BOOST_CHECK_EQUAL(level2_files(base), 1); + + BOOST_CHECK(*Assert(base.GetCoin(outpoint)) == coin); + BOOST_CHECK_EQUAL(base.GetBestBlock(), block_hash); +} + BOOST_AUTO_TEST_CASE(coins_resource_is_used) { - CCoinsMapMemoryResource resource; + CCoinsMapMemoryResource resource{/*chunk_size_bytes=*/(sizeof(CoinsCachePair) + sizeof(void*) * 4) * 1024}; PoolResourceTester::CheckAllDataAccountedFor(resource); { diff --git a/src/test/fuzz/base_encode_decode.cpp b/src/test/fuzz/base_encode_decode.cpp index 06b249fb8d3..45088187178 100644 --- a/src/test/fuzz/base_encode_decode.cpp +++ b/src/test/fuzz/base_encode_decode.cpp @@ -6,6 +6,7 @@ #include #include +#include #include #include #include @@ -19,42 +20,40 @@ using util::TrimStringView; FUZZ_TARGET(base58_encode_decode) { - FuzzedDataProvider provider(buffer.data(), buffer.size()); - const std::string random_string{provider.ConsumeRandomLengthString(1000)}; - const int max_ret_len{provider.ConsumeIntegralInRange(-1, 1000)}; + FuzzedDataProvider provider{buffer.data(), buffer.size()}; + const auto random_string{provider.ConsumeRandomLengthString(100)}; - // Decode/Encode roundtrip - std::vector decoded; - if (DecodeBase58(random_string, decoded, max_ret_len)) { + const auto encoded{EncodeBase58(MakeUCharSpan(random_string))}; + const auto decode_input{provider.ConsumeBool() ? random_string : encoded}; + const int max_ret_len{provider.ConsumeIntegralInRange(-1, decode_input.size() + 1)}; + if (std::vector decoded; DecodeBase58(decode_input, decoded, max_ret_len)) { const auto encoded_string{EncodeBase58(decoded)}; - assert(encoded_string == TrimStringView(random_string)); - assert(encoded_string.empty() || !DecodeBase58(encoded_string, decoded, provider.ConsumeIntegralInRange(0, decoded.size() - 1))); + assert(encoded_string == TrimStringView(decode_input)); + if (decoded.size() > 0) { + assert(max_ret_len > 0); + assert(decoded.size() <= static_cast(max_ret_len)); + assert(!DecodeBase58(encoded_string, decoded, provider.ConsumeIntegralInRange(0, decoded.size() - 1))); + } } - // Encode/Decode roundtrip - const auto encoded{EncodeBase58(buffer)}; - std::vector roundtrip_decoded; - assert(DecodeBase58(encoded, roundtrip_decoded, buffer.size()) - && std::ranges::equal(roundtrip_decoded, buffer)); } FUZZ_TARGET(base58check_encode_decode) { - FuzzedDataProvider provider(buffer.data(), buffer.size()); - const std::string random_string{provider.ConsumeRandomLengthString(1000)}; - const int max_ret_len{provider.ConsumeIntegralInRange(-1, 1000)}; + FuzzedDataProvider provider{buffer.data(), buffer.size()}; + const auto random_string{provider.ConsumeRandomLengthString(100)}; - // Decode/Encode roundtrip - std::vector decoded; - if (DecodeBase58Check(random_string, decoded, max_ret_len)) { + const auto encoded{EncodeBase58Check(MakeUCharSpan(random_string))}; + const auto decode_input{provider.ConsumeBool() ? random_string : encoded}; + const int max_ret_len{provider.ConsumeIntegralInRange(-1, decode_input.size() + 1)}; + if (std::vector decoded; DecodeBase58Check(decode_input, decoded, max_ret_len)) { const auto encoded_string{EncodeBase58Check(decoded)}; - assert(encoded_string == TrimStringView(random_string)); - assert(encoded_string.empty() || !DecodeBase58Check(encoded_string, decoded, provider.ConsumeIntegralInRange(0, decoded.size() - 1))); + assert(encoded_string == TrimStringView(decode_input)); + if (decoded.size() > 0) { + assert(max_ret_len > 0); + assert(decoded.size() <= static_cast(max_ret_len)); + assert(!DecodeBase58Check(encoded_string, decoded, provider.ConsumeIntegralInRange(0, decoded.size() - 1))); + } } - // Encode/Decode roundtrip - const auto encoded{EncodeBase58Check(buffer)}; - std::vector roundtrip_decoded; - assert(DecodeBase58Check(encoded, roundtrip_decoded, buffer.size()) - && std::ranges::equal(roundtrip_decoded, buffer)); } FUZZ_TARGET(base32_encode_decode) @@ -93,5 +92,6 @@ FUZZ_TARGET(psbt_base64_decode) PartiallySignedTransaction psbt; std::string error; - assert(DecodeBase64PSBT(psbt, random_string, error) == error.empty()); + const bool ok{DecodeBase64PSBT(psbt, random_string, error)}; + assert(ok == error.empty()); } diff --git a/src/test/fuzz/bloom_filter.cpp b/src/test/fuzz/bloom_filter.cpp index 19cfe61bc4e..11bd2834582 100644 --- a/src/test/fuzz/bloom_filter.cpp +++ b/src/test/fuzz/bloom_filter.cpp @@ -18,6 +18,7 @@ #include #include #include +#include // IWYU pragma: keep FUZZ_TARGET(bloom_filter) { diff --git a/src/test/fuzz/deserialize.cpp b/src/test/fuzz/deserialize.cpp index ad7824ed0a5..2da0b5dd7ee 100644 --- a/src/test/fuzz/deserialize.cpp +++ b/src/test/fuzz/deserialize.cpp @@ -37,21 +37,17 @@ #include #include #include +#include // IWYU pragma: keep using node::SnapshotMetadata; -namespace { -const BasicTestingSetup* g_setup; -} // namespace - void initialize_deserialize() { static const auto testing_setup = MakeNoLogFileContext<>(); - g_setup = testing_setup.get(); } #define FUZZ_TARGET_DESERIALIZE(name, code) \ - FUZZ_TARGET(name, .init = initialize_deserialize) \ + FUZZ_TARGET(name, .init = initialize_deserialize) \ { \ try { \ SelectParams(ChainType::LIQUID1); /* ELEMENTS */ \ @@ -237,7 +233,16 @@ FUZZ_TARGET_DESERIALIZE(blockundo_deserialize, { }) FUZZ_TARGET_DESERIALIZE(coins_deserialize, { Coin coin; - DeserializeFromFuzzingInput(buffer, coin); + DataStream ds{buffer}; + try { + ds >> coin; + } catch (const std::ios_base::failure&) { + throw invalid_fuzzing_input_exception(); + } + // ELEMENTS: Coin::Serialize() asserts !IsSpent(), which arbitrary fuzzed + // bytes can trivially violate via a decompressed null CTxOut. Skip the + // generic deserialize-then-reserialize round-trip check that + // DeserializeFromFuzzingInput() performs for other types. }) FUZZ_TARGET(netaddr_deserialize, .init = initialize_deserialize) { diff --git a/src/test/fuzz/package_eval.cpp b/src/test/fuzz/package_eval.cpp index 968c5c62cd5..3b232d865f3 100644 --- a/src/test/fuzz/package_eval.cpp +++ b/src/test/fuzz/package_eval.cpp @@ -267,9 +267,9 @@ FUZZ_TARGET(ephemeral_package_eval, .init = initialize_tx_pool) // Create input CTxIn in; in.prevout = outpoint; - tx_mut.witness.vtxinwit[&in - &tx_mut.vin[0]].scriptWitness.stack = P2WSH_EMPTY_TRUE_STACK; - tx_mut.vin.push_back(in); + tx_mut.witness.vtxinwit.emplace_back(); + tx_mut.witness.vtxinwit.back().scriptWitness.stack = P2WSH_EMPTY_TRUE_STACK; } const auto amount_fee = fuzzed_data_provider.ConsumeIntegralInRange(0, amount_in); @@ -324,7 +324,7 @@ FUZZ_TARGET(ephemeral_package_eval, .init = initialize_tx_pool) return ProcessNewPackage(chainstate, tx_pool, txs, /*test_accept=*/single_submit, /*client_maxfeerate=*/{})); const auto res = WITH_LOCK(::cs_main, return AcceptToMemoryPool(chainstate, txs.back(), GetTime(), - /*bypass_limits=*/fuzzed_data_provider.ConsumeBool(), /*test_accept=*/!single_submit)); + /*bypass_limits=*/false, /*test_accept=*/!single_submit)); if (!single_submit && result_package.m_state.GetResult() != PackageValidationResult::PCKG_POLICY) { // We don't know anything about the validity since transactions were randomly generated, so diff --git a/src/test/fuzz/partially_downloaded_block.cpp b/src/test/fuzz/partially_downloaded_block.cpp index 82d781cd53c..c9635cae8cd 100644 --- a/src/test/fuzz/partially_downloaded_block.cpp +++ b/src/test/fuzz/partially_downloaded_block.cpp @@ -32,14 +32,10 @@ void initialize_pdb() g_setup = testing_setup.get(); } -PartiallyDownloadedBlock::CheckBlockFn FuzzedCheckBlock(std::optional result) +PartiallyDownloadedBlock::IsBlockMutatedFn FuzzedIsBlockMutated(bool result) { - return [result](const CBlock&, BlockValidationState& state, const Consensus::Params&, bool, bool) { - if (result) { - return state.Invalid(*result); - } - - return true; + return [result](const CBlock& block, bool) { + return result; }; } @@ -111,36 +107,22 @@ FUZZ_TARGET(partially_downloaded_block, .init = initialize_pdb) skipped_missing |= (!pdb.IsTxAvailable(i) && skip); } - // Mock CheckBlock - bool fail_check_block{fuzzed_data_provider.ConsumeBool()}; - auto validation_result = - fuzzed_data_provider.PickValueInArray( - {BlockValidationResult::BLOCK_RESULT_UNSET, - BlockValidationResult::BLOCK_CONSENSUS, - BlockValidationResult::BLOCK_CACHED_INVALID, - BlockValidationResult::BLOCK_INVALID_HEADER, - BlockValidationResult::BLOCK_MUTATED, - BlockValidationResult::BLOCK_MISSING_PREV, - BlockValidationResult::BLOCK_INVALID_PREV, - BlockValidationResult::BLOCK_TIME_FUTURE, - BlockValidationResult::BLOCK_CHECKPOINT, - BlockValidationResult::BLOCK_HEADER_LOW_WORK}); - pdb.m_check_block_mock = FuzzedCheckBlock( - fail_check_block ? - std::optional{validation_result} : - std::nullopt); + bool segwit_active{fuzzed_data_provider.ConsumeBool()}; + + // Mock IsBlockMutated + bool fail_block_mutated{fuzzed_data_provider.ConsumeBool()}; + pdb.m_check_block_mutated_mock = FuzzedIsBlockMutated(fail_block_mutated); CBlock reconstructed_block; - auto fill_status{pdb.FillBlock(reconstructed_block, missing)}; + auto fill_status{pdb.FillBlock(reconstructed_block, missing, segwit_active)}; switch (fill_status) { case READ_STATUS_OK: assert(!skipped_missing); - assert(!fail_check_block); + assert(!fail_block_mutated); assert(block->GetHash() == reconstructed_block.GetHash()); break; - case READ_STATUS_CHECKBLOCK_FAILED: [[fallthrough]]; case READ_STATUS_FAILED: - assert(fail_check_block); + assert(fail_block_mutated); break; case READ_STATUS_INVALID: break; diff --git a/src/test/fuzz/psbt.cpp b/src/test/fuzz/psbt.cpp index b099bdaae3d..13832c705ae 100644 --- a/src/test/fuzz/psbt.cpp +++ b/src/test/fuzz/psbt.cpp @@ -20,6 +20,7 @@ #include #include #include +#include // IWYU pragma: keep using node::AnalyzePSBT; using node::PSBTAnalysis; diff --git a/src/test/fuzz/rbf.cpp b/src/test/fuzz/rbf.cpp index f39931819cc..fd9e4579127 100644 --- a/src/test/fuzz/rbf.cpp +++ b/src/test/fuzz/rbf.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2020-2022 The Bitcoin Core developers +// 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. @@ -24,6 +24,7 @@ #include #include #include +#include // IWYU pragma: keep namespace { const BasicTestingSetup* g_setup; @@ -115,7 +116,7 @@ FUZZ_TARGET(package_rbf, .init = initialize_package_rbf) // Add a bunch of parent-child pairs to the mempool, and remember them. std::vector mempool_txs; - size_t iter{0}; + uint32_t iter{0}; // Keep track of the total vsize of CTxMemPoolEntry's being added to the mempool to avoid overflow // Add replacement_vsize since this is added to new diagram during RBF check @@ -123,9 +124,8 @@ FUZZ_TARGET(package_rbf, .init = initialize_package_rbf) if (!replacement_tx) { return; } - assert(iter <= g_outpoints.size()); replacement_tx->vin.resize(1); - replacement_tx->vin[0].prevout = g_outpoints[iter++]; + replacement_tx->vin[0].prevout = g_outpoints.at(iter++); CTransaction replacement_tx_final{*replacement_tx}; auto replacement_entry = ConsumeTxMemPoolEntry(fuzzed_data_provider, replacement_tx_final); int32_t replacement_vsize = replacement_entry.GetTxSize(); @@ -133,14 +133,14 @@ FUZZ_TARGET(package_rbf, .init = initialize_package_rbf) LOCK2(cs_main, pool.cs); - LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), NUM_ITERS) - { + while (fuzzed_data_provider.ConsumeBool()) { + if (iter >= NUM_ITERS) break; + // Make sure txns only have one input, and that a unique input is given to avoid circular references CMutableTransaction parent; - assert(iter <= g_outpoints.size()); parent.vin.resize(1); - parent.vin[0].prevout = g_outpoints[iter++]; - parent.vout.emplace_back(CAsset(), 0, CScript()); + parent.vin[0].prevout = g_outpoints.at(iter++); + parent.vout.emplace_back(CAsset(),0, CScript()); mempool_txs.emplace_back(parent); const auto parent_entry = ConsumeTxMemPoolEntry(fuzzed_data_provider, mempool_txs.back()); diff --git a/src/test/fuzz/script_interpreter.cpp b/src/test/fuzz/script_interpreter.cpp index b7053b87165..358c1159913 100644 --- a/src/test/fuzz/script_interpreter.cpp +++ b/src/test/fuzz/script_interpreter.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -45,3 +46,27 @@ FUZZ_TARGET(script_interpreter) (void)CastToBool(ConsumeRandomLengthByteVector(fuzzed_data_provider)); } } + +/** Differential fuzzing for SignatureHash with and without cache. */ +FUZZ_TARGET(sighash_cache) +{ + FuzzedDataProvider provider(buffer.data(), buffer.size()); + + // Get inputs to the sighash function that won't change across types. + const auto scriptcode{ConsumeScript(provider)}; + const auto tx{ConsumeTransaction(provider, std::nullopt)}; + if (tx.vin.empty()) return; + const auto in_index{provider.ConsumeIntegralInRange(0, tx.vin.size() - 1)}; + const auto amount{ConsumeMoney(provider)}; + const auto sigversion{(SigVersion)provider.ConsumeIntegralInRange(0, 1)}; + + // Check the sighash function will give the same result for 100 fuzzer-generated hash types whether or not a cache is + // provided. The cache is conserved across types to exercise cache hits. + SigHashCache sighash_cache{}; + for (int i{0}; i < 100; ++i) { + const auto hash_type{((i & 2) == 0) ? provider.ConsumeIntegral() : provider.ConsumeIntegral()}; + const auto nocache_res{SignatureHash(scriptcode, tx, in_index, hash_type, amount, sigversion, 0)}; + const auto cache_res{SignatureHash(scriptcode, tx, in_index, hash_type, amount, sigversion, 0, nullptr, &sighash_cache)}; + Assert(nocache_res == cache_res); + } +} diff --git a/src/test/fuzz/simplicity_tx.cpp b/src/test/fuzz/simplicity_tx.cpp index fe4001b0e94..236473ab87c 100644 --- a/src/test/fuzz/simplicity_tx.cpp +++ b/src/test/fuzz/simplicity_tx.cpp @@ -15,6 +15,7 @@ extern "C" { #include #include #include +#include #include #include @@ -66,6 +67,7 @@ void initialize_simplicity_tx() FUZZ_TARGET(simplicity_tx, .init = initialize_simplicity_tx) { + SeedRandomStateForTest(SeedRand::ZEROS); simplicity_err error; // 1. (no-op) run through Rust code diff --git a/src/test/fuzz/tx_pool.cpp b/src/test/fuzz/tx_pool.cpp index 38d8b6b468b..e21d101db1f 100644 --- a/src/test/fuzz/tx_pool.cpp +++ b/src/test/fuzz/tx_pool.cpp @@ -298,7 +298,6 @@ FUZZ_TARGET(tx_pool_standard, .init = initialize_tx_pool) std::set added; auto txr = std::make_shared(removed, added); node.validation_signals->RegisterSharedValidationInterface(txr); - const bool bypass_limits = fuzzed_data_provider.ConsumeBool(); // Make sure ProcessNewPackage on one transaction works. // The result is not guaranteed to be the same as what is returned by ATMP. @@ -313,7 +312,7 @@ FUZZ_TARGET(tx_pool_standard, .init = initialize_tx_pool) it->second.m_result_type == MempoolAcceptResult::ResultType::INVALID); } - const auto res = WITH_LOCK(::cs_main, return AcceptToMemoryPool(chainstate, tx, GetTime(), bypass_limits, /*test_accept=*/false)); + const auto res = WITH_LOCK(::cs_main, return AcceptToMemoryPool(chainstate, tx, GetTime(), /*bypass_limits=*/false, /*test_accept=*/false)); const bool accepted = res.m_result_type == MempoolAcceptResult::ResultType::VALID; node.validation_signals->SyncWithValidationInterfaceQueue(); node.validation_signals->UnregisterSharedValidationInterface(txr); @@ -396,6 +395,9 @@ FUZZ_TARGET(tx_pool, .init = initialize_tx_pool) chainstate.SetMempool(&tx_pool); + // If we ever bypass limits, do not do TRUC invariants checks + bool ever_bypassed_limits{false}; + LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 300) { const auto mut_tx = ConsumeTransaction(fuzzed_data_provider, txids); @@ -414,13 +416,17 @@ FUZZ_TARGET(tx_pool, .init = initialize_tx_pool) tx_pool.PrioritiseTransaction(txid.ToUint256(), delta); } + const bool bypass_limits{fuzzed_data_provider.ConsumeBool()}; + ever_bypassed_limits |= bypass_limits; + const auto tx = MakeTransactionRef(mut_tx); - const bool bypass_limits = fuzzed_data_provider.ConsumeBool(); const auto res = WITH_LOCK(::cs_main, return AcceptToMemoryPool(chainstate, tx, GetTime(), bypass_limits, /*test_accept=*/false)); const bool accepted = res.m_result_type == MempoolAcceptResult::ResultType::VALID; if (accepted) { txids.push_back(tx->GetHash()); - CheckMempoolTRUCInvariants(tx_pool); + if (!ever_bypassed_limits) { + CheckMempoolTRUCInvariants(tx_pool); + } } } Finish(fuzzed_data_provider, tx_pool, chainstate); diff --git a/src/test/ipc_test.cpp b/src/test/ipc_test.cpp index d78d6695e7b..bac9baadd0c 100644 --- a/src/test/ipc_test.cpp +++ b/src/test/ipc_test.cpp @@ -93,7 +93,7 @@ void IpcPipeTest() mtx.version = 2; mtx.nLockTime = 3; mtx.vin.emplace_back(txout1); - mtx.vout.emplace_back(COIN, CScript()); + mtx.vout.emplace_back(CAsset(), COIN, CScript()); CTransactionRef tx1{MakeTransactionRef(mtx)}; CTransactionRef tx2{foo->passTransaction(tx1)}; BOOST_CHECK(*Assert(tx1) == *Assert(tx2)); diff --git a/src/test/logging_tests.cpp b/src/test/logging_tests.cpp index 77ec81e5977..a2ccb5fdb19 100644 --- a/src/test/logging_tests.cpp +++ b/src/test/logging_tests.cpp @@ -5,12 +5,21 @@ #include #include #include +#include +#include #include +#include +#include +#include #include #include #include +#include +#include #include +#include +#include #include #include #include @@ -28,6 +37,16 @@ static void ResetLogger() LogInstance().SetCategoryLogLevel({}); } +static std::vector ReadDebugLogLines() +{ + std::vector lines; + std::ifstream ifs{LogInstance().m_file_path}; + for (std::string line; std::getline(ifs, line);) { + lines.push_back(std::move(line)); + } + return lines; +} + struct LogSetup : public BasicTestingSetup { fs::path prev_log_path; fs::path tmp_log_path; @@ -38,6 +57,7 @@ struct LogSetup : public BasicTestingSetup { bool prev_log_sourcelocations; std::unordered_map prev_category_levels; BCLog::Level prev_log_level; + BCLog::CategoryMask prev_category_mask; LogSetup() : prev_log_path{LogInstance().m_file_path}, tmp_log_path{m_args.GetDataDirBase() / "tmp_debug.log"}, @@ -47,7 +67,8 @@ struct LogSetup : public BasicTestingSetup { prev_log_threadnames{LogInstance().m_log_threadnames}, prev_log_sourcelocations{LogInstance().m_log_sourcelocations}, prev_category_levels{LogInstance().CategoryLevels()}, - prev_log_level{LogInstance().LogLevel()} + prev_log_level{LogInstance().LogLevel()}, + prev_category_mask{LogInstance().GetCategoryMask()} { LogInstance().m_file_path = tmp_log_path; LogInstance().m_reopen_file = true; @@ -59,7 +80,9 @@ struct LogSetup : public BasicTestingSetup { LogInstance().m_log_sourcelocations = false; LogInstance().SetLogLevel(BCLog::Level::Debug); + LogInstance().DisableCategory(BCLog::LogFlags::ALL); LogInstance().SetCategoryLogLevel({}); + LogInstance().SetRateLimiting(nullptr); } ~LogSetup() @@ -73,6 +96,9 @@ struct LogSetup : public BasicTestingSetup { LogInstance().m_log_sourcelocations = prev_log_sourcelocations; LogInstance().SetLogLevel(prev_log_level); LogInstance().SetCategoryLogLevel(prev_category_levels); + LogInstance().SetRateLimiting(nullptr); + LogInstance().DisableCategory(BCLog::LogFlags::ALL); + LogInstance().EnableCategory(BCLog::LogFlags{prev_category_mask}); } }; @@ -86,41 +112,43 @@ BOOST_AUTO_TEST_CASE(logging_timer) BOOST_FIXTURE_TEST_CASE(logging_LogPrintStr, LogSetup) { LogInstance().m_log_sourcelocations = true; - LogInstance().LogPrintStr("foo1: bar1", "fn1", "src1", 1, BCLog::LogFlags::NET, BCLog::Level::Debug); - LogInstance().LogPrintStr("foo2: bar2", "fn2", "src2", 2, BCLog::LogFlags::NET, BCLog::Level::Info); - LogInstance().LogPrintStr("foo3: bar3", "fn3", "src3", 3, BCLog::LogFlags::ALL, BCLog::Level::Debug); - LogInstance().LogPrintStr("foo4: bar4", "fn4", "src4", 4, BCLog::LogFlags::ALL, BCLog::Level::Info); - LogInstance().LogPrintStr("foo5: bar5", "fn5", "src5", 5, BCLog::LogFlags::NONE, BCLog::Level::Debug); - LogInstance().LogPrintStr("foo6: bar6", "fn6", "src6", 6, BCLog::LogFlags::NONE, BCLog::Level::Info); - std::ifstream file{tmp_log_path}; - std::vector log_lines; - for (std::string log; std::getline(file, log);) { - log_lines.push_back(log); - } - std::vector expected = { - "[src1:1] [fn1] [net] foo1: bar1", - "[src2:2] [fn2] [net:info] foo2: bar2", - "[src3:3] [fn3] [debug] foo3: bar3", - "[src4:4] [fn4] foo4: bar4", - "[src5:5] [fn5] [debug] foo5: bar5", - "[src6:6] [fn6] foo6: bar6", + + struct Case { + std::string msg; + BCLog::LogFlags category; + BCLog::Level level; + std::string prefix; + std::source_location loc; }; + + std::vector cases = { + {"foo1: bar1", BCLog::NET, BCLog::Level::Debug, "[net] ", std::source_location::current()}, + {"foo2: bar2", BCLog::NET, BCLog::Level::Info, "[net:info] ", std::source_location::current()}, + {"foo3: bar3", BCLog::ALL, BCLog::Level::Debug, "[debug] ", std::source_location::current()}, + {"foo4: bar4", BCLog::ALL, BCLog::Level::Info, "", std::source_location::current()}, + {"foo5: bar5", BCLog::NONE, BCLog::Level::Debug, "[debug] ", std::source_location::current()}, + {"foo6: bar6", BCLog::NONE, BCLog::Level::Info, "", std::source_location::current()}, + }; + + std::vector expected; + for (auto& [msg, category, level, prefix, loc] : cases) { + expected.push_back(tfm::format("[%s:%s] [%s] %s%s", util::RemovePrefix(loc.file_name(), "./"), loc.line(), loc.function_name(), prefix, msg)); + LogInstance().LogPrintStr(msg, std::move(loc), category, level, /*should_ratelimit=*/false); + } + std::vector log_lines{ReadDebugLogLines()}; BOOST_CHECK_EQUAL_COLLECTIONS(log_lines.begin(), log_lines.end(), expected.begin(), expected.end()); } BOOST_FIXTURE_TEST_CASE(logging_LogPrintMacrosDeprecated, LogSetup) { + LogInstance().EnableCategory(BCLog::NET); LogPrintf("foo5: %s\n", "bar5"); LogPrintLevel(BCLog::NET, BCLog::Level::Trace, "foo4: %s\n", "bar4"); // not logged LogPrintLevel(BCLog::NET, BCLog::Level::Debug, "foo7: %s\n", "bar7"); LogPrintLevel(BCLog::NET, BCLog::Level::Info, "foo8: %s\n", "bar8"); LogPrintLevel(BCLog::NET, BCLog::Level::Warning, "foo9: %s\n", "bar9"); LogPrintLevel(BCLog::NET, BCLog::Level::Error, "foo10: %s\n", "bar10"); - std::ifstream file{tmp_log_path}; - std::vector log_lines; - for (std::string log; std::getline(file, log);) { - log_lines.push_back(log); - } + std::vector log_lines{ReadDebugLogLines()}; std::vector expected = { "foo5: bar5", "[net] foo7: bar7", @@ -133,16 +161,13 @@ BOOST_FIXTURE_TEST_CASE(logging_LogPrintMacrosDeprecated, LogSetup) BOOST_FIXTURE_TEST_CASE(logging_LogPrintMacros, LogSetup) { + LogInstance().EnableCategory(BCLog::NET); LogTrace(BCLog::NET, "foo6: %s", "bar6"); // not logged LogDebug(BCLog::NET, "foo7: %s", "bar7"); LogInfo("foo8: %s", "bar8"); LogWarning("foo9: %s", "bar9"); LogError("foo10: %s", "bar10"); - std::ifstream file{tmp_log_path}; - std::vector log_lines; - for (std::string log; std::getline(file, log);) { - log_lines.push_back(log); - } + std::vector log_lines{ReadDebugLogLines()}; std::vector expected = { "[net] foo7: bar7", "foo8: bar8", @@ -174,19 +199,13 @@ BOOST_FIXTURE_TEST_CASE(logging_LogPrintMacros_CategoryName, LogSetup) expected.push_back(expected_log); } - std::ifstream file{tmp_log_path}; - std::vector log_lines; - for (std::string log; std::getline(file, log);) { - log_lines.push_back(log); - } + std::vector log_lines{ReadDebugLogLines()}; BOOST_CHECK_EQUAL_COLLECTIONS(log_lines.begin(), log_lines.end(), expected.begin(), expected.end()); } BOOST_FIXTURE_TEST_CASE(logging_SeverityLevels, LogSetup) { LogInstance().EnableCategory(BCLog::LogFlags::ALL); - - LogInstance().SetLogLevel(BCLog::Level::Debug); LogInstance().SetCategoryLogLevel(/*category_str=*/"net", /*level_str=*/"info"); // Global log level @@ -207,11 +226,7 @@ BOOST_FIXTURE_TEST_CASE(logging_SeverityLevels, LogSetup) "[net:warning] foo5: bar5", "[net:error] foo7: bar7", }; - std::ifstream file{tmp_log_path}; - std::vector log_lines; - for (std::string log; std::getline(file, log);) { - log_lines.push_back(log); - } + std::vector log_lines{ReadDebugLogLines()}; BOOST_CHECK_EQUAL_COLLECTIONS(log_lines.begin(), log_lines.end(), expected.begin(), expected.end()); } @@ -276,4 +291,197 @@ BOOST_FIXTURE_TEST_CASE(logging_Conf, LogSetup) } } +struct ScopedScheduler { + CScheduler scheduler{}; + + ScopedScheduler() + { + scheduler.m_service_thread = std::thread([this] { scheduler.serviceQueue(); }); + } + ~ScopedScheduler() + { + scheduler.stop(); + } + void MockForwardAndSync(std::chrono::seconds duration) + { + scheduler.MockForward(duration); + std::promise promise; + scheduler.scheduleFromNow([&promise] { promise.set_value(); }, 0ms); + promise.get_future().wait(); + } + std::shared_ptr GetLimiter(size_t max_bytes, std::chrono::seconds window) + { + auto sched_func = [this](auto func, auto w) { + scheduler.scheduleEvery(std::move(func), w); + }; + return BCLog::LogRateLimiter::Create(sched_func, max_bytes, window); + } +}; + +BOOST_AUTO_TEST_CASE(logging_log_rate_limiter) +{ + uint64_t max_bytes{1024}; + auto reset_window{1min}; + ScopedScheduler scheduler{}; + auto limiter_{scheduler.GetLimiter(max_bytes, reset_window)}; + auto& limiter{*Assert(limiter_)}; + + using Status = BCLog::LogRateLimiter::Status; + auto source_loc_1{std::source_location::current()}; + auto source_loc_2{std::source_location::current()}; + + // A fresh limiter should not have any suppressions + BOOST_CHECK(!limiter.SuppressionsActive()); + + // Resetting an unused limiter is fine + limiter.Reset(); + BOOST_CHECK(!limiter.SuppressionsActive()); + + // No suppression should happen until more than max_bytes have been consumed + BOOST_CHECK_EQUAL(limiter.Consume(source_loc_1, std::string(max_bytes - 1, 'a')), Status::UNSUPPRESSED); + BOOST_CHECK_EQUAL(limiter.Consume(source_loc_1, "a"), Status::UNSUPPRESSED); + BOOST_CHECK(!limiter.SuppressionsActive()); + BOOST_CHECK_EQUAL(limiter.Consume(source_loc_1, "a"), Status::NEWLY_SUPPRESSED); + BOOST_CHECK(limiter.SuppressionsActive()); + BOOST_CHECK_EQUAL(limiter.Consume(source_loc_1, "a"), Status::STILL_SUPPRESSED); + BOOST_CHECK(limiter.SuppressionsActive()); + + // Location 2 should not be affected by location 1's suppression + BOOST_CHECK_EQUAL(limiter.Consume(source_loc_2, std::string(max_bytes, 'a')), Status::UNSUPPRESSED); + BOOST_CHECK_EQUAL(limiter.Consume(source_loc_2, "a"), Status::NEWLY_SUPPRESSED); + BOOST_CHECK(limiter.SuppressionsActive()); + + // After reset_window time has passed, all suppressions should be cleared. + scheduler.MockForwardAndSync(reset_window); + + BOOST_CHECK(!limiter.SuppressionsActive()); + BOOST_CHECK_EQUAL(limiter.Consume(source_loc_1, std::string(max_bytes, 'a')), Status::UNSUPPRESSED); + BOOST_CHECK_EQUAL(limiter.Consume(source_loc_2, std::string(max_bytes, 'a')), Status::UNSUPPRESSED); +} + +BOOST_AUTO_TEST_CASE(logging_log_limit_stats) +{ + BCLog::LogRateLimiter::Stats stats(BCLog::RATELIMIT_MAX_BYTES); + + // Check that stats gets initialized correctly. + BOOST_CHECK_EQUAL(stats.m_available_bytes, BCLog::RATELIMIT_MAX_BYTES); + BOOST_CHECK_EQUAL(stats.m_dropped_bytes, uint64_t{0}); + + const uint64_t MESSAGE_SIZE{BCLog::RATELIMIT_MAX_BYTES / 2}; + BOOST_CHECK(stats.Consume(MESSAGE_SIZE)); + BOOST_CHECK_EQUAL(stats.m_available_bytes, BCLog::RATELIMIT_MAX_BYTES - MESSAGE_SIZE); + BOOST_CHECK_EQUAL(stats.m_dropped_bytes, uint64_t{0}); + + BOOST_CHECK(stats.Consume(MESSAGE_SIZE)); + BOOST_CHECK_EQUAL(stats.m_available_bytes, BCLog::RATELIMIT_MAX_BYTES - MESSAGE_SIZE * 2); + BOOST_CHECK_EQUAL(stats.m_dropped_bytes, uint64_t{0}); + + // Consuming more bytes after already having consumed RATELIMIT_MAX_BYTES should fail. + BOOST_CHECK(!stats.Consume(500)); + BOOST_CHECK_EQUAL(stats.m_available_bytes, uint64_t{0}); + BOOST_CHECK_EQUAL(stats.m_dropped_bytes, uint64_t{500}); +} + +namespace { + +enum class Location { + INFO_1, + INFO_2, + DEBUG_LOG, + INFO_NOLIMIT, +}; + +void LogFromLocation(Location location, const std::string& message) { + switch (location) { + case Location::INFO_1: + LogInfo("%s\n", message); + return; + case Location::INFO_2: + LogInfo("%s\n", message); + return; + case Location::DEBUG_LOG: + LogDebug(BCLog::LogFlags::HTTP, "%s\n", message); + return; + case Location::INFO_NOLIMIT: + LogPrintLevel_(BCLog::LogFlags::ALL, BCLog::Level::Info, /*should_ratelimit=*/false, "%s\n", message); + return; + } // no default case, so the compiler can warn about missing cases + assert(false); +} + +/** + * For a given `location` and `message`, ensure that the on-disk debug log behaviour resembles what + * we'd expect it to be for `status` and `suppressions_active`. + */ +void TestLogFromLocation(Location location, const std::string& message, + BCLog::LogRateLimiter::Status status, bool suppressions_active, + std::source_location source = std::source_location::current()) +{ + BOOST_TEST_INFO_SCOPE("TestLogFromLocation called from " << source.file_name() << ":" << source.line()); + using Status = BCLog::LogRateLimiter::Status; + if (!suppressions_active) assert(status == Status::UNSUPPRESSED); // developer error + + std::ofstream ofs(LogInstance().m_file_path, std::ios::out | std::ios::trunc); // clear debug log + LogFromLocation(location, message); + auto log_lines{ReadDebugLogLines()}; + BOOST_TEST_INFO_SCOPE(log_lines.size() << " log_lines read: \n" << util::Join(log_lines, "\n")); + + if (status == Status::STILL_SUPPRESSED) { + BOOST_CHECK_EQUAL(log_lines.size(), 0); + return; + } + + if (status == Status::NEWLY_SUPPRESSED) { + BOOST_REQUIRE_EQUAL(log_lines.size(), 2); + BOOST_CHECK(log_lines[0].starts_with("[*] [warning] Excessive logging detected")); + log_lines.erase(log_lines.begin()); + } + BOOST_REQUIRE_EQUAL(log_lines.size(), 1); + auto& payload{log_lines.back()}; + BOOST_CHECK_EQUAL(suppressions_active, payload.starts_with("[*]")); + BOOST_CHECK(payload.ends_with(message)); +} + +} // namespace + +BOOST_FIXTURE_TEST_CASE(logging_filesize_rate_limit, LogSetup) +{ + using Status = BCLog::LogRateLimiter::Status; + LogInstance().m_log_timestamps = false; + LogInstance().m_log_sourcelocations = false; + LogInstance().m_log_threadnames = false; + LogInstance().EnableCategory(BCLog::LogFlags::HTTP); + + constexpr int64_t line_length{1024}; + constexpr int64_t num_lines{10}; + constexpr int64_t bytes_quota{line_length * num_lines}; + constexpr auto time_window{1h}; + + ScopedScheduler scheduler{}; + auto limiter{scheduler.GetLimiter(bytes_quota, time_window)}; + LogInstance().SetRateLimiting(limiter); + + const std::string log_message(line_length - 1, 'a'); // subtract one for newline + + for (int i = 0; i < num_lines; ++i) { + TestLogFromLocation(Location::INFO_1, log_message, Status::UNSUPPRESSED, /*suppressions_active=*/false); + } + TestLogFromLocation(Location::INFO_1, "a", Status::NEWLY_SUPPRESSED, /*suppressions_active=*/true); + TestLogFromLocation(Location::INFO_1, "b", Status::STILL_SUPPRESSED, /*suppressions_active=*/true); + TestLogFromLocation(Location::INFO_2, "c", Status::UNSUPPRESSED, /*suppressions_active=*/true); + { + scheduler.MockForwardAndSync(time_window); + BOOST_CHECK(ReadDebugLogLines().back().starts_with("[warning] Restarting logging")); + } + // Check that logging from previously suppressed location is unsuppressed again. + TestLogFromLocation(Location::INFO_1, log_message, Status::UNSUPPRESSED, /*suppressions_active=*/false); + // Check that conditional logging, and unconditional logging with should_ratelimit=false is + // not being ratelimited. + for (Location location : {Location::DEBUG_LOG, Location::INFO_NOLIMIT}) { + for (int i = 0; i < num_lines + 2; ++i) { + TestLogFromLocation(location, log_message, Status::UNSUPPRESSED, /*suppressions_active=*/false); + } + } +} + BOOST_AUTO_TEST_SUITE_END() diff --git a/src/test/mempool_tests.cpp b/src/test/mempool_tests.cpp index 7084391c166..8dda825e043 100644 --- a/src/test/mempool_tests.cpp +++ b/src/test/mempool_tests.cpp @@ -443,7 +443,7 @@ BOOST_AUTO_TEST_CASE(MempoolSizeLimitTest) tx1.vout.resize(1); tx1.vout[0].scriptPubKey = CScript() << OP_1 << OP_EQUAL; tx1.vout[0].nValue = 10 * COIN; - AddToMempool(pool, entry.Fee(10000LL).FromTx(tx1)); + AddToMempool(pool, entry.Fee(1000LL).FromTx(tx1)); CMutableTransaction tx2 = CMutableTransaction(); tx2.vin.resize(1); @@ -451,7 +451,7 @@ BOOST_AUTO_TEST_CASE(MempoolSizeLimitTest) tx2.vout.resize(1); tx2.vout[0].scriptPubKey = CScript() << OP_2 << OP_EQUAL; tx2.vout[0].nValue = 10 * COIN; - AddToMempool(pool, entry.Fee(5000LL).FromTx(tx2)); + AddToMempool(pool, entry.Fee(500LL).FromTx(tx2)); pool.TrimToSize(pool.DynamicMemoryUsage()); // should do nothing BOOST_CHECK(pool.exists(GenTxid::Txid(tx1.GetHash()))); @@ -469,7 +469,7 @@ BOOST_AUTO_TEST_CASE(MempoolSizeLimitTest) tx3.vout.resize(1); tx3.vout[0].scriptPubKey = CScript() << OP_3 << OP_EQUAL; tx3.vout[0].nValue = 10 * COIN; - AddToMempool(pool, entry.Fee(20000LL).FromTx(tx3)); + AddToMempool(pool, entry.Fee(2000LL).FromTx(tx3)); pool.TrimToSize(pool.DynamicMemoryUsage() * 3 / 4); // tx3 should pay for tx2 (CPFP) BOOST_CHECK(!pool.exists(GenTxid::Txid(tx1.GetHash()))); @@ -481,8 +481,8 @@ BOOST_AUTO_TEST_CASE(MempoolSizeLimitTest) BOOST_CHECK(!pool.exists(GenTxid::Txid(tx2.GetHash()))); BOOST_CHECK(!pool.exists(GenTxid::Txid(tx3.GetHash()))); - CFeeRate maxFeeRateRemoved(25000, GetVirtualTransactionSize(CTransaction(tx3)) + GetVirtualTransactionSize(CTransaction(tx2))); - BOOST_CHECK_EQUAL(pool.GetMinFee(1).GetFeePerK(), maxFeeRateRemoved.GetFeePerK() + 1000); + CFeeRate maxFeeRateRemoved(2500, GetVirtualTransactionSize(CTransaction(tx3)) + GetVirtualTransactionSize(CTransaction(tx2))); + BOOST_CHECK_EQUAL(pool.GetMinFee(1).GetFeePerK(), maxFeeRateRemoved.GetFeePerK() + DEFAULT_INCREMENTAL_RELAY_FEE); CMutableTransaction tx4 = CMutableTransaction(); tx4.vin.resize(2); @@ -532,10 +532,10 @@ BOOST_AUTO_TEST_CASE(MempoolSizeLimitTest) tx7.vout[1].scriptPubKey = CScript() << OP_7 << OP_EQUAL; tx7.vout[1].nValue = 10 * COIN; - AddToMempool(pool, entry.Fee(7000LL).FromTx(tx4)); - AddToMempool(pool, entry.Fee(1000LL).FromTx(tx5)); - AddToMempool(pool, entry.Fee(1100LL).FromTx(tx6)); - AddToMempool(pool, entry.Fee(9000LL).FromTx(tx7)); + AddToMempool(pool, entry.Fee(700LL).FromTx(tx4)); + AddToMempool(pool, entry.Fee(100LL).FromTx(tx5)); + AddToMempool(pool, entry.Fee(110LL).FromTx(tx6)); + AddToMempool(pool, entry.Fee(900LL).FromTx(tx7)); // we only require this to remove, at max, 2 txn, because it's not clear what we're really optimizing for aside from that pool.TrimToSize(pool.DynamicMemoryUsage() - 1); @@ -544,8 +544,8 @@ BOOST_AUTO_TEST_CASE(MempoolSizeLimitTest) BOOST_CHECK(!pool.exists(GenTxid::Txid(tx7.GetHash()))); if (!pool.exists(GenTxid::Txid(tx5.GetHash()))) - AddToMempool(pool, entry.Fee(1000LL).FromTx(tx5)); - AddToMempool(pool, entry.Fee(9000LL).FromTx(tx7)); + AddToMempool(pool, entry.Fee(100LL).FromTx(tx5)); + AddToMempool(pool, entry.Fee(900LL).FromTx(tx7)); pool.TrimToSize(pool.DynamicMemoryUsage() / 2); // should maximize mempool size by only removing 5/7 BOOST_CHECK(pool.exists(GenTxid::Txid(tx4.GetHash()))); @@ -553,34 +553,34 @@ BOOST_AUTO_TEST_CASE(MempoolSizeLimitTest) BOOST_CHECK(pool.exists(GenTxid::Txid(tx6.GetHash()))); BOOST_CHECK(!pool.exists(GenTxid::Txid(tx7.GetHash()))); - AddToMempool(pool, entry.Fee(1000LL).FromTx(tx5)); - AddToMempool(pool, entry.Fee(9000LL).FromTx(tx7)); + AddToMempool(pool, entry.Fee(100LL).FromTx(tx5)); + AddToMempool(pool, entry.Fee(900LL).FromTx(tx7)); std::vector vtx; SetMockTime(42); SetMockTime(42 + CTxMemPool::ROLLING_FEE_HALFLIFE); - BOOST_CHECK_EQUAL(pool.GetMinFee(1).GetFeePerK(), maxFeeRateRemoved.GetFeePerK() + 1000); + BOOST_CHECK_EQUAL(pool.GetMinFee(1).GetFeePerK(), maxFeeRateRemoved.GetFeePerK() + DEFAULT_INCREMENTAL_RELAY_FEE); // ... we should keep the same min fee until we get a block pool.removeForBlock(vtx, 1); SetMockTime(42 + 2*CTxMemPool::ROLLING_FEE_HALFLIFE); - BOOST_CHECK_EQUAL(pool.GetMinFee(1).GetFeePerK(), llround((maxFeeRateRemoved.GetFeePerK() + 1000)/2.0)); + BOOST_CHECK_EQUAL(pool.GetMinFee(1).GetFeePerK(), llround((maxFeeRateRemoved.GetFeePerK() + DEFAULT_INCREMENTAL_RELAY_FEE)/2.0)); // ... then feerate should drop 1/2 each halflife SetMockTime(42 + 2*CTxMemPool::ROLLING_FEE_HALFLIFE + CTxMemPool::ROLLING_FEE_HALFLIFE/2); - BOOST_CHECK_EQUAL(pool.GetMinFee(pool.DynamicMemoryUsage() * 5 / 2).GetFeePerK(), llround((maxFeeRateRemoved.GetFeePerK() + 1000)/4.0)); + BOOST_CHECK_EQUAL(pool.GetMinFee(pool.DynamicMemoryUsage() * 5 / 2).GetFeePerK(), llround((maxFeeRateRemoved.GetFeePerK() + DEFAULT_INCREMENTAL_RELAY_FEE)/4.0)); // ... with a 1/2 halflife when mempool is < 1/2 its target size SetMockTime(42 + 2*CTxMemPool::ROLLING_FEE_HALFLIFE + CTxMemPool::ROLLING_FEE_HALFLIFE/2 + CTxMemPool::ROLLING_FEE_HALFLIFE/4); - BOOST_CHECK_EQUAL(pool.GetMinFee(pool.DynamicMemoryUsage() * 9 / 2).GetFeePerK(), llround((maxFeeRateRemoved.GetFeePerK() + 1000)/8.0)); + BOOST_CHECK_EQUAL(pool.GetMinFee(pool.DynamicMemoryUsage() * 9 / 2).GetFeePerK(), llround((maxFeeRateRemoved.GetFeePerK() + DEFAULT_INCREMENTAL_RELAY_FEE)/8.0)); // ... with a 1/4 halflife when mempool is < 1/4 its target size SetMockTime(42 + 7*CTxMemPool::ROLLING_FEE_HALFLIFE + CTxMemPool::ROLLING_FEE_HALFLIFE/2 + CTxMemPool::ROLLING_FEE_HALFLIFE/4); - BOOST_CHECK_EQUAL(pool.GetMinFee(1).GetFeePerK(), 1000); - // ... but feerate should never drop below 1000 + BOOST_CHECK_EQUAL(pool.GetMinFee(1).GetFeePerK(), DEFAULT_INCREMENTAL_RELAY_FEE); + // ... but feerate should never drop below DEFAULT_INCREMENTAL_RELAY_FEE SetMockTime(42 + 8*CTxMemPool::ROLLING_FEE_HALFLIFE + CTxMemPool::ROLLING_FEE_HALFLIFE/2 + CTxMemPool::ROLLING_FEE_HALFLIFE/4); BOOST_CHECK_EQUAL(pool.GetMinFee(1).GetFeePerK(), 0); - // ... unless it has gone all the way to 0 (after getting past 1000/2) + // ... unless it has gone all the way to 0 (after getting past DEFAULT_INCREMENTAL_RELAY_FEE/2) } inline CTransactionRef make_tx(std::vector&& output_values, std::vector&& inputs=std::vector(), std::vector&& input_indices=std::vector()) diff --git a/src/test/miner_tests.cpp b/src/test/miner_tests.cpp index 59e4dc74501..e686e0c52a3 100644 --- a/src/test/miner_tests.cpp +++ b/src/test/miner_tests.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -210,6 +211,9 @@ void MinerTestingSetup::TestPackageSelection(const CScript& scriptPubKey, const tx.vout.resize(2); tx.vout[0].nValue = 5000000000LL - 100000000; tx.vout[1].nValue = 100000000; // 1BTC output + // Increase size to avoid rounding errors: when the feerate is extremely small (i.e. 1sat/kvB), evaluating the fee + // at a smaller transaction size gives us a rounded value of 0. + BulkTransaction(tx, 4000); Txid hashFreeTx2 = tx.GetHash(); AddToMempool(tx_mempool, entry.Fee(0).SpendsCoinbase(true).FromTx(tx)); @@ -239,7 +243,7 @@ void MinerTestingSetup::TestPackageSelection(const CScript& scriptPubKey, const BOOST_REQUIRE(block_template); block = block_template->getBlock(); BOOST_REQUIRE_EQUAL(block.vtx.size(), 9U); - BOOST_CHECK(block.vtx[6]->GetHash() == hashLowFeeTx2); + BOOST_CHECK(block.vtx[8]->GetHash() == hashLowFeeTx2); } void MinerTestingSetup::TestBasicMining(const CScript& scriptPubKey, const std::vector& txFirst, int baseheight) diff --git a/src/test/netbase_tests.cpp b/src/test/netbase_tests.cpp index 3422cb80233..967378f5201 100644 --- a/src/test/netbase_tests.cpp +++ b/src/test/netbase_tests.cpp @@ -14,6 +14,7 @@ #include #include +#include #include @@ -603,14 +604,10 @@ BOOST_AUTO_TEST_CASE(isbadport) BOOST_CHECK(!IsBadPort(443)); BOOST_CHECK(!IsBadPort(8333)); - // Check all ports, there must be 80 bad ports in total. - size_t total_bad_ports{0}; - for (uint16_t port = std::numeric_limits::max(); port > 0; --port) { - if (IsBadPort(port)) { - ++total_bad_ports; - } - } - BOOST_CHECK_EQUAL(total_bad_ports, 80); + // Check all possible ports and ensure we only flag the expected amount as bad + std::list ports(std::numeric_limits::max()); + std::iota(ports.begin(), ports.end(), 1); + BOOST_CHECK_EQUAL(std::ranges::count_if(ports, IsBadPort), 85); } BOOST_AUTO_TEST_SUITE_END() diff --git a/src/test/rbf_tests.cpp b/src/test/rbf_tests.cpp index 73c813ed894..1448167cdca 100644 --- a/src/test/rbf_tests.cpp +++ b/src/test/rbf_tests.cpp @@ -228,8 +228,8 @@ BOOST_FIXTURE_TEST_CASE(rbf_helper_functions, TestChain100Setup) BOOST_CHECK(EntriesAndTxidsDisjoint({entry2_normal}, {tx1->GetHash()}, unused_txid) == std::nullopt); // Tests for PaysForRBF - const CFeeRate incremental_relay_feerate{DEFAULT_INCREMENTAL_RELAY_FEE * 10}; - const CFeeRate higher_relay_feerate{2 * DEFAULT_INCREMENTAL_RELAY_FEE * 10}; + const CFeeRate incremental_relay_feerate{DEFAULT_INCREMENTAL_RELAY_FEE}; + const CFeeRate higher_relay_feerate{2 * DEFAULT_INCREMENTAL_RELAY_FEE}; // Must pay at least as much as the original. BOOST_CHECK(PaysForRBF(/*original_fees=*/high_fee, /*replacement_fees=*/high_fee, @@ -240,10 +240,10 @@ BOOST_FIXTURE_TEST_CASE(rbf_helper_functions, TestChain100Setup) BOOST_CHECK(PaysForRBF(high_fee, high_fee - 1, 1, CFeeRate(0), unused_txid).has_value()); BOOST_CHECK(PaysForRBF(high_fee + 1, high_fee, 1, CFeeRate(0), unused_txid).has_value()); // Additional fees must cover the replacement's vsize at incremental relay fee - BOOST_CHECK(PaysForRBF(high_fee, high_fee + 1, 2, incremental_relay_feerate, unused_txid).has_value()); - BOOST_CHECK(PaysForRBF(high_fee, high_fee + 2, 2, incremental_relay_feerate, unused_txid) == std::nullopt); - BOOST_CHECK(PaysForRBF(high_fee, high_fee + 2, 2, higher_relay_feerate, unused_txid).has_value()); - BOOST_CHECK(PaysForRBF(high_fee, high_fee + 4, 2, higher_relay_feerate, unused_txid) == std::nullopt); + BOOST_CHECK(PaysForRBF(high_fee, high_fee + 1, 11, incremental_relay_feerate, unused_txid).has_value()); + BOOST_CHECK(PaysForRBF(high_fee, high_fee + 1, 10, incremental_relay_feerate, unused_txid) == std::nullopt); + BOOST_CHECK(PaysForRBF(high_fee, high_fee + 2, 11, higher_relay_feerate, unused_txid).has_value()); + BOOST_CHECK(PaysForRBF(high_fee, high_fee + 4, 20, higher_relay_feerate, unused_txid) == std::nullopt); BOOST_CHECK(PaysForRBF(low_fee, high_fee, 99999999, incremental_relay_feerate, unused_txid).has_value()); BOOST_CHECK(PaysForRBF(low_fee, high_fee + 99999999, 99999999, incremental_relay_feerate, unused_txid) == std::nullopt); diff --git a/src/test/script_p2sh_tests.cpp b/src/test/script_p2sh_tests.cpp index 211d9fa2028..3a2263ee3a5 100644 --- a/src/test/script_p2sh_tests.cpp +++ b/src/test/script_p2sh_tests.cpp @@ -364,6 +364,12 @@ BOOST_AUTO_TEST_CASE(AreInputsStandard) // 22 P2SH sigops for all inputs (1 for vin[0], 6 for vin[3], 15 for vin[4] BOOST_CHECK_EQUAL(GetP2SHSigOpCount(CTransaction(txTo), coins), 22U); + CMutableTransaction coinbase_tx_mut; + coinbase_tx_mut.vin.resize(1); + CTransaction coinbase_tx{coinbase_tx_mut}; + BOOST_CHECK(coinbase_tx.IsCoinBase()); + BOOST_CHECK_EQUAL(GetP2SHSigOpCount(coinbase_tx, coins), 0U); + CMutableTransaction txToNonStd1; txToNonStd1.vout.resize(1); txToNonStd1.vout[0].scriptPubKey = GetScriptForDestination(PKHash(key[1].GetPubKey())); diff --git a/src/test/sighash_tests.cpp b/src/test/sighash_tests.cpp index 5db1987c7f8..7c0a03f4727 100644 --- a/src/test/sighash_tests.cpp +++ b/src/test/sighash_tests.cpp @@ -208,4 +208,94 @@ BOOST_AUTO_TEST_CASE(sighash_from_data) BOOST_CHECK_MESSAGE(sh.GetHex() == sigHashHex, strTest); } } + +BOOST_AUTO_TEST_CASE(sighash_caching) +{ + // Get a script, transaction and parameters as inputs to the sighash function. + CScript scriptcode; + RandomScript(scriptcode); + CScript diff_scriptcode{scriptcode}; + diff_scriptcode << OP_1; + CMutableTransaction tx; + RandomTransaction(tx, /*fSingle=*/false); + const auto in_index{static_cast(m_rng.randrange(tx.vin.size()))}; + const auto amount{m_rng.rand()}; + + // Exercise the sighash function under both legacy and segwit v0. + for (const auto sigversion: {SigVersion::BASE, SigVersion::WITNESS_V0}) { + // For each, run it against all the 6 standard hash types and a few additional random ones. + std::vector hash_types{{SIGHASH_ALL, SIGHASH_SINGLE, SIGHASH_NONE, SIGHASH_ALL | SIGHASH_ANYONECANPAY, + SIGHASH_SINGLE | SIGHASH_ANYONECANPAY, SIGHASH_NONE | SIGHASH_ANYONECANPAY, + SIGHASH_ANYONECANPAY, 0, std::numeric_limits::max()}}; + for (int i{0}; i < 10; ++i) { + hash_types.push_back(i % 2 == 0 ? m_rng.rand() : m_rng.rand()); + } + + // Reuse the same cache across script types. This must not cause any issue as the cached value for one hash type must never + // be confused for another (instantiating the cache within the loop instead would prevent testing this). + SigHashCache cache; + for (const auto hash_type: hash_types) { + const bool expect_one{sigversion == SigVersion::BASE && ((hash_type & 0x1f) == SIGHASH_SINGLE) && in_index >= tx.vout.size()}; + + // The result of computing the sighash should be the same with or without cache. + const auto sighash_with_cache{SignatureHash(scriptcode, tx, in_index, hash_type, amount, sigversion, 0, nullptr, &cache)}; + const auto sighash_no_cache{SignatureHash(scriptcode, tx, in_index, hash_type, amount, sigversion, 0, nullptr, nullptr)}; + BOOST_CHECK_EQUAL(sighash_with_cache, sighash_no_cache); + + // Calling the cached version again should return the same value again. + BOOST_CHECK_EQUAL(sighash_with_cache, SignatureHash(scriptcode, tx, in_index, hash_type, amount, sigversion, 0, nullptr, &cache)); + + // While here we might as well also check that the result for legacy is the same as for the old SignatureHash() function. + if (sigversion == SigVersion::BASE) { + BOOST_CHECK_EQUAL(sighash_with_cache, SignatureHashOld(scriptcode, CTransaction(tx), in_index, hash_type)); + } + + // Calling with a different scriptcode (for instance in case a CODESEP is encountered) will not return the cache value but + // overwrite it. The sighash will always be different except in case of legacy SIGHASH_SINGLE bug. + const auto sighash_with_cache2{SignatureHash(diff_scriptcode, tx, in_index, hash_type, amount, sigversion, 0, nullptr, &cache)}; + const auto sighash_no_cache2{SignatureHash(diff_scriptcode, tx, in_index, hash_type, amount, sigversion, 0, nullptr, nullptr)}; + BOOST_CHECK_EQUAL(sighash_with_cache2, sighash_no_cache2); + if (!expect_one) { + BOOST_CHECK_NE(sighash_with_cache, sighash_with_cache2); + } else { + BOOST_CHECK_EQUAL(sighash_with_cache, sighash_with_cache2); + BOOST_CHECK_EQUAL(sighash_with_cache, uint256::ONE); + } + + // Calling the cached version again should return the same value again. + BOOST_CHECK_EQUAL(sighash_with_cache2, SignatureHash(diff_scriptcode, tx, in_index, hash_type, amount, sigversion, 0, nullptr, &cache)); + + // And if we store a different value for this scriptcode and hash type it will return that instead. + { + HashWriter h{}; + h << 42; + cache.Store(hash_type, scriptcode, h); + const auto stored_hash{h.GetHash()}; + BOOST_CHECK(cache.Load(hash_type, scriptcode, h)); + const auto loaded_hash{h.GetHash()}; + BOOST_CHECK_EQUAL(stored_hash, loaded_hash); + } + + // And using this mutated cache with the sighash function will return the new value (except in the legacy SIGHASH_SINGLE bug + // case in which it'll return 1). + if (!expect_one) { + BOOST_CHECK_NE(SignatureHash(scriptcode, tx, in_index, hash_type, amount, sigversion, 0, nullptr, &cache), sighash_with_cache); + HashWriter h{}; + BOOST_CHECK(cache.Load(hash_type, scriptcode, h)); + h << hash_type; + const auto new_hash{h.GetHash()}; + BOOST_CHECK_EQUAL(SignatureHash(scriptcode, tx, in_index, hash_type, amount, sigversion, 0, nullptr, &cache), new_hash); + } else { + BOOST_CHECK_EQUAL(SignatureHash(scriptcode, tx, in_index, hash_type, amount, sigversion, 0, nullptr, &cache), uint256::ONE); + } + + // Wipe the cache and restore the correct cached value for this scriptcode and hash_type before starting the next iteration. + HashWriter dummy{}; + cache.Store(hash_type, diff_scriptcode, dummy); + (void)SignatureHash(scriptcode, tx, in_index, hash_type, amount, sigversion, 0, nullptr, &cache); + BOOST_CHECK(cache.Load(hash_type, scriptcode, dummy) || expect_one); + } + } +} + BOOST_AUTO_TEST_SUITE_END() diff --git a/src/test/transaction_tests.cpp b/src/test/transaction_tests.cpp index a4c9d32eb27..ea3effff42d 100644 --- a/src/test/transaction_tests.cpp +++ b/src/test/transaction_tests.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -1065,4 +1066,254 @@ BOOST_AUTO_TEST_CASE(test_IsStandard) CheckIsNotStandard(t, "dust"); } +BOOST_AUTO_TEST_CASE(max_standard_legacy_sigops) +{ + CCoinsView coins_dummy; + CCoinsViewCache coins(&coins_dummy); + CKey key; + key.MakeNewKey(true); + + // Create a pathological P2SH script padded with as many sigops as is standard. + CScript max_sigops_redeem_script{CScript() << std::vector{} << key.GetPubKey()}; + for (unsigned i{0}; i < MAX_P2SH_SIGOPS - 1; ++i) max_sigops_redeem_script << OP_2DUP << OP_CHECKSIG << OP_DROP; + max_sigops_redeem_script << OP_CHECKSIG << OP_NOT; + const CScript max_sigops_p2sh{GetScriptForDestination(ScriptHash(max_sigops_redeem_script))}; + + // Create a transaction fanning out as many such P2SH outputs as is standard to spend in a + // single transaction, and a transaction spending them. + CMutableTransaction tx_create, tx_max_sigops; + const unsigned p2sh_inputs_count{MAX_TX_LEGACY_SIGOPS / MAX_P2SH_SIGOPS}; + tx_create.vout.reserve(p2sh_inputs_count); + for (unsigned i{0}; i < p2sh_inputs_count; ++i) { + tx_create.vout.emplace_back(CAsset(), 424242 + i, max_sigops_p2sh); + } + auto prev_txid{tx_create.GetHash()}; + tx_max_sigops.vin.reserve(p2sh_inputs_count); + for (unsigned i{0}; i < p2sh_inputs_count; ++i) { + tx_max_sigops.vin.emplace_back(prev_txid, i, CScript() << ToByteVector(max_sigops_redeem_script)); + } + + // p2sh_inputs_count is truncated to 166 (from 166.6666..) + BOOST_CHECK_LT(p2sh_inputs_count * MAX_P2SH_SIGOPS, MAX_TX_LEGACY_SIGOPS); + AddCoins(coins, CTransaction(tx_create), 0, false); + + // 2490 sigops is below the limit. + BOOST_CHECK_EQUAL(GetP2SHSigOpCount(CTransaction(tx_max_sigops), coins), 2490); + BOOST_CHECK(::AreInputsStandard(CTransaction(tx_max_sigops), coins)); + + // Adding one more input will bump this to 2505, hitting the limit. + tx_create.vout.emplace_back(CAsset(), 424242, max_sigops_p2sh); + prev_txid = tx_create.GetHash(); + for (unsigned i{0}; i < p2sh_inputs_count; ++i) { + tx_max_sigops.vin[i] = CTxIn(COutPoint(prev_txid, i), CScript() << ToByteVector(max_sigops_redeem_script)); + } + tx_max_sigops.vin.emplace_back(prev_txid, p2sh_inputs_count, CScript() << ToByteVector(max_sigops_redeem_script)); + AddCoins(coins, CTransaction(tx_create), 0, false); + BOOST_CHECK_GT((p2sh_inputs_count + 1) * MAX_P2SH_SIGOPS, MAX_TX_LEGACY_SIGOPS); + BOOST_CHECK_EQUAL(GetP2SHSigOpCount(CTransaction(tx_max_sigops), coins), 2505); + BOOST_CHECK(!::AreInputsStandard(CTransaction(tx_max_sigops), coins)); + + // Now, check the limit can be reached with regular P2PK outputs too. Use a separate + // preparation transaction, to demonstrate spending coins from a single tx is irrelevant. + CMutableTransaction tx_create_p2pk; + const auto p2pk_script{CScript() << key.GetPubKey() << OP_CHECKSIG}; + unsigned p2pk_inputs_count{10}; // From 2490 to 2500. + for (unsigned i{0}; i < p2pk_inputs_count; ++i) { + tx_create_p2pk.vout.emplace_back(CAsset(), 212121 + i, p2pk_script); + } + prev_txid = tx_create_p2pk.GetHash(); + tx_max_sigops.vin.resize(p2sh_inputs_count); // Drop the extra input. + for (unsigned i{0}; i < p2pk_inputs_count; ++i) { + tx_max_sigops.vin.emplace_back(prev_txid, i); + } + AddCoins(coins, CTransaction(tx_create_p2pk), 0, false); + + // The transaction now contains exactly 2500 sigops, the check should pass. + BOOST_CHECK_EQUAL(p2sh_inputs_count * MAX_P2SH_SIGOPS + p2pk_inputs_count * 1, MAX_TX_LEGACY_SIGOPS); + BOOST_CHECK(::AreInputsStandard(CTransaction(tx_max_sigops), coins)); + + // Now, add some Segwit inputs. We add one for each defined Segwit output type. The limit + // is exclusively on non-witness sigops and therefore those should not be counted. + CMutableTransaction tx_create_segwit; + const auto witness_script{CScript() << key.GetPubKey() << OP_CHECKSIG}; + tx_create_segwit.vout.emplace_back(CAsset(), 121212, GetScriptForDestination(WitnessV0KeyHash(key.GetPubKey()))); + tx_create_segwit.vout.emplace_back(CAsset(), 131313, GetScriptForDestination(WitnessV0ScriptHash(witness_script))); + tx_create_segwit.vout.emplace_back(CAsset(), 141414, GetScriptForDestination(WitnessV1Taproot{XOnlyPubKey(key.GetPubKey())})); + prev_txid = tx_create_segwit.GetHash(); + for (unsigned i{0}; i < tx_create_segwit.vout.size(); ++i) { + tx_max_sigops.vin.emplace_back(prev_txid, i); + } + + // The transaction now still contains exactly 2500 sigops, the check should pass. + AddCoins(coins, CTransaction(tx_create_segwit), 0, false); + BOOST_REQUIRE(::AreInputsStandard(CTransaction(tx_max_sigops), coins)); + + // Add one more P2PK input. We'll reach the limit. + tx_create_p2pk.vout.emplace_back(CAsset(), 212121, p2pk_script); + prev_txid = tx_create_p2pk.GetHash(); + tx_max_sigops.vin.resize(p2sh_inputs_count); + ++p2pk_inputs_count; + for (unsigned i{0}; i < p2pk_inputs_count; ++i) { + tx_max_sigops.vin.emplace_back(prev_txid, i); + } + AddCoins(coins, CTransaction(tx_create_p2pk), 0, false); + BOOST_CHECK_GT(p2sh_inputs_count * MAX_P2SH_SIGOPS + p2pk_inputs_count * 1, MAX_TX_LEGACY_SIGOPS); + BOOST_CHECK(!::AreInputsStandard(CTransaction(tx_max_sigops), coins)); +} + +/** Sanity check the return value of SpendsNonAnchorWitnessProg for various output types. */ +BOOST_AUTO_TEST_CASE(spends_witness_prog) +{ + CCoinsView coins_dummy; + CCoinsViewCache coins(&coins_dummy); + CKey key; + key.MakeNewKey(true); + const CPubKey pubkey{key.GetPubKey()}; + CMutableTransaction tx_create{}, tx_spend{}; + tx_create.vout.emplace_back(CAsset(), 0, CScript{}); + tx_spend.vin.emplace_back(Txid{}, 0); + std::vector> sol_dummy; + + // CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, + // WitnessV1Taproot, PayToAnchor, WitnessUnknown, NullData (Elements-specific). + static_assert(std::variant_size_v == 10); + + // Go through all defined output types and sanity check SpendsNonAnchorWitnessProg. + + // P2PK + tx_create.vout[0].scriptPubKey = GetScriptForDestination(PubKeyDestination{pubkey}); + BOOST_CHECK_EQUAL(Solver(tx_create.vout[0].scriptPubKey, sol_dummy), TxoutType::PUBKEY); + tx_spend.vin[0].prevout.hash = tx_create.GetHash(); + AddCoins(coins, CTransaction{tx_create}, 0, false); + BOOST_CHECK(!::SpendsNonAnchorWitnessProg(CTransaction{tx_spend}, coins)); + + // P2PKH + tx_create.vout[0].scriptPubKey = GetScriptForDestination(PKHash{pubkey}); + BOOST_CHECK_EQUAL(Solver(tx_create.vout[0].scriptPubKey, sol_dummy), TxoutType::PUBKEYHASH); + tx_spend.vin[0].prevout.hash = tx_create.GetHash(); + AddCoins(coins, CTransaction{tx_create}, 0, false); + BOOST_CHECK(!::SpendsNonAnchorWitnessProg(CTransaction{tx_spend}, coins)); + + // P2SH + auto redeem_script{CScript{} << OP_1 << OP_CHECKSIG}; + tx_create.vout[0].scriptPubKey = GetScriptForDestination(ScriptHash{redeem_script}); + BOOST_CHECK_EQUAL(Solver(tx_create.vout[0].scriptPubKey, sol_dummy), TxoutType::SCRIPTHASH); + tx_spend.vin[0].prevout.hash = tx_create.GetHash(); + tx_spend.vin[0].scriptSig = CScript{} << OP_0 << ToByteVector(redeem_script); + AddCoins(coins, CTransaction{tx_create}, 0, false); + BOOST_CHECK(!::SpendsNonAnchorWitnessProg(CTransaction{tx_spend}, coins)); + tx_spend.vin[0].scriptSig.clear(); + + // native P2WSH + const auto witness_script{CScript{} << OP_12 << OP_HASH160 << OP_DUP << OP_EQUAL}; + tx_create.vout[0].scriptPubKey = GetScriptForDestination(WitnessV0ScriptHash{witness_script}); + BOOST_CHECK_EQUAL(Solver(tx_create.vout[0].scriptPubKey, sol_dummy), TxoutType::WITNESS_V0_SCRIPTHASH); + tx_spend.vin[0].prevout.hash = tx_create.GetHash(); + AddCoins(coins, CTransaction{tx_create}, 0, false); + BOOST_CHECK(::SpendsNonAnchorWitnessProg(CTransaction{tx_spend}, coins)); + + // P2SH-wrapped P2WSH + redeem_script = tx_create.vout[0].scriptPubKey; + tx_create.vout[0].scriptPubKey = GetScriptForDestination(ScriptHash(redeem_script)); + BOOST_CHECK_EQUAL(Solver(tx_create.vout[0].scriptPubKey, sol_dummy), TxoutType::SCRIPTHASH); + tx_spend.vin[0].prevout.hash = tx_create.GetHash(); + tx_spend.vin[0].scriptSig = CScript{} << ToByteVector(redeem_script); + AddCoins(coins, CTransaction{tx_create}, 0, false); + BOOST_CHECK(::SpendsNonAnchorWitnessProg(CTransaction{tx_spend}, coins)); + tx_spend.vin[0].scriptSig.clear(); + BOOST_CHECK(!::SpendsNonAnchorWitnessProg(CTransaction{tx_spend}, coins)); + + // native P2WPKH + tx_create.vout[0].scriptPubKey = GetScriptForDestination(WitnessV0KeyHash{pubkey}); + BOOST_CHECK_EQUAL(Solver(tx_create.vout[0].scriptPubKey, sol_dummy), TxoutType::WITNESS_V0_KEYHASH); + tx_spend.vin[0].prevout.hash = tx_create.GetHash(); + AddCoins(coins, CTransaction{tx_create}, 0, false); + BOOST_CHECK(::SpendsNonAnchorWitnessProg(CTransaction{tx_spend}, coins)); + + // P2SH-wrapped P2WPKH + redeem_script = tx_create.vout[0].scriptPubKey; + tx_create.vout[0].scriptPubKey = GetScriptForDestination(ScriptHash(redeem_script)); + BOOST_CHECK_EQUAL(Solver(tx_create.vout[0].scriptPubKey, sol_dummy), TxoutType::SCRIPTHASH); + tx_spend.vin[0].prevout.hash = tx_create.GetHash(); + tx_spend.vin[0].scriptSig = CScript{} << ToByteVector(redeem_script); + AddCoins(coins, CTransaction{tx_create}, 0, false); + BOOST_CHECK(::SpendsNonAnchorWitnessProg(CTransaction{tx_spend}, coins)); + tx_spend.vin[0].scriptSig.clear(); + BOOST_CHECK(!::SpendsNonAnchorWitnessProg(CTransaction{tx_spend}, coins)); + + // P2TR + tx_create.vout[0].scriptPubKey = GetScriptForDestination(WitnessV1Taproot{XOnlyPubKey{pubkey}}); + BOOST_CHECK_EQUAL(Solver(tx_create.vout[0].scriptPubKey, sol_dummy), TxoutType::WITNESS_V1_TAPROOT); + tx_spend.vin[0].prevout.hash = tx_create.GetHash(); + AddCoins(coins, CTransaction{tx_create}, 0, false); + BOOST_CHECK(::SpendsNonAnchorWitnessProg(CTransaction{tx_spend}, coins)); + + // P2SH-wrapped P2TR (undefined, non-standard) + redeem_script = tx_create.vout[0].scriptPubKey; + tx_create.vout[0].scriptPubKey = GetScriptForDestination(ScriptHash(redeem_script)); + BOOST_CHECK_EQUAL(Solver(tx_create.vout[0].scriptPubKey, sol_dummy), TxoutType::SCRIPTHASH); + tx_spend.vin[0].prevout.hash = tx_create.GetHash(); + tx_spend.vin[0].scriptSig = CScript{} << ToByteVector(redeem_script); + AddCoins(coins, CTransaction{tx_create}, 0, false); + BOOST_CHECK(::SpendsNonAnchorWitnessProg(CTransaction{tx_spend}, coins)); + tx_spend.vin[0].scriptSig.clear(); + BOOST_CHECK(!::SpendsNonAnchorWitnessProg(CTransaction{tx_spend}, coins)); + + // P2A + tx_create.vout[0].scriptPubKey = GetScriptForDestination(PayToAnchor{}); + BOOST_CHECK_EQUAL(Solver(tx_create.vout[0].scriptPubKey, sol_dummy), TxoutType::ANCHOR); + tx_spend.vin[0].prevout.hash = tx_create.GetHash(); + AddCoins(coins, CTransaction{tx_create}, 0, false); + BOOST_CHECK(!::SpendsNonAnchorWitnessProg(CTransaction{tx_spend}, coins)); + + // P2SH-wrapped P2A (undefined, non-standard) + redeem_script = tx_create.vout[0].scriptPubKey; + tx_create.vout[0].scriptPubKey = GetScriptForDestination(ScriptHash(redeem_script)); + BOOST_CHECK_EQUAL(Solver(tx_create.vout[0].scriptPubKey, sol_dummy), TxoutType::SCRIPTHASH); + tx_spend.vin[0].prevout.hash = tx_create.GetHash(); + tx_spend.vin[0].scriptSig = CScript{} << ToByteVector(redeem_script); + AddCoins(coins, CTransaction{tx_create}, 0, false); + BOOST_CHECK(::SpendsNonAnchorWitnessProg(CTransaction{tx_spend}, coins)); + tx_spend.vin[0].scriptSig.clear(); + + // Undefined version 1 witness program + tx_create.vout[0].scriptPubKey = GetScriptForDestination(WitnessUnknown{1, {0x42, 0x42}}); + BOOST_CHECK_EQUAL(Solver(tx_create.vout[0].scriptPubKey, sol_dummy), TxoutType::WITNESS_UNKNOWN); + tx_spend.vin[0].prevout.hash = tx_create.GetHash(); + AddCoins(coins, CTransaction{tx_create}, 0, false); + BOOST_CHECK(::SpendsNonAnchorWitnessProg(CTransaction{tx_spend}, coins)); + + // P2SH-wrapped undefined version 1 witness program + redeem_script = tx_create.vout[0].scriptPubKey; + tx_create.vout[0].scriptPubKey = GetScriptForDestination(ScriptHash(redeem_script)); + BOOST_CHECK_EQUAL(Solver(tx_create.vout[0].scriptPubKey, sol_dummy), TxoutType::SCRIPTHASH); + tx_spend.vin[0].prevout.hash = tx_create.GetHash(); + tx_spend.vin[0].scriptSig = CScript{} << ToByteVector(redeem_script); + AddCoins(coins, CTransaction{tx_create}, 0, false); + BOOST_CHECK(::SpendsNonAnchorWitnessProg(CTransaction{tx_spend}, coins)); + tx_spend.vin[0].scriptSig.clear(); + BOOST_CHECK(!::SpendsNonAnchorWitnessProg(CTransaction{tx_spend}, coins)); + + // Various undefined version >1 32-byte witness programs. + const auto program{ToByteVector(XOnlyPubKey{pubkey})}; + for (int i{2}; i <= 16; ++i) { + tx_create.vout[0].scriptPubKey = GetScriptForDestination(WitnessUnknown{i, program}); + BOOST_CHECK_EQUAL(Solver(tx_create.vout[0].scriptPubKey, sol_dummy), TxoutType::WITNESS_UNKNOWN); + tx_spend.vin[0].prevout.hash = tx_create.GetHash(); + AddCoins(coins, CTransaction{tx_create}, 0, false); + BOOST_CHECK(::SpendsNonAnchorWitnessProg(CTransaction{tx_spend}, coins)); + + // It's also detected within P2SH. + redeem_script = tx_create.vout[0].scriptPubKey; + tx_create.vout[0].scriptPubKey = GetScriptForDestination(ScriptHash(redeem_script)); + BOOST_CHECK_EQUAL(Solver(tx_create.vout[0].scriptPubKey, sol_dummy), TxoutType::SCRIPTHASH); + tx_spend.vin[0].prevout.hash = tx_create.GetHash(); + tx_spend.vin[0].scriptSig = CScript{} << ToByteVector(redeem_script); + AddCoins(coins, CTransaction{tx_create}, 0, false); + BOOST_CHECK(::SpendsNonAnchorWitnessProg(CTransaction{tx_spend}, coins)); + tx_spend.vin[0].scriptSig.clear(); + BOOST_CHECK(!::SpendsNonAnchorWitnessProg(CTransaction{tx_spend}, coins)); + } +} + BOOST_AUTO_TEST_SUITE_END() diff --git a/src/test/util/logging.h b/src/test/util/logging.h index 73ac23825f9..62b11c28410 100644 --- a/src/test/util/logging.h +++ b/src/test/util/logging.h @@ -33,7 +33,7 @@ class DebugLogHelper public: explicit DebugLogHelper(std::string message, MatchFn match = [](const std::string*){ return true; }); - ~DebugLogHelper() { check_found(); } + ~DebugLogHelper() noexcept(false) { check_found(); } }; #define ASSERT_DEBUG_LOG(message) DebugLogHelper UNIQUE_NAME(debugloghelper)(message) diff --git a/src/test/util/setup_common.cpp b/src/test/util/setup_common.cpp index a1606236aa1..2ab14638258 100644 --- a/src/test/util/setup_common.cpp +++ b/src/test/util/setup_common.cpp @@ -43,6 +43,7 @@ #include #include #include +#include #include #include #include @@ -592,6 +593,9 @@ void TestChain100Setup::MockMempoolMinFee(const CFeeRate& target_feerate) CMutableTransaction mtx = CMutableTransaction(); mtx.vin.emplace_back(COutPoint{Txid::FromUint256(m_rng.rand256()), 0}); mtx.vout.emplace_back(CAsset(), 1 * COIN, GetScriptForDestination(WitnessV0ScriptHash(CScript() << OP_TRUE))); + // Set a large size so that the fee evaluated at target_feerate (which is usually in sats/kvB) is an integer. + // Otherwise, GetMinFee() may end up slightly different from target_feerate. + BulkTransaction(mtx, 4000); const auto tx{MakeTransactionRef(mtx)}; LockPoints lp; // The new mempool min feerate is equal to the removed package's feerate + incremental feerate. diff --git a/src/test/util/txmempool.cpp b/src/test/util/txmempool.cpp index 90130e13798..bd7dcdc6f92 100644 --- a/src/test/util/txmempool.cpp +++ b/src/test/util/txmempool.cpp @@ -23,7 +23,6 @@ CTxMemPool::Options MemPoolOptionsForTest(const NodeContext& node) // Default to always checking mempool regardless of // chainparams.DefaultConsistencyChecks for tests .check_ratio = 1, - .incremental_relay_feerate = CFeeRate(1000), // ELEMENTS: use upstream incremental relay feerate .signals = node.validation_signals.get(), }; const auto result{ApplyArgsManOptions(*node.args, ::Params(), mempool_opts)}; diff --git a/src/test/validation_flush_tests.cpp b/src/test/validation_flush_tests.cpp index 50558770907..8ad616cb3ae 100644 --- a/src/test/validation_flush_tests.cpp +++ b/src/test/validation_flush_tests.cpp @@ -36,8 +36,10 @@ BOOST_AUTO_TEST_CASE(getcoinscachesizestate) BOOST_TEST_MESSAGE("CCoinsViewCache memory usage: " << view.DynamicMemoryUsage()); }; - // PoolResource defaults to 256 KiB that will be allocated, so we'll take that and make it a bit larger. - constexpr size_t MAX_COINS_CACHE_BYTES = 262144 + 512; + // PoolResource for CCoinsMap sizes its chunk relative to sizeof(CoinsCachePair) + // (see CCoinsMapMemoryResource in coins.h) rather than a fixed byte count. + // Mirror that calculation here instead of hardcoding the old 256 KiB default. + constexpr size_t MAX_COINS_CACHE_BYTES = (sizeof(CoinsCachePair) + sizeof(void*) * 4) * 1024 + 512; // Without any coins in the cache, we shouldn't need to flush. BOOST_TEST( @@ -49,7 +51,8 @@ BOOST_AUTO_TEST_CASE(getcoinscachesizestate) if (view.DynamicMemoryUsage() != 32 && view.DynamicMemoryUsage() != 16) { // Add a bunch of coins to see that we at least flip over to CRITICAL. - for (int i{0}; i < 1000; ++i) { + const int num_coins_to_add = static_cast(MAX_COINS_CACHE_BYTES / COIN_SIZE) + 100; // margin to guarantee crossing the threshold + for (int i{0}; i < num_coins_to_add; ++i) { const COutPoint res = AddTestCoin(m_rng, view); BOOST_CHECK_EQUAL(view.AccessCoin(res).DynamicMemoryUsage(), COIN_SIZE); } diff --git a/src/txdb.cpp b/src/txdb.cpp index cd6a20712ea..1968a0b6810 100644 --- a/src/txdb.cpp +++ b/src/txdb.cpp @@ -12,10 +12,14 @@ #include #include #include +#include #include #include +#include #include +#include +#include #include #include @@ -58,11 +62,22 @@ CCoinsViewDB::CCoinsViewDB(DBParams db_params, CoinsViewOptions options) : m_options{std::move(options)}, m_db{std::make_unique(m_db_params)} { } +CCoinsViewDB::~CCoinsViewDB() +{ + if (m_compaction.valid()) { + if (m_compaction.wait_for(std::chrono::seconds{0}) != std::future_status::ready) { + LogInfo("Waiting for background chainstate compaction of %s", fs::PathToString(m_db_params.path)); + } + m_compaction.wait(); + } +} + void CCoinsViewDB::ResizeCache(size_t new_cache_size) { // We can't do this operation with an in-memory DB since we'll lose all the coins upon // reset. if (!m_db_params.memory_only) { + LOCK(m_db_mutex); // Have to do a reset first to get the original `m_db` state to release its // filesystem lock. m_db.reset(); @@ -181,6 +196,30 @@ size_t CCoinsViewDB::EstimateSize() const return m_db->EstimateSize(DB_COIN, uint8_t(DB_COIN + 1)); } +std::optional CCoinsViewDB::GetDBProperty(const std::string& property) +{ + return m_db->GetProperty(property); +} + +std::shared_future CCoinsViewDB::CompactFull() +{ + AssertLockHeld(::cs_main); + if (m_compaction.valid() && m_compaction.wait_for(std::chrono::seconds{0}) != std::future_status::ready) return m_compaction; + m_compaction = std::async(std::launch::async, [this] { + try { + util::ThreadRename("utxocompact"); + LOCK(m_db_mutex); + + LogDebug(BCLog::COINDB, "Starting chainstate compaction of %s", fs::PathToString(m_db_params.path)); + m_db->CompactFull(); + LogDebug(BCLog::COINDB, "Finished chainstate compaction of %s", fs::PathToString(m_db_params.path)); + } catch (const std::exception& e) { + LogWarning("Failed chainstate compaction (%s)", e.what()); + } + }).share(); + return m_compaction; +} + /** Specialization of CCoinsViewCursor to iterate over a CCoinsViewDB */ class CCoinsViewDBCursor: public CCoinsViewCursor { diff --git a/src/txdb.h b/src/txdb.h index d128d25b138..f66828e7091 100644 --- a/src/txdb.h +++ b/src/txdb.h @@ -14,8 +14,10 @@ #include #include +#include #include #include +#include #include class COutPoint; @@ -39,9 +41,13 @@ class CCoinsViewDB final : public CCoinsView protected: DBParams m_db_params; CoinsViewOptions m_options; + //! Prevents CompactFull() from using m_db while ResizeCache() replaces it. + Mutex m_db_mutex; std::unique_ptr m_db; + std::shared_future m_compaction; public: explicit CCoinsViewDB(DBParams db_params, CoinsViewOptions options); + ~CCoinsViewDB() override; std::optional GetCoin(const COutPoint& outpoint) const override; bool HaveCoin(const COutPoint &outpoint) const override; @@ -57,10 +63,16 @@ class CCoinsViewDB final : public CCoinsView size_t EstimateSize() const override; //! Dynamically alter the underlying leveldb cache size. - void ResizeCache(size_t new_cache_size) EXCLUSIVE_LOCKS_REQUIRED(cs_main); + void ResizeCache(size_t new_cache_size) EXCLUSIVE_LOCKS_REQUIRED(cs_main, !m_db_mutex); //! @returns filesystem path to on-disk storage or std::nullopt if in memory. std::optional StoragePath() { return m_db->StoragePath(); } + + //! Perform a full compaction of the underlying LevelDB on a one-shot background thread. + std::shared_future CompactFull() EXCLUSIVE_LOCKS_REQUIRED(cs_main, !m_db_mutex); + + //! Return an underlying LevelDB property value, if available. + std::optional GetDBProperty(const std::string& property); }; #endif // BITCOIN_TXDB_H diff --git a/src/txmempool.cpp b/src/txmempool.cpp index 4cf0d1a933d..cd8a4cc1685 100644 --- a/src/txmempool.cpp +++ b/src/txmempool.cpp @@ -744,7 +744,7 @@ void CTxMemPool::removeForBlock(const std::vector& vtx, unsigne } } } - + if (m_opts.signals) { m_opts.signals->MempoolTransactionsRemovedForBlock(txs_removed_for_block, nBlockHeight); } diff --git a/src/txmempool.h b/src/txmempool.h index 3ae6ac48428..c503ef3c4b3 100644 --- a/src/txmempool.h +++ b/src/txmempool.h @@ -379,7 +379,9 @@ class CTxMemPool static const int ROLLING_FEE_HALFLIFE = 60 * 60 * 12; // public only for testing - struct CTxMemPoolEntry_Indices final : boost::multi_index::indexed_by< + using indexed_transaction_set = boost::multi_index_container< + CTxMemPoolEntry, + boost::multi_index::indexed_by< // sorted by txid boost::multi_index::hashed_unique, // sorted by wtxid @@ -413,11 +415,7 @@ class CTxMemPool CompareTxMemPoolEntryByConfidentialFee > > - {}; - typedef boost::multi_index_container< - CTxMemPoolEntry, - CTxMemPoolEntry_Indices - > indexed_transaction_set; + >; /** * This mutex needs to be locked when accessing `mapTx` or other members diff --git a/src/txrequest.cpp b/src/txrequest.cpp index 5909146427b..521ddec901d 100644 --- a/src/txrequest.cpp +++ b/src/txrequest.cpp @@ -212,17 +212,15 @@ struct ByTimeViewExtractor } }; -struct Announcement_Indices final : boost::multi_index::indexed_by< - boost::multi_index::ordered_unique, ByPeerViewExtractor>, - boost::multi_index::ordered_non_unique, ByTxHashViewExtractor>, - boost::multi_index::ordered_non_unique, ByTimeViewExtractor> -> -{}; /** Data type for the main data structure (Announcement objects with ByPeer/ByTxHash/ByTime indexes). */ using Index = boost::multi_index_container< Announcement, - Announcement_Indices + boost::multi_index::indexed_by< + boost::multi_index::ordered_unique, ByPeerViewExtractor>, + boost::multi_index::ordered_non_unique, ByTxHashViewExtractor>, + boost::multi_index::ordered_non_unique, ByTimeViewExtractor> + > >; /** Helper type to simplify syntax of iterator types. */ diff --git a/src/util/chaintype.cpp b/src/util/chaintype.cpp index ac6eef690b5..e0954c83b8a 100644 --- a/src/util/chaintype.cpp +++ b/src/util/chaintype.cpp @@ -11,6 +11,7 @@ #include #include #include +#include // IWYU pragma: keep std::string ChainTypeToString(ChainType chain) { diff --git a/src/util/chaintype.h b/src/util/chaintype.h index aa54e966788..50edad39d08 100644 --- a/src/util/chaintype.h +++ b/src/util/chaintype.h @@ -11,6 +11,7 @@ #include #include +#include // IWYU pragma: keep enum class ChainType { MAIN, diff --git a/src/util/trace.h b/src/util/trace.h index 3deefeade37..ab005dd8bce 100644 --- a/src/util/trace.h +++ b/src/util/trace.h @@ -9,6 +9,13 @@ #ifdef ENABLE_TRACING +// Workaround for https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103395 +// systemtap 4.6 on 32-bit ARM triggers internal compiler error +// (this workaround is included in systemtap 4.7+) +#if defined(__arm__) +# define STAP_SDT_ARG_CONSTRAINT g +#endif + // Setting SDT_USE_VARIADIC lets systemtap (sys/sdt.h) know that we want to use // the optional variadic macros to define tracepoints. #define SDT_USE_VARIADIC 1 diff --git a/src/validation.cpp b/src/validation.cpp index d32faa9ed4e..368027cee6d 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -118,6 +118,13 @@ const std::vector CHECKLEVEL_DOC { * */ static constexpr int PRUNE_LOCK_BUFFER{10}; +// Return whether the completed full flush should compact chainstate +static bool ShouldCompactChainstate(bool in_ibd) +{ + static constexpr uint32_t flush_ratio{320}; // Roughly every 2 weeks with hourly flushes + return !in_ibd && FastRandomContext().randrange(flush_ratio) == 0; +} + TRACEPOINT_SEMAPHORE(validation, block_connected); TRACEPOINT_SEMAPHORE(utxocache, flush); TRACEPOINT_SEMAPHORE(mempool, replaced); @@ -864,7 +871,7 @@ class MemPoolAccept // or the peg-in paid enough subsidy return true; } - + ValidationCache& GetValidationCache() { return m_active_chainstate.m_chainman.m_validation_cache; @@ -986,7 +993,24 @@ bool MemPoolAccept::PreChecks(ATMPArgs& args, Workspace& ws) // Transaction conflicts with a mempool tx, but we're not allowing replacements in this context. return state.Invalid(TxValidationResult::TX_MEMPOOL_POLICY, "bip125-replacement-disallowed"); } - ws.m_conflicts.insert(ptxConflicting->GetHash()); + if (!ws.m_conflicts.count(ptxConflicting->GetHash())) + { + // Transactions that don't explicitly signal replaceability are + // *not* replaceable with the current logic, even if one of their + // unconfirmed ancestors signals replaceability. This diverges + // from BIP125's inherited signaling description (see CVE-2021-31876). + // Applications relying on first-seen mempool behavior should + // check all unconfirmed ancestors; otherwise an opt-in ancestor + // might be replaced, causing removal of this descendant. + // + // All TRUC transactions are considered replaceable. + const bool allow_rbf{SignalsOptInRBF(*ptxConflicting) || ptxConflicting->version == TRUC_VERSION}; + if (!allow_rbf) { + return state.Invalid(TxValidationResult::TX_MEMPOOL_POLICY, "txn-mempool-conflict"); + } + + ws.m_conflicts.insert(ptxConflicting->GetHash()); + } } } @@ -1252,26 +1276,28 @@ bool MemPoolAccept::PreChecks(ATMPArgs& args, Workspace& ws) // Even though just checking direct mempool parents for inheritance would be sufficient, we // check using the full ancestor set here because it's more convenient to use what we have // already calculated. - if (const auto err{SingleTRUCChecks(ws.m_ptx, ws.m_ancestors, ws.m_conflicts, ws.m_vsize)}) { - // Single transaction contexts only. - if (args.m_allow_sibling_eviction && err->second != nullptr) { - // We should only be considering where replacement is considered valid as well. - Assume(args.m_allow_replacement); - - // Potential sibling eviction. Add the sibling to our list of mempool conflicts to be - // included in RBF checks. - ws.m_conflicts.insert(err->second->GetHash()); - // Adding the sibling to m_iters_conflicting here means that it doesn't count towards - // RBF Carve Out above. This is correct, since removing to-be-replaced transactions from - // the descendant count is done separately in SingleTRUCChecks for TRUC transactions. - ws.m_iters_conflicting.insert(m_pool.GetIter(err->second->GetHash()).value()); - ws.m_sibling_eviction = true; - // The sibling will be treated as part of the to-be-replaced set in ReplacementChecks. - // Note that we are not checking whether it opts in to replaceability via BIP125 or TRUC - // (which is normally done in PreChecks). However, the only way a TRUC transaction can - // have a non-TRUC and non-BIP125 descendant is due to a reorg. - } else { - return state.Invalid(TxValidationResult::TX_MEMPOOL_POLICY, "TRUC-violation", err->first); + if (!args.m_bypass_limits) { + if (const auto err{SingleTRUCChecks(ws.m_ptx, ws.m_ancestors, ws.m_conflicts, ws.m_vsize)}) { + // Single transaction contexts only. + if (args.m_allow_sibling_eviction && err->second != nullptr) { + // We should only be considering where replacement is considered valid as well. + Assume(args.m_allow_replacement); + + // Potential sibling eviction. Add the sibling to our list of mempool conflicts to be + // included in RBF checks. + ws.m_conflicts.insert(err->second->GetHash()); + // Adding the sibling to m_iters_conflicting here means that it doesn't count towards + // RBF Carve Out above. This is correct, since removing to-be-replaced transactions from + // the descendant count is done separately in SingleTRUCChecks for TRUC transactions. + ws.m_iters_conflicting.insert(m_pool.GetIter(err->second->GetHash()).value()); + ws.m_sibling_eviction = true; + // The sibling will be treated as part of the to-be-replaced set in ReplacementChecks. + // Note that we are not checking whether it opts in to replaceability via BIP125 or TRUC + // (which is normally done in PreChecks). However, the only way a TRUC transaction can + // have a non-TRUC and non-BIP125 descendant is due to a reorg. + } else { + return state.Invalid(TxValidationResult::TX_MEMPOOL_POLICY, "TRUC-violation", err->first); + } } } @@ -1471,13 +1497,8 @@ bool MemPoolAccept::PolicyScriptChecks(const ATMPArgs& args, Workspace& ws) // Check input scripts and signatures. // This is done last to help prevent CPU exhaustion denial-of-service attacks. if (!CheckInputScripts(tx, state, m_view, scriptVerifyFlags, true, false, ws.m_precomputed_txdata, GetValidationCache())) { - // SCRIPT_VERIFY_CLEANSTACK requires SCRIPT_VERIFY_WITNESS, so we - // need to turn both off, and compare against just turning off CLEANSTACK - // to see if the failure is specifically due to witness validation. - TxValidationState state_dummy; // Want reported failures to be from first CheckInputScripts - if (!tx.HasWitness() && CheckInputScripts(tx, state_dummy, m_view, scriptVerifyFlags & ~(SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_CLEANSTACK), true, false, ws.m_precomputed_txdata, GetValidationCache()) && - !CheckInputScripts(tx, state_dummy, m_view, scriptVerifyFlags & ~SCRIPT_VERIFY_CLEANSTACK, true, false, ws.m_precomputed_txdata, GetValidationCache())) { - // Only the witness is missing, so the transaction itself may be fine. + // Detect a failure due to a missing witness so that p2p code can handle rejection caching appropriately. + if (!tx.HasWitness() && SpendsNonAnchorWitnessProg(tx, m_view)) { state.Invalid(TxValidationResult::TX_WITNESS_STRIPPED, state.GetRejectReason(), state.GetDebugMessage()); } @@ -2466,35 +2487,16 @@ bool CheckInputScripts(const CTransaction& tx, TxValidationState& state, CCheck* check = new CScriptCheck(txdata.m_spent_outputs[i], tx, validation_cache.m_signature_cache, i, flags, cacheSigStore, &txdata); if (pvChecks) { pvChecks->emplace_back(std::move(check)); - } else if (auto result = (*check)(); result.has_value()) { - if (flags & STANDARD_NOT_MANDATORY_VERIFY_FLAGS) { - // Check whether the failure was caused by a - // non-mandatory script verification check, such as - // non-standard DER encodings or non-null dummy - // arguments; if so, ensure we return NOT_STANDARD - // instead of CONSENSUS to avoid downstream users - // splitting the network between upgraded and - // non-upgraded nodes by banning CONSENSUS-failing - // data providers. - CScriptCheck check2(txdata.m_spent_outputs[i], tx, validation_cache.m_signature_cache, i, - flags & ~STANDARD_NOT_MANDATORY_VERIFY_FLAGS, cacheSigStore, &txdata); - auto mandatory_result = check2(); - if (!mandatory_result.has_value()) { - return state.Invalid(TxValidationResult::TX_NOT_STANDARD, strprintf("non-mandatory-script-verify-flag (%s)", ScriptErrorString(result->first)), result->second); + } else { + auto result = (*check)(); + delete check; // ELEMENTS: synchronous path owns `check`; queued path (above) transfers ownership instead. + if (result.has_value()) { + if (flags & STANDARD_NOT_MANDATORY_VERIFY_FLAGS) { + return state.Invalid(TxValidationResult::TX_NOT_STANDARD, strprintf("mempool-script-verify-flag-failed (%s)", ScriptErrorString(result->first)), result->second); } else { - // If the second check failed, it failed due to a mandatory script verification - // flag, but the first check might have failed on a non-mandatory script - // verification flag. - // - // Avoid reporting a mandatory script check failure with a non-mandatory error - // string by reporting the error from the second check. - result = mandatory_result; + return state.Invalid(TxValidationResult::TX_CONSENSUS, strprintf("mandatory-script-verify-flag-failed (%s)", ScriptErrorString(result->first)), result->second); } } - - // MANDATORY flag failures correspond to - return state.Invalid(TxValidationResult::TX_CONSENSUS, strprintf("mandatory-script-verify-flag-failed (%s)", ScriptErrorString(result->first)), result->second); - } } @@ -2976,8 +2978,9 @@ bool Chainstate::ConnectBlock(const CBlock& block, BlockValidationState& state, // in multiple threads). Preallocate the vector size so a new allocation // doesn't invalidate pointers into the vector, and keep txsdata in scope // for as long as `control`. - CCheckQueueControl control(fScriptChecks && parallel_script_checks ? &m_chainman.GetCheckQueue() : nullptr); std::vector txsdata; + CCheckQueueControl control(fScriptChecks && parallel_script_checks ? &m_chainman.GetCheckQueue() : nullptr); + txsdata.reserve(block.vtx.size()); for (unsigned int i = 0; i < block.vtx.size(); i++){ txsdata.emplace_back(m_chainman.GetParams().HashGenesisBlock()); } @@ -3095,7 +3098,7 @@ bool Chainstate::ConnectBlock(const CBlock& block, BlockValidationState& state, Ticks(m_chainman.time_connect), Ticks(m_chainman.time_connect) / m_chainman.num_blocks_total); - // todo: + // todo: // CAmountMap block_reward = fee_map; // block_reward[consensusParams.subsidy_asset] += GetBlockSubsidy(pindex->nHeight, consensusParams); // if (!MoneyRange(block_reward)) { @@ -3105,7 +3108,7 @@ bool Chainstate::ConnectBlock(const CBlock& block, BlockValidationState& state, // if (!VerifyCoinbaseAmount(*(block.vtx[0]), block_reward)) { // LogPrintf("ERROR: ConnectBlock(): coinbase pays too much\n"); // return state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, "bad-cb-amount"); - + CAmountMap block_reward = fee_map; block_reward[consensusParams.subsidy_asset] += GetBlockSubsidy(pindex->nHeight, consensusParams); if (!MoneyRange(block_reward) && state.IsValid()) { @@ -3391,9 +3394,20 @@ bool Chainstate::FlushStateToDisk( (bool)fFlushForPrune); } } - if (full_flush_completed && m_chainman.m_options.signals) { - // Update best block in wallet (so we can detect restored wallets). - m_chainman.m_options.signals->ChainStateFlushed(this->GetRole(), m_chain.GetLocator()); + + if (full_flush_completed) { + if (m_chainman.m_options.signals) { + // Update best block in wallet (so we can detect restored wallets). + m_chainman.m_options.signals->ChainStateFlushed(this->GetRole(), m_chain.GetLocator()); + } + + if (!m_chainman.m_interrupt && ShouldCompactChainstate(m_chainman.IsInitialBlockDownload())) { + try { + CoinsDB().CompactFull(); + } catch (const std::exception& e) { + LogWarning("Failed to start chainstate compaction (%s)", e.what()); + } + } } } catch (const std::runtime_error& e) { return FatalError(m_chainman.GetNotifications(), state, strprintf(_("System error while flushing: %s"), e.what())); @@ -3428,15 +3442,17 @@ static void UpdateTipLog( { AssertLockHeld(::cs_main); - LogPrintf("%s%s: new best=%s height=%d version=0x%08x log2_work=%f tx=%lu date='%s' progress=%f cache=%.1fMiB(%utxo)%s\n", - prefix, func_name, - tip->GetBlockHash().ToString(), tip->nHeight, tip->nVersion, - log(tip->nChainWork.getdouble()) / log(2.0), tip->m_chain_tx_count, - FormatISO8601DateTime(tip->GetBlockTime()), - chainman.GuessVerificationProgress(tip), - coins_tip.DynamicMemoryUsage() * (1.0 / (1 << 20)), - coins_tip.GetCacheSize(), - !warning_messages.empty() ? strprintf(" warning='%s'", warning_messages) : ""); + + // Disable rate limiting in LogPrintLevel_ so this source location may log during IBD. + LogPrintLevel_(BCLog::LogFlags::ALL, BCLog::Level::Info, /*should_ratelimit=*/false, "%s%s: new best=%s height=%d version=0x%08x log2_work=%f tx=%lu date='%s' progress=%f cache=%.1fMiB(%utxo)%s\n", + prefix, func_name, + tip->GetBlockHash().ToString(), tip->nHeight, tip->nVersion, + log(tip->nChainWork.getdouble()) / log(2.0), tip->m_chain_tx_count, + FormatISO8601DateTime(tip->GetBlockTime()), + chainman.GuessVerificationProgress(tip), + coins_tip.DynamicMemoryUsage() * (1.0 / (1 << 20)), + coins_tip.GetCacheSize(), + !warning_messages.empty() ? strprintf(" warning='%s'", warning_messages) : ""); } void ForceUntrimHeader(const CBlockIndex *pindex_) EXCLUSIVE_LOCKS_REQUIRED(::cs_main) @@ -4832,7 +4848,7 @@ static bool ContextualCheckBlockHeader(const CBlockHeader& block, BlockValidatio LogPrintf("ERROR: %s: block height in header is incorrect (got %d, expected %d)\n", __func__, block.block_height, nHeight); return state.Invalid(BlockValidationResult::BLOCK_INVALID_HEADER, "bad-header-height"); } - + // Testnet4 and regtest only: Check timestamp against prev for difficulty-adjustment // blocks to prevent timewarp attacks (see https://github.com/bitcoin/bitcoin/pull/15482). if (consensusParams.enforce_BIP94) { @@ -6255,7 +6271,14 @@ double GuessVerificationProgress(const CBlockIndex* pindex, int64_t blockInterva int64_t nNow = GetTime(); int64_t moreBlocksExpected = (nNow - pindex->GetBlockTime()) / blockInterval; - double progress = (pindex->nHeight + 0.0) / (pindex->nHeight + moreBlocksExpected); + int64_t totalBlocksExpected = pindex->nHeight + moreBlocksExpected; + if (totalBlocksExpected <= 0) { + // The block's timestamp is far enough ahead of nNow (relative to + // blockInterval) that the naive extrapolation is degenerate; + // treat this the same as "caught up". + return 1.0; + } + double progress = (pindex->nHeight + 0.0) / totalBlocksExpected; // Round to 3 digits to avoid 0.999999 when finished. progress = ceil(progress * 1000.0) / 1000.0; // Avoid higher than one if last block is newer than current time. diff --git a/src/validation.h b/src/validation.h index 8e2b274e09e..b62d800699d 100644 --- a/src/validation.h +++ b/src/validation.h @@ -15,7 +15,6 @@ #include #include #include -#include #include #include #include // IWYU pragma: export diff --git a/src/wallet/CMakeLists.txt b/src/wallet/CMakeLists.txt index 2989aa5d413..9f18d878f52 100644 --- a/src/wallet/CMakeLists.txt +++ b/src/wallet/CMakeLists.txt @@ -51,8 +51,7 @@ if(USE_SQLITE) target_sources(bitcoin_wallet PRIVATE sqlite.cpp) target_link_libraries(bitcoin_wallet PRIVATE - $ - $ + SQLite3::SQLite3 ) endif() if(USE_BDB) diff --git a/src/wallet/bdb.cpp b/src/wallet/bdb.cpp index 79851dff33f..f5a18266edb 100644 --- a/src/wallet/bdb.cpp +++ b/src/wallet/bdb.cpp @@ -16,6 +16,7 @@ #include #include +#include #include #include @@ -340,6 +341,53 @@ bool BerkeleyDatabase::Verify(bilingual_str& errorStr) return true; } +std::vector BerkeleyDatabase::Files() +{ + std::vector files; + // If the wallet is the *only* file, clean up the entire BDB environment + constexpr auto build_files_list = [](std::vector& files, const std::shared_ptr& env, const fs::path& filename) { + if (env->m_databases.size() != 1) return false; + + const auto env_dir = env->Directory(); + const auto db_subdir = env_dir / "database"; + if (fs::exists(db_subdir)) { + if (!fs::is_directory(db_subdir)) return false; + for (const auto& entry : fs::directory_iterator(db_subdir)) { + const auto& path = entry.path().filename(); + if (!fs::PathToString(path).starts_with("log.")) { + return false; + } + files.emplace_back(entry.path()); + } + } + const std::set allowed_paths = { + filename, + "db.log", + ".walletlock", + "database" + }; + for (const auto& entry : fs::directory_iterator(env_dir)) { + const auto& path = entry.path().filename(); + if (allowed_paths.contains(path)) { + files.emplace_back(entry.path()); + } else if (fs::is_directory(entry.path())) { + // Subdirectories can't possibly be using this db env, and is expected if this is a non-directory wallet + // Do not include them in Files, but still allow the env cleanup + } else { + return false; + } + } + return true; + }; + try { + if (build_files_list(files, env, m_filename)) return files; + } catch (...) { + // Give up building the comprehensive file list if any error occurs + } + // Otherwise, it's only really safe to delete the one wallet file + return {env->Directory() / m_filename}; +} + void BerkeleyEnvironment::CheckpointLSN(const std::string& strFile) { dbenv->txn_checkpoint(0, 0, 0); diff --git a/src/wallet/bdb.h b/src/wallet/bdb.h index f3fe8a19c19..a7cf953ed21 100644 --- a/src/wallet/bdb.h +++ b/src/wallet/bdb.h @@ -132,6 +132,8 @@ class BerkeleyDatabase : public WalletDatabase /** Return path to main database filename */ std::string Filename() override { return fs::PathToString(env->Directory() / m_filename); } + std::vector Files() override; + std::string Format() override { return "bdb"; } /** * Pointer to shared database environment. diff --git a/src/wallet/coinselection.cpp b/src/wallet/coinselection.cpp index 2dd1cd8542d..1172216dc4f 100644 --- a/src/wallet/coinselection.cpp +++ b/src/wallet/coinselection.cpp @@ -701,15 +701,15 @@ util::Result SelectCoinsSRD(const std::vector& utx /** Find a subset of the OutputGroups that is at least as large as, but as close as possible to, the * target amount; solve subset sum. - * param@[in] groups OutputGroups to choose from, sorted by value in descending order. - * param@[in] nTotalLower Total (effective) value of the UTXOs in groups. - * param@[in] nTargetValue Subset sum target, not including change. - * param@[out] vfBest Boolean vector representing the subset chosen that is closest to + * @param[in] groups OutputGroups to choose from, sorted by value in descending order. + * @param[in] nTotalLower Total (effective) value of the UTXOs in groups. + * @param[in] nTargetValue Subset sum target, not including change. + * @param[out] vfBest Boolean vector representing the subset chosen that is closest to * nTargetValue, with indices corresponding to groups. If the ith * entry is true, that means the ith group in groups was selected. - * param@[out] nBest Total amount of subset chosen that is closest to nTargetValue. - * paramp[in] max_selection_weight The maximum allowed weight for a selection result to be valid. - * param@[in] iterations Maximum number of tries. + * @param[out] nBest Total amount of subset chosen that is closest to nTargetValue. + * @param[in] max_selection_weight The maximum allowed weight for a selection result to be valid. + * @param[in] iterations Maximum number of tries. */ static void ApproximateBestSubset(FastRandomContext& insecure_rand, const std::vector& groups, const CAmount& nTotalLower, const CAmount& nTargetValue, @@ -788,7 +788,7 @@ util::Result KnapsackSolver(std::vector& groups, c for (const OutputGroup& g : groups) { bool add = true; for (const std::shared_ptr& c : g.m_outputs) { - auto input_set = result.GetInputSet(); + const auto& input_set = result.GetInputSet(); if (input_set.find(c) != input_set.end()) { add = false; break; @@ -811,7 +811,7 @@ util::Result KnapsackSolver(std::vector& groups, c } if (auto inner_result = KnapsackSolver(inner_groups, it->second, change_target, rng, max_selection_weight, it->first)) { - auto set = inner_result->GetInputSet(); + const auto& set = inner_result->GetInputSet(); for (const std::shared_ptr& ic : set) { non_policy_effective_value += ic->GetEffectiveValue(); } @@ -837,7 +837,7 @@ util::Result KnapsackSolver(std::vector& groups, c for (const OutputGroup& g : groups) { bool add = true; for (const std::shared_ptr& c : g.m_outputs) { - auto set = result.GetInputSet(); + const auto& set = result.GetInputSet(); if (set.find(c) != set.end()) { add = false; break; diff --git a/src/wallet/db.h b/src/wallet/db.h index e8790006a4d..5f13ca29ff9 100644 --- a/src/wallet/db.h +++ b/src/wallet/db.h @@ -170,6 +170,9 @@ class WalletDatabase /** Return path to main database file for logs and error messages. */ virtual std::string Filename() = 0; + /** Return paths to all database created files */ + virtual std::vector Files() = 0; + virtual std::string Format() = 0; std::atomic nUpdateCounter; diff --git a/src/wallet/dump.cpp b/src/wallet/dump.cpp index db2756e0ca8..20aa5d453ed 100644 --- a/src/wallet/dump.cpp +++ b/src/wallet/dump.cpp @@ -288,11 +288,17 @@ bool CreateFromDump(const ArgsManager& args, const std::string& name, const fs:: dump_file.close(); } + // On failure, gather the paths to remove + std::vector paths_to_remove = wallet->GetDatabase().Files(); + if (!name.empty()) paths_to_remove.push_back(wallet_path); + wallet.reset(); // The pointer deleter will close the wallet for us. // Remove the wallet dir if we have a failure if (!ret) { - fs::remove_all(wallet_path); + for (const auto& p : paths_to_remove) { + fs::remove(p); + } } return ret; diff --git a/src/wallet/migrate.h b/src/wallet/migrate.h index 16eadeb019d..82359f9d4bb 100644 --- a/src/wallet/migrate.h +++ b/src/wallet/migrate.h @@ -65,6 +65,7 @@ class BerkeleyRODatabase : public WalletDatabase /** Return path to main database file for logs and error messages. */ std::string Filename() override { return fs::PathToString(m_filepath); } + std::vector Files() override { return {m_filepath}; } std::string Format() override { return "bdb_ro"; } diff --git a/src/wallet/rpc/backup.cpp b/src/wallet/rpc/backup.cpp index cd2930390ce..38a5b4fb314 100644 --- a/src/wallet/rpc/backup.cpp +++ b/src/wallet/rpc/backup.cpp @@ -1831,7 +1831,7 @@ RPCHelpMan listdescriptors() { return RPCHelpMan{ "listdescriptors", - "\nList descriptors imported into a descriptor-enabled wallet.\n", + "\nList all descriptors present in a descriptor-enabled wallet.\n", { {"private", RPCArg::Type::BOOL, RPCArg::Default{false}, "Show private descriptors."} }, @@ -2037,7 +2037,7 @@ RPCHelpMan restorewallet() RPCHelpMan getwalletpakinfo() { return RPCHelpMan{"getwalletpakinfo", - "\nReturns relevant pegout authorization key (PAK) information about this wallet. Throws an error if initpegoutwallet` has not been invoked on this wallet.\n", + "\nReturns relevant pegout authorization key (PAK) information about this wallet. Throws an error if `initpegoutwallet` has not been invoked on this wallet.\n", {}, RPCResult{ RPCResult::Type::OBJ, "", "", @@ -2132,7 +2132,7 @@ RPCHelpMan importblindingkey() "\nImports a private blinding key in hex for a CT address.", { {"address", RPCArg::Type::STR, RPCArg::Optional::NO, "The CT address"}, - {"hexkey", RPCArg::Type::STR, RPCArg::Optional::NO, "The blinding key in hex"}, + {"hexkey", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "The 32-byte blinding key in hex"}, }, RPCResult{RPCResult::Type::NONE, "", ""}, RPCExamples{ @@ -2225,7 +2225,7 @@ RPCHelpMan importmasterblindingkey() RPCHelpMan importissuanceblindingkey() { return RPCHelpMan{"importissuanceblindingkey", - "\nImports a private blinding key in hex for an asset issuance.", + "\nImports a private blinding key in hex for an asset issuance. Unlike `importblindingkey`, the key is stored without verifying it matches the issuance blinding pubkey.\n", { {"txid", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "The transaction id of the issuance"}, {"vin", RPCArg::Type::NUM, RPCArg::Optional::NO, "The input number of the issuance in the transaction."}, @@ -2233,7 +2233,7 @@ RPCHelpMan importissuanceblindingkey() }, RPCResult{RPCResult::Type::NONE, "", ""}, RPCExamples{ - HelpExampleCli("importblindingkey", "\"my blinded CT address\" ") + HelpExampleCli("importissuanceblindingkey", "\"\" 0 \"\"") }, [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue { diff --git a/src/wallet/rpc/coins.cpp b/src/wallet/rpc/coins.cpp index fd3bddc22ae..2b004eb59e4 100644 --- a/src/wallet/rpc/coins.cpp +++ b/src/wallet/rpc/coins.cpp @@ -120,7 +120,7 @@ RPCHelpMan getreceivedbyaddress() "\nThe amount with at least 6 confirmations\n" + HelpExampleCli("getreceivedbyaddress", "\"" + EXAMPLE_ADDRESS[0] + "\" 6") + "\nThe amount with at least 6 confirmations including immature coinbase outputs\n" - + HelpExampleCli("getreceivedbyaddress", "\"" + EXAMPLE_ADDRESS[0] + "\" 6 true") + + + HelpExampleCli("getreceivedbyaddress", "\"" + EXAMPLE_ADDRESS[0] + "\" 6 \"\" true") + "\nAs a JSON-RPC call\n" + HelpExampleRpc("getreceivedbyaddress", "\"" + EXAMPLE_ADDRESS[0] + "\", 6") }, @@ -178,9 +178,9 @@ RPCHelpMan getreceivedbylabel() "\nThe amount with at least 6 confirmations\n" + HelpExampleCli("getreceivedbylabel", "\"tabby\" 6") + "\nThe amount with at least 6 confirmations including immature coinbase outputs\n" - + HelpExampleCli("getreceivedbylabel", "\"tabby\" 6 true") + + + HelpExampleCli("getreceivedbylabel", "\"tabby\" 6 \"\" true") + "\nAs a JSON-RPC call\n" - + HelpExampleRpc("getreceivedbylabel", "\"tabby\", 6, true") + + HelpExampleRpc("getreceivedbylabel", "\"tabby\", 6, \"\", true") }, [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue { @@ -640,14 +640,14 @@ RPCHelpMan listunspent() {RPCResult::Type::STR, "scriptPubKey", "the output script"}, {RPCResult::Type::STR_AMOUNT, "amount", "the transaction output amount in " + CURRENCY_UNIT}, {RPCResult::Type::STR_HEX, "amountcommitment", /*optional=*/true, "the transaction output commitment in hex"}, - {RPCResult::Type::STR_HEX, "asset", "the transaction output asset in hex"}, + {RPCResult::Type::STR_HEX, "asset", /*optional=*/true, "the transaction output asset in hex"}, {RPCResult::Type::STR_HEX, "assetcommitment", /*optional=*/true, "the transaction output asset commitment in hex"}, - {RPCResult::Type::STR_HEX, "amountblinder", "the transaction output amount blinding factor in hex"}, - {RPCResult::Type::STR_HEX, "assetblinder", "the transaction output asset blinding factor in hex"}, + {RPCResult::Type::STR_HEX, "amountblinder", /*optional=*/true, "the transaction output amount blinding factor in hex"}, + {RPCResult::Type::STR_HEX, "assetblinder", /*optional=*/true, "the transaction output asset blinding factor in hex"}, {RPCResult::Type::NUM, "confirmations", "The number of confirmations"}, {RPCResult::Type::NUM, "ancestorcount", /*optional=*/true, "The number of in-mempool ancestor transactions, including this one (if transaction is in the mempool)"}, {RPCResult::Type::NUM, "ancestorsize", /*optional=*/true, "The virtual transaction size of in-mempool ancestors, including this one (if transaction is in the mempool)"}, - {RPCResult::Type::STR_AMOUNT, "ancestorfees", /*optional=*/true, "The total fees of in-mempool ancestors (including this one) with fee deltas used for mining priority in " + CURRENCY_ATOM + " (if transaction is in the mempool)"}, + {RPCResult::Type::NUM, "ancestorfees", /*optional=*/true, "The total fees of in-mempool ancestors (including this one) with fee deltas used for mining priority in " + CURRENCY_ATOM + " (if transaction is in the mempool)"}, {RPCResult::Type::STR_HEX, "redeemScript", /*optional=*/true, "The redeem script if the output script is P2SH"}, {RPCResult::Type::STR, "witnessScript", /*optional=*/true, "witness script if the output script is P2WSH or P2SH-P2WSH"}, {RPCResult::Type::BOOL, "spendable", "Whether we have the private keys to spend this output"}, diff --git a/src/wallet/rpc/elements.cpp b/src/wallet/rpc/elements.cpp index b455c33459a..3ae240081a8 100644 --- a/src/wallet/rpc/elements.cpp +++ b/src/wallet/rpc/elements.cpp @@ -156,7 +156,7 @@ RPCHelpMan getpeginaddress() RPCResult::Type::OBJ, "", "", { {RPCResult::Type::STR, "mainchain_address", "mainchain deposit address to send bitcoin to"}, - {RPCResult::Type::STR_HEX, "claim_script", "claim script committed to by the mainchain address. This may be required in `claimpegin` to retrieve pegged-in funds\n"}, + {RPCResult::Type::STR_HEX, "claim_script", "Full script hex committed to by the mainchain address. This may be required in `claimpegin` to retrieve pegged-in funds\n"}, {RPCResult::Type::STR_AMOUNT, "pegin_min_amount", /*optional=*/true, "Minimum peg-in amount in " + CURRENCY_UNIT}, {RPCResult::Type::NUM, "pegin_min_height", /*optional=*/true, "Minimum block height for peg-in amount rule"}, {RPCResult::Type::BOOL, "pegin_min_active", /*optional=*/true, "Whether the peg-in minimum height rule is active at the current tip"}, @@ -281,7 +281,7 @@ bool DerivePubTweak(const std::vector& vPath, const CPubKey& keyMaster RPCHelpMan initpegoutwallet() { return RPCHelpMan{"initpegoutwallet", - "\nThis call is for Liquid network initialization on the Liquid wallet. The wallet generates a new Liquid pegout authorization key (PAK) and stores it in the Liquid wallet. It then combines this with the `bitcoin_descriptor` to finally create a PAK entry for the network. This allows the user to send Liquid coins directly to a secure offline Bitcoin wallet at the derived path from the bitcoin_descriptor using the `sendtomainchain` command. Losing the Liquid PAK or offline Bitcoin root key will result in the inability to pegout funds, so immediate backup upon initialization is required.\n" + + "\nThis call is for Liquid network initialization on the Liquid wallet. The wallet generates a new Liquid pegout authorization key (PAK) unless `liquid_pak` is provided, and stores it in the Liquid wallet. It then combines this with the `bitcoin_descriptor` to finally create a PAK entry for the network. This allows the user to send Liquid coins directly to a secure offline Bitcoin wallet at the derived path from the bitcoin_descriptor using the `sendtomainchain` command. Losing the Liquid PAK or offline Bitcoin root key will result in the inability to pegout funds, so immediate backup upon initialization is required. Requires a legacy wallet.\n" + wallet::HELP_REQUIRING_PASSPHRASE, { {"bitcoin_descriptor", RPCArg::Type::STR, RPCArg::Optional::NO, "The Bitcoin descriptor that includes a single extended pubkey. Must be one of the following: pkh(), sh(wpkh()), or wpkh(). This is used as the destination chain for the Bitcoin destination wallet. The derivation path from the xpub is given by the descriptor, typically `0/k`, reflecting the external chain of the wallet. DEPRECATED: If a plain xpub is given, pkh() is assumed, with the `0/k` derivation from that xpub. See link for more details on script descriptors: https://github.com/bitcoin/bitcoin/blob/master/doc/descriptors.md"}, @@ -325,7 +325,7 @@ RPCHelpMan initpegoutwallet() // Generate a new key that is added to wallet or set from argument CPubKey online_pubkey; - if (request.params.size() < 3) { + if (request.params[2].isNull()) { std::string error; if (!pwallet->GetOnlinePakKey(online_pubkey, error)) { throw JSONRPCError(RPC_WALLET_KEYPOOL_RAN_OUT, error); @@ -342,7 +342,7 @@ RPCHelpMan initpegoutwallet() // Parse offline counter int counter = 0; - if (request.params.size() > 1) { + if (!request.params[1].isNull()) { counter = request.params[1].getInt(); if (counter < 0 || counter > 1000000000) { throw JSONRPCError(RPC_INVALID_PARAMETER, "bip32_counter must be between 0 and 1,000,000,000, inclusive."); @@ -456,7 +456,7 @@ RPCHelpMan initpegoutwallet() RPCHelpMan sendtomainchain_base() { return RPCHelpMan{"sendtomainchain", - "\nSends sidechain funds to the given mainchain address, through the federated peg-in mechanism\n" + "\nSends sidechain funds to the given mainchain address, through the federated peg-out (withdraw) mechanism\n" + wallet::HELP_REQUIRING_PASSPHRASE, { {"address", RPCArg::Type::STR, RPCArg::Optional::NO, "The destination address on Bitcoin mainchain"}, @@ -472,7 +472,7 @@ RPCHelpMan sendtomainchain_base() RPCResult::Type::OBJ, "", "", { {RPCResult::Type::STR_HEX, "txid", "The transaction id."}, - {RPCResult::Type::STR, "fee reason", /*optional=*/true, "The transaction fee reason."} + {RPCResult::Type::STR, "fee_reason", /*optional=*/true, "The transaction fee reason."} }, }, }, @@ -499,7 +499,7 @@ RPCHelpMan sendtomainchain_base() throw JSONRPCError(RPC_TYPE_ERROR, "Invalid amount for send"); bool subtract_fee = false; - if (request.params.size() > 2) { + if (!request.params[2].isNull()) { subtract_fee = request.params[2].get_bool(); } @@ -520,7 +520,7 @@ RPCHelpMan sendtomainchain_base() EnsureWalletIsUnlocked(*pwallet); - bool verbose = request.params[3].isNull() ? false: request.params[3].get_bool(); + bool verbose = request.params[3].isNull() ? false : request.params[3].get_bool(); mapValue_t mapValue; CCoinControl no_coin_control; // This is a deprecated API return SendMoney(*pwallet, no_coin_control, recipients, std::move(mapValue), verbose, true /* ignore_blind_fail */); @@ -571,11 +571,11 @@ bool ParseKeyPath(const std::vector>& split, KeyPath& out) RPCHelpMan sendtomainchain_pak() { return RPCHelpMan{"sendtomainchain", - "\nSends Liquid funds to the Bitcoin mainchain, through the federated withdraw mechanism. The wallet internally generates the returned `bitcoin_address` via `bitcoin_descriptor` and `bip32_counter` previously set in `initpegoutwallet`. The counter will be incremented upon successful send, avoiding address re-use.\n" + "\nSends Liquid funds to the Bitcoin mainchain, through the federated withdraw mechanism. The wallet internally generates the returned `bitcoin_address` via `bitcoin_descriptor` and `bip32_counter` previously set in `initpegoutwallet`. The counter will be incremented upon successful send, avoiding address re-use. Requires a legacy wallet. Minimum peg-out amount is 0.00100000 BTC.\n" + wallet::HELP_REQUIRING_PASSPHRASE, { {"address", RPCArg::Type::STR, RPCArg::Optional::NO, "Must be \"\". Only for non-PAK `sendtomainchain` compatibility."}, - {"amount", RPCArg::Type::AMOUNT, RPCArg::Optional::NO, "The amount being sent to `bitcoin_address`."}, + {"amount", RPCArg::Type::AMOUNT, RPCArg::Optional::NO, "The amount being sent to `bitcoin_address` (minimum 0.00100000 BTC)."}, {"subtractfeefromamount", RPCArg::Type::BOOL, RPCArg::Default{false}, "The fee will be deducted from the amount being pegged-out."}, {"verbose", RPCArg::Type::BOOL, RPCArg::Default{false}, "If true, return extra information about the transaction."}, }, @@ -584,8 +584,8 @@ RPCHelpMan sendtomainchain_pak() { {RPCResult::Type::STR, "bitcoin_address", "destination address on Bitcoin mainchain"}, {RPCResult::Type::STR_HEX, "txid", "transaction ID of the resulting Liquid transaction"}, - {RPCResult::Type::STR, "fee reason", /*optional=*/true, "If verbose is set to true, the Liquid transaction fee reason"}, - {RPCResult::Type::STR, "bitcoin_descriptor", "xpubkey of the child destination address"}, + {RPCResult::Type::STR, "fee_reason", /*optional=*/true, "If verbose is set to true, the Liquid transaction fee reason"}, + {RPCResult::Type::STR, "bitcoin_descriptor", "Bitcoin descriptor string used for peg-out destination derivation"}, {RPCResult::Type::STR, "bip32_counter", "derivation counter for the `bitcoin_descriptor`"}, }, }, @@ -612,7 +612,7 @@ RPCHelpMan sendtomainchain_pak() throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid amount for send, must send more than 0.00100000 BTC"); bool subtract_fee = false; - if (request.params.size() > 2) { + if (!request.params[2].isNull()) { subtract_fee = request.params[2].get_bool(); } @@ -825,7 +825,7 @@ static UniValue createrawpegin(const JSONRPCRequest& request, T_tx_ref& txBTCRef std::vector txOutProofData = ParseHex(request.params[1].get_str()); std::set claim_scripts; - if (request.params.size() > 2) { + if (!request.params[2].isNull()) { const std::string claim_script = request.params[2].get_str(); if (!IsHex(claim_script)) { throw JSONRPCError(RPC_INVALID_PARAMETER, "Given claim_script is not hex."); @@ -994,13 +994,13 @@ RPCHelpMan createrawpegin() { {"bitcoin_tx", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "The raw bitcoin transaction (in hex) depositing bitcoin to the mainchain_address generated by getpeginaddress"}, {"txoutproof", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "A rawtxoutproof (in hex) generated by the mainchain daemon's `gettxoutproof` containing a proof of only bitcoin_tx"}, - {"claim_script", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "The witness program generated by getpeginaddress. Only needed if not in wallet."}, - {"fee_rate", RPCArg::Type::AMOUNT, RPCArg::Optional::OMITTED, "The fee rate of the Bitcoin transaction in sats/vb, only necessary when validatepegin=0."}, + {"claim_script", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "The full script hex from getpeginaddress. If omitted, every script in the wallet address book is tried as a candidate claim script."}, + {"fee_rate", RPCArg::Type::AMOUNT, RPCArg::Optional::OMITTED, "The fee rate of the Bitcoin transaction in sats/vb. Required when validatepegin=0, including when a peg-in subsidy requires it."}, }, RPCResult{ RPCResult::Type::OBJ, "", "", { - {RPCResult::Type::STR, "hex", "raw transaction data"}, + {RPCResult::Type::STR_HEX, "hex", "raw transaction data"}, {RPCResult::Type::BOOL, "mature", /*optional=*/true, "Whether the peg-in is mature (only included when validating peg-ins)"}, }, }, @@ -1039,13 +1039,13 @@ RPCHelpMan claimpegin() { return RPCHelpMan{"claimpegin", "\nClaim coins from the main chain by creating a peg-in transaction with the necessary metadata after the corresponding Bitcoin transaction.\n" - "Note that the transaction will not be relayed unless it is buried at least 102 blocks deep.\n" + "Note that the transaction will not be relayed until it is buried at least `pegin_min_depth + 2` blocks deep (chain-dependent).\n" "If a transaction is not relayed it may require manual addition to a functionary mempool in order for it to be mined.\n", { {"bitcoin_tx", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "The raw bitcoin transaction (in hex) depositing bitcoin to the mainchain_address generated by getpeginaddress"}, {"txoutproof", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "A rawtxoutproof (in hex) generated by the mainchain daemon's `gettxoutproof` containing a proof of only bitcoin_tx"}, - {"claim_script", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "The witness program generated by getpeginaddress. Only needed if not in wallet."}, - {"fee_rate", RPCArg::Type::AMOUNT, RPCArg::Optional::OMITTED, "The fee rate of the Bitcoin transaction in sats/vb, only necessary when validatepegin=0."}, + {"claim_script", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "The full script hex from getpeginaddress. If omitted, every script in the wallet address book is tried as a candidate claim script."}, + {"fee_rate", RPCArg::Type::AMOUNT, RPCArg::Optional::OMITTED, "The fee rate of the Bitcoin transaction in sats/vb. Required when validatepegin=0, including when a peg-in subsidy requires it."}, }, RPCResult{ RPCResult::Type::STR_HEX, "txid", "txid of the resulting sidechain transaction", @@ -1270,12 +1270,12 @@ RPCHelpMan blindrawtransaction() } bool ignore_blind_fail = true; - if (request.params.size() > 1) { + if (!request.params[1].isNull()) { ignore_blind_fail = request.params[1].get_bool(); } std::vector > auxiliary_generators; - if (request.params.size() > 2) { + if (!request.params[2].isNull()) { UniValue assetCommitments = request.params[2].get_array(); if (assetCommitments.size() != 0 && assetCommitments.size() < tx.vin.size()) { throw JSONRPCError(RPC_INVALID_PARAMETER, "Asset commitment array must have at least as many entries as transaction inputs."); @@ -1503,7 +1503,7 @@ static CTransactionRef SendGenerationTransaction(const CScript& asset_script, co RPCHelpMan issueasset() { return RPCHelpMan{"issueasset", - "\nCreate an asset. Must have funds in wallet to do so. Returns asset hex id.\n" + "\nCreate an asset. Must have funds in wallet to do so. Returns issuance details including txid, vin, entropy, asset, and token.\n" "For more fine-grained control such as multiple issuances, see `rawissueasset` RPC call.\n", { {"assetamount", RPCArg::Type::AMOUNT, RPCArg::Optional::NO, "Amount of asset to generate. Note that the amount is BTC-like, with 8 decimal places."}, @@ -1543,11 +1543,11 @@ RPCHelpMan issueasset() throw JSONRPCError(RPC_TYPE_ERROR, "Issuance must have one non-zero component"); } - bool blind_issuances = request.params.size() < 3 || request.params[2].get_bool(); + bool blind_issuances = request.params[2].isNull() || request.params[2].get_bool(); // Check for optional contract to hash into definition uint256 contract_hash; - if (request.params.size() >= 4) { + if (!request.params[3].isNull()) { contract_hash = ParseHashV(request.params[3], "contract_hash"); } @@ -1715,7 +1715,7 @@ RPCHelpMan listissuances() {RPCResult::Type::STR_HEX, "entropy", "Entropy of the asset type"}, {RPCResult::Type::STR_HEX, "asset", "Asset type for issuance if known"}, {RPCResult::Type::STR, "assetlabel", /*optional=*/true, "Asset label for issuance if set"}, - {RPCResult::Type::STR_HEX, "token", /*optional=*/true, "Token type for issuancen"}, + {RPCResult::Type::STR_HEX, "token", /*optional=*/true, "Token type for issuance"}, {RPCResult::Type::NUM, "vin", "The input position of the issuance in the transaction"}, {RPCResult::Type::STR_AMOUNT, "assetamount", "The amount of asset issued. Is -1 if blinded and unknown to wallet"}, {RPCResult::Type::STR_AMOUNT, "tokenamount", /*optional=*/true, "The reissuance token amount issued. Is -1 if blinded and unknown to wallet"}, @@ -1739,7 +1739,7 @@ RPCHelpMan listissuances() std::string assetstr; CAsset asset_filter; - if (request.params.size() > 0) { + if (!request.params[0].isNull()) { assetstr = request.params[0].get_str(); asset_filter = GetAssetFromString(assetstr); } @@ -1806,13 +1806,13 @@ RPCHelpMan destroyamount() }, { RPCResult{"if verbose is not set or set to false", - RPCResult::Type::STR_HEX, "transactionid", "the transaction id", + RPCResult::Type::STR_HEX, "txid", "the transaction id", }, RPCResult{"if verbose is set to true", RPCResult::Type::OBJ, "", "", { - {RPCResult::Type::STR_HEX, "transactionid", "the transaction id"}, - {RPCResult::Type::STR, "fee reason", "The transaction fee reason."}, + {RPCResult::Type::STR_HEX, "txid", "the transaction id"}, + {RPCResult::Type::STR, "fee_reason", "The transaction fee reason."}, }, }, }, @@ -1962,7 +1962,7 @@ RPCHelpMan getpegoutkeys() "\n(DEPRECATED) Please see `initpegoutwallet` and `sendtomainchain` for best-supported and easiest workflow. This call is for the Liquid network participants' `offline` wallet ONLY. Returns `sumkeys` corresponding to the sum of the Offline PAK and the imported Bitcoin key. The wallet must have the Offline private PAK to succeed. The output will be used in `generatepegoutproof` and `sendtomainchain`. Care is required to keep the bitcoin private key, as well as the `sumkey` safe, as a leak of both results in the leak of your `offlinekey`. Therefore it is recommended to create Bitcoin keys and do Bitcoin transaction signing directly on an offline wallet co-located with your offline Liquid wallet.\n", { {"btcprivkey", RPCArg::Type::STR, RPCArg::Optional::NO, "Base58 Bitcoin private key that will be combined with the offline privkey"}, - {"offlinepubkey", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "Hex pubkey of key to combine with btcprivkey. Primarily intended for integration testing."}, + {"offlinepubkey", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "33-byte compressed public key encoded as 66 hex characters, to combine with btcprivkey. Primarily intended for integration testing."}, }, RPCResult{ RPCResult::Type::OBJ, "", "", @@ -1973,10 +1973,8 @@ RPCHelpMan getpegoutkeys() }, }, RPCExamples{ - HelpExampleCli("getpegoutkeys", "") - + HelpExampleCli("getpegoutkeys", "\"5Kb8kLf9zgWQnogidDA76MzPL6TsZZY36hWXMssSzNydYXYB9KF\" \"0389275d512326f7016e014d8625f709c01f23bd0dc16522bf9845a9ee1ef6cbf9\"") - + HelpExampleRpc("getpegoutkeys", "") - + HelpExampleRpc("getpegoutkeys", "\"5Kb8kLf9zgWQnogidDA76MzPL6TsZZY36hWXMssSzNydYXYB9KF\", \"0389275d512326f7016e014d8625f709c01f23bd0dc16522bf9845a9ee1ef6cbf9\"") + HelpExampleCli("getpegoutkeys", "\"5Kb8kLf9zgWQnogidDA76MzPL6TsZZY36hWXMssSzNydYXYB9KF\" \"0389275d512326f7016e014d8625f709c01f23bd0dc16522bf9845a9ee1ef6cbf9\"") + + HelpExampleRpc("getpegoutkeys", "\"5Kb8kLf9zgWQnogidDA76MzPL6TsZZY36hWXMssSzNydYXYB9KF\", \"0389275d512326f7016e014d8625f709c01f23bd0dc16522bf9845a9ee1ef6cbf9\"") }, [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue { diff --git a/src/wallet/rpc/spend.cpp b/src/wallet/rpc/spend.cpp index edfbc4338b9..84798b213fc 100644 --- a/src/wallet/rpc/spend.cpp +++ b/src/wallet/rpc/spend.cpp @@ -268,7 +268,7 @@ RPCHelpMan sendtoaddress() {"avoid_reuse", RPCArg::Type::BOOL, RPCArg::Default{true}, "(only available if avoid_reuse wallet flag is set) Avoid spending from dirty addresses; addresses are considered\n" "dirty if they have previously been used in a transaction. If true, this also activates avoidpartialspends, grouping outputs by their addresses."}, {"assetlabel", RPCArg::Type::STR, RPCArg::Optional::OMITTED, "Hex asset id or asset label for balance."}, - {"ignoreblindfail", RPCArg::Type::BOOL, RPCArg::Default{true}, "Return a transaction even when a blinding attempt fails due to number of blinded inputs/outputs."}, + {"ignoreblindfail", RPCArg::Type::BOOL, RPCArg::Default{true}, "If true, continue when output blinding fails (e.g. due to too many blinded inputs/outputs) instead of failing the RPC."}, {"fee_rate", RPCArg::Type::AMOUNT, RPCArg::DefaultHint{"not set, fall back to wallet fee estimation"}, "Specify a fee rate in " + CURRENCY_ATOM + "/vB."}, {"verbose", RPCArg::Type::BOOL, RPCArg::Default{false}, "If true, return extra information about the transaction."}, }, @@ -396,7 +396,7 @@ RPCHelpMan sendmany() {"address", RPCArg::Type::STR, RPCArg::Optional::NO, "A key-value pair where the key is the address used and the value is an asset label or hex asset ID."}, }, }, - {"ignoreblindfail", RPCArg::Type::BOOL, RPCArg::Default{true}, "Return a transaction even when a blinding attempt fails due to number of blinded inputs/outputs."}, + {"ignoreblindfail", RPCArg::Type::BOOL, RPCArg::Default{true}, "If true, continue when output blinding fails (e.g. due to too many blinded inputs/outputs) instead of failing the RPC."}, {"fee_rate", RPCArg::Type::AMOUNT, RPCArg::DefaultHint{"not set, fall back to wallet fee estimation"}, "Specify a fee rate in " + CURRENCY_ATOM + "/vB."}, {"verbose", RPCArg::Type::BOOL, RPCArg::Default{false}, "If true, return extra information about the transaction."}, }, @@ -854,7 +854,10 @@ RPCHelpMan fundrawtransaction() "Note that all inputs selected must be of standard form and P2SH scripts must be\n" "in the wallet using importaddress or addmultisigaddress (to calculate fees).\n" "You can see whether this is the case by checking the \"solvable\" field in the listunspent output.\n" - "Only pay-to-pubkey, multisig, and P2SH versions thereof are currently supported for watch-only\n", + "Only pay-to-pubkey, multisig, and P2SH versions thereof are currently supported for watch-only.\n" + "Note that if specifying an exact fee rate, the resulting transaction may have a higher fee rate\n" + "if the transaction has unconfirmed inputs. This is because the wallet will attempt to make the\n" + "entire package have the given fee rate, not the resulting transaction.\n", { {"hexstring", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "The hex string of the raw transaction"}, {"options", RPCArg::Type::OBJ_NAMED_PARAMS, RPCArg::Optional::OMITTED, "For backward compatibility: passing in a true instead of an object will result in {\"includeWatching\":true}", @@ -1001,7 +1004,7 @@ RPCHelpMan signrawtransactionwithwallet() {"redeemScript", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "(required for P2SH) redeem script"}, {"witnessScript", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "(required for P2WSH or P2SH-P2WSH) witness script"}, {"amount", RPCArg::Type::AMOUNT, RPCArg::Optional::OMITTED, "The amount spent (required if non-confidential segwit output)"}, - {"amountcommitment", RPCArg::Type::STR, RPCArg::Optional::OMITTED, "The amount commitment spent (required if confidential segwit output)"}, + {"amountcommitment", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "The amount commitment spent (required if confidential segwit output)"}, }, }, }, @@ -1028,7 +1031,7 @@ RPCHelpMan signrawtransactionwithwallet() {RPCResult::Type::NUM, "vout", "The index of the output to spent and used as input"}, {RPCResult::Type::ARR, "witness", "", { - {RPCResult::Type::STR_HEX, "witness", ""}, + {RPCResult::Type::STR_HEX, "", "hex-encoded witness stack item"}, }}, {RPCResult::Type::STR_HEX, "scriptSig", "The hex-encoded signature script"}, {RPCResult::Type::NUM, "sequence", "Script sequence number"}, @@ -1285,7 +1288,7 @@ static RPCHelpMan bumpfee_helper(std::string method_name) } else { PartiallySignedTransaction psbtx(mtx, 2 /* version */); bool complete = false; - const auto err{pwallet->FillPSBT(psbtx, complete, SIGHASH_DEFAULT, /*sign=*/false, /*bip32derivs=*/true)}; + const auto err{pwallet->FillPSBT(psbtx, complete, SIGHASH_DEFAULT, /*sign=*/false, /*bip32derivs=*/true, /*imbalance_ok=*/true)}; CHECK_NONFATAL(!err); CHECK_NONFATAL(!complete); DataStream ssTx{}; @@ -1348,6 +1351,14 @@ RPCHelpMan send() {"txid", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "The transaction id"}, {"vout", RPCArg::Type::NUM, RPCArg::Optional::NO, "The output number"}, {"sequence", RPCArg::Type::NUM, RPCArg::DefaultHint{"depends on the value of the 'replaceable' and 'locktime' arguments"}, "The sequence number"}, + {"pegin_bitcoin_tx", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "(only for pegin inputs) The raw bitcoin transaction (in hex) depositing bitcoin to the mainchain_address generated by getpeginaddress"}, + {"pegin_txout_proof", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "(only for pegin inputs) A rawtxoutproof (in hex) generated by the mainchain daemon's `gettxoutproof` containing a proof of only bitcoin_tx"}, + {"pegin_claim_script", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "(only for pegin inputs) The claim script generated by getpeginaddress."}, + {"issuance_amount", RPCArg::Type::NUM, RPCArg::Optional::OMITTED, "The amount to be issued on this input"}, + {"issuance_tokens", RPCArg::Type::NUM, RPCArg::Optional::OMITTED, "The number of reissuance tokens to generate on this input"}, + {"asset_entropy", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "Additional entropy for new issuance, or original asset entropy for reissuance"}, + {"asset_blinding_nonce", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, "For reissuance only, the blinding nonce of the reissuance token being spent"}, + {"blind_reissuance", RPCArg::Type::BOOL, RPCArg::Default{true}, "Whether reissuance tokens should be blinded"}, {"weight", RPCArg::Type::NUM, RPCArg::DefaultHint{"Calculated from wallet and solving data"}, "The maximum weight for this input, " "including the weight of the outpoint and sequence number. " "Note that signature sizes are not guaranteed to be consistent, " @@ -1392,7 +1403,7 @@ RPCHelpMan send() "Send 0.3 BTC with a fee rate of 25 " + CURRENCY_ATOM + "/vB using named arguments\n" + HelpExampleCli("-named send", "outputs='{\"" + EXAMPLE_ADDRESS[0] + "\": 0.3}' fee_rate=25\n") + "Create a transaction that should confirm the next block, with a specific input, and return result without adding to wallet or broadcasting to the network\n" - + HelpExampleCli("send", "'{\"" + EXAMPLE_ADDRESS[0] + "\": 0.1}' 1 economical '{\"add_to_wallet\": false, \"inputs\": [{\"txid\":\"a08e6907dbbd3d809776dbfc5d82e371b764ed838b5655e72f463568df1aadf0\", \"vout\":1}]}'") + + HelpExampleCli("send", "'{\"" + EXAMPLE_ADDRESS[0] + "\": 0.1}' 1 economical null '{\"add_to_wallet\": false, \"inputs\": [{\"txid\":\"a08e6907dbbd3d809776dbfc5d82e371b764ed838b5655e72f463568df1aadf0\", \"vout\":1}]}'") }, [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue { @@ -1445,6 +1456,7 @@ RPCHelpMan sendall() {"", RPCArg::Type::OBJ_USER_KEYS, RPCArg::Optional::OMITTED, "", { {"address", RPCArg::Type::AMOUNT, RPCArg::Optional::NO, "A key-value pair. The key (string) is the bitcoin address, the value (float or string) is the amount in " + CURRENCY_UNIT + ""}, + {"asset", RPCArg::Type::STR, RPCArg::Optional::OMITTED, "The asset label or hex id for this output if it is not the main chain asset"}, }, }, }, @@ -1619,6 +1631,9 @@ RPCHelpMan sendall() // estimate final size of tx const TxSize tx_size{CalculateMaximumSignedTxSize(CTransaction(rawTx), pwallet.get())}; + if (tx_size.vsize == -1) { + throw JSONRPCError(RPC_WALLET_ERROR, "Unable to determine the size of the transaction, the wallet contains unsolvable descriptors"); + } const CAmount fee_from_size{fee_rate.GetFee(tx_size.vsize)}; const std::optional total_bump_fees{pwallet->chain().calculateCombinedBumpFee(outpoints_spent, fee_rate)}; CAmount effective_value = total_input_value - fee_from_size - total_bump_fees.value_or(0); @@ -1702,7 +1717,7 @@ RPCHelpMan walletprocesspsbt() HELP_REQUIRING_PASSPHRASE, { {"psbt", RPCArg::Type::STR, RPCArg::Optional::NO, "The transaction base64 string"}, - {"sign", RPCArg::Type::BOOL, RPCArg::Default{true}, "Also sign the transaction when updating (requires wallet to be unlocked)"}, + {"sign", RPCArg::Type::BOOL, RPCArg::Default{true}, "Also sign the transaction when updating (requires wallet to be unlocked). Signing is only performed once the PSBT is fully blinded."}, {"sighashtype", RPCArg::Type::STR, RPCArg::Default{"DEFAULT for Taproot, ALL otherwise"}, "The signature hash type to sign with if not specified by the PSBT. Must be one of\n" " \"DEFAULT\"\n" " \"ALL\"\n" @@ -1908,7 +1923,7 @@ RPCHelpMan walletcreatefundedpsbt() FundTxDoc()), RPCArgOptions{.oneline_description="options"}}, {"bip32derivs", RPCArg::Type::BOOL, RPCArg::Default{true}, "Include BIP 32 derivation paths for public keys if we know them"}, - {"psbt_version", RPCArg::Type::NUM, RPCArg::Default{2}, "The PSBT version number to use."}, + {"psbt_version", RPCArg::Type::NUM, RPCArg::Default{2}, "The PSBT version number to use. Must be 2."}, }, RPCResult{ RPCResult::Type::OBJ, "", "", diff --git a/src/wallet/rpc/transactions.cpp b/src/wallet/rpc/transactions.cpp index 16d9be9e223..e460052b444 100644 --- a/src/wallet/rpc/transactions.cpp +++ b/src/wallet/rpc/transactions.cpp @@ -509,7 +509,7 @@ RPCHelpMan listtransactions() {RPCResult::Type::STR_HEX, "assetblinder", /*optional=*/true, "The asset blinder"}, {RPCResult::Type::STR, "label", /*optional=*/true, "A comment for the address/transaction, if any"}, {RPCResult::Type::NUM, "vout", "the vout value"}, - {RPCResult::Type::STR_AMOUNT, "fee", /*optional=*/true, "The amount of the fee in " + CURRENCY_UNIT + ". This is negative and only available for the\n" + {RPCResult::Type::STR_AMOUNT, "fee", "The amount of the fee in " + CURRENCY_UNIT + ". This is negative and only available for the\n" "'send' category of transactions."}, }, TransactionDescriptionString()), @@ -621,20 +621,17 @@ RPCHelpMan listsinceblock() "\"orphan\" Orphaned coinbase transactions received."}, {RPCResult::Type::STR_AMOUNT, "amount", "The amount in " + CURRENCY_UNIT + ". This is negative for the 'send' category, and is positive\n" "for all other categories"}, - {RPCResult::Type::STR_HEX, "amountblinder", "The amount blinding factor in hex"}, - {RPCResult::Type::STR_HEX, "asset", "The asset id in hex"}, - {RPCResult::Type::STR_HEX, "assetblinder", "The asset blinding factor in hex"}, + {RPCResult::Type::STR_HEX, "amountblinder", /*optional=*/true, "The amount blinding factor in hex"}, + {RPCResult::Type::STR_HEX, "asset", /*optional=*/true, "The asset id in hex"}, + {RPCResult::Type::STR_HEX, "assetblinder", /*optional=*/true, "The asset blinding factor in hex"}, + {RPCResult::Type::STR, "label", /*optional=*/true, "A comment for the address/transaction, if any"}, {RPCResult::Type::NUM, "vout", "the vout value"}, - {RPCResult::Type::STR_HEX, "amountblinder", /*optional=*/true, "The amount blinder"}, - {RPCResult::Type::STR_HEX, "asset", /*optional=*/true, "The asset type"}, - {RPCResult::Type::STR_HEX, "assetblinder", /*optional=*/true, "The asset blinder"}, - {RPCResult::Type::STR_AMOUNT, "fee", /*optional=*/true, "The amount of the fee in " + CURRENCY_UNIT + ". This is negative and only available for the\n" - "'send' category of transactions."}, + {RPCResult::Type::STR_AMOUNT, "fee", "The amount of the fee in " + CURRENCY_UNIT + ". This is negative and only available for the\n" + "'send' category of transactions."}, }, TransactionDescriptionString()), { {RPCResult::Type::BOOL, "abandoned", "'true' if the transaction has been abandoned (inputs are respendable)."}, - {RPCResult::Type::STR, "label", /*optional=*/true, "A comment for the address/transaction, if any"}, })}, }}, {RPCResult::Type::ARR, "removed", /*optional=*/true, "\n" diff --git a/src/wallet/rpc/wallet.cpp b/src/wallet/rpc/wallet.cpp index b51c7e19fcc..bc37a3790a3 100644 --- a/src/wallet/rpc/wallet.cpp +++ b/src/wallet/rpc/wallet.cpp @@ -52,16 +52,13 @@ static RPCHelpMan getwalletinfo() {RPCResult::Type::NUM, "walletversion", "the wallet version"}, {RPCResult::Type::STR, "format", "the database format (bdb or sqlite)"}, {RPCResult::Type::OBJ, "balance", "DEPRECATED. Identical to getbalances().mine.trusted", { - // A different entry for each asset in the wallet - {RPCResult::Type::STR_AMOUNT, "bitcoin", "amount of bitcoin in the wallet"}, + {RPCResult::Type::ELISION, "", "the amount for each asset"}, }, /*skip_type_check=*/true}, {RPCResult::Type::OBJ, "unconfirmed_balance", "DEPRECATED. Identical to getbalances().mine.untrusted_pending", { - // A different entry for each asset in the wallet - {RPCResult::Type::STR_AMOUNT, "bitcoin", "amount of bitcoin in the wallet"}, + {RPCResult::Type::ELISION, "", "the amount for each asset"}, }, /*skip_type_check=*/true}, {RPCResult::Type::OBJ, "immature_balance", "DEPRECATED. Identical to getbalances().mine.immature", { - // A different entry for each asset in the wallet - {RPCResult::Type::STR_AMOUNT, "bitcoin", "amount of bitcoin in the wallet"}, + {RPCResult::Type::ELISION, "", "the amount for each asset"}, }, /*skip_type_check=*/true}, {RPCResult::Type::NUM, "txcount", "the total number of transactions in the wallet"}, {RPCResult::Type::NUM_TIME, "keypoololdest", /*optional=*/true, "the " + UNIX_EPOCH_TIME + " of the oldest pre-generated key in the key pool. Legacy wallets only."}, @@ -416,7 +413,7 @@ static RPCHelpMan createwallet() throw JSONRPCError(RPC_WALLET_ERROR, "Compiled without sqlite support (required for descriptor wallets)"); #endif flags |= WALLET_FLAG_DESCRIPTORS; - } + } /* ELEMENTS: Remove the IsDeprecatedRPCEnabled("create_bdb") check so descriptors=false always works without a runtime flag else { if (!context.chain->rpcEnableDeprecated("create_bdb")) { diff --git a/src/wallet/salvage.cpp b/src/wallet/salvage.cpp index 90b477d5744..9ec0622df99 100644 --- a/src/wallet/salvage.cpp +++ b/src/wallet/salvage.cpp @@ -63,6 +63,7 @@ class DummyDatabase : public WalletDatabase void IncrementUpdateCounter() override { ++nUpdateCounter; } void ReloadDbEnv() override {} std::string Filename() override { return "dummy"; } + std::vector Files() override { return {}; } std::string Format() override { return "dummy"; } std::unique_ptr MakeBatch(bool flush_on_close = true) override { return std::make_unique(); } }; diff --git a/src/wallet/spend.cpp b/src/wallet/spend.cpp index 2a4d45e5ccb..445b1bd43ba 100644 --- a/src/wallet/spend.cpp +++ b/src/wallet/spend.cpp @@ -96,7 +96,7 @@ int CalculateMaximumSignedInputSize(const CTxOut& txout, const COutPoint outpoin if (!provider) return -1; if (const auto desc = InferDescriptor(txout.scriptPubKey, *provider)) { - if (const auto weight = MaxInputWeight(*desc, {}, coin_control, true, can_grind_r)) { + if (const auto weight = MaxInputWeight(*desc, CTxIn{outpoint}, coin_control, true, can_grind_r)) { return static_cast(GetVirtualTransactionSize(*weight, 0, 0)); } } @@ -1734,6 +1734,7 @@ static util::Result CreateTransactionInternal( use_anti_fee_sniping = false; } txNew.vin.emplace_back(coin->outpoint, CScript{}, sequence.value_or(default_sequence)); + txNew.witness.vtxinwit.emplace_back(); // ELEMENTS: keep vtxinwit in lockstep with vin auto scripts = coin_control.GetScripts(coin->outpoint); if (scripts.first) { @@ -1746,7 +1747,6 @@ static util::Result CreateTransactionInternal( auto pegin_witness = coin_control.GetPeginWitness(coin->outpoint); if (pegin_witness) { txNew.vin.back().m_is_pegin = true; - txNew.witness.vtxinwit.emplace_back(); txNew.witness.vtxinwit.back().m_pegin_witness = *pegin_witness; } if (issuance_details && coin->asset == issuance_details->reissuance_token) { diff --git a/src/wallet/spend.h b/src/wallet/spend.h index 7eb8c37de52..08035dfcf10 100644 --- a/src/wallet/spend.h +++ b/src/wallet/spend.h @@ -130,14 +130,14 @@ FilteredOutputGroups GroupOutputs(const CWallet& wallet, * the solution (according to the waste metric) will be chosen. If a valid input cannot be found from any * single OutputType, fallback to running `ChooseSelectionResult()` over all available coins. * - * param@[in] chain The chain interface to get information on unconfirmed UTXOs bump fees - * param@[in] nTargetValue The target value - * param@[in] groups The grouped outputs mapped by coin eligibility filters - * param@[in] coin_selection_params Parameters for the coin selection - * param@[in] allow_mixed_output_types Relax restriction that SelectionResults must be of the same OutputType + * @param[in] chain The chain interface to get information on bump fees for unconfirmed UTXOs + * @param[in] mapTargetValue The target value + * @param[in] groups The grouped outputs mapped by coin eligibility filters + * @param[in] coin_selection_params Parameters for the coin selection + * @param[in] allow_mixed_output_types Relax restriction that SelectionResults must be of the same OutputType * returns If successful, a SelectionResult containing the input set * If failed, returns (1) an empty error message if the target was not reached (general "Insufficient funds") - * or (2) an specific error message if there was something particularly wrong (e.g. a selection + * or (2) a specific error message if there was something particularly wrong (e.g. a selection * result that surpassed the tx max weight size). */ util::Result AttemptSelection(interfaces::Chain& chain, const CAmountMap& mapTargetValue, OutputGroupTypeMap& groups, @@ -148,13 +148,13 @@ util::Result AttemptSelection(interfaces::Chain& chain, const C * Multiple coin selection algorithms will be run and the input set that produces the least waste * (according to the waste metric) will be chosen. * - * param@[in] chain The chain interface to get information on unconfirmed UTXOs bump fees - * param@[in] nTargetValue The target value - * param@[in] groups The struct containing the outputs grouped by script and divided by (1) positive only outputs and (2) all outputs (positive + negative). - * param@[in] coin_selection_params Parameters for the coin selection + * @param[in] chain The chain interface to get information on bump fees for unconfirmed UTXOs + * @param[in] mapTargetValue The target value + * @param[in] groups The struct containing the outputs grouped by script and divided by (1) positive only outputs and (2) all outputs (positive + negative). + * @param[in] coin_selection_params Parameters for the coin selection * returns If successful, a SelectionResult containing the input set * If failed, returns (1) an empty error message if the target was not reached (general "Insufficient funds") - * or (2) an specific error message if there was something particularly wrong (e.g. a selection + * or (2) a specific error message if there was something particularly wrong (e.g. a selection * result that surpassed the tx max weight size). */ util::Result ChooseSelectionResult(interfaces::Chain& chain, const CAmountMap& mapTargetValue, Groups& groups, const CoinSelectionParams& coin_selection_params); @@ -188,11 +188,11 @@ util::Result FetchSelectedInputs(const CWallet& wallet, const const CoinSelectionParams& coin_selection_params) EXCLUSIVE_LOCKS_REQUIRED(wallet.cs_wallet); /** - * Select a set of coins such that nTargetValue is met; never select unconfirmed coins if they are not ours - * param@[in] wallet The wallet which provides data necessary to spend the selected coins - * param@[in] available_coins The struct of coins, organized by OutputType, available for selection prior to filtering - * param@[in] nTargetValue The target value - * param@[in] coin_selection_params Parameters for this coin selection such as feerates, whether to avoid partial spends, + * Select a set of coins such that mapTargetValue is met; never select unconfirmed coins if they are not ours + * @param[in] wallet The wallet which provides data necessary to spend the selected coins + * @param[in] available_coins The struct of coins, organized by OutputType, available for selection prior to filtering + * @param[in] mapTargetValue The target value + * @param[in] coin_selection_params Parameters for this coin selection such as feerates, whether to avoid partial spends, * and whether to subtract the fee from the outputs. * returns If successful, a SelectionResult containing the selected coins * If failed, returns (1) an empty error message if the target was not reached (general "Insufficient funds") @@ -204,7 +204,7 @@ util::Result AutomaticCoinSelection(const CWallet& wallet, Coin /** * Select all coins from coin_control, and if coin_control 'm_allow_other_inputs=true', call 'AutomaticCoinSelection' to - * select a set of coins such that nTargetValue - pre_set_inputs.total_amount is met. + * select a set of coins such that mapTargetValue - pre_set_inputs.total_amount is met. */ util::Result SelectCoins(const CWallet& wallet, CoinsResult& available_coins, const PreSelectedInputs& pre_set_inputs, const CAmountMap& mapTargetValue, const CCoinControl& coin_control, diff --git a/src/wallet/sqlite.cpp b/src/wallet/sqlite.cpp index a8c9f8a8ab6..896a2fc0f33 100644 --- a/src/wallet/sqlite.cpp +++ b/src/wallet/sqlite.cpp @@ -112,12 +112,12 @@ Mutex SQLiteDatabase::g_sqlite_mutex; int SQLiteDatabase::g_sqlite_count = 0; SQLiteDatabase::SQLiteDatabase(const fs::path& dir_path, const fs::path& file_path, const DatabaseOptions& options, bool mock) - : WalletDatabase(), m_mock(mock), m_dir_path(fs::PathToString(dir_path)), m_file_path(fs::PathToString(file_path)), m_write_semaphore(1), m_use_unsafe_sync(options.use_unsafe_sync) + : WalletDatabase(), m_mock(mock), m_dir_path(dir_path), m_file_path(fs::PathToString(file_path)), m_write_semaphore(1), m_use_unsafe_sync(options.use_unsafe_sync) { { LOCK(g_sqlite_mutex); LogPrintf("Using SQLite Version %s\n", SQLiteDatabaseVersion()); - LogPrintf("Using wallet %s\n", m_dir_path); + LogPrintf("Using wallet %s\n", fs::PathToString(m_dir_path)); if (++g_sqlite_count == 1) { // Setup logging @@ -253,7 +253,7 @@ void SQLiteDatabase::Open() if (m_db == nullptr) { if (!m_mock) { - TryCreateDirectories(fs::PathFromString(m_dir_path)); + TryCreateDirectories(m_dir_path); } int ret = sqlite3_open_v2(m_file_path.c_str(), &m_db, flags, nullptr); if (ret != SQLITE_OK) { diff --git a/src/wallet/sqlite.h b/src/wallet/sqlite.h index 78a3accf890..c78cd29afc2 100644 --- a/src/wallet/sqlite.h +++ b/src/wallet/sqlite.h @@ -105,7 +105,7 @@ class SQLiteDatabase : public WalletDatabase private: const bool m_mock{false}; - const std::string m_dir_path; + const fs::path m_dir_path; const std::string m_file_path; @@ -166,6 +166,14 @@ class SQLiteDatabase : public WalletDatabase void IncrementUpdateCounter() override { ++nUpdateCounter; } std::string Filename() override { return m_file_path; } + /** Return paths to all database created files */ + std::vector Files() override + { + std::vector files; + files.emplace_back(m_dir_path / fs::PathFromString(m_file_path)); + files.emplace_back(m_dir_path / fs::PathFromString(m_file_path + "-journal")); + return files; + } std::string Format() override { return "sqlite"; } /** Make a SQLiteBatch connected to this database */ diff --git a/src/wallet/test/fuzz/crypter.cpp b/src/wallet/test/fuzz/crypter.cpp index 7869f5f39c8..733a5cd32f0 100644 --- a/src/wallet/test/fuzz/crypter.cpp +++ b/src/wallet/test/fuzz/crypter.cpp @@ -11,11 +11,9 @@ namespace wallet { namespace { -const TestingSetup* g_setup; void initialize_crypter() { static const auto testing_setup = MakeNoLogFileContext(); - g_setup = testing_setup.get(); } FUZZ_TARGET(crypter, .init = initialize_crypter) diff --git a/src/wallet/test/spend_tests.cpp b/src/wallet/test/spend_tests.cpp index 6637edcb0d0..639370f67b7 100644 --- a/src/wallet/test/spend_tests.cpp +++ b/src/wallet/test/spend_tests.cpp @@ -3,6 +3,7 @@ // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include +#include #include #include