diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index da17456d22b..cfde8bb42e1 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -4,22 +4,16 @@ on: push: branches: - master + - release/* tags: - v* - pull_request: - branches: - - master - - release/v* - - release/miner/v* - - releases schedule: - cron: '0 0 * * *' workflow_dispatch: inputs: - publish: - description: 'Publish the Docker image' + ref: + description: The GitHub ref (e.g. refs/tags/v1.0.0) to release required: false - default: 'false' defaults: run: @@ -30,7 +24,7 @@ permissions: jobs: docker: - name: Docker (${{ matrix.image }} / ${{ matrix.network }}) [publish=${{ github.event.inputs.publish == 'true' || github.event_name != 'pull_request' }}] + name: Docker (${{ matrix.image }} / ${{ matrix.network }}) [publish=${{ (inputs.ref || github.ref) == 'refs/heads/master' || startsWith(inputs.ref || github.ref, 'refs/tags/') }}] runs-on: ubuntu-latest strategy: fail-fast: false @@ -46,13 +40,13 @@ jobs: - image: lotus network: mainnet env: - PUBLISH: ${{ github.event.inputs.publish == 'true' || github.event_name != 'pull_request' }} + PUBLISH: ${{ github.ref == 'refs/heads/master' || startsWith(inputs.ref || github.ref, 'refs/tags/') }} steps: - id: channel env: - IS_MASTER: ${{ github.ref == 'refs/heads/master' }} - IS_TAG: ${{ startsWith(github.ref, 'refs/tags/') }} - IS_RC: ${{ contains(github.ref, '-rc') }} + IS_MASTER: ${{ (inputs.ref || github.ref) == 'refs/heads/master' }} + IS_TAG: ${{ startsWith(inputs.ref || github.ref, 'refs/tags/') }} + IS_RC: ${{ contains(inputs.ref || github.ref, '-rc') }} IS_SCHEDULED: ${{ github.event_name == 'schedule' }} run: | channel='' @@ -73,9 +67,12 @@ jobs: - uses: actions/checkout@v4 with: submodules: 'recursive' + ref: ${{ inputs.ref || github.ref }} - id: git + env: + REF: ${{ inputs.ref || github.ref }} run: | - ref="${GITHUB_REF#refs/heads/}" + ref="${REF#refs/heads/}" ref="${ref#refs/tags/}" sha="$(git rev-parse --short HEAD)" echo "ref=$ref" | tee -a "$GITHUB_OUTPUT" @@ -89,7 +86,7 @@ jobs: images: filecoin/${{ matrix.image }} tags: | type=raw,enable=${{ steps.channel.outputs.channel != '' }},value=${{ steps.channel.outputs.channel }} - type=raw,enable=${{ startsWith(github.ref, 'refs/tags/') }},value=${{ steps.git.outputs.ref }} + type=raw,enable=${{ startsWith(inputs.ref || github.ref, 'refs/tags/') }},value=${{ steps.git.outputs.ref }} type=raw,value=${{ steps.git.outputs.sha }} flavor: | latest=false diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4792f8b2f50..12ea6e3f90e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -3,32 +3,15 @@ name: Release on: push: branches: - - release/v* - - release/miner/v* - - releases - paths: - - build/version.go - pull_request: - branches: - - release/v* - - release/miner/v* - - releases - paths: - - build/version.go + - ci/* + - release/* + tags: + - v* workflow_dispatch: inputs: - projects: - description: 'Projects to release (JSON array)' - required: false - default: '[]' ref: - description: 'Ref to buuild the binaries from' - required: false - default: '' - publish: - description: 'Publish the release' + description: The GitHub ref (e.g. refs/tags/v1.0.0) to release required: false - default: 'false' defaults: run: @@ -38,289 +21,121 @@ permissions: contents: read jobs: - check: - name: Check which projects need to be released - runs-on: ubuntu-latest - outputs: - projects: ${{ steps.projects.outputs.projects }} - steps: - - name: Check out lotus - uses: actions/checkout@v4 - with: - fetch-depth: 0 - ref: ${{ github.event.inputs.ref }} - - name: Find projects that need to be released - id: projects - env: - projects: ${{ github.event.inputs.projects }} - run: | - go run cmd/release/main.go --json list-projects | jq -r '.msg' | - jq 'map(select(.version | endswith("-dev") | not))' | - jq 'map(select(.released | not))' | - jq 'map(select( - (env.GITHUB_EVENT_NAME == "push" and ((env.GITHUB_REF == "refs/heads/releases" and .prerelease == false) or (env.GITHUB_REF != "refs/heads/releases" and .prerelease == true))) or - (env.GITHUB_EVENT_NAME == "pull_request" and ((env.GITHUB_BASE_REF == "releases" and .prerelease == false) or (env.GITHUB_BASE_REF != "releases" and .prerelease == true))) or - (env.GITHUB_EVENT_NAME == "workflow_dispatch" and (.name as $name | env.projects | fromjson | index($name) != null)) - ))' | - jq -c '.' | xargs -I {} -0 echo "projects={}" | - tee -a $GITHUB_OUTPUT build: - needs: [check] - if: needs.check.outputs.projects != '[]' - name: Build ${{ matrix.project }} (${{ matrix.runner }}) + name: Build (${{ matrix.os }}/${{ matrix.arch }}) runs-on: ${{ matrix.runner }} strategy: fail-fast: false matrix: - project: ${{ fromJSON(needs.check.outputs.projects).*.name }} - runner: - - ubuntu-latest # Linux X64 - - macos-13 # MacOs X64 - - macos-14 # MacOS ARM64 + include: + - runner: ubuntu-latest + os: Linux + arch: X64 + - runner: macos-13 + os: macOS + arch: X64 + - runner: macos-14 + os: macOS + arch: ARM64 steps: - - name: Print runner information - run: echo "Building on $RUNNER_OS/$RUNNER_ARCH" - - name: Make project config available - id: project - env: - projects: ${{ needs.check.outputs.projects }} - name: ${{ matrix.project }} + - env: + OS: ${{ matrix.os }} + ARCH: ${{ matrix.arch }} run: | - jq -nc 'env.projects | fromjson | map(select(.name == env.name)) | .[0]' | - xargs -I {} -0 echo "config={}" | - tee -a $GITHUB_OUTPUT - - name: Check out lotus - uses: actions/checkout@v4 + if [[ "$OS" != "$RUNNER_OS" || "$ARCH" != "$RUNNER_ARCH" ]]; then + echo "::error title=Unexpected Runner::Expected $OS/$ARCH, got $RUNNER_OS/$RUNNER_ARCH" + exit 1 + fi + - uses: actions/checkout@v4 with: - submodules: 'recursive' - - name: Install system dependencies - uses: ./.github/actions/install-system-dependencies - - name: Install Go - uses: ./.github/actions/install-go - - if: github.event.inputs.ref - uses: actions/checkout@v4 + path: actions + - uses: actions/checkout@v4 with: submodules: 'recursive' - ref: ${{ github.event.inputs.ref }} - - name: Build binaries - env: + ref: ${{ inputs.ref || github.ref }} + path: lotus + - uses: ./actions/.github/actions/install-system-dependencies + - uses: ./actions/.github/actions/install-go + with: + working-directory: lotus + - env: GITHUB_TOKEN: ${{ github.token }} - binaries: ${{ toJSON(fromJSON(steps.project.outputs.config).binaries) }} - run: | - make deps - while read -r binary; do - if [[ -z "$binary" ]]; then - continue - fi - make $binary - done <<< "$(jq -r '.[]' <<< "$binaries")" - - name: Run otool - if: runner.os == 'macOS' - run: if [[ -f lotus ]]; then otool -hv lotus; fi - - name: Verify binary versions - env: - LOTUS_VERSION_IGNORE_COMMIT: 1 - expected: ${{ fromJSON(steps.project.outputs.config).version }} + run: make deps lotus lotus-miner lotus-worker + working-directory: lotus + - if: runner.os == 'macOS' + run: otool -hv lotus + working-directory: lotus + - env: + INPUTS_REF: ${{ inputs.ref }} run: | - for bin in lotus lotus-miner lotus-worker; do - if [[ -f ./$bin ]]; then - chmod +x ./$bin - actual=$(./$bin --version | cut -d' ' -f3) - if [[ "$actual" != "$expected" ]]; then - echo "::error title=Version Mismatch::Expected $expected, got $actual (./$bin)" - exit 1 - fi - fi - done - - name: Upload artifacts - uses: actions/upload-artifact@v4 + export GITHUB_REF=${INPUTS_REF:-$GITHUB_REF} + ../actions/scripts/version-check.sh ./lotus + working-directory: lotus + - uses: actions/upload-artifact@v4 with: - name: lotus-${{ matrix.project }}-${{ runner.os }}-${{ runner.arch }} + name: lotus-${{ matrix.os }}-${{ matrix.arch }} path: | - lotus - lotus-miner - lotus-worker + lotus/lotus + lotus/lotus-miner + lotus/lotus-worker release: - needs: [check, build] - if: needs.check.outputs.projects != '[]' - name: Release ${{ matrix.project }} + name: Release [publish=${{ startsWith(inputs.ref || github.ref, 'refs/tags/') }}] permissions: # This enables the job to create and/or update GitHub releases contents: write runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - project: ${{ fromJSON(needs.check.outputs.projects).*.name }} + needs: [build] + env: + PUBLISH: ${{ startsWith(inputs.ref || github.ref, 'refs/tags/') }} steps: - - name: Make project config available - id: project - env: - projects: ${{ needs.check.outputs.projects }} - name: ${{ matrix.project }} - run: | - jq -nc 'env.projects | fromjson | map(select(.name == env.name)) | .[0]' | - xargs -I {} -0 echo "config={}" | - tee -a $GITHUB_OUTPUT - - name: Check out lotus - uses: actions/checkout@v4 + - uses: actions/checkout@v4 + with: + path: actions + - uses: actions/checkout@v4 with: submodules: 'recursive' fetch-depth: 0 - - name: Download Linux X64 binaries - uses: actions/download-artifact@v4 + path: lotus + ref: ${{ inputs.ref || github.ref }} + - uses: actions/download-artifact@v4 with: - name: lotus-${{ matrix.project }}-Linux-X64 + name: lotus-Linux-X64 path: linux_amd64_v1 - - name: Download macOS X64 binaries - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@v4 with: - name: lotus-${{ matrix.project }}-macOS-X64 + name: lotus-macOS-X64 path: darwin_amd64_v1 - - name: Download macOS ARM64 binaries - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@v4 with: - name: lotus-${{ matrix.project }}-macOS-ARM64 + name: lotus-macOS-ARM64 path: darwin_arm64 - - name: Install Go (release body & archives generation dependency) - uses: ./.github/actions/install-go - - name: Install makefat (archives generation dependency) - run: go install github.com/randall77/makefat@7ddd0e42c8442593c87c1705a5545099604008e5 - - name: Generate archives - env: - prefix: ${{ matrix.project == 'node' && 'lotus' || format('lotus-{0}', matrix.project) }} - version: ${{ fromJSON(steps.project.outputs.config).version }} - binaries: ${{ toJSON(fromJSON(steps.project.outputs.config).binaries) }} - run: | - mkdir darwin_all - while read -r binary; do - if [[ -z "$binary" ]]; then - continue - fi - makefat ./darwin_all/$binary ./darwin_amd64_v1/$binary ./darwin_arm64/$binary - done <<< "$(jq -r '.[]' <<< "$binaries")" - mkdir dist - pushd dist - for directory in darwin_all linux_amd64_v1; do - archive_name="${prefix}_v${version}_${directory}" - cp -r ../$directory $archive_name - tar -czf $archive_name.tar.gz $archive_name - rm -r $archive_name - done - popd - ls -la dist - - name: Install Kubo (checksums generation dependency) - uses: ipfs/download-ipfs-distribution-action@v1 + - uses: ./actions/.github/actions/install-go + with: + working-directory: lotus + - uses: ipfs/download-ipfs-distribution-action@v1 with: name: kubo version: v0.16.0 - cache: false - - name: Generate checksums - run: | - ./scripts/generate-checksums.sh - ls -la dist - - name: Install zsh (release body generation dependency) - run: sudo apt update && sudo apt install -y zsh - - name: Generate release body - env: - tag: ${{ fromJSON(steps.project.outputs.config).tag }} - previous: ${{ fromJSON(steps.project.outputs.config).previous }} - current: ${{ github.event.inputs.ref || github.sha }} - run: | - echo "# $tag" > release_body.md - echo "" >> release_body.md - csplit --digits=4 --quiet --elide-empty-files CHANGELOG.md '/^# /' '{*}' - # Checking the files in reverse order to get to the UNRELEASED section last - for file in $(ls -r xx*); do - if grep -q "^# $tag " $file || grep -q "^# UNRELEASED" $file; then - tail -n +3 $file >> release_body.md - break - fi - done - if [[ "$previous" != '' ]]; then - mkdir -p "$(go env GOPATH)/src/github.com/filecoin-project/lotus" - rm -rf "$(go env GOPATH)/src/github.com/filecoin-project/lotus" - ln -s "$(pwd)" "$(go env GOPATH)/src/github.com/filecoin-project/lotus" - ./scripts/mkreleaselog "$previous" "$current" >> release_body.md - fi - cat release_body.md - - name: Find release - id: before - env: - tag: ${{ fromJSON(steps.project.outputs.config).tag }} - GITHUB_TOKEN: ${{ github.token }} - run: | - echo "release< `v0.14.0`) +- github.com/filecoin-project/filecoin-ffi (`v1.27.0-rc2` -> `v1.28.0`) +- github.com/filecoin-project/go-libp2p2 (`v0.35.3` -> `v0.35.4`) +- `ref-fvm4` (as part of `filecoin-ffi`) (`4.2.0` -> `4.3.1`) +- A new `github.com/filecoin-project/go-f3` dependency for F3 soft launch (`v0.0.5`) + +## Others + +- Soft launch of F3 (https://github.com/filecoin-project/lotus/pull/12119) +- NI-PoRep changes (https://github.com/filecoin-project/lotus/pull/12130) +- Fixes for the ETH events API (https://github.com/filecoin-project/lotus/pull/12080) +- Support for legacy Ethereum transactions (https://github.com/filecoin-project/lotus/pull/11969) +- Ignore market balance after nv23 (https://github.com/filecoin-project/lotus/pull/11976) +- Add finality-related params for `eth_getBlockByNumber` (https://github.com/filecoin-project/lotus/pull/12110) +- rename `Actor.Address` to `Actor.DelegatedAddress` and only use it for f4 addresses (https://github.com/filecoin-project/lotus/pull/12155) +- feat:ec: integrate F3 dynamic manifest #12185 +- fix: f3: Fix F3 build parameters for testground target (#12189) ([filecoin-project/lotus#12189](https://github.com/filecoin-project/lotus/pull/12189)) +- fix: eth_getLogs: https://github.com/filecoin-project/lotus/pull/12212 +- chore: lotus-shed: Add support for nv23 in migrate-state cmd #12172 +- feat: F3: Update go-f3, change the style of participation call #12196 +- chore: f3: Upgrade go mod F3 dependency to v0.0.3 tagged release #12216 +- fix: Eth Trace Block: nil access panic #12221 +- chore!: markets: remove stray unixfs constants, features and references #12217 +- chore: metrics: Upgrade to OpenTelemetry v1.28.0 #12223 +- fix: bug: Reduce log level in F3 message sending to Debug #12224 +- [skip changelog] chore: config: yet more lp2p removal from miner #12252 +- fix(store): correctly break weight ties based on smaller ticket #12253 +- fix: exchange bug #12275 +- chore: deps: Update GST, Filecoin-FFI and Actors to final versions NV23 #12276 +- metrics: f3: Set up otel metrics reporting to prometheus #12285 +- Upgrade to go-f3 v0.0.5 #12279 + +# v1.27.1 / 2024-06-24 + +This release, v1.27.1, is an OPTIONAL lotus release. It is HIGHLY RECOMMENDED for node operators that are building Filecoin index off lotus! + +## ☢️ Upgrade Warnings ☢️ + +- This Lotus release completely removes the Legacy Lotus/Lotus-Miner Markets sub-system from the codebase, which was announced to reach EOL on January 31, 2023. +- The **Curio Storage** software, designed to simplify the setup and operation of storage providers, has moved to their own Github-repository: https://github.com/filecoin-project/curio. +- The events subsystem includes some minor correctness fixes and performance improvements. Nodes operators running Lotus with events turned on (off by default) may experience some delay in initial start-up as a minor database migration takes place and the write-ahead log is compacted. See [filecoin-project/lotus#11952](https://github.com/filecoin-project/lotus/pull/11952) and [filecoin-project/lotus#12090](https://github.com/filecoin-project/lotus/pull/12090) for full details. # v1.27.2 / 2024-07-17 @@ -1356,7 +1467,7 @@ Please read carefully through the **upgrade warnings** section if you are upgrad - Starting from this release, the SplitStore feature is automatically activated on new nodes. However, for existing Lotus users, you need to explicitly configure SplitStore by uncommenting the `EnableSplitstore` option in your `config.toml` file. To enable SplitStore, set `EnableSplitstore=true`, and to disable it, set `EnableSplitstore=false`. **It's important to note that your Lotus node will not start unless this configuration is properly set. Set it to false if you are running a full archival node!** - This feature release requires a **minimum Go version of v1.19.7 or higher to successfully build Lotus**. Additionally, Go version v1.20 and higher is now also supported. -- **Storage Providers:** The proofs libraries now have CUDA enabled by default, which requires you to install (CUDA)[https://lotus.filecoin.io/tutorials/lotus-miner/cuda/] if you haven't already done so. If you prefer to use OpenCL on your GPUs instead, you can use the `FFI_USE_OPENCL=1` flag when building from source. On the other hand, if you want to disable GPUs altogether, you can use the `FFI_NO_GPU=1` environment variable when building from source. +- **Storage Providers:** The proofs libraries now have CUDA enabled by default, which requires you to install [CUDA](https://lotus.filecoin.io/tutorials/lotus-miner/cuda/) if you haven't already done so. If you prefer to use OpenCL on your GPUs instead, you can use the `FFI_USE_OPENCL=1` flag when building from source. On the other hand, if you want to disable GPUs altogether, you can use the `FFI_NO_GPU=1` environment variable when building from source. - **Storage Providers:** The `lotus-miner sectors extend` command has been refactored to the functionality of `lotus-miner sectors renew`. - **Exchanges/Node operators/RPC-providers::** Execution traces (returned from `lotus state exec-trace`, `lotus state replay`, etc.), has changed to account for changes introduced by the by the FVM. **Please make sure to read the `Execution trace format change` section carefully, as these are interface breaking changes** - **Syncing issues:** If you have been struggling with syncing issues in normal operations you can try to adjust the amount of threads used for more concurrent FMV execution through via the `LOTUS_FVM_CONCURRENCY` enviroment variable. It is set to 4 threads by default. Recommended formula for concurrency == YOUR_RAM/4 , but max during a network upgrade is 24. If you are a Storage Provider and are pushing many messages within a short period of time, exporting `LOTUS_SKIP_APPLY_TS_MESSAGE_CALL_WITH_GAS=1` will also help with keeping in sync. diff --git a/README.md b/README.md index 561b20166e5..0839e2f6b24 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,6 @@

Project Lotus - 莲

-![example workflow](https://github.com/github/docs/actions/workflows/main.yml/badge.svg) diff --git a/api/api_full.go b/api/api_full.go index 5d2f6d4176e..8def9187d93 100644 --- a/api/api_full.go +++ b/api/api_full.go @@ -11,6 +11,8 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" + "github.com/filecoin-project/go-f3/certs" + "github.com/filecoin-project/go-f3/gpbft" "github.com/filecoin-project/go-jsonrpc" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" @@ -859,6 +861,30 @@ type FullNode interface { // Note: this API is only available via websocket connections. // This is an EXPERIMENTAL API and may be subject to change. SubscribeActorEventsRaw(ctx context.Context, filter *types.ActorEventFilter) (<-chan *types.ActorEvent, error) //perm:read + + //*********************************** ALL F3 APIs below are not stable & subject to change *********************************** + + // F3Participate should be called by a storage provider to participate in signing F3 consensus. + // Calling this API gives the lotus node a lease to sign in F3 on behalf of given SP. + // The lease should be active only on one node. The lease will expire at the newLeaseExpiration. + // To continue participating in F3 with the given node, call F3Participate again before + // the newLeaseExpiration time. + // newLeaseExpiration cannot be further than 5 minutes in the future. + // It is recommended to call F3Participate every 60 seconds + // with newLeaseExpiration set 2min into the future. + // The oldLeaseExpiration has to be set to newLeaseExpiration of the last successful call. + // For the first call to F3Participate, set the oldLeaseExpiration to zero value/time in the past. + // F3Participate will return true if the lease was accepted. + // The minerID has to be the ID address of the miner. + F3Participate(ctx context.Context, minerID address.Address, newLeaseExpiration time.Time, oldLeaseExpiration time.Time) (bool, error) //perm:sign + // F3GetCertificate returns a finality certificate at given instance number + F3GetCertificate(ctx context.Context, instance uint64) (*certs.FinalityCertificate, error) //perm:read + // F3GetLatestCertificate returns the latest finality certificate + F3GetLatestCertificate(ctx context.Context) (*certs.FinalityCertificate, error) //perm:read + // F3GetECPowerTable returns a F3 specific power table for use in standalone F3 nodes. + F3GetECPowerTable(ctx context.Context, tsk types.TipSetKey) (gpbft.PowerEntries, error) //perm:read + // F3GetF3PowerTable returns a F3 specific power table. + F3GetF3PowerTable(ctx context.Context, tsk types.TipSetKey) (gpbft.PowerEntries, error) //perm:read } // reverse interface to the client, called after EthSubscribe diff --git a/api/docgen/docgen.go b/api/docgen/docgen.go index cba7bb6b5b3..b8190ce187a 100644 --- a/api/docgen/docgen.go +++ b/api/docgen/docgen.go @@ -25,6 +25,8 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" + "github.com/filecoin-project/go-f3/certs" + "github.com/filecoin-project/go-f3/gpbft" "github.com/filecoin-project/go-jsonrpc/auth" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/builtin/v9/verifreg" @@ -399,6 +401,8 @@ func init() { FromHeight: epochPtr(1010), ToHeight: epochPtr(1020), }) + addExample(&certs.FinalityCertificate{}) + addExample(gpbft.ActorID(1000)) } func GetAPIType(name, pkg string) (i interface{}, t reflect.Type, permStruct []reflect.Type) { diff --git a/api/mocks/mock_full.go b/api/mocks/mock_full.go index b15eea34111..1cb4f782572 100644 --- a/api/mocks/mock_full.go +++ b/api/mocks/mock_full.go @@ -21,6 +21,8 @@ import ( address "github.com/filecoin-project/go-address" bitfield "github.com/filecoin-project/go-bitfield" + certs "github.com/filecoin-project/go-f3/certs" + gpbft "github.com/filecoin-project/go-f3/gpbft" jsonrpc "github.com/filecoin-project/go-jsonrpc" auth "github.com/filecoin-project/go-jsonrpc/auth" abi "github.com/filecoin-project/go-state-types/abi" @@ -1152,6 +1154,81 @@ func (mr *MockFullNodeMockRecorder) EthUnsubscribe(arg0, arg1 interface{}) *gomo return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthUnsubscribe", reflect.TypeOf((*MockFullNode)(nil).EthUnsubscribe), arg0, arg1) } +// F3GetCertificate mocks base method. +func (m *MockFullNode) F3GetCertificate(arg0 context.Context, arg1 uint64) (*certs.FinalityCertificate, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "F3GetCertificate", arg0, arg1) + ret0, _ := ret[0].(*certs.FinalityCertificate) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// F3GetCertificate indicates an expected call of F3GetCertificate. +func (mr *MockFullNodeMockRecorder) F3GetCertificate(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "F3GetCertificate", reflect.TypeOf((*MockFullNode)(nil).F3GetCertificate), arg0, arg1) +} + +// F3GetECPowerTable mocks base method. +func (m *MockFullNode) F3GetECPowerTable(arg0 context.Context, arg1 types.TipSetKey) (gpbft.PowerEntries, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "F3GetECPowerTable", arg0, arg1) + ret0, _ := ret[0].(gpbft.PowerEntries) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// F3GetECPowerTable indicates an expected call of F3GetECPowerTable. +func (mr *MockFullNodeMockRecorder) F3GetECPowerTable(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "F3GetECPowerTable", reflect.TypeOf((*MockFullNode)(nil).F3GetECPowerTable), arg0, arg1) +} + +// F3GetF3PowerTable mocks base method. +func (m *MockFullNode) F3GetF3PowerTable(arg0 context.Context, arg1 types.TipSetKey) (gpbft.PowerEntries, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "F3GetF3PowerTable", arg0, arg1) + ret0, _ := ret[0].(gpbft.PowerEntries) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// F3GetF3PowerTable indicates an expected call of F3GetF3PowerTable. +func (mr *MockFullNodeMockRecorder) F3GetF3PowerTable(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "F3GetF3PowerTable", reflect.TypeOf((*MockFullNode)(nil).F3GetF3PowerTable), arg0, arg1) +} + +// F3GetLatestCertificate mocks base method. +func (m *MockFullNode) F3GetLatestCertificate(arg0 context.Context) (*certs.FinalityCertificate, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "F3GetLatestCertificate", arg0) + ret0, _ := ret[0].(*certs.FinalityCertificate) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// F3GetLatestCertificate indicates an expected call of F3GetLatestCertificate. +func (mr *MockFullNodeMockRecorder) F3GetLatestCertificate(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "F3GetLatestCertificate", reflect.TypeOf((*MockFullNode)(nil).F3GetLatestCertificate), arg0) +} + +// F3Participate mocks base method. +func (m *MockFullNode) F3Participate(arg0 context.Context, arg1 address.Address, arg2, arg3 time.Time) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "F3Participate", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// F3Participate indicates an expected call of F3Participate. +func (mr *MockFullNodeMockRecorder) F3Participate(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "F3Participate", reflect.TypeOf((*MockFullNode)(nil).F3Participate), arg0, arg1, arg2, arg3) +} + // FilecoinAddressToEthAddress mocks base method. func (m *MockFullNode) FilecoinAddressToEthAddress(arg0 context.Context, arg1 address.Address) (ethtypes.EthAddress, error) { m.ctrl.T.Helper() diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 1881a6f9dac..1783f450e23 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -18,6 +18,8 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" + "github.com/filecoin-project/go-f3/certs" + "github.com/filecoin-project/go-f3/gpbft" "github.com/filecoin-project/go-jsonrpc" "github.com/filecoin-project/go-jsonrpc/auth" "github.com/filecoin-project/go-state-types/abi" @@ -249,6 +251,16 @@ type FullNodeMethods struct { EthUnsubscribe func(p0 context.Context, p1 ethtypes.EthSubscriptionID) (bool, error) `perm:"read"` + F3GetCertificate func(p0 context.Context, p1 uint64) (*certs.FinalityCertificate, error) `perm:"read"` + + F3GetECPowerTable func(p0 context.Context, p1 types.TipSetKey) (gpbft.PowerEntries, error) `perm:"read"` + + F3GetF3PowerTable func(p0 context.Context, p1 types.TipSetKey) (gpbft.PowerEntries, error) `perm:"read"` + + F3GetLatestCertificate func(p0 context.Context) (*certs.FinalityCertificate, error) `perm:"read"` + + F3Participate func(p0 context.Context, p1 address.Address, p2 time.Time, p3 time.Time) (bool, error) `perm:"sign"` + FilecoinAddressToEthAddress func(p0 context.Context, p1 address.Address) (ethtypes.EthAddress, error) `perm:"read"` GasEstimateFeeCap func(p0 context.Context, p1 *types.Message, p2 int64, p3 types.TipSetKey) (types.BigInt, error) `perm:"read"` @@ -2063,6 +2075,61 @@ func (s *FullNodeStub) EthUnsubscribe(p0 context.Context, p1 ethtypes.EthSubscri return false, ErrNotSupported } +func (s *FullNodeStruct) F3GetCertificate(p0 context.Context, p1 uint64) (*certs.FinalityCertificate, error) { + if s.Internal.F3GetCertificate == nil { + return nil, ErrNotSupported + } + return s.Internal.F3GetCertificate(p0, p1) +} + +func (s *FullNodeStub) F3GetCertificate(p0 context.Context, p1 uint64) (*certs.FinalityCertificate, error) { + return nil, ErrNotSupported +} + +func (s *FullNodeStruct) F3GetECPowerTable(p0 context.Context, p1 types.TipSetKey) (gpbft.PowerEntries, error) { + if s.Internal.F3GetECPowerTable == nil { + return *new(gpbft.PowerEntries), ErrNotSupported + } + return s.Internal.F3GetECPowerTable(p0, p1) +} + +func (s *FullNodeStub) F3GetECPowerTable(p0 context.Context, p1 types.TipSetKey) (gpbft.PowerEntries, error) { + return *new(gpbft.PowerEntries), ErrNotSupported +} + +func (s *FullNodeStruct) F3GetF3PowerTable(p0 context.Context, p1 types.TipSetKey) (gpbft.PowerEntries, error) { + if s.Internal.F3GetF3PowerTable == nil { + return *new(gpbft.PowerEntries), ErrNotSupported + } + return s.Internal.F3GetF3PowerTable(p0, p1) +} + +func (s *FullNodeStub) F3GetF3PowerTable(p0 context.Context, p1 types.TipSetKey) (gpbft.PowerEntries, error) { + return *new(gpbft.PowerEntries), ErrNotSupported +} + +func (s *FullNodeStruct) F3GetLatestCertificate(p0 context.Context) (*certs.FinalityCertificate, error) { + if s.Internal.F3GetLatestCertificate == nil { + return nil, ErrNotSupported + } + return s.Internal.F3GetLatestCertificate(p0) +} + +func (s *FullNodeStub) F3GetLatestCertificate(p0 context.Context) (*certs.FinalityCertificate, error) { + return nil, ErrNotSupported +} + +func (s *FullNodeStruct) F3Participate(p0 context.Context, p1 address.Address, p2 time.Time, p3 time.Time) (bool, error) { + if s.Internal.F3Participate == nil { + return false, ErrNotSupported + } + return s.Internal.F3Participate(p0, p1, p2, p3) +} + +func (s *FullNodeStub) F3Participate(p0 context.Context, p1 address.Address, p2 time.Time, p3 time.Time) (bool, error) { + return false, ErrNotSupported +} + func (s *FullNodeStruct) FilecoinAddressToEthAddress(p0 context.Context, p1 address.Address) (ethtypes.EthAddress, error) { if s.Internal.FilecoinAddressToEthAddress == nil { return *new(ethtypes.EthAddress), ErrNotSupported diff --git a/api/types.go b/api/types.go index 61f6cb8bafe..53e5d88da33 100644 --- a/api/types.go +++ b/api/types.go @@ -191,7 +191,7 @@ type ForkUpgradeParams struct { UpgradeWatermelonHeight abi.ChainEpoch UpgradeDragonHeight abi.ChainEpoch UpgradePhoenixHeight abi.ChainEpoch - UpgradeAussieHeight abi.ChainEpoch + UpgradeWaffleHeight abi.ChainEpoch } // ChainExportConfig holds configuration for chain ranged exports. diff --git a/build/actors/v14.tar.zst b/build/actors/v14.tar.zst index 19b023f1c84..49802866ca7 100644 Binary files a/build/actors/v14.tar.zst and b/build/actors/v14.tar.zst differ diff --git a/build/bootstrap/butterflynet.pi b/build/bootstrap/butterflynet.pi index 88ff5069f3e..ac17495d71d 100644 --- a/build/bootstrap/butterflynet.pi +++ b/build/bootstrap/butterflynet.pi @@ -1,2 +1,2 @@ -/dns4/bootstrap-0.butterfly.fildev.network/tcp/1347/p2p/12D3KooWNwAkUtWuLtKCyyFP2vBzmpTHSrQao7KQx7Xfa8YvSg1N -/dns4/bootstrap-1.butterfly.fildev.network/tcp/1347/p2p/12D3KooWPn8BDeNcctAcAGuxxiic8uMw2pAi3G5vgdFtfgRs5zBu +/dns4/bootstrap-0.butterfly.fildev.network/tcp/1347/p2p/12D3KooWFDd8o5vxQ191fquVqMcXjT2Gc1uYPmgfD3ZF5VHhRXQ9 +/dns4/bootstrap-1.butterfly.fildev.network/tcp/1347/p2p/12D3KooWM51uUDv1MkR3LduP27pvXPUFD4HuBa1UjBQEVKFg4yM2 diff --git a/build/builtin_actors_gen.go b/build/builtin_actors_gen.go index 8107e1d5405..72c1f026820 100644 --- a/build/builtin_actors_gen.go +++ b/build/builtin_actors_gen.go @@ -143,25 +143,25 @@ var EmbeddedBuiltinActorsMetadata = []*BuiltinActorsMetadata{{ }, { Network: "butterflynet", Version: 14, - BundleGitTag: "v13.0.0", - ManifestCid: MustParseCid("bafy2bzacec75zk7ufzwx6tg5avls5fxdjx5asaqmd2bfqdvkqrkzoxgyflosu"), + BundleGitTag: "v14.0.0", + ManifestCid: MustParseCid("bafy2bzacecmkqezl3a5klkzz7z4ou4jwqk4zzd3nvz727l4qh44ngsxtxdblu"), Actors: map[string]cid.Cid{ - "account": MustParseCid("bafk2bzacedl533kwbzouqxibejpwp6syfdekvmzy4vmmno6j4iaydbdmv4xek"), - "cron": MustParseCid("bafk2bzacecimv5xnuwyoqgxk26qt4xqpgntleret475pnh35s3vvhqtdct4ow"), - "datacap": MustParseCid("bafk2bzacebpdd4ctavhs7wkcykfahpifct3p4hbptgtf4jfrqcp2trtlygvow"), - "eam": MustParseCid("bafk2bzaceahw5rrgj7prgbnmn237di7ymjz2ssea32wr525jydpfrwpuhs67m"), - "ethaccount": MustParseCid("bafk2bzacebrslcbew5mq3le2zsn36xqxd4gt5hryeoslxnuqwgw3rhuwh6ygu"), - "evm": MustParseCid("bafk2bzaced5smz4lhpem4mbr7igcskv3e5qopbdp7dqshww2qs4ahacgzjzo4"), - "init": MustParseCid("bafk2bzacedgj6hawhdw2ot2ufisci374o2bq6bfkvlvdt6q7s3uoe5ffyv43k"), - "multisig": MustParseCid("bafk2bzacectnnnpwyqiccaymy3h6ghu74ghjrqyhtqv5odfd4opivzebjj6to"), - "paymentchannel": MustParseCid("bafk2bzaceckhx44jawhzhkz6k23gfnv2gcutgb4j4ekhonj2plwaent4b2tpk"), + "account": MustParseCid("bafk2bzaceazutruyfvvqxgp5qoneq36uv6yethps2bonil5psy2vivl5j2hks"), + "cron": MustParseCid("bafk2bzacecsiz2nzjieposnkz2kqvjjnqyu5zwk6ccm4dbptx26v3qirm6zni"), + "datacap": MustParseCid("bafk2bzaceaavii766hmiawhw2fjvtoy5kvbukou3zejf6gtwu7xi4jxt4uidk"), + "eam": MustParseCid("bafk2bzacebkzhnamn5ohtsvn76opprsi3ao3ujgytjr3c6kdcvhmhg4ze5xxm"), + "ethaccount": MustParseCid("bafk2bzacebvvri25rmgt6yy5qtdrikcsestk6z52aebynwd53s2rm2l3ukn7g"), + "evm": MustParseCid("bafk2bzacebta2jkyxknvwnr6ldcimmwpzenhtdwqbuifzk6g2wktzqf3vj33a"), + "init": MustParseCid("bafk2bzaceblybzwnn55uiivbsjae6l7haz5iocexnynfcz2yjg5spciimxdme"), + "multisig": MustParseCid("bafk2bzaceb54rbdcfdcdtzwbohshn64opgsqf5vhqh3xqb37iignsm3plrtpa"), + "paymentchannel": MustParseCid("bafk2bzacebyyn42ie7jekdytacqpqfll7xctsfpza3tb2sonzsjdeltxqgmdo"), "placeholder": MustParseCid("bafk2bzacedfvut2myeleyq67fljcrw4kkmn5pb5dpyozovj7jpoez5irnc3ro"), - "reward": MustParseCid("bafk2bzacebbs3rlg7y3wbvxrj4wgbsqmasw4ksbbr3lyqbkaxj2t25qz6zzuy"), - "storagemarket": MustParseCid("bafk2bzaced3zmxsmlhp2nsiwkxcp2ugonbsebcd53t7htzo2jcoidvu464xmm"), - "storageminer": MustParseCid("bafk2bzacebedx7iaa2ruspxvghkg46ez7un5b7oiijjtnvddq2aot5wk7p7ry"), - "storagepower": MustParseCid("bafk2bzacebvne7m2l3hxxw4xa6oujol75x35yqpnlqiwx74jilyrop4cs7cse"), - "system": MustParseCid("bafk2bzaceacjmlxrvydlud77ilpzbscez46yedx6zjsj6olxsdeuv6d4x4cwe"), - "verifiedregistry": MustParseCid("bafk2bzacebs5muoq7ft2wgqojhjio7a4vltbyprqkmlr43ojlzbil4nwvj3jg"), + "reward": MustParseCid("bafk2bzaceczaoglexx6w3m744s4emfmjkeizpl4ofdkh4xzhevjtd6zift5iu"), + "storagemarket": MustParseCid("bafk2bzaceceaqmhkxuerleq2dpju35mcsdiklpkisglzlj5xkf32hbyqn7sam"), + "storageminer": MustParseCid("bafk2bzacebkiqu5pclx5zze4ugcsn3lvumihyathpcrjfq36b3hgmd7jqe2bk"), + "storagepower": MustParseCid("bafk2bzacebcxydq2iampltz5zoo3oojka45hjkd62vz46xtpl6qilhkkjdeaq"), + "system": MustParseCid("bafk2bzacebbrs3dzgxwj43ztup7twz25xkbhhtmcbjjbscjvpsrpbwux3b32g"), + "verifiedregistry": MustParseCid("bafk2bzacebj3znhdpxqjgvztrv3petqwdkvrefg4j6lrp3n7wfrkdoan4os42"), }, }, { Network: "calibrationnet", @@ -295,25 +295,25 @@ var EmbeddedBuiltinActorsMetadata = []*BuiltinActorsMetadata{{ }, { Network: "calibrationnet", Version: 14, - BundleGitTag: "v13.0.0", - ManifestCid: MustParseCid("bafy2bzacect4ktyujrwp6mjlsitnpvuw2pbuppz6w52sfljyo4agjevzm75qs"), + BundleGitTag: "v14.0.0", + ManifestCid: MustParseCid("bafy2bzacebq3hncszqpojglh2dkwekybq4zn6qpc4gceqbx36wndps5qehtau"), Actors: map[string]cid.Cid{ - "account": MustParseCid("bafk2bzaceb3j36ri5y5mfklgp5emlvrms6g4733ss2j3l7jismrxq6ng3tcc6"), - "cron": MustParseCid("bafk2bzaceaz6rocamdxehgpwcbku6wlapwpgzyyvkrploj66mlqptsulf52bs"), - "datacap": MustParseCid("bafk2bzacea22nv5g3yngpxvonqfj4r2nkfk64y6yw2malicm7odk77x7zuads"), - "eam": MustParseCid("bafk2bzaceatqtjzj7623i426noaslouvluhz6e3md3vvquqzku5qj3532uaxg"), - "ethaccount": MustParseCid("bafk2bzacean3hs7ga5csw6g3uu7watxfnqv5uvxviebn3ba6vg4sagwdur5pu"), - "evm": MustParseCid("bafk2bzacec5ibmbtzuzjgwjmksm2n6zfq3gkicxqywwu7tsscqgdzajpfctxk"), - "init": MustParseCid("bafk2bzaced5sq72oemz6qwi6yssxwlos2g54zfprslrx5qfhhx2vlgsbvdpcs"), - "multisig": MustParseCid("bafk2bzacedbgei6jkx36fwdgvoohce4aghvpohqdhoco7p4thszgssms7olv2"), - "paymentchannel": MustParseCid("bafk2bzaceasmgmfsi4mjanxlowsub65fmevhzky4toeqbtw4kp6tmu4kxjpgq"), + "account": MustParseCid("bafk2bzaced5ecfm56dvtw26q56j4d32yoccyd7ggxn3qdki2enxpqqav45ths"), + "cron": MustParseCid("bafk2bzacedpbtttpyvtjncqoyobr63mhqqtlrygbnudhxyp2vha56f626dkfs"), + "datacap": MustParseCid("bafk2bzacecded3lcvo7ndsk66samyecw2trnhrgzi7jxsary3sqgopxlk6rku"), + "eam": MustParseCid("bafk2bzacecsda4uw7dcu76a27gnrrdcm73tgms7wrte6jbou63vloktkqc5ne"), + "ethaccount": MustParseCid("bafk2bzacebu2lcxfmohomjj3umslnylwugf5gssywdq3575tjarta7o227dls"), + "evm": MustParseCid("bafk2bzacea4xnekruhfmdnzvzeo6cbf7jsfgco6x5wje2ckwc2ui2ojzcrlgu"), + "init": MustParseCid("bafk2bzacedfmsdlewihdcrkdepnfata26nj7akbvexzs3chicujhjf2uxsazc"), + "multisig": MustParseCid("bafk2bzacedwx4svscsp6wqqu2vlcunjihvvm4u2jnsqjkwutjhir7dwtl7z6m"), + "paymentchannel": MustParseCid("bafk2bzacedbit7oo6lryhbo64uikvtjtfcth6oxwy3eebxerenu2h7rj44n24"), "placeholder": MustParseCid("bafk2bzacedfvut2myeleyq67fljcrw4kkmn5pb5dpyozovj7jpoez5irnc3ro"), - "reward": MustParseCid("bafk2bzacedjyp6ll5ez27dfgldjj4tntxfvyp4pa5zkk7s5uhipzqjyx2gmuc"), - "storagemarket": MustParseCid("bafk2bzaceabolct6qdnefwcrtati2us3sxtxfghyqk6aamfhl6byyefmtssqi"), - "storageminer": MustParseCid("bafk2bzaceckzw3v7wqliyggvjvihz4wywchnnsie4frfvkm3fm5znb64mofri"), - "storagepower": MustParseCid("bafk2bzacea7t4wynzjajl442mpdqbnh3wusjusqtnzgpvefvweh4n2tgzgqhu"), - "system": MustParseCid("bafk2bzacedjnrb5glewazsxpcx6rwiuhl4kwrfcqolyprn6rrjtlzmthlhdq6"), - "verifiedregistry": MustParseCid("bafk2bzacebj2zdquagzy2xxn7up574oemg3w7ed3fe4aujkyhgdwj57voesn2"), + "reward": MustParseCid("bafk2bzaced5rlycj7fzpscfc7p3wwxarngwqylqshj7te3uffey5tevunz4we"), + "storagemarket": MustParseCid("bafk2bzaceatwbyrec2nnwggxc2alpqve7rl52fmbhqflebuxmmnvg3qckjb7c"), + "storageminer": MustParseCid("bafk2bzacecr7ozkdz7l2pq3ig5qxae2ysivbnojhsn4gw3o57ov4mhksma7me"), + "storagepower": MustParseCid("bafk2bzacedgeolvjtnw7fkji5kqmx322abv6uls2v34fuml6nw36dvfcw4mtu"), + "system": MustParseCid("bafk2bzacederl6tlpieldsn6mkndqwd4wj5orfoqgab6p2klswfn3cjagxwla"), + "verifiedregistry": MustParseCid("bafk2bzaceczw2kp6gjjdcjbso7mewp7guik7gr525pal6dotdja2lrct6ok3c"), }, }, { Network: "caterpillarnet", @@ -456,25 +456,25 @@ var EmbeddedBuiltinActorsMetadata = []*BuiltinActorsMetadata{{ }, { Network: "caterpillarnet", Version: 14, - BundleGitTag: "v13.0.0", - ManifestCid: MustParseCid("bafy2bzacedu7kk2zngxp7y3lynhtaht6vgadgn5jzkxe5nuowtwzasnogx63w"), + BundleGitTag: "v14.0.0", + ManifestCid: MustParseCid("bafy2bzacecr6g2co4zkdvrsbz2z7wh44o6hrl3rpbgnlhe52772hhjs43vxge"), Actors: map[string]cid.Cid{ - "account": MustParseCid("bafk2bzacecro3uo6ypqhfzwdhnamzcole5qmhrbkx7qny6t2qsrcpqxelt6s2"), - "cron": MustParseCid("bafk2bzaceam3kci46y4siltbw7f4itoap34kp7b7pvn2fco5s2bvnotomwdbe"), - "datacap": MustParseCid("bafk2bzacecmtdspcbqmmjtsaz4vucuqoqjqfsgxjonns7tom7eblkngbcm7bw"), - "eam": MustParseCid("bafk2bzaceaudqhrt7djewopqdnryvwxagfufyt7ja4gdvovrxbh6edh6evgrw"), - "ethaccount": MustParseCid("bafk2bzaced676ds3z6xe333wr7frwq3f2iq5kjwp4okl3te6rne3xf7kuqrwm"), - "evm": MustParseCid("bafk2bzacebeih4jt2s6mel6x4hje7xmnugh6twul2a5axx4iczu7fu4wcdi6k"), - "init": MustParseCid("bafk2bzaceba7vvuzzwj5wqnq2bvpbgtxup53mhr3qybezbllftnxvpqbfymxo"), - "multisig": MustParseCid("bafk2bzaceapkajhnqoczrgry5javqbl7uebgmsbpqqfemzc4yb5q2dqia2qog"), - "paymentchannel": MustParseCid("bafk2bzacebg7xq4ca22gafmdbkcq357x7v6slflib4h3fnj4amsovg6ulqg3o"), + "account": MustParseCid("bafk2bzacecaoykugysdikvzptp5jc6qzhfxv3tsy7eggoabfk34jc6ozr3nju"), + "cron": MustParseCid("bafk2bzacede6xljkkb6qww47hdho2dfs75bfxjwmxspldwclekd2ntdvcapj6"), + "datacap": MustParseCid("bafk2bzacedjwq3frxklkkejk4payjpjwgdj352izzcmymtzib6xzgrrtczeuw"), + "eam": MustParseCid("bafk2bzaceana2fkgcjhtr56rrqngvilybjpavfgfwf3kuqed6qxa4lfdjmkac"), + "ethaccount": MustParseCid("bafk2bzacedg7tcqwoykjd57dkettxxato4yufxlyzy6hgsggc7jhf6v7zqgas"), + "evm": MustParseCid("bafk2bzacedwqu6pi4csjod4c5677pgsr6g4ekhqnqgdnsiodyqczmcsj3sspk"), + "init": MustParseCid("bafk2bzaceakukvex4wjcrmwp5msp4d2dhe4qlftqxgolxx5sbtshah3fxoepy"), + "multisig": MustParseCid("bafk2bzaceamp2c2qfgnl7z6vz5majhcm64ml72kbg5kea4xgdnfcyqanynfks"), + "paymentchannel": MustParseCid("bafk2bzacebs44wqfedfx3o23q7tkza5cm3q54gevreqzetsei2bvhsmqdwz3i"), "placeholder": MustParseCid("bafk2bzacedfvut2myeleyq67fljcrw4kkmn5pb5dpyozovj7jpoez5irnc3ro"), - "reward": MustParseCid("bafk2bzaceajt4idf26ffnyipybcib55fykjxnek7oszkqzi7lu7mbgijmkgos"), - "storagemarket": MustParseCid("bafk2bzaceadfmay7pyl7osjsdmrireafasnjnoziacljy5ewrcsxpp56kzqbw"), - "storageminer": MustParseCid("bafk2bzaceardbn5a7aq5jxl7efr4btmsbl7txnxm4hrrd3llyhujuc2cr5vcs"), - "storagepower": MustParseCid("bafk2bzacear4563jznjqyseoy42xl6kenyqk6umv6xl3bp5bsjb3hbs6sp6bm"), - "system": MustParseCid("bafk2bzacecc5oavxivfnvirx2g7megpdf6lugooyoc2wijloju247xzjcdezy"), - "verifiedregistry": MustParseCid("bafk2bzacebnkdt42mpf5emypo6iroux3hszfh5yt54v2mmnnura3ketholly4"), + "reward": MustParseCid("bafk2bzacedyckhwkkmcoc2n6byzw6vxi3lqyp3zjs3b7flfqj2wybprwxkw2m"), + "storagemarket": MustParseCid("bafk2bzacebx7ky74ry222rvi56wav3dbal4rqooeuafiakg7r6ksxh2uahbju"), + "storageminer": MustParseCid("bafk2bzacecwfsmi6xxbwkddunjt2zs6qn2g4hvrwury7g36vqvafmok7gs642"), + "storagepower": MustParseCid("bafk2bzacecqcvllpsttt3nqcso4ng2z4cjjn5sr36is7yze74ihqnol2dst2u"), + "system": MustParseCid("bafk2bzacea75k6agtdmjxdfnwbctzstc6pozdblpdevc5ixjevvuzcqwwuzrc"), + "verifiedregistry": MustParseCid("bafk2bzacedxwgmgffeapq4nffplapb5mixkrm2vosmc2i3fxcye5dookiqubu"), }, }, { Network: "devnet", @@ -608,25 +608,25 @@ var EmbeddedBuiltinActorsMetadata = []*BuiltinActorsMetadata{{ }, { Network: "devnet", Version: 14, - BundleGitTag: "v13.0.0", - ManifestCid: MustParseCid("bafy2bzacecn7uxgehrqbcs462ktl2h23u23cmduy2etqj6xrd6tkkja56fna4"), + BundleGitTag: "v14.0.0", + ManifestCid: MustParseCid("bafy2bzacebwn7ymtozv5yz3x5hnxl4bds2grlgsk5kncyxjak3hqyhslb534m"), Actors: map[string]cid.Cid{ - "account": MustParseCid("bafk2bzacebev3fu5geeehpx577b3kvza4xsmmggmepjj7rlsnr27hpoq27q2i"), - "cron": MustParseCid("bafk2bzacedalzqahtuz2bmnf7uawbcujfhhe5xzv5ys5ufadu6ggs3tcu6lsy"), - "datacap": MustParseCid("bafk2bzaceb7ou2vn7ac4xidespoowq2q5w7ognr7s4ujy3xzzgiishajpe7le"), - "eam": MustParseCid("bafk2bzacedqic2qskattorj4svf6mbto2k76ej3ll3ugsyorqramrg7rpq3by"), - "ethaccount": MustParseCid("bafk2bzaceaoad7iknpywijigv2h3jyvkijff2oxvohzue533v5hby3iix5vdu"), - "evm": MustParseCid("bafk2bzacecjgiw26gagsn6a7tffkrgoor4zfgzfokp76u6cwervtmvjbopmwg"), - "init": MustParseCid("bafk2bzaced2obubqojxggeddr246cpwtyzi6knnq52jsvsc2fs3tuk2kh6dtg"), - "multisig": MustParseCid("bafk2bzacebquruzb6zho45orbdkku624t6w6jt4tudaqzraz4yh3li3jfstpg"), - "paymentchannel": MustParseCid("bafk2bzaceaydrilyxvflsuzr24hmw32qwz6sy4hgls73bhpveydcsqskdgpca"), + "account": MustParseCid("bafk2bzacecqyi3xhyrze7hlo73zzyzz5jw5e6eqqyesmnbef4xr7br5amqsm2"), + "cron": MustParseCid("bafk2bzacebmeovn3fehscsm2ejcd2vejgqmuqidzx3ytlvp4osa6fes3w73yy"), + "datacap": MustParseCid("bafk2bzaceasqdluegec5qllzjhu66jsyvb74dix6wjztpiaxvha74in7h4eek"), + "eam": MustParseCid("bafk2bzaced4shnjesuxk44ufllcywjbaixerx6hkcyj5rqqopjuic725fymx2"), + "ethaccount": MustParseCid("bafk2bzacebbw6hg766y4ouycqlr3llur7sxkgj7hnu7jq4xlwtycp3ovpqjee"), + "evm": MustParseCid("bafk2bzaceafzevk77d6zhjbrw7grm5p3es2pzuklpvcthedjv6ejh7alvxqoc"), + "init": MustParseCid("bafk2bzacebaywpmwlfhhog6vey3dkz25hjrlwnhacsjryq3ujymyttolglats"), + "multisig": MustParseCid("bafk2bzacedm52r4h7upic7ynukzwjkadefbjeq7w7ozdonsbdumgoabk7xass"), + "paymentchannel": MustParseCid("bafk2bzacecsvfy77loubouoyqwl2ke574zpg3x5f2qon6ougjzfjna6eadwxg"), "placeholder": MustParseCid("bafk2bzacedfvut2myeleyq67fljcrw4kkmn5pb5dpyozovj7jpoez5irnc3ro"), - "reward": MustParseCid("bafk2bzaceb74owpuzdddqoj2tson6ymbyuguqrnqefyiaxqvwm4ygitpabjrq"), - "storagemarket": MustParseCid("bafk2bzaceaw6dslv6pfqha4ynghq2imij5khnnjrie22kmfgtpie3bvxho6jq"), - "storageminer": MustParseCid("bafk2bzacecsputz6xygjfyrvx2d7bxkpp7b5v4icrmpckec7gnbabx2w377qs"), - "storagepower": MustParseCid("bafk2bzaceceyaa5yjwhxvvcqouob4l746zp5nesivr6enhtpimakdtby6kafi"), - "system": MustParseCid("bafk2bzaceaxg6k5vuozxlemfi5hv663m6jcawzu5puboo4znj73i36e3tsovs"), - "verifiedregistry": MustParseCid("bafk2bzacea2czkb4vt2iiiwdb6e57qfwqse4mk2pcyvwjmdl5ojbnla57oh2u"), + "reward": MustParseCid("bafk2bzacecvc7v5d2krwxqeyklfg2xb5qc3kalu66265smcbmwepjmj643uqu"), + "storagemarket": MustParseCid("bafk2bzacecegzksfqu35xlcc6ymxae3vqpkntbajx4jtahugszvb77fnr37ii"), + "storageminer": MustParseCid("bafk2bzacedoimzimltyfzbabwuam2bqw32nqwo2twjq73q7mklwtvqi2evsw2"), + "storagepower": MustParseCid("bafk2bzacebszcfmepyvssrg2tbbqgpqm2cnrl5ub4n6cfy7eie2wwseyloxvs"), + "system": MustParseCid("bafk2bzacea4rh5i36ucj23zb4mid4tw5ym2wqlfap4ejjaynvobengeuby4ja"), + "verifiedregistry": MustParseCid("bafk2bzaceapbsihfuk3munfpcoevtxlwuenxeiiv7dp7v3t2yjs26hcpypexi"), }, }, { Network: "hyperspace", @@ -783,25 +783,25 @@ var EmbeddedBuiltinActorsMetadata = []*BuiltinActorsMetadata{{ }, { Network: "mainnet", Version: 14, - BundleGitTag: "v13.0.0", - ManifestCid: MustParseCid("bafy2bzacecdhvfmtirtojwhw2tyciu4jkbpsbk5g53oe24br27oy62sn4dc4e"), + BundleGitTag: "v14.0.0", + ManifestCid: MustParseCid("bafy2bzacecbueuzsropvqawsri27owo7isa5gp2qtluhrfsto2qg7wpgxnkba"), Actors: map[string]cid.Cid{ - "account": MustParseCid("bafk2bzacedxnbtlsqdk76fsfmnhyvsblwyfducerwwtp3mqtx2wbrvs5idl52"), - "cron": MustParseCid("bafk2bzacebbopddyn5csb3fsuhh2an4ttd23x6qnwixgohlirj5ahtcudphyc"), - "datacap": MustParseCid("bafk2bzaceah42tfnhd7xnztawgf46gbvc3m2gudoxshlba2ucmmo2vy67t7ci"), - "eam": MustParseCid("bafk2bzaceb23bhvvcjsth7cn7vp3gbaphrutsaz7v6hkls3ogotzs4bnhm4mk"), - "ethaccount": MustParseCid("bafk2bzaceautge6zhuy6jbj3uldwoxwhpywuon6z3xfvmdbzpbdribc6zzmei"), - "evm": MustParseCid("bafk2bzacedq6v2lyuhgywhlllwmudfj2zufzcauxcsvvd34m2ek5xr55mvh2q"), - "init": MustParseCid("bafk2bzacedr4xacm3fts4vilyeiacjr2hpmwzclyzulbdo24lrfxbtau2wbai"), - "multisig": MustParseCid("bafk2bzacecr5zqarfqak42xqcfeulsxlavcltawsx2fvc7zsjtby6ti4b3wqc"), - "paymentchannel": MustParseCid("bafk2bzacebntdhfmyc24e7tm52ggx5tnw4i3hrr3jmllsepv3mibez4hywsa2"), + "account": MustParseCid("bafk2bzacebr7ik7lng7vysm754mu5x7sakphwm4soqi6zwbox4ukpd6ndwvqy"), + "cron": MustParseCid("bafk2bzacecwn6eiwa7ysimmk6i57i5whj4cqzwijx3xdlxwb5canmweaez6xc"), + "datacap": MustParseCid("bafk2bzacecidw7ajvtjhmygqs2yxhmuybyvtwp25dxpblvdxxo7u4gqfzirjg"), + "eam": MustParseCid("bafk2bzaced2cxnfwngpcubg63h7zk4y5hjwwuhfjxrh43xozax2u6u2woweju"), + "ethaccount": MustParseCid("bafk2bzacechu4u7asol5mpcsr6fo6jeaeltvayj5bllupyiux7tcynsxby7ko"), + "evm": MustParseCid("bafk2bzacedupohbgwrcw5ztbbsvrpqyybnokr4ylegmk7hrbt3ueeykua6zxw"), + "init": MustParseCid("bafk2bzacecbbcshenkb6z2v4irsudv7tyklfgphhizhghix6ke5gpl4r5f2b6"), + "multisig": MustParseCid("bafk2bzaceajcmsngu3f2chk2y7nanlen5xlftzatytzm6hxwiiw5i5nz36bfc"), + "paymentchannel": MustParseCid("bafk2bzaceavslp27u3f4zwjq45rlg6assj6cqod7r5f6wfwkptlpi6j4qkmne"), "placeholder": MustParseCid("bafk2bzacedfvut2myeleyq67fljcrw4kkmn5pb5dpyozovj7jpoez5irnc3ro"), - "reward": MustParseCid("bafk2bzacedq4q2kwkruu4xm7rkyygumlbw2yt4nimna2ivea4qarvtkohnuwu"), - "storagemarket": MustParseCid("bafk2bzacebjtoltdviyznpj34hh5qp6u257jnnbjole5rhqfixm7ug3epvrfu"), - "storageminer": MustParseCid("bafk2bzacebf4rrqyk7gcfggggul6nfpzay7f2ordnkwm7z2wcf4mq6r7i77t2"), - "storagepower": MustParseCid("bafk2bzacecjy4dkulvxppg3ocbmeixe2wgg6yxoyjxrm4ko2fm3uhpvfvam6e"), - "system": MustParseCid("bafk2bzacecyf523quuq2kdjfdvyty446z2ounmamtgtgeqnr3ynlu5cqrlt6e"), - "verifiedregistry": MustParseCid("bafk2bzacedkxehp7y7iyukbcje3wbpqcvufisos6exatkanyrbotoecdkrbta"), + "reward": MustParseCid("bafk2bzacedvfnjittwrkhoar6n5xrykowg2e6rpur4poh2m572f7m7evyx4lc"), + "storagemarket": MustParseCid("bafk2bzaceaju5wobednmornvdqcyi6khkvdttkru4dqduqicrdmohlwfddwhg"), + "storageminer": MustParseCid("bafk2bzacea3f43rxzemmakjpktq2ukayngean3oo2de5cdxlg2wsyn53wmepc"), + "storagepower": MustParseCid("bafk2bzacedo6scxizooytn53wjwg2ooiawnj4fsoylcadnp7mhgzluuckjl42"), + "system": MustParseCid("bafk2bzacecak4ow7tmauku42s3u2yydonk4hx6ov6ov542hy7lcbji3nhrrhs"), + "verifiedregistry": MustParseCid("bafk2bzacebvyzjzmvmjvpypphqsumpy6rzxuugnehgum7grc6sv3yqxzrshb4"), }, }, { Network: "testing", @@ -935,25 +935,25 @@ var EmbeddedBuiltinActorsMetadata = []*BuiltinActorsMetadata{{ }, { Network: "testing", Version: 14, - BundleGitTag: "v13.0.0", - ManifestCid: MustParseCid("bafy2bzacedg47dqxmtgzjch6i42kth72esd7w23gujyd6c6oppg3n6auag5ou"), + BundleGitTag: "v14.0.0", + ManifestCid: MustParseCid("bafy2bzacebgc3zha33w7wggshqjeeomjnxfsqdezpt6e5w4tcqnfp42hvhqyy"), Actors: map[string]cid.Cid{ - "account": MustParseCid("bafk2bzaceb3tncntgeqvzzr5fzhvpsc5ntv3tpqrsh4jst4irfyzpkdyigibc"), - "cron": MustParseCid("bafk2bzacecwwasmhixpgtshczm5cfspwciyawc25mrefknqhlxfrd6m57tqmc"), - "datacap": MustParseCid("bafk2bzaceckj66by6eohjrybazh5cymmovgl5bmikpvzki2q7huwk2fweoef2"), - "eam": MustParseCid("bafk2bzaceafzm65wvnaam3775homn4vzsv7odftn5tkifmn44wd2t6gupy63y"), - "ethaccount": MustParseCid("bafk2bzaced4q7m4mha2dsezhwub3ru64rgimkg52t25ul4gnekax6uq7hbkqu"), - "evm": MustParseCid("bafk2bzaceakpknw5cuizil3552jr5z35rs6ijaignjigciswtok67drhzdss6"), - "init": MustParseCid("bafk2bzacec7mbkemwugyg2p4oy2xgnovykk4dnsu5ym4wkreooujvxfsxbo3i"), - "multisig": MustParseCid("bafk2bzacebmftoql6dcyqf54xznwjg2bfgdsi67spqquwslpvvtvcx6qenhz2"), - "paymentchannel": MustParseCid("bafk2bzaceau57wpiiikea6pu5om4ryyqjrxjzfksfl4reqosnohydzv3pf4qq"), + "account": MustParseCid("bafk2bzacedz5ko33xyknznoj5mcwnijhggapvn7hzmec3ix3vlqjg6uuwownm"), + "cron": MustParseCid("bafk2bzacebifywvakusxpvnzn33qneqm46g3trnqvuvaw5cgslfg5cl7prtwa"), + "datacap": MustParseCid("bafk2bzacedx4zxq5ae6qbucm6elokqhhmlwbtas7mbqm6rnigwkmorrtfzo66"), + "eam": MustParseCid("bafk2bzaceavilsrvq7kdyqelapjabixsgmhf6caufc4hdyviccmerf3sawzdk"), + "ethaccount": MustParseCid("bafk2bzaceavutdrzkspoiz6a5m46m2qzqbsmdb33s62xnkpevuwjrhxm6trn2"), + "evm": MustParseCid("bafk2bzacedovnz466nuqdp5pzs6sztcqofsy5zet7k2gybnbelpwuxpmfphwo"), + "init": MustParseCid("bafk2bzaceajnftptl2tdbrudshriqcg3caw5mqublmd6i5dm3qug3j5qo7g4q"), + "multisig": MustParseCid("bafk2bzacebagezdbubvu4g3norwxaomzpk3mxyzfal3rsvvppdbt46y6h74yc"), + "paymentchannel": MustParseCid("bafk2bzacebmtufrtdxo757c6c5ndmsk3wlnzzuzqp4yzbtltqjutnlgh7awus"), "placeholder": MustParseCid("bafk2bzacedfvut2myeleyq67fljcrw4kkmn5pb5dpyozovj7jpoez5irnc3ro"), - "reward": MustParseCid("bafk2bzacecvlcdgbqlk3dyfzkcjrywg2th5bmn7ilijifikulpxr4ffcrw23o"), - "storagemarket": MustParseCid("bafk2bzacecgj53dwqla7eiubs2uiza7cgxkxtefxkfpjontj5jxefl3a4i2nq"), - "storageminer": MustParseCid("bafk2bzaceailclue4dba2edjethfjw6ycufcwsx4qjjmgsh77xcyprmogdjvu"), - "storagepower": MustParseCid("bafk2bzaceaqw6dhdjlqovhk3p4lb4sb25i5d6mhln2ir5m7tj6m4fegkgkinw"), - "system": MustParseCid("bafk2bzaceby6aiiosnrtb5kzlmrvd4k3o27oo3idmbd6llydz2uqibbp23pzq"), - "verifiedregistry": MustParseCid("bafk2bzaceadw6mxuyb6ipaq3fhekk7u5osyyiis3c4wbkvysy2ut6qfsua5zs"), + "reward": MustParseCid("bafk2bzacebtnflocubjjrtvzba4tmrn32tlx2klfgmjreqeo234lqdzu4ovna"), + "storagemarket": MustParseCid("bafk2bzacec6tovj5vh6lyor3m67uhahhldrixnqg7e5246pce5gcwkqwmbvxo"), + "storageminer": MustParseCid("bafk2bzacedcwqwswnkbb22eoajke4t72qvxrp3rpqaotymbqsnlqkz5ovde6m"), + "storagepower": MustParseCid("bafk2bzacea4c3h6gnhgfcjf6lxhzcmp5qq7kgrcym7wv4vcnmd4whegpjdwuq"), + "system": MustParseCid("bafk2bzacechwe3ehay6h7x7tecaajgsxrvvmzcdul6omejfvzf4mpbzkuryhm"), + "verifiedregistry": MustParseCid("bafk2bzacec66mmy7sj6qy5urqplwhbem7wbjrzna7mxh6qbdljdawhu3g5rao"), }, }, { Network: "testing-fake-proofs", @@ -1087,24 +1087,24 @@ var EmbeddedBuiltinActorsMetadata = []*BuiltinActorsMetadata{{ }, { Network: "testing-fake-proofs", Version: 14, - BundleGitTag: "v13.0.0", - ManifestCid: MustParseCid("bafy2bzaceaf7fz33sp2i5ag5xg5ompn3dwppqlbwfacrwuvzaqdbqrtni7m5q"), + BundleGitTag: "v14.0.0", + ManifestCid: MustParseCid("bafy2bzacebca2c7r6m47fv5ojbzfgqxw74zxyzphlkxigj75q7vobbe6vm4x4"), Actors: map[string]cid.Cid{ - "account": MustParseCid("bafk2bzaceb3tncntgeqvzzr5fzhvpsc5ntv3tpqrsh4jst4irfyzpkdyigibc"), - "cron": MustParseCid("bafk2bzacecwwasmhixpgtshczm5cfspwciyawc25mrefknqhlxfrd6m57tqmc"), - "datacap": MustParseCid("bafk2bzaceckj66by6eohjrybazh5cymmovgl5bmikpvzki2q7huwk2fweoef2"), - "eam": MustParseCid("bafk2bzaceafzm65wvnaam3775homn4vzsv7odftn5tkifmn44wd2t6gupy63y"), - "ethaccount": MustParseCid("bafk2bzaced4q7m4mha2dsezhwub3ru64rgimkg52t25ul4gnekax6uq7hbkqu"), - "evm": MustParseCid("bafk2bzaceakpknw5cuizil3552jr5z35rs6ijaignjigciswtok67drhzdss6"), - "init": MustParseCid("bafk2bzacec7mbkemwugyg2p4oy2xgnovykk4dnsu5ym4wkreooujvxfsxbo3i"), - "multisig": MustParseCid("bafk2bzacedy4vldq4viv6bzzh4fueip3by3axsbgbh655lashddgumknc6pvs"), - "paymentchannel": MustParseCid("bafk2bzaceau57wpiiikea6pu5om4ryyqjrxjzfksfl4reqosnohydzv3pf4qq"), + "account": MustParseCid("bafk2bzacedz5ko33xyknznoj5mcwnijhggapvn7hzmec3ix3vlqjg6uuwownm"), + "cron": MustParseCid("bafk2bzacebifywvakusxpvnzn33qneqm46g3trnqvuvaw5cgslfg5cl7prtwa"), + "datacap": MustParseCid("bafk2bzacedx4zxq5ae6qbucm6elokqhhmlwbtas7mbqm6rnigwkmorrtfzo66"), + "eam": MustParseCid("bafk2bzaceavilsrvq7kdyqelapjabixsgmhf6caufc4hdyviccmerf3sawzdk"), + "ethaccount": MustParseCid("bafk2bzaceavutdrzkspoiz6a5m46m2qzqbsmdb33s62xnkpevuwjrhxm6trn2"), + "evm": MustParseCid("bafk2bzacedovnz466nuqdp5pzs6sztcqofsy5zet7k2gybnbelpwuxpmfphwo"), + "init": MustParseCid("bafk2bzaceajnftptl2tdbrudshriqcg3caw5mqublmd6i5dm3qug3j5qo7g4q"), + "multisig": MustParseCid("bafk2bzacecaioywepaxgtrpkmr7k2bjlwcpj6mu3r7ctk77a3sqwrb72wn4ra"), + "paymentchannel": MustParseCid("bafk2bzacebmtufrtdxo757c6c5ndmsk3wlnzzuzqp4yzbtltqjutnlgh7awus"), "placeholder": MustParseCid("bafk2bzacedfvut2myeleyq67fljcrw4kkmn5pb5dpyozovj7jpoez5irnc3ro"), - "reward": MustParseCid("bafk2bzacecvlcdgbqlk3dyfzkcjrywg2th5bmn7ilijifikulpxr4ffcrw23o"), - "storagemarket": MustParseCid("bafk2bzacecgj53dwqla7eiubs2uiza7cgxkxtefxkfpjontj5jxefl3a4i2nq"), - "storageminer": MustParseCid("bafk2bzaceb6atn3k6yhmskgmc3lgfiwpzpfmaxzacohtnb2hivme2oroycqr6"), - "storagepower": MustParseCid("bafk2bzacedameh56mp2g4y7nprhax5sddbzcmpk5p7l523l45rtn2wjc6ah4e"), - "system": MustParseCid("bafk2bzaceby6aiiosnrtb5kzlmrvd4k3o27oo3idmbd6llydz2uqibbp23pzq"), - "verifiedregistry": MustParseCid("bafk2bzaceadw6mxuyb6ipaq3fhekk7u5osyyiis3c4wbkvysy2ut6qfsua5zs"), + "reward": MustParseCid("bafk2bzacebtnflocubjjrtvzba4tmrn32tlx2klfgmjreqeo234lqdzu4ovna"), + "storagemarket": MustParseCid("bafk2bzacec6tovj5vh6lyor3m67uhahhldrixnqg7e5246pce5gcwkqwmbvxo"), + "storageminer": MustParseCid("bafk2bzacecgckzurejgtbw2xfmys5talfq5sloia2mrjcdsl5xolbwkolkrss"), + "storagepower": MustParseCid("bafk2bzacea4c3h6gnhgfcjf6lxhzcmp5qq7kgrcym7wv4vcnmd4whegpjdwuq"), + "system": MustParseCid("bafk2bzacechwe3ehay6h7x7tecaajgsxrvvmzcdul6omejfvzf4mpbzkuryhm"), + "verifiedregistry": MustParseCid("bafk2bzacec66mmy7sj6qy5urqplwhbem7wbjrzna7mxh6qbdljdawhu3g5rao"), }, }} diff --git a/build/genesis/butterflynet.car b/build/genesis/butterflynet.car index 1ba3a8a1be3..c73e64efd6c 100644 Binary files a/build/genesis/butterflynet.car and b/build/genesis/butterflynet.car differ diff --git a/build/openrpc/full.json b/build/openrpc/full.json index fd5900445c1..90fb8cbbd3a 100644 --- a/build/openrpc/full.json +++ b/build/openrpc/full.json @@ -2,7 +2,7 @@ "openrpc": "1.2.6", "info": { "title": "Lotus RPC API", - "version": "1.27.2" + "version": "1.28.0" }, "methods": [ { @@ -37,7 +37,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1307" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1319" } }, { @@ -60,7 +60,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1318" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1330" } }, { @@ -103,7 +103,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1329" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1341" } }, { @@ -214,7 +214,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1351" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1363" } }, { @@ -454,7 +454,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1362" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1374" } }, { @@ -685,7 +685,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1373" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1385" } }, { @@ -784,7 +784,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1384" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1396" } }, { @@ -816,7 +816,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1395" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1407" } }, { @@ -922,7 +922,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1406" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1418" } }, { @@ -1019,7 +1019,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1417" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1429" } }, { @@ -1078,7 +1078,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1428" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1440" } }, { @@ -1171,7 +1171,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1439" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1451" } }, { @@ -1255,7 +1255,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1450" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1462" } }, { @@ -1355,7 +1355,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1461" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1473" } }, { @@ -1411,7 +1411,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1472" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1484" } }, { @@ -1484,7 +1484,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1483" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1495" } }, { @@ -1557,7 +1557,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1494" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1506" } }, { @@ -1604,7 +1604,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1505" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1517" } }, { @@ -1636,7 +1636,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1516" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1528" } }, { @@ -1691,7 +1691,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1527" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1539" } }, { @@ -1743,7 +1743,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1549" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1561" } }, { @@ -1780,7 +1780,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1560" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1572" } }, { @@ -1827,7 +1827,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1571" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1583" } }, { @@ -1874,7 +1874,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1582" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1594" } }, { @@ -1954,7 +1954,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1593" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1605" } }, { @@ -2006,7 +2006,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1604" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1616" } }, { @@ -2045,7 +2045,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1615" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1627" } }, { @@ -2092,7 +2092,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1626" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1638" } }, { @@ -2147,7 +2147,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1637" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1649" } }, { @@ -2176,7 +2176,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1648" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1660" } }, { @@ -2313,7 +2313,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1659" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1671" } }, { @@ -2342,7 +2342,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1670" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1682" } }, { @@ -2396,7 +2396,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1681" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1693" } }, { @@ -2487,7 +2487,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1692" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1704" } }, { @@ -2515,7 +2515,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1703" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1715" } }, { @@ -2605,7 +2605,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1714" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1726" } }, { @@ -2861,7 +2861,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1725" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1737" } }, { @@ -3106,7 +3106,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1736" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1748" } }, { @@ -3162,7 +3162,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1747" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1759" } }, { @@ -3209,7 +3209,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1758" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1770" } }, { @@ -3307,7 +3307,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1769" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1781" } }, { @@ -3373,7 +3373,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1780" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1792" } }, { @@ -3439,7 +3439,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1791" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1803" } }, { @@ -3548,7 +3548,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1802" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1814" } }, { @@ -3606,7 +3606,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1813" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1825" } }, { @@ -3728,7 +3728,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1824" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1836" } }, { @@ -3937,7 +3937,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1835" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1847" } }, { @@ -4137,7 +4137,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1846" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1858" } }, { @@ -4329,7 +4329,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1857" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1869" } }, { @@ -4538,7 +4538,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1868" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1880" } }, { @@ -4629,7 +4629,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1879" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1891" } }, { @@ -4687,7 +4687,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1890" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1902" } }, { @@ -4945,7 +4945,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1901" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1913" } }, { @@ -5220,7 +5220,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1912" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1924" } }, { @@ -5248,7 +5248,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1923" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1935" } }, { @@ -5286,7 +5286,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1934" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1946" } }, { @@ -5394,7 +5394,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1945" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1957" } }, { @@ -5432,7 +5432,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1956" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1968" } }, { @@ -5461,7 +5461,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1967" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1979" } }, { @@ -5524,7 +5524,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1978" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1990" } }, { @@ -5587,7 +5587,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1989" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2001" } }, { @@ -5632,7 +5632,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2000" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2012" } }, { @@ -5754,7 +5754,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2011" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2023" } }, { @@ -5909,7 +5909,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2022" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2034" } }, { @@ -6031,7 +6031,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2033" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2045" } }, { @@ -6085,7 +6085,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2044" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2056" } }, { @@ -6139,7 +6139,609 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2055" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2067" + } + }, + { + "name": "Filecoin.F3GetCertificate", + "description": "```go\nfunc (s *FullNodeStruct) F3GetCertificate(p0 context.Context, p1 uint64) (*certs.FinalityCertificate, error) {\n\tif s.Internal.F3GetCertificate == nil {\n\t\treturn nil, ErrNotSupported\n\t}\n\treturn s.Internal.F3GetCertificate(p0, p1)\n}\n```", + "summary": "F3GetCertificate returns a finality certificate at given instance number\n", + "paramStructure": "by-position", + "params": [ + { + "name": "p1", + "description": "uint64", + "summary": "", + "schema": { + "title": "number", + "description": "Number is a number", + "examples": [ + 42 + ], + "type": [ + "number" + ] + }, + "required": true, + "deprecated": false + } + ], + "result": { + "name": "*certs.FinalityCertificate", + "description": "*certs.FinalityCertificate", + "summary": "", + "schema": { + "examples": [ + { + "GPBFTInstance": 0, + "ECChain": null, + "SupplementalData": { + "Commitments": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "PowerTable": null + }, + "Signers": [ + 0 + ], + "Signature": null, + "PowerTableDelta": null + } + ], + "additionalProperties": false, + "properties": { + "ECChain": { + "items": { + "additionalProperties": false, + "properties": { + "Commitments": { + "items": { + "description": "Number is a number", + "title": "number", + "type": "number" + }, + "maxItems": 32, + "minItems": 32, + "type": "array" + }, + "Epoch": { + "title": "number", + "type": "number" + }, + "Key": { + "media": { + "binaryEncoding": "base64" + }, + "type": "string" + }, + "PowerTable": { + "media": { + "binaryEncoding": "base64" + }, + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "GPBFTInstance": { + "title": "number", + "type": "number" + }, + "PowerTableDelta": { + "items": { + "additionalProperties": false, + "properties": { + "ParticipantID": { + "title": "number", + "type": "number" + }, + "PowerDelta": { + "additionalProperties": false, + "type": "object" + }, + "SigningKey": { + "items": { + "description": "Number is a number", + "title": "number", + "type": "number" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + "Signature": { + "media": { + "binaryEncoding": "base64" + }, + "type": "string" + }, + "Signers": { + "additionalProperties": false, + "type": "object" + }, + "SupplementalData": { + "additionalProperties": false, + "properties": { + "Commitments": { + "items": { + "description": "Number is a number", + "title": "number", + "type": "number" + }, + "maxItems": 32, + "minItems": 32, + "type": "array" + }, + "PowerTable": { + "media": { + "binaryEncoding": "base64" + }, + "type": "string" + } + }, + "type": "object" + } + }, + "type": [ + "object" + ] + }, + "required": true, + "deprecated": false + }, + "deprecated": false, + "externalDocs": { + "description": "Github remote link", + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2078" + } + }, + { + "name": "Filecoin.F3GetECPowerTable", + "description": "```go\nfunc (s *FullNodeStruct) F3GetECPowerTable(p0 context.Context, p1 types.TipSetKey) (gpbft.PowerEntries, error) {\n\tif s.Internal.F3GetECPowerTable == nil {\n\t\treturn *new(gpbft.PowerEntries), ErrNotSupported\n\t}\n\treturn s.Internal.F3GetECPowerTable(p0, p1)\n}\n```", + "summary": "F3GetECPowerTable returns a F3 specific power table for use in standalone F3 nodes.\n", + "paramStructure": "by-position", + "params": [ + { + "name": "p1", + "description": "types.TipSetKey", + "summary": "", + "schema": { + "examples": [ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] + ], + "additionalProperties": false, + "type": [ + "object" + ] + }, + "required": true, + "deprecated": false + } + ], + "result": { + "name": "gpbft.PowerEntries", + "description": "gpbft.PowerEntries", + "summary": "", + "schema": { + "examples": [ + [ + { + "ID": 1000, + "Power": 0, + "PubKey": "Bw==" + } + ] + ], + "items": [ + { + "additionalProperties": false, + "properties": { + "ID": { + "title": "number", + "type": "number" + }, + "Power": { + "additionalProperties": false, + "type": "object" + }, + "PubKey": { + "items": { + "description": "Number is a number", + "title": "number", + "type": "number" + }, + "type": "array" + } + }, + "type": [ + "object" + ] + } + ], + "type": [ + "array" + ] + }, + "required": true, + "deprecated": false + }, + "deprecated": false, + "externalDocs": { + "description": "Github remote link", + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2089" + } + }, + { + "name": "Filecoin.F3GetF3PowerTable", + "description": "```go\nfunc (s *FullNodeStruct) F3GetF3PowerTable(p0 context.Context, p1 types.TipSetKey) (gpbft.PowerEntries, error) {\n\tif s.Internal.F3GetF3PowerTable == nil {\n\t\treturn *new(gpbft.PowerEntries), ErrNotSupported\n\t}\n\treturn s.Internal.F3GetF3PowerTable(p0, p1)\n}\n```", + "summary": "F3GetF3PowerTable returns a F3 specific power table.\n", + "paramStructure": "by-position", + "params": [ + { + "name": "p1", + "description": "types.TipSetKey", + "summary": "", + "schema": { + "examples": [ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] + ], + "additionalProperties": false, + "type": [ + "object" + ] + }, + "required": true, + "deprecated": false + } + ], + "result": { + "name": "gpbft.PowerEntries", + "description": "gpbft.PowerEntries", + "summary": "", + "schema": { + "examples": [ + [ + { + "ID": 1000, + "Power": 0, + "PubKey": "Bw==" + } + ] + ], + "items": [ + { + "additionalProperties": false, + "properties": { + "ID": { + "title": "number", + "type": "number" + }, + "Power": { + "additionalProperties": false, + "type": "object" + }, + "PubKey": { + "items": { + "description": "Number is a number", + "title": "number", + "type": "number" + }, + "type": "array" + } + }, + "type": [ + "object" + ] + } + ], + "type": [ + "array" + ] + }, + "required": true, + "deprecated": false + }, + "deprecated": false, + "externalDocs": { + "description": "Github remote link", + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2100" + } + }, + { + "name": "Filecoin.F3GetLatestCertificate", + "description": "```go\nfunc (s *FullNodeStruct) F3GetLatestCertificate(p0 context.Context) (*certs.FinalityCertificate, error) {\n\tif s.Internal.F3GetLatestCertificate == nil {\n\t\treturn nil, ErrNotSupported\n\t}\n\treturn s.Internal.F3GetLatestCertificate(p0)\n}\n```", + "summary": "F3GetLatestCertificate returns the latest finality certificate\n", + "paramStructure": "by-position", + "params": [], + "result": { + "name": "*certs.FinalityCertificate", + "description": "*certs.FinalityCertificate", + "summary": "", + "schema": { + "examples": [ + { + "GPBFTInstance": 0, + "ECChain": null, + "SupplementalData": { + "Commitments": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "PowerTable": null + }, + "Signers": [ + 0 + ], + "Signature": null, + "PowerTableDelta": null + } + ], + "additionalProperties": false, + "properties": { + "ECChain": { + "items": { + "additionalProperties": false, + "properties": { + "Commitments": { + "items": { + "description": "Number is a number", + "title": "number", + "type": "number" + }, + "maxItems": 32, + "minItems": 32, + "type": "array" + }, + "Epoch": { + "title": "number", + "type": "number" + }, + "Key": { + "media": { + "binaryEncoding": "base64" + }, + "type": "string" + }, + "PowerTable": { + "media": { + "binaryEncoding": "base64" + }, + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "GPBFTInstance": { + "title": "number", + "type": "number" + }, + "PowerTableDelta": { + "items": { + "additionalProperties": false, + "properties": { + "ParticipantID": { + "title": "number", + "type": "number" + }, + "PowerDelta": { + "additionalProperties": false, + "type": "object" + }, + "SigningKey": { + "items": { + "description": "Number is a number", + "title": "number", + "type": "number" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + "Signature": { + "media": { + "binaryEncoding": "base64" + }, + "type": "string" + }, + "Signers": { + "additionalProperties": false, + "type": "object" + }, + "SupplementalData": { + "additionalProperties": false, + "properties": { + "Commitments": { + "items": { + "description": "Number is a number", + "title": "number", + "type": "number" + }, + "maxItems": 32, + "minItems": 32, + "type": "array" + }, + "PowerTable": { + "media": { + "binaryEncoding": "base64" + }, + "type": "string" + } + }, + "type": "object" + } + }, + "type": [ + "object" + ] + }, + "required": true, + "deprecated": false + }, + "deprecated": false, + "externalDocs": { + "description": "Github remote link", + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2111" + } + }, + { + "name": "Filecoin.F3Participate", + "description": "```go\nfunc (s *FullNodeStruct) F3Participate(p0 context.Context, p1 address.Address, p2 time.Time, p3 time.Time) (bool, error) {\n\tif s.Internal.F3Participate == nil {\n\t\treturn false, ErrNotSupported\n\t}\n\treturn s.Internal.F3Participate(p0, p1, p2, p3)\n}\n```", + "summary": "F3Participate should be called by a storage provider to participate in signing F3 consensus.\nCalling this API gives the lotus node a lease to sign in F3 on behalf of given SP.\nThe lease should be active only on one node. The lease will expire at the newLeaseExpiration.\nTo continue participating in F3 with the given node, call F3Participate again before\nthe newLeaseExpiration time.\nnewLeaseExpiration cannot be further than 5 minutes in the future.\nIt is recommended to call F3Participate every 60 seconds\nwith newLeaseExpiration set 2min into the future.\nThe oldLeaseExpiration has to be set to newLeaseExpiration of the last successful call.\nFor the first call to F3Participate, set the oldLeaseExpiration to zero value/time in the past.\nF3Participate will return true if the lease was accepted.\nThe minerID has to be the ID address of the miner.\n", + "paramStructure": "by-position", + "params": [ + { + "name": "p1", + "description": "address.Address", + "summary": "", + "schema": { + "examples": [ + "f01234" + ], + "additionalProperties": false, + "type": [ + "object" + ] + }, + "required": true, + "deprecated": false + }, + { + "name": "p2", + "description": "time.Time", + "summary": "", + "schema": { + "examples": [ + "0001-01-01T00:00:00Z" + ], + "type": [ + "string" + ], + "format": "date-time" + }, + "required": true, + "deprecated": false + }, + { + "name": "p3", + "description": "time.Time", + "summary": "", + "schema": { + "examples": [ + "0001-01-01T00:00:00Z" + ], + "type": [ + "string" + ], + "format": "date-time" + }, + "required": true, + "deprecated": false + } + ], + "result": { + "name": "bool", + "description": "bool", + "summary": "", + "schema": { + "examples": [ + true + ], + "type": [ + "boolean" + ] + }, + "required": true, + "deprecated": false + }, + "deprecated": false, + "externalDocs": { + "description": "Github remote link", + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2122" } }, { @@ -6194,7 +6796,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2066" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2133" } }, { @@ -6337,7 +6939,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2077" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2144" } }, { @@ -6464,7 +7066,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2088" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2155" } }, { @@ -6566,7 +7168,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2099" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2166" } }, { @@ -6789,7 +7391,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2110" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2177" } }, { @@ -6972,7 +7574,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2121" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2188" } }, { @@ -7052,7 +7654,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2132" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2199" } }, { @@ -7097,7 +7699,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2143" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2210" } }, { @@ -7153,7 +7755,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2154" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2221" } }, { @@ -7233,7 +7835,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2165" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2232" } }, { @@ -7313,7 +7915,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2176" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2243" } }, { @@ -7798,7 +8400,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2187" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2254" } }, { @@ -7992,7 +8594,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2198" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2265" } }, { @@ -8147,7 +8749,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2209" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2276" } }, { @@ -8396,7 +8998,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2220" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2287" } }, { @@ -8551,7 +9153,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2231" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2298" } }, { @@ -8728,7 +9330,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2242" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2309" } }, { @@ -8826,7 +9428,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2253" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2320" } }, { @@ -8991,7 +9593,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2264" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2331" } }, { @@ -9030,7 +9632,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2275" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2342" } }, { @@ -9095,7 +9697,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2286" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2353" } }, { @@ -9141,7 +9743,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2297" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2364" } }, { @@ -9291,7 +9893,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2308" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2375" } }, { @@ -9428,7 +10030,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2319" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2386" } }, { @@ -9659,7 +10261,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2330" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2397" } }, { @@ -9796,7 +10398,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2341" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2408" } }, { @@ -9961,7 +10563,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2352" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2419" } }, { @@ -10038,7 +10640,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2363" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2430" } }, { @@ -10233,7 +10835,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2385" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2452" } }, { @@ -10412,7 +11014,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2396" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2463" } }, { @@ -10574,7 +11176,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2407" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2474" } }, { @@ -10722,7 +11324,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2418" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2485" } }, { @@ -10950,7 +11552,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2429" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2496" } }, { @@ -11098,7 +11700,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2440" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2507" } }, { @@ -11310,7 +11912,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2451" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2518" } }, { @@ -11516,7 +12118,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2462" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2529" } }, { @@ -11584,7 +12186,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2473" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2540" } }, { @@ -11701,7 +12303,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2484" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2551" } }, { @@ -11792,7 +12394,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2495" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2562" } }, { @@ -11878,7 +12480,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2506" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2573" } }, { @@ -12073,7 +12675,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2517" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2584" } }, { @@ -12235,7 +12837,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2528" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2595" } }, { @@ -12431,7 +13033,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2539" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2606" } }, { @@ -12611,7 +13213,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2550" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2617" } }, { @@ -12774,7 +13376,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2561" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2628" } }, { @@ -12801,7 +13403,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2572" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2639" } }, { @@ -12828,7 +13430,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2583" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2650" } }, { @@ -12927,7 +13529,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2594" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2661" } }, { @@ -12973,7 +13575,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2605" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2672" } }, { @@ -13073,7 +13675,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2616" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2683" } }, { @@ -13189,7 +13791,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2627" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2694" } }, { @@ -13237,7 +13839,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2638" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2705" } }, { @@ -13329,7 +13931,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2649" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2716" } }, { @@ -13444,7 +14046,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2660" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2727" } }, { @@ -13492,7 +14094,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2671" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2738" } }, { @@ -13529,7 +14131,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2682" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2749" } }, { @@ -13801,7 +14403,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2693" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2760" } }, { @@ -13849,7 +14451,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2704" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2771" } }, { @@ -13907,7 +14509,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2715" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2782" } }, { @@ -14112,7 +14714,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2726" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2793" } }, { @@ -14315,7 +14917,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2737" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2804" } }, { @@ -14484,7 +15086,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2748" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2815" } }, { @@ -14688,7 +15290,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2759" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2826" } }, { @@ -14855,7 +15457,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2770" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2837" } }, { @@ -15062,7 +15664,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2781" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2848" } }, { @@ -15130,7 +15732,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2792" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2859" } }, { @@ -15182,7 +15784,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2803" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2870" } }, { @@ -15231,7 +15833,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2814" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2881" } }, { @@ -15322,7 +15924,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2825" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2892" } }, { @@ -15501,7 +16103,7 @@ }, "Nonce": 42, "Balance": "0", - "Address": "f01234" + "DelegatedAddress": "f01234" } }, "GasCharges": [ @@ -15541,7 +16143,7 @@ }, "Nonce": 42, "Balance": "0", - "Address": "f01234" + "DelegatedAddress": "f01234" } }, "GasCharges": [ @@ -15611,10 +16213,6 @@ "State": { "additionalProperties": false, "properties": { - "Address": { - "additionalProperties": false, - "type": "object" - }, "Balance": { "additionalProperties": false, "type": "object" @@ -15623,6 +16221,10 @@ "title": "Content Identifier", "type": "string" }, + "DelegatedAddress": { + "additionalProperties": false, + "type": "object" + }, "Head": { "title": "Content Identifier", "type": "string" @@ -15828,7 +16430,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2836" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2903" } }, { @@ -15892,7 +16494,7 @@ }, "Nonce": 42, "Balance": "0", - "Address": "f01234" + "DelegatedAddress": "f01234" } } ], @@ -15900,10 +16502,6 @@ ".*": { "additionalProperties": false, "properties": { - "Address": { - "additionalProperties": false, - "type": "object" - }, "Balance": { "additionalProperties": false, "type": "object" @@ -15912,6 +16510,10 @@ "title": "Content Identifier", "type": "string" }, + "DelegatedAddress": { + "additionalProperties": false, + "type": "object" + }, "Head": { "title": "Content Identifier", "type": "string" @@ -15934,7 +16536,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2847" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2914" } }, { @@ -15986,7 +16588,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2858" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2925" } }, { @@ -16196,7 +16798,7 @@ }, "Nonce": 42, "Balance": "0", - "Address": "f01234" + "DelegatedAddress": "f01234" } }, "GasCharges": [ @@ -16236,7 +16838,7 @@ }, "Nonce": 42, "Balance": "0", - "Address": "f01234" + "DelegatedAddress": "f01234" } }, "GasCharges": [ @@ -16316,10 +16918,6 @@ "State": { "additionalProperties": false, "properties": { - "Address": { - "additionalProperties": false, - "type": "object" - }, "Balance": { "additionalProperties": false, "type": "object" @@ -16328,6 +16926,10 @@ "title": "Content Identifier", "type": "string" }, + "DelegatedAddress": { + "additionalProperties": false, + "type": "object" + }, "Head": { "title": "Content Identifier", "type": "string" @@ -16538,7 +17140,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2869" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2936" } }, { @@ -16652,7 +17254,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2880" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2947" } }, { @@ -16749,7 +17351,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2891" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2958" } }, { @@ -16849,7 +17451,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2902" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2969" } }, { @@ -16937,7 +17539,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2913" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2980" } }, { @@ -17001,15 +17603,11 @@ }, "Nonce": 42, "Balance": "0", - "Address": "f01234" + "DelegatedAddress": "f01234" } ], "additionalProperties": false, "properties": { - "Address": { - "additionalProperties": false, - "type": "object" - }, "Balance": { "additionalProperties": false, "type": "object" @@ -17018,6 +17616,10 @@ "title": "Content Identifier", "type": "string" }, + "DelegatedAddress": { + "additionalProperties": false, + "type": "object" + }, "Head": { "title": "Content Identifier", "type": "string" @@ -17037,7 +17639,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2924" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2991" } }, { @@ -17124,7 +17726,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2935" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3002" } }, { @@ -17215,7 +17817,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2946" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3013" } }, { @@ -17340,7 +17942,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2957" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3024" } }, { @@ -17449,7 +18051,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2968" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3035" } }, { @@ -17519,7 +18121,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2979" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3046" } }, { @@ -17622,7 +18224,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2990" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3057" } }, { @@ -17683,7 +18285,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3001" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3068" } }, { @@ -17813,7 +18415,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3012" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3079" } }, { @@ -17920,7 +18522,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3023" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3090" } }, { @@ -17971,7 +18573,7 @@ "UpgradeWatermelonHeight": 10101, "UpgradeDragonHeight": 10101, "UpgradePhoenixHeight": 10101, - "UpgradeAussieHeight": 10101 + "UpgradeWaffleHeight": 10101 }, "Eip155ChainID": 123 } @@ -18001,10 +18603,6 @@ "title": "number", "type": "number" }, - "UpgradeAussieHeight": { - "title": "number", - "type": "number" - }, "UpgradeBreezeHeight": { "title": "number", "type": "number" @@ -18101,6 +18699,10 @@ "title": "number", "type": "number" }, + "UpgradeWaffleHeight": { + "title": "number", + "type": "number" + }, "UpgradeWatermelonHeight": { "title": "number", "type": "number" @@ -18134,7 +18736,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3034" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3101" } }, { @@ -18211,7 +18813,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3045" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3112" } }, { @@ -18288,7 +18890,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3056" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3123" } }, { @@ -18397,7 +18999,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3067" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3134" } }, { @@ -18506,7 +19108,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3078" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3145" } }, { @@ -18567,7 +19169,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3089" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3156" } }, { @@ -18677,7 +19279,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3100" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3167" } }, { @@ -18738,7 +19340,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3111" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3178" } }, { @@ -18806,7 +19408,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3122" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3189" } }, { @@ -18874,7 +19476,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3133" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3200" } }, { @@ -18955,7 +19557,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3144" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3211" } }, { @@ -19109,7 +19711,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3155" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3222" } }, { @@ -19181,7 +19783,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3166" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3233" } }, { @@ -19345,7 +19947,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3177" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3244" } }, { @@ -19510,7 +20112,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3188" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3255" } }, { @@ -19580,7 +20182,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3199" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3266" } }, { @@ -19648,7 +20250,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3210" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3277" } }, { @@ -19741,7 +20343,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3221" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3288" } }, { @@ -19812,7 +20414,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3232" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3299" } }, { @@ -20013,7 +20615,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3243" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3310" } }, { @@ -20145,7 +20747,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3254" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3321" } }, { @@ -20282,7 +20884,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3265" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3332" } }, { @@ -20393,7 +20995,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3276" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3343" } }, { @@ -20525,7 +21127,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3287" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3354" } }, { @@ -20656,7 +21258,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3298" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3365" } }, { @@ -20727,7 +21329,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3309" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3376" } }, { @@ -20811,7 +21413,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3320" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3387" } }, { @@ -20897,7 +21499,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3331" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3398" } }, { @@ -21080,7 +21682,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3342" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3409" } }, { @@ -21107,7 +21709,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3353" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3420" } }, { @@ -21160,7 +21762,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3364" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3431" } }, { @@ -21248,7 +21850,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3375" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3442" } }, { @@ -21372,7 +21974,7 @@ }, "Nonce": 42, "Balance": "0", - "Address": "f01234" + "DelegatedAddress": "f01234" } }, "GasCharges": [ @@ -21412,7 +22014,7 @@ }, "Nonce": 42, "Balance": "0", - "Address": "f01234" + "DelegatedAddress": "f01234" } }, "GasCharges": [ @@ -21482,10 +22084,6 @@ "State": { "additionalProperties": false, "properties": { - "Address": { - "additionalProperties": false, - "type": "object" - }, "Balance": { "additionalProperties": false, "type": "object" @@ -21494,6 +22092,10 @@ "title": "Content Identifier", "type": "string" }, + "DelegatedAddress": { + "additionalProperties": false, + "type": "object" + }, "Head": { "title": "Content Identifier", "type": "string" @@ -21699,7 +22301,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3386" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3453" } }, { @@ -21866,7 +22468,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3397" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3464" } }, { @@ -21964,7 +22566,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3408" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3475" } }, { @@ -22137,7 +22739,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3419" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3486" } }, { @@ -22235,7 +22837,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3430" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3497" } }, { @@ -22386,7 +22988,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3441" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3508" } }, { @@ -22471,7 +23073,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3452" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3519" } }, { @@ -22539,7 +23141,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3463" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3530" } }, { @@ -22591,7 +23193,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3474" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3541" } }, { @@ -22659,7 +23261,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3485" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3552" } }, { @@ -22820,7 +23422,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3496" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3563" } }, { @@ -22867,7 +23469,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3518" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3585" } }, { @@ -22914,7 +23516,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3529" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3596" } }, { @@ -22957,7 +23559,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3551" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3618" } }, { @@ -23053,7 +23655,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3562" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3629" } }, { @@ -23319,7 +23921,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3573" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3640" } }, { @@ -23342,7 +23944,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3584" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3651" } }, { @@ -23385,7 +23987,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3595" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3662" } }, { @@ -23436,7 +24038,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3606" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3673" } }, { @@ -23481,7 +24083,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3617" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3684" } }, { @@ -23509,7 +24111,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3628" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3695" } }, { @@ -23549,7 +24151,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3639" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3706" } }, { @@ -23608,7 +24210,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3650" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3717" } }, { @@ -23652,7 +24254,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3661" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3728" } }, { @@ -23711,7 +24313,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3672" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3739" } }, { @@ -23748,7 +24350,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3683" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3750" } }, { @@ -23792,7 +24394,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3694" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3761" } }, { @@ -23832,7 +24434,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3705" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3772" } }, { @@ -23907,7 +24509,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3716" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3783" } }, { @@ -24115,7 +24717,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3727" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3794" } }, { @@ -24159,7 +24761,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3738" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3805" } }, { @@ -24249,7 +24851,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3749" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3816" } }, { @@ -24276,7 +24878,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3760" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3827" } } ] diff --git a/build/openrpc/gateway.json b/build/openrpc/gateway.json index 3d5591cdbe8..fa20ca1cd9a 100644 --- a/build/openrpc/gateway.json +++ b/build/openrpc/gateway.json @@ -2,7 +2,7 @@ "openrpc": "1.2.6", "info": { "title": "Lotus RPC API", - "version": "1.27.2" + "version": "1.28.0" }, "methods": [ { @@ -242,7 +242,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3771" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3838" } }, { @@ -473,7 +473,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3782" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3849" } }, { @@ -572,7 +572,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3793" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3860" } }, { @@ -604,7 +604,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3804" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3871" } }, { @@ -710,7 +710,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3815" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3882" } }, { @@ -803,7 +803,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3826" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3893" } }, { @@ -887,7 +887,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3837" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3904" } }, { @@ -987,7 +987,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3848" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3915" } }, { @@ -1043,7 +1043,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3859" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3926" } }, { @@ -1116,7 +1116,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3870" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3937" } }, { @@ -1189,7 +1189,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3881" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3948" } }, { @@ -1236,7 +1236,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3892" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3959" } }, { @@ -1268,7 +1268,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3903" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3970" } }, { @@ -1305,7 +1305,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3925" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3992" } }, { @@ -1352,7 +1352,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3936" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4003" } }, { @@ -1392,7 +1392,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3947" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4014" } }, { @@ -1439,7 +1439,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3958" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4025" } }, { @@ -1494,7 +1494,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3969" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4036" } }, { @@ -1523,7 +1523,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3980" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4047" } }, { @@ -1660,7 +1660,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3991" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4058" } }, { @@ -1689,7 +1689,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4002" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4069" } }, { @@ -1743,7 +1743,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4013" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4080" } }, { @@ -1834,7 +1834,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4024" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4091" } }, { @@ -1862,7 +1862,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4035" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4102" } }, { @@ -1952,7 +1952,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4046" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4113" } }, { @@ -2208,7 +2208,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4057" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4124" } }, { @@ -2453,7 +2453,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4068" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4135" } }, { @@ -2509,7 +2509,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4079" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4146" } }, { @@ -2556,7 +2556,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4090" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4157" } }, { @@ -2654,7 +2654,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4101" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4168" } }, { @@ -2720,7 +2720,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4112" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4179" } }, { @@ -2786,7 +2786,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4123" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4190" } }, { @@ -2895,7 +2895,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4134" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4201" } }, { @@ -2953,7 +2953,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4145" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4212" } }, { @@ -3075,7 +3075,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4156" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4223" } }, { @@ -3267,7 +3267,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4167" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4234" } }, { @@ -3476,7 +3476,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4178" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4245" } }, { @@ -3567,7 +3567,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4189" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4256" } }, { @@ -3625,7 +3625,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4200" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4267" } }, { @@ -3883,7 +3883,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4211" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4278" } }, { @@ -4158,7 +4158,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4222" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4289" } }, { @@ -4186,7 +4186,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4233" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4300" } }, { @@ -4224,7 +4224,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4244" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4311" } }, { @@ -4332,7 +4332,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4255" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4322" } }, { @@ -4370,7 +4370,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4266" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4333" } }, { @@ -4399,7 +4399,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4277" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4344" } }, { @@ -4462,7 +4462,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4288" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4355" } }, { @@ -4525,7 +4525,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4299" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4366" } }, { @@ -4570,7 +4570,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4310" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4377" } }, { @@ -4692,7 +4692,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4321" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4388" } }, { @@ -4847,7 +4847,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4332" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4399" } }, { @@ -4969,7 +4969,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4343" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4410" } }, { @@ -5023,7 +5023,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4354" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4421" } }, { @@ -5077,7 +5077,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4365" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4432" } }, { @@ -5132,7 +5132,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4376" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4443" } }, { @@ -5234,7 +5234,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4387" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4454" } }, { @@ -5457,7 +5457,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4398" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4465" } }, { @@ -5640,7 +5640,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4409" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4476" } }, { @@ -5834,7 +5834,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4420" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4487" } }, { @@ -5880,7 +5880,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4431" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4498" } }, { @@ -6030,7 +6030,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4442" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4509" } }, { @@ -6167,7 +6167,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4453" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4520" } }, { @@ -6235,7 +6235,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4464" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4531" } }, { @@ -6352,7 +6352,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4475" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4542" } }, { @@ -6443,7 +6443,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4486" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4553" } }, { @@ -6529,7 +6529,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4497" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4564" } }, { @@ -6556,7 +6556,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4508" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4575" } }, { @@ -6583,7 +6583,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4519" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4586" } }, { @@ -6651,7 +6651,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4530" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4597" } }, { @@ -6830,7 +6830,7 @@ }, "Nonce": 42, "Balance": "0", - "Address": "f01234" + "DelegatedAddress": "f01234" } }, "GasCharges": [ @@ -6870,7 +6870,7 @@ }, "Nonce": 42, "Balance": "0", - "Address": "f01234" + "DelegatedAddress": "f01234" } }, "GasCharges": [ @@ -6940,10 +6940,6 @@ "State": { "additionalProperties": false, "properties": { - "Address": { - "additionalProperties": false, - "type": "object" - }, "Balance": { "additionalProperties": false, "type": "object" @@ -6952,6 +6948,10 @@ "title": "Content Identifier", "type": "string" }, + "DelegatedAddress": { + "additionalProperties": false, + "type": "object" + }, "Head": { "title": "Content Identifier", "type": "string" @@ -7157,7 +7157,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4541" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4608" } }, { @@ -7254,7 +7254,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4552" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4619" } }, { @@ -7354,7 +7354,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4563" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4630" } }, { @@ -7418,15 +7418,11 @@ }, "Nonce": 42, "Balance": "0", - "Address": "f01234" + "DelegatedAddress": "f01234" } ], "additionalProperties": false, "properties": { - "Address": { - "additionalProperties": false, - "type": "object" - }, "Balance": { "additionalProperties": false, "type": "object" @@ -7435,6 +7431,10 @@ "title": "Content Identifier", "type": "string" }, + "DelegatedAddress": { + "additionalProperties": false, + "type": "object" + }, "Head": { "title": "Content Identifier", "type": "string" @@ -7454,7 +7454,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4574" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4641" } }, { @@ -7579,7 +7579,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4585" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4652" } }, { @@ -7688,7 +7688,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4596" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4663" } }, { @@ -7791,7 +7791,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4607" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4674" } }, { @@ -7921,7 +7921,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4618" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4685" } }, { @@ -8028,7 +8028,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4629" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4696" } }, { @@ -8089,7 +8089,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4640" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4707" } }, { @@ -8157,7 +8157,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4651" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4718" } }, { @@ -8238,7 +8238,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4662" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4729" } }, { @@ -8402,7 +8402,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4673" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4740" } }, { @@ -8495,7 +8495,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4684" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4751" } }, { @@ -8696,7 +8696,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4695" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4762" } }, { @@ -8807,7 +8807,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4706" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4773" } }, { @@ -8938,7 +8938,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4717" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4784" } }, { @@ -9024,7 +9024,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4728" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4795" } }, { @@ -9051,7 +9051,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4739" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4806" } }, { @@ -9104,7 +9104,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4750" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4817" } }, { @@ -9192,7 +9192,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4761" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4828" } }, { @@ -9316,7 +9316,7 @@ }, "Nonce": 42, "Balance": "0", - "Address": "f01234" + "DelegatedAddress": "f01234" } }, "GasCharges": [ @@ -9356,7 +9356,7 @@ }, "Nonce": 42, "Balance": "0", - "Address": "f01234" + "DelegatedAddress": "f01234" } }, "GasCharges": [ @@ -9426,10 +9426,6 @@ "State": { "additionalProperties": false, "properties": { - "Address": { - "additionalProperties": false, - "type": "object" - }, "Balance": { "additionalProperties": false, "type": "object" @@ -9438,6 +9434,10 @@ "title": "Content Identifier", "type": "string" }, + "DelegatedAddress": { + "additionalProperties": false, + "type": "object" + }, "Head": { "title": "Content Identifier", "type": "string" @@ -9643,7 +9643,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4772" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4839" } }, { @@ -9810,7 +9810,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4783" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4850" } }, { @@ -9983,7 +9983,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4794" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4861" } }, { @@ -10051,7 +10051,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4805" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4872" } }, { @@ -10119,7 +10119,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4816" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4883" } }, { @@ -10280,7 +10280,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4827" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4894" } }, { @@ -10325,7 +10325,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4849" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4916" } }, { @@ -10370,7 +10370,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4860" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4927" } }, { @@ -10397,7 +10397,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4871" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4938" } } ] diff --git a/build/openrpc/miner.json b/build/openrpc/miner.json index ebb5c2e824f..24fe74e71c0 100644 --- a/build/openrpc/miner.json +++ b/build/openrpc/miner.json @@ -2,7 +2,7 @@ "openrpc": "1.2.6", "info": { "title": "Lotus RPC API", - "version": "1.27.2" + "version": "1.28.0" }, "methods": [ { @@ -30,7 +30,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5157" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5224" } }, { @@ -109,7 +109,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5168" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5235" } }, { @@ -155,7 +155,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5179" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5246" } }, { @@ -203,7 +203,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5190" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5257" } }, { @@ -251,7 +251,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5201" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5268" } }, { @@ -354,7 +354,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5212" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5279" } }, { @@ -428,7 +428,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5223" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5290" } }, { @@ -591,7 +591,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5234" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5301" } }, { @@ -742,7 +742,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5245" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5312" } }, { @@ -781,7 +781,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5256" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5323" } }, { @@ -913,7 +913,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5267" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5334" } }, { @@ -945,7 +945,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5278" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5345" } }, { @@ -986,7 +986,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5289" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5356" } }, { @@ -1054,7 +1054,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5300" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5367" } }, { @@ -1185,7 +1185,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5311" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5378" } }, { @@ -1316,7 +1316,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5322" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5389" } }, { @@ -1416,7 +1416,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5333" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5400" } }, { @@ -1516,7 +1516,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5344" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5411" } }, { @@ -1616,7 +1616,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5355" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5422" } }, { @@ -1716,7 +1716,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5366" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5433" } }, { @@ -1816,7 +1816,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5377" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5444" } }, { @@ -1916,7 +1916,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5388" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5455" } }, { @@ -2040,7 +2040,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5399" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5466" } }, { @@ -2164,7 +2164,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5410" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5477" } }, { @@ -2279,7 +2279,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5421" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5488" } }, { @@ -2379,7 +2379,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5432" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5499" } }, { @@ -2512,7 +2512,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5443" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5510" } }, { @@ -2636,7 +2636,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5454" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5521" } }, { @@ -2760,7 +2760,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5465" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5532" } }, { @@ -2884,7 +2884,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5476" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5543" } }, { @@ -3017,7 +3017,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5487" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5554" } }, { @@ -3117,7 +3117,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5498" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5565" } }, { @@ -3157,7 +3157,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5509" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5576" } }, { @@ -3229,7 +3229,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5520" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5587" } }, { @@ -3279,7 +3279,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5531" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5598" } }, { @@ -3323,7 +3323,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5542" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5609" } }, { @@ -3364,7 +3364,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5553" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5620" } }, { @@ -3608,7 +3608,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5564" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5631" } }, { @@ -3682,7 +3682,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5575" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5642" } }, { @@ -3732,7 +3732,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5586" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5653" } }, { @@ -3761,7 +3761,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5597" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5664" } }, { @@ -3790,7 +3790,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5608" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5675" } }, { @@ -3846,7 +3846,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5619" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5686" } }, { @@ -3869,7 +3869,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5630" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5697" } }, { @@ -3929,7 +3929,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5641" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5708" } }, { @@ -3968,7 +3968,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5652" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5719" } }, { @@ -4008,7 +4008,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5663" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5730" } }, { @@ -4081,7 +4081,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5674" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5741" } }, { @@ -4145,7 +4145,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5685" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5752" } }, { @@ -4208,7 +4208,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5696" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5763" } }, { @@ -4258,7 +4258,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5707" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5774" } }, { @@ -4817,7 +4817,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5718" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5785" } }, { @@ -4858,7 +4858,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5729" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5796" } }, { @@ -4899,7 +4899,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5740" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5807" } }, { @@ -4940,7 +4940,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5751" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5818" } }, { @@ -4981,7 +4981,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5762" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5829" } }, { @@ -5022,7 +5022,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5773" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5840" } }, { @@ -5053,7 +5053,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5784" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5851" } }, { @@ -5103,7 +5103,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5795" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5862" } }, { @@ -5144,7 +5144,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5806" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5873" } }, { @@ -5183,7 +5183,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5817" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5884" } }, { @@ -5247,7 +5247,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5828" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5895" } }, { @@ -5305,7 +5305,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5839" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5906" } }, { @@ -5752,7 +5752,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5850" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5917" } }, { @@ -5788,7 +5788,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5861" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5928" } }, { @@ -5931,7 +5931,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5872" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5939" } }, { @@ -5987,7 +5987,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5883" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5950" } }, { @@ -6026,7 +6026,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5894" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5961" } }, { @@ -6203,7 +6203,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5905" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5972" } }, { @@ -6255,7 +6255,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5916" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5983" } }, { @@ -6447,7 +6447,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5927" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5994" } }, { @@ -6547,7 +6547,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5938" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6005" } }, { @@ -6601,7 +6601,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5949" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6016" } }, { @@ -6640,7 +6640,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5960" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6027" } }, { @@ -6725,7 +6725,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5971" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6038" } }, { @@ -6919,7 +6919,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5982" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6049" } }, { @@ -7017,7 +7017,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5993" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6060" } }, { @@ -7149,7 +7149,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6004" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6071" } }, { @@ -7203,7 +7203,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6015" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6082" } }, { @@ -7237,7 +7237,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6026" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6093" } }, { @@ -7324,7 +7324,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6037" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6104" } }, { @@ -7378,7 +7378,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6048" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6115" } }, { @@ -7478,7 +7478,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6059" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6126" } }, { @@ -7555,7 +7555,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6070" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6137" } }, { @@ -7646,7 +7646,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6081" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6148" } }, { @@ -7685,7 +7685,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6092" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6159" } }, { @@ -7801,7 +7801,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6103" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6170" } }, { @@ -9901,7 +9901,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6114" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6181" } } ] diff --git a/build/openrpc/worker.json b/build/openrpc/worker.json index e7c40a9b542..312fae376b1 100644 --- a/build/openrpc/worker.json +++ b/build/openrpc/worker.json @@ -2,7 +2,7 @@ "openrpc": "1.2.6", "info": { "title": "Lotus RPC API", - "version": "1.27.2" + "version": "1.28.0" }, "methods": [ { @@ -161,7 +161,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6202" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6269" } }, { @@ -252,7 +252,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6213" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6280" } }, { @@ -420,7 +420,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6224" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6291" } }, { @@ -447,7 +447,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6235" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6302" } }, { @@ -597,7 +597,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6246" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6313" } }, { @@ -700,7 +700,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6257" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6324" } }, { @@ -803,7 +803,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6268" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6335" } }, { @@ -925,7 +925,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6279" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6346" } }, { @@ -1135,7 +1135,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6290" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6357" } }, { @@ -1306,7 +1306,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6301" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6368" } }, { @@ -3350,7 +3350,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6312" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6379" } }, { @@ -3470,7 +3470,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6323" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6390" } }, { @@ -3531,7 +3531,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6334" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6401" } }, { @@ -3569,7 +3569,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6345" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6412" } }, { @@ -3729,7 +3729,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6356" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6423" } }, { @@ -3913,7 +3913,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6367" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6434" } }, { @@ -4054,7 +4054,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6378" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6445" } }, { @@ -4107,7 +4107,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6389" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6456" } }, { @@ -4250,7 +4250,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6400" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6467" } }, { @@ -4474,7 +4474,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6411" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6478" } }, { @@ -4601,7 +4601,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6422" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6489" } }, { @@ -4768,7 +4768,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6433" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6500" } }, { @@ -4895,7 +4895,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6444" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6511" } }, { @@ -4933,7 +4933,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6455" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6522" } }, { @@ -4972,7 +4972,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6466" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6533" } }, { @@ -4995,7 +4995,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6477" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6544" } }, { @@ -5034,7 +5034,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6488" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6555" } }, { @@ -5057,7 +5057,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6499" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6566" } }, { @@ -5096,7 +5096,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6510" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6577" } }, { @@ -5130,7 +5130,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6521" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6588" } }, { @@ -5184,7 +5184,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6532" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6599" } }, { @@ -5223,7 +5223,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6543" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6610" } }, { @@ -5262,7 +5262,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6554" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6621" } }, { @@ -5297,7 +5297,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6565" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6632" } }, { @@ -5477,7 +5477,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6576" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6643" } }, { @@ -5506,7 +5506,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6587" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6654" } }, { @@ -5529,7 +5529,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6598" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6665" } } ] diff --git a/build/params_2k.go b/build/params_2k.go index 7c754611eb4..203361a24b7 100644 --- a/build/params_2k.go +++ b/build/params_2k.go @@ -71,7 +71,7 @@ var UpgradeDragonHeight = abi.ChainEpoch(-24) var UpgradePhoenixHeight = abi.ChainEpoch(-25) -var UpgradeAussieHeight = abi.ChainEpoch(200) +var UpgradeWaffleHeight = abi.ChainEpoch(200) // This fix upgrade only ran on calibrationnet const UpgradeWatermelonFixHeight = -100 @@ -83,8 +83,7 @@ const UpgradeWatermelonFix2Height = -101 const UpgradeCalibrationDragonFixHeight = -102 var DrandSchedule = map[abi.ChainEpoch]DrandEnum{ - 0: DrandMainnet, - UpgradePhoenixHeight: DrandQuicknet, + 0: DrandQuicknet, } var SupportedProofTypes = []abi.RegisteredSealProof{ @@ -156,12 +155,11 @@ func init() { UpgradeThunderHeight = getUpgradeHeight("LOTUS_THUNDER_HEIGHT", UpgradeThunderHeight) UpgradeWatermelonHeight = getUpgradeHeight("LOTUS_WATERMELON_HEIGHT", UpgradeWatermelonHeight) UpgradeDragonHeight = getUpgradeHeight("LOTUS_DRAGON_HEIGHT", UpgradeDragonHeight) - UpgradeAussieHeight = getUpgradeHeight("LOTUS_AUSSIE_HEIGHT", UpgradeAussieHeight) + UpgradeWaffleHeight = getUpgradeHeight("LOTUS_WAFFLE_HEIGHT", UpgradeWaffleHeight) UpgradePhoenixHeight = getUpgradeHeight("LOTUS_PHOENIX_HEIGHT", UpgradePhoenixHeight) DrandSchedule = map[abi.ChainEpoch]DrandEnum{ - 0: DrandMainnet, - UpgradePhoenixHeight: DrandQuicknet, + 0: DrandQuicknet, } BuildType |= Build2k @@ -190,3 +188,7 @@ const BootstrapPeerThreshold = 1 const Eip155ChainId = 31415926 var WhitelistedBlock = cid.Undef + +const f3Enabled = true +const ManifestServerID = "12D3KooWHcNBkqXEBrsjoveQvj6zDF3vK5S9tAfqyYaQF1LGSJwG" +const F3BootstrapEpoch abi.ChainEpoch = 1000 diff --git a/build/params_butterfly.go b/build/params_butterfly.go index fee1a434326..34c4147874d 100644 --- a/build/params_butterfly.go +++ b/build/params_butterfly.go @@ -16,11 +16,10 @@ import ( ) var DrandSchedule = map[abi.ChainEpoch]DrandEnum{ - 0: DrandMainnet, - UpgradePhoenixHeight: DrandQuicknet, + 0: DrandQuicknet, } -const GenesisNetworkVersion = network.Version21 +const GenesisNetworkVersion = network.Version22 var NetworkBundle = "butterflynet" var BundleOverrides map[actorstypes.Version]string @@ -59,7 +58,7 @@ const UpgradeWatermelonHeight = -24 const UpgradeDragonHeight = -25 const UpgradePhoenixHeight = -26 -const UpgradeAussieHeight = 400 +const UpgradeWaffleHeight = 100 // This fix upgrade only ran on calibrationnet const UpgradeWatermelonFixHeight = -100 @@ -106,3 +105,7 @@ const BootstrapPeerThreshold = 2 const Eip155ChainId = 3141592 var WhitelistedBlock = cid.Undef + +const f3Enabled = true +const ManifestServerID = "12D3KooWJr9jy4ngtJNR7JC1xgLFra3DjEtyxskRYWvBK9TC3Yn6" +const F3BootstrapEpoch abi.ChainEpoch = 1000 diff --git a/build/params_calibnet.go b/build/params_calibnet.go index 889f6519635..b2232c0466b 100644 --- a/build/params_calibnet.go +++ b/build/params_calibnet.go @@ -98,8 +98,8 @@ const UpgradePhoenixHeight = UpgradeDragonHeight + 120 // 2024-04-03T11:00:00Z const UpgradeCalibrationDragonFixHeight = 1493854 -// ????? -const UpgradeAussieHeight = 999999999999999 +// 2024-07-11T12:00:00Z +const UpgradeWaffleHeight = 1779094 var SupportedProofTypes = []abi.RegisteredSealProof{ abi.RegisteredSealProof_StackedDrg32GiBV1, @@ -135,7 +135,6 @@ func init() { } BuildType = BuildCalibnet - } const BlockDelaySecs = uint64(builtin2.EpochDurationSeconds) @@ -152,3 +151,7 @@ const BootstrapPeerThreshold = 4 const Eip155ChainId = 314159 var WhitelistedBlock = cid.Undef + +const f3Enabled = true +const ManifestServerID = "12D3KooWS9vD9uwm8u2uPyJV32QBAhKAmPYwmziAgr3Xzk2FU1Mr" +const F3BootstrapEpoch abi.ChainEpoch = UpgradeWaffleHeight + 100 diff --git a/build/params_interop.go b/build/params_interop.go index 18e4a464be0..fefe9b5b7ea 100644 --- a/build/params_interop.go +++ b/build/params_interop.go @@ -25,7 +25,7 @@ var ActorDebugging = false const BootstrappersFile = "interopnet.pi" const GenesisFile = "interopnet.car" -const GenesisNetworkVersion = network.Version16 +const GenesisNetworkVersion = network.Version22 var UpgradeBreezeHeight = abi.ChainEpoch(-1) @@ -55,10 +55,9 @@ var UpgradeLightningHeight = abi.ChainEpoch(-22) var UpgradeThunderHeight = abi.ChainEpoch(-23) var UpgradeWatermelonHeight = abi.ChainEpoch(-24) var UpgradeDragonHeight = abi.ChainEpoch(-25) +var UpgradePhoenixHeight = abi.ChainEpoch(-26) -const UpgradeAussieHeight = 50 - -const UpgradePhoenixHeight = UpgradeDragonHeight + 100 +const UpgradeWaffleHeight = 50 // This fix upgrade only ran on calibrationnet const UpgradeWatermelonFixHeight = -1 @@ -70,8 +69,7 @@ const UpgradeWatermelonFix2Height = -2 const UpgradeCalibrationDragonFixHeight = -3 var DrandSchedule = map[abi.ChainEpoch]DrandEnum{ - 0: DrandMainnet, - UpgradePhoenixHeight: DrandQuicknet, + 0: DrandQuicknet, } var SupportedProofTypes = []abi.RegisteredSealProof{ @@ -146,3 +144,7 @@ const BootstrapPeerThreshold = 2 const Eip155ChainId = 3141592 var WhitelistedBlock = cid.Undef + +const f3Enabled = true +const ManifestServerID = "12D3KooWQJ2rdVnG4okDUB6yHQhAjNutGNemcM7XzqC9Eo4z9Jce" +const F3BootstrapEpoch abi.ChainEpoch = 1000 diff --git a/build/params_mainnet.go b/build/params_mainnet.go index e79acdca33d..967c620820f 100644 --- a/build/params_mainnet.go +++ b/build/params_mainnet.go @@ -106,8 +106,8 @@ const UpgradeDragonHeight = 3855360 // 2024-04-11T15:00:00Z const UpgradePhoenixHeight = UpgradeDragonHeight + 120 -// ?????? -var UpgradeAussieHeight = abi.ChainEpoch(9999999999) +// 2024-08-06T12:00:00Z +var UpgradeWaffleHeight = abi.ChainEpoch(4154640) // This fix upgrade only ran on calibrationnet const UpgradeWatermelonFixHeight = -1 @@ -133,8 +133,8 @@ func init() { SetAddressNetwork(address.Mainnet) } - if os.Getenv("LOTUS_DISABLE_AUSSIE") == "1" { - UpgradeAussieHeight = math.MaxInt64 - 1 + if os.Getenv("LOTUS_DISABLE_WAFFLE") == "1" { + UpgradeWaffleHeight = math.MaxInt64 - 1 } // NOTE: DO NOT change this unless you REALLY know what you're doing. This is not consensus critical, however, @@ -168,3 +168,7 @@ const Eip155ChainId = 314 // WhitelistedBlock skips checks on message validity in this block to sidestep the zero-bls signature var WhitelistedBlock = MustParseCid("bafy2bzaceapyg2uyzk7vueh3xccxkuwbz3nxewjyguoxvhx77malc2lzn2ybi") + +const f3Enabled = false +const ManifestServerID = "12D3KooWENMwUF9YxvQxar7uBWJtZkA6amvK4xWmKXfSiHUo2Qq7" +const F3BootstrapEpoch abi.ChainEpoch = -1 diff --git a/build/params_shared_funcs.go b/build/params_shared_funcs.go index d117264ab6f..84ffd6f4513 100644 --- a/build/params_shared_funcs.go +++ b/build/params_shared_funcs.go @@ -1,6 +1,8 @@ package build import ( + "os" + "github.com/ipfs/go-cid" "github.com/libp2p/go-libp2p/core/protocol" @@ -49,3 +51,8 @@ func MustParseCid(c string) cid.Cid { return ret } + +func IsF3Enabled() bool { + const F3DisableEnvKey = "LOTUS_DISABLE_F3" + return f3Enabled && len(os.Getenv(F3DisableEnvKey)) == 0 +} diff --git a/build/params_testground.go b/build/params_testground.go index beb296bd92e..864603d169d 100644 --- a/build/params_testground.go +++ b/build/params_testground.go @@ -115,7 +115,7 @@ var ( UpgradeDragonHeight abi.ChainEpoch = -26 UpgradePhoenixHeight abi.ChainEpoch = -27 UpgradeCalibrationDragonFixHeight abi.ChainEpoch = -28 - UpgradeAussieHeight abi.ChainEpoch = -29 + UpgradeWaffleHeight abi.ChainEpoch = -29 DrandSchedule = map[abi.ChainEpoch]DrandEnum{ 0: DrandMainnet, @@ -133,9 +133,12 @@ var ( Devnet = true ZeroAddress = MustParseAddress("f3yaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaby2smx7a") - WhitelistedBlock = cid.Undef - BootstrappersFile = "" - GenesisFile = "" + WhitelistedBlock = cid.Undef + BootstrappersFile = "" + GenesisFile = "" + f3Enabled = false + ManifestServerID = "" + F3BootstrapEpoch abi.ChainEpoch = -1 ) const Finality = policy.ChainFinality diff --git a/build/version.go b/build/version.go index aeab6df92fc..9d52782ed04 100644 --- a/build/version.go +++ b/build/version.go @@ -39,7 +39,7 @@ func BuildTypeString() string { } // NodeBuildVersion is the local build version of the Lotus daemon -const NodeBuildVersion string = "1.27.2" +const NodeBuildVersion string = "1.28.0" func NodeUserVersion() BuildVersion { if os.Getenv("LOTUS_VERSION_IGNORE_COMMIT") == "1" { @@ -50,7 +50,7 @@ func NodeUserVersion() BuildVersion { } // MinerBuildVersion is the local build version of the Lotus miner -const MinerBuildVersion = "1.27.1" +const MinerBuildVersion = "1.28.0" func MinerUserVersion() BuildVersion { if os.Getenv("LOTUS_VERSION_IGNORE_COMMIT") == "1" { diff --git a/chain/actors/builtin/miner/utils.go b/chain/actors/builtin/miner/utils.go index 072eab986bc..cafc0f33418 100644 --- a/chain/actors/builtin/miner/utils.go +++ b/chain/actors/builtin/miner/utils.go @@ -8,7 +8,16 @@ import ( "github.com/filecoin-project/go-state-types/network" ) +type SealProofVariant int + +const ( + SealProofVariant_Standard SealProofVariant = iota + SealProofVariant_Synthetic + SealProofVariant_NonInteractive +) + var MinSyntheticPoRepVersion = network.Version21 +var MinNonInteractivePoRepVersion = network.Version23 func AllPartSectors(mas State, sget func(Partition) (bitfield.BitField, error)) (bitfield.BitField, error) { var parts []bitfield.BitField @@ -33,7 +42,18 @@ func AllPartSectors(mas State, sget func(Partition) (bitfield.BitField, error)) // SealProofTypeFromSectorSize returns preferred seal proof type for creating // new miner actors and new sectors -func SealProofTypeFromSectorSize(ssize abi.SectorSize, nv network.Version, synthetic bool) (abi.RegisteredSealProof, error) { +func SealProofTypeFromSectorSize(ssize abi.SectorSize, nv network.Version, variant SealProofVariant) (abi.RegisteredSealProof, error) { + switch variant { + case SealProofVariant_Synthetic: + if nv < MinSyntheticPoRepVersion { + return 0, xerrors.Errorf("synthetic proofs are not supported on network version %d", nv) + } + case SealProofVariant_NonInteractive: + if nv < MinNonInteractivePoRepVersion { + return 0, xerrors.Errorf("non-interactive proofs are not supported on network version %d", nv) + } + } + switch { case nv < network.Version7: switch ssize { @@ -67,11 +87,13 @@ func SealProofTypeFromSectorSize(ssize abi.SectorSize, nv network.Version, synth return 0, xerrors.Errorf("unsupported sector size for miner: %v", ssize) } - if nv >= MinSyntheticPoRepVersion && synthetic { + switch variant { + case SealProofVariant_Synthetic: return toSynthetic(v) - } else { - return v, nil + case SealProofVariant_NonInteractive: + return toNonInteractive(v) } + return v, nil } return 0, xerrors.Errorf("unsupported network version") @@ -94,6 +116,23 @@ func toSynthetic(in abi.RegisteredSealProof) (abi.RegisteredSealProof, error) { } } +func toNonInteractive(in abi.RegisteredSealProof) (abi.RegisteredSealProof, error) { + switch in { + case abi.RegisteredSealProof_StackedDrg2KiBV1_1: + return abi.RegisteredSealProof_StackedDrg2KiBV1_2_Feat_NiPoRep, nil + case abi.RegisteredSealProof_StackedDrg8MiBV1_1: + return abi.RegisteredSealProof_StackedDrg8MiBV1_2_Feat_NiPoRep, nil + case abi.RegisteredSealProof_StackedDrg512MiBV1_1: + return abi.RegisteredSealProof_StackedDrg512MiBV1_2_Feat_NiPoRep, nil + case abi.RegisteredSealProof_StackedDrg32GiBV1_1: + return abi.RegisteredSealProof_StackedDrg32GiBV1_2_Feat_NiPoRep, nil + case abi.RegisteredSealProof_StackedDrg64GiBV1_1: + return abi.RegisteredSealProof_StackedDrg64GiBV1_2_Feat_NiPoRep, nil + default: + return 0, xerrors.Errorf("unsupported conversion to non-interactive: %v", in) + } +} + // WindowPoStProofTypeFromSectorSize returns preferred post proof type for creating // new miner actors and new sectors func WindowPoStProofTypeFromSectorSize(ssize abi.SectorSize, nv network.Version) (abi.RegisteredPoStProof, error) { diff --git a/chain/consensus/common.go b/chain/consensus/common.go index f679b92b682..49c38fee15a 100644 --- a/chain/consensus/common.go +++ b/chain/consensus/common.go @@ -168,12 +168,12 @@ func IsValidForSending(nv network.Version, act *types.Actor) bool { // Allow placeholder actors with a delegated address and nonce 0 to send a message. // These will be converted to an EthAccount actor on first send. - if !builtin.IsPlaceholderActor(act.Code) || act.Nonce != 0 || act.Address == nil || act.Address.Protocol() != address.Delegated { + if !builtin.IsPlaceholderActor(act.Code) || act.Nonce != 0 || act.DelegatedAddress == nil || act.DelegatedAddress.Protocol() != address.Delegated { return false } // Only allow such actors to send if their delegated address is in the EAM's namespace. - id, _, err := varint.FromUvarint(act.Address.Payload()) + id, _, err := varint.FromUvarint(act.DelegatedAddress.Payload()) return err == nil && id == builtintypes.EthereumAddressManagerActorID } diff --git a/chain/consensus/filcns/upgrades.go b/chain/consensus/filcns/upgrades.go index 2a003e82e32..becd91bc4e2 100644 --- a/chain/consensus/filcns/upgrades.go +++ b/chain/consensus/filcns/upgrades.go @@ -304,7 +304,7 @@ func DefaultUpgradeSchedule() stmgr.UpgradeSchedule { Network: network.Version22, Migration: upgradeActorsV13VerifregFix(calibnetv13BuggyVerifregCID1, calibnetv13CorrectManifestCID1), }, { - Height: build.UpgradeAussieHeight, + Height: build.UpgradeWaffleHeight, Network: network.Version23, Migration: UpgradeActorsV14, PreMigrations: []stmgr.PreMigration{{ @@ -2115,11 +2115,11 @@ func buildUpgradeActorsV12MinerFix(oldBuggyMinerCID, newManifestCID cid.Cid) fun } return actorsOut.SetActor(a, &types.ActorV5{ - Code: newCid, - Head: actor.Head, - Nonce: actor.Nonce, - Balance: actor.Balance, - Address: actor.Address, + Code: newCid, + Head: actor.Head, + Nonce: actor.Nonce, + Balance: actor.Balance, + DelegatedAddress: actor.DelegatedAddress, }) }) if err != nil { @@ -2153,8 +2153,8 @@ func buildUpgradeActorsV12MinerFix(oldBuggyMinerCID, newManifestCID cid.Cid) fun return xerrors.Errorf("mismatched balance for actor %s: %d != %d", a, inActor.Balance, outActor.Balance) } - if inActor.Address != outActor.Address && inActor.Address.String() != outActor.Address.String() { - return xerrors.Errorf("mismatched address for actor %s: %s != %s", a, inActor.Address, outActor.Address) + if inActor.DelegatedAddress != outActor.DelegatedAddress && inActor.DelegatedAddress.String() != outActor.DelegatedAddress.String() { + return xerrors.Errorf("mismatched address for actor %s: %s != %s", a, inActor.DelegatedAddress, outActor.DelegatedAddress) } if inActor.Head != outActor.Head && a != builtin.SystemActorAddr { @@ -2413,11 +2413,11 @@ func upgradeActorsV13VerifregFix(oldBuggyVerifregCID, newManifestCID cid.Cid) fu } return actorsOut.SetActor(a, &types.ActorV5{ - Code: newCid, - Head: actor.Head, - Nonce: actor.Nonce, - Balance: actor.Balance, - Address: actor.Address, + Code: newCid, + Head: actor.Head, + Nonce: actor.Nonce, + Balance: actor.Balance, + DelegatedAddress: actor.DelegatedAddress, }) }) if err != nil { @@ -2451,8 +2451,8 @@ func upgradeActorsV13VerifregFix(oldBuggyVerifregCID, newManifestCID cid.Cid) fu return xerrors.Errorf("mismatched balance for actor %s: %d != %d", a, inActor.Balance, outActor.Balance) } - if inActor.Address != outActor.Address && inActor.Address.String() != outActor.Address.String() { - return xerrors.Errorf("mismatched address for actor %s: %s != %s", a, inActor.Address, outActor.Address) + if inActor.DelegatedAddress != outActor.DelegatedAddress && inActor.DelegatedAddress.String() != outActor.DelegatedAddress.String() { + return xerrors.Errorf("mismatched address for actor %s: %s != %s", a, inActor.DelegatedAddress, outActor.DelegatedAddress) } if inActor.Head != outActor.Head && a != builtin.SystemActorAddr { diff --git a/chain/events/filter/index.go b/chain/events/filter/index.go index fed6c42eb31..d18563a9488 100644 --- a/chain/events/filter/index.go +++ b/chain/events/filter/index.go @@ -698,11 +698,12 @@ func (ei *EventIndex) GetMaxHeightInIndex(ctx context.Context) (uint64, error) { return maxHeight, err } -func (ei *EventIndex) IsHeightProcessed(ctx context.Context, height uint64) (bool, error) { - row := ei.stmtIsHeightProcessed.QueryRowContext(ctx, height) - var exists bool - err := row.Scan(&exists) - return exists, err +func (ei *EventIndex) IsHeightPast(ctx context.Context, height uint64) (bool, error) { + maxHeight, err := ei.GetMaxHeightInIndex(ctx) + if err != nil { + return false, err + } + return height <= maxHeight, nil } func (ei *EventIndex) IsTipsetProcessed(ctx context.Context, tipsetKeyCid []byte) (bool, error) { diff --git a/chain/events/filter/index_test.go b/chain/events/filter/index_test.go index 10b3eb57779..8aa3d51bba2 100644 --- a/chain/events/filter/index_test.go +++ b/chain/events/filter/index_test.go @@ -94,17 +94,21 @@ func TestEventIndexPrefillFilter(t *testing.T) { require.NoError(t, err) require.Equal(t, uint64(14000), mh) - b, err := ei.IsHeightProcessed(context.Background(), 14000) + b, err := ei.IsHeightPast(context.Background(), 14000) require.NoError(t, err) require.True(t, b) - b, err = ei.IsHeightProcessed(context.Background(), 14001) + b, err = ei.IsHeightPast(context.Background(), 14001) require.NoError(t, err) require.False(t, b) - b, err = ei.IsHeightProcessed(context.Background(), 13000) + b, err = ei.IsHeightPast(context.Background(), 13000) require.NoError(t, err) - require.False(t, b) + require.True(t, b) + + b, err = ei.IsHeightPast(context.Background(), 13001) + require.NoError(t, err) + require.True(t, b) tsKey := events14000.msgTs.Key() tsKeyCid, err := tsKey.Cid() diff --git a/chain/exchange/client.go b/chain/exchange/client.go index 9cbb4495517..e21e6b672cc 100644 --- a/chain/exchange/client.go +++ b/chain/exchange/client.go @@ -437,9 +437,12 @@ func (c *client) sendRequestToPeer(ctx context.Context, peer peer.ID, req *Reque connectionStart := build.Clock.Now() + sctx, cancel := context.WithTimeout(ctx, streamOpenTimeout) + defer cancel() + // Open stream to peer. stream, err := c.host.NewStream( - network.WithNoDial(ctx, "should already have connection"), + network.WithNoDial(sctx, "should already have connection"), peer, ChainExchangeProtocolID) if err != nil { diff --git a/chain/exchange/protocol.go b/chain/exchange/protocol.go index 7a22de8a3fa..c16bb6b428b 100644 --- a/chain/exchange/protocol.go +++ b/chain/exchange/protocol.go @@ -39,6 +39,7 @@ const ( ShufflePeersPrefix = 16 WriteResDeadline = 60 * time.Second streamReadDeadline = 10 * time.Second + streamOpenTimeout = 1 * time.Minute ) // FIXME: Rename. Make private. diff --git a/chain/gen/genesis/genesis.go b/chain/gen/genesis/genesis.go index 8ec657479f7..69abfd223eb 100644 --- a/chain/gen/genesis/genesis.go +++ b/chain/gen/genesis/genesis.go @@ -378,11 +378,16 @@ func MakeAccountActor(ctx context.Context, cst cbor.IpldStore, av actorstypes.Ve return nil, xerrors.Errorf("failed to get account actor code ID for actors version %d", av) } + var delegatedAddr *address.Address + if addr.Protocol() == address.Delegated { + delegatedAddr = &addr + } + act := &types.Actor{ - Code: actcid, - Head: statecid, - Balance: bal, - Address: &addr, + Code: actcid, + Head: statecid, + Balance: bal, + DelegatedAddress: delegatedAddr, } return act, nil diff --git a/chain/gen/genesis/genesis_eth.go b/chain/gen/genesis/genesis_eth.go index d5aa2f0b51b..a484d3e6851 100644 --- a/chain/gen/genesis/genesis_eth.go +++ b/chain/gen/genesis/genesis_eth.go @@ -48,7 +48,6 @@ func SetupEAM(_ context.Context, nst *state.StateTree, nv network.Version) error Code: codecid, Head: vm.EmptyObjectCid, Balance: big.Zero(), - Address: &builtin.EthereumAddressManagerActorAddr, // so that it can create ETH0 } return nst.SetActor(builtin.EthereumAddressManagerActorAddr, header) } @@ -60,12 +59,16 @@ func MakeEthNullAddressActor(av actorstypes.Version, addr address.Address) (*typ return nil, xerrors.Errorf("failed to get EthAccount actor code ID for actors version %d", av) } + if addr.Protocol() != address.Delegated { + return nil, xerrors.Errorf("eth accounts must have f4 addresses, %s is not an f4 address", addr) + } + act := &types.Actor{ - Code: actcid, - Head: vm.EmptyObjectCid, - Nonce: 0, - Balance: big.Zero(), - Address: &addr, + Code: actcid, + Head: vm.EmptyObjectCid, + Nonce: 0, + Balance: big.Zero(), + DelegatedAddress: &addr, } return act, nil diff --git a/chain/gen/genesis/miners.go b/chain/gen/genesis/miners.go index 9ae39cf35cb..340ed75f1f6 100644 --- a/chain/gen/genesis/miners.go +++ b/chain/gen/genesis/miners.go @@ -18,6 +18,7 @@ import ( "github.com/filecoin-project/go-state-types/big" builtintypes "github.com/filecoin-project/go-state-types/builtin" power11 "github.com/filecoin-project/go-state-types/builtin/v11/power" + miner14 "github.com/filecoin-project/go-state-types/builtin/v14/miner" minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner" markettypes "github.com/filecoin-project/go-state-types/builtin/v9/market" miner9 "github.com/filecoin-project/go-state-types/builtin/v9/miner" @@ -41,6 +42,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/builtin/miner" "github.com/filecoin-project/lotus/chain/actors/builtin/power" "github.com/filecoin-project/lotus/chain/actors/builtin/reward" + "github.com/filecoin-project/lotus/chain/actors/builtin/system" "github.com/filecoin-project/lotus/chain/actors/policy" "github.com/filecoin-project/lotus/chain/consensus" lrand "github.com/filecoin-project/lotus/chain/rand" @@ -136,7 +138,11 @@ func SetupStorageMiners(ctx context.Context, cs *store.ChainStore, sys vm.Syscal i := i m := m - spt, err := miner.SealProofTypeFromSectorSize(m.SectorSize, nv, synthetic) + variant := miner.SealProofVariant_Standard + if synthetic { + variant = miner.SealProofVariant_Synthetic + } + spt, err := miner.SealProofTypeFromSectorSize(m.SectorSize, nv, variant) if err != nil { return cid.Undef, err } @@ -491,7 +497,12 @@ func SetupStorageMiners(ctx context.Context, cs *store.ChainStore, sys vm.Syscal // Commit one-by-one, otherwise pledge math tends to explode var paramBytes []byte - if av >= actorstypes.Version6 { + if av >= actorstypes.Version14 { + confirmParams := &miner14.InternalSectorSetupForPresealParams{ + Sectors: []abi.SectorNumber{preseal.SectorID}, + } + paramBytes = mustEnc(confirmParams) + } else if av >= actorstypes.Version6 { // TODO: fixup confirmParams := &builtin6.ConfirmSectorProofsParams{ Sectors: []abi.SectorNumber{preseal.SectorID}, @@ -506,9 +517,17 @@ func SetupStorageMiners(ctx context.Context, cs *store.ChainStore, sys vm.Syscal paramBytes = mustEnc(confirmParams) } - _, err = doExecValue(ctx, genesisVm, minerInfos[i].maddr, power.Address, big.Zero(), builtintypes.MethodsMiner.ConfirmSectorProofsValid, paramBytes) - if err != nil { - return cid.Undef, xerrors.Errorf("failed to confirm presealed sectors: %w", err) + var csErr error + if nv >= network.Version23 { + _, csErr = doExecValue(ctx, genesisVm, minerInfos[i].maddr, system.Address, big.Zero(), builtintypes.MethodsMiner.InternalSectorSetupForPreseal, + paramBytes) + } else { + _, csErr = doExecValue(ctx, genesisVm, minerInfos[i].maddr, power.Address, big.Zero(), builtintypes.MethodsMiner.InternalSectorSetupForPreseal, + paramBytes) + } + + if csErr != nil { + return cid.Undef, xerrors.Errorf("failed to confirm presealed sectors: %w", csErr) } if av >= actorstypes.Version2 { diff --git a/chain/lf3/ec.go b/chain/lf3/ec.go new file mode 100644 index 00000000000..baa483e16e6 --- /dev/null +++ b/chain/lf3/ec.go @@ -0,0 +1,221 @@ +package lf3 + +import ( + "context" + "sort" + "time" + + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-f3/ec" + "github.com/filecoin-project/go-f3/gpbft" + "github.com/filecoin-project/go-state-types/abi" + + "github.com/filecoin-project/lotus/chain/actors/builtin/miner" + "github.com/filecoin-project/lotus/chain/actors/builtin/power" + "github.com/filecoin-project/lotus/chain/stmgr" + "github.com/filecoin-project/lotus/chain/store" + "github.com/filecoin-project/lotus/chain/types" + "github.com/filecoin-project/lotus/chain/vm" +) + +type ecWrapper struct { + ChainStore *store.ChainStore + StateManager *stmgr.StateManager +} + +var _ ec.TipSet = (*f3TipSet)(nil) + +type f3TipSet types.TipSet + +func (ts *f3TipSet) cast() *types.TipSet { + return (*types.TipSet)(ts) +} + +func (ts *f3TipSet) String() string { + return ts.cast().String() +} + +func (ts *f3TipSet) Key() gpbft.TipSetKey { + return ts.cast().Key().Bytes() +} + +func (ts *f3TipSet) Beacon() []byte { + entries := ts.cast().Blocks()[0].BeaconEntries + if len(entries) == 0 { + // This should never happen in practice, but set beacon to a non-nil + // 32byte slice to force the message builder to generate a + // ticket. Otherwise, messages that require ticket, i.e. CONVERGE will fail + // validation due to the absence of ticket. This is a convoluted way of doing it. + return make([]byte, 32) + } + return entries[len(entries)-1].Data +} + +func (ts *f3TipSet) Epoch() int64 { + return int64(ts.cast().Height()) +} + +func (ts *f3TipSet) Timestamp() time.Time { + return time.Unix(int64(ts.cast().Blocks()[0].Timestamp), 0) +} + +func wrapTS(ts *types.TipSet) ec.TipSet { + if ts == nil { + return nil + } + return (*f3TipSet)(ts) +} + +// GetTipsetByEpoch should return a tipset before the one requested if the requested +// tipset does not exist due to null epochs +func (ec *ecWrapper) GetTipsetByEpoch(ctx context.Context, epoch int64) (ec.TipSet, error) { + ts, err := ec.ChainStore.GetTipsetByHeight(ctx, abi.ChainEpoch(epoch), nil, true) + if err != nil { + return nil, xerrors.Errorf("getting tipset by height: %w", err) + } + return wrapTS(ts), nil +} + +func (ec *ecWrapper) GetTipset(ctx context.Context, tsk gpbft.TipSetKey) (ec.TipSet, error) { + tskLotus, err := types.TipSetKeyFromBytes(tsk) + if err != nil { + return nil, xerrors.Errorf("decoding tsk: %w", err) + } + + ts, err := ec.ChainStore.GetTipSetFromKey(ctx, tskLotus) + if err != nil { + return nil, xerrors.Errorf("getting tipset by key: %w", err) + } + + return wrapTS(ts), nil +} + +func (ec *ecWrapper) GetHead(_ context.Context) (ec.TipSet, error) { + return wrapTS(ec.ChainStore.GetHeaviestTipSet()), nil +} + +func (ec *ecWrapper) GetParent(ctx context.Context, tsF3 ec.TipSet) (ec.TipSet, error) { + var ts *types.TipSet + if tsW, ok := tsF3.(*f3TipSet); ok { + ts = tsW.cast() + } else { + // There are only two implementations of ec.TipSet: f3TipSet, and one in fake EC + // backend. + // + // TODO: Revisit the type check here and remove as needed once testing + // is over and fake EC backend goes away. + tskLotus, err := types.TipSetKeyFromBytes(tsF3.Key()) + if err != nil { + return nil, xerrors.Errorf("decoding tsk: %w", err) + } + ts, err = ec.ChainStore.GetTipSetFromKey(ctx, tskLotus) + if err != nil { + return nil, xerrors.Errorf("getting tipset by key for get parent: %w", err) + } + } + parentTs, err := ec.ChainStore.GetTipSetFromKey(ctx, ts.Parents()) + if err != nil { + return nil, xerrors.Errorf("getting parent tipset: %w", err) + } + return wrapTS(parentTs), nil +} + +func (ec *ecWrapper) GetPowerTable(ctx context.Context, tskF3 gpbft.TipSetKey) (gpbft.PowerEntries, error) { + tsk, err := types.TipSetKeyFromBytes(tskF3) + if err != nil { + return nil, xerrors.Errorf("decoding tsk: %w", err) + } + return ec.getPowerTableLotusTSK(ctx, tsk) +} + +func (ec *ecWrapper) getPowerTableLotusTSK(ctx context.Context, tsk types.TipSetKey) (gpbft.PowerEntries, error) { + ts, err := ec.ChainStore.GetTipSetFromKey(ctx, tsk) + if err != nil { + return nil, xerrors.Errorf("getting tipset by key for get parent: %w", err) + } + + state, err := ec.StateManager.ParentState(ts) + if err != nil { + return nil, xerrors.Errorf("loading the state tree: %w", err) + } + powerAct, err := state.GetActor(power.Address) + if err != nil { + return nil, xerrors.Errorf("getting the power actor: %w", err) + } + + powerState, err := power.Load(ec.ChainStore.ActorStore(ctx), powerAct) + if err != nil { + return nil, xerrors.Errorf("loading power actor state: %w", err) + } + + var powerEntries gpbft.PowerEntries + err = powerState.ForEachClaim(func(minerAddr address.Address, claim power.Claim) error { + if claim.QualityAdjPower.Sign() <= 0 { + return nil + } + + // TODO: optimize + ok, err := powerState.MinerNominalPowerMeetsConsensusMinimum(minerAddr) + if err != nil { + return xerrors.Errorf("checking consensus minimums: %w", err) + } + if !ok { + return nil + } + + id, err := address.IDFromAddress(minerAddr) + if err != nil { + return xerrors.Errorf("transforming address to ID: %w", err) + } + + pe := gpbft.PowerEntry{ + ID: gpbft.ActorID(id), + Power: claim.QualityAdjPower.Int, + } + + act, err := state.GetActor(minerAddr) + if err != nil { + return xerrors.Errorf("(get sset) failed to load miner actor: %w", err) + } + mstate, err := miner.Load(ec.ChainStore.ActorStore(ctx), act) + if err != nil { + return xerrors.Errorf("(get sset) failed to load miner actor state: %w", err) + } + + info, err := mstate.Info() + if err != nil { + return xerrors.Errorf("failed to load actor info: %w", err) + } + // check fee debt + if debt, err := mstate.FeeDebt(); err != nil { + return err + } else if !debt.IsZero() { + // fee debt don't add the miner to power table + return nil + } + // check consensus faults + if ts.Height() <= info.ConsensusFaultElapsed { + return nil + } + + waddr, err := vm.ResolveToDeterministicAddr(state, ec.ChainStore.ActorStore(ctx), info.Worker) + if err != nil { + return xerrors.Errorf("resolve miner worker address: %w", err) + } + + if waddr.Protocol() != address.BLS { + return xerrors.Errorf("wrong type of worker address") + } + pe.PubKey = gpbft.PubKey(waddr.Payload()) + powerEntries = append(powerEntries, pe) + return nil + }) + if err != nil { + return nil, xerrors.Errorf("collecting the power table: %w", err) + } + + sort.Sort(powerEntries) + return powerEntries, nil +} diff --git a/chain/lf3/f3.go b/chain/lf3/f3.go new file mode 100644 index 00000000000..2514320ea7b --- /dev/null +++ b/chain/lf3/f3.go @@ -0,0 +1,191 @@ +package lf3 + +import ( + "context" + "errors" + "time" + + "github.com/ipfs/go-datastore" + "github.com/ipfs/go-datastore/namespace" + logging "github.com/ipfs/go-log/v2" + pubsub "github.com/libp2p/go-libp2p-pubsub" + "github.com/libp2p/go-libp2p/core/host" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/exporters/prometheus" + "go.opentelemetry.io/otel/sdk/metric" + "go.uber.org/fx" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-f3" + "github.com/filecoin-project/go-f3/blssig" + "github.com/filecoin-project/go-f3/certs" + "github.com/filecoin-project/go-f3/gpbft" + "github.com/filecoin-project/go-f3/manifest" + + "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/chain/stmgr" + "github.com/filecoin-project/lotus/chain/store" + "github.com/filecoin-project/lotus/chain/types" + "github.com/filecoin-project/lotus/node/modules/dtypes" + "github.com/filecoin-project/lotus/node/modules/helpers" +) + +type F3 struct { + inner *f3.F3 + ec *ecWrapper + + signer gpbft.Signer + newLeases chan leaseRequest +} + +type F3Params struct { + fx.In + + NetworkName dtypes.NetworkName + ManifestProvider manifest.ManifestProvider + PubSub *pubsub.PubSub + Host host.Host + ChainStore *store.ChainStore + StateManager *stmgr.StateManager + Datastore dtypes.MetadataDS + Wallet api.Wallet +} + +var log = logging.Logger("f3") + +func init() { + // Set up otel to prometheus reporting so that F3 metrics are reported via lotus + // prometheus metrics. This bridge eventually gets picked up by opencensus + // exporter as HTTP handler. This by default registers an otel collector against + // the global prometheus registry. In the future, we should clean up metrics in + // Lotus and move it all to use otel. For now, bridge away. + if bridge, err := prometheus.New(); err != nil { + log.Errorf("could not create the otel prometheus exporter: %v", err) + } else { + provider := metric.NewMeterProvider(metric.WithReader(bridge)) + otel.SetMeterProvider(provider) + } +} + +func New(mctx helpers.MetricsCtx, lc fx.Lifecycle, params F3Params) (*F3, error) { + + ds := namespace.Wrap(params.Datastore, datastore.NewKey("/f3")) + ec := &ecWrapper{ + ChainStore: params.ChainStore, + StateManager: params.StateManager, + } + verif := blssig.VerifierWithKeyOnG1() + + module, err := f3.New(mctx, params.ManifestProvider, ds, + params.Host, params.PubSub, verif, ec) + + if err != nil { + return nil, xerrors.Errorf("creating F3: %w", err) + } + + fff := &F3{ + inner: module, + ec: ec, + signer: &signer{params.Wallet}, + newLeases: make(chan leaseRequest, 4), // some buffer to avoid blocking + } + + lCtx, cancel := context.WithCancel(mctx) + lc.Append(fx.StartStopHook( + func() { + err := fff.inner.Start(lCtx) + if err != nil { + log.Errorf("running f3: %+v", err) + return + } + go fff.runSigningLoop(lCtx) + }, cancel)) + + return fff, nil +} + +type leaseRequest struct { + minerID uint64 + newExpiration time.Time + oldExpiration time.Time + resultCh chan<- bool +} + +func (fff *F3) runSigningLoop(ctx context.Context) { + participateOnce := func(ctx context.Context, mb *gpbft.MessageBuilder, minerID uint64) error { + signatureBuilder, err := mb.PrepareSigningInputs(gpbft.ActorID(minerID)) + if errors.Is(err, gpbft.ErrNoPower) { + // we don't have any power in F3, continue + log.Debug("no power to participate in F3: %+v", err) + return nil + } + if err != nil { + return xerrors.Errorf("preparing signing inputs: %+v", err) + } + // if worker keys were stored not in the node, the signatureBuilder can be send there + // the sign can be called where the keys are stored and then + // {signatureBuilder, payloadSig, vrfSig} can be sent back to lotus for broadcast + payloadSig, vrfSig, err := signatureBuilder.Sign(ctx, fff.signer) + if err != nil { + return xerrors.Errorf("signing message: %+v", err) + } + log.Debugf("miner with id %d is sending message in F3", minerID) + fff.inner.Broadcast(ctx, signatureBuilder, payloadSig, vrfSig) + return nil + } + + leaseMngr := new(leaseManager) + msgCh := fff.inner.MessagesToSign() + +loop: + for ctx.Err() == nil { + select { + case <-ctx.Done(): + return + case l := <-fff.newLeases: + // resultCh has only one user and is buffered + l.resultCh <- leaseMngr.UpsertDefensive(l.minerID, l.newExpiration, l.oldExpiration) + close(l.resultCh) + case mb, ok := <-msgCh: + if !ok { + continue loop + } + + for _, minerID := range leaseMngr.Active() { + err := participateOnce(ctx, mb, minerID) + if err != nil { + log.Errorf("while participating for miner f0%d: %+v", minerID, err) + } + } + } + } +} + +// Participate notifies participation loop about a new lease +// Returns true if lease was accepted +func (fff *F3) Participate(ctx context.Context, minerID uint64, newLeaseExpiration, oldLeaseExpiration time.Time) bool { + resultCh := make(chan bool, 1) //buffer the channel to for sure avoid blocking + request := leaseRequest{minerID: minerID, newExpiration: newLeaseExpiration, resultCh: resultCh} + select { + case fff.newLeases <- request: + return <-resultCh + case <-ctx.Done(): + return false + } +} + +func (fff *F3) GetCert(ctx context.Context, instance uint64) (*certs.FinalityCertificate, error) { + return fff.inner.GetCert(ctx, instance) +} + +func (fff *F3) GetLatestCert(ctx context.Context) (*certs.FinalityCertificate, error) { + return fff.inner.GetLatestCert(ctx) +} + +func (fff *F3) GetPowerTable(ctx context.Context, tsk types.TipSetKey) (gpbft.PowerEntries, error) { + return fff.ec.getPowerTableLotusTSK(ctx, tsk) +} + +func (fff *F3) GetF3PowerTable(ctx context.Context, tsk types.TipSetKey) (gpbft.PowerEntries, error) { + return fff.inner.GetPowerTable(ctx, tsk.Bytes()) +} diff --git a/chain/lf3/leasemanager.go b/chain/lf3/leasemanager.go new file mode 100644 index 00000000000..24c75933aa8 --- /dev/null +++ b/chain/lf3/leasemanager.go @@ -0,0 +1,73 @@ +package lf3 + +import ( + "time" + + "github.com/raulk/clock" +) + +type leaseManager struct { + // clock for testing + clock clock.Clock + leases map[uint64]time.Time +} + +// Upsert inserts or updates a lease for given id to the expiration time. +func (lm *leaseManager) Upsert(id uint64, expiration time.Time) { + if lm.leases == nil { + lm.leases = make(map[uint64]time.Time) + } + lm.leases[id] = expiration +} + +// UpsertDefensive inserts or updates a lease for the given id to the expiration time either if: +// - old expiration is in the past +// - old expiration matches the one in leaseManager +// returns true if update has happened +func (lm *leaseManager) UpsertDefensive(id uint64, newExpiration time.Time, oldExpiration time.Time) bool { + clk := lm.clk() + if lm.leases == nil { + lm.leases = make(map[uint64]time.Time) + } + // if the old lease is expired just insert a new one + if clk.Until(oldExpiration) < 0 { + lm.Upsert(id, newExpiration) + return true + } + + // old lease is not expired + exp, ok := lm.leases[id] + if !ok { + // we don't know about it, don't start a new lease + return false + } + if exp != oldExpiration { + // the lease we know about does not match and because the old lease is not expired + // we should not allow for new lease + return false + } + // we know about the lease, update it + lm.Upsert(id, newExpiration) + return true +} + +func (lm *leaseManager) clk() clock.Clock { + if lm.clock != nil { + return lm.clock + } + return clock.New() +} + +// Active returns active leases and cleans up the inactive ones under the hood. +func (lm *leaseManager) Active() []uint64 { + clk := lm.clk() + var res []uint64 + for id, exp := range lm.leases { + if clk.Until(exp) <= 0 { + delete(lm.leases, id) + continue + } + res = append(res, id) + } + return res +} diff --git a/chain/lf3/leasemanager_test.go b/chain/lf3/leasemanager_test.go new file mode 100644 index 00000000000..3adaccebe3a --- /dev/null +++ b/chain/lf3/leasemanager_test.go @@ -0,0 +1,93 @@ +package lf3 + +import ( + "testing" + "time" + + "github.com/raulk/clock" + "github.com/stretchr/testify/assert" +) + +func TestLeaseManager_Upsert(t *testing.T) { + lm := &leaseManager{ + clock: clock.NewMock(), + } + + // Test inserting a new lease + expiration := lm.clock.Now().Add(1 * time.Hour) + lm.Upsert(1, expiration) + assert.Equal(t, 1, len(lm.leases)) + assert.Equal(t, expiration, lm.leases[1]) + + // Test updating an existing lease + newExpiration := lm.clock.Now().Add(2 * time.Hour) + lm.Upsert(1, newExpiration) + assert.Equal(t, 1, len(lm.leases)) + assert.Equal(t, newExpiration, lm.leases[1]) +} + +func TestLeaseManager_Active(t *testing.T) { + mockClock := clock.NewMock() + lm := &leaseManager{ + clock: mockClock, + } + + // Add some leases + expiration1 := mockClock.Now().Add(1 * time.Hour) + expiration2 := mockClock.Now().Add(2 * time.Hour) + expiration3 := mockClock.Now().Add(-1 * time.Hour) // Already expired + + lm.Upsert(1, expiration1) + lm.Upsert(2, expiration2) + lm.Upsert(3, expiration3) + + // Check active leases before advancing the clock + activeLeases := lm.Active() + assert.ElementsMatch(t, []uint64{1, 2}, activeLeases) + + // Advance the clock and check active leases again + mockClock.Add(1 * time.Hour) + activeLeases = lm.Active() + assert.ElementsMatch(t, []uint64{2}, activeLeases) + + mockClock.Add(1 * time.Hour) + activeLeases = lm.Active() + assert.Empty(t, activeLeases) +} + +func TestLeaseManager_UpsertDefensive(t *testing.T) { + mockClock := clock.NewMock() + lm := &leaseManager{ + clock: mockClock, + } + + // Test inserting a new lease when oldExpiration is in the past + oldExpiration := mockClock.Now().Add(-1 * time.Hour) + newExpiration := mockClock.Now().Add(1 * time.Hour) + updated := lm.UpsertDefensive(1, newExpiration, oldExpiration) + assert.True(t, updated) + assert.Equal(t, newExpiration, lm.leases[1]) + + // Test updating an existing lease when oldExpiration matches + oldExpiration = newExpiration + newExpiration = mockClock.Now().Add(2 * time.Hour) + updated = lm.UpsertDefensive(1, newExpiration, oldExpiration) + assert.True(t, updated) + assert.Equal(t, newExpiration, lm.leases[1]) + + // Test not updating a lease when oldExpiration does not match + oldExpiration = mockClock.Now().Add(3 * time.Hour) // Different from the current lease expiration + newExpiration = mockClock.Now().Add(4 * time.Hour) + updated = lm.UpsertDefensive(1, newExpiration, oldExpiration) + assert.False(t, updated) + assert.NotEqual(t, newExpiration, lm.leases[1]) + + // Test not updating a lease when it is not known + unknownID := uint64(2) + oldExpiration = mockClock.Now().Add(1 * time.Hour) + newExpiration = mockClock.Now().Add(2 * time.Hour) + updated = lm.UpsertDefensive(unknownID, newExpiration, oldExpiration) + assert.False(t, updated) + _, exists := lm.leases[unknownID] + assert.False(t, exists) +} diff --git a/chain/lf3/manifest.go b/chain/lf3/manifest.go new file mode 100644 index 00000000000..43640b7cd6e --- /dev/null +++ b/chain/lf3/manifest.go @@ -0,0 +1,46 @@ +package lf3 + +import ( + "time" + + "github.com/ipfs/go-datastore" + "github.com/ipfs/go-datastore/namespace" + pubsub "github.com/libp2p/go-libp2p-pubsub" + "github.com/libp2p/go-libp2p/core/peer" + + "github.com/filecoin-project/go-f3/gpbft" + "github.com/filecoin-project/go-f3/manifest" + + "github.com/filecoin-project/lotus/build" + "github.com/filecoin-project/lotus/chain/actors/policy" + "github.com/filecoin-project/lotus/node/modules/dtypes" +) + +func NewManifestProvider(nn dtypes.NetworkName, ps *pubsub.PubSub, mds dtypes.MetadataDS) manifest.ManifestProvider { + m := manifest.LocalDevnetManifest() + m.NetworkName = gpbft.NetworkName(nn) + m.EC.DelayMultiplier = 2. + m.EC.Period = time.Duration(build.BlockDelaySecs) * time.Second + if build.F3BootstrapEpoch < 0 { + // if unset, set to a sane default so we don't get scary logs and pause. + m.BootstrapEpoch = 2 * int64(policy.ChainFinality) + m.Pause = true + } else { + m.BootstrapEpoch = int64(build.F3BootstrapEpoch) + } + m.EC.Finality = int64(policy.ChainFinality) + m.CommitteeLookback = 5 + + // TODO: We're forcing this to start paused for now. We need to remove this for the final + // mainnet launch. + m.Pause = true + + switch manifestServerID, err := peer.Decode(build.ManifestServerID); { + case err != nil: + log.Warnw("Cannot decode F3 manifest sever identity; falling back on static manifest provider", "err", err) + return manifest.NewStaticManifestProvider(m) + default: + ds := namespace.Wrap(mds, datastore.NewKey("/f3-dynamic-manifest")) + return manifest.NewDynamicManifestProvider(m, ds, ps, manifestServerID) + } +} diff --git a/chain/lf3/signer.go b/chain/lf3/signer.go new file mode 100644 index 00000000000..3f4d517a471 --- /dev/null +++ b/chain/lf3/signer.go @@ -0,0 +1,32 @@ +package lf3 + +import ( + "context" + + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-f3/gpbft" + + "github.com/filecoin-project/lotus/api" +) + +var _ gpbft.Signer = (*signer)(nil) + +type signer struct { + wallet api.Wallet +} + +// Sign signs a message with the private key corresponding to a public key. +// The the key must be known by the wallet and be of BLS type. +func (s *signer) Sign(ctx context.Context, sender gpbft.PubKey, msg []byte) ([]byte, error) { + addr, err := address.NewBLSAddress(sender) + if err != nil { + return nil, xerrors.Errorf("converting pubkey to address: %w", err) + } + sig, err := s.wallet.WalletSign(ctx, addr, msg, api.MsgMeta{Type: api.MTUnknown}) + if err != nil { + return nil, xerrors.Errorf("error while signing: %w", err) + } + return sig.Data, nil +} diff --git a/chain/store/store.go b/chain/store/store.go index 9c8c2b2a1e3..f9014904618 100644 --- a/chain/store/store.go +++ b/chain/store/store.go @@ -1322,12 +1322,15 @@ func breakWeightTie(ts1, ts2 *types.TipSet) bool { // blocks are already sorted by ticket for i := 0; i < s; i++ { if ts1.Blocks()[i].Ticket.Less(ts2.Blocks()[i].Ticket) { - log.Infof("weight tie broken in favour of %s", ts1.Key()) + log.Infof("weight tie broken in favour of %s against %s", ts1.Key(), ts2.Key()) return true + } else if ts2.Blocks()[i].Ticket.Less(ts1.Blocks()[i].Ticket) { + log.Infof("weight tie broken in favour of %s against %s", ts2.Key(), ts1.Key()) + return false } } - log.Infof("weight tie left unbroken, default to %s", ts2.Key()) + log.Warnf("weight tie between %s and %s left unbroken, default to %s", ts1.Key(), ts2.Key(), ts2.Key()) return false } diff --git a/chain/store/weight_test.go b/chain/store/weight_test.go new file mode 100644 index 00000000000..20799df7bf7 --- /dev/null +++ b/chain/store/weight_test.go @@ -0,0 +1,75 @@ +package store + +import ( + "bytes" + "testing" + + "github.com/ipfs/go-cid" + "github.com/minio/blake2b-simd" + "github.com/stretchr/testify/require" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + + "github.com/filecoin-project/lotus/chain/types" +) + +func TestWeightTieBreaker(t *testing.T) { + + smallerVrf1 := []byte{0} // blake2b starts with byte 3 + largerVrf1 := []byte{2} // blake2b starts with byte 187 + + smallerVrfSum1 := blake2b.Sum256(smallerVrf1) + largerVrfSum1 := blake2b.Sum256(largerVrf1) + + // this checks that smallerVrf is in fact smaller than LargerVrf + require.True(t, bytes.Compare(smallerVrfSum1[:], largerVrfSum1[:]) < 0) + + smallerVrf2 := []byte{3} // blake2b starts with byte 232 + largerVrf2 := []byte{1} // blake2b starts with byte 238 + + smallerVrfSum2 := blake2b.Sum256(smallerVrf2) + largerVrfSum2 := blake2b.Sum256(largerVrf2) + + // this checks that smallerVrf is in fact smaller than LargerVrf + require.True(t, bytes.Compare(smallerVrfSum2[:], largerVrfSum2[:]) < 0) + + ts1 := mockTipSet(t) + ts2 := mockTipSet(t) + + ts1.Blocks()[0].Ticket = &types.Ticket{VRFProof: largerVrf1} + ts2.Blocks()[0].Ticket = &types.Ticket{VRFProof: smallerVrf1} + ts1.Blocks()[1].Ticket = &types.Ticket{VRFProof: smallerVrf2} + ts2.Blocks()[1].Ticket = &types.Ticket{VRFProof: largerVrf2} + + // ts1's first block has a larger VRF than ts2's, so it should lose + require.False(t, breakWeightTie(ts1, ts2)) +} + +func mockTipSet(t *testing.T) *types.TipSet { + minerAct, err := address.NewIDAddress(0) + require.NoError(t, err) + c, err := cid.Decode("QmbFMke1KXqnYyBBWxB74N4c5SBnJMVAiMNRcGu6x1AwQH") + require.NoError(t, err) + blks := []*types.BlockHeader{ + { + Miner: minerAct, + Height: abi.ChainEpoch(1), + ParentStateRoot: c, + ParentMessageReceipts: c, + Messages: c, + Ticket: &types.Ticket{VRFProof: []byte{}}, + }, + { + Miner: minerAct, + Height: abi.ChainEpoch(1), + ParentStateRoot: c, + ParentMessageReceipts: c, + Messages: c, + Ticket: &types.Ticket{VRFProof: []byte{}}, + }, + } + ts, err := types.NewTipSet(blks) + require.NoError(t, err) + return ts +} diff --git a/chain/types/actor.go b/chain/types/actor.go index 8ba61161739..aeb687d330e 100644 --- a/chain/types/actor.go +++ b/chain/types/actor.go @@ -26,8 +26,8 @@ type ActorV5 struct { Head cid.Cid Nonce uint64 Balance BigInt - // Deterministic Address. - Address *address.Address + // The f4 address of the actor, if any. + DelegatedAddress *address.Address } type Actor = ActorV5 diff --git a/chain/types/cbor_gen.go b/chain/types/cbor_gen.go index dde703ceed5..4c13597d075 100644 --- a/chain/types/cbor_gen.go +++ b/chain/types/cbor_gen.go @@ -1232,8 +1232,8 @@ func (t *ActorV5) MarshalCBOR(w io.Writer) error { return err } - // t.Address (address.Address) (struct) - if err := t.Address.MarshalCBOR(cw); err != nil { + // t.DelegatedAddress (address.Address) (struct) + if err := t.DelegatedAddress.MarshalCBOR(cw); err != nil { return err } return nil @@ -1309,7 +1309,7 @@ func (t *ActorV5) UnmarshalCBOR(r io.Reader) (err error) { } } - // t.Address (address.Address) (struct) + // t.DelegatedAddress (address.Address) (struct) { @@ -1321,9 +1321,9 @@ func (t *ActorV5) UnmarshalCBOR(r io.Reader) (err error) { if err := cr.UnreadByte(); err != nil { return err } - t.Address = new(address.Address) - if err := t.Address.UnmarshalCBOR(cr); err != nil { - return xerrors.Errorf("unmarshaling t.Address pointer: %w", err) + t.DelegatedAddress = new(address.Address) + if err := t.DelegatedAddress.UnmarshalCBOR(cr); err != nil { + return xerrors.Errorf("unmarshaling t.DelegatedAddress pointer: %w", err) } } diff --git a/chain/vm/mkactor.go b/chain/vm/mkactor.go index b33085c0594..3a0ee66996c 100644 --- a/chain/vm/mkactor.go +++ b/chain/vm/mkactor.go @@ -89,7 +89,7 @@ func TryCreateAccountActor(rt *Runtime, addr address.Address) (*types.Actor, add func makeAccountActor(ver actorstypes.Version, addr address.Address) (*types.Actor, aerrors.ActorError) { switch addr.Protocol() { case address.BLS, address.SECP256K1: - return newAccountActor(ver, addr), nil + return newAccountActor(ver), nil case address.ID: return nil, aerrors.Newf(exitcode.SysErrInvalidReceiver, "no actor with given ID: %s", addr) case address.Actor: @@ -99,7 +99,7 @@ func makeAccountActor(ver actorstypes.Version, addr address.Address) (*types.Act } } -func newAccountActor(ver actorstypes.Version, addr address.Address) *types.Actor { +func newAccountActor(ver actorstypes.Version) *types.Actor { // TODO: ActorsUpgrade use a global actor registry? var code cid.Cid switch ver { @@ -124,7 +124,6 @@ func newAccountActor(ver actorstypes.Version, addr address.Address) *types.Actor Code: code, Balance: types.NewInt(0), Head: EmptyObjectCid, - Address: &addr, } return nact diff --git a/chain/vm/vm.go b/chain/vm/vm.go index f8a0c389216..f6f93a0d3da 100644 --- a/chain/vm/vm.go +++ b/chain/vm/vm.go @@ -59,9 +59,9 @@ func ResolveToDeterministicAddr(state types.StateTree, cst cbor.IpldStore, addr } if state.Version() >= types.StateTreeVersion5 { - if act.Address != nil { + if act.DelegatedAddress != nil { // If there _is_ an f4 address, return it as "key" address - return *act.Address, nil + return *act.DelegatedAddress, nil } } diff --git a/cli/evm.go b/cli/evm.go index 7eb36f8953b..bc847d2b2d6 100644 --- a/cli/evm.go +++ b/cli/evm.go @@ -471,8 +471,8 @@ func ethAddrFromFilecoinAddress(ctx context.Context, addr address.Address, fnapi if err != nil { return ethtypes.EthAddress{}, addr, err } - if fAct.Address != nil && (*fAct.Address).Protocol() == address.Delegated { - faddr = *fAct.Address + if fAct.DelegatedAddress != nil && (*fAct.DelegatedAddress).Protocol() == address.Delegated { + faddr = *fAct.DelegatedAddress } case address.Delegated: faddr = addr diff --git a/cli/state.go b/cli/state.go index 343e68b5389..6a7604a3211 100644 --- a/cli/state.go +++ b/cli/state.go @@ -633,8 +633,8 @@ var StateGetActorCmd = &cli.Command{ fmt.Printf("Nonce:\t\t%d\n", a.Nonce) fmt.Printf("Code:\t\t%s (%s)\n", a.Code, strtype) fmt.Printf("Head:\t\t%s\n", a.Head) - if a.Address != nil { - fmt.Printf("Delegated address:\t\t%s\n", a.Address) + if a.DelegatedAddress != nil { + fmt.Printf("Delegated address:\t\t%s\n", a.DelegatedAddress) } return nil diff --git a/cmd/lotus-bench/bench-sectors.sh b/cmd/lotus-bench/bench-sectors.sh new file mode 100755 index 00000000000..6bfd777c487 --- /dev/null +++ b/cmd/lotus-bench/bench-sectors.sh @@ -0,0 +1,89 @@ +#!/usr/bin/env bash + +# This is an example of how a full sector lifecycle can be benchmarked using `lotus-bench`. The +# script generates an unsealed sector, runs PC1, PC2, C1, and C2, and prints the duration of each +# step. The script also prints the proof length and total duration of the lifecycle. +# +# Change `flags` to `--non-interactive` to run NI-PoRep, and switch `sector_size` to the desired +# sector size. The script assumes that the `lotus-bench` binary is in the same directory as the +# script. +# +# Note that for larger sector sizes, /tmp may not have enough space for the full lifecycle. + +set -e +set -o pipefail + +tmpdir=/tmp + +flags="" +# flags="--non-interactive" +sector_size=2KiB +# sector_size=8MiB +# sector_size=512MiB +# sector_size=32GiB +# sector_size=64GiB + +unsealed_file=${tmpdir}/unsealed${sector_size} +sealed_file=${tmpdir}/sealed${sector_size} +cache_dir=${tmpdir}/cache${sector_size} +c1_file=${tmpdir}/c1_${sector_size}.json +proof_out=${tmpdir}/proof_${sector_size}.hex +rm -rf $unsealed_file $sealed_file $cache_dir $c1_file + +echo "Generating unsealed sector ..." +read -r unsealed_cid unsealed_size <<< $(./lotus-bench simple addpiece --sector-size $sector_size /dev/zero $unsealed_file | tail -1) +if [ $? -ne 0 ]; then exit 1; fi +echo "Unsealed CID: $unsealed_cid" +echo "Unsealed Size: $unsealed_size" + +start_total=$(date +%s%3N) + +echo "Running PC1 ..." +echo "./lotus-bench simple precommit1 --sector-size $sector_size $flags $unsealed_file $sealed_file $cache_dir $unsealed_cid $unsealed_size" +start_pc1=$(date +%s%3N) +pc1_output=$(./lotus-bench simple precommit1 --sector-size $sector_size $flags $unsealed_file $sealed_file $cache_dir $unsealed_cid $unsealed_size | tail -1) +if [ $? -ne 0 ]; then exit 1; fi +end_pc1=$(date +%s%3N) +pc1_duration=$((end_pc1 - start_pc1)) + +echo "Running PC2 ..." +echo "./lotus-bench simple precommit2 --sector-size $sector_size $flags $sealed_file $cache_dir $pc1_output" +start_pc2=$(date +%s%3N) +read -r commd commr <<< $(./lotus-bench simple precommit2 --sector-size $sector_size $flags $sealed_file $cache_dir $pc1_output | tail -1 | sed -E 's/[dr]://g') +if [ $? -ne 0 ]; then exit 1; fi +end_pc2=$(date +%s%3N) +pc2_duration=$((end_pc2 - start_pc2)) + +echo "CommD CID: $commd" +echo "CommR CID: $commr" + +echo "Running C1 ..." +echo "./lotus-bench simple commit1 --sector-size $sector_size $flags $sealed_file $cache_dir ${commd} ${commr} $c1_file" +start_c1=$(date +%s%3N) +./lotus-bench simple commit1 --sector-size $sector_size $flags $sealed_file $cache_dir ${commd} ${commr} $c1_file +end_c1=$(date +%s%3N) +c1_duration=$((end_c1 - start_c1)) + +echo "Running C2 ..." +echo "./lotus-bench simple commit2 $flags $c1_file" +start_c2=$(date +%s%3N) +proof=$(./lotus-bench simple commit2 $flags $c1_file | tail -1 | sed 's/^proof: //') +if [ $? -ne 0 ]; then exit 1; fi +end_c2=$(date +%s%3N) +c2_duration=$((end_c2 - start_c2)) + +echo $proof > $proof_out +echo "Wrote proof to $proof_out" + +# $proof is hex, calculate the length of it in bytes +proof_len=$(echo "scale=0; ${#proof}/2" | bc) +echo "Proof length: $proof_len" + +end_total=$(date +%s%3N) +total_duration=$((end_total - start_total)) + +echo "PC1 duration: $((pc1_duration / 1000)).$((pc1_duration % 1000)) seconds" +echo "PC2 duration: $((pc2_duration / 1000)).$((pc2_duration % 1000)) seconds" +echo "C1 duration: $((c1_duration / 1000)).$((c1_duration % 1000)) seconds" +echo "C2 duration: $((c2_duration / 1000)).$((c2_duration % 1000)) seconds" +echo "Total duration: $((total_duration / 1000)).$((total_duration % 1000)) seconds" \ No newline at end of file diff --git a/cmd/lotus-bench/main.go b/cmd/lotus-bench/main.go index 8aa6768aabf..8c415180612 100644 --- a/cmd/lotus-bench/main.go +++ b/cmd/lotus-bench/main.go @@ -338,7 +338,7 @@ var sealBenchCmd = &cli.Command{ if !skipc2 { log.Info("generating winning post candidates") - wipt, err := spt(sectorSize, false).RegisteredWinningPoStProof() + wipt, err := spt(sectorSize, miner.SealProofVariant_Standard).RegisteredWinningPoStProof() if err != nil { return err } @@ -556,7 +556,7 @@ func runSeals(sb *ffiwrapper.Sealer, sbfs *basicfs.Provider, numSectors int, par Miner: mid, Number: i, }, - ProofType: spt(sectorSize, false), + ProofType: spt(sectorSize, miner.SealProofVariant_Standard), } start := time.Now() @@ -586,7 +586,7 @@ func runSeals(sb *ffiwrapper.Sealer, sbfs *basicfs.Provider, numSectors int, par Miner: mid, Number: i, }, - ProofType: spt(sectorSize, false), + ProofType: spt(sectorSize, miner.SealProofVariant_Standard), } start := time.Now() @@ -797,7 +797,7 @@ var proveCmd = &cli.Command{ Miner: abi.ActorID(mid), Number: abi.SectorNumber(c2in.SectorNum), }, - ProofType: spt(abi.SectorSize(c2in.SectorSize), false), + ProofType: spt(abi.SectorSize(c2in.SectorSize), miner.SealProofVariant_Standard), } fmt.Printf("----\nstart proof computation\n") @@ -828,8 +828,8 @@ func bps(sectorSize abi.SectorSize, sectorNum int, d time.Duration) string { return types.SizeStr(types.BigInt{Int: bps}) + "/s" } -func spt(ssize abi.SectorSize, synth bool) abi.RegisteredSealProof { - spt, err := miner.SealProofTypeFromSectorSize(ssize, build.TestNetworkVersion, synth) +func spt(ssize abi.SectorSize, variant miner.SealProofVariant) abi.RegisteredSealProof { + spt, err := miner.SealProofTypeFromSectorSize(ssize, build.TestNetworkVersion, variant) if err != nil { panic(err) } diff --git a/cmd/lotus-bench/simple.go b/cmd/lotus-bench/simple.go index 35d909ffb8c..4c32d366a2e 100644 --- a/cmd/lotus-bench/simple.go +++ b/cmd/lotus-bench/simple.go @@ -21,6 +21,7 @@ import ( prf "github.com/filecoin-project/specs-actors/actors/runtime/proof" "github.com/filecoin-project/lotus/build" + "github.com/filecoin-project/lotus/chain/actors/builtin/miner" lcli "github.com/filecoin-project/lotus/cli" "github.com/filecoin-project/lotus/storage/sealer/ffiwrapper" "github.com/filecoin-project/lotus/storage/sealer/storiface" @@ -186,7 +187,7 @@ var simpleAddPiece = &cli.Command{ Miner: mid, Number: 1, }, - ProofType: spt(sectorSize, false), + ProofType: spt(sectorSize, miner.SealProofVariant_Standard), } data, err := os.Open(cctx.Args().First()) @@ -201,7 +202,7 @@ var simpleAddPiece = &cli.Command{ return xerrors.Errorf("add piece: %w", err) } - took := time.Now().Sub(start) + took := time.Since(start) fmt.Printf("AddPiece %s (%s)\n", took, bps(abi.SectorSize(pi.Size), 1, took)) fmt.Printf("%s %d\n", pi.PieceCID, pi.Size) @@ -227,6 +228,10 @@ var simplePreCommit1 = &cli.Command{ Name: "synthetic", Usage: "generate synthetic PoRep proofs", }, + &cli.BoolFlag{ + Name: "non-interactive", + Usage: "generate NI-PoRep proofs", + }, }, ArgsUsage: "[unsealed] [sealed] [cache] [[piece cid] [piece size]]...", Action: func(cctx *cli.Context) error { @@ -258,12 +263,17 @@ var simplePreCommit1 = &cli.Command{ return err } + variant, err := variantFromArgs(cctx) + if err != nil { + return err + } + sr := storiface.SectorRef{ ID: abi.SectorID{ Miner: mid, Number: 1, }, - ProofType: spt(sectorSize, cctx.Bool("synthetic")), + ProofType: spt(sectorSize, variant), } ticket := [32]byte{} @@ -283,7 +293,7 @@ var simplePreCommit1 = &cli.Command{ return xerrors.Errorf("precommit1: %w", err) } - took := time.Now().Sub(start) + took := time.Since(start) fmt.Printf("PreCommit1 %s (%s)\n", took, bps(sectorSize, 1, took)) fmt.Println(base64.StdEncoding.EncodeToString(p1o)) @@ -308,6 +318,10 @@ var simplePreCommit2 = &cli.Command{ Name: "synthetic", Usage: "generate synthetic PoRep proofs", }, + &cli.BoolFlag{ + Name: "non-interactive", + Usage: "generate NI-PoRep proofs", + }, &cli.StringFlag{ Name: "external-pc2", Usage: "command for computing PC2 externally", @@ -383,12 +397,17 @@ Example invocation of lotus-bench as external executor: return err } + variant, err := variantFromArgs(cctx) + if err != nil { + return err + } + sr := storiface.SectorRef{ ID: abi.SectorID{ Miner: mid, Number: 1, }, - ProofType: spt(sectorSize, cctx.Bool("synthetic")), + ProofType: spt(sectorSize, variant), } start := time.Now() @@ -398,7 +417,7 @@ Example invocation of lotus-bench as external executor: return xerrors.Errorf("precommit2: %w", err) } - took := time.Now().Sub(start) + took := time.Since(start) fmt.Printf("PreCommit2 %s (%s)\n", took, bps(sectorSize, 1, took)) fmt.Printf("d:%s r:%s\n", p2o.Unsealed, p2o.Sealed) @@ -423,6 +442,10 @@ var simpleCommit1 = &cli.Command{ Name: "synthetic", Usage: "generate synthetic PoRep proofs", }, + &cli.BoolFlag{ + Name: "non-interactive", + Usage: "generate NI-PoRep proofs", + }, }, ArgsUsage: "[sealed] [cache] [comm D] [comm R] [c1out.json]", Action: func(cctx *cli.Context) error { @@ -453,12 +476,17 @@ var simpleCommit1 = &cli.Command{ return err } + variant, err := variantFromArgs(cctx) + if err != nil { + return err + } + sr := storiface.SectorRef{ ID: abi.SectorID{ Miner: mid, Number: 1, }, - ProofType: spt(sectorSize, cctx.Bool("synthetic")), + ProofType: spt(sectorSize, variant), } start := time.Now() @@ -493,7 +521,7 @@ var simpleCommit1 = &cli.Command{ return xerrors.Errorf("commit1: %w", err) } - took := time.Now().Sub(start) + took := time.Since(start) fmt.Printf("Commit1 %s (%s)\n", took, bps(sectorSize, 1, took)) @@ -533,6 +561,10 @@ var simpleCommit2 = &cli.Command{ Name: "synthetic", Usage: "generate synthetic PoRep proofs", }, + &cli.BoolFlag{ + Name: "non-interactive", + Usage: "generate NI-PoRep proofs", + }, }, Action: func(c *cli.Context) error { if c.Bool("no-gpu") { @@ -574,12 +606,17 @@ var simpleCommit2 = &cli.Command{ return err } + variant, err := variantFromArgs(c) + if err != nil { + return err + } + ref := storiface.SectorRef{ ID: abi.SectorID{ Miner: abi.ActorID(mid), Number: abi.SectorNumber(c2in.SectorNum), }, - ProofType: spt(abi.SectorSize(c2in.SectorSize), c.Bool("synthetic")), + ProofType: spt(abi.SectorSize(c2in.SectorSize), variant), } start := time.Now() @@ -637,7 +674,7 @@ var simpleWindowPost = &cli.Command{ return xerrors.Errorf("parse commr: %w", err) } - wpt, err := spt(sectorSize, false).RegisteredWindowPoStProof() + wpt, err := spt(sectorSize, miner.SealProofVariant_Standard).RegisteredWindowPoStProof() if err != nil { return err } @@ -657,7 +694,7 @@ var simpleWindowPost = &cli.Command{ vp, err := ffi.GenerateSingleVanillaProof(ffi.PrivateSectorInfo{ SectorInfo: prf.SectorInfo{ - SealProof: spt(sectorSize, false), + SealProof: spt(sectorSize, miner.SealProofVariant_Standard), SectorNumber: sn, SealedCID: commr, }, @@ -728,7 +765,7 @@ var simpleWinningPost = &cli.Command{ return xerrors.Errorf("parse commr: %w", err) } - wpt, err := spt(sectorSize, false).RegisteredWinningPoStProof() + wpt, err := spt(sectorSize, miner.SealProofVariant_Standard).RegisteredWinningPoStProof() if err != nil { return err } @@ -748,7 +785,7 @@ var simpleWinningPost = &cli.Command{ vp, err := ffi.GenerateSingleVanillaProof(ffi.PrivateSectorInfo{ SectorInfo: prf.SectorInfo{ - SealProof: spt(sectorSize, false), + SealProof: spt(sectorSize, miner.SealProofVariant_Standard), SectorNumber: sn, SealedCID: commr, }, @@ -842,7 +879,7 @@ var simpleReplicaUpdate = &cli.Command{ Miner: mid, Number: 1, }, - ProofType: spt(sectorSize, false), + ProofType: spt(sectorSize, miner.SealProofVariant_Standard), } start := time.Now() @@ -852,7 +889,7 @@ var simpleReplicaUpdate = &cli.Command{ return xerrors.Errorf("replica update: %w", err) } - took := time.Now().Sub(start) + took := time.Since(start) fmt.Printf("ReplicaUpdate %s (%s)\n", took, bps(sectorSize, 1, took)) fmt.Printf("d:%s r:%s\n", ruo.NewUnsealed, ruo.NewSealed) @@ -910,7 +947,7 @@ var simpleProveReplicaUpdate1 = &cli.Command{ Miner: mid, Number: 1, }, - ProofType: spt(sectorSize, false), + ProofType: spt(sectorSize, miner.SealProofVariant_Standard), } start := time.Now() @@ -935,7 +972,7 @@ var simpleProveReplicaUpdate1 = &cli.Command{ return xerrors.Errorf("replica update: %w", err) } - took := time.Now().Sub(start) + took := time.Since(start) fmt.Printf("ProveReplicaUpdate1 %s (%s)\n", took, bps(sectorSize, 1, took)) @@ -997,7 +1034,7 @@ var simpleProveReplicaUpdate2 = &cli.Command{ Miner: mid, Number: 1, }, - ProofType: spt(sectorSize, false), + ProofType: spt(sectorSize, miner.SealProofVariant_Standard), } start := time.Now() @@ -1032,7 +1069,7 @@ var simpleProveReplicaUpdate2 = &cli.Command{ return xerrors.Errorf("prove replica update2: %w", err) } - took := time.Now().Sub(start) + took := time.Since(start) fmt.Printf("ProveReplicaUpdate2 %s (%s)\n", took, bps(sectorSize, 1, took)) fmt.Println("p:", base64.StdEncoding.EncodeToString(p)) @@ -1071,3 +1108,16 @@ func ParsePieceInfos(cctx *cli.Context, firstArg int) ([]abi.PieceInfo, error) { return out, nil } + +func variantFromArgs(cctx *cli.Context) (miner.SealProofVariant, error) { + variant := miner.SealProofVariant_Standard + if cctx.Bool("synthetic") { + if cctx.Bool("non-interactive") { + return variant, xerrors.Errorf("can't use both synthetic and non-interactive") + } + variant = miner.SealProofVariant_Synthetic + } else if cctx.Bool("non-interactive") { + variant = miner.SealProofVariant_NonInteractive + } + return variant, nil +} diff --git a/cmd/lotus-seed/main.go b/cmd/lotus-seed/main.go index dd70cce2177..1a9a3ce2499 100644 --- a/cmd/lotus-seed/main.go +++ b/cmd/lotus-seed/main.go @@ -137,9 +137,8 @@ var preSealCmd = &cli.Command{ nv = network.Version(c.Uint64("network-version")) } - var synthetic = false // there's little reason to have this for a seed. - - spt, err := miner.SealProofTypeFromSectorSize(sectorSize, nv, synthetic) + var variant = miner.SealProofVariant_Standard // there's little reason to have this for a seed. + spt, err := miner.SealProofTypeFromSectorSize(sectorSize, nv, variant) if err != nil { return err } diff --git a/cmd/lotus-shed/indexes.go b/cmd/lotus-shed/indexes.go index 334b7f10453..812d8059bb7 100644 --- a/cmd/lotus-shed/indexes.go +++ b/cmd/lotus-shed/indexes.go @@ -146,11 +146,11 @@ var backfillEventsCmd = &cli.Command{ } actor, err := api.StateGetActor(ctx, idAddr, ts.Key()) - if err != nil || actor.Address == nil { + if err != nil || actor.DelegatedAddress == nil { return idAddr, true } - return *actor.Address, true + return *actor.DelegatedAddress, true } isIndexedValue := func(b uint8) bool { diff --git a/cmd/lotus-shed/invariants.go b/cmd/lotus-shed/invariants.go index e3507015a36..ede3ae35b4e 100644 --- a/cmd/lotus-shed/invariants.go +++ b/cmd/lotus-shed/invariants.go @@ -19,6 +19,7 @@ import ( v11 "github.com/filecoin-project/go-state-types/builtin/v11" v12 "github.com/filecoin-project/go-state-types/builtin/v12" v13 "github.com/filecoin-project/go-state-types/builtin/v13" + v14 "github.com/filecoin-project/go-state-types/builtin/v14" v8 "github.com/filecoin-project/go-state-types/builtin/v8" v9 "github.com/filecoin-project/go-state-types/builtin/v9" @@ -192,6 +193,11 @@ var invariantsCmd = &cli.Command{ if err != nil { return xerrors.Errorf("checking state invariants: %w", err) } + case actorstypes.Version14: + messages, err = v14.CheckStateInvariants(actorTree, abi.ChainEpoch(epoch), actorCodeCids) + if err != nil { + return xerrors.Errorf("checking state invariants: %w", err) + } default: return xerrors.Errorf("unsupported actor version: %v", av) } diff --git a/cmd/lotus-shed/migrations.go b/cmd/lotus-shed/migrations.go index febe833d75e..6350c217c97 100644 --- a/cmd/lotus-shed/migrations.go +++ b/cmd/lotus-shed/migrations.go @@ -36,6 +36,7 @@ import ( v13 "github.com/filecoin-project/go-state-types/builtin/v13" market13 "github.com/filecoin-project/go-state-types/builtin/v13/market" adt13 "github.com/filecoin-project/go-state-types/builtin/v13/util/adt" + v14 "github.com/filecoin-project/go-state-types/builtin/v14" market8 "github.com/filecoin-project/go-state-types/builtin/v8/market" adt8 "github.com/filecoin-project/go-state-types/builtin/v8/util/adt" v9 "github.com/filecoin-project/go-state-types/builtin/v9" @@ -291,6 +292,8 @@ func getMigrationFuncsForNetwork(nv network.Version) (UpgradeActorsFunc, PreUpgr return filcns.UpgradeActorsV12, filcns.PreUpgradeActorsV12, checkNv21Invariants, nil case network.Version22: return filcns.UpgradeActorsV13, filcns.PreUpgradeActorsV13, checkNv22Invariants, nil + case network.Version23: + return filcns.UpgradeActorsV14, filcns.PreUpgradeActorsV14, checkNv23Invariants, nil default: return nil, nil, nil, xerrors.Errorf("migration not implemented for nv%d", nv) } @@ -619,6 +622,38 @@ func printMarketActorDiff(ctx context.Context, cst *cbornode.BasicIpldStore, nv return nil } +func checkNv23Invariants(ctx context.Context, oldStateRootCid cid.Cid, newStateRootCid cid.Cid, bs blockstore.Blockstore, epoch abi.ChainEpoch) error { + + actorStore := store.ActorStore(ctx, bs) + startTime := time.Now() + + // Load the new state root. + var newStateRoot types.StateRoot + if err := actorStore.Get(ctx, newStateRootCid, &newStateRoot); err != nil { + return xerrors.Errorf("failed to decode state root: %w", err) + } + + actorCodeCids, err := actors.GetActorCodeIDs(actorstypes.Version14) + if err != nil { + return err + } + newActorTree, err := builtin.LoadTree(actorStore, newStateRoot.Actors) + if err != nil { + return err + } + messages, err := v14.CheckStateInvariants(newActorTree, epoch, actorCodeCids) + if err != nil { + return xerrors.Errorf("checking state invariants: %w", err) + } + + for _, message := range messages.Messages() { + fmt.Println("got the following error: ", message) + } + + fmt.Println("completed invariant checks, took ", time.Since(startTime)) + + return nil +} func checkNv22Invariants(ctx context.Context, oldStateRootCid cid.Cid, newStateRootCid cid.Cid, bs blockstore.Blockstore, epoch abi.ChainEpoch) error { actorStore := store.ActorStore(ctx, bs) diff --git a/cmd/release/README.md b/cmd/release/README.md deleted file mode 100644 index 92b55507608..00000000000 --- a/cmd/release/README.md +++ /dev/null @@ -1,42 +0,0 @@ -# Lotus Release Tool - -The Lotus Release Tool is a CLI (Command Line Interface) utility designed to facilitate interactions with the Lotus Node and Miner metadata. This tool allows users to retrieve version information in either JSON or text format. The Lotus Release Tool was developed as a part of the [2024Q2 release process automation initiative](https://github.com/filecoin-project/lotus/issues/12010) and is used in the GitHub Actions workflows related to the release process. - -## Features - -- List all projects with their expected version information. -- Output logs in JSON or text format. - -## Installation - -To install the Lotus Release Tool, you need to have Go installed on your system. - -1. Build the tool: - ```sh - go build -o release ./cmd/release - ``` - -## Usage - -The `release` tool provides several commands and options to interact with the Lotus Node and Miner. - -### Commands - -- **List Projects**: List all projects with their version information. - ```sh - ./release list-projects - ``` - -### Options - -- **--json**: Format output as JSON. - ```sh - ./release --json list-projects - ``` - -## Example - -List Lotus Node and Lotus Miner version information with JSON formatted output: -```sh -./release --json list-projects -``` diff --git a/cmd/release/main.go b/cmd/release/main.go deleted file mode 100644 index 4040de4d977..00000000000 --- a/cmd/release/main.go +++ /dev/null @@ -1,172 +0,0 @@ -package main - -import ( - "encoding/json" - "os" - "os/exec" - "strings" - - log "github.com/sirupsen/logrus" - "github.com/urfave/cli/v2" - "golang.org/x/mod/semver" - - "github.com/filecoin-project/lotus/build" -) - -var _tags []string - -func getTags() []string { - if _tags == nil { - output, err := exec.Command("git", "tag").Output() - if err != nil { - log.Fatal(err) - } - _tags = strings.Split(string(output), "\n") - } - return _tags -} - -func isPrerelease(version string) bool { - return semver.Prerelease("v"+version) != "" -} - -func isLatest(name, version string) bool { - if isPrerelease(version) { - return false - } - prefix := getPrefix(name) - tags := getTags() - for _, t := range tags { - if strings.HasPrefix(t, prefix) { - v := strings.TrimPrefix(t, prefix) - if !isPrerelease(v) { - if semver.Compare("v"+v, "v"+version) > 0 { - return false - } - } - } - } - return true -} - -func getPrevious(name, version string) string { - prerelease := isPrerelease(version) - prefix := getPrefix(name) - tags := getTags() - previous := "" - for _, t := range tags { - if strings.HasPrefix(t, prefix) { - v := strings.TrimPrefix(t, prefix) - if prerelease || !isPrerelease(v) { - if semver.Compare("v"+v, "v"+version) < 0 { - if previous == "" || semver.Compare("v"+v, "v"+previous) > 0 { - previous = v - } - } - } - } - } - if previous == "" { - return "" - } - return prefix + previous -} - -func getBinaries(name string) []string { - if name == "node" { - return []string{"lotus"} - } - if name == "miner" { - return []string{"lotus-miner", "lotus-worker"} - } - return nil -} - -func isReleased(tag string) bool { - tags := getTags() - for _, t := range tags { - if t == tag { - return true - } - } - return false -} - -func getPrefix(name string) string { - if name == "node" { - return "v" - } - return name + "/v" -} - -type project struct { - Name string `json:"name"` - Version string `json:"version"` - Tag string `json:"tag"` - Previous string `json:"previous"` - Latest bool `json:"latest"` - Prerelease bool `json:"prerelease"` - Released bool `json:"released"` - Binaries []string `json:"binaries"` -} - -func getProject(name, version string) project { - tag := getPrefix(name) + version - return project{ - Name: name, - Version: version, - Tag: getPrefix(name) + version, - Previous: getPrevious(name, version), - Latest: isLatest(name, version), - Prerelease: isPrerelease(version), - Released: isReleased(tag), - Binaries: getBinaries(name), - } -} - -func main() { - app := &cli.App{ - Name: "release", - Usage: "Lotus release tool", - Flags: []cli.Flag{ - &cli.BoolFlag{ - Name: "json", - Usage: "Format output as JSON", - }, - }, - Before: func(c *cli.Context) error { - if c.Bool("json") { - log.SetFormatter(&log.JSONFormatter{}) - } else { - log.SetFormatter(&log.TextFormatter{ - TimestampFormat: "2006-01-02 15:04:05", - FullTimestamp: true, - }) - } - log.SetOutput(os.Stdout) - return nil - }, - Commands: []*cli.Command{ - { - Name: "list-projects", - Usage: "List all projects", - Action: func(c *cli.Context) error { - projects := []project{ - getProject("node", build.NodeBuildVersion), - getProject("miner", build.MinerBuildVersion), - } - b, err := json.MarshalIndent(projects, "", " ") - if err != nil { - log.Fatal(err) - } - log.Info(string(b)) - return nil - }, - }, - }, - } - - if err := app.Run(os.Args); err != nil { - log.Fatal(err) - } -} diff --git a/documentation/en/api-v0-methods.md b/documentation/en/api-v0-methods.md index bd58748eecb..815a74cdd2c 100644 --- a/documentation/en/api-v0-methods.md +++ b/documentation/en/api-v0-methods.md @@ -3819,7 +3819,7 @@ Response: }, "Nonce": 42, "Balance": "0", - "Address": "f01234" + "DelegatedAddress": "f01234" } }, "GasCharges": [ @@ -3859,7 +3859,7 @@ Response: }, "Nonce": 42, "Balance": "0", - "Address": "f01234" + "DelegatedAddress": "f01234" } }, "GasCharges": [ @@ -3911,7 +3911,7 @@ Response: }, "Nonce": 42, "Balance": "0", - "Address": "f01234" + "DelegatedAddress": "f01234" } } ``` @@ -4081,7 +4081,7 @@ Response: }, "Nonce": 42, "Balance": "0", - "Address": "f01234" + "DelegatedAddress": "f01234" } }, "GasCharges": [ @@ -4121,7 +4121,7 @@ Response: }, "Nonce": 42, "Balance": "0", - "Address": "f01234" + "DelegatedAddress": "f01234" } }, "GasCharges": [ @@ -4232,7 +4232,7 @@ Response: }, "Nonce": 42, "Balance": "0", - "Address": "f01234" + "DelegatedAddress": "f01234" } ``` @@ -4483,7 +4483,7 @@ Response: "UpgradeWatermelonHeight": 10101, "UpgradeDragonHeight": 10101, "UpgradePhoenixHeight": 10101, - "UpgradeAussieHeight": 10101 + "UpgradeWaffleHeight": 10101 }, "Eip155ChainID": 123 } @@ -5550,7 +5550,7 @@ Response: }, "Nonce": 42, "Balance": "0", - "Address": "f01234" + "DelegatedAddress": "f01234" } }, "GasCharges": [ @@ -5590,7 +5590,7 @@ Response: }, "Nonce": 42, "Balance": "0", - "Address": "f01234" + "DelegatedAddress": "f01234" } }, "GasCharges": [ diff --git a/documentation/en/api-v1-unstable-methods.md b/documentation/en/api-v1-unstable-methods.md index 5951b134c91..91f1da2006b 100644 --- a/documentation/en/api-v1-unstable-methods.md +++ b/documentation/en/api-v1-unstable-methods.md @@ -80,6 +80,12 @@ * [EthTraceTransaction](#EthTraceTransaction) * [EthUninstallFilter](#EthUninstallFilter) * [EthUnsubscribe](#EthUnsubscribe) +* [F3](#F3) + * [F3GetCertificate](#F3GetCertificate) + * [F3GetECPowerTable](#F3GetECPowerTable) + * [F3GetF3PowerTable](#F3GetF3PowerTable) + * [F3GetLatestCertificate](#F3GetLatestCertificate) + * [F3Participate](#F3Participate) * [Filecoin](#Filecoin) * [FilecoinAddressToEthAddress](#FilecoinAddressToEthAddress) * [Gas](#Gas) @@ -2162,6 +2168,220 @@ Inputs: Response: `true` +## F3 + + +### F3GetCertificate +F3GetCertificate returns a finality certificate at given instance number + + +Perms: read + +Inputs: +```json +[ + 42 +] +``` + +Response: +```json +{ + "GPBFTInstance": 0, + "ECChain": null, + "SupplementalData": { + "Commitments": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "PowerTable": null + }, + "Signers": [ + 0 + ], + "Signature": null, + "PowerTableDelta": null +} +``` + +### F3GetECPowerTable +F3GetECPowerTable returns a F3 specific power table for use in standalone F3 nodes. + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +[ + { + "ID": 1000, + "Power": 0, + "PubKey": "Bw==" + } +] +``` + +### F3GetF3PowerTable +F3GetF3PowerTable returns a F3 specific power table. + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +[ + { + "ID": 1000, + "Power": 0, + "PubKey": "Bw==" + } +] +``` + +### F3GetLatestCertificate +F3GetLatestCertificate returns the latest finality certificate + + +Perms: read + +Inputs: `null` + +Response: +```json +{ + "GPBFTInstance": 0, + "ECChain": null, + "SupplementalData": { + "Commitments": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "PowerTable": null + }, + "Signers": [ + 0 + ], + "Signature": null, + "PowerTableDelta": null +} +``` + +### F3Participate +F3Participate should be called by a storage provider to participate in signing F3 consensus. +Calling this API gives the lotus node a lease to sign in F3 on behalf of given SP. +The lease should be active only on one node. The lease will expire at the newLeaseExpiration. +To continue participating in F3 with the given node, call F3Participate again before +the newLeaseExpiration time. +newLeaseExpiration cannot be further than 5 minutes in the future. +It is recommended to call F3Participate every 60 seconds +with newLeaseExpiration set 2min into the future. +The oldLeaseExpiration has to be set to newLeaseExpiration of the last successful call. +For the first call to F3Participate, set the oldLeaseExpiration to zero value/time in the past. +F3Participate will return true if the lease was accepted. +The minerID has to be the ID address of the miner. + + +Perms: sign + +Inputs: +```json +[ + "f01234", + "0001-01-01T00:00:00Z", + "0001-01-01T00:00:00Z" +] +``` + +Response: `true` + ## Filecoin @@ -5423,7 +5643,7 @@ Response: }, "Nonce": 42, "Balance": "0", - "Address": "f01234" + "DelegatedAddress": "f01234" } }, "GasCharges": [ @@ -5463,7 +5683,7 @@ Response: }, "Nonce": 42, "Balance": "0", - "Address": "f01234" + "DelegatedAddress": "f01234" } }, "GasCharges": [ @@ -5515,7 +5735,7 @@ Response: }, "Nonce": 42, "Balance": "0", - "Address": "f01234" + "DelegatedAddress": "f01234" } } ``` @@ -5685,7 +5905,7 @@ Response: }, "Nonce": 42, "Balance": "0", - "Address": "f01234" + "DelegatedAddress": "f01234" } }, "GasCharges": [ @@ -5725,7 +5945,7 @@ Response: }, "Nonce": 42, "Balance": "0", - "Address": "f01234" + "DelegatedAddress": "f01234" } }, "GasCharges": [ @@ -5887,7 +6107,7 @@ Response: }, "Nonce": 42, "Balance": "0", - "Address": "f01234" + "DelegatedAddress": "f01234" } ``` @@ -6185,7 +6405,7 @@ Response: "UpgradeWatermelonHeight": 10101, "UpgradeDragonHeight": 10101, "UpgradePhoenixHeight": 10101, - "UpgradeAussieHeight": 10101 + "UpgradeWaffleHeight": 10101 }, "Eip155ChainID": 123 } @@ -7306,7 +7526,7 @@ Response: }, "Nonce": 42, "Balance": "0", - "Address": "f01234" + "DelegatedAddress": "f01234" } }, "GasCharges": [ @@ -7346,7 +7566,7 @@ Response: }, "Nonce": 42, "Balance": "0", - "Address": "f01234" + "DelegatedAddress": "f01234" } }, "GasCharges": [ diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index dbf8853ba33..221841dc7c6 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -7,7 +7,7 @@ USAGE: lotus-miner [global options] command [command options] [arguments...] VERSION: - 1.27.1 + 1.28.0 COMMANDS: init Initialize a lotus miner repo diff --git a/documentation/en/cli-lotus-worker.md b/documentation/en/cli-lotus-worker.md index d5477b97796..55b8ab8df3a 100644 --- a/documentation/en/cli-lotus-worker.md +++ b/documentation/en/cli-lotus-worker.md @@ -7,7 +7,7 @@ USAGE: lotus-worker [global options] command [command options] [arguments...] VERSION: - 1.27.1 + 1.28.0 COMMANDS: run Start lotus worker diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index f878379444e..dfc0a680e91 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -7,7 +7,7 @@ USAGE: lotus [global options] command [command options] [arguments...] VERSION: - 1.27.2 + 1.28.0 COMMANDS: daemon Start a lotus daemon process diff --git a/documentation/misc/Building_a_network_skeleton.md b/documentation/misc/Building_a_network_skeleton.md index 2e7dbf2ca6a..68c1a50dd8d 100644 --- a/documentation/misc/Building_a_network_skeleton.md +++ b/documentation/misc/Building_a_network_skeleton.md @@ -2,10 +2,11 @@ This guide will walk you through the process of creating a skeleton for a network upgrade in Lotus. The process involves making changes in multiple repositories in the following order: -1. [`ref-fvm`](#ref-fvm-checklist) -2. [`filecoin-ffi`](#filecoin-ffi-checklist) -3. [`go-state-types`](#go-state-types-checklist) -4. [`lotus`](#lotus-checklist) +- [Setup](#setup) +- [Ref-FVM Checklist](#ref-fvm-checklist) +- [Filecoin-FFI Checklist](#filecoin-ffi-checklist) +- [Go-State-Types Checklist](#go-state-types-checklist) +- [Lotus Checklist](#lotus-checklist) Each repository has its own set of steps that need to be followed. This guide will provide detailed instructions for each repository. @@ -60,8 +61,24 @@ You can take a look at this [Filecoin-FFI PR as a reference](https://github.com/ 1. Follow the [go-state-types actor version checklist](https://github.com/filecoin-project/go-state-types/blob/master/actors_version_checklist.md): - - Copy `go-state-types/builtin/vX` to `go-state-types/builtin/v(X+1)`. - - Change all references from vX to v(X+1) in the new files. + - Setup + ```bash + # export these environment variables so they can read in the commands below + export CURRENT_VERSION=vXX # e.g., v14 + export NEW_VERSION=vXX+1 # e.g., v15 + ``` + - Copy `go-state-types/builtin/vXX` to `go-state-types/builtin/v(XX+1)`. + ```bash + cp -r builtin/$CURRENT_VERSION builtin/$NEW_VERSION + ``` + - Make a commit with this change. That way the followup commit(s) will be separated out from the copy/paste change for easier reviewing. + - Change all references from vXX to v(XX+1) in the new files. + ```bash + # Find all the files that have a reference to vXX + # Update them to vXX+1 + # "sed -i=''" is done for macOS compatibility per https://stackoverflow.com/questions/12272065/sed-undefined-label-on-macos + find builtin/$NEW_VERSION -type f -exec sh -c 'grep -q "builtin/$CURRENT_VERSION" "$1" && sed -i='' "s/builtin\/$CURRENT_VERSION/builtin\/$NEW_VERSION/g" "$1" && echo "$1"' _ {} \; + ``` - Add new network version to `network/version.go`. - Add new actors version to `actors/version.go`. - Add `Version(XX+1) Version = XX+1` as a constant. @@ -73,14 +90,14 @@ You can take a look at this [Filecoin-FFI PR as a reference](https://github.com/ - Commit the above changes with a `Delete migration specific for nvXX` message so its easier to review. - Check your `/builtin/vXX+1/check.go` file, and see if there is any Invariant TODOs that stems from the previous migration that needs to be cleaned up. -You can take a look at this [Go-State-Types PR as a reference](https://github.com/filecoin-project/go-state-types/pull/257), which added the skeleton for network version 23. + 👉 You can take a look at this [Go-State-Types PR as a reference](https://github.com/filecoin-project/go-state-types/pull/257), which added the skeleton for network version 23. -2. In a second PR based off your first PR, add a simple migration for the network upgrade: +1. In a second PR based off your first PR, add a simple migration for the network upgrade: - Copy the system.go template [^1], and add it to your `/builtin/vXX+1/migration` folder. - Copy the top.go template [^2], and add it to your `/builtin/vXX+1/migration` folder. -You can take a look at this [Go-State-Types PR as a reference](https://github.com/filecoin-project/go-state-types/pull/258), which added added a simple migration for network version 23. + 👉 You can take a look at this [Go-State-Types PR as a reference](https://github.com/filecoin-project/go-state-types/pull/258), which added added a simple migration for network version 23. ## Lotus Checklist @@ -96,27 +113,27 @@ You can take a look at this [Go-State-Types PR as a reference](https://github.co - Update the following files: - `params_2k.go` - - Set previous `UpgradeXxxxxHeight = abi.ChainEpoch(-xx-1)` - - Add `var UpgradeXxxxxHeight = abi.ChainEpoch(200)` - - Add `UpgradeXxxxxHeight = getUpgradeHeight("LOTUS_XXXXX_HEIGHT", UpgradeXXXXHeight)` + - Set previous `UpgradeXxHeight = abi.ChainEpoch(-xx-1)` + - Add `var UpgradeXxHeight = abi.ChainEpoch(200)` + - Add `UpgradeXxHeight = getUpgradeHeight("LOTUS_XX_HEIGHT", UpgradeXXHeight)` - Set `const GenesisNetworkVersion = network.VersionXX` where XX is the network version you are upgrading from. - `params_butterfly.go` - - set previous upgrade to `var UpgradeXxxxxHeigh = abi.ChainEpoch(-xx-1)` + - set previous upgrade to `var UpgradeXxHeigh = abi.ChainEpoch(-xx-1)` - Add comment with ?????? signaling that the new upgrade date is unkown - - Add `const UpgradeXxxxxHeight = 999999999999999` + - Add `const UpgradeXxHeight = 999999999999999` - `params_calibnet.go` - Add comment with `??????` signaling that the new upgrade date is unkown - - Add `const UpgradeXxxxxHeight = 999999999999999` + - Add `const UpgradeXxHeight = 999999999999999` - `params_interop.go` - - set previous upgrade to `var UpgradeXxxxxHeigh = abi.ChainEpoch(-xx-1)` - - Add `const UpgradeXxxxxHeight = 50` + - set previous upgrade to `var UpgradeXxHeigh = abi.ChainEpoch(-xx-1)` + - Add `const UpgradeXxHeight = 50` - `params_mainnet.go` - - Set previous upgrade to `const UpgradeXxxxxHeight = XX` + - Set previous upgrade to `const UpgradeXxHeight = XX` - Add comment with ???? signaling that the new upgrade date is unkown - - Add `var UpgradeXxxxxxHeight = abi.ChainEpoch(9999999999)` - - Change the `LOTUS_DISABLE_XXXX` env variable to the new network name + - Add `var UpgradeXxHeight = abi.ChainEpoch(9999999999)` + - Change the `LOTUS_DISABLE_XX` env variable to the new network name - `params_testground.go` - - Add `UpgradeXxxxxHeight abi.ChainEpoch = (-xx-1)` + - Add `UpgradeXxHeight abi.ChainEpoch = (-xx-1)` 3. Generate adapters: @@ -135,10 +152,10 @@ You can take a look at this [Go-State-Types PR as a reference](https://github.co - Add `inv.Register(actorstypes.Version(XX+1), vm.ActorsVersionPredicate(actorstypes.Version(XX+1)), builtin.MakeRegistry(actorstypes.Version(XX+1))`. 6. Add upgrade field to `api/types.go/ForkUpgradeParams`. - - Add `UpgradeXxxxxHeight abi.ChainEpoch` to `ForkUpgradeParams` struct. + - Add `UpgradeXxHeight abi.ChainEpoch` to `ForkUpgradeParams` struct. 7. Add upgrade to `node/impl/full/state.go`. - - Add `UpgradeXxxxxHeight: build.UpgradeXxxxxHeight,`. + - Add `UpgradeXxHeight: build.UpgradeXxHeight,`. 8. Add network version to `chain/state/statetree.go`. - Add `network.VersionXX+1` to `VersionForNetwork` function. @@ -155,7 +172,7 @@ And you're done! These are all the steps necessary to create a network upgrade s - Complete the migration at upgrade epoch, with a succesful upgrade. - Sync the new network version with the mock actor bundle, and be able to see that you are on a new network version with `lotus state network-version` -You can take a look at this [Lotus PR as a reference](https://github.com/filecoin-project/lotus/pull/11897), which added the skeleton for network version 23. +You can take a look at this [Lotus PR as a reference](https://github.com/filecoin-project/lotus/pull/11964), which added the skeleton for network version 23. [^1]: Here is system.go template for a simple migration: @@ -315,7 +332,7 @@ You can take a look at this [Lotus PR as a reference](https://github.com/filecoi ```go { - Height: build.UpgradeXxxxHeight, + Height: build.UpgradeXxHeight, Network: network.Version(XX+1), Migration: UpgradeActorsV(XX+1), PreMigrations: []stmgr.PreMigration{{ diff --git a/documentation/misc/RELEASE_ISSUE_TEMPLATE.md b/documentation/misc/RELEASE_ISSUE_TEMPLATE.md index 4fa59b9b4b7..e26e06b326d 100644 --- a/documentation/misc/RELEASE_ISSUE_TEMPLATE.md +++ b/documentation/misc/RELEASE_ISSUE_TEMPLATE.md @@ -13,39 +13,37 @@ **Note for whoever is owning the release:** please capture notes as comments in this issue for anything you noticed that could be improved for future releases. There is a *Post Release* step below for incorporating changes back into the [RELEASE_ISSUE_TEMPLATE](https://github.com/filecoin-project/lotus/blob/master/documentation/misc/RELEASE_ISSUE_TEMPLATE.md), and this is easier done by collecting notes from along the way rather than just thinking about it at the end. -- [ ] Fork a new branch (`release/vX.Y.Z` or `release/miner/vX.Y.Z`) from `master` and make any further release related changes to this branch. If any "non-trivial" changes get added to the release, uncheck all the checkboxes and return to this stage. +- [ ] Fork a new branch (`release/vX.Y.Z`) from `master` and make any further release related changes to this branch. If any "non-trivial" changes get added to the release, uncheck all the checkboxes and return to this stage. - [ ] Bump the version in `build/version.go` in the `master` branch to `vX.Y.(Z+1)-dev` (bump from feature release) or `vX.(Y+1).0-dev` (bump from mandatory release). Run make gen and make docsgen-cli before committing changes **Prepping an RC**: -Perform the following changes to the `release/vX.Y.Z` or `release/miner/vX.Y.Z` branch through a PR: -- [ ] update the version string in `build/version.go` to one ending with '-rcX' -- [ ] run `make gen && make docsgen-cli` to generate documentation -- [ ] create a **PR** targetting `release/vX.Y.Z` or `release/miner/vX.Y.Z` branch - - Opening a PR will trigger a CI run that will build the release and publish it to GitHub as a draft - - Merging the PR will trigger a CI run that will publish the GitHub release (it will also create a git tag) +- [ ] version string in `build/version.go` needs to be updated to end with '-rcX' (in the `release/vX.Y.Z` branch) +- [ ] run `make gen && make docsgen-cli` +- [ ] Generate changelog using the script at scripts/mkreleaselog +- [ ] Add contents of generated text to lotus/CHANGELOG.md in addition to other details +- [ ] Commit using PR +- [ ] tag commit with `vX.Y.Z-rcN` +- [ ] cut a pre-release [here](https://github.com/filecoin-project/lotus/releases/new?prerelease=true) **Testing** Test the release candidate thoroughly, including automated and manual tests to ensure stability and functionality across various environments and scenarios. **Stable Release** - -Perform the following changes to the `release/vX.Y.Z` branch (optionally, through a PR): -- [ ] update the version string in `build/version.go` to one **NOT** ending with '-rcX' -- [ ] run `make gen && make docsgen-cli` to generate documentation -- [ ] either commit the changes directly or open a PR against the `release/vX.Y.Z` or `release/miner/vX.Y.Z` branch - -Perform the following changes to the `releases` branch through a PR: -- [ ] create a **PR** targetting `releases` branch (base) from `release/vX.Y.Z` or `release/miner/vX.Y.Z` branch (head) - - Opening a PR will trigger a CI run that will build the release and publish it to GitHub as a draft - - Merging the PR will trigger a CI run that will publish the GitHub release (it will also create a git tag) + - [ ] Final preparation + - [ ] Verify that version string in [`version.go`](https://github.com/filecoin-project/lotus/blob/master/build/version.go) has been updated. + - [ ] Verify that codegen is up to date (`make gen && make docsgen-cli`) + - [ ] Ensure that [CHANGELOG.md](https://github.com/filecoin-project/lotus/blob/master/CHANGELOG.md) is up to date + - [ ] Open a pull request against the `releases` branch with a merge of `release-vX.Y.Z`. + - [ ] Cut the release [here](https://github.com/filecoin-project/lotus/releases/new?prerelease=false&target=releases). + - The target should be the `releases` branch. + - Either make the tag locally and push to the `releases` branch, or allow GitHub to create a new tag via the UI when the release is published. **Post-Release** - -- [ ] Open a pull request against the `master` branch with a merge of the `releases` branch. Conflict resolution should ignore the changes to `version.go` (keep the `-dev` version from master). Do NOT delete the `releases` branch when doing so! -- [ ] Update [RELEASE_ISSUE_TEMPLATE.md](https://github.com/filecoin-project/lotus/blob/master/documentation/misc/RELEASE_ISSUE_TEMPLATE.md) with any improvements determined from this latest release iteration. -- [ ] Create an issue using [RELEASE_ISSUE_TEMPLATE.md](https://github.com/filecoin-project/lotus/blob/master/documentation/misc/RELEASE_ISSUE_TEMPLATE.md) for the _next_ release. + - [ ] Open a pull request against the `master` branch with a merge of the `releases` branch. Conflict resolution should ignore the changes to `version.go` (keep the `-dev` version from master). Do NOT delete the `releases` branch when doing so! + - [ ] Update [RELEASE_ISSUE_TEMPLATE.md](https://github.com/filecoin-project/lotus/blob/master/documentation/misc/RELEASE_ISSUE_TEMPLATE.md) with any improvements determined from this latest release iteration. + - [ ] Create an issue using [RELEASE_ISSUE_TEMPLATE.md](https://github.com/filecoin-project/lotus/blob/master/documentation/misc/RELEASE_ISSUE_TEMPLATE.md) for the _next_ release. ## ❤️ Contributors diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index 081367cae7c..e467d2992e3 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit 081367cae7cdfe87d8b7240a9c3767ce86a40b05 +Subproject commit e467d2992e3f9bd09beb71ecf84323b45d2a3511 diff --git a/gen/bundle/bundle.go b/gen/bundle/bundle.go index 64c13ec32c5..b3878d8ace3 100644 --- a/gen/bundle/bundle.go +++ b/gen/bundle/bundle.go @@ -18,7 +18,7 @@ import ( "github.com/ipfs/go-cid" ) -var EmbeddedBuiltinActorsMetadata []*BuiltinActorsMetadata = []*BuiltinActorsMetadata{ +var EmbeddedBuiltinActorsMetadata = []*BuiltinActorsMetadata{ {{- range . }} { Network: {{printf "%q" .Network}}, Version: {{.Version}}, diff --git a/go.mod b/go.mod index f6946164a3c..282a2472abb 100644 --- a/go.mod +++ b/go.mod @@ -6,13 +6,13 @@ retract v1.14.0 // Accidentally force-pushed tag, use v1.14.1+ instead. retract v1.20.2 // Wrongfully cherry picked PR, use v1.20.2+ instead. -replace github.com/filecoin-project/filecoin-ffi => ./extern/filecoin-ffi // provided via a git submodule - replace github.com/filecoin-project/test-vectors => ./extern/test-vectors // provided via a git submodule +replace github.com/filecoin-project/filecoin-ffi => ./extern/filecoin-ffi // provided via a git submodule + require ( contrib.go.opencensus.io/exporter/prometheus v0.4.2 - github.com/BurntSushi/toml v1.3.0 + github.com/BurntSushi/toml v1.3.2 github.com/DataDog/zstd v1.4.5 github.com/GeertJohan/go.rice v1.0.3 github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee @@ -26,14 +26,14 @@ require ( github.com/dgraph-io/badger/v2 v2.2007.4 github.com/docker/go-units v0.5.0 github.com/drand/drand v1.5.11 - github.com/drand/kyber v1.3.0 + github.com/drand/kyber v1.3.1 github.com/dustin/go-humanize v1.0.1 github.com/elastic/go-elasticsearch/v7 v7.14.0 github.com/elastic/go-sysinfo v1.7.0 github.com/elastic/gosigar v0.14.2 github.com/etclabscore/go-openrpc-reflect v0.0.36 github.com/fatih/color v1.15.0 - github.com/filecoin-project/filecoin-ffi v0.30.4-0.20220519234331-bfd1f5f9fe38 + github.com/filecoin-project/filecoin-ffi v1.28.0-rc2 github.com/filecoin-project/go-address v1.1.0 github.com/filecoin-project/go-amt-ipld/v4 v4.3.0 github.com/filecoin-project/go-bitfield v0.2.4 @@ -41,12 +41,13 @@ require ( github.com/filecoin-project/go-commp-utils v0.1.3 github.com/filecoin-project/go-commp-utils/nonffi v0.0.0-20220905160352-62059082a837 github.com/filecoin-project/go-crypto v0.0.1 + github.com/filecoin-project/go-f3 v0.0.5 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 github.com/filecoin-project/go-jsonrpc v0.3.2 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.4 - github.com/filecoin-project/go-state-types v0.14.0-dev + github.com/filecoin-project/go-state-types v0.14.0 github.com/filecoin-project/go-statemachine v1.0.3 github.com/filecoin-project/go-statestore v0.2.0 github.com/filecoin-project/go-storedcounter v0.1.0 @@ -98,11 +99,12 @@ require ( github.com/ipld/go-ipld-prime v0.21.0 github.com/ipni/go-libipni v0.0.8 github.com/jackc/pgerrcode v0.0.0-20240316143900-6e2875d9b438 + github.com/jpillora/backoff v1.0.0 github.com/kelseyhightower/envconfig v1.4.0 github.com/klauspost/compress v1.17.8 github.com/koalacxr/quantile v0.0.1 github.com/libp2p/go-buffer-pool v0.1.0 - github.com/libp2p/go-libp2p v0.35.3 + github.com/libp2p/go-libp2p v0.35.4 github.com/libp2p/go-libp2p-kad-dht v0.25.2 github.com/libp2p/go-libp2p-pubsub v0.11.0 github.com/libp2p/go-libp2p-record v0.2.0 @@ -127,7 +129,6 @@ require ( github.com/raulk/clock v1.1.0 github.com/raulk/go-watchdog v1.3.0 github.com/samber/lo v1.39.0 - github.com/sirupsen/logrus v1.9.2 github.com/stretchr/testify v1.9.0 github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 github.com/triplewz/poseidon v0.0.0-20230828015038-79d8165c88ed @@ -141,22 +142,23 @@ require ( github.com/zondax/ledger-filecoin-go v0.11.1 github.com/zyedidia/generic v1.2.1 go.opencensus.io v0.24.0 - go.opentelemetry.io/otel v1.26.0 - go.opentelemetry.io/otel/bridge/opencensus v0.39.0 + go.opentelemetry.io/otel v1.28.0 + go.opentelemetry.io/otel/bridge/opencensus v1.28.0 go.opentelemetry.io/otel/exporters/jaeger v1.14.0 - go.opentelemetry.io/otel/sdk v1.26.0 + go.opentelemetry.io/otel/exporters/prometheus v0.50.0 + go.opentelemetry.io/otel/sdk v1.28.0 + go.opentelemetry.io/otel/sdk/metric v1.28.0 go.uber.org/atomic v1.11.0 go.uber.org/fx v1.22.1 go.uber.org/multierr v1.11.0 go.uber.org/zap v1.27.0 - golang.org/x/crypto v0.23.0 - golang.org/x/mod v0.17.0 - golang.org/x/net v0.25.0 + golang.org/x/crypto v0.24.0 + golang.org/x/net v0.26.0 golang.org/x/sync v0.7.0 - golang.org/x/sys v0.20.0 - golang.org/x/term v0.20.0 + golang.org/x/sys v0.21.0 + golang.org/x/term v0.21.0 golang.org/x/time v0.5.0 - golang.org/x/tools v0.21.0 + golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 gopkg.in/cheggaaa/pb.v1 v1.0.28 gotest.tools v2.2.0+incompatible @@ -165,6 +167,7 @@ require ( require ( github.com/GeertJohan/go.incremental v1.0.0 // indirect github.com/Jorropo/jsync v1.0.1 // indirect + github.com/Kubuxu/go-broadcast v0.0.0-20240621161059-1a8c90734cd6 // indirect github.com/PuerkitoBio/purell v1.1.1 // indirect github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect github.com/StackExchange/wmi v1.2.1 // indirect @@ -176,7 +179,7 @@ require ( github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cilium/ebpf v0.9.1 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect github.com/crackcomm/go-gitignore v0.0.0-20231225121904-e25f5bc08668 // indirect github.com/cskr/pubsub v1.0.2 // indirect github.com/daaku/go.zipexe v1.0.2 // indirect @@ -190,6 +193,7 @@ require ( github.com/etclabscore/go-jsonschema-walk v0.0.6 // indirect github.com/filecoin-project/go-amt-ipld/v2 v2.1.0 // indirect github.com/filecoin-project/go-amt-ipld/v3 v3.1.0 // indirect + github.com/filecoin-project/go-clock v0.1.0 // indirect github.com/filecoin-project/go-hamt-ipld v0.1.5 // indirect github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 // indirect github.com/flynn/noise v1.1.0 // indirect @@ -197,7 +201,7 @@ require ( github.com/gdamore/encoding v1.0.0 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.5 // indirect github.com/go-openapi/jsonpointer v0.19.3 // indirect @@ -267,6 +271,7 @@ require ( github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect github.com/multiformats/go-multibase v0.2.0 // indirect github.com/multiformats/go-multistream v0.5.0 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/nikkolasg/hexjson v0.1.0 // indirect github.com/nkovacs/streamquote v1.0.0 // indirect github.com/onsi/ginkgo/v2 v2.17.3 // indirect @@ -293,8 +298,8 @@ require ( github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect + github.com/prometheus/common v0.55.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect github.com/prometheus/statsd_exporter v0.22.7 // indirect github.com/quic-go/qpack v0.4.0 // indirect github.com/quic-go/quic-go v0.44.0 // indirect @@ -302,6 +307,7 @@ require ( github.com/rivo/uniseg v0.4.7 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/shirou/gopsutil v2.18.12+incompatible // indirect + github.com/sirupsen/logrus v1.9.2 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/tidwall/gjson v1.14.4 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect @@ -312,21 +318,21 @@ require ( github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect - github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect + github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913 // indirect github.com/zondax/hid v0.9.2 // indirect github.com/zondax/ledger-go v0.14.3 // indirect - go.opentelemetry.io/otel/metric v1.26.0 // indirect - go.opentelemetry.io/otel/sdk/metric v0.39.0 // indirect - go.opentelemetry.io/otel/trace v1.26.0 // indirect + go.opentelemetry.io/otel/metric v1.28.0 // indirect + go.opentelemetry.io/otel/trace v1.28.0 // indirect go.uber.org/dig v1.17.1 // indirect go.uber.org/mock v0.4.0 // indirect go4.org v0.0.0-20230225012048-214862532bf5 // indirect golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect - golang.org/x/text v0.15.0 // indirect + golang.org/x/mod v0.17.0 // indirect + golang.org/x/text v0.16.0 // indirect gonum.org/v1/gonum v0.15.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240515191416-fc5f0ca64291 // indirect google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + google.golang.org/protobuf v1.34.2 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect howett.net/plist v0.0.0-20181124034731-591f970eefbb // indirect diff --git a/go.sum b/go.sum index f3558cd26ba..caa7c4ca2d5 100644 --- a/go.sum +++ b/go.sum @@ -44,8 +44,8 @@ github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOv github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 h1:cTp8I5+VIoKjsnZuH8vjyaysT/ses3EvZeaV/1UkF2M= github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.3.0 h1:Ws8e5YmnrGEHzZEzg0YvK/7COGYtTC5PbaH9oSSbgfA= -github.com/BurntSushi/toml v1.3.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= +github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ= @@ -58,6 +58,8 @@ github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee h1:8doiS7ib3zi6/K1 github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee/go.mod h1:W0GbEAA4uFNYOGG2cJpmFJ04E6SD1NLELPYZB57/7AY= github.com/Jorropo/jsync v1.0.1 h1:6HgRolFZnsdfzRUj+ImB9og1JYOxQoReSywkHOGSaUU= github.com/Jorropo/jsync v1.0.1/go.mod h1:jCOZj3vrBCri3bSU3ErUYvevKlnbssrXeCivybS5ABQ= +github.com/Kubuxu/go-broadcast v0.0.0-20240621161059-1a8c90734cd6 h1:yh2/1fz3ajTaeKskSWxtSBNScdRZfQ/A5nyd9+64T6M= +github.com/Kubuxu/go-broadcast v0.0.0-20240621161059-1a8c90734cd6/go.mod h1:5LOj/fF3Oc/cvJqzDiyfx4XwtBPRWUYEz+V+b13sH5U= github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= github.com/Kubuxu/imtui v0.0.0-20210401140320-41663d68d0fa h1:1PPxEyGdIGVkX/kqMvLJ95a1dGS1Sz7tpNEgehEYYt0= github.com/Kubuxu/imtui v0.0.0-20210401140320-41663d68d0fa/go.mod h1:WUmMvh9wMtqj1Xhf1hf3kp9RvL+y6odtdYxpyZjb90U= @@ -171,8 +173,8 @@ github.com/corpix/uarand v0.1.1/go.mod h1:SFKZvkcRoLqVRFZ4u25xPmp6m9ktANfbpXZ7SJ github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/crackcomm/go-gitignore v0.0.0-20231225121904-e25f5bc08668 h1:ZFUue+PNxmHlu7pYv+IYMtqlaO/0VwaGEqKepZf9JpA= github.com/crackcomm/go-gitignore v0.0.0-20231225121904-e25f5bc08668/go.mod h1:p1d6YEZWvFzEh4KLyvBcVSnrfNDDvK2zfK/4x2v/4pE= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -212,8 +214,8 @@ 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/drand/drand v1.5.11 h1:7sskUTCsX2lgFiWdGvPh3/P0ZDQKi1lCtI7RQKK010k= github.com/drand/drand v1.5.11/go.mod h1:TvJjCJ/s4Usn4pKRpDC0N1QaCwSt3YC8fRqhZdpOUU0= -github.com/drand/kyber v1.3.0 h1:TVd7+xoRgKQ4Ck1viNLPFy6IWhuZM36Bq6zDXD8Asls= -github.com/drand/kyber v1.3.0/go.mod h1:f+mNHjiGT++CuueBrpeMhFNdKZAsy0tu03bKq9D5LPA= +github.com/drand/kyber v1.3.1 h1:E0p6M3II+loMVwTlAp5zu4+GGZFNiRfq02qZxzw2T+Y= +github.com/drand/kyber v1.3.1/go.mod h1:f+mNHjiGT++CuueBrpeMhFNdKZAsy0tu03bKq9D5LPA= github.com/drand/kyber-bls12381 v0.3.1 h1:KWb8l/zYTP5yrvKTgvhOrk2eNPscbMiUOIeWBnmUxGo= github.com/drand/kyber-bls12381 v0.3.1/go.mod h1:H4y9bLPu7KZA/1efDg+jtJ7emKx+ro3PU7/jWUVt140= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= @@ -261,6 +263,8 @@ github.com/filecoin-project/go-bitfield v0.2.4/go.mod h1:CNl9WG8hgR5mttCnUErjcQj github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= github.com/filecoin-project/go-cbor-util v0.0.1 h1:E1LYZYTtjfAQwCReho0VXvbu8t3CYAVPiMx8EiV/VAs= github.com/filecoin-project/go-cbor-util v0.0.1/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= +github.com/filecoin-project/go-clock v0.1.0 h1:SFbYIM75M8NnFm1yMHhN9Ahy3W5bEZV9gd6MPfXbKVU= +github.com/filecoin-project/go-clock v0.1.0/go.mod h1:4uB/O4PvOjlx1VCMdZ9MyDZXRm//gkj1ELEbxfI1AZs= github.com/filecoin-project/go-commp-utils v0.1.3 h1:rTxbkNXZU7FLgdkBk8RsQIEOuPONHykEoX3xGk41Fkw= github.com/filecoin-project/go-commp-utils v0.1.3/go.mod h1:3ENlD1pZySaUout0p9ANQrY3fDFoXdqyX04J+dWpK30= github.com/filecoin-project/go-commp-utils/nonffi v0.0.0-20220905160352-62059082a837 h1:4cITW0pwgvqLs86Q9bWQa34+jBfR1V687bDkmv2DgnA= @@ -268,6 +272,8 @@ github.com/filecoin-project/go-commp-utils/nonffi v0.0.0-20220905160352-62059082 github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-crypto v0.0.1 h1:AcvpSGGCgjaY8y1az6AMfKQWreF/pWO2JJGLl6gCq6o= github.com/filecoin-project/go-crypto v0.0.1/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= +github.com/filecoin-project/go-f3 v0.0.5 h1:864MIl3EsqK8toKg+pNjMDN1SShgE7zibyQzLUSq8xA= +github.com/filecoin-project/go-f3 v0.0.5/go.mod h1:oO+Ch7aa6GRp9xRRLbdQBsrte0oGg7+hsA8PZ9Zy6xc= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88OqLYEo6roi+GiIeOh8= github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= @@ -291,9 +297,9 @@ github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.6/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-state-types v0.1.10/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= -github.com/filecoin-project/go-state-types v0.13.1/go.mod h1:cHpOPup9H1g2T29dKHAjC2sc7/Ef5ypjuW9A3I+e9yY= -github.com/filecoin-project/go-state-types v0.14.0-dev h1:bDwq1S28D7EC/uDmKU8vvNcdFw/YDsNq09pe3zeV5h4= -github.com/filecoin-project/go-state-types v0.14.0-dev/go.mod h1:cHpOPup9H1g2T29dKHAjC2sc7/Ef5ypjuW9A3I+e9yY= +github.com/filecoin-project/go-state-types v0.14.0-rc1/go.mod h1:cHpOPup9H1g2T29dKHAjC2sc7/Ef5ypjuW9A3I+e9yY= +github.com/filecoin-project/go-state-types v0.14.0 h1:JFw8r/LA0/Hvu865Yn2Gz3R5e2woItKeHTgbT4VsXoU= +github.com/filecoin-project/go-state-types v0.14.0/go.mod h1:cDbxwjbmVtV+uNi5D/cFtxKlsRqibnQNlz7xQA1EqYg= github.com/filecoin-project/go-statemachine v1.0.3 h1:N07o6alys+V1tNoSTi4WuuoeNC4erS/6jE74+NsgQuk= github.com/filecoin-project/go-statemachine v1.0.3/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= @@ -365,8 +371,8 @@ github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KE github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.5 h1:t4MGB5xEDZvXI+0rMjjsfBsD7yAgp/s9ZDkL1JndXwY= @@ -749,6 +755,7 @@ github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/jrick/logrotate v1.0.0 h1:lQ1bL/n9mBNeIXoTUoYRlK4dHuNJVofX9oWqBtPnSzI= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= @@ -820,8 +827,8 @@ github.com/libp2p/go-flow-metrics v0.1.0 h1:0iPhMI8PskQwzh57jB9WxIuIOQ0r+15PChFG github.com/libp2p/go-flow-metrics v0.1.0/go.mod h1:4Xi8MX8wj5aWNDAZttg6UPmc0ZrnFNsMtpsYUClFtro= github.com/libp2p/go-libp2p v0.1.0/go.mod h1:6D/2OBauqLUoqcADOJpn9WbKqvaM07tDw68qHM0BxUM= github.com/libp2p/go-libp2p v0.1.1/go.mod h1:I00BRo1UuUSdpuc8Q2mN7yDF/oTUTRAX6JWpTiK9Rp8= -github.com/libp2p/go-libp2p v0.35.3 h1:7Je71b8YuUD+aYbM6GYU84mNXo9vcc8VDfGuB57RSXs= -github.com/libp2p/go-libp2p v0.35.3/go.mod h1:RKCDNt30IkFipGL0tl8wQW/3zVWEGFUZo8g2gAKxwjU= +github.com/libp2p/go-libp2p v0.35.4 h1:FDiBUYLkueFwsuNJUZaxKRdpKvBOWU64qQPL768bSeg= +github.com/libp2p/go-libp2p v0.35.4/go.mod h1:RKCDNt30IkFipGL0tl8wQW/3zVWEGFUZo8g2gAKxwjU= github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94= github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8= github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= @@ -1010,6 +1017,8 @@ github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXS github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= @@ -1138,8 +1147,8 @@ github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9 github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.35.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= +github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= +github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -1149,8 +1158,8 @@ github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/prometheus/statsd_exporter v0.22.7 h1:7Pji/i2GuhK6Lu7DHrtTkFmNBCudCPT1pX2CziuyQR0= github.com/prometheus/statsd_exporter v0.22.7/go.mod h1:N/TevpjkIh9ccs6nuzY3jQn9dFqnUakOjnEuMPJJJnI= github.com/puzpuzpuz/xsync/v2 v2.4.0 h1:5sXAMHrtx1bg9nbRZTOn8T4MkWe5V+o8yKRH02Eznag= @@ -1347,8 +1356,8 @@ github.com/xorcare/golden v0.6.0/go.mod h1:7T39/ZMvaSEZlBPoYfVFmsBLmUl3uz9IuzWj/ github.com/xorcare/golden v0.6.1-0.20191112154924-b87f686d7542 h1:oWgZJmC1DorFZDpfMfWg7xk29yEOZiXmo/wZl+utTI8= github.com/xorcare/golden v0.6.1-0.20191112154924-b87f686d7542/go.mod h1:7T39/ZMvaSEZlBPoYfVFmsBLmUl3uz9IuzWj/U6FtvQ= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= -github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= +github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913 h1:+qGGcbkzsfDQNPPe9UDgpxAWQrhbbBXOYJFQDq/dtJw= +github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913/go.mod h1:4aEEwZQutDLsQv2Deui4iYQ6DWTxR14g6m8Wv88+Xqk= github.com/yugabyte/pgx/v5 v5.5.3-yb-2 h1:SDk2waZb2o6dSLYqk+vq0Ur2jnIv+X2A+P+QPR1UThU= github.com/yugabyte/pgx/v5 v5.5.3-yb-2/go.mod h1:2SxizGfDY7UDCRTtbI/xd98C/oGN7S/3YoGF8l9gx/c= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -1380,20 +1389,22 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/otel v1.26.0 h1:LQwgL5s/1W7YiiRwxf03QGnWLb2HW4pLiAhaA5cZXBs= -go.opentelemetry.io/otel v1.26.0/go.mod h1:UmLkJHUAidDval2EICqBMbnAd0/m2vmpf/dAM+fvFs4= -go.opentelemetry.io/otel/bridge/opencensus v0.39.0 h1:YHivttTaDhbZIHuPlg1sWsy2P5gj57vzqPfkHItgbwQ= -go.opentelemetry.io/otel/bridge/opencensus v0.39.0/go.mod h1:vZ4537pNjFDXEx//WldAR6Ro2LC8wwmFC76njAXwNPE= +go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= +go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= +go.opentelemetry.io/otel/bridge/opencensus v1.28.0 h1:/BcyAV1bUJjSVxoeKwTQL9cS4X1iC6izZ9mheeuVSCU= +go.opentelemetry.io/otel/bridge/opencensus v1.28.0/go.mod h1:FZp2xE+46yAyp3DfLFALze58nY0iIE8zs+mCgkPAzq0= go.opentelemetry.io/otel/exporters/jaeger v1.14.0 h1:CjbUNd4iN2hHmWekmOqZ+zSCU+dzZppG8XsV+A3oc8Q= go.opentelemetry.io/otel/exporters/jaeger v1.14.0/go.mod h1:4Ay9kk5vELRrbg5z4cpP9EtmQRFap2Wb0woPG4lujZA= -go.opentelemetry.io/otel/metric v1.26.0 h1:7S39CLuY5Jgg9CrnA9HHiEjGMF/X2VHvoXGgSllRz30= -go.opentelemetry.io/otel/metric v1.26.0/go.mod h1:SY+rHOI4cEawI9a7N1A4nIg/nTQXe1ccCNWYOJUrpX4= -go.opentelemetry.io/otel/sdk v1.26.0 h1:Y7bumHf5tAiDlRYFmGqetNcLaVUZmh4iYfmGxtmz7F8= -go.opentelemetry.io/otel/sdk v1.26.0/go.mod h1:0p8MXpqLeJ0pzcszQQN4F0S5FVjBLgypeGSngLsmirs= -go.opentelemetry.io/otel/sdk/metric v0.39.0 h1:Kun8i1eYf48kHH83RucG93ffz0zGV1sh46FAScOTuDI= -go.opentelemetry.io/otel/sdk/metric v0.39.0/go.mod h1:piDIRgjcK7u0HCL5pCA4e74qpK/jk3NiUoAHATVAmiI= -go.opentelemetry.io/otel/trace v1.26.0 h1:1ieeAUb4y0TE26jUFrCIXKpTuVK7uJGN9/Z/2LP5sQA= -go.opentelemetry.io/otel/trace v1.26.0/go.mod h1:4iDxvGDQuUkHve82hJJ8UqrwswHYsZuWCBllGV2U2y0= +go.opentelemetry.io/otel/exporters/prometheus v0.50.0 h1:2Ewsda6hejmbhGFyUvWZjUThC98Cf8Zy6g0zkIimOng= +go.opentelemetry.io/otel/exporters/prometheus v0.50.0/go.mod h1:pMm5PkUo5YwbLiuEf7t2xg4wbP0/eSJrMxIMxKosynY= +go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= +go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= +go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE= +go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg= +go.opentelemetry.io/otel/sdk/metric v1.28.0 h1:OkuaKgKrgAbYrrY0t92c+cC+2F6hsFNnCQArXCKlg08= +go.opentelemetry.io/otel/sdk/metric v1.28.0/go.mod h1:cWPjykihLAPvXKi4iZc1dpER3Jdq2Z0YLse3moQUCpg= +go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= +go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= @@ -1459,8 +1470,8 @@ golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= +golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1560,8 +1571,8 @@ golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= +golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1682,8 +1693,8 @@ golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -1698,8 +1709,8 @@ golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= -golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= -golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA= +golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1713,8 +1724,8 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1776,8 +1787,8 @@ golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.21.0 h1:qc0xYgIbsSDt9EyWz05J5wfa7LOVW0YTLOXrqdLAWIw= -golang.org/x/tools v0.21.0/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1884,8 +1895,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/itests/eth_filter_test.go b/itests/eth_filter_test.go index 114a4c2550a..f2347866226 100644 --- a/itests/eth_filter_test.go +++ b/itests/eth_filter_test.go @@ -1154,8 +1154,8 @@ func getEthAddress(ctx context.Context, t *testing.T, client *kit.TestFullNode, actor, err := client.StateGetActor(ctx, addr, head.Key()) require.NoError(t, err) - require.NotNil(t, actor.Address) - ethContractAddr, err := ethtypes.EthAddressFromFilecoinAddress(*actor.Address) + require.NotNil(t, actor.DelegatedAddress) + ethContractAddr, err := ethtypes.EthAddressFromFilecoinAddress(*actor.DelegatedAddress) require.NoError(t, err) return ethContractAddr } diff --git a/itests/fevm_test.go b/itests/fevm_test.go index c2b5e2aa9bb..68071fff51a 100644 --- a/itests/fevm_test.go +++ b/itests/fevm_test.go @@ -51,50 +51,13 @@ func decodeOutputToUint64(output []byte) (uint64, error) { err := binary.Read(buf, binary.BigEndian, &result) return result, err } -func buildInputFromuint64(number uint64) []byte { +func buildInputFromUint64(number uint64) []byte { // Convert the number to a binary uint64 array binaryNumber := make([]byte, 8) binary.BigEndian.PutUint64(binaryNumber, number) return inputDataFromArray(binaryNumber) } -// recursive delegate calls that fail due to gas limits are currently getting to 229 iterations -// before running out of gas -func recursiveDelegatecallFail(ctx context.Context, t *testing.T, client *kit.TestFullNode, filename string, count uint64) { - expectedIterationsBeforeFailing := int(220) - fromAddr, idAddr := client.EVM().DeployContractFromFilename(ctx, filename) - t.Log("recursion count - ", count) - inputData := buildInputFromuint64(count) - _, _, err := client.EVM().InvokeContractByFuncName(ctx, fromAddr, idAddr, "recursiveCall(uint256)", inputData) - - require.NoError(t, err) - - result, _, err := client.EVM().InvokeContractByFuncName(ctx, fromAddr, idAddr, "totalCalls()", []byte{}) - require.NoError(t, err) - - resultUint, err := decodeOutputToUint64(result) - require.NoError(t, err) - - require.NotEqual(t, int(resultUint), int(count)) - require.Equal(t, expectedIterationsBeforeFailing, int(resultUint)) -} -func recursiveDelegatecallSuccess(ctx context.Context, t *testing.T, client *kit.TestFullNode, filename string, count uint64) { - t.Log("Count - ", count) - - fromAddr, idAddr := client.EVM().DeployContractFromFilename(ctx, filename) - inputData := buildInputFromuint64(count) - _, _, err := client.EVM().InvokeContractByFuncName(ctx, fromAddr, idAddr, "recursiveCall(uint256)", inputData) - require.NoError(t, err) - - result, _, err := client.EVM().InvokeContractByFuncName(ctx, fromAddr, idAddr, "totalCalls()", []byte{}) - require.NoError(t, err) - - resultUint, err := decodeOutputToUint64(result) - require.NoError(t, err) - - require.Equal(t, int(count), int(resultUint)) -} - // TestFEVMRecursive does a basic fevm contract installation and invocation func TestFEVMRecursive(t *testing.T) { callCounts := []uint64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 100, 230, 330} @@ -107,7 +70,7 @@ func TestFEVMRecursive(t *testing.T) { for _, callCount := range callCounts { callCount := callCount // linter unhappy unless callCount is local to loop t.Run(fmt.Sprintf("TestFEVMRecursive%d", callCount), func(t *testing.T) { - _, _, err := client.EVM().InvokeContractByFuncName(ctx, fromAddr, idAddr, "recursiveCall(uint256)", buildInputFromuint64(callCount)) + _, _, err := client.EVM().InvokeContractByFuncName(ctx, fromAddr, idAddr, "recursiveCall(uint256)", buildInputFromUint64(callCount)) require.NoError(t, err) }) } @@ -125,7 +88,7 @@ func TestFEVMRecursiveFail(t *testing.T) { for _, failCallCount := range failCallCounts { failCallCount := failCallCount // linter unhappy unless callCount is local to loop t.Run(fmt.Sprintf("TestFEVMRecursiveFail%d", failCallCount), func(t *testing.T) { - _, wait, err := client.EVM().InvokeContractByFuncName(ctx, fromAddr, idAddr, "recursiveCall(uint256)", buildInputFromuint64(failCallCount)) + _, wait, err := client.EVM().InvokeContractByFuncName(ctx, fromAddr, idAddr, "recursiveCall(uint256)", buildInputFromUint64(failCallCount)) require.Error(t, err) require.Equal(t, exitcode.ExitCode(37), wait.Receipt.ExitCode) }) @@ -156,23 +119,51 @@ func TestFEVMRecursive2(t *testing.T) { // TestFEVMRecursiveDelegatecallCount tests the maximum delegatecall recursion depth. func TestFEVMRecursiveDelegatecallCount(t *testing.T) { - ctx, cancel, client := kit.SetupFEVMTest(t) defer cancel() - highestSuccessCount := uint64(226) + // these depend on the actors bundle, may need to be adjusted with a network upgrade + const highestSuccessCount = 228 + const expectedIterationsBeforeFailing = 222 filename := "contracts/RecursiveDelegeatecall.hex" - recursiveDelegatecallSuccess(ctx, t, client, filename, uint64(1)) - recursiveDelegatecallSuccess(ctx, t, client, filename, uint64(2)) - recursiveDelegatecallSuccess(ctx, t, client, filename, uint64(10)) - recursiveDelegatecallSuccess(ctx, t, client, filename, uint64(100)) - recursiveDelegatecallSuccess(ctx, t, client, filename, highestSuccessCount) - recursiveDelegatecallFail(ctx, t, client, filename, highestSuccessCount+1) - recursiveDelegatecallFail(ctx, t, client, filename, uint64(1000)) - recursiveDelegatecallFail(ctx, t, client, filename, uint64(10000000)) + testCases := []struct { + recursionCount uint64 + expectSuccess bool + }{ + // success + {1, true}, + {2, true}, + {10, true}, + {100, true}, + {highestSuccessCount, true}, + // failure + {highestSuccessCount + 1, false}, + {1000, false}, + {10000000, false}, + } + for _, tc := range testCases { + t.Run(fmt.Sprintf("recursionCount=%d,expectSuccess=%t", tc.recursionCount, tc.expectSuccess), func(t *testing.T) { + fromAddr, idAddr := client.EVM().DeployContractFromFilename(ctx, filename) + inputData := buildInputFromUint64(tc.recursionCount) + _, _, err := client.EVM().InvokeContractByFuncName(ctx, fromAddr, idAddr, "recursiveCall(uint256)", inputData) + require.NoError(t, err) + + result, _, err := client.EVM().InvokeContractByFuncName(ctx, fromAddr, idAddr, "totalCalls()", []byte{}) + require.NoError(t, err) + + resultUint, err := decodeOutputToUint64(result) + require.NoError(t, err) + if tc.expectSuccess { + require.Equal(t, int(tc.recursionCount), int(resultUint)) + } else { + require.NotEqual(t, int(resultUint), int(tc.recursionCount), "unexpected recursion count, if the actors bundle has changed, this test may need to be adjusted") + require.Equal(t, int(expectedIterationsBeforeFailing), int(resultUint)) + } + }) + } } // TestFEVMBasic does a basic fevm contract installation and invocation @@ -224,7 +215,7 @@ func TestFEVMETH0(t *testing.T) { eth0Addr, err := address.NewDelegatedAddress(builtintypes.EthereumAddressManagerActorID, make([]byte, 20)) require.NoError(t, err) - require.Equal(t, *act.Address, eth0Addr) + require.Equal(t, *act.DelegatedAddress, eth0Addr) } // TestFEVMDelegateCall deploys two contracts and makes a delegate call transaction @@ -585,44 +576,52 @@ func TestFEVMRecursiveActorCall(t *testing.T) { filenameActor := "contracts/RecCall.hex" fromAddr, actorAddr := client.EVM().DeployContractFromFilename(ctx, filenameActor) - testN := func(n, r int, ex exitcode.ExitCode) func(t *testing.T) { - return func(t *testing.T) { + exitCodeStackOverflow := exitcode.ExitCode(37) + exitCodeTransactionReverted := exitcode.ExitCode(33) + + testCases := []struct { + stackDepth int + recursionLimit int + exitCode exitcode.ExitCode + }{ + {0, 1, exitcode.Ok}, + {1, 1, exitcode.Ok}, + {20, 1, exitcode.Ok}, + {200, 1, exitcode.Ok}, + {251, 1, exitcode.Ok}, + {252, 1, exitCodeStackOverflow}, + {0, 10, exitcode.Ok}, + {1, 10, exitcode.Ok}, + {20, 10, exitcode.Ok}, + {200, 10, exitcode.Ok}, + {251, 10, exitcode.Ok}, + {252, 10, exitCodeStackOverflow}, + {0, 32, exitcode.Ok}, + {1, 32, exitcode.Ok}, + {20, 32, exitcode.Ok}, + {200, 32, exitcode.Ok}, + {251, 32, exitcode.Ok}, + {252, 32, exitCodeStackOverflow}, + // the following are actors bundle dependent and may need to be tweaked with a network upgrade + {0, 255, exitcode.Ok}, + {251, 164, exitcode.Ok}, + {0, 261, exitCodeTransactionReverted}, + {251, 173, exitCodeTransactionReverted}, + } + for _, tc := range testCases { + var fail string + if tc.exitCode != exitcode.Ok { + fail = "-fails" + } + t.Run(fmt.Sprintf("stackDepth=%d,recursionLimit=%d%s", tc.stackDepth, tc.recursionLimit, fail), func(t *testing.T) { inputData := make([]byte, 32*3) - binary.BigEndian.PutUint64(inputData[24:], uint64(n)) - binary.BigEndian.PutUint64(inputData[32+24:], uint64(n)) - binary.BigEndian.PutUint64(inputData[32+32+24:], uint64(r)) + binary.BigEndian.PutUint64(inputData[24:], uint64(tc.stackDepth)) + binary.BigEndian.PutUint64(inputData[32+24:], uint64(tc.stackDepth)) + binary.BigEndian.PutUint64(inputData[32+32+24:], uint64(tc.recursionLimit)) - client.EVM().InvokeContractByFuncNameExpectExit(ctx, fromAddr, actorAddr, "exec1(uint256,uint256,uint256)", inputData, ex) - } + client.EVM().InvokeContractByFuncNameExpectExit(ctx, fromAddr, actorAddr, "exec1(uint256,uint256,uint256)", inputData, tc.exitCode) + }) } - - t.Run("n=0,r=1", testN(0, 1, exitcode.Ok)) - t.Run("n=1,r=1", testN(1, 1, exitcode.Ok)) - t.Run("n=20,r=1", testN(20, 1, exitcode.Ok)) - t.Run("n=200,r=1", testN(200, 1, exitcode.Ok)) - t.Run("n=251,r=1", testN(251, 1, exitcode.Ok)) - - t.Run("n=252,r=1-fails", testN(252, 1, exitcode.ExitCode(37))) // 37 means stack overflow - - t.Run("n=0,r=10", testN(0, 10, exitcode.Ok)) - t.Run("n=1,r=10", testN(1, 10, exitcode.Ok)) - t.Run("n=20,r=10", testN(20, 10, exitcode.Ok)) - t.Run("n=200,r=10", testN(200, 10, exitcode.Ok)) - t.Run("n=251,r=10", testN(251, 10, exitcode.Ok)) - - t.Run("n=252,r=10-fails", testN(252, 10, exitcode.ExitCode(37))) - - t.Run("n=0,r=32", testN(0, 32, exitcode.Ok)) - t.Run("n=1,r=32", testN(1, 32, exitcode.Ok)) - t.Run("n=20,r=32", testN(20, 32, exitcode.Ok)) - t.Run("n=200,r=32", testN(200, 32, exitcode.Ok)) - t.Run("n=251,r=32", testN(251, 32, exitcode.Ok)) - - t.Run("n=0,r=252", testN(0, 252, exitcode.Ok)) - t.Run("n=251,r=164", testN(251, 164, exitcode.Ok)) - - t.Run("n=0,r=255-fails", testN(0, 255, exitcode.ExitCode(33))) // 33 means transaction reverted - t.Run("n=251,r=167-fails", testN(251, 167, exitcode.ExitCode(33))) } // TestFEVMRecursiveActorCallEstimate diff --git a/itests/kit/blockminer.go b/itests/kit/blockminer.go index 75842567819..32797182be7 100644 --- a/itests/kit/blockminer.go +++ b/itests/kit/blockminer.go @@ -100,6 +100,7 @@ func newPartitionTracker(ctx context.Context, t *testing.T, client v1api.FullNod parts, err := client.StateMinerPartitions(ctx, minerAddr, dlIdx, types.EmptyTSK) require.NoError(t, err) + return &partitionTracker{ minerAddr: minerAddr, partitions: parts, @@ -245,7 +246,9 @@ func (bm *BlockMiner) MineBlocksMustPost(ctx context.Context, blocktime time.Dur dlinfo, err := bm.miner.FullNode.StateMinerProvingDeadline(ctx, minerAddr, ts.Key()) require.NoError(bm.t, err) require.NotNil(bm.t, dlinfo, "no deadline info for miner %s", minerAddr) - impendingDeadlines = append(impendingDeadlines, minerDeadline{addr: minerAddr, deadline: *dlinfo}) + if dlinfo.Open < dlinfo.CurrentEpoch { + impendingDeadlines = append(impendingDeadlines, minerDeadline{addr: minerAddr, deadline: *dlinfo}) + } // else this is probably a new miner, not starting in this proving period } bm.postWatchMinersLk.Unlock() impendingDeadlines = impendingDeadlines.FilterByLast(ts.Height() + 5 + abi.ChainEpoch(nulls)) diff --git a/itests/kit/ensemble.go b/itests/kit/ensemble.go index d8f6e7f91a0..5f8f60ccd35 100644 --- a/itests/kit/ensemble.go +++ b/itests/kit/ensemble.go @@ -260,7 +260,7 @@ func (n *Ensemble) MinerEnroll(minerNode *TestMiner, full *TestFullNode, opts .. ) // Will use 2KiB sectors by default (default value of sectorSize). - proofType, err := miner.SealProofTypeFromSectorSize(options.sectorSize, n.genesis.version, false) + proofType, err := miner.SealProofTypeFromSectorSize(options.sectorSize, n.genesis.version, miner.SealProofVariant_Standard) require.NoError(n.t, err) // Create the preseal commitment. @@ -327,7 +327,7 @@ func (n *Ensemble) UnmanagedMiner(full *TestFullNode, opts ...NodeOpt) (*TestUnm actorAddr, err := address.NewIDAddress(genesis2.MinerStart + n.minerCount()) require.NoError(n.t, err) - minerNode := NewTestUnmanagedMiner(n.t, full, actorAddr, opts...) + minerNode := NewTestUnmanagedMiner(n.t, full, actorAddr, n.options.mockProofs, opts...) n.AddInactiveUnmanagedMiner(minerNode) return minerNode, n } diff --git a/itests/kit/node_opts.go b/itests/kit/node_opts.go index 89c04b1c766..3d2b16e4e70 100644 --- a/itests/kit/node_opts.go +++ b/itests/kit/node_opts.go @@ -25,6 +25,7 @@ import ( const DefaultPresealsPerBootstrapMiner = 2 const TestSpt = abi.RegisteredSealProof_StackedDrg2KiBV1_1 +const TestSptNi = abi.RegisteredSealProof_StackedDrg2KiBV1_2_Feat_NiPoRep // nodeOpts is an options accumulating struct, where functional options are // merged into. diff --git a/itests/kit/node_unmanaged.go b/itests/kit/node_unmanaged.go index 562146f56a4..5dc3ed379ad 100644 --- a/itests/kit/node_unmanaged.go +++ b/itests/kit/node_unmanaged.go @@ -6,6 +6,7 @@ import ( "crypto/rand" "fmt" "io" + "math" "os" "path/filepath" "testing" @@ -34,8 +35,9 @@ import ( // TestUnmanagedMiner is a miner that's not managed by the storage/infrastructure, all tasks must be manually executed, managed and scheduled by the test or test kit. // Note: `TestUnmanagedMiner` is not thread safe and assumes linear access of it's methods type TestUnmanagedMiner struct { - t *testing.T - options nodeOpts + t *testing.T + options nodeOpts + mockProofs bool cacheDir string unsealedSectorDir string @@ -65,7 +67,7 @@ type WindowPostResp struct { Error error } -func NewTestUnmanagedMiner(t *testing.T, full *TestFullNode, actorAddr address.Address, opts ...NodeOpt) *TestUnmanagedMiner { +func NewTestUnmanagedMiner(t *testing.T, full *TestFullNode, actorAddr address.Address, mockProofs bool, opts ...NodeOpt) *TestUnmanagedMiner { require.NotNil(t, full, "full node required when instantiating miner") options := DefaultNodeOpts @@ -94,6 +96,7 @@ func NewTestUnmanagedMiner(t *testing.T, full *TestFullNode, actorAddr address.A tm := TestUnmanagedMiner{ t: t, options: options, + mockProofs: mockProofs, cacheDir: cacheDir, unsealedSectorDir: unsealedSectorDir, sealedSectorDir: sealedSectorDir, @@ -222,137 +225,6 @@ func (tm *TestUnmanagedMiner) makeAndSaveCCSector(_ context.Context, sectorNumbe tm.cacheDirPaths[sectorNumber] = cacheDirPath } -func (tm *TestUnmanagedMiner) OnboardSectorWithPiecesAndRealProofs(ctx context.Context, proofType abi.RegisteredSealProof) (abi.SectorNumber, chan WindowPostResp, - context.CancelFunc) { - req := require.New(tm.t) - sectorNumber := tm.currentSectorNum - tm.currentSectorNum++ - - // Step 1: Wait for the pre-commitseal randomness to be available (we can only draw seal randomness from tipsets that have already achieved finality) - preCommitSealRand := tm.waitPreCommitSealRandomness(ctx, sectorNumber) - - // Step 2: Build a sector with non 0 Pieces that we want to onboard - pieces := tm.mkAndSavePiecesToOnboard(ctx, sectorNumber, proofType) - - // Step 3: Generate a Pre-Commit for the CC sector -> this persists the proof on the `TestUnmanagedMiner` Miner State - tm.generatePreCommit(ctx, sectorNumber, preCommitSealRand, proofType, pieces) - - // Step 4 : Submit the Pre-Commit to the network - unsealedCid := tm.unsealedCids[sectorNumber] - r, err := tm.submitMessage(ctx, &miner14.PreCommitSectorBatchParams2{ - Sectors: []miner14.SectorPreCommitInfo{{ - Expiration: 2880 * 300, - SectorNumber: sectorNumber, - SealProof: TestSpt, - SealedCID: tm.sealedCids[sectorNumber], - SealRandEpoch: preCommitSealRand, - UnsealedCid: &unsealedCid, - }}, - }, 1, builtin.MethodsMiner.PreCommitSectorBatch2) - req.NoError(err) - req.True(r.Receipt.ExitCode.IsSuccess()) - - // Step 5: Generate a ProveCommit for the CC sector - waitSeedRandomness := tm.proveCommitWaitSeed(ctx, sectorNumber) - - proveCommit := tm.generateProveCommit(ctx, sectorNumber, proofType, waitSeedRandomness, pieces) - - // Step 6: Submit the ProveCommit to the network - tm.t.Log("Submitting ProveCommitSector ...") - - var manifest []miner14.PieceActivationManifest - for _, piece := range pieces { - manifest = append(manifest, miner14.PieceActivationManifest{ - CID: piece.PieceCID, - Size: piece.Size, - }) - } - - r, err = tm.submitMessage(ctx, &miner14.ProveCommitSectors3Params{ - SectorActivations: []miner14.SectorActivationManifest{{SectorNumber: sectorNumber, Pieces: manifest}}, - SectorProofs: [][]byte{proveCommit}, - RequireActivationSuccess: true, - }, 1, builtin.MethodsMiner.ProveCommitSectors3) - req.NoError(err) - req.True(r.Receipt.ExitCode.IsSuccess()) - - tm.proofType[sectorNumber] = proofType - - respCh := make(chan WindowPostResp, 1) - - wdCtx, cancelF := context.WithCancel(ctx) - go tm.wdPostLoop(wdCtx, sectorNumber, respCh, false, tm.sealedCids[sectorNumber], tm.sealedSectorPaths[sectorNumber], tm.cacheDirPaths[sectorNumber]) - - return sectorNumber, respCh, cancelF -} - -func (tm *TestUnmanagedMiner) OnboardSectorWithPiecesAndMockProofs(ctx context.Context, proofType abi.RegisteredSealProof) (abi.SectorNumber, chan WindowPostResp, - context.CancelFunc) { - req := require.New(tm.t) - sectorNumber := tm.currentSectorNum - tm.currentSectorNum++ - - // Step 1: Wait for the pre-commitseal randomness to be available (we can only draw seal randomness from tipsets that have already achieved finality) - preCommitSealRand := tm.waitPreCommitSealRandomness(ctx, sectorNumber) - - // Step 2: Build a sector with non 0 Pieces that we want to onboard - pieces := []abi.PieceInfo{{ - Size: abi.PaddedPieceSize(tm.options.sectorSize), - PieceCID: cid.MustParse("baga6ea4seaqjtovkwk4myyzj56eztkh5pzsk5upksan6f5outesy62bsvl4dsha"), - }} - - // Step 3: Generate a Pre-Commit for the CC sector -> this persists the proof on the `TestUnmanagedMiner` Miner State - tm.sealedCids[sectorNumber] = cid.MustParse("bagboea4b5abcatlxechwbp7kjpjguna6r6q7ejrhe6mdp3lf34pmswn27pkkiekz") - tm.unsealedCids[sectorNumber] = cid.MustParse("baga6ea4seaqjtovkwk4myyzj56eztkh5pzsk5upksan6f5outesy62bsvl4dsha") - - // Step 4 : Submit the Pre-Commit to the network - unsealedCid := tm.unsealedCids[sectorNumber] - r, err := tm.submitMessage(ctx, &miner14.PreCommitSectorBatchParams2{ - Sectors: []miner14.SectorPreCommitInfo{{ - Expiration: 2880 * 300, - SectorNumber: sectorNumber, - SealProof: TestSpt, - SealedCID: tm.sealedCids[sectorNumber], - SealRandEpoch: preCommitSealRand, - UnsealedCid: &unsealedCid, - }}, - }, 1, builtin.MethodsMiner.PreCommitSectorBatch2) - req.NoError(err) - req.True(r.Receipt.ExitCode.IsSuccess()) - - // Step 5: Generate a ProveCommit for the CC sector - _ = tm.proveCommitWaitSeed(ctx, sectorNumber) - sectorProof := []byte{0xde, 0xad, 0xbe, 0xef} - - // Step 6: Submit the ProveCommit to the network - tm.t.Log("Submitting ProveCommitSector ...") - - var manifest []miner14.PieceActivationManifest - for _, piece := range pieces { - manifest = append(manifest, miner14.PieceActivationManifest{ - CID: piece.PieceCID, - Size: piece.Size, - }) - } - - r, err = tm.submitMessage(ctx, &miner14.ProveCommitSectors3Params{ - SectorActivations: []miner14.SectorActivationManifest{{SectorNumber: sectorNumber, Pieces: manifest}}, - SectorProofs: [][]byte{sectorProof}, - RequireActivationSuccess: true, - }, 1, builtin.MethodsMiner.ProveCommitSectors3) - req.NoError(err) - req.True(r.Receipt.ExitCode.IsSuccess()) - - tm.proofType[sectorNumber] = proofType - - respCh := make(chan WindowPostResp, 1) - - wdCtx, cancelF := context.WithCancel(ctx) - go tm.wdPostLoop(wdCtx, sectorNumber, respCh, true, tm.sealedCids[sectorNumber], tm.sealedSectorPaths[sectorNumber], tm.cacheDirPaths[sectorNumber]) - - return sectorNumber, respCh, cancelF -} - func (tm *TestUnmanagedMiner) mkStagedFileWithPieces(pt abi.RegisteredSealProof) ([]abi.PieceInfo, string) { paddedPieceSize := abi.PaddedPieceSize(tm.options.sectorSize) unpaddedPieceSize := paddedPieceSize.Unpadded() @@ -393,35 +265,51 @@ func (tm *TestUnmanagedMiner) mkStagedFileWithPieces(pt abi.RegisteredSealProof) return publicPieces, unsealedSectorFile.Name() } -func (tm *TestUnmanagedMiner) SnapDealWithRealProofs(ctx context.Context, proofType abi.RegisteredSealProof, sectorNumber abi.SectorNumber) { - // generate sector key - pieces, unsealedPath := tm.mkStagedFileWithPieces(proofType) +func (tm *TestUnmanagedMiner) SnapDeal(ctx context.Context, proofType abi.RegisteredSealProof, sectorNumber abi.SectorNumber) []abi.PieceInfo { updateProofType := abi.SealProofInfos[proofType].UpdateProof + var pieces []abi.PieceInfo + var snapProof []byte + var newSealedCid cid.Cid - s, err := os.Stat(tm.sealedSectorPaths[sectorNumber]) - require.NoError(tm.t, err) + if !tm.mockProofs { + // generate sector key + var unsealedPath string + pieces, unsealedPath = tm.mkStagedFileWithPieces(proofType) - randomBytes := make([]byte, s.Size()) - _, err = io.ReadFull(rand.Reader, randomBytes) - require.NoError(tm.t, err) + s, err := os.Stat(tm.sealedSectorPaths[sectorNumber]) + require.NoError(tm.t, err) - updatePath := requireTempFile(tm.t, bytes.NewReader(randomBytes), uint64(s.Size())) - require.NoError(tm.t, updatePath.Close()) - updateDir := filepath.Join(tm.t.TempDir(), fmt.Sprintf("update-%d", sectorNumber)) - require.NoError(tm.t, os.MkdirAll(updateDir, 0700)) + randomBytes := make([]byte, s.Size()) + _, err = io.ReadFull(rand.Reader, randomBytes) + require.NoError(tm.t, err) - newSealed, newUnsealed, err := ffi.SectorUpdate.EncodeInto(updateProofType, updatePath.Name(), updateDir, - tm.sealedSectorPaths[sectorNumber], tm.cacheDirPaths[sectorNumber], unsealedPath, pieces) - require.NoError(tm.t, err) + updatePath := requireTempFile(tm.t, bytes.NewReader(randomBytes), uint64(s.Size())) + require.NoError(tm.t, updatePath.Close()) + updateDir := filepath.Join(tm.t.TempDir(), fmt.Sprintf("update-%d", sectorNumber)) + require.NoError(tm.t, os.MkdirAll(updateDir, 0700)) - vp, err := ffi.SectorUpdate.GenerateUpdateVanillaProofs(updateProofType, tm.sealedCids[sectorNumber], - newSealed, newUnsealed, updatePath.Name(), updateDir, tm.sealedSectorPaths[sectorNumber], - tm.cacheDirPaths[sectorNumber]) - require.NoError(tm.t, err) + var newUnsealedCid cid.Cid + newSealedCid, newUnsealedCid, err = ffi.SectorUpdate.EncodeInto(updateProofType, updatePath.Name(), updateDir, + tm.sealedSectorPaths[sectorNumber], tm.cacheDirPaths[sectorNumber], unsealedPath, pieces) + require.NoError(tm.t, err) + + vp, err := ffi.SectorUpdate.GenerateUpdateVanillaProofs(updateProofType, tm.sealedCids[sectorNumber], + newSealedCid, newUnsealedCid, updatePath.Name(), updateDir, tm.sealedSectorPaths[sectorNumber], + tm.cacheDirPaths[sectorNumber]) + require.NoError(tm.t, err) + + snapProof, err = ffi.SectorUpdate.GenerateUpdateProofWithVanilla(updateProofType, tm.sealedCids[sectorNumber], + newSealedCid, newUnsealedCid, vp) + require.NoError(tm.t, err) + } else { + pieces = []abi.PieceInfo{{ + Size: abi.PaddedPieceSize(tm.options.sectorSize), + PieceCID: cid.MustParse("baga6ea4seaqlhznlutptgfwhffupyer6txswamerq5fc2jlwf2lys2mm5jtiaeq"), + }} + snapProof = []byte{0xde, 0xad, 0xbe, 0xef} + newSealedCid = cid.MustParse("bagboea4b5abcatlxechwbp7kjpjguna6r6q7ejrhe6mdp3lf34pmswn27pkkieka") + } - snapProof, err := ffi.SectorUpdate.GenerateUpdateProofWithVanilla(updateProofType, tm.sealedCids[sectorNumber], - newSealed, newUnsealed, vp) - require.NoError(tm.t, err) tm.waitForMutableDeadline(ctx, sectorNumber) // submit proof @@ -445,7 +333,7 @@ func (tm *TestUnmanagedMiner) SnapDealWithRealProofs(ctx context.Context, proofT Sector: sectorNumber, Deadline: sl.Deadline, Partition: sl.Partition, - NewSealedCID: newSealed, + NewSealedCID: newSealedCid, Pieces: manifest, }, }, @@ -454,9 +342,11 @@ func (tm *TestUnmanagedMiner) SnapDealWithRealProofs(ctx context.Context, proofT RequireActivationSuccess: true, RequireNotificationSuccess: false, } - r, err := tm.submitMessage(ctx, params, 1, builtin.MethodsMiner.ProveReplicaUpdates3) + r, err := tm.SubmitMessage(ctx, params, 1, builtin.MethodsMiner.ProveReplicaUpdates3) require.NoError(tm.t, err) require.True(tm.t, r.Receipt.ExitCode.IsSuccess()) + + return pieces } func (tm *TestUnmanagedMiner) waitForMutableDeadline(ctx context.Context, sectorNum abi.SectorNumber) { @@ -489,112 +379,246 @@ func (tm *TestUnmanagedMiner) waitForMutableDeadline(ctx context.Context, sector } } -func (tm *TestUnmanagedMiner) OnboardCCSectorWithMockProofs(ctx context.Context, proofType abi.RegisteredSealProof) (abi.SectorNumber, chan WindowPostResp, - context.CancelFunc) { - req := require.New(tm.t) +func (tm *TestUnmanagedMiner) NextSectorNumber() abi.SectorNumber { sectorNumber := tm.currentSectorNum tm.currentSectorNum++ + return sectorNumber +} - // Step 1: Wait for the pre-commitseal randomness to be available (we can only draw seal randomness from tipsets that have already achieved finality) - preCommitSealRand := tm.waitPreCommitSealRandomness(ctx, sectorNumber) - - tm.sealedCids[sectorNumber] = cid.MustParse("bagboea4b5abcatlxechwbp7kjpjguna6r6q7ejrhe6mdp3lf34pmswn27pkkiekz") - - // Step 4 : Submit the Pre-Commit to the network - r, err := tm.submitMessage(ctx, &miner14.PreCommitSectorBatchParams2{ - Sectors: []miner14.SectorPreCommitInfo{{ - Expiration: 2880 * 300, - SectorNumber: sectorNumber, - SealProof: TestSpt, - SealedCID: tm.sealedCids[sectorNumber], - SealRandEpoch: preCommitSealRand, - }}, - }, 1, builtin.MethodsMiner.PreCommitSectorBatch2) - req.NoError(err) - req.True(r.Receipt.ExitCode.IsSuccess()) +func (tm *TestUnmanagedMiner) PrepareSectorForProveCommit( + ctx context.Context, + proofType abi.RegisteredSealProof, + sectorNumber abi.SectorNumber, + pieces []abi.PieceInfo, +) (seedEpoch abi.ChainEpoch, proveCommit []byte) { - // Step 5: Generate a ProveCommit for the CC sector - _ = tm.proveCommitWaitSeed(ctx, sectorNumber) - sectorProof := []byte{0xde, 0xad, 0xbe, 0xef} + req := require.New(tm.t) - // Step 6: Submit the ProveCommit to the network - tm.t.Log("Submitting ProveCommitSector ...") + // Wait for the pre-commitseal randomness to be available (we can only draw seal randomness from tipsets that have already achieved finality) + preCommitSealRandEpoch := tm.waitPreCommitSealRandomness(ctx, sectorNumber, proofType) - r, err = tm.submitMessage(ctx, &miner14.ProveCommitSectors3Params{ - SectorActivations: []miner14.SectorActivationManifest{{SectorNumber: sectorNumber}}, - SectorProofs: [][]byte{sectorProof}, - RequireActivationSuccess: true, - }, 0, builtin.MethodsMiner.ProveCommitSectors3) - req.NoError(err) - req.True(r.Receipt.ExitCode.IsSuccess()) + // Generate a Pre-Commit for the CC sector -> this persists the proof on the `TestUnmanagedMiner` Miner State + tm.generatePreCommit(ctx, sectorNumber, preCommitSealRandEpoch, proofType, pieces) - tm.proofType[sectorNumber] = proofType + // --------------------Create pre-commit for the CC sector -> we'll just pre-commit `sector size` worth of 0s for this CC sector - respCh := make(chan WindowPostResp, 1) + if !proofType.IsNonInteractive() { + // Submit the Pre-Commit to the network + var uc *cid.Cid + if len(pieces) > 0 { + unsealedCid := tm.unsealedCids[sectorNumber] + uc = &unsealedCid + } + r, err := tm.SubmitMessage(ctx, &miner14.PreCommitSectorBatchParams2{ + Sectors: []miner14.SectorPreCommitInfo{{ + Expiration: 2880 * 300, + SectorNumber: sectorNumber, + SealProof: proofType, + SealedCID: tm.sealedCids[sectorNumber], + SealRandEpoch: preCommitSealRandEpoch, + UnsealedCid: uc, + }}, + }, 1, builtin.MethodsMiner.PreCommitSectorBatch2) + req.NoError(err) + req.True(r.Receipt.ExitCode.IsSuccess()) + } - wdCtx, cancelF := context.WithCancel(ctx) - go tm.wdPostLoop(wdCtx, sectorNumber, respCh, true, tm.sealedCids[sectorNumber], tm.sealedSectorPaths[sectorNumber], tm.cacheDirPaths[sectorNumber]) + // Generate a ProveCommit for the CC sector + var seedRandomness abi.InteractiveSealRandomness + seedEpoch, seedRandomness = tm.proveCommitWaitSeed(ctx, sectorNumber, proofType) - return sectorNumber, respCh, cancelF + proveCommit = []byte{0xde, 0xad, 0xbe, 0xef} // mock prove commit + if !tm.mockProofs { + proveCommit = tm.generateProveCommit(ctx, sectorNumber, proofType, seedRandomness, pieces) + } + + return seedEpoch, proveCommit } -func (tm *TestUnmanagedMiner) OnboardCCSectorWithRealProofs(ctx context.Context, proofType abi.RegisteredSealProof) (abi.SectorNumber, chan WindowPostResp, - context.CancelFunc) { +func (tm *TestUnmanagedMiner) SubmitProveCommit( + ctx context.Context, + proofType abi.RegisteredSealProof, + sectorNumber abi.SectorNumber, + seedEpoch abi.ChainEpoch, + proveCommit []byte, + pieceManifest []miner14.PieceActivationManifest, +) { + req := require.New(tm.t) - sectorNumber := tm.currentSectorNum - tm.currentSectorNum++ - // --------------------Create pre-commit for the CC sector -> we'll just pre-commit `sector size` worth of 0s for this CC sector + if proofType.IsNonInteractive() { + req.Nil(pieceManifest, "piece manifest should be nil for Non-interactive PoRep") + } - // Step 1: Wait for the pre-commitseal randomness to be available (we can only draw seal randomness from tipsets that have already achieved finality) - preCommitSealRand := tm.waitPreCommitSealRandomness(ctx, sectorNumber) - - // Step 2: Write empty bytes that we want to seal i.e. create our CC sector - tm.makeAndSaveCCSector(ctx, sectorNumber) - - // Step 3: Generate a Pre-Commit for the CC sector -> this persists the proof on the `TestUnmanagedMiner` Miner State - tm.generatePreCommit(ctx, sectorNumber, preCommitSealRand, proofType, []abi.PieceInfo{}) - - // Step 4 : Submit the Pre-Commit to the network - r, err := tm.submitMessage(ctx, &miner14.PreCommitSectorBatchParams2{ - Sectors: []miner14.SectorPreCommitInfo{{ - Expiration: 2880 * 300, - SectorNumber: sectorNumber, - SealProof: TestSpt, - SealedCID: tm.sealedCids[sectorNumber], - SealRandEpoch: preCommitSealRand, - }}, - }, 1, builtin.MethodsMiner.PreCommitSectorBatch2) - req.NoError(err) - req.True(r.Receipt.ExitCode.IsSuccess()) + // Step 6: Submit the ProveCommit to the network + if proofType.IsNonInteractive() { + tm.t.Log("Submitting ProveCommitSector ...") - // Step 5: Generate a ProveCommit for the CC sector - waitSeedRandomness := tm.proveCommitWaitSeed(ctx, sectorNumber) + var provingDeadline uint64 = 7 + if tm.IsImmutableDeadline(ctx, provingDeadline) { + // avoid immutable deadlines + provingDeadline = 5 + } - proveCommit := tm.generateProveCommit(ctx, sectorNumber, proofType, waitSeedRandomness, []abi.PieceInfo{}) + actorIdNum, err := address.IDFromAddress(tm.ActorAddr) + req.NoError(err) + actorId := abi.ActorID(actorIdNum) + + r, err := tm.SubmitMessage(ctx, &miner14.ProveCommitSectorsNIParams{ + Sectors: []miner14.SectorNIActivationInfo{{ + SealingNumber: sectorNumber, + SealerID: actorId, + SealedCID: tm.sealedCids[sectorNumber], + SectorNumber: sectorNumber, + SealRandEpoch: seedEpoch, + Expiration: 2880 * 300, + }}, + AggregateProof: proveCommit, + SealProofType: proofType, + AggregateProofType: abi.RegisteredAggregationProof_SnarkPackV2, + ProvingDeadline: provingDeadline, + RequireActivationSuccess: true, + }, 1, builtin.MethodsMiner.ProveCommitSectorsNI) + req.NoError(err) + req.True(r.Receipt.ExitCode.IsSuccess()) + + // NI-PoRep lets us determine the deadline, so we can check that it's set correctly + sp, err := tm.FullNode.StateSectorPartition(ctx, tm.ActorAddr, sectorNumber, r.TipSet) + req.NoError(err) + req.Equal(provingDeadline, sp.Deadline) + } else { + tm.t.Log("Submitting ProveCommitSector ...") + + r, err := tm.SubmitMessage(ctx, &miner14.ProveCommitSectors3Params{ + SectorActivations: []miner14.SectorActivationManifest{{SectorNumber: sectorNumber, Pieces: pieceManifest}}, + SectorProofs: [][]byte{proveCommit}, + RequireActivationSuccess: true, + }, 0, builtin.MethodsMiner.ProveCommitSectors3) + req.NoError(err) + req.True(r.Receipt.ExitCode.IsSuccess()) + } +} - // Step 6: Submit the ProveCommit to the network +func (tm *TestUnmanagedMiner) OnboardCCSector(ctx context.Context, proofType abi.RegisteredSealProof) (abi.SectorNumber, chan WindowPostResp, context.CancelFunc) { + sectorNumber := tm.NextSectorNumber() + + if !tm.mockProofs { + // Write empty bytes that we want to seal i.e. create our CC sector + tm.makeAndSaveCCSector(ctx, sectorNumber) + } + + seedEpoch, proveCommit := tm.PrepareSectorForProveCommit(ctx, proofType, sectorNumber, []abi.PieceInfo{}) + + tm.SubmitProveCommit(ctx, proofType, sectorNumber, seedEpoch, proveCommit, nil) + + tm.proofType[sectorNumber] = proofType + respCh, cancelFn := tm.wdPostLoop(ctx, sectorNumber, tm.sealedCids[sectorNumber], tm.sealedSectorPaths[sectorNumber], tm.cacheDirPaths[sectorNumber]) + + return sectorNumber, respCh, cancelFn +} + +func (tm *TestUnmanagedMiner) OnboardSectorWithPieces(ctx context.Context, proofType abi.RegisteredSealProof) (abi.SectorNumber, chan WindowPostResp, context.CancelFunc) { + sectorNumber := tm.NextSectorNumber() + + // Build a sector with non 0 Pieces that we want to onboard + var pieces []abi.PieceInfo + if !tm.mockProofs { + pieces = tm.mkAndSavePiecesToOnboard(ctx, sectorNumber, proofType) + } else { + pieces = []abi.PieceInfo{{ + Size: abi.PaddedPieceSize(tm.options.sectorSize), + PieceCID: cid.MustParse("baga6ea4seaqjtovkwk4myyzj56eztkh5pzsk5upksan6f5outesy62bsvl4dsha"), + }} + } + + _, proveCommit := tm.PrepareSectorForProveCommit(ctx, proofType, sectorNumber, pieces) + + // Submit the ProveCommit to the network tm.t.Log("Submitting ProveCommitSector ...") - r, err = tm.submitMessage(ctx, &miner14.ProveCommitSectors3Params{ - SectorActivations: []miner14.SectorActivationManifest{{SectorNumber: sectorNumber}}, - SectorProofs: [][]byte{proveCommit}, - RequireActivationSuccess: true, - }, 0, builtin.MethodsMiner.ProveCommitSectors3) - req.NoError(err) - req.True(r.Receipt.ExitCode.IsSuccess()) + var manifest []miner14.PieceActivationManifest + for _, piece := range pieces { + manifest = append(manifest, miner14.PieceActivationManifest{ + CID: piece.PieceCID, + Size: piece.Size, + }) + } + + tm.SubmitProveCommit(ctx, proofType, sectorNumber, 0, proveCommit, manifest) tm.proofType[sectorNumber] = proofType + respCh, cancelFn := tm.wdPostLoop(ctx, sectorNumber, tm.sealedCids[sectorNumber], tm.sealedSectorPaths[sectorNumber], tm.cacheDirPaths[sectorNumber]) - respCh := make(chan WindowPostResp, 1) + return sectorNumber, respCh, cancelFn +} - wdCtx, cancelF := context.WithCancel(ctx) - go tm.wdPostLoop(wdCtx, sectorNumber, respCh, false, tm.sealedCids[sectorNumber], tm.sealedSectorPaths[sectorNumber], tm.cacheDirPaths[sectorNumber]) +// calculateNextPostEpoch calculates the first epoch of the deadline proving window +// that is desired for the given sector for the specified miner. +// This function returns the current epoch and the calculated proving epoch. +func (tm *TestUnmanagedMiner) calculateNextPostEpoch( + ctx context.Context, + sectorNumber abi.SectorNumber, +) (abi.ChainEpoch, abi.ChainEpoch, error) { + // Retrieve the current blockchain head + head, err := tm.FullNode.ChainHead(ctx) + if err != nil { + return 0, 0, fmt.Errorf("failed to get chain head: %w", err) + } + + // Obtain the proving deadline information for the miner + di, err := tm.FullNode.StateMinerProvingDeadline(ctx, tm.ActorAddr, head.Key()) + if err != nil { + return 0, 0, fmt.Errorf("failed to get proving deadline: %w", err) + } + + tm.t.Logf("Miner %s: WindowPoST(%d): ProvingDeadline: %+v", tm.ActorAddr, sectorNumber, di) - return sectorNumber, respCh, cancelF + // Fetch the sector partition for the given sector number + sp, err := tm.FullNode.StateSectorPartition(ctx, tm.ActorAddr, sectorNumber, head.Key()) + if err != nil { + return 0, 0, fmt.Errorf("failed to get sector partition: %w", err) + } + + tm.t.Logf("Miner %s: WindowPoST(%d): SectorPartition: %+v", tm.ActorAddr, sectorNumber, sp) + + // Calculate the start of the period, adjusting if the current deadline has passed + periodStart := di.PeriodStart + // calculate current deadline index because it won't be reliable from state until the first + // challenge window cron tick after first sector onboarded + currentDeadlineIdx := uint64(math.Abs(float64((di.CurrentEpoch - di.PeriodStart) / di.WPoStChallengeWindow))) + if di.PeriodStart < di.CurrentEpoch && sp.Deadline <= currentDeadlineIdx { + // If the deadline has passed in the current proving period, calculate for the next period + // Note that di.Open may be > di.CurrentEpoch if the miner has just been enrolled in cron so + // their deadlines haven't started rolling yet + periodStart += di.WPoStProvingPeriod + } + + // Calculate the exact epoch when proving should occur + provingEpoch := periodStart + di.WPoStChallengeWindow*abi.ChainEpoch(sp.Deadline) + + tm.t.Logf("Miner %s: WindowPoST(%d): next ProvingEpoch: %d", tm.ActorAddr, sectorNumber, provingEpoch) + + return di.CurrentEpoch, provingEpoch, nil } -func (tm *TestUnmanagedMiner) wdPostLoop(ctx context.Context, sectorNumber abi.SectorNumber, respCh chan WindowPostResp, withMockProofs bool, sealedCid cid.Cid, sealedPath, cacheDir string) { +func (tm *TestUnmanagedMiner) wdPostLoop( + pctx context.Context, + sectorNumber abi.SectorNumber, + sealedCid cid.Cid, + sealedPath, + cacheDir string, +) (chan WindowPostResp, context.CancelFunc) { + + ctx, cancelFn := context.WithCancel(pctx) + respCh := make(chan WindowPostResp, 1) + + head, err := tm.FullNode.ChainHead(ctx) + require.NoError(tm.t, err) + + // wait one challenge window for cron to do its thing with deadlines, just to be sure so we get + // an accurate dline.Info whenever we ask for it + _ = tm.FullNode.WaitTillChain(ctx, HeightAtLeast(head.Height()+miner14.WPoStChallengeWindow+5)) + go func() { var firstPost bool @@ -628,6 +652,8 @@ func (tm *TestUnmanagedMiner) wdPostLoop(ctx context.Context, sectorNumber abi.S return } + nextPost += 5 // add some padding so we're properly into the window + if nextPost > currentEpoch { if _, err := tm.FullNode.WaitTillChainOrError(ctx, HeightAtLeast(nextPost)); err != nil { writeRespF(err) @@ -635,12 +661,17 @@ func (tm *TestUnmanagedMiner) wdPostLoop(ctx context.Context, sectorNumber abi.S } } - err = tm.submitWindowPost(ctx, sectorNumber, withMockProofs, sealedCid, sealedPath, cacheDir) + err = tm.submitWindowPost(ctx, sectorNumber, sealedCid, sealedPath, cacheDir) writeRespF(err) // send an error, or first post, or nothing if no error and this isn't the first post + if err != nil { + return + } postCount++ tm.t.Logf("Sector %d: WindowPoSt #%d submitted", sectorNumber, postCount) } }() + + return respCh, cancelFn } func (tm *TestUnmanagedMiner) SubmitPostDispute(ctx context.Context, sectorNumber abi.SectorNumber) error { @@ -668,14 +699,14 @@ func (tm *TestUnmanagedMiner) SubmitPostDispute(ctx context.Context, sectorNumbe tm.t.Logf("Miner %s: Sector %d - Disputing WindowedPoSt to confirm validity at epoch %d", tm.ActorAddr, sectorNumber, disputeEpoch) - _, err = tm.submitMessage(ctx, &miner14.DisputeWindowedPoStParams{ + _, err = tm.SubmitMessage(ctx, &miner14.DisputeWindowedPoStParams{ Deadline: sp.Deadline, PoStIndex: 0, }, 1, builtin.MethodsMiner.DisputeWindowedPoSt) return err } -func (tm *TestUnmanagedMiner) submitWindowPost(ctx context.Context, sectorNumber abi.SectorNumber, withMockProofs bool, sealedCid cid.Cid, sealedPath, cacheDir string) error { +func (tm *TestUnmanagedMiner) submitWindowPost(ctx context.Context, sectorNumber abi.SectorNumber, sealedCid cid.Cid, sealedPath, cacheDir string) error { tm.t.Logf("Miner(%s): WindowPoST(%d): Running WindowPoSt ...\n", tm.ActorAddr, sectorNumber) head, err := tm.FullNode.ChainHead(ctx) @@ -698,7 +729,7 @@ func (tm *TestUnmanagedMiner) submitWindowPost(ctx context.Context, sectorNumber } var proofBytes []byte - if withMockProofs { + if tm.mockProofs { proofBytes = []byte{0xde, 0xad, 0xbe, 0xef} } else { proofBytes, err = tm.generateWindowPost(ctx, sectorNumber, sealedCid, sealedPath, cacheDir) @@ -721,7 +752,7 @@ func (tm *TestUnmanagedMiner) submitWindowPost(ctx context.Context, sectorNumber return fmt.Errorf("Miner(%s): failed to get miner info for sector %d: %w", tm.ActorAddr, sectorNumber, err) } - r, err := tm.submitMessage(ctx, &miner14.SubmitWindowedPoStParams{ + r, err := tm.SubmitMessage(ctx, &miner14.SubmitWindowedPoStParams{ ChainCommitEpoch: chainRandomnessEpoch, ChainCommitRand: chainRandomness, Deadline: sp.Deadline, @@ -824,12 +855,16 @@ func (tm *TestUnmanagedMiner) generateWindowPost( return proofBytes, nil } -func (tm *TestUnmanagedMiner) waitPreCommitSealRandomness(ctx context.Context, sectorNumber abi.SectorNumber) abi.ChainEpoch { +func (tm *TestUnmanagedMiner) waitPreCommitSealRandomness(ctx context.Context, sectorNumber abi.SectorNumber, proofType abi.RegisteredSealProof) abi.ChainEpoch { // We want to draw seal randomness from a tipset that has already achieved finality as PreCommits are expensive to re-generate. // Check if we already have an epoch that is already final and wait for such an epoch if we don't have one. head, err := tm.FullNode.ChainHead(ctx) require.NoError(tm.t, err) + if proofType.IsNonInteractive() { + return head.Height() - 1 // no need to wait + } + var sealRandEpoch abi.ChainEpoch if head.Height() > policy.SealRandomnessLookback { sealRandEpoch = head.Height() - policy.SealRandomnessLookback @@ -845,50 +880,6 @@ func (tm *TestUnmanagedMiner) waitPreCommitSealRandomness(ctx context.Context, s return sealRandEpoch } -// calculateNextPostEpoch calculates the first epoch of the deadline proving window -// that is desired for the given sector for the specified miner. -// This function returns the current epoch and the calculated proving epoch. -func (tm *TestUnmanagedMiner) calculateNextPostEpoch( - ctx context.Context, - sectorNumber abi.SectorNumber, -) (abi.ChainEpoch, abi.ChainEpoch, error) { - // Retrieve the current blockchain head - head, err := tm.FullNode.ChainHead(ctx) - if err != nil { - return 0, 0, fmt.Errorf("failed to get chain head: %w", err) - } - - // Fetch the sector partition for the given sector number - sp, err := tm.FullNode.StateSectorPartition(ctx, tm.ActorAddr, sectorNumber, head.Key()) - if err != nil { - return 0, 0, fmt.Errorf("failed to get sector partition: %w", err) - } - - tm.t.Logf("Miner %s: WindowPoST(%d): SectorPartition: %+v", tm.ActorAddr, sectorNumber, sp) - - // Obtain the proving deadline information for the miner - di, err := tm.FullNode.StateMinerProvingDeadline(ctx, tm.ActorAddr, head.Key()) - if err != nil { - return 0, 0, fmt.Errorf("failed to get proving deadline: %w", err) - } - - tm.t.Logf("Miner %s: WindowPoST(%d): ProvingDeadline: %+v", tm.ActorAddr, sectorNumber, di) - - // Calculate the start of the period, adjusting if the current deadline has passed - periodStart := di.PeriodStart - if di.PeriodStart < di.CurrentEpoch && sp.Deadline <= di.Index { - // If the deadline has passed in the current proving period, calculate for the next period - periodStart += di.WPoStProvingPeriod - } - - // Calculate the exact epoch when proving should occur - provingEpoch := periodStart + (di.WPoStProvingPeriod/abi.ChainEpoch(di.WPoStPeriodDeadlines))*abi.ChainEpoch(sp.Deadline) - - tm.t.Logf("Miner %s: WindowPoST(%d): next ProvingEpoch: %d", tm.ActorAddr, sectorNumber, provingEpoch) - - return di.CurrentEpoch, provingEpoch, nil -} - func (tm *TestUnmanagedMiner) generatePreCommit( ctx context.Context, sectorNumber abi.SectorNumber, @@ -896,6 +887,15 @@ func (tm *TestUnmanagedMiner) generatePreCommit( proofType abi.RegisteredSealProof, pieceInfo []abi.PieceInfo, ) { + + if tm.mockProofs { + tm.sealedCids[sectorNumber] = cid.MustParse("bagboea4b5abcatlxechwbp7kjpjguna6r6q7ejrhe6mdp3lf34pmswn27pkkiekz") + if len(pieceInfo) > 0 { + tm.unsealedCids[sectorNumber] = cid.MustParse("baga6ea4seaqjtovkwk4myyzj56eztkh5pzsk5upksan6f5outesy62bsvl4dsha") + } + return + } + req := require.New(tm.t) tm.t.Logf("Miner %s: Generating proof type %d PreCommit for sector %d...", tm.ActorAddr, proofType, sectorNumber) @@ -945,41 +945,48 @@ func (tm *TestUnmanagedMiner) generatePreCommit( tm.unsealedCids[sectorNumber] = unsealedCid } -func (tm *TestUnmanagedMiner) proveCommitWaitSeed(ctx context.Context, sectorNumber abi.SectorNumber) abi.InteractiveSealRandomness { +func (tm *TestUnmanagedMiner) proveCommitWaitSeed(ctx context.Context, sectorNumber abi.SectorNumber, proofType abi.RegisteredSealProof) (abi.ChainEpoch, abi.InteractiveSealRandomness) { req := require.New(tm.t) head, err := tm.FullNode.ChainHead(ctx) req.NoError(err) - tm.t.Logf("Miner %s: Fetching pre-commit info for sector %d...", tm.ActorAddr, sectorNumber) - preCommitInfo, err := tm.FullNode.StateSectorPreCommitInfo(ctx, tm.ActorAddr, sectorNumber, head.Key()) - req.NoError(err) - seedRandomnessHeight := preCommitInfo.PreCommitEpoch + policy.GetPreCommitChallengeDelay() + var seedRandomnessHeight abi.ChainEpoch - tm.t.Logf("Miner %s: Waiting %d epochs for seed randomness at epoch %d (current epoch %d) for sector %d...", tm.ActorAddr, seedRandomnessHeight-head.Height(), seedRandomnessHeight, head.Height(), sectorNumber) - tm.FullNode.WaitTillChain(ctx, HeightAtLeast(seedRandomnessHeight+5)) + if proofType.IsNonInteractive() { + seedRandomnessHeight = head.Height() - 1 // no need to wait, it just can't be current epoch + } else { + tm.t.Logf("Miner %s: Fetching pre-commit info for sector %d...", tm.ActorAddr, sectorNumber) + preCommitInfo, err := tm.FullNode.StateSectorPreCommitInfo(ctx, tm.ActorAddr, sectorNumber, head.Key()) + req.NoError(err) + seedRandomnessHeight = preCommitInfo.PreCommitEpoch + policy.GetPreCommitChallengeDelay() + + tm.t.Logf("Miner %s: Waiting %d epochs for seed randomness at epoch %d (current epoch %d) for sector %d...", tm.ActorAddr, seedRandomnessHeight-head.Height(), seedRandomnessHeight, head.Height(), sectorNumber) + tm.FullNode.WaitTillChain(ctx, HeightAtLeast(seedRandomnessHeight+5)) + + head, err = tm.FullNode.ChainHead(ctx) + req.NoError(err) + } minerAddrBytes := new(bytes.Buffer) req.NoError(tm.ActorAddr.MarshalCBOR(minerAddrBytes)) - head, err = tm.FullNode.ChainHead(ctx) - req.NoError(err) - tm.t.Logf("Miner %s: Fetching seed randomness for sector %d...", tm.ActorAddr, sectorNumber) rand, err := tm.FullNode.StateGetRandomnessFromBeacon(ctx, crypto.DomainSeparationTag_InteractiveSealChallengeSeed, seedRandomnessHeight, minerAddrBytes.Bytes(), head.Key()) req.NoError(err) seedRandomness := abi.InteractiveSealRandomness(rand) tm.t.Logf("Miner %s: Obtained seed randomness for sector %d: %x", tm.ActorAddr, sectorNumber, seedRandomness) - return seedRandomness + return seedRandomnessHeight, seedRandomness } func (tm *TestUnmanagedMiner) generateProveCommit( - ctx context.Context, + _ context.Context, sectorNumber abi.SectorNumber, proofType abi.RegisteredSealProof, seedRandomness abi.InteractiveSealRandomness, pieces []abi.PieceInfo, ) []byte { + tm.t.Logf("Miner %s: Generating proof type %d Sector Proof for sector %d...", tm.ActorAddr, proofType, sectorNumber) req := require.New(tm.t) @@ -1005,20 +1012,43 @@ func (tm *TestUnmanagedMiner) generateProveCommit( tm.t.Logf("Miner %s: Running proof type %d SealCommitPhase2 for sector %d...", tm.ActorAddr, proofType, sectorNumber) - sectorProof, err := ffi.SealCommitPhase2(scp1, sectorNumber, actorId) - req.NoError(err) + var sectorProof []byte + + if proofType.IsNonInteractive() { + circuitProofs, err := ffi.SealCommitPhase2CircuitProofs(scp1, sectorNumber) + req.NoError(err) + asvpai := proof.AggregateSealVerifyProofAndInfos{ + Miner: actorId, + SealProof: proofType, + AggregateProof: abi.RegisteredAggregationProof_SnarkPackV2, + Infos: []proof.AggregateSealVerifyInfo{{ + Number: sectorNumber, + Randomness: tm.sealTickets[sectorNumber], + InteractiveRandomness: make([]byte, 32), + SealedCID: tm.sealedCids[sectorNumber], + UnsealedCID: tm.unsealedCids[sectorNumber], + }}, + } + tm.t.Logf("Miner %s: Aggregating circuit proofs for sector %d: %+v", tm.ActorAddr, sectorNumber, asvpai) + sectorProof, err = ffi.AggregateSealProofs(asvpai, [][]byte{circuitProofs}) + req.NoError(err) + } else { + sectorProof, err = ffi.SealCommitPhase2(scp1, sectorNumber, actorId) + req.NoError(err) + } tm.t.Logf("Miner %s: Got proof type %d sector proof of length %d for sector %d", tm.ActorAddr, proofType, len(sectorProof), sectorNumber) return sectorProof } -func (tm *TestUnmanagedMiner) submitMessage( +func (tm *TestUnmanagedMiner) SubmitMessage( ctx context.Context, params cbg.CBORMarshaler, value uint64, method abi.MethodNum, ) (*api.MsgLookup, error) { + enc, aerr := actors.SerializeParams(params) if aerr != nil { return nil, aerr @@ -1070,3 +1100,54 @@ func requireTempFile(t *testing.T, fileContentsReader io.Reader, size uint64) *o return tempFile } + +func (tm *TestUnmanagedMiner) WaitTillActivatedAndAssertPower( + ctx context.Context, + respCh chan WindowPostResp, + sector abi.SectorNumber, +) { + + // wait till sector is activated + select { + case resp := <-respCh: + require.NoError(tm.t, resp.Error) + require.True(tm.t, resp.Posted) + case <-ctx.Done(): + tm.t.Fatal("timed out waiting for sector activation") + } + + // Fetch on-chain sector properties + head, err := tm.FullNode.ChainHead(ctx) + require.NoError(tm.t, err) + + soi, err := tm.FullNode.StateSectorGetInfo(ctx, tm.ActorAddr, sector, head.Key()) + require.NoError(tm.t, err) + tm.t.Logf("Miner %s SectorOnChainInfo %d: %+v", tm.ActorAddr.String(), sector, soi) + + _ = tm.FullNode.WaitTillChain(ctx, HeightAtLeast(head.Height()+5)) + + tm.t.Log("Checking power after PoSt ...") + + // Miner B should now have power + tm.AssertPower(ctx, uint64(tm.options.sectorSize), uint64(tm.options.sectorSize)) + + if !tm.mockProofs { + // WindowPost Dispute should fail + tm.AssertDisputeFails(ctx, sector) + } // else it would pass, which we don't want +} + +func (tm *TestUnmanagedMiner) AssertDisputeFails(ctx context.Context, sector abi.SectorNumber) { + err := tm.SubmitPostDispute(ctx, sector) + require.Error(tm.t, err) + require.Contains(tm.t, err.Error(), "failed to dispute valid post") + require.Contains(tm.t, err.Error(), "(RetCode=16)") +} + +func (tm *TestUnmanagedMiner) IsImmutableDeadline(ctx context.Context, deadlineIndex uint64) bool { + di, err := tm.FullNode.StateMinerProvingDeadline(ctx, tm.ActorAddr, types.EmptyTSK) + require.NoError(tm.t, err) + // don't rely on di.Index because if we haven't enrolled in cron it won't be ticking + currentDeadlineIdx := uint64(math.Abs(float64((di.CurrentEpoch - di.PeriodStart) / di.WPoStChallengeWindow))) + return currentDeadlineIdx == deadlineIndex || currentDeadlineIdx == deadlineIndex-1 +} diff --git a/itests/kit/run.go b/itests/kit/run.go index 713efa3b831..6903258cb70 100644 --- a/itests/kit/run.go +++ b/itests/kit/run.go @@ -9,6 +9,12 @@ import ( // and set to value "1" to enable running expensive tests outside of CI. const EnvRunExpensiveTests = "LOTUS_RUN_EXPENSIVE_TESTS" +// EnvRunVeryExpensiveTests is the environment variable that needs to be present +// and set to value "1" to enable running very expensive tests outside of CI. +// A "very expensive" test is one that is expected to take too long to run in +// a standard CI setup, and should be skipped unless explicitly enabled. +const EnvRunVeryExpensiveTests = "LOTUS_RUN_VERY_EXPENSIVE_TESTS" + // Expensive marks a test as expensive, skipping it immediately if not running an func Expensive(t *testing.T) { switch { @@ -18,3 +24,10 @@ func Expensive(t *testing.T) { t.Skipf("skipping expensive test outside of CI; enable by setting env var %s=1", EnvRunExpensiveTests) } } + +// Expensive marks a test as expensive, skipping it immediately if not running an +func VeryExpensive(t *testing.T) { + if os.Getenv(EnvRunVeryExpensiveTests) != "1" { + t.Skipf("skipping VERY expensive test outside of CI; enable by setting env var %s=1", EnvRunVeryExpensiveTests) + } +} diff --git a/itests/manual_onboarding_test.go b/itests/manual_onboarding_test.go index f10c8b7c171..4e976b030b3 100644 --- a/itests/manual_onboarding_test.go +++ b/itests/manual_onboarding_test.go @@ -8,24 +8,28 @@ import ( "github.com/stretchr/testify/require" "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/lotus/build" + "github.com/filecoin-project/lotus/chain/actors/builtin/miner" "github.com/filecoin-project/lotus/itests/kit" ) -const defaultSectorSize = abi.SectorSize(2 << 10) // 2KiB - // Manually onboard CC sectors, bypassing lotus-miner onboarding pathways func TestManualSectorOnboarding(t *testing.T) { req := require.New(t) + const defaultSectorSize = abi.SectorSize(2 << 10) // 2KiB + sealProofType, err := miner.SealProofTypeFromSectorSize(defaultSectorSize, network.Version23, miner.SealProofVariant_Standard) + req.NoError(err) + for _, withMockProofs := range []bool{true, false} { testName := "WithRealProofs" if withMockProofs { testName = "WithMockProofs" } t.Run(testName, func(t *testing.T) { - if testName == "WithRealProofs" { + if !withMockProofs { kit.Expensive(t) } kit.QuietMiningLogs() @@ -41,11 +45,7 @@ func TestManualSectorOnboarding(t *testing.T) { // Setup and begin mining with a single miner (A) // Miner A will only be a genesis Miner with power allocated in the genesis block and will not onboard any sectors from here on - kitOpts := []kit.EnsembleOpt{} - if withMockProofs { - kitOpts = append(kitOpts, kit.MockProofs()) - } - ens := kit.NewEnsemble(t, kitOpts...). + ens := kit.NewEnsemble(t, kit.MockProofs(withMockProofs)). FullNode(&client, kit.SectorSize(defaultSectorSize)). // preseal more than the default number of sectors to ensure that the genesis miner has power // because our unmanaged miners won't produce blocks so we may get null rounds @@ -89,11 +89,7 @@ func TestManualSectorOnboarding(t *testing.T) { var bRespCh chan kit.WindowPostResp var bWdPostCancelF context.CancelFunc - if withMockProofs { - bSectorNum, bRespCh, bWdPostCancelF = minerB.OnboardCCSectorWithMockProofs(ctx, kit.TestSpt) - } else { - bSectorNum, bRespCh, bWdPostCancelF = minerB.OnboardCCSectorWithRealProofs(ctx, kit.TestSpt) - } + bSectorNum, bRespCh, bWdPostCancelF = minerB.OnboardCCSector(ctx, sealProofType) // Miner B should still not have power as power can only be gained after sector is activated i.e. the first WindowPost is submitted for it minerB.AssertNoPower(ctx) // Ensure that the block miner checks for and waits for posts during the appropriate proving window from our new miner with a sector @@ -103,72 +99,20 @@ func TestManualSectorOnboarding(t *testing.T) { var cSectorNum abi.SectorNumber var cRespCh chan kit.WindowPostResp - if withMockProofs { - cSectorNum, cRespCh, _ = minerC.OnboardSectorWithPiecesAndMockProofs(ctx, kit.TestSpt) - } else { - cSectorNum, cRespCh, _ = minerC.OnboardSectorWithPiecesAndRealProofs(ctx, kit.TestSpt) - } + cSectorNum, cRespCh, _ = minerC.OnboardSectorWithPieces(ctx, kit.TestSpt) // Miner C should still not have power as power can only be gained after sector is activated i.e. the first WindowPost is submitted for it minerC.AssertNoPower(ctx) // Ensure that the block miner checks for and waits for posts during the appropriate proving window from our new miner with a sector blockMiner.WatchMinerForPost(minerC.ActorAddr) // Wait till both miners' sectors have had their first post and are activated and check that this is reflected in miner power - waitTillActivatedAndAssertPower(ctx, t, minerB, bRespCh, bSectorNum, uint64(defaultSectorSize), withMockProofs) - waitTillActivatedAndAssertPower(ctx, t, minerC, cRespCh, cSectorNum, uint64(defaultSectorSize), withMockProofs) + minerB.WaitTillActivatedAndAssertPower(ctx, bRespCh, bSectorNum) + minerC.WaitTillActivatedAndAssertPower(ctx, cRespCh, cSectorNum) // Miner B has activated the CC sector -> upgrade it with snapdeals - // Note: We can't activate a sector with mock proofs as the WdPost is successfully disputed and so no point - // in snapping it as snapping is only for activated sectors - if !withMockProofs { - minerB.SnapDealWithRealProofs(ctx, kit.TestSpt, bSectorNum) - // cancel the WdPost for the CC sector as the corresponding CommR is no longer valid - bWdPostCancelF() - } + _ = minerB.SnapDeal(ctx, kit.TestSpt, bSectorNum) + // cancel the WdPost for the CC sector as the corresponding CommR is no longer valid + bWdPostCancelF() }) } } - -func waitTillActivatedAndAssertPower(ctx context.Context, t *testing.T, miner *kit.TestUnmanagedMiner, respCh chan kit.WindowPostResp, sector abi.SectorNumber, - sectorSize uint64, withMockProofs bool) { - req := require.New(t) - // wait till sector is activated - select { - case resp := <-respCh: - req.NoError(resp.Error) - req.True(resp.Posted) - case <-ctx.Done(): - t.Fatal("timed out waiting for sector activation") - } - - // Fetch on-chain sector properties - head, err := miner.FullNode.ChainHead(ctx) - req.NoError(err) - - soi, err := miner.FullNode.StateSectorGetInfo(ctx, miner.ActorAddr, sector, head.Key()) - req.NoError(err) - t.Logf("Miner %s SectorOnChainInfo %d: %+v", miner.ActorAddr.String(), sector, soi) - - _ = miner.FullNode.WaitTillChain(ctx, kit.HeightAtLeast(head.Height()+5)) - - t.Log("Checking power after PoSt ...") - - // Miner B should now have power - miner.AssertPower(ctx, sectorSize, sectorSize) - - if withMockProofs { - // WindowPost Dispute should succeed as we are using mock proofs - err := miner.SubmitPostDispute(ctx, sector) - require.NoError(t, err) - } else { - // WindowPost Dispute should fail - assertDisputeFails(ctx, t, miner, sector) - } -} - -func assertDisputeFails(ctx context.Context, t *testing.T, miner *kit.TestUnmanagedMiner, sector abi.SectorNumber) { - err := miner.SubmitPostDispute(ctx, sector) - require.Error(t, err) - require.Contains(t, err.Error(), "failed to dispute valid post") - require.Contains(t, err.Error(), "(RetCode=16)") -} diff --git a/itests/migration_test.go b/itests/migration_test.go index e19aaf45f74..ddf997212d7 100644 --- a/itests/migration_test.go +++ b/itests/migration_test.go @@ -7,6 +7,7 @@ import ( "testing" "time" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/filecoin-project/go-address" @@ -17,6 +18,7 @@ import ( miner11 "github.com/filecoin-project/go-state-types/builtin/v11/miner" power11 "github.com/filecoin-project/go-state-types/builtin/v11/power" adt11 "github.com/filecoin-project/go-state-types/builtin/v11/util/adt" + account "github.com/filecoin-project/go-state-types/builtin/v14/account" markettypes "github.com/filecoin-project/go-state-types/builtin/v9/market" migration "github.com/filecoin-project/go-state-types/builtin/v9/migration/test" miner9 "github.com/filecoin-project/go-state-types/builtin/v9/miner" @@ -302,7 +304,7 @@ func TestMigrationNV17(t *testing.T) { minerInfo, err := testClient.StateMinerInfo(ctx, testMiner.ActorAddr, types.EmptyTSK) require.NoError(t, err) - spt, err := miner.SealProofTypeFromSectorSize(minerInfo.SectorSize, network.Version17, false) + spt, err := miner.SealProofTypeFromSectorSize(minerInfo.SectorSize, network.Version17, miner.SealProofVariant_Standard) require.NoError(t, err) preCommitParams := miner9.PreCommitSectorParams{ @@ -594,7 +596,7 @@ func TestMigrationNV18(t *testing.T) { // check all actor's Address fields require.NoError(t, newStateTree.ForEach(func(address address.Address, actor *types.Actor) error { if address != ethZeroAddrID { - require.Nil(t, actor.Address) + require.Nil(t, actor.DelegatedAddress) } return nil })) @@ -828,3 +830,70 @@ func TestMigrationNV21(t *testing.T) { //todo @zen Direct data onboarding tests } + +func TestMigrationNV23(t *testing.T) { + kit.QuietMiningLogs() + f090Addr, err := address.NewIDAddress(90) + require.NoError(t, err) + nv23epoch := abi.ChainEpoch(100) + testClient, _, ens := kit.EnsembleMinimal(t, kit.MockProofs(), + kit.UpgradeSchedule(stmgr.Upgrade{ + Network: network.Version22, + Height: -1, + }, stmgr.Upgrade{ + Network: network.Version23, + Height: nv23epoch, + Migration: filcns.UpgradeActorsV14, + }, + )) + + ens.InterconnectAll().BeginMining(10 * time.Millisecond) + + clientApi := testClient.FullNode.(*impl.FullNodeAPI) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + testClient.WaitTillChain(ctx, kit.HeightAtLeast(nv23epoch+5)) + + bs := blockstore.NewAPIBlockstore(testClient) + ctxStore := gstStore.WrapBlockStore(ctx, bs) + + preMigrationTs, err := clientApi.ChainGetTipSetByHeight(ctx, nv23epoch-1, types.EmptyTSK) + require.NoError(t, err) + + root := preMigrationTs.Blocks()[0].ParentStateRoot + preStateTree, err := state.LoadStateTree(ctxStore, root) + require.NoError(t, err) + require.Equal(t, types.StateTreeVersion5, preStateTree.Version()) + + // Check f090 actor before migration + msigCodeNv22, ok := actors.GetActorCodeID(actorstypes.Version13, manifest.MultisigKey) + assert.True(t, ok) + f090ActorPre, err := preStateTree.GetActor(f090Addr) + require.NoError(t, err) + require.True(t, f090ActorPre.Code.Equals(msigCodeNv22)) + + // Get state after the migration + postMigrationTs, err := clientApi.ChainHead(ctx) + require.NoError(t, err) + postStateTree, err := state.LoadStateTree(ctxStore, postMigrationTs.Blocks()[0].ParentStateRoot) + require.NoError(t, err) + + // Check the new system actor + systemAct, err := postStateTree.GetActor(builtin.SystemActorAddr) + require.NoError(t, err) + systemCode, ok := actors.GetActorCodeID(actorstypes.Version14, manifest.SystemKey) + require.True(t, ok) + require.Equal(t, systemCode, systemAct.Code) + + // Check f090 actor after migration + f090ActorPost, err := postStateTree.GetActor(f090Addr) + require.NoError(t, err) + accountNV23, ok := actors.GetActorCodeID(actorstypes.Version14, manifest.AccountKey) + assert.True(t, ok) + require.True(t, f090ActorPost.Code.Equals(accountNV23)) + f090StatePost, err := clientApi.StateReadState(ctx, f090Addr, types.EmptyTSK) + require.NoError(t, err) + state := f090StatePost.State.(*account.State) + require.Equal(t, state.Address, f090Addr) +} diff --git a/itests/niporep_manual_test.go b/itests/niporep_manual_test.go new file mode 100644 index 00000000000..76ea1f9696b --- /dev/null +++ b/itests/niporep_manual_test.go @@ -0,0 +1,260 @@ +package itests + +import ( + "context" + "fmt" + "math" + "testing" + "time" + + "github.com/ipfs/go-cid" + "github.com/ipld/go-ipld-prime" + "github.com/ipld/go-ipld-prime/codec/dagcbor" + "github.com/ipld/go-ipld-prime/datamodel" + cidlink "github.com/ipld/go-ipld-prime/linking/cid" + "github.com/ipld/go-ipld-prime/node/basicnode" + "github.com/multiformats/go-multicodec" + "github.com/stretchr/testify/require" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/builtin" + miner14 "github.com/filecoin-project/go-state-types/builtin/v14/miner" + "github.com/filecoin-project/go-state-types/network" + + "github.com/filecoin-project/lotus/build" + "github.com/filecoin-project/lotus/chain/actors/builtin/miner" + "github.com/filecoin-project/lotus/chain/types" + "github.com/filecoin-project/lotus/itests/kit" + "github.com/filecoin-project/lotus/lib/must" +) + +func TestManualNISectorOnboarding(t *testing.T) { + req := require.New(t) + + const defaultSectorSize = abi.SectorSize(2 << 10) // 2KiB + sealProofType, err := miner.SealProofTypeFromSectorSize(defaultSectorSize, network.Version23, miner.SealProofVariant_NonInteractive) + req.NoError(err) + + for _, withMockProofs := range []bool{true, false} { + testName := "WithRealProofs" + if withMockProofs { + testName = "WithMockProofs" + } + t.Run(testName, func(t *testing.T) { + if !withMockProofs { + kit.VeryExpensive(t) + } + kit.QuietMiningLogs() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + var ( + // need to pick a balance value so that the test is not racy on CI by running through it's WindowPostDeadlines too fast + blocktime = 2 * time.Millisecond + client kit.TestFullNode + minerA kit.TestMiner // A is a standard genesis miner + ) + + // Setup and begin mining with a single miner (A) + // Miner A will only be a genesis Miner with power allocated in the genesis block and will not onboard any sectors from here on + ens := kit.NewEnsemble(t, kit.MockProofs(withMockProofs)). + FullNode(&client, kit.SectorSize(defaultSectorSize)). + // preseal more than the default number of sectors to ensure that the genesis miner has power + // because our unmanaged miners won't produce blocks so we may get null rounds + Miner(&minerA, &client, kit.PresealSectors(5), kit.SectorSize(defaultSectorSize), kit.WithAllSubsystems()). + Start(). + InterconnectAll() + blockMiners := ens.BeginMiningMustPost(blocktime) + req.Len(blockMiners, 1) + blockMiner := blockMiners[0] + + // Instantiate MinerB to manually handle sector onboarding and power acquisition through sector activation. + // Unlike other miners managed by the Lotus Miner storage infrastructure, MinerB operates independently, + // performing all related tasks manually. Managed by the TestKit, MinerB has the capability to utilize actual proofs + // for the processes of sector onboarding and activation. + nodeOpts := []kit.NodeOpt{kit.SectorSize(defaultSectorSize), kit.OwnerAddr(client.DefaultKey)} + minerB, ens := ens.UnmanagedMiner(&client, nodeOpts...) + + ens.Start() + + build.Clock.Sleep(time.Second) + + t.Log("Checking initial power ...") + + // Miner A should have power as it has already onboarded sectors in the genesis block + head, err := client.ChainHead(ctx) + req.NoError(err) + p, err := client.StateMinerPower(ctx, minerA.ActorAddr, head.Key()) + req.NoError(err) + t.Logf("MinerA RBP: %v, QaP: %v", p.MinerPower.QualityAdjPower.String(), p.MinerPower.RawBytePower.String()) + + // Miner B should have no power as it has yet to onboard and activate any sectors + minerB.AssertNoPower(ctx) + + // Verify that ProveCommitSectorsNI rejects messages with invalid parameters + verifyProveCommitSectorsNIErrorConditions(ctx, t, minerB, sealProofType) + + // ---- Miner B onboards a CC sector + var bSectorNum abi.SectorNumber + var bRespCh chan kit.WindowPostResp + var bWdPostCancelF context.CancelFunc + + // Onboard a CC sector with Miner B using NI-PoRep + bSectorNum, bRespCh, bWdPostCancelF = minerB.OnboardCCSector(ctx, sealProofType) + // Miner B should still not have power as power can only be gained after sector is activated i.e. the first WindowPost is submitted for it + minerB.AssertNoPower(ctx) + + // Check that the sector-activated event was emitted + { + expectedEntries := []types.EventEntry{ + {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "$type", Value: must.One(ipld.Encode(basicnode.NewString("sector-activated"), dagcbor.Encode))}, + {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "sector", Value: must.One(ipld.Encode(basicnode.NewInt(int64(bSectorNum)), dagcbor.Encode))}, + {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "unsealed-cid", Value: must.One(ipld.Encode(datamodel.Null, dagcbor.Encode))}, + } + from := head.Height() + recentEvents, err := client.FullNode.GetActorEventsRaw(ctx, &types.ActorEventFilter{FromHeight: &from}) + req.NoError(err) + req.Len(recentEvents, 1) + req.Equal(expectedEntries, recentEvents[0].Entries) + } + + // Ensure that the block miner checks for and waits for posts during the appropriate proving window from our new miner with a sector + blockMiner.WatchMinerForPost(minerB.ActorAddr) + + // Wait till both miners' sectors have had their first post and are activated and check that this is reflected in miner power + minerB.WaitTillActivatedAndAssertPower(ctx, bRespCh, bSectorNum) + + head, err = client.ChainHead(ctx) + req.NoError(err) + + // Miner B has activated the CC sector -> upgrade it with snapdeals + snapPieces := minerB.SnapDeal(ctx, kit.TestSpt, bSectorNum) + // cancel the WdPost for the CC sector as the corresponding CommR is no longer valid + bWdPostCancelF() + + // Check "sector-updated" event happned after snap + { + expectedEntries := []types.EventEntry{ + {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "$type", Value: must.One(ipld.Encode(basicnode.NewString("sector-updated"), dagcbor.Encode))}, + {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "sector", Value: must.One(ipld.Encode(basicnode.NewInt(int64(bSectorNum)), dagcbor.Encode))}, + {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "unsealed-cid", Value: must.One(ipld.Encode(basicnode.NewLink(cidlink.Link{Cid: snapPieces[0].PieceCID}), dagcbor.Encode))}, + {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "piece-cid", Value: must.One(ipld.Encode(basicnode.NewLink(cidlink.Link{Cid: snapPieces[0].PieceCID}), dagcbor.Encode))}, + {Flags: 0x01, Codec: uint64(multicodec.Cbor), Key: "piece-size", Value: must.One(ipld.Encode(basicnode.NewInt(int64(snapPieces[0].Size)), dagcbor.Encode))}, + } + from := head.Height() + recentEvents, err := client.FullNode.GetActorEventsRaw(ctx, &types.ActorEventFilter{FromHeight: &from}) + req.NoError(err) + req.Len(recentEvents, 1) + req.Equal(expectedEntries, recentEvents[0].Entries) + } + }) + } +} + +func verifyProveCommitSectorsNIErrorConditions(ctx context.Context, t *testing.T, miner *kit.TestUnmanagedMiner, sealProofType abi.RegisteredSealProof) { + req := require.New(t) + + head, err := miner.FullNode.ChainHead(ctx) + req.NoError(err) + + actorIdNum, err := address.IDFromAddress(miner.ActorAddr) + req.NoError(err) + actorId := abi.ActorID(actorIdNum) + + var provingDeadline uint64 = 7 + if miner.IsImmutableDeadline(ctx, provingDeadline) { + // avoid immutable deadlines + provingDeadline = 5 + } + + submitAndFail := func(params *miner14.ProveCommitSectorsNIParams, errMsg string, errCode int) { + t.Helper() + r, err := miner.SubmitMessage(ctx, params, 1, builtin.MethodsMiner.ProveCommitSectorsNI) + req.Error(err) + req.Contains(err.Error(), errMsg) + if errCode > 0 { + req.Contains(err.Error(), fmt.Sprintf("(RetCode=%d)", errCode)) + } + req.Nil(r) + } + + sn := abi.SectorNumber(5000) + mkSai := func() miner14.SectorNIActivationInfo { + sn++ + return miner14.SectorNIActivationInfo{ + SealingNumber: sn, + SealerID: actorId, + SealedCID: cid.MustParse("bagboea4b5abcatlxechwbp7kjpjguna6r6q7ejrhe6mdp3lf34pmswn27pkkiekz"), + SectorNumber: sn, + SealRandEpoch: head.Height() - 10, + Expiration: 2880 * 300, + } + } + mkParams := func() miner14.ProveCommitSectorsNIParams { + return miner14.ProveCommitSectorsNIParams{ + Sectors: []miner14.SectorNIActivationInfo{mkSai(), mkSai()}, + AggregateProof: []byte{0xca, 0xfe, 0xbe, 0xef}, + SealProofType: sealProofType, + AggregateProofType: abi.RegisteredAggregationProof_SnarkPackV2, + ProvingDeadline: provingDeadline, + RequireActivationSuccess: true, + } + } + + // Test message rejection on no sectors + params := mkParams() + params.Sectors = []miner14.SectorNIActivationInfo{} + submitAndFail(¶ms, "too few sectors", 16) + + // Test message rejection on too many sectors + sectorInfos := make([]miner14.SectorNIActivationInfo, 66) + for i := range sectorInfos { + sectorInfos[i] = mkSai() + } + params = mkParams() + params.Sectors = sectorInfos + submitAndFail(¶ms, "too many sectors", 16) + + // Test bad aggregation proof type + params = mkParams() + params.AggregateProofType = abi.RegisteredAggregationProof_SnarkPackV1 + submitAndFail(¶ms, "aggregate proof type", 16) + + // Test bad SealerID + params = mkParams() + params.Sectors[1].SealerID = 1234 + submitAndFail(¶ms, "invalid NI commit 1 while requiring activation success", 16) + + // Test bad SealingNumber + params = mkParams() + params.Sectors[1].SealingNumber = 1234 + submitAndFail(¶ms, "invalid NI commit 1 while requiring activation success", 16) + + // Test bad SealedCID + params = mkParams() + params.Sectors[1].SealedCID = cid.MustParse("baga6ea4seaqjtovkwk4myyzj56eztkh5pzsk5upksan6f5outesy62bsvl4dsha") + submitAndFail(¶ms, "invalid NI commit 1 while requiring activation success", 16) + + // Test bad SealRandEpoch + head, err = miner.FullNode.ChainHead(ctx) + req.NoError(err) + params = mkParams() + params.Sectors[1].SealRandEpoch = head.Height() + builtin.EpochsInDay + submitAndFail(¶ms, fmt.Sprintf("seal challenge epoch %d must be before now", params.Sectors[1].SealRandEpoch), 16) + params.Sectors[1].SealRandEpoch = head.Height() - 190*builtin.EpochsInDay + submitAndFail(¶ms, "invalid NI commit 1 while requiring activation success", 16) + + // Immutable/bad deadlines + di, err := miner.FullNode.StateMinerProvingDeadline(ctx, miner.ActorAddr, head.Key()) + req.NoError(err) + currentDeadlineIdx := uint64(math.Abs(float64((di.CurrentEpoch - di.PeriodStart) / di.WPoStChallengeWindow))) + req.Less(currentDeadlineIdx, di.WPoStPeriodDeadlines) + params = mkParams() + params.ProvingDeadline = currentDeadlineIdx + submitAndFail(¶ms, fmt.Sprintf("proving deadline %d must not be the current or next deadline", currentDeadlineIdx), 18) + params.ProvingDeadline = currentDeadlineIdx + 1 + submitAndFail(¶ms, fmt.Sprintf("proving deadline %d must not be the current or next deadline", currentDeadlineIdx+1), 18) + params.ProvingDeadline = di.WPoStPeriodDeadlines // too big + submitAndFail(¶ms, fmt.Sprintf("proving deadline index %d invalid", di.WPoStPeriodDeadlines), 16) +} diff --git a/lib/tracing/setup.go b/lib/tracing/setup.go index a72ecdf2396..549e1bb4dee 100644 --- a/lib/tracing/setup.go +++ b/lib/tracing/setup.go @@ -5,8 +5,6 @@ import ( "strings" logging "github.com/ipfs/go-log/v2" - octrace "go.opencensus.io/trace" - "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/bridge/opencensus" "go.opentelemetry.io/otel/exporters/jaeger" "go.opentelemetry.io/otel/sdk/resource" @@ -84,8 +82,6 @@ func SetupJaegerTracing(serviceName string) *tracesdk.TracerProvider { )), tracesdk.WithSampler(tracesdk.AlwaysSample()), ) - otel.SetTracerProvider(tp) - tracer := tp.Tracer(serviceName) - octrace.DefaultTracer = opencensus.NewTracer(tracer) + opencensus.InstallTraceBridge(opencensus.WithTracerProvider(tp)) return tp } diff --git a/node/builder.go b/node/builder.go index 2ea9dcac55c..8fb29c249fa 100644 --- a/node/builder.go +++ b/node/builder.go @@ -114,6 +114,7 @@ const ( HandleDealsKey HandleRetrievalKey RunSectorServiceKey + F3Participation // daemon ExtractApiKey diff --git a/node/builder_chain.go b/node/builder_chain.go index b273a168cc1..deda103042d 100644 --- a/node/builder_chain.go +++ b/node/builder_chain.go @@ -6,6 +6,8 @@ import ( "go.uber.org/fx" "golang.org/x/xerrors" + "github.com/filecoin-project/go-f3/manifest" + "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain" @@ -17,6 +19,7 @@ import ( "github.com/filecoin-project/lotus/chain/exchange" "github.com/filecoin-project/lotus/chain/gen/slashfilter" "github.com/filecoin-project/lotus/chain/index" + "github.com/filecoin-project/lotus/chain/lf3" "github.com/filecoin-project/lotus/chain/market" "github.com/filecoin-project/lotus/chain/messagepool" "github.com/filecoin-project/lotus/chain/messagesigner" @@ -149,6 +152,11 @@ var ChainNode = Options( Override(HandleIncomingMessagesKey, modules.HandleIncomingMessages), Override(HandleIncomingBlocksKey, modules.HandleIncomingBlocks), ), + + If(build.IsF3Enabled(), + Override(new(manifest.ManifestProvider), lf3.NewManifestProvider), + Override(new(*lf3.F3), lf3.New), + ), ) func ConfigFullNode(c interface{}) Option { diff --git a/node/builder_miner.go b/node/builder_miner.go index fddec7785cc..9aaf2fc4bc6 100644 --- a/node/builder_miner.go +++ b/node/builder_miner.go @@ -141,6 +141,7 @@ func ConfigStorageMiner(c interface{}) Option { Override(new(config.HarmonyDB), cfg.HarmonyDB), Override(new(harmonydb.ITestID), harmonydb.ITestID("")), Override(new(*ctladdr.AddressSelector), modules.AddressSelector(&cfg.Addresses)), + If(build.IsF3Enabled(), Override(F3Participation, modules.F3Participation)), ) } diff --git a/node/config/doc_gen.go b/node/config/doc_gen.go index 3f66344c809..a3360627741 100644 --- a/node/config/doc_gen.go +++ b/node/config/doc_gen.go @@ -117,509 +117,6 @@ your node if metadata log is disabled`, Comment: ``, }, }, - "CurioAddresses": { - { - Name: "PreCommitControl", - Type: "[]string", - - Comment: `Addresses to send PreCommit messages from`, - }, - { - Name: "CommitControl", - Type: "[]string", - - Comment: `Addresses to send Commit messages from`, - }, - { - Name: "TerminateControl", - Type: "[]string", - - Comment: ``, - }, - { - Name: "DisableOwnerFallback", - Type: "bool", - - Comment: `DisableOwnerFallback disables usage of the owner address for messages -sent automatically`, - }, - { - Name: "DisableWorkerFallback", - Type: "bool", - - Comment: `DisableWorkerFallback disables usage of the worker address for messages -sent automatically, if control addresses are configured. -A control address that doesn't have enough funds will still be chosen -over the worker address if this flag is set.`, - }, - { - Name: "MinerAddresses", - Type: "[]string", - - Comment: `MinerAddresses are the addresses of the miner actors to use for sending messages`, - }, - }, - "CurioAlerting": { - { - Name: "PagerDutyEventURL", - Type: "string", - - Comment: `PagerDutyEventURL is URL for PagerDuty.com Events API v2 URL. Events sent to this API URL are ultimately -routed to a PagerDuty.com service and processed. -The default is sufficient for integration with the stock commercial PagerDuty.com company's service.`, - }, - { - Name: "PageDutyIntegrationKey", - Type: "string", - - Comment: `PageDutyIntegrationKey is the integration key for a PagerDuty.com service. You can find this unique service -identifier in the integration page for the service.`, - }, - { - Name: "MinimumWalletBalance", - Type: "types.FIL", - - Comment: `MinimumWalletBalance is the minimum balance all active wallets. If the balance is below this value, an -alerts will be triggered for the wallet`, - }, - }, - "CurioConfig": { - { - Name: "Subsystems", - Type: "CurioSubsystemsConfig", - - Comment: ``, - }, - { - Name: "Fees", - Type: "CurioFees", - - Comment: ``, - }, - { - Name: "Addresses", - Type: "[]CurioAddresses", - - Comment: `Addresses of wallets per MinerAddress (one of the fields).`, - }, - { - Name: "Proving", - Type: "CurioProvingConfig", - - Comment: ``, - }, - { - Name: "Ingest", - Type: "CurioIngestConfig", - - Comment: ``, - }, - { - Name: "Journal", - Type: "JournalConfig", - - Comment: ``, - }, - { - Name: "Apis", - Type: "ApisConfig", - - Comment: ``, - }, - { - Name: "Alerting", - Type: "CurioAlerting", - - Comment: ``, - }, - }, - "CurioFees": { - { - Name: "DefaultMaxFee", - Type: "types.FIL", - - Comment: ``, - }, - { - Name: "MaxPreCommitGasFee", - Type: "types.FIL", - - Comment: ``, - }, - { - Name: "MaxCommitGasFee", - Type: "types.FIL", - - Comment: ``, - }, - { - Name: "MaxPreCommitBatchGasFee", - Type: "BatchFeeConfig", - - Comment: `maxBatchFee = maxBase + maxPerSector * nSectors`, - }, - { - Name: "MaxCommitBatchGasFee", - Type: "BatchFeeConfig", - - Comment: ``, - }, - { - Name: "MaxTerminateGasFee", - Type: "types.FIL", - - Comment: ``, - }, - { - Name: "MaxWindowPoStGasFee", - Type: "types.FIL", - - Comment: `WindowPoSt is a high-value operation, so the default fee should be high.`, - }, - { - Name: "MaxPublishDealsFee", - Type: "types.FIL", - - Comment: ``, - }, - }, - "CurioIngestConfig": { - { - Name: "MaxQueueSDR", - Type: "int", - - Comment: `Maximum number of sectors that can be queued waiting for SDR to start processing. -0 = unlimited -Note: This mechanism will delay taking deal data from markets, providing backpressure to the market subsystem. -The SDR queue includes deals which are in the process of entering the sealing pipeline - size of this queue -will also impact the maximum number of ParkPiece tasks which can run concurrently. - -SDR queue is the first queue in the sealing pipeline, meaning that it should be used as the primary backpressure mechanism.`, - }, - { - Name: "MaxQueueTrees", - Type: "int", - - Comment: `Maximum number of sectors that can be queued waiting for SDRTrees to start processing. -0 = unlimited -Note: This mechanism will delay taking deal data from markets, providing backpressure to the market subsystem. -In case of the trees tasks it is possible that this queue grows more than this limit, the backpressure is only -applied to sectors entering the pipeline.`, - }, - { - Name: "MaxQueuePoRep", - Type: "int", - - Comment: `Maximum number of sectors that can be queued waiting for PoRep to start processing. -0 = unlimited -Note: This mechanism will delay taking deal data from markets, providing backpressure to the market subsystem. -Like with the trees tasks, it is possible that this queue grows more than this limit, the backpressure is only -applied to sectors entering the pipeline.`, - }, - }, - "CurioProvingConfig": { - { - Name: "ParallelCheckLimit", - Type: "int", - - Comment: `Maximum number of sector checks to run in parallel. (0 = unlimited) - -WARNING: Setting this value too high may make the node crash by running out of stack -WARNING: Setting this value too low may make sector challenge reading much slower, resulting in failed PoSt due -to late submission. - -After changing this option, confirm that the new value works in your setup by invoking -'lotus-miner proving compute window-post 0'`, - }, - { - Name: "SingleCheckTimeout", - Type: "Duration", - - Comment: `Maximum amount of time a proving pre-check can take for a sector. If the check times out the sector will be skipped - -WARNING: Setting this value too low risks in sectors being skipped even though they are accessible, just reading the -test challenge took longer than this timeout -WARNING: Setting this value too high risks missing PoSt deadline in case IO operations related to this sector are -blocked (e.g. in case of disconnected NFS mount)`, - }, - { - Name: "PartitionCheckTimeout", - Type: "Duration", - - Comment: `Maximum amount of time a proving pre-check can take for an entire partition. If the check times out, sectors in -the partition which didn't get checked on time will be skipped - -WARNING: Setting this value too low risks in sectors being skipped even though they are accessible, just reading the -test challenge took longer than this timeout -WARNING: Setting this value too high risks missing PoSt deadline in case IO operations related to this partition are -blocked or slow`, - }, - { - Name: "DisableWDPoStPreChecks", - Type: "bool", - - Comment: `Disable WindowPoSt provable sector readability checks. - -In normal operation, when preparing to compute WindowPoSt, lotus-miner will perform a round of reading challenges -from all sectors to confirm that those sectors can be proven. Challenges read in this process are discarded, as -we're only interested in checking that sector data can be read. - -When using builtin proof computation (no PoSt workers, and DisableBuiltinWindowPoSt is set to false), this process -can save a lot of time and compute resources in the case that some sectors are not readable - this is caused by -the builtin logic not skipping snark computation when some sectors need to be skipped. - -When using PoSt workers, this process is mostly redundant, with PoSt workers challenges will be read once, and -if challenges for some sectors aren't readable, those sectors will just get skipped. - -Disabling sector pre-checks will slightly reduce IO load when proving sectors, possibly resulting in shorter -time to produce window PoSt. In setups with good IO capabilities the effect of this option on proving time should -be negligible. - -NOTE: It likely is a bad idea to disable sector pre-checks in setups with no PoSt workers. - -NOTE: Even when this option is enabled, recovering sectors will be checked before recovery declaration message is -sent to the chain - -After changing this option, confirm that the new value works in your setup by invoking -'lotus-miner proving compute window-post 0'`, - }, - { - Name: "MaxPartitionsPerPoStMessage", - Type: "int", - - Comment: `Maximum number of partitions to prove in a single SubmitWindowPoSt messace. 0 = network limit (3 in nv21) - -A single partition may contain up to 2349 32GiB sectors, or 2300 64GiB sectors. -// -Note that setting this value lower may result in less efficient gas use - more messages will be sent, -to prove each deadline, resulting in more total gas use (but each message will have lower gas limit) - -Setting this value above the network limit has no effect`, - }, - { - Name: "MaxPartitionsPerRecoveryMessage", - Type: "int", - - Comment: `In some cases when submitting DeclareFaultsRecovered messages, -there may be too many recoveries to fit in a BlockGasLimit. -In those cases it may be necessary to set this value to something low (eg 1); -Note that setting this value lower may result in less efficient gas use - more messages will be sent than needed, -resulting in more total gas use (but each message will have lower gas limit)`, - }, - { - Name: "SingleRecoveringPartitionPerPostMessage", - Type: "bool", - - Comment: `Enable single partition per PoSt Message for partitions containing recovery sectors - -In cases when submitting PoSt messages which contain recovering sectors, the default network limit may still be -too high to fit in the block gas limit. In those cases, it becomes useful to only house the single partition -with recovering sectors in the post message - -Note that setting this value lower may result in less efficient gas use - more messages will be sent, -to prove each deadline, resulting in more total gas use (but each message will have lower gas limit)`, - }, - }, - "CurioSubsystemsConfig": { - { - Name: "EnableWindowPost", - Type: "bool", - - Comment: `EnableWindowPost enables window post to be executed on this curio instance. Each machine in the cluster -with WindowPoSt enabled will also participate in the window post scheduler. It is possible to have multiple -machines with WindowPoSt enabled which will provide redundancy, and in case of multiple partitions per deadline, -will allow for parallel processing of partitions. - -It is possible to have instances handling both WindowPoSt and WinningPoSt, which can provide redundancy without -the need for additional machines. In setups like this it is generally recommended to run -partitionsPerDeadline+1 machines.`, - }, - { - Name: "WindowPostMaxTasks", - Type: "int", - - Comment: ``, - }, - { - Name: "EnableWinningPost", - Type: "bool", - - Comment: `EnableWinningPost enables winning post to be executed on this curio instance. -Each machine in the cluster with WinningPoSt enabled will also participate in the winning post scheduler. -It is possible to mix machines with WindowPoSt and WinningPoSt enabled, for details see the EnableWindowPost -documentation.`, - }, - { - Name: "WinningPostMaxTasks", - Type: "int", - - Comment: ``, - }, - { - Name: "EnableParkPiece", - Type: "bool", - - Comment: `EnableParkPiece enables the "piece parking" task to run on this node. This task is responsible for fetching -pieces from the network and storing them in the storage subsystem until sectors are sealed. This task is -only applicable when integrating with boost, and should be enabled on nodes which will hold deal data -from boost until sectors containing the related pieces have the TreeD/TreeR constructed. -Note that future Curio implementations will have a separate task type for fetching pieces from the internet.`, - }, - { - Name: "ParkPieceMaxTasks", - Type: "int", - - Comment: ``, - }, - { - Name: "EnableSealSDR", - Type: "bool", - - Comment: `EnableSealSDR enables SDR tasks to run. SDR is the long sequential computation -creating 11 layer files in sector cache directory. - -SDR is the first task in the sealing pipeline. It's inputs are just the hash of the -unsealed data (CommD), sector number, miner id, and the seal proof type. -It's outputs are the 11 layer files in the sector cache directory. - -In lotus-miner this was run as part of PreCommit1.`, - }, - { - Name: "SealSDRMaxTasks", - Type: "int", - - Comment: `The maximum amount of SDR tasks that can run simultaneously. Note that the maximum number of tasks will -also be bounded by resources available on the machine.`, - }, - { - Name: "EnableSealSDRTrees", - Type: "bool", - - Comment: `EnableSealSDRTrees enables the SDR pipeline tree-building task to run. -This task handles encoding of unsealed data into last sdr layer and building -of TreeR, TreeC and TreeD. - -This task runs after SDR -TreeD is first computed with optional input of unsealed data -TreeR is computed from replica, which is first computed as field -addition of the last SDR layer and the bottom layer of TreeD (which is the unsealed data) -TreeC is computed from the 11 SDR layers -The 3 trees will later be used to compute the PoRep proof. - -In case of SyntheticPoRep challenges for PoRep will be pre-generated at this step, and trees and layers -will be dropped. SyntheticPoRep works by pre-generating a very large set of challenges (~30GiB on disk) -then using a small subset of them for the actual PoRep computation. This allows for significant scratch space -saving between PreCommit and PoRep generation at the expense of more computation (generating challenges in this step) - -In lotus-miner this was run as part of PreCommit2 (TreeD was run in PreCommit1). -Note that nodes with SDRTrees enabled will also answer to Finalize tasks, -which just remove unneeded tree data after PoRep is computed.`, - }, - { - Name: "SealSDRTreesMaxTasks", - Type: "int", - - Comment: `The maximum amount of SealSDRTrees tasks that can run simultaneously. Note that the maximum number of tasks will -also be bounded by resources available on the machine.`, - }, - { - Name: "FinalizeMaxTasks", - Type: "int", - - Comment: `FinalizeMaxTasks is the maximum amount of finalize tasks that can run simultaneously. -The finalize task is enabled on all machines which also handle SDRTrees tasks. Finalize ALWAYS runs on whichever -machine holds sector cache files, as it removes unneeded tree data after PoRep is computed. -Finalize will run in parallel with the SubmitCommitMsg task.`, - }, - { - Name: "EnableSendPrecommitMsg", - Type: "bool", - - Comment: `EnableSendPrecommitMsg enables the sending of precommit messages to the chain -from this curio instance. -This runs after SDRTrees and uses the output CommD / CommR (roots of TreeD / TreeR) for the message`, - }, - { - Name: "EnablePoRepProof", - Type: "bool", - - Comment: `EnablePoRepProof enables the computation of the porep proof - -This task runs after interactive-porep seed becomes available, which happens 150 epochs (75min) after the -precommit message lands on chain. This task should run on a machine with a GPU. Vanilla PoRep proofs are -requested from the machine which holds sector cache files which most likely is the machine which ran the SDRTrees -task. - -In lotus-miner this was Commit1 / Commit2`, - }, - { - Name: "PoRepProofMaxTasks", - Type: "int", - - Comment: `The maximum amount of PoRepProof tasks that can run simultaneously. Note that the maximum number of tasks will -also be bounded by resources available on the machine.`, - }, - { - Name: "EnableSendCommitMsg", - Type: "bool", - - Comment: `EnableSendCommitMsg enables the sending of commit messages to the chain -from this curio instance.`, - }, - { - Name: "EnableMoveStorage", - Type: "bool", - - Comment: `EnableMoveStorage enables the move-into-long-term-storage task to run on this curio instance. -This tasks should only be enabled on nodes with long-term storage. - -The MoveStorage task is the last task in the sealing pipeline. It moves the sealed sector data from the -SDRTrees machine into long-term storage. This task runs after the Finalize task.`, - }, - { - Name: "MoveStorageMaxTasks", - Type: "int", - - Comment: `The maximum amount of MoveStorage tasks that can run simultaneously. Note that the maximum number of tasks will -also be bounded by resources available on the machine. It is recommended that this value is set to a number which -uses all available network (or disk) bandwidth on the machine without causing bottlenecks.`, - }, - { - Name: "BoostAdapters", - Type: "[]string", - - Comment: `BoostAdapters is a list of tuples of miner address and port/ip to listen for market (e.g. boost) requests. -This interface is compatible with the lotus-miner RPC, implementing a subset needed for storage market operations. -Strings should be in the format "actor:ip:port". IP cannot be 0.0.0.0. We recommend using a private IP. -Example: "f0123:127.0.0.1:32100". Multiple addresses can be specified. - -When a market node like boost gives Curio's market RPC a deal to placing into a sector, Curio will first store the -deal data in a temporary location "Piece Park" before assigning it to a sector. This requires that at least one -node in the cluster has the EnableParkPiece option enabled and has sufficient scratch space to store the deal data. -This is different from lotus-miner which stored the deal data into an "unsealed" sector as soon as the deal was -received. Deal data in PiecePark is accessed when the sector TreeD and TreeR are computed, but isn't needed for -the initial SDR layers computation. Pieces in PiecePark are removed after all sectors referencing the piece are -sealed. - -To get API info for boost configuration run 'curio market rpc-info' - -NOTE: All deal data will flow through this service, so it should be placed on a machine running boost or on -a machine which handles ParkPiece tasks.`, - }, - { - Name: "EnableWebGui", - Type: "bool", - - Comment: `EnableWebGui enables the web GUI on this curio instance. The UI has minimal local overhead, but it should -only need to be run on a single machine in the cluster.`, - }, - { - Name: "GuiAddress", - Type: "string", - - Comment: `The address that should listen for Web GUI requests.`, - }, - }, "DealmakingConfig": { { Name: "StartEpochSealingBuffer", diff --git a/node/config/types.go b/node/config/types.go index c6c7aaef40c..fdda3b84f7a 100644 --- a/node/config/types.go +++ b/node/config/types.go @@ -60,20 +60,6 @@ type StorageMiner struct { HarmonyDB HarmonyDB } -type CurioConfig struct { - Subsystems CurioSubsystemsConfig - - Fees CurioFees - - // Addresses of wallets per MinerAddress (one of the fields). - Addresses []CurioAddresses - Proving CurioProvingConfig - Ingest CurioIngestConfig - Journal JournalConfig - Apis ApisConfig - Alerting CurioAlerting -} - type ApisConfig struct { // ChainApiInfo is the API endpoint for the Lotus daemon. ChainApiInfo []string @@ -89,140 +75,6 @@ type JournalConfig struct { DisabledEvents string } -type CurioSubsystemsConfig struct { - // EnableWindowPost enables window post to be executed on this curio instance. Each machine in the cluster - // with WindowPoSt enabled will also participate in the window post scheduler. It is possible to have multiple - // machines with WindowPoSt enabled which will provide redundancy, and in case of multiple partitions per deadline, - // will allow for parallel processing of partitions. - // - // It is possible to have instances handling both WindowPoSt and WinningPoSt, which can provide redundancy without - // the need for additional machines. In setups like this it is generally recommended to run - // partitionsPerDeadline+1 machines. - EnableWindowPost bool - WindowPostMaxTasks int - - // EnableWinningPost enables winning post to be executed on this curio instance. - // Each machine in the cluster with WinningPoSt enabled will also participate in the winning post scheduler. - // It is possible to mix machines with WindowPoSt and WinningPoSt enabled, for details see the EnableWindowPost - // documentation. - EnableWinningPost bool - WinningPostMaxTasks int - - // EnableParkPiece enables the "piece parking" task to run on this node. This task is responsible for fetching - // pieces from the network and storing them in the storage subsystem until sectors are sealed. This task is - // only applicable when integrating with boost, and should be enabled on nodes which will hold deal data - // from boost until sectors containing the related pieces have the TreeD/TreeR constructed. - // Note that future Curio implementations will have a separate task type for fetching pieces from the internet. - EnableParkPiece bool - ParkPieceMaxTasks int - - // EnableSealSDR enables SDR tasks to run. SDR is the long sequential computation - // creating 11 layer files in sector cache directory. - // - // SDR is the first task in the sealing pipeline. It's inputs are just the hash of the - // unsealed data (CommD), sector number, miner id, and the seal proof type. - // It's outputs are the 11 layer files in the sector cache directory. - // - // In lotus-miner this was run as part of PreCommit1. - EnableSealSDR bool - - // The maximum amount of SDR tasks that can run simultaneously. Note that the maximum number of tasks will - // also be bounded by resources available on the machine. - SealSDRMaxTasks int - - // EnableSealSDRTrees enables the SDR pipeline tree-building task to run. - // This task handles encoding of unsealed data into last sdr layer and building - // of TreeR, TreeC and TreeD. - // - // This task runs after SDR - // TreeD is first computed with optional input of unsealed data - // TreeR is computed from replica, which is first computed as field - // addition of the last SDR layer and the bottom layer of TreeD (which is the unsealed data) - // TreeC is computed from the 11 SDR layers - // The 3 trees will later be used to compute the PoRep proof. - // - // In case of SyntheticPoRep challenges for PoRep will be pre-generated at this step, and trees and layers - // will be dropped. SyntheticPoRep works by pre-generating a very large set of challenges (~30GiB on disk) - // then using a small subset of them for the actual PoRep computation. This allows for significant scratch space - // saving between PreCommit and PoRep generation at the expense of more computation (generating challenges in this step) - // - // In lotus-miner this was run as part of PreCommit2 (TreeD was run in PreCommit1). - // Note that nodes with SDRTrees enabled will also answer to Finalize tasks, - // which just remove unneeded tree data after PoRep is computed. - EnableSealSDRTrees bool - - // The maximum amount of SealSDRTrees tasks that can run simultaneously. Note that the maximum number of tasks will - // also be bounded by resources available on the machine. - SealSDRTreesMaxTasks int - - // FinalizeMaxTasks is the maximum amount of finalize tasks that can run simultaneously. - // The finalize task is enabled on all machines which also handle SDRTrees tasks. Finalize ALWAYS runs on whichever - // machine holds sector cache files, as it removes unneeded tree data after PoRep is computed. - // Finalize will run in parallel with the SubmitCommitMsg task. - FinalizeMaxTasks int - - // EnableSendPrecommitMsg enables the sending of precommit messages to the chain - // from this curio instance. - // This runs after SDRTrees and uses the output CommD / CommR (roots of TreeD / TreeR) for the message - EnableSendPrecommitMsg bool - - // EnablePoRepProof enables the computation of the porep proof - // - // This task runs after interactive-porep seed becomes available, which happens 150 epochs (75min) after the - // precommit message lands on chain. This task should run on a machine with a GPU. Vanilla PoRep proofs are - // requested from the machine which holds sector cache files which most likely is the machine which ran the SDRTrees - // task. - // - // In lotus-miner this was Commit1 / Commit2 - EnablePoRepProof bool - - // The maximum amount of PoRepProof tasks that can run simultaneously. Note that the maximum number of tasks will - // also be bounded by resources available on the machine. - PoRepProofMaxTasks int - - // EnableSendCommitMsg enables the sending of commit messages to the chain - // from this curio instance. - EnableSendCommitMsg bool - - // EnableMoveStorage enables the move-into-long-term-storage task to run on this curio instance. - // This tasks should only be enabled on nodes with long-term storage. - // - // The MoveStorage task is the last task in the sealing pipeline. It moves the sealed sector data from the - // SDRTrees machine into long-term storage. This task runs after the Finalize task. - EnableMoveStorage bool - - // The maximum amount of MoveStorage tasks that can run simultaneously. Note that the maximum number of tasks will - // also be bounded by resources available on the machine. It is recommended that this value is set to a number which - // uses all available network (or disk) bandwidth on the machine without causing bottlenecks. - MoveStorageMaxTasks int - - // BoostAdapters is a list of tuples of miner address and port/ip to listen for market (e.g. boost) requests. - // This interface is compatible with the lotus-miner RPC, implementing a subset needed for storage market operations. - // Strings should be in the format "actor:ip:port". IP cannot be 0.0.0.0. We recommend using a private IP. - // Example: "f0123:127.0.0.1:32100". Multiple addresses can be specified. - // - // When a market node like boost gives Curio's market RPC a deal to placing into a sector, Curio will first store the - // deal data in a temporary location "Piece Park" before assigning it to a sector. This requires that at least one - // node in the cluster has the EnableParkPiece option enabled and has sufficient scratch space to store the deal data. - // This is different from lotus-miner which stored the deal data into an "unsealed" sector as soon as the deal was - // received. Deal data in PiecePark is accessed when the sector TreeD and TreeR are computed, but isn't needed for - // the initial SDR layers computation. Pieces in PiecePark are removed after all sectors referencing the piece are - // sealed. - // - // To get API info for boost configuration run 'curio market rpc-info' - // - // NOTE: All deal data will flow through this service, so it should be placed on a machine running boost or on - // a machine which handles ParkPiece tasks. - BoostAdapters []string - - // EnableWebGui enables the web GUI on this curio instance. The UI has minimal local overhead, but it should - // only need to be run on a single machine in the cluster. - EnableWebGui bool - - // The address that should listen for Web GUI requests. - GuiAddress string -} - type MinerSubsystemConfig struct { EnableMining bool EnableSealing bool @@ -543,20 +395,6 @@ type MinerFeeConfig struct { MaximizeWindowPoStFeeCap bool } -type CurioFees struct { - DefaultMaxFee types.FIL - MaxPreCommitGasFee types.FIL - MaxCommitGasFee types.FIL - - // maxBatchFee = maxBase + maxPerSector * nSectors - MaxPreCommitBatchGasFee BatchFeeConfig - MaxCommitBatchGasFee BatchFeeConfig - - MaxTerminateGasFee types.FIL - // WindowPoSt is a high-value operation, so the default fee should be high. - MaxWindowPoStGasFee types.FIL - MaxPublishDealsFee types.FIL -} type MinerAddressConfig struct { // Addresses to send PreCommit messages from PreCommitControl []string @@ -575,135 +413,6 @@ type MinerAddressConfig struct { DisableWorkerFallback bool } -type CurioAddresses struct { - // Addresses to send PreCommit messages from - PreCommitControl []string - // Addresses to send Commit messages from - CommitControl []string - TerminateControl []string - - // DisableOwnerFallback disables usage of the owner address for messages - // sent automatically - DisableOwnerFallback bool - // DisableWorkerFallback disables usage of the worker address for messages - // sent automatically, if control addresses are configured. - // A control address that doesn't have enough funds will still be chosen - // over the worker address if this flag is set. - DisableWorkerFallback bool - - // MinerAddresses are the addresses of the miner actors to use for sending messages - MinerAddresses []string -} - -type CurioProvingConfig struct { - // Maximum number of sector checks to run in parallel. (0 = unlimited) - // - // WARNING: Setting this value too high may make the node crash by running out of stack - // WARNING: Setting this value too low may make sector challenge reading much slower, resulting in failed PoSt due - // to late submission. - // - // After changing this option, confirm that the new value works in your setup by invoking - // 'lotus-miner proving compute window-post 0' - ParallelCheckLimit int - - // Maximum amount of time a proving pre-check can take for a sector. If the check times out the sector will be skipped - // - // WARNING: Setting this value too low risks in sectors being skipped even though they are accessible, just reading the - // test challenge took longer than this timeout - // WARNING: Setting this value too high risks missing PoSt deadline in case IO operations related to this sector are - // blocked (e.g. in case of disconnected NFS mount) - SingleCheckTimeout Duration - - // Maximum amount of time a proving pre-check can take for an entire partition. If the check times out, sectors in - // the partition which didn't get checked on time will be skipped - // - // WARNING: Setting this value too low risks in sectors being skipped even though they are accessible, just reading the - // test challenge took longer than this timeout - // WARNING: Setting this value too high risks missing PoSt deadline in case IO operations related to this partition are - // blocked or slow - PartitionCheckTimeout Duration - - // Disable WindowPoSt provable sector readability checks. - // - // In normal operation, when preparing to compute WindowPoSt, lotus-miner will perform a round of reading challenges - // from all sectors to confirm that those sectors can be proven. Challenges read in this process are discarded, as - // we're only interested in checking that sector data can be read. - // - // When using builtin proof computation (no PoSt workers, and DisableBuiltinWindowPoSt is set to false), this process - // can save a lot of time and compute resources in the case that some sectors are not readable - this is caused by - // the builtin logic not skipping snark computation when some sectors need to be skipped. - // - // When using PoSt workers, this process is mostly redundant, with PoSt workers challenges will be read once, and - // if challenges for some sectors aren't readable, those sectors will just get skipped. - // - // Disabling sector pre-checks will slightly reduce IO load when proving sectors, possibly resulting in shorter - // time to produce window PoSt. In setups with good IO capabilities the effect of this option on proving time should - // be negligible. - // - // NOTE: It likely is a bad idea to disable sector pre-checks in setups with no PoSt workers. - // - // NOTE: Even when this option is enabled, recovering sectors will be checked before recovery declaration message is - // sent to the chain - // - // After changing this option, confirm that the new value works in your setup by invoking - // 'lotus-miner proving compute window-post 0' - DisableWDPoStPreChecks bool - - // Maximum number of partitions to prove in a single SubmitWindowPoSt messace. 0 = network limit (3 in nv21) - // - // A single partition may contain up to 2349 32GiB sectors, or 2300 64GiB sectors. - // // - // Note that setting this value lower may result in less efficient gas use - more messages will be sent, - // to prove each deadline, resulting in more total gas use (but each message will have lower gas limit) - // - // Setting this value above the network limit has no effect - MaxPartitionsPerPoStMessage int - - // Maximum number of partitions to declare in a single DeclareFaultsRecovered message. 0 = no limit. - - // In some cases when submitting DeclareFaultsRecovered messages, - // there may be too many recoveries to fit in a BlockGasLimit. - // In those cases it may be necessary to set this value to something low (eg 1); - // Note that setting this value lower may result in less efficient gas use - more messages will be sent than needed, - // resulting in more total gas use (but each message will have lower gas limit) - MaxPartitionsPerRecoveryMessage int - - // Enable single partition per PoSt Message for partitions containing recovery sectors - // - // In cases when submitting PoSt messages which contain recovering sectors, the default network limit may still be - // too high to fit in the block gas limit. In those cases, it becomes useful to only house the single partition - // with recovering sectors in the post message - // - // Note that setting this value lower may result in less efficient gas use - more messages will be sent, - // to prove each deadline, resulting in more total gas use (but each message will have lower gas limit) - SingleRecoveringPartitionPerPostMessage bool -} - -type CurioIngestConfig struct { - // Maximum number of sectors that can be queued waiting for SDR to start processing. - // 0 = unlimited - // Note: This mechanism will delay taking deal data from markets, providing backpressure to the market subsystem. - // The SDR queue includes deals which are in the process of entering the sealing pipeline - size of this queue - // will also impact the maximum number of ParkPiece tasks which can run concurrently. - // - // SDR queue is the first queue in the sealing pipeline, meaning that it should be used as the primary backpressure mechanism. - MaxQueueSDR int - - // Maximum number of sectors that can be queued waiting for SDRTrees to start processing. - // 0 = unlimited - // Note: This mechanism will delay taking deal data from markets, providing backpressure to the market subsystem. - // In case of the trees tasks it is possible that this queue grows more than this limit, the backpressure is only - // applied to sectors entering the pipeline. - MaxQueueTrees int - - // Maximum number of sectors that can be queued waiting for PoRep to start processing. - // 0 = unlimited - // Note: This mechanism will delay taking deal data from markets, providing backpressure to the market subsystem. - // Like with the trees tasks, it is possible that this queue grows more than this limit, the backpressure is only - // applied to sectors entering the pipeline. - MaxQueuePoRep int -} - // API contains configs for API endpoint type API struct { // Binding address for the Lotus API @@ -947,18 +656,3 @@ type FaultReporterConfig struct { // rewards. This address should have adequate funds to cover gas fees. ConsensusFaultReporterAddress string } - -type CurioAlerting struct { - // PagerDutyEventURL is URL for PagerDuty.com Events API v2 URL. Events sent to this API URL are ultimately - // routed to a PagerDuty.com service and processed. - // The default is sufficient for integration with the stock commercial PagerDuty.com company's service. - PagerDutyEventURL string - - // PageDutyIntegrationKey is the integration key for a PagerDuty.com service. You can find this unique service - // identifier in the integration page for the service. - PageDutyIntegrationKey string - - // MinimumWalletBalance is the minimum balance all active wallets. If the balance is below this value, an - // alerts will be triggered for the wallet - MinimumWalletBalance types.FIL -} diff --git a/node/hello/hello.go b/node/hello/hello.go index ef15ece16c3..b1977bdaea9 100644 --- a/node/hello/hello.go +++ b/node/hello/hello.go @@ -31,6 +31,7 @@ const ProtocolID = "/fil/hello/1.0.0" var log = logging.Logger("hello") var streamDeadline = 10 * time.Second +var streamOpenTimeout = 1 * time.Minute type HelloMessage struct { HeaviestTipSet []cid.Cid @@ -141,7 +142,9 @@ func (hs *Service) HandleStream(s inet.Stream) { } func (hs *Service) SayHello(ctx context.Context, pid peer.ID) error { - s, err := hs.h.NewStream(ctx, pid, ProtocolID) + sctx, cancel := context.WithTimeout(ctx, streamOpenTimeout) + defer cancel() + s, err := hs.h.NewStream(sctx, pid, ProtocolID) if err != nil { return xerrors.Errorf("error opening stream: %w", err) } diff --git a/node/impl/full.go b/node/impl/full.go index aef7a75cb2a..cf8048eb3a4 100644 --- a/node/impl/full.go +++ b/node/impl/full.go @@ -34,6 +34,7 @@ type FullNodeAPI struct { full.SyncAPI full.EthAPI full.ActorEventsAPI + full.F3API DS dtypes.MetadataDS NetworkName dtypes.NetworkName diff --git a/node/impl/full/eth.go b/node/impl/full/eth.go index 27d7002e440..a7c1975f5ff 100644 --- a/node/impl/full/eth.go +++ b/node/impl/full/eth.go @@ -255,7 +255,6 @@ func (a *EthModule) EthGetBlockByNumber(ctx context.Context, blkParam string, fu func (a *EthModule) EthGetTransactionByHash(ctx context.Context, txHash *ethtypes.EthHash) (*ethtypes.EthTx, error) { return a.EthGetTransactionByHashLimited(ctx, txHash, api.LookbackNoLimit) - } func (a *EthModule) EthGetTransactionByHashLimited(ctx context.Context, txHash *ethtypes.EthHash, limit abi.ChainEpoch) (*ethtypes.EthTx, error) { @@ -734,6 +733,7 @@ func (a *EthModule) EthFeeHistory(ctx context.Context, p jsonrpc.RawParams) (eth ) for blocksIncluded < int(params.BlkCount) && ts.Height() > 0 { + basefee = ts.Blocks()[0].ParentBaseFee _, msgs, rcpts, err := executeTipset(ctx, ts, a.Chain, a.StateAPI) if err != nil { return ethtypes.EthFeeHistory{}, xerrors.Errorf("failed to retrieve messages and receipts for height %d: %w", ts.Height(), err) @@ -1275,9 +1275,17 @@ func (e *EthEventHandler) EthGetLogs(ctx context.Context, filterSpec *ethtypes.E if pf.tipsetCid == cid.Undef { maxHeight := pf.maxHeight if maxHeight == -1 { - maxHeight = e.Chain.GetHeaviestTipSet().Height() + // heaviest tipset doesn't have events because its messages haven't been executed yet + maxHeight = e.Chain.GetHeaviestTipSet().Height() - 1 + } + + if maxHeight < 0 { + return nil, xerrors.Errorf("maxHeight requested is less than 0") } - if maxHeight > e.Chain.GetHeaviestTipSet().Height() { + + // we can't return events for the heaviest tipset as the transactions in that tipset will be executed + // in the next non null tipset (because of Filecoin's "deferred execution" model) + if maxHeight > e.Chain.GetHeaviestTipSet().Height()-1 { return nil, xerrors.Errorf("maxHeight requested is greater than the heaviest tipset") } @@ -1285,13 +1293,13 @@ func (e *EthEventHandler) EthGetLogs(ctx context.Context, filterSpec *ethtypes.E if err != nil { return nil, err } - - // should also have the minHeight in the filter indexed - if b, err := e.EventFilterManager.EventIndex.IsHeightProcessed(ctx, uint64(pf.minHeight)); err != nil { - return nil, xerrors.Errorf("failed to check if event index has events for the minHeight: %w", err) - } else if !b { - return nil, xerrors.Errorf("event index does not have event for epoch %d", pf.minHeight) - } + // TODO: Ideally we should also check that events for the epoch at `pf.minheight` have been indexed + // However, it is currently tricky to check/guarantee this for two reasons: + // a) Event Index is not aware of null-blocks. This means that the Event Index wont be able to say whether the block at + // `pf.minheight` is a null block or whether it has no events + // b) There can be holes in the index where events at certain epoch simply haven't been indexed because of edge cases around + // node restarts while indexing. This needs a long term "auto-repair"/"automated-backfilling" implementation in the index + // So, for now, the best we can do is ensure that the event index has evenets for events at height >= `pf.maxHeight` } else { ts, err := e.Chain.GetTipSetByCid(ctx, pf.tipsetCid) if err != nil { @@ -1323,6 +1331,8 @@ func (e *EthEventHandler) EthGetLogs(ctx context.Context, filterSpec *ethtypes.E return ethFilterResultFromEvents(ctx, ces, e.SubManager.StateAPI) } +// note that we can have null blocks at the given height and the event Index is not null block aware +// so, what we do here is wait till we see the event index contain a block at a height greater than the given height func (e *EthEventHandler) waitForHeightProcessed(ctx context.Context, height abi.ChainEpoch) error { ei := e.EventFilterManager.EventIndex if height > e.Chain.GetHeaviestTipSet().Height() { @@ -1333,7 +1343,7 @@ func (e *EthEventHandler) waitForHeightProcessed(ctx context.Context, height abi defer cancel() // if the height we're interested in has already been indexed -> there's nothing to do here - if b, err := ei.IsHeightProcessed(ctx, uint64(height)); err != nil { + if b, err := ei.IsHeightPast(ctx, uint64(height)); err != nil { return xerrors.Errorf("failed to check if event index has events for given height: %w", err) } else if b { return nil @@ -1344,7 +1354,7 @@ func (e *EthEventHandler) waitForHeightProcessed(ctx context.Context, height abi defer unSubscribeF() // it could be that the event index was update while the subscription was being processed -> check if index has what we need now - if b, err := ei.IsHeightProcessed(ctx, uint64(height)); err != nil { + if b, err := ei.IsHeightPast(ctx, uint64(height)); err != nil { return xerrors.Errorf("failed to check if event index has events for given height: %w", err) } else if b { return nil @@ -1353,7 +1363,7 @@ func (e *EthEventHandler) waitForHeightProcessed(ctx context.Context, height abi for { select { case <-subCh: - if b, err := ei.IsHeightProcessed(ctx, uint64(height)); err != nil { + if b, err := ei.IsHeightPast(ctx, uint64(height)); err != nil { return xerrors.Errorf("failed to check if event index has events for given height: %w", err) } else if b { return nil diff --git a/node/impl/full/eth_trace.go b/node/impl/full/eth_trace.go index e4e5d794d0e..1666dab774a 100644 --- a/node/impl/full/eth_trace.go +++ b/node/impl/full/eth_trace.go @@ -103,8 +103,8 @@ func baseEnvironment(st *state.StateTree, from address.Address) (*environment, e } func traceToAddress(act *types.ActorTrace) ethtypes.EthAddress { - if act.State.Address != nil { - if addr, err := ethtypes.EthAddressFromFilecoinAddress(*act.State.Address); err == nil { + if act.State.DelegatedAddress != nil { + if addr, err := ethtypes.EthAddressFromFilecoinAddress(*act.State.DelegatedAddress); err == nil { return addr } } @@ -446,7 +446,7 @@ func decodeCreateViaEAM(et *types.ExecutionTrace) (initcode []byte, addr *ethtyp } ret, err := decodeReturn[eam12.CreateReturn](&et.MsgRct) if err != nil { - return nil, (*ethtypes.EthAddress)(&ret.EthAddress), err + return nil, nil, err } return initcode, (*ethtypes.EthAddress)(&ret.EthAddress), nil } diff --git a/node/impl/full/eth_utils.go b/node/impl/full/eth_utils.go index a5799b0dda4..0fab58fa6b3 100644 --- a/node/impl/full/eth_utils.go +++ b/node/impl/full/eth_utils.go @@ -419,9 +419,9 @@ func lookupEthAddress(addr address.Address, st *state.StateTree) (ethtypes.EthAd } else if err != nil { // Any other error -> fail. return ethtypes.EthAddress{}, err - } else if actor.Address == nil { + } else if actor.DelegatedAddress == nil { // No delegated address -> use masked ID address. - } else if ethAddr, err := ethtypes.EthAddressFromFilecoinAddress(*actor.Address); err == nil && !ethAddr.IsMaskedID() { + } else if ethAddr, err := ethtypes.EthAddressFromFilecoinAddress(*actor.DelegatedAddress); err == nil && !ethAddr.IsMaskedID() { // Conversable into an eth address, use it. return ethAddr, nil } diff --git a/node/impl/full/f3.go b/node/impl/full/f3.go new file mode 100644 index 00000000000..f3cdbcba70c --- /dev/null +++ b/node/impl/full/f3.go @@ -0,0 +1,73 @@ +package full + +import ( + "context" + "errors" + "time" + + "go.uber.org/fx" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-f3/certs" + "github.com/filecoin-project/go-f3/gpbft" + + "github.com/filecoin-project/lotus/chain/lf3" + "github.com/filecoin-project/lotus/chain/types" +) + +type F3API struct { + fx.In + + F3 *lf3.F3 `optional:"true"` +} + +var ErrF3Disabled = errors.New("f3 is disabled") + +func (f3api *F3API) F3Participate(ctx context.Context, miner address.Address, + newLeaseExpiration time.Time, oldLeaseExpiration time.Time) (bool, error) { + + if leaseDuration := time.Until(newLeaseExpiration); leaseDuration > 5*time.Minute { + return false, xerrors.Errorf("F3 participation lease too long: %v > 5 min", leaseDuration) + } else if leaseDuration < 0 { + return false, xerrors.Errorf("F3 participation lease is in the past: %d < 0", leaseDuration) + } + + if f3api.F3 == nil { + log.Infof("F3Participate called for %v, F3 is disabled", miner) + return false, ErrF3Disabled + } + minerID, err := address.IDFromAddress(miner) + if err != nil { + return false, xerrors.Errorf("miner address is not of ID type: %v: %w", miner, err) + } + + return f3api.F3.Participate(ctx, minerID, newLeaseExpiration, oldLeaseExpiration), nil +} + +func (f3api *F3API) F3GetCertificate(ctx context.Context, instance uint64) (*certs.FinalityCertificate, error) { + if f3api.F3 == nil { + return nil, ErrF3Disabled + } + return f3api.F3.GetCert(ctx, instance) +} + +func (f3api *F3API) F3GetLatestCertificate(ctx context.Context) (*certs.FinalityCertificate, error) { + if f3api.F3 == nil { + return nil, ErrF3Disabled + } + return f3api.F3.GetLatestCert(ctx) +} +func (f3api *F3API) F3GetECPowerTable(ctx context.Context, tsk types.TipSetKey) (gpbft.PowerEntries, error) { + if f3api.F3 == nil { + return nil, ErrF3Disabled + } + return f3api.F3.GetPowerTable(ctx, tsk) +} + +func (f3api *F3API) F3GetF3PowerTable(ctx context.Context, tsk types.TipSetKey) (gpbft.PowerEntries, error) { + if f3api.F3 == nil { + return nil, ErrF3Disabled + } + return f3api.F3.GetF3PowerTable(ctx, tsk) +} diff --git a/node/impl/full/state.go b/node/impl/full/state.go index 49e97805573..312d30ee315 100644 --- a/node/impl/full/state.go +++ b/node/impl/full/state.go @@ -1962,7 +1962,7 @@ func (a *StateAPI) StateGetNetworkParams(ctx context.Context) (*api.NetworkParam UpgradeWatermelonHeight: build.UpgradeWatermelonHeight, UpgradeDragonHeight: build.UpgradeDragonHeight, UpgradePhoenixHeight: build.UpgradePhoenixHeight, - UpgradeAussieHeight: build.UpgradeAussieHeight, + UpgradeWaffleHeight: build.UpgradeWaffleHeight, }, }, nil } diff --git a/node/modules/actorevent.go b/node/modules/actorevent.go index 78ac5b18b84..34080dbae23 100644 --- a/node/modules/actorevent.go +++ b/node/modules/actorevent.go @@ -138,11 +138,11 @@ func EventFilterManager(cfg config.EventsConfig) func(helpers.MetricsCtx, repo.L } actor, err := sm.LoadActor(ctx, idAddr, ts) - if err != nil || actor.Address == nil { + if err != nil || actor.DelegatedAddress == nil { return idAddr, true } - return *actor.Address, true + return *actor.DelegatedAddress, true }, MaxFilterResults: cfg.MaxFilterResults, diff --git a/node/modules/lp2p/host.go b/node/modules/lp2p/host.go index 405bb869241..66256df521e 100644 --- a/node/modules/lp2p/host.go +++ b/node/modules/lp2p/host.go @@ -4,10 +4,10 @@ import ( "context" "fmt" - nilrouting "github.com/ipfs/boxo/routing/none" "github.com/libp2p/go-libp2p" dht "github.com/libp2p/go-libp2p-kad-dht" record "github.com/libp2p/go-libp2p-record" + routinghelpers "github.com/libp2p/go-libp2p-routing-helpers" "github.com/libp2p/go-libp2p/core/host" "github.com/libp2p/go-libp2p/core/peer" "github.com/libp2p/go-libp2p/core/peerstore" @@ -115,7 +115,7 @@ func DHTRouting(mode dht.ModeOpt) interface{} { } func NilRouting(mctx helpers.MetricsCtx) (BaseIpfsRouting, error) { - return nilrouting.ConstructNilRouting(mctx, nil, nil, nil) + return &routinghelpers.Null{}, nil } func RoutedHost(rh RawHost, r BaseIpfsRouting) host.Host { diff --git a/node/modules/lp2p/pubsub.go b/node/modules/lp2p/pubsub.go index 408ab17a63e..67dcb5134a7 100644 --- a/node/modules/lp2p/pubsub.go +++ b/node/modules/lp2p/pubsub.go @@ -3,6 +3,7 @@ package lp2p import ( "context" "encoding/json" + "fmt" "net" "time" @@ -16,6 +17,9 @@ import ( "go.uber.org/fx" "golang.org/x/xerrors" + "github.com/filecoin-project/go-f3/gpbft" + "github.com/filecoin-project/go-f3/manifest" + "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/metrics" "github.com/filecoin-project/lotus/node/config" @@ -44,6 +48,12 @@ const ( GraylistScoreThreshold = -2500 AcceptPXScoreThreshold = 1000 OpportunisticGraftScoreThreshold = 3.5 + + // Determines the max. number of configuration changes + // that are allowed for the dynamic manifest. + // If the manifest changes more than this number, the F3 + // message topic will be filtered + MaxDynamicManifestChangesAllowed = 1000 ) func ScoreKeeper() *dtypes.ScoreKeeper { @@ -378,6 +388,32 @@ func GossipSub(in GossipIn) (service *pubsub.PubSub, err error) { build.MessagesTopic(in.Nn), build.IndexerIngestTopic(in.Nn), } + + if build.IsF3Enabled() { + f3TopicName := manifest.PubSubTopicFromNetworkName(gpbft.NetworkName(in.Nn)) + allowTopics = append(allowTopics, f3TopicName) + + // allow dynamic manifest topic and the new topic names after a reconfiguration. + // Note: This is pretty ugly, but I tried to use a regex subscription filter + // as the commented code below, but unfortunately it overwrites previous filters. A simple fix would + // be to allow combining several topic filters, but for now this works. + // + // pattern := fmt.Sprintf(`^\/f3\/%s\/0\.0\.1\/?[0-9]*$`, in.Nn) + // rx, err := regexp.Compile(pattern) + // if err != nil { + // return nil, xerrors.Errorf("failed to compile manifest topic regex: %w", err) + // } + // options = append(options, + // pubsub.WithSubscriptionFilter( + // pubsub.WrapLimitSubscriptionFilter( + // pubsub.NewRegexpSubscriptionFilter(rx), + // 100))) + allowTopics = append(allowTopics, manifest.ManifestPubSubTopicName) + for i := 0; i < MaxDynamicManifestChangesAllowed; i++ { + allowTopics = append(allowTopics, f3TopicName+"/"+fmt.Sprintf("%d", i)) + } + } + allowTopics = append(allowTopics, drandTopics...) options = append(options, pubsub.WithSubscriptionFilter( diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index 01f293b8f4a..04a0a53768c 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -10,6 +10,7 @@ import ( "github.com/google/uuid" "github.com/ipfs/go-datastore" "github.com/ipfs/go-datastore/namespace" + "github.com/jpillora/backoff" "go.uber.org/fx" "go.uber.org/multierr" "golang.org/x/xerrors" @@ -32,6 +33,7 @@ import ( "github.com/filecoin-project/lotus/journal" lotusminer "github.com/filecoin-project/lotus/miner" "github.com/filecoin-project/lotus/node/config" + "github.com/filecoin-project/lotus/node/impl/full" "github.com/filecoin-project/lotus/node/modules/dtypes" "github.com/filecoin-project/lotus/node/modules/helpers" "github.com/filecoin-project/lotus/node/repo" @@ -351,6 +353,81 @@ func SectorStorage(mctx helpers.MetricsCtx, lc fx.Lifecycle, lstor *paths.Local, return sst, nil } +func F3Participation(mctx helpers.MetricsCtx, lc fx.Lifecycle, api v1api.FullNode, minerAddress dtypes.MinerAddress) error { + ctx := helpers.LifecycleCtx(mctx, lc) + b := &backoff.Backoff{ + Min: 1 * time.Second, + Max: 1 * time.Minute, + Factor: 1.5, + Jitter: false, + } + go func() { + timer := time.NewTimer(0) + defer timer.Stop() + + if !timer.Stop() { + <-timer.C + } + + leaseTime := 120 * time.Second + // start with some time in the past + oldLease := time.Now().Add(-24 * time.Hour) + + for ctx.Err() == nil { + newLease := time.Now().Add(leaseTime) + + ok, err := api.F3Participate(ctx, address.Address(minerAddress), newLease, oldLease) + + if ctx.Err() != nil { + return + } + if errors.Is(err, full.ErrF3Disabled) { + log.Errorf("Cannot participate in F3 as it is disabled: %+v", err) + return + } + if err != nil { + log.Errorf("while starting to participate in F3: %+v", err) + // use exponential backoff to avoid hotloop + timer.Reset(b.Duration()) + select { + case <-ctx.Done(): + return + case <-timer.C: + } + continue + } + if !ok { + log.Errorf("lotus node refused our lease, are you loadbalancing or did the miner just restart?") + + sleepFor := b.Duration() + if d := time.Until(oldLease); d > 0 && d < sleepFor { + sleepFor = d + } + timer.Reset(sleepFor) + select { + case <-ctx.Done(): + return + case <-timer.C: + } + continue + } + + // we have succeeded in giving a lease, reset the backoff + b.Reset() + + oldLease = newLease + // wait for the half of the lease time and then refresh + timer.Reset(leaseTime / 2) + select { + case <-ctx.Done(): + return + case <-timer.C: + } + } + }() + return nil +} + func StorageAuth(ctx helpers.MetricsCtx, ca v0api.Common) (sealer.StorageAuth, error) { token, err := ca.AuthNew(ctx, []auth.Permission{"admin"}) if err != nil { diff --git a/scripts/publish-checksums.sh b/scripts/publish-checksums.sh new file mode 100755 index 00000000000..ff80f388bdc --- /dev/null +++ b/scripts/publish-checksums.sh @@ -0,0 +1,87 @@ +#!/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 + +if [[ "$GITHUB_REF" != refs/tags/* ]]; then + echo "$GITHUB_REF is not a tag, 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 + +GITHUB_TAG="${GITHUB_REF#refs/tags/}" + +#see if the release already exists by tag +RELEASE_RESPONSE=` + curl \ + --fail \ + --header "Authorization: token ${GITHUB_TOKEN}" \ + "https://api.github.com/repos/${GITHUB_REPOSITORY}/releases/tags/${GITHUB_TAG}" +` +RELEASE_ID=`echo "${RELEASE_RESPONSE}" | jq '.id'` + +if [ "${RELEASE_ID}" = "null" ]; then + echo "creating release" + + COND_CREATE_DISCUSSION="" + PRERELEASE=true + if [[ ${GITHUB_TAG} =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + COND_CREATE_DISCUSSION="\"discussion_category_name\": \"announcement\"," + PRERELEASE=false + fi + + RELEASE_DATA="{ + \"tag_name\": \"${GITHUB_TAG}\", + \"target_commitish\": \"${GITHUB_SHA}\", + ${COND_CREATE_DISCUSSION} + \"name\": \"${GITHUB_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/${GITHUB_REPOSITORY}/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 diff --git a/scripts/version-check.sh b/scripts/version-check.sh new file mode 100755 index 00000000000..4099c800ebb --- /dev/null +++ b/scripts/version-check.sh @@ -0,0 +1,39 @@ +#!/usr/bin/env bash +set -ex + +# Validate lotus version matches the current tag +# $1 - lotus path to execute +# $2 - lotus git tag for this release +function validate_lotus_version_matches_tag(){ + # sanity checks + if [[ $# != 2 ]]; then + echo "expected 2 args for validate_lotus_version, got ${$#}" + exit 100 + fi + + # extract version from `lotus --version` response + lotus_path=$1 + # get version + lotus_raw_version=`${lotus_path} --version` + # grep for version string + lotus_actual_version=`echo ${lotus_raw_version} | grep -oE '[0-9]+\.[0-9]+\.[0-9]+'` + + # trim leading 'v' + tag=${2#v} + # trim possible -rc[0-9] + expected_version=${tag%-*} + + # check the versions are consistent + if [[ ${expected_version} != ${lotus_actual_version} ]]; then + echo "lotus version does not match build tag" + exit 101 + fi +} + +_lotus_path=$1 + +if [[ "$GITHUB_REF" == refs/tags/* ]]; then + validate_lotus_version_matches_tag "${_lotus_path}" "${GITHUB_REF#refs/tags/}" +else + echo "$GITHUB_REF is not a tag, skipping version check" +fi diff --git a/storage/sealer/proofpaths/cachefiles.go b/storage/sealer/proofpaths/cachefiles.go index cbb6839ce95..b50d94ec6f7 100644 --- a/storage/sealer/proofpaths/cachefiles.go +++ b/storage/sealer/proofpaths/cachefiles.go @@ -39,15 +39,15 @@ func LayerFileName(layer int) string { func SDRLayers(spt abi.RegisteredSealProof) (int, error) { switch spt { - case abi.RegisteredSealProof_StackedDrg2KiBV1, abi.RegisteredSealProof_StackedDrg2KiBV1_1, abi.RegisteredSealProof_StackedDrg2KiBV1_1_Feat_SyntheticPoRep: + case abi.RegisteredSealProof_StackedDrg2KiBV1, abi.RegisteredSealProof_StackedDrg2KiBV1_1, abi.RegisteredSealProof_StackedDrg2KiBV1_1_Feat_SyntheticPoRep, abi.RegisteredSealProof_StackedDrg2KiBV1_2_Feat_NiPoRep: return 2, nil - case abi.RegisteredSealProof_StackedDrg8MiBV1, abi.RegisteredSealProof_StackedDrg8MiBV1_1, abi.RegisteredSealProof_StackedDrg8MiBV1_1_Feat_SyntheticPoRep: + case abi.RegisteredSealProof_StackedDrg8MiBV1, abi.RegisteredSealProof_StackedDrg8MiBV1_1, abi.RegisteredSealProof_StackedDrg8MiBV1_1_Feat_SyntheticPoRep, abi.RegisteredSealProof_StackedDrg8MiBV1_2_Feat_NiPoRep: return 2, nil - case abi.RegisteredSealProof_StackedDrg512MiBV1, abi.RegisteredSealProof_StackedDrg512MiBV1_1, abi.RegisteredSealProof_StackedDrg512MiBV1_1_Feat_SyntheticPoRep: + case abi.RegisteredSealProof_StackedDrg512MiBV1, abi.RegisteredSealProof_StackedDrg512MiBV1_1, abi.RegisteredSealProof_StackedDrg512MiBV1_1_Feat_SyntheticPoRep, abi.RegisteredSealProof_StackedDrg512MiBV1_2_Feat_NiPoRep: return 2, nil - case abi.RegisteredSealProof_StackedDrg32GiBV1, abi.RegisteredSealProof_StackedDrg32GiBV1_1, abi.RegisteredSealProof_StackedDrg32GiBV1_1_Feat_SyntheticPoRep: + case abi.RegisteredSealProof_StackedDrg32GiBV1, abi.RegisteredSealProof_StackedDrg32GiBV1_1, abi.RegisteredSealProof_StackedDrg32GiBV1_1_Feat_SyntheticPoRep, abi.RegisteredSealProof_StackedDrg32GiBV1_2_Feat_NiPoRep: return 11, nil - case abi.RegisteredSealProof_StackedDrg64GiBV1, abi.RegisteredSealProof_StackedDrg64GiBV1_1, abi.RegisteredSealProof_StackedDrg64GiBV1_1_Feat_SyntheticPoRep: + case abi.RegisteredSealProof_StackedDrg64GiBV1, abi.RegisteredSealProof_StackedDrg64GiBV1_1, abi.RegisteredSealProof_StackedDrg64GiBV1_1_Feat_SyntheticPoRep, abi.RegisteredSealProof_StackedDrg64GiBV1_2_Feat_NiPoRep: return 11, nil default: return 0, fmt.Errorf("unsupported proof type: %v", spt)