Merge branch 'develop' into remove-election-winner-details

# Conflicts:
#	nano/node/node.hpp
This commit is contained in:
Piotr Wójcik 2024-10-18 00:17:50 +02:00
commit 6883c4d9e5
31 changed files with 138 additions and 99 deletions

View file

@ -3,7 +3,7 @@ description: "Restore file modification timestamps from git commit timestamps"
runs: runs:
using: "composite" using: "composite"
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
with: with:
repository: "MestreLion/git-tools" repository: "MestreLion/git-tools"
ref: a42a069bc755f0fa81316965335cb33dbf22a968 # pin latest commit ref: a42a069bc755f0fa81316965335cb33dbf22a968 # pin latest commit

View file

@ -8,7 +8,7 @@ jobs:
if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 #v3.1.0 uses: actions/checkout@v4
- name: Installing clang-format - name: Installing clang-format
env: env:
@ -28,7 +28,7 @@ jobs:
if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 #v3.1.0 uses: actions/checkout@v4
- name: Setup Python - name: Setup Python
uses: actions/setup-python@13ae5bb136fac2878aff31522b9efb785519f984 #v4.3.0 uses: actions/setup-python@13ae5bb136fac2878aff31522b9efb785519f984 #v4.3.0
@ -50,6 +50,6 @@ jobs:
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository
steps: steps:
- uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 #v3.1.0 - uses: actions/checkout@v4
- name: Run code-inspector - name: Run code-inspector
run: ci/code-inspector-check.sh run: ci/code-inspector-check.sh

View file

@ -1,7 +1,7 @@
name: Build & Deploy name: Build & Deploy
on: on:
schedule: schedule:
- cron: "0 0 * * 3,6" - cron: "0 0 * * 3,6" # Every Wednesday and Saturday at 00:00
workflow_dispatch: workflow_dispatch:
inputs: inputs:
is_release_build: is_release_build:
@ -14,12 +14,15 @@ env:
jobs: jobs:
prepare_build: prepare_build:
name: Prepare Build
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
outputs: outputs:
ci_tag: ${{ steps.set_vars.outputs.ci_tag }} ci_tag: ${{ steps.set_vars.outputs.ci_tag }}
tag_created: ${{ steps.set_vars.outputs.tag_created }} tag_created: ${{ steps.set_vars.outputs.tag_created }}
steps: steps:
- uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 #v3.1.0 - name: Checkout
uses: actions/checkout@v4
- name: Set the tag and version - name: Set the tag and version
id: tag_set id: tag_set
run: | run: |
@ -27,14 +30,15 @@ jobs:
env: env:
GITHUB_ACTOR: ${{ github.actor }} GITHUB_ACTOR: ${{ github.actor }}
IS_RELEASE_BUILD: ${{ github.event.inputs.is_release_build || 'false' }} IS_RELEASE_BUILD: ${{ github.event.inputs.is_release_build || 'false' }}
- name: Set output - name: Set output
id: set_vars id: set_vars
run: | run: |
echo "ci_tag=$CI_TAG" >> $GITHUB_OUTPUT echo "ci_tag=$CI_TAG" >> $GITHUB_OUTPUT
echo "tag_created=$TAG_CREATED" >> $GITHUB_OUTPUT echo "tag_created=$TAG_CREATED" >> $GITHUB_OUTPUT
osx_job: osx_job:
name: macOS [${{ matrix.network }}]
needs: prepare_build needs: prepare_build
if: ${{ needs.prepare_build.outputs.tag_created == 'true' }} if: ${{ needs.prepare_build.outputs.tag_created == 'true' }}
runs-on: macOS-14 runs-on: macOS-14
@ -43,19 +47,22 @@ jobs:
matrix: matrix:
network: ["TEST", "BETA", "LIVE"] network: ["TEST", "BETA", "LIVE"]
steps: steps:
- name: Checkout
- uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 #v3.1.0 uses: actions/checkout@v4
with: with:
submodules: "recursive" submodules: "recursive"
ref: ${{ needs.prepare_build.outputs.ci_tag }} ref: ${{ needs.prepare_build.outputs.ci_tag }}
repository: ${{ github.repository }} repository: ${{ github.repository }}
- name: Prepare - name: Prepare
run: ci/prepare/macos/prepare.sh run: ci/prepare/macos/prepare.sh
- name: Build Artifact - name: Build Artifact
run: ci/build-deploy.sh "/tmp/qt/lib/cmake/Qt5"; run: ci/build-deploy.sh "/tmp/qt/lib/cmake/Qt5";
env: env:
NETWORK: ${{ matrix.network }} NETWORK: ${{ matrix.network }}
CI_TAG: ${{ needs.prepare_build.outputs.ci_tag }} CI_TAG: ${{ needs.prepare_build.outputs.ci_tag }}
- name: Deploy Artifact - name: Deploy Artifact
run: ci/actions/deploy.sh run: ci/actions/deploy.sh
env: env:
@ -67,8 +74,8 @@ jobs:
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_DEFAULT_REGION: us-east-2 AWS_DEFAULT_REGION: us-east-2
linux_job: linux_job:
name: Linux [${{ matrix.network }}]
needs: prepare_build needs: prepare_build
if: ${{ needs.prepare_build.outputs.tag_created == 'true' }} if: ${{ needs.prepare_build.outputs.tag_created == 'true' }}
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
@ -77,13 +84,16 @@ jobs:
matrix: matrix:
network: ["TEST", "BETA", "LIVE"] network: ["TEST", "BETA", "LIVE"]
steps: steps:
- uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 #v3.1.0 - name: Checkout
uses: actions/checkout@v4
with: with:
submodules: "recursive" submodules: "recursive"
ref: ${{ needs.prepare_build.outputs.ci_tag }} ref: ${{ needs.prepare_build.outputs.ci_tag }}
repository: ${{ github.repository }} repository: ${{ github.repository }}
- name: Prepare - name: Prepare
run: sudo -E ci/prepare/linux/prepare.sh run: sudo -E ci/prepare/linux/prepare.sh
- name: Build Artifact - name: Build Artifact
run: ci/build-deploy.sh "/usr/lib/x86_64-linux-gnu/cmake/Qt5" run: ci/build-deploy.sh "/usr/lib/x86_64-linux-gnu/cmake/Qt5"
env: env:
@ -101,8 +111,8 @@ jobs:
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_DEFAULT_REGION: us-east-2 AWS_DEFAULT_REGION: us-east-2
linux_docker_job: linux_docker_job:
name: Docker [${{ matrix.network }}]
needs: prepare_build needs: prepare_build
if: ${{ needs.prepare_build.outputs.tag_created == 'true' }} if: ${{ needs.prepare_build.outputs.tag_created == 'true' }}
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
@ -117,21 +127,25 @@ jobs:
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
IS_RELEASE_BUILD: ${{ github.event.inputs.is_release_build || 'false' }} IS_RELEASE_BUILD: ${{ github.event.inputs.is_release_build || 'false' }}
steps: steps:
- uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 #v3.1.0 - name: Checkout
uses: actions/checkout@v4
with: with:
submodules: "recursive" submodules: "recursive"
ref: ${{ needs.prepare_build.outputs.ci_tag }} ref: ${{ needs.prepare_build.outputs.ci_tag }}
repository: ${{ github.repository }} repository: ${{ github.repository }}
- name: Build Docker - name: Build Docker
run: ci/actions/linux/docker-build.sh run: ci/actions/linux/docker-build.sh
env: env:
NETWORK: ${{ matrix.network }} NETWORK: ${{ matrix.network }}
- name: Deploy Docker Hub
- name: Deploy Docker (Docker Hub)
if: env.DOCKER_PASSWORD != '' if: env.DOCKER_PASSWORD != ''
run: ci/actions/linux/docker-deploy.sh run: ci/actions/linux/docker-deploy.sh
env: env:
NETWORK: ${{ matrix.network }} NETWORK: ${{ matrix.network }}
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
- name: Deploy Docker (ghcr.io) - name: Deploy Docker (ghcr.io)
run: ci/actions/linux/ghcr-deploy.sh run: ci/actions/linux/ghcr-deploy.sh
env: env:
@ -140,8 +154,8 @@ jobs:
DOCKER_USER: ${{ github.repository_owner }} DOCKER_USER: ${{ github.repository_owner }}
DOCKER_PASSWORD: ${{ secrets.GITHUB_TOKEN }} DOCKER_PASSWORD: ${{ secrets.GITHUB_TOKEN }}
windows_job: windows_job:
name: Windows [${{ matrix.network }}]
needs: prepare_build needs: prepare_build
if: ${{ needs.prepare_build.outputs.tag_created == 'true' }} if: ${{ needs.prepare_build.outputs.tag_created == 'true' }}
runs-on: windows-latest runs-on: windows-latest
@ -150,18 +164,22 @@ jobs:
matrix: matrix:
network: ["TEST", "BETA", "LIVE"] network: ["TEST", "BETA", "LIVE"]
steps: steps:
- uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 #v3.1.0 - name: Checkout
uses: actions/checkout@v4
with: with:
submodules: "recursive" submodules: "recursive"
ref: ${{ needs.prepare_build.outputs.ci_tag }} ref: ${{ needs.prepare_build.outputs.ci_tag }}
repository: ${{ github.repository }} repository: ${{ github.repository }}
- name: Prepare - name: Prepare
run: ci/prepare/windows/prepare.ps1 run: ci/prepare/windows/prepare.ps1
- name: Build Artifact - name: Build Artifact
run: ci/actions/windows/build.ps1 run: ci/actions/windows/build.ps1
env: env:
CSC_LINK: ${{ secrets.CSC_LINK }} CSC_LINK: ${{ secrets.CSC_LINK }}
CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }} CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}
- name: Deploy Artifact - name: Deploy Artifact
run: ci/actions/windows/deploy.ps1 run: ci/actions/windows/deploy.ps1
env: env:

View file

@ -37,7 +37,7 @@ jobs:
echo "REPO_TO_RUN=${{ github.event.inputs.repo }}" >> $GITHUB_ENV echo "REPO_TO_RUN=${{ github.event.inputs.repo }}" >> $GITHUB_ENV
echo "MODE=${{ github.event.inputs.mode }}" >> $GITHUB_ENV echo "MODE=${{ github.event.inputs.mode }}" >> $GITHUB_ENV
- name: Checks out the required workflow files (workflow repo) - name: Checks out the required workflow files (workflow repo)
uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 #v3.1.0 uses: actions/checkout@v4
with: with:
ref: ${{ github.ref }} ref: ${{ github.ref }}
repository: ${{ github.repository }} repository: ${{ github.repository }}

View file

@ -35,7 +35,7 @@ jobs:
if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v4
with: with:
submodules: "recursive" submodules: "recursive"
@ -91,7 +91,7 @@ jobs:
if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v4
with: with:
submodules: "recursive" submodules: "recursive"

View file

@ -24,7 +24,7 @@ jobs:
continue-on-error: true continue-on-error: true
timeout-minutes: 60 timeout-minutes: 60
steps: steps:
- uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 #v3.1.0 - uses: actions/checkout@v4
with: with:
submodules: "recursive" submodules: "recursive"
- name: Fetch Deps - name: Fetch Deps

View file

@ -9,7 +9,7 @@ jobs:
linux_job: linux_job:
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
steps: steps:
- uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 #v3.1.0 - uses: actions/checkout@v4
with: with:
submodules: "recursive" submodules: "recursive"
- name: Fetch Deps - name: Fetch Deps

View file

@ -22,7 +22,7 @@ jobs:
if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v4
with: with:
submodules: "recursive" submodules: "recursive"

View file

@ -7,7 +7,7 @@ jobs:
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v3.1.0 uses: actions/checkout@v4
with: with:
ref: ${{ github.ref }} ref: ${{ github.ref }}
fetch-depth: 0 fetch-depth: 0

View file

@ -20,7 +20,7 @@ jobs:
if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v4
with: with:
submodules: "recursive" submodules: "recursive"
@ -66,7 +66,7 @@ jobs:
if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v4
with: with:
submodules: "recursive" submodules: "recursive"
@ -115,7 +115,7 @@ jobs:
if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v4
with: with:
submodules: "recursive" submodules: "recursive"

View file

@ -20,8 +20,6 @@ case "${NETWORK}" in
esac esac
if [[ -n "${S3_BUILD_DIRECTORY}" ]]; then if [[ -n "${S3_BUILD_DIRECTORY}" ]]; then
DIRECTORY="${S3_BUILD_DIRECTORY}/${BUILD}" DIRECTORY="${S3_BUILD_DIRECTORY}/${BUILD}"
else else
DIRECTORY=$BUILD DIRECTORY=$BUILD
@ -33,7 +31,7 @@ if [[ "$OS" == 'Linux' && "$IS_RPM_DEPLOY" -eq "1" ]]; then
for rpm in $RPMS; do for rpm in $RPMS; do
SHA=$(sha256sum ${rpm}) SHA=$(sha256sum ${rpm})
echo "Hash: $SHA" echo "::notice::Hash: $SHA"
echo $SHA > ${GITHUB_WORKSPACE}/$(basename "${rpm}.sha256") echo $SHA > ${GITHUB_WORKSPACE}/$(basename "${rpm}.sha256")
aws s3 cp ${rpm} s3://${S3_BUCKET_NAME}/$DIRECTORY/binaries/$(basename "${rpm}") --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers aws s3 cp ${rpm} s3://${S3_BUCKET_NAME}/$DIRECTORY/binaries/$(basename "${rpm}") --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers
@ -42,7 +40,7 @@ if [[ "$OS" == 'Linux' && "$IS_RPM_DEPLOY" -eq "1" ]]; then
for srpm in $SRPMS; do for srpm in $SRPMS; do
SHA=$(sha256sum ${srpm}) SHA=$(sha256sum ${srpm})
echo "Hash: $SHA" echo "::notice::Hash: $SHA"
echo $SHA > ${GITHUB_WORKSPACE}/$(basename "${srpm}).sha256") echo $SHA > ${GITHUB_WORKSPACE}/$(basename "${srpm}).sha256")
aws s3 cp ${srpm} s3://${S3_BUCKET_NAME}/$DIRECTORY/source/$(basename "${srpm}") --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers aws s3 cp ${srpm} s3://${S3_BUCKET_NAME}/$DIRECTORY/source/$(basename "${srpm}") --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers
@ -50,11 +48,11 @@ if [[ "$OS" == 'Linux' && "$IS_RPM_DEPLOY" -eq "1" ]]; then
done done
elif [[ "$OS" == 'Linux' ]]; then elif [[ "$OS" == 'Linux' ]]; then
SHA=$(sha256sum $GITHUB_WORKSPACE/build/nano-node-*-Linux.tar.bz2) SHA=$(sha256sum $GITHUB_WORKSPACE/build/nano-node-*-Linux.tar.bz2)
echo "Hash: $SHA" echo "::notice::Hash: $SHA"
echo $SHA >$GITHUB_WORKSPACE/nano-node-$TAG-Linux.tar.bz2.sha256 echo $SHA >$GITHUB_WORKSPACE/nano-node-$TAG-Linux.tar.bz2.sha256
SHA=$(sha256sum $GITHUB_WORKSPACE/build/nano-node-*-Linux.deb) SHA=$(sha256sum $GITHUB_WORKSPACE/build/nano-node-*-Linux.deb)
echo "Hash: $SHA" echo "::notice::Hash: $SHA"
echo $SHA >$GITHUB_WORKSPACE/nano-node-$TAG-Linux.deb.sha256 echo $SHA >$GITHUB_WORKSPACE/nano-node-$TAG-Linux.deb.sha256
aws s3 cp $GITHUB_WORKSPACE/build/nano-node-*-Linux.tar.bz2 s3://${S3_BUCKET_NAME}/$DIRECTORY/binaries/nano-node-$TAG-Linux.tar.bz2 --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers aws s3 cp $GITHUB_WORKSPACE/build/nano-node-*-Linux.tar.bz2 s3://${S3_BUCKET_NAME}/$DIRECTORY/binaries/nano-node-$TAG-Linux.tar.bz2 --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers
@ -63,7 +61,7 @@ elif [[ "$OS" == 'Linux' ]]; then
aws s3 cp $GITHUB_WORKSPACE/nano-node-$TAG-Linux.deb.sha256 s3://${S3_BUCKET_NAME}/$DIRECTORY/binaries/nano-node-$TAG-Linux.deb.sha256 --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers aws s3 cp $GITHUB_WORKSPACE/nano-node-$TAG-Linux.deb.sha256 s3://${S3_BUCKET_NAME}/$DIRECTORY/binaries/nano-node-$TAG-Linux.deb.sha256 --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers
else else
SHA=$(sha256sum $GITHUB_WORKSPACE/build/nano-node-*-Darwin.dmg) SHA=$(sha256sum $GITHUB_WORKSPACE/build/nano-node-*-Darwin.dmg)
echo "Hash: $SHA" echo "::notice::Hash: $SHA"
echo $SHA >$GITHUB_WORKSPACE/build/nano-node-$TAG-Darwin.dmg.sha256 echo $SHA >$GITHUB_WORKSPACE/build/nano-node-$TAG-Darwin.dmg.sha256
aws s3 cp $GITHUB_WORKSPACE/build/nano-node-*-Darwin.dmg s3://${S3_BUCKET_NAME}/$DIRECTORY/binaries/nano-node-$TAG-Darwin.dmg --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers aws s3 cp $GITHUB_WORKSPACE/build/nano-node-*-Darwin.dmg s3://${S3_BUCKET_NAME}/$DIRECTORY/binaries/nano-node-$TAG-Darwin.dmg --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers

View file

@ -134,7 +134,22 @@ docker_login()
push_docker_image() push_docker_image()
{ {
local image_name=$1 local image_name=$1
# Log the image name before pushing
echo "Pushing image: $image_name"
# Push the image
"$scripts"/custom-timeout.sh 30 docker push "$image_name" "$scripts"/custom-timeout.sh 30 docker push "$image_name"
# After pushing, get the digest from the local image manifest
local digest
digest=$(docker image inspect --format='{{index .RepoDigests 0}}' "$image_name")
if [ -n "$digest" ]; then
echo "::notice::Hash: $digest $image_name"
else
echo "::error::Could not retrieve digest for image $image_name"
fi
} }
deploy_env_images() deploy_env_images()
@ -154,7 +169,7 @@ deploy_tags()
local exclude_pattern=$2 local exclude_pattern=$2
local tags=$(docker images --format '{{.Repository}}:{{.Tag }}' | grep "$repo" | grep -vE "$exclude_pattern") local tags=$(docker images --format '{{.Repository}}:{{.Tag }}' | grep "$repo" | grep -vE "$exclude_pattern")
#Debug list all tags # Debug list all tags
docker images --format '{{.Repository}}:{{.Tag }}' docker images --format '{{.Repository}}:{{.Tag }}'
for tag in $tags; do for tag in $tags; do

View file

@ -27,8 +27,8 @@ $zip_hash = ((Get-FileHash $zip).hash)+" "+(split-path -Path $zip -Resolve -leaf
$exe_hash | Out-file -FilePath "$exe.sha256" $exe_hash | Out-file -FilePath "$exe.sha256"
$zip_hash | Out-file -FilePath "$zip.sha256" $zip_hash | Out-file -FilePath "$zip.sha256"
Write-Output "Hash: $exe_hash" Write-Output "::notice::Hash: $exe_hash"
Write-Output "Hash: $zip_hash" Write-Output "::notice::Hash: $zip_hash"
aws s3 cp "$exe" s3://$env:S3_BUCKET_NAME/$directory/binaries/nano-node-$env:TAG-win64.exe --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers aws s3 cp "$exe" s3://$env:S3_BUCKET_NAME/$directory/binaries/nano-node-$env:TAG-win64.exe --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers
aws s3 cp "$exe.sha256" s3://$env:S3_BUCKET_NAME/$directory/binaries/nano-node-$env:TAG-win64.exe.sha256 --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers aws s3 cp "$exe.sha256" s3://$env:S3_BUCKET_NAME/$directory/binaries/nano-node-$env:TAG-win64.exe.sha256 --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers

View file

@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
set -euox pipefail set -euox pipefail
#Homebrew randomly fails to update. Retry 5 times with 15s interval # Homebrew randomly fails to update. Retry 5 times with 15s interval
for i in {1..5}; do brew update && break || { echo "Update failed, retrying..."; sleep 15; }; done for i in {1..5}; do brew update && break || { echo "Update failed, retrying..."; sleep 15; }; done
brew install coreutils brew install coreutils
@ -10,4 +10,4 @@ brew install qt@5
brew link qt@5 brew link qt@5
# Workaround: https://github.com/Homebrew/homebrew-core/issues/8392 # Workaround: https://github.com/Homebrew/homebrew-core/issues/8392
echo "$(brew --prefix qt5)/bin" >> $GITHUB_PATH echo "$(brew --prefix qt@5)/bin" >> $GITHUB_PATH

View file

@ -44,7 +44,7 @@ for script in ${NANO_SYSTEST_DIR}/*.sh; do
done done
if [ $overall_status -eq 0 ]; then if [ $overall_status -eq 0 ]; then
echo "::notice::All systests passed" echo "All systests passed"
else else
echo "::error::Some systests failed" echo "::error::Some systests failed"
exit 1 exit 1

View file

@ -19,7 +19,7 @@ if [[ ${#reports[@]} -gt 0 ]]; then
issue_reported=true issue_reported=true
done done
else else
echo "::notice::No report has been generated." echo "No report has been generated."
fi fi
echo "issue_reported=${issue_reported}" >> $GITHUB_OUTPUT echo "issue_reported=${issue_reported}" >> $GITHUB_OUTPUT
@ -28,6 +28,6 @@ if $issue_reported; then
echo "::error::Issues were reported in the sanitizer report." echo "::error::Issues were reported in the sanitizer report."
exit 1 exit 1
else else
echo "::notice::No issues found in the sanitizer reports." echo "No issues found in the sanitizer reports."
exit 0 exit 0
fi fi

View file

@ -1,4 +1,4 @@
FROM ubuntu:22.04 as builder FROM ubuntu:22.04 AS builder
ARG COMPILER=gcc ARG COMPILER=gcc
ARG NANO_NETWORK=live ARG NANO_NETWORK=live
@ -10,7 +10,7 @@ RUN /tmp/prepare/prepare.sh
COPY ./ /tmp/src COPY ./ /tmp/src
WORKDIR /tmp/src WORKDIR /tmp/src
#Define ARGs for ci/build-node.sh # Define ARGs for ci/build-node.sh
ARG BUILD_TYPE=RelWithDebInfo ARG BUILD_TYPE=RelWithDebInfo
ARG NANO_TEST=OFF ARG NANO_TEST=OFF
ARG NANO_TRACING=OFF ARG NANO_TRACING=OFF

View file

@ -92,7 +92,7 @@ TEST (bootstrap_server, serve_account_blocks)
request.payload = request_payload; request.payload = request_payload;
request.update_header (); request.update_header ();
node.network.inbound (request, nano::test::fake_channel (node)); node.inbound (request, nano::test::fake_channel (node));
ASSERT_TIMELY_EQ (5s, responses.size (), 1); ASSERT_TIMELY_EQ (5s, responses.size (), 1);
@ -137,7 +137,7 @@ TEST (bootstrap_server, serve_hash)
request.payload = request_payload; request.payload = request_payload;
request.update_header (); request.update_header ();
node.network.inbound (request, nano::test::fake_channel (node)); node.inbound (request, nano::test::fake_channel (node));
ASSERT_TIMELY_EQ (5s, responses.size (), 1); ASSERT_TIMELY_EQ (5s, responses.size (), 1);
@ -182,7 +182,7 @@ TEST (bootstrap_server, serve_hash_one)
request.payload = request_payload; request.payload = request_payload;
request.update_header (); request.update_header ();
node.network.inbound (request, nano::test::fake_channel (node)); node.inbound (request, nano::test::fake_channel (node));
ASSERT_TIMELY_EQ (5s, responses.size (), 1); ASSERT_TIMELY_EQ (5s, responses.size (), 1);
@ -221,7 +221,7 @@ TEST (bootstrap_server, serve_end_of_chain)
request.payload = request_payload; request.payload = request_payload;
request.update_header (); request.update_header ();
node.network.inbound (request, nano::test::fake_channel (node)); node.inbound (request, nano::test::fake_channel (node));
ASSERT_TIMELY_EQ (5s, responses.size (), 1); ASSERT_TIMELY_EQ (5s, responses.size (), 1);
@ -260,7 +260,7 @@ TEST (bootstrap_server, serve_missing)
request.payload = request_payload; request.payload = request_payload;
request.update_header (); request.update_header ();
node.network.inbound (request, nano::test::fake_channel (node)); node.inbound (request, nano::test::fake_channel (node));
ASSERT_TIMELY_EQ (5s, responses.size (), 1); ASSERT_TIMELY_EQ (5s, responses.size (), 1);
@ -303,7 +303,7 @@ TEST (bootstrap_server, serve_multiple)
request.payload = request_payload; request.payload = request_payload;
request.update_header (); request.update_header ();
node.network.inbound (request, nano::test::fake_channel (node)); node.inbound (request, nano::test::fake_channel (node));
} }
} }
@ -359,7 +359,7 @@ TEST (bootstrap_server, serve_account_info)
request.payload = request_payload; request.payload = request_payload;
request.update_header (); request.update_header ();
node.network.inbound (request, nano::test::fake_channel (node)); node.inbound (request, nano::test::fake_channel (node));
ASSERT_TIMELY_EQ (5s, responses.size (), 1); ASSERT_TIMELY_EQ (5s, responses.size (), 1);
@ -405,7 +405,7 @@ TEST (bootstrap_server, serve_account_info_missing)
request.payload = request_payload; request.payload = request_payload;
request.update_header (); request.update_header ();
node.network.inbound (request, nano::test::fake_channel (node)); node.inbound (request, nano::test::fake_channel (node));
ASSERT_TIMELY_EQ (5s, responses.size (), 1); ASSERT_TIMELY_EQ (5s, responses.size (), 1);
@ -450,7 +450,7 @@ TEST (bootstrap_server, serve_frontiers)
request.payload = request_payload; request.payload = request_payload;
request.update_header (); request.update_header ();
node.network.inbound (request, nano::test::fake_channel (node)); node.inbound (request, nano::test::fake_channel (node));
ASSERT_TIMELY_EQ (5s, responses.size (), 1); ASSERT_TIMELY_EQ (5s, responses.size (), 1);
@ -503,7 +503,7 @@ TEST (bootstrap_server, serve_frontiers_invalid_count)
request.payload = request_payload; request.payload = request_payload;
request.update_header (); request.update_header ();
node.network.inbound (request, nano::test::fake_channel (node)); node.inbound (request, nano::test::fake_channel (node));
} }
ASSERT_TIMELY_EQ (5s, node.stats.count (nano::stat::type::bootstrap_server, nano::stat::detail::invalid), 1); ASSERT_TIMELY_EQ (5s, node.stats.count (nano::stat::type::bootstrap_server, nano::stat::detail::invalid), 1);
@ -521,7 +521,7 @@ TEST (bootstrap_server, serve_frontiers_invalid_count)
request.payload = request_payload; request.payload = request_payload;
request.update_header (); request.update_header ();
node.network.inbound (request, nano::test::fake_channel (node)); node.inbound (request, nano::test::fake_channel (node));
} }
ASSERT_TIMELY_EQ (5s, node.stats.count (nano::stat::type::bootstrap_server, nano::stat::detail::invalid), 2); ASSERT_TIMELY_EQ (5s, node.stats.count (nano::stat::type::bootstrap_server, nano::stat::detail::invalid), 2);
@ -539,7 +539,7 @@ TEST (bootstrap_server, serve_frontiers_invalid_count)
request.payload = request_payload; request.payload = request_payload;
request.update_header (); request.update_header ();
node.network.inbound (request, nano::test::fake_channel (node)); node.inbound (request, nano::test::fake_channel (node));
} }
ASSERT_TIMELY_EQ (5s, node.stats.count (nano::stat::type::bootstrap_server, nano::stat::detail::invalid), 3); ASSERT_TIMELY_EQ (5s, node.stats.count (nano::stat::type::bootstrap_server, nano::stat::detail::invalid), 3);

View file

@ -377,7 +377,7 @@ TEST (receivable_processor, confirm_insufficient_pos)
nano::confirm_ack con1{ nano::dev::network_params.network, vote }; nano::confirm_ack con1{ nano::dev::network_params.network, vote };
auto channel1 = std::make_shared<nano::transport::inproc::channel> (node1, node1); auto channel1 = std::make_shared<nano::transport::inproc::channel> (node1, node1);
ASSERT_EQ (1, election->votes ().size ()); ASSERT_EQ (1, election->votes ().size ());
node1.network.inbound (con1, channel1); node1.inbound (con1, channel1);
ASSERT_TIMELY_EQ (5s, 2, election->votes ().size ()) ASSERT_TIMELY_EQ (5s, 2, election->votes ().size ())
ASSERT_FALSE (election->confirmed ()); ASSERT_FALSE (election->confirmed ());
} }
@ -402,7 +402,7 @@ TEST (receivable_processor, confirm_sufficient_pos)
nano::confirm_ack con1{ nano::dev::network_params.network, vote }; nano::confirm_ack con1{ nano::dev::network_params.network, vote };
auto channel1 = std::make_shared<nano::transport::inproc::channel> (node1, node1); auto channel1 = std::make_shared<nano::transport::inproc::channel> (node1, node1);
ASSERT_EQ (1, election->votes ().size ()); ASSERT_EQ (1, election->votes ().size ());
node1.network.inbound (con1, channel1); node1.inbound (con1, channel1);
ASSERT_TIMELY_EQ (5s, 2, election->votes ().size ()) ASSERT_TIMELY_EQ (5s, 2, election->votes ().size ())
ASSERT_TRUE (election->confirmed ()); ASSERT_TRUE (election->confirmed ());
} }
@ -743,10 +743,10 @@ TEST (network, duplicate_revert_publish)
auto channel = nano::test::establish_tcp (system, *other_node, node.network.endpoint ()); auto channel = nano::test::establish_tcp (system, *other_node, node.network.endpoint ());
ASSERT_NE (nullptr, channel); ASSERT_NE (nullptr, channel);
ASSERT_EQ (0, publish.digest); ASSERT_EQ (0, publish.digest);
node.network.inbound (publish, channel); node.inbound (publish, nano::test::fake_channel (node));
ASSERT_TRUE (node.network.filter.apply (bytes.data (), bytes.size ())); ASSERT_TRUE (node.network.filter.apply (bytes.data (), bytes.size ()));
publish.digest = digest; publish.digest = digest;
node.network.inbound (publish, channel); node.inbound (publish, nano::test::fake_channel (node));
ASSERT_FALSE (node.network.filter.apply (bytes.data (), bytes.size ())); ASSERT_FALSE (node.network.filter.apply (bytes.data (), bytes.size ()));
} }

View file

@ -688,16 +688,15 @@ TEST (node, fork_flip)
.work (*system.work.generate (nano::dev::genesis->hash ())) .work (*system.work.generate (nano::dev::genesis->hash ()))
.build (); .build ();
nano::publish publish2{ nano::dev::network_params.network, send2 }; nano::publish publish2{ nano::dev::network_params.network, send2 };
auto ignored_channel = nano::test::fake_channel (node1); node1.inbound (publish1, nano::test::fake_channel (node1));
node1.network.inbound (publish1, ignored_channel); node2.inbound (publish2, nano::test::fake_channel (node2));
node2.network.inbound (publish2, ignored_channel);
ASSERT_TIMELY_EQ (5s, 1, node1.active.size ()); ASSERT_TIMELY_EQ (5s, 1, node1.active.size ());
ASSERT_TIMELY_EQ (5s, 1, node2.active.size ()); ASSERT_TIMELY_EQ (5s, 1, node2.active.size ());
system.wallet (0)->insert_adhoc (nano::dev::genesis_key.prv); system.wallet (0)->insert_adhoc (nano::dev::genesis_key.prv);
// Fill nodes with forked blocks // Fill nodes with forked blocks
node1.network.inbound (publish2, ignored_channel); node1.inbound (publish2, nano::test::fake_channel (node1));
ASSERT_TIMELY (5s, node1.active.active (*send2)); ASSERT_TIMELY (5s, node1.active.active (*send2));
node2.network.inbound (publish1, ignored_channel); node2.inbound (publish1, nano::test::fake_channel (node2));
ASSERT_TIMELY (5s, node2.active.active (*send1)); ASSERT_TIMELY (5s, node2.active.active (*send1));
auto election1 (node2.active.election (nano::qualified_root (nano::dev::genesis->hash (), nano::dev::genesis->hash ()))); auto election1 (node2.active.election (nano::qualified_root (nano::dev::genesis->hash (), nano::dev::genesis->hash ())));
ASSERT_NE (nullptr, election1); ASSERT_NE (nullptr, election1);
@ -829,7 +828,7 @@ TEST (node, fork_open)
.build (); .build ();
nano::publish publish1{ nano::dev::network_params.network, send1 }; nano::publish publish1{ nano::dev::network_params.network, send1 };
auto channel1 = std::make_shared<nano::transport::fake::channel> (node); auto channel1 = std::make_shared<nano::transport::fake::channel> (node);
node.network.inbound (publish1, channel1); node.inbound (publish1, channel1);
ASSERT_TIMELY (5s, (election = node.active.election (publish1.block->qualified_root ())) != nullptr); ASSERT_TIMELY (5s, (election = node.active.election (publish1.block->qualified_root ())) != nullptr);
election->force_confirm (); election->force_confirm ();
ASSERT_TIMELY (5s, node.active.empty () && node.block_confirmed (publish1.block->hash ())); ASSERT_TIMELY (5s, node.active.empty () && node.block_confirmed (publish1.block->hash ()));
@ -848,7 +847,7 @@ TEST (node, fork_open)
.work (*system.work.generate (key1.pub)) .work (*system.work.generate (key1.pub))
.build (); .build ();
nano::publish publish2{ nano::dev::network_params.network, open1 }; nano::publish publish2{ nano::dev::network_params.network, open1 };
node.network.inbound (publish2, channel1); node.inbound (publish2, channel1);
ASSERT_TIMELY_EQ (5s, 1, node.active.size ()); ASSERT_TIMELY_EQ (5s, 1, node.active.size ());
// create 2nd open block, which is a fork of open1 block // create 2nd open block, which is a fork of open1 block
@ -860,7 +859,7 @@ TEST (node, fork_open)
.work (*system.work.generate (key1.pub)) .work (*system.work.generate (key1.pub))
.build (); .build ();
nano::publish publish3{ nano::dev::network_params.network, open2 }; nano::publish publish3{ nano::dev::network_params.network, open2 };
node.network.inbound (publish3, channel1); node.inbound (publish3, channel1);
ASSERT_TIMELY (5s, (election = node.active.election (publish3.block->qualified_root ())) != nullptr); ASSERT_TIMELY (5s, (election = node.active.election (publish3.block->qualified_root ())) != nullptr);
// we expect to find 2 blocks in the election and we expect the first block to be the winner just because it was first // we expect to find 2 blocks in the election and we expect the first block to be the winner just because it was first
@ -1856,14 +1855,14 @@ TEST (node, DISABLED_local_votes_cache)
nano::confirm_req message1{ nano::dev::network_params.network, send1->hash (), send1->root () }; nano::confirm_req message1{ nano::dev::network_params.network, send1->hash (), send1->root () };
nano::confirm_req message2{ nano::dev::network_params.network, send2->hash (), send2->root () }; nano::confirm_req message2{ nano::dev::network_params.network, send2->hash (), send2->root () };
auto channel = std::make_shared<nano::transport::fake::channel> (node); auto channel = std::make_shared<nano::transport::fake::channel> (node);
node.network.inbound (message1, channel); node.inbound (message1, channel);
ASSERT_TIMELY_EQ (3s, node.stats.count (nano::stat::type::requests, nano::stat::detail::requests_generated_votes), 1); ASSERT_TIMELY_EQ (3s, node.stats.count (nano::stat::type::requests, nano::stat::detail::requests_generated_votes), 1);
node.network.inbound (message2, channel); node.inbound (message2, channel);
ASSERT_TIMELY_EQ (3s, node.stats.count (nano::stat::type::requests, nano::stat::detail::requests_generated_votes), 2); ASSERT_TIMELY_EQ (3s, node.stats.count (nano::stat::type::requests, nano::stat::detail::requests_generated_votes), 2);
for (auto i (0); i < 100; ++i) for (auto i (0); i < 100; ++i)
{ {
node.network.inbound (message1, channel); node.inbound (message1, channel);
node.network.inbound (message2, channel); node.inbound (message2, channel);
} }
// Make sure a new vote was not generated // Make sure a new vote was not generated
ASSERT_TIMELY_EQ (3s, node.stats.count (nano::stat::type::requests, nano::stat::detail::requests_generated_votes), 2); ASSERT_TIMELY_EQ (3s, node.stats.count (nano::stat::type::requests, nano::stat::detail::requests_generated_votes), 2);
@ -1873,7 +1872,7 @@ TEST (node, DISABLED_local_votes_cache)
ASSERT_EQ (nano::block_status::progress, node.ledger.process (transaction, send3)); ASSERT_EQ (nano::block_status::progress, node.ledger.process (transaction, send3));
} }
nano::confirm_req message3{ nano::dev::network_params.network, send3->hash (), send3->root () }; nano::confirm_req message3{ nano::dev::network_params.network, send3->hash (), send3->root () };
node.network.inbound (message3, channel); node.inbound (message3, channel);
ASSERT_TIMELY_EQ (3s, node.stats.count (nano::stat::type::requests, nano::stat::detail::requests_generated_votes), 3); ASSERT_TIMELY_EQ (3s, node.stats.count (nano::stat::type::requests, nano::stat::detail::requests_generated_votes), 3);
ASSERT_TIMELY (3s, !node.history.votes (send1->root (), send1->hash ()).empty ()); ASSERT_TIMELY (3s, !node.history.votes (send1->root (), send1->hash ()).empty ());
ASSERT_TIMELY (3s, !node.history.votes (send2->root (), send2->hash ()).empty ()); ASSERT_TIMELY (3s, !node.history.votes (send2->root (), send2->hash ()).empty ());
@ -1881,7 +1880,7 @@ TEST (node, DISABLED_local_votes_cache)
// All requests should be served from the cache // All requests should be served from the cache
for (auto i (0); i < 100; ++i) for (auto i (0); i < 100; ++i)
{ {
node.network.inbound (message3, channel); node.inbound (message3, channel);
} }
ASSERT_TIMELY_EQ (3s, node.stats.count (nano::stat::type::requests, nano::stat::detail::requests_generated_votes), 3); ASSERT_TIMELY_EQ (3s, node.stats.count (nano::stat::type::requests, nano::stat::detail::requests_generated_votes), 3);
} }
@ -1935,26 +1934,26 @@ TEST (node, DISABLED_local_votes_cache_batch)
nano::confirm_req message{ nano::dev::network_params.network, batch }; nano::confirm_req message{ nano::dev::network_params.network, batch };
auto channel = std::make_shared<nano::transport::fake::channel> (node); auto channel = std::make_shared<nano::transport::fake::channel> (node);
// Generates and sends one vote for both hashes which is then cached // Generates and sends one vote for both hashes which is then cached
node.network.inbound (message, channel); node.inbound (message, channel);
ASSERT_TIMELY_EQ (3s, node.stats.count (nano::stat::type::message, nano::stat::detail::confirm_ack, nano::stat::dir::out), 1); ASSERT_TIMELY_EQ (3s, node.stats.count (nano::stat::type::message, nano::stat::detail::confirm_ack, nano::stat::dir::out), 1);
ASSERT_EQ (1, node.stats.count (nano::stat::type::message, nano::stat::detail::confirm_ack, nano::stat::dir::out)); ASSERT_EQ (1, node.stats.count (nano::stat::type::message, nano::stat::detail::confirm_ack, nano::stat::dir::out));
ASSERT_FALSE (node.history.votes (send2->root (), send2->hash ()).empty ()); ASSERT_FALSE (node.history.votes (send2->root (), send2->hash ()).empty ());
ASSERT_FALSE (node.history.votes (receive1->root (), receive1->hash ()).empty ()); ASSERT_FALSE (node.history.votes (receive1->root (), receive1->hash ()).empty ());
// Only one confirm_ack should be sent if all hashes are part of the same vote // Only one confirm_ack should be sent if all hashes are part of the same vote
node.network.inbound (message, channel); node.inbound (message, channel);
ASSERT_TIMELY_EQ (3s, node.stats.count (nano::stat::type::message, nano::stat::detail::confirm_ack, nano::stat::dir::out), 2); ASSERT_TIMELY_EQ (3s, node.stats.count (nano::stat::type::message, nano::stat::detail::confirm_ack, nano::stat::dir::out), 2);
ASSERT_EQ (2, node.stats.count (nano::stat::type::message, nano::stat::detail::confirm_ack, nano::stat::dir::out)); ASSERT_EQ (2, node.stats.count (nano::stat::type::message, nano::stat::detail::confirm_ack, nano::stat::dir::out));
// Test when votes are different // Test when votes are different
node.history.erase (send2->root ()); node.history.erase (send2->root ());
node.history.erase (receive1->root ()); node.history.erase (receive1->root ());
node.network.inbound (nano::confirm_req{ nano::dev::network_params.network, send2->hash (), send2->root () }, channel); node.inbound (nano::confirm_req{ nano::dev::network_params.network, send2->hash (), send2->root () }, channel);
ASSERT_TIMELY_EQ (3s, node.stats.count (nano::stat::type::message, nano::stat::detail::confirm_ack, nano::stat::dir::out), 3); ASSERT_TIMELY_EQ (3s, node.stats.count (nano::stat::type::message, nano::stat::detail::confirm_ack, nano::stat::dir::out), 3);
ASSERT_EQ (3, node.stats.count (nano::stat::type::message, nano::stat::detail::confirm_ack, nano::stat::dir::out)); ASSERT_EQ (3, node.stats.count (nano::stat::type::message, nano::stat::detail::confirm_ack, nano::stat::dir::out));
node.network.inbound (nano::confirm_req{ nano::dev::network_params.network, receive1->hash (), receive1->root () }, channel); node.inbound (nano::confirm_req{ nano::dev::network_params.network, receive1->hash (), receive1->root () }, channel);
ASSERT_TIMELY_EQ (3s, node.stats.count (nano::stat::type::message, nano::stat::detail::confirm_ack, nano::stat::dir::out), 4); ASSERT_TIMELY_EQ (3s, node.stats.count (nano::stat::type::message, nano::stat::detail::confirm_ack, nano::stat::dir::out), 4);
ASSERT_EQ (4, node.stats.count (nano::stat::type::message, nano::stat::detail::confirm_ack, nano::stat::dir::out)); ASSERT_EQ (4, node.stats.count (nano::stat::type::message, nano::stat::detail::confirm_ack, nano::stat::dir::out));
// There are two different votes, so both should be sent in response // There are two different votes, so both should be sent in response
node.network.inbound (message, channel); node.inbound (message, channel);
ASSERT_TIMELY_EQ (3s, node.stats.count (nano::stat::type::message, nano::stat::detail::confirm_ack, nano::stat::dir::out), 6); ASSERT_TIMELY_EQ (3s, node.stats.count (nano::stat::type::message, nano::stat::detail::confirm_ack, nano::stat::dir::out), 6);
ASSERT_EQ (6, node.stats.count (nano::stat::type::message, nano::stat::detail::confirm_ack, nano::stat::dir::out)); ASSERT_EQ (6, node.stats.count (nano::stat::type::message, nano::stat::detail::confirm_ack, nano::stat::dir::out));
} }
@ -1975,7 +1974,7 @@ TEST (node, DISABLED_local_votes_cache_generate_new_vote)
// Send a confirm req for genesis block to node // Send a confirm req for genesis block to node
nano::confirm_req message1{ nano::dev::network_params.network, nano::dev::genesis->hash (), nano::dev::genesis->root () }; nano::confirm_req message1{ nano::dev::network_params.network, nano::dev::genesis->hash (), nano::dev::genesis->root () };
auto channel = std::make_shared<nano::transport::fake::channel> (node); auto channel = std::make_shared<nano::transport::fake::channel> (node);
node.network.inbound (message1, channel); node.inbound (message1, channel);
// check that the node generated a vote for the genesis block and that it is stored in the local vote cache and it is the only vote // check that the node generated a vote for the genesis block and that it is stored in the local vote cache and it is the only vote
ASSERT_TIMELY (5s, !node.history.votes (nano::dev::genesis->root (), nano::dev::genesis->hash ()).empty ()); ASSERT_TIMELY (5s, !node.history.votes (nano::dev::genesis->root (), nano::dev::genesis->hash ()).empty ());
@ -1998,7 +1997,7 @@ TEST (node, DISABLED_local_votes_cache_generate_new_vote)
// One of the hashes is cached // One of the hashes is cached
std::vector<std::pair<nano::block_hash, nano::root>> roots_hashes{ std::make_pair (nano::dev::genesis->hash (), nano::dev::genesis->root ()), std::make_pair (send1->hash (), send1->root ()) }; std::vector<std::pair<nano::block_hash, nano::root>> roots_hashes{ std::make_pair (nano::dev::genesis->hash (), nano::dev::genesis->root ()), std::make_pair (send1->hash (), send1->root ()) };
nano::confirm_req message2{ nano::dev::network_params.network, roots_hashes }; nano::confirm_req message2{ nano::dev::network_params.network, roots_hashes };
node.network.inbound (message2, channel); node.inbound (message2, channel);
ASSERT_TIMELY (3s, !node.history.votes (send1->root (), send1->hash ()).empty ()); ASSERT_TIMELY (3s, !node.history.votes (send1->root (), send1->hash ()).empty ());
auto votes2 (node.history.votes (send1->root (), send1->hash ())); auto votes2 (node.history.votes (send1->root (), send1->hash ()));
ASSERT_EQ (1, votes2.size ()); ASSERT_EQ (1, votes2.size ());
@ -2441,13 +2440,13 @@ TEST (node, fork_election_invalid_block_signature)
.build (); .build ();
auto channel1 = std::make_shared<nano::transport::fake::channel> (node1); auto channel1 = std::make_shared<nano::transport::fake::channel> (node1);
node1.network.inbound (nano::publish{ nano::dev::network_params.network, send1 }, channel1); node1.inbound (nano::publish{ nano::dev::network_params.network, send1 }, channel1);
ASSERT_TIMELY (5s, node1.active.active (send1->qualified_root ())); ASSERT_TIMELY (5s, node1.active.active (send1->qualified_root ()));
auto election (node1.active.election (send1->qualified_root ())); auto election (node1.active.election (send1->qualified_root ()));
ASSERT_NE (nullptr, election); ASSERT_NE (nullptr, election);
ASSERT_EQ (1, election->blocks ().size ()); ASSERT_EQ (1, election->blocks ().size ());
node1.network.inbound (nano::publish{ nano::dev::network_params.network, send3 }, channel1); node1.inbound (nano::publish{ nano::dev::network_params.network, send3 }, channel1);
node1.network.inbound (nano::publish{ nano::dev::network_params.network, send2 }, channel1); node1.inbound (nano::publish{ nano::dev::network_params.network, send2 }, channel1);
ASSERT_TIMELY (3s, election->blocks ().size () > 1); ASSERT_TIMELY (3s, election->blocks ().size () > 1);
ASSERT_EQ (election->blocks ()[send2->hash ()]->block_signature (), send2->block_signature ()); ASSERT_EQ (election->blocks ()[send2->hash ()]->block_signature (), send2->block_signature ());
} }

View file

@ -253,7 +253,7 @@ TEST (telemetry, invalid_signature)
telemetry.block_count = 9999; // Change data so signature is no longer valid telemetry.block_count = 9999; // Change data so signature is no longer valid
auto message = nano::telemetry_ack{ nano::dev::network_params.network, telemetry }; auto message = nano::telemetry_ack{ nano::dev::network_params.network, telemetry };
node.network.inbound (message, nano::test::fake_channel (node)); node.inbound (message, nano::test::fake_channel (node));
ASSERT_TIMELY (5s, node.stats.count (nano::stat::type::telemetry, nano::stat::detail::invalid_signature) > 0); ASSERT_TIMELY (5s, node.stats.count (nano::stat::type::telemetry, nano::stat::detail::invalid_signature) > 0);
ASSERT_ALWAYS (1s, node.stats.count (nano::stat::type::telemetry, nano::stat::detail::process) == 0) ASSERT_ALWAYS (1s, node.stats.count (nano::stat::type::telemetry, nano::stat::detail::process) == 0)
@ -267,7 +267,7 @@ TEST (telemetry, mismatched_node_id)
auto telemetry = node.local_telemetry (); auto telemetry = node.local_telemetry ();
auto message = nano::telemetry_ack{ nano::dev::network_params.network, telemetry }; auto message = nano::telemetry_ack{ nano::dev::network_params.network, telemetry };
node.network.inbound (message, nano::test::fake_channel (node, /* node id */ { 123 })); node.inbound (message, nano::test::fake_channel (node, /* node id */ { 123 }));
ASSERT_TIMELY (5s, node.stats.count (nano::stat::type::telemetry, nano::stat::detail::node_id_mismatch) > 0); ASSERT_TIMELY (5s, node.stats.count (nano::stat::type::telemetry, nano::stat::detail::node_id_mismatch) > 0);
ASSERT_ALWAYS (1s, node.stats.count (nano::stat::type::telemetry, nano::stat::detail::process) == 0) ASSERT_ALWAYS (1s, node.stats.count (nano::stat::type::telemetry, nano::stat::detail::process) == 0)

View file

@ -165,7 +165,7 @@ TEST (websocket, started_election)
.build (); .build ();
nano::publish publish1{ nano::dev::network_params.network, send1 }; nano::publish publish1{ nano::dev::network_params.network, send1 };
auto channel1 = std::make_shared<nano::transport::fake::channel> (*node1); auto channel1 = std::make_shared<nano::transport::fake::channel> (*node1);
node1->network.inbound (publish1, channel1); node1->inbound (publish1, channel1);
ASSERT_TIMELY (1s, node1->active.election (send1->qualified_root ())); ASSERT_TIMELY (1s, node1->active.election (send1->qualified_root ()));
ASSERT_TIMELY_EQ (5s, future.wait_for (0s), std::future_status::ready); ASSERT_TIMELY_EQ (5s, future.wait_for (0s), std::future_status::ready);
@ -213,7 +213,7 @@ TEST (websocket, stopped_election)
.build (); .build ();
nano::publish publish1{ nano::dev::network_params.network, send1 }; nano::publish publish1{ nano::dev::network_params.network, send1 };
auto channel1 = std::make_shared<nano::transport::fake::channel> (*node1); auto channel1 = std::make_shared<nano::transport::fake::channel> (*node1);
node1->network.inbound (publish1, channel1); node1->inbound (publish1, channel1);
ASSERT_TIMELY (5s, node1->active.election (send1->qualified_root ())); ASSERT_TIMELY (5s, node1->active.election (send1->qualified_root ()));
node1->active.erase (*send1); node1->active.erase (*send1);

View file

@ -314,14 +314,6 @@ void nano::network::flood_block_many (std::deque<std::shared_ptr<nano::block>> b
} }
} }
void nano::network::inbound (const nano::message & message, const std::shared_ptr<nano::transport::channel> & channel)
{
debug_assert (message.header.network == node.network_params.network.current_network);
debug_assert (message.header.version_using >= node.network_params.network.protocol_version_min);
node.message_processor.process (message, channel);
}
// Send keepalives to all the peers we've been notified of // Send keepalives to all the peers we've been notified of
void nano::network::merge_peers (std::array<nano::endpoint, 8> const & peers_a) void nano::network::merge_peers (std::array<nano::endpoint, 8> const & peers_a)
{ {

View file

@ -127,7 +127,6 @@ public:
void erase (nano::transport::channel const &); void erase (nano::transport::channel const &);
/** Disconnects and adds peer to exclusion list */ /** Disconnects and adds peer to exclusion list */
void exclude (std::shared_ptr<nano::transport::channel> const & channel); void exclude (std::shared_ptr<nano::transport::channel> const & channel);
void inbound (nano::message const &, std::shared_ptr<nano::transport::channel> const &);
nano::container_info container_info () const; nano::container_info container_info () const;

View file

@ -518,6 +518,16 @@ void nano::node::keepalive (std::string const & address_a, uint16_t port_a)
}); });
} }
void nano::node::inbound (const nano::message & message, const std::shared_ptr<nano::transport::channel> & channel)
{
debug_assert (channel->owner () == shared_from_this ()); // This node should be the channel owner
debug_assert (message.header.network == network_params.network.current_network);
debug_assert (message.header.version_using >= network_params.network.protocol_version_min);
message_processor.process (message, channel);
}
void nano::node::process_active (std::shared_ptr<nano::block> const & incoming) void nano::node::process_active (std::shared_ptr<nano::block> const & incoming)
{ {
block_processor.add (incoming); block_processor.add (incoming);

View file

@ -94,6 +94,7 @@ public:
bool copy_with_compaction (std::filesystem::path const &); bool copy_with_compaction (std::filesystem::path const &);
void keepalive (std::string const &, uint16_t); void keepalive (std::string const &, uint16_t);
int store_version (); int store_version ();
void inbound (nano::message const &, std::shared_ptr<nano::transport::channel> const &);
void process_confirmed (nano::block_hash, std::shared_ptr<nano::election> = nullptr, uint64_t iteration = 0); void process_confirmed (nano::block_hash, std::shared_ptr<nano::election> = nullptr, uint64_t iteration = 0);
void process_active (std::shared_ptr<nano::block> const &); void process_active (std::shared_ptr<nano::block> const &);
std::optional<nano::block_status> process_local (std::shared_ptr<nano::block> const &); std::optional<nano::block_status> process_local (std::shared_ptr<nano::block> const &);

View file

@ -63,6 +63,11 @@ nano::endpoint nano::transport::channel::get_peering_endpoint () const
} }
} }
std::shared_ptr<nano::node> nano::transport::channel::owner () const
{
return node.shared ();
}
void nano::transport::channel::operator() (nano::object_stream & obs) const void nano::transport::channel::operator() (nano::object_stream & obs) const
{ {
obs.write ("endpoint", get_endpoint ()); obs.write ("endpoint", get_endpoint ());

View file

@ -130,6 +130,8 @@ public:
nano::endpoint get_peering_endpoint () const; nano::endpoint get_peering_endpoint () const;
void set_peering_endpoint (nano::endpoint endpoint); void set_peering_endpoint (nano::endpoint endpoint);
std::shared_ptr<nano::node> owner () const;
mutable nano::mutex channel_mutex; mutable nano::mutex channel_mutex;
private: private:

View file

@ -44,7 +44,7 @@ void nano::transport::inproc::channel::send_buffer (nano::shared_const_buffer co
// process message // process message
{ {
node.stats.inc (nano::stat::type::message, to_stat_detail (message_a->type ()), nano::stat::dir::in); node.stats.inc (nano::stat::type::message, to_stat_detail (message_a->type ()), nano::stat::dir::in);
destination.network.inbound (*message_a, remote_channel); destination.inbound (*message_a, remote_channel);
} }
}); });

View file

@ -1138,7 +1138,7 @@ TEST (confirmation_height, many_accounts_send_receive_self_no_elections)
nano::block_hash block_hash_being_processed{ 0 }; nano::block_hash block_hash_being_processed{ 0 };
nano::store::write_queue write_queue; nano::store::write_queue write_queue;
nano::confirming_set_config confirming_set_config{}; nano::confirming_set_config confirming_set_config{};
nano::confirming_set confirming_set{ confirming_set_config, ledger, stats }; nano::confirming_set confirming_set{ confirming_set_config, ledger, stats, logger };
auto const num_accounts = 100000; auto const num_accounts = 100000;

@ -1 +1 @@
Subproject commit 41214f0b4e05aa8123583968df039c0d35228a4f Subproject commit d9787264a8eb0528966ded06499dff46a4f8739c