diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cfd4cc5a3423..771382edd2a1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -265,6 +265,14 @@ jobs: - name: Check image build shell: bash run: bash -x scripts/tests.build_image.sh + test_build_antithesis_avalanchego_image: + name: Antithesis avalanchego build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Check image build + shell: bash + run: bash -x scripts/tests.build_antithesis_avalanchego_image.sh govulncheck: runs-on: ubuntu-latest name: govulncheck diff --git a/.github/workflows/fuzz.yml b/.github/workflows/fuzz.yml index 807f67dd51cc..abc4f141ef3c 100644 --- a/.github/workflows/fuzz.yml +++ b/.github/workflows/fuzz.yml @@ -16,7 +16,7 @@ jobs: with: ref: 'dev' - name: Set up Go - - uses: ./.github/actions/setup-go-for-project + uses: ./.github/actions/setup-go-for-project - name: Run fuzz tests shell: bash run: ./scripts/build_fuzz.sh 180 # Run each fuzz test 180 seconds diff --git a/.github/workflows/publish_antithesis_images.yml b/.github/workflows/publish_antithesis_images.yml index 0932c2f971b7..967a068ec3a1 100644 --- a/.github/workflows/publish_antithesis_images.yml +++ b/.github/workflows/publish_antithesis_images.yml @@ -9,10 +9,6 @@ on: env: REGISTRY: us-central1-docker.pkg.dev REPOSITORY: molten-verve-216720/avalanche-repository - NODE_NAME: avalanche-node - WORKLOAD_NAME: workload - CONFIG_NAME: config - TAG: latest jobs: antithesis: @@ -29,33 +25,8 @@ jobs: username: _json_key password: ${{ secrets.ANTITHESIS_GAR_JSON_KEY }} - - name: Set the Go version in the environment - uses: ./.github/actions/set-go-version-in-env - - - name: Build node - id: build-node-image - run: | - docker build --build-arg GO_VERSION=${GO_VERSION} -t $REGISTRY/$REPOSITORY/$NODE_NAME:$TAG -f ./tests/antithesis/Dockerfile.node . - echo "name=image::$REGISTRY/$REPOSITORY/$NODE_NAME:$TAG" >> $GITHUB_OUTPUT - env: - GO_VERSION: '${{ env.GO_VERSION }}' - - - name: Build workload - id: build-workload-image - run: | - docker build --build-arg GO_VERSION=${GO_VERSION} -t $REGISTRY/$REPOSITORY/$WORKLOAD_NAME:$TAG -f ./tests/antithesis/Dockerfile.workload . - echo "name=image::$REGISTRY/$REPOSITORY/$WORKLOAD_NAME:$TAG" >> $GITHUB_OUTPUT + - name: Build images for avalanchego test setup + run: bash -x ./scripts/build_antithesis_avalanchego_image.sh env: - GO_VERSION: '${{ env.GO_VERSION }}' - - - name: Build config - id: build-config-image - run: | - docker build -t $REGISTRY/$REPOSITORY/$CONFIG_NAME:$TAG -f ./tests/antithesis/Dockerfile.config . - echo "name=image::$REGISTRY/$REPOSITORY/$CONFIG_NAME:$TAG" >> $GITHUB_OUTPUT - - - name: Publish images - run: | - docker push ${REGISTRY}/${REPOSITORY}/${NODE_NAME}:${TAG} - docker push ${REGISTRY}/${REPOSITORY}/${WORKLOAD_NAME}:${TAG} - docker push ${REGISTRY}/${REPOSITORY}/${CONFIG_NAME}:${TAG} + IMAGE_PREFIX: ${{ env.REGISTRY }}/${{ env.REPOSITORY }} + TAG: latest diff --git a/go.mod b/go.mod index c68758eea342..16ecdb206a1c 100644 --- a/go.mod +++ b/go.mod @@ -10,6 +10,7 @@ require ( github.com/ava-labs/ledger-avalanche/go v0.0.0-20231102202641-ae2ebdaeac34 github.com/btcsuite/btcd/btcutil v1.1.3 github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 + github.com/compose-spec/compose-go v1.20.2 github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 github.com/ethereum/go-ethereum v1.13.2 github.com/google/btree v1.1.2 @@ -62,6 +63,7 @@ require ( google.golang.org/grpc v1.62.0 google.golang.org/protobuf v1.33.0 gopkg.in/natefinch/lumberjack.v2 v2.0.0 + gopkg.in/yaml.v3 v3.0.1 ) require ( @@ -82,7 +84,10 @@ require ( github.com/crate-crypto/go-kzg-4844 v0.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect + github.com/distribution/reference v0.5.0 // indirect github.com/dlclark/regexp2 v1.7.0 // indirect + github.com/docker/go-connections v0.4.0 // indirect + github.com/docker/go-units v0.5.0 // indirect github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127 // indirect github.com/ethereum/c-kzg-4844 v0.3.1 // indirect github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 // indirect @@ -116,10 +121,12 @@ require ( github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.16 // indirect github.com/mattn/go-runewidth v0.0.9 // indirect + github.com/mattn/go-shellwords v1.0.12 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mitchellh/pointerstructure v1.2.0 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/opencontainers/go-digest v1.0.0 // indirect github.com/pelletier/go-toml v1.9.5 // indirect github.com/pelletier/go-toml/v2 v2.0.5 // indirect github.com/pkg/errors v0.9.1 // indirect @@ -129,6 +136,7 @@ require ( github.com/rogpeppe/go-internal v1.10.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/sanity-io/litter v1.5.1 // indirect + github.com/sirupsen/logrus v1.9.0 // indirect github.com/spf13/afero v1.8.2 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/status-im/keycard-go v0.2.0 // indirect @@ -150,6 +158,5 @@ require ( google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/go.sum b/go.sum index ee53bd2b070c..fa4f833dcf02 100644 --- a/go.sum +++ b/go.sum @@ -126,6 +126,8 @@ github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06/go.mod h1:bynZ3 github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= +github.com/compose-spec/compose-go v1.20.2 h1:u/yfZHn4EaHGdidrZycWpxXgFffjYULlTbRfJ51ykjQ= +github.com/compose-spec/compose-go v1.20.2/go.mod h1:+MdqXV4RA7wdFsahh/Kb8U0pAJqkg7mr4PM9tFKU8RM= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= @@ -154,9 +156,15 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2U github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= +github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/dlclark/regexp2 v1.7.0 h1:7lJfhqlPssTb1WQx4yvTHN0uElPEv52sbaECrAQxjAo= github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= +github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dop251/goja v0.0.0-20211022113120-dc8c55024d06/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127 h1:qwcF+vdFrvPSEUDSX5RVoRccG8a5DhOdWdQ4zN62zzo= github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127/go.mod h1:QMWlm50DNe14hD7t24KEqZuUdC9sOTy8W6XbCU1mlw4= @@ -408,6 +416,8 @@ github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peK github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk= +github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= @@ -460,6 +470,8 @@ github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAl github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= github.com/onsi/gomega v1.29.0 h1:KIA/t2t5UBzoirT4H9tsML45GEbo3ouUnBHsCfD2tVg= github.com/onsi/gomega v1.29.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= @@ -505,6 +517,8 @@ github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAm github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= +github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= @@ -808,6 +822,7 @@ golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220405052023-b1e9470b6e64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1033,6 +1048,8 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= +gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/scripts/build_antithesis_avalanchego_image.sh b/scripts/build_antithesis_avalanchego_image.sh new file mode 100755 index 000000000000..e39a44e1fcfc --- /dev/null +++ b/scripts/build_antithesis_avalanchego_image.sh @@ -0,0 +1,56 @@ +#!/usr/bin/env bash + +set -euo pipefail + +# Builds the images required for the 'avalanchego' Antithesis test setup. + +# e.g., +# ./scripts/build_antithesis_avalanchego_image.sh # Build local images +# IMAGE_PREFIX=/ TAG=latest ./scripts/build_antithesis_avalanchego_image.sh # Specify a prefix to enable image push and use a specific tag + +# Directory above this script +AVALANCHE_PATH=$( cd "$( dirname "${BASH_SOURCE[0]}" )"; cd .. && pwd ) + +# Specifying an image prefix will ensure the image is pushed after build +IMAGE_PREFIX="${IMAGE_PREFIX:-}" + +TAG="${TAG:-}" +if [[ -z "${TAG}" ]]; then + # Default to tagging with the commit hash + source "${AVALANCHE_PATH}"/scripts/constants.sh + TAG="${commit_hash}" +fi + +# buildx (BuildKit) improves the speed and UI of builds over the legacy builder and +# simplifies creation of multi-arch images. +# +# Reference: https://docs.docker.com/build/buildkit/ +DOCKER_CMD="docker buildx build" + +# The dockerfiles don't specify the golang version to minimize the changes required to bump +# the version. Instead, the golang version is provided as an argument. +GO_VERSION="$(go list -m -f '{{.GoVersion}}')" +DOCKER_CMD="${DOCKER_CMD} --build-arg GO_VERSION=${GO_VERSION}" + +# Antithesis instrumentation is only supported on amd64. On apple silicon (arm64), the +# regular (uninstrumented) Dockerfile will be used to build the node image to enable local +# test development. +NODE_DOCKERFILE="${AVALANCHE_PATH}/tests/antithesis/avalanchego/Dockerfile.instrumented-node" +GOARCH="$(go env GOARCH)" +if [[ "${GOARCH}" == "arm64" ]]; then + NODE_DOCKERFILE="${AVALANCHE_PATH}/Dockerfile" +fi + +# Build node image. It is intended to be base image for the test image and will not be pushed. +${DOCKER_CMD} -t antithesis-avalanchego-node:"${TAG}" -f "${NODE_DOCKERFILE}" "${AVALANCHE_PATH}" + +TEST_IMAGE_NAME=antithesis-avalanchego +if [ -n "${IMAGE_PREFIX}" ]; then + # Assume a prefix requires pushing to a registry. + TEST_IMAGE_NAME="${IMAGE_PREFIX}/${TEST_IMAGE_NAME}" + DOCKER_CMD="${DOCKER_CMD} --push" +fi + +# Build test image based on the node image +${DOCKER_CMD} -t "${TEST_IMAGE_NAME}:${TAG}" --build-arg NODE_IMAGE_TAG="${TAG}" \ + -f "${AVALANCHE_PATH}"/tests/antithesis/avalanchego/Dockerfile "${AVALANCHE_PATH}" diff --git a/scripts/build_antithesis_workload.sh b/scripts/build_antithesis_avalanchego_workload.sh similarity index 66% rename from scripts/build_antithesis_workload.sh rename to scripts/build_antithesis_avalanchego_workload.sh index e0d99d1fed11..fce00e263d0b 100755 --- a/scripts/build_antithesis_workload.sh +++ b/scripts/build_antithesis_avalanchego_workload.sh @@ -8,4 +8,4 @@ AVALANCHE_PATH=$( cd "$( dirname "${BASH_SOURCE[0]}" )"; cd .. && pwd ) source "$AVALANCHE_PATH"/scripts/constants.sh echo "Building Workload..." -go build -o "$AVALANCHE_PATH/build/workload" "$AVALANCHE_PATH/tests/antithesis/"*.go +go build -o "$AVALANCHE_PATH/build/antithesis-avalanchego-workload" "$AVALANCHE_PATH/tests/antithesis/avalanchego/"*.go diff --git a/scripts/build_test.sh b/scripts/build_test.sh index 1b9302b693cc..747cb8882449 100755 --- a/scripts/build_test.sh +++ b/scripts/build_test.sh @@ -11,8 +11,8 @@ EXCLUDED_TARGETS="| grep -v /mocks | grep -v proto | grep -v tests/e2e | grep -v GOOS=$(go env GOOS) if [[ "$GOOS" == "windows" ]]; then - # tmpnet is not compatible with windows - EXCLUDED_TARGETS="${EXCLUDED_TARGETS} | grep -v tests/fixture" + # tmpnet and antithesis tests (which depend on tmpnet) are not compatible with windows + EXCLUDED_TARGETS="${EXCLUDED_TARGETS} | grep -v tests/fixture | grep -v tests/antithesis" fi TEST_TARGETS="$(eval "go list ./... ${EXCLUDED_TARGETS}")" diff --git a/scripts/tests.build_antithesis_avalanchego_image.sh b/scripts/tests.build_antithesis_avalanchego_image.sh new file mode 100755 index 000000000000..a335961963a5 --- /dev/null +++ b/scripts/tests.build_antithesis_avalanchego_image.sh @@ -0,0 +1,57 @@ +#!/usr/bin/env bash + +set -euo pipefail + +# Validates the construction of the antithesis test image for avalanchego by: +# +# 1. Building the antithesis test image +# 2. Extracting the docker compose configuration from the image +# 3. Running the workload and its target network without error for a minute +# 4. Stopping the workload and its target network +# + +AVALANCHE_PATH=$( cd "$( dirname "${BASH_SOURCE[0]}" )"; cd .. && pwd ) + +# Discover the tag that will be used for the image +source "${AVALANCHE_PATH}"/scripts/constants.sh +export TAG="${commit_hash}" + +# Build the image +bash -x "${AVALANCHE_PATH}"/scripts/build_antithesis_avalanchego_image.sh + +# Create a container from the test image to extract compose configuration from +IMAGE_NAME=antithesis-avalanchego +CONTAINER_NAME="tmp-${IMAGE_NAME}" +docker create --name "${CONTAINER_NAME}" "${IMAGE_NAME}:${TAG}" + +# Create a temporary directory to write the compose configuration to +TMPDIR="$(mktemp -d)" +COMPOSE_FILE="${TMPDIR}/docker-compose.yml" +COMPOSE_CMD="docker-compose -f ${COMPOSE_FILE}" + +# Ensure cleanup +function cleanup { + echo "removing temporary container" + docker rm "${CONTAINER_NAME}" + echo "stopping and removing the docker compose project" + ${COMPOSE_CMD} down --volumes + echo "removing temporary dir" + rm -rf "${TMPDIR}" +} +trap cleanup EXIT + +# Copy the docker-compose.yml file out of the container +docker cp "${CONTAINER_NAME}":/docker-compose.yml "${COMPOSE_FILE}" + +# Copy the volume paths out of the container +docker cp "${CONTAINER_NAME}":/volumes "${TMPDIR}/" + +# Run the docker compose project for one minute without error +${COMPOSE_CMD} up -d +sleep 60 +if ${COMPOSE_CMD} ps -q | xargs docker inspect -f '{{ .State.Status }}' | grep -v 'running'; then + echo "An error occurred." + exit 255 +fi + +# Success! diff --git a/tests/antithesis/Dockerfile.config b/tests/antithesis/Dockerfile.config deleted file mode 100644 index f00caae693be..000000000000 --- a/tests/antithesis/Dockerfile.config +++ /dev/null @@ -1,3 +0,0 @@ -FROM scratch - -COPY ./tests/antithesis/docker-compose.yml /docker-compose.yml diff --git a/tests/antithesis/Dockerfile.workload b/tests/antithesis/Dockerfile.workload deleted file mode 100644 index 5ac63b893177..000000000000 --- a/tests/antithesis/Dockerfile.workload +++ /dev/null @@ -1,26 +0,0 @@ -# The version is supplied as a build argument rather than hard-coded -# to minimize the cost of version changes. -ARG GO_VERSION - -# ============= Compilation Stage ================ -FROM golang:$GO_VERSION-bullseye AS builder - -WORKDIR /build -# Copy and download avalanche dependencies using go mod -COPY go.mod . -COPY go.sum . -RUN go mod download - -# Copy the code into the container -COPY . . - -# Build the workload -RUN ./scripts/build_antithesis_workload.sh - -# ============= Cleanup Stage ================ -FROM debian:11-slim AS execution - -# Copy the executable into the container -COPY --from=builder /build/build/workload ./workload - -CMD [ "./workload" ] diff --git a/tests/antithesis/README.md b/tests/antithesis/README.md new file mode 100644 index 000000000000..df9a88bd6673 --- /dev/null +++ b/tests/antithesis/README.md @@ -0,0 +1,58 @@ +# Antithesis Testing + +This package supports testing with +[Antithesis](https://antithesis.com/docs/introduction/introduction.html), +a SaaS offering that enables deployment of distributed systems (such +as Avalanche) to a deterministic and simulated environment that +enables discovery and reproduction of anomalous behavior. + +## Package details + +| Filename | Purpose | +|:-------------|:----------------------------------------------------------------------------------| +| compose.go | Enables generation of Docker Compose project files for antithesis testing. | +| avalanchego/ | Contains resources supporting antithesis testing of avalanchego's primary chains. | + + +## Instrumentation + +Software running in Antithesis's environment must be +[instrumented](https://antithesis.com/docs/instrumentation/overview.html) +to take full advantage of the supported traceability. Since the +Antithesis Go SDK only supports the amd64/x86_64 architecture as of this +writing, running of instrumented binaries on Macs (arm64) is not possible +without emulation (which would be very slow). To support test development +on Macs, a local build will not be instrumented. This suggested a 2-stage +build: + + - build a node image (instrumented or not) + - build a test image based on the node image + +Having 2 stages allows reusing a non-instrumented Dockerfile for local +development without having to duplicate workload configuration across +Dockerfiles for both instrumented and non-instrumented builds. + +This means there are 2 images produced by image build: a node image, and +a test image. The test image is based on the node image, and only the +test image is intended to be published for use in antithesis testing. + +## Defining a new test setup + +When defining a new test setup - whether in the avalanchego repo or for a +VM in another repo - following the example of an existing test setup is +suggested. The following table enumerates the files defined for existing +test setups: + +| Filename | Purpose | +|:-----------------------------------------------------------|:-------------------------------------------------------| +| scripts/build_antithesis_[test setup]_image.sh | Builds the test image to deploy to antithesis | +| scripts/build_antithesis_[test setup]_workload.sh | Builds the workload binary | +| scripts/tests.build_antithesis_[test setup]_image.sh | Validates test image build | +| tests/antithesis/[test setup]/main.go | The entrypoint for the workload binary | +| tests/antithesis/[test setup]/Dockerfile.instrumented-node | Defines how to build the instrumented node image | +| tests/antithesis/[test setup]/Dockerfile | Defines how to build the test image | +| tests/antithesis/[test setup]/gencomposeconfig/main.go | Generates the compose configuration for the test setup | + +In addition, github workflows are suggested to ensure +`scripts/tests.build_antithesis_[test setup]_image.sh` runs against PRs +and `scripts/build_antithesis_[test setup]_image.sh` runs against pushes. diff --git a/tests/antithesis/avalanchego/Dockerfile b/tests/antithesis/avalanchego/Dockerfile new file mode 100644 index 000000000000..1acfca7c252d --- /dev/null +++ b/tests/antithesis/avalanchego/Dockerfile @@ -0,0 +1,40 @@ +# The version is supplied as a build argument rather than hard-coded +# to minimize the cost of version changes. +ARG GO_VERSION + +# NODE_IMAGE_TAG needs to be set to the tag of an existing node image +# and will be used to determine the base execution image. +ARG NODE_IMAGE_TAG + +# ============= Compilation Stage ================ +FROM golang:$GO_VERSION-bullseye AS builder + +WORKDIR /build +# Copy and download avalanche dependencies using go mod +COPY go.mod . +COPY go.sum . +RUN go mod download + +# Copy the code into the container +COPY . . + +# Build the workload +RUN ./scripts/build_antithesis_avalanchego_workload.sh + +# Generate docker compose configuration +ARG NODE_IMAGE_TAG=latest +RUN TARGET_PATH=./build IMAGE_NAME="antithesis-avalanchego:${NODE_IMAGE_TAG}" \ + go run ./tests/antithesis/avalanchego/gencomposeconfig + +# ============= Cleanup Stage ================ +FROM antithesis-avalanchego-node:$NODE_IMAGE_TAG AS execution + +# Copy the workload into the container +COPY --from=builder /build/build/antithesis-avalanchego-workload /workload + +# Copy the docker compose file and volumes into the container +COPY --from=builder /build/build/docker-compose.yml /docker-compose.yml +COPY --from=builder /build/build/volumes /volumes + +# The node image's entrypoint will be retained. The docker compose +# file is intended to override the entrypoint to start the workload. diff --git a/tests/antithesis/Dockerfile.node b/tests/antithesis/avalanchego/Dockerfile.instrumented-node similarity index 100% rename from tests/antithesis/Dockerfile.node rename to tests/antithesis/avalanchego/Dockerfile.instrumented-node diff --git a/tests/antithesis/config.go b/tests/antithesis/avalanchego/config.go similarity index 100% rename from tests/antithesis/config.go rename to tests/antithesis/avalanchego/config.go diff --git a/tests/antithesis/avalanchego/gencomposeconfig/main.go b/tests/antithesis/avalanchego/gencomposeconfig/main.go new file mode 100644 index 000000000000..fafd18c91fce --- /dev/null +++ b/tests/antithesis/avalanchego/gencomposeconfig/main.go @@ -0,0 +1,31 @@ +// Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +package main + +import ( + "log" + "os" + + "github.com/ava-labs/avalanchego/tests/antithesis" + "github.com/ava-labs/avalanchego/tests/fixture/tmpnet" +) + +// Creates docker-compose.yml and its associated volumes in the target path. +func main() { + targetPath := os.Getenv("TARGET_PATH") + if len(targetPath) == 0 { + log.Fatal("TARGET_PATH environment variable not set") + } + + imageName := os.Getenv("IMAGE_NAME") + if len(imageName) == 0 { + log.Fatal("IMAGE_NAME environment variable not set") + } + + network := tmpnet.LocalNetworkOrDie() + err := antithesis.GenerateComposeConfig(network, imageName, targetPath) + if err != nil { + log.Fatalf("failed to initialize config for docker-compose: %s", err) + } +} diff --git a/tests/antithesis/main.go b/tests/antithesis/avalanchego/main.go similarity index 100% rename from tests/antithesis/main.go rename to tests/antithesis/avalanchego/main.go diff --git a/tests/antithesis/compose.go b/tests/antithesis/compose.go new file mode 100644 index 000000000000..fbbfe30acd3d --- /dev/null +++ b/tests/antithesis/compose.go @@ -0,0 +1,188 @@ +// Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +package antithesis + +import ( + "fmt" + "os" + "path/filepath" + "strings" + + "github.com/compose-spec/compose-go/types" + "gopkg.in/yaml.v3" + + "github.com/ava-labs/avalanchego/config" + "github.com/ava-labs/avalanchego/tests/fixture/tmpnet" + "github.com/ava-labs/avalanchego/utils/constants" + "github.com/ava-labs/avalanchego/utils/logging" + "github.com/ava-labs/avalanchego/utils/perms" +) + +// Initialize the given path with the docker-compose configuration (compose file and +// volumes) needed for an Antithesis test setup. +func GenerateComposeConfig(network *tmpnet.Network, imageName string, targetPath string) error { + // Generate a compose project for the specified network + project, err := newComposeProject(network, imageName) + if err != nil { + return fmt.Errorf("failed to create compose project: %w", err) + } + + absPath, err := filepath.Abs(targetPath) + if err != nil { + return fmt.Errorf("failed to convert target path to absolute path: %w", err) + } + + if err := os.MkdirAll(absPath, perms.ReadWriteExecute); err != nil { + return fmt.Errorf("failed to create target path %q: %w", absPath, err) + } + + // Write the compose file + bytes, err := yaml.Marshal(&project) + if err != nil { + return fmt.Errorf("failed to marshal compose project: %w", err) + } + composePath := filepath.Join(targetPath, "docker-compose.yml") + if err := os.WriteFile(composePath, bytes, perms.ReadWrite); err != nil { + return fmt.Errorf("failed to write genesis: %w", err) + } + + // Create the volume paths + for _, service := range project.Services { + for _, volume := range service.Volumes { + volumePath := filepath.Join(absPath, volume.Source) + if err := os.MkdirAll(volumePath, perms.ReadWriteExecute); err != nil { + return fmt.Errorf("failed to create volume path %q: %w", volumePath, err) + } + } + } + return nil +} + +// Create a new docker compose project for an antithesis test setup +// for the provided network configuration. +func newComposeProject(network *tmpnet.Network, imageName string) (*types.Project, error) { + networkName := "avalanche-testnet" + baseNetworkAddress := "10.0.20" + + services := make(types.Services, len(network.Nodes)+1) + uris := make([]string, len(network.Nodes)) + var ( + bootstrapIP string + bootstrapIDs string + ) + for i, node := range network.Nodes { + address := fmt.Sprintf("%s.%d", baseNetworkAddress, 3+i) + + tlsKey, err := node.Flags.GetStringVal(config.StakingTLSKeyContentKey) + if err != nil { + return nil, err + } + tlsCert, err := node.Flags.GetStringVal(config.StakingCertContentKey) + if err != nil { + return nil, err + } + signerKey, err := node.Flags.GetStringVal(config.StakingSignerKeyContentKey) + if err != nil { + return nil, err + } + + env := types.Mapping{ + config.NetworkNameKey: constants.LocalName, + config.AdminAPIEnabledKey: "true", + config.LogLevelKey: logging.Debug.String(), + config.LogDisplayLevelKey: logging.Trace.String(), + config.HTTPHostKey: "0.0.0.0", + config.PublicIPKey: address, + config.StakingTLSKeyContentKey: tlsKey, + config.StakingCertContentKey: tlsCert, + config.StakingSignerKeyContentKey: signerKey, + } + + nodeName := "avalanche" + if i == 0 { + nodeName += "-bootstrap-node" + bootstrapIP = address + ":9651" + bootstrapIDs = node.NodeID.String() + } else { + nodeName = fmt.Sprintf("%s-node-%d", nodeName, i+1) + env[config.BootstrapIPsKey] = bootstrapIP + env[config.BootstrapIDsKey] = bootstrapIDs + } + + // The env is defined with the keys and then converted to env + // vars because only the keys are available as constants. + env = keyMapToEnvVarMap(env) + + services[i+1] = types.ServiceConfig{ + Name: nodeName, + ContainerName: nodeName, + Hostname: nodeName, + Image: imageName, + Volumes: []types.ServiceVolumeConfig{ + { + Type: types.VolumeTypeBind, + Source: fmt.Sprintf("./volumes/%s/logs", nodeName), + Target: "/root/.avalanchego/logs", + }, + }, + Environment: env.ToMappingWithEquals(), + Networks: map[string]*types.ServiceNetworkConfig{ + networkName: { + Ipv4Address: address, + }, + }, + } + + // Collect URIs for the workload container + uris[i] = fmt.Sprintf("http://%s:9650", address) + } + + workloadEnv := types.Mapping{ + "AVAWL_URIS": strings.Join(uris, " "), + } + + workloadName := "workload" + services[0] = types.ServiceConfig{ + Name: workloadName, + ContainerName: workloadName, + Hostname: workloadName, + Image: imageName, + Command: types.ShellCommand{ + "/workload", // Need to override to run the workload. The default for the test image will be avalanchego. + }, + Environment: workloadEnv.ToMappingWithEquals(), + Networks: map[string]*types.ServiceNetworkConfig{ + networkName: { + Ipv4Address: baseNetworkAddress + ".129", + }, + }, + } + + return &types.Project{ + Networks: types.Networks{ + networkName: types.NetworkConfig{ + Driver: "bridge", + Ipam: types.IPAMConfig{ + Config: []*types.IPAMPool{ + { + Subnet: baseNetworkAddress + ".0/24", + }, + }, + }, + }, + }, + Services: services, + }, nil +} + +// Convert a mapping of avalanche config keys to a mapping of env vars +func keyMapToEnvVarMap(keyMap types.Mapping) types.Mapping { + envVarMap := make(types.Mapping, len(keyMap)) + for key, val := range keyMap { + // e.g. network-id -> AVAGO_NETWORK_ID + envVar := "AVAGO_" + strings.ToUpper(strings.ReplaceAll(key, "-", "_")) + envVarMap[envVar] = val + } + return envVarMap +} diff --git a/tests/antithesis/docker-compose.yml b/tests/antithesis/docker-compose.yml deleted file mode 100644 index ad7da92b15fe..000000000000 --- a/tests/antithesis/docker-compose.yml +++ /dev/null @@ -1,119 +0,0 @@ -networks: - avalanche-testnet: - driver: bridge - ipam: - config: - - { subnet: 10.0.20.0/24 } -services: - # workload waits until cluster is up, issues 5 transactions, and the intializes the wallet. THEN we start fuzzing - workload: - container_name: workload - image: workload:latest - environment: { - AVAWL_URIS: "http://10.0.20.3:9650 http://10.0.20.4:9650 http://10.0.20.5:9650 http://10.0.20.6:9650 http://10.0.20.7:9650" - } - networks: - avalanche-testnet: { ipv4_address: 10.0.20.129 } - avalanche-bootstrap-node: - container_name: avalanche-bootstrap-node - hostname: avalanche-bootstrap-node - image: avalanche-node:latest - volumes: - - ./avalanche-bootstrap-node/logs:/root/.avalanchego/logs - environment: { - AVAGO_NETWORK_ID: "local", - AVAGO_API_ADMIN_ENABLED: "true", - AVAGO_LOG_LEVEL: "DEBUG", - AVAGO_LOG_DISPLAY_LEVEL: "TRACE", - AVAGO_HTTP_HOST: "0.0.0.0", - AVAGO_PUBLIC_IP: "10.0.20.3", - AVAGO_STAKING_TLS_KEY_FILE_CONTENT: "LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlKS0FJQkFBS0NBZ0VBeW1Fa2NQMXRHS1dCL3pFMElZaGEwZEp2UFplc2s3c3k2UTdZN25hLytVWjRTRDc3CmFwTzJDQnB2NXZaZHZjY0VlQ2VhKzBtUnJQdTlNZ1hyWkcwdm9lejhDZHE1bGc4RzYzY2lTcjFRWWFuL0pFcC8KbFZOaTNqMGlIQ1k5ZmR5dzhsb1ZkUitKYWpaRkpIQUVlK2hZZmFvekx3TnFkTHlldXZuZ3kxNWFZZjBXR3FVTQpmUjREby85QVpnQ2pLMkFzcU9RWVVZb2Zqcm9JUEdpdUJ2VDBFeUFPUnRzRTFsdGtKQjhUUDBLYVJZMlhmMThFCkhpZGgrcm0xakJYT1g3YlgrZ002U2J4U0F3YnZ5UXdpbG9ncnVadkxlQmkvTU5qcXlNZkNiTmZaUmVHR0JObnEKSXdxM3FvRDR1dUV0NkhLc0NyQTZNa2s4T3YrWWlrT1FWR01GRjE5OCt4RnpxZy9FakIzbjFDbm5NNCtGcndHbQpTODBkdTZsNXVlUklFV0VBQ0YrSDRabU96WDBxS2Qxb2RCS090dmlSNkRQOVlQbElEbDVXNTFxV1BlVElIZS8zCjhBMGxpN3VDTVJOUDdxdkZibnlHM3d1TXEyUEtwVTFYd0gzeU5aWFVYYnlZenlRVDRrTkFqYXpwZXRDMWFiYVoKQm5QYklSKzhHZG16OUd4SjJDazRDd0h6c3cvRkxlOVR0Z0RpR3ZOQU5SalJaZUdKWHZ6RWpTVG5FRGtxWUxWbgpVUk15RktIcHdJMzdzek9Ebms2K0hFWU9QbFdFd0tQU2h5cTRqZFE3bnNEY3huZkZveWdGUjVuQ0RJNmlFaTA1CmN6SVhiSFp2anBuME9qcjhsKzc5Qmt6Z1c0VDlQVFJuTU1PUU5JQXMxemRmQlV1YU1aOFh1amh2UTlNQ0F3RUEKQVFLQ0FnRUF1VU00TXQ4cjhiWUJUUFZqL1padlhVakFZS2ZxYWNxaWprcnpOMGtwOEM0Y2lqWnR2V0MrOEtnUwo3R0YzNnZTM0dLOVk1dFN3TUtTNnk0SXp2RmxmazJINFQ2VVU0MU9hU0E5bEt2b25EV0NybWpOQW5CZ2JsOHBxCjRVMzRXTEdnb2hycExiRFRBSkh4dGF0OXoxZ2hPZGlHeG5EZ0VVRmlKVlA5L3UyKzI1anRsVEttUGhzdHhnRXkKbUszWXNTcDNkNXhtenE0Y3VYRi9mSjF2UWhzWEhETHFIdDc4aktaWkErQVdwSUI1N1ZYeTY3eTFiazByR25USwp4eFJuT2FPT0R1YkpneHFNRVExV2tMczFKb3c5U3NwZDl2RGdoUHp0NFNOTXpvckI4WURFU01pYjE3eEY2aVhxCmpGajZ4NkhCOEg3bXA0WDNSeU1ZSnVvMnc2bHB6QnNFbmNVWXBLaHFNYWJGMEkvZ2lJNVZkcFNEdmtDQ09GZW4KbldaTFY5QWkveDd0VHEvMEYrY1ZNNjlNZ2ZlOGlZeW1xbGZkNldSWklUS2ZWaU5IQUxsRy9QcTl5SEpzejdOZwpTOEJLT0R0L3NqNFEweEx0RkRUL0RtcFA1MGlxN1NpUzE0b2JjS2NRcjhGQWpNL3NPWS9VbGc0TThNQTdFdWdTCnBESndMbDZYRG9JTU1DTndaMUhHc0RzdHpteDVNZjUwYlM0dGJLNGlaemNwUFg1UkJUbFZkbzlNVFNnbkZpenAKSWkxTmpITHVWVkNTTGIxT2pvVGd1MGNRRmlXRUJDa0MxWHVvUjhSQ1k2aVdWclVINEdlem5pN2NrdDJtSmFOQQpwZDYvODdkRktFM2poNVQ2alplSk1KZzVza1RaSFNvekpEdWFqOXBNSy9KT05TRDA2c0VDZ2dFQkFQcTJsRW1kCmcxaHBNSXFhN2V5MXVvTGQxekZGemxXcnhUSkxsdTM4TjY5bVlET0hyVi96cVJHT3BaQisxbkg3dFFKSVQvTDEKeExOMzNtRlZxQ3JOOHlVbVoraVVXaW9hSTVKWjFqekNnZW1WR2VCZ29kd1A5TU9aZnh4ckRwMTdvVGRhYmFFcQo3WmFCWW5ZOHhLLzRiQ3h1L0I0bUZpRjNaYThaVGQvKzJ5ZXY3Sk0rRTNNb3JXYzdyckttMUFwZmxmeHl0ZGhPCkpMQmlxT2Nxb2JJM2RnSHl6ZXNWYjhjVDRYQ3BvUmhkckZ3b3J0MEpJN3J5ZmRkZDQ5dk1KM0VsUmJuTi9oNEYKZjI0Y1dZL3NRUHEvbmZEbWVjMjhaN25WemExRDRyc3pOeWxZRHZ6ZGpGMFExbUw1ZEZWbnRXYlpBMUNOdXJWdwpuVGZ3dXlROFJGOVluWU1DZ2dFQkFNNmxwTmVxYWlHOWl4S1NyNjVwWU9LdEJ5VUkzL2VUVDR2Qm5yRHRZRis4Cm9oaUtnSXltRy92SnNTZHJ5bktmd0pPYkV5MmRCWWhDR0YzaDl6Mm5jOUtKUUQvc3U3d3hDc2RtQnM3WW9EaU0KdXpOUGxSQW1JMFFBRklMUENrNDh6L2xVUWszci9NenUwWXpSdjdmSTRXU3BJR0FlZlZQRHF5MXVYc0FURG9ESgphcmNFa05ENUxpYjg5THg3cjAyRWV2SkpUZGhUSk04bUJkUmw2d3BOVjN4QmR3aXM2N3VTeXVuRlpZcFNpTXc3CldXaklSaHpoTEl2cGdENzhVdk52dUppMFVHVkVqVHFueHZ1VzNZNnNMZklrODBLU1IyNFVTaW5UMjd0Ly94N3oKeXpOa283NWF2RjJobTFmOFkvRXBjSEhBYXg4TkFRRjV1dVY5eEJOdnYzRUNnZ0VBZFMvc1JqQ0syVU5wdmcvRwowRkx0V0FncmNzdUhNNEl6alZ2SnMzbWw2YVYzcC81dUtxQncwVlVVekdLTkNBQTRUbFhRa09jUnh6VnJTNkhICkZpTG4yT0NIeHkyNHExOUdhenowcDdmZkUzaHUvUE1PRlJlY04rVkNoZDBBbXRuVHRGVGZVMnNHWE1nalp0TG0KdUwzc2lpUmlVaEZKWE9FN05Vb2xuV0s1dTJZK3RXQlpwUVZKY0N4MGJ1c054NytBRXR6blpMQzU4M3hhS0p0RApzMUs3SlJRQjdqVTU1eHJDMEc5cGJrTXlzbTBOdHlGemd3bWZpcEJIVmxDcHl2ZzZEQ3hkOEZodmhOOVplYTFiCmZoa2MwU0pab3JIQzVoa3FweWRKRG1sVkNrMHZ6RUFlUU00Qzk0WlVPeXRibmpRbm1YcDE0Q05BU1lxTFh0ZVEKdWVSbzB3S0NBUUFHMEYxMEl4Rm0xV290alpxdlpKZ21RVkJYLzBmclVQY3hnNHZwQjVyQzdXUm03TUk2WVF2UgpMS0JqeldFYWtIdjRJZ2ZxM0IrZms1WmNHaVJkNnhTZG41cjN3S1djR2YzaC8xSkFKZEo2cXVGTld0VnVkK04zCnpZemZsMVllcUZDdlJ3RDhzc2hlTlkzQlYvVTdhU3ROZDJveTRTNSt3WmYyWW9wTFNSV1VWNC9tUXdkSGJNQUIKMXh0Mno1bEROQmdkdng4TEFBclpyY1pKYjZibGF4RjBibkF2WUF4UjNoQkV6eFovRGlPbW9GcGRZeVUwdEpRVQpkUG1lbWhGZUo1UHRyUnh0aW1vaHdnQ0VzVC9UQVlodVVKdVkyVnZ6bkVXcHhXdWNiaWNLYlQySkQwdDY3bUVCCnNWOSs4anFWYkNsaUJ0ZEJhZHRib2hqd2trb1IzZ0J4QW9JQkFHM2NadU5rSVdwRUxFYmVJQ0tvdVNPS04wNnIKRnMvVVhVOHJvTlRoUFI3dlB0amVEMU5ETW1VSEpyMUZHNFNKclNpZ2REOHFOQmc4dy9HM25JMEl3N2VGc2trNQo4bU5tMjFDcER6T04zNlpPN0lETWo1dXlCbGoydCtJeGwvdUpZaFlTcHVOWHlVVE1tK3JrRkowdmRTVjRmakxkCkoybTMwanVZbk1pQkJKZjdkejVNOTUrVDB4aWNHV3lWMjR6VllZQmJTbzBOSEVHeHFlUmhpa05xWk5Qa29kNmYKa2ZPSlpHYWxoMkthSzVSTXBacEZGaFova1c5eFJXTkpaeUNXZ2tJb1lrZGlsTXVJU0J1M2xDcms4cmRNcEFMMAp3SEVjcTh4d2NnWUNTMnFrOEh3anRtVmQzZ3BCMXk5VXNoTXIzcW51SDF3TXBVNUMrbk0yb3kzdlNrbz0KLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0K", - AVAGO_STAKING_TLS_CERT_FILE_CONTENT: "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZOekNDQXg4Q0NRQzY4N1hGeHREUlNqQU5CZ2txaGtpRzl3MEJBUXNGQURCL01Rc3dDUVlEVlFRR0V3SlYKVXpFTE1Ba0dBMVVFQ0F3Q1Rsa3hEekFOQmdOVkJBY01Ca2wwYUdGallURVFNQTRHQTFVRUNnd0hRWFpoYkdGaQpjekVPTUF3R0ExVUVDd3dGUjJWamEyOHhEREFLQmdOVkJBTU1BMkYyWVRFaU1DQUdDU3FHU0liM0RRRUpBUllUCmMzUmxjR2hsYmtCaGRtRnNZV0p6TG05eVp6QWdGdzB4T1RBM01ESXhOakV5TVRWYUdBOHpNREU1TURjeE1ERTIKTVRJeE5Wb3dPakVMTUFrR0ExVUVCaE1DVlZNeEN6QUpCZ05WQkFnTUFrNVpNUkF3RGdZRFZRUUtEQWRCZG1GcwpZV0p6TVF3d0NnWURWUVFEREFOaGRtRXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDCkFRREtZU1J3L1cwWXBZSC9NVFFoaUZyUjBtODlsNnlUdXpMcER0anVkci81Um5oSVB2dHFrN1lJR20vbTlsMjkKeHdSNEo1cjdTWkdzKzcweUJldGtiUytoN1B3SjJybVdEd2JyZHlKS3ZWQmhxZjhrU24rVlUyTGVQU0ljSmoxOQozTER5V2hWMUg0bHFOa1VrY0FSNzZGaDlxak12QTJwMHZKNjYrZURMWGxwaC9SWWFwUXg5SGdPai8wQm1BS01yCllDeW81QmhSaWgrT3VnZzhhSzRHOVBRVElBNUcyd1RXVzJRa0h4TS9RcHBGalpkL1h3UWVKMkg2dWJXTUZjNWYKdHRmNkF6cEp2RklEQnUvSkRDS1dpQ3U1bTh0NEdMOHcyT3JJeDhKczE5bEY0WVlFMmVvakNyZXFnUGk2NFMzbwpjcXdLc0RveVNUdzYvNWlLUTVCVVl3VVhYM3o3RVhPcUQ4U01IZWZVS2Vjemo0V3ZBYVpMelIyN3FYbTU1RWdSCllRQUlYNGZobVk3TmZTb3AzV2gwRW82MitKSG9NLzFnK1VnT1hsYm5XcFk5NU1nZDcvZndEU1dMdTRJeEUwL3UKcThWdWZJYmZDNHlyWThxbFRWZkFmZkkxbGRSZHZKalBKQlBpUTBDTnJPbDYwTFZwdHBrR2M5c2hIN3daMmJQMApiRW5ZS1RnTEFmT3pEOFV0NzFPMkFPSWE4MEExR05GbDRZbGUvTVNOSk9jUU9TcGd0V2RSRXpJVW9lbkFqZnV6Ck00T2VUcjRjUmc0K1ZZVEFvOUtIS3JpTjFEdWV3TnpHZDhXaktBVkhtY0lNanFJU0xUbHpNaGRzZG0rT21mUTYKT3Z5WDd2MEdUT0JiaFAwOU5HY3d3NUEwZ0N6WE4xOEZTNW94bnhlNk9HOUQwd0lEQVFBQk1BMEdDU3FHU0liMwpEUUVCQ3dVQUE0SUNBUUFxTDFUV0kxUFRNbTNKYVhraGRUQmU4dHNrNytGc0hBRnpUY0JWQnNCOGRrSk5HaHhiCmRsdTdYSW0rQXlHVW4wajhzaXo4cW9qS2JPK3JFUFYvSW1USDVXN1EzNnJYU2Rndk5VV3BLcktJQzVTOFBVRjUKVDRwSCtscFlJbFFIblRhS011cUgzbk8zSTQwSWhFaFBhYTJ3QXd5MmtEbHo0NmZKY3I2YU16ajZaZzQzSjVVSwpaaWQrQlFzaVdBVWF1NVY3Q3BDN0dNQ3g0WWRPWldXc1QzZEFzdWc5aHZ3VGU4MWtLMUpvVEgwanV3UFRCSDB0CnhVZ1VWSVd5dXdlTTFVd1lGM244SG13cTZCNDZZbXVqaE1ES1QrM2xncVp0N2VaMVh2aWVMZEJSbFZRV3pPYS8KNlFZVGtycXdQWmlvS0lTdHJ4VkdZams0MHFFQ05vZENTQ0l3UkRnYm5RdWJSV3Jkc2x4aUl5YzVibEpOdU9WKwpqZ3Y1ZDJFZVVwd1VqdnBadUVWN0ZxUEtHUmdpRzBqZmw2UHNtczlnWVVYZCt5M3l0RzlIZW9ETm1MVFNUQkU0Cm5DUVhYOTM1UDIveE91b2s2Q3BpR3BQODlEWDd0OHlpd2s4TEZOblkzcnZ2NTBuVnk4a2VyVmRuZkhUbW9NWjkKL0lCZ29qU0lLb3Y0bG1QS2RnekZmaW16aGJzc1ZDYTRETy9MSWhURjdiUWJIMXV0L09xN25wZE9wTWpMWUlCRQo5bGFndlJWVFZGd1QvdXdyQ2NYSENiMjFiL3B1d1Y5NFNOWFZ3dDdCaGVGVEZCZHR4SnJSNGpqcjJUNW9kTGtYCjZuUWNZOFYyT1Q3S094bjBLVmM2cGwzc2FKVExtTCtILzNDdEFhbzlOdG11VURhcEtJTlJTVk55dmc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==", - AVAGO_STAKING_SIGNER_KEY_FILE_CONTENT: "QXZhbGFuY2hlTG9jYWxOZXR3b3JrVmFsaWRhdG9yMDE=" - } - networks: - avalanche-testnet: { ipv4_address: 10.0.20.3 } - avalanche-node-2: - container_name: avalanche-node-2 - hostname: avalanche-node-2 - image: avalanche-node:latest - volumes: - - ./avalanche-node-2/logs:/root/.avalanchego/logs - environment: { - AVAGO_NETWORK_ID: "local", - AVAGO_API_ADMIN_ENABLED: "true", - AVAGO_LOG_LEVEL: "DEBUG", - AVAGO_LOG_DISPLAY_LEVEL: "TRACE", - AVAGO_HTTP_HOST: "0.0.0.0", - AVAGO_PUBLIC_IP: "10.0.20.4", - AVAGO_BOOTSTRAP_IDS: "NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg", - AVAGO_BOOTSTRAP_IPS: "10.0.20.3:9651", - AVAGO_STAKING_TLS_KEY_FILE_CONTENT: "LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlKS2dJQkFBS0NBZ0VBM1U2RWV0SjJ1amJrZllrZ0ZETXN6MXlUVEZsVUd5OGsrZjRtUW9pZHdRZUdGakFZClg4YVNWaVlsbDNEUHM1dzRLU2JzZ2hIb2VRNmVtV054WHU1T2g0YmVoWmhhUTQ4SjQ2VUpuWkJDbElOTkJ2aEoKVDA2ZjFMSnJEeS9pUUxNRDZnV1ZxVEFVdDNiRjBEYnB6RExUQnBhMytVdEplbDErTXU1SFB4azhXSUwzbG1mUwpiVWY1dGlqWHEvc0k0QVI2aWVLejZweHdkOUxBMkQyWVBkUXM5UUpQQVc5c05pTmRQTTBGWUNpdW5pS2pTbHlTCmYrS1lzMG1YVk9QZHRNRE1XQWFaM3d3SElaOFhvdlZQNzkwRzArM2lsQ05ueHEvb1Rsa3lGbFBOUGxYamdiZkcKdWorTEV2UUVJZWYraHZLc0pnS2p0MkVQWGNUZk5vcnZ4OS9qZmhobXZ6TksrYXhGcTg4Q0xoWWNDcjhrSEtUMApRWnRza0p3WjRTL1J1WkRlcCtEZ1ROQ3JJR2R3bUpSMlVvT0hsbkRZQWJkVmdoYkVITzczMUJXaVo2L0VEOTZSCmVGZitBYUpPOEV6dVJ6ZEFOUkdCRldMbCtkelJwNnlsWHZoWVBmc1REb0Z6MXBGRGFuYjZTUFdXMWQyZEV1Zk8KdXFoZC83d1dhNFlBcXluT1JQN3pIc1FVWHZDb3VNQ3FqalZZWXZWaGxIRVI3eFJJcEhQdTFhejQ5R0dodXMxUwozZnJqZ0NUZk5YeWpqMktPRitMR2F6TWoySmR6b3hyVElYMWVDcndtaXhLOVhianBKYWp1bkFyeGtQSWdKUzFjCnQxU2NsdVJpZEE5Q3NvZ0lxK0ZUWFFDU3FOV1lJaG9yeVMxcnBVMzQxSW53amZhTmRlUUlxaWNZcXNNQ0F3RUEKQVFLQ0FnQU5HVU9nSFdybmxLNHJlLzFKRk1wWEw2eU1QVkZNRnB0Q3JMZEpBdHNMZk0yRDdLN1VwR1V1OGkwUgpiSnp1alpXSllnTm5vM1cyREpaNGo3azdIREhMdGNEZitXZUdUaVlRc2trQ2FYSjNaZG9lU24zVVV0d0U4OWFBClhKNHdwQ2ZjSng1M21CL3h4L2JuWHdpeGpHU1BKRWFaVzhwcWtyUVFnYWYzNVI5OFFhd3oyOHRKcXBQdUl6YTQKdURBTFNsaVNacmV0Y0RyNzdKNTdiaEhmdnZvMk9qL0EzdjV4cWVBdjVCYW9YV0FRZmc1YUxXYUNhVUFPaEpHUApkYmsrcEphenN4aFNhbHpWc1p2dGlrV0Q5Zm9jZXgwSkZadGoyQytReTVpNlY1VnpWaFFVTG5OMXZLTVhxUmZCCmhnQzdyZ3RnYUpHV0hnbVJ6RUJGOHkxRUVFMWZvaGJvMnNxa0c0b016M2pCWjRvNE1BRFFjcGZLMnFjaGdybmsKT3hJUy91VThzemR1ODRpSDhzNkYvSGwxKzg3am5xNk85UmUwaU1TdXZ5VWJqQUVlOENtOVAvYTVNMVg5ZXl6dwpXU1hTUFpCd0tTUm9QM3d1eWNiRW9uVFdRblFIZHd5U1krSXZkdGdsaUVEaEtyVmJaR25rczV6bWFhSXlkVy95CkxTMlM5SlJNNVkrWHAwdlYzbkdsRWVoQ1VkclhvUTFEei9BaUhuV0hqYnhvQ0ZHdDBxTDZDT0p6aUFHZlVYS2EKY1E1aURkN3pjMkozbTJaNmM4Vzh4a1BKZSsxZG1OV2ZHSHJqYThEU0h0VGNEWTZBcWQ5OFZ1MG5pdThQQzdieApBdncrKzZKMndHN0xOODlyZ1IwdVA3YXM5Q3g0a0hIc09Gd3ArbEtPRFZlMmR3MHZBUUtDQVFFQTdtb05DalA2CjVQa1NrU05QaS9qdzFZL0ZDd0JvSkV6bDNRNWZ0d0dya1laRlJMQlR2Q0NsaTJqaGV4YUMwRDkreWpzVmFMLzIKVmFwNDMveGk1NWlwbmlxdjhjMVdBYzV4RmgrNmhDeWRTNks5b3dEeGxITjc1TUdMcm1yWWpZKzNhTWRvMTVEbQp4NWJ6bk9MTHlNVVc0QWsrNzdNVHcxMmZhZC83TDBBTlh1bUZGajZ5ZGNTOFBIbWhKbG16NVZlZ1d6NWIxS0dRCksvL3BoY3VPbTM0OXhla3Q3SjVrS1JiREVxTE9sWnYvRUlBZENCUU00VTNkNlAvMnZVVXk1bktZRzBGMXhlYUMKbGVWcHIxRVBvRUkrWGtUeStqam9hQnM3aVVIcGNEMzU5WFFDV0xuaXdmMVlmdHRrOXpKcDdtNnRSL0dlYWJsawp1bm5INXp5Rmt3emxRd0tDQVFFQTdhRnROc2pMMFVFWGx5QllqQ1JPb1B1NmthL280UXlFYVd2TUhjaVh1K0d2Ck03VFFDRjJpOW9lUVhBQkl5VE5vUXIrcE5qQVJib1k4cDArOVpmVjhRR2x2SDZhd1cyTU56RDA3bGc5aHdzalkKSk9DSTY0WHhaajE4M0doSGdOOS9jRTRQWEJyUUNxUExQQ0tkVjY2eUFSOVdObTlWYTNZOVhmL1J2Y29MaU5CMQpGQWc1YmhiTlFNblIzOG5QSnM5K3N1U3FZQjh4QURLdndtS0Vkb255K1dJTS9HUXlZWmlEbFhFajhFZldRb3VNCndBb2s2VnVoczZjdUxpSEh6WEZSNFk2UkNXUmIybmYyVnJ6V29wejJCcDAySWVIWTBVWnNaZUtucWhhOWR0VXUKWkNJdDJNWlVFTHhpaDlKUyt3ekNYOEJKazN4ZWRpODl6T1pLUng0TWdRS0NBUUVBeHFuVUo5WmNrSVFEdHJFbgp6Y2tvVmF5eFVwT0tOQVZuM1NYbkdBWHFReDhSaFVVdzRTaUxDWG5odWNGdVM3MDlGNkxZR2lzclJ3TUFLaFNUCkRjMG1PY2YwU0pjRHZnbWFMZ2RPVW1raXdTM2d1MzFEMEtIU2NUSGVCUDYvYUdhRFBHbzlzTExydXhETCtzVDUKYmxqYzBONmpkUFZSMkkraEVJWTFOcEEzRkFtZWZvVE1ERnBkU0Q5Snl6MGdMRkV5TEJYd1MyUTlVSXkwdUdxQQpjSTFuU0EwZjJYVzZuSXA5RG9CZmlFY3U2VDczOGcxVEZrTGVVUk5KTlRuK1NnemZOb2I3Ym1iQUZjdk9udW43CkRWMWx2d1BSUERSRFpNeWNkYWxZcmREWEFuTWlxWEJyeFo0b0tiMERpd0NWU0xzczVUQXZBb1licTA5akJncG0KZTd4WkpRS0NBUUVBM2Y3bDBiMXFzNVdVM1VtSmozckh2aHNOWTljcnZ6cjdaS1VoTGwzY2F0aGUzZlk0TnVpTApPcmJReFRJNnpVUnFUWmxTRWw1N21uNXJvWDZjR09scVo1NVlBd0N0VnVMRjNCMEVVcDhTSEcrWGhYUUNWYzF2CkJLM0N2UUhxY3RuWTYyanhib0ZhQSthYkVoWGdXaTdJK3NWMHZDdnNhQlV4SldTOVpBbWlGdkZ2dndRajZ0WUEKY0Z0YTV5OVlpQkJtYytldHgxaThaVXYwNktzeXhxNy9QNzA3Rm5yZ21rNXA5eTJZZm53T0RXTGpYZkRjSk9uRwp1ZGdnQzFiaG11c1hySm1NbzNLUFlSeWJGTk1ielJUSHZzd1Y2emRiWDc3anU1Y3dQWFU3RVEzOVpleU1XaXlHCkVwQjdtQm1FRGljUVczVi9CdnEwSU1MbmdFbFA4UHFBZ1FLQ0FRRUFxNEJFMVBGTjZoUU9xZTBtY084ZzltcXUKenhsMk1NMEtiMkFCRThmeFEydzRGeTdnNDJOb3pEVVcxMy9NTjdxMUkrQXdNaGJsNEliMlFJbUVNVHVGYUhQWQpBM09abG5FOUwwb2k0Rkkra0cyZUpPQi8rNXBIU3VmL2pyWi80Z0FSSyt1Yy9DRGVhSWxqUC9ueHcwY1grc0YrCkhqWDRPYjQvQ3lFSWVJVUdkT0dzN2c5a2Yrb2lyWHJ5dURjWnhsLzJmUU94cXZhOWRoaEJMaFBYRzNvdFNwMFQKRDkweEMxbFNQTElIZitWVWlGOWJMTXRVcDRtZUdjZ3dwWFBWalJWNWNibExyUDlQeGJldmxoRzJEM3ZuT0s5QQo4aldJOVAxdU5CRUFVVFNtWFY4cmVNWU95TlhKSDhZYmJUNHlpYXJXbmFRTTBKMGlwV3dYR0VlV2Fndi9hQT09Ci0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==", - AVAGO_STAKING_TLS_CERT_FILE_CONTENT: "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZOekNDQXg4Q0NRQzY4N1hGeHREUlNqQU5CZ2txaGtpRzl3MEJBUXNGQURCL01Rc3dDUVlEVlFRR0V3SlYKVXpFTE1Ba0dBMVVFQ0F3Q1Rsa3hEekFOQmdOVkJBY01Ca2wwYUdGallURVFNQTRHQTFVRUNnd0hRWFpoYkdGaQpjekVPTUF3R0ExVUVDd3dGUjJWamEyOHhEREFLQmdOVkJBTU1BMkYyWVRFaU1DQUdDU3FHU0liM0RRRUpBUllUCmMzUmxjR2hsYmtCaGRtRnNZV0p6TG05eVp6QWdGdzB4T1RBM01ESXhOakV5TVRsYUdBOHpNREU1TURjeE1ERTIKTVRJeE9Wb3dPakVMTUFrR0ExVUVCaE1DVlZNeEN6QUpCZ05WQkFnTUFrNVpNUkF3RGdZRFZRUUtEQWRCZG1GcwpZV0p6TVF3d0NnWURWUVFEREFOaGRtRXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDCkFRRGRUb1I2MG5hNk51UjlpU0FVTXl6UFhKTk1XVlFiTHlUNS9pWkNpSjNCQjRZV01CaGZ4cEpXSmlXWGNNK3oKbkRncEp1eUNFZWg1RHA2WlkzRmU3azZIaHQ2Rm1GcERqd25qcFFtZGtFS1VnMDBHK0VsUFRwL1VzbXNQTCtKQQpzd1BxQlpXcE1CUzNkc1hRTnVuTU10TUdscmY1UzBsNlhYNHk3a2MvR1R4WWd2ZVdaOUp0Ui9tMktOZXIrd2pnCkJIcUo0clBxbkhCMzBzRFlQWmc5MUN6MUFrOEJiMncySTEwOHpRVmdLSzZlSXFOS1hKSi80cGl6U1pkVTQ5MjAKd014WUJwbmZEQWNobnhlaTlVL3YzUWJUN2VLVUkyZkdyK2hPV1RJV1U4MCtWZU9CdDhhNlA0c1M5QVFoNS82Rwo4cXdtQXFPM1lROWR4TjgyaXUvSDMrTitHR2EvTTByNXJFV3J6d0l1Rmh3S3Z5UWNwUFJCbTJ5UW5CbmhMOUc1CmtONm40T0JNMEtzZ1ozQ1lsSFpTZzRlV2NOZ0J0MVdDRnNRYzd2ZlVGYUpucjhRUDNwRjRWLzRCb2s3d1RPNUgKTjBBMUVZRVZZdVg1M05HbnJLVmUrRmc5K3hNT2dYUFdrVU5xZHZwSTlaYlYzWjBTNTg2NnFGMy92QlpyaGdDcgpLYzVFL3ZNZXhCUmU4S2k0d0txT05WaGk5V0dVY1JIdkZFaWtjKzdWclBqMFlhRzZ6VkxkK3VPQUpOODFmS09QCllvNFg0c1pyTXlQWWwzT2pHdE1oZlY0S3ZDYUxFcjFkdU9rbHFPNmNDdkdROGlBbExWeTNWSnlXNUdKMEQwS3kKaUFpcjRWTmRBSktvMVpnaUdpdkpMV3VsVGZqVWlmQ045bzExNUFpcUp4aXF3d0lEQVFBQk1BMEdDU3FHU0liMwpEUUVCQ3dVQUE0SUNBUUNRT2R3RDdlUkl4QnZiUUhVYyttMFRSekVhMTdCQ2ZjazFZMld3TjNUWlhER1NrUFZFCjB1dWpBOFNMM3FpOC9DVExHUnFJOVUzZ1JaSmYrdEpQQkYvUDAyMVBFbXlhRlRTNGh0eGNEeFR4dVp2MmpDbzkKK1hoVUV5dlJXaXRUbW95MWVzcTNta290VlFIZVRtUXZ3Q3NRSkFoY3RWQS9oUmRKd21NUHMxQjhReE9VSTZCcQpTT0JIYTlDc1hJelZPRnY4RnFFOTFQWkEybnMzMHNLUVlycm5iSDk5YXBmRjVXZ2xMVW95UHd4ZjJlM0FBQ2g3CmJlRWRrNDVpdnZLd2k1Sms4bnI4NUtESFlQbHFrcjBiZDlFaGw4eHBsYU5CZE1QZVJ1ZnFCRGx6dGpjTEozd28KbW5ydDk1Z1FNZVNvTEhZM1VOc0lSamJqNDN6SW11N3E5di9ERDlwcFFwdTI2YVJEUm1CTmdMWkE5R001WG5iWgpSRmkzVnhMeXFhc0djU3phSHd6NWM3dk9CT2tPZGxxY1F6SVNSdldEeGlOMUhrQUwraGtpUUN1TWNoZ09SQWdNCnd6UG9vYThyZld0TElwT1hNcHd1VkdiLzhyR05MRVBvdm9DSzl6NmMrV1oremtSbzQrM1RRa09NWTY2WGh0N3IKQWhseTNsZXIrVHlnNmE1alhUOTJXS0MvTVhCWUF5MlpRTm95MjA0a05LZXZjSDdSMmNTa3hJVGQzbjVFYWNOeQo1TUF0Q05JazdKd2VMQ2g5ckxyTFVCdCtpNG40NHNQK0xWaGZXSGVtbmdBOENvRjRuNmVRMHBwMGl4WlRlbjBqCjR1TjBHMk5mK0plR01scW9PYkxXZElPZEgvcGJEcHBYR29aYUtLRGQ3K2JBNzRGbGU1VWg3KzFlM0E9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==", - AVAGO_STAKING_SIGNER_KEY_FILE_CONTENT: "QXZhbGFuY2hlTG9jYWxOZXR3b3JrVmFsaWRhdG9yMDI=" - } - networks: - avalanche-testnet: { ipv4_address: 10.0.20.4 } - avalanche-node-3: - container_name: avalanche-node-3 - hostname: avalanche-node-3 - image: avalanche-node:latest - volumes: - - ./avalanche-node-3/logs:/root/.avalanchego/logs - environment: { - AVAGO_NETWORK_ID: "local", - AVAGO_API_ADMIN_ENABLED: "true", - AVAGO_LOG_LEVEL: "DEBUG", - AVAGO_LOG_DISPLAY_LEVEL: "TRACE", - AVAGO_HTTP_HOST: "0.0.0.0", - AVAGO_PUBLIC_IP: "10.0.20.5", - AVAGO_BOOTSTRAP_IDS: "NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg", - AVAGO_BOOTSTRAP_IPS: "10.0.20.3:9651", - AVAGO_STAKING_TLS_KEY_FILE_CONTENT: "LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlKSndJQkFBS0NBZ0VBdkpsUTA2QjI1RkJkb0VYVlg2Y25XU3pTbmtOL0hlaDJSWkZETjFOWFZpMlJVbVRiCjJvRGZJWlVMMlA3VUx0d09OS2RmVm9DbTgxbWEzdDdZTlFKTVBDYzdYYy9ZSmVFVEo5ZU5pQ0R0d29zQ0tiWkIKTkNhS1cyWVpodVh3QXRwL3pGMExYNG5pTjRjM2tkT0MxdUNZQ3lzMzl6Wi9NV1haUVlDWHdaaSthbEZKeE96dQp5R3lSaHBtdW9FZzkzc0hyUk9pa0diVGJYOU1VU0w5UEhhR1NtTUU1ZWlMWkhSaXUrcm42cXRQZkJsY0Zyd05jCkVycDN1UGpCWUxQVGVIaFNZK2ljcmZPWDRpdjNNRDhleWtYWUdJQWM2MlVPQkQ3SVVaOEZxd1U0bmpqbWlid0EKTmtUTVRCR015a2F5UUFMR0NOYzhiVGNxaUZHZ1UzTVptcy9qVjFCbHZzQjhDRTRuTkJxZjEwSnRpOEsvNWNTRgplanB3SlM5d29HMGw0cTBwNkJ2bmgwUHJ3OHdRSEVRNUV3SUwveGxDTTVYNms5a3JVeXROcmlBWUNXTTd4VXh1CktaUjRyWEhFWDh2TU1iSWVXZk1SdmZaWmowRUxTN0o1VUFGZmk0dE9nbS9BaCtJVkZhSWxvbGJPVUFHb2FscHIKK1g2YUY5QkxOdWtjbEIxeG00eE50TnFjakRBTzQxSHExRlNqSW96cUJtYlhCK3N3ZUtmM1NkRTdVNkVjRG9LdwpPelFpUFFHRmJhbFY2MXh2N25ZL0xxOXE5VzAxY0NHeDdEbmt4RDk0R05KaDBWcHRoUDJ5NDdmYjIyQ0VWTVVmCk1WcHk1RzNnYzRqVThJUHQrbzNReGZ1b0x0M0ZNLzUyMHAvR0dQbU5ZNDE3ak41YWhmSWpHZ0tHNGJzQ0F3RUEKQVFLQ0FnQSt1SElUM3lLSzdWc2xxUE83K3Rmd0pTTHFOU0k2TFF2Z09OMzBzVWV6UmpZMUE0dkdEK09reEcrTApPN3dPMVduNEFzMkc5QVFSbS9RUU9HWUl3dm5kYTJLbjRTNU44cHN2UGRVNHQxSzZ4d1h5SDBWeDlYcy95Q1duCklpTCtuL0d1WWljZEg3cldvcVpOWGR6K1h2VFJpZzd6clBFQjJaQTE0M0VVbGhxRk93RmdkemMxK2owdldUNmsKMlVHU0trVjJ4ak9FeFF2THcyUFVpYUxqQk0rKzgwdU5IYmU4b0cvWXZDN3J6c2cxMEl6NFZoS3h1OGVEQVY4MgpMTGVnTWN1Y3BFZ3U1WHJXWWE2MElkbTRoUi9Iamh1UUFTeDNKdlh4aHdRWWl3VDRRWTRSc2k4VDNTOWdBTm9rCmp2eEtvMkYrb1MzY1dHTlJzR3UwTk93SCt5anNWeU1ZYXpjTE9VZXNBQWU4NXR0WGdZcjAyK1ovdU1ueHF0T0YKZ2pJSFkzWDVRWmJENGw0Z2J3eCtQTGJqc2o0S0M2cjN5WnJyNTFQZExVckJ2b3FCaHF3dUNrc2RhTW50V0dNRQp1MFYvb29KaTQrdXpDWXpOMDZqRmZBRlhhMnBXelZCNXlLdzFkNnlZaTlVL2JQZDR4bjFwaExVTUhyQzJidmRNCkg4UDE4Z0FTNnJrV24rYWdlaVdSSG1rZjR1b0tndjNQck1qaWprQmFHcGY2eGp2NiswUTM5M2pkVklDN3dnSlYKOFcwaTFmMUF3djY4MDg5bUhCRWFyUFR2M2d6MzkyNTFXRkNQTlFoRXVTeTc5TGk1emp3T3ByWlhTME1uSlhibQpCMDBJUFRJdzUxS3Vhb3VlV3pZMXBBMklGUS8wc0gzZm8ySmhEMHBwMWdJMERkZTdFUUtDQVFFQTdSVmdOZWxrCjNIM1pKc29PZk9URmEwM2xuWHVFZlRBeXhoRUVDUno2NGs1NHBTYkVXVjczUEllWUJ5WnZuc3JLUnlkcFlXVVAKQ3AvbUtoQUpINFVDZjJoelkwR3lPNy9ENitIRUtaZENnNmEwRE5LY2tBb0ZrQmZlT2xMSkxqTFZBVzJlRVZ4egp0bEZ0Ky9XQkU5MEdDdkU1b3ZYdUVoWEdhUHhDUHA1Z2lJTjVwaFN6U0Q1NTdid3dPeVB3TktGWjdBbzc3VU5LCmt6NkV6Y3ZRZ3FiMjA1U1JSS0dwUzgvVC85TGNMc1VZVmtCZllRL0JheWpmZk8rY1FGNHZINXJCNHgvOC9UN3QKdVVhNzl1WStMZUdIZ1RTRklBdWk5TEVLNXJ5Ly8yaERKSU5zSXRZTWtzMVFvNFN1dTIzcE91R2VyamlGVEtXbAptT0lvRm1QbWJlYkFjd0tDQVFFQXk2V2FKY3pQY0tRUS9ocWdsUXR4VTZWZlA0OVpqVUtrb2krT0NtdHZLRHRzCjdwSmZJa3VsdWhuWUdlcUZmam5vcHc1YmdaSE5GbTZHY2NjNUN3QnRONldrMUtubk9nRElnM2tZQ3JmanRLeS8KQlNTVjNrTEVCdmhlOUVKQTU2bUZnUDdSdWZNYkhUWGhYUEdMa2dFN0pCWmoyRUt4cDFxR1lZVlplc1RNRndETQpLRUh3eklHY0ZreVpzZDJqcHR5TFlxY2ZES3pUSG1GR2N3MW1kdExXQVVkcHYzeHJTM0d2ckNiVU1xSW9kalJkCnFrcmcvZC9rUXBLN0Ezb0xPV2ZhNmVCUTJCWHFhV0IxeDEzYnpKMldsc2h4SkFaMXAxb3pLaWk1QlE5cnZ3V28KbXVJNXZkN282QTlYc2w4UXpsdVNTU1BpK05oalo2NGdNQnJYY2lSdm1RS0NBUUIvZEI1azNUUDcxU3dJVGxlNwpqTUVWRHF1Q0hnVDd5QTJEcldJZUJCWmIweFBJdFM2WlhSUk0xaGhFdjhVQitNTUZ2WXBKY2FyRWEzR3c2eTM4ClkrVVQyWE11eVFLb1hFOVhYK2UwOUR3dHlsREJFL2hXOXd4R2lvNU5qSFBiQWpqQXE4MXVSK1ZzL2huQ2Voa0sKTktncStjT2lkOU9rcFZBazRIZzhjYWd6dTNxS2JsWnpZQ0xzUzE4aWJBK1dPNmU3M1VTYUtMTE90YTF2ZFVLQworbjkyLzBlWlBjOWxralRHTXZWcnIwbUdGTlV4dU9haVZUYlFVNEFNbXBWNnlCZXpvbDYvUmpWR2hXQkhPei95CktteE9hWTJuekptdU1mOUtTKzVyd0FGWWY4NkNhOUFXbTRuZVhsWVJMT1ZWWWpXTU01WjF2aGRvT1N5VDNPRGoKOUVsQkFvSUJBR0NSUGFCeEYyajlrOFU3RVN5OENWZzEwZzNNeHhWU0pjbDJyVzlKZEtOcVVvUnF5a3Z6L1RsYgphZnNZRjRjOHBKTWJIczg1T1R4SzJ0djNNWmlDOGtkeDk5Q1VaTDQvZ3RXOVJXWkh2dVY5Q1BQQ1hvTFB2QzdsCjlmanp0ZDFrcUpiN3ZxM2psdGJxSnR5dytaTVpuRmJIZXo4Z21TZVhxS056M1hOM0FLUmp6MnZEb1JFSTRPQSsKSUorVVR6Y2YyOFRESk5rWTF0L1FGdDBWM0tHNTVwc2lwd1dUVlRtb1JqcG5DemFiYUg1czVJR05FbFd3cG9mZgpGbWxXcFIzcW5vZEt4R3RETVM0WS9LQzJaRFVLQVUrczZ1Ry9ZbWtpUDZMZFBxY2tvZDRxSzhLT1JmMUFSOGRMCkJ6WGhHSklTSURNb25rZU1MTThNWmQwSnpXSWwzdmtDZ2dFQVBCa0V4ZDJqNFZZNXMrd1FKZGlNdG81RERvY2kKa0FFSXZJa0pZOUkrUHQybHBpblFLQWNBQVhidnVlYUprSnBxMzFmNlk2NnVvazhRbkQwOWJJUUNBQmpqbEl2ZQpvN3FRK0g4L2lxSFFYMW5iSER6SW5hRGRhZDNqWXRrV1VIakhQYUtnMi9rdHlOa0Z0bFNIc2t2dkNFVnc1YWp1CjgwUTN0UnBRRzlQZTRaUmpLRXpOSXBNWGZRa3NGSDBLd2p3QVZLd1lKTHFaeHRORVlvazRkcGVmU0lzbkgvclgKcHdLL3B5QnJGcXhVNlBVUlVMVUp1THFSbGFJUlhBVTMxUm1Kc1ZzMkpibUk3Q2J0ajJUbXFBT3hzTHNpNVVlSgpjWnhjVEF1WUNOWU11ODhrdEh1bDhZSmRCRjNyUUtVT25zZ1cxY3g3SDZMR2J1UFpUcGc4U2J5bHR3PT0KLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0K", - AVAGO_STAKING_TLS_CERT_FILE_CONTENT: "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZOekNDQXg4Q0NRQzY4N1hGeHREUlNqQU5CZ2txaGtpRzl3MEJBUXNGQURCL01Rc3dDUVlEVlFRR0V3SlYKVXpFTE1Ba0dBMVVFQ0F3Q1Rsa3hEekFOQmdOVkJBY01Ca2wwYUdGallURVFNQTRHQTFVRUNnd0hRWFpoYkdGaQpjekVPTUF3R0ExVUVDd3dGUjJWamEyOHhEREFLQmdOVkJBTU1BMkYyWVRFaU1DQUdDU3FHU0liM0RRRUpBUllUCmMzUmxjR2hsYmtCaGRtRnNZV0p6TG05eVp6QWdGdzB4T1RBM01ESXhOakV5TWpKYUdBOHpNREU1TURjeE1ERTIKTVRJeU1sb3dPakVMTUFrR0ExVUVCaE1DVlZNeEN6QUpCZ05WQkFnTUFrNVpNUkF3RGdZRFZRUUtEQWRCZG1GcwpZV0p6TVF3d0NnWURWUVFEREFOaGRtRXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDCkFRQzhtVkRUb0hia1VGMmdSZFZmcHlkWkxOS2VRMzhkNkhaRmtVTTNVMWRXTFpGU1pOdmFnTjhobFF2WS90UXUKM0E0MHAxOVdnS2J6V1pyZTN0ZzFBa3c4Snp0ZHo5Z2w0Uk1uMTQySUlPM0Npd0lwdGtFMEpvcGJaaG1HNWZBQwoybi9NWFF0ZmllSTNoemVSMDRMVzRKZ0xLemYzTm44eFpkbEJnSmZCbUw1cVVVbkU3TzdJYkpHR21hNmdTRDNlCndldEU2S1FadE50ZjB4Ukl2MDhkb1pLWXdUbDZJdGtkR0s3NnVmcXEwOThHVndXdkExd1N1bmU0K01GZ3M5TjQKZUZKajZKeXQ4NWZpSy9jd1B4N0tSZGdZZ0J6clpRNEVQc2hSbndXckJUaWVPT2FKdkFBMlJNeE1FWXpLUnJKQQpBc1lJMXp4dE55cUlVYUJUY3htYXorTlhVR1crd0h3SVRpYzBHcC9YUW0yTHdyL2x4SVY2T25BbEwzQ2diU1hpCnJTbm9HK2VIUSt2RHpCQWNSRGtUQWd2L0dVSXpsZnFUMlN0VEswMnVJQmdKWXp2RlRHNHBsSGl0Y2NSZnk4d3gKc2g1Wjh4Rzk5bG1QUVF0THNubFFBVitMaTA2Q2I4Q0g0aFVWb2lXaVZzNVFBYWhxV212NWZwb1gwRXMyNlJ5VQpIWEdiakUyMDJweU1NQTdqVWVyVVZLTWlqT29HWnRjSDZ6QjRwL2RKMFR0VG9Sd09nckE3TkNJOUFZVnRxVlhyClhHL3Vkajh1cjJyMWJUVndJYkhzT2VURVAzZ1kwbUhSV20yRS9iTGp0OXZiWUlSVXhSOHhXbkxrYmVCemlOVHcKZyszNmpkREYrNmd1M2NVei9uYlNuOFlZK1kxampYdU0zbHFGOGlNYUFvYmh1d0lEQVFBQk1BMEdDU3FHU0liMwpEUUVCQ3dVQUE0SUNBUUFlMmtDMEhqS1pVK2RsblUyUmxmQnBCNFFnenpyRkU1TjlBOEYxTWxFNHZWM0F6Q2cxClJWZEhQdm5pWHpkTmhEaWlmbEswbC9jbnJGdjJYMVR6WU1yckE2NzcvdXNIZjJCdzB4am0vaXBIT3Q1Vis0VE4KbVpBSUE0SVBsMDlnUDI4SVpMYzl4U3VxNEZvSGVNOE9UeGh0dE9sSU5ocXBHOVA1ZDZiUGV6VzZaekkzQ2RQUApDRjY5eEs0R0Zsai9OUW5Bb0ZvZ2lkNG9qWVlOVGovY000UFlRVTJLYnJsekx5UHVVay9DZ3dlZlhMTUg4Ny9ICmUza1BEZXY4MFRqdjJQbTVuRDkzN2ZaZmdyRW95b2xLeGlSVmNmWlZNeFI3cWhQaGl6anVlRDBEQWtmUUlzN0wKWVZTeXgvcWpFdjJiQllhaW01UlFha1VlSFIxWHU1WGovazV6cjMzdDk3OWVkZTUwYnlRcmNXbTRINUp4bkVwRApKeEpuRmZET1U2bzE0U0tHSFNyYW81WjRDM2RJNTVETTg0V0xBU25sTUk1Qks0WHRTM25vdExOekc4ZGZXV2hUCjltMEhjcnkrd1BORGNHcjhNdGoxbG9zLzBiTURxTUhDNGpjRlcxaHJYQ1VVczlSWXpFK04veG9xd0NRU2dOMVAKRTczdVhUeVNXajVvdk1SNVRQRjZQaGNmdExCL096aXFPN0Z2ZXJFQnB2R0dIVUFuVVQ2MUp0am9kalhQYkVkagowVmd5TU9CWTJ5NTNIVFhueDNkeGVGWmtVZFJYL1ZaWXk4dE1LM01UWSs3VUlVNWNXWW5DWkFvNUxOY2MwdWtSClM2V1M5KzZlYVE2WFJqaGZOVWp4OWE3RnpxYXBXZHRUZWRwaXBtQlAxTmphcDNnMjlpVXVWbkxRZWc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==", - AVAGO_STAKING_SIGNER_KEY_FILE_CONTENT: "QXZhbGFuY2hlTG9jYWxOZXR3b3JrVmFsaWRhdG9yMDM=" - } - networks: - avalanche-testnet: { ipv4_address: 10.0.20.5 } - avalanche-node-4: - container_name: avalanche-node-4 - hostname: avalanche-node-4 - image: avalanche-node:latest - volumes: - - ./avalanche-node-4/logs:/root/.avalanchego/logs - environment: { - AVAGO_NETWORK_ID: "local", - AVAGO_API_ADMIN_ENABLED: "true", - AVAGO_LOG_LEVEL: "DEBUG", - AVAGO_LOG_DISPLAY_LEVEL: "TRACE", - AVAGO_HTTP_HOST: "0.0.0.0", - AVAGO_PUBLIC_IP: "10.0.20.6", - AVAGO_BOOTSTRAP_IDS: "NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg", - AVAGO_BOOTSTRAP_IPS: "10.0.20.3:9651", - AVAGO_STAKING_TLS_KEY_FILE_CONTENT: "LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlKS1FJQkFBS0NBZ0VBMlp3NkF4eE5wNC9Oc1E0eDlFMit6bHpLa0F4OC9zMnk0bmJlakVpTlZ3ZDd6Z0NCCklqNnE3WHB4cDZrVzFSWEp1Um1jYjhZZUdFQS9Bb3lrcE5hb0dTWE03TkF6MG9oa1BCSDVlRHhqdU1aeEc1WlkKQzl6MUVUMXFlNWhGZDZJZW44U0FvRUNrd1pVK3U5Ukp4Y3dlWmNpVnFicGtjN3dOYjhvUVRMR1BHanZzWGF1UwoxQlpiV013WGI2WUMxMVdnOEIyVU5qMEJGclJkSGRDVHRqZEZoUlF4alpzZXAvS1NrbmlBRlE3RThHUW1TdmhRCm5uaE1xQm4xN0NEYkhOTWdqRUxKV3NKSHpqS2dQY2dWZHlZdWtKaFdDc2htTGV1VEZoamFqd09GNnlNcFlpc0EKZ2w4TS9abzJsc2plNndNc1BYRnBTekRnelpnemtWc3hrV2VkdmREQkFCQ0diS28yQjFZclVVelAwWnpTR25VNgpHUmp0TXViZ0pETmVISms3NTdDdFFqL2Rxclgwb3JLdStWdnlQZFhhMDRhQkxVeXUvRkJqcGYrVU5XQVVkUEJmCnJVbEZtVnNoM2lPbERnVkFoZ3Rtd3Jac3lqSmU3MU51WlJ1cG13a2RTYmtJdWtXS1ozekkxeDkrcFZlRXUzMDcKMHNNTGtkTjRkaGR4OVhoWkZqUnRwV3hhMXRIY3d3ajRONVY4SmhVT3VZVkhFSVhMYzU2QWMrUXRaUmRubHROOApMbFlNWXA1N2xaU1I0OHZ4cTZwbHJBRXA5VHc3bGJPSk81T2d5WDhNaHdJZ05Mc1Y2eG44V0w2ZXgvSStQdG1ECnBsb2xwZWNXSUt4QTQ3cStaL0djZU9qeDBIcTlnTDZ0N0d4QmhIdFRBclZ5Wlk5M2EzZVI0cHQ1dmpVQ0F3RUEKQVFLQ0FnQk1vQk5aWnd6OUZNa0VNSkJzaXpmRjZLeTNQbjZCSnFOMzFRMldiakcrMUhiRzJpeWVoMXllMUwvUwpudHJZVzV5MW5nd1UyN2xiSnJ4SlJJYnhPRmpteWdXMzJiUjF6T3NtcjltZGVmNVBZU2tRNHNiTUhwajQ0aHh0CnV2ZXpJWllSQWh1YzBrWnhtQUVJR0wrRmM5TzhXWDVCenMxeVoyUi8yYklWbjJ4WmU0SkdsWlRWTTY0a3ZYRC8KTW9ETG5HNVlQc0lpdXlaMy9UalF0OUpibG1qWGJIM3FkQlcrWTg4eTNsV1RsS2pLVVNtZXVvT0EyYkY4ZSsrNQpudlFvMlRzYnlLU29YY0wxRzZTTFBMbzZRMnFnSmRRZVplUjlCUGU5RHpGZXJJbnFlMjRtRUNoVXYrMk9HMUJmCmxnblF6VVExdW9xdUhGNzhaank2VVZkSjhTZDh1ZnZLQzlyejhKWXNJeW5mdzBnUUMzRjgvZW1tMVFTYWJGdlkKdEc0K3gwSzhGZ3JpampFMDhSdnFnSW5keDlmdENOb040dTNsWHhQckpoS3ByMnh1WFNhNFZaYnVtZ043ZnFXeApVQkM4bG1QUWk1VlptajNuSmZqNGRhdG1CVHZzMWRPTFJNZGZkdFRGeitjQWRXTlp4WDNIT0xaVVNxTVZXZ1hZCmtYMHM3SVY5R255VW50Qmt0WCtJRWJXbEF0dHpsZHlxRjltZDRhdmpLWFErWTRQSy9zUjF5V3N1dnRpWmRZVUwKL1FyUUhYMENzVnYxaFJjWDB5ZWtBMGE4cXdhR214RWNuZEVLdjd3RjFpNjI2amMyZkRSNnFJMXlwMjBYbDNTaQprWUJTTmg3VksyMTBYSWhkZFN1VnhXNS9neU5uRkFCRGZwMWJTZFRoNVpKUmZOdnRRUUtDQVFFQTlaaXBueXU4CkpLbEx0V3JoMmlQOXBtRkJhZVVnb0Y2OElWZmQ2SVhkVjduQUhTV3lzaUM0M1NDVW1JNjN4bHVNWUVKRmRBWisKbS9pUmMvbjZWRktFQlc0K1VqazlWVzFFMWlxSGdTQUJnN250RXNCMk1EY1lZMHFLc040Q1lqQzJmTllPOTd6Sgo1b2p1ODRVM1FuOFRXTmtNc3JVVTdjcm0yb0FRZDA4QWl6VkZxTG8xZDhhSXpScSt0bDk1MlMvbGhmWEtjL1A5CmtmaGwrUktqaVlDMnpiV25HaW54YzJOYmY1cFd3bm10U3JjZW5nK1prZ1ZmU0IzSHZTY2txekVOeWU5WWtwVk0KR0UrS2pFZHNzK1FuR1FSV00ySlBseW9ZRG1oVDZycmFzUlQ2VEtzZWN3bzFyUlhCaTRDMWVUWlFTblpmMjRPZwpRdXJTLy9Yekh6Ym5rUUtDQVFFQTR0UVNtYUpQWk5XWXhPSG5saXZ6c2VsZkpZeWc1SnlKVk1RV3cvN0N2VGNWCkdPcG9ENGhDMjVwdUFuaVQxVS9SeWFZYVVGWitJcDJGaEsyUWNlK3Vza05ndHFGTjlwaGgvRGVPMWc4Q1NhSWUKNkVidGc4TjhHTGMwWWhkaUp0ZDJYR3JrdGoyWHRoTUw3T0pQWUlpZGQ0OHRHdVFpemZpam80RmUxUzByU1c1NgpCNFJIVGgvTzZhMHRhTmVGYm5aUUpENTJoYTl3bG5jL1BaU0NVTWI5QzBkMDhkU3hkQlFWK1NWZEdybC9JUmZDCnFISG9DODZHWURjbW52aUQ1Q0ZPeHB4N0FKL2hRQXdQRlFSQ25XR0h3RGpwY29NT3RrdHlvN3BqOU1EdXpCVWIKa3I0cjFlaThmN1BDOWRtU1ltWXpKTVF4TGZ6K1RpMlN5eU9tZE0xQ1pRS0NBUUVBc1ZyNGl6Q0xJcko3TU55cAprdDFRekRrSmd3NXEvRVROZVFxNS9yUEUveGZ0eTE2dzUvL0hZRENwL20xNSt5MmJkdHdFeWQveXlIRzlvRklTClc1aG5MSURMVXBkeFdtS1pSa3ZhSlA1VythaG5zcFg0QTZPVjRnWXZsOEFMV3Bzdy9YK2J1WDNGRTgwcE9nU20KdmtlRVVqSVVBRzNTV2xLZldZVUgzeERYSkxCb3lJc0lGNkh3b3FWQXVmVEN5bnZUTldVbE9ZMG1QYVp6QldaWApZUEhwa1M0d0tTM0c1bndHMUdSQmFSbHpjalJCVVFXVThpVWRCTGcweUwwZXR0MnF4bndvcTFwVFpHNzBiNDhZCnllUGw5Q1AwbUJEVHh5Y256aWU3Q2hTNzN3dDJJYTJsUkpCSDZPR0FMbHpaTUZwdnF3WkcvUC9WMk4wNVdJeGwKY05JMmNRS0NBUUVBb3lzN1ZobFVVNHp6b0cyQlVwMjdhRGdnb2JwUDR5UllCZ29vOWtURmdhZW1IWTVCM1NxQQpMY2toYWRXalFzZHdla1pxbDNBZ3ZIWGtIbFZjbXhsMzZmUmVGZ0pqT3dqVE04UWpsQWluOUtBUzY3UmFGM2NBClJpZEVIMndDeHo0bmZzUEdVdkpydUNaclpiUkd0WUtSQS9pUzBjMWEzQ0FJVnc0eFVkaDBVeGFONGVwZUFPMFEKd3pnNGVqclBXVzd5cDUvblVyT3BvaE9XQW81YVVCRlU1bEE0NTkzQTZXZXBodGhCNlgrVzNBOWprQmlnZkIzTQp2Rm53Qmx0dlJTUlFycjdTSE5qbUNGU2taTkh6dVpMM1BHZTBSeFBQK1lLOHJOcmdIS2pOSHpIdjY5ZXhZT2RTCjhlbzJUUFIrUVJxVG45Y2lLWnJjdFJCRGtLM01pQ2svb1FLQ0FRQVpJWmRrT0NsVVBIZlNrNHg1bkJYYXNoS1kKZ0R6ZXlZSFlMd05hQmRFS2dITnVmNmpDbHRLV29EelpzcXJ2MU55YS8xNDhzVGdTVGc5MzFiYmNoK2xuSEtKZApjWHJDUVpXQm51MlVxdWlzRk1lTk92cHAwY1B0NHRJWURaVkNSTVJyd0lsWnFJSnhiMm5Bd0Z2YjBmRWZMays0CmdtdSszY0NhTi92UzNvSkE5RUZremp4RzBYaUxPeW55QVpiNWZZMDRObUZPSXNxM3JnVDREZUN1ckhUS3RPSjIKdDE0b1ROcTA2TEQ1NjZPblQ2cGxMN3ZhTHRUUi85L3FKYzAwN1dqdzhRZGJUdVFBTHFDaldXZzJiN0JWa095UgpvOUdyaFB6U2VUNm5CSEk4RW9KdjBueGVRV05EWDlwWmlXLzFuc3l1QUFGSjlJU2JEV2p6L1R3QjE3VUwKLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0K", - AVAGO_STAKING_TLS_CERT_FILE_CONTENT: "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZOekNDQXg4Q0NRQzY4N1hGeHREUlNqQU5CZ2txaGtpRzl3MEJBUXNGQURCL01Rc3dDUVlEVlFRR0V3SlYKVXpFTE1Ba0dBMVVFQ0F3Q1Rsa3hEekFOQmdOVkJBY01Ca2wwYUdGallURVFNQTRHQTFVRUNnd0hRWFpoYkdGaQpjekVPTUF3R0ExVUVDd3dGUjJWamEyOHhEREFLQmdOVkJBTU1BMkYyWVRFaU1DQUdDU3FHU0liM0RRRUpBUllUCmMzUmxjR2hsYmtCaGRtRnNZV0p6TG05eVp6QWdGdzB4T1RBM01ESXhOakV5TWpWYUdBOHpNREU1TURjeE1ERTIKTVRJeU5Wb3dPakVMTUFrR0ExVUVCaE1DVlZNeEN6QUpCZ05WQkFnTUFrNVpNUkF3RGdZRFZRUUtEQWRCZG1GcwpZV0p6TVF3d0NnWURWUVFEREFOaGRtRXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDCkFRRFpuRG9ESEUybmo4MnhEakgwVGI3T1hNcVFESHoremJMaWR0Nk1TSTFYQjN2T0FJRWlQcXJ0ZW5HbnFSYlYKRmNtNUdaeHZ4aDRZUUQ4Q2pLU2sxcWdaSmN6czBEUFNpR1E4RWZsNFBHTzR4bkVibGxnTDNQVVJQV3A3bUVWMwpvaDZmeElDZ1FLVEJsVDY3MUVuRnpCNWx5SldwdW1SenZBMXZ5aEJNc1k4YU8reGRxNUxVRmx0WXpCZHZwZ0xYClZhRHdIWlEyUFFFV3RGMGQwSk8yTjBXRkZER05teDZuOHBLU2VJQVZEc1R3WkNaSytGQ2VlRXlvR2ZYc0lOc2MKMHlDTVFzbGF3a2ZPTXFBOXlCVjNKaTZRbUZZS3lHWXQ2NU1XR05xUEE0WHJJeWxpS3dDQ1h3ejltamFXeU43cgpBeXc5Y1dsTE1PRE5tRE9SV3pHUlo1MjkwTUVBRUlac3FqWUhWaXRSVE0vUm5OSWFkVG9aR08weTV1QWtNMTRjCm1Udm5zSzFDUDkycXRmU2lzcTc1Vy9JOTFkclRob0V0VEs3OFVHT2wvNVExWUJSMDhGK3RTVVdaV3lIZUk2VU8KQlVDR0MyYkN0bXpLTWw3dlUyNWxHNm1iQ1IxSnVRaTZSWXBuZk1qWEgzNmxWNFM3ZlR2U3d3dVIwM2gyRjNIMQplRmtXTkcybGJGclcwZHpEQ1BnM2xYd21GUTY1aFVjUWhjdHpub0J6NUMxbEYyZVcwM3d1Vmd4aW5udVZsSkhqCnkvR3JxbVdzQVNuMVBEdVZzNGs3azZESmZ3eUhBaUEwdXhYckdmeFl2cDdIOGo0KzJZT21XaVdsNXhZZ3JFRGoKdXI1bjhaeDQ2UEhRZXIyQXZxM3NiRUdFZTFNQ3RYSmxqM2RyZDVIaW0zbStOUUlEQVFBQk1BMEdDU3FHU0liMwpEUUVCQ3dVQUE0SUNBUUE0MGF4MGRBTXJiV2lrYUo1czZramFHa1BrWXV4SE5KYncwNDdEbzBoancrbmNYc3hjClFESG1XY29ISHBnTVFDeDArdnA4eStvS1o0cG5xTmZHU3VPVG83L2wwNW9RVy9OYld3OW1Id1RpTE1lSTE4L3gKQXkrNUxwT2FzdytvbXFXTGJkYmJXcUwwby9SdnRCZEsycmtjSHpUVnpFQ2dHU294VUZmWkQrY2syb2RwSCthUgpzUVZ1ODZBWlZmY2xOMm1qTXlGU3FNSXRxUmNWdzdycXIzWHk2RmNnUlFQeWtVbnBndUNFZ2NjOWM1NGMxbFE5ClpwZGR0NGV6WTdjVGRrODZvaDd5QThRRmNodnRFOVpiNWRKNVZ1OWJkeTlpZzFreXNjUFRtK1NleWhYUmNoVW8KcWw0SC9jekdCVk1IVVk0MXdZMlZGejdIaXRFQ2NUQUlwUzZRdmN4eGdZZXZHTmpaWnh5WnZFQThTWXBMTVp5YgpvbWs0ZW5EVExkL3hLMXlGN1ZGb2RUREV5cTYzSUFtME5UUVpVVnZJRGZKZXV6dU56NTV1eGdkVXEyUkxwYUplCjBidnJ0OU9ieitmNWoyam9uYjJlMEJ1dWN3U2RUeUZYa1VDeE1XK3BpSVVHa3lyZ3VBaGxjSG9oRExFbzJ1Qi8KaVE0Zm9zR3Fxc2w0N2IrVGV6VDVwU1NibGtnVWppd3o2ZURwTTRsUXB4MjJNeHNIVmx4RkhyY0JObTBUZDkydgpGaXhybWxsYW1BWmJFejF0Qi8vMGJpcEthT09adWhBTkpmcmdOOEJDNnYyYWhsNC9TQnV1dDA5YTBBenl4cXBwCnVDc3lUbmZORWQxVzZjNm5vYXEyNHMrN1c3S0tMSWVrdU5uMU51bm5IcUtxcmlFdUgxeGx4eFBqWUE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==", - AVAGO_STAKING_SIGNER_KEY_FILE_CONTENT: "QXZhbGFuY2hlTG9jYWxOZXR3b3JrVmFsaWRhdG9yMDQ=" - } - networks: - avalanche-testnet: { ipv4_address: 10.0.20.6 } - avalanche-node-5: - container_name: avalanche-node-5 - hostname: avalanche-node-5 - image: avalanche-node:latest - volumes: - - ./avalanche-node-5/logs:/root/.avalanchego/logs - environment: { - AVAGO_NETWORK_ID: "local", - AVAGO_API_ADMIN_ENABLED: "true", - AVAGO_LOG_LEVEL: "DEBUG", - AVAGO_LOG_DISPLAY_LEVEL: "TRACE", - AVAGO_HTTP_HOST: "0.0.0.0", - AVAGO_PUBLIC_IP: "10.0.20.7", - AVAGO_BOOTSTRAP_IDS: "NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg", - AVAGO_BOOTSTRAP_IPS: "10.0.20.3:9651", - AVAGO_STAKING_TLS_KEY_FILE_CONTENT: "LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlKS1FJQkFBS0NBZ0VBNEN1YStiM1I3U1JSSU1PNFJoUDVjeW1oM0w4TTY5OW1xNXF0SlBiV0hJU1YzMDk1Ck5ZOVpWN1FRSFhGRGQ0RWtTbzRNeC83NDI1OUhtdHdJZ3dsSGRqSEpQNTlDbkNXZU4wdVNPMll6KzYyMnI5dmUKbXlnbWRSNis2K1lGMkJZWlB0MmxMRlh3MUtnRHdjTWovQ25sZDlRRVZRUDdQbGozbHFyT3ZVRjAzY2liZ1dCTwphYStOTDlVbi9ubTFDSjJkKzdobU41SWp0Qk1meVlIS0VMQmljNjFnLzg3VzBRaFNMNjNUU1dYZEtScnpKWmt5CnFlMTdERWQzS2I2cE8rOVAvekN3bmNobHY5U0FLMDByZzliM2U1Z1Y5U2NsVnlzbkdEZEx5RHJXNE1UemhiclYKTXFnem5qKzZPZGF1SWowdDNRa1lINXAvNFZpOE12Z3JTWHRBUmlyRytMWk5MU3NhTkxIdkwvU1FQSmxMWjVzNQpqTGVHUFk0b3pxd2pnZTE4RmlwaVdCSnZEZVZHM011bktkcUMvTDBGYmM4OXoxNjVCYmZ0M0JiZFk2NDNhVUdJCkIrSThwSkZnM2pveEg4dFJRc003RFViblMwN3k0WHk1L092MlUrSEMyZlNTTy8xbHRDRHd2QlhPNVljNXlmbXkKRUZIaEozV2huWUZaTWJoSU5ETVhheks5STFOQ0JhRjhra1Z6VWMzQTFtVW9SSXdVNys3WnhjUzVxRFZQcmlXLwp5cVRCK3JFV0l0ODdQT1huR2pDamNodml3NWdXb1ZKUjhlWVNnQitQVHZQT2VmZ0RJYklQZFRqV1NaWFkwRjlLCkdheUNzeXVRYWJLbms1ZUhObUxmM3dDNG1XbmhaTmFRUkxMMVhqRGdRaUxsaFBtK0ZDQkdpd0RvY1g4Q0F3RUEKQVFLQ0FnRUFwdU1QcnhtSDdYbjZBK0J4a1lwUlRWRVROWm50N3JRVVpYRHpzZThwbTNXQmRneGVlbWRMNWlVaApVaW4rUmp1WVh3Qzl0eTYwNmh2OFhPZXVWbzlUNmtSS1JOazE1N1dCd2p5Nmt3b1ZiU3I0TkpnRmM1RkNnREx4CmhBRnRIRi9uVDR3RzZhalpjQmZkSkNVNDV3UHgxM0c1LytqRTVMZXJLem5pUzdjdFgrZDNEYXc2OUNkRGZ2YTcKblpIU0dxWHM5WGRrY2I2VVlmMVN6dHVYS1RHSE9nTTdrWFhWS3kxOHNnNUFuQVgvemhoSUtCZVRSanFNUHFuOQpwdEJRZ1ZRNlJBdGxrVEdkdm1CZlF0MWlwZllsckplZTBUSGhkTEdsbXp1ZmFXT1VrU1ZPL3FJSEVuMXlZRCtsClRtWHFvWWJXWEJYbkpiQUp3Q1FsaC9TRmxXRHlpV1dPeHN6eGR3d1QyeWJ3N09SM2EwREVWME1iS0prVWV4eUYKOTJMcjNxb0JTWlJGUW5YVnZCZ2pRT3duekVGcGgxQU51R1kzb2RMOEpTTTF0SG5pSXNDczRXaERQT3NiQWoraAprd1M1MWNvbE1rM2JOQ1ozeGVBcmpNTEJWTGdUN3hMWC83WlljNy9vVEVGV2lrKzIwVHZTRVd6ZEUxTi80Z2ZKCmpFVS9WcXJuTmp5ZXYydzlBazZiRWt3WkZMUzZWWjlyVFdURjlqazhDMWFYai9SaGZhYUMzM3hYQmJobjlIdVgKbFR1L0phTE1wMFFjNGFDbHFVWU02TGx4SWVqSDViOGZJeENOSEppc2xYSkRhNmE2YVFsODVCaVFPRFBGeFZUNQpXQ3BRRDQ4NThFdUxkWDRCUlcyZklHUlk2RGl2UjZ1SlJBbXhMZitFd0FnL3JnVHpVc0VDZ2dFQkFQU2tIWDVGCkJoUmd1ZEYwTW53Titlbmo0U29YSGhSRytEVG9yeE8xWmgycU45bG5YTzluTUtNQ1hWSkxJVnZHRnVpTVJTSjAKVktmMXUwVXFhQkYwMk1iSXZiZWk3bXpra1cwLzc0bTA0WDM3aXlNbXRubW9vUTBHRVY4NG9PTndBdDNEZWVUZwp2SXBPdHE5VjI2WEhHYVFEeGNSRk1GQnVEMDJhMnlmM0pZa1hqNzRpMnNjTVA0eHhNSE1rSnhHSzlGU0JPaG5wCmsvcDBoTWwzRlZHZm81TnM1VDFSbDNwTXVlRUYzQjUrQnZyVjF6MTRJTi8wbHd1aHVqclVVWVM0RXcrUGs1ekMKRlN1YmZJUU1xU1QxanZYWFRhR2dYMEdQZmZhNGx4Z2FERUFUTGV3dkwzRmp5MjdYemw1N2k5WnZUTkM0eUZhZAo0b2tqci9lSXRIdEtWSEVDZ2dFQkFPcVVLd3cvNnVpSk1OdmMyTnhMVU14dXpCMDdycU9aS1QyVk1Ca0c1R3prCnY4MWZEdGxuZEQ4Y3dIU3FPTEtzY0gvUUtYRDdXSzNGQ3V2WlN2TXdDakVCNFBwMXpnd0pvQmV4dVh2RkREYnMKMFQ3N1Fpd2UrMldtUklpWWV2NWFSRzNsbkJNTThSRFMvUVB6RWRveEhkenJGVVJZVmwwcnY1bC83cndCMlpkNgp4QVlIY1VwWmM0WmF5c0VncVFDdVpRcUM3TXJxN3FmQnlVdGhIMjhZaWN6MTk3OGZwRTNkeDE1Y2VxalU5akJRCnhVVXdiZUtUL1VrUVF2bVlIZHRnd0VqaHpWUUwxT0FBV2tUNlJzc01xeDJSQWRpMFNxV1BGRWh4TlBIQnBHOUIKbEtVREJCSU02ZHU5MTZPbjBCamdoaDNXaHhRS3BUSXp2ZU5BaWV4YlhPOENnZ0VCQU52Sm9oR3ljMzdWVTd3ZwoxOFpxVEEvY3dvc3REOElKN0s2a0tiN2NKeTBabzJsM21xQWZKaXdkVUxoQmRXdmRNUEdtSytxRGR4Y2JCeTloCnBQT2g5YXZKNStCV3lqd2NzYWJrWFJGcjUzWm5DcDcvQmN1Uk8zZlc3cjZNd3NieStEQkNrWDJXaHV6L1FOT1AKb0hGMHljMTM4aktlTW9UZ0RIR2RZYTJyTmhiUGl6MjRWTE9saG1abnZxNkRXWEpDVTdha0R3Mytzd3E5cWhyUwpHTjRuUFMrVEV2VWZHNmN0ellXajNSbXNBaHRUQ1RoWmQ3ZWRLQ0swSHZzQmkyZGdkUWR5NTV4YkplZnlubENJCmkySUFGM3M0L3E3cHhRckNudG1OQjNvSTFONndISDduK1lpMnJxc2J5WFZMSzl2d1RLUHNqMWg2S204cEY4dWQKRHdFQlM1RUNnZ0VBTW5xMkZNbkFiRS94Z3E2d3dCODVBUFVxMlhPWmJqMHNZY016K1g3Qk15bTZtS0JIR3NPbgpnVmxYbFFONGRnS2pwdTJOclhGNU1OUEJPT1dtdWxSeExRQ2hnR1JQZGNtd2VNalhDR3ByNlhubXdXM2lYSXBDClFTcVpmdWVKT0NrR3BydU5iWkFRWkRWekd5RjRpd0tjMFlpSktBNzJidEJXUjlyKzdkaGNFYnZxYVAyN0JHdmgKYjEwa1dwRURyVkRhRDN3REp0dU5oZTR1dWhqcFljZmZCNHM2eUJjd0RVMlhkSmZrRVdiYW42VVIvb1NnY095MQp5YjVGRzE3L3RkREpNQ1hmUUtIWEtta0pBK1R6elFncDNvL3czTWhYYys4cFJ6bU5VaVVBbEt5QkowMVIxK3lOCmVxc010M3dLVFFBci9FbkpBYWdVeW92VjVneGlZY2w3WXdLQ0FRQWRPWWNaeC9sLy9PMEZ0bTZ3cFhHUmpha04KSUhGY1AyaTdtVVc3NkV3bmoxaUZhOVl2N3BnYmJCRDlTMVNNdWV0ZklXY3FTakRpVWF5bW5EZEExOE5WWVVZdgpsaGxVSjZrd2RWdXNlanFmY24rNzVKZjg3QnZXZElWR3JOeFBkQjdaL2xtYld4RnF5WmkwMFI5MFVHQm50YU11CnpnL2lickxnYXR6QTlTS2dvV1htMmJMdDZiYlhlZm1PZ25aWHl3OFFrbzcwWHh0eDVlQlIxQkRBUWpEaXM4MW4KTGc5NnNKM0xPbjdTWEhmeEozQnRYc2hUSkFvQkZ4NkVwbXVsZ05vUFdJa0p0ZDdYV1lQNll5MjJEK2tLN09oSApScTNDaVlNdERtWm91Yi9rVkJMME1WZFNtN2huMVRTVlRIakZvVzZjd1EzN2lLSGprWlZSd1gxS3p0MEIKLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0K", - AVAGO_STAKING_TLS_CERT_FILE_CONTENT: "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZOekNDQXg4Q0NRQzY4N1hGeHREUlNqQU5CZ2txaGtpRzl3MEJBUXNGQURCL01Rc3dDUVlEVlFRR0V3SlYKVXpFTE1Ba0dBMVVFQ0F3Q1Rsa3hEekFOQmdOVkJBY01Ca2wwYUdGallURVFNQTRHQTFVRUNnd0hRWFpoYkdGaQpjekVPTUF3R0ExVUVDd3dGUjJWamEyOHhEREFLQmdOVkJBTU1BMkYyWVRFaU1DQUdDU3FHU0liM0RRRUpBUllUCmMzUmxjR2hsYmtCaGRtRnNZV0p6TG05eVp6QWdGdzB4T1RBM01ESXhOakV5TWpsYUdBOHpNREU1TURjeE1ERTIKTVRJeU9Wb3dPakVMTUFrR0ExVUVCaE1DVlZNeEN6QUpCZ05WQkFnTUFrNVpNUkF3RGdZRFZRUUtEQWRCZG1GcwpZV0p6TVF3d0NnWURWUVFEREFOaGRtRXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDCkFRRGdLNXI1dmRIdEpGRWd3N2hHRS9sekthSGN2d3pyMzJhcm1xMGs5dFljaEpYZlQzazFqMWxYdEJBZGNVTjMKZ1NSS2pnekgvdmpibjBlYTNBaURDVWQyTWNrL24wS2NKWjQzUzVJN1pqUDdyYmF2Mjk2YktDWjFIcjdyNWdYWQpGaGsrM2FVc1ZmRFVxQVBCd3lQOEtlVjMxQVJWQS9zK1dQZVdxczY5UVhUZHlKdUJZRTVwcjQwdjFTZitlYlVJCm5aMzd1R1kza2lPMEV4L0pnY29Rc0dKenJXRC96dGJSQ0ZJdnJkTkpaZDBwR3ZNbG1US3A3WHNNUjNjcHZxazcKNzAvL01MQ2R5R1cvMUlBclRTdUQxdmQ3bUJYMUp5VlhLeWNZTjB2SU90Ymd4UE9GdXRVeXFET2VQN281MXE0aQpQUzNkQ1JnZm1uL2hXTHd5K0N0SmUwQkdLc2I0dGswdEt4bzBzZTh2OUpBOG1VdG5tem1NdDRZOWppak9yQ09CCjdYd1dLbUpZRW04TjVVYmN5NmNwMm9MOHZRVnR6ejNQWHJrRnQrM2NGdDFqcmpkcFFZZ0g0anlra1dEZU9qRWYKeTFGQ3d6c05SdWRMVHZMaGZMbjg2L1pUNGNMWjlKSTcvV1cwSVBDOEZjN2xoem5KK2JJUVVlRW5kYUdkZ1ZreAp1RWcwTXhkck1yMGpVMElGb1h5U1JYTlJ6Y0RXWlNoRWpCVHY3dG5GeExtb05VK3VKYi9LcE1INnNSWWkzenM4CjVlY2FNS055RytMRG1CYWhVbEh4NWhLQUg0OU84ODU1K0FNaHNnOTFPTlpKbGRqUVgwb1pySUt6SzVCcHNxZVQKbDRjMll0L2ZBTGlaYWVGazFwQkVzdlZlTU9CQ0l1V0UrYjRVSUVhTEFPaHhmd0lEQVFBQk1BMEdDU3FHU0liMwpEUUVCQ3dVQUE0SUNBUUIrMlZYbnFScWZHN0gyL0swbGd6eFQrWDlyMXUrWURuMEVhVUdBRzcxczcwUW5xYnBuClg3dEJtQ0tMTjZYZ1BMMEhyTjkzM253aVlybWZiOFMzM3paN2t3OEdKRHZhVGFtTE55ZW00LzhxVEJRbW5Sd2UKNnJRN1NZMmw3M0lnODdtUjBXVGkrclRuVFR0YzY2Ky9qTHRGZWFqMFljbDloQlpYSEtpVUxTR2hzYlVid3RregppdU5sQU5ob05LWE5JQUJSSW1VcTZPd1loRVFOMER3SFhqNzl3a3B5RFlqS1p3SHVFWlVrbmM4UGwyb1FQQmtlCm1pbDN0c3J2R1Jrd2hpc25YWDd0cWg2cldLVlpOSmtPNjhoeTdYTzlhVFhqYmNCLzdZMUs4M0lTTkV5R1BzSC8KcHdGeWQvajhPNG1vZHdoN1Vsd3cxL2h3Y3FucWlFRkUzS3p4WDJwTWg3VnhlQW1YMnQ1ZVhGWk9sUngxbGVjTQpYUmtWdTE5bFlES1FIR1NyR3huZytCRmxTT0I5NmU1a1hJYnVJWEtwUEFBQ29CUS9KWllidEhrczlIOE90TllPClAyam9xbW5ROXdHa0U1Y28xSWkvL2oydHVvQ1JDcEs4Nm1tYlRseU5ZdksrMS9ra0tjc2FpaVdYTnJRc3JJRFoKQkZzMEZ3WDVnMjRPUDUrYnJ4VGxSWkUwMVI2U3Q4bFFqNElVd0FjSXpHOGZGbU1DV2FZYXZyQ1pUZVlhRWl5RgpBMFgyVkEvdlo3eDlENVA5WjVPYWtNaHJNVytoSlRZcnBIMXJtNktSN0IyNmlVMmtKUnhUWDd4UTlscmtzcWZCCjdsWCtxMGloZWVZQTRjSGJHSk5Xd1dnZCtGUXNLL1BUZWl5cjRyZnF1dHV0ZFdBMEl4b0xSYzNYRnc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==", - AVAGO_STAKING_SIGNER_KEY_FILE_CONTENT: "QXZhbGFuY2hlTG9jYWxOZXR3b3JrVmFsaWRhdG9yMDU=" - } - networks: - avalanche-testnet: { ipv4_address: 10.0.20.7 } diff --git a/tests/fixture/tmpnet/local_network.go b/tests/fixture/tmpnet/local_network.go new file mode 100644 index 000000000000..4f0801154df1 --- /dev/null +++ b/tests/fixture/tmpnet/local_network.go @@ -0,0 +1,67 @@ +// Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +package tmpnet + +import ( + "fmt" + + "github.com/ava-labs/avalanchego/config" + "github.com/ava-labs/avalanchego/genesis" + "github.com/ava-labs/avalanchego/utils/crypto/secp256k1" +) + +func LocalNetworkOrDie() *Network { + // Temporary network configured with local network keys + // See: /staking/local/README.md + network := &Network{ + NetworkID: genesis.LocalConfig.NetworkID, + PreFundedKeys: []*secp256k1.PrivateKey{ + genesis.EWOQKey, // Funded in the local genesis + }, + Nodes: []*Node{ + { + Flags: FlagsMap{ + config.StakingTLSKeyContentKey: "LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlKS0FJQkFBS0NBZ0VBeW1Fa2NQMXRHS1dCL3pFMElZaGEwZEp2UFplc2s3c3k2UTdZN25hLytVWjRTRDc3CmFwTzJDQnB2NXZaZHZjY0VlQ2VhKzBtUnJQdTlNZ1hyWkcwdm9lejhDZHE1bGc4RzYzY2lTcjFRWWFuL0pFcC8KbFZOaTNqMGlIQ1k5ZmR5dzhsb1ZkUitKYWpaRkpIQUVlK2hZZmFvekx3TnFkTHlldXZuZ3kxNWFZZjBXR3FVTQpmUjREby85QVpnQ2pLMkFzcU9RWVVZb2Zqcm9JUEdpdUJ2VDBFeUFPUnRzRTFsdGtKQjhUUDBLYVJZMlhmMThFCkhpZGgrcm0xakJYT1g3YlgrZ002U2J4U0F3YnZ5UXdpbG9ncnVadkxlQmkvTU5qcXlNZkNiTmZaUmVHR0JObnEKSXdxM3FvRDR1dUV0NkhLc0NyQTZNa2s4T3YrWWlrT1FWR01GRjE5OCt4RnpxZy9FakIzbjFDbm5NNCtGcndHbQpTODBkdTZsNXVlUklFV0VBQ0YrSDRabU96WDBxS2Qxb2RCS090dmlSNkRQOVlQbElEbDVXNTFxV1BlVElIZS8zCjhBMGxpN3VDTVJOUDdxdkZibnlHM3d1TXEyUEtwVTFYd0gzeU5aWFVYYnlZenlRVDRrTkFqYXpwZXRDMWFiYVoKQm5QYklSKzhHZG16OUd4SjJDazRDd0h6c3cvRkxlOVR0Z0RpR3ZOQU5SalJaZUdKWHZ6RWpTVG5FRGtxWUxWbgpVUk15RktIcHdJMzdzek9Ebms2K0hFWU9QbFdFd0tQU2h5cTRqZFE3bnNEY3huZkZveWdGUjVuQ0RJNmlFaTA1CmN6SVhiSFp2anBuME9qcjhsKzc5Qmt6Z1c0VDlQVFJuTU1PUU5JQXMxemRmQlV1YU1aOFh1amh2UTlNQ0F3RUEKQVFLQ0FnRUF1VU00TXQ4cjhiWUJUUFZqL1padlhVakFZS2ZxYWNxaWprcnpOMGtwOEM0Y2lqWnR2V0MrOEtnUwo3R0YzNnZTM0dLOVk1dFN3TUtTNnk0SXp2RmxmazJINFQ2VVU0MU9hU0E5bEt2b25EV0NybWpOQW5CZ2JsOHBxCjRVMzRXTEdnb2hycExiRFRBSkh4dGF0OXoxZ2hPZGlHeG5EZ0VVRmlKVlA5L3UyKzI1anRsVEttUGhzdHhnRXkKbUszWXNTcDNkNXhtenE0Y3VYRi9mSjF2UWhzWEhETHFIdDc4aktaWkErQVdwSUI1N1ZYeTY3eTFiazByR25USwp4eFJuT2FPT0R1YkpneHFNRVExV2tMczFKb3c5U3NwZDl2RGdoUHp0NFNOTXpvckI4WURFU01pYjE3eEY2aVhxCmpGajZ4NkhCOEg3bXA0WDNSeU1ZSnVvMnc2bHB6QnNFbmNVWXBLaHFNYWJGMEkvZ2lJNVZkcFNEdmtDQ09GZW4KbldaTFY5QWkveDd0VHEvMEYrY1ZNNjlNZ2ZlOGlZeW1xbGZkNldSWklUS2ZWaU5IQUxsRy9QcTl5SEpzejdOZwpTOEJLT0R0L3NqNFEweEx0RkRUL0RtcFA1MGlxN1NpUzE0b2JjS2NRcjhGQWpNL3NPWS9VbGc0TThNQTdFdWdTCnBESndMbDZYRG9JTU1DTndaMUhHc0RzdHpteDVNZjUwYlM0dGJLNGlaemNwUFg1UkJUbFZkbzlNVFNnbkZpenAKSWkxTmpITHVWVkNTTGIxT2pvVGd1MGNRRmlXRUJDa0MxWHVvUjhSQ1k2aVdWclVINEdlem5pN2NrdDJtSmFOQQpwZDYvODdkRktFM2poNVQ2alplSk1KZzVza1RaSFNvekpEdWFqOXBNSy9KT05TRDA2c0VDZ2dFQkFQcTJsRW1kCmcxaHBNSXFhN2V5MXVvTGQxekZGemxXcnhUSkxsdTM4TjY5bVlET0hyVi96cVJHT3BaQisxbkg3dFFKSVQvTDEKeExOMzNtRlZxQ3JOOHlVbVoraVVXaW9hSTVKWjFqekNnZW1WR2VCZ29kd1A5TU9aZnh4ckRwMTdvVGRhYmFFcQo3WmFCWW5ZOHhLLzRiQ3h1L0I0bUZpRjNaYThaVGQvKzJ5ZXY3Sk0rRTNNb3JXYzdyckttMUFwZmxmeHl0ZGhPCkpMQmlxT2Nxb2JJM2RnSHl6ZXNWYjhjVDRYQ3BvUmhkckZ3b3J0MEpJN3J5ZmRkZDQ5dk1KM0VsUmJuTi9oNEYKZjI0Y1dZL3NRUHEvbmZEbWVjMjhaN25WemExRDRyc3pOeWxZRHZ6ZGpGMFExbUw1ZEZWbnRXYlpBMUNOdXJWdwpuVGZ3dXlROFJGOVluWU1DZ2dFQkFNNmxwTmVxYWlHOWl4S1NyNjVwWU9LdEJ5VUkzL2VUVDR2Qm5yRHRZRis4Cm9oaUtnSXltRy92SnNTZHJ5bktmd0pPYkV5MmRCWWhDR0YzaDl6Mm5jOUtKUUQvc3U3d3hDc2RtQnM3WW9EaU0KdXpOUGxSQW1JMFFBRklMUENrNDh6L2xVUWszci9NenUwWXpSdjdmSTRXU3BJR0FlZlZQRHF5MXVYc0FURG9ESgphcmNFa05ENUxpYjg5THg3cjAyRWV2SkpUZGhUSk04bUJkUmw2d3BOVjN4QmR3aXM2N3VTeXVuRlpZcFNpTXc3CldXaklSaHpoTEl2cGdENzhVdk52dUppMFVHVkVqVHFueHZ1VzNZNnNMZklrODBLU1IyNFVTaW5UMjd0Ly94N3oKeXpOa283NWF2RjJobTFmOFkvRXBjSEhBYXg4TkFRRjV1dVY5eEJOdnYzRUNnZ0VBZFMvc1JqQ0syVU5wdmcvRwowRkx0V0FncmNzdUhNNEl6alZ2SnMzbWw2YVYzcC81dUtxQncwVlVVekdLTkNBQTRUbFhRa09jUnh6VnJTNkhICkZpTG4yT0NIeHkyNHExOUdhenowcDdmZkUzaHUvUE1PRlJlY04rVkNoZDBBbXRuVHRGVGZVMnNHWE1nalp0TG0KdUwzc2lpUmlVaEZKWE9FN05Vb2xuV0s1dTJZK3RXQlpwUVZKY0N4MGJ1c054NytBRXR6blpMQzU4M3hhS0p0RApzMUs3SlJRQjdqVTU1eHJDMEc5cGJrTXlzbTBOdHlGemd3bWZpcEJIVmxDcHl2ZzZEQ3hkOEZodmhOOVplYTFiCmZoa2MwU0pab3JIQzVoa3FweWRKRG1sVkNrMHZ6RUFlUU00Qzk0WlVPeXRibmpRbm1YcDE0Q05BU1lxTFh0ZVEKdWVSbzB3S0NBUUFHMEYxMEl4Rm0xV290alpxdlpKZ21RVkJYLzBmclVQY3hnNHZwQjVyQzdXUm03TUk2WVF2UgpMS0JqeldFYWtIdjRJZ2ZxM0IrZms1WmNHaVJkNnhTZG41cjN3S1djR2YzaC8xSkFKZEo2cXVGTld0VnVkK04zCnpZemZsMVllcUZDdlJ3RDhzc2hlTlkzQlYvVTdhU3ROZDJveTRTNSt3WmYyWW9wTFNSV1VWNC9tUXdkSGJNQUIKMXh0Mno1bEROQmdkdng4TEFBclpyY1pKYjZibGF4RjBibkF2WUF4UjNoQkV6eFovRGlPbW9GcGRZeVUwdEpRVQpkUG1lbWhGZUo1UHRyUnh0aW1vaHdnQ0VzVC9UQVlodVVKdVkyVnZ6bkVXcHhXdWNiaWNLYlQySkQwdDY3bUVCCnNWOSs4anFWYkNsaUJ0ZEJhZHRib2hqd2trb1IzZ0J4QW9JQkFHM2NadU5rSVdwRUxFYmVJQ0tvdVNPS04wNnIKRnMvVVhVOHJvTlRoUFI3dlB0amVEMU5ETW1VSEpyMUZHNFNKclNpZ2REOHFOQmc4dy9HM25JMEl3N2VGc2trNQo4bU5tMjFDcER6T04zNlpPN0lETWo1dXlCbGoydCtJeGwvdUpZaFlTcHVOWHlVVE1tK3JrRkowdmRTVjRmakxkCkoybTMwanVZbk1pQkJKZjdkejVNOTUrVDB4aWNHV3lWMjR6VllZQmJTbzBOSEVHeHFlUmhpa05xWk5Qa29kNmYKa2ZPSlpHYWxoMkthSzVSTXBacEZGaFova1c5eFJXTkpaeUNXZ2tJb1lrZGlsTXVJU0J1M2xDcms4cmRNcEFMMAp3SEVjcTh4d2NnWUNTMnFrOEh3anRtVmQzZ3BCMXk5VXNoTXIzcW51SDF3TXBVNUMrbk0yb3kzdlNrbz0KLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0K", + config.StakingCertContentKey: "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZOekNDQXg4Q0NRQzY4N1hGeHREUlNqQU5CZ2txaGtpRzl3MEJBUXNGQURCL01Rc3dDUVlEVlFRR0V3SlYKVXpFTE1Ba0dBMVVFQ0F3Q1Rsa3hEekFOQmdOVkJBY01Ca2wwYUdGallURVFNQTRHQTFVRUNnd0hRWFpoYkdGaQpjekVPTUF3R0ExVUVDd3dGUjJWamEyOHhEREFLQmdOVkJBTU1BMkYyWVRFaU1DQUdDU3FHU0liM0RRRUpBUllUCmMzUmxjR2hsYmtCaGRtRnNZV0p6TG05eVp6QWdGdzB4T1RBM01ESXhOakV5TVRWYUdBOHpNREU1TURjeE1ERTIKTVRJeE5Wb3dPakVMTUFrR0ExVUVCaE1DVlZNeEN6QUpCZ05WQkFnTUFrNVpNUkF3RGdZRFZRUUtEQWRCZG1GcwpZV0p6TVF3d0NnWURWUVFEREFOaGRtRXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDCkFRREtZU1J3L1cwWXBZSC9NVFFoaUZyUjBtODlsNnlUdXpMcER0anVkci81Um5oSVB2dHFrN1lJR20vbTlsMjkKeHdSNEo1cjdTWkdzKzcweUJldGtiUytoN1B3SjJybVdEd2JyZHlKS3ZWQmhxZjhrU24rVlUyTGVQU0ljSmoxOQozTER5V2hWMUg0bHFOa1VrY0FSNzZGaDlxak12QTJwMHZKNjYrZURMWGxwaC9SWWFwUXg5SGdPai8wQm1BS01yCllDeW81QmhSaWgrT3VnZzhhSzRHOVBRVElBNUcyd1RXVzJRa0h4TS9RcHBGalpkL1h3UWVKMkg2dWJXTUZjNWYKdHRmNkF6cEp2RklEQnUvSkRDS1dpQ3U1bTh0NEdMOHcyT3JJeDhKczE5bEY0WVlFMmVvakNyZXFnUGk2NFMzbwpjcXdLc0RveVNUdzYvNWlLUTVCVVl3VVhYM3o3RVhPcUQ4U01IZWZVS2Vjemo0V3ZBYVpMelIyN3FYbTU1RWdSCllRQUlYNGZobVk3TmZTb3AzV2gwRW82MitKSG9NLzFnK1VnT1hsYm5XcFk5NU1nZDcvZndEU1dMdTRJeEUwL3UKcThWdWZJYmZDNHlyWThxbFRWZkFmZkkxbGRSZHZKalBKQlBpUTBDTnJPbDYwTFZwdHBrR2M5c2hIN3daMmJQMApiRW5ZS1RnTEFmT3pEOFV0NzFPMkFPSWE4MEExR05GbDRZbGUvTVNOSk9jUU9TcGd0V2RSRXpJVW9lbkFqZnV6Ck00T2VUcjRjUmc0K1ZZVEFvOUtIS3JpTjFEdWV3TnpHZDhXaktBVkhtY0lNanFJU0xUbHpNaGRzZG0rT21mUTYKT3Z5WDd2MEdUT0JiaFAwOU5HY3d3NUEwZ0N6WE4xOEZTNW94bnhlNk9HOUQwd0lEQVFBQk1BMEdDU3FHU0liMwpEUUVCQ3dVQUE0SUNBUUFxTDFUV0kxUFRNbTNKYVhraGRUQmU4dHNrNytGc0hBRnpUY0JWQnNCOGRrSk5HaHhiCmRsdTdYSW0rQXlHVW4wajhzaXo4cW9qS2JPK3JFUFYvSW1USDVXN1EzNnJYU2Rndk5VV3BLcktJQzVTOFBVRjUKVDRwSCtscFlJbFFIblRhS011cUgzbk8zSTQwSWhFaFBhYTJ3QXd5MmtEbHo0NmZKY3I2YU16ajZaZzQzSjVVSwpaaWQrQlFzaVdBVWF1NVY3Q3BDN0dNQ3g0WWRPWldXc1QzZEFzdWc5aHZ3VGU4MWtLMUpvVEgwanV3UFRCSDB0CnhVZ1VWSVd5dXdlTTFVd1lGM244SG13cTZCNDZZbXVqaE1ES1QrM2xncVp0N2VaMVh2aWVMZEJSbFZRV3pPYS8KNlFZVGtycXdQWmlvS0lTdHJ4VkdZams0MHFFQ05vZENTQ0l3UkRnYm5RdWJSV3Jkc2x4aUl5YzVibEpOdU9WKwpqZ3Y1ZDJFZVVwd1VqdnBadUVWN0ZxUEtHUmdpRzBqZmw2UHNtczlnWVVYZCt5M3l0RzlIZW9ETm1MVFNUQkU0Cm5DUVhYOTM1UDIveE91b2s2Q3BpR3BQODlEWDd0OHlpd2s4TEZOblkzcnZ2NTBuVnk4a2VyVmRuZkhUbW9NWjkKL0lCZ29qU0lLb3Y0bG1QS2RnekZmaW16aGJzc1ZDYTRETy9MSWhURjdiUWJIMXV0L09xN25wZE9wTWpMWUlCRQo5bGFndlJWVFZGd1QvdXdyQ2NYSENiMjFiL3B1d1Y5NFNOWFZ3dDdCaGVGVEZCZHR4SnJSNGpqcjJUNW9kTGtYCjZuUWNZOFYyT1Q3S094bjBLVmM2cGwzc2FKVExtTCtILzNDdEFhbzlOdG11VURhcEtJTlJTVk55dmc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==", + config.StakingSignerKeyContentKey: "QXZhbGFuY2hlTG9jYWxOZXR3b3JrVmFsaWRhdG9yMDE=", + }, + }, + { + Flags: FlagsMap{ + config.StakingTLSKeyContentKey: "LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlKS2dJQkFBS0NBZ0VBM1U2RWV0SjJ1amJrZllrZ0ZETXN6MXlUVEZsVUd5OGsrZjRtUW9pZHdRZUdGakFZClg4YVNWaVlsbDNEUHM1dzRLU2JzZ2hIb2VRNmVtV054WHU1T2g0YmVoWmhhUTQ4SjQ2VUpuWkJDbElOTkJ2aEoKVDA2ZjFMSnJEeS9pUUxNRDZnV1ZxVEFVdDNiRjBEYnB6RExUQnBhMytVdEplbDErTXU1SFB4azhXSUwzbG1mUwpiVWY1dGlqWHEvc0k0QVI2aWVLejZweHdkOUxBMkQyWVBkUXM5UUpQQVc5c05pTmRQTTBGWUNpdW5pS2pTbHlTCmYrS1lzMG1YVk9QZHRNRE1XQWFaM3d3SElaOFhvdlZQNzkwRzArM2lsQ05ueHEvb1Rsa3lGbFBOUGxYamdiZkcKdWorTEV2UUVJZWYraHZLc0pnS2p0MkVQWGNUZk5vcnZ4OS9qZmhobXZ6TksrYXhGcTg4Q0xoWWNDcjhrSEtUMApRWnRza0p3WjRTL1J1WkRlcCtEZ1ROQ3JJR2R3bUpSMlVvT0hsbkRZQWJkVmdoYkVITzczMUJXaVo2L0VEOTZSCmVGZitBYUpPOEV6dVJ6ZEFOUkdCRldMbCtkelJwNnlsWHZoWVBmc1REb0Z6MXBGRGFuYjZTUFdXMWQyZEV1Zk8KdXFoZC83d1dhNFlBcXluT1JQN3pIc1FVWHZDb3VNQ3FqalZZWXZWaGxIRVI3eFJJcEhQdTFhejQ5R0dodXMxUwozZnJqZ0NUZk5YeWpqMktPRitMR2F6TWoySmR6b3hyVElYMWVDcndtaXhLOVhianBKYWp1bkFyeGtQSWdKUzFjCnQxU2NsdVJpZEE5Q3NvZ0lxK0ZUWFFDU3FOV1lJaG9yeVMxcnBVMzQxSW53amZhTmRlUUlxaWNZcXNNQ0F3RUEKQVFLQ0FnQU5HVU9nSFdybmxLNHJlLzFKRk1wWEw2eU1QVkZNRnB0Q3JMZEpBdHNMZk0yRDdLN1VwR1V1OGkwUgpiSnp1alpXSllnTm5vM1cyREpaNGo3azdIREhMdGNEZitXZUdUaVlRc2trQ2FYSjNaZG9lU24zVVV0d0U4OWFBClhKNHdwQ2ZjSng1M21CL3h4L2JuWHdpeGpHU1BKRWFaVzhwcWtyUVFnYWYzNVI5OFFhd3oyOHRKcXBQdUl6YTQKdURBTFNsaVNacmV0Y0RyNzdKNTdiaEhmdnZvMk9qL0EzdjV4cWVBdjVCYW9YV0FRZmc1YUxXYUNhVUFPaEpHUApkYmsrcEphenN4aFNhbHpWc1p2dGlrV0Q5Zm9jZXgwSkZadGoyQytReTVpNlY1VnpWaFFVTG5OMXZLTVhxUmZCCmhnQzdyZ3RnYUpHV0hnbVJ6RUJGOHkxRUVFMWZvaGJvMnNxa0c0b016M2pCWjRvNE1BRFFjcGZLMnFjaGdybmsKT3hJUy91VThzemR1ODRpSDhzNkYvSGwxKzg3am5xNk85UmUwaU1TdXZ5VWJqQUVlOENtOVAvYTVNMVg5ZXl6dwpXU1hTUFpCd0tTUm9QM3d1eWNiRW9uVFdRblFIZHd5U1krSXZkdGdsaUVEaEtyVmJaR25rczV6bWFhSXlkVy95CkxTMlM5SlJNNVkrWHAwdlYzbkdsRWVoQ1VkclhvUTFEei9BaUhuV0hqYnhvQ0ZHdDBxTDZDT0p6aUFHZlVYS2EKY1E1aURkN3pjMkozbTJaNmM4Vzh4a1BKZSsxZG1OV2ZHSHJqYThEU0h0VGNEWTZBcWQ5OFZ1MG5pdThQQzdieApBdncrKzZKMndHN0xOODlyZ1IwdVA3YXM5Q3g0a0hIc09Gd3ArbEtPRFZlMmR3MHZBUUtDQVFFQTdtb05DalA2CjVQa1NrU05QaS9qdzFZL0ZDd0JvSkV6bDNRNWZ0d0dya1laRlJMQlR2Q0NsaTJqaGV4YUMwRDkreWpzVmFMLzIKVmFwNDMveGk1NWlwbmlxdjhjMVdBYzV4RmgrNmhDeWRTNks5b3dEeGxITjc1TUdMcm1yWWpZKzNhTWRvMTVEbQp4NWJ6bk9MTHlNVVc0QWsrNzdNVHcxMmZhZC83TDBBTlh1bUZGajZ5ZGNTOFBIbWhKbG16NVZlZ1d6NWIxS0dRCksvL3BoY3VPbTM0OXhla3Q3SjVrS1JiREVxTE9sWnYvRUlBZENCUU00VTNkNlAvMnZVVXk1bktZRzBGMXhlYUMKbGVWcHIxRVBvRUkrWGtUeStqam9hQnM3aVVIcGNEMzU5WFFDV0xuaXdmMVlmdHRrOXpKcDdtNnRSL0dlYWJsawp1bm5INXp5Rmt3emxRd0tDQVFFQTdhRnROc2pMMFVFWGx5QllqQ1JPb1B1NmthL280UXlFYVd2TUhjaVh1K0d2Ck03VFFDRjJpOW9lUVhBQkl5VE5vUXIrcE5qQVJib1k4cDArOVpmVjhRR2x2SDZhd1cyTU56RDA3bGc5aHdzalkKSk9DSTY0WHhaajE4M0doSGdOOS9jRTRQWEJyUUNxUExQQ0tkVjY2eUFSOVdObTlWYTNZOVhmL1J2Y29MaU5CMQpGQWc1YmhiTlFNblIzOG5QSnM5K3N1U3FZQjh4QURLdndtS0Vkb255K1dJTS9HUXlZWmlEbFhFajhFZldRb3VNCndBb2s2VnVoczZjdUxpSEh6WEZSNFk2UkNXUmIybmYyVnJ6V29wejJCcDAySWVIWTBVWnNaZUtucWhhOWR0VXUKWkNJdDJNWlVFTHhpaDlKUyt3ekNYOEJKazN4ZWRpODl6T1pLUng0TWdRS0NBUUVBeHFuVUo5WmNrSVFEdHJFbgp6Y2tvVmF5eFVwT0tOQVZuM1NYbkdBWHFReDhSaFVVdzRTaUxDWG5odWNGdVM3MDlGNkxZR2lzclJ3TUFLaFNUCkRjMG1PY2YwU0pjRHZnbWFMZ2RPVW1raXdTM2d1MzFEMEtIU2NUSGVCUDYvYUdhRFBHbzlzTExydXhETCtzVDUKYmxqYzBONmpkUFZSMkkraEVJWTFOcEEzRkFtZWZvVE1ERnBkU0Q5Snl6MGdMRkV5TEJYd1MyUTlVSXkwdUdxQQpjSTFuU0EwZjJYVzZuSXA5RG9CZmlFY3U2VDczOGcxVEZrTGVVUk5KTlRuK1NnemZOb2I3Ym1iQUZjdk9udW43CkRWMWx2d1BSUERSRFpNeWNkYWxZcmREWEFuTWlxWEJyeFo0b0tiMERpd0NWU0xzczVUQXZBb1licTA5akJncG0KZTd4WkpRS0NBUUVBM2Y3bDBiMXFzNVdVM1VtSmozckh2aHNOWTljcnZ6cjdaS1VoTGwzY2F0aGUzZlk0TnVpTApPcmJReFRJNnpVUnFUWmxTRWw1N21uNXJvWDZjR09scVo1NVlBd0N0VnVMRjNCMEVVcDhTSEcrWGhYUUNWYzF2CkJLM0N2UUhxY3RuWTYyanhib0ZhQSthYkVoWGdXaTdJK3NWMHZDdnNhQlV4SldTOVpBbWlGdkZ2dndRajZ0WUEKY0Z0YTV5OVlpQkJtYytldHgxaThaVXYwNktzeXhxNy9QNzA3Rm5yZ21rNXA5eTJZZm53T0RXTGpYZkRjSk9uRwp1ZGdnQzFiaG11c1hySm1NbzNLUFlSeWJGTk1ielJUSHZzd1Y2emRiWDc3anU1Y3dQWFU3RVEzOVpleU1XaXlHCkVwQjdtQm1FRGljUVczVi9CdnEwSU1MbmdFbFA4UHFBZ1FLQ0FRRUFxNEJFMVBGTjZoUU9xZTBtY084ZzltcXUKenhsMk1NMEtiMkFCRThmeFEydzRGeTdnNDJOb3pEVVcxMy9NTjdxMUkrQXdNaGJsNEliMlFJbUVNVHVGYUhQWQpBM09abG5FOUwwb2k0Rkkra0cyZUpPQi8rNXBIU3VmL2pyWi80Z0FSSyt1Yy9DRGVhSWxqUC9ueHcwY1grc0YrCkhqWDRPYjQvQ3lFSWVJVUdkT0dzN2c5a2Yrb2lyWHJ5dURjWnhsLzJmUU94cXZhOWRoaEJMaFBYRzNvdFNwMFQKRDkweEMxbFNQTElIZitWVWlGOWJMTXRVcDRtZUdjZ3dwWFBWalJWNWNibExyUDlQeGJldmxoRzJEM3ZuT0s5QQo4aldJOVAxdU5CRUFVVFNtWFY4cmVNWU95TlhKSDhZYmJUNHlpYXJXbmFRTTBKMGlwV3dYR0VlV2Fndi9hQT09Ci0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==", + config.StakingCertContentKey: "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZOekNDQXg4Q0NRQzY4N1hGeHREUlNqQU5CZ2txaGtpRzl3MEJBUXNGQURCL01Rc3dDUVlEVlFRR0V3SlYKVXpFTE1Ba0dBMVVFQ0F3Q1Rsa3hEekFOQmdOVkJBY01Ca2wwYUdGallURVFNQTRHQTFVRUNnd0hRWFpoYkdGaQpjekVPTUF3R0ExVUVDd3dGUjJWamEyOHhEREFLQmdOVkJBTU1BMkYyWVRFaU1DQUdDU3FHU0liM0RRRUpBUllUCmMzUmxjR2hsYmtCaGRtRnNZV0p6TG05eVp6QWdGdzB4T1RBM01ESXhOakV5TVRsYUdBOHpNREU1TURjeE1ERTIKTVRJeE9Wb3dPakVMTUFrR0ExVUVCaE1DVlZNeEN6QUpCZ05WQkFnTUFrNVpNUkF3RGdZRFZRUUtEQWRCZG1GcwpZV0p6TVF3d0NnWURWUVFEREFOaGRtRXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDCkFRRGRUb1I2MG5hNk51UjlpU0FVTXl6UFhKTk1XVlFiTHlUNS9pWkNpSjNCQjRZV01CaGZ4cEpXSmlXWGNNK3oKbkRncEp1eUNFZWg1RHA2WlkzRmU3azZIaHQ2Rm1GcERqd25qcFFtZGtFS1VnMDBHK0VsUFRwL1VzbXNQTCtKQQpzd1BxQlpXcE1CUzNkc1hRTnVuTU10TUdscmY1UzBsNlhYNHk3a2MvR1R4WWd2ZVdaOUp0Ui9tMktOZXIrd2pnCkJIcUo0clBxbkhCMzBzRFlQWmc5MUN6MUFrOEJiMncySTEwOHpRVmdLSzZlSXFOS1hKSi80cGl6U1pkVTQ5MjAKd014WUJwbmZEQWNobnhlaTlVL3YzUWJUN2VLVUkyZkdyK2hPV1RJV1U4MCtWZU9CdDhhNlA0c1M5QVFoNS82Rwo4cXdtQXFPM1lROWR4TjgyaXUvSDMrTitHR2EvTTByNXJFV3J6d0l1Rmh3S3Z5UWNwUFJCbTJ5UW5CbmhMOUc1CmtONm40T0JNMEtzZ1ozQ1lsSFpTZzRlV2NOZ0J0MVdDRnNRYzd2ZlVGYUpucjhRUDNwRjRWLzRCb2s3d1RPNUgKTjBBMUVZRVZZdVg1M05HbnJLVmUrRmc5K3hNT2dYUFdrVU5xZHZwSTlaYlYzWjBTNTg2NnFGMy92QlpyaGdDcgpLYzVFL3ZNZXhCUmU4S2k0d0txT05WaGk5V0dVY1JIdkZFaWtjKzdWclBqMFlhRzZ6VkxkK3VPQUpOODFmS09QCllvNFg0c1pyTXlQWWwzT2pHdE1oZlY0S3ZDYUxFcjFkdU9rbHFPNmNDdkdROGlBbExWeTNWSnlXNUdKMEQwS3kKaUFpcjRWTmRBSktvMVpnaUdpdkpMV3VsVGZqVWlmQ045bzExNUFpcUp4aXF3d0lEQVFBQk1BMEdDU3FHU0liMwpEUUVCQ3dVQUE0SUNBUUNRT2R3RDdlUkl4QnZiUUhVYyttMFRSekVhMTdCQ2ZjazFZMld3TjNUWlhER1NrUFZFCjB1dWpBOFNMM3FpOC9DVExHUnFJOVUzZ1JaSmYrdEpQQkYvUDAyMVBFbXlhRlRTNGh0eGNEeFR4dVp2MmpDbzkKK1hoVUV5dlJXaXRUbW95MWVzcTNta290VlFIZVRtUXZ3Q3NRSkFoY3RWQS9oUmRKd21NUHMxQjhReE9VSTZCcQpTT0JIYTlDc1hJelZPRnY4RnFFOTFQWkEybnMzMHNLUVlycm5iSDk5YXBmRjVXZ2xMVW95UHd4ZjJlM0FBQ2g3CmJlRWRrNDVpdnZLd2k1Sms4bnI4NUtESFlQbHFrcjBiZDlFaGw4eHBsYU5CZE1QZVJ1ZnFCRGx6dGpjTEozd28KbW5ydDk1Z1FNZVNvTEhZM1VOc0lSamJqNDN6SW11N3E5di9ERDlwcFFwdTI2YVJEUm1CTmdMWkE5R001WG5iWgpSRmkzVnhMeXFhc0djU3phSHd6NWM3dk9CT2tPZGxxY1F6SVNSdldEeGlOMUhrQUwraGtpUUN1TWNoZ09SQWdNCnd6UG9vYThyZld0TElwT1hNcHd1VkdiLzhyR05MRVBvdm9DSzl6NmMrV1oremtSbzQrM1RRa09NWTY2WGh0N3IKQWhseTNsZXIrVHlnNmE1alhUOTJXS0MvTVhCWUF5MlpRTm95MjA0a05LZXZjSDdSMmNTa3hJVGQzbjVFYWNOeQo1TUF0Q05JazdKd2VMQ2g5ckxyTFVCdCtpNG40NHNQK0xWaGZXSGVtbmdBOENvRjRuNmVRMHBwMGl4WlRlbjBqCjR1TjBHMk5mK0plR01scW9PYkxXZElPZEgvcGJEcHBYR29aYUtLRGQ3K2JBNzRGbGU1VWg3KzFlM0E9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==", + config.StakingSignerKeyContentKey: "QXZhbGFuY2hlTG9jYWxOZXR3b3JrVmFsaWRhdG9yMDI=", + }, + }, + { + Flags: FlagsMap{ + config.StakingTLSKeyContentKey: "LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlKSndJQkFBS0NBZ0VBdkpsUTA2QjI1RkJkb0VYVlg2Y25XU3pTbmtOL0hlaDJSWkZETjFOWFZpMlJVbVRiCjJvRGZJWlVMMlA3VUx0d09OS2RmVm9DbTgxbWEzdDdZTlFKTVBDYzdYYy9ZSmVFVEo5ZU5pQ0R0d29zQ0tiWkIKTkNhS1cyWVpodVh3QXRwL3pGMExYNG5pTjRjM2tkT0MxdUNZQ3lzMzl6Wi9NV1haUVlDWHdaaSthbEZKeE96dQp5R3lSaHBtdW9FZzkzc0hyUk9pa0diVGJYOU1VU0w5UEhhR1NtTUU1ZWlMWkhSaXUrcm42cXRQZkJsY0Zyd05jCkVycDN1UGpCWUxQVGVIaFNZK2ljcmZPWDRpdjNNRDhleWtYWUdJQWM2MlVPQkQ3SVVaOEZxd1U0bmpqbWlid0EKTmtUTVRCR015a2F5UUFMR0NOYzhiVGNxaUZHZ1UzTVptcy9qVjFCbHZzQjhDRTRuTkJxZjEwSnRpOEsvNWNTRgplanB3SlM5d29HMGw0cTBwNkJ2bmgwUHJ3OHdRSEVRNUV3SUwveGxDTTVYNms5a3JVeXROcmlBWUNXTTd4VXh1CktaUjRyWEhFWDh2TU1iSWVXZk1SdmZaWmowRUxTN0o1VUFGZmk0dE9nbS9BaCtJVkZhSWxvbGJPVUFHb2FscHIKK1g2YUY5QkxOdWtjbEIxeG00eE50TnFjakRBTzQxSHExRlNqSW96cUJtYlhCK3N3ZUtmM1NkRTdVNkVjRG9LdwpPelFpUFFHRmJhbFY2MXh2N25ZL0xxOXE5VzAxY0NHeDdEbmt4RDk0R05KaDBWcHRoUDJ5NDdmYjIyQ0VWTVVmCk1WcHk1RzNnYzRqVThJUHQrbzNReGZ1b0x0M0ZNLzUyMHAvR0dQbU5ZNDE3ak41YWhmSWpHZ0tHNGJzQ0F3RUEKQVFLQ0FnQSt1SElUM3lLSzdWc2xxUE83K3Rmd0pTTHFOU0k2TFF2Z09OMzBzVWV6UmpZMUE0dkdEK09reEcrTApPN3dPMVduNEFzMkc5QVFSbS9RUU9HWUl3dm5kYTJLbjRTNU44cHN2UGRVNHQxSzZ4d1h5SDBWeDlYcy95Q1duCklpTCtuL0d1WWljZEg3cldvcVpOWGR6K1h2VFJpZzd6clBFQjJaQTE0M0VVbGhxRk93RmdkemMxK2owdldUNmsKMlVHU0trVjJ4ak9FeFF2THcyUFVpYUxqQk0rKzgwdU5IYmU4b0cvWXZDN3J6c2cxMEl6NFZoS3h1OGVEQVY4MgpMTGVnTWN1Y3BFZ3U1WHJXWWE2MElkbTRoUi9Iamh1UUFTeDNKdlh4aHdRWWl3VDRRWTRSc2k4VDNTOWdBTm9rCmp2eEtvMkYrb1MzY1dHTlJzR3UwTk93SCt5anNWeU1ZYXpjTE9VZXNBQWU4NXR0WGdZcjAyK1ovdU1ueHF0T0YKZ2pJSFkzWDVRWmJENGw0Z2J3eCtQTGJqc2o0S0M2cjN5WnJyNTFQZExVckJ2b3FCaHF3dUNrc2RhTW50V0dNRQp1MFYvb29KaTQrdXpDWXpOMDZqRmZBRlhhMnBXelZCNXlLdzFkNnlZaTlVL2JQZDR4bjFwaExVTUhyQzJidmRNCkg4UDE4Z0FTNnJrV24rYWdlaVdSSG1rZjR1b0tndjNQck1qaWprQmFHcGY2eGp2NiswUTM5M2pkVklDN3dnSlYKOFcwaTFmMUF3djY4MDg5bUhCRWFyUFR2M2d6MzkyNTFXRkNQTlFoRXVTeTc5TGk1emp3T3ByWlhTME1uSlhibQpCMDBJUFRJdzUxS3Vhb3VlV3pZMXBBMklGUS8wc0gzZm8ySmhEMHBwMWdJMERkZTdFUUtDQVFFQTdSVmdOZWxrCjNIM1pKc29PZk9URmEwM2xuWHVFZlRBeXhoRUVDUno2NGs1NHBTYkVXVjczUEllWUJ5WnZuc3JLUnlkcFlXVVAKQ3AvbUtoQUpINFVDZjJoelkwR3lPNy9ENitIRUtaZENnNmEwRE5LY2tBb0ZrQmZlT2xMSkxqTFZBVzJlRVZ4egp0bEZ0Ky9XQkU5MEdDdkU1b3ZYdUVoWEdhUHhDUHA1Z2lJTjVwaFN6U0Q1NTdid3dPeVB3TktGWjdBbzc3VU5LCmt6NkV6Y3ZRZ3FiMjA1U1JSS0dwUzgvVC85TGNMc1VZVmtCZllRL0JheWpmZk8rY1FGNHZINXJCNHgvOC9UN3QKdVVhNzl1WStMZUdIZ1RTRklBdWk5TEVLNXJ5Ly8yaERKSU5zSXRZTWtzMVFvNFN1dTIzcE91R2VyamlGVEtXbAptT0lvRm1QbWJlYkFjd0tDQVFFQXk2V2FKY3pQY0tRUS9ocWdsUXR4VTZWZlA0OVpqVUtrb2krT0NtdHZLRHRzCjdwSmZJa3VsdWhuWUdlcUZmam5vcHc1YmdaSE5GbTZHY2NjNUN3QnRONldrMUtubk9nRElnM2tZQ3JmanRLeS8KQlNTVjNrTEVCdmhlOUVKQTU2bUZnUDdSdWZNYkhUWGhYUEdMa2dFN0pCWmoyRUt4cDFxR1lZVlplc1RNRndETQpLRUh3eklHY0ZreVpzZDJqcHR5TFlxY2ZES3pUSG1GR2N3MW1kdExXQVVkcHYzeHJTM0d2ckNiVU1xSW9kalJkCnFrcmcvZC9rUXBLN0Ezb0xPV2ZhNmVCUTJCWHFhV0IxeDEzYnpKMldsc2h4SkFaMXAxb3pLaWk1QlE5cnZ3V28KbXVJNXZkN282QTlYc2w4UXpsdVNTU1BpK05oalo2NGdNQnJYY2lSdm1RS0NBUUIvZEI1azNUUDcxU3dJVGxlNwpqTUVWRHF1Q0hnVDd5QTJEcldJZUJCWmIweFBJdFM2WlhSUk0xaGhFdjhVQitNTUZ2WXBKY2FyRWEzR3c2eTM4ClkrVVQyWE11eVFLb1hFOVhYK2UwOUR3dHlsREJFL2hXOXd4R2lvNU5qSFBiQWpqQXE4MXVSK1ZzL2huQ2Voa0sKTktncStjT2lkOU9rcFZBazRIZzhjYWd6dTNxS2JsWnpZQ0xzUzE4aWJBK1dPNmU3M1VTYUtMTE90YTF2ZFVLQworbjkyLzBlWlBjOWxralRHTXZWcnIwbUdGTlV4dU9haVZUYlFVNEFNbXBWNnlCZXpvbDYvUmpWR2hXQkhPei95CktteE9hWTJuekptdU1mOUtTKzVyd0FGWWY4NkNhOUFXbTRuZVhsWVJMT1ZWWWpXTU01WjF2aGRvT1N5VDNPRGoKOUVsQkFvSUJBR0NSUGFCeEYyajlrOFU3RVN5OENWZzEwZzNNeHhWU0pjbDJyVzlKZEtOcVVvUnF5a3Z6L1RsYgphZnNZRjRjOHBKTWJIczg1T1R4SzJ0djNNWmlDOGtkeDk5Q1VaTDQvZ3RXOVJXWkh2dVY5Q1BQQ1hvTFB2QzdsCjlmanp0ZDFrcUpiN3ZxM2psdGJxSnR5dytaTVpuRmJIZXo4Z21TZVhxS056M1hOM0FLUmp6MnZEb1JFSTRPQSsKSUorVVR6Y2YyOFRESk5rWTF0L1FGdDBWM0tHNTVwc2lwd1dUVlRtb1JqcG5DemFiYUg1czVJR05FbFd3cG9mZgpGbWxXcFIzcW5vZEt4R3RETVM0WS9LQzJaRFVLQVUrczZ1Ry9ZbWtpUDZMZFBxY2tvZDRxSzhLT1JmMUFSOGRMCkJ6WGhHSklTSURNb25rZU1MTThNWmQwSnpXSWwzdmtDZ2dFQVBCa0V4ZDJqNFZZNXMrd1FKZGlNdG81RERvY2kKa0FFSXZJa0pZOUkrUHQybHBpblFLQWNBQVhidnVlYUprSnBxMzFmNlk2NnVvazhRbkQwOWJJUUNBQmpqbEl2ZQpvN3FRK0g4L2lxSFFYMW5iSER6SW5hRGRhZDNqWXRrV1VIakhQYUtnMi9rdHlOa0Z0bFNIc2t2dkNFVnc1YWp1CjgwUTN0UnBRRzlQZTRaUmpLRXpOSXBNWGZRa3NGSDBLd2p3QVZLd1lKTHFaeHRORVlvazRkcGVmU0lzbkgvclgKcHdLL3B5QnJGcXhVNlBVUlVMVUp1THFSbGFJUlhBVTMxUm1Kc1ZzMkpibUk3Q2J0ajJUbXFBT3hzTHNpNVVlSgpjWnhjVEF1WUNOWU11ODhrdEh1bDhZSmRCRjNyUUtVT25zZ1cxY3g3SDZMR2J1UFpUcGc4U2J5bHR3PT0KLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0K", + config.StakingCertContentKey: "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZOekNDQXg4Q0NRQzY4N1hGeHREUlNqQU5CZ2txaGtpRzl3MEJBUXNGQURCL01Rc3dDUVlEVlFRR0V3SlYKVXpFTE1Ba0dBMVVFQ0F3Q1Rsa3hEekFOQmdOVkJBY01Ca2wwYUdGallURVFNQTRHQTFVRUNnd0hRWFpoYkdGaQpjekVPTUF3R0ExVUVDd3dGUjJWamEyOHhEREFLQmdOVkJBTU1BMkYyWVRFaU1DQUdDU3FHU0liM0RRRUpBUllUCmMzUmxjR2hsYmtCaGRtRnNZV0p6TG05eVp6QWdGdzB4T1RBM01ESXhOakV5TWpKYUdBOHpNREU1TURjeE1ERTIKTVRJeU1sb3dPakVMTUFrR0ExVUVCaE1DVlZNeEN6QUpCZ05WQkFnTUFrNVpNUkF3RGdZRFZRUUtEQWRCZG1GcwpZV0p6TVF3d0NnWURWUVFEREFOaGRtRXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDCkFRQzhtVkRUb0hia1VGMmdSZFZmcHlkWkxOS2VRMzhkNkhaRmtVTTNVMWRXTFpGU1pOdmFnTjhobFF2WS90UXUKM0E0MHAxOVdnS2J6V1pyZTN0ZzFBa3c4Snp0ZHo5Z2w0Uk1uMTQySUlPM0Npd0lwdGtFMEpvcGJaaG1HNWZBQwoybi9NWFF0ZmllSTNoemVSMDRMVzRKZ0xLemYzTm44eFpkbEJnSmZCbUw1cVVVbkU3TzdJYkpHR21hNmdTRDNlCndldEU2S1FadE50ZjB4Ukl2MDhkb1pLWXdUbDZJdGtkR0s3NnVmcXEwOThHVndXdkExd1N1bmU0K01GZ3M5TjQKZUZKajZKeXQ4NWZpSy9jd1B4N0tSZGdZZ0J6clpRNEVQc2hSbndXckJUaWVPT2FKdkFBMlJNeE1FWXpLUnJKQQpBc1lJMXp4dE55cUlVYUJUY3htYXorTlhVR1crd0h3SVRpYzBHcC9YUW0yTHdyL2x4SVY2T25BbEwzQ2diU1hpCnJTbm9HK2VIUSt2RHpCQWNSRGtUQWd2L0dVSXpsZnFUMlN0VEswMnVJQmdKWXp2RlRHNHBsSGl0Y2NSZnk4d3gKc2g1Wjh4Rzk5bG1QUVF0THNubFFBVitMaTA2Q2I4Q0g0aFVWb2lXaVZzNVFBYWhxV212NWZwb1gwRXMyNlJ5VQpIWEdiakUyMDJweU1NQTdqVWVyVVZLTWlqT29HWnRjSDZ6QjRwL2RKMFR0VG9Sd09nckE3TkNJOUFZVnRxVlhyClhHL3Vkajh1cjJyMWJUVndJYkhzT2VURVAzZ1kwbUhSV20yRS9iTGp0OXZiWUlSVXhSOHhXbkxrYmVCemlOVHcKZyszNmpkREYrNmd1M2NVei9uYlNuOFlZK1kxampYdU0zbHFGOGlNYUFvYmh1d0lEQVFBQk1BMEdDU3FHU0liMwpEUUVCQ3dVQUE0SUNBUUFlMmtDMEhqS1pVK2RsblUyUmxmQnBCNFFnenpyRkU1TjlBOEYxTWxFNHZWM0F6Q2cxClJWZEhQdm5pWHpkTmhEaWlmbEswbC9jbnJGdjJYMVR6WU1yckE2NzcvdXNIZjJCdzB4am0vaXBIT3Q1Vis0VE4KbVpBSUE0SVBsMDlnUDI4SVpMYzl4U3VxNEZvSGVNOE9UeGh0dE9sSU5ocXBHOVA1ZDZiUGV6VzZaekkzQ2RQUApDRjY5eEs0R0Zsai9OUW5Bb0ZvZ2lkNG9qWVlOVGovY000UFlRVTJLYnJsekx5UHVVay9DZ3dlZlhMTUg4Ny9ICmUza1BEZXY4MFRqdjJQbTVuRDkzN2ZaZmdyRW95b2xLeGlSVmNmWlZNeFI3cWhQaGl6anVlRDBEQWtmUUlzN0wKWVZTeXgvcWpFdjJiQllhaW01UlFha1VlSFIxWHU1WGovazV6cjMzdDk3OWVkZTUwYnlRcmNXbTRINUp4bkVwRApKeEpuRmZET1U2bzE0U0tHSFNyYW81WjRDM2RJNTVETTg0V0xBU25sTUk1Qks0WHRTM25vdExOekc4ZGZXV2hUCjltMEhjcnkrd1BORGNHcjhNdGoxbG9zLzBiTURxTUhDNGpjRlcxaHJYQ1VVczlSWXpFK04veG9xd0NRU2dOMVAKRTczdVhUeVNXajVvdk1SNVRQRjZQaGNmdExCL096aXFPN0Z2ZXJFQnB2R0dIVUFuVVQ2MUp0am9kalhQYkVkagowVmd5TU9CWTJ5NTNIVFhueDNkeGVGWmtVZFJYL1ZaWXk4dE1LM01UWSs3VUlVNWNXWW5DWkFvNUxOY2MwdWtSClM2V1M5KzZlYVE2WFJqaGZOVWp4OWE3RnpxYXBXZHRUZWRwaXBtQlAxTmphcDNnMjlpVXVWbkxRZWc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==", + config.StakingSignerKeyContentKey: "QXZhbGFuY2hlTG9jYWxOZXR3b3JrVmFsaWRhdG9yMDM=", + }, + }, + { + Flags: FlagsMap{ + config.StakingTLSKeyContentKey: "LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlKS1FJQkFBS0NBZ0VBMlp3NkF4eE5wNC9Oc1E0eDlFMit6bHpLa0F4OC9zMnk0bmJlakVpTlZ3ZDd6Z0NCCklqNnE3WHB4cDZrVzFSWEp1Um1jYjhZZUdFQS9Bb3lrcE5hb0dTWE03TkF6MG9oa1BCSDVlRHhqdU1aeEc1WlkKQzl6MUVUMXFlNWhGZDZJZW44U0FvRUNrd1pVK3U5Ukp4Y3dlWmNpVnFicGtjN3dOYjhvUVRMR1BHanZzWGF1UwoxQlpiV013WGI2WUMxMVdnOEIyVU5qMEJGclJkSGRDVHRqZEZoUlF4alpzZXAvS1NrbmlBRlE3RThHUW1TdmhRCm5uaE1xQm4xN0NEYkhOTWdqRUxKV3NKSHpqS2dQY2dWZHlZdWtKaFdDc2htTGV1VEZoamFqd09GNnlNcFlpc0EKZ2w4TS9abzJsc2plNndNc1BYRnBTekRnelpnemtWc3hrV2VkdmREQkFCQ0diS28yQjFZclVVelAwWnpTR25VNgpHUmp0TXViZ0pETmVISms3NTdDdFFqL2Rxclgwb3JLdStWdnlQZFhhMDRhQkxVeXUvRkJqcGYrVU5XQVVkUEJmCnJVbEZtVnNoM2lPbERnVkFoZ3Rtd3Jac3lqSmU3MU51WlJ1cG13a2RTYmtJdWtXS1ozekkxeDkrcFZlRXUzMDcKMHNNTGtkTjRkaGR4OVhoWkZqUnRwV3hhMXRIY3d3ajRONVY4SmhVT3VZVkhFSVhMYzU2QWMrUXRaUmRubHROOApMbFlNWXA1N2xaU1I0OHZ4cTZwbHJBRXA5VHc3bGJPSk81T2d5WDhNaHdJZ05Mc1Y2eG44V0w2ZXgvSStQdG1ECnBsb2xwZWNXSUt4QTQ3cStaL0djZU9qeDBIcTlnTDZ0N0d4QmhIdFRBclZ5Wlk5M2EzZVI0cHQ1dmpVQ0F3RUEKQVFLQ0FnQk1vQk5aWnd6OUZNa0VNSkJzaXpmRjZLeTNQbjZCSnFOMzFRMldiakcrMUhiRzJpeWVoMXllMUwvUwpudHJZVzV5MW5nd1UyN2xiSnJ4SlJJYnhPRmpteWdXMzJiUjF6T3NtcjltZGVmNVBZU2tRNHNiTUhwajQ0aHh0CnV2ZXpJWllSQWh1YzBrWnhtQUVJR0wrRmM5TzhXWDVCenMxeVoyUi8yYklWbjJ4WmU0SkdsWlRWTTY0a3ZYRC8KTW9ETG5HNVlQc0lpdXlaMy9UalF0OUpibG1qWGJIM3FkQlcrWTg4eTNsV1RsS2pLVVNtZXVvT0EyYkY4ZSsrNQpudlFvMlRzYnlLU29YY0wxRzZTTFBMbzZRMnFnSmRRZVplUjlCUGU5RHpGZXJJbnFlMjRtRUNoVXYrMk9HMUJmCmxnblF6VVExdW9xdUhGNzhaank2VVZkSjhTZDh1ZnZLQzlyejhKWXNJeW5mdzBnUUMzRjgvZW1tMVFTYWJGdlkKdEc0K3gwSzhGZ3JpampFMDhSdnFnSW5keDlmdENOb040dTNsWHhQckpoS3ByMnh1WFNhNFZaYnVtZ043ZnFXeApVQkM4bG1QUWk1VlptajNuSmZqNGRhdG1CVHZzMWRPTFJNZGZkdFRGeitjQWRXTlp4WDNIT0xaVVNxTVZXZ1hZCmtYMHM3SVY5R255VW50Qmt0WCtJRWJXbEF0dHpsZHlxRjltZDRhdmpLWFErWTRQSy9zUjF5V3N1dnRpWmRZVUwKL1FyUUhYMENzVnYxaFJjWDB5ZWtBMGE4cXdhR214RWNuZEVLdjd3RjFpNjI2amMyZkRSNnFJMXlwMjBYbDNTaQprWUJTTmg3VksyMTBYSWhkZFN1VnhXNS9neU5uRkFCRGZwMWJTZFRoNVpKUmZOdnRRUUtDQVFFQTlaaXBueXU4CkpLbEx0V3JoMmlQOXBtRkJhZVVnb0Y2OElWZmQ2SVhkVjduQUhTV3lzaUM0M1NDVW1JNjN4bHVNWUVKRmRBWisKbS9pUmMvbjZWRktFQlc0K1VqazlWVzFFMWlxSGdTQUJnN250RXNCMk1EY1lZMHFLc040Q1lqQzJmTllPOTd6Sgo1b2p1ODRVM1FuOFRXTmtNc3JVVTdjcm0yb0FRZDA4QWl6VkZxTG8xZDhhSXpScSt0bDk1MlMvbGhmWEtjL1A5CmtmaGwrUktqaVlDMnpiV25HaW54YzJOYmY1cFd3bm10U3JjZW5nK1prZ1ZmU0IzSHZTY2txekVOeWU5WWtwVk0KR0UrS2pFZHNzK1FuR1FSV00ySlBseW9ZRG1oVDZycmFzUlQ2VEtzZWN3bzFyUlhCaTRDMWVUWlFTblpmMjRPZwpRdXJTLy9Yekh6Ym5rUUtDQVFFQTR0UVNtYUpQWk5XWXhPSG5saXZ6c2VsZkpZeWc1SnlKVk1RV3cvN0N2VGNWCkdPcG9ENGhDMjVwdUFuaVQxVS9SeWFZYVVGWitJcDJGaEsyUWNlK3Vza05ndHFGTjlwaGgvRGVPMWc4Q1NhSWUKNkVidGc4TjhHTGMwWWhkaUp0ZDJYR3JrdGoyWHRoTUw3T0pQWUlpZGQ0OHRHdVFpemZpam80RmUxUzByU1c1NgpCNFJIVGgvTzZhMHRhTmVGYm5aUUpENTJoYTl3bG5jL1BaU0NVTWI5QzBkMDhkU3hkQlFWK1NWZEdybC9JUmZDCnFISG9DODZHWURjbW52aUQ1Q0ZPeHB4N0FKL2hRQXdQRlFSQ25XR0h3RGpwY29NT3RrdHlvN3BqOU1EdXpCVWIKa3I0cjFlaThmN1BDOWRtU1ltWXpKTVF4TGZ6K1RpMlN5eU9tZE0xQ1pRS0NBUUVBc1ZyNGl6Q0xJcko3TU55cAprdDFRekRrSmd3NXEvRVROZVFxNS9yUEUveGZ0eTE2dzUvL0hZRENwL20xNSt5MmJkdHdFeWQveXlIRzlvRklTClc1aG5MSURMVXBkeFdtS1pSa3ZhSlA1VythaG5zcFg0QTZPVjRnWXZsOEFMV3Bzdy9YK2J1WDNGRTgwcE9nU20KdmtlRVVqSVVBRzNTV2xLZldZVUgzeERYSkxCb3lJc0lGNkh3b3FWQXVmVEN5bnZUTldVbE9ZMG1QYVp6QldaWApZUEhwa1M0d0tTM0c1bndHMUdSQmFSbHpjalJCVVFXVThpVWRCTGcweUwwZXR0MnF4bndvcTFwVFpHNzBiNDhZCnllUGw5Q1AwbUJEVHh5Y256aWU3Q2hTNzN3dDJJYTJsUkpCSDZPR0FMbHpaTUZwdnF3WkcvUC9WMk4wNVdJeGwKY05JMmNRS0NBUUVBb3lzN1ZobFVVNHp6b0cyQlVwMjdhRGdnb2JwUDR5UllCZ29vOWtURmdhZW1IWTVCM1NxQQpMY2toYWRXalFzZHdla1pxbDNBZ3ZIWGtIbFZjbXhsMzZmUmVGZ0pqT3dqVE04UWpsQWluOUtBUzY3UmFGM2NBClJpZEVIMndDeHo0bmZzUEdVdkpydUNaclpiUkd0WUtSQS9pUzBjMWEzQ0FJVnc0eFVkaDBVeGFONGVwZUFPMFEKd3pnNGVqclBXVzd5cDUvblVyT3BvaE9XQW81YVVCRlU1bEE0NTkzQTZXZXBodGhCNlgrVzNBOWprQmlnZkIzTQp2Rm53Qmx0dlJTUlFycjdTSE5qbUNGU2taTkh6dVpMM1BHZTBSeFBQK1lLOHJOcmdIS2pOSHpIdjY5ZXhZT2RTCjhlbzJUUFIrUVJxVG45Y2lLWnJjdFJCRGtLM01pQ2svb1FLQ0FRQVpJWmRrT0NsVVBIZlNrNHg1bkJYYXNoS1kKZ0R6ZXlZSFlMd05hQmRFS2dITnVmNmpDbHRLV29EelpzcXJ2MU55YS8xNDhzVGdTVGc5MzFiYmNoK2xuSEtKZApjWHJDUVpXQm51MlVxdWlzRk1lTk92cHAwY1B0NHRJWURaVkNSTVJyd0lsWnFJSnhiMm5Bd0Z2YjBmRWZMays0CmdtdSszY0NhTi92UzNvSkE5RUZremp4RzBYaUxPeW55QVpiNWZZMDRObUZPSXNxM3JnVDREZUN1ckhUS3RPSjIKdDE0b1ROcTA2TEQ1NjZPblQ2cGxMN3ZhTHRUUi85L3FKYzAwN1dqdzhRZGJUdVFBTHFDaldXZzJiN0JWa095UgpvOUdyaFB6U2VUNm5CSEk4RW9KdjBueGVRV05EWDlwWmlXLzFuc3l1QUFGSjlJU2JEV2p6L1R3QjE3VUwKLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0K", + config.StakingCertContentKey: "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZOekNDQXg4Q0NRQzY4N1hGeHREUlNqQU5CZ2txaGtpRzl3MEJBUXNGQURCL01Rc3dDUVlEVlFRR0V3SlYKVXpFTE1Ba0dBMVVFQ0F3Q1Rsa3hEekFOQmdOVkJBY01Ca2wwYUdGallURVFNQTRHQTFVRUNnd0hRWFpoYkdGaQpjekVPTUF3R0ExVUVDd3dGUjJWamEyOHhEREFLQmdOVkJBTU1BMkYyWVRFaU1DQUdDU3FHU0liM0RRRUpBUllUCmMzUmxjR2hsYmtCaGRtRnNZV0p6TG05eVp6QWdGdzB4T1RBM01ESXhOakV5TWpWYUdBOHpNREU1TURjeE1ERTIKTVRJeU5Wb3dPakVMTUFrR0ExVUVCaE1DVlZNeEN6QUpCZ05WQkFnTUFrNVpNUkF3RGdZRFZRUUtEQWRCZG1GcwpZV0p6TVF3d0NnWURWUVFEREFOaGRtRXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDCkFRRFpuRG9ESEUybmo4MnhEakgwVGI3T1hNcVFESHoremJMaWR0Nk1TSTFYQjN2T0FJRWlQcXJ0ZW5HbnFSYlYKRmNtNUdaeHZ4aDRZUUQ4Q2pLU2sxcWdaSmN6czBEUFNpR1E4RWZsNFBHTzR4bkVibGxnTDNQVVJQV3A3bUVWMwpvaDZmeElDZ1FLVEJsVDY3MUVuRnpCNWx5SldwdW1SenZBMXZ5aEJNc1k4YU8reGRxNUxVRmx0WXpCZHZwZ0xYClZhRHdIWlEyUFFFV3RGMGQwSk8yTjBXRkZER05teDZuOHBLU2VJQVZEc1R3WkNaSytGQ2VlRXlvR2ZYc0lOc2MKMHlDTVFzbGF3a2ZPTXFBOXlCVjNKaTZRbUZZS3lHWXQ2NU1XR05xUEE0WHJJeWxpS3dDQ1h3ejltamFXeU43cgpBeXc5Y1dsTE1PRE5tRE9SV3pHUlo1MjkwTUVBRUlac3FqWUhWaXRSVE0vUm5OSWFkVG9aR08weTV1QWtNMTRjCm1Udm5zSzFDUDkycXRmU2lzcTc1Vy9JOTFkclRob0V0VEs3OFVHT2wvNVExWUJSMDhGK3RTVVdaV3lIZUk2VU8KQlVDR0MyYkN0bXpLTWw3dlUyNWxHNm1iQ1IxSnVRaTZSWXBuZk1qWEgzNmxWNFM3ZlR2U3d3dVIwM2gyRjNIMQplRmtXTkcybGJGclcwZHpEQ1BnM2xYd21GUTY1aFVjUWhjdHpub0J6NUMxbEYyZVcwM3d1Vmd4aW5udVZsSkhqCnkvR3JxbVdzQVNuMVBEdVZzNGs3azZESmZ3eUhBaUEwdXhYckdmeFl2cDdIOGo0KzJZT21XaVdsNXhZZ3JFRGoKdXI1bjhaeDQ2UEhRZXIyQXZxM3NiRUdFZTFNQ3RYSmxqM2RyZDVIaW0zbStOUUlEQVFBQk1BMEdDU3FHU0liMwpEUUVCQ3dVQUE0SUNBUUE0MGF4MGRBTXJiV2lrYUo1czZramFHa1BrWXV4SE5KYncwNDdEbzBoancrbmNYc3hjClFESG1XY29ISHBnTVFDeDArdnA4eStvS1o0cG5xTmZHU3VPVG83L2wwNW9RVy9OYld3OW1Id1RpTE1lSTE4L3gKQXkrNUxwT2FzdytvbXFXTGJkYmJXcUwwby9SdnRCZEsycmtjSHpUVnpFQ2dHU294VUZmWkQrY2syb2RwSCthUgpzUVZ1ODZBWlZmY2xOMm1qTXlGU3FNSXRxUmNWdzdycXIzWHk2RmNnUlFQeWtVbnBndUNFZ2NjOWM1NGMxbFE5ClpwZGR0NGV6WTdjVGRrODZvaDd5QThRRmNodnRFOVpiNWRKNVZ1OWJkeTlpZzFreXNjUFRtK1NleWhYUmNoVW8KcWw0SC9jekdCVk1IVVk0MXdZMlZGejdIaXRFQ2NUQUlwUzZRdmN4eGdZZXZHTmpaWnh5WnZFQThTWXBMTVp5YgpvbWs0ZW5EVExkL3hLMXlGN1ZGb2RUREV5cTYzSUFtME5UUVpVVnZJRGZKZXV6dU56NTV1eGdkVXEyUkxwYUplCjBidnJ0OU9ieitmNWoyam9uYjJlMEJ1dWN3U2RUeUZYa1VDeE1XK3BpSVVHa3lyZ3VBaGxjSG9oRExFbzJ1Qi8KaVE0Zm9zR3Fxc2w0N2IrVGV6VDVwU1NibGtnVWppd3o2ZURwTTRsUXB4MjJNeHNIVmx4RkhyY0JObTBUZDkydgpGaXhybWxsYW1BWmJFejF0Qi8vMGJpcEthT09adWhBTkpmcmdOOEJDNnYyYWhsNC9TQnV1dDA5YTBBenl4cXBwCnVDc3lUbmZORWQxVzZjNm5vYXEyNHMrN1c3S0tMSWVrdU5uMU51bm5IcUtxcmlFdUgxeGx4eFBqWUE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==", + config.StakingSignerKeyContentKey: "QXZhbGFuY2hlTG9jYWxOZXR3b3JrVmFsaWRhdG9yMDQ=", + }, + }, + { + Flags: FlagsMap{ + config.StakingTLSKeyContentKey: "LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlKS1FJQkFBS0NBZ0VBNEN1YStiM1I3U1JSSU1PNFJoUDVjeW1oM0w4TTY5OW1xNXF0SlBiV0hJU1YzMDk1Ck5ZOVpWN1FRSFhGRGQ0RWtTbzRNeC83NDI1OUhtdHdJZ3dsSGRqSEpQNTlDbkNXZU4wdVNPMll6KzYyMnI5dmUKbXlnbWRSNis2K1lGMkJZWlB0MmxMRlh3MUtnRHdjTWovQ25sZDlRRVZRUDdQbGozbHFyT3ZVRjAzY2liZ1dCTwphYStOTDlVbi9ubTFDSjJkKzdobU41SWp0Qk1meVlIS0VMQmljNjFnLzg3VzBRaFNMNjNUU1dYZEtScnpKWmt5CnFlMTdERWQzS2I2cE8rOVAvekN3bmNobHY5U0FLMDByZzliM2U1Z1Y5U2NsVnlzbkdEZEx5RHJXNE1UemhiclYKTXFnem5qKzZPZGF1SWowdDNRa1lINXAvNFZpOE12Z3JTWHRBUmlyRytMWk5MU3NhTkxIdkwvU1FQSmxMWjVzNQpqTGVHUFk0b3pxd2pnZTE4RmlwaVdCSnZEZVZHM011bktkcUMvTDBGYmM4OXoxNjVCYmZ0M0JiZFk2NDNhVUdJCkIrSThwSkZnM2pveEg4dFJRc003RFViblMwN3k0WHk1L092MlUrSEMyZlNTTy8xbHRDRHd2QlhPNVljNXlmbXkKRUZIaEozV2huWUZaTWJoSU5ETVhheks5STFOQ0JhRjhra1Z6VWMzQTFtVW9SSXdVNys3WnhjUzVxRFZQcmlXLwp5cVRCK3JFV0l0ODdQT1huR2pDamNodml3NWdXb1ZKUjhlWVNnQitQVHZQT2VmZ0RJYklQZFRqV1NaWFkwRjlLCkdheUNzeXVRYWJLbms1ZUhObUxmM3dDNG1XbmhaTmFRUkxMMVhqRGdRaUxsaFBtK0ZDQkdpd0RvY1g4Q0F3RUEKQVFLQ0FnRUFwdU1QcnhtSDdYbjZBK0J4a1lwUlRWRVROWm50N3JRVVpYRHpzZThwbTNXQmRneGVlbWRMNWlVaApVaW4rUmp1WVh3Qzl0eTYwNmh2OFhPZXVWbzlUNmtSS1JOazE1N1dCd2p5Nmt3b1ZiU3I0TkpnRmM1RkNnREx4CmhBRnRIRi9uVDR3RzZhalpjQmZkSkNVNDV3UHgxM0c1LytqRTVMZXJLem5pUzdjdFgrZDNEYXc2OUNkRGZ2YTcKblpIU0dxWHM5WGRrY2I2VVlmMVN6dHVYS1RHSE9nTTdrWFhWS3kxOHNnNUFuQVgvemhoSUtCZVRSanFNUHFuOQpwdEJRZ1ZRNlJBdGxrVEdkdm1CZlF0MWlwZllsckplZTBUSGhkTEdsbXp1ZmFXT1VrU1ZPL3FJSEVuMXlZRCtsClRtWHFvWWJXWEJYbkpiQUp3Q1FsaC9TRmxXRHlpV1dPeHN6eGR3d1QyeWJ3N09SM2EwREVWME1iS0prVWV4eUYKOTJMcjNxb0JTWlJGUW5YVnZCZ2pRT3duekVGcGgxQU51R1kzb2RMOEpTTTF0SG5pSXNDczRXaERQT3NiQWoraAprd1M1MWNvbE1rM2JOQ1ozeGVBcmpNTEJWTGdUN3hMWC83WlljNy9vVEVGV2lrKzIwVHZTRVd6ZEUxTi80Z2ZKCmpFVS9WcXJuTmp5ZXYydzlBazZiRWt3WkZMUzZWWjlyVFdURjlqazhDMWFYai9SaGZhYUMzM3hYQmJobjlIdVgKbFR1L0phTE1wMFFjNGFDbHFVWU02TGx4SWVqSDViOGZJeENOSEppc2xYSkRhNmE2YVFsODVCaVFPRFBGeFZUNQpXQ3BRRDQ4NThFdUxkWDRCUlcyZklHUlk2RGl2UjZ1SlJBbXhMZitFd0FnL3JnVHpVc0VDZ2dFQkFQU2tIWDVGCkJoUmd1ZEYwTW53Titlbmo0U29YSGhSRytEVG9yeE8xWmgycU45bG5YTzluTUtNQ1hWSkxJVnZHRnVpTVJTSjAKVktmMXUwVXFhQkYwMk1iSXZiZWk3bXpra1cwLzc0bTA0WDM3aXlNbXRubW9vUTBHRVY4NG9PTndBdDNEZWVUZwp2SXBPdHE5VjI2WEhHYVFEeGNSRk1GQnVEMDJhMnlmM0pZa1hqNzRpMnNjTVA0eHhNSE1rSnhHSzlGU0JPaG5wCmsvcDBoTWwzRlZHZm81TnM1VDFSbDNwTXVlRUYzQjUrQnZyVjF6MTRJTi8wbHd1aHVqclVVWVM0RXcrUGs1ekMKRlN1YmZJUU1xU1QxanZYWFRhR2dYMEdQZmZhNGx4Z2FERUFUTGV3dkwzRmp5MjdYemw1N2k5WnZUTkM0eUZhZAo0b2tqci9lSXRIdEtWSEVDZ2dFQkFPcVVLd3cvNnVpSk1OdmMyTnhMVU14dXpCMDdycU9aS1QyVk1Ca0c1R3prCnY4MWZEdGxuZEQ4Y3dIU3FPTEtzY0gvUUtYRDdXSzNGQ3V2WlN2TXdDakVCNFBwMXpnd0pvQmV4dVh2RkREYnMKMFQ3N1Fpd2UrMldtUklpWWV2NWFSRzNsbkJNTThSRFMvUVB6RWRveEhkenJGVVJZVmwwcnY1bC83cndCMlpkNgp4QVlIY1VwWmM0WmF5c0VncVFDdVpRcUM3TXJxN3FmQnlVdGhIMjhZaWN6MTk3OGZwRTNkeDE1Y2VxalU5akJRCnhVVXdiZUtUL1VrUVF2bVlIZHRnd0VqaHpWUUwxT0FBV2tUNlJzc01xeDJSQWRpMFNxV1BGRWh4TlBIQnBHOUIKbEtVREJCSU02ZHU5MTZPbjBCamdoaDNXaHhRS3BUSXp2ZU5BaWV4YlhPOENnZ0VCQU52Sm9oR3ljMzdWVTd3ZwoxOFpxVEEvY3dvc3REOElKN0s2a0tiN2NKeTBabzJsM21xQWZKaXdkVUxoQmRXdmRNUEdtSytxRGR4Y2JCeTloCnBQT2g5YXZKNStCV3lqd2NzYWJrWFJGcjUzWm5DcDcvQmN1Uk8zZlc3cjZNd3NieStEQkNrWDJXaHV6L1FOT1AKb0hGMHljMTM4aktlTW9UZ0RIR2RZYTJyTmhiUGl6MjRWTE9saG1abnZxNkRXWEpDVTdha0R3Mytzd3E5cWhyUwpHTjRuUFMrVEV2VWZHNmN0ellXajNSbXNBaHRUQ1RoWmQ3ZWRLQ0swSHZzQmkyZGdkUWR5NTV4YkplZnlubENJCmkySUFGM3M0L3E3cHhRckNudG1OQjNvSTFONndISDduK1lpMnJxc2J5WFZMSzl2d1RLUHNqMWg2S204cEY4dWQKRHdFQlM1RUNnZ0VBTW5xMkZNbkFiRS94Z3E2d3dCODVBUFVxMlhPWmJqMHNZY016K1g3Qk15bTZtS0JIR3NPbgpnVmxYbFFONGRnS2pwdTJOclhGNU1OUEJPT1dtdWxSeExRQ2hnR1JQZGNtd2VNalhDR3ByNlhubXdXM2lYSXBDClFTcVpmdWVKT0NrR3BydU5iWkFRWkRWekd5RjRpd0tjMFlpSktBNzJidEJXUjlyKzdkaGNFYnZxYVAyN0JHdmgKYjEwa1dwRURyVkRhRDN3REp0dU5oZTR1dWhqcFljZmZCNHM2eUJjd0RVMlhkSmZrRVdiYW42VVIvb1NnY095MQp5YjVGRzE3L3RkREpNQ1hmUUtIWEtta0pBK1R6elFncDNvL3czTWhYYys4cFJ6bU5VaVVBbEt5QkowMVIxK3lOCmVxc010M3dLVFFBci9FbkpBYWdVeW92VjVneGlZY2w3WXdLQ0FRQWRPWWNaeC9sLy9PMEZ0bTZ3cFhHUmpha04KSUhGY1AyaTdtVVc3NkV3bmoxaUZhOVl2N3BnYmJCRDlTMVNNdWV0ZklXY3FTakRpVWF5bW5EZEExOE5WWVVZdgpsaGxVSjZrd2RWdXNlanFmY24rNzVKZjg3QnZXZElWR3JOeFBkQjdaL2xtYld4RnF5WmkwMFI5MFVHQm50YU11CnpnL2lickxnYXR6QTlTS2dvV1htMmJMdDZiYlhlZm1PZ25aWHl3OFFrbzcwWHh0eDVlQlIxQkRBUWpEaXM4MW4KTGc5NnNKM0xPbjdTWEhmeEozQnRYc2hUSkFvQkZ4NkVwbXVsZ05vUFdJa0p0ZDdYV1lQNll5MjJEK2tLN09oSApScTNDaVlNdERtWm91Yi9rVkJMME1WZFNtN2huMVRTVlRIakZvVzZjd1EzN2lLSGprWlZSd1gxS3p0MEIKLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0K", + config.StakingCertContentKey: "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZOekNDQXg4Q0NRQzY4N1hGeHREUlNqQU5CZ2txaGtpRzl3MEJBUXNGQURCL01Rc3dDUVlEVlFRR0V3SlYKVXpFTE1Ba0dBMVVFQ0F3Q1Rsa3hEekFOQmdOVkJBY01Ca2wwYUdGallURVFNQTRHQTFVRUNnd0hRWFpoYkdGaQpjekVPTUF3R0ExVUVDd3dGUjJWamEyOHhEREFLQmdOVkJBTU1BMkYyWVRFaU1DQUdDU3FHU0liM0RRRUpBUllUCmMzUmxjR2hsYmtCaGRtRnNZV0p6TG05eVp6QWdGdzB4T1RBM01ESXhOakV5TWpsYUdBOHpNREU1TURjeE1ERTIKTVRJeU9Wb3dPakVMTUFrR0ExVUVCaE1DVlZNeEN6QUpCZ05WQkFnTUFrNVpNUkF3RGdZRFZRUUtEQWRCZG1GcwpZV0p6TVF3d0NnWURWUVFEREFOaGRtRXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDCkFRRGdLNXI1dmRIdEpGRWd3N2hHRS9sekthSGN2d3pyMzJhcm1xMGs5dFljaEpYZlQzazFqMWxYdEJBZGNVTjMKZ1NSS2pnekgvdmpibjBlYTNBaURDVWQyTWNrL24wS2NKWjQzUzVJN1pqUDdyYmF2Mjk2YktDWjFIcjdyNWdYWQpGaGsrM2FVc1ZmRFVxQVBCd3lQOEtlVjMxQVJWQS9zK1dQZVdxczY5UVhUZHlKdUJZRTVwcjQwdjFTZitlYlVJCm5aMzd1R1kza2lPMEV4L0pnY29Rc0dKenJXRC96dGJSQ0ZJdnJkTkpaZDBwR3ZNbG1US3A3WHNNUjNjcHZxazcKNzAvL01MQ2R5R1cvMUlBclRTdUQxdmQ3bUJYMUp5VlhLeWNZTjB2SU90Ymd4UE9GdXRVeXFET2VQN281MXE0aQpQUzNkQ1JnZm1uL2hXTHd5K0N0SmUwQkdLc2I0dGswdEt4bzBzZTh2OUpBOG1VdG5tem1NdDRZOWppak9yQ09CCjdYd1dLbUpZRW04TjVVYmN5NmNwMm9MOHZRVnR6ejNQWHJrRnQrM2NGdDFqcmpkcFFZZ0g0anlra1dEZU9qRWYKeTFGQ3d6c05SdWRMVHZMaGZMbjg2L1pUNGNMWjlKSTcvV1cwSVBDOEZjN2xoem5KK2JJUVVlRW5kYUdkZ1ZreAp1RWcwTXhkck1yMGpVMElGb1h5U1JYTlJ6Y0RXWlNoRWpCVHY3dG5GeExtb05VK3VKYi9LcE1INnNSWWkzenM4CjVlY2FNS055RytMRG1CYWhVbEh4NWhLQUg0OU84ODU1K0FNaHNnOTFPTlpKbGRqUVgwb1pySUt6SzVCcHNxZVQKbDRjMll0L2ZBTGlaYWVGazFwQkVzdlZlTU9CQ0l1V0UrYjRVSUVhTEFPaHhmd0lEQVFBQk1BMEdDU3FHU0liMwpEUUVCQ3dVQUE0SUNBUUIrMlZYbnFScWZHN0gyL0swbGd6eFQrWDlyMXUrWURuMEVhVUdBRzcxczcwUW5xYnBuClg3dEJtQ0tMTjZYZ1BMMEhyTjkzM253aVlybWZiOFMzM3paN2t3OEdKRHZhVGFtTE55ZW00LzhxVEJRbW5Sd2UKNnJRN1NZMmw3M0lnODdtUjBXVGkrclRuVFR0YzY2Ky9qTHRGZWFqMFljbDloQlpYSEtpVUxTR2hzYlVid3RregppdU5sQU5ob05LWE5JQUJSSW1VcTZPd1loRVFOMER3SFhqNzl3a3B5RFlqS1p3SHVFWlVrbmM4UGwyb1FQQmtlCm1pbDN0c3J2R1Jrd2hpc25YWDd0cWg2cldLVlpOSmtPNjhoeTdYTzlhVFhqYmNCLzdZMUs4M0lTTkV5R1BzSC8KcHdGeWQvajhPNG1vZHdoN1Vsd3cxL2h3Y3FucWlFRkUzS3p4WDJwTWg3VnhlQW1YMnQ1ZVhGWk9sUngxbGVjTQpYUmtWdTE5bFlES1FIR1NyR3huZytCRmxTT0I5NmU1a1hJYnVJWEtwUEFBQ29CUS9KWllidEhrczlIOE90TllPClAyam9xbW5ROXdHa0U1Y28xSWkvL2oydHVvQ1JDcEs4Nm1tYlRseU5ZdksrMS9ra0tjc2FpaVdYTnJRc3JJRFoKQkZzMEZ3WDVnMjRPUDUrYnJ4VGxSWkUwMVI2U3Q4bFFqNElVd0FjSXpHOGZGbU1DV2FZYXZyQ1pUZVlhRWl5RgpBMFgyVkEvdlo3eDlENVA5WjVPYWtNaHJNVytoSlRZcnBIMXJtNktSN0IyNmlVMmtKUnhUWDd4UTlscmtzcWZCCjdsWCtxMGloZWVZQTRjSGJHSk5Xd1dnZCtGUXNLL1BUZWl5cjRyZnF1dHV0ZFdBMEl4b0xSYzNYRnc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==", + config.StakingSignerKeyContentKey: "QXZhbGFuY2hlTG9jYWxOZXR3b3JrVmFsaWRhdG9yMDU=", + }, + }, + }, + } + for _, node := range network.Nodes { + if err := node.EnsureNodeID(); err != nil { + panic(fmt.Sprintf("failed to ensure nodeID: %s", err)) + } + } + + return network +} diff --git a/tests/fixture/tmpnet/network.go b/tests/fixture/tmpnet/network.go index e95e6d7e6182..faea1dde50f7 100644 --- a/tests/fixture/tmpnet/network.go +++ b/tests/fixture/tmpnet/network.go @@ -79,8 +79,16 @@ type Network struct { // Path where network configuration and data is stored Dir string + // Id of the network. If zero, must be set in Genesis. + NetworkID uint32 + // Configuration common across nodes - Genesis *genesis.UnparsedConfig + + // Genesis for the network. If nil, NetworkID must be non-zero + Genesis *genesis.UnparsedConfig + + // Configuration for primary network chains (P, X, C) + // TODO(marun) Rename to PrimaryChainConfigs ChainConfigs map[string]FlagsMap // Default configuration to use when creating new nodes @@ -490,9 +498,13 @@ func (n *Network) EnsureNodeConfig(node *Node) error { node.NetworkOwner = n.Owner // Set the network name if available - if n.Genesis != nil && n.Genesis.NetworkID > 0 { + networkID := n.NetworkID + if networkID == 0 && n.Genesis != nil && n.Genesis.NetworkID > 0 { + networkID = n.Genesis.NetworkID + } + if networkID > 0 { // Convert the network id to a string to ensure consistency in JSON round-tripping. - flags[config.NetworkNameKey] = strconv.FormatUint(uint64(n.Genesis.NetworkID), 10) + flags[config.NetworkNameKey] = strconv.FormatUint(uint64(networkID), 10) } if err := node.EnsureKeys(); err != nil {