From 7f1b4dc438b58b4a0af317b6ec4f8a00168e49ef Mon Sep 17 00:00:00 2001 From: Ian Davis Date: Thu, 28 Jul 2022 19:23:03 -0700 Subject: [PATCH 01/11] Use goreleaser to build universal darwin binaries This is a small refactor of our workflow to test out goreleaser, a yaml based tool for building, packaging, and releasing go binaries on multiple platforms. It supports building binaries for to most of the platforms we care about, including linux and macos, and also supports publishing those binaries automatically as releases in Github, homebrew, snap, and even apt / deb. If this trial goes well, I think we should eventually replace the entire release workflow with goreleaser. For now, this test is more tightly scoped to only automated the MacOS release process, since that is the one we have the most issues with. This PRi / commit: - Builds darwin-amd64 and darwin-arm64 binaries of lotus, lotus-miner, and lotus-worker - Packages them into a universal darwin binary - Publishes those to a release in Github based on the current tag - Uses the binaries in the release to auto-publish and updated homebrew configuration to filecoin-project/homebrew-lotus - Does a `dry-run` build to produce a snapshot on release branches with no tag - Manually generate and upload checksums after goreleaser --- .circleci/config.yml | 126 ++++++++++++++------------ .circleci/template.yml | 126 ++++++++++++++------------ .gitignore | 2 + .goreleaser.yaml | 166 ++++++++++++++++++++++++++++++++++ scripts/generate-checksums.sh | 29 ++++++ scripts/publish-checksums.sh | 80 ++++++++++++++++ 6 files changed, 415 insertions(+), 114 deletions(-) create mode 100644 .goreleaser.yaml create mode 100755 scripts/generate-checksums.sh create mode 100755 scripts/publish-checksums.sh diff --git a/.circleci/config.yml b/.circleci/config.yml index e9c43ab4f..f4b05b730 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -46,6 +46,35 @@ commands: steps: - run: sudo apt-get update - run: sudo apt-get install ocl-icd-opencl-dev libhwloc-dev + - when: + condition: <> + steps: + - run: + name: Install Go + command: | + curl https://dl.google.com/go/go1.17.9.darwin-amd64.pkg -o /tmp/go.pkg && \ + sudo installer -pkg /tmp/go.pkg -target / + - run: + name: Export Go + command: | + echo 'export GOPATH="${HOME}/go"' >> $BASH_ENV + - run: go version + - run: + name: Install pkg-config, goreleaser, and sha512sum + command: HOMEBREW_NO_AUTO_UPDATE=1 brew install pkg-config goreleaser/tap/goreleaser coreutils + - run: + name: Install Rust + command: | + curl https://sh.rustup.rs -sSf | sh -s -- -y + - run: + name: Install hwloc + command: | + mkdir ~/hwloc + curl --location https://download.open-mpi.org/release/hwloc/v2.4/hwloc-2.4.1.tar.gz --output ~/hwloc/hwloc-2.4.1.tar.gz + cd ~/hwloc + tar -xvzpf hwloc-2.4.1.tar.gz + cd hwloc-2.4.1 + ./configure && make && sudo make install - run: git submodule sync - run: git submodule update --init download-params: @@ -77,6 +106,16 @@ commands: tar -xf go-ipfs_v0.12.2_linux-amd64.tar.gz mv go-ipfs/ipfs /usr/local/bin/ipfs chmod +x /usr/local/bin/ipfs + install_ipfs_macos: + steps: + - run: | + curl -O https://dist.ipfs.io/kubo/v0.14.0/kubo_v0.14.0_darwin-amd64.tar.gz + tar -xvzf kubo_v0.14.0_darwin-amd64.tar.gz + pushd kubo + sudo bash install.sh + popd + rm -rf kubo/ + rm kubo_v0.14.0_darwin-amd64.tar.gz git_fetch_all_tags: steps: - run: @@ -335,9 +374,13 @@ jobs: - run: name: "trigger payment channel stress testplan on taas" command: ~/testground-cli run composition -f $HOME/testground/plans/lotus-soup/_compositions/paych-stress-k8s.toml --metadata-commit=$CIRCLE_SHA1 --metadata-repo=filecoin-project/lotus --metadata-branch=$CIRCLE_BRANCH - build-macos: description: build darwin lotus binary + parameters: + publish: + default: false + description: publish github release and homebrew? + type: boolean macos: xcode: "12.5.0" working_directory: ~/go/src/github.com/filecoin-project/lotus @@ -345,48 +388,28 @@ jobs: - prepare: linux: false darwin: true - - run: - name: Install go - command: | - curl -O https://dl.google.com/go/go1.17.9.darwin-amd64.pkg && \ - sudo installer -pkg go1.17.9.darwin-amd64.pkg -target / - - run: - name: Install pkg-config - command: HOMEBREW_NO_AUTO_UPDATE=1 brew install pkg-config - - run: go version - - run: - name: Install Rust - command: | - curl https://sh.rustup.rs -sSf | sh -s -- -y - - run: - name: Install hwloc - command: | - mkdir ~/hwloc - curl --location https://download.open-mpi.org/release/hwloc/v2.4/hwloc-2.4.1.tar.gz --output ~/hwloc/hwloc-2.4.1.tar.gz - cd ~/hwloc - tar -xvzpf hwloc-2.4.1.tar.gz - cd hwloc-2.4.1 - ./configure && make && sudo make install + - install_ipfs_macos - restore_cache: name: restore cargo cache key: v3-go-deps-{{ arch }}-{{ checksum "~/go/src/github.com/filecoin-project/lotus/go.sum" }} - - run: - command: make build - no_output_timeout: 30m - - run: - name: check tag and version output match - command: ./scripts/version-check.sh ./lotus + - when: + condition: << parameters.publish >> + steps: + - run: goreleaser release --rm-dist + - run: ./scripts/generate-checksums.sh + - run: ./scripts/publish-checksums.sh + - when: + condition: + not: << parameters.publish >> + steps: + - run: goreleaser release --rm-dist --snapshot + - run: ./scripts/generate-checksums.sh - store_artifacts: - path: lotus - - store_artifacts: - path: lotus-miner - - store_artifacts: - path: lotus-worker - - run: mkdir darwin && mv lotus lotus-miner lotus-worker darwin/ + path: dist - persist_to_workspace: root: "." paths: - - darwin + - dist - save_cache: name: save cargo cache key: v3-go-deps-{{ arch }}-{{ checksum "~/go/src/github.com/filecoin-project/lotus/go.sum" }} @@ -523,10 +546,6 @@ jobs: default: false description: publish linux binaries? type: boolean - darwin: - default: false - description: publish darwin binaries? - type: boolean appimage: default: false description: publish appimage binaries? @@ -546,11 +565,6 @@ jobs: steps: - run: ./scripts/build-arch-bundle.sh linux - run: ./scripts/publish-arch-release.sh linux - - when: - condition: << parameters.darwin>> - steps: - - run: ./scripts/build-arch-bundle.sh darwin - - run: ./scripts/publish-arch-release.sh darwin - when: condition: << parameters.appimage >> steps: @@ -1057,10 +1071,20 @@ workflows: - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - build-lotus-soup - build-macos: + name: publish-macos + publish: true filters: + branches: + ignore: + - /.*/ tags: only: - /^v\d+\.\d+\.\d+(-rc\d+)?$/ + - build-macos: + filters: + branches: + only: + - /^release\/v\d+\.\d+\.\d+(-rc\d+)?$/ - build-appimage: filters: branches: @@ -1069,18 +1093,6 @@ workflows: tags: only: - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - - publish: - name: publish-macos - darwin: true - requires: - - build-macos - filters: - branches: - ignore: - - /.*/ - tags: - only: - - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - publish: name: publish-linux linux: true diff --git a/.circleci/template.yml b/.circleci/template.yml index a7f6590e7..820b2fa92 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -46,6 +46,35 @@ commands: steps: - run: sudo apt-get update - run: sudo apt-get install ocl-icd-opencl-dev libhwloc-dev + - when: + condition: <> + steps: + - run: + name: Install Go + command: | + curl https://dl.google.com/go/go1.17.9.darwin-amd64.pkg -o /tmp/go.pkg && \ + sudo installer -pkg /tmp/go.pkg -target / + - run: + name: Export Go + command: | + echo 'export GOPATH="${HOME}/go"' >> $BASH_ENV + - run: go version + - run: + name: Install pkg-config, goreleaser, and sha512sum + command: HOMEBREW_NO_AUTO_UPDATE=1 brew install pkg-config goreleaser/tap/goreleaser coreutils + - run: + name: Install Rust + command: | + curl https://sh.rustup.rs -sSf | sh -s -- -y + - run: + name: Install hwloc + command: | + mkdir ~/hwloc + curl --location https://download.open-mpi.org/release/hwloc/v2.4/hwloc-2.4.1.tar.gz --output ~/hwloc/hwloc-2.4.1.tar.gz + cd ~/hwloc + tar -xvzpf hwloc-2.4.1.tar.gz + cd hwloc-2.4.1 + ./configure && make && sudo make install - run: git submodule sync - run: git submodule update --init download-params: @@ -77,6 +106,16 @@ commands: tar -xf go-ipfs_v0.12.2_linux-amd64.tar.gz mv go-ipfs/ipfs /usr/local/bin/ipfs chmod +x /usr/local/bin/ipfs + install_ipfs_macos: + steps: + - run: | + curl -O https://dist.ipfs.io/kubo/v0.14.0/kubo_v0.14.0_darwin-amd64.tar.gz + tar -xvzf kubo_v0.14.0_darwin-amd64.tar.gz + pushd kubo + sudo bash install.sh + popd + rm -rf kubo/ + rm kubo_v0.14.0_darwin-amd64.tar.gz git_fetch_all_tags: steps: - run: @@ -335,9 +374,13 @@ jobs: - run: name: "trigger payment channel stress testplan on taas" command: ~/testground-cli run composition -f $HOME/testground/plans/lotus-soup/_compositions/paych-stress-k8s.toml --metadata-commit=$CIRCLE_SHA1 --metadata-repo=filecoin-project/lotus --metadata-branch=$CIRCLE_BRANCH - build-macos: description: build darwin lotus binary + parameters: + publish: + default: false + description: publish github release and homebrew? + type: boolean macos: xcode: "12.5.0" working_directory: ~/go/src/github.com/filecoin-project/lotus @@ -345,48 +388,28 @@ jobs: - prepare: linux: false darwin: true - - run: - name: Install go - command: | - curl -O https://dl.google.com/go/go1.17.9.darwin-amd64.pkg && \ - sudo installer -pkg go1.17.9.darwin-amd64.pkg -target / - - run: - name: Install pkg-config - command: HOMEBREW_NO_AUTO_UPDATE=1 brew install pkg-config - - run: go version - - run: - name: Install Rust - command: | - curl https://sh.rustup.rs -sSf | sh -s -- -y - - run: - name: Install hwloc - command: | - mkdir ~/hwloc - curl --location https://download.open-mpi.org/release/hwloc/v2.4/hwloc-2.4.1.tar.gz --output ~/hwloc/hwloc-2.4.1.tar.gz - cd ~/hwloc - tar -xvzpf hwloc-2.4.1.tar.gz - cd hwloc-2.4.1 - ./configure && make && sudo make install + - install_ipfs_macos - restore_cache: name: restore cargo cache key: v3-go-deps-{{ arch }}-{{ checksum "~/go/src/github.com/filecoin-project/lotus/go.sum" }} - - run: - command: make build - no_output_timeout: 30m - - run: - name: check tag and version output match - command: ./scripts/version-check.sh ./lotus + - when: + condition: << parameters.publish >> + steps: + - run: goreleaser release --rm-dist + - run: ./scripts/generate-checksums.sh + - run: ./scripts/publish-checksums.sh + - when: + condition: + not: << parameters.publish >> + steps: + - run: goreleaser release --rm-dist --snapshot + - run: ./scripts/generate-checksums.sh - store_artifacts: - path: lotus - - store_artifacts: - path: lotus-miner - - store_artifacts: - path: lotus-worker - - run: mkdir darwin && mv lotus lotus-miner lotus-worker darwin/ + path: dist - persist_to_workspace: root: "." paths: - - darwin + - dist - save_cache: name: save cargo cache key: v3-go-deps-{{ arch }}-{{ checksum "~/go/src/github.com/filecoin-project/lotus/go.sum" }} @@ -523,10 +546,6 @@ jobs: default: false description: publish linux binaries? type: boolean - darwin: - default: false - description: publish darwin binaries? - type: boolean appimage: default: false description: publish appimage binaries? @@ -546,11 +565,6 @@ jobs: steps: - run: ./scripts/build-arch-bundle.sh linux - run: ./scripts/publish-arch-release.sh linux - - when: - condition: << parameters.darwin>> - steps: - - run: ./scripts/build-arch-bundle.sh darwin - - run: ./scripts/publish-arch-release.sh darwin - when: condition: << parameters.appimage >> steps: @@ -817,10 +831,20 @@ workflows: - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - build-lotus-soup - build-macos: + name: publish-macos + publish: true filters: + branches: + ignore: + - /.*/ tags: only: - /^v\d+\.\d+\.\d+(-rc\d+)?$/ + - build-macos: + filters: + branches: + only: + - /^release\/v\d+\.\d+\.\d+(-rc\d+)?$/ - build-appimage: filters: branches: @@ -829,18 +853,6 @@ workflows: tags: only: - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - - publish: - name: publish-macos - darwin: true - requires: - - build-macos - filters: - branches: - ignore: - - /.*/ - tags: - only: - - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - publish: name: publish-linux linux: true diff --git a/.gitignore b/.gitignore index 1db5e2858..b111195cf 100644 --- a/.gitignore +++ b/.gitignore @@ -51,3 +51,5 @@ scratchpad build/builtin-actors/v* build/builtin-actors/*.car + +dist/ diff --git a/.goreleaser.yaml b/.goreleaser.yaml new file mode 100644 index 000000000..218f078fb --- /dev/null +++ b/.goreleaser.yaml @@ -0,0 +1,166 @@ +project_name: lotus +before: + hooks: + - go mod tidy + - make deps + +universal_binaries: + - id: lotus + replace: true + name_template: lotus + ids: + - lotus_darwin_amd64 + - lotus_darwin_arm64 + - id: lotus-miner + replace: true + name_template: lotus-miner + ids: + - lotus-miner_darwin_amd64 + - lotus-miner_darwin_arm64 + - id: lotus-worker + replace: true + name_template: lotus-worker + ids: + - lotus-worker_darwin_amd64 + - lotus-worker_darwin_arm64 + +builds: + - id: lotus_darwin_amd64 + main: ./cmd/lotus + binary: lotus + goos: + - darwin + goarch: + - amd64 + env: + - CGO_ENABLED=1 + - FFI_BUILD_FROM_SOURCE=1 + ldflags: + - -X=github.com/filecoin-project/lotus/build.CurrentCommit=+git.{{.ShortCommit}} + - id: lotus-miner_darwin_amd64 + main: ./cmd/lotus-miner + binary: lotus-miner + goos: + - darwin + goarch: + - amd64 + env: + - CGO_ENABLED=1 + - FFI_BUILD_FROM_SOURCE=1 + ldflags: + - -X=github.com/filecoin-project/lotus/build.CurrentCommit=+git.{{.ShortCommit}} + - id: lotus-worker_darwin_amd64 + main: ./cmd/lotus-worker + binary: lotus-worker + goos: + - darwin + goarch: + - amd64 + env: + - CGO_ENABLED=1 + - FFI_BUILD_FROM_SOURCE=1 + ldflags: + - -X=github.com/filecoin-project/lotus/build.CurrentCommit=+git.{{.ShortCommit}} + - id: lotus_darwin_arm64 + main: ./cmd/lotus + binary: lotus + goos: + - darwin + goarch: + - arm64 + env: + - CGO_ENABLED=1 + - FFI_BUILD_FROM_SOURCE=1 + - CPATH=/opt/homebrew/include + - LIBRARY_PATH=/opt/homebrew/lib + ldflags: + - -X=github.com/filecoin-project/lotus/build.CurrentCommit=+git.{{.ShortCommit}} + - id: lotus-miner_darwin_arm64 + main: ./cmd/lotus-miner + binary: lotus-miner + goos: + - darwin + goarch: + - arm64 + env: + - CGO_ENABLED=1 + - FFI_BUILD_FROM_SOURCE=1 + - CPATH=/opt/homebrew/include + - LIBRARY_PATH=/opt/homebrew/lib + ldflags: + - -X=github.com/filecoin-project/lotus/build.CurrentCommit=+git.{{.ShortCommit}} + - id: lotus-worker_darwin_arm64 + main: ./cmd/lotus-worker + binary: lotus-worker + goos: + - darwin + goarch: + - arm64 + env: + - CGO_ENABLED=1 + - FFI_BUILD_FROM_SOURCE=1 + - CPATH=/opt/homebrew/include + - LIBRARY_PATH=/opt/homebrew/lib + ldflags: + - -X=github.com/filecoin-project/lotus/build.CurrentCommit=+git.{{.ShortCommit}} +# - id: linux +# main: ./cmd/lotus +# binary: lotus +# goos: +# - linux +# goarch: +# - amd64 +# env: +# - CGO_ENABLED=1 +# ldflags: +# - -X=github.com/filecoin-project/lotus/build.CurrentCommit=+git.{{.ShortCommit}} + +archives: + - id: primary + format: tar.gz + wrap_in_directory: true + files: + # this is a dumb but required hack so it doesn't include the default files + # https://github.com/goreleaser/goreleaser/issues/602 + - _n_o_n_e_* + +release: + github: + owner: ianconsolata + name: lotus + prerelease: auto + mode: append + name_template: "Release v{{.Version}}" + + +brews: + - tap: + owner: ianconsolata + name: homebrew-lotus + branch: master + ids: + - primary + install: | + bin.install "lotus" + bin.install "lotus-miner" + bin.install "lotus-worker" + test: | + system "#{bin}/lotus --version" + system "#{bin}/lotus-miner --version" + system "#{bin}/lotus-worker --version" + folder: Formula + homepage: "https://filecoin.io" + description: "A homebrew cask for installing filecoin-project/lotus on MacOS" + license: MIT + dependencies: + - name: pkg-config + - name: jq + - name: bzr + - name: hwloc + +# produced manually so we can include cid checksums +checksum: + disable: true + +snapshot: + name_template: "{{ .Tag }}" diff --git a/scripts/generate-checksums.sh b/scripts/generate-checksums.sh new file mode 100755 index 000000000..ae0920138 --- /dev/null +++ b/scripts/generate-checksums.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash +set -exo + +REQUIRED=( + "sha512sum" + "ipfs" +) +for REQUIRE in "${REQUIRED[@]}" +do + command -v "${REQUIRE}" >/dev/null 2>&1 || echo >&2 "'${REQUIRE}' must be installed" +done + +# start ipfs +export IPFS_PATH=`mktemp -d` +ipfs init +ipfs daemon & +PID="$!" +trap "kill -9 ${PID}" EXIT + +# generate checksums +for FILE in dist/*.tar.gz +do + sha512sum "${FILE}" > "${FILE}.sha512" + until ipfs add -q "${FILE}" > "${FILE}.cid" + do + echo "Waiting for ipfs daemon to start..." + sleep 2 + done +done diff --git a/scripts/publish-checksums.sh b/scripts/publish-checksums.sh new file mode 100755 index 000000000..346ca9b4c --- /dev/null +++ b/scripts/publish-checksums.sh @@ -0,0 +1,80 @@ +#!/usr/bin/env bash +set -exo + +pushd dist + +# make sure we have a token set, api requests won't work otherwise +if [ -z "${GITHUB_TOKEN}" ]; then + echo "\${GITHUB_TOKEN} not set, publish failed" + exit 1 +fi + +REQUIRED=( + "jq" + "curl" +) +for REQUIRE in "${REQUIRED[@]}" +do + command -v "${REQUIRE}" >/dev/null 2>&1 || echo >&2 "'${REQUIRE}' must be installed" +done + +#see if the release already exists by tag +RELEASE_RESPONSE=` + curl \ + --fail \ + --header "Authorization: token ${GITHUB_TOKEN}" \ + "https://api.github.com/repos/${CIRCLE_PROJECT_USERNAME}/${CIRCLE_PROJECT_REPONAME}/releases/tags/${CIRCLE_TAG}" +` +RELEASE_ID=`echo "${RELEASE_RESPONSE}" | jq '.id'` + +if [ "${RELEASE_ID}" = "null" ]; then + echo "creating release" + + COND_CREATE_DISCUSSION="" + PRERELEASE=true + if [[ ${CIRCLE_TAG} =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + COND_CREATE_DISCUSSION="\"discussion_category_name\": \"announcement\"," + PRERELEASE=false + fi + + RELEASE_DATA="{ + \"tag_name\": \"${CIRCLE_TAG}\", + \"target_commitish\": \"${CIRCLE_SHA1}\", + ${COND_CREATE_DISCUSSION} + \"name\": \"${CIRCLE_TAG}\", + \"body\": \"\", + \"prerelease\": ${PRERELEASE} + }" + + # create it if it doesn't exist yet + RELEASE_RESPONSE=` + curl \ + --fail \ + --request POST \ + --header "Authorization: token ${GITHUB_TOKEN}" \ + --header "Content-Type: application/json" \ + --data "${RELEASE_DATA}" \ + "https://api.github.com/repos/$CIRCLE_PROJECT_USERNAME/${CIRCLE_PROJECT_REPONAME}/releases" + ` +else + echo "release already exists" +fi + +RELEASE_UPLOAD_URL=`echo "${RELEASE_RESPONSE}" | jq -r '.upload_url' | cut -d'{' -f1` +echo "Preparing to send artifacts to ${RELEASE_UPLOAD_URL}" + +for CHECKSUM_FILE in *.{cid,sha512} +do + echo "Uploading ${CHECKSUM_FILE}..." + curl \ + --fail \ + --request POST \ + --header "Authorization: token ${GITHUB_TOKEN}" \ + --header "Content-Type: application/octet-stream" \ + --data-binary "@${CHECKSUM_FILE}" \ + "$RELEASE_UPLOAD_URL?name=$(basename "${CHECKSUM_FILE}")" + + echo "Uploaded ${CHECKSUM_FILE}" +done + +popd From 83199661cef969e3c17a121e36e9c10713a18faf Mon Sep 17 00:00:00 2001 From: Ian Davis Date: Thu, 28 Jul 2022 20:24:50 -0700 Subject: [PATCH 02/11] Add separate names to build-and-push-image jobs --- .circleci/config.yml | 2 ++ .circleci/template.yml | 2 ++ 2 files changed, 4 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index f4b05b730..b4962c479 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1118,12 +1118,14 @@ workflows: only: - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - build-and-push-image: + name: build-and-push lotus-all-in-one dockerfile: Dockerfile.lotus path: . repo: lotus-dev tag: '${CIRCLE_SHA1:0:8}' target: lotus-all-in-one - build-and-push-image: + name: build-and-push lotus-test dockerfile: Dockerfile.lotus path: . repo: lotus-test diff --git a/.circleci/template.yml b/.circleci/template.yml index 820b2fa92..c401f655c 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -878,12 +878,14 @@ workflows: only: - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - build-and-push-image: + name: build-and-push/lotus-all-in-one dockerfile: Dockerfile.lotus path: . repo: lotus-dev tag: '${CIRCLE_SHA1:0:8}' target: lotus-all-in-one - build-and-push-image: + name: build-and-push/lotus-test dockerfile: Dockerfile.lotus path: . repo: lotus-test From c759211032039fd30206afb79ed80d9abb10c55e Mon Sep 17 00:00:00 2001 From: Ian Davis Date: Thu, 28 Jul 2022 21:03:12 -0700 Subject: [PATCH 03/11] Switch to filecoin-project from personal fork --- .goreleaser.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.goreleaser.yaml b/.goreleaser.yaml index 218f078fb..e027d57b0 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -126,7 +126,7 @@ archives: release: github: - owner: ianconsolata + owner: filecoin-project name: lotus prerelease: auto mode: append @@ -135,7 +135,7 @@ release: brews: - tap: - owner: ianconsolata + owner: filecoin-project name: homebrew-lotus branch: master ids: From 52aef0b92653eb18bd851addc6b64e6bdca8ceef Mon Sep 17 00:00:00 2001 From: Ian Davis Date: Thu, 28 Jul 2022 21:17:46 -0700 Subject: [PATCH 04/11] make circleci --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index b4962c479..afd8494af 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1118,14 +1118,14 @@ workflows: only: - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - build-and-push-image: - name: build-and-push lotus-all-in-one + name: build-and-push/lotus-all-in-one dockerfile: Dockerfile.lotus path: . repo: lotus-dev tag: '${CIRCLE_SHA1:0:8}' target: lotus-all-in-one - build-and-push-image: - name: build-and-push lotus-test + name: build-and-push/lotus-test dockerfile: Dockerfile.lotus path: . repo: lotus-test From c215a03edd482330fd7df2b4b2102e95f72979a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 1 Aug 2022 16:58:05 +0200 Subject: [PATCH 05/11] feat: wdpost: Envvar for limiting recovering sectors --- storage/wdpost/wdpost_run_faults.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/storage/wdpost/wdpost_run_faults.go b/storage/wdpost/wdpost_run_faults.go index 60352e8b8..b5a52c1ed 100644 --- a/storage/wdpost/wdpost_run_faults.go +++ b/storage/wdpost/wdpost_run_faults.go @@ -2,6 +2,8 @@ package wdpost import ( "context" + "os" + "strconv" "github.com/ipfs/go-cid" "go.opencensus.io/trace" @@ -19,6 +21,18 @@ import ( "github.com/filecoin-project/lotus/chain/types" ) +var recoveringSectorLimit int64 = 0 + +func init() { + if rcl := os.Getenv("LOTUS_RECOVERING_SECTOR_LIMIT"); rcl != "" { + var err error + recoveringSectorLimit, err = strconv.ParseInt(rcl, 10, 64) + if err != nil { + log.Errorw("parsing LOTUS_RECOVERING_SECTOR_LIMIT", "error", err) + } + } +} + // declareRecoveries identifies sectors that were previously marked as faulty // for our miner, but are now recovered (i.e. are now provable again) and // still not reported as such. @@ -90,6 +104,11 @@ func (s *WindowPoStScheduler) declareRecoveries(ctx context.Context, dlIdx uint6 Sectors: recovered, }) + if recoveringSectorLimit > 0 && int64(totalRecoveries) >= recoveringSectorLimit { + log.Errorw("reached recovering sector limit, not all sectors will be marked as recovered") + break + } + totalRecoveries++ } From f8cf3b151013a7bb92254cc502b826acb1c0f4f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 1 Aug 2022 17:15:26 +0200 Subject: [PATCH 06/11] feat: mpool: Include gaslimit in error msg in ValidForBlockInclusion --- chain/types/message.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chain/types/message.go b/chain/types/message.go index 5b2aad47e..547d4c353 100644 --- a/chain/types/message.go +++ b/chain/types/message.go @@ -196,7 +196,7 @@ func (m *Message) ValidForBlockInclusion(minGas int64, version network.Version) } if m.GasLimit > build.BlockGasLimit { - return xerrors.New("'GasLimit' field cannot be greater than a block's gas limit") + return xerrors.Errorf("'GasLimit' field cannot be greater than a block's gas limit (%d > %d)", m.GasLimit, build.BlockGasLimit) } // since prices might vary with time, this is technically semantic validation From 650130f9c4c8f18798c8e30c316473e2249c650f Mon Sep 17 00:00:00 2001 From: Aayush Date: Mon, 1 Aug 2022 14:29:46 -0400 Subject: [PATCH 07/11] fix: sector counter for recovery --- storage/wdpost/wdpost_run_faults.go | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/storage/wdpost/wdpost_run_faults.go b/storage/wdpost/wdpost_run_faults.go index b5a52c1ed..32f0d96a6 100644 --- a/storage/wdpost/wdpost_run_faults.go +++ b/storage/wdpost/wdpost_run_faults.go @@ -58,7 +58,7 @@ func (s *WindowPoStScheduler) declareRecoveries(ctx context.Context, dlIdx uint6 var batchedRecoveryDecls [][]miner.RecoveryDeclaration batchedRecoveryDecls = append(batchedRecoveryDecls, []miner.RecoveryDeclaration{}) - totalRecoveries := 0 + totalSectorsToRecover := uint64(0) for partIdx, partition := range partitions { unrecovered, err := bitfield.SubtractBitField(partition.FaultySectors, partition.RecoveringSectors) @@ -104,15 +104,17 @@ func (s *WindowPoStScheduler) declareRecoveries(ctx context.Context, dlIdx uint6 Sectors: recovered, }) - if recoveringSectorLimit > 0 && int64(totalRecoveries) >= recoveringSectorLimit { - log.Errorw("reached recovering sector limit, not all sectors will be marked as recovered") + totalSectorsToRecover += recoveredCount + + if recoveringSectorLimit > 0 && int64(totalSectorsToRecover) >= recoveringSectorLimit { + log.Errorf("reached recovering sector limit %d, only marking %d sectors for recovery now", + recoveringSectorLimit, + totalSectorsToRecover) break } - - totalRecoveries++ } - if totalRecoveries == 0 { + if totalSectorsToRecover == 0 { if faulty != 0 { log.Warnw("No recoveries to declare", "deadline", dlIdx, "faulty", faulty) } @@ -120,6 +122,7 @@ func (s *WindowPoStScheduler) declareRecoveries(ctx context.Context, dlIdx uint6 return nil, nil, nil } + log.Infof("attempting recovery declarations for %d sectors", totalSectorsToRecover) var msgs []*types.SignedMessage for _, recovery := range batchedRecoveryDecls { params := &miner.DeclareFaultsRecoveredParams{ @@ -141,7 +144,6 @@ func (s *WindowPoStScheduler) declareRecoveries(ctx context.Context, dlIdx uint6 if err := s.prepareMessage(ctx, msg, spec); err != nil { return nil, nil, err } - sm, err := s.api.MpoolPushMessage(ctx, msg, &api.MessageSendSpec{MaxFee: abi.TokenAmount(s.feeCfg.MaxWindowPoStGasFee)}) if err != nil { return nil, nil, xerrors.Errorf("pushing message to mpool: %w", err) From 50c22aef7a7a9384949018567f42b0925eac2d76 Mon Sep 17 00:00:00 2001 From: Aayush Date: Tue, 2 Aug 2022 12:29:01 -0400 Subject: [PATCH 08/11] fix: post: restrict recoveries per deadline --- storage/wdpost/wdpost_run_faults.go | 32 ++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/storage/wdpost/wdpost_run_faults.go b/storage/wdpost/wdpost_run_faults.go index 32f0d96a6..59cb9b441 100644 --- a/storage/wdpost/wdpost_run_faults.go +++ b/storage/wdpost/wdpost_run_faults.go @@ -2,6 +2,7 @@ package wdpost import ( "context" + "math" "os" "strconv" @@ -21,12 +22,12 @@ import ( "github.com/filecoin-project/lotus/chain/types" ) -var recoveringSectorLimit int64 = 0 +var recoveringSectorLimit uint64 = 0 func init() { if rcl := os.Getenv("LOTUS_RECOVERING_SECTOR_LIMIT"); rcl != "" { var err error - recoveringSectorLimit, err = strconv.ParseInt(rcl, 10, 64) + recoveringSectorLimit, err = strconv.ParseUint(rcl, 10, 64) if err != nil { log.Errorw("parsing LOTUS_RECOVERING_SECTOR_LIMIT", "error", err) } @@ -92,6 +93,31 @@ func (s *WindowPoStScheduler) declareRecoveries(ctx context.Context, dlIdx uint6 continue } + // rules to follow if we have indicated that we don't want to recover more than X sectors in a deadline + if recoveringSectorLimit > 0 { + // something weird happened, break because we can't recover any more + if recoveringSectorLimit < totalSectorsToRecover { + log.Warnf("accepted more recoveries (%d) than recoveringSectorLimit (%d)", totalSectorsToRecover, recoveringSectorLimit) + break + } + + maxNewRecoverable := recoveringSectorLimit - totalSectorsToRecover + + // we need to trim the recover bitfield + if recoveredCount > maxNewRecoverable { + recoverySlice, err := recovered.All(math.MaxUint64) + if err != nil { + log.Errorw("failed to slice recovery bitfield, breaking out of recovery loop", err) + break + } + + log.Warnf("only adding %d sectors to respect recoveringSectorLimit %d", maxNewRecoverable, recoveringSectorLimit) + + recovered = bitfield.NewFromSet(recoverySlice[0:maxNewRecoverable]) + recoveredCount = maxNewRecoverable + } + } + // respect user config if set if s.maxPartitionsPerRecoveryMessage > 0 && len(batchedRecoveryDecls[len(batchedRecoveryDecls)-1]) >= s.maxPartitionsPerRecoveryMessage { @@ -106,7 +132,7 @@ func (s *WindowPoStScheduler) declareRecoveries(ctx context.Context, dlIdx uint6 totalSectorsToRecover += recoveredCount - if recoveringSectorLimit > 0 && int64(totalSectorsToRecover) >= recoveringSectorLimit { + if recoveringSectorLimit > 0 && totalSectorsToRecover >= recoveringSectorLimit { log.Errorf("reached recovering sector limit %d, only marking %d sectors for recovery now", recoveringSectorLimit, totalSectorsToRecover) From 784926b2b4f760bf35dc70a72427e61109ecb402 Mon Sep 17 00:00:00 2001 From: Aayush Date: Tue, 2 Aug 2022 15:28:43 -0400 Subject: [PATCH 09/11] add a test for Post max sectors recovery --- ...k_config_test.go => wdpost_config_test.go} | 114 ++++++++++++++++++ storage/wdpost/wdpost_run_faults.go | 20 +-- 2 files changed, 124 insertions(+), 10 deletions(-) rename itests/{wdpost_check_config_test.go => wdpost_config_test.go} (61%) diff --git a/itests/wdpost_check_config_test.go b/itests/wdpost_config_test.go similarity index 61% rename from itests/wdpost_check_config_test.go rename to itests/wdpost_config_test.go index cc10af04f..61b64387d 100644 --- a/itests/wdpost_check_config_test.go +++ b/itests/wdpost_config_test.go @@ -186,3 +186,117 @@ func TestWindowPostNoPreChecks(t *testing.T) { sectors = p.MinerPower.RawBytePower.Uint64() / uint64(ssz) require.Equal(t, nSectors+kit.DefaultPresealsPerBootstrapMiner-2+1, int(sectors)) // -2 not recovered sectors + 1 just pledged } + +func TestWindowPostMaxSectorsRecoveryConfig(t *testing.T) { + oldVal := wdpost.RecoveringSectorLimit + defer func() { + wdpost.RecoveringSectorLimit = oldVal + }() + wdpost.RecoveringSectorLimit = 1 + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + client, miner, ens := kit.EnsembleMinimal(t, + kit.LatestActorsAt(-1), + kit.MockProofs()) + ens.InterconnectAll().BeginMining(2 * time.Millisecond) + + nSectors := 10 + + miner.PledgeSectors(ctx, nSectors, 0, nil) + + maddr, err := miner.ActorAddress(ctx) + require.NoError(t, err) + di, err := client.StateMinerProvingDeadline(ctx, maddr, types.EmptyTSK) + require.NoError(t, err) + + mid, err := address.IDFromAddress(maddr) + require.NoError(t, err) + + t.Log("Running one proving period") + waitUntil := di.Open + di.WPoStProvingPeriod + t.Logf("End for head.Height > %d", waitUntil) + + ts := client.WaitTillChain(ctx, kit.HeightAtLeast(waitUntil)) + t.Logf("Now head.Height = %d", ts.Height()) + + p, err := client.StateMinerPower(ctx, maddr, types.EmptyTSK) + require.NoError(t, err) + + ssz, err := miner.ActorSectorSize(ctx, maddr) + require.NoError(t, err) + + require.Equal(t, p.MinerPower, p.TotalPower) + require.Equal(t, p.MinerPower.RawBytePower, types.NewInt(uint64(ssz)*uint64(nSectors+kit.DefaultPresealsPerBootstrapMiner))) + + t.Log("Drop some sectors") + + // Drop 2 sectors from deadline 2 partition 0 (full partition / deadline) + parts, err := client.StateMinerPartitions(ctx, maddr, 2, types.EmptyTSK) + require.NoError(t, err) + require.Greater(t, len(parts), 0) + + secs := parts[0].AllSectors + n, err := secs.Count() + require.NoError(t, err) + require.Equal(t, uint64(2), n) + + // Drop the partition + err = secs.ForEach(func(sid uint64) error { + return miner.StorageMiner.(*impl.StorageMinerAPI).IStorageMgr.(*mock.SectorMgr).MarkFailed(storiface.SectorRef{ + ID: abi.SectorID{ + Miner: abi.ActorID(mid), + Number: abi.SectorNumber(sid), + }, + }, true) + }) + require.NoError(t, err) + + di, err = client.StateMinerProvingDeadline(ctx, maddr, types.EmptyTSK) + require.NoError(t, err) + + t.Log("Go through another PP, wait for sectors to become faulty") + waitUntil = di.Open + di.WPoStProvingPeriod + t.Logf("End for head.Height > %d", waitUntil) + + ts = client.WaitTillChain(ctx, kit.HeightAtLeast(waitUntil)) + t.Logf("Now head.Height = %d", ts.Height()) + + p, err = client.StateMinerPower(ctx, maddr, types.EmptyTSK) + require.NoError(t, err) + + require.Equal(t, p.MinerPower, p.TotalPower) + + sectors := p.MinerPower.RawBytePower.Uint64() / uint64(ssz) + require.Equal(t, nSectors+kit.DefaultPresealsPerBootstrapMiner-2, int(sectors)) // -2 just removed sectors + + t.Log("Make the sectors recoverable") + + err = secs.ForEach(func(sid uint64) error { + return miner.StorageMiner.(*impl.StorageMinerAPI).IStorageMgr.(*mock.SectorMgr).MarkFailed(storiface.SectorRef{ + ID: abi.SectorID{ + Miner: abi.ActorID(mid), + Number: abi.SectorNumber(sid), + }, + }, false) + }) + require.NoError(t, err) + + di, err = client.StateMinerProvingDeadline(ctx, maddr, types.EmptyTSK) + require.NoError(t, err) + + waitUntil = di.Open + di.WPoStProvingPeriod + 200 + t.Logf("End for head.Height > %d", waitUntil) + + ts = client.WaitTillChain(ctx, kit.HeightAtLeast(waitUntil)) + t.Logf("Now head.Height = %d", ts.Height()) + + p, err = client.StateMinerPower(ctx, maddr, types.EmptyTSK) + require.NoError(t, err) + + require.Equal(t, p.MinerPower, p.TotalPower) + + sectors = p.MinerPower.RawBytePower.Uint64() / uint64(ssz) + require.Equal(t, nSectors+kit.DefaultPresealsPerBootstrapMiner-1, int(sectors)) // -1 not recovered sector +} diff --git a/storage/wdpost/wdpost_run_faults.go b/storage/wdpost/wdpost_run_faults.go index 59cb9b441..22186b551 100644 --- a/storage/wdpost/wdpost_run_faults.go +++ b/storage/wdpost/wdpost_run_faults.go @@ -22,12 +22,12 @@ import ( "github.com/filecoin-project/lotus/chain/types" ) -var recoveringSectorLimit uint64 = 0 +var RecoveringSectorLimit uint64 = 0 func init() { if rcl := os.Getenv("LOTUS_RECOVERING_SECTOR_LIMIT"); rcl != "" { var err error - recoveringSectorLimit, err = strconv.ParseUint(rcl, 10, 64) + RecoveringSectorLimit, err = strconv.ParseUint(rcl, 10, 64) if err != nil { log.Errorw("parsing LOTUS_RECOVERING_SECTOR_LIMIT", "error", err) } @@ -94,14 +94,14 @@ func (s *WindowPoStScheduler) declareRecoveries(ctx context.Context, dlIdx uint6 } // rules to follow if we have indicated that we don't want to recover more than X sectors in a deadline - if recoveringSectorLimit > 0 { + if RecoveringSectorLimit > 0 { // something weird happened, break because we can't recover any more - if recoveringSectorLimit < totalSectorsToRecover { - log.Warnf("accepted more recoveries (%d) than recoveringSectorLimit (%d)", totalSectorsToRecover, recoveringSectorLimit) + if RecoveringSectorLimit < totalSectorsToRecover { + log.Warnf("accepted more recoveries (%d) than RecoveringSectorLimit (%d)", totalSectorsToRecover, RecoveringSectorLimit) break } - maxNewRecoverable := recoveringSectorLimit - totalSectorsToRecover + maxNewRecoverable := RecoveringSectorLimit - totalSectorsToRecover // we need to trim the recover bitfield if recoveredCount > maxNewRecoverable { @@ -111,9 +111,9 @@ func (s *WindowPoStScheduler) declareRecoveries(ctx context.Context, dlIdx uint6 break } - log.Warnf("only adding %d sectors to respect recoveringSectorLimit %d", maxNewRecoverable, recoveringSectorLimit) + log.Warnf("only adding %d sectors to respect RecoveringSectorLimit %d", maxNewRecoverable, RecoveringSectorLimit) - recovered = bitfield.NewFromSet(recoverySlice[0:maxNewRecoverable]) + recovered = bitfield.NewFromSet(recoverySlice[:maxNewRecoverable]) recoveredCount = maxNewRecoverable } } @@ -132,9 +132,9 @@ func (s *WindowPoStScheduler) declareRecoveries(ctx context.Context, dlIdx uint6 totalSectorsToRecover += recoveredCount - if recoveringSectorLimit > 0 && totalSectorsToRecover >= recoveringSectorLimit { + if RecoveringSectorLimit > 0 && totalSectorsToRecover >= RecoveringSectorLimit { log.Errorf("reached recovering sector limit %d, only marking %d sectors for recovery now", - recoveringSectorLimit, + RecoveringSectorLimit, totalSectorsToRecover) break } From 1b45f42d70df8168141d7cbf933f9863f5485dfa Mon Sep 17 00:00:00 2001 From: Aayush Date: Tue, 2 Aug 2022 15:55:04 -0400 Subject: [PATCH 10/11] fix makegen --- .circleci/config.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index afd8494af..b2f9dbbf1 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -990,9 +990,9 @@ workflows: target: "./itests/verifreg_test.go" - test: - name: test-itest-wdpost_check_config - suite: itest-wdpost_check_config - target: "./itests/wdpost_check_config_test.go" + name: test-itest-wdpost_config + suite: itest-wdpost_config + target: "./itests/wdpost_config_test.go" - test: name: test-itest-wdpost_dispute From 468a4ff2ac20126021d259945976b2d8d87b1bbc Mon Sep 17 00:00:00 2001 From: Aayush Date: Tue, 2 Aug 2022 17:27:28 -0400 Subject: [PATCH 11/11] feat: build: run fiximports on make actors-gen --- Makefile | 7 +++++-- build/openrpc/full.json.gz | Bin 28036 -> 28040 bytes build/openrpc/gateway.json.gz | Bin 4893 -> 4894 bytes build/openrpc/miner.json.gz | Bin 14241 -> 14241 bytes build/openrpc/worker.json.gz | Bin 4764 -> 4763 bytes 5 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 21a278c80..c3788d5a9 100644 --- a/Makefile +++ b/Makefile @@ -302,11 +302,14 @@ type-gen: api-gen method-gen: api-gen (cd ./lotuspond/front/src/chain && $(GOCC) run ./methodgen.go) -actors-gen: +actors-code-gen: $(GOCC) run ./gen/inline-gen . gen/inlinegen-data.json $(GOCC) run ./chain/actors/agen $(GOCC) fmt ./... +actors-gen: actors-code-gen fiximports +.PHONY: actors-gen + bundle-gen: $(GOCC) run ./gen/bundle $(GOCC) fmt ./build/... @@ -364,7 +367,7 @@ docsgen-openrpc-gateway: docsgen-openrpc-bin fiximports: ./scripts/fiximports -gen: actors-gen type-gen method-gen cfgdoc-gen docsgen api-gen circleci bundle-gen fiximports +gen: actors-code-gen type-gen method-gen cfgdoc-gen docsgen api-gen circleci bundle-gen fiximports @echo ">>> IF YOU'VE MODIFIED THE CLI OR CONFIG, REMEMBER TO ALSO MAKE docsgen-cli" .PHONY: gen diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 8ff1c06f49e820c252d2fdfa2b178936125e60b0..397c8a4dde825decb89389047e04c2eec3e327ee 100644 GIT binary patch delta 27239 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%0AJ#}`9lB9mVJ16Hth8)qu! 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 delta 27185 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 W|B_zGe*Yf;0RR6Pr#2sYbp-%-=D3Xj diff --git a/build/openrpc/gateway.json.gz b/build/openrpc/gateway.json.gz index e91b9161da5aaeccd7ee95dbdb60ff35af281b73..3e1b629d93560aef26c9cbdac0ed021156ab2c6e 100644 GIT binary patch delta 2886 zcmV-M3%T^2CY~m+N(6t?;%h4QAx|NOKC0|JM%{D#M(!(eO!`}&kar20imMnw+o+Sc zoZ)@DhPfVyjFPMal6tG+e+cD>1J||8(0^I{dJEBb!pwearE&MDD8Ab+r}$V0R;2i- zyF#Qye9Wl53i(G(H%k7?={C`kKW_roJ35je*dpPye61p#o~+eO?f_7T*}8ibNhqsT@YnAe+BXS2UkSg!@Ma11c@>46Swo|j8@*hrmlyPwL9hH~ zwKf*cLRRlpTcP#DBL27Ezguz4?W}A|{fel89SGO&+%H+Uct3 zt_x^Gak zh8V}G*>73qMM%H-+Ts-WpM5^%{pzxQIhdliB}P#~1v$Lk<(Hk;6EdvXoUP=MS)$bE^l zPJ^`dRL_!o@)S+@ZpLHZfzXte)kw@nVm1=+qsk4OZQZ^qX}_rM)c<~Tn3>9jg)dG5svpcz^vjCiVE3p2;bYGi<+vU-GYBI z1EGLCh3vp)MEhiLqVsx2c$9}5LRzU!;vqM3t}wlb#@23Z?R!64l+S*tmrC`8qH9Vv za~W7zS!!d@q||pg+@q-hDo1b9H@K+XqZOk-ua|NT^<&dBuL_D!gi`iB^4U4UkXCbW zmfh70@qhiU8{S!tQkvnkc7P|bn!0}-i)lo-PQK8pfJt5p1$-_vxO!U8V^2HTD=4NR zIEs*~z&ksxCS0P<_Zv%&N4?8Pvb3_swryxp|&jG!Htm1*1EQB>v zCS*`6rC*|TS;B+qo~UKIwq!POIRgqa<-I8KGbtZa=LdmnA4=yLkNl*>O>HRe<7c6os-h>gJ-Xc?+tg zFkayE&Nke3dUv$p)`(_};Omkta*Bh=?^MJxpDFRh<(%P;ZEpRGs=?Fc9&o?i>UP44 z255w!6V5PN_K}MqX7bUZc;A0pe)b*=p(~b>lW2E>o#cavUk4P~Z~$raGE_d3<`81EWdn1?Y9wY64I0fd zjnW!3JgC%5;=}u_O;T4wuw8JQ}kHM_A{o*>unR9g_=2!QZU*F%4JaWaQFUr>p&mj7-|cmG_Fr}Py1RRc4uG=o>xs6$ z*xWxN*oW8;{5K$Q*@+80pMRYyCpHQ|spzRJ!Z&udUB;;dw9GhLm-uk`YXV#s;_-j-N$Bw&1&oYFi)UX#*C-q$ zW~0dG{t`J&oWn$eWTypu;bIlMd{4;L5ZG7ANgPAl1)_#QVm`XQ{Bns({=2}BQq#n@ zQ0b9Cu5yPQM5y$QC_tsDpb(|)6q(eNT;zf;t=~5$A?2PKidFBKr0A#To9~nr(D(q^ z4WUK8?JJa!01|Od6?H?wKqp zIqR7u-l=#d$x>>YJrEoxr|9Nh-SeT{6*)9d;og7gomXWQA1)!F_T=2xzI`CsThU$& z1^D6uINnb+egxKPvDc(={Svfl^CV@&>Q+b=GGO6g8eM_o(+UME!$_lrLB(77)DyK3h zAn5r0TsMf$LcAALrF=0(7}BWaM;vMsrHy~j#KbmfNha4@+ai+>DyWbqhC4GA_BUWA zG?ggViis33bk@u%Zm44PB*>}1Z<&{(S}YkwNzlNB&PGr2iIb($AdC+FiIR^6!cmt@DdLEy5lKWgh&jo)r zbOeeHq`m3*O&XeL`3}xQgyFz-HH{$|6)I-L0+&)6wgRWG2AodImXWM|jxUS*svuII zsR9_Jei=cAlC;yxvSd;fghYdCN81)mtlE6R<(i?!1j$$H9ZMgTspfJ0)3#jq%W8tf z=n|)K`JeA_(Vf*PU0=sQs>Q{X5XS7`xaTjE(rY2 zf)Kq;R0wKzTbkXLX1Ar;ZE1E}>SUg^3#tcJOyw?4-+pd9I~bfPWM{9=$XGcig69x0GgHzso(Cl_j)bMJPfY_g)W$z{a!~mEGhw1 z;dgm3#h}sxcmeZ262|KkRBQSIT(@!+g*N(6ts$JbQsL!LqmeN@?djJoIejoeq{nDn zIm7#Q4RbvZ86{Zgqi);O5^TPQG92=oZ@30SdrqR z?h26-@iC+JD&!wE-6;7lr`tqF{=5lT@90Q^V2gy)^0kU|dIEo;06ovSv85YZnm#@= zv)3wDx&uHVX6x=%B%!QU!C${?Xx}98d?ow>!Gu|8B)Gx35~UjtJ>`;lFB;x;2L?iQI&^J97bmjIS8mc&S2~OR(6nVAjjj{LdIE~#RkvJG z6l~5ZstO;`TTxk5*(4P$H@Zo*m~-81_C}^@Z{IXq%XcR^_Ii_L22Ov!qar;I=bI3n zF_b?cH{-GIKxj(KY9wYOF&l~bs3m5%wOb-F-va;R@Mk44DY~xSgBlXzu9SNMSiZ0m zsMHmAi|N(P9c{LdYPN;M2{eP*=;3OK!$*>4!}~#iAGpkDzbca%5IEH&1_aI~lKeTG z&DllKteV9BC!q~HWk<6z2RH))bqkYh3N?Rv1(%kE41Nql1Y9Er(j(%!fI$k}LlR&| z`xwYdfMpev2EcKkGeFRWm*|%`7b0qe*zU{>)6MTP7)gzxRpMNL)FZb5&U zflxr6LUv#?qJ1(r(Rn>1Jj%ljA+6LV@sJxiSD0QzV{13I_Pw7i%4fgSOQrfk(KRKT zxeP3;6E0Eb`;8^XquymCSz1|R+cvgs6Gwh8R`Ebh7Q&h- z6Edik(l61vEMY=!r!N50>uaQ7BL(jtpU97Ni-O4CN26PeQ|)kb1_inhmR~|8 z*)aO5x`W7+su$yyC{pS0)`AkXr{@*5Q^@8bP{9noIgO`kM-1`yIS z?%%gN$K7{?d^!C!`}KeB@Bd!IxBp?@>F$9~KmY5{{xW-e_~x?n);}SqpJw#@{q?*5 zu#st*Vf`Xb*oBuLd_mYDHv@9X29%JIs5-T`P!FMk@AkSo`>(ot-QB%J2S8c)^+a1= zZ0;Ws>_hAa{u>au?8F70&%aKU6B`AfRPKF5^@JTIqjKdK$JwJi612NK@Oq ziYV-Nc5*TasNlSeGBo=yNl~d|MU>_6-IL4N*y$9Uw05^wo2BY6$=;q%6a1omyI6s$9!{R9n zxE1=n1^zk0(W8IxYB)U$AkjbTL0hQ>X+X|QSXX%@kx+3vM1q$@@xxuoW7Ch_g31Mw zVxZ(2;qfs9j*D=`UHBY8YwFAp#+JJ0pBjDB+B37ZMvpdn^d9x-k{z;oH1SR;(LSIQ zVwQH+DI!i7QC&Pc!w#GY$M~ZM@#6WBOMJNeH36;*@pymvB=mTX0!Buo#j`J=YZML= zvr*)8e~FwX&S9cKveN>-aIp$rz9-~r2<)rmB#xo&0#U;tF&|xDez`;?|6SlmscGU{ zsPsr6SGhwDB2@ZD6rj>nP>9lYicD%sE^@(_*6$mWkaEuq#j5vAQuNdF&3k19G(JFf zL+Djp+rEE_)sY0Dey(D1MP(AeN;@OjT;&4LWDosKhs+9_vlb6mhZj&q@eQh(c6W4s zez$TmPfZ2SPFd}W3kV#sPhCakEPAi$-W){R*X5U&Cx_gePb06Q+>vQKlSZnQdnQXt z&Uz+^cPgGqvXt6p4+O`_DZ05=_k3t~MGnnVxOabg=T%w7hf4^kJvsNaZy!kZR!SoOvd^P*HVqt zTv+udFRUu7(3BJhcUa`A-D+Av@es$Au74#x5_XKzq?rFo&{W~_w^XhY<9X zCUk#!i$CYmH~(UbQ{aCNbA0x1v&^>;jVG*HSTyddc3H;a z3+Wj|(wERVA-4EviuY4~R?g0fNuW~JRNm&POe#8N-;%1H_Ib9wvcfGQiR%=y%Bjo= z2s(a0*A1ex5bp(5DPK$xhBRvV5r^7DY2$x0F|kcrlF9Yfw#ejz3M!$#R33BT1Tjr&x7E4A^5;Sn3v(b}$;$*3G2=u^a=vppoZ;Pp2z2%U4ylZGZ*zJv1+VK{JIO=Cz#g^C%mz@?Oit-$H40jJZlWh85#}P(Y6H>t2SS7xn`&_LGsml$I?e-s(D=hv@O^DvYKEq zy2NQ*{wSzcd@v8tn)_FwH4`zkQeuC5-W)b(vKFkcNz!Y!!tT-ROEX2*-pgsx+_shy zio30{l3`x}VpaEkqP|6kn;+2X7k6XvAVq60^fTkrw>bJY?yQ55ucKp$q0_zt_QT#-uC5%UCl3zJx(#cv>u)o`2m= jNYpOe)7%cfX};|4nzy&#Z~qM!00960FmGmRZSepA6jhtv diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 0eca81421af2b1f2f98bba3d75c83fc6edbe9a23..ecdae43d9efbdb31fd9dbc6c22bf70216a33c263 100644 GIT binary patch delta 8634 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

kId(MGQS@EjV{@46cW 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 M|3z7LyV%?a;NeVdw-hc#N%PdM5#* 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 O0RR7T+fejj!vX-&-1D{o diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 4a724cbe9ccc7a271d529efa3654984da858be2a..48960d619d9c05a2b27b89cbe39fcba612ade8a1 100644 GIT binary patch delta 2663 zcmV-t3YhhrC7UI%4g&$PlMe$u0=i0*P6IrDsoi{4`VCQI&Z$U#9^TkP`Z<$;%?SPA z!}jF`r1S7`Jo50-@H_siZ6Z$U;0xOnafo_CgdRlbp#mXFYJPLnt_EJ0jVxqsw360I z9)cDoGbtvNM_vC(opFMgho~mk!hS$|3nkd5V4JUvZE9)(MZg4F_$RtVj)e_)?U;~% z@~&9qmchS#v3+w1$&8x{RLJQhGVfG;s%+I1+_t`O=Ik)jRIU- zW~u^Q1-J@u72tY2aP8^&;Q9p-%b8O53CMIToO=NW} zmKMbZdwb$Q;~trtT3Bbj2auQmg0C#q9D4IkG8q3PoiaU#)0H~;2@M3bN6(!1R~pp% zbfS6pXyN>0|M<7FT-gifpUGm1R#Q!%Vr{wVFPBJHA9QIg;?x4s1)>Lt-tUzo`Zr8W z`|-lQqI*L5wt%v2ZkK3=nT*JPWGQ_=>*F|k_mOD>18zr4Or7T5 z*vK}zm>M;>2T)NOSu5V5^HnF{SIGCG_Eb6>Mm}}}C$j$_%7b zWGP(j3icuHJ@1bdTQ^E&k!aIrm7)ysJ}hNoVb+j-tkdIBrLw3qpQ2aM-l{r-7^V9K zFrm#^ld9EVOubxBkOYNl8yr48e)u4@=Bt%*CYpww5>A?vvTU214#sBqb zMOjkme~6|0@71TdLH=t?j{f!GgRkoM*l}1}ZVJim9VcT=%Ck?#YBm>d+mp0FCieSg zf(dk2zY@bXnK?7x>7l+J^C*#_=glfN{SotK?IXTv=lI%)@Swkw&jwKe2eTmuO9TPK zlWhw|e^*BNxOM^Q+~Y(vKTrMz5An-g=@XvjDj!M-|}>J!+5LrIptAv~MY;EsmhZ39|< zMVX5t#*ke3akoI5*`L&Q55K`EDmHH#wyh-Ze{FcTPosY@v}W zf2wxl|LZU_ty^ej59l&j)DEsN%g$VO+FH5<-g%>e&CVE`{!p-%6fMdn^qm@I3IP2jTXJwzyTbsn;&CqbGCBThzG1~g3=af0fsqHS12_`E5!QaRYfCPfEe{CWIynCEuV-7GeF>4~LW3jX-HrU$}2O9Ut z+|)w-P!A*~fZ!`jHHY53lbqz%bD3p~1BJAzhKoJL$h2c*vNv0bkvZbXi0G1tF1@zs zlCD-|!&w05Wy5OCY*+?PFP1l~>u*S~WkH|ccn1?^_4x?1nnRdb69s8*iR}y0fBeP? zfFR8;U}OYoZtKYOO3)_{ysNFRWN)WWE`MaCuJJm4!TtsNf645>r{%N%OJpJFp=*D0 zKQcL)e=0XG>yNLtUP3bC-87Y|z9|BqZKc>e)iQH!17Xi-bJbk~e@>?!qHLs8U6!u! zPZa##e|0}9u}ZfG^*!slyZ~4Mf3U9&VEcLzz%J|u-u=iyrXo0n6C6Uq`RDfmJm#Y# zD>uUSMRPb27ELd26id=2&a8e|>_pw!{8g z##s}3T$Qm#992_g$<>ZCvfIUL%(%%(KkmvcU%j~g_k3oeJqMMHvB|sQ9BWEbke}== zvBE6CzZCql7E*2J`lrVae;=CJnZDQV^RlJdQfq(Vt<5ff3O08vHdk@&a|<379ph$Q zrl#Rwe5lUyIKA<!kgxu^q=GHGlih?#l|4Ym!eq(GxzA~g{hC@}D~VW3uUCfhARY;~e8*0?e`8i)Vh>I%R<}6e?v0#q*V7A5xVu91SK?~}x7|b;iwNVywylzn z4z>jx`r$!Bl#-7RwiPa*d+z}{N0C)P51`=PX=EK8@P|zSokR8y_JD^d#bkC%7H|b9 zyhi|nDS8ARGHhacfZBk$cQ}I-u|FvE?g3MGb7|H1sRQfPe@aHhG&IHcmFx?eViH{%UP(+2wKb`dVV#*trvxw9V_optxk&8yhdl5Sy8*goAV5R zvU#cs4L?M~e+LC0Sh6t*7{DG19%QUdzk}lHQ16XkLc8CDb`J}_aE!);_x^`XzWgch z0y;O@fxq+o+)wMWiSef7lBw~I;<+Zw@s{KpLX-lW+%6SGLm;?p;NXeyj#gwwWOw>1 z0k_Dmn3hJSb@t@%wB7fbwpSiH8WntY6zm%IS2sDWec;w-u;dlI3+eDny!56kE;t=(O2tA0QQjkGlSoI^zT}4^d67h5dl`7D}*9!8TtT+tic-ihv2U@K1D!919!p+A$%2 zV2yc=iWHh_ly2O+8=XB~J%0^1nWyud1 z`M=l6ISB3!ZL!P&xccp=xoW@n5|PM|HU zzA4NtYp;OcmKk#!;5XFk-O+B}NC*YzCL$D1aZcoWj7{LO>ODj#bI=~LrYAv~2`00^ z;0OiKG+pF*$OL#(S_hm{=GLdSyFezGtN;Xm2b*?f0KwQckpbR4&ap8En3$M5inZmczg!|+ebA+~h*Jwh7l zin65A{}4<0->Xk^gZ$S^9R2IV2Vd3ivE#6|+!T`AJ5I)$lxLre)od=_wkK(UOzii~ z1QY14ekF!&GIM6W(?fkd=20R;&zn_l`XlDe+DClT&hfPo;eo!B&jwKed$S=2O9TP^ zlWhw|e`nf}hiey*&OJ^<^Yi3i@DRVuC&UAmx(uEC(n{}`$}N%$o+61Gx#*!lz|xD3 zlIbeltm3vAfZEU3ilH>L5}d0NhVgAXz?WOMzyodBx{ z*i-Q6w;Fgsei_Wd8|ut3p|t{!b40>)x5NqR10IDg^=`?5o@CSL%<#nDRJekw5?g5G ze~PNz`2RZ0OdS=P*#o)^7PW&b%(63=owk-Pfp^|$V6!vErhjeZ_O~AW=A1s}2-MUx zGQaK5dLyKmR=%uhWvJ7;XOX!V6(-9XV-vWndJhrGT%Cuk=}C}g!ibX*mH|!EMV^OD zfH$Rez&T|Oa%#H^WP-^GK=3zm10aE5e{7q`0Ph~>*q8%MOw5|d>R2o-iVgPm#DT^= zGB>qQKhy(>2_X2&Qq7?^?<6O=^;~8d<3J&;s^MZ!F*5BKne5G$Vq}guG9tPpqD!wW zx}+;r*>D!XdD*a9GaHtH(~IQ|>-rlKY+2CfH{QX7S$#gjtmY7A)A^w z0w7593m6$en%g=uy%O}v1Mh0X!U+x`;r#Ra03P$v zkrk2;iag*Kio&YS$Gd3X@+tU}&XLQt#i9%Vu$DwSk? zmT}gE9#>_o5l7WjS@JWFgHEm^{IoyojZ0D*=*#R*6&zS_V8MY8hUuZ657So&T4Vn@ z0^W_5v7EdR9k54eUHZF%3GzIDb(uZ(F%lXSKcGwsJ&otd=f8j$jJJa{teO|UyTWakuytUcoPr>Gn#pWumeQv>{qGQ~w z%hWU+j1SdW9;Y|nR?at~@owPBS!d8ikaI!KUotr#^>&eS-hH33oco`e5%SePmvnDF z-Pq2}WCKM2tz{P41`eI4$S;vs3d9qL_sS5jrxctM#oYRZi}sI5e{D0@6qGt_IVmYp zlVF%=cs#x&FtH^z+y+d1192r0X%XvYf~W|hQV&t-799MQfZTm%=iAKtPtdoRzuz2v zE5oxe6ERb7p~1F+l@w_7OQa?O0|f@YHVjk?&cxgAFucQ0!E5UHyItqr{f_TZ>MTDQ zOqLXE4#Xqjmhadpe|O9ZOzgpl#p)I(+`W+#?s{6m33peB{z`mp;I^A6V-aDT*tS*j z(ZRNWLq9x7h*I+L!M4H$bniVt=P0rY=m8YGJB_TP1OBinpmWIn!5;7srI^fa$pWqb zh4%w_?Dou z&GZV+!3n=&`DmK{Nw&O(lgwQ_-EuLRmDx|SoP&)hBUZ5`)iy8kqeGPtB5~GnoriV3 zIj!y&eBb>S^zJ_gzK>I*V>t`889|FVM9;4#xb>n?vt#8Qs?|x+n%C$|Gb?I$cypfN zPc~0gq2Y&UfB2x_14}k00Rz}W!Gnyo>32|E9qPRiOlbF;(C%Tu7mm@G@ZSHh$(KI` zUO?w2JMed&pZjTDHZk6mTrxG@Q9Rd#Io^_dLx@sZ zCEym>71Pqlw9cOVowoa4)Aq_kN27wzj)Gmo{^};DfAz$2?!RzyO&n;N$o#aT=$x47 z$L9N^=#5{&75<6*?~Zc!hV=G45I)v|rj}ijog}_C66-G&*IzP*(cJZ7imqrwecwyQ zc79rvG2{kYqSn!j>^DQNZnIAI`x|j8q&P}ltW}D&%DM<=Un%&MCbVTvvKi*epQvrz zLowA0c9WFQyf6h9yW2|D$c21GUA2AQ5RPiyp|0$Wq%Bp*Zoy9XZxGXeEis~;D!Iv* ztCWQyuuZl@BVh6R^VM%#)x@%mdk-uL#TKA*