diff --git a/.github/actions/generate-version/action.yml b/.github/actions/generate-version/action.yml new file mode 100644 index 0000000000..6b84aac2f3 --- /dev/null +++ b/.github/actions/generate-version/action.yml @@ -0,0 +1,44 @@ +name: Generate build version number +description: "Generate build version number." + +outputs: + version: + description: "The generated build version number." + value: ${{ steps.version.outputs.version }} + +runs: + using: composite + steps: + # When a tag is pushed, the version is used as-is. + - name: Generate version for tag event + if: ${{ github.event_name == 'tag' }} + shell: bash + env: + VERSION: ${{ github.ref_name }} + run: echo "VERSION=${VERSION}" >> "${GITHUB_ENV}" + + # When a tag is not pushed, then the version (e.g. 1.2.3-b0) is extracted + # from the BuildInfo.cpp file and the shortened commit hash appended to it. + # We use a plus sign instead of a hyphen because Conan recipe versions do + # not support two hyphens. + - name: Generate version for non-tag event + if: ${{ github.event_name != 'tag' }} + shell: bash + run: | + echo 'Extracting version from BuildInfo.cpp.' + VERSION="$(cat src/libxrpl/protocol/BuildInfo.cpp | grep "versionString =" | awk -F '"' '{print $2}')" + if [[ -z "${VERSION}" ]]; then + echo 'Unable to extract version from BuildInfo.cpp.' + exit 1 + fi + + echo 'Appending shortened commit hash to version.' + SHA='${{ github.sha }}' + VERSION="${VERSION}+${SHA:0:7}" + + echo "VERSION=${VERSION}" >> "${GITHUB_ENV}" + + - name: Output version + id: version + shell: bash + run: echo "version=${VERSION}" >> "${GITHUB_OUTPUT}" diff --git a/.github/actions/setup-conan/action.yml b/.github/actions/setup-conan/action.yml index dedf53f109..9d834884d2 100644 --- a/.github/actions/setup-conan/action.yml +++ b/.github/actions/setup-conan/action.yml @@ -2,11 +2,11 @@ name: Setup Conan description: "Set up Conan configuration, profile, and remote." inputs: - conan_remote_name: + remote_name: description: "The name of the Conan remote to use." required: false default: xrplf - conan_remote_url: + remote_url: description: "The URL of the Conan endpoint to use." required: false default: https://conan.ripplex.io @@ -31,16 +31,16 @@ runs: conan config install conan/profiles/ -tf $(conan config home)/profiles/ echo 'Conan profile:' - conan profile show + conan profile show --profile ci - name: Set up Conan remote shell: bash env: - CONAN_REMOTE_NAME: ${{ inputs.conan_remote_name }} - CONAN_REMOTE_URL: ${{ inputs.conan_remote_url }} + REMOTE_NAME: ${{ inputs.remote_name }} + REMOTE_URL: ${{ inputs.remote_url }} run: | - echo "Adding Conan remote '${CONAN_REMOTE_NAME}' at '${CONAN_REMOTE_URL}'." - conan remote add --index 0 --force "${CONAN_REMOTE_NAME}" "${CONAN_REMOTE_URL}" + echo "Adding Conan remote '${REMOTE_NAME}' at '${REMOTE_URL}'." + conan remote add --index 0 --force "${REMOTE_NAME}" "${REMOTE_URL}" echo 'Listing Conan remotes.' conan remote list diff --git a/.github/workflows/on-pr.yml b/.github/workflows/on-pr.yml index dad211f94f..46f6b7500a 100644 --- a/.github/workflows/on-pr.yml +++ b/.github/workflows/on-pr.yml @@ -1,7 +1,8 @@ # This workflow runs all workflows to check, build and test the project on # various Linux flavors, as well as on MacOS and Windows, on every push to a # user branch. However, it will not run if the pull request is a draft unless it -# has the 'DraftRunCI' label. +# has the 'DraftRunCI' label. For commits to PRs that target a release branch, +# it also uploads the libxrpl recipe to the Conan remote. name: PR on: @@ -53,12 +54,12 @@ jobs: .github/scripts/rename/** .github/workflows/reusable-check-levelization.yml .github/workflows/reusable-check-rename.yml - .github/workflows/reusable-notify-clio.yml .github/workflows/on-pr.yml # Keep the paths below in sync with those in `on-trigger.yml`. .github/actions/build-deps/** .github/actions/build-test/** + .github/actions/generate-version/** .github/actions/setup-conan/** .github/scripts/strategy-matrix/** .github/workflows/reusable-build.yml @@ -66,6 +67,7 @@ jobs: .github/workflows/reusable-build-test.yml .github/workflows/reusable-strategy-matrix.yml .github/workflows/reusable-test.yml + .github/workflows/reusable-upload-recipe.yml .codecov.yml cmake/** conan/** @@ -121,22 +123,42 @@ jobs: secrets: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} - notify-clio: + upload-recipe: needs: - should-run - build-test - if: ${{ needs.should-run.outputs.go == 'true' && startsWith(github.ref, 'refs/heads/release') }} - uses: ./.github/workflows/reusable-notify-clio.yml + # Only run when committing to a PR that targets a release branch in the + # XRPLF repository. + if: ${{ github.repository_owner == 'XRPLF' && needs.should-run.outputs.go == 'true' && startsWith(github.ref, 'refs/heads/release') }} + uses: ./.github/workflows/reusable-upload-recipe.yml secrets: - clio_notify_token: ${{ secrets.CLIO_NOTIFY_TOKEN }} - conan_remote_username: ${{ secrets.CONAN_REMOTE_USERNAME }} - conan_remote_password: ${{ secrets.CONAN_REMOTE_PASSWORD }} + remote_username: ${{ secrets.CONAN_REMOTE_USERNAME }} + remote_password: ${{ secrets.CONAN_REMOTE_PASSWORD }} + + notify-clio: + needs: upload-recipe + runs-on: ubuntu-latest + steps: + # Notify the Clio repository about the newly proposed release version, so + # it can be checked for compatibility before the release is actually made. + - name: Notify Clio + env: + GH_TOKEN: ${{ secrets.CLIO_NOTIFY_TOKEN }} + PR_URL: ${{ github.event.pull_request.html_url }} + run: | + gh api --method POST -H "Accept: application/vnd.github+json" -H "X-GitHub-Api-Version: 2022-11-28" \ + /repos/xrplf/clio/dispatches -f "event_type=check_libxrpl" \ + -F "client_payload[ref]=${{ needs.upload-recipe.outputs.recipe_ref }}" \ + -F "client_payload[pr_url]=${PR_URL}" passed: if: failure() || cancelled() needs: - - build-test - check-levelization + - check-rename + - build-test + - upload-recipe + - notify-clio runs-on: ubuntu-latest steps: - name: Fail diff --git a/.github/workflows/on-tag.yml b/.github/workflows/on-tag.yml new file mode 100644 index 0000000000..c6361b4016 --- /dev/null +++ b/.github/workflows/on-tag.yml @@ -0,0 +1,25 @@ +# This workflow uploads the libxrpl recipe to the Conan remote when a versioned +# tag is pushed. +name: Tag + +on: + push: + tags: + - "v*" + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +defaults: + run: + shell: bash + +jobs: + upload-recipe: + # Only run when a tag is pushed to the XRPLF repository. + if: ${{ github.repository_owner == 'XRPLF' }} + uses: ./.github/workflows/reusable-upload-recipe.yml + secrets: + remote_username: ${{ secrets.CONAN_REMOTE_USERNAME }} + remote_password: ${{ secrets.CONAN_REMOTE_PASSWORD }} diff --git a/.github/workflows/on-trigger.yml b/.github/workflows/on-trigger.yml index ef7bf41fa2..210670f5a1 100644 --- a/.github/workflows/on-trigger.yml +++ b/.github/workflows/on-trigger.yml @@ -1,8 +1,7 @@ # This workflow runs all workflows to build and test the code on various Linux # flavors, as well as on MacOS and Windows, on a scheduled basis, on merge into -# the 'develop' or 'release*' branches, or when requested manually. Upon -# successful completion, it also uploads the built libxrpl package to the Conan -# remote. +# the 'develop' or 'release*' branches, or when requested manually. Upon pushes +# to the develop branch it also uploads the libxrpl recipe to the Conan remote. name: Trigger on: @@ -17,6 +16,7 @@ on: # Keep the paths below in sync with those in `on-pr.yml`. - ".github/actions/build-deps/**" - ".github/actions/build-test/**" + - ".github/actions/generate-version/**" - ".github/actions/setup-conan/**" - ".github/scripts/strategy-matrix/**" - ".github/workflows/reusable-build.yml" @@ -24,6 +24,7 @@ on: - ".github/workflows/reusable-build-test.yml" - ".github/workflows/reusable-strategy-matrix.yml" - ".github/workflows/reusable-test.yml" + - ".github/workflows/reusable-upload-recipe.yml" - ".codecov.yml" - "cmake/**" - "conan/**" @@ -76,3 +77,12 @@ jobs: strategy_matrix: ${{ github.event_name == 'schedule' && 'all' || 'minimal' }} secrets: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + + upload-recipe: + needs: build-test + # Only run when pushing to the develop branch in the XRPLF repository. + if: ${{ github.repository_owner == 'XRPLF' && github.event_name == 'push' && github.ref == 'refs/heads/develop' }} + uses: ./.github/workflows/reusable-upload-recipe.yml + secrets: + remote_username: ${{ secrets.CONAN_REMOTE_USERNAME }} + remote_password: ${{ secrets.CONAN_REMOTE_PASSWORD }} diff --git a/.github/workflows/reusable-build-test-config.yml b/.github/workflows/reusable-build-test-config.yml index b8c82aa94d..d298c85726 100644 --- a/.github/workflows/reusable-build-test-config.yml +++ b/.github/workflows/reusable-build-test-config.yml @@ -125,6 +125,8 @@ jobs: subtract: ${{ inputs.nproc_subtract }} - name: Setup Conan + env: + SANITIZERS: ${{ inputs.sanitizers }} uses: ./.github/actions/setup-conan - name: Build dependencies diff --git a/.github/workflows/reusable-notify-clio.yml b/.github/workflows/reusable-notify-clio.yml deleted file mode 100644 index 0941d5f2e3..0000000000 --- a/.github/workflows/reusable-notify-clio.yml +++ /dev/null @@ -1,91 +0,0 @@ -# This workflow exports the built libxrpl package to the Conan remote on a -# a channel named after the pull request, and notifies the Clio repository about -# the new version so it can check for compatibility. -name: Notify Clio - -# This workflow can only be triggered by other workflows. -on: - workflow_call: - inputs: - conan_remote_name: - description: "The name of the Conan remote to use." - required: false - type: string - default: xrplf - conan_remote_url: - description: "The URL of the Conan endpoint to use." - required: false - type: string - default: https://conan.ripplex.io - secrets: - clio_notify_token: - description: "The GitHub token to notify Clio about new versions." - required: true - conan_remote_username: - description: "The username for logging into the Conan remote." - required: true - conan_remote_password: - description: "The password for logging into the Conan remote." - required: true - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }}-clio - cancel-in-progress: true - -defaults: - run: - shell: bash - -jobs: - upload: - if: ${{ github.event.pull_request.head.repo.full_name == github.repository }} - runs-on: ubuntu-latest - container: ghcr.io/xrplf/ci/ubuntu-noble:gcc-13-sha-5dd7158 - steps: - - name: Checkout repository - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 - - name: Generate outputs - id: generate - env: - PR_NUMBER: ${{ github.event.pull_request.number }} - run: | - echo 'Generating user and channel.' - echo "user=clio" >> "${GITHUB_OUTPUT}" - echo "channel=pr_${PR_NUMBER}" >> "${GITHUB_OUTPUT}" - echo 'Extracting version.' - echo "version=$(cat src/libxrpl/protocol/BuildInfo.cpp | grep "versionString =" | awk -F '"' '{print $2}')" >> "${GITHUB_OUTPUT}" - - name: Calculate conan reference - id: conan_ref - run: | - echo "conan_ref=${{ steps.generate.outputs.version }}@${{ steps.generate.outputs.user }}/${{ steps.generate.outputs.channel }}" >> "${GITHUB_OUTPUT}" - - name: Set up Conan - uses: ./.github/actions/setup-conan - with: - conan_remote_name: ${{ inputs.conan_remote_name }} - conan_remote_url: ${{ inputs.conan_remote_url }} - - name: Log into Conan remote - env: - CONAN_REMOTE_NAME: ${{ inputs.conan_remote_name }} - run: conan remote login "${CONAN_REMOTE_NAME}" "${{ secrets.conan_remote_username }}" --password "${{ secrets.conan_remote_password }}" - - name: Upload package - env: - CONAN_REMOTE_NAME: ${{ inputs.conan_remote_name }} - run: | - conan export --user=${{ steps.generate.outputs.user }} --channel=${{ steps.generate.outputs.channel }} . - conan upload --confirm --check --remote="${CONAN_REMOTE_NAME}" xrpl/${{ steps.conan_ref.outputs.conan_ref }} - outputs: - conan_ref: ${{ steps.conan_ref.outputs.conan_ref }} - - notify: - needs: upload - runs-on: ubuntu-latest - steps: - - name: Notify Clio - env: - GH_TOKEN: ${{ secrets.clio_notify_token }} - PR_URL: ${{ github.event.pull_request.html_url }} - run: | - gh api --method POST -H "Accept: application/vnd.github+json" -H "X-GitHub-Api-Version: 2022-11-28" \ - /repos/xrplf/clio/dispatches -f "event_type=check_libxrpl" \ - -F "client_payload[conan_ref]=${{ needs.upload.outputs.conan_ref }}" \ - -F "client_payload[pr_url]=${PR_URL}" diff --git a/.github/workflows/reusable-upload-recipe.yml b/.github/workflows/reusable-upload-recipe.yml new file mode 100644 index 0000000000..156659392e --- /dev/null +++ b/.github/workflows/reusable-upload-recipe.yml @@ -0,0 +1,73 @@ +# This workflow exports the built libxrpl package to the Conan remote. +name: Upload Conan recipe + +# This workflow can only be triggered by other workflows. +on: + workflow_call: + inputs: + remote_name: + description: "The name of the Conan remote to use." + required: false + type: string + default: xrplf + remote_url: + description: "The URL of the Conan endpoint to use." + required: false + type: string + default: https://conan.ripplex.io + + secrets: + remote_username: + description: "The username for logging into the Conan remote." + required: true + remote_password: + description: "The password for logging into the Conan remote." + required: true + + outputs: + recipe_ref: + description: "The Conan recipe reference ('name/version') that was uploaded." + value: ${{ jobs.upload.outputs.ref }} + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }}-upload-recipe + cancel-in-progress: true + +defaults: + run: + shell: bash + +jobs: + upload: + runs-on: ubuntu-latest + container: ghcr.io/xrplf/ci/ubuntu-noble:gcc-13-sha-5dd7158 + steps: + - name: Checkout repository + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + + - name: Generate build version number + id: version + uses: ./.github/actions/generate-version + + - name: Set up Conan + uses: ./.github/actions/setup-conan + with: + remote_name: ${{ inputs.remote_name }} + remote_url: ${{ inputs.remote_url }} + + - name: Log into Conan remote + env: + REMOTE_NAME: ${{ inputs.remote_name }} + REMOTE_USERNAME: ${{ secrets.remote_username }} + REMOTE_PASSWORD: ${{ secrets.remote_password }} + run: conan remote login "${REMOTE_NAME}" "${REMOTE_USERNAME}" --password "${REMOTE_PASSWORD}" + + - name: Upload Conan recipe + env: + REMOTE_NAME: ${{ inputs.remote_name }} + run: | + conan export . --version=${{ steps.version.outputs.version }} + conan upload --confirm --check --remote="${REMOTE_NAME}" xrpl/${{ steps.version.outputs.version }} + + outputs: + ref: xrpl/${{ steps.version.outputs.version }} diff --git a/.github/workflows/upload-conan-deps.yml b/.github/workflows/upload-conan-deps.yml index 29ae95fce5..2dada1ef08 100644 --- a/.github/workflows/upload-conan-deps.yml +++ b/.github/workflows/upload-conan-deps.yml @@ -84,10 +84,12 @@ jobs: subtract: ${{ env.NPROC_SUBTRACT }} - name: Setup Conan + env: + SANITIZERS: ${{ matrix.sanitizers }} uses: ./.github/actions/setup-conan with: - conan_remote_name: ${{ env.CONAN_REMOTE_NAME }} - conan_remote_url: ${{ env.CONAN_REMOTE_URL }} + remote_name: ${{ env.CONAN_REMOTE_NAME }} + remote_url: ${{ env.CONAN_REMOTE_URL }} - name: Build dependencies uses: ./.github/actions/build-deps @@ -98,6 +100,7 @@ jobs: # Set the verbosity to "quiet" for Windows to avoid an excessive # amount of logs. For other OSes, the "verbose" logs are more useful. log_verbosity: ${{ runner.os == 'Windows' && 'quiet' || 'verbose' }} + sanitizers: ${{ matrix.sanitizers }} - name: Log into Conan remote if: ${{ github.repository_owner == 'XRPLF' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch') }} diff --git a/CMakeLists.txt b/CMakeLists.txt index bd08c8e291..dc114c69d1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,7 +8,9 @@ if(POLICY CMP0077) endif() # Fix "unrecognized escape" issues when passing CMAKE_MODULE_PATH on Windows. -file(TO_CMAKE_PATH "${CMAKE_MODULE_PATH}" CMAKE_MODULE_PATH) +if(DEFINED CMAKE_MODULE_PATH) + file(TO_CMAKE_PATH "${CMAKE_MODULE_PATH}" CMAKE_MODULE_PATH) +endif() list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") project(xrpl) diff --git a/SECURITY.md b/SECURITY.md index 18eec312ed..1be412ae2a 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -78,72 +78,61 @@ To report a qualifying bug, please send a detailed report to: | Email Address | bugs@ripple.com | | :-----------: | :-------------------------------------------------- | -| Short Key ID | `0xC57929BE` | -| Long Key ID | `0xCD49A0AFC57929BE` | -| Fingerprint | `24E6 3B02 37E0 FA9C 5E96 8974 CD49 A0AF C579 29BE` | +| Short Key ID | `0xA9F514E0` | +| Long Key ID | `0xD900855AA9F514E0` | +| Fingerprint | `B72C 0654 2F2A E250 2763 A268 D900 855A A9F5 14E0` | The full PGP key for this address, which is also available on several key servers (e.g. on [keyserver.ubuntu.com](https://keyserver.ubuntu.com)), is: ``` -----BEGIN PGP PUBLIC KEY BLOCK----- -mQINBFUwGHYBEAC0wpGpBPkd8W1UdQjg9+cEFzeIEJRaoZoeuJD8mofwI5Ejnjdt -kCpUYEDal0ygkKobu8SzOoATcDl18iCrScX39VpTm96vISFZMhmOryYCIp4QLJNN -4HKc2ZdBj6W4igNi6vj5Qo6JMyGpLY2mz4CZskbt0TNuUxWrGood+UrCzpY8x7/N -a93fcvNw+prgCr0rCH3hAPmAFfsOBbtGzNnmq7xf3jg5r4Z4sDiNIF1X1y53DAfV -rWDx49IKsuCEJfPMp1MnBSvDvLaQ2hKXs+cOpx1BCZgHn3skouEUxxgqbtTzBLt1 -xXpmuijsaltWngPnGO7mOAzbpZSdBm82/Emrk9bPMuD0QaLQjWr7HkTSUs6ZsKt4 -7CLPdWqxyY/QVw9UaxeHEtWGQGMIQGgVJGh1fjtUr5O1sC9z9jXcQ0HuIHnRCTls -GP7hklJmfH5V4SyAJQ06/hLuEhUJ7dn+BlqCsT0tLmYTgZYNzNcLHcqBFMEZHvHw -9GENMx/tDXgajKql4bJnzuTK0iGU/YepanANLd1JHECJ4jzTtmKOus9SOGlB2/l1 -0t0ADDYAS3eqOdOcUvo9ElSLCI5vSVHhShSte/n2FMWU+kMUboTUisEG8CgQnrng -g2CvvQvqDkeOtZeqMcC7HdiZS0q3LJUWtwA/ViwxrVlBDCxiTUXCotyBWwARAQAB -tDBSaXBwbGUgTGFicyBCdWcgQm91bnR5IFByb2dyYW0gPGJ1Z3NAcmlwcGxlLmNv -bT6JAjcEEwEKACEFAlUwGHYCGwMFCwkIBwMFFQoJCAsFFgIDAQACHgECF4AACgkQ -zUmgr8V5Kb6R0g//SwY/mVJY59k87iL26/KayauSoOcz7xjcST26l4ZHVVX85gOY -HYZl8k0+m8X3zxeYm9a3QAoAml8sfoaFRFQP8ynnefRrLUPaZ2MjbJ0SACMwZNef -T6o7Mi8LBAaiNZdYVyIfX1oM6YXtqYkuJdav6ZCyvVYqc9OvMJPY2ZzJYuI/ZtvQ -/lTndxCeg9ALNX/iezOLGdfMpf4HuIFVwcPPlwGi+HDlB9/bggDEHC8z434SXVFc -aQatXAPcDkjMUweU7y0CZtYEj00HITd4pSX6MqGiHrxlDZTqinCOPs1Ieqp7qufs -MzlM6irLGucxj1+wa16ieyYvEtGaPIsksUKkywx0O7cf8N2qKg+eIkUk6O0Uc6eO -CszizmiXIXy4O6OiLlVHGKkXHMSW9Nwe9GE95O8G9WR8OZCEuDv+mHPAutO+IjdP -PDAAUvy+3XnkceO+HGWRpVvJZfFP2YH4A33InFL5yqlJmSoR/yVingGLxk55bZDM -+HYGR3VeMb8Xj1rf/02qERsZyccMCFdAvKDbTwmvglyHdVLu5sPmktxbBYiemfyJ -qxMxmYXCc9S0hWrWZW7edktBa9NpE58z1mx+hRIrDNbS2sDHrib9PULYCySyVYcF -P+PWEe1CAS5jqkR2ker5td2/pHNnJIycynBEs7l6zbc9fu+nktFJz0q2B+GJAhwE -EAEKAAYFAlUwGaQACgkQ+tiY1qQ2QkjMFw//f2hNY3BPNe+1qbhzumMDCnbTnGif -kLuAGl9OKt81VHG1f6RnaGiLpR696+6Ja45KzH15cQ5JJl5Bgs1YkR/noTGX8IAD -c70eNwiFu8JXTaaeeJrsmFkF9Tueufb364risYkvPP8tNUD3InBFEZT3WN7JKwix -coD4/BwekUwOZVDd/uCFEyhlhZsROxdKNisNo3VtAq2s+3tIBAmTrriFUl0K+ZC5 -zgavcpnPN57zMtW9aK+VO3wXqAKYLYmtgxkVzSLUZt2M7JuwOaAdyuYWAneKZPCu -1AXkmyo+d84sd5mZaKOr5xArAFiNMWPUcZL4rkS1Fq4dKtGAqzzR7a7hWtA5o27T -6vynuxZ1n0PPh0er2O/zF4znIjm5RhTlfjp/VmhZdQfpulFEQ/dMxxGkQ9z5IYbX -mTlSDbCSb+FMsanRBJ7Drp5EmBIudVGY6SHI5Re1RQiEh7GoDfUMUwZO+TVDII5R -Ra7WyuimYleJgDo/+7HyfuIyGDaUCVj6pwVtYtYIdOI3tTw1R1Mr0V8yaNVnJghL -CHcEJQL+YHSmiMM3ySil3O6tm1By6lFz8bVe/rgG/5uklQrnjMR37jYboi1orCC4 -yeIoQeV0ItlxeTyBwYIV/o1DBNxDevTZvJabC93WiGLw2XFjpZ0q/9+zI2rJUZJh -qxmKP+D4e27lCI65Ag0EVTAYdgEQAMvttYNqeRNBRpSX8fk45WVIV8Fb21fWdwk6 -2SkZnJURbiC0LxQnOi7wrtii7DeFZtwM2kFHihS1VHekBnIKKZQSgGoKuFAQMGyu -a426H4ZsSmA9Ufd7kRbvdtEcp7/RTAanhrSL4lkBhaKJrXlxBJ27o3nd7/rh7r3a -OszbPY6DJ5bWClX3KooPTDl/RF2lHn+fweFk58UvuunHIyo4BWJUdilSXIjLun+P -Qaik4ZAsZVwNhdNz05d+vtai4AwbYoO7adboMLRkYaXSQwGytkm+fM6r7OpXHYuS -cR4zB/OK5hxCVEpWfiwN71N2NMvnEMaWd/9uhqxJzyvYgkVUXV9274TUe16pzXnW -ZLfmitjwc91e7mJBBfKNenDdhaLEIlDRwKTLj7k58f9srpMnyZFacntu5pUMNblB -cjXwWxz5ZaQikLnKYhIvrIEwtWPyjqOzNXNvYfZamve/LJ8HmWGCKao3QHoAIDvB -9XBxrDyTJDpxbog6Qu4SY8AdgVlan6c/PsLDc7EUegeYiNTzsOK+eq3G5/E92eIu -TsUXlciypFcRm1q8vLRr+HYYe2mJDo4GetB1zLkAFBcYJm/x9iJQbu0hn5NxJvZO -R0Y5nOJQdyi+muJzKYwhkuzaOlswzqVXkq/7+QCjg7QsycdcwDjiQh3OrsgXHrwl -M7gyafL9ABEBAAGJAh8EGAEKAAkFAlUwGHYCGwwACgkQzUmgr8V5Kb50BxAAhj9T -TwmNrgRldTHszj+Qc+v8RWqV6j+R+zc0cn5XlUa6XFaXI1OFFg71H4dhCPEiYeN0 -IrnocyMNvCol+eKIlPKbPTmoixjQ4udPTR1DC1Bx1MyW5FqOrsgBl5t0e1VwEViM -NspSStxu5Hsr6oWz2GD48lXZWJOgoL1RLs+uxjcyjySD/em2fOKASwchYmI+ezRv -plfhAFIMKTSCN2pgVTEOaaz13M0U+MoprThqF1LWzkGkkC7n/1V1f5tn83BWiagG -2N2Q4tHLfyouzMUKnX28kQ9sXfxwmYb2sA9FNIgxy+TdKU2ofLxivoWT8zS189z/ -Yj9fErmiMjns2FzEDX+bipAw55X4D/RsaFgC+2x2PDbxeQh6JalRA2Wjq32Ouubx -u+I4QhEDJIcVwt9x6LPDuos1F+M5QW0AiUhKrZJ17UrxOtaquh/nPUL9T3l2qPUn -1ChrZEEEhHO6vA8+jn0+cV9n5xEz30Str9iHnDQ5QyR5LyV4UBPgTdWyQzNVKA69 -KsSr9lbHEtQFRzGuBKwt6UlSFv9vPWWJkJit5XDKAlcKuGXj0J8OlltToocGElkF -+gEBZfoOWi/IBjRLrFW2cT3p36DTR5O1Ud/1DLnWRqgWNBLrbs2/KMKE6EnHttyD -7Tz8SQkuxltX/yBXMV3Ddy0t6nWV2SZEfuxJAQI= -=spg4 +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 +=nGuD -----END PGP PUBLIC KEY BLOCK----- ``` diff --git a/cmake/CompilationEnv.cmake b/cmake/CompilationEnv.cmake index 345e4cdd62..2d97f94615 100644 --- a/cmake/CompilationEnv.cmake +++ b/cmake/CompilationEnv.cmake @@ -13,6 +13,7 @@ include_guard(GLOBAL) set(is_clang FALSE) set(is_gcc FALSE) set(is_msvc FALSE) +set(is_xcode FALSE) if(CMAKE_CXX_COMPILER_ID MATCHES ".*Clang") # Clang or AppleClang set(is_clang TRUE) @@ -24,6 +25,11 @@ else() message(FATAL_ERROR "Unsupported C++ compiler: ${CMAKE_CXX_COMPILER_ID}") endif() +# Xcode generator detection +if(CMAKE_GENERATOR STREQUAL "Xcode") + set(is_xcode TRUE) +endif() + # -------------------------------------------------------------------- # Operating system detection diff --git a/cmake/XrplCore.cmake b/cmake/XrplCore.cmake index 4783998f48..7bea05afaa 100644 --- a/cmake/XrplCore.cmake +++ b/cmake/XrplCore.cmake @@ -32,14 +32,14 @@ target_protobuf_sources(xrpl.libpb xrpl/proto target_compile_options(xrpl.libpb PUBLIC - $<$:-wd4996> - $<$: + $<$:-wd4996> + $<$: --system-header-prefix="google/protobuf" -Wno-deprecated-dynamic-exception-spec > PRIVATE - $<$:-wd4065> - $<$>:-Wno-deprecated-declarations> + $<$:-wd4065> + $<$>:-Wno-deprecated-declarations> ) target_link_libraries(xrpl.libpb diff --git a/cmake/XrplInstall.cmake b/cmake/XrplInstall.cmake index 310436998d..0599a8268c 100644 --- a/cmake/XrplInstall.cmake +++ b/cmake/XrplInstall.cmake @@ -4,6 +4,12 @@ include(create_symbolic_link) +# If no suffix is defined for executables (e.g. Windows uses .exe but Linux +# and macOS use none), then explicitly set it to the empty string. +if(NOT DEFINED suffix) + set(suffix "") +endif() + install ( TARGETS common diff --git a/cmake/XrplInterface.cmake b/cmake/XrplInterface.cmake index 6e0203c099..f53b2dac26 100644 --- a/cmake/XrplInterface.cmake +++ b/cmake/XrplInterface.cmake @@ -4,6 +4,11 @@ include(CompilationEnv) +# Set defaults for optional variables to avoid uninitialized variable warnings +if(NOT DEFINED voidstar) + set(voidstar OFF) +endif() + add_library (opts INTERFACE) add_library (Xrpl::opts ALIAS opts) target_compile_definitions (opts @@ -52,7 +57,7 @@ add_library (xrpl_syslibs INTERFACE) add_library (Xrpl::syslibs ALIAS xrpl_syslibs) target_link_libraries (xrpl_syslibs INTERFACE - $<$: + $<$: legacy_stdio_definitions.lib Shlwapi kernel32 @@ -69,10 +74,10 @@ target_link_libraries (xrpl_syslibs odbccp32 crypt32 > - $<$>:dl> - $<$,$>>:rt>) + $<$>:dl> + $<$,$>>:rt>) -if (NOT MSVC) +if (NOT is_msvc) set (THREADS_PREFER_PTHREAD_FLAG ON) find_package (Threads) target_link_libraries (xrpl_syslibs INTERFACE Threads::Threads) diff --git a/cmake/XrplSanitizers.cmake b/cmake/XrplSanitizers.cmake index 050a5ef6f0..fc31e4a3ec 100644 --- a/cmake/XrplSanitizers.cmake +++ b/cmake/XrplSanitizers.cmake @@ -43,7 +43,10 @@ include(CompilationEnv) # Read environment variable -set(SANITIZERS $ENV{SANITIZERS}) +set(SANITIZERS "") +if(DEFINED ENV{SANITIZERS}) + set(SANITIZERS "$ENV{SANITIZERS}") +endif() # Set SANITIZERS_ENABLED flag for use in other modules if(SANITIZERS MATCHES "address|thread|undefinedbehavior") diff --git a/cmake/XrplSettings.cmake b/cmake/XrplSettings.cmake index 647e95837d..3724ea2b4f 100644 --- a/cmake/XrplSettings.cmake +++ b/cmake/XrplSettings.cmake @@ -4,10 +4,11 @@ include(CompilationEnv) -if("$ENV{CI}" STREQUAL "true" OR "$ENV{CONTINUOUS_INTEGRATION}" STREQUAL "true") - set(is_ci TRUE) -else() - set(is_ci FALSE) +set(is_ci FALSE) +if(DEFINED ENV{CI}) + if("$ENV{CI}" STREQUAL "true") + set(is_ci TRUE) + endif() endif() get_directory_property(has_parent PARENT_DIRECTORY) diff --git a/include/xrpl/basics/Number.h b/include/xrpl/basics/Number.h index d673bbe160..846607066b 100644 --- a/include/xrpl/basics/Number.h +++ b/include/xrpl/basics/Number.h @@ -4,6 +4,7 @@ #include #include +#include #include #include #include diff --git a/src/libxrpl/beast/core/CurrentThreadName.cpp b/src/libxrpl/beast/core/CurrentThreadName.cpp index e8f7b629a7..34e8603afa 100644 --- a/src/libxrpl/beast/core/CurrentThreadName.cpp +++ b/src/libxrpl/beast/core/CurrentThreadName.cpp @@ -1,4 +1,5 @@ #include +#include #include #include @@ -95,6 +96,11 @@ setCurrentThreadNameImpl(std::string_view name) std::cerr << "WARNING: Thread name \"" << name << "\" (length " << name.size() << ") exceeds maximum of " << maxThreadNameLength << " characters on Linux.\n"; + + XRPL_ASSERT( + false, + "beast::detail::setCurrentThreadNameImpl : Thread name exceeds " + "maximum length for Linux"); } #endif } diff --git a/src/libxrpl/core/detail/Job.cpp b/src/libxrpl/core/detail/Job.cpp index 3968c3ede4..358441010b 100644 --- a/src/libxrpl/core/detail/Job.cpp +++ b/src/libxrpl/core/detail/Job.cpp @@ -41,7 +41,7 @@ Job::queue_time() const void Job::doJob() { - beast::setCurrentThreadName("doJob: " + mName); + beast::setCurrentThreadName("j:" + mName); m_loadEvent->start(); m_loadEvent->setName(mName); diff --git a/src/test/app/FeeVote_test.cpp b/src/test/app/FeeVote_test.cpp index 71aa84eda2..ee577d7a99 100644 --- a/src/test/app/FeeVote_test.cpp +++ b/src/test/app/FeeVote_test.cpp @@ -12,6 +12,8 @@ #include #include +#include + namespace xrpl { namespace test { @@ -968,14 +970,6 @@ class FeeVote_test : public beast::unit_test::suite using namespace jtx; - FeeSetup setup; - setup.reference_fee = 42; - setup.account_reserve = 1234567; - setup.owner_reserve = 7654321; - setup.extension_compute_limit = 100; - setup.extension_size_limit = 200; - setup.gas_price = 300; - Env env( *this, testable_amendments() | featureXRPFees | featureSmartEscrow); @@ -988,99 +982,144 @@ class FeeVote_test : public beast::unit_test::suite BEAST_EXPECT(env.current()->fees().extensionSizeLimit == 0); BEAST_EXPECT(env.current()->fees().gasPrice == 0); - auto feeVote = make_FeeVote(setup, env.app().journal("FeeVote")); - auto ledger = std::make_shared( - create_genesis, - env.app().config(), - std::vector{}, - env.app().getNodeFamily()); + auto const createFeeTxFromVoting = [&](FeeSetup const& setup) + -> std::pair> { + auto feeVote = make_FeeVote(setup, env.app().journal("FeeVote")); + auto ledger = std::make_shared( + create_genesis, + env.app().config(), + std::vector{}, + env.app().getNodeFamily()); + + // doVoting requires a flag ledger (every 256th ledger) + // We need to create a ledger at sequence 256 to make it a flag + // ledger + for (int i = 0; i < 256 - 1; ++i) + { + ledger = std::make_shared( + *ledger, env.app().timeKeeper().closeTime()); + } + BEAST_EXPECT(ledger->isFlagLedger()); + + // Create some mock validations with fee votes + std::vector> validations; + + for (int i = 0; i < 5; i++) + { + auto sec = randomSecretKey(); + auto pub = derivePublicKey(KeyType::secp256k1, sec); + + auto val = std::make_shared( + env.app().timeKeeper().now(), + pub, + sec, + calcNodeID(pub), + [&](STValidation& v) { + v.setFieldU32(sfLedgerSequence, ledger->seq()); + // Vote for different fees than current + v.setFieldAmount( + sfBaseFeeDrops, XRPAmount{setup.reference_fee}); + v.setFieldAmount( + sfReserveBaseDrops, + XRPAmount{setup.account_reserve}); + v.setFieldAmount( + sfReserveIncrementDrops, + XRPAmount{setup.owner_reserve}); + v.setFieldU32( + sfExtensionComputeLimit, + setup.extension_compute_limit); + v.setFieldU32( + sfExtensionSizeLimit, setup.extension_size_limit); + v.setFieldU32(sfGasPrice, setup.gas_price); + }); + if (i % 2) + val->setTrusted(); + validations.push_back(val); + } + + auto txSet = std::make_shared( + SHAMapType::TRANSACTION, env.app().getNodeFamily()); + + // This should not throw since we have a flag ledger + feeVote->doVoting(ledger, validations, txSet); + + auto const txs = getTxs(txSet); + BEAST_EXPECT(txs.size() == 1); + return {txs[0], ledger}; + }; + + auto checkFeeTx = [&](FeeSetup const& setup, + STTx const& feeTx, + std::shared_ptr const& ledger, + std::source_location const loc = + std::source_location::current()) { + auto const line = " (" + std::to_string(loc.line()) + ")"; + BEAST_EXPECTS(feeTx.getTxnType() == ttFEE, line); + + BEAST_EXPECTS(feeTx.getAccountID(sfAccount) == AccountID(), line); + BEAST_EXPECTS( + feeTx.getFieldU32(sfLedgerSequence) == ledger->seq() + 1, line); + + BEAST_EXPECTS(feeTx.isFieldPresent(sfBaseFeeDrops), line); + BEAST_EXPECTS(feeTx.isFieldPresent(sfReserveBaseDrops), line); + BEAST_EXPECTS(feeTx.isFieldPresent(sfReserveIncrementDrops), line); + + // The legacy fields should NOT be present + BEAST_EXPECTS(!feeTx.isFieldPresent(sfBaseFee), line); + BEAST_EXPECTS(!feeTx.isFieldPresent(sfReserveBase), line); + BEAST_EXPECTS(!feeTx.isFieldPresent(sfReserveIncrement), line); + BEAST_EXPECTS(!feeTx.isFieldPresent(sfReferenceFeeUnits), line); + + // Check the values + BEAST_EXPECTS( + feeTx.getFieldAmount(sfBaseFeeDrops) == + XRPAmount{setup.reference_fee}, + line); + BEAST_EXPECTS( + feeTx.getFieldAmount(sfReserveBaseDrops) == + XRPAmount{setup.account_reserve}, + line); + BEAST_EXPECTS( + feeTx.getFieldAmount(sfReserveIncrementDrops) == + XRPAmount{setup.owner_reserve}, + line); + BEAST_EXPECTS( + feeTx.getFieldU32(sfExtensionComputeLimit) == + setup.extension_compute_limit, + line); + BEAST_EXPECTS( + feeTx.getFieldU32(sfExtensionSizeLimit) == + setup.extension_size_limit, + line); + BEAST_EXPECTS( + feeTx.getFieldU32(sfGasPrice) == setup.gas_price, line); + }; - // doVoting requires a flag ledger (every 256th ledger) - // We need to create a ledger at sequence 256 to make it a flag - // ledger - for (int i = 0; i < 256 - 1; ++i) { - ledger = std::make_shared( - *ledger, env.app().timeKeeper().closeTime()); - } - BEAST_EXPECT(ledger->isFlagLedger()); + FeeSetup setup; + setup.reference_fee = 42; + setup.account_reserve = 1234567; + setup.owner_reserve = 7654321; + setup.extension_compute_limit = 100; + setup.extension_size_limit = 200; + setup.gas_price = 300; + auto const [feeTx, ledger] = createFeeTxFromVoting(setup); - // Create some mock validations with fee votes - std::vector> validations; - - for (int i = 0; i < 5; i++) - { - auto sec = randomSecretKey(); - auto pub = derivePublicKey(KeyType::secp256k1, sec); - - auto val = std::make_shared( - env.app().timeKeeper().now(), - pub, - sec, - calcNodeID(pub), - [&](STValidation& v) { - v.setFieldU32(sfLedgerSequence, ledger->seq()); - // Vote for different fees than current - v.setFieldAmount( - sfBaseFeeDrops, XRPAmount{setup.reference_fee}); - v.setFieldAmount( - sfReserveBaseDrops, XRPAmount{setup.account_reserve}); - v.setFieldAmount( - sfReserveIncrementDrops, - XRPAmount{setup.owner_reserve}); - v.setFieldU32( - sfExtensionComputeLimit, setup.extension_compute_limit); - v.setFieldU32( - sfExtensionSizeLimit, setup.extension_size_limit); - v.setFieldU32(sfGasPrice, setup.gas_price); - }); - if (i % 2) - val->setTrusted(); - validations.push_back(val); + checkFeeTx(setup, feeTx, ledger); } - auto txSet = std::make_shared( - SHAMapType::TRANSACTION, env.app().getNodeFamily()); + { + FeeSetup setup; + setup.reference_fee = 42; + setup.account_reserve = 1234567; + setup.owner_reserve = 7654321; + setup.extension_compute_limit = 0; + setup.extension_size_limit = 0; + setup.gas_price = 300; + auto const [feeTx, ledger] = createFeeTxFromVoting(setup); - // This should not throw since we have a flag ledger - feeVote->doVoting(ledger, validations, txSet); - - auto const txs = getTxs(txSet); - BEAST_EXPECT(txs.size() == 1); - auto const& feeTx = txs[0]; - - BEAST_EXPECT(feeTx.getTxnType() == ttFEE); - - BEAST_EXPECT(feeTx.getAccountID(sfAccount) == AccountID()); - BEAST_EXPECT(feeTx.getFieldU32(sfLedgerSequence) == ledger->seq() + 1); - - BEAST_EXPECT(feeTx.isFieldPresent(sfBaseFeeDrops)); - BEAST_EXPECT(feeTx.isFieldPresent(sfReserveBaseDrops)); - BEAST_EXPECT(feeTx.isFieldPresent(sfReserveIncrementDrops)); - - // The legacy fields should NOT be present - BEAST_EXPECT(!feeTx.isFieldPresent(sfBaseFee)); - BEAST_EXPECT(!feeTx.isFieldPresent(sfReserveBase)); - BEAST_EXPECT(!feeTx.isFieldPresent(sfReserveIncrement)); - BEAST_EXPECT(!feeTx.isFieldPresent(sfReferenceFeeUnits)); - - // Check the values - BEAST_EXPECT( - feeTx.getFieldAmount(sfBaseFeeDrops) == - XRPAmount{setup.reference_fee}); - BEAST_EXPECT( - feeTx.getFieldAmount(sfReserveBaseDrops) == - XRPAmount{setup.account_reserve}); - BEAST_EXPECT( - feeTx.getFieldAmount(sfReserveIncrementDrops) == - XRPAmount{setup.owner_reserve}); - BEAST_EXPECT( - feeTx.getFieldU32(sfExtensionComputeLimit) == - setup.extension_compute_limit); - BEAST_EXPECT( - feeTx.getFieldU32(sfExtensionSizeLimit) == - setup.extension_size_limit); - BEAST_EXPECT(feeTx.getFieldU32(sfGasPrice) == setup.gas_price); + checkFeeTx(setup, feeTx, ledger); + } } void diff --git a/src/test/app/HostFuncImpl_test.cpp b/src/test/app/HostFuncImpl_test.cpp index 3b13312bb6..6aafd12da8 100644 --- a/src/test/app/HostFuncImpl_test.cpp +++ b/src/test/app/HostFuncImpl_test.cpp @@ -2029,7 +2029,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite auto const result = hfs.trace(msg, slice, false); if (BEAST_EXPECT(result.has_value())) { - BEAST_EXPECT(result.value() == msg.size() + data.size()); + BEAST_EXPECT(result.value() == 0); auto const messages = sink.messages().str(); BEAST_EXPECT(messages.find(msg) != std::string::npos); } @@ -2038,7 +2038,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite if (BEAST_EXPECT(resultHex.has_value())) { BEAST_EXPECT(resultHex.has_value()); - BEAST_EXPECT(resultHex.value() == msg.size() + data.size() * 2); + BEAST_EXPECT(resultHex.value() == 0); auto const messages = sink.messages().str(); std::string hex; hex.reserve(data.size() * 2); @@ -2065,7 +2065,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite std::string data = "abc"; auto const slice = Slice(data.data(), data.size()); auto const result = hfs.trace(msg, slice, false); - BEAST_EXPECT(result && *result == msg.size() + data.size()); + BEAST_EXPECT(result && *result == 0); auto const messages = sink.messages().str(); BEAST_EXPECT(messages.empty()); } @@ -2093,7 +2093,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite auto const result = hfs.traceNum(msg, num); if (BEAST_EXPECT(result.has_value())) { - BEAST_EXPECT(result.value() == msg.size() + sizeof(num)); + BEAST_EXPECT(result.value() == 0); auto const messages = sink.messages().str(); BEAST_EXPECT(messages.find(msg) != std::string::npos); BEAST_EXPECT( @@ -2116,7 +2116,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite std::string msg = "trace number"; int64_t num = 123456789; auto const result = hfs.traceNum(msg, num); - BEAST_EXPECT(result && *result == msg.size() + sizeof(int64_t)); + BEAST_EXPECT(result && *result == 0); auto const messages = sink.messages().str(); BEAST_EXPECT(messages.empty()); } @@ -2143,8 +2143,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite auto const result = hfs.traceAccount(msg, env.master.id()); if (BEAST_EXPECT(result.has_value())) { - BEAST_EXPECT( - result.value() == msg.size() + env.master.id().size()); + BEAST_EXPECT(result.value() == 0); auto const messages = sink.messages().str(); BEAST_EXPECT(messages.find(msg) != std::string::npos); BEAST_EXPECT( @@ -2165,8 +2164,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite WasmHostFunctionsImpl hfs(ac, dummyEscrow); std::string msg = "trace account"; auto const result = hfs.traceAccount(msg, env.master.id()); - BEAST_EXPECT( - result && *result == msg.size() + env.master.id().size()); + BEAST_EXPECT(result && *result == 0); auto const messages = sink.messages().str(); BEAST_EXPECT(messages.empty()); } @@ -2195,7 +2193,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite auto const result = hfs.traceAmount(msg, amount); if (BEAST_EXPECT(result.has_value())) { - BEAST_EXPECT(*result == msg.size()); + BEAST_EXPECT(*result == 0); auto const messages = sink.messages().str(); BEAST_EXPECT(messages.find(msg) != std::string::npos); BEAST_EXPECT( @@ -2212,7 +2210,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite { auto const result = hfs.traceAmount(msg, iouAmount); if (BEAST_EXPECT(result.has_value())) - BEAST_EXPECT(*result == msg.size()); + BEAST_EXPECT(*result == 0); } // MPT amount @@ -2222,7 +2220,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite STAmount mptAmount(mptAsset, 123456); auto const result = hfs.traceAmount(msg, mptAmount); if (BEAST_EXPECT(result.has_value())) - BEAST_EXPECT(*result == msg.size()); + BEAST_EXPECT(*result == 0); } } @@ -2241,7 +2239,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite std::string msg = "trace amount"; STAmount amount = XRP(12345); auto const result = hfs.traceAmount(msg, amount); - BEAST_EXPECT(result && *result == msg.size()); + BEAST_EXPECT(result && *result == 0); auto const messages = sink.messages().str(); BEAST_EXPECT(messages.empty()); } @@ -2291,16 +2289,12 @@ struct HostFuncImpl_test : public beast::unit_test::suite { auto const result = hfs.traceFloat(msg, makeSlice(invalid)); - BEAST_EXPECT( - result && - *result == msg.size() + makeSlice(invalid).size()); + BEAST_EXPECT(result && *result == 0); } { auto const result = hfs.traceFloat(msg, makeSlice(floatMaxExp)); - BEAST_EXPECT( - result && - *result == msg.size() + makeSlice(floatMaxExp).size()); + BEAST_EXPECT(result && *result == 0); } } @@ -2319,8 +2313,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite std::string msg = "trace float"; auto const result = hfs.traceFloat(msg, makeSlice(invalid)); - BEAST_EXPECT( - result && *result == msg.size() + makeSlice(invalid).size()); + BEAST_EXPECT(result && *result == 0); auto const messages = sink.messages().str(); BEAST_EXPECT(messages.empty()); } diff --git a/src/test/app/TestHostFunctions.h b/src/test/app/TestHostFunctions.h index 17a210441d..0938243cff 100644 --- a/src/test/app/TestHostFunctions.h +++ b/src/test/app/TestHostFunctions.h @@ -401,8 +401,6 @@ public: Expected trace(std::string_view const& msg, Slice const& data, bool asHex) override { - auto const ret = msg.size() + data.size() * (asHex ? 2 : 1); - if (!asHex) { log(msg, [&data] { @@ -421,39 +419,35 @@ public: }); } - return ret; + return 0; } Expected traceNum(std::string_view const& msg, int64_t data) override { - auto const ret = msg.size() + sizeof(data); log(msg, [data] { return data; }); - return ret; + return 0; } Expected traceAccount(std::string_view const& msg, AccountID const& account) override { - auto const ret = msg.size() + account.size(); log(msg, [&account] { return toBase58(account); }); - return ret; + return 0; } Expected traceFloat(std::string_view const& msg, Slice const& data) override { - auto const ret = msg.size() + data.size(); log(msg, [&data] { return wasm_float::floatToString(data); }); - return ret; + return 0; } Expected traceAmount(std::string_view const& msg, STAmount const& amount) override { - auto const ret = msg.size(); log(msg, [&amount] { return amount.getFullText(); }); - return ret; + return 0; } Expected diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 66a15d0a36..02a3d5c067 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -6,6 +6,14 @@ #include +#if (defined(__clang_major__) && __clang_major__ < 15) +#include +using source_location = std::experimental::source_location; +#else +#include +using std::source_location; +#endif + namespace xrpl { namespace test { @@ -42,6 +50,24 @@ runFinishFunction(std::string const& code) struct Wasm_test : public beast::unit_test::suite { + void + checkResult( + Expected, TER> re, + int32_t expectedResult, + int64_t expectedCost, + source_location const location = source_location::current()) + { + auto const lineStr = " (" + std::to_string(location.line()) + ")"; + if (BEAST_EXPECTS(re.has_value(), transToken(re.error()) + lineStr)) + { + BEAST_EXPECTS( + re->result == expectedResult, + std::to_string(re->result) + lineStr); + BEAST_EXPECTS( + re->cost == expectedCost, std::to_string(re->cost) + lineStr); + } + } + void testGetDataHelperFunctions() { @@ -92,11 +118,7 @@ struct Wasm_test : public beast::unit_test::suite // if (res) printf("invokeAdd get the result: %d\n", res.value()); - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECTS(re->result == 6'912, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 59, std::to_string(re->cost)); - } + checkResult(re, 6'912, 59); } void @@ -180,11 +202,7 @@ struct Wasm_test : public beast::unit_test::suite 1'000'000, env.journal); - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECTS(re->result == 0, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 151, std::to_string(re->cost)); - } + checkResult(re, 0, 151); env.close(); env.close(); @@ -193,11 +211,7 @@ struct Wasm_test : public beast::unit_test::suite re = engine.run( {}, ESCROW_FUNCTION_NAME, {}, imports, hfs, 1'000'000, env.journal); - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECTS(re->result == 5, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 190, std::to_string(re->cost)); - } + checkResult(re, 5, 190); } void @@ -211,11 +225,7 @@ struct Wasm_test : public beast::unit_test::suite auto const re = engine.run(wasm, "fib", wasmParams(10)); - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECTS(re->result == 55, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 1'137, std::to_string(re->cost)); - } + checkResult(re, 55, 1'137); } void @@ -230,11 +240,7 @@ struct Wasm_test : public beast::unit_test::suite auto const re = engine.run(wasm, "sha512_process", wasmParams(sha512PureWasmHex)); - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECTS(re->result == 34'432, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 151'155, std::to_string(re->cost)); - } + checkResult(re, 34'432, 151'155); } void @@ -255,11 +261,7 @@ struct Wasm_test : public beast::unit_test::suite auto const re = engine.run(wasm, "b58enco", wasmParams(outb, s)); - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECTS(re->result == 700, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 2'886'069, std::to_string(re->cost)); - } + checkResult(re, 700, 2'886'069); } void @@ -291,11 +293,7 @@ struct Wasm_test : public beast::unit_test::suite 1'000'000, env.journal); - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 25'503, std::to_string(re->cost)); - } + checkResult(re, 1, 25'503); env.close(); } @@ -325,11 +323,7 @@ struct Wasm_test : public beast::unit_test::suite 1'000'000, env.journal); - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 64'263, std::to_string(re->cost)); - } + checkResult(re, 1, 64'263); env.close(); } @@ -374,22 +368,14 @@ struct Wasm_test : public beast::unit_test::suite std::shared_ptr hfs(new TestHostFunctions(env, 0)); auto re = runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 64'263, std::to_string(re->cost)); - } + checkResult(re, 1, 64'263); } { // max() gas std::shared_ptr hfs(new TestHostFunctions(env, 0)); auto re = runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, -1); - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 64'263, std::to_string(re->cost)); - } + checkResult(re, 1, 64'263); } { // fail because trying to access nonexistent field @@ -408,11 +394,7 @@ struct Wasm_test : public beast::unit_test::suite std::shared_ptr hfs(new BadTestHostFunctions(env)); auto re = runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECTS(re->result == -201, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 28'148, std::to_string(re->cost)); - } + checkResult(re, -201, 28'148); } { // fail because trying to allocate more than MAX_PAGES memory @@ -431,11 +413,7 @@ struct Wasm_test : public beast::unit_test::suite std::shared_ptr hfs(new BadTestHostFunctions(env)); auto re = runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECTS(re->result == -201, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 28'148, std::to_string(re->cost)); - } + checkResult(re, -201, 28'148); } { // fail because recursion too deep @@ -565,11 +543,7 @@ struct Wasm_test : public beast::unit_test::suite std::shared_ptr hfs(new TestHostFunctions(env, 0)); auto re = runEscrowWasm(wasm, hfs, funcName, {}, 200'000); - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 110'699, std::to_string(re->cost)); - } + checkResult(re, 1, 110'699); env.close(); } @@ -580,11 +554,7 @@ struct Wasm_test : public beast::unit_test::suite std::shared_ptr hfs(new TestHostFunctions(env, 0)); auto re = runEscrowWasm(wasm, hfs, funcName, {}, 100'000); - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 4'259, std::to_string(re->cost)); - } + checkResult(re, 1, 4'259); env.close(); } } @@ -698,14 +668,10 @@ struct Wasm_test : public beast::unit_test::suite Bytes const wasm(wasmStr.begin(), wasmStr.end()); std::shared_ptr hfs(new TestHostFunctions(env, 0)); - auto const allowance = 323'774; + auto const allowance = 324'931; auto re = runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, allowance); - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECT(re->result); - BEAST_EXPECTS(re->cost == allowance, std::to_string(re->cost)); - } + checkResult(re, 1, allowance); } void @@ -987,6 +953,65 @@ struct Wasm_test : public beast::unit_test::suite env.close(); } + void + testReturnType() + { + using namespace test::jtx; + Env env(*this); + std::shared_ptr hfs(new TestHostFunctions(env, 0)); + + // return int64. + { // (module + // (memory (export "memory") 1) + // (func (export "finish") (result i64) + // i64.const 0x100000000)) + auto const wasmHex = + "0061736d010000000105016000017e030201000503010001" + "071302066d656d6f727902000666696e69736800000a0a01" + "08004280808080100b"; + auto const wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + Bytes const wasm(wasmStr.begin(), wasmStr.end()); + auto const re = + runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); + BEAST_EXPECT(!re); + } + + // return void. wasmi return execution error + { //(module + // (type (;0;) (func)) + // (func (;0;) (type 0) + // return) + // (memory (;0;) 1) + // (export "memory" (memory 0)) + // (export "finish" (func 0))) + auto const wasmHex = + "0061736d01000000010401600000030201000503010001071302066d656d6f" + "727902000666696e69736800000a050103000f0b"; + auto const wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + Bytes const wasm(wasmStr.begin(), wasmStr.end()); + auto const re = + runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); + BEAST_EXPECT(!re); + } + + // return i32, i32. wasmi doesn't create module + { //(module + // (memory (export "memory") 1) + // (func (export "finish") (result i32 i32) + // i32.const 0x10000000 + // i32.const 0x100000FF)) + auto const wasmHex = + "0061736d010000000106016000027f7f030201000503010001071302066d65" + "6d6f727902000666696e69736800000a10010e0041808080800141ff818080" + "010b"; + auto const wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + Bytes const wasm(wasmStr.begin(), wasmStr.end()); + auto const re = + runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); + BEAST_EXPECT(!re); + } + } + void run() override { @@ -1018,6 +1043,7 @@ struct Wasm_test : public beast::unit_test::suite testStartFunctionLoop(); testBadAlloc(); testBadAlign(); + testReturnType(); // perfTest(); } diff --git a/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs b/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs index a5aa2eb6e5..aa05eec9d9 100644 --- a/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs +++ b/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs @@ -248,7 +248,7 @@ pub extern "C" fn finish() -> i32 { account.0.len(), ) }, - (message.len() + 20) as i32, + 0, "trace_account", ); let amount = &[0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F]; // 95 drops of XRP @@ -261,7 +261,7 @@ pub extern "C" fn finish() -> i32 { amount.len(), ) }, - message.len() as i32, + 0, "trace_amount", ); let amount = &[0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]; // 0 drops of XRP @@ -274,7 +274,7 @@ pub extern "C" fn finish() -> i32 { amount.len(), ) }, - message.len() as i32, + 0, "trace_amount_zero", ); @@ -1513,7 +1513,7 @@ pub extern "C" fn finish() -> i32 { account.0.len(), ) }, - 34, + 0, "trace_account_check_desync", ); diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 748d262d22..64eef2e4de 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -771,251 +771,250 @@ extern std::string const codecovTestsWasmHex = "61696e5f6b65796c6574000108686f73745f6c69620e7369676e6572735f6b65796c657400" "0008686f73745f6c69620d7469636b65745f6b65796c6574000108686f73745f6c69620c76" "61756c745f6b65796c657400010303020a0505030100110619037f01418080c0000b7f0041" - "8f9ec0000b7f0041909ec0000b072e04066d656d6f727902000666696e697368003d0a5f5f" - "646174615f656e6403010b5f5f686561705f6261736503020c01020ad62602460002402000" - "20014704402002200341004100410010001a20004100480d01418b80c000410b2000ad1001" - "000b200220032000ac10011a0f0b418b80c000410b2000ac1001000b8c26020a7f017e2300" - "41f0016b22002400419680c000412341004100410010001a100241b9e00041b980c000410e" - "103c100341b2920441c780c0004116103c200041f0006a22064200370300200041e8006a22" - "054200370300200041e0006a2203420037030020004200370358200041d8006a2201412010" - "04412041be8cc0004116103c1005410a41dd80c000410c103c200041186a22074281828488" - "90a0c08001370300200041106a2208428182848890a0c08001370300200041086a22094281" - "82848890a0c080013703002000428182848890a0c0800137030041e980c000410e10064101" - "41f780c0004111103c200041201006410141f780c0004111103c4181802020014114100722" - "0241144604400240200041266a200041da006a2d00003a00002000200029005f3703c80120" - "00200041e4006a2900003700cd01200041306a20002900cd01370000200020002f00583b01" - "242000200028005b360027200020002903c80137002b200642003703002005420037030020" - "03420037030020004200370358200041246a2206411420014120100822024120470d002000" - "413a6a20002d005a3a0000200041d0016a2202200041e7006a290000220a370300200041c7" - "006a200a370000200041cf006a200041ef006a290000370000200041d7006a200041f7006a" - "2d00003a0000200020002f01583b01382000200028005b36003b2000200029005f37003f20" - "0041386a4120410010094101418881c0004110103c20054100360200200342003703002000" - "42003703584181802020014114100a411441d48cc000411c103c2005410036020020034200" - "3703002000420037035841014181802020014114100b411441f08cc0004114103c20004104" - "36029801200041818020360258200041d8016a220341003602002002420037030020004200" - "3703c80120014104200041c8016a22054114100c411441848dc0004113103c200341003602" - "0020024200370300200042003703c801200120002802980120054114100d411441978dc000" - "4123103c2003410036020020024200370300200042003703c8014101200120002802980120" - "054114100e411441ba8dc000411b103c4189803c100f4120419881c0004110103c4189803c" - "1010412041a881c0004120103c41014189803c1011412041c881c0004118103c2001200028" - "0298011012412041e081c0004117103c20012000280298011013412041f781c0004127103c" - "4101200120002802980110144120419e82c000411f103c200641141015411441bd82c00041" - "0b103c200041e0016a220442003703002003420037030020024200370300200042003703c8" - "012001200028029801200541201016412041d58dc0004113103c41c882c000410c41d482c0" - "00410b41df82c000410e1017410141ed82c0004109103c200041b8016a2007290300370300" - "200041b0016a2008290300370300200041a8016a2009290300370300200020002903003703" - "a001200341003b010020024200370300200042003703c80120064114200041a0016a220741" - "20200541121018411241e88dc0004107103c20034100360200200242003703002000420037" - "03c80120074120200541141019411441ef8dc000410e103c200041003602c8012007412020" - "054104101a410441fd8dc000410d103c20074120101b410841f682c000410d103c20074120" - "101c410a418383c0004114103c200041003602c8012007412020054104101d4104418a8ec0" - "00410e103c419783c000410d20064114101e412141a483c000410d103c419783c000410d41" - "b183c0004108101f410d41b983c000410c103c419783c000410d41c583c0004108101f410d" - "41cd83c0004111103c417f41041004417141de83c000411e103c200041003602c801200541" - "7f1004417141988ec000411e103c200041ca016a41003a0000200041003b01c80120054103" - "1004417d41b68ec0004124103c200041003602c8012005418094ebdc031004417341da8ec0" - "004123103c200442003703002003420037030020024200370300200042003703c801200041" - "d894ebdc036a220741082005412041001020417341fd8ec0004117103c2004420037030020" - "03420037030020024200370300200042003703c80120012000280298012005412041001020" - "417141948fc0004119103c4102100f416f41fc83c000411f103c417f200028029801101241" - "71419b84c000411f103c2001417f1012417141ba84c000411f103c20014181201012417441" - "d984c0004120103c20072000280298011012417341f984c000411f103c2007200028029801" - "410110094173419885c0004118103c200120002802980141011009417141b085c000411a10" - "3c200442003703002003420037030020024200370300200042003703c80120072000280298" - "01200541201008417341ad8fc0004116103c20044200370300200342003703002002420037" - "0300200042003703c8012001200028029801200541201008417141c38fc0004118103c2004" - "42003703002003420037030020024200370300200042003703c80120064114200641142007" - "200028029801200541201021417341db8fc000411c103c2004420037030020034200370300" - "20024200370300200042003703c80120064114200641142001200028029801200541201021" - "417141f78fc000411e103c2004420037030020034200370300200242003703002000420037" - "03c80141fb9dc000411420072000280298012005412010224173419590c0004119103c2004" - "42003703002003420037030020024200370300200042003703c80141fb9dc0004114200120" - "0028029801200541201022417141ae90c000411f103c200442003703002003420037030020" - "024200370300200042003703c80141fb9dc000411441ca85c0004114200541201022417141" - "cd90c0004129103c200442003703002003420037030020024200370300200042003703c801" - "41de85c000412841fb9dc0004114200541201022417141f690c0004125103c200041dc016a" - "200041346a280100360200200041d4016a2000412c6a290100370200200020002901243702" - "cc01200041808080083602c801200041003b01c0012005411841fb9dc0004114200041c001" - "6a2203410210224171419b91c000410e103c2007200028029801422a10014173418686c000" - "4111103c200041003b01c0014102200341021007416f41a991c000411b103c200041003b01" - "c001410220034102100a416f41c491c000412b103c200041003b01c0014101410220034102" - "100b416f41ef91c0004123103c4102100f416f41fc83c000411f103c41021010416f419786" - "c000412f103c410141021011416f41c686c0004127103c41e980c0004181201006417441ed" - "86c000411f103c41e980c00041c10010064174418c87c000411a103c200041003b01c00120" - "0141812020034102100c4174419292c0004121103c200041003b01c0012001418120200341" - "02100d417441b392c0004131103c200041003b01c0014101200141812020034102100e4174" - "41e492c0004129103c20014181201012417441a687c0004125103c20014181201013417441" - "cb87c0004135103c4101200141812010144174418088c000412d103c200141812010154174" - "41ad88c0004119103c419783c00041812041d482c000410b41df82c000410e1017417441ed" - "82c0004109103c419783c000410d41d482c00041812041df82c000410e1017417441ed82c0" - "004109103c419783c000410d41d482c000410b41df82c0004181201017417441ed82c00041" - "09103c200041003b01c00120014181202003410210164174418d93c0004121103c20004100" - "3b01c00141fb9dc00041812041fb9dc0004114200341021022417441ae93c0004118103c20" - "0041003b01c00120064114200641142001418120200341021023417441c693c000411f103c" - "200041003b01c001200541812020064114200341021024417441e593c0004122103c419783" - "c000410d200720002802980141001000417341c688c000410f103c200042d487b6f4c7d4b1" - "c0003700c001419783c000410d200041c095ebdc036a220441081025417341d588c000411c" - "103c419783c000410d2007200028029801101f417341f188c0004116103c20044108200341" - "0810264173418789c0004118103c200341082004410810264173419f89c0004118103c2000" - "41003b01ec012004410820034108200041ec016a22024102410010274173418794c0004114" - "103c200041003b01ec01200341082004410820024102410010274173419b94c0004114103c" - "200041003b01ec0120044108200341082002410241001028417341af94c0004119103c2000" - "41003b01ec0120034108200441082002410241001028417341c894c0004119103c20004100" - "3b01ec0120044108200341082002410241001029417341e194c0004119103c200041003b01" - "ec0120034108200441082002410241001029417341fa94c0004119103c200041003b01ec01" - "2004410820034108200241024100102a4173419395c0004117103c200041003b01ec012003" - "410820044108200241024100102a417341aa95c0004117103c200041003b01ec0120044108" - "4103200241024100102b417341c195c0004114103c200041003b01ec012004410841032002" - "41024100102c417341d595c0004113103c200041003b01ec0120044108200241024100102d" - "417341e895c0004113103c200120002802980141001009417141b789c0004123103c200041" - "003b01ec01200641142001200028029801200241021018417141fb95c000411a103c200041" - "003b01ec0120012000280298012002410210194171419596c0004121103c200041003b01ec" - "01200120002802980120024102101a417141b696c0004120103c2001200028029801101b41" - "7141da89c0004120103c2001200028029801101c417141fa89c0004127103c200041003602" - "ec01200120002802980120024104101d417141d696c0004121103c200041003b01ec012001" - "200028029801200241021008417141f796c0004123103c200041003b01ec01200120002802" - "9801410120024102102e4171419a97c0004121103c200041003b01ec012001200028029801" - "22042006411420012004200241021023417141bb97c0004127103c200041003b01ec012006" - "41142001200028029801220420012004200241021023417141e297c0004127103c20004100" - "3b01ec0120012000280298012006411420024102102f4171418998c0004125103c20004100" - "3b01ec0120064114200120002802980120024102102f417141ae98c0004125103c20004100" - "3b01ec01200120002802980120064114200241021030417141d398c000412c103c20004100" - "3b01ec01200641142001200028029801200241021030417141ff98c000412c103c20004100" - "3b01ec012001200028029801200241021031417141ab99c000411f103c200041003b01ec01" - "20012000280298014101200241021032417141ca99c0004122103c200041003b01ec012001" - "2000280298012006411441ca85c0004114200241021021417141ec99c0004121103c200041" - "003b01ec0120064114200120002802980141ca85c00041142002410210214171418d9ac000" - "4121103c200041003b01ec0120012000280298014101200241021033417141ae9ac0004128" - "103c200041003b01ec01200541182001200028029801200241021024417141d69ac0004123" - "103c200041003b01ec0120012000280298014101200241021034417141f99ac0004125103c" - "200041003b01ec01200120002802980141012002410210354171419e9bc0004121103c2000" - "41003b01ec0120012000280298014101200241021036417141bf9bc0004122103c20004100" - "3b01ec012001200028029801200641144101200241021037417141e19bc0004124103c2000" - "41003b01ec012006411420012000280298014101200241021037417141859cc0004124103c" - "200041003b01ec0120012000280298014101200241021038417141a99cc000412f103c2000" - "41003b01ec012001200028029801200241021039417141d89cc0004123103c200041003b01" - "ec012001200028029801410120024102103a417141fb9cc0004122103c200041003b01ec01" - "2001200028029801410120024102103b4171419d9dc0004121103c200041003b01ec012001" - "20002802980141a18ac0004120200241021018417141be9dc000411c103c419783c000410d" - "2001200028029801101e417141c18ac0004122103c419797abdd03410d41a18ac000412041" - "001000417341e38ac0004110103c419797abdd03410d200341081025417341f38ac000411d" - "103c419797abdd03410d20064114101e417341908bc0004118103c419797abdd03410d41c5" - "83c0004108101f417341a88bc0004117103c20012000280298012001418120410010004174" - "41bf8bc000410e103c200141812042011001417441cd8bc0004112103c419783c000418120" - "200341081025417441df8bc000411b103c419783c00041812020064114101e417441fa8bc0" - "004116103c419783c00041812041c583c0004108101f417441908cc0004115103c419783c0" - "00410d2001200028029801101f417141a58cc0004119103c200041003b01ec012001200028" - "02980120064114200241021024417141da9dc0004121103c200041f0016a240041010f0b0b" - "418080c000410b417f20022002417f4e1bac1001000b0be61d0200418080c0000bde056572" - "726f725f636f64653d54455354204641494c45442424242424205354415254494e47205741" - "534d20455845435554494f4e2024242424246765745f6c65646765725f73716e6765745f70" - "6172656e745f6c65646765725f74696d656765745f626173655f666565746573745f616d65" - "6e646d656e74616d656e646d656e745f656e61626c656463616368655f6c65646765725f6f" - "626a6765745f74785f61727261795f6c656e6765745f63757272656e745f6c65646765725f" - "6f626a5f61727261795f6c656e6765745f6c65646765725f6f626a5f61727261795f6c656e" - "6765745f74785f6e65737465645f61727261795f6c656e6765745f63757272656e745f6c65" - "646765725f6f626a5f6e65737465645f61727261795f6c656e6765745f6c65646765725f6f" - "626a5f6e65737465645f61727261795f6c656e7570646174655f6461746174657374206d65" - "737361676574657374207075626b657974657374207369676e6174757265636865636b5f73" - "69676765745f6e66745f666c6167736765745f6e66745f7472616e736665725f6665657465" - "7374696e6720747261636574726163655f6163636f756e74400000000000005f7472616365" - "5f616d6f756e74400000000000000074726163655f616d6f756e745f7a65726f6765745f70" - "6172656e745f6c65646765725f686173685f6e65675f7074726765745f74785f6172726179" - "5f6c656e5f696e76616c69645f736669656c646765745f74785f6e65737465645f61727261" - "795f6c656e5f6e65675f7074726765745f74785f6e65737465645f61727261795f6c656e5f" - "6e65675f6c656e6765745f74785f6e65737465645f61727261795f6c656e5f746f6f5f6c6f" - "6e676765745f74785f6e65737465645f61727261795f6c656e5f7074725f6f6f6263616368" - "655f6c65646765725f6f626a5f7074725f6f6f6263616368655f6c65646765725f6f626a5f" - "77726f6e675f6c656e555344303030303030303030303030303030303000418686c0000bf5" - "1774726163655f6e756d5f6f6f625f7374726765745f63757272656e745f6c65646765725f" - "6f626a5f61727261795f6c656e5f696e76616c69645f736669656c646765745f6c65646765" - "725f6f626a5f61727261795f6c656e5f696e76616c69645f736669656c64616d656e646d65" - "6e745f656e61626c65645f746f6f5f6269675f736c696365616d656e646d656e745f656e61" - "626c65645f746f6f5f6c6f6e676765745f74785f6e65737465645f61727261795f6c656e5f" - "746f6f5f6269675f736c6963656765745f63757272656e745f6c65646765725f6f626a5f6e" - "65737465645f61727261795f6c656e5f746f6f5f6269675f736c6963656765745f6c656467" - "65725f6f626a5f6e65737465645f61727261795f6c656e5f746f6f5f6269675f736c696365" - "7570646174655f646174615f746f6f5f6269675f736c69636574726163655f6f6f625f736c" - "69636574726163655f6f70617175655f666c6f61745f6f6f625f736c69636574726163655f" - "616d6f756e745f6f6f625f736c696365666c6f61745f636f6d706172655f6f6f625f736c69" - "636531666c6f61745f636f6d706172655f6f6f625f736c6963653263616368655f6c656467" - "65725f6f626a5f77726f6e675f73697a655f75696e743235366765745f6e66745f666c6167" - "735f77726f6e675f73697a655f75696e743235366765745f6e66745f7472616e736665725f" - "6665655f77726f6e675f73697a655f75696e74323536303030303030303030303030303030" - "303030303030303030303030303030303174726163655f6163636f756e745f77726f6e675f" - "73697a655f6163636f756e74696474726163655f6f6f625f737472696e6774726163655f6f" - "70617175655f666c6f61745f6f6f625f737472696e6774726163655f6163636f756e745f6f" - "6f625f737472696e6774726163655f616d6f756e745f6f6f625f737472696e677472616365" - "5f746f6f5f6c6f6e6774726163655f6e756d5f746f6f5f6c6f6e6774726163655f6f706171" - "75655f666c6f61745f746f6f5f6c6f6e6774726163655f6163636f756e745f746f6f5f6c6f" - "6e6774726163655f616d6f756e745f746f6f5f6c6f6e6774726163655f616d6f756e745f77" - "726f6e675f6c656e6774686765745f706172656e745f6c65646765725f686173686765745f" - "63757272656e745f6c65646765725f6f626a5f6669656c646765745f6c65646765725f6f62" - "6a5f6669656c646765745f74785f6e65737465645f6669656c646765745f63757272656e74" - "5f6c65646765725f6f626a5f6e65737465645f6669656c646765745f6c65646765725f6f62" - "6a5f6e65737465645f6669656c64636f6d707574655f7368613531325f68616c666765745f" - "6e66746765745f6e66745f6973737565726765745f6e66745f7461786f6e6765745f6e6674" - "5f73657269616c6765745f706172656e745f6c65646765725f686173685f6e65675f6c656e" - "6765745f706172656e745f6c65646765725f686173685f6275665f746f6f5f736d616c6c67" - "65745f706172656e745f6c65646765725f686173685f6c656e5f746f6f5f6c6f6e67666c6f" - "61745f66726f6d5f75696e745f6c656e5f6f6f62666c6f61745f66726f6d5f75696e745f77" - "726f6e675f6c656e6163636f756e745f6b65796c65745f6c656e5f6f6f626163636f756e74" - "5f6b65796c65745f77726f6e675f6c656e6c696e655f6b65796c65745f6c656e5f6f6f625f" - "63757272656e63796c696e655f6b65796c65745f77726f6e675f6c656e5f63757272656e63" - "79616d6d5f6b65796c65745f6c656e5f6f6f625f617373657432616d6d5f6b65796c65745f" - "6c656e5f77726f6e675f6c656e5f617373657432616d6d5f6b65796c65745f6c656e5f7772" - "6f6e675f6e6f6e5f7872705f63757272656e63795f6c656e616d6d5f6b65796c65745f6c65" - "6e5f77726f6e675f7872705f63757272656e63795f6c656e616d6d5f6b65796c65745f6d70" - "746765745f74785f6669656c645f696e76616c69645f736669656c646765745f6375727265" - "6e745f6c65646765725f6f626a5f6669656c645f696e76616c69645f736669656c64676574" - "5f6c65646765725f6f626a5f6669656c645f696e76616c69645f736669656c646765745f74" - "785f6e65737465645f6669656c645f746f6f5f6269675f736c6963656765745f6375727265" - "6e745f6c65646765725f6f626a5f6e65737465645f6669656c645f746f6f5f6269675f736c" - "6963656765745f6c65646765725f6f626a5f6e65737465645f6669656c645f746f6f5f6269" - "675f736c696365636f6d707574655f7368613531325f68616c665f746f6f5f6269675f736c" - "696365616d6d5f6b65796c65745f746f6f5f6269675f736c69636563726564656e7469616c" - "5f6b65796c65745f746f6f5f6269675f736c6963656d70746f6b656e5f6b65796c65745f74" - "6f6f5f6269675f736c6963655f6d70746964666c6f61745f6164645f6f6f625f736c696365" - "31666c6f61745f6164645f6f6f625f736c69636532666c6f61745f73756274726163745f6f" - "6f625f736c69636531666c6f61745f73756274726163745f6f6f625f736c69636532666c6f" - "61745f6d756c7469706c795f6f6f625f736c69636531666c6f61745f6d756c7469706c795f" - "6f6f625f736c69636532666c6f61745f6469766964655f6f6f625f736c69636531666c6f61" - "745f6469766964655f6f6f625f736c69636532666c6f61745f726f6f745f6f6f625f736c69" - "6365666c6f61745f706f775f6f6f625f736c696365666c6f61745f6c6f675f6f6f625f736c" - "6963656765745f6e66745f77726f6e675f73697a655f75696e743235366765745f6e66745f" - "6973737565725f77726f6e675f73697a655f75696e743235366765745f6e66745f7461786f" - "6e5f77726f6e675f73697a655f75696e743235366765745f6e66745f73657269616c5f7772" - "6f6e675f73697a655f75696e743235366163636f756e745f6b65796c65745f77726f6e675f" - "73697a655f6163636f756e746964636865636b5f6b65796c65745f77726f6e675f73697a65" - "5f6163636f756e74696463726564656e7469616c5f6b65796c65745f77726f6e675f73697a" - "655f6163636f756e7469643163726564656e7469616c5f6b65796c65745f77726f6e675f73" - "697a655f6163636f756e7469643264656c65676174655f6b65796c65745f77726f6e675f73" - "697a655f6163636f756e7469643164656c65676174655f6b65796c65745f77726f6e675f73" - "697a655f6163636f756e746964326465706f7369745f707265617574685f6b65796c65745f" - "77726f6e675f73697a655f6163636f756e746964316465706f7369745f707265617574685f" - "6b65796c65745f77726f6e675f73697a655f6163636f756e746964326469645f6b65796c65" - "745f77726f6e675f73697a655f6163636f756e746964657363726f775f6b65796c65745f77" - "726f6e675f73697a655f6163636f756e7469646c696e655f6b65796c65745f77726f6e675f" - "73697a655f6163636f756e746964316c696e655f6b65796c65745f77726f6e675f73697a65" - "5f6163636f756e746964326d70745f69737375616e63655f6b65796c65745f77726f6e675f" - "73697a655f6163636f756e7469646d70746f6b656e5f6b65796c65745f77726f6e675f7369" - "7a655f6163636f756e7469646e66745f6f666665725f6b65796c65745f77726f6e675f7369" - "7a655f6163636f756e7469646f666665725f6b65796c65745f77726f6e675f73697a655f61" - "63636f756e7469646f7261636c655f6b65796c65745f77726f6e675f73697a655f6163636f" - "756e7469647061796368616e5f6b65796c65745f77726f6e675f73697a655f6163636f756e" - "746964317061796368616e5f6b65796c65745f77726f6e675f73697a655f6163636f756e74" - "6964327065726d697373696f6e65645f646f6d61696e5f6b65796c65745f77726f6e675f73" - "697a655f6163636f756e7469647369676e6572735f6b65796c65745f77726f6e675f73697a" - "655f6163636f756e7469647469636b65745f6b65796c65745f77726f6e675f73697a655f61" - "63636f756e7469647661756c745f6b65796c65745f77726f6e675f73697a655f6163636f75" - "6e7469646765745f6e66745f77726f6e675f73697a655f6163636f756e7469646d70746f6b" - "656e5f6b65796c65745f6d707469645f77726f6e675f6c656e677468004d0970726f647563" - "65727302086c616e6775616765010452757374000c70726f6365737365642d627901057275" - "7374631d312e38392e30202832393438333838336520323032352d30382d3034290094010f" - "7461726765745f6665617475726573082b0f6d757461626c652d676c6f62616c732b136e6f" - "6e7472617070696e672d6670746f696e742b0b62756c6b2d6d656d6f72792b087369676e2d" - "6578742b0f7265666572656e63652d74797065732b0a6d756c746976616c75652b0f62756c" - "6b2d6d656d6f72792d6f70742b1663616c6c2d696e6469726563742d6f7665726c6f6e67"; + "a99ec0000b7f0041b09ec0000b072e04066d656d6f727902000666696e697368003d0a5f5f" + "646174615f656e6403010b5f5f686561705f6261736503020aeb2602460002402000200147" + "04402002200341004100410010001a20004100480d01418b80c000410b2000ad1001000b20" + "0220032000ac10011a0f0b418b80c000410b2000ac1001000ba126020a7f017e230041f001" + "6b22002400419680c000412341004100410010001a100241b9e00041b980c000410e103c10" + "0341b2920441c780c0004116103c200041f0006a22054200370300200041e8006a22064200" + "370300200041e0006a2203420037030020004200370358200041d8006a2201412010044120" + "41d88cc0004116103c1005410a41dd80c000410c103c200041186a2207428182848890a0c0" + "8001370300200041106a2208428182848890a0c08001370300200041086a22094281828488" + "90a0c080013703002000428182848890a0c0800137030041e980c000410e1006410141f780" + "c0004111103c200041201006410141f780c0004111103c4181802020014114100722024114" + "4604400240200041266a200041da006a2d00003a00002000200029005f3703c80120002000" + "41e4006a2900003700cd01200041306a20002900cd01370000200020002f00583b01242000" + "200028005b360027200020002903c80137002b200542003703002006420037030020034200" + "37030020004200370358200041246a2205411420014120100822024120470d002000413a6a" + "20002d005a3a0000200041d0016a2202200041e7006a290000220a370300200041c7006a20" + "0a370000200041cf006a200041ef006a290000370000200041d7006a200041f7006a2d0000" + "3a0000200020002f01583b01382000200028005b36003b2000200029005f37003f20004138" + "6a4120410010094101418881c0004110103c20064100360200200342003703002000420037" + "03584181802020014114100a411441ee8cc000411c103c2006410036020020034200370300" + "2000420037035841014181802020014114100b4114418a8dc0004114103c20004104360298" + "01200041818020360258200041d8016a2203410036020020024200370300200042003703c8" + "0120014104200041c8016a22064114100c4114419e8dc0004113103c200341003602002002" + "4200370300200042003703c801200120002802980120064114100d411441b18dc000412310" + "3c2003410036020020024200370300200042003703c8014101200120002802980120064114" + "100e411441d48dc000411b103c4189803c100f4120419881c0004110103c4189803c101041" + "2041a881c0004120103c41014189803c1011412041c881c0004118103c2001200028029801" + "1012412041e081c0004117103c20012000280298011013412041f781c0004127103c410120" + "0120002802980110144120419e82c000411f103c200541141015411441bd82c000410b103c" + "200041e0016a220442003703002003420037030020024200370300200042003703c8012001" + "200028029801200641201016412041ef8dc0004113103c41c882c000410c41d482c000410b" + "41df82c000410e1017410141ed82c0004109103c200041b8016a2007290300370300200041" + "b0016a2008290300370300200041a8016a2009290300370300200020002903003703a00120" + "0341003b010020024200370300200042003703c80120054114200041a0016a220741202006" + "41121018411241828ec0004107103c2003410036020020024200370300200042003703c801" + "20074120200641141019411441898ec000410e103c200041003602c8012007412020064104" + "101a410441978ec000410d103c20074120101b410841f682c000410d103c20074120101c41" + "0a418383c0004114103c200041003602c8012007412020064104101d410441a48ec000410e" + "103c419783c000410d20054114101e410041a483c000410d103c419783c000410d41b183c0" + "004108101f410041b983c000410c103c419783c000410d41c583c0004108101f410041cd83" + "c0004111103c417f41041004417141de83c000411e103c200041003602c8012006417f1004" + "417141b28ec000411e103c200041ca016a41003a0000200041003b01c80120064103100441" + "7d41d08ec0004124103c200041003602c8012006418094ebdc031004417341f48ec0004123" + "103c200442003703002003420037030020024200370300200042003703c801200041d894eb" + "dc036a220741082006412041001020417341978fc0004117103c2004420037030020034200" + "37030020024200370300200042003703c80120012000280298012006412041001020417141" + "ae8fc0004119103c4102100f416f41fc83c000411f103c417f20002802980110124171419b" + "84c000411f103c2001417f1012417141ba84c000411f103c20014181201012417441d984c0" + "004120103c20072000280298011012417341f984c000411f103c2007200028029801410110" + "094173419885c0004118103c200120002802980141011009417141b085c000411a103c2004" + "42003703002003420037030020024200370300200042003703c80120072000280298012006" + "41201008417341c78fc0004116103c20044200370300200342003703002002420037030020" + "0042003703c8012001200028029801200641201008417141dd8fc0004118103c2004420037" + "03002003420037030020024200370300200042003703c80120054114200541142007200028" + "029801200641201021417341f58fc000411c103c2004420037030020034200370300200242" + "00370300200042003703c80120054114200541142001200028029801200641201021417141" + "9190c000411e103c200442003703002003420037030020024200370300200042003703c801" + "41959ec00041142007200028029801200641201022417341af90c0004119103c2004420037" + "03002003420037030020024200370300200042003703c80141959ec0004114200120002802" + "9801200641201022417141c890c000411f103c200442003703002003420037030020024200" + "370300200042003703c80141959ec000411441ca85c0004114200641201022417141e790c0" + "004129103c200442003703002003420037030020024200370300200042003703c80141de85" + "c000412841959ec00041142006412010224171419091c0004125103c200041dc016a200041" + "346a280100360200200041d4016a2000412c6a290100370200200020002901243702cc0120" + "0041808080083602c801200041003b01c0012006411841959ec0004114200041c0016a2203" + "41021022417141b591c000410e103c2007200028029801422a10014173418686c000411110" + "3c200041003b01c0014102200341021007416f41c391c000411b103c200041003b01c00141" + "0220034102100a416f41de91c000412b103c200041003b01c0014101410220034102100b41" + "6f418992c0004123103c4102100f416f41fc83c000411f103c41021010416f419786c00041" + "2f103c410141021011416f41c686c0004127103c41e980c0004181201006417441ed86c000" + "411f103c41e980c00041c10010064174418c87c000411a103c200041003b01c00120014181" + "2020034102100c417441ac92c0004121103c200041003b01c001200141812020034102100d" + "417441cd92c0004131103c200041003b01c0014101200141812020034102100e417441fe92" + "c0004129103c20014181201012417441a687c0004125103c20014181201013417441cb87c0" + "004135103c4101200141812010144174418088c000412d103c20014181201015417441ad88" + "c0004119103c419783c00041812041d482c000410b41df82c000410e1017417441ed82c000" + "4109103c419783c000410d41d482c00041812041df82c000410e1017417441ed82c0004109" + "103c419783c000410d41d482c000410b41df82c0004181201017417441ed82c0004109103c" + "200041003b01c0012001418120200341021016417441a793c0004121103c200041003b01c0" + "0141959ec00041812041959ec0004114200341021022417441c893c0004118103c20004100" + "3b01c00120054114200541142001418120200341021023417441e093c000411f103c200041" + "003b01c001200641812020054114200341021024417441ff93c0004122103c419783c00041" + "0d200720002802980141001000417341c688c000410f103c200042d487b6f4c7d4b1c00037" + "00c001419783c000410d200041c095ebdc036a220441081025417341d588c000411c103c41" + "9783c000410d2007200028029801101f417341f188c0004116103c20044108200341081026" + "4173418789c0004118103c200341082004410810264173419f89c0004118103c200041003b" + "01ec012004410820034108200041ec016a2202410241001027417341a194c0004114103c20" + "0041003b01ec0120034108200441082002410241001027417341b594c0004114103c200041" + "003b01ec0120044108200341082002410241001028417341c994c0004119103c200041003b" + "01ec0120034108200441082002410241001028417341e294c0004119103c200041003b01ec" + "0120044108200341082002410241001029417341fb94c0004119103c200041003b01ec0120" + "0341082004410820024102410010294173419495c0004119103c200041003b01ec01200441" + "0820034108200241024100102a417341ad95c0004117103c200041003b01ec012003410820" + "044108200241024100102a417341c495c0004117103c200041003b01ec0120044108410320" + "0241024100102b417341db95c0004114103c200041003b01ec012004410841032002410241" + "00102c417341ef95c0004113103c200041003b01ec0120044108200241024100102d417341" + "8296c0004113103c200120002802980141001009417141b789c0004123103c200041003b01" + "ec012005411420012000280298012002410210184171419596c000411a103c200041003b01" + "ec012001200028029801200241021019417141af96c0004121103c200041003b01ec012001" + "20002802980120024102101a417141d096c0004120103c2001200028029801101b417141da" + "89c0004120103c2001200028029801101c417141fa89c0004127103c200041003602ec0120" + "0120002802980120024104101d417141f096c0004121103c200041003b01ec012001200028" + "0298012002410210084171419197c0004123103c200041003b01ec01200120002802980141" + "0120024102102e417141b497c0004121103c200041003b01ec012001200028029801220420" + "05411420012004200241021023417141d597c0004127103c200041003b01ec012005411420" + "01200028029801220420012004200241021023417141fc97c0004127103c200041003b01ec" + "0120012000280298012005411420024102102f417141a398c0004125103c200041003b01ec" + "0120054114200120002802980120024102102f417141c898c0004125103c200041003b01ec" + "01200120002802980120054114200241021030417141ed98c000412c103c200041003b01ec" + "012005411420012000280298012002410210304171419999c000412c103c200041003b01ec" + "012001200028029801200241021031417141c599c000411f103c200041003b01ec01200120" + "00280298014101200241021032417141e499c0004122103c200041003b01ec012001200028" + "0298012005411441ca85c0004114200241021021417141869ac0004121103c200041003b01" + "ec0120054114200120002802980141ca85c0004114200241021021417141a79ac000412110" + "3c200041003b01ec0120012000280298014101200241021033417141c89ac0004128103c20" + "0041003b01ec01200641182001200028029801200241021024417141f09ac0004123103c20" + "0041003b01ec0120012000280298014101200241021034417141939bc0004125103c200041" + "003b01ec0120012000280298014101200241021035417141b89bc0004121103c200041003b" + "01ec0120012000280298014101200241021036417141d99bc0004122103c200041003b01ec" + "012001200028029801200541144101200241021037417141fb9bc0004124103c200041003b" + "01ec0120054114200120002802980141012002410210374171419f9cc0004124103c200041" + "003b01ec0120012000280298014101200241021038417141c39cc000412f103c200041003b" + "01ec012001200028029801200241021039417141f29cc0004123103c200041003b01ec0120" + "01200028029801410120024102103a417141959dc0004122103c200041003b01ec01200120" + "0028029801410120024102103b417141b79dc0004121103c200041003b01ec012001200028" + "02980141a18ac0004120200241021018417141d89dc000411c103c419783c000410d200120" + "0028029801101e417141c18ac0004122103c419797abdd03410d41a18ac000412041001000" + "417341e38ac0004110103c419797abdd03410d200341081025417341f38ac000411d103c41" + "9797abdd03410d20054114101e417341908bc0004118103c419797abdd03410d41c583c000" + "4108101f417341a88bc0004117103c2001200028029801200141812041001000417441bf8b" + "c000410e103c200141812042011001417441cd8bc0004112103c419783c000418120200341" + "081025417441df8bc000411b103c419783c00041812020054114101e417441fa8bc0004116" + "103c419783c00041812041c583c0004108101f417441908cc0004115103c419783c000410d" + "2001200028029801101f417141a58cc0004119103c200041003b01ec012001200028029801" + "20054114200241021024417141f49dc0004121103c4101410020054114101e410041be8cc0" + "00411a103c200041f0016a240041010f0b0b418080c000410b417f20022002417f4e1bac10" + "01000b0b801e0200418080c0000bde056572726f725f636f64653d54455354204641494c45" + "442424242424205354415254494e47205741534d20455845435554494f4e20242424242467" + "65745f6c65646765725f73716e6765745f706172656e745f6c65646765725f74696d656765" + "745f626173655f666565746573745f616d656e646d656e74616d656e646d656e745f656e61" + "626c656463616368655f6c65646765725f6f626a6765745f74785f61727261795f6c656e67" + "65745f63757272656e745f6c65646765725f6f626a5f61727261795f6c656e6765745f6c65" + "646765725f6f626a5f61727261795f6c656e6765745f74785f6e65737465645f6172726179" + "5f6c656e6765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f617272" + "61795f6c656e6765745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e" + "7570646174655f6461746174657374206d65737361676574657374207075626b6579746573" + "74207369676e6174757265636865636b5f7369676765745f6e66745f666c6167736765745f" + "6e66745f7472616e736665725f66656574657374696e6720747261636574726163655f6163" + "636f756e74400000000000005f74726163655f616d6f756e74400000000000000074726163" + "655f616d6f756e745f7a65726f6765745f706172656e745f6c65646765725f686173685f6e" + "65675f7074726765745f74785f61727261795f6c656e5f696e76616c69645f736669656c64" + "6765745f74785f6e65737465645f61727261795f6c656e5f6e65675f7074726765745f7478" + "5f6e65737465645f61727261795f6c656e5f6e65675f6c656e6765745f74785f6e65737465" + "645f61727261795f6c656e5f746f6f5f6c6f6e676765745f74785f6e65737465645f617272" + "61795f6c656e5f7074725f6f6f6263616368655f6c65646765725f6f626a5f7074725f6f6f" + "6263616368655f6c65646765725f6f626a5f77726f6e675f6c656e55534430303030303030" + "3030303030303030303000418686c0000b8f1874726163655f6e756d5f6f6f625f73747267" + "65745f63757272656e745f6c65646765725f6f626a5f61727261795f6c656e5f696e76616c" + "69645f736669656c646765745f6c65646765725f6f626a5f61727261795f6c656e5f696e76" + "616c69645f736669656c64616d656e646d656e745f656e61626c65645f746f6f5f6269675f" + "736c696365616d656e646d656e745f656e61626c65645f746f6f5f6c6f6e676765745f7478" + "5f6e65737465645f61727261795f6c656e5f746f6f5f6269675f736c6963656765745f6375" + "7272656e745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e5f746f6f" + "5f6269675f736c6963656765745f6c65646765725f6f626a5f6e65737465645f6172726179" + "5f6c656e5f746f6f5f6269675f736c6963657570646174655f646174615f746f6f5f626967" + "5f736c69636574726163655f6f6f625f736c69636574726163655f6f70617175655f666c6f" + "61745f6f6f625f736c69636574726163655f616d6f756e745f6f6f625f736c696365666c6f" + "61745f636f6d706172655f6f6f625f736c69636531666c6f61745f636f6d706172655f6f6f" + "625f736c6963653263616368655f6c65646765725f6f626a5f77726f6e675f73697a655f75" + "696e743235366765745f6e66745f666c6167735f77726f6e675f73697a655f75696e743235" + "366765745f6e66745f7472616e736665725f6665655f77726f6e675f73697a655f75696e74" + "32353630303030303030303030303030303030303030303030303030303030303030317472" + "6163655f6163636f756e745f77726f6e675f73697a655f6163636f756e7469647472616365" + "5f6f6f625f737472696e6774726163655f6f70617175655f666c6f61745f6f6f625f737472" + "696e6774726163655f6163636f756e745f6f6f625f737472696e6774726163655f616d6f75" + "6e745f6f6f625f737472696e6774726163655f746f6f5f6c6f6e6774726163655f6e756d5f" + "746f6f5f6c6f6e6774726163655f6f70617175655f666c6f61745f746f6f5f6c6f6e677472" + "6163655f6163636f756e745f746f6f5f6c6f6e6774726163655f616d6f756e745f746f6f5f" + "6c6f6e6774726163655f616d6f756e745f77726f6e675f6c656e67746874726163655f6163" + "636f756e745f636865636b5f646573796e636765745f706172656e745f6c65646765725f68" + "6173686765745f63757272656e745f6c65646765725f6f626a5f6669656c646765745f6c65" + "646765725f6f626a5f6669656c646765745f74785f6e65737465645f6669656c646765745f" + "63757272656e745f6c65646765725f6f626a5f6e65737465645f6669656c646765745f6c65" + "646765725f6f626a5f6e65737465645f6669656c64636f6d707574655f7368613531325f68" + "616c666765745f6e66746765745f6e66745f6973737565726765745f6e66745f7461786f6e" + "6765745f6e66745f73657269616c6765745f706172656e745f6c65646765725f686173685f" + "6e65675f6c656e6765745f706172656e745f6c65646765725f686173685f6275665f746f6f" + "5f736d616c6c6765745f706172656e745f6c65646765725f686173685f6c656e5f746f6f5f" + "6c6f6e67666c6f61745f66726f6d5f75696e745f6c656e5f6f6f62666c6f61745f66726f6d" + "5f75696e745f77726f6e675f6c656e6163636f756e745f6b65796c65745f6c656e5f6f6f62" + "6163636f756e745f6b65796c65745f77726f6e675f6c656e6c696e655f6b65796c65745f6c" + "656e5f6f6f625f63757272656e63796c696e655f6b65796c65745f77726f6e675f6c656e5f" + "63757272656e6379616d6d5f6b65796c65745f6c656e5f6f6f625f617373657432616d6d5f" + "6b65796c65745f6c656e5f77726f6e675f6c656e5f617373657432616d6d5f6b65796c6574" + "5f6c656e5f77726f6e675f6e6f6e5f7872705f63757272656e63795f6c656e616d6d5f6b65" + "796c65745f6c656e5f77726f6e675f7872705f63757272656e63795f6c656e616d6d5f6b65" + "796c65745f6d70746765745f74785f6669656c645f696e76616c69645f736669656c646765" + "745f63757272656e745f6c65646765725f6f626a5f6669656c645f696e76616c69645f7366" + "69656c646765745f6c65646765725f6f626a5f6669656c645f696e76616c69645f73666965" + "6c646765745f74785f6e65737465645f6669656c645f746f6f5f6269675f736c6963656765" + "745f63757272656e745f6c65646765725f6f626a5f6e65737465645f6669656c645f746f6f" + "5f6269675f736c6963656765745f6c65646765725f6f626a5f6e65737465645f6669656c64" + "5f746f6f5f6269675f736c696365636f6d707574655f7368613531325f68616c665f746f6f" + "5f6269675f736c696365616d6d5f6b65796c65745f746f6f5f6269675f736c696365637265" + "64656e7469616c5f6b65796c65745f746f6f5f6269675f736c6963656d70746f6b656e5f6b" + "65796c65745f746f6f5f6269675f736c6963655f6d70746964666c6f61745f6164645f6f6f" + "625f736c69636531666c6f61745f6164645f6f6f625f736c69636532666c6f61745f737562" + "74726163745f6f6f625f736c69636531666c6f61745f73756274726163745f6f6f625f736c" + "69636532666c6f61745f6d756c7469706c795f6f6f625f736c69636531666c6f61745f6d75" + "6c7469706c795f6f6f625f736c69636532666c6f61745f6469766964655f6f6f625f736c69" + "636531666c6f61745f6469766964655f6f6f625f736c69636532666c6f61745f726f6f745f" + "6f6f625f736c696365666c6f61745f706f775f6f6f625f736c696365666c6f61745f6c6f67" + "5f6f6f625f736c6963656765745f6e66745f77726f6e675f73697a655f75696e7432353667" + "65745f6e66745f6973737565725f77726f6e675f73697a655f75696e743235366765745f6e" + "66745f7461786f6e5f77726f6e675f73697a655f75696e743235366765745f6e66745f7365" + "7269616c5f77726f6e675f73697a655f75696e743235366163636f756e745f6b65796c6574" + "5f77726f6e675f73697a655f6163636f756e746964636865636b5f6b65796c65745f77726f" + "6e675f73697a655f6163636f756e74696463726564656e7469616c5f6b65796c65745f7772" + "6f6e675f73697a655f6163636f756e7469643163726564656e7469616c5f6b65796c65745f" + "77726f6e675f73697a655f6163636f756e7469643264656c65676174655f6b65796c65745f" + "77726f6e675f73697a655f6163636f756e7469643164656c65676174655f6b65796c65745f" + "77726f6e675f73697a655f6163636f756e746964326465706f7369745f707265617574685f" + "6b65796c65745f77726f6e675f73697a655f6163636f756e746964316465706f7369745f70" + "7265617574685f6b65796c65745f77726f6e675f73697a655f6163636f756e746964326469" + "645f6b65796c65745f77726f6e675f73697a655f6163636f756e746964657363726f775f6b" + "65796c65745f77726f6e675f73697a655f6163636f756e7469646c696e655f6b65796c6574" + "5f77726f6e675f73697a655f6163636f756e746964316c696e655f6b65796c65745f77726f" + "6e675f73697a655f6163636f756e746964326d70745f69737375616e63655f6b65796c6574" + "5f77726f6e675f73697a655f6163636f756e7469646d70746f6b656e5f6b65796c65745f77" + "726f6e675f73697a655f6163636f756e7469646e66745f6f666665725f6b65796c65745f77" + "726f6e675f73697a655f6163636f756e7469646f666665725f6b65796c65745f77726f6e67" + "5f73697a655f6163636f756e7469646f7261636c655f6b65796c65745f77726f6e675f7369" + "7a655f6163636f756e7469647061796368616e5f6b65796c65745f77726f6e675f73697a65" + "5f6163636f756e746964317061796368616e5f6b65796c65745f77726f6e675f73697a655f" + "6163636f756e746964327065726d697373696f6e65645f646f6d61696e5f6b65796c65745f" + "77726f6e675f73697a655f6163636f756e7469647369676e6572735f6b65796c65745f7772" + "6f6e675f73697a655f6163636f756e7469647469636b65745f6b65796c65745f77726f6e67" + "5f73697a655f6163636f756e7469647661756c745f6b65796c65745f77726f6e675f73697a" + "655f6163636f756e7469646765745f6e66745f77726f6e675f73697a655f6163636f756e74" + "69646d70746f6b656e5f6b65796c65745f6d707469645f77726f6e675f6c656e677468004d" + "0970726f64756365727302086c616e6775616765010452757374000c70726f636573736564" + "2d6279010572757374631d312e38372e30202831373036376539616320323032352d30352d" + "303929002c0f7461726765745f6665617475726573022b0f6d757461626c652d676c6f6261" + "6c732b087369676e2d657874"; extern std::string const floatTestsWasmHex = "0061736d0100000001430860077f7f7f7f7f7f7f017f60057f7f7f7f7f017f60047f7f7f7f" diff --git a/src/test/beast/beast_CurrentThreadName_test.cpp b/src/test/beast/beast_CurrentThreadName_test.cpp index dc12883a63..918d426979 100644 --- a/src/test/beast/beast_CurrentThreadName_test.cpp +++ b/src/test/beast/beast_CurrentThreadName_test.cpp @@ -88,20 +88,15 @@ public: BEAST_EXPECT(stateB == 2); } #if BOOST_OS_LINUX - // On Linux, verify that thread names longer than 15 characters - // are truncated to 15 characters (the 16th character is reserved for - // the null terminator). + // On Linux, verify that thread names within the 15 character limit + // are set correctly (the 16th character is reserved for the null + // terminator). { testName( "123456789012345", - "123456789012345"); // 15 chars, no truncation - testName( - "1234567890123456", "123456789012345"); // 16 chars, truncated - testName( - "ThisIsAVeryLongThreadNameExceedingLimit", - "ThisIsAVeryLong"); // 39 chars, truncated + "123456789012345"); // 15 chars, maximum allowed testName("", ""); // empty name - testName("short", "short"); // short name, no truncation + testName("short", "short"); // short name } #endif } diff --git a/src/test/core/Coroutine_test.cpp b/src/test/core/Coroutine_test.cpp index 72a4c02434..761fd46915 100644 --- a/src/test/core/Coroutine_test.cpp +++ b/src/test/core/Coroutine_test.cpp @@ -56,7 +56,7 @@ public: gate g1, g2; std::shared_ptr c; env.app().getJobQueue().postCoro( - jtCLIENT, "Coroutine-Test", [&](auto const& cr) { + jtCLIENT, "CoroTest", [&](auto const& cr) { c = cr; g1.signal(); c->yield(); @@ -83,7 +83,7 @@ public: gate g; env.app().getJobQueue().postCoro( - jtCLIENT, "Coroutine-Test", [&](auto const& c) { + jtCLIENT, "CoroTest", [&](auto const& c) { c->post(); c->yield(); g.signal(); @@ -109,7 +109,7 @@ public: BEAST_EXPECT(*lv == -1); gate g; - jq.addJob(jtCLIENT, "LocalValue-Test", [&]() { + jq.addJob(jtCLIENT, "LocalValTest", [&]() { this->BEAST_EXPECT(*lv == -1); *lv = -2; this->BEAST_EXPECT(*lv == -2); @@ -120,7 +120,7 @@ public: for (int i = 0; i < N; ++i) { - jq.postCoro(jtCLIENT, "Coroutine-Test", [&, id = i](auto const& c) { + jq.postCoro(jtCLIENT, "CoroTest", [&, id = i](auto const& c) { a[id] = c; g.signal(); c->yield(); @@ -148,7 +148,7 @@ public: c->join(); } - jq.addJob(jtCLIENT, "LocalValue-Test", [&]() { + jq.addJob(jtCLIENT, "LocalValTest", [&]() { this->BEAST_EXPECT(*lv == -2); g.signal(); }); diff --git a/src/xrpld/app/consensus/RCLConsensus.cpp b/src/xrpld/app/consensus/RCLConsensus.cpp index 99cc140056..654c2a8990 100644 --- a/src/xrpld/app/consensus/RCLConsensus.cpp +++ b/src/xrpld/app/consensus/RCLConsensus.cpp @@ -119,9 +119,7 @@ RCLConsensus::Adaptor::acquireLedger(LedgerHash const& hash) acquiringLedger_ = hash; app_.getJobQueue().addJob( - jtADVANCE, - "getConsensusLedger1", - [id = hash, &app = app_, this]() { + jtADVANCE, "GetConsL1", [id = hash, &app = app_, this]() { JLOG(j_.debug()) << "JOB advanceLedger getConsensusLedger1 started"; app.getInboundLedgers().acquireAsync( @@ -420,7 +418,7 @@ RCLConsensus::Adaptor::onAccept( { app_.getJobQueue().addJob( jtACCEPT, - "acceptLedger", + "AcceptLedger", [=, this, cj = std::move(consensusJson)]() mutable { // Note that no lock is held or acquired during this job. // This is because generic Consensus guarantees that once a ledger diff --git a/src/xrpld/app/consensus/RCLValidations.cpp b/src/xrpld/app/consensus/RCLValidations.cpp index eb10765ba3..6438334106 100644 --- a/src/xrpld/app/consensus/RCLValidations.cpp +++ b/src/xrpld/app/consensus/RCLValidations.cpp @@ -122,13 +122,11 @@ RCLValidationsAdaptor::acquire(LedgerHash const& hash) Application* pApp = &app_; - app_.getJobQueue().addJob( - jtADVANCE, "getConsensusLedger2", [pApp, hash, this]() { - JLOG(j_.debug()) - << "JOB advanceLedger getConsensusLedger2 started"; - pApp->getInboundLedgers().acquireAsync( - hash, 0, InboundLedger::Reason::CONSENSUS); - }); + app_.getJobQueue().addJob(jtADVANCE, "GetConsL2", [pApp, hash, this]() { + JLOG(j_.debug()) << "JOB advanceLedger getConsensusLedger2 started"; + pApp->getInboundLedgers().acquireAsync( + hash, 0, InboundLedger::Reason::CONSENSUS); + }); return std::nullopt; } diff --git a/src/xrpld/app/ledger/ConsensusTransSetSF.cpp b/src/xrpld/app/ledger/ConsensusTransSetSF.cpp index b52cee2927..6678ee6334 100644 --- a/src/xrpld/app/ledger/ConsensusTransSetSF.cpp +++ b/src/xrpld/app/ledger/ConsensusTransSetSF.cpp @@ -46,7 +46,7 @@ ConsensusTransSetSF::gotNode( "xrpl::ConsensusTransSetSF::gotNode : transaction hash " "match"); auto const pap = &app_; - app_.getJobQueue().addJob(jtTRANSACTION, "TXS->TXN", [pap, stx]() { + app_.getJobQueue().addJob(jtTRANSACTION, "TxsToTxn", [pap, stx]() { pap->getOPs().submitTransaction(stx); }); } diff --git a/src/xrpld/app/ledger/OrderBookDB.cpp b/src/xrpld/app/ledger/OrderBookDB.cpp index 47b04f3d2c..5963c00c5a 100644 --- a/src/xrpld/app/ledger/OrderBookDB.cpp +++ b/src/xrpld/app/ledger/OrderBookDB.cpp @@ -48,9 +48,9 @@ OrderBookDB::setup(std::shared_ptr const& ledger) update(ledger); else app_.getJobQueue().addJob( - jtUPDATE_PF, - "OrderBookDB::update: " + std::to_string(ledger->seq()), - [this, ledger]() { update(ledger); }); + jtUPDATE_PF, "OrderBookUpd", [this, ledger]() { + update(ledger); + }); } } diff --git a/src/xrpld/app/ledger/detail/InboundLedger.cpp b/src/xrpld/app/ledger/detail/InboundLedger.cpp index 1f5e5cc7b6..710173cd17 100644 --- a/src/xrpld/app/ledger/detail/InboundLedger.cpp +++ b/src/xrpld/app/ledger/detail/InboundLedger.cpp @@ -454,7 +454,7 @@ InboundLedger::done() // We hold the PeerSet lock, so must dispatch app_.getJobQueue().addJob( - jtLEDGER_DATA, "AcquisitionDone", [self = shared_from_this()]() { + jtLEDGER_DATA, "AcqDone", [self = shared_from_this()]() { if (self->complete_ && !self->failed_) { self->app_.getLedgerMaster().checkAccept(self->getLedger()); diff --git a/src/xrpld/app/ledger/detail/InboundLedgers.cpp b/src/xrpld/app/ledger/detail/InboundLedgers.cpp index 445786eb63..fd2cde698e 100644 --- a/src/xrpld/app/ledger/detail/InboundLedgers.cpp +++ b/src/xrpld/app/ledger/detail/InboundLedgers.cpp @@ -192,7 +192,7 @@ public: // dispatch if (ledger->gotData(std::weak_ptr(peer), packet)) app_.getJobQueue().addJob( - jtLEDGER_DATA, "processLedgerData", [ledger]() { + jtLEDGER_DATA, "ProcessLData", [ledger]() { ledger->runData(); }); @@ -207,7 +207,7 @@ public: if (packet->type() == protocol::liAS_NODE) { app_.getJobQueue().addJob( - jtLEDGER_DATA, "gotStaleData", [this, packet]() { + jtLEDGER_DATA, "GotStaleData", [this, packet]() { gotStaleData(packet); }); } diff --git a/src/xrpld/app/ledger/detail/LedgerDeltaAcquire.cpp b/src/xrpld/app/ledger/detail/LedgerDeltaAcquire.cpp index 5b642ba3db..6909c45328 100644 --- a/src/xrpld/app/ledger/detail/LedgerDeltaAcquire.cpp +++ b/src/xrpld/app/ledger/detail/LedgerDeltaAcquire.cpp @@ -21,7 +21,7 @@ LedgerDeltaAcquire::LedgerDeltaAcquire( ledgerHash, LedgerReplayParameters::SUB_TASK_TIMEOUT, {jtREPLAY_TASK, - "LedgerReplayDelta", + "LedReplDelta", LedgerReplayParameters::MAX_QUEUED_TASKS}, app.journal("LedgerReplayDelta")) , inboundLedgers_(inboundLedgers) @@ -225,7 +225,7 @@ LedgerDeltaAcquire::onLedgerBuilt( } app_.getJobQueue().addJob( jtREPLAY_TASK, - "onLedgerBuilt", + "OnLedBuilt", [=, ledger = this->fullLedger_, &app = this->app_]() { for (auto reason : reasons) { diff --git a/src/xrpld/app/ledger/detail/LedgerMaster.cpp b/src/xrpld/app/ledger/detail/LedgerMaster.cpp index d176e85645..65421c9bd8 100644 --- a/src/xrpld/app/ledger/detail/LedgerMaster.cpp +++ b/src/xrpld/app/ledger/detail/LedgerMaster.cpp @@ -1344,7 +1344,7 @@ LedgerMaster::tryAdvance() if (!mAdvanceThread && !mValidLedger.empty()) { mAdvanceThread = true; - app_.getJobQueue().addJob(jtADVANCE, "advanceLedger", [this]() { + app_.getJobQueue().addJob(jtADVANCE, "AdvanceLedger", [this]() { std::unique_lock sl(m_mutex); XRPL_ASSERT( @@ -1482,7 +1482,7 @@ bool LedgerMaster::newPathRequest() { std::unique_lock ml(m_mutex); - mPathFindNewRequest = newPFWork("pf:newRequest", ml); + mPathFindNewRequest = newPFWork("PthFindNewReq", ml); return mPathFindNewRequest; } @@ -1503,7 +1503,7 @@ LedgerMaster::newOrderBookDB() std::unique_lock ml(m_mutex); mPathLedger.reset(); - return newPFWork("pf:newOBDB", ml); + return newPFWork("PthFindOBDB", ml); } /** A thread needs to be dispatched to handle pathfinding work of some kind. @@ -1841,7 +1841,7 @@ LedgerMaster::fetchForHistory( mFillInProgress = seq; } app_.getJobQueue().addJob( - jtADVANCE, "tryFill", [this, ledger]() { + jtADVANCE, "TryFill", [this, ledger]() { tryFill(ledger); }); } @@ -1980,7 +1980,7 @@ LedgerMaster::doAdvance(std::unique_lock& sl) } app_.getOPs().clearNeedNetworkLedger(); - progress = newPFWork("pf:newLedger", sl); + progress = newPFWork("PthFindNewLed", sl); } if (progress) mAdvanceWork = true; @@ -2011,7 +2011,7 @@ LedgerMaster::gotFetchPack(bool progress, std::uint32_t seq) { if (!mGotFetchPackThread.test_and_set(std::memory_order_acquire)) { - app_.getJobQueue().addJob(jtLEDGER_DATA, "gotFetchPack", [&]() { + app_.getJobQueue().addJob(jtLEDGER_DATA, "GotFetchPack", [&]() { app_.getInboundLedgers().gotFetchPack(); mGotFetchPackThread.clear(std::memory_order_release); }); diff --git a/src/xrpld/app/ledger/detail/LedgerReplayTask.cpp b/src/xrpld/app/ledger/detail/LedgerReplayTask.cpp index cd174b098f..c31aba6c43 100644 --- a/src/xrpld/app/ledger/detail/LedgerReplayTask.cpp +++ b/src/xrpld/app/ledger/detail/LedgerReplayTask.cpp @@ -77,7 +77,7 @@ LedgerReplayTask::LedgerReplayTask( parameter.finishHash_, LedgerReplayParameters::TASK_TIMEOUT, {jtREPLAY_TASK, - "LedgerReplayTask", + "LedReplTask", LedgerReplayParameters::MAX_QUEUED_TASKS}, app.journal("LedgerReplayTask")) , inboundLedgers_(inboundLedgers) diff --git a/src/xrpld/app/ledger/detail/SkipListAcquire.cpp b/src/xrpld/app/ledger/detail/SkipListAcquire.cpp index 5f4b0dc339..09d0ba1ea6 100644 --- a/src/xrpld/app/ledger/detail/SkipListAcquire.cpp +++ b/src/xrpld/app/ledger/detail/SkipListAcquire.cpp @@ -16,7 +16,7 @@ SkipListAcquire::SkipListAcquire( ledgerHash, LedgerReplayParameters::SUB_TASK_TIMEOUT, {jtREPLAY_TASK, - "SkipListAcquire", + "SkipListAcq", LedgerReplayParameters::MAX_QUEUED_TASKS}, app.journal("LedgerReplaySkipList")) , inboundLedgers_(inboundLedgers) diff --git a/src/xrpld/app/ledger/detail/TransactionAcquire.cpp b/src/xrpld/app/ledger/detail/TransactionAcquire.cpp index 3cd0e84ef0..6b22c6ca8b 100644 --- a/src/xrpld/app/ledger/detail/TransactionAcquire.cpp +++ b/src/xrpld/app/ledger/detail/TransactionAcquire.cpp @@ -27,7 +27,7 @@ TransactionAcquire::TransactionAcquire( app, hash, TX_ACQUIRE_TIMEOUT, - {jtTXN_DATA, "TransactionAcquire", {}}, + {jtTXN_DATA, "TxAcq", {}}, app.journal("TransactionAcquire")) , mHaveRoot(false) , mPeerSet(std::move(peerSet)) @@ -60,7 +60,7 @@ TransactionAcquire::done() // just updates the consensus and related structures when we acquire // a transaction set. No need to update them if we're shutting down. app_.getJobQueue().addJob( - jtTXN_DATA, "completeAcquire", [pap, hash, map]() { + jtTXN_DATA, "ComplAcquire", [pap, hash, map]() { pap->getInboundTransactions().giveSet(hash, map, true); }); } diff --git a/src/xrpld/app/main/Main.cpp b/src/xrpld/app/main/Main.cpp index 7c138168e4..d8bc601744 100644 --- a/src/xrpld/app/main/Main.cpp +++ b/src/xrpld/app/main/Main.cpp @@ -331,8 +331,7 @@ run(int argc, char** argv) { using namespace std; - beast::setCurrentThreadName( - "rippled: main " + BuildInfo::getVersionString()); + beast::setCurrentThreadName("main"); po::variables_map vm; diff --git a/src/xrpld/app/main/NodeStoreScheduler.cpp b/src/xrpld/app/main/NodeStoreScheduler.cpp index 221c1f098e..0e02a092f8 100644 --- a/src/xrpld/app/main/NodeStoreScheduler.cpp +++ b/src/xrpld/app/main/NodeStoreScheduler.cpp @@ -12,9 +12,8 @@ NodeStoreScheduler::scheduleTask(NodeStore::Task& task) if (jobQueue_.isStopped()) return; - if (!jobQueue_.addJob(jtWRITE, "NodeObject::store", [&task]() { - task.performScheduledTask(); - })) + if (!jobQueue_.addJob( + jtWRITE, "NObjStore", [&task]() { task.performScheduledTask(); })) { // Job not added, presumably because we're shutting down. // Recover by executing the task synchronously. diff --git a/src/xrpld/app/misc/FeeVoteImpl.cpp b/src/xrpld/app/misc/FeeVoteImpl.cpp index 35cc735a8e..767dbc1c91 100644 --- a/src/xrpld/app/misc/FeeVoteImpl.cpp +++ b/src/xrpld/app/misc/FeeVoteImpl.cpp @@ -107,21 +107,20 @@ FeeVoteImpl::doValidation( // Values should always be in a valid range (because the voting process // will ignore out-of-range values) but if we detect such a case, we do // not send a value. + auto vote = [&v, this]( + auto const current, + auto target, + char const* name, + auto const& sfield) { + if (current != target) + { + JLOG(journal_.info()) << "Voting for " << name << " of " << target; + + v[sfield] = target; + } + }; if (rules.enabled(featureXRPFees)) { - auto vote = [&v, this]( - auto const current, - XRPAmount target, - char const* name, - auto const& sfield) { - if (current != target) - { - JLOG(journal_.info()) - << "Voting for " << name << " of " << target; - - v[sfield] = target; - } - }; vote(lastFees.base, target_.reference_fee, "base fee", sfBaseFeeDrops); vote( lastFees.reserve, @@ -142,12 +141,12 @@ FeeVoteImpl::doValidation( auto to64 = [](XRPAmount target) { return target.dropsAs(); }; - auto vote = [&v, this]( - auto const current, - XRPAmount target, - auto const& convertCallback, - char const* name, - auto const& sfield) { + auto voteAndConvert = [&v, this]( + auto const current, + XRPAmount target, + auto const& convertCallback, + char const* name, + auto const& sfield) { if (current != target) { JLOG(journal_.info()) @@ -158,14 +157,15 @@ FeeVoteImpl::doValidation( } }; - vote(lastFees.base, target_.reference_fee, to64, "base fee", sfBaseFee); - vote( + voteAndConvert( + lastFees.base, target_.reference_fee, to64, "base fee", sfBaseFee); + voteAndConvert( lastFees.reserve, target_.account_reserve, to32, "base reserve", sfReserveBase); - vote( + voteAndConvert( lastFees.increment, target_.owner_reserve, to32, @@ -174,19 +174,6 @@ FeeVoteImpl::doValidation( } if (rules.enabled(featureSmartEscrow)) { - auto vote = [&v, this]( - auto const current, - std::uint32_t target, - char const* name, - auto const& sfield) { - if (current != target) - { - JLOG(journal_.info()) - << "Voting for " << name << " of " << target; - - v[sfield] = target; - } - }; vote( lastFees.extensionComputeLimit, target_.extension_compute_limit, diff --git a/src/xrpld/app/misc/NetworkOPs.cpp b/src/xrpld/app/misc/NetworkOPs.cpp index 6b3c54d1e6..bb5352358d 100644 --- a/src/xrpld/app/misc/NetworkOPs.cpp +++ b/src/xrpld/app/misc/NetworkOPs.cpp @@ -981,7 +981,7 @@ NetworkOPsImp::setHeartbeatTimer() heartbeatTimer_, mConsensus.parms().ledgerGRANULARITY, [this]() { - m_job_queue.addJob(jtNETOP_TIMER, "NetOPs.heartbeat", [this]() { + m_job_queue.addJob(jtNETOP_TIMER, "NetHeart", [this]() { processHeartbeatTimer(); }); }, @@ -997,7 +997,7 @@ NetworkOPsImp::setClusterTimer() clusterTimer_, 10s, [this]() { - m_job_queue.addJob(jtNETOP_CLUSTER, "NetOPs.cluster", [this]() { + m_job_queue.addJob(jtNETOP_CLUSTER, "NetCluster", [this]() { processClusterTimer(); }); }, @@ -1225,7 +1225,7 @@ NetworkOPsImp::submitTransaction(std::shared_ptr const& iTrans) auto tx = std::make_shared(trans, reason, app_); - m_job_queue.addJob(jtTRANSACTION, "submitTxn", [this, tx]() { + m_job_queue.addJob(jtTRANSACTION, "SubmitTxn", [this, tx]() { auto t = tx; processTransaction(t, false, false, FailHard::no); }); @@ -1323,7 +1323,7 @@ NetworkOPsImp::doTransactionAsync( if (mDispatchState == DispatchState::none) { if (m_job_queue.addJob( - jtBATCH, "transactionBatch", [this]() { transactionBatch(); })) + jtBATCH, "TxBatchAsync", [this]() { transactionBatch(); })) { mDispatchState = DispatchState::scheduled; } @@ -1370,7 +1370,7 @@ NetworkOPsImp::doTransactionSyncBatch( if (mTransactions.size()) { // More transactions need to be applied, but by another job. - if (m_job_queue.addJob(jtBATCH, "transactionBatch", [this]() { + if (m_job_queue.addJob(jtBATCH, "TxBatchSync", [this]() { transactionBatch(); })) { @@ -3244,19 +3244,16 @@ NetworkOPsImp::reportFeeChange() if (f != mLastFeeSummary) { m_job_queue.addJob( - jtCLIENT_FEE_CHANGE, "reportFeeChange->pubServer", [this]() { - pubServer(); - }); + jtCLIENT_FEE_CHANGE, "PubFee", [this]() { pubServer(); }); } } void NetworkOPsImp::reportConsensusStateChange(ConsensusPhase phase) { - m_job_queue.addJob( - jtCLIENT_CONSENSUS, - "reportConsensusStateChange->pubConsensus", - [this, phase]() { pubConsensus(phase); }); + m_job_queue.addJob(jtCLIENT_CONSENSUS, "PubCons", [this, phase]() { + pubConsensus(phase); + }); } inline void @@ -3764,7 +3761,7 @@ NetworkOPsImp::addAccountHistoryJob(SubAccountHistoryInfoWeak subInfo) app_.getJobQueue().addJob( jtCLIENT_ACCT_HIST, - "AccountHistoryTxStream", + "HistTxStream", [this, dbType = databaseType, subInfo]() { auto const& accountId = subInfo.index_->accountId_; auto& lastLedgerSeq = subInfo.index_->historyLastLedgerSeq_; diff --git a/src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp b/src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp index 10f0d4a03e..6b956de8a0 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp @@ -118,15 +118,18 @@ locateField(STObject const& obj, Slice const& locator) if (locator.empty() || (locator.size() & 3)) // must be multiple of 4 return Unexpected(HostFunctionError::LOCATOR_MALFORMED); + static_assert(maxWasmParamLength % sizeof(int32_t) == 0); int32_t locBuf[maxWasmParamLength / sizeof(int32_t)]; int32_t const* locPtr = &locBuf[0]; int32_t const locSize = locator.size() / sizeof(int32_t); - uintptr_t p = reinterpret_cast(locator.data()); - if (p & (alignof(int32_t) - 1)) // unaligned - memcpy(&locBuf[0], locator.data(), locator.size()); - else - locPtr = reinterpret_cast(locator.data()); + { + uintptr_t const p = reinterpret_cast(locator.data()); + if (p & (alignof(int32_t) - 1)) // unaligned + memcpy(&locBuf[0], locator.data(), locator.size()); + else + locPtr = reinterpret_cast(locator.data()); + } STBase const* field = nullptr; auto const& knownSFields = SField::getKnownCodeToField(); diff --git a/src/xrpld/app/wasm/detail/HostFuncImplTrace.cpp b/src/xrpld/app/wasm/detail/HostFuncImplTrace.cpp index ddf4cde0e5..31e90df7ab 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImplTrace.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImplTrace.cpp @@ -15,8 +15,6 @@ WasmHostFunctionsImpl::trace( Slice const& data, bool asHex) { - auto const ret = msg.size() + data.size() * (asHex ? 2 : 1); - if (!asHex) { log(msg, [&data] { @@ -35,15 +33,14 @@ WasmHostFunctionsImpl::trace( }); } - return ret; + return 0; } Expected WasmHostFunctionsImpl::traceNum(std::string_view const& msg, int64_t data) { - auto const ret = msg.size() + sizeof(data); log(msg, [data] { return data; }); - return ret; + return 0; } Expected @@ -51,9 +48,8 @@ WasmHostFunctionsImpl::traceAccount( std::string_view const& msg, AccountID const& account) { - auto const ret = msg.size() + account.size(); log(msg, [&account] { return toBase58(account); }); - return ret; + return 0; } Expected @@ -61,9 +57,8 @@ WasmHostFunctionsImpl::traceFloat( std::string_view const& msg, Slice const& data) { - auto const ret = msg.size() + data.size(); log(msg, [&data] { return wasm_float::floatToString(data); }); - return ret; + return 0; } Expected @@ -71,9 +66,8 @@ WasmHostFunctionsImpl::traceAmount( std::string_view const& msg, STAmount const& amount) { - auto const ret = msg.size(); log(msg, [&amount] { return amount.getFullText(); }); - return ret; + return 0; } } // namespace xrpl diff --git a/src/xrpld/app/wasm/detail/WasmiVM.cpp b/src/xrpld/app/wasm/detail/WasmiVM.cpp index 037f787a26..fa2e2fe085 100644 --- a/src/xrpld/app/wasm/detail/WasmiVM.cpp +++ b/src/xrpld/app/wasm/detail/WasmiVM.cpp @@ -874,8 +874,11 @@ WasmiEngine::runHlp( throw std::runtime_error( "<" + std::string(funcName) + "> return nothing"); // LCOV_EXCL_LINE + else if (res.r.vec_.data[0].kind != WASM_I32) + throw std::runtime_error( + "<" + std::string(funcName) + "> return type mismatch, ret: " + + std::to_string(static_cast(res.r.vec_.data[0].kind))); - assert(res.r.vec_.data[0].kind == WASM_I32); if (gas == -1) gas = std::numeric_limits::max(); WasmResult const ret{ diff --git a/src/xrpld/overlay/detail/PeerImp.cpp b/src/xrpld/overlay/detail/PeerImp.cpp index b64227288c..327a5a4f21 100644 --- a/src/xrpld/overlay/detail/PeerImp.cpp +++ b/src/xrpld/overlay/detail/PeerImp.cpp @@ -1158,7 +1158,7 @@ PeerImp::onMessage(std::shared_ptr const& m) fee_.update(Resource::feeModerateBurdenPeer, "oversize"); app_.getJobQueue().addJob( - jtMANIFEST, "receiveManifests", [this, that = shared_from_this(), m]() { + jtMANIFEST, "RcvManifests", [this, that = shared_from_this(), m]() { overlay_.onManifests(m, that); }); } @@ -1452,7 +1452,7 @@ PeerImp::handleTransaction( { app_.getJobQueue().addJob( jtTRANSACTION, - "recvTransaction->checkTransaction", + "RcvCheckTx", [weak = std::weak_ptr(shared_from_this()), flags, checkSignature, @@ -1555,7 +1555,7 @@ PeerImp::onMessage(std::shared_ptr const& m) // Queue a job to process the request std::weak_ptr weak = shared_from_this(); - app_.getJobQueue().addJob(jtLEDGER_REQ, "recvGetLedger", [weak, m]() { + app_.getJobQueue().addJob(jtLEDGER_REQ, "RcvGetLedger", [weak, m]() { if (auto peer = weak.lock()) peer->processLedgerRequest(m); }); @@ -1575,29 +1575,27 @@ PeerImp::onMessage(std::shared_ptr const& m) fee_.update( Resource::feeModerateBurdenPeer, "received a proof path request"); std::weak_ptr weak = shared_from_this(); - app_.getJobQueue().addJob( - jtREPLAY_REQ, "recvProofPathRequest", [weak, m]() { - if (auto peer = weak.lock()) + app_.getJobQueue().addJob(jtREPLAY_REQ, "RcvProofPReq", [weak, m]() { + if (auto peer = weak.lock()) + { + auto reply = + peer->ledgerReplayMsgHandler_.processProofPathRequest(m); + if (reply.has_error()) { - auto reply = - peer->ledgerReplayMsgHandler_.processProofPathRequest(m); - if (reply.has_error()) - { - if (reply.error() == protocol::TMReplyError::reBAD_REQUEST) - peer->charge( - Resource::feeMalformedRequest, - "proof_path_request"); - else - peer->charge( - Resource::feeRequestNoReply, "proof_path_request"); - } + if (reply.error() == protocol::TMReplyError::reBAD_REQUEST) + peer->charge( + Resource::feeMalformedRequest, "proof_path_request"); else - { - peer->send(std::make_shared( - reply, protocol::mtPROOF_PATH_RESPONSE)); - } + peer->charge( + Resource::feeRequestNoReply, "proof_path_request"); } - }); + else + { + peer->send(std::make_shared( + reply, protocol::mtPROOF_PATH_RESPONSE)); + } + } + }); } void @@ -1629,30 +1627,27 @@ PeerImp::onMessage(std::shared_ptr const& m) fee_.fee = Resource::feeModerateBurdenPeer; std::weak_ptr weak = shared_from_this(); - app_.getJobQueue().addJob( - jtREPLAY_REQ, "recvReplayDeltaRequest", [weak, m]() { - if (auto peer = weak.lock()) + app_.getJobQueue().addJob(jtREPLAY_REQ, "RcvReplDReq", [weak, m]() { + if (auto peer = weak.lock()) + { + auto reply = + peer->ledgerReplayMsgHandler_.processReplayDeltaRequest(m); + if (reply.has_error()) { - auto reply = - peer->ledgerReplayMsgHandler_.processReplayDeltaRequest(m); - if (reply.has_error()) - { - if (reply.error() == protocol::TMReplyError::reBAD_REQUEST) - peer->charge( - Resource::feeMalformedRequest, - "replay_delta_request"); - else - peer->charge( - Resource::feeRequestNoReply, - "replay_delta_request"); - } + if (reply.error() == protocol::TMReplyError::reBAD_REQUEST) + peer->charge( + Resource::feeMalformedRequest, "replay_delta_request"); else - { - peer->send(std::make_shared( - reply, protocol::mtREPLAY_DELTA_RESPONSE)); - } + peer->charge( + Resource::feeRequestNoReply, "replay_delta_request"); } - }); + else + { + peer->send(std::make_shared( + reply, protocol::mtREPLAY_DELTA_RESPONSE)); + } + } + }); } void @@ -1748,7 +1743,7 @@ PeerImp::onMessage(std::shared_ptr const& m) { std::weak_ptr weak{shared_from_this()}; app_.getJobQueue().addJob( - jtTXN_DATA, "recvPeerData", [weak, ledgerHash, m]() { + jtTXN_DATA, "RcvPeerData", [weak, ledgerHash, m]() { if (auto peer = weak.lock()) { peer->app_.getInboundTransactions().gotData( @@ -1876,7 +1871,7 @@ PeerImp::onMessage(std::shared_ptr const& m) std::weak_ptr weak = shared_from_this(); app_.getJobQueue().addJob( isTrusted ? jtPROPOSAL_t : jtPROPOSAL_ut, - "recvPropose->checkPropose", + "checkPropose", [weak, isTrusted, m, proposal]() { if (auto peer = weak.lock()) peer->checkPropose(isTrusted, m, proposal); @@ -2490,18 +2485,7 @@ PeerImp::onMessage(std::shared_ptr const& m) } else if (isTrusted || !app_.getFeeTrack().isLoadedLocal()) { - std::string const name = [isTrusted, val]() { - std::string ret = - isTrusted ? "Trusted validation" : "Untrusted validation"; - -#ifdef DEBUG - ret += " " + - std::to_string(val->getFieldU32(sfLedgerSequence)) + ": " + - to_string(val->getNodeID()); -#endif - - return ret; - }(); + std::string const name = isTrusted ? "ChkTrust" : "ChkUntrust"; std::weak_ptr weak = shared_from_this(); app_.getJobQueue().addJob( @@ -2561,11 +2545,10 @@ PeerImp::onMessage(std::shared_ptr const& m) } std::weak_ptr weak = shared_from_this(); - app_.getJobQueue().addJob( - jtREQUESTED_TXN, "doTransactions", [weak, m]() { - if (auto peer = weak.lock()) - peer->doTransactions(m); - }); + app_.getJobQueue().addJob(jtREQUESTED_TXN, "DoTxs", [weak, m]() { + if (auto peer = weak.lock()) + peer->doTransactions(m); + }); return; } @@ -2705,11 +2688,10 @@ PeerImp::onMessage(std::shared_ptr const& m) } std::weak_ptr weak = shared_from_this(); - app_.getJobQueue().addJob( - jtMISSING_TXN, "handleHaveTransactions", [weak, m]() { - if (auto peer = weak.lock()) - peer->handleHaveTransactions(m); - }); + app_.getJobQueue().addJob(jtMISSING_TXN, "HandleHaveTxs", [weak, m]() { + if (auto peer = weak.lock()) + peer->handleHaveTransactions(m); + }); } void diff --git a/src/xrpld/rpc/detail/RPCSub.cpp b/src/xrpld/rpc/detail/RPCSub.cpp index 616911fdfa..877b894885 100644 --- a/src/xrpld/rpc/detail/RPCSub.cpp +++ b/src/xrpld/rpc/detail/RPCSub.cpp @@ -72,7 +72,7 @@ public: JLOG(j_.info()) << "RPCCall::fromNetwork start"; mSending = m_jobQueue.addJob( - jtCLIENT_SUBSCRIBE, "RPCSub::sendThread", [this]() { + jtCLIENT_SUBSCRIBE, "RPCSubSendThr", [this]() { sendThread(); }); }