diff --git a/.circleci/config.yml b/.circleci/config.yml index 2e1b4282ac..1198c82f34 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -72,7 +72,7 @@ commands: executors: golang: docker: - - image: cimg/go:1.21.7 + - image: cimg/go:1.22.8 jobs: test_all: diff --git a/.github/workflows/baisc_checks.yml b/.github/workflows/baisc_checks.yml index 500d934156..521efd4f84 100644 --- a/.github/workflows/baisc_checks.yml +++ b/.github/workflows/baisc_checks.yml @@ -18,7 +18,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: '1.21' + go-version: '1.22' cache: true - name: install deps diff --git a/.github/workflows/common_build_upload.yml b/.github/workflows/common_build_upload.yml index 320da92032..673c5f524d 100644 --- a/.github/workflows/common_build_upload.yml +++ b/.github/workflows/common_build_upload.yml @@ -108,7 +108,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: '1.21' + go-version: '1.22' cache: true - name: install deps @@ -237,7 +237,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: '1.21' + go-version: '1.22' cache: true - name: install more deps diff --git a/.github/workflows/common_go.yml b/.github/workflows/common_go.yml index dc77bee057..deac662e6c 100644 --- a/.github/workflows/common_go.yml +++ b/.github/workflows/common_go.yml @@ -27,7 +27,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: '1.21' + go-version: '1.22' cache: true - name: vars diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index fe3453e826..23095f2bbd 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -21,7 +21,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: '1.21' + go-version: '1.22' cache: true - name: install deps diff --git a/app/node/builder.go b/app/node/builder.go index 19874d5d5a..a0bce3e2ee 100644 --- a/app/node/builder.go +++ b/app/node/builder.go @@ -137,7 +137,7 @@ func (b *Builder) build(ctx context.Context) (*Node, error) { return nil, errors.Wrap(err, "failed to build node.wallet") } - nd.f3, err = f3.NewF3Submodule(ctx, nd.repo, nd.chain, nd.network, nd.wallet.API()) + nd.f3, err = f3.NewF3Submodule(ctx, nd.repo, nd.chain, nd.network, nd.wallet.GetWalletSign(), nd.syncer) if err != nil { return nil, errors.Wrap(err, "failed to build node.f3") } diff --git a/app/node/node.go b/app/node/node.go index 12c4d66dfc..a1582e8401 100644 --- a/app/node/node.go +++ b/app/node/node.go @@ -249,6 +249,12 @@ func (node *Node) Stop(ctx context.Context) { log.Warnf("error shutdown jaeger-tracing: %w", err) } } + + node.Wallet().WalletGateway.Close() + + if err := node.f3.Stop(ctx); err != nil { + log.Warnf("error closing f3: %w", err) + } } // RunRPCAndWait start rpc server and listen to signal to exit diff --git a/app/submodule/chain/chaininfo_api.go b/app/submodule/chain/chaininfo_api.go index 61fcdbb0b0..b2fc4acbbb 100644 --- a/app/submodule/chain/chaininfo_api.go +++ b/app/submodule/chain/chaininfo_api.go @@ -349,6 +349,21 @@ func (cia *chainInfoAPI) VerifyEntry(parent, child *types.BeaconEntry, height ab // the entry has not yet been produced, the call will block until the entry // becomes available func (cia *chainInfoAPI) StateGetBeaconEntry(ctx context.Context, epoch abi.ChainEpoch) (*types.BeaconEntry, error) { + ts := cia.chain.ChainReader.GetHead() + if epoch <= ts.Height() { + if epoch < 0 { + epoch = 0 + } + // get the beacon entry off the chain + ts, err := cia.chain.ChainReader.GetTipSet(ctx, types.EmptyTSK) + if err != nil { + return nil, err + } + r := chain.NewChainRandomnessSource(cia.chain.ChainReader, ts.Key(), cia.chain.Drand, cia.chain.Fork.GetNetworkVersion) + return r.GetBeaconEntry(ctx, epoch) + } + + // else we're asking for the future, get it from drand and block until it arrives b := cia.chain.Drand.BeaconForEpoch(epoch) nv := cia.chain.Fork.GetNetworkVersion(ctx, epoch) rr := b.MaxBeaconRoundForEpoch(nv, epoch) @@ -745,6 +760,7 @@ func (cia *chainInfoAPI) StateGetNetworkParams(ctx context.Context) (*types.Netw UpgradeDragonHeight: cfg.NetworkParams.ForkUpgradeParam.UpgradeDragonHeight, UpgradePhoenixHeight: cfg.NetworkParams.ForkUpgradeParam.UpgradePhoenixHeight, UpgradeWaffleHeight: cfg.NetworkParams.ForkUpgradeParam.UpgradeWaffleHeight, + UpgradeTuktukHeight: cfg.NetworkParams.ForkUpgradeParam.UpgradeTuktukHeight, }, Eip155ChainID: cfg.NetworkParams.Eip155ChainID, } diff --git a/app/submodule/chain/miner_api.go b/app/submodule/chain/miner_api.go index 6817d2fa4f..6128633299 100644 --- a/app/submodule/chain/miner_api.go +++ b/app/submodule/chain/miner_api.go @@ -32,7 +32,7 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors/builtin" _init "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" "github.com/filecoin-project/venus/venus-shared/actors/builtin/market" - lminer "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" + "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" "github.com/filecoin-project/venus/venus-shared/actors/builtin/power" "github.com/filecoin-project/venus/venus-shared/actors/builtin/reward" "github.com/filecoin-project/venus/venus-shared/actors/builtin/verifreg" @@ -80,7 +80,7 @@ func (msa *minerStateAPI) StateSectorPreCommitInfo(ctx context.Context, maddr ad // NOTE: returned info.Expiration may not be accurate in some cases, use StateSectorExpiration to get accurate // expiration epoch // return nil if sector not found -func (msa *minerStateAPI) StateSectorGetInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (*lminer.SectorOnChainInfo, error) { +func (msa *minerStateAPI) StateSectorGetInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorOnChainInfo, error) { _, view, err := msa.Stmgr.ParentStateViewTsk(ctx, tsk) if err != nil { return nil, fmt.Errorf("loading tipset %s: %v", tsk, err) @@ -90,7 +90,7 @@ func (msa *minerStateAPI) StateSectorGetInfo(ctx context.Context, maddr address. } // StateSectorPartition finds deadline/partition with the specified sector -func (msa *minerStateAPI) StateSectorPartition(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk types.TipSetKey) (*lminer.SectorLocation, error) { +func (msa *minerStateAPI) StateSectorPartition(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorLocation, error) { _, view, err := msa.Stmgr.ParentStateViewTsk(ctx, tsk) if err != nil { return nil, fmt.Errorf("loadParentStateViewTsk(%s) failed:%v", tsk.String(), err) @@ -188,7 +188,7 @@ func (msa *minerStateAPI) StateMinerRecoveries(ctx context.Context, maddr addres return bitfield.BitField{}, fmt.Errorf("failed to load miner actor state: %v", err) } - return lminer.AllPartSectors(mas, lminer.Partition.RecoveringSectors) + return miner.AllPartSectors(mas, miner.Partition.RecoveringSectors) } // StateMinerFaults returns a bitfield indicating the faulty sectors of the given miner @@ -203,7 +203,7 @@ func (msa *minerStateAPI) StateMinerFaults(ctx context.Context, maddr address.Ad return bitfield.BitField{}, fmt.Errorf("failed to load miner actor state: %v", err) } - return lminer.AllPartSectors(mas, lminer.Partition.FaultySectors) + return miner.AllPartSectors(mas, miner.Partition.FaultySectors) } func (msa *minerStateAPI) StateAllMinerFaults(ctx context.Context, lookback abi.ChainEpoch, endTsk types.TipSetKey) ([]*types.Fault, error) { @@ -253,7 +253,7 @@ func (msa *minerStateAPI) StateMinerPartitions(ctx context.Context, maddr addres } var out []types.Partition - err = dl.ForEachPartition(func(_ uint64, part lminer.Partition) error { + err = dl.ForEachPartition(func(_ uint64, part miner.Partition) error { allSectors, err := part.AllSectors() if err != nil { return fmt.Errorf("getting AllSectors: %v", err) @@ -310,7 +310,7 @@ func (msa *minerStateAPI) StateMinerDeadlines(ctx context.Context, maddr address } out := make([]types.Deadline, deadlines) - if err := mas.ForEachDeadline(func(i uint64, dl lminer.Deadline) error { + if err := mas.ForEachDeadline(func(i uint64, dl miner.Deadline) error { ps, err := dl.PartitionsPoSted() if err != nil { return err @@ -333,7 +333,7 @@ func (msa *minerStateAPI) StateMinerDeadlines(ctx context.Context, maddr address } // StateMinerSectors returns info about the given miner's sectors. If the filter bitfield is nil, all sectors are included. -func (msa *minerStateAPI) StateMinerSectors(ctx context.Context, maddr address.Address, sectorNos *bitfield.BitField, tsk types.TipSetKey) ([]*lminer.SectorOnChainInfo, error) { +func (msa *minerStateAPI) StateMinerSectors(ctx context.Context, maddr address.Address, sectorNos *bitfield.BitField, tsk types.TipSetKey) ([]*miner.SectorOnChainInfo, error) { _, view, err := msa.Stmgr.ParentStateViewTsk(ctx, tsk) if err != nil { return nil, fmt.Errorf("Stmgr.ParentStateViewTsk failed:%v", err) @@ -715,6 +715,57 @@ var ( initialPledgeDen = big.NewInt(100) ) +func (msa *minerStateAPI) calculateSectorWeight(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, height abi.ChainEpoch, state *tree.State) (abi.StoragePower, error) { + ssize, err := pci.SealProof.SectorSize() + if err != nil { + return types.EmptyInt, fmt.Errorf("failed to resolve sector size for seal proof: %w", err) + } + + store := msa.ChainReader.Store(ctx) + + var sectorWeight abi.StoragePower + if act, found, err := state.GetActor(ctx, market.Address); err != nil { + return types.EmptyInt, fmt.Errorf("loading market actor: %w", err) + } else if !found { + return types.EmptyInt, fmt.Errorf("market actor not found") + } else if s, err := market.Load(store, act); err != nil { + return types.EmptyInt, fmt.Errorf("loading market actor state: %w", err) + } else if w, vw, err := s.VerifyDealsForActivation(maddr, pci.DealIDs, height, pci.Expiration); err != nil { + return types.EmptyInt, fmt.Errorf("verifying deals for activation: %w", err) + } else { + // NB: not exactly accurate, but should always lead us to *over* estimate, not under + duration := pci.Expiration - height + sectorWeight = builtin.QAPowerForWeight(ssize, duration, w, vw) + } + + return sectorWeight, nil +} + +func (msa *minerStateAPI) pledgeCalculationInputs(ctx context.Context, state tree.Tree) (abi.TokenAmount, *builtin.FilterEstimate, error) { + store := msa.ChainReader.Store(ctx) + + var ( + powerSmoothed builtin.FilterEstimate + pledgeCollateral abi.TokenAmount + ) + if act, found, err := state.GetActor(ctx, power.Address); err != nil { + return types.EmptyInt, nil, fmt.Errorf("loading power actor: %w", err) + } else if !found { + return types.EmptyInt, nil, fmt.Errorf("power actor not found") + } else if s, err := power.Load(store, act); err != nil { + return types.EmptyInt, nil, fmt.Errorf("loading power actor state: %w", err) + } else if p, err := s.TotalPowerSmoothed(); err != nil { + return types.EmptyInt, nil, fmt.Errorf("failed to determine total power: %w", err) + } else if c, err := s.TotalLocked(); err != nil { + return types.EmptyInt, nil, fmt.Errorf("failed to determine pledge collateral: %w", err) + } else { + powerSmoothed = p + pledgeCollateral = c + } + + return pledgeCollateral, &powerSmoothed, nil +} + // StateMinerPreCommitDepositForPower returns the precommit deposit for the specified miner's sector func (msa *minerStateAPI) StateMinerPreCommitDepositForPower(ctx context.Context, maddr address.Address, pci types.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) { ts, err := msa.ChainReader.GetTipSet(ctx, tsk) @@ -728,56 +779,35 @@ func (msa *minerStateAPI) StateMinerPreCommitDepositForPower(ctx context.Context return big.Int{}, fmt.Errorf("ParentState failed:%v", err) } - ssize, err := pci.SealProof.SectorSize() + rewardActor, found, err := sTree.GetActor(ctx, reward.Address) if err != nil { - return big.Int{}, fmt.Errorf("failed to get resolve size: %v", err) + return types.EmptyInt, fmt.Errorf("loading reward actor: %w", err) } - - store := msa.ChainReader.Store(ctx) - var sectorWeight abi.StoragePower - if msa.Fork.GetNetworkVersion(ctx, ts.Height()) <= network.Version16 { - if act, found, err := sTree.GetActor(ctx, market.Address); err != nil || !found { - return big.Int{}, fmt.Errorf("loading market actor %s: %v", maddr, err) - } else if s, err := market.Load(store, act); err != nil { - return big.Int{}, fmt.Errorf("loading market actor state %s: %v", maddr, err) - } else if w, vw, err := s.VerifyDealsForActivation(maddr, pci.DealIDs, ts.Height(), pci.Expiration); err != nil { - return big.Int{}, fmt.Errorf("verifying deals for activation: %v", err) - } else { - // NB: not exactly accurate, but should always lead us to *over* estimate, not under - duration := pci.Expiration - ts.Height() - sectorWeight = builtin.QAPowerForWeight(ssize, duration, w, vw) - } - } else { - sectorWeight = types.QAPowerMax(ssize) + if !found { + return types.EmptyInt, fmt.Errorf("reward actor not found") } - var powerSmoothed builtin.FilterEstimate - if act, found, err := sTree.GetActor(ctx, power.Address); err != nil || !found { - return big.Int{}, fmt.Errorf("loading power actor: %v", err) - } else if s, err := power.Load(store, act); err != nil { - return big.Int{}, fmt.Errorf("loading power actor state: %v", err) - } else if p, err := s.TotalPowerSmoothed(); err != nil { - return big.Int{}, fmt.Errorf("failed to determine total power: %v", err) - } else { - powerSmoothed = p + rewardState, err := reward.Load(msa.ChainReader.Store(ctx), rewardActor) + if err != nil { + return types.EmptyInt, fmt.Errorf("loading reward actor state: %w", err) } - rewardActor, found, err := sTree.GetActor(ctx, reward.Address) - if err != nil || !found { - return big.Int{}, fmt.Errorf("loading miner actor: %v", err) + sectorWeight, err := msa.calculateSectorWeight(ctx, maddr, pci, ts.Height(), sTree) + if err != nil { + return types.EmptyInt, err } - rewardState, err := reward.Load(store, rewardActor) + _, powerSmoothed, err := msa.pledgeCalculationInputs(ctx, sTree) if err != nil { - return big.Int{}, fmt.Errorf("loading reward actor state: %v", err) + return types.EmptyInt, err } - deposit, err := rewardState.PreCommitDepositForPower(powerSmoothed, sectorWeight) + deposit, err := rewardState.PreCommitDepositForPower(*powerSmoothed, sectorWeight) if err != nil { - return big.Zero(), fmt.Errorf("calculating precommit deposit: %v", err) + return types.EmptyInt, fmt.Errorf("calculating precommit deposit: %w", err) } - return big.Div(big.Mul(deposit, initialPledgeNum), initialPledgeDen), nil + return types.BigDiv(types.BigMul(deposit, initialPledgeNum), initialPledgeDen), nil } // StateMinerInitialPledgeCollateral returns the initial pledge collateral for the specified miner's sector @@ -792,68 +822,133 @@ func (msa *minerStateAPI) StateMinerInitialPledgeCollateral(ctx context.Context, return big.Int{}, fmt.Errorf("loading tipset(%s) parent state failed: %v", tsk, err) } - ssize, err := pci.SealProof.SectorSize() + rewardActor, found, err := state.GetActor(ctx, reward.Address) if err != nil { - return big.Int{}, fmt.Errorf("failed to get resolve size: %v", err) + return types.EmptyInt, fmt.Errorf("loading reward actor: %w", err) + } + if !found { + return types.EmptyInt, fmt.Errorf("reward actor not found") } - store := msa.ChainReader.Store(ctx) - var sectorWeight abi.StoragePower - if act, found, err := state.GetActor(ctx, market.Address); err != nil || !found { - return big.Int{}, fmt.Errorf("loading miner actor %s: %v", maddr, err) - } else if s, err := market.Load(store, act); err != nil { - return big.Int{}, fmt.Errorf("loading market actor state %s: %v", maddr, err) - } else if w, vw, err := s.VerifyDealsForActivation(maddr, pci.DealIDs, ts.Height(), pci.Expiration); err != nil { - return big.Int{}, fmt.Errorf("verifying deals for activation: %v", err) - } else { - // NB: not exactly accurate, but should always lead us to *over* estimate, not under - duration := pci.Expiration - ts.Height() - sectorWeight = builtin.QAPowerForWeight(ssize, duration, w, vw) + rewardState, err := reward.Load(msa.ChainReader.Store(ctx), rewardActor) + if err != nil { + return types.EmptyInt, fmt.Errorf("loading reward actor state: %w", err) } - var ( - powerSmoothed builtin.FilterEstimate - pledgeCollateral abi.TokenAmount + sectorWeight, err := msa.calculateSectorWeight(ctx, maddr, pci, ts.Height(), state) + if err != nil { + return types.EmptyInt, err + } + + pledgeCollateral, powerSmoothed, err := msa.pledgeCalculationInputs(ctx, state) + if err != nil { + return types.EmptyInt, err + } + + circSupply, err := msa.StateVMCirculatingSupplyInternal(ctx, ts.Key()) + if err != nil { + return types.EmptyInt, fmt.Errorf("getting circulating supply: %w", err) + } + + epochsSinceRampStart, rampDurationEpochs, err := msa.getPledgeRampParams(ctx, ts.Height(), state) + if err != nil { + return types.EmptyInt, fmt.Errorf("getting pledge ramp params: %w", err) + } + + initialPledge, err := rewardState.InitialPledgeForPower( + sectorWeight, + pledgeCollateral, + powerSmoothed, + circSupply.FilCirculating, + epochsSinceRampStart, + rampDurationEpochs, ) - if act, found, err := state.GetActor(ctx, power.Address); err != nil || !found { - return big.Int{}, fmt.Errorf("loading miner actor: %v", err) - } else if s, err := power.Load(store, act); err != nil { - return big.Int{}, fmt.Errorf("loading power actor state: %v", err) - } else if p, err := s.TotalPowerSmoothed(); err != nil { - return big.Int{}, fmt.Errorf("failed to determine total power: %v", err) - } else if c, err := s.TotalLocked(); err != nil { - return big.Int{}, fmt.Errorf("failed to determine pledge collateral: %v", err) - } else { - powerSmoothed = p - pledgeCollateral = c + if err != nil { + return types.EmptyInt, fmt.Errorf("calculating initial pledge: %w", err) + } + + return types.BigDiv(types.BigMul(initialPledge, initialPledgeNum), initialPledgeDen), nil +} + +// getPledgeRampParams returns epochsSinceRampStart, rampDurationEpochs, or 0, 0 if the pledge ramp is not active. +func (msa *minerStateAPI) getPledgeRampParams(ctx context.Context, height abi.ChainEpoch, state tree.Tree) (int64, uint64, error) { + if powerActor, found, err := state.GetActor(ctx, power.Address); err != nil { + return 0, 0, fmt.Errorf("loading power actor: %w", err) + } else if !found { + return 0, 0, fmt.Errorf("power actor not found") + } else if powerState, err := power.Load(msa.ChainReader.Store(ctx), powerActor); err != nil { + return 0, 0, fmt.Errorf("loading power actor state: %w", err) + } else if powerState.RampStartEpoch() > 0 { + return int64(height) - powerState.RampStartEpoch(), powerState.RampDurationEpochs(), nil + } + return 0, 0, nil +} + +func (msa *minerStateAPI) StateMinerInitialPledgeForSector(ctx context.Context, sectorDuration abi.ChainEpoch, sectorSize abi.SectorSize, verifiedSize uint64, tsk types.TipSetKey) (types.BigInt, error) { + if sectorDuration <= 0 { + return types.EmptyInt, fmt.Errorf("sector duration must greater than 0") + } + if sectorSize == 0 { + return types.EmptyInt, fmt.Errorf("sector size must be non-zero") + } + if verifiedSize > uint64(sectorSize) { + return types.EmptyInt, fmt.Errorf("verified size must be less than or equal to sector size") + } + + ts, err := msa.ChainReader.GetTipSet(ctx, tsk) + if err != nil { + return types.EmptyInt, fmt.Errorf("loading tipset %s: %w", tsk, err) + } + + _, state, err := msa.Stmgr.ParentState(ctx, ts) + if err != nil { + return big.Int{}, fmt.Errorf("loading tipset(%s) parent state failed: %v", tsk, err) } rewardActor, found, err := state.GetActor(ctx, reward.Address) - if err != nil || !found { - return big.Int{}, fmt.Errorf("loading miner actor: %v", err) + if err != nil { + return types.EmptyInt, fmt.Errorf("loading reward actor: %w", err) + } + if !found { + return types.EmptyInt, fmt.Errorf("reward actor not found") } - rewardState, err := reward.Load(store, rewardActor) + rewardState, err := reward.Load(msa.ChainReader.Store(ctx), rewardActor) if err != nil { - return big.Int{}, fmt.Errorf("loading reward actor state: %v", err) + return types.EmptyInt, fmt.Errorf("loading reward actor state: %w", err) } circSupply, err := msa.StateVMCirculatingSupplyInternal(ctx, ts.Key()) if err != nil { - return big.Zero(), fmt.Errorf("getting circulating supply: %v", err) + return types.EmptyInt, fmt.Errorf("getting circulating supply: %w", err) + } + + pledgeCollateral, powerSmoothed, err := msa.pledgeCalculationInputs(ctx, state) + if err != nil { + return types.EmptyInt, err + } + + verifiedWeight := big.Mul(big.NewIntUnsigned(verifiedSize), big.NewInt(int64(sectorDuration))) + sectorWeight := builtin.QAPowerForWeight(sectorSize, sectorDuration, big.Zero(), verifiedWeight) + + epochsSinceRampStart, rampDurationEpochs, err := msa.getPledgeRampParams(ctx, ts.Height(), state) + if err != nil { + return types.EmptyInt, fmt.Errorf("getting pledge ramp params: %w", err) } initialPledge, err := rewardState.InitialPledgeForPower( sectorWeight, pledgeCollateral, - &powerSmoothed, + powerSmoothed, circSupply.FilCirculating, + epochsSinceRampStart, + rampDurationEpochs, ) if err != nil { - return big.Zero(), fmt.Errorf("calculating initial pledge: %v", err) + return types.EmptyInt, fmt.Errorf("calculating initial pledge: %w", err) } - return big.Div(big.Mul(initialPledge, initialPledgeNum), initialPledgeDen), nil + return types.BigDiv(types.BigMul(initialPledge, initialPledgeNum), initialPledgeDen), nil } // StateVMCirculatingSupplyInternal returns an approximation of the circulating supply of Filecoin at the given tipset. @@ -910,7 +1005,7 @@ func (msa *minerStateAPI) StateMarketDeals(ctx context.Context, tsk types.TipSet } // StateMinerActiveSectors returns info about sectors that a given miner is actively proving. -func (msa *minerStateAPI) StateMinerActiveSectors(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]*lminer.SectorOnChainInfo, error) { // TODO: only used in cli +func (msa *minerStateAPI) StateMinerActiveSectors(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]*miner.SectorOnChainInfo, error) { // TODO: only used in cli _, view, err := msa.Stmgr.ParentStateViewTsk(ctx, tsk) if err != nil { return nil, fmt.Errorf("Stmgr.ParentStateViewTsk failed:%v", err) @@ -1035,7 +1130,7 @@ func (msa *minerStateAPI) StateMinerAvailableBalance(ctx context.Context, maddr } // StateSectorExpiration returns epoch at which given sector will expire -func (msa *minerStateAPI) StateSectorExpiration(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk types.TipSetKey) (*lminer.SectorExpiration, error) { +func (msa *minerStateAPI) StateSectorExpiration(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorExpiration, error) { _, view, err := msa.Stmgr.ParentStateViewTsk(ctx, tsk) if err != nil { return nil, fmt.Errorf("Stmgr.ParentStateViewTsk failed:%v", err) @@ -1057,8 +1152,8 @@ func (msa *minerStateAPI) StateMinerSectorCount(ctx context.Context, addr addres } var activeCount, liveCount, faultyCount uint64 - if err := mas.ForEachDeadline(func(_ uint64, dl lminer.Deadline) error { - return dl.ForEachPartition(func(_ uint64, part lminer.Partition) error { + if err := mas.ForEachDeadline(func(_ uint64, dl miner.Deadline) error { + return dl.ForEachPartition(func(_ uint64, part miner.Partition) error { if active, err := part.ActiveSectors(); err != nil { return err } else if count, err := active.Count(); err != nil { @@ -1414,7 +1509,7 @@ func (msa *minerStateAPI) StateMinerAllocated(ctx context.Context, addr address. if err != nil { return nil, err } - mas, err := lminer.Load(msa.ChainReader.Store(ctx), act) + mas, err := miner.Load(msa.ChainReader.Store(ctx), act) if err != nil { return nil, err } diff --git a/app/submodule/eth/eth_api.go b/app/submodule/eth/eth_api.go index ba30028c7c..4e7a23869b 100644 --- a/app/submodule/eth/eth_api.go +++ b/app/submodule/eth/eth_api.go @@ -34,6 +34,7 @@ import ( "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log/v2" cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" ) const maxEthFeeHistoryRewardPercentiles = 100 @@ -343,20 +344,35 @@ func (a *ethAPI) EthGetTransactionHashByCid(ctx context.Context, cid cid.Cid) (* func (a *ethAPI) EthGetTransactionCount(ctx context.Context, sender types.EthAddress, blkParam types.EthBlockNumberOrHash) (types.EthUint64, error) { addr, err := sender.ToFilecoinAddress() if err != nil { - return types.EthUint64(0), err + return types.EthUint64(0), xerrors.Errorf("invalid address: %w", err) + + } + // Handle "pending" block parameter separately + if blkParam.PredefinedBlock != nil && *blkParam.PredefinedBlock == "pending" { + nonce, err := a.mpool.MpoolGetNonce(ctx, addr) + if err != nil { + return types.EthUint64(0), xerrors.Errorf("failed to get nonce from mpool: %w", err) + } + return types.EthUint64(nonce), nil } + + // For all other cases, get the tipset based on the block parameter ts, err := getTipsetByEthBlockNumberOrHash(ctx, a.em.chainModule.ChainReader, blkParam) if err != nil { return types.EthUint64(0), fmt.Errorf("failed to process block param: %v, %w", blkParam, err) } - // First, handle the case where the "sender" is an EVM actor. - if actor, err := a.em.chainModule.Stmgr.GetActorAt(ctx, addr, ts); err != nil { + // Get the actor state at the specified tipset + actor, err := a.em.chainModule.Stmgr.GetActorAt(ctx, addr, ts) + if err != nil { if errors.Is(err, types.ErrActorNotFound) { return 0, nil } - return 0, fmt.Errorf("failed to lookup contract %s: %w", sender, err) - } else if builtinactors.IsEvmActor(actor.Code) { + return 0, xerrors.Errorf("failed to lookup actor %s: %w", sender, err) + } + + // Handle EVM actor case + if builtinactors.IsEvmActor(actor.Code) { evmState, err := builtinevm.Load(a.em.chainModule.ChainReader.Store(ctx), actor) if err != nil { return 0, fmt.Errorf("failed to load evm state: %w", err) @@ -370,11 +386,7 @@ func (a *ethAPI) EthGetTransactionCount(ctx context.Context, sender types.EthAdd return types.EthUint64(nonce), err } - nonce, err := a.em.mpoolModule.MPool.GetNonce(ctx, addr, ts.Key()) - if err != nil { - return types.EthUint64(0), err - } - return types.EthUint64(nonce), nil + return types.EthUint64(actor.Nonce), nil } func (a *ethAPI) EthGetTransactionReceipt(ctx context.Context, txHash types.EthHash) (*types.EthTxReceipt, error) { diff --git a/app/submodule/eth/eth_event_api.go b/app/submodule/eth/eth_event_api.go index 2d4e8c3f08..f18731496d 100644 --- a/app/submodule/eth/eth_event_api.go +++ b/app/submodule/eth/eth_event_api.go @@ -330,7 +330,7 @@ func (e *ethEventAPI) EthNewFilter(ctx context.Context, filterSpec *types.EthFil if err := e.FilterStore.Add(ctx, f); err != nil { // Could not record in store, attempt to delete filter to clean up - err2 := e.TipSetFilterManager.Remove(ctx, f.ID()) + err2 := e.EventFilterManager.Remove(ctx, f.ID()) if err2 != nil { return types.EthFilterID{}, fmt.Errorf("encountered error %v while removing new filter due to %v", err2, err) } diff --git a/app/submodule/eth/eth_utils.go b/app/submodule/eth/eth_utils.go index 697852ef7c..746b3f1e5c 100644 --- a/app/submodule/eth/eth_utils.go +++ b/app/submodule/eth/eth_utils.go @@ -712,7 +712,7 @@ func newEthTxReceipt(ctx context.Context, TransactionIndex: transactionIndex, BlockHash: blockHash, BlockNumber: blockNumber, - Type: types.EthUint64(2), + Type: tx.Type, Logs: []types.EthLog{}, // empty log array is compulsory when no logs, or libraries like ethers.js break LogsBloom: types.EmptyEthBloom[:], } diff --git a/app/submodule/f3/f3_api.go b/app/submodule/f3/f3_api.go index 479ad175f8..f433379ae0 100644 --- a/app/submodule/f3/f3_api.go +++ b/app/submodule/f3/f3_api.go @@ -4,11 +4,11 @@ import ( "context" "errors" "fmt" - "time" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-f3/certs" "github.com/filecoin-project/go-f3/gpbft" + "github.com/filecoin-project/go-f3/manifest" v1 "github.com/filecoin-project/venus/venus-shared/api/chain/v1" "github.com/filecoin-project/venus/venus-shared/types" ) @@ -21,28 +21,24 @@ type f3API struct { var ErrF3Disabled = errors.New("f3 is disabled") -func (f3api *f3API) F3Participate(ctx context.Context, - minerAddr address.Address, - newLeaseExpiration time.Time, - oldLeaseExpiration time.Time, -) (bool, error) { +func (f3api *f3API) F3GetOrRenewParticipationTicket(ctx context.Context, miner address.Address, previous types.F3ParticipationTicket, instances uint64) (types.F3ParticipationTicket, error) { if f3api.f3module.F3 == nil { - log.Infof("F3Participate called for %v, F3 is disabled", minerAddr) - return false, ErrF3Disabled - } - - if leaseDuration := time.Until(newLeaseExpiration); leaseDuration > 5*time.Minute { - return false, fmt.Errorf("F3 participation lease too long: %v > 5 min", leaseDuration) - } else if leaseDuration < 0 { - return false, fmt.Errorf("F3 participation lease is in the past: %d < 0", leaseDuration) + log.Infof("F3GetParticipationTicket called for %v, F3 is disabled", miner) + return types.F3ParticipationTicket{}, types.ErrF3Disabled } - - minerID, err := address.IDFromAddress(minerAddr) + minerID, err := address.IDFromAddress(miner) if err != nil { - return false, fmt.Errorf("miner address is not of ID type: %v: %w", minerID, err) + return types.F3ParticipationTicket{}, fmt.Errorf("miner address is not of ID type: %v: %w", miner, err) } + return f3api.f3module.F3.GetOrRenewParticipationTicket(ctx, minerID, previous, instances) +} - return f3api.f3module.F3.Participate(ctx, minerID, newLeaseExpiration, oldLeaseExpiration), nil +func (f3api *f3API) F3Participate(ctx context.Context, ticket types.F3ParticipationTicket) (types.F3ParticipationLease, error) { + if f3api.f3module.F3 == nil { + log.Infof("F3Participate called, F3 is disabled") + return types.F3ParticipationLease{}, types.ErrF3Disabled + } + return f3api.f3module.F3.Participate(ctx, ticket) } func (f3api *f3API) F3GetCertificate(ctx context.Context, instance uint64) (*certs.FinalityCertificate, error) { @@ -72,3 +68,24 @@ func (f3api *f3API) F3GetF3PowerTable(ctx context.Context, tsk types.TipSetKey) } return f3api.f3module.F3.GetF3PowerTable(ctx, tsk) } + +func (f3api *f3API) F3GetManifest(_ctx context.Context) (*manifest.Manifest, error) { + if f3api.f3module.F3 == nil { + return nil, ErrF3Disabled + } + return f3api.f3module.F3.GetManifest(), nil +} + +func (f3api *f3API) F3IsRunning(_ctx context.Context) (bool, error) { + if f3api.f3module.F3 == nil { + return false, ErrF3Disabled + } + return f3api.f3module.F3.IsRunning(), nil +} + +func (f3api *f3API) F3GetProgress(context.Context) (gpbft.Instant, error) { + if f3api.f3module.F3 == nil { + return gpbft.Instant{}, types.ErrF3Disabled + } + return f3api.f3module.F3.Progress(), nil +} diff --git a/app/submodule/f3/f3_submodule.go b/app/submodule/f3/f3_submodule.go index 722b0ea75c..7ccabd6c3d 100644 --- a/app/submodule/f3/f3_submodule.go +++ b/app/submodule/f3/f3_submodule.go @@ -5,8 +5,10 @@ import ( "github.com/filecoin-project/venus/app/submodule/chain" "github.com/filecoin-project/venus/app/submodule/network" + "github.com/filecoin-project/venus/app/submodule/syncer" "github.com/filecoin-project/venus/pkg/repo" "github.com/filecoin-project/venus/pkg/vf3" + "github.com/filecoin-project/venus/pkg/wallet" v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" logging "github.com/ipfs/go-log" ) @@ -21,7 +23,8 @@ func NewF3Submodule(ctx context.Context, repo repo.Repo, chain *chain.ChainSubmodule, network *network.NetworkSubmodule, - walletAPI v1api.IWallet, + walletSign wallet.WalletSignFunc, + syncer *syncer.SyncerSubmodule, ) (*F3Submodule, error) { netConf := repo.Config().NetworkParams if !netConf.F3Enabled { @@ -29,15 +32,27 @@ func NewF3Submodule(ctx context.Context, F3: nil, }, nil } + repoPath, err := repo.Path() + if err != nil { + return nil, err + } + + provider, err := vf3.NewManifestProvider(ctx, network.F3Cfg, chain.ChainReader, network.Pubsub, repo.MetaDatastore()) + if err != nil { + return nil, err + } m, err := vf3.New(ctx, vf3.F3Params{ - ManifestServerID: netConf.ManifestServerID, + ManifestProvider: provider, PubSub: network.Pubsub, Host: network.Host, ChainStore: chain.ChainReader, StateManager: chain.Stmgr, Datastore: repo.MetaDatastore(), - Wallet: walletAPI, - ManifestProvider: vf3.NewManifestProvider(network.NetworkName, repo.MetaDatastore(), network.Pubsub, netConf), + WalletSign: walletSign, + SyncerAPI: syncer.API(), + Config: network.F3Cfg, + RepoPath: repoPath, + Net: network.API(), }) if err != nil { return nil, err @@ -51,3 +66,10 @@ func (m *F3Submodule) API() v1api.IF3 { f3module: m, } } + +func (m *F3Submodule) Stop(ctx context.Context) error { + if m.F3 == nil { + return nil + } + return m.F3.Stop(ctx) +} diff --git a/app/submodule/network/network_submodule.go b/app/submodule/network/network_submodule.go index ed4cfcc489..bf0df611f1 100644 --- a/app/submodule/network/network_submodule.go +++ b/app/submodule/network/network_submodule.go @@ -50,6 +50,7 @@ import ( "github.com/filecoin-project/venus/pkg/net/pubsub" "github.com/filecoin-project/venus/pkg/repo" appstate "github.com/filecoin-project/venus/pkg/state" + "github.com/filecoin-project/venus/pkg/vf3" "github.com/filecoin-project/venus/venus-shared/types" v0api "github.com/filecoin-project/venus/venus-shared/api/chain/v0" @@ -90,7 +91,8 @@ type NetworkSubmodule struct { //nolint indexMsgRelayCancelFunc libp2pps.RelayCancelFunc - cfg networkConfig + cfg networkConfig + F3Cfg *vf3.Config } // API create a new network implement @@ -145,6 +147,14 @@ func NewNetworkSubmodule(ctx context.Context, } } + var f3Cfg *vf3.Config + if cfg.NetworkParams.F3Enabled { + f3Cfg, err = vf3.NewConfig(networkName, cfg.NetworkParams) + if err != nil { + return nil, errors.Wrap(err, "failed to build f3 config") + } + } + // peer manager bootNodes, err := net.ParseAddresses(ctx, cfg.Bootstrap.Addresses) if err != nil { @@ -164,7 +174,7 @@ func NewNetworkSubmodule(ctx context.Context, return nil, err } - router, err := makeDHT(ctx, rawHost, config, networkName, bootNodes, cfg.PubsubConfig.Bootstrapper) + router, err := makeDHT(ctx, rawHost, config, networkName, cfg.PubsubConfig.Bootstrapper) if err != nil { return nil, err } @@ -181,7 +191,7 @@ func NewNetworkSubmodule(ctx context.Context, } sk := net.NewScoreKeeper() - gsub, err := net.NewGossipSub(ctx, peerHost, sk, networkName, cfg.NetworkParams.DrandSchedule, bootNodes, cfg.PubsubConfig.Bootstrapper, config.Repo().Config().NetworkParams.F3Enabled) + gsub, err := net.NewGossipSub(ctx, peerHost, sk, networkName, cfg.NetworkParams.DrandSchedule, bootNodes, cfg.PubsubConfig.Bootstrapper, f3Cfg) if err != nil { return nil, errors.Wrap(err, "failed to set up network") } @@ -240,6 +250,7 @@ func NewNetworkSubmodule(ctx context.Context, cfg: config, ScoreKeeper: sk, indexMsgRelayCancelFunc: indexMsgRelayCancelFunc, + F3Cfg: f3Cfg, }, nil } @@ -390,7 +401,7 @@ func buildHost(_ context.Context, config networkConfig, libP2pOpts []libp2p.Opti return libp2p.New(opts...) } -func makeDHT(ctx context.Context, h types.RawHost, config networkConfig, networkName string, bootNodes []peer.AddrInfo, bootstrapper bool) (routing.Routing, error) { +func makeDHT(ctx context.Context, h types.RawHost, config networkConfig, networkName string, bootstrapper bool) (routing.Routing, error) { mode := dht.ModeAuto if bootstrapper { mode = dht.ModeServer diff --git a/app/submodule/syncer/chain_sync.go b/app/submodule/syncer/chain_sync.go index 2f4923c4ac..587439a452 100644 --- a/app/submodule/syncer/chain_sync.go +++ b/app/submodule/syncer/chain_sync.go @@ -1,6 +1,7 @@ package syncer import ( + "context" "time" "github.com/filecoin-project/venus/pkg/chainsync" @@ -31,6 +32,10 @@ func (chs *ChainSyncProvider) HandleNewTipSet(ci *types.ChainInfo) error { return chs.sync.BlockProposer().SendOwnBlock(ci) } +func (chs *ChainSyncProvider) SyncCheckpoint(ctx context.Context, tsk types.TipSetKey) error { + return chs.sync.BlockProposer().SyncCheckpoint(ctx, tsk) +} + const ( incomeBlockLargeDelayDuration = time.Second * 5 slowFetchMessageDuration = time.Second * 3 diff --git a/app/submodule/syncer/syncer_api.go b/app/submodule/syncer/syncer_api.go index 1dbefde0b7..0d66627b94 100644 --- a/app/submodule/syncer/syncer_api.go +++ b/app/submodule/syncer/syncer_api.go @@ -214,3 +214,8 @@ func (sa *syncerAPI) SyncState(ctx context.Context) (*types.SyncState, error) { func (sa *syncerAPI) SyncIncomingBlocks(ctx context.Context) (<-chan *types.BlockHeader, error) { return sa.syncer.ChainSyncManager.BlockProposer().IncomingBlocks(ctx) } + +func (sa *syncerAPI) SyncCheckpoint(ctx context.Context, tsk types.TipSetKey) error { + log.Warnf("Marking tipset %s as checkpoint", tsk) + return sa.syncer.SyncProvider.SyncCheckpoint(ctx, tsk) +} diff --git a/app/submodule/wallet/wallet_submodule.go b/app/submodule/wallet/wallet_submodule.go index 6109cd6e05..7b9026b8ff 100644 --- a/app/submodule/wallet/wallet_submodule.go +++ b/app/submodule/wallet/wallet_submodule.go @@ -2,6 +2,8 @@ package wallet import ( "context" + "fmt" + "strings" v0api "github.com/filecoin-project/venus/venus-shared/api/chain/v0" v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" @@ -16,6 +18,7 @@ import ( "github.com/filecoin-project/venus/pkg/repo" "github.com/filecoin-project/venus/pkg/state" "github.com/filecoin-project/venus/pkg/wallet" + "github.com/filecoin-project/venus/pkg/wallet/gateway" "github.com/filecoin-project/venus/venus-shared/types" ) @@ -23,11 +26,12 @@ var log = logging.Logger("wallet") // WalletSubmodule enhances the `Node` with a "wallet" and FIL transfer capabilities. type WalletSubmodule struct { // nolint - Chain *chain.ChainSubmodule - Wallet *wallet.Wallet - adapter wallet.WalletIntersection - Signer types.Signer - Config *config.ConfigModule + Chain *chain.ChainSubmodule + Wallet *wallet.Wallet + adapter wallet.WalletIntersection + Signer types.Signer + Config *config.ConfigModule + WalletGateway *gateway.WalletGateway } type walletRepo interface { @@ -66,12 +70,25 @@ func NewWalletSubmodule(ctx context.Context, } else { adapter = fcWallet } + + var wg *gateway.WalletGateway + if len(repo.Config().Wallet.GatewayBacked) != 0 { + // GatewayBacked token:url + tokenURL := strings.SplitN(repo.Config().Wallet.GatewayBacked, ":", 2) + fmt.Println(tokenURL) + wg, err = gateway.NewWalletGateway(ctx, tokenURL[1], tokenURL[0]) + if err != nil { + return nil, err + } + log.Info("wallet gateway set up") + } return &WalletSubmodule{ - Config: cfgModule, - Chain: chain, - Wallet: fcWallet, - adapter: adapter, - Signer: state.NewSigner(headSigner, fcWallet), + Config: cfgModule, + Chain: chain, + Wallet: fcWallet, + adapter: adapter, + Signer: state.NewSigner(headSigner, fcWallet), + WalletGateway: wg, }, nil } @@ -94,6 +111,13 @@ func (wallet *WalletSubmodule) WalletIntersection() wallet.WalletIntersection { return wallet.adapter } +func (wallet *WalletSubmodule) GetWalletSign() wallet.WalletSignFunc { + if wallet.WalletGateway == nil { + return wallet.adapter.WalletSign + } + return wallet.WalletGateway.WalletSign +} + func getPassphraseConfig(cfg *pconfig.Config) (pconfig.PassphraseConfig, error) { return pconfig.PassphraseConfig{ ScryptN: cfg.Wallet.PassphraseConfig.ScryptN, diff --git a/cmd/daemon.go b/cmd/daemon.go index acffc586ce..d3ae638c09 100644 --- a/cmd/daemon.go +++ b/cmd/daemon.go @@ -58,6 +58,7 @@ var daemonCmd = &cmds.Command{ cmds.StringOption(Network, "when set, populates config with network specific parameters, eg. mainnet,2k,calibrationnet,interopnet,butterflynet").WithDefault("mainnet"), cmds.StringOption(Password, "set wallet password"), cmds.StringOption(Profile, "specify type of node, eg. bootstrapper"), + cmds.StringOption(WalletGateway, "set sophon gateway url and token, eg. token:url"), }, Run: func(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment) error { if limit, _ := req.Options[ULimit].(bool); limit { @@ -168,6 +169,9 @@ func initRun(req *cmds.Request, repoDir string) error { return fmt.Errorf("must also pass token with venus auth service to `--%s`", AuthServiceToken) } } + if walletGateway, ok := req.Options[WalletGateway].(string); ok && len(walletGateway) > 0 { + cfg.Wallet.GatewayBacked = walletGateway + } if err := rep.ReplaceConfig(cfg); err != nil { log.Errorf("Error replacing config %s", err) @@ -240,6 +244,9 @@ func daemonRun(req *cmds.Request, re cmds.ResponseEmitter) error { if len(config.API.VenusAuthURL)+len(config.API.VenusAuthToken) > 0 && len(config.API.VenusAuthToken)*len(config.API.VenusAuthURL) == 0 { return fmt.Errorf("must set both venus auth service url and token at the same time") } + if walletGateway, ok := req.Options[WalletGateway].(string); ok && len(walletGateway) > 0 { + config.Wallet.GatewayBacked = walletGateway + } if bootPeers, ok := req.Options[BootstrapPeers].([]string); ok && len(bootPeers) > 0 { config.Bootstrap.AddPeers(bootPeers...) diff --git a/cmd/main.go b/cmd/main.go index 999f4e4347..e7a2e45805 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -79,6 +79,8 @@ const ( AuthServiceURL = "auth-url" AuthServiceToken = "auth-token" + WalletGateway = "wallet-gateway" + BootstrapPeers = "bootstrap-peers" Profile = "profile" diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index e467d2992e..815fb3a20f 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit e467d2992e3f9bd09beb71ecf84323b45d2a3511 +Subproject commit 815fb3a20fda47cad556ba2045b16021610cd02c diff --git a/fixtures/assets/asset.go b/fixtures/assets/asset.go index 4b26e3463f..6dde37839e 100644 --- a/fixtures/assets/asset.go +++ b/fixtures/assets/asset.go @@ -2,9 +2,11 @@ package assets import ( "embed" + "io" "path/filepath" "github.com/filecoin-project/venus/venus-shared/types" + "github.com/klauspost/compress/zstd" ) //go:embed genesis-car @@ -14,18 +16,35 @@ func GetGenesis(networkType types.NetworkType) ([]byte, error) { fileName := "" switch networkType { case types.NetworkForce: - fileName = "forcenet.car" + fileName = "forcenet.car.zst" case types.NetworkInterop: - fileName = "interopnet.car" + fileName = "interopnet.car.zst" case types.NetworkButterfly: - fileName = "butterflynet.car" + fileName = "butterflynet.car.zst" case types.NetworkCalibnet: - fileName = "calibnet.car" + fileName = "calibnet.car.zst" default: - fileName = "mainnet.car" + fileName = "mainnet.car.zst" } - return carFS.ReadFile(filepath.Join("genesis-car", fileName)) + file, err := carFS.Open(filepath.Join("genesis-car", fileName)) + if err != nil { + return nil, err + } + defer file.Close() //nolint + + decoder, err := zstd.NewReader(file) + if err != nil { + return nil, err + } + defer decoder.Close() //nolint + + decompressedBytes, err := io.ReadAll(decoder) + if err != nil { + return nil, err + } + + return decompressedBytes, nil } //go:embed proof-params diff --git a/fixtures/assets/genesis-car/butterflynet.car b/fixtures/assets/genesis-car/butterflynet.car deleted file mode 100644 index 910e762915..0000000000 Binary files a/fixtures/assets/genesis-car/butterflynet.car and /dev/null differ diff --git a/fixtures/assets/genesis-car/butterflynet.car.zst b/fixtures/assets/genesis-car/butterflynet.car.zst new file mode 100644 index 0000000000..db55bd8cc4 Binary files /dev/null and b/fixtures/assets/genesis-car/butterflynet.car.zst differ diff --git a/fixtures/assets/genesis-car/calibnet.car b/fixtures/assets/genesis-car/calibnet.car deleted file mode 100644 index 775cdf7907..0000000000 Binary files a/fixtures/assets/genesis-car/calibnet.car and /dev/null differ diff --git a/fixtures/assets/genesis-car/calibnet.car.zst b/fixtures/assets/genesis-car/calibnet.car.zst new file mode 100644 index 0000000000..06dad61bb4 Binary files /dev/null and b/fixtures/assets/genesis-car/calibnet.car.zst differ diff --git a/fixtures/assets/genesis-car/forcenet.car b/fixtures/assets/genesis-car/forcenet.car deleted file mode 100644 index cc0eb71763..0000000000 Binary files a/fixtures/assets/genesis-car/forcenet.car and /dev/null differ diff --git a/fixtures/assets/genesis-car/forcenet.car.zst b/fixtures/assets/genesis-car/forcenet.car.zst new file mode 100644 index 0000000000..33e2f6824b Binary files /dev/null and b/fixtures/assets/genesis-car/forcenet.car.zst differ diff --git a/fixtures/assets/genesis-car/interopnet.car b/fixtures/assets/genesis-car/interopnet.car deleted file mode 100644 index 2dadae61eb..0000000000 Binary files a/fixtures/assets/genesis-car/interopnet.car and /dev/null differ diff --git a/fixtures/assets/genesis-car/interopnet.car.zst b/fixtures/assets/genesis-car/interopnet.car.zst new file mode 100644 index 0000000000..6acd1263a4 Binary files /dev/null and b/fixtures/assets/genesis-car/interopnet.car.zst differ diff --git a/fixtures/assets/genesis-car/mainnet.car b/fixtures/assets/genesis-car/mainnet.car deleted file mode 100644 index f1b3f342a6..0000000000 Binary files a/fixtures/assets/genesis-car/mainnet.car and /dev/null differ diff --git a/fixtures/assets/genesis-car/mainnet.car.zst b/fixtures/assets/genesis-car/mainnet.car.zst new file mode 100644 index 0000000000..cd64349e29 Binary files /dev/null and b/fixtures/assets/genesis-car/mainnet.car.zst differ diff --git a/fixtures/networks/butterfly.go b/fixtures/networks/butterfly.go index 4bee7d967a..7b69591e1f 100644 --- a/fixtures/networks/butterfly.go +++ b/fixtures/networks/butterfly.go @@ -5,15 +5,16 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/venus/pkg/config" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" "github.com/filecoin-project/venus/venus-shared/types" + "github.com/ipfs/go-cid" ) func ButterflySnapNet() *NetworkConf { nc := &NetworkConf{ Bootstrap: config.BootstrapConfig{ Addresses: []string{ - "/dns4/bootstrap-0.butterfly.fildev.network/tcp/1347/p2p/12D3KooWGW6xMTpjEBqndYkqytbu8PWfJmpK4wKLLLNSkXL2QZtD", - "/dns4/bootstrap-1.butterfly.fildev.network/tcp/1347/p2p/12D3KooWFGz9HegR3Rjrtm8b9WXTM6E3kN1sdd6X1JztuCgQaZSB", + "/dnsaddr/bootstrap.butterfly.fildev.network", }, Period: "30s", }, @@ -31,37 +32,39 @@ func ButterflySnapNet() *NetworkConf { MinVerifiedDealSize: 1 << 20, PreCommitChallengeDelay: abi.ChainEpoch(150), ForkUpgradeParam: &config.ForkUpgradeConfig{ - BreezeGasTampingDuration: 120, - UpgradeBreezeHeight: -1, - UpgradeSmokeHeight: -2, - UpgradeIgnitionHeight: -3, - UpgradeRefuelHeight: -4, - UpgradeAssemblyHeight: -5, - UpgradeTapeHeight: -6, - UpgradeLiftoffHeight: -7, - UpgradeKumquatHeight: -8, - UpgradeCalicoHeight: -9, - UpgradePersianHeight: -10, - UpgradeOrangeHeight: -11, - UpgradeClausHeight: -12, - UpgradeTrustHeight: -13, - UpgradeNorwegianHeight: -14, - UpgradeTurboHeight: -15, - UpgradeHyperdriveHeight: -16, - UpgradeChocolateHeight: -17, - UpgradeOhSnapHeight: -18, - UpgradeSkyrHeight: -19, - UpgradeSharkHeight: -20, - UpgradeHyggeHeight: -21, - UpgradeLightningHeight: -22, - UpgradeThunderHeight: -23, - UpgradeWatermelonHeight: -24, - UpgradeWatermelonFixHeight: -100, // This fix upgrade only ran on calibrationnet - UpgradeWatermelonFix2Height: -101, // This fix upgrade only ran on calibrationnet - UpgradeDragonHeight: -25, - UpgradeCalibrationDragonFixHeight: -102, // This fix upgrade only ran on calibrationnet - UpgradePhoenixHeight: -26, - UpgradeWaffleHeight: 100, + BreezeGasTampingDuration: 120, + UpgradeBreezeHeight: -1, + UpgradeSmokeHeight: -2, + UpgradeIgnitionHeight: -3, + UpgradeRefuelHeight: -4, + UpgradeAssemblyHeight: -5, + UpgradeTapeHeight: -6, + UpgradeLiftoffHeight: -7, + UpgradeKumquatHeight: -8, + UpgradeCalicoHeight: -9, + UpgradePersianHeight: -10, + UpgradeOrangeHeight: -11, + UpgradeClausHeight: -12, + UpgradeTrustHeight: -13, + UpgradeNorwegianHeight: -14, + UpgradeTurboHeight: -15, + UpgradeHyperdriveHeight: -16, + UpgradeChocolateHeight: -17, + UpgradeOhSnapHeight: -18, + UpgradeSkyrHeight: -19, + UpgradeSharkHeight: -20, + UpgradeHyggeHeight: -21, + UpgradeLightningHeight: -22, + UpgradeThunderHeight: -23, + UpgradeWatermelonHeight: -24, + UpgradeWatermelonFixHeight: -100, // This fix upgrade only ran on calibrationnet + UpgradeWatermelonFix2Height: -101, // This fix upgrade only ran on calibrationnet + UpgradeDragonHeight: -25, + UpgradeCalibrationDragonFixHeight: -102, // This fix upgrade only ran on calibrationnet + UpgradePhoenixHeight: -26, + UpgradeWaffleHeight: -27, + UpgradeTuktukHeight: 9999999, + UpgradeTuktukPowerRampDurationEpochs: builtin.EpochsInYear, }, DrandSchedule: map[abi.ChainEpoch]config.DrandEnum{0: config.DrandQuicknet}, AddressNetwork: address.Testnet, @@ -72,6 +75,8 @@ func ButterflySnapNet() *NetworkConf { F3Enabled: true, F3BootstrapEpoch: 1000, ManifestServerID: "12D3KooWJr9jy4ngtJNR7JC1xgLFra3DjEtyxskRYWvBK9TC3Yn6", + F3Consensus: true, + F3InitialPowerTableCID: cid.Undef, }, } diff --git a/fixtures/networks/calibration.go b/fixtures/networks/calibration.go index 0cae79f3d1..24500b9cda 100644 --- a/fixtures/networks/calibration.go +++ b/fixtures/networks/calibration.go @@ -6,7 +6,9 @@ import ( "github.com/filecoin-project/go-state-types/network" builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" "github.com/filecoin-project/venus/pkg/config" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" "github.com/filecoin-project/venus/venus-shared/types" + "github.com/ipfs/go-cid" ) type NetworkConf struct { @@ -22,6 +24,7 @@ func Calibration() *NetworkConf { "/dns/bootstrap-calibnet-0.chainsafe-fil.io/tcp/34000/p2p/12D3KooWABQ5gTDHPWyvhJM7jPhtNwNJruzTEo32Lo4gcS5ABAMm", "/dns/bootstrap-calibnet-1.chainsafe-fil.io/tcp/34000/p2p/12D3KooWS3ZRhMYL67b4bD5XQ6fcpTyVQXnDe8H89LvwrDqaSbiT", "/dns/bootstrap-calibnet-2.chainsafe-fil.io/tcp/34000/p2p/12D3KooWEiBN8jBX8EBoM3M47pVRLRWV812gDRUJhMxgyVkUoR48", + "/dns/bootstrap-archive-calibnet-0.chainsafe-fil.io/tcp/1347/p2p/12D3KooWLcRpEfmUq1fC8vfcLnKc1s161C92rUewEze3ALqCd9yJ", }, Period: "30s", }, @@ -38,36 +41,38 @@ func Calibration() *NetworkConf { MinVerifiedDealSize: 1 << 20, PreCommitChallengeDelay: abi.ChainEpoch(150), ForkUpgradeParam: &config.ForkUpgradeConfig{ - BreezeGasTampingDuration: 120, - UpgradeBreezeHeight: -1, - UpgradeSmokeHeight: -2, - UpgradeIgnitionHeight: -3, - UpgradeRefuelHeight: -4, - UpgradeAssemblyHeight: 30, - UpgradeTapeHeight: 60, - UpgradeLiftoffHeight: -5, - UpgradeKumquatHeight: 90, - UpgradeCalicoHeight: 120, - UpgradePersianHeight: 120 + (builtin2.EpochsInHour * 1), - UpgradeClausHeight: 270, - UpgradeOrangeHeight: 300, - UpgradeTrustHeight: 330, - UpgradeNorwegianHeight: 360, - UpgradeTurboHeight: 390, - UpgradeHyperdriveHeight: 420, - UpgradeChocolateHeight: 450, - UpgradeOhSnapHeight: 480, - UpgradeSkyrHeight: 510, - UpgradeSharkHeight: 16800, - UpgradeHyggeHeight: 322354, // 2023-02-21T16:30:00Z - UpgradeLightningHeight: 489094, // 2023-04-20T14:00:00Z - UpgradeThunderHeight: 489094 + 3120, // 2023-04-21T16:00:00Z - UpgradeWatermelonHeight: 1013134, // 2023-10-19T13:00:00Z - UpgradeWatermelonFixHeight: 1070494, // 2023-11-07T13:00:00Z - UpgradeWatermelonFix2Height: 1108174, // 2023-11-21T13:00:00Z - UpgradeDragonHeight: 1427974, // 2024-03-11T14:00:00Z - UpgradeCalibrationDragonFixHeight: 1493854, // 2024-04-03T11:00:00Z - UpgradeWaffleHeight: 1779094, // 2024-07-11T12:00:00Z + BreezeGasTampingDuration: 120, + UpgradeBreezeHeight: -1, + UpgradeSmokeHeight: -2, + UpgradeIgnitionHeight: -3, + UpgradeRefuelHeight: -4, + UpgradeAssemblyHeight: 30, + UpgradeTapeHeight: 60, + UpgradeLiftoffHeight: -5, + UpgradeKumquatHeight: 90, + UpgradeCalicoHeight: 120, + UpgradePersianHeight: 120 + (builtin2.EpochsInHour * 1), + UpgradeClausHeight: 270, + UpgradeOrangeHeight: 300, + UpgradeTrustHeight: 330, + UpgradeNorwegianHeight: 360, + UpgradeTurboHeight: 390, + UpgradeHyperdriveHeight: 420, + UpgradeChocolateHeight: 450, + UpgradeOhSnapHeight: 480, + UpgradeSkyrHeight: 510, + UpgradeSharkHeight: 16800, + UpgradeHyggeHeight: 322354, // 2023-02-21T16:30:00Z + UpgradeLightningHeight: 489094, // 2023-04-20T14:00:00Z + UpgradeThunderHeight: 489094 + 3120, // 2023-04-21T16:00:00Z + UpgradeWatermelonHeight: 1013134, // 2023-10-19T13:00:00Z + UpgradeWatermelonFixHeight: 1070494, // 2023-11-07T13:00:00Z + UpgradeWatermelonFix2Height: 1108174, // 2023-11-21T13:00:00Z + UpgradeDragonHeight: 1427974, // 2024-03-11T14:00:00Z + UpgradeCalibrationDragonFixHeight: 1493854, // 2024-04-03T11:00:00Z + UpgradeWaffleHeight: 1779094, // 2024-07-11T12:00:00Z + UpgradeTuktukHeight: 99999999, + UpgradeTuktukPowerRampDurationEpochs: builtin.EpochsInDay * 3, }, DrandSchedule: map[abi.ChainEpoch]config.DrandEnum{0: 1}, AddressNetwork: address.Testnet, @@ -75,7 +80,8 @@ func Calibration() *NetworkConf { AllowableClockDriftSecs: 1, Eip155ChainID: 314159, ActorDebugging: false, - F3Enabled: true, + F3Consensus: true, + F3InitialPowerTableCID: cid.Undef, }, } diff --git a/fixtures/networks/forcenet.go b/fixtures/networks/forcenet.go index 0e35d9798c..72aac1f28a 100644 --- a/fixtures/networks/forcenet.go +++ b/fixtures/networks/forcenet.go @@ -6,6 +6,7 @@ import ( "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/venus/pkg/config" "github.com/filecoin-project/venus/venus-shared/types" + "github.com/ipfs/go-cid" ) func ForceNet() *NetworkConf { @@ -18,7 +19,7 @@ func ForceNet() *NetworkConf { Network: config.NetworkParamsConfig{ DevNet: true, NetworkType: types.NetworkForce, - GenesisNetworkVersion: network.Version22, + GenesisNetworkVersion: network.Version23, ReplaceProofTypes: []abi.RegisteredSealProof{ abi.RegisteredSealProof_StackedDrg8MiBV1, abi.RegisteredSealProof_StackedDrg512MiBV1, @@ -40,30 +41,32 @@ func ForceNet() *NetworkConf { // Miners, clients, developers, custodians all need time to prepare. // We still have upgrades and state changes to do, but can happen after signaling timing here. - UpgradeAssemblyHeight: -7, // critical: the network can bootstrap from v1 only - UpgradeKumquatHeight: -8, - UpgradeCalicoHeight: -9, - UpgradePersianHeight: -10, - UpgradeOrangeHeight: -11, - UpgradeClausHeight: -12, - UpgradeTrustHeight: -13, - UpgradeNorwegianHeight: -14, - UpgradeTurboHeight: -15, - UpgradeHyperdriveHeight: -16, - UpgradeChocolateHeight: -17, - UpgradeOhSnapHeight: -18, - UpgradeSkyrHeight: -19, - UpgradeSharkHeight: -20, - UpgradeHyggeHeight: -21, - UpgradeLightningHeight: -22, - UpgradeThunderHeight: -23, - UpgradeWatermelonHeight: -24, - UpgradeWatermelonFixHeight: -100, // This fix upgrade only ran on calibrationnet - UpgradeWatermelonFix2Height: -101, // This fix upgrade only ran on calibrationnet - UpgradeDragonHeight: -25, - UpgradeCalibrationDragonFixHeight: -102, // This fix upgrade only ran on calibrationnet - UpgradePhoenixHeight: -26, - UpgradeWaffleHeight: 200, + UpgradeAssemblyHeight: -7, // critical: the network can bootstrap from v1 only + UpgradeKumquatHeight: -8, + UpgradeCalicoHeight: -9, + UpgradePersianHeight: -10, + UpgradeOrangeHeight: -11, + UpgradeClausHeight: -12, + UpgradeTrustHeight: -13, + UpgradeNorwegianHeight: -14, + UpgradeTurboHeight: -15, + UpgradeHyperdriveHeight: -16, + UpgradeChocolateHeight: -17, + UpgradeOhSnapHeight: -18, + UpgradeSkyrHeight: -19, + UpgradeSharkHeight: -20, + UpgradeHyggeHeight: -21, + UpgradeLightningHeight: -22, + UpgradeThunderHeight: -23, + UpgradeWatermelonHeight: -24, + UpgradeWatermelonFixHeight: -100, // This fix upgrade only ran on calibrationnet + UpgradeWatermelonFix2Height: -101, // This fix upgrade only ran on calibrationnet + UpgradeDragonHeight: -25, + UpgradeCalibrationDragonFixHeight: -102, // This fix upgrade only ran on calibrationnet + UpgradePhoenixHeight: -26, + UpgradeWaffleHeight: -27, + UpgradeTuktukHeight: 200, + UpgradeTuktukPowerRampDurationEpochs: 200, }, DrandSchedule: map[abi.ChainEpoch]config.DrandEnum{0: config.DrandQuicknet}, AddressNetwork: address.Testnet, @@ -74,6 +77,8 @@ func ForceNet() *NetworkConf { F3Enabled: true, F3BootstrapEpoch: 100, ManifestServerID: "12D3KooWHcNBkqXEBrsjoveQvj6zDF3vK5S9tAfqyYaQF1LGSJwG", + F3Consensus: true, + F3InitialPowerTableCID: cid.Undef, }, } diff --git a/fixtures/networks/integrationtestnet.go b/fixtures/networks/integrationtestnet.go index c488bf3a98..42fa6f124a 100644 --- a/fixtures/networks/integrationtestnet.go +++ b/fixtures/networks/integrationtestnet.go @@ -6,6 +6,7 @@ import ( "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/venus/pkg/config" "github.com/filecoin-project/venus/venus-shared/types" + "github.com/ipfs/go-cid" ) func IntegrationNet() *NetworkConf { @@ -56,6 +57,7 @@ func IntegrationNet() *NetworkConf { UpgradeDragonHeight: 3855360, UpgradeCalibrationDragonFixHeight: -102, // This fix upgrade only ran on calibrationnet UpgradeWaffleHeight: 4154640, + UpgradeTuktukHeight: 999999999, }, DrandSchedule: map[abi.ChainEpoch]config.DrandEnum{0: 5, 51000: 1}, AddressNetwork: address.Testnet, @@ -63,9 +65,11 @@ func IntegrationNet() *NetworkConf { AllowableClockDriftSecs: 1, Eip155ChainID: 314, ActorDebugging: false, - F3Enabled: true, + F3Enabled: false, F3BootstrapEpoch: -1, - ManifestServerID: "12D3KooWENMwUF9YxvQxar7uBWJtZkA6amvK4xWmKXfSiHUo2Qq7", + ManifestServerID: "12D3KooWHcNBkqXEBrsjoveQvj6zDF3vK5S9tAfqyYaQF1LGSJwG", + F3Consensus: true, + F3InitialPowerTableCID: cid.Undef, }, } diff --git a/fixtures/networks/interopnet.go b/fixtures/networks/interopnet.go index bd03847baa..ee5fcbca4d 100644 --- a/fixtures/networks/interopnet.go +++ b/fixtures/networks/interopnet.go @@ -5,7 +5,9 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/venus/pkg/config" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" "github.com/filecoin-project/venus/venus-shared/types" + "github.com/ipfs/go-cid" ) func InteropNet() *NetworkConf { @@ -31,37 +33,39 @@ func InteropNet() *NetworkConf { MinVerifiedDealSize: 256, PreCommitChallengeDelay: abi.ChainEpoch(10), ForkUpgradeParam: &config.ForkUpgradeConfig{ - BreezeGasTampingDuration: 0, - UpgradeBreezeHeight: -1, - UpgradeSmokeHeight: -2, - UpgradeIgnitionHeight: -3, - UpgradeRefuelHeight: -4, - UpgradeAssemblyHeight: -5, - UpgradeTapeHeight: -6, - UpgradeLiftoffHeight: -7, - UpgradeKumquatHeight: -8, - UpgradeCalicoHeight: -9, - UpgradePersianHeight: -10, - UpgradeOrangeHeight: -11, - UpgradeClausHeight: -12, - UpgradeTrustHeight: -13, - UpgradeNorwegianHeight: -14, - UpgradeTurboHeight: -15, - UpgradeHyperdriveHeight: -16, - UpgradeChocolateHeight: -17, - UpgradeOhSnapHeight: -18, - UpgradeSkyrHeight: -19, - UpgradeSharkHeight: -20, - UpgradeHyggeHeight: -21, - UpgradeLightningHeight: -22, - UpgradeThunderHeight: -23, - UpgradeWatermelonHeight: -24, - UpgradeWatermelonFixHeight: -100, // This fix upgrade only ran on calibrationnet - UpgradeWatermelonFix2Height: -101, // This fix upgrade only ran on calibrationnet - UpgradeDragonHeight: -25, - UpgradeCalibrationDragonFixHeight: -102, // This fix upgrade only ran on calibrationnet - UpgradePhoenixHeight: -26, - UpgradeWaffleHeight: 50, + BreezeGasTampingDuration: 0, + UpgradeBreezeHeight: -1, + UpgradeSmokeHeight: -2, + UpgradeIgnitionHeight: -3, + UpgradeRefuelHeight: -4, + UpgradeAssemblyHeight: -5, + UpgradeTapeHeight: -6, + UpgradeLiftoffHeight: -7, + UpgradeKumquatHeight: -8, + UpgradeCalicoHeight: -9, + UpgradePersianHeight: -10, + UpgradeOrangeHeight: -11, + UpgradeClausHeight: -12, + UpgradeTrustHeight: -13, + UpgradeNorwegianHeight: -14, + UpgradeTurboHeight: -15, + UpgradeHyperdriveHeight: -16, + UpgradeChocolateHeight: -17, + UpgradeOhSnapHeight: -18, + UpgradeSkyrHeight: -19, + UpgradeSharkHeight: -20, + UpgradeHyggeHeight: -21, + UpgradeLightningHeight: -22, + UpgradeThunderHeight: -23, + UpgradeWatermelonHeight: -24, + UpgradeWatermelonFixHeight: -100, // This fix upgrade only ran on calibrationnet + UpgradeWatermelonFix2Height: -101, // This fix upgrade only ran on calibrationnet + UpgradeDragonHeight: -25, + UpgradeCalibrationDragonFixHeight: -102, // This fix upgrade only ran on calibrationnet + UpgradePhoenixHeight: -26, + UpgradeWaffleHeight: -27, + UpgradeTuktukHeight: 50, + UpgradeTuktukPowerRampDurationEpochs: builtin.EpochsInYear, }, DrandSchedule: map[abi.ChainEpoch]config.DrandEnum{0: config.DrandQuicknet}, AddressNetwork: address.Testnet, @@ -72,6 +76,8 @@ func InteropNet() *NetworkConf { F3Enabled: true, F3BootstrapEpoch: 1000, ManifestServerID: "12D3KooWQJ2rdVnG4okDUB6yHQhAjNutGNemcM7XzqC9Eo4z9Jce", + F3Consensus: true, + F3InitialPowerTableCID: cid.Undef, }, } diff --git a/fixtures/networks/mainnet.go b/fixtures/networks/mainnet.go index 4ffbea120d..f8b5c95473 100644 --- a/fixtures/networks/mainnet.go +++ b/fixtures/networks/mainnet.go @@ -7,6 +7,7 @@ import ( builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" "github.com/filecoin-project/venus/pkg/config" "github.com/filecoin-project/venus/venus-shared/types" + "github.com/ipfs/go-cid" ) func Mainnet() *NetworkConf { @@ -45,28 +46,30 @@ func Mainnet() *NetworkConf { // This signals our tentative epoch for mainnet launch. Can make it later, but not earlier. // Miners, clients, developers, custodians all need time to prepare. // We still have upgrades and state changes to do, but can happen after signaling timing here. - UpgradeKumquatHeight: 170000, - UpgradeCalicoHeight: 265200, - UpgradePersianHeight: 265200 + (builtin2.EpochsInHour * 60), - UpgradeOrangeHeight: 336458, - UpgradeClausHeight: 343200, // 2020-12-22T02:00:00Z - UpgradeTrustHeight: 550321, // 2021-03-04T00:00:30Z - UpgradeNorwegianHeight: 665280, // 2021-04-12T22:00:00Z - UpgradeTurboHeight: 712320, // 2021-04-29T06:00:00Z - UpgradeHyperdriveHeight: 892800, // 2021-06-30T22:00:00Z - UpgradeChocolateHeight: 1231620, - UpgradeOhSnapHeight: 1594680, // 2022-03-01T15:00:00Z - UpgradeSkyrHeight: 1960320, // 2022-07-06T14:00:00Z - UpgradeSharkHeight: 2383680, // 2022-11-30T14:00:00Z - UpgradeHyggeHeight: 2683348, // 2023-03-14T15:14:00Z - UpgradeLightningHeight: 2809800, // 2023-04-27T13:00:00Z - UpgradeThunderHeight: 2809800 + 2880*21, // 2023-05-18T13:00:00Z - UpgradeWatermelonHeight: 3469380, // 2023-12-12T13:30:00Z - UpgradeWatermelonFixHeight: -100, // This fix upgrade only ran on calibrationnet - UpgradeWatermelonFix2Height: -101, // This fix upgrade only ran on calibrationnet - UpgradeDragonHeight: 3855360, // 2024-04-24T14:00:00Z - UpgradeCalibrationDragonFixHeight: -102, // This fix upgrade only ran on calibrationnet - UpgradeWaffleHeight: 4154640, // 2024-08-06T12:00:00Z + UpgradeKumquatHeight: 170000, + UpgradeCalicoHeight: 265200, + UpgradePersianHeight: 265200 + (builtin2.EpochsInHour * 60), + UpgradeOrangeHeight: 336458, + UpgradeClausHeight: 343200, // 2020-12-22T02:00:00Z + UpgradeTrustHeight: 550321, // 2021-03-04T00:00:30Z + UpgradeNorwegianHeight: 665280, // 2021-04-12T22:00:00Z + UpgradeTurboHeight: 712320, // 2021-04-29T06:00:00Z + UpgradeHyperdriveHeight: 892800, // 2021-06-30T22:00:00Z + UpgradeChocolateHeight: 1231620, + UpgradeOhSnapHeight: 1594680, // 2022-03-01T15:00:00Z + UpgradeSkyrHeight: 1960320, // 2022-07-06T14:00:00Z + UpgradeSharkHeight: 2383680, // 2022-11-30T14:00:00Z + UpgradeHyggeHeight: 2683348, // 2023-03-14T15:14:00Z + UpgradeLightningHeight: 2809800, // 2023-04-27T13:00:00Z + UpgradeThunderHeight: 2809800 + 2880*21, // 2023-05-18T13:00:00Z + UpgradeWatermelonHeight: 3469380, // 2023-12-12T13:30:00Z + UpgradeWatermelonFixHeight: -100, // This fix upgrade only ran on calibrationnet + UpgradeWatermelonFix2Height: -101, // This fix upgrade only ran on calibrationnet + UpgradeDragonHeight: 3855360, // 2024-04-24T14:00:00Z + UpgradeCalibrationDragonFixHeight: -102, // This fix upgrade only ran on calibrationnet + UpgradeWaffleHeight: 4154640, // 2024-08-06T12:00:00Z + UpgradeTuktukHeight: 9999999, + UpgradeTuktukPowerRampDurationEpochs: builtin2.EpochsInYear, }, DrandSchedule: map[abi.ChainEpoch]config.DrandEnum{0: 5, 51000: 1}, AddressNetwork: address.Mainnet, @@ -77,6 +80,8 @@ func Mainnet() *NetworkConf { F3Enabled: true, F3BootstrapEpoch: -1, ManifestServerID: "12D3KooWENMwUF9YxvQxar7uBWJtZkA6amvK4xWmKXfSiHUo2Qq7", + F3Consensus: false, + F3InitialPowerTableCID: cid.Undef, }, } diff --git a/fixtures/networks/net_2k.go b/fixtures/networks/net_2k.go index 1668719ea3..fd1846a7b5 100644 --- a/fixtures/networks/net_2k.go +++ b/fixtures/networks/net_2k.go @@ -6,6 +6,7 @@ import ( "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/venus/pkg/config" "github.com/filecoin-project/venus/venus-shared/types" + "github.com/ipfs/go-cid" ) func Net2k() *NetworkConf { @@ -17,7 +18,7 @@ func Net2k() *NetworkConf { Network: config.NetworkParamsConfig{ DevNet: true, NetworkType: types.Network2k, - GenesisNetworkVersion: network.Version22, + GenesisNetworkVersion: network.Version23, ReplaceProofTypes: []abi.RegisteredSealProof{ abi.RegisteredSealProof_StackedDrg2KiBV1, abi.RegisteredSealProof_StackedDrg8MiBV1, @@ -27,37 +28,39 @@ func Net2k() *NetworkConf { MinVerifiedDealSize: 256, PreCommitChallengeDelay: abi.ChainEpoch(10), ForkUpgradeParam: &config.ForkUpgradeConfig{ - BreezeGasTampingDuration: 0, - UpgradeBreezeHeight: -1, - UpgradeSmokeHeight: -2, - UpgradeIgnitionHeight: -3, - UpgradeRefuelHeight: -4, - UpgradeTapeHeight: -5, - UpgradeAssemblyHeight: -6, - UpgradeLiftoffHeight: -7, - UpgradeKumquatHeight: -8, - UpgradeCalicoHeight: -9, - UpgradePersianHeight: -10, - UpgradeOrangeHeight: -11, - UpgradeClausHeight: -12, - UpgradeTrustHeight: -13, - UpgradeNorwegianHeight: -14, - UpgradeTurboHeight: -15, - UpgradeHyperdriveHeight: -16, - UpgradeChocolateHeight: -17, - UpgradeOhSnapHeight: -18, - UpgradeSkyrHeight: -19, - UpgradeSharkHeight: -20, - UpgradeHyggeHeight: -21, - UpgradeLightningHeight: -22, - UpgradeThunderHeight: -23, - UpgradeWatermelonHeight: -24, - UpgradeWatermelonFixHeight: -100, // This fix upgrade only ran on calibrationnet - UpgradeWatermelonFix2Height: -101, // This fix upgrade only ran on calibrationnet - UpgradeDragonHeight: -25, - UpgradeCalibrationDragonFixHeight: -102, // This fix upgrade only ran on calibrationnet - UpgradePhoenixHeight: -26, - UpgradeWaffleHeight: 200, + BreezeGasTampingDuration: 0, + UpgradeBreezeHeight: -1, + UpgradeSmokeHeight: -2, + UpgradeIgnitionHeight: -3, + UpgradeRefuelHeight: -4, + UpgradeTapeHeight: -5, + UpgradeAssemblyHeight: -6, + UpgradeLiftoffHeight: -7, + UpgradeKumquatHeight: -8, + UpgradeCalicoHeight: -9, + UpgradePersianHeight: -10, + UpgradeOrangeHeight: -11, + UpgradeClausHeight: -12, + UpgradeTrustHeight: -13, + UpgradeNorwegianHeight: -14, + UpgradeTurboHeight: -15, + UpgradeHyperdriveHeight: -16, + UpgradeChocolateHeight: -17, + UpgradeOhSnapHeight: -18, + UpgradeSkyrHeight: -19, + UpgradeSharkHeight: -20, + UpgradeHyggeHeight: -21, + UpgradeLightningHeight: -22, + UpgradeThunderHeight: -23, + UpgradeWatermelonHeight: -24, + UpgradeWatermelonFixHeight: -100, // This fix upgrade only ran on calibrationnet + UpgradeWatermelonFix2Height: -101, // This fix upgrade only ran on calibrationnet + UpgradeDragonHeight: -25, + UpgradeCalibrationDragonFixHeight: -102, // This fix upgrade only ran on calibrationnet + UpgradePhoenixHeight: -26, + UpgradeWaffleHeight: -27, + UpgradeTuktukPowerRampDurationEpochs: 200, + UpgradeTuktukHeight: 200, }, DrandSchedule: map[abi.ChainEpoch]config.DrandEnum{0: config.DrandQuicknet}, AddressNetwork: address.Testnet, @@ -68,6 +71,8 @@ func Net2k() *NetworkConf { F3Enabled: true, F3BootstrapEpoch: 1000, ManifestServerID: "12D3KooWHcNBkqXEBrsjoveQvj6zDF3vK5S9tAfqyYaQF1LGSJwG", + F3Consensus: true, + F3InitialPowerTableCID: cid.Undef, }, } diff --git a/fixtures/networks/network_parse.go b/fixtures/networks/network_parse.go index 91914edb6d..370969261b 100644 --- a/fixtures/networks/network_parse.go +++ b/fixtures/networks/network_parse.go @@ -5,10 +5,14 @@ import ( "strings" "github.com/filecoin-project/venus/pkg/config" + "github.com/filecoin-project/venus/pkg/constants" "github.com/filecoin-project/venus/venus-shared/types" "github.com/filecoin-project/venus/venus-shared/utils" + logging "github.com/ipfs/go-log/v2" ) +var log = logging.Logger("network-params") + func GetNetworkFromName(name string) (types.NetworkType, error) { if name == "2k" || strings.HasPrefix(name, "localnet-") { return types.Network2k, nil @@ -43,6 +47,11 @@ func SetConfigFromNetworkType(cfg *config.Config, networkType types.NetworkType) cfg.NetworkParams = &netcfg.Network // not change, expect to adjust the value through the configuration file cfg.NetworkParams.AllowableClockDriftSecs = oldAllowableClockDriftSecs + + if constants.DisableF3 { + cfg.NetworkParams.F3Enabled = false + log.Warnf("F3 is disabled") + } return nil } diff --git a/go.mod b/go.mod index 10225dd721..6b7acb4e31 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/filecoin-project/venus -go 1.21 +go 1.22 require ( contrib.go.opencensus.io/exporter/prometheus v0.4.2 @@ -20,21 +20,21 @@ require ( github.com/etherlabsio/healthcheck/v2 v2.0.0 github.com/fatih/color v1.15.0 github.com/filecoin-project/filecoin-ffi v0.30.4-0.20200910194244-f640612a1a1f - github.com/filecoin-project/go-address v1.1.0 - github.com/filecoin-project/go-amt-ipld/v4 v4.2.0 + github.com/filecoin-project/go-address v1.2.0 + github.com/filecoin-project/go-amt-ipld/v4 v4.4.0 github.com/filecoin-project/go-bitfield v0.2.4 github.com/filecoin-project/go-cbor-util v0.0.1 github.com/filecoin-project/go-commp-utils v0.1.3 - github.com/filecoin-project/go-crypto v0.0.1 + github.com/filecoin-project/go-crypto v0.1.0 github.com/filecoin-project/go-data-transfer/v2 v2.0.0-rc6 - github.com/filecoin-project/go-f3 v0.2.0 - github.com/filecoin-project/go-fil-commcid v0.1.0 + github.com/filecoin-project/go-f3 v0.7.0 + github.com/filecoin-project/go-fil-commcid v0.2.0 github.com/filecoin-project/go-fil-markets v1.28.2 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-paramfetch v0.0.4 - github.com/filecoin-project/go-state-types v0.14.0 + github.com/filecoin-project/go-state-types v0.15.0-rc1 github.com/filecoin-project/pubsub v1.0.0 - github.com/filecoin-project/specs-actors v0.9.15 + github.com/filecoin-project/specs-actors v0.9.15-0.20220514164640-94e0d5e123bd github.com/filecoin-project/specs-actors/v2 v2.3.6 github.com/filecoin-project/specs-actors/v3 v3.1.2 github.com/filecoin-project/specs-actors/v4 v4.0.2 @@ -81,7 +81,6 @@ require ( github.com/libp2p/go-libp2p-kad-dht v0.25.2 github.com/libp2p/go-libp2p-pubsub v0.11.0 github.com/libp2p/go-msgio v0.3.0 - github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 github.com/mitchellh/go-homedir v1.1.0 github.com/multiformats/go-multiaddr v0.12.4 github.com/multiformats/go-multiaddr-dns v0.3.1 @@ -95,7 +94,7 @@ require ( github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e github.com/stretchr/testify v1.9.0 github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 - github.com/whyrusleeping/cbor-gen v0.1.1 + github.com/whyrusleeping/cbor-gen v0.1.2 github.com/whyrusleeping/go-sysinfo v0.0.0-20190219211824-4a357d4b90b1 github.com/zyedidia/generic v1.2.1 go.opencensus.io v0.24.0 @@ -104,12 +103,12 @@ require ( go.opentelemetry.io/otel/exporters/prometheus v0.50.0 go.opentelemetry.io/otel/sdk v1.28.0 go.uber.org/zap v1.27.0 - golang.org/x/crypto v0.24.0 - golang.org/x/net v0.26.0 + golang.org/x/crypto v0.27.0 + golang.org/x/net v0.29.0 golang.org/x/oauth2 v0.21.0 - golang.org/x/sync v0.7.0 - golang.org/x/sys v0.21.0 - golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 + golang.org/x/sync v0.8.0 + golang.org/x/sys v0.25.0 + golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da gopkg.in/cheggaaa/pb.v1 v1.0.28 gorm.io/driver/mysql v1.1.1 gorm.io/gorm v1.21.12 @@ -117,8 +116,12 @@ require ( ) require ( - github.com/Kubuxu/go-broadcast v0.0.0-20240621161059-1a8c90734cd6 // indirect + github.com/bits-and-blooms/bitset v1.13.0 // indirect + github.com/consensys/bavard v0.1.13 // indirect + github.com/consensys/gnark-crypto v0.12.1 // indirect github.com/filecoin-project/go-clock v0.1.0 // indirect + github.com/filecoin-project/go-commp-utils/v2 v2.1.0 // indirect + github.com/filecoin-project/go-fil-commp-hashhash v0.2.0 // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/ipfs/go-blockservice v0.5.2 // indirect github.com/ipfs/go-ipfs-blockstore v1.3.1 // indirect @@ -127,6 +130,8 @@ require ( github.com/ipfs/go-ipfs-exchange-interface v0.2.1 // indirect github.com/ipfs/go-merkledag v0.11.0 // indirect github.com/libp2p/go-libp2p-routing-helpers v0.7.3 // indirect + github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 // indirect + github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 // indirect github.com/pion/datachannel v1.5.6 // indirect @@ -147,10 +152,14 @@ require ( github.com/pion/webrtc/v3 v3.2.40 // indirect github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 // indirect github.com/whyrusleeping/go-logging v0.0.1 // indirect + gitlab.com/yawning/secp256k1-voi v0.0.0-20230925100816-f2616030848b // indirect + gitlab.com/yawning/tuplehash v0.0.0-20230713102510-df83abbf9a02 // indirect + go.dedis.ch/kyber/v4 v4.0.0-pre2.0.20240924132404-4de33740016e // indirect go.uber.org/mock v0.4.0 // indirect gonum.org/v1/gonum v0.15.0 // indirect google.golang.org/genproto v0.0.0-20230629202037-9506855d4529 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240515191416-fc5f0ca64291 // indirect + rsc.io/tmplfunc v0.0.3 // indirect ) require ( @@ -181,11 +190,10 @@ require ( github.com/elastic/gosigar v0.14.2 // indirect github.com/filecoin-project/go-amt-ipld/v2 v2.1.1-0.20201006184820-924ee87a1349 // indirect github.com/filecoin-project/go-amt-ipld/v3 v3.1.0 // indirect - github.com/filecoin-project/go-commp-utils/nonffi v0.0.0-20220905160352-62059082a837 // indirect github.com/filecoin-project/go-ds-versioning v0.1.2 // 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/filecoin-project/go-hamt-ipld/v3 v3.1.0 // indirect + github.com/filecoin-project/go-hamt-ipld/v3 v3.4.0 // indirect github.com/filecoin-project/go-padreader v0.0.1 // indirect github.com/filecoin-project/go-statemachine v1.0.3 // indirect github.com/filecoin-project/go-statestore v0.2.0 // indirect @@ -242,7 +250,6 @@ require ( github.com/ipfs/go-verifcid v0.0.3 // indirect github.com/ipld/go-codec-dagpb v1.6.0 // indirect github.com/ipld/go-ipld-prime v0.21.0 - github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 // indirect github.com/jackpal/go-nat-pmp v1.0.2 // indirect github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect github.com/jinzhu/inflection v1.0.0 // indirect @@ -251,7 +258,7 @@ require ( github.com/json-iterator/go v1.1.12 // indirect github.com/kilic/bls12-381 v0.1.1-0.20220929213557-ca162e8a70f4 // indirect github.com/klauspost/compress v1.17.9 - github.com/klauspost/cpuid/v2 v2.2.7 // indirect + github.com/klauspost/cpuid/v2 v2.2.8 // indirect github.com/koron/go-ssdp v0.0.4 // indirect github.com/leodido/go-urn v1.2.4 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect @@ -333,12 +340,12 @@ require ( go.uber.org/multierr v1.11.0 go4.org v0.0.0-20200411211856-f5505b9728dd // indirect golang.org/x/arch v0.3.0 // indirect - golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect - golang.org/x/mod v0.17.0 // indirect - golang.org/x/term v0.21.0 // indirect - golang.org/x/text v0.16.0 // indirect - golang.org/x/time v0.5.0 // indirect - golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect + golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e // indirect + golang.org/x/mod v0.20.0 // indirect + golang.org/x/term v0.24.0 // indirect + golang.org/x/text v0.18.0 // indirect + golang.org/x/time v0.6.0 // indirect + golang.org/x/tools v0.24.0 // indirect google.golang.org/api v0.81.0 // indirect google.golang.org/grpc v1.64.0 // indirect google.golang.org/protobuf v1.34.2 // indirect diff --git a/go.sum b/go.sum index edecba8f74..4b1c410f18 100644 --- a/go.sum +++ b/go.sum @@ -74,8 +74,6 @@ github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee h1:8doiS7ib3zi6/K172oDhSKU0dJ/miJramo9NITOMyZQ= github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee/go.mod h1:W0GbEAA4uFNYOGG2cJpmFJ04E6SD1NLELPYZB57/7AY= -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 h1:EJiD2VUQyh5A9hWJLmc6iWg6yIcJ7jpBcwC8GMGXfDk= github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= @@ -113,6 +111,8 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bep/debounce v1.2.1 h1:v67fRdBA9UQu2NhLFXrSg0Brw7CexQekrBwDMM8bzeY= github.com/bep/debounce v1.2.1/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0= +github.com/bits-and-blooms/bitset v1.13.0 h1:bAQ9OPNFYbGHV6Nez0tmNI0RiEu7/hxlYJRUA0wFAVE= +github.com/bits-and-blooms/bitset v1.13.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/bluele/gcache v0.0.0-20190518031135-bc40bd653833 h1:yCfXxYaelOyqnia8F/Yng47qhmfC9nKTRIbYRrRueq4= github.com/bluele/gcache v0.0.0-20190518031135-bc40bd653833/go.mod h1:8c4/i2VlovMO2gBnHGQPN5EJw+H0lx1u/5p+cgsXtCk= github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= @@ -146,8 +146,8 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= -github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= +github.com/cloudflare/circl v1.3.9 h1:QFrlgFYf2Qpi8bSpVPK1HBvWpx16v/1TZivyo7pGuBE= +github.com/cloudflare/circl v1.3.9/go.mod h1:PDRU+oXvdD7KCtgKxW95M5Z8BpSCJXQORiZFnBQS5QU= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= @@ -157,6 +157,10 @@ github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= +github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= @@ -246,8 +250,9 @@ github.com/filecoin-project/dagstore v0.5.2 h1:Nd6oXdnolbbVhpMpkYT5PJHOjQp4OBSnt github.com/filecoin-project/dagstore v0.5.2/go.mod h1:mdqKzYrRBHf1pRMthYfMv3n37oOw0Tkx7+TxPt240M0= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= -github.com/filecoin-project/go-address v1.1.0 h1:ofdtUtEsNxkIxkDw67ecSmvtzaVSdcea4boAmLbnHfE= github.com/filecoin-project/go-address v1.1.0/go.mod h1:5t3z6qPmIADZBtuE9EIzi0EwzcRy2nVhpo0I/c1r0OA= +github.com/filecoin-project/go-address v1.2.0 h1:NHmWUE/J7Pi2JZX3gZt32XuY69o9StVZeJxdBodIwOE= +github.com/filecoin-project/go-address v1.2.0/go.mod h1:kQEQ4qZ99a51X7DjT9HiMT4yR6UwLJ9kznlxsOIeDAg= github.com/filecoin-project/go-amt-ipld/v2 v2.1.0/go.mod h1:nfFPoGyX0CU9SkXX8EoCcSuHN1XcbN0c6KBh7yvP5fs= github.com/filecoin-project/go-amt-ipld/v2 v2.1.1-0.20201006184820-924ee87a1349 h1:pIuR0dnMD0i+as8wNnjjHyQrnhP5O5bmba/lmgQeRgU= github.com/filecoin-project/go-amt-ipld/v2 v2.1.1-0.20201006184820-924ee87a1349/go.mod h1:vgmwKBkx+ca5OIeEvstiQgzAZnb7R6QaqE1oEDSqa6g= @@ -255,8 +260,9 @@ github.com/filecoin-project/go-amt-ipld/v3 v3.0.0/go.mod h1:Qa95YNAbtoVCTSVtX38a github.com/filecoin-project/go-amt-ipld/v3 v3.1.0 h1:ZNJ9tEG5bE72vBWYiuh5bkxJVM3ViHNOmQ7qew9n6RE= github.com/filecoin-project/go-amt-ipld/v3 v3.1.0/go.mod h1:UjM2QhDFrrjD5s1CdnkJkat4ga+LqZBZgTMniypABRo= github.com/filecoin-project/go-amt-ipld/v4 v4.0.0/go.mod h1:gF053YQ4BIpzTNDoEwHZas7U3oAwncDVGvOHyY8oDpE= -github.com/filecoin-project/go-amt-ipld/v4 v4.2.0 h1:DQTXQwMXxaetd+lhZGODjt5qC1WYT7tMAlYrWqI/fwI= github.com/filecoin-project/go-amt-ipld/v4 v4.2.0/go.mod h1:0eDVF7pROvxrsxvLJx+SJZXqRaXXcEPUcgb/rG0zGU4= +github.com/filecoin-project/go-amt-ipld/v4 v4.4.0 h1:6kvvMeSpIy4GTU5t3vPHZgWYIMRzGRKLJ73s/cltsoc= +github.com/filecoin-project/go-amt-ipld/v4 v4.4.0/go.mod h1:msgmUxTyRBZ6iXt+5dnUDnIb7SEFqdPsbB1wyo/G3ts= github.com/filecoin-project/go-bitfield v0.2.0/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-bitfield v0.2.3/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-bitfield v0.2.4 h1:uZ7MeE+XfM5lqrHJZ93OnhQKc/rveW8p9au0C68JPgk= @@ -268,22 +274,25 @@ github.com/filecoin-project/go-clock v0.1.0 h1:SFbYIM75M8NnFm1yMHhN9Ahy3W5bEZV9g 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= github.com/filecoin-project/go-commp-utils/nonffi v0.0.0-20220905160352-62059082a837/go.mod h1:e2YBjSblNVoBckkbv3PPqsq71q98oFkFqL7s1etViGo= +github.com/filecoin-project/go-commp-utils/v2 v2.1.0 h1:KWNRalUp2bhN1SW7STsJS2AHs9mnfGKk9LnQgzDe+gI= +github.com/filecoin-project/go-commp-utils/v2 v2.1.0/go.mod h1:NbxJYlhxtWaNhlVCj/gysLNu26kYII83IV5iNrAO9iI= 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-crypto v0.1.0 h1:Pob2MphoipMbe/ksxZOMcQvmBHAd3sI/WEqcbpIsGI0= +github.com/filecoin-project/go-crypto v0.1.0/go.mod h1:K9UFXvvoyAVvB+0Le7oGlKiT9mgA5FHOJdYQXEE8IhI= github.com/filecoin-project/go-data-transfer/v2 v2.0.0-rc6 h1:EsbXTWsBKT764qtX4MMJBNXMHoEa+g5Xg01azMqxXX0= github.com/filecoin-project/go-data-transfer/v2 v2.0.0-rc6/go.mod h1:cX1acvFVWC5EXnnmFPWEFXbO7nLUdSZa+nqgi1QpTpw= github.com/filecoin-project/go-ds-versioning v0.1.2 h1:to4pTadv3IeV1wvgbCbN6Vqd+fu+7tveXgv/rCEZy6w= github.com/filecoin-project/go-ds-versioning v0.1.2/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4= -github.com/filecoin-project/go-f3 v0.2.0 h1:Gis44+hOrDjSUEw3IDmU7CudNILi5e+bb1pgZgp680k= -github.com/filecoin-project/go-f3 v0.2.0/go.mod h1:43fBLX0iX0+Nnw4Z91wSrdfDYAd6YEDexy7GcLnIJtk= +github.com/filecoin-project/go-f3 v0.7.0 h1:JNo39SAELT5hEn+rmQZbSJQBJfmGJtp70RfyWJrIayY= +github.com/filecoin-project/go-f3 v0.7.0/go.mod h1:QoxuoK4aktNZD1R/unlhNbhV6TnlNTAbA/QODCnAjak= 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= -github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= -github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= +github.com/filecoin-project/go-fil-commcid v0.2.0 h1:B+5UX8XGgdg/XsdUpST4pEBviKkFOw+Fvl2bLhSKGpI= +github.com/filecoin-project/go-fil-commcid v0.2.0/go.mod h1:8yigf3JDIil+/WpqR5zoKyP0jBPCOGtEqq/K1CcMy9Q= +github.com/filecoin-project/go-fil-commp-hashhash v0.2.0 h1:HYIUugzjq78YvV3vC6rL95+SfC/aSTVSnZSZiDV5pCk= +github.com/filecoin-project/go-fil-commp-hashhash v0.2.0/go.mod h1:VH3fAFOru4yyWar4626IoS5+VGE8SfZiBODJLUigEo4= github.com/filecoin-project/go-fil-markets v1.28.2 h1:Ev9o8BYow+lo97Bwc6oOmZ2OxdiHeIDCQsfF/w/Vldc= github.com/filecoin-project/go-fil-markets v1.28.2/go.mod h1:qy9LNu9t77I184VB6Pa4WKRtGfB8Vl0t8zfOLHkDqWY= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= @@ -291,8 +300,9 @@ github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CW github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0/go.mod h1:7aWZdaQ1b16BVoQUYR+eEvrDCGJoPLxFpDynFjYfBjI= github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1/go.mod h1:gXpNmr3oQx8l3o7qkGyDjJjYSRX7hp/FGOStdqrWyDI= -github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AGIZzeifggxtKMU7zmI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= +github.com/filecoin-project/go-hamt-ipld/v3 v3.4.0 h1:nYs6OPUF8KbZ3E8o9p9HJnQaE8iugjHR5WYVMcicDJc= +github.com/filecoin-project/go-hamt-ipld/v3 v3.4.0/go.mod h1:s0qiHRhFyrgW0SvdQMSJFQxNa4xEIG5XvqCBZUEgcbc= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= @@ -306,8 +316,8 @@ github.com/filecoin-project/go-state-types v0.1.4/go.mod h1:xCA/WfKlC2zcn3fUmDv4 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.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-state-types v0.15.0-rc1 h1:tfXvhMAAo4jBQIEM1AjQzDCbwqvsxVMOLhIcDYf10fA= +github.com/filecoin-project/go-state-types v0.15.0-rc1/go.mod h1:YcWoJE/24XGEL6w9FjUoMBu7+eHEkgwKnkGZkTBX9TE= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= 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= @@ -317,9 +327,8 @@ github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lI github.com/filecoin-project/pubsub v1.0.0 h1:ZTmT27U07e54qV1mMiQo4HDr0buo8I1LDHBYLXlsNXM= github.com/filecoin-project/pubsub v1.0.0/go.mod h1:GkpB33CcUtUNrLPhJgfdy4FDx4OMNR9k+46DHx/Lqrg= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= +github.com/filecoin-project/specs-actors v0.9.15-0.20220514164640-94e0d5e123bd h1:PoQ9+o9zjqD7gBMAvG0nwvpmmONo2lFajmjIfzlqeFc= github.com/filecoin-project/specs-actors v0.9.15-0.20220514164640-94e0d5e123bd/go.mod h1:pjGEe3QlWtK20ju/aFRsiArbMX6Cn8rqEhhsiCM9xYE= -github.com/filecoin-project/specs-actors v0.9.15 h1:3VpKP5/KaDUHQKAMOg4s35g/syDaEBueKLws0vbsjMc= -github.com/filecoin-project/specs-actors v0.9.15/go.mod h1:pjGEe3QlWtK20ju/aFRsiArbMX6Cn8rqEhhsiCM9xYE= github.com/filecoin-project/specs-actors/v2 v2.3.6 h1:UxnWTfQd7JsOae39/aHCK0m1IBjdcyymCJfqxuSkn+g= github.com/filecoin-project/specs-actors/v2 v2.3.6/go.mod h1:DJMpxVRXvev9t8P0XWA26RmTzN+MHiL9IlItVLT0zUc= github.com/filecoin-project/specs-actors/v3 v3.1.2 h1:Gq3gAbvdGLA/D0GKz1IJfewt9Fh7gA32TPt46Xv+1Cw= @@ -519,6 +528,7 @@ github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20240509144519-723abb6459b7 h1:velgFPYr1X9TDwLIfkV7fWqsFlf7TeP11M/7kPd/dVI= github.com/google/pprof v0.0.0-20240509144519-723abb6459b7/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -537,8 +547,9 @@ github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f h1:KMlcu9X58lhTA/KrfX8Bi1LQSO4pzoVjTiL3h4Jk+Zk= github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g= +github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= @@ -763,7 +774,6 @@ github.com/ipni/go-libipni v0.0.7 h1:L0AnFQagedfJU5mJ7kz0H8P1452brJveOQeS6p3MmbA github.com/ipni/go-libipni v0.0.7/go.mod h1:TlGZaGMGIVpeb6fiwttfY1JgaMnH+HDVPzxgRJJPaQY= github.com/ipni/index-provider v0.12.0 h1:R3F6dxxKNv4XkE4GJZNLOG0bDEbBQ/S5iztXwSD8jhQ= github.com/ipni/index-provider v0.12.0/go.mod h1:GhyrADJp7n06fqoc1djzkvL4buZYHzV8SoWrlxEo5F4= -github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4= github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= @@ -818,8 +828,8 @@ github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ib github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= -github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM= +github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= @@ -840,6 +850,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= +github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= @@ -981,6 +993,9 @@ github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrk github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= +github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -1363,8 +1378,8 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20210118024343-169e9d70c0c2/go.mod h1:f github.com/whyrusleeping/cbor-gen v0.0.0-20210303213153-67a261a1d291/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20220323183124-98fa8256a799/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.1.0/go.mod h1:pM99HXyEbSQHcosHc0iW7YFmwnscr+t9Te4ibko05so= -github.com/whyrusleeping/cbor-gen v0.1.1 h1:eKfcJIoxivjMtwfCfmJAqSF56MHcWqyIScXwaC1VBgw= -github.com/whyrusleeping/cbor-gen v0.1.1/go.mod h1:pM99HXyEbSQHcosHc0iW7YFmwnscr+t9Te4ibko05so= +github.com/whyrusleeping/cbor-gen v0.1.2 h1:WQFlrPhpcQl+M2/3dP5cvlTLWPVsL6LGBb9jJt6l/cA= +github.com/whyrusleeping/cbor-gen v0.1.2/go.mod h1:pM99HXyEbSQHcosHc0iW7YFmwnscr+t9Te4ibko05so= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8= github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 h1:EKhdznlJHPMoKr0XTrX+IlJs1LH3lyx2nfr1dOlZ79k= @@ -1394,8 +1409,14 @@ github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/zyedidia/generic v1.2.1 h1:Zv5KS/N2m0XZZiuLS82qheRG4X1o5gsWreGb0hR7XDc= github.com/zyedidia/generic v1.2.1/go.mod h1:ly2RBz4mnz1yeuVbQA/VFwGjK3mnHGRj1JuoG336Bis= +gitlab.com/yawning/secp256k1-voi v0.0.0-20230925100816-f2616030848b h1:CzigHMRySiX3drau9C6Q5CAbNIApmLdat5jPMqChvDA= +gitlab.com/yawning/secp256k1-voi v0.0.0-20230925100816-f2616030848b/go.mod h1:/y/V339mxv2sZmYYR64O07VuCpdNZqCTwO8ZcouTMI8= +gitlab.com/yawning/tuplehash v0.0.0-20230713102510-df83abbf9a02 h1:qwDnMxjkyLmAFgcfgTnfJrmYKWhHnci3GjDqcZp1M3Q= +gitlab.com/yawning/tuplehash v0.0.0-20230713102510-df83abbf9a02/go.mod h1:JTnUj0mpYiAsuZLmKjTx/ex3AtMowcCgnE7YNyCEP0I= go.dedis.ch/fixbuf v1.0.3 h1:hGcV9Cd/znUxlusJ64eAlExS+5cJDIyTyEG+otu5wQs= go.dedis.ch/fixbuf v1.0.3/go.mod h1:yzJMt34Wa5xD37V5RTdmp38cz3QhMagdGoem9anUalw= +go.dedis.ch/kyber/v4 v4.0.0-pre2.0.20240924132404-4de33740016e h1:BAGc1ommHzlhqHktWyRmoldVONj3QHMzdfGLW4ItltA= +go.dedis.ch/kyber/v4 v4.0.0-pre2.0.20240924132404-4de33740016e/go.mod h1:tg6jwKTYEjm94VxkFwiQy+ec9hoQvccIU989wNjXWVI= go.dedis.ch/protobuf v1.0.11 h1:FTYVIEzY/bfl37lu3pR4lIj+F9Vp1jE8oh91VmxKgLo= go.dedis.ch/protobuf v1.0.11/go.mod h1:97QR256dnkimeNdfmURz0wAMNVbd1VmLXhG1CrTYrJ4= go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= @@ -1495,12 +1516,15 @@ golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= 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.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= -golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= +golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A= +golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70= 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= @@ -1511,8 +1535,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= -golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= +golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e h1:I88y4caeGeuDQxgdoFPUq097j7kNfw6uvuiNxUBfcBk= +golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1541,8 +1565,11 @@ golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0= +golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1607,11 +1634,13 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= 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.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= -golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= 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= @@ -1651,8 +1680,11 @@ golang.org/x/sync v0.0.0-20220513210516-0976fa681c29/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180202135801-37707fdb30a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1764,12 +1796,16 @@ golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= -golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= 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-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1779,12 +1815,15 @@ golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= 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.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA= -golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4= +golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM= +golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8= 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= @@ -1799,15 +1838,18 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= 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.13.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.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= 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= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= -golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= +golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1872,16 +1914,19 @@ golang.org/x/tools v0.1.4/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.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24= +golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ= 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= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= gonum.org/v1/gonum v0.15.0 h1:2lYxjRbTYyxkJxlhC+LvJIx3SsANPdRybu1tGj9/OrQ= gonum.org/v1/gonum v0.15.0/go.mod h1:xzZVBJBtS+Mz4q0Yl2LJTk+OxOg4jiXZ7qBoM0uISGo= google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= @@ -2127,5 +2172,7 @@ rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8 rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= diff --git a/pkg/beacon/mock.go b/pkg/beacon/mock.go index 83eb418223..991848f2fc 100644 --- a/pkg/beacon/mock.go +++ b/pkg/beacon/mock.go @@ -5,22 +5,31 @@ import ( "context" "encoding/binary" "fmt" + "sync" "time" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/venus/venus-shared/types" - "github.com/minio/blake2b-simd" + "golang.org/x/crypto/blake2b" ) -// Mock beacon assumes that filecoin rounds are 1:1 mapped with the beacon rounds -type mockBeacon struct { - interval time.Duration +// MockBeacon assumes that filecoin rounds are 1:1 mapped with the beacon rounds +type MockBeacon struct { + interval time.Duration + maxIndex int + waitingEntry int + lk sync.Mutex + cond *sync.Cond } -func NewMockBeacon(interval time.Duration) RandomBeacon { - mb := &mockBeacon{interval: interval} +func (mb *MockBeacon) IsChained() bool { + return true +} +func NewMockBeacon(interval time.Duration) RandomBeacon { + mb := &MockBeacon{interval: interval, maxIndex: -1} + mb.cond = sync.NewCond(&mb.lk) return mb } @@ -31,15 +40,35 @@ func NewMockSchedule(interval time.Duration) Schedule { }} } -func (mb *mockBeacon) IsChained() bool { - return true +// SetMaxIndex sets the maximum index that the beacon will return, and optionally blocks until all +// waiting requests are satisfied. If maxIndex is -1, the beacon will return entries indefinitely. +func (mb *MockBeacon) SetMaxIndex(maxIndex int, blockTillNoneWaiting bool) { + mb.lk.Lock() + defer mb.lk.Unlock() + mb.maxIndex = maxIndex + mb.cond.Broadcast() + if !blockTillNoneWaiting { + return + } + + for mb.waitingEntry > 0 { + mb.cond.Wait() + } +} + +// WaitingOnEntryCount returns the number of requests that are currently waiting for an entry. Where +// maxIndex has not been set, this will always return 0 as beacon entries are generated on demand. +func (mb *MockBeacon) WaitingOnEntryCount() int { + mb.lk.Lock() + defer mb.lk.Unlock() + return mb.waitingEntry } -func (mb *mockBeacon) RoundTime() time.Duration { +func (mb *MockBeacon) RoundTime() time.Duration { return mb.interval } -func (mb *mockBeacon) entryForIndex(index uint64) types.BeaconEntry { +func (mb *MockBeacon) entryForIndex(index uint64) types.BeaconEntry { buf := make([]byte, 8) binary.BigEndian.PutUint64(buf, index) rval := blake2b.Sum256(buf) @@ -49,14 +78,32 @@ func (mb *mockBeacon) entryForIndex(index uint64) types.BeaconEntry { } } -func (mb *mockBeacon) Entry(ctx context.Context, index uint64) <-chan Response { - e := mb.entryForIndex(index) +func (mb *MockBeacon) Entry(ctx context.Context, index uint64) <-chan Response { out := make(chan Response, 1) - out <- Response{Entry: e} + + mb.lk.Lock() + defer mb.lk.Unlock() + + if mb.maxIndex >= 0 && index > uint64(mb.maxIndex) { + mb.waitingEntry++ + go func() { + mb.lk.Lock() + defer mb.lk.Unlock() + for index > uint64(mb.maxIndex) { + mb.cond.Wait() + } + out <- Response{Entry: mb.entryForIndex(index)} + mb.waitingEntry-- + mb.cond.Broadcast() + }() + } else { + out <- Response{Entry: mb.entryForIndex(index)} + } + return out } -func (mb *mockBeacon) VerifyEntry(from types.BeaconEntry, _prevEntrySig []byte) error { +func (mb *MockBeacon) VerifyEntry(from types.BeaconEntry, _prevEntrySig []byte) error { // TODO: cache this, especially for bls oe := mb.entryForIndex(from.Round) if !bytes.Equal(from.Data, oe.Data) { @@ -65,9 +112,9 @@ func (mb *mockBeacon) VerifyEntry(from types.BeaconEntry, _prevEntrySig []byte) return nil } -func (mb *mockBeacon) MaxBeaconRoundForEpoch(nv network.Version, epoch abi.ChainEpoch) uint64 { +func (mb *MockBeacon) MaxBeaconRoundForEpoch(nv network.Version, epoch abi.ChainEpoch) uint64 { // offset for better testing return uint64(epoch + 100) } -var _ RandomBeacon = (*mockBeacon)(nil) +var _ RandomBeacon = (*MockBeacon)(nil) diff --git a/pkg/chain/circulating_supply.go b/pkg/chain/circulating_supply.go index b8c3a96ee0..ba6c2d9fb2 100644 --- a/pkg/chain/circulating_supply.go +++ b/pkg/chain/circulating_supply.go @@ -146,7 +146,8 @@ func (caculator *CirculatingSupplyCalculator) GetCirculatingSupply(ctx context.C a == builtin.BurntFundsActorAddr || a == builtin.SaftAddress || a == builtin.ReserveAddress || - a == builtin.EthereumAddressManagerActorAddr: + a == builtin.EthereumAddressManagerActorAddr || + a == builtin.DatacapActorAddr: unCirc = big.Add(unCirc, actor.Balance) diff --git a/pkg/chain/randomness.go b/pkg/chain/randomness.go index a2b68c1540..812e058d08 100644 --- a/pkg/chain/randomness.go +++ b/pkg/chain/randomness.go @@ -6,6 +6,7 @@ import ( "encoding/binary" "fmt" "math/rand" + "os" "github.com/filecoin-project/venus/pkg/beacon" "github.com/filecoin-project/venus/pkg/vm" @@ -14,8 +15,8 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/network" - "github.com/minio/blake2b-simd" "github.com/pkg/errors" + "golang.org/x/crypto/blake2b" ) type RandomSeed []byte @@ -54,6 +55,11 @@ func (g *GenesisRandomnessSource) GetChainRandomness(ctx context.Context, randEp _, _ = rand.New(rand.NewSource(int64(randEpoch))).Read(out) //nolint return *(*[32]byte)(out), nil } +func (g *GenesisRandomnessSource) GetBeaconEntry(_ context.Context, randEpoch abi.ChainEpoch) (*types.BeaconEntry, error) { + out := make([]byte, 32) + _, _ = rand.New(rand.NewSource(int64(randEpoch))).Read(out) //nolint + return &types.BeaconEntry{Round: 10, Data: out}, nil +} // Computes a random seed from raw ticket bytes. // A randomness seed is the VRF digest of the minimum ticket of the tipset at or before the requested epoch @@ -154,8 +160,8 @@ func (c *ChainRandomnessSource) GetChainRandomnessV1(ctx context.Context, round } // network v13 and on -func (c *ChainRandomnessSource) GetChainRandomnessV2(ctx context.Context, round abi.ChainEpoch) ([32]byte, error) { - ticket, err := c.getChainRandomness(ctx, round, false) +func (c *ChainRandomnessSource) GetChainRandomnessV2(ctx context.Context, round abi.ChainEpoch, lookback bool) ([32]byte, error) { + ticket, err := c.getChainRandomness(ctx, round, lookback) if err != nil { return [32]byte{}, err } @@ -167,58 +173,46 @@ func (c *ChainRandomnessSource) GetChainRandomness(ctx context.Context, filecoin nv := c.networkVersionGetter(ctx, filecoinEpoch) if nv >= network.Version13 { - return c.GetChainRandomnessV2(ctx, filecoinEpoch) + return c.GetChainRandomnessV2(ctx, filecoinEpoch, false) } - return c.GetChainRandomnessV2(ctx, filecoinEpoch) + return c.GetChainRandomnessV2(ctx, filecoinEpoch, true) } -// network v0-12 -func (c *ChainRandomnessSource) GetBeaconRandomnessV1(ctx context.Context, round abi.ChainEpoch) ([32]byte, error) { - randTS, err := c.GetBeaconRandomnessTipset(ctx, round, true) +func (c *ChainRandomnessSource) GetBeaconRandomness(ctx context.Context, filecoinEpoch abi.ChainEpoch) ([32]byte, error) { + be, err := c.GetBeaconEntry(ctx, filecoinEpoch) if err != nil { return [32]byte{}, err } + return blake2b.Sum256(be.Data), nil +} - be, err := FindLatestDRAND(ctx, randTS, c.reader) +// network v0-12 +func (c *ChainRandomnessSource) getBeaconEntryV1(ctx context.Context, round abi.ChainEpoch) (*types.BeaconEntry, error) { + randTS, err := c.GetBeaconRandomnessTipset(ctx, round, true) if err != nil { - return [32]byte{}, err + return nil, err } - return blake2b.Sum256(be.Data), nil + return c.getLatestBeaconEntry(ctx, randTS) } // network v13 -func (c *ChainRandomnessSource) GetBeaconRandomnessV2(ctx context.Context, round abi.ChainEpoch) ([32]byte, error) { +func (c *ChainRandomnessSource) getBeaconEntryV2(ctx context.Context, round abi.ChainEpoch) (*types.BeaconEntry, error) { randTS, err := c.GetBeaconRandomnessTipset(ctx, round, false) if err != nil { - return [32]byte{}, err - } - - be, err := FindLatestDRAND(ctx, randTS, c.reader) - if err != nil { - return [32]byte{}, err + return nil, err } - return blake2b.Sum256(be.Data), nil + return c.getLatestBeaconEntry(ctx, randTS) } // network v14 and on -func (c *ChainRandomnessSource) GetBeaconRandomnessV3(ctx context.Context, filecoinEpoch abi.ChainEpoch) ([32]byte, error) { +func (c *ChainRandomnessSource) getBeaconEntryV3(ctx context.Context, filecoinEpoch abi.ChainEpoch) (*types.BeaconEntry, error) { if filecoinEpoch < 0 { - return c.GetBeaconRandomnessV2(ctx, filecoinEpoch) - } - - be, err := c.extractBeaconEntryForEpoch(ctx, filecoinEpoch) - if err != nil { - log.Errorf("failed to get beacon entry as expected: %s", err) - return [32]byte{}, err + return c.getBeaconEntryV2(ctx, filecoinEpoch) } - return blake2b.Sum256(be.Data), nil -} - -func (c *ChainRandomnessSource) extractBeaconEntryForEpoch(ctx context.Context, filecoinEpoch abi.ChainEpoch) (*types.BeaconEntry, error) { randTS, err := c.GetBeaconRandomnessTipset(ctx, filecoinEpoch, false) if err != nil { return nil, err @@ -228,6 +222,9 @@ func (c *ChainRandomnessSource) extractBeaconEntryForEpoch(ctx context.Context, round := c.beacon.BeaconForEpoch(filecoinEpoch).MaxBeaconRoundForEpoch(nv, filecoinEpoch) + // Search back for the beacon entry, in normal operation it should be in randTs but for devnets + // where the blocktime is faster than the beacon period we may need to search back a bit to find + // the beacon entry for the requested round. for i := 0; i < 20; i++ { cbe := randTS.Blocks()[0].BeaconEntries for _, v := range cbe { @@ -247,15 +244,51 @@ func (c *ChainRandomnessSource) extractBeaconEntryForEpoch(ctx context.Context, return nil, fmt.Errorf("didn't find beacon for round %d (epoch %d)", round, filecoinEpoch) } -func (c *ChainRandomnessSource) GetBeaconRandomness(ctx context.Context, randEpoch abi.ChainEpoch) ([32]byte, error) { +func (c *ChainRandomnessSource) GetBeaconEntry(ctx context.Context, randEpoch abi.ChainEpoch) (*types.BeaconEntry, error) { rnv := c.networkVersionGetter(ctx, randEpoch) if rnv >= network.Version14 { - return c.GetBeaconRandomnessV3(ctx, randEpoch) + be, err := c.getBeaconEntryV3(ctx, randEpoch) + if err != nil { + log.Errorf("failed to get beacon entry as expected: %s", err) + } + return be, err } else if rnv == network.Version13 { - return c.GetBeaconRandomnessV2(ctx, randEpoch) + return c.getBeaconEntryV2(ctx, randEpoch) + } + + return c.getBeaconEntryV1(ctx, randEpoch) +} + +func (c *ChainRandomnessSource) getLatestBeaconEntry(ctx context.Context, ts *types.TipSet) (*types.BeaconEntry, error) { + cur := ts + + // Search for a beacon entry, in normal operation one should be in the requested tipset, but for + // devnets where the blocktime is faster than the beacon period we may need to search back a bit + // to find a tipset with a beacon entry. + for i := 0; i < 20; i++ { + cbe := cur.Blocks()[0].BeaconEntries + if len(cbe) > 0 { + return &cbe[len(cbe)-1], nil + } + + if cur.Height() == 0 { + return nil, fmt.Errorf("made it back to genesis block without finding beacon entry") + } + + next, err := c.reader.GetTipSet(ctx, cur.Parents()) + if err != nil { + return nil, fmt.Errorf("failed to load parents when searching back for latest beacon entry: %w", err) + } + cur = next + } + + if os.Getenv("VENUS_IGNORE_DRAND") == "_yes_" { + return &types.BeaconEntry{ + Data: []byte{9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}, + }, nil } - return c.GetBeaconRandomnessV1(ctx, randEpoch) + return nil, fmt.Errorf("found NO beacon entries in the 20 latest tipsets") } // BlendEntropy get randomness with chain value. sha256(buf(tag, seed, epoch, entropy)) diff --git a/pkg/chain/store.go b/pkg/chain/store.go index ac47967fc9..514c325437 100644 --- a/pkg/chain/store.go +++ b/pkg/chain/store.go @@ -1096,24 +1096,73 @@ func (store *Store) Import(ctx context.Context, r io.Reader) (*types.TipSet, *ty return root, &tailBlock, nil } -// SetCheckPoint set current checkpoint -func (store *Store) SetCheckPoint(checkPoint types.TipSetKey) { - store.checkPoint = checkPoint -} - -// WriteCheckPoint writes the given cids to disk. -func (store *Store) WriteCheckPoint(ctx context.Context, cids types.TipSetKey) error { - log.Infof("WriteCheckPoint %v", cids) +// SetCheckpoint will set a checkpoint past which the chainstore will not allow forks. If the new +// checkpoint is not an ancestor of the current head, head will be set to the new checkpoint. +// +// NOTE: Checkpoints cannot be set beyond ForkLengthThreshold epochs in the past, but can be set +// arbitrarily far into the future. +// NOTE: The new checkpoint must already be synced. +func (store *Store) SetCheckpoint(ctx context.Context, ts *types.TipSet) error { + log.Infof("SetCheckPoint at %d: %v", ts.Height(), ts.Key()) buf := new(bytes.Buffer) - err := cids.MarshalCBOR(buf) + err := ts.Key().MarshalCBOR(buf) if err != nil { return err } - return store.ds.Put(ctx, CheckPoint, buf.Bytes()) + + store.mu.RLock() + defer store.mu.RUnlock() + + // Otherwise, this operation could get _very_ expensive. + if store.head.Height()-ts.Height() > policy.ChainFinality { + return fmt.Errorf("cannot set a checkpoint before the fork threshold") + } + + if !ts.Equals(store.head) { + anc, err := store.IsAncestorOf(ctx, ts, store.head) + if err != nil { + return fmt.Errorf("cannot determine whether checkpoint tipset is in main-chain: %w", err) + } + + if !anc { + if err := store.setHead(ctx, ts); err != nil { + return fmt.Errorf("failed to switch chains when setting checkpoint: %w", err) + } + } + } + + if err := store.ds.Put(ctx, CheckPoint, buf.Bytes()); err != nil { + return err + } + store.checkPoint = ts.Key() + + return nil +} + +// IsAncestorOf returns true if 'a' is an ancestor of 'b' +func (store *Store) IsAncestorOf(ctx context.Context, a, b *types.TipSet) (bool, error) { + if b.Height() <= a.Height() { + return false, nil + } + + cur := b + for !a.Equals(cur) && cur.Height() > a.Height() { + next, err := store.GetTipSet(ctx, cur.Parents()) + if err != nil { + return false, err + } + + cur = next + } + + return cur.Equals(a), nil } // GetCheckPoint get the check point from store or disk. func (store *Store) GetCheckPoint() types.TipSetKey { + store.mu.RLock() + defer store.mu.RUnlock() + return store.checkPoint } diff --git a/pkg/chain/weight_test.go b/pkg/chain/weight_test.go index ac34cf1d99..d0ba13d40e 100644 --- a/pkg/chain/weight_test.go +++ b/pkg/chain/weight_test.go @@ -5,8 +5,8 @@ import ( "testing" "github.com/ipfs/go-cid" - "github.com/minio/blake2b-simd" "github.com/stretchr/testify/require" + "golang.org/x/crypto/blake2b" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" diff --git a/pkg/chainsync/chainsync.go b/pkg/chainsync/chainsync.go index f9e444308d..91e4c63e30 100644 --- a/pkg/chainsync/chainsync.go +++ b/pkg/chainsync/chainsync.go @@ -26,6 +26,7 @@ type BlockProposer interface { SendOwnBlock(ci *types2.ChainInfo) error SendGossipBlock(ci *types2.ChainInfo) error IncomingBlocks(ctx context.Context) (<-chan *types2.BlockHeader, error) + SyncCheckpoint(ctx context.Context, tsk types2.TipSetKey) error } var _ = (BlockProposer)((*dispatcher.Dispatcher)(nil)) diff --git a/pkg/chainsync/dispatcher/dispatcher.go b/pkg/chainsync/dispatcher/dispatcher.go index de3478d62d..6a74eea3de 100644 --- a/pkg/chainsync/dispatcher/dispatcher.go +++ b/pkg/chainsync/dispatcher/dispatcher.go @@ -33,6 +33,7 @@ type dispatchSyncer interface { Head() *types2.TipSet HandleNewTipSet(context.Context, *types.Target) error ValidateMsgMeta(ctx context.Context, fblk *types2.FullBlock) error + SyncCheckpoint(ctx context.Context, tsk types2.TipSetKey) error } // NewDispatcher creates a new syncing dispatcher with default queue sizes. @@ -335,3 +336,7 @@ func (d *Dispatcher) processCtrl(ctrlMsg interface{}) { log.Info("dispatcher control can not handle type %T", typedMsg) } } + +func (d *Dispatcher) SyncCheckpoint(ctx context.Context, tsk types2.TipSetKey) error { + return d.syncer.SyncCheckpoint(ctx, tsk) +} diff --git a/pkg/chainsync/dispatcher/dispatcher_test.go b/pkg/chainsync/dispatcher/dispatcher_test.go index 134186f295..2a49a22f87 100644 --- a/pkg/chainsync/dispatcher/dispatcher_test.go +++ b/pkg/chainsync/dispatcher/dispatcher_test.go @@ -42,6 +42,10 @@ func (fs *mockSyncer) ValidateMsgMeta(ctx context.Context, fblk *types.FullBlock return nil } +func (fs *mockSyncer) SyncCheckpoint(ctx context.Context, tsk types.TipSetKey) error { + return nil +} + func TestDispatchStartHappy(t *testing.T) { tf.UnitTest(t) s := &mockSyncer{ diff --git a/pkg/chainsync/syncer/syncer.go b/pkg/chainsync/syncer/syncer.go index db369c33cf..bcf0dbe55b 100644 --- a/pkg/chainsync/syncer/syncer.go +++ b/pkg/chainsync/syncer/syncer.go @@ -7,11 +7,9 @@ import ( "sync/atomic" "time" - "github.com/filecoin-project/venus/pkg/consensus" "github.com/filecoin-project/venus/pkg/crypto" "github.com/filecoin-project/venus/pkg/repo" "github.com/filecoin-project/venus/pkg/statemanger" - "github.com/hashicorp/go-multierror" "github.com/ipfs-force-community/metrics" "golang.org/x/sync/errgroup" @@ -218,24 +216,6 @@ func (syncer *Syncer) syncOne(ctx context.Context, parent, next *types.TipSet) e } err = wg.Wait() if err != nil { - var rootNotMatch bool // nolint - - if merr, isok := err.(*multierror.Error); isok { - for _, e := range merr.Errors { - if isRootNotMatch(e) { - rootNotMatch = true - break - } - } - } else { - rootNotMatch = isRootNotMatch(err) // nolint - } - - if rootNotMatch { // nolint - // todo: should here rollback, and re-compute? - _ = syncer.stmgr.Rollback(ctx, parent, next) - } - return fmt.Errorf("validate mining failed %w", err) } } @@ -261,10 +241,6 @@ func (syncer *Syncer) syncOne(ctx context.Context, parent, next *types.TipSet) e return nil } -func isRootNotMatch(err error) bool { - return errors.Is(err, consensus.ErrStateRootMismatch) || errors.Is(err, consensus.ErrReceiptRootMismatch) -} - // HandleNewTipSet validates and syncs the chain rooted at the provided tipset // to a chain bsstore. Iff catchup is false then the syncer will set the head. func (syncer *Syncer) HandleNewTipSet(ctx context.Context, target *syncTypes.Target) (err error) { @@ -674,6 +650,54 @@ func (syncer *Syncer) Head() *types.TipSet { return syncer.chainStore.GetHead() } +func (syncer *Syncer) SyncCheckpoint(ctx context.Context, tsk types.TipSetKey) error { + if tsk.IsEmpty() { + return fmt.Errorf("called with empty tsk") + } + + ts, err := syncer.chainStore.GetTipSet(ctx, tsk) + if err != nil { + tss, err := syncer.exchangeClient.GetBlocks(ctx, tsk, 1) + if err != nil { + return fmt.Errorf("failed to fetch tipset: %w", err) + } else if len(tss) != 1 { + return fmt.Errorf("expected 1 tipset, got %d", len(tss)) + } + ts = tss[0] + } + + head := syncer.Head() + target := &syncTypes.Target{ + Head: ts, + Base: syncer.Head(), + Current: syncer.Head(), + Start: time.Now(), + } + if !head.Equals(ts) { + if anc, err := syncer.chainStore.IsAncestorOf(ctx, ts, head); err != nil { + return fmt.Errorf("failed to walk the chain when checkpointing: %w", err) + } else if !anc { + tipsets, err := syncer.fetchChainBlocks(ctx, head, target.Head) + if err != nil { + return errors.Wrapf(err, "failure fetching or validating headers") + } + logSyncer.Debugf("fetch header success at %v %s ...", tipsets[0].Height(), tipsets[0].Key()) + + err = syncer.syncSegement(ctx, target, tipsets) + if err != nil { + return fmt.Errorf("failed to sync segment: %w", err) + } + + } // else new checkpoint is on the current chain, we definitely have the tipsets. + } // else current head, no need to switch. + + if err := syncer.chainStore.SetCheckpoint(ctx, ts); err != nil { + return fmt.Errorf("failed to set the chain checkpoint: %w", err) + } + + return nil +} + // TODO: this function effectively accepts unchecked input from the network, // either validate it here, or ensure that its validated elsewhere (maybe make // sure the blocksync code checks it?) diff --git a/pkg/chainsync/syncer/syncer_integration_test.go b/pkg/chainsync/syncer/syncer_integration_test.go index 39644988af..85e02b4280 100644 --- a/pkg/chainsync/syncer/syncer_integration_test.go +++ b/pkg/chainsync/syncer/syncer_integration_test.go @@ -91,7 +91,7 @@ func TestLoadFork(t *testing.T) { // Load a new chain bsstore on the underlying data. It will only compute state for the // left (heavy) branch. It has a fetcher that can't provide blocks. newStore := chain.NewStore(builder.Repo().ChainDatastore(), builder.BlockStore(), genesis.At(0).Cid(), chainselector.Weight) - newStore.SetCheckPoint(genesis.Key()) + require.NoError(t, newStore.SetCheckpoint(ctx, genesis)) require.NoError(t, newStore.Load(ctx)) _, err = syncer.NewSyncer(stmgr, blockValidator, diff --git a/pkg/config/config.go b/pkg/config/config.go index 60a86d7aef..876789f2eb 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -11,6 +11,7 @@ import ( "time" "github.com/filecoin-project/go-state-types/network" + "github.com/ipfs/go-cid" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" @@ -166,6 +167,7 @@ type WalletConfig struct { PassphraseConfig PassphraseConfig `json:"passphraseConfig,omitempty"` RemoteEnable bool `json:"remoteEnable"` RemoteBackend string `json:"remoteBackend"` + GatewayBacked string `json:"gatewayBacked"` } type PassphraseConfig struct { @@ -309,42 +311,49 @@ type NetworkParamsConfig struct { F3Enabled bool `json:"f3Enabled"` F3BootstrapEpoch abi.ChainEpoch `json:"f3BootstrapEpoch"` ManifestServerID string `json:"manifestServerID"` + // F3Consensus set whether F3 should checkpoint tipsets finalized by F3. This + // flag has no effect if F3 is not enabled. + F3Consensus bool `json:"f3Consensus"` + // The initial F3 power table CID. + F3InitialPowerTableCID cid.Cid `json:"f3InitialPowerTableCID"` } // ForkUpgradeConfig record upgrade parameters type ForkUpgradeConfig struct { - UpgradeSmokeHeight abi.ChainEpoch `json:"upgradeSmokeHeight"` - UpgradeBreezeHeight abi.ChainEpoch `json:"upgradeBreezeHeight"` - UpgradeIgnitionHeight abi.ChainEpoch `json:"upgradeIgnitionHeight"` - UpgradeLiftoffHeight abi.ChainEpoch `json:"upgradeLiftoffHeight"` - UpgradeAssemblyHeight abi.ChainEpoch `json:"upgradeActorsV2Height"` - UpgradeRefuelHeight abi.ChainEpoch `json:"upgradeRefuelHeight"` - UpgradeTapeHeight abi.ChainEpoch `json:"upgradeTapeHeight"` - UpgradeKumquatHeight abi.ChainEpoch `json:"upgradeKumquatHeight"` - UpgradePriceListOopsHeight abi.ChainEpoch `json:"upgradePriceListOopsHeight"` - BreezeGasTampingDuration abi.ChainEpoch `json:"breezeGasTampingDuration"` - UpgradeCalicoHeight abi.ChainEpoch `json:"upgradeCalicoHeight"` - UpgradePersianHeight abi.ChainEpoch `json:"upgradePersianHeight"` - UpgradeOrangeHeight abi.ChainEpoch `json:"upgradeOrangeHeight"` - UpgradeClausHeight abi.ChainEpoch `json:"upgradeClausHeight"` - UpgradeTrustHeight abi.ChainEpoch `json:"upgradeActorsV3Height"` - UpgradeNorwegianHeight abi.ChainEpoch `json:"upgradeNorwegianHeight"` - UpgradeTurboHeight abi.ChainEpoch `json:"upgradeActorsV4Height"` - UpgradeHyperdriveHeight abi.ChainEpoch `json:"upgradeHyperdriveHeight"` - UpgradeChocolateHeight abi.ChainEpoch `json:"upgradeChocolateHeight"` - UpgradeOhSnapHeight abi.ChainEpoch `json:"upgradeOhSnapHeight"` - UpgradeSkyrHeight abi.ChainEpoch `json:"upgradeSkyrHeight"` - UpgradeSharkHeight abi.ChainEpoch `json:"upgradeSharkHeight"` - UpgradeHyggeHeight abi.ChainEpoch `json:"upgradeHyggeHeight"` - UpgradeLightningHeight abi.ChainEpoch `json:"upgradeLightningHeight"` - UpgradeThunderHeight abi.ChainEpoch `json:"upgradeThunderHeight"` - UpgradeWatermelonHeight abi.ChainEpoch `json:"upgradeWatermelonHeight"` - UpgradeWatermelonFixHeight abi.ChainEpoch `json:"upgradeWatermelonFixHeight"` - UpgradeWatermelonFix2Height abi.ChainEpoch `json:"upgradeWatermelonFix2Height"` - UpgradeDragonHeight abi.ChainEpoch `json:"upgradeDragonHeight"` - UpgradePhoenixHeight abi.ChainEpoch `json:"upgradePhoenixHeight"` - UpgradeCalibrationDragonFixHeight abi.ChainEpoch `json:"upgradeCalibrationDragonFixHeight"` - UpgradeWaffleHeight abi.ChainEpoch `json:"upgradeWaffleHeight"` + UpgradeSmokeHeight abi.ChainEpoch `json:"upgradeSmokeHeight"` + UpgradeBreezeHeight abi.ChainEpoch `json:"upgradeBreezeHeight"` + UpgradeIgnitionHeight abi.ChainEpoch `json:"upgradeIgnitionHeight"` + UpgradeLiftoffHeight abi.ChainEpoch `json:"upgradeLiftoffHeight"` + UpgradeAssemblyHeight abi.ChainEpoch `json:"upgradeActorsV2Height"` + UpgradeRefuelHeight abi.ChainEpoch `json:"upgradeRefuelHeight"` + UpgradeTapeHeight abi.ChainEpoch `json:"upgradeTapeHeight"` + UpgradeKumquatHeight abi.ChainEpoch `json:"upgradeKumquatHeight"` + UpgradePriceListOopsHeight abi.ChainEpoch `json:"upgradePriceListOopsHeight"` + BreezeGasTampingDuration abi.ChainEpoch `json:"breezeGasTampingDuration"` + UpgradeCalicoHeight abi.ChainEpoch `json:"upgradeCalicoHeight"` + UpgradePersianHeight abi.ChainEpoch `json:"upgradePersianHeight"` + UpgradeOrangeHeight abi.ChainEpoch `json:"upgradeOrangeHeight"` + UpgradeClausHeight abi.ChainEpoch `json:"upgradeClausHeight"` + UpgradeTrustHeight abi.ChainEpoch `json:"upgradeActorsV3Height"` + UpgradeNorwegianHeight abi.ChainEpoch `json:"upgradeNorwegianHeight"` + UpgradeTurboHeight abi.ChainEpoch `json:"upgradeActorsV4Height"` + UpgradeHyperdriveHeight abi.ChainEpoch `json:"upgradeHyperdriveHeight"` + UpgradeChocolateHeight abi.ChainEpoch `json:"upgradeChocolateHeight"` + UpgradeOhSnapHeight abi.ChainEpoch `json:"upgradeOhSnapHeight"` + UpgradeSkyrHeight abi.ChainEpoch `json:"upgradeSkyrHeight"` + UpgradeSharkHeight abi.ChainEpoch `json:"upgradeSharkHeight"` + UpgradeHyggeHeight abi.ChainEpoch `json:"upgradeHyggeHeight"` + UpgradeLightningHeight abi.ChainEpoch `json:"upgradeLightningHeight"` + UpgradeThunderHeight abi.ChainEpoch `json:"upgradeThunderHeight"` + UpgradeWatermelonHeight abi.ChainEpoch `json:"upgradeWatermelonHeight"` + UpgradeWatermelonFixHeight abi.ChainEpoch `json:"upgradeWatermelonFixHeight"` + UpgradeWatermelonFix2Height abi.ChainEpoch `json:"upgradeWatermelonFix2Height"` + UpgradeDragonHeight abi.ChainEpoch `json:"upgradeDragonHeight"` + UpgradePhoenixHeight abi.ChainEpoch `json:"upgradePhoenixHeight"` + UpgradeCalibrationDragonFixHeight abi.ChainEpoch `json:"upgradeCalibrationDragonFixHeight"` + UpgradeWaffleHeight abi.ChainEpoch `json:"upgradeWaffleHeight"` + UpgradeTuktukHeight abi.ChainEpoch `json:"upgradeTuktukHeight"` + UpgradeTuktukPowerRampDurationEpochs abi.ChainEpoch `json:"upgradeTuktukPowerRampDurationEpochs"` } func IsNearUpgrade(epoch, upgradeEpoch abi.ChainEpoch) bool { @@ -384,8 +393,10 @@ var DefaultForkUpgradeParam = &ForkUpgradeConfig{ UpgradeDragonHeight: 3855360, UpgradePhoenixHeight: 3855360 + 120, // This fix upgrade only ran on calibrationnet - UpgradeCalibrationDragonFixHeight: -3, - UpgradeWaffleHeight: 4154640, + UpgradeCalibrationDragonFixHeight: -3, + UpgradeWaffleHeight: 4154640, + UpgradeTuktukHeight: 99999999999, + UpgradeTuktukPowerRampDurationEpochs: 200, } func newDefaultNetworkParamsConfig() *NetworkParamsConfig { diff --git a/pkg/consensus/ticket.go b/pkg/consensus/ticket.go index b45a8e18fc..290f496e7c 100644 --- a/pkg/consensus/ticket.go +++ b/pkg/consensus/ticket.go @@ -9,8 +9,8 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" acrypto "github.com/filecoin-project/go-state-types/crypto" - "github.com/minio/blake2b-simd" "github.com/pkg/errors" + "golang.org/x/crypto/blake2b" "github.com/filecoin-project/venus/pkg/crypto" "github.com/filecoin-project/venus/venus-shared/types" diff --git a/pkg/constants/env.go b/pkg/constants/env.go index d8dbc08a1e..0d47c7be31 100644 --- a/pkg/constants/env.go +++ b/pkg/constants/env.go @@ -13,3 +13,6 @@ var NoSlashFilter = os.Getenv("VENUS_NO_SLASHFILTER") == "_yes_i_know_and_i_acce // NoMigrationResultCache will not use cached migration results var NoMigrationResultCache = os.Getenv("VENUS_NO_MIGRATION_RESULT_CACHE") == "1" + +// DisableF3 disable f3 +var DisableF3 = os.Getenv("VENUS_DISABLE_F3") == "1" diff --git a/pkg/constants/shared_vals.go b/pkg/constants/shared_vals.go index 158a405b9c..e64bf58f3b 100644 --- a/pkg/constants/shared_vals.go +++ b/pkg/constants/shared_vals.go @@ -16,7 +16,7 @@ const TestNetworkVersion = network.Version{{.latestNetworkVersion}} /* inline-gen start */ -const TestNetworkVersion = network.Version23 +const TestNetworkVersion = network.Version24 /* inline-gen end */ diff --git a/pkg/crypto/secp/init.go b/pkg/crypto/secp/init.go index cd4e8e9332..3ef11a06ed 100644 --- a/pkg/crypto/secp/init.go +++ b/pkg/crypto/secp/init.go @@ -9,7 +9,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-crypto" crypto2 "github.com/filecoin-project/go-state-types/crypto" - "github.com/minio/blake2b-simd" + "golang.org/x/crypto/blake2b" ) type secpSigner struct{} diff --git a/pkg/fork/fork.go b/pkg/fork/fork.go index cafe73ce5d..d41e45713e 100644 --- a/pkg/fork/fork.go +++ b/pkg/fork/fork.go @@ -40,6 +40,7 @@ import ( nv21 "github.com/filecoin-project/go-state-types/builtin/v12/migration" nv22 "github.com/filecoin-project/go-state-types/builtin/v13/migration" nv23 "github.com/filecoin-project/go-state-types/builtin/v14/migration" + nv24 "github.com/filecoin-project/go-state-types/builtin/v15/migration" nv17 "github.com/filecoin-project/go-state-types/builtin/v9/migration" "github.com/filecoin-project/go-state-types/migration" "github.com/filecoin-project/specs-actors/actors/migration/nv3" @@ -445,6 +446,18 @@ func DefaultUpgradeSchedule(cf *ChainFork, upgradeHeight *config.ForkUpgradeConf }}, Expensive: true, }, + { + Height: upgradeHeight.UpgradeTuktukHeight, + Network: network.Version24, + Migration: cf.UpgradeActorsV15, + PreMigrations: []PreMigration{{ + PreMigration: cf.PreUpgradeActorsV15, + StartWithin: 120, + DontStartWithin: 15, + StopWithin: 10, + }}, + Expensive: true, + }, } for _, u := range updates { @@ -3453,6 +3466,126 @@ func (c *ChainFork) upgradeActorsV14Common( return newRoot, nil } +func (c *ChainFork) PreUpgradeActorsV15(ctx context.Context, cache MigrationCache, root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet) error { + // Use half the CPUs for pre-migration, but leave at least 3. + workerCount := MigrationMaxWorkerCount + if workerCount <= 4 { + workerCount = 1 + } else { + workerCount /= 2 + } + + nv := c.GetNetworkVersion(ctx, epoch) + _, lbRoot, err := c.cr.GetLookbackTipSetForRound(ctx, ts, epoch, nv) + if err != nil { + return fmt.Errorf("error getting lookback ts for premigration: %w", err) + } + + config := migration.Config{ + MaxWorkers: uint(workerCount), + ProgressLogPeriod: time.Minute * 5, + } + + _, err = c.upgradeActorsV15Common(ctx, cache, lbRoot, epoch, config) + return err +} + +func (c *ChainFork) UpgradeActorsV15(ctx context.Context, + cache MigrationCache, + root cid.Cid, + epoch abi.ChainEpoch, + ts *types.TipSet, +) (cid.Cid, error) { + // Use all the CPUs except 2. + workerCount := MigrationMaxWorkerCount - 3 + if workerCount <= 0 { + workerCount = 1 + } + config := migration.Config{ + MaxWorkers: uint(workerCount), + JobQueueSize: 1000, + ResultQueueSize: 100, + ProgressLogPeriod: 10 * time.Second, + } + newRoot, err := c.upgradeActorsV15Common(ctx, cache, root, epoch, config) + if err != nil { + return cid.Undef, fmt.Errorf("migrating actors v15 state: %w", err) + } + return newRoot, nil +} + +func (c *ChainFork) upgradeActorsV15Common( + ctx context.Context, + cache MigrationCache, + root cid.Cid, + epoch abi.ChainEpoch, + config migration.Config, +) (cid.Cid, error) { + writeStore := blockstoreutil.NewAutobatch(ctx, c.bs, units.GiB/4) + adtStore := adt.WrapStore(ctx, cbor.NewCborStore(writeStore)) + + // ensure that the manifest is loaded in the blockstore + if err := actors.LoadBundles(ctx, writeStore, actorstypes.Version15); err != nil { + return cid.Undef, fmt.Errorf("failed to load manifest bundle: %w", err) + } + + // Load the state root. + var stateRoot vmstate.StateRoot + if err := adtStore.Get(ctx, root, &stateRoot); err != nil { + return cid.Undef, fmt.Errorf("failed to decode state root: %w", err) + } + + if stateRoot.Version != vmstate.StateTreeVersion5 { + return cid.Undef, fmt.Errorf( + "expected state root version 5 for actors v15 upgrade, got %d", + stateRoot.Version, + ) + } + + manifest, ok := actors.GetManifest(actorstypes.Version15) + if !ok { + return cid.Undef, fmt.Errorf("no manifest CID for v15 upgrade") + } + + // Perform the migration + newHamtRoot, err := nv24.MigrateStateTree(ctx, + adtStore, + manifest, + stateRoot.Actors, + epoch, + // two FIP-0081 constants for this migration only + int64(c.forkUpgrade.UpgradeTuktukHeight), // powerRampStartEpoch + uint64(c.forkUpgrade.UpgradeTuktukPowerRampDurationEpochs), // powerRampDurationEpochs + config, + migrationLogger{}, + cache, + ) + if err != nil { + return cid.Undef, fmt.Errorf("upgrading to actors v15: %w", err) + } + + // Persist the result. + newRoot, err := adtStore.Put(ctx, &vmstate.StateRoot{ + Version: vmstate.StateTreeVersion5, + Actors: newHamtRoot, + Info: stateRoot.Info, + }) + if err != nil { + return cid.Undef, fmt.Errorf("failed to persist new state root: %w", err) + } + + // Persists the new tree and shuts down the flush worker + if err := writeStore.Flush(ctx); err != nil { + return cid.Undef, fmt.Errorf("writeStore flush failed: %w", err) + } + + if err := writeStore.Shutdown(ctx); err != nil { + return cid.Undef, fmt.Errorf("writeStore shutdown failed: %w", err) + } + + return newRoot, nil +} + func (c *ChainFork) GetForkUpgrade() *config.ForkUpgradeConfig { return c.forkUpgrade } diff --git a/pkg/gen/genesis/miners.go b/pkg/gen/genesis/miners.go index fe019d3909..8ab77c782a 100644 --- a/pkg/gen/genesis/miners.go +++ b/pkg/gen/genesis/miners.go @@ -683,6 +683,11 @@ func SetupStorageMiners(ctx context.Context, // TODO: copied from actors test harness, deduplicate or remove from here type fakeRand struct{} +func (fr *fakeRand) GetBeaconEntry(ctx context.Context, randEpoch abi.ChainEpoch) (*types.BeaconEntry, error) { + r, _ := fr.GetChainRandomness(ctx, randEpoch) + return &types.BeaconEntry{Round: 10, Data: r[:]}, nil +} + func (fr *fakeRand) GetBeaconRandomness(ctx context.Context, randEpoch abi.ChainEpoch) ([32]byte, error) { out := make([]byte, 32) _, _ = rand.New(rand.NewSource(int64(randEpoch * 1000))).Read(out) //nolint diff --git a/pkg/messagepool/messagepool.go b/pkg/messagepool/messagepool.go index 6f23ec6661..4a171e7268 100644 --- a/pkg/messagepool/messagepool.go +++ b/pkg/messagepool/messagepool.go @@ -20,8 +20,8 @@ import ( "github.com/ipfs/go-datastore/query" logging "github.com/ipfs/go-log/v2" pubsub "github.com/libp2p/go-libp2p-pubsub" - "github.com/minio/blake2b-simd" "github.com/raulk/clock" + "golang.org/x/crypto/blake2b" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" diff --git a/pkg/net/gossipsub.go b/pkg/net/gossipsub.go index c5d1a4c294..5b8110ed69 100644 --- a/pkg/net/gossipsub.go +++ b/pkg/net/gossipsub.go @@ -12,11 +12,11 @@ import ( pubsub_pb "github.com/libp2p/go-libp2p-pubsub/pb" "github.com/libp2p/go-libp2p/core/host" "github.com/libp2p/go-libp2p/core/peer" - blake2b "github.com/minio/blake2b-simd" + blake2b "golang.org/x/crypto/blake2b" - "github.com/filecoin-project/go-f3/gpbft" "github.com/filecoin-project/go-f3/manifest" "github.com/filecoin-project/venus/pkg/config" + "github.com/filecoin-project/venus/pkg/vf3" "github.com/filecoin-project/venus/venus-shared/types" ) @@ -42,12 +42,6 @@ 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 NewGossipSub(ctx context.Context, @@ -57,7 +51,7 @@ func NewGossipSub(ctx context.Context, drandSchedule map[abi.ChainEpoch]config.DrandEnum, bootNodes []peer.AddrInfo, bs bool, - f3enabled bool, + f3Config *vf3.Config, ) (*pubsub.PubSub, error) { bootstrappers := make(map[peer.ID]struct{}) for _, info := range bootNodes { @@ -320,30 +314,21 @@ func NewGossipSub(ctx context.Context, indexerIngestTopic, } allowTopics = append(allowTopics, drandTopics...) - if f3enabled { - f3TopicName := manifest.PubSubTopicFromNetworkName(gpbft.NetworkName(networkName)) - 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)) + + if f3Config != nil { + if f3Config.StaticManifest != nil { + f3TopicName := manifest.PubSubTopicFromNetworkName(f3Config.StaticManifest.NetworkName) + allowTopics = append(allowTopics, f3TopicName) + } + if f3Config.DynamicManifestProvider != "" { + f3BaseTopicName := manifest.PubSubTopicFromNetworkName(f3Config.BaseNetworkName) + allowTopics = append(allowTopics, manifest.ManifestPubSubTopicName) + for i := 0; i < vf3.MaxDynamicManifestChangesAllowed; i++ { + allowTopics = append(allowTopics, fmt.Sprintf("%s/%d", f3BaseTopicName, i)) + } } } + options = append(options, pubsub.WithSubscriptionFilter( pubsub.WrapLimitSubscriptionFilter( diff --git a/pkg/state/tree/state.go b/pkg/state/tree/state.go index dafbd329f9..789b3bc108 100644 --- a/pkg/state/tree/state.go +++ b/pkg/state/tree/state.go @@ -143,7 +143,7 @@ func VersionForNetwork(ver network.Version) (StateTreeVersion, error) { return StateTreeVersion3, nil case network.Version13, network.Version14, network.Version15, network.Version16, network.Version17: return StateTreeVersion4, nil - case network.Version18, network.Version19, network.Version20, network.Version21, network.Version22, network.Version23: + case network.Version18, network.Version19, network.Version20, network.Version21, network.Version22, network.Version23, network.Version24: return StateTreeVersion5, nil default: panic(fmt.Sprintf("unsupported network version %d", ver)) diff --git a/pkg/vf3/config.go b/pkg/vf3/config.go new file mode 100644 index 0000000000..d1d61f250e --- /dev/null +++ b/pkg/vf3/config.go @@ -0,0 +1,99 @@ +package vf3 + +import ( + "time" + + "github.com/ipfs/go-cid" + "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/go-state-types/abi" + "github.com/filecoin-project/venus/pkg/config" + "github.com/filecoin-project/venus/venus-shared/actors/policy" +) + +type Config struct { + // BaseNetworkName is the base from which dynamic network names are defined and is usually + // the name of the network defined by the static manifest. This must be set correctly or, + // e.g., pubsub topic filters won't work correctly. + BaseNetworkName gpbft.NetworkName + // StaticManifest this instance's default manifest absent any dynamic manifests. Also see + // PrioritizeStaticManifest. + StaticManifest *manifest.Manifest + // DynamicManifestProvider is the peer ID of the peer authorized to send us dynamic manifest + // updates. Dynamic manifest updates can be used for testing but will not be used to affect + // finality. + DynamicManifestProvider peer.ID + // PrioritizeStaticManifest means that, once we get within one finality of the static + // manifest's bootstrap epoch we'll switch to it and ignore any further dynamic manifest + // updates. This exists to enable bootstrapping F3. + PrioritizeStaticManifest bool + // TESTINGAllowDynamicFinalize allow dynamic manifests to finalize tipsets. DO NOT ENABLE + // THIS IN PRODUCTION! + AllowDynamicFinalize bool +} + +// NewManifest constructs a sane F3 manifest based on the passed parameters. This function does not +// look at and/or depend on the nodes build params, etc. +func NewManifest( + nn gpbft.NetworkName, + finality, bootstrapEpoch abi.ChainEpoch, + ecPeriod time.Duration, + initialPowerTable cid.Cid, +) *manifest.Manifest { + return &manifest.Manifest{ + ProtocolVersion: manifest.VersionCapability, + BootstrapEpoch: int64(bootstrapEpoch), + NetworkName: nn, + InitialPowerTable: initialPowerTable, + CommitteeLookback: manifest.DefaultCommitteeLookback, + CatchUpAlignment: ecPeriod / 2, + Gpbft: manifest.DefaultGpbftConfig, + EC: manifest.EcConfig{ + Period: ecPeriod, + Finality: int64(finality), + DelayMultiplier: manifest.DefaultEcConfig.DelayMultiplier, + BaseDecisionBackoffTable: manifest.DefaultEcConfig.BaseDecisionBackoffTable, + HeadLookback: 0, + Finalize: true, + }, + CertificateExchange: manifest.CxConfig{ + ClientRequestTimeout: manifest.DefaultCxConfig.ClientRequestTimeout, + ServerRequestTimeout: manifest.DefaultCxConfig.ServerRequestTimeout, + MinimumPollInterval: ecPeriod, + MaximumPollInterval: 4 * ecPeriod, + }, + } +} + +// NewConfig creates a new F3 config based on the node's build parameters and the passed network +// name. +func NewConfig(nn string, netCfg *config.NetworkParamsConfig) (*Config, error) { + // Use "filecoin" as the network name on mainnet, otherwise use the network name. Yes, + // mainnet is called testnetnet in state. + if nn == "testnetnet" { + nn = "filecoin" + } + manifestServerID, err := peer.Decode(netCfg.ManifestServerID) + if err != nil { + return nil, err + } + c := &Config{ + BaseNetworkName: gpbft.NetworkName(nn), + PrioritizeStaticManifest: true, + DynamicManifestProvider: manifestServerID, + AllowDynamicFinalize: false, + } + if netCfg.F3BootstrapEpoch >= 0 { + // todo: + c.StaticManifest = NewManifest( + c.BaseNetworkName, + policy.ChainFinality, + netCfg.F3BootstrapEpoch, + time.Duration(netCfg.BlockDelay)*time.Second, + netCfg.F3InitialPowerTableCID, + ) + } + return c, nil +} diff --git a/pkg/vf3/ec.go b/pkg/vf3/ec.go index ee54afbaf1..1c59fe194b 100644 --- a/pkg/vf3/ec.go +++ b/pkg/vf3/ec.go @@ -15,55 +15,58 @@ import ( "github.com/filecoin-project/venus/pkg/vm" "github.com/filecoin-project/venus/venus-shared/actors/builtin/miner" "github.com/filecoin-project/venus/venus-shared/actors/builtin/power" + v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" "github.com/filecoin-project/venus/venus-shared/types" ) +var ( + _ ec.Backend = (*ecWrapper)(nil) + _ ec.TipSet = (*f3TipSet)(nil) +) + type ecWrapper struct { ChainStore *chain.Store StateManager *statemanger.Stmgr + SyncerAPI v1api.ISyncer } -var _ ec.TipSet = (*f3TipSet)(nil) - -type f3TipSet types.TipSet - -func (ts *f3TipSet) cast() *types.TipSet { - return (*types.TipSet)(ts) +type f3TipSet struct { + *types.TipSet } -func (ts *f3TipSet) String() string { - return ts.cast().String() -} +func (ts *f3TipSet) String() string { return ts.TipSet.String() } +func (ts *f3TipSet) Key() gpbft.TipSetKey { return ts.TipSet.Key().Bytes() } +func (ts *f3TipSet) Epoch() int64 { return int64(ts.TipSet.Height()) } -func (ts *f3TipSet) Key() gpbft.TipSetKey { - return ts.cast().Key().Bytes() +func (ts *f3TipSet) FirstBlockHeader() *types.BlockHeader { + if ts.TipSet == nil || len(ts.TipSet.Blocks()) == 0 { + return nil + } + return ts.TipSet.Blocks()[0] } 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. + switch header := ts.FirstBlockHeader(); { + case header == nil, len(header.BeaconEntries) == 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. + + // TODO: investigate if this is still necessary, or how message builder can be + // adapted to behave correctly regardless of beacon value, e.g. fail fast + // instead of building CONVERGE with empty beacon. return make([]byte, 32) + default: + return header.BeaconEntries[len(header.BeaconEntries)-1].Data } - 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 + if header := ts.FirstBlockHeader(); header != nil { + return time.Unix(int64(header.Timestamp), 0) } - return (*f3TipSet)(ts) + return time.Time{} } // GetTipsetByEpoch should return a tipset before the one requested if the requested @@ -73,62 +76,47 @@ func (ec *ecWrapper) GetTipsetByEpoch(ctx context.Context, epoch int64) (ec.TipS if err != nil { return nil, fmt.Errorf("getting tipset by height: %w", err) } - return wrapTS(ts), nil + return &f3TipSet{TipSet: 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, fmt.Errorf("decoding tsk: %w", err) - } - - ts, err := ec.ChainStore.GetTipSet(ctx, tskLotus) + ts, err := ec.getTipSetFromF3TSK(ctx, tsk) if err != nil { return nil, fmt.Errorf("getting tipset by key: %w", err) } - return wrapTS(ts), nil + return &f3TipSet{TipSet: ts}, nil } -func (ec *ecWrapper) GetHead(_ context.Context) (ec.TipSet, error) { - return wrapTS(ec.ChainStore.GetHead()), nil +func (ec *ecWrapper) GetHead(context.Context) (ec.TipSet, error) { + head := ec.ChainStore.GetHead() + if head == nil { + return nil, fmt.Errorf("no heaviest tipset") + } + return &f3TipSet{TipSet: head}, 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, fmt.Errorf("decoding tsk: %w", err) - } - ts, err = ec.ChainStore.GetTipSet(ctx, tskLotus) - if err != nil { - return nil, fmt.Errorf("getting tipset by key for get parent: %w", err) - } + ts, err := ec.toLotusTipSet(ctx, tsF3) + if err != nil { + return nil, err } parentTS, err := ec.ChainStore.GetTipSet(ctx, ts.Parents()) if err != nil { return nil, fmt.Errorf("getting parent tipset: %w", err) } - return wrapTS(parentTS), nil + return &f3TipSet{TipSet: parentTS}, nil } func (ec *ecWrapper) GetPowerTable(ctx context.Context, tskF3 gpbft.TipSetKey) (gpbft.PowerEntries, error) { - tsk, err := types.TipSetKeyFromBytes(tskF3) + tsk, err := toLotusTipSetKey(tskF3) if err != nil { - return nil, fmt.Errorf("decoding tsk: %w", err) + return nil, err } - return ec.getPowerTableLotusTSK(ctx, tsk) + return ec.getPowerTableTSK(ctx, tsk) } -func (ec *ecWrapper) getPowerTableLotusTSK(ctx context.Context, tsk types.TipSetKey) (gpbft.PowerEntries, error) { +func (ec *ecWrapper) getPowerTableTSK(ctx context.Context, tsk types.TipSetKey) (gpbft.PowerEntries, error) { ts, err := ec.ChainStore.GetTipSet(ctx, tsk) if err != nil { return nil, fmt.Errorf("getting tipset by key for get parent: %w", err) @@ -212,7 +200,7 @@ func (ec *ecWrapper) getPowerTableLotusTSK(ctx context.Context, tsk types.TipSet if waddr.Protocol() != address.BLS { return fmt.Errorf("wrong type of worker address") } - pe.PubKey = gpbft.PubKey(waddr.Payload()) + pe.PubKey = waddr.Payload() powerEntries = append(powerEntries, pe) return nil }) @@ -223,3 +211,40 @@ func (ec *ecWrapper) getPowerTableLotusTSK(ctx context.Context, tsk types.TipSet sort.Sort(powerEntries) return powerEntries, nil } + +func (ec *ecWrapper) Finalize(ctx context.Context, key gpbft.TipSetKey) error { + tsk, err := toLotusTipSetKey(key) + if err != nil { + return err + } + if err = ec.SyncerAPI.SyncCheckpoint(ctx, tsk); err != nil { + return fmt.Errorf("checkpointing finalized tipset: %w", err) + } + return nil +} + +func (ec *ecWrapper) toLotusTipSet(ctx context.Context, ts ec.TipSet) (*types.TipSet, error) { + switch tst := ts.(type) { + case *f3TipSet: + return tst.TipSet, nil + default: + // Fall back on getting the tipset by key. This path is executed only in testing. + return ec.getTipSetFromF3TSK(ctx, ts.Key()) + } +} + +func (ec *ecWrapper) getTipSetFromF3TSK(ctx context.Context, key gpbft.TipSetKey) (*types.TipSet, error) { + tsk, err := toLotusTipSetKey(key) + if err != nil { + return nil, err + } + ts, err := ec.ChainStore.GetTipSet(ctx, tsk) + if err != nil { + return nil, fmt.Errorf("getting tipset from key: %w", err) + } + return ts, nil +} + +func toLotusTipSetKey(key gpbft.TipSetKey) (types.TipSetKey, error) { + return types.TipSetKeyFromBytes(key) +} diff --git a/pkg/vf3/f3.go b/pkg/vf3/f3.go index b5fcb82c6f..39424f0473 100644 --- a/pkg/vf3/f3.go +++ b/pkg/vf3/f3.go @@ -4,7 +4,7 @@ import ( "context" "errors" "fmt" - "time" + "path/filepath" "github.com/ipfs/go-datastore" "github.com/ipfs/go-datastore/namespace" @@ -21,6 +21,7 @@ import ( "github.com/filecoin-project/go-f3/manifest" "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/pkg/statemanger" + "github.com/filecoin-project/venus/pkg/wallet" v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" "github.com/filecoin-project/venus/venus-shared/types" logging "github.com/ipfs/go-log" @@ -30,8 +31,10 @@ type F3 struct { inner *f3.F3 ec *ecWrapper - signer gpbft.Signer - newLeases chan leaseRequest + signer gpbft.Signer + leaser *leaser + + stopFunc func() } func init() { @@ -49,14 +52,18 @@ func init() { } type F3Params struct { - ManifestServerID string ManifestProvider manifest.ManifestProvider PubSub *pubsub.PubSub Host host.Host ChainStore *chain.Store StateManager *statemanger.Stmgr Datastore datastore.Batching - Wallet v1api.IWallet + WalletSign wallet.WalletSignFunc + SyncerAPI v1api.ISyncer + Config *Config + RepoPath string + + Net v1api.INetwork } var log = logging.Logger("f3") @@ -66,40 +73,69 @@ func New(mctx context.Context, params F3Params) (*F3, error) { ec := &ecWrapper{ ChainStore: params.ChainStore, StateManager: params.StateManager, + SyncerAPI: params.SyncerAPI, } verif := blssig.VerifierWithKeyOnG1() + f3FsPath := filepath.Join(params.RepoPath, "f3") module, err := f3.New(mctx, params.ManifestProvider, ds, - params.Host, params.PubSub, verif, ec) + params.Host, params.PubSub, verif, ec, f3FsPath) if err != nil { return nil, fmt.Errorf("creating F3: %w", err) } + nodeID, err := params.Net.ID(mctx) + if err != nil { + return nil, fmt.Errorf("getting node ID: %w", err) + } + + // maxLeasableInstances is the maximum number of leased F3 instances this node + // would give out. + const maxLeasableInstances = 5 + status := func() (*manifest.Manifest, gpbft.Instant) { + return module.Manifest(), module.Progress() + } + fff := &F3{ - inner: module, - ec: ec, - signer: &signer{params.Wallet}, - newLeases: make(chan leaseRequest, 4), // some buffer to avoid + inner: module, + ec: ec, + signer: &signer{sign: params.WalletSign}, + leaser: newParticipationLeaser(nodeID, status, maxLeasableInstances), } go func() { err := fff.inner.Start(mctx) if err != nil { - log.Errorf("running f3: %+v", err) + log.Fatalf("running f3: %+v", err) return } - go fff.runSigningLoop(mctx) }() + // Start signing F3 messages. + lCtx, cancel := context.WithCancel(mctx) + doneCh := make(chan struct{}) + + go func() { + fff.runSigningLoop(lCtx) + }() + + fff.stopFunc = func() { + cancel() + <-doneCh + } + return fff, nil } -type leaseRequest struct { - minerID uint64 - newExpiration time.Time - oldExpiration time.Time - resultCh chan<- bool +func (fff *F3) Stop(ctx context.Context) error { + if err := fff.inner.Stop(ctx); err != nil { + return err + } + + fff.stopFunc() + + return nil } func (fff *F3) runSigningLoop(ctx context.Context) { @@ -125,7 +161,6 @@ func (fff *F3) runSigningLoop(ctx context.Context) { return nil } - leaseMngr := new(leaseManager) msgCh := fff.inner.MessagesToSign() loop: @@ -133,36 +168,26 @@ loop: 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) + participants := fff.leaser.getParticipantsByInstance(mb.Payload.Instance) + for _, id := range participants { + if err := participateOnce(ctx, mb, id); err != nil { + log.Errorf("while participating for miner f0%d: %+v", id, 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) GetOrRenewParticipationTicket(_ context.Context, minerID uint64, previous types.F3ParticipationTicket, instances uint64) (types.F3ParticipationTicket, error) { + return fff.leaser.getOrRenewParticipationTicket(minerID, previous, instances) +} + +func (fff *F3) Participate(_ context.Context, ticket types.F3ParticipationTicket) (types.F3ParticipationLease, error) { + return fff.leaser.participate(ticket) } func (fff *F3) GetCert(ctx context.Context, instance uint64) (*certs.FinalityCertificate, error) { @@ -173,10 +198,22 @@ func (fff *F3) GetLatestCert(ctx context.Context) (*certs.FinalityCertificate, e return fff.inner.GetLatestCert(ctx) } +func (fff *F3) GetManifest() *manifest.Manifest { + return fff.inner.Manifest() +} + func (fff *F3) GetPowerTable(ctx context.Context, tsk types.TipSetKey) (gpbft.PowerEntries, error) { - return fff.ec.getPowerTableLotusTSK(ctx, tsk) + return fff.ec.getPowerTableTSK(ctx, tsk) } func (fff *F3) GetF3PowerTable(ctx context.Context, tsk types.TipSetKey) (gpbft.PowerEntries, error) { return fff.inner.GetPowerTable(ctx, tsk.Bytes()) } + +func (fff *F3) IsRunning() bool { + return fff.inner.IsRunning() +} + +func (fff *F3) Progress() gpbft.Instant { + return fff.inner.Progress() +} diff --git a/pkg/vf3/leasemanager.go b/pkg/vf3/leasemanager.go deleted file mode 100644 index 40e5382fc2..0000000000 --- a/pkg/vf3/leasemanager.go +++ /dev/null @@ -1,73 +0,0 @@ -package vf3 - -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/pkg/vf3/leasemanager_test.go b/pkg/vf3/leasemanager_test.go deleted file mode 100644 index 9a472dcac5..0000000000 --- a/pkg/vf3/leasemanager_test.go +++ /dev/null @@ -1,97 +0,0 @@ -package vf3 - -import ( - "testing" - "time" - - tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" - "github.com/raulk/clock" - "github.com/stretchr/testify/assert" -) - -func TestLeaseManager_Upsert(t *testing.T) { - tf.UnitTest(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) { - tf.UnitTest(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) { - tf.UnitTest(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/pkg/vf3/manifest.go b/pkg/vf3/manifest.go index 85a7ae25c5..5be1f28efa 100644 --- a/pkg/vf3/manifest.go +++ b/pkg/vf3/manifest.go @@ -1,44 +1,90 @@ package vf3 import ( - "time" + "context" + "fmt" + "strings" "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/ec" "github.com/filecoin-project/go-f3/manifest" - "github.com/filecoin-project/venus/pkg/config" - "github.com/filecoin-project/venus/venus-shared/actors/policy" + "github.com/filecoin-project/venus/pkg/chain" ) -func NewManifestProvider(nn string, mds datastore.Datastore, ps *pubsub.PubSub, networkParams *config.NetworkParamsConfig) manifest.ManifestProvider { - m := manifest.LocalDevnetManifest() - m.NetworkName = gpbft.NetworkName(nn) - m.EC.DelayMultiplier = 2. - m.EC.Period = time.Duration(networkParams.BlockDelay) * time.Second - if networkParams.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(networkParams.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(networkParams.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) +type headGetter struct { + store *chain.Store +} + +func (hg *headGetter) GetHead(_ context.Context) (ec.TipSet, error) { + head := hg.store.GetHead() + if head == nil { + return nil, fmt.Errorf("no heaviest tipset") + } + return &f3TipSet{TipSet: head}, nil +} + +// 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 +var MaxDynamicManifestChangesAllowed = 1000 + +func NewManifestProvider(ctx context.Context, config *Config, cs *chain.Store, ps *pubsub.PubSub, mds datastore.Datastore) (prov manifest.ManifestProvider, err error) { + if config.DynamicManifestProvider == "" { + if config.StaticManifest == nil { + return manifest.NoopManifestProvider{}, nil + } + return manifest.NewStaticManifestProvider(config.StaticManifest) + } + + opts := []manifest.DynamicManifestProviderOption{ + manifest.DynamicManifestProviderWithDatastore( + namespace.Wrap(mds, datastore.NewKey("/f3-dynamic-manifest")), + ), + } + + if config.StaticManifest != nil { + opts = append(opts, + manifest.DynamicManifestProviderWithInitialManifest(config.StaticManifest), + ) + } + + if config.AllowDynamicFinalize { + log.Error("dynamic F3 manifests are allowed to finalize tipsets, do not enable this in production!") + } + + networkNameBase := config.BaseNetworkName + "/" + filter := func(m *manifest.Manifest) error { + if m.EC.Finalize { + if !config.AllowDynamicFinalize { + return fmt.Errorf("refusing dynamic manifest that finalizes tipsets") + } + log.Error("WARNING: loading a dynamic F3 manifest that will finalize new tipsets") + } + if !strings.HasPrefix(string(m.NetworkName), string(networkNameBase)) { + return fmt.Errorf( + "refusing dynamic manifest with network name %q, must start with %q", + m.NetworkName, + networkNameBase, + ) + } + return nil } + opts = append(opts, + manifest.DynamicManifestProviderWithFilter(filter), + ) + + prov, err = manifest.NewDynamicManifestProvider(ps, config.DynamicManifestProvider, opts...) + if err != nil { + return nil, err + } + if config.PrioritizeStaticManifest && config.StaticManifest != nil { + prov, err = manifest.NewFusingManifestProvider(ctx, + &headGetter{cs}, prov, config.StaticManifest) + } + + return prov, err } diff --git a/pkg/vf3/participation_lease.go b/pkg/vf3/participation_lease.go new file mode 100644 index 0000000000..288e1d6113 --- /dev/null +++ b/pkg/vf3/participation_lease.go @@ -0,0 +1,160 @@ +package vf3 + +import ( + "bytes" + "errors" + "sync" + + "github.com/libp2p/go-libp2p/core/peer" + "go.uber.org/multierr" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-f3/gpbft" + "github.com/filecoin-project/go-f3/manifest" + "github.com/filecoin-project/venus/venus-shared/types" +) + +type f3Status = func() (*manifest.Manifest, gpbft.Instant) + +type leaser struct { + mutex sync.Mutex + leases map[uint64]types.F3ParticipationLease + issuer peer.ID + status f3Status + maxLeasableInstances uint64 +} + +func newParticipationLeaser(nodeID peer.ID, status f3Status, maxLeasedInstances uint64) *leaser { + return &leaser{ + leases: make(map[uint64]types.F3ParticipationLease), + issuer: nodeID, + status: status, + maxLeasableInstances: maxLeasedInstances, + } +} + +func (l *leaser) getOrRenewParticipationTicket(participant uint64, previous types.F3ParticipationTicket, instances uint64) (types.F3ParticipationTicket, error) { + + if instances > l.maxLeasableInstances { + return nil, types.ErrF3ParticipationTooManyInstances + } + + manifest, instant := l.status() + if manifest == nil { + return nil, types.ErrF3NotReady + } + currentInstance := instant.ID + if len(previous) != 0 { + // A previous ticket is present. To avoid overlapping lease across multiple + // instances for the same participant check its validity and only proceed to + // issue a new ticket if: + // - either it is expired/invalid, or + // - it is valid and was issued by this node. + // + // Otherwise, return ErrF3ParticipationIssuerMismatch to signal to the caller the need for retry. + switch _, err := l.validate(manifest.NetworkName, currentInstance, previous); { + case errors.Is(err, types.ErrF3ParticipationTicketInvalid): + // Invalid ticket means the miner must have got the ticket from a node with a potentially different version. + // Refuse to issue a new ticket in case there is some other node with active lease for the miner. + return nil, err + case errors.Is(err, types.ErrF3ParticipationTicketExpired): + // The current instance is beyond the validity term of the previous lease. It is + // safe to proceed to issuing a ticket from current instance onwards for the term + // asked for. + case errors.Is(err, types.ErrF3ParticipationIssuerMismatch): + // The previous ticket is still valid and is not issued by this node; return error. + return nil, err + case errors.Is(err, types.ErrF3ParticipationTooManyInstances): + // We don't care if the previous lease was for too many instances. What we care + // about is that the new ticket is within the max which was checked right at the + // top. + case err != nil: + log.Errorw("Unexpected error occurred while validating previous participation ticket", "participant", participant, "err", err) + return nil, err + default: + // The previous ticket was issued by this node and is still valid. It is safe to + // proceed with issuing a new ticket with overlapping validity. + } + log.Debugw("Renewing previously issued participation ticket with overlapping lease", "participant", participant, "startInstance", currentInstance, "validFor", instances) + } + + return l.newParticipationTicket(manifest.NetworkName, participant, currentInstance, instances) +} + +func (l *leaser) participate(ticket types.F3ParticipationTicket) (types.F3ParticipationLease, error) { + manifest, instant := l.status() + if manifest == nil { + return types.F3ParticipationLease{}, types.ErrF3NotReady + } + newLease, err := l.validate(manifest.NetworkName, instant.ID, ticket) + if err != nil { + return types.F3ParticipationLease{}, err + } + l.mutex.Lock() + defer l.mutex.Unlock() + currentLease, found := l.leases[newLease.MinerID] + if found && currentLease.Network == newLease.Network && currentLease.FromInstance > newLease.FromInstance { + // For safety, strictly require lease start instance to never decrease. + return types.F3ParticipationLease{}, types.ErrF3ParticipationTicketStartBeforeExisting + } + l.leases[newLease.MinerID] = newLease + return newLease, nil +} + +func (l *leaser) getParticipantsByInstance(instance uint64) []uint64 { + l.mutex.Lock() + defer l.mutex.Unlock() + var participants []uint64 + for id, lease := range l.leases { + if instance > lease.ToInstance() { + // Lazily delete the expired leases. + delete(l.leases, id) + } else { + participants = append(participants, id) + } + } + return participants +} + +func (l *leaser) newParticipationTicket(nn gpbft.NetworkName, participant uint64, from uint64, instances uint64) (types.F3ParticipationTicket, error) { + // Lotus node API and miners run in a trusted environment. For now we make the + // ticket to simply be the CBOR encoding of the lease. In the future, where the + // assumptions of trust may no longer hold, ticket could be encrypted and + // decrypted at the time of issuing the actual lease. + var buf bytes.Buffer + if err := (&types.F3ParticipationLease{ + Network: nn, + Issuer: l.issuer, + MinerID: participant, + FromInstance: from, + ValidityTerm: instances, + }).MarshalCBOR(&buf); err != nil { + return nil, xerrors.Errorf("issuing participation ticket: %w", err) + } + return buf.Bytes(), nil +} + +func (l *leaser) validate(currentNetwork gpbft.NetworkName, currentInstance uint64, t types.F3ParticipationTicket) (types.F3ParticipationLease, error) { + var lease types.F3ParticipationLease + reader := bytes.NewReader(t) + if err := lease.UnmarshalCBOR(reader); err != nil { + return types.F3ParticipationLease{}, types.ErrF3ParticipationTicketInvalid + } + + // Combine the errors to remove significance of the order by which they are + // checked outside if this function. + var err error + if currentNetwork != lease.Network || currentInstance > lease.ToInstance() { + err = multierr.Append(err, types.ErrF3ParticipationTicketExpired) + } + if l.issuer != lease.Issuer { + err = multierr.Append(err, types.ErrF3ParticipationIssuerMismatch) + } + if lease.ValidityTerm > l.maxLeasableInstances { + err = multierr.Append(err, types.ErrF3ParticipationTooManyInstances) + } + if err != nil { + return types.F3ParticipationLease{}, err + } + return lease, nil +} diff --git a/pkg/vf3/participation_lease_test.go b/pkg/vf3/participation_lease_test.go new file mode 100644 index 0000000000..7cf5e2d335 --- /dev/null +++ b/pkg/vf3/participation_lease_test.go @@ -0,0 +1,172 @@ +package vf3 + +import ( + "testing" + "time" + + "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/stretchr/testify/require" + + "github.com/filecoin-project/go-f3/gpbft" + "github.com/filecoin-project/go-f3/manifest" + "github.com/filecoin-project/venus/venus-shared/types" +) + +func TestLeaser(t *testing.T) { + nodeID := peer.ID("peerID") + progress := mockProgress{currentInstance: 10} + subject := newParticipationLeaser(nodeID, progress.Progress, 5) + + t.Run("participate", func(t *testing.T) { + ticket, err := subject.getOrRenewParticipationTicket(123, nil, 5) + require.NoError(t, err) + + lease, err := subject.participate(ticket) + require.NoError(t, err) + require.Equal(t, uint64(123), lease.MinerID) + require.Equal(t, nodeID, lease.Issuer) + require.Equal(t, uint64(5), lease.ValidityTerm) // Current instance (10) + offset (5) + }) + t.Run("get participants", func(t *testing.T) { + progress.currentInstance = 11 + ticket1, err := subject.getOrRenewParticipationTicket(123, nil, 4) + require.NoError(t, err) + ticket2, err := subject.getOrRenewParticipationTicket(456, nil, 5) + require.NoError(t, err) + + _, err = subject.participate(ticket1) + require.NoError(t, err) + _, err = subject.participate(ticket2) + require.NoError(t, err) + + // Both participants should still be valid. + participants := subject.getParticipantsByInstance(11) + require.Len(t, participants, 2) + require.Contains(t, participants, uint64(123)) + require.Contains(t, participants, uint64(456)) + + // After instance 16, only participant 456 should be valid. + participants = subject.getParticipantsByInstance(16) + require.Len(t, participants, 1) + require.Contains(t, participants, uint64(456)) + + // After instance 17, no participant must have a lease. + participants = subject.getParticipantsByInstance(17) + require.Empty(t, participants) + }) + t.Run("expired ticket", func(t *testing.T) { + ticket, err := subject.getOrRenewParticipationTicket(123, nil, 5) + require.NoError(t, err) + + progress.currentInstance += 10 + lease, err := subject.participate(ticket) + require.ErrorIs(t, err, types.ErrF3ParticipationTicketExpired) + require.Zero(t, lease) + }) + t.Run("too many instances", func(t *testing.T) { + ticket, err := subject.getOrRenewParticipationTicket(123, nil, 6) + require.Error(t, err, types.ErrF3ParticipationTooManyInstances) + require.Nil(t, ticket) + + // Generate a token from the same subject but with higher term, then assert that + // original subject with lower term rejects it. + subjectSpoofWithHigherMaxLease := newParticipationLeaser(nodeID, progress.Progress, 6) + ticket, err = subjectSpoofWithHigherMaxLease.getOrRenewParticipationTicket(123, nil, 6) + require.NoError(t, err) + require.NotEmpty(t, ticket) + lease, err := subject.participate(ticket) + require.ErrorIs(t, err, types.ErrF3ParticipationTooManyInstances) + require.Zero(t, lease) + + }) + t.Run("invalid ticket", func(t *testing.T) { + lease, err := subject.participate([]byte("ghoti")) + require.ErrorIs(t, err, types.ErrF3ParticipationTicketInvalid) + require.Zero(t, lease) + }) + t.Run("issuer mismatch", func(t *testing.T) { + anotherIssuer := newParticipationLeaser("barreleye", progress.Progress, 5) + ticket, err := anotherIssuer.getOrRenewParticipationTicket(123, nil, 5) + require.NoError(t, err) + lease, err := subject.participate(ticket) + require.ErrorIs(t, err, types.ErrF3ParticipationIssuerMismatch) + require.Zero(t, lease) + }) + t.Run("never decreasing start", func(t *testing.T) { + progress.currentInstance++ + earlierTicket, err := subject.getOrRenewParticipationTicket(123, nil, 5) + require.NoError(t, err) + progress.currentInstance++ + laterTicket, err := subject.getOrRenewParticipationTicket(123, nil, 5) + require.NoError(t, err) + + lease, err := subject.participate(laterTicket) + require.NoError(t, err) + require.Equal(t, uint64(123), lease.MinerID) + require.Equal(t, uint64(5), lease.ValidityTerm) + require.Equal(t, progress.currentInstance, lease.FromInstance) + + lease, err = subject.participate(earlierTicket) + require.ErrorIs(t, err, types.ErrF3ParticipationTicketStartBeforeExisting) + require.Zero(t, lease) + }) + t.Run("expired previous ticket", func(t *testing.T) { + previous, err := subject.getOrRenewParticipationTicket(123, nil, 5) + require.NoError(t, err) + + // Get or renew without progress + newTicket, err := subject.getOrRenewParticipationTicket(123, previous, 5) + require.NoError(t, err) + require.NotNil(t, newTicket) + require.Equal(t, previous, newTicket) + + // Get or renew with overlapping validity progress + progress.currentInstance += 3 + newTicket, err = subject.getOrRenewParticipationTicket(123, previous, 5) + require.NoError(t, err) + require.NotNil(t, newTicket) + require.NotEqual(t, previous, newTicket) + + // Get or renew with expired previous + progress.currentInstance += 10 + newTicket, err = subject.getOrRenewParticipationTicket(123, previous, 5) + require.NoError(t, err) + require.NotNil(t, newTicket) + require.NotEqual(t, previous, newTicket) + + // Get or renew with valid but mismatching issuer + progress.currentInstance -= 10 + anotherIssuer := newParticipationLeaser("barreleye", progress.Progress, 5) + newTicket, err = anotherIssuer.getOrRenewParticipationTicket(123, previous, 5) + require.ErrorIs(t, err, types.ErrF3ParticipationIssuerMismatch) + require.Empty(t, newTicket) + + // Get or renew with expired but mismatching issuer + progress.currentInstance += 10 + newTicket, err = anotherIssuer.getOrRenewParticipationTicket(123, previous, 5) + require.NoError(t, err) + require.NotNil(t, newTicket) + require.NotEqual(t, previous, newTicket) + + // Get or renew with expired but mismatching session + progress.currentInstance -= 10 + subjectAtNewSession := newParticipationLeaser(nodeID, progress.Progress, 5) + newTicket, err = subjectAtNewSession.getOrRenewParticipationTicket(123, previous, 5) + require.NoError(t, err) + require.NotNil(t, newTicket) + require.NotEqual(t, previous, newTicket) + }) +} + +var testManifest = NewManifest("fakenet", 30, 30, 30*time.Second, cid.Undef) + +type mockProgress struct{ currentInstance uint64 } + +func (m *mockProgress) Progress() (*manifest.Manifest, gpbft.Instant) { + return testManifest, gpbft.Instant{ + ID: m.currentInstance, + Round: 0, + Phase: gpbft.INITIAL_PHASE, + } +} diff --git a/pkg/vf3/signer.go b/pkg/vf3/signer.go index 08ef83c4bf..2938d987b1 100644 --- a/pkg/vf3/signer.go +++ b/pkg/vf3/signer.go @@ -6,12 +6,12 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-f3/gpbft" - v1api "github.com/filecoin-project/venus/venus-shared/api/chain/v1" + "github.com/filecoin-project/venus/pkg/wallet" "github.com/filecoin-project/venus/venus-shared/types" ) type signer struct { - wallet v1api.IWallet + sign wallet.WalletSignFunc } // Sign signs a message with the private key corresponding to a public key. @@ -21,7 +21,7 @@ func (s *signer) Sign(ctx context.Context, sender gpbft.PubKey, msg []byte) ([]b if err != nil { return nil, fmt.Errorf("converting pubkey to address: %w", err) } - sig, err := s.wallet.WalletSign(ctx, addr, msg, types.MsgMeta{Type: types.MTUnknown}) + sig, err := s.sign(ctx, addr, msg, types.MsgMeta{Type: types.MTF3}) if err != nil { return nil, fmt.Errorf("error while signing: %w", err) } diff --git a/pkg/vm/register/default.go b/pkg/vm/register/default.go index 57dc645f1c..8494915660 100644 --- a/pkg/vm/register/default.go +++ b/pkg/vm/register/default.go @@ -44,6 +44,7 @@ func GetDefaultActros() *dispatch.CodeLoader { DefaultActorBuilder.AddMany(actorstypes.Version12, dispatch.ActorsVersionPredicate(actorstypes.Version12), builtin.MakeRegistry(actorstypes.Version12)) DefaultActorBuilder.AddMany(actorstypes.Version13, dispatch.ActorsVersionPredicate(actorstypes.Version13), builtin.MakeRegistry(actorstypes.Version13)) DefaultActorBuilder.AddMany(actorstypes.Version14, dispatch.ActorsVersionPredicate(actorstypes.Version14), builtin.MakeRegistry(actorstypes.Version14)) + DefaultActorBuilder.AddMany(actorstypes.Version15, dispatch.ActorsVersionPredicate(actorstypes.Version15), builtin.MakeRegistry(actorstypes.Version15)) defaultActors = DefaultActorBuilder.Build() }) diff --git a/pkg/vm/vmcontext/testing_syscalls.go b/pkg/vm/vmcontext/testing_syscalls.go index ad6955b0fe..a9ea6f9a64 100644 --- a/pkg/vm/vmcontext/testing_syscalls.go +++ b/pkg/vm/vmcontext/testing_syscalls.go @@ -10,7 +10,7 @@ import ( proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/ipfs/go-cid" - "github.com/minio/blake2b-simd" + "golang.org/x/crypto/blake2b" "github.com/filecoin-project/venus/pkg/crypto" ) diff --git a/pkg/vm/vmcontext/types.go b/pkg/vm/vmcontext/types.go index c7721650de..5a35d82538 100644 --- a/pkg/vm/vmcontext/types.go +++ b/pkg/vm/vmcontext/types.go @@ -99,6 +99,7 @@ func TipSetGetterForTipset(tsGet func(context.Context, *types.TipSet, abi.ChainE // ChainRandomness define randomness method in filecoin type HeadChainRandomness interface { GetChainRandomness(ctx context.Context, round abi.ChainEpoch) ([32]byte, error) + GetBeaconEntry(ctx context.Context, round abi.ChainEpoch) (*types.BeaconEntry, error) GetBeaconRandomness(ctx context.Context, round abi.ChainEpoch) ([32]byte, error) } diff --git a/pkg/vmsupport/syscalls.go b/pkg/vmsupport/syscalls.go index a6bc8cbfc8..14c82812ca 100644 --- a/pkg/vmsupport/syscalls.go +++ b/pkg/vmsupport/syscalls.go @@ -10,7 +10,7 @@ import ( "github.com/ipfs/go-cid" cbornode "github.com/ipfs/go-ipld-cbor" logging "github.com/ipfs/go-log/v2" - "github.com/minio/blake2b-simd" + "golang.org/x/crypto/blake2b" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" diff --git a/pkg/wallet/gateway/wallet_gateway.go b/pkg/wallet/gateway/wallet_gateway.go new file mode 100644 index 0000000000..1a28c9d679 --- /dev/null +++ b/pkg/wallet/gateway/wallet_gateway.go @@ -0,0 +1,117 @@ +package gateway + +import ( + "context" + "fmt" + "sync" + "time" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-jsonrpc" + "github.com/filecoin-project/venus/pkg/crypto" + gatewayAPI "github.com/filecoin-project/venus/venus-shared/api/gateway/v2" + "github.com/filecoin-project/venus/venus-shared/types" + logging "github.com/ipfs/go-log/v2" +) + +var log = logging.Logger("wallet-gateway") + +type WalletGateway struct { + cli gatewayAPI.IWalletClient + closer jsonrpc.ClientCloser + + addressAccount map[address.Address][]string + + lk sync.RWMutex +} + +func NewWalletGateway(ctx context.Context, url, token string) (*WalletGateway, error) { + cli, close, err := gatewayAPI.DialIGatewayRPC(ctx, url, token, nil) + if err != nil { + return nil, err + } + + wg := &WalletGateway{cli: cli, closer: close, addressAccount: map[address.Address][]string{}} + err = wg.updateAddressAccount(ctx) + if err != nil { + return nil, err + } + go wg.loopUpdateAddressAccount(ctx) + + return wg, nil +} + +func (w *WalletGateway) updateAddressAccount(ctx context.Context) error { + ctx, cancel := context.WithTimeout(ctx, 5*time.Second) + defer cancel() + + w.lk.Lock() + defer w.lk.Unlock() + + wds, err := w.cli.ListWalletInfo(ctx) + if err != nil { + return err + } + + for _, wd := range wds { + accountMap := map[string]struct{}{ + wd.Account: {}, + } + accounts := []string{wd.Account} + for _, account := range wd.SupportAccounts { + if _, ok := accountMap[account]; ok { + continue + } + accounts = append(accounts, account) + accountMap[account] = struct{}{} + } + + addrs := make(map[address.Address]struct{}, 0) + for _, cs := range wd.ConnectStates { + for _, addr := range cs.Addrs { + addrs[addr] = struct{}{} + } + } + + for addr := range addrs { + w.addressAccount[addr] = accounts + } + } + + return err +} + +func (w *WalletGateway) loopUpdateAddressAccount(ctx context.Context) { + ticker := time.NewTicker(10 * time.Minute) + defer ticker.Stop() + + for { + select { + case <-ticker.C: + err := w.updateAddressAccount(ctx) + if err != nil { + log.Errorf("update address account failed: %s", err) + } + case <-ctx.Done(): + return + } + } +} + +func (w *WalletGateway) Close() { + if w == nil { + return + } + w.closer() +} + +func (w *WalletGateway) WalletSign(ctx context.Context, k address.Address, msg []byte, meta types.MsgMeta) (*crypto.Signature, error) { + w.lk.RLock() + accounts, ok := w.addressAccount[k] + w.lk.RUnlock() + if !ok { + return nil, fmt.Errorf("address %s not found", k) + } + + return w.cli.WalletSign(ctx, k, accounts, msg, meta) +} diff --git a/pkg/wallet/gateway/wallet_gateway_test.go b/pkg/wallet/gateway/wallet_gateway_test.go new file mode 100644 index 0000000000..65b505498d --- /dev/null +++ b/pkg/wallet/gateway/wallet_gateway_test.go @@ -0,0 +1,38 @@ +package gateway + +import ( + "context" + "fmt" + "testing" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/venus/pkg/crypto" + _ "github.com/filecoin-project/venus/pkg/crypto/bls" + _ "github.com/filecoin-project/venus/pkg/crypto/secp" + tf "github.com/filecoin-project/venus/pkg/testhelpers/testflags" + "github.com/filecoin-project/venus/venus-shared/types" + "github.com/stretchr/testify/assert" +) + +func TestUpdateAddress(t *testing.T) { + tf.UnitTest(t) + t.SkipNow() + url := "" + token := "" + + wg, err := NewWalletGateway(context.Background(), url, token) + assert.NoError(t, err) + var a address.Address + for addr, accounts := range wg.addressAccount { + fmt.Println(addr, accounts) + a = addr + } + data := []byte("data to be signed") + sig, err := wg.WalletSign(context.Background(), a, data, types.MsgMeta{ + Type: types.MTF3, + }) + assert.NoError(t, err) + fmt.Println(a, sig) + + assert.NoError(t, crypto.Verify(sig, a, data)) +} diff --git a/pkg/wallet/wallet.go b/pkg/wallet/wallet.go index 4148b243b5..3dd83e3eeb 100644 --- a/pkg/wallet/wallet.go +++ b/pkg/wallet/wallet.go @@ -25,6 +25,8 @@ var ( walletLog = logging.Logger("wallet") ) +type WalletSignFunc func(ctx context.Context, addr address.Address, msg []byte, meta types.MsgMeta) (*crypto.Signature, error) + // WalletIntersection // nolint type WalletIntersection interface { diff --git a/tools/conformance/rand_fixed.go b/tools/conformance/rand_fixed.go index f2356d1d4c..ca86107295 100644 --- a/tools/conformance/rand_fixed.go +++ b/tools/conformance/rand_fixed.go @@ -4,6 +4,7 @@ import ( "context" "github.com/filecoin-project/venus/pkg/vm/vmcontext" + "github.com/filecoin-project/venus/venus-shared/types" "github.com/filecoin-project/go-state-types/abi" ) @@ -27,3 +28,7 @@ func (r *fixedRand) GetBeaconRandomness(ctx context.Context, round abi.ChainEpoc func (r *fixedRand) GetChainRandomness(ctx context.Context, round abi.ChainEpoch) ([32]byte, error) { return *(*[32]byte)(fixedBytes), nil // 32 bytes. } + +func (r *fixedRand) GetBeaconEntry(_ context.Context, _ abi.ChainEpoch) (*types.BeaconEntry, error) { + return &types.BeaconEntry{Round: 10, Data: []byte("i_am_random_____i_am_random_____")}, nil +} diff --git a/tools/conformance/rand_record.go b/tools/conformance/rand_record.go index 8eafcbfcab..699bd4946b 100644 --- a/tools/conformance/rand_record.go +++ b/tools/conformance/rand_record.go @@ -89,6 +89,29 @@ func (r *RecordingRand) GetBeaconRandomness(ctx context.Context, round abi.Chain return *(*[32]byte)(ret), err } +func (r *RecordingRand) GetBeaconEntry(ctx context.Context, round abi.ChainEpoch) (*types.BeaconEntry, error) { + r.once.Do(r.loadHead) + ret, err := r.api.StateGetBeaconEntry(ctx, round) + if err != nil { + return nil, err + } + + r.reporter.Logf("fetched and recorded beacon randomness for: epoch=%d, result=%x", round, ret) + + match := schema.RandomnessMatch{ + On: schema.RandomnessRule{ + Kind: schema.RandomnessBeacon, + Epoch: int64(round), + }, + Return: ret.Data, + } + r.lk.Lock() + r.recorded = append(r.recorded, match) + r.lk.Unlock() + + return ret, err +} + func (r *RecordingRand) Recorded() schema.Randomness { r.lk.Lock() defer r.lk.Unlock() diff --git a/tools/conformance/rand_replay.go b/tools/conformance/rand_replay.go index 4bbf12dfa8..22138e4b4d 100644 --- a/tools/conformance/rand_replay.go +++ b/tools/conformance/rand_replay.go @@ -6,6 +6,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/test-vectors/schema" "github.com/filecoin-project/venus/pkg/vm/vmcontext" + "github.com/filecoin-project/venus/venus-shared/types" ) type ReplayingRand struct { @@ -68,3 +69,19 @@ func (r *ReplayingRand) GetBeaconRandomness(ctx context.Context, round abi.Chain return r.fallback.GetBeaconRandomness(ctx, round) } + +func (r *ReplayingRand) GetBeaconEntry(ctx context.Context, round abi.ChainEpoch) (*types.BeaconEntry, error) { + rule := schema.RandomnessRule{ + Kind: schema.RandomnessBeacon, + Epoch: int64(round), + } + + if ret, ok := r.match(rule); ok { + r.reporter.Logf("returning saved beacon randomness: epoch=%d, result=%x", round, ret) + return &types.BeaconEntry{Round: 10, Data: ret[:]}, nil + } + + r.reporter.Logf("returning fallback beacon randomness: epoch=%d, ", round) + + return r.fallback.GetBeaconEntry(ctx, round) +} diff --git a/tools/gengen/util/gengen_test.go b/tools/gengen/util/gengen_test.go index c28c7f0220..8f30bb1bfc 100644 --- a/tools/gengen/util/gengen_test.go +++ b/tools/gengen/util/gengen_test.go @@ -5,6 +5,7 @@ import ( "os" "testing" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/builtin" "github.com/filecoin-project/go-state-types/abi" @@ -60,6 +61,7 @@ const ( func TestGenGenLoading(t *testing.T) { tf.IntegrationTest(t) + address.CurrentNetwork = address.Testnet fi, err := os.CreateTemp("", "gengentest") assert.NoError(t, err) diff --git a/tools/seed/seed.go b/tools/seed/seed.go index 6c58f32f2d..70a906bbad 100644 --- a/tools/seed/seed.go +++ b/tools/seed/seed.go @@ -27,7 +27,7 @@ import ( logging "github.com/ipfs/go-log/v2" ic "github.com/libp2p/go-libp2p/core/crypto" "github.com/libp2p/go-libp2p/core/peer" - "github.com/minio/blake2b-simd" + "golang.org/x/crypto/blake2b" "github.com/filecoin-project/venus/pkg/gen/genesis" "github.com/filecoin-project/venus/pkg/util/ffiwrapper/basicfs" diff --git a/venus-devtool/api-gen/example.go b/venus-devtool/api-gen/example.go index c3afea786b..8a54d6e601 100644 --- a/venus-devtool/api-gen/example.go +++ b/venus-devtool/api-gen/example.go @@ -37,6 +37,7 @@ import ( "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/venus/pkg/constants" "github.com/filecoin-project/venus/venus-shared/api/chain" "github.com/filecoin-project/venus/venus-shared/types" @@ -331,6 +332,10 @@ func init() { addExample(gateway.HostNode) addExample(&certs.FinalityCertificate{}) addExample(gpbft.ActorID(1000)) + + addExample(&manifest.Manifest{}) + addExample(gpbft.NetworkName("filecoin")) + addExample(gpbft.INITIAL_PHASE) } func ExampleValue(method string, t, parent reflect.Type) interface{} { diff --git a/venus-devtool/cborgen/main.go b/venus-devtool/cborgen/main.go index 405fe66bff..12c13fd702 100644 --- a/venus-devtool/cborgen/main.go +++ b/venus-devtool/cborgen/main.go @@ -61,6 +61,7 @@ func main() { types.MessageTrace{}, types.ReturnTrace{}, types.ExecutionTrace{}, + types.F3ParticipationLease{}, }, }, { diff --git a/venus-devtool/go.mod b/venus-devtool/go.mod index 49994f7652..dfcc13257c 100644 --- a/venus-devtool/go.mod +++ b/venus-devtool/go.mod @@ -1,28 +1,30 @@ module github.com/filecoin-project/venus/venus-devtool -go 1.21 +go 1.22 + +toolchain go1.23.2 require ( - github.com/filecoin-project/go-address v1.1.0 + github.com/filecoin-project/go-address v1.2.0 github.com/filecoin-project/go-bitfield v0.2.4 github.com/filecoin-project/go-data-transfer/v2 v2.0.0-rc7 - github.com/filecoin-project/go-f3 v0.2.0 + github.com/filecoin-project/go-f3 v0.7.0 github.com/filecoin-project/go-fil-markets v1.28.3 - github.com/filecoin-project/go-jsonrpc v0.3.2 - github.com/filecoin-project/go-state-types v0.14.0 - github.com/filecoin-project/lotus v1.28.2 + github.com/filecoin-project/go-jsonrpc v0.6.0 + github.com/filecoin-project/go-state-types v0.15.0-rc1 + github.com/filecoin-project/lotus v1.30.0-rc1 github.com/filecoin-project/venus v0.0.0-00010101000000-000000000000 github.com/google/uuid v1.6.0 github.com/ipfs/go-block-format v0.2.0 github.com/ipfs/go-cid v0.4.1 github.com/ipfs/go-graphsync v0.16.0 github.com/ipld/go-ipld-selector-text-lite v0.0.1 - github.com/libp2p/go-libp2p v0.35.4 + github.com/libp2p/go-libp2p v0.35.5 github.com/libp2p/go-libp2p-pubsub v0.11.0 - github.com/multiformats/go-multiaddr v0.12.4 + github.com/multiformats/go-multiaddr v0.13.0 github.com/urfave/cli/v2 v2.25.5 - github.com/whyrusleeping/cbor-gen v0.1.1 - golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d + github.com/whyrusleeping/cbor-gen v0.1.2 + golang.org/x/tools v0.24.0 ) require ( @@ -59,16 +61,17 @@ require ( github.com/filecoin-project/filecoin-ffi v1.28.0-rc2 // indirect github.com/filecoin-project/go-amt-ipld/v2 v2.1.1-0.20201006184820-924ee87a1349 // indirect github.com/filecoin-project/go-amt-ipld/v3 v3.1.0 // indirect - github.com/filecoin-project/go-amt-ipld/v4 v4.3.0 // indirect + github.com/filecoin-project/go-amt-ipld/v4 v4.4.0 // indirect github.com/filecoin-project/go-cbor-util v0.0.1 // indirect - github.com/filecoin-project/go-commp-utils v0.1.3 // indirect - github.com/filecoin-project/go-commp-utils/nonffi v0.0.0-20220905160352-62059082a837 // indirect - github.com/filecoin-project/go-crypto v0.0.1 // indirect + github.com/filecoin-project/go-clock v0.1.0 // indirect + github.com/filecoin-project/go-commp-utils/v2 v2.1.0 // indirect + github.com/filecoin-project/go-crypto v0.1.0 // indirect github.com/filecoin-project/go-ds-versioning v0.1.2 // indirect - github.com/filecoin-project/go-fil-commcid v0.1.0 // indirect + github.com/filecoin-project/go-fil-commcid v0.2.0 // indirect + github.com/filecoin-project/go-fil-commp-hashhash v0.2.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/filecoin-project/go-hamt-ipld/v3 v3.1.0 // indirect + github.com/filecoin-project/go-hamt-ipld/v3 v3.4.0 // indirect github.com/filecoin-project/go-padreader v0.0.1 // indirect github.com/filecoin-project/go-statemachine v1.0.3 // indirect github.com/filecoin-project/go-statestore v0.2.0 // indirect @@ -117,7 +120,7 @@ require ( github.com/ipfs/go-ipfs-ds-help v1.1.1 // indirect github.com/ipfs/go-ipfs-exchange-interface v0.2.1 // indirect github.com/ipfs/go-ipfs-util v0.0.3 // indirect - github.com/ipfs/go-ipld-cbor v0.1.0 // indirect + github.com/ipfs/go-ipld-cbor v0.2.0 // indirect github.com/ipfs/go-ipld-format v0.6.0 // indirect github.com/ipfs/go-ipld-legacy v0.2.1 // indirect github.com/ipfs/go-log v1.0.5 // indirect @@ -129,13 +132,12 @@ require ( github.com/ipld/go-car/v2 v2.13.1 // indirect github.com/ipld/go-codec-dagpb v1.6.0 // indirect github.com/ipld/go-ipld-prime v0.21.0 // indirect - github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 // indirect github.com/jbenet/goprocess v0.1.4 // indirect github.com/jessevdk/go-flags v1.4.0 // indirect github.com/jpillora/backoff v1.0.0 // indirect github.com/kilic/bls12-381 v0.1.1-0.20220929213557-ca162e8a70f4 // indirect github.com/klauspost/compress v1.17.9 // indirect - github.com/klauspost/cpuid/v2 v2.2.7 // indirect + github.com/klauspost/cpuid/v2 v2.2.8 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/libp2p/go-cidranger v1.1.0 // indirect github.com/libp2p/go-flow-metrics v0.1.0 // indirect @@ -156,7 +158,7 @@ require ( github.com/mr-tron/base58 v1.2.0 // indirect github.com/multiformats/go-base32 v0.1.0 // indirect github.com/multiformats/go-base36 v0.2.0 // indirect - github.com/multiformats/go-multiaddr-dns v0.3.1 // indirect + github.com/multiformats/go-multiaddr-dns v0.4.0 // indirect github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect github.com/multiformats/go-multibase v0.2.0 // indirect github.com/multiformats/go-multicodec v0.9.0 // indirect @@ -193,6 +195,8 @@ require ( github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect github.com/x448/float16 v0.8.4 // indirect github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913 // indirect + gitlab.com/yawning/secp256k1-voi v0.0.0-20230925100816-f2616030848b // indirect + gitlab.com/yawning/tuplehash v0.0.0-20230713102510-df83abbf9a02 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/otel v1.28.0 // indirect go.opentelemetry.io/otel/bridge/opencensus v1.28.0 // indirect @@ -207,14 +211,14 @@ require ( go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect go4.org v0.0.0-20230225012048-214862532bf5 // indirect - golang.org/x/crypto v0.24.0 // indirect - golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect - golang.org/x/mod v0.17.0 // indirect - golang.org/x/net v0.26.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.21.0 // indirect - golang.org/x/text v0.16.0 // indirect - golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + golang.org/x/crypto v0.27.0 // indirect + golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e // indirect + golang.org/x/mod v0.20.0 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sync v0.8.0 // indirect + golang.org/x/sys v0.25.0 // indirect + golang.org/x/text v0.18.0 // indirect + golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect gonum.org/v1/gonum v0.15.0 // indirect google.golang.org/api v0.81.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240515191416-fc5f0ca64291 // indirect diff --git a/venus-devtool/go.sum b/venus-devtool/go.sum index b18cc3b938..8a6fa9592f 100644 --- a/venus-devtool/go.sum +++ b/venus-devtool/go.sum @@ -64,6 +64,8 @@ github.com/GeertJohan/go.incremental v1.0.0 h1:7AH+pY1XUgQE4Y1HcXYaMqAI0m9yrFqo/ github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0= github.com/GeertJohan/go.rice v1.0.3 h1:k5viR+xGtIhF61125vCE1cmJ5957RQGXG6dmbaWZSmI= github.com/GeertJohan/go.rice v1.0.3/go.mod h1:XVdrU4pW00M4ikZed5q56tPf1v2KwnIKeIdc9CBYNt4= +github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee h1:8doiS7ib3zi6/K172oDhSKU0dJ/miJramo9NITOMyZQ= +github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee/go.mod h1:W0GbEAA4uFNYOGG2cJpmFJ04E6SD1NLELPYZB57/7AY= github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= @@ -102,6 +104,8 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bep/debounce v1.2.1 h1:v67fRdBA9UQu2NhLFXrSg0Brw7CexQekrBwDMM8bzeY= github.com/bep/debounce v1.2.1/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0= +github.com/bits-and-blooms/bitset v1.13.0 h1:bAQ9OPNFYbGHV6Nez0tmNI0RiEu7/hxlYJRUA0wFAVE= +github.com/bits-and-blooms/bitset v1.13.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/bluele/gcache v0.0.0-20190518031135-bc40bd653833 h1:yCfXxYaelOyqnia8F/Yng47qhmfC9nKTRIbYRrRueq4= github.com/bluele/gcache v0.0.0-20190518031135-bc40bd653833/go.mod h1:8c4/i2VlovMO2gBnHGQPN5EJw+H0lx1u/5p+cgsXtCk= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= @@ -139,6 +143,10 @@ github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= +github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= @@ -153,7 +161,6 @@ github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lV 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= github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0= github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis= github.com/daaku/go.zipexe v1.0.2 h1:Zg55YLYTr7M9wjKn8SY/WcpuuEi+kR2u4E8RhvpyXmk= @@ -212,8 +219,8 @@ github.com/filecoin-project/dagstore v0.5.2 h1:Nd6oXdnolbbVhpMpkYT5PJHOjQp4OBSnt github.com/filecoin-project/dagstore v0.5.2/go.mod h1:mdqKzYrRBHf1pRMthYfMv3n37oOw0Tkx7+TxPt240M0= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= -github.com/filecoin-project/go-address v1.1.0 h1:ofdtUtEsNxkIxkDw67ecSmvtzaVSdcea4boAmLbnHfE= -github.com/filecoin-project/go-address v1.1.0/go.mod h1:5t3z6qPmIADZBtuE9EIzi0EwzcRy2nVhpo0I/c1r0OA= +github.com/filecoin-project/go-address v1.2.0 h1:NHmWUE/J7Pi2JZX3gZt32XuY69o9StVZeJxdBodIwOE= +github.com/filecoin-project/go-address v1.2.0/go.mod h1:kQEQ4qZ99a51X7DjT9HiMT4yR6UwLJ9kznlxsOIeDAg= github.com/filecoin-project/go-amt-ipld/v2 v2.1.0/go.mod h1:nfFPoGyX0CU9SkXX8EoCcSuHN1XcbN0c6KBh7yvP5fs= github.com/filecoin-project/go-amt-ipld/v2 v2.1.1-0.20201006184820-924ee87a1349 h1:pIuR0dnMD0i+as8wNnjjHyQrnhP5O5bmba/lmgQeRgU= github.com/filecoin-project/go-amt-ipld/v2 v2.1.1-0.20201006184820-924ee87a1349/go.mod h1:vgmwKBkx+ca5OIeEvstiQgzAZnb7R6QaqE1oEDSqa6g= @@ -221,9 +228,8 @@ github.com/filecoin-project/go-amt-ipld/v3 v3.0.0/go.mod h1:Qa95YNAbtoVCTSVtX38a github.com/filecoin-project/go-amt-ipld/v3 v3.1.0 h1:ZNJ9tEG5bE72vBWYiuh5bkxJVM3ViHNOmQ7qew9n6RE= github.com/filecoin-project/go-amt-ipld/v3 v3.1.0/go.mod h1:UjM2QhDFrrjD5s1CdnkJkat4ga+LqZBZgTMniypABRo= github.com/filecoin-project/go-amt-ipld/v4 v4.0.0/go.mod h1:gF053YQ4BIpzTNDoEwHZas7U3oAwncDVGvOHyY8oDpE= -github.com/filecoin-project/go-amt-ipld/v4 v4.2.0/go.mod h1:0eDVF7pROvxrsxvLJx+SJZXqRaXXcEPUcgb/rG0zGU4= -github.com/filecoin-project/go-amt-ipld/v4 v4.3.0 h1:bY42N1gR0DqrLMCKUPzX1VhYVgXaETQm0Um4ohvyEP8= -github.com/filecoin-project/go-amt-ipld/v4 v4.3.0/go.mod h1:39Ep/yBbF6xN94WevLG9qSbglBJepHa5zeEbAE1pYsc= +github.com/filecoin-project/go-amt-ipld/v4 v4.4.0 h1:6kvvMeSpIy4GTU5t3vPHZgWYIMRzGRKLJ73s/cltsoc= +github.com/filecoin-project/go-amt-ipld/v4 v4.4.0/go.mod h1:msgmUxTyRBZ6iXt+5dnUDnIb7SEFqdPsbB1wyo/G3ts= github.com/filecoin-project/go-bitfield v0.2.0/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-bitfield v0.2.3/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-bitfield v0.2.4 h1:uZ7MeE+XfM5lqrHJZ93OnhQKc/rveW8p9au0C68JPgk= @@ -235,22 +241,21 @@ github.com/filecoin-project/go-clock v0.1.0 h1:SFbYIM75M8NnFm1yMHhN9Ahy3W5bEZV9g 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= -github.com/filecoin-project/go-commp-utils/nonffi v0.0.0-20220905160352-62059082a837/go.mod h1:e2YBjSblNVoBckkbv3PPqsq71q98oFkFqL7s1etViGo= +github.com/filecoin-project/go-commp-utils/v2 v2.1.0 h1:KWNRalUp2bhN1SW7STsJS2AHs9mnfGKk9LnQgzDe+gI= +github.com/filecoin-project/go-commp-utils/v2 v2.1.0/go.mod h1:NbxJYlhxtWaNhlVCj/gysLNu26kYII83IV5iNrAO9iI= 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-crypto v0.1.0 h1:Pob2MphoipMbe/ksxZOMcQvmBHAd3sI/WEqcbpIsGI0= +github.com/filecoin-project/go-crypto v0.1.0/go.mod h1:K9UFXvvoyAVvB+0Le7oGlKiT9mgA5FHOJdYQXEE8IhI= github.com/filecoin-project/go-data-transfer/v2 v2.0.0-rc7 h1:v+zJS5B6pA3ptWZS4t8tbt1Hz9qENnN4nVr1w99aSWc= github.com/filecoin-project/go-data-transfer/v2 v2.0.0-rc7/go.mod h1:V3Y4KbttaCwyg1gwkP7iai8CbQx4mZUGjd3h9GZWLKE= github.com/filecoin-project/go-ds-versioning v0.1.2 h1:to4pTadv3IeV1wvgbCbN6Vqd+fu+7tveXgv/rCEZy6w= github.com/filecoin-project/go-ds-versioning v0.1.2/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4= -github.com/filecoin-project/go-f3 v0.2.0 h1:Gis44+hOrDjSUEw3IDmU7CudNILi5e+bb1pgZgp680k= -github.com/filecoin-project/go-f3 v0.2.0/go.mod h1:43fBLX0iX0+Nnw4Z91wSrdfDYAd6YEDexy7GcLnIJtk= -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= -github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= -github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= +github.com/filecoin-project/go-f3 v0.7.0 h1:JNo39SAELT5hEn+rmQZbSJQBJfmGJtp70RfyWJrIayY= +github.com/filecoin-project/go-f3 v0.7.0/go.mod h1:QoxuoK4aktNZD1R/unlhNbhV6TnlNTAbA/QODCnAjak= +github.com/filecoin-project/go-fil-commcid v0.2.0 h1:B+5UX8XGgdg/XsdUpST4pEBviKkFOw+Fvl2bLhSKGpI= +github.com/filecoin-project/go-fil-commcid v0.2.0/go.mod h1:8yigf3JDIil+/WpqR5zoKyP0jBPCOGtEqq/K1CcMy9Q= +github.com/filecoin-project/go-fil-commp-hashhash v0.2.0 h1:HYIUugzjq78YvV3vC6rL95+SfC/aSTVSnZSZiDV5pCk= +github.com/filecoin-project/go-fil-commp-hashhash v0.2.0/go.mod h1:VH3fAFOru4yyWar4626IoS5+VGE8SfZiBODJLUigEo4= github.com/filecoin-project/go-fil-markets v1.28.3 h1:2cFu7tLZYrfNz4LnxjgERaVD7k5+Wwp0H76mnnTGPBk= github.com/filecoin-project/go-fil-markets v1.28.3/go.mod h1:eryxo/oVgIxaR5g5CNr9PlvZOi+u/bak0IsPL/PT1hk= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= @@ -258,11 +263,11 @@ github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CW github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0/go.mod h1:7aWZdaQ1b16BVoQUYR+eEvrDCGJoPLxFpDynFjYfBjI= github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1/go.mod h1:gXpNmr3oQx8l3o7qkGyDjJjYSRX7hp/FGOStdqrWyDI= -github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AGIZzeifggxtKMU7zmI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= -github.com/filecoin-project/go-jsonrpc v0.3.2 h1:uuAWTZe6B3AUUta+O26HlycGoej/yiaI1fXp3Du+D3I= -github.com/filecoin-project/go-jsonrpc v0.3.2/go.mod h1:jBSvPTl8V1N7gSTuCR4bis8wnQnIjHbRPpROol6iQKM= -github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= +github.com/filecoin-project/go-hamt-ipld/v3 v3.4.0 h1:nYs6OPUF8KbZ3E8o9p9HJnQaE8iugjHR5WYVMcicDJc= +github.com/filecoin-project/go-hamt-ipld/v3 v3.4.0/go.mod h1:s0qiHRhFyrgW0SvdQMSJFQxNa4xEIG5XvqCBZUEgcbc= +github.com/filecoin-project/go-jsonrpc v0.6.0 h1:/fFJIAN/k6EgY90m7qbyfY28woMwyseZmh2gVs5sYjY= +github.com/filecoin-project/go-jsonrpc v0.6.0/go.mod h1:/n/niXcS4ZQua6i37LcVbY1TmlJR0UIK9mDFQq2ICek= github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= @@ -271,18 +276,16 @@ 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.4/go.mod h1:xCA/WfKlC2zcn3fUmDv4IrzznwS98X5XW/irUP3Lhxg= 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.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-state-types v0.15.0-rc1 h1:tfXvhMAAo4jBQIEM1AjQzDCbwqvsxVMOLhIcDYf10fA= +github.com/filecoin-project/go-state-types v0.15.0-rc1/go.mod h1:YcWoJE/24XGEL6w9FjUoMBu7+eHEkgwKnkGZkTBX9TE= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= 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= github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNdofHZoGPjfNaAo5Q= github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= -github.com/filecoin-project/lotus v1.28.2 h1:15+N52X8BX1PxZ2mL6UwcbTnlvzn9xZQr90BF37WAXo= -github.com/filecoin-project/lotus v1.28.2/go.mod h1:dZY9K9X1mkanXBkpS5tmZwd1mQrrIfGfYOIAFQoaPqI= +github.com/filecoin-project/lotus v1.30.0-rc1 h1:cvieumxDhGffmugnvj5Xsvw26XJ9Xy/ck4PltJLmNpg= +github.com/filecoin-project/lotus v1.30.0-rc1/go.mod h1:gXQFTK6OpJIjg2yWnYsf0awszREDffb/X+LPCDmZkwI= github.com/filecoin-project/pubsub v1.0.0 h1:ZTmT27U07e54qV1mMiQo4HDr0buo8I1LDHBYLXlsNXM= github.com/filecoin-project/pubsub v1.0.0/go.mod h1:GkpB33CcUtUNrLPhJgfdy4FDx4OMNR9k+46DHx/Lqrg= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= @@ -310,7 +313,6 @@ github.com/flynn/noise v1.1.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwU github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= -github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -422,7 +424,6 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -490,7 +491,6 @@ github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+l github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru/arc/v2 v2.0.7 h1:QxkVTxwColcduO+LP7eJO56r2hFiG8zEbfAAzRv52KQ= @@ -542,8 +542,6 @@ github.com/ipfs/go-cid v0.0.5/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67Fexh github.com/ipfs/go-cid v0.0.6-0.20200501230655-7c82f3b81c00/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog= github.com/ipfs/go-cid v0.0.6/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= -github.com/ipfs/go-cid v0.2.0/go.mod h1:P+HXFDF4CVhaVayiEb4wkAy7zBHxBwsJyt0Y5U6MLro= -github.com/ipfs/go-cid v0.3.2/go.mod h1:gQ8pKqT/sUxGY+tIwy1RPpAojYu7jAyCp5Tz1svoupw= github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= github.com/ipfs/go-cidutil v0.1.0 h1:RW5hO7Vcf16dplUU60Hs0AKDkQAVPVplr7lk97CFL+Q= @@ -569,7 +567,6 @@ github.com/ipfs/go-graphsync v0.16.0 h1:0BX7whXlV13Y9FZ/jRg+xaGHaGYbtGxGppKD6tnc github.com/ipfs/go-graphsync v0.16.0/go.mod h1:WfbMW3hhmX5GQEQ+KJxsFzVJVBKgC5szfrYK7Zc7xIM= github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw= -github.com/ipfs/go-ipfs-blockstore v1.2.0/go.mod h1:eh8eTFLiINYNSNawfZOC7HOxNTxpB1PFuA5E1m/7exE= github.com/ipfs/go-ipfs-blockstore v1.3.1 h1:cEI9ci7V0sRNivqaOr0elDsamxXFxJMMMy7PTTDQNsQ= github.com/ipfs/go-ipfs-blockstore v1.3.1/go.mod h1:KgtZyc9fq+P2xJUiCAzbRdhhqJHvsw8u2Dlqy2MyRTE= github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ= @@ -581,7 +578,6 @@ github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1Y github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1IeRQ= github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= github.com/ipfs/go-ipfs-ds-help v0.0.1/go.mod h1:gtP9xRaZXqIQRh1HRpp595KbBEdgqWFxefeVKOV8sxo= -github.com/ipfs/go-ipfs-ds-help v1.1.0/go.mod h1:YR5+6EaebOhfcqVCyqemItCLthrpVNot+rsOU/5IatU= github.com/ipfs/go-ipfs-ds-help v1.1.1 h1:B5UJOH52IbcfS56+Ul+sv8jnIV10lbjLF5eOO0C66Nw= github.com/ipfs/go-ipfs-ds-help v1.1.1/go.mod h1:75vrVCkSdSFidJscs8n4W+77AtTpCIAdDGAwjitJMIo= github.com/ipfs/go-ipfs-exchange-interface v0.0.1/go.mod h1:c8MwfHjtQjPoDyiy9cFquVtVHkO9b9Ob3FG91qJnWCM= @@ -606,16 +602,13 @@ github.com/ipfs/go-ipfs-util v0.0.3/go.mod h1:LHzG1a0Ig4G+iZ26UUOMjHd+lfM84LZCrn github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= -github.com/ipfs/go-ipld-cbor v0.0.5/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211231443-5d9b9e1f6fa8/go.mod h1:ssdxxaLJPXH7OjF5V4NSjBbcfh+evoR4ukuru0oPXMA= github.com/ipfs/go-ipld-cbor v0.0.6/go.mod h1:ssdxxaLJPXH7OjF5V4NSjBbcfh+evoR4ukuru0oPXMA= -github.com/ipfs/go-ipld-cbor v0.1.0 h1:dx0nS0kILVivGhfWuB6dUpMa/LAwElHPw1yOGYopoYs= -github.com/ipfs/go-ipld-cbor v0.1.0/go.mod h1:U2aYlmVrJr2wsUBU67K4KgepApSZddGRDWBYR0H4sCk= +github.com/ipfs/go-ipld-cbor v0.2.0 h1:VHIW3HVIjcMd8m4ZLZbrYpwjzqlVUfjLM7oK4T5/YF0= +github.com/ipfs/go-ipld-cbor v0.2.0/go.mod h1:Cp8T7w1NKcu4AQJLqK0tWpd1nkgTxEVB5C6kVpLW6/0= github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= github.com/ipfs/go-ipld-format v0.2.0/go.mod h1:3l3C1uKoadTPbeNfrDi+xMInYKlx2Cvg1BuydPSdzQs= -github.com/ipfs/go-ipld-format v0.3.0/go.mod h1:co/SdBE8h99968X0hViiw1MNlh6fvxxnHpvVLnH7jSM= -github.com/ipfs/go-ipld-format v0.4.0/go.mod h1:co/SdBE8h99968X0hViiw1MNlh6fvxxnHpvVLnH7jSM= github.com/ipfs/go-ipld-format v0.6.0 h1:VEJlA2kQ3LqFSIm5Vu6eIlSxD/Ze90xtc4Meten1F5U= github.com/ipfs/go-ipld-format v0.6.0/go.mod h1:g4QVMTn3marU3qXchwjpKPKgJv+zF+OlaKMyhJ4LHPg= github.com/ipfs/go-ipld-legacy v0.2.1 h1:mDFtrBpmU7b//LzLSypVrXsD8QxkEWxu5qVxN99/+tk= @@ -630,7 +623,6 @@ github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8= github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo= github.com/ipfs/go-log/v2 v2.0.1/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0= github.com/ipfs/go-log/v2 v2.0.5/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw= -github.com/ipfs/go-log/v2 v2.1.2-0.20200626104915-0016c0b4b3e4/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= github.com/ipfs/go-log/v2 v2.3.0/go.mod h1:QqGoj30OTpnKaG/LKTGTxoP2mmQtjVMEnK72gynbe/g= github.com/ipfs/go-log/v2 v2.5.0/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= @@ -665,7 +657,6 @@ github.com/ipld/go-ipld-adl-hamt v0.0.0-20220616142416-9004dbd839e0/go.mod h1:od github.com/ipld/go-ipld-prime v0.0.2-0.20191108012745-28a82f04c785/go.mod h1:bDDSvVz7vaK12FNvMeRYnpRFkSUPNQOiCYQezMD/P3w= github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.10.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= -github.com/ipld/go-ipld-prime v0.19.0/go.mod h1:Q9j3BaVXwaA3o5JUDNvptDDr/x8+F7FG6XJ8WI3ILg4= github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH9C2E= github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= @@ -677,7 +668,6 @@ github.com/ipni/go-libipni v0.0.8 h1:0wLfZRSBG84swmZwmaLKul/iB/FlBkkl9ZcR1ub+Z+w github.com/ipni/go-libipni v0.0.8/go.mod h1:paYP9U4N3/vOzGCuN9kU972vtvw9JUcQjOKyiCFGwRk= github.com/ipni/index-provider v0.12.0 h1:R3F6dxxKNv4XkE4GJZNLOG0bDEbBQ/S5iztXwSD8jhQ= github.com/ipni/index-provider v0.12.0/go.mod h1:GhyrADJp7n06fqoc1djzkvL4buZYHzV8SoWrlxEo5F4= -github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4= github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= @@ -727,10 +717,8 @@ github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8 github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= -github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM= +github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= @@ -740,7 +728,6 @@ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFB github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -762,8 +749,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.4 h1:FDiBUYLkueFwsuNJUZaxKRdpKvBOWU64qQPL768bSeg= -github.com/libp2p/go-libp2p v0.35.4/go.mod h1:RKCDNt30IkFipGL0tl8wQW/3zVWEGFUZo8g2gAKxwjU= +github.com/libp2p/go-libp2p v0.35.5 h1:uCA1pHDvoemISNAugfYhDYECDMftbVOjCCeMjFqlhaM= +github.com/libp2p/go-libp2p v0.35.5/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= @@ -846,7 +833,6 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/miekg/dns v1.1.59 h1:C9EXc/UToRwKLhK5wKU/I4QVsBUc8kE6MkHBkeypWZs= github.com/miekg/dns v1.1.59/go.mod h1:nZpewl5p6IvctfgrckopVx2OlSEHPRO/U4SYkRklrEk= github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc= @@ -866,6 +852,8 @@ github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5 github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= @@ -878,7 +866,6 @@ github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjW github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= -github.com/multiformats/go-base32 v0.0.4/go.mod h1:jNLFzjPZtp3aIARHbJRZIaPuspdH0J6q39uUM5pnABM= github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE= github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI= github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM= @@ -888,13 +875,12 @@ github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lg github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo= -github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4= -github.com/multiformats/go-multiaddr v0.12.4 h1:rrKqpY9h+n80EwhhC/kkcunCZZ7URIF8yN1WEUt2Hvc= -github.com/multiformats/go-multiaddr v0.12.4/go.mod h1:sBXrNzucqkFJhvKOiwwLyqamGa/P5EIXNPLovyhQCII= +github.com/multiformats/go-multiaddr v0.13.0 h1:BCBzs61E3AGHcYYTv8dqRH43ZfyrqM8RXVPT8t13tLQ= +github.com/multiformats/go-multiaddr v0.13.0/go.mod h1:sBXrNzucqkFJhvKOiwwLyqamGa/P5EIXNPLovyhQCII= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= -github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A= -github.com/multiformats/go-multiaddr-dns v0.3.1/go.mod h1:G/245BRQ6FJGmryJCrOuTdB37AMA5AMOVuO6NY3JwTk= +github.com/multiformats/go-multiaddr-dns v0.4.0 h1:P76EJ3qzBXpUXZ3twdCDx/kvagMsNo0LMFXpyms/zgU= +github.com/multiformats/go-multiaddr-dns v0.4.0/go.mod h1:7hfthtB4E4pQwirrz+J0CcDUfbWzTqEzVyYKKIKpgkc= github.com/multiformats/go-multiaddr-fmt v0.0.1/go.mod h1:aBYjqL4T/7j4Qx+R73XSv/8JsgnRFlf0w2KGLCmXl3Q= github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo= @@ -903,7 +889,6 @@ github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/g github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g= github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk= -github.com/multiformats/go-multicodec v0.6.0/go.mod h1:GUC8upxSBE4oG+q3kWZRw/+6yC1BqO550bjhWsJbZlw= github.com/multiformats/go-multicodec v0.9.0 h1:pb/dlPnzee/Sxv/j4PmkDRxCOi3hXTz3IbPKOXWJkmg= github.com/multiformats/go-multicodec v0.9.0/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI16i14xuaojr/H7Ai54k= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= @@ -914,13 +899,11 @@ github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpK github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg= -github.com/multiformats/go-multihash v0.2.1/go.mod h1:WxoMcYG85AZVQUyRyo9s4wULvW5qrI9vb2Lt6evduFc= github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U= github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM= github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.5.0 h1:5htLSLl7lvJk3xx3qT/8Zm9J4K8vEOf/QGkvOGQAyiE= github.com/multiformats/go-multistream v0.5.0/go.mod h1:n6tMZiwiP2wUsR8DgfDWw1dydlEqV3l6N3/GBsX6ILA= -github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= 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= @@ -1053,7 +1036,6 @@ github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtB github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtDqv66NfsMU= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= @@ -1108,6 +1090,7 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stvp/go-udp-testing v0.0.0-20201019212854-469649b16807/go.mod h1:7jxmlfBCDBXRzr0eAQJ48XC1hBu1np4CS5+cHEYfwpc= @@ -1128,7 +1111,6 @@ github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyC github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.1.0 h1:RZqt0yGBsps8NGvLSGW804QQqCUYYLsaOjTVHy1Ocw4= github.com/valyala/fasttemplate v1.1.0/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/warpfork/go-testmark v0.10.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0= github.com/warpfork/go-testmark v0.12.1 h1:rMgCpJfwy1sJ50x0M0NgyphxYYPMOODIJHhsXyEHU0s= github.com/warpfork/go-testmark v0.12.1/go.mod h1:kHwy7wfvGSPh1rQJYKayD4AbtNaeyZdcGi9tNJTaa5Y= github.com/warpfork/go-wish v0.0.0-20180510122957-5ad1f5abf436/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= @@ -1156,11 +1138,9 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20200810223238-211df3b9e24c/go.mod h1:f github.com/whyrusleeping/cbor-gen v0.0.0-20200812213548-958ddffe352c/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20200826160007-0b9f6c5fb163/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210118024343-169e9d70c0c2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= -github.com/whyrusleeping/cbor-gen v0.0.0-20210303213153-67a261a1d291/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20220323183124-98fa8256a799/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= -github.com/whyrusleeping/cbor-gen v0.1.0/go.mod h1:pM99HXyEbSQHcosHc0iW7YFmwnscr+t9Te4ibko05so= -github.com/whyrusleeping/cbor-gen v0.1.1 h1:eKfcJIoxivjMtwfCfmJAqSF56MHcWqyIScXwaC1VBgw= -github.com/whyrusleeping/cbor-gen v0.1.1/go.mod h1:pM99HXyEbSQHcosHc0iW7YFmwnscr+t9Te4ibko05so= +github.com/whyrusleeping/cbor-gen v0.1.2 h1:WQFlrPhpcQl+M2/3dP5cvlTLWPVsL6LGBb9jJt6l/cA= +github.com/whyrusleeping/cbor-gen v0.1.2/go.mod h1:pM99HXyEbSQHcosHc0iW7YFmwnscr+t9Te4ibko05so= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8= github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 h1:EKhdznlJHPMoKr0XTrX+IlJs1LH3lyx2nfr1dOlZ79k= @@ -1188,8 +1168,14 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +gitlab.com/yawning/secp256k1-voi v0.0.0-20230925100816-f2616030848b h1:CzigHMRySiX3drau9C6Q5CAbNIApmLdat5jPMqChvDA= +gitlab.com/yawning/secp256k1-voi v0.0.0-20230925100816-f2616030848b/go.mod h1:/y/V339mxv2sZmYYR64O07VuCpdNZqCTwO8ZcouTMI8= +gitlab.com/yawning/tuplehash v0.0.0-20230713102510-df83abbf9a02 h1:qwDnMxjkyLmAFgcfgTnfJrmYKWhHnci3GjDqcZp1M3Q= +gitlab.com/yawning/tuplehash v0.0.0-20230713102510-df83abbf9a02/go.mod h1:JTnUj0mpYiAsuZLmKjTx/ex3AtMowcCgnE7YNyCEP0I= go.dedis.ch/fixbuf v1.0.3 h1:hGcV9Cd/znUxlusJ64eAlExS+5cJDIyTyEG+otu5wQs= go.dedis.ch/fixbuf v1.0.3/go.mod h1:yzJMt34Wa5xD37V5RTdmp38cz3QhMagdGoem9anUalw= +go.dedis.ch/kyber/v4 v4.0.0-pre2.0.20240924132404-4de33740016e h1:BAGc1ommHzlhqHktWyRmoldVONj3QHMzdfGLW4ItltA= +go.dedis.ch/kyber/v4 v4.0.0-pre2.0.20240924132404-4de33740016e/go.mod h1:tg6jwKTYEjm94VxkFwiQy+ec9hoQvccIU989wNjXWVI= go.dedis.ch/protobuf v1.0.11 h1:FTYVIEzY/bfl37lu3pR4lIj+F9Vp1jE8oh91VmxKgLo= go.dedis.ch/protobuf v1.0.11/go.mod h1:97QR256dnkimeNdfmURz0wAMNVbd1VmLXhG1CrTYrJ4= go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= @@ -1209,6 +1195,8 @@ go.opentelemetry.io/otel/bridge/opencensus v1.28.0 h1:/BcyAV1bUJjSVxoeKwTQL9cS4X 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/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= @@ -1266,13 +1254,10 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200311171314-f7b00557c8c4/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= -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/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= +golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A= +golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70= 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= @@ -1283,8 +1268,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= -golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= +golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e h1:I88y4caeGeuDQxgdoFPUq097j7kNfw6uvuiNxUBfcBk= +golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1312,8 +1297,8 @@ golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0= +golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1357,7 +1342,6 @@ golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLd golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= @@ -1365,12 +1349,11 @@ golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -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/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1405,8 +1388,8 @@ golang.org/x/sync v0.0.0-20220513210516-0976fa681c29/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1459,7 +1442,6 @@ golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1487,24 +1469,21 @@ golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.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/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.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-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= +golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= 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= @@ -1514,12 +1493,11 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.14.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/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= 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= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1584,16 +1562,16 @@ golang.org/x/tools v0.1.4/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.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/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24= +golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ= 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= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= gonum.org/v1/gonum v0.15.0 h1:2lYxjRbTYyxkJxlhC+LvJIx3SsANPdRybu1tGj9/OrQ= gonum.org/v1/gonum v0.15.0/go.mod h1:xzZVBJBtS+Mz4q0Yl2LJTk+OxOg4jiXZ7qBoM0uISGo= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= @@ -1793,7 +1771,6 @@ gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= @@ -1805,10 +1782,10 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= -lukechampine.com/blake3 v1.1.7/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= lukechampine.com/blake3 v1.3.0 h1:sJ3XhFINmHSrYCgl958hscfIa3bw8x4DqMP3u1YvoYE= lukechampine.com/blake3 v1.3.0/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/venus-devtool/inline-gen/inlinegen-data.json b/venus-devtool/inline-gen/inlinegen-data.json index 447e2df1f0..34f4bcea03 100644 --- a/venus-devtool/inline-gen/inlinegen-data.json +++ b/venus-devtool/inline-gen/inlinegen-data.json @@ -1,7 +1,7 @@ { - "actorVersions": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], - "latestActorsVersion": 14, + "actorVersions": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], + "latestActorsVersion": 15, - "networkVersions": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23], - "latestNetworkVersion": 23 + "networkVersions": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24], + "latestNetworkVersion": 24 } diff --git a/venus-shared/actors/builtin-actors-code/v15.tar.zst b/venus-shared/actors/builtin-actors-code/v15.tar.zst new file mode 100644 index 0000000000..76ca1a9d80 Binary files /dev/null and b/venus-shared/actors/builtin-actors-code/v15.tar.zst differ diff --git a/venus-shared/actors/builtin/account/actor.go b/venus-shared/actors/builtin/account/actor.go index 37ebc2a6bf..cdfbae825b 100644 --- a/venus-shared/actors/builtin/account/actor.go +++ b/venus-shared/actors/builtin/account/actor.go @@ -30,10 +30,10 @@ import ( builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - builtin14 "github.com/filecoin-project/go-state-types/builtin" + builtin15 "github.com/filecoin-project/go-state-types/builtin" ) -var Methods = builtin14.MethodsAccount +var Methods = builtin15.MethodsAccount func Load(store adt.Store, act *types.Actor) (State, error) { if name, av, ok := actors.GetActorMetaByCode(act.Code); ok { @@ -64,6 +64,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case actorstypes.Version14: return load14(store, act.Head) + case actorstypes.Version15: + return load15(store, act.Head) + } } @@ -140,6 +143,9 @@ func MakeState(store adt.Store, av actorstypes.Version, addr address.Address) (S case actorstypes.Version14: return make14(store, addr) + case actorstypes.Version15: + return make15(store, addr) + } return nil, fmt.Errorf("unknown actor version %d", av) } @@ -171,5 +177,6 @@ func AllCodes() []cid.Cid { (&state12{}).Code(), (&state13{}).Code(), (&state14{}).Code(), + (&state15{}).Code(), } } diff --git a/venus-shared/actors/builtin/account/state.v15.go b/venus-shared/actors/builtin/account/state.v15.go new file mode 100644 index 0000000000..a37e11b4b4 --- /dev/null +++ b/venus-shared/actors/builtin/account/state.v15.go @@ -0,0 +1,65 @@ +// FETCHED FROM LOTUS: builtin/account/state.go.template + +package account + +import ( + "fmt" + + actorstypes "github.com/filecoin-project/go-state-types/actors" + + "github.com/filecoin-project/go-address" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/go-state-types/manifest" + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + account15 "github.com/filecoin-project/go-state-types/builtin/v15/account" +) + +var _ State = (*state15)(nil) + +func load15(store adt.Store, root cid.Cid) (State, error) { + out := state15{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make15(store adt.Store, addr address.Address) (State, error) { + out := state15{store: store} + out.State = account15.State{Address: addr} + return &out, nil +} + +type state15 struct { + account15.State + store adt.Store +} + +func (s *state15) PubkeyAddress() (address.Address, error) { + return s.Address, nil +} + +func (s *state15) GetState() interface{} { + return &s.State +} + +func (s *state15) ActorKey() string { + return manifest.AccountKey +} + +func (s *state15) ActorVersion() actorstypes.Version { + return actorstypes.Version15 +} + +func (s *state15) Code() cid.Cid { + code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey()) + if !ok { + panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion())) + } + + return code +} diff --git a/venus-shared/actors/builtin/builtin.go b/venus-shared/actors/builtin/builtin.go index eab597ed70..8f4abad11e 100644 --- a/venus-shared/actors/builtin/builtin.go +++ b/venus-shared/actors/builtin/builtin.go @@ -37,6 +37,7 @@ var InitActorAddr = builtin.InitActorAddr var SystemActorAddr = builtin.SystemActorAddr var BurntFundsActorAddr = builtin.BurntFundsActorAddr var CronActorAddr = builtin.CronActorAddr +var DatacapActorAddr = builtin.DatacapActorAddr var EthereumAddressManagerActorAddr = builtin.EthereumAddressManagerActorAddr var SaftAddress = makeAddress("t0122") var ReserveAddress = makeAddress("t090") @@ -49,6 +50,7 @@ var ( const ( EpochDurationSeconds = builtin.EpochDurationSeconds EpochsInDay = builtin.EpochsInDay + EpochsInYear = builtin.EpochsInYear SecondsInDay = builtin.SecondsInDay ) diff --git a/venus-shared/actors/builtin/builtin.go.template b/venus-shared/actors/builtin/builtin.go.template index 20af3f8a90..b86182568a 100644 --- a/venus-shared/actors/builtin/builtin.go.template +++ b/venus-shared/actors/builtin/builtin.go.template @@ -29,6 +29,7 @@ var InitActorAddr = builtin.InitActorAddr var SystemActorAddr = builtin.SystemActorAddr var BurntFundsActorAddr = builtin.BurntFundsActorAddr var CronActorAddr = builtin.CronActorAddr +var DatacapActorAddr = builtin.DatacapActorAddr var EthereumAddressManagerActorAddr = builtin.EthereumAddressManagerActorAddr var SaftAddress = makeAddress("t0122") var ReserveAddress = makeAddress("t090") @@ -41,6 +42,7 @@ var ( const ( EpochDurationSeconds = builtin.EpochDurationSeconds EpochsInDay = builtin.EpochsInDay + EpochsInYear = builtin.EpochsInYear SecondsInDay = builtin.SecondsInDay ) diff --git a/venus-shared/actors/builtin/cron/actor.go b/venus-shared/actors/builtin/cron/actor.go index e298204555..2214fc5de5 100644 --- a/venus-shared/actors/builtin/cron/actor.go +++ b/venus-shared/actors/builtin/cron/actor.go @@ -26,7 +26,7 @@ import ( builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - builtin14 "github.com/filecoin-project/go-state-types/builtin" + builtin15 "github.com/filecoin-project/go-state-types/builtin" ) func Load(store adt.Store, act *types.Actor) (State, error) { @@ -58,6 +58,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case actorstypes.Version14: return load14(store, act.Head) + case actorstypes.Version15: + return load15(store, act.Head) + } } @@ -134,13 +137,16 @@ func MakeState(store adt.Store, av actorstypes.Version) (State, error) { case actorstypes.Version14: return make14(store) + case actorstypes.Version15: + return make15(store) + } return nil, fmt.Errorf("unknown actor version %d", av) } var ( - Address = builtin14.CronActorAddr - Methods = builtin14.MethodsCron + Address = builtin15.CronActorAddr + Methods = builtin15.MethodsCron ) type State interface { @@ -167,5 +173,6 @@ func AllCodes() []cid.Cid { (&state12{}).Code(), (&state13{}).Code(), (&state14{}).Code(), + (&state15{}).Code(), } } diff --git a/venus-shared/actors/builtin/cron/state.v15.go b/venus-shared/actors/builtin/cron/state.v15.go new file mode 100644 index 0000000000..25fae1000b --- /dev/null +++ b/venus-shared/actors/builtin/cron/state.v15.go @@ -0,0 +1,59 @@ +// FETCHED FROM LOTUS: builtin/cron/state.go.template + +package cron + +import ( + "fmt" + + "github.com/ipfs/go-cid" + + actorstypes "github.com/filecoin-project/go-state-types/actors" + "github.com/filecoin-project/go-state-types/manifest" + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + cron15 "github.com/filecoin-project/go-state-types/builtin/v15/cron" +) + +var _ State = (*state15)(nil) + +func load15(store adt.Store, root cid.Cid) (State, error) { + out := state15{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make15(store adt.Store) (State, error) { + out := state15{store: store} + out.State = *cron15.ConstructState(cron15.BuiltInEntries()) + return &out, nil +} + +type state15 struct { + cron15.State + store adt.Store +} + +func (s *state15) GetState() interface{} { + return &s.State +} + +func (s *state15) ActorKey() string { + return manifest.CronKey +} + +func (s *state15) ActorVersion() actorstypes.Version { + return actorstypes.Version15 +} + +func (s *state15) Code() cid.Cid { + code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey()) + if !ok { + panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion())) + } + + return code +} diff --git a/venus-shared/actors/builtin/datacap/actor.go b/venus-shared/actors/builtin/datacap/actor.go index 64e2f4a599..c38557717c 100644 --- a/venus-shared/actors/builtin/datacap/actor.go +++ b/venus-shared/actors/builtin/datacap/actor.go @@ -10,7 +10,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" actorstypes "github.com/filecoin-project/go-state-types/actors" - builtin14 "github.com/filecoin-project/go-state-types/builtin" + builtin15 "github.com/filecoin-project/go-state-types/builtin" "github.com/filecoin-project/go-state-types/cbor" "github.com/filecoin-project/go-state-types/manifest" @@ -20,8 +20,8 @@ import ( ) var ( - Address = builtin14.DatacapActorAddr - Methods = builtin14.MethodsDatacap + Address = builtin15.DatacapActorAddr + Methods = builtin15.MethodsDatacap ) func Load(store adt.Store, act *types.Actor) (State, error) { @@ -50,6 +50,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case actorstypes.Version14: return load14(store, act.Head) + case actorstypes.Version15: + return load15(store, act.Head) + } } @@ -77,6 +80,9 @@ func MakeState(store adt.Store, av actorstypes.Version, governor address.Address case actorstypes.Version14: return make14(store, governor, bitwidth) + case actorstypes.Version15: + return make15(store, governor, bitwidth) + default: return nil, fmt.Errorf("datacap actor only valid for actors v9 and above, got %d", av) } @@ -103,5 +109,6 @@ func AllCodes() []cid.Cid { (&state12{}).Code(), (&state13{}).Code(), (&state14{}).Code(), + (&state15{}).Code(), } } diff --git a/venus-shared/actors/builtin/datacap/state.v15.go b/venus-shared/actors/builtin/datacap/state.v15.go new file mode 100644 index 0000000000..17d542fc12 --- /dev/null +++ b/venus-shared/actors/builtin/datacap/state.v15.go @@ -0,0 +1,84 @@ +// FETCHED FROM LOTUS: builtin/datacap/state.go.template + +package datacap + +import ( + "fmt" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + + actorstypes "github.com/filecoin-project/go-state-types/actors" + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + datacap15 "github.com/filecoin-project/go-state-types/builtin/v15/datacap" + adt15 "github.com/filecoin-project/go-state-types/builtin/v15/util/adt" + "github.com/filecoin-project/go-state-types/manifest" +) + +var _ State = (*state15)(nil) + +func load15(store adt.Store, root cid.Cid) (State, error) { + out := state15{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make15(store adt.Store, governor address.Address, bitwidth uint64) (State, error) { + out := state15{store: store} + s, err := datacap15.ConstructState(store, governor, bitwidth) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state15 struct { + datacap15.State + store adt.Store +} + +func (s *state15) Governor() (address.Address, error) { + return s.State.Governor, nil +} + +func (s *state15) GetState() interface{} { + return &s.State +} + +func (s *state15) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error { + return forEachClient(s.store, actors.Version15, s.verifiedClients, cb) +} + +func (s *state15) verifiedClients() (adt.Map, error) { + return adt15.AsMap(s.store, s.Token.Balances, int(s.Token.HamtBitWidth)) +} + +func (s *state15) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) { + return getDataCap(s.store, actors.Version15, s.verifiedClients, addr) +} + +func (s *state15) ActorKey() string { + return manifest.DatacapKey +} + +func (s *state15) ActorVersion() actorstypes.Version { + return actorstypes.Version15 +} + +func (s *state15) Code() cid.Cid { + code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey()) + if !ok { + panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion())) + } + + return code +} diff --git a/venus-shared/actors/builtin/evm/actor.go b/venus-shared/actors/builtin/evm/actor.go index 56b45d03ba..0c431e0a13 100644 --- a/venus-shared/actors/builtin/evm/actor.go +++ b/venus-shared/actors/builtin/evm/actor.go @@ -17,10 +17,10 @@ import ( "github.com/filecoin-project/go-state-types/exitcode" "github.com/filecoin-project/go-state-types/manifest" - builtin14 "github.com/filecoin-project/go-state-types/builtin" + builtin15 "github.com/filecoin-project/go-state-types/builtin" ) -var Methods = builtin14.MethodsEVM +var Methods = builtin15.MethodsEVM // See https://github.com/filecoin-project/builtin-actors/blob/6e781444cee5965278c46ef4ffe1fb1970f18d7d/actors/evm/src/lib.rs#L35-L42 const ( @@ -57,6 +57,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case actorstypes.Version14: return load14(store, act.Head) + case actorstypes.Version15: + return load15(store, act.Head) + } } @@ -81,6 +84,9 @@ func MakeState(store adt.Store, av actorstypes.Version, bytecode cid.Cid) (State case actorstypes.Version14: return make14(store, bytecode) + case actorstypes.Version15: + return make15(store, bytecode) + default: return nil, fmt.Errorf("evm actor only valid for actors v10 and above, got %d", av) } diff --git a/venus-shared/actors/builtin/evm/state.v15.go b/venus-shared/actors/builtin/evm/state.v15.go new file mode 100644 index 0000000000..6e16254f1b --- /dev/null +++ b/venus-shared/actors/builtin/evm/state.v15.go @@ -0,0 +1,74 @@ +// FETCHED FROM LOTUS: builtin/evm/state.go.template + +package evm + +import ( + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + evm15 "github.com/filecoin-project/go-state-types/builtin/v15/evm" +) + +var _ State = (*state15)(nil) + +func load15(store adt.Store, root cid.Cid) (State, error) { + out := state15{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make15(store adt.Store, bytecode cid.Cid) (State, error) { + out := state15{store: store} + s, err := evm15.ConstructState(store, bytecode) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state15 struct { + evm15.State + store adt.Store +} + +func (s *state15) Nonce() (uint64, error) { + return s.State.Nonce, nil +} + +func (s *state15) IsAlive() (bool, error) { + return s.State.Tombstone == nil, nil +} + +func (s *state15) GetState() interface{} { + return &s.State +} + +func (s *state15) GetBytecodeCID() (cid.Cid, error) { + return s.State.Bytecode, nil +} + +func (s *state15) GetBytecodeHash() ([32]byte, error) { + return s.State.BytecodeHash, nil +} + +func (s *state15) GetBytecode() ([]byte, error) { + bc, err := s.GetBytecodeCID() + if err != nil { + return nil, err + } + + var byteCode abi.CborBytesTransparent + if err := s.store.Get(s.store.Context(), bc, &byteCode); err != nil { + return nil, err + } + + return byteCode, nil +} diff --git a/venus-shared/actors/builtin/init/actor.go b/venus-shared/actors/builtin/init/actor.go index af665234e1..1057f8f7c8 100644 --- a/venus-shared/actors/builtin/init/actor.go +++ b/venus-shared/actors/builtin/init/actor.go @@ -32,12 +32,12 @@ import ( builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - builtin14 "github.com/filecoin-project/go-state-types/builtin" + builtin15 "github.com/filecoin-project/go-state-types/builtin" ) var ( - Address = builtin14.InitActorAddr - Methods = builtin14.MethodsInit + Address = builtin15.InitActorAddr + Methods = builtin15.MethodsInit ) func Load(store adt.Store, act *types.Actor) (State, error) { @@ -69,6 +69,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case actorstypes.Version14: return load14(store, act.Head) + case actorstypes.Version15: + return load15(store, act.Head) + } } @@ -145,6 +148,9 @@ func MakeState(store adt.Store, av actorstypes.Version, networkName string) (Sta case actorstypes.Version14: return make14(store, networkName) + case actorstypes.Version15: + return make15(store, networkName) + } return nil, fmt.Errorf("unknown actor version %d", av) } @@ -199,5 +205,6 @@ func AllCodes() []cid.Cid { (&state12{}).Code(), (&state13{}).Code(), (&state14{}).Code(), + (&state15{}).Code(), } } diff --git a/venus-shared/actors/builtin/init/state.v15.go b/venus-shared/actors/builtin/init/state.v15.go new file mode 100644 index 0000000000..636ac8ac63 --- /dev/null +++ b/venus-shared/actors/builtin/init/state.v15.go @@ -0,0 +1,148 @@ +// FETCHED FROM LOTUS: builtin/init/state.go.template + +package init + +import ( + "crypto/sha256" + "fmt" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + + actorstypes "github.com/filecoin-project/go-state-types/actors" + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + "github.com/filecoin-project/go-state-types/manifest" + + builtin15 "github.com/filecoin-project/go-state-types/builtin" + init15 "github.com/filecoin-project/go-state-types/builtin/v15/init" + adt15 "github.com/filecoin-project/go-state-types/builtin/v15/util/adt" +) + +var _ State = (*state15)(nil) + +func load15(store adt.Store, root cid.Cid) (State, error) { + out := state15{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make15(store adt.Store, networkName string) (State, error) { + out := state15{store: store} + + s, err := init15.ConstructState(store, networkName) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state15 struct { + init15.State + store adt.Store +} + +func (s *state15) ResolveAddress(address address.Address) (address.Address, bool, error) { + return s.State.ResolveAddress(s.store, address) +} + +func (s *state15) MapAddressToNewID(address address.Address) (address.Address, error) { + return s.State.MapAddressToNewID(s.store, address) +} + +func (s *state15) ForEachActor(cb func(id abi.ActorID, address address.Address) error) error { + addrs, err := adt15.AsMap(s.store, s.State.AddressMap, builtin15.DefaultHamtBitwidth) + if err != nil { + return err + } + var actorID cbg.CborInt + return addrs.ForEach(&actorID, func(key string) error { + addr, err := address.NewFromBytes([]byte(key)) + if err != nil { + return err + } + return cb(abi.ActorID(actorID), addr) + }) +} + +func (s *state15) NetworkName() (string, error) { + return string(s.State.NetworkName), nil +} + +func (s *state15) SetNetworkName(name string) error { + s.State.NetworkName = name + return nil +} + +func (s *state15) SetNextID(id abi.ActorID) error { + s.State.NextID = id + return nil +} + +func (s *state15) Remove(addrs ...address.Address) (err error) { + m, err := adt15.AsMap(s.store, s.State.AddressMap, builtin15.DefaultHamtBitwidth) + if err != nil { + return err + } + for _, addr := range addrs { + if err = m.Delete(abi.AddrKey(addr)); err != nil { + return fmt.Errorf("failed to delete entry for address: %s; err: %w", addr, err) + } + } + amr, err := m.Root() + if err != nil { + return fmt.Errorf("failed to get address map root: %w", err) + } + s.State.AddressMap = amr + return nil +} + +func (s *state15) SetAddressMap(mcid cid.Cid) error { + s.State.AddressMap = mcid + return nil +} + +func (s *state15) GetState() interface{} { + return &s.State +} + +func (s *state15) AddressMap() (adt.Map, error) { + return adt15.AsMap(s.store, s.State.AddressMap, builtin15.DefaultHamtBitwidth) +} + +func (s *state15) AddressMapBitWidth() int { + return builtin15.DefaultHamtBitwidth +} + +func (s *state15) AddressMapHashFunction() func(input []byte) []byte { + return func(input []byte) []byte { + res := sha256.Sum256(input) + return res[:] + } +} + +func (s *state15) ActorKey() string { + return manifest.InitKey +} + +func (s *state15) ActorVersion() actorstypes.Version { + return actorstypes.Version15 +} + +func (s *state15) Code() cid.Cid { + code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey()) + if !ok { + panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion())) + } + + return code +} diff --git a/venus-shared/actors/builtin/market/actor.go b/venus-shared/actors/builtin/market/actor.go index 54a64b44a5..a64eb5ba02 100644 --- a/venus-shared/actors/builtin/market/actor.go +++ b/venus-shared/actors/builtin/market/actor.go @@ -77,6 +77,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case actorstypes.Version14: return load14(store, act.Head) + case actorstypes.Version15: + return load15(store, act.Head) + } } @@ -153,6 +156,9 @@ func MakeState(store adt.Store, av actorstypes.Version) (State, error) { case actorstypes.Version14: return make14(store) + case actorstypes.Version15: + return make15(store) + } return nil, fmt.Errorf("unknown actor version %d", av) } @@ -257,6 +263,9 @@ func DecodePublishStorageDealsReturn(b []byte, nv network.Version) (PublishStora case actorstypes.Version14: return decodePublishStorageDealsReturn14(b) + case actorstypes.Version15: + return decodePublishStorageDealsReturn15(b) + } return nil, fmt.Errorf("unknown actor version %d", av) } @@ -384,5 +393,6 @@ func AllCodes() []cid.Cid { (&state12{}).Code(), (&state13{}).Code(), (&state14{}).Code(), + (&state15{}).Code(), } } diff --git a/venus-shared/actors/builtin/market/state.v15.go b/venus-shared/actors/builtin/market/state.v15.go new file mode 100644 index 0000000000..53e6aae9c7 --- /dev/null +++ b/venus-shared/actors/builtin/market/state.v15.go @@ -0,0 +1,413 @@ +// FETCHED FROM LOTUS: builtin/market/state.go.template + +package market + +import ( + "bytes" + "fmt" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + + "github.com/filecoin-project/go-bitfield" + rlepluslazy "github.com/filecoin-project/go-bitfield/rle" + + actorstypes "github.com/filecoin-project/go-state-types/actors" + "github.com/filecoin-project/go-state-types/manifest" + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + verifregtypes "github.com/filecoin-project/venus/venus-shared/actors/builtin/verifreg" + "github.com/filecoin-project/venus/venus-shared/actors/types" + + market15 "github.com/filecoin-project/go-state-types/builtin/v15/market" + adt15 "github.com/filecoin-project/go-state-types/builtin/v15/util/adt" + markettypes "github.com/filecoin-project/go-state-types/builtin/v9/market" + + "github.com/filecoin-project/go-state-types/builtin" +) + +var _ State = (*state15)(nil) + +func load15(store adt.Store, root cid.Cid) (State, error) { + out := state15{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make15(store adt.Store) (State, error) { + out := state15{store: store} + + s, err := market15.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state15 struct { + market15.State + store adt.Store +} + +func (s *state15) TotalLocked() (abi.TokenAmount, error) { + fml := types.BigAdd(s.TotalClientLockedCollateral, s.TotalProviderLockedCollateral) + fml = types.BigAdd(fml, s.TotalClientStorageFee) + return fml, nil +} + +func (s *state15) BalancesChanged(otherState State) (bool, error) { + otherState15, ok := otherState.(*state15) + if !ok { + // there's no way to compare different versions of the state, so let's + // just say that means the state of balances has changed + return true, nil + } + return !s.State.EscrowTable.Equals(otherState15.State.EscrowTable) || !s.State.LockedTable.Equals(otherState15.State.LockedTable), nil +} + +func (s *state15) StatesChanged(otherState State) (bool, error) { + otherState15, ok := otherState.(*state15) + if !ok { + // there's no way to compare different versions of the state, so let's + // just say that means the state of balances has changed + return true, nil + } + return !s.State.States.Equals(otherState15.State.States), nil +} + +func (s *state15) States() (DealStates, error) { + stateArray, err := adt15.AsArray(s.store, s.State.States, market15.StatesAmtBitwidth) + if err != nil { + return nil, err + } + return &dealStates15{stateArray}, nil +} + +func (s *state15) ProposalsChanged(otherState State) (bool, error) { + otherState15, ok := otherState.(*state15) + if !ok { + // there's no way to compare different versions of the state, so let's + // just say that means the state of balances has changed + return true, nil + } + return !s.State.Proposals.Equals(otherState15.State.Proposals), nil +} + +func (s *state15) Proposals() (DealProposals, error) { + proposalArray, err := adt15.AsArray(s.store, s.State.Proposals, market15.ProposalsAmtBitwidth) + if err != nil { + return nil, err + } + return &dealProposals15{proposalArray}, nil +} + +func (s *state15) EscrowTable() (BalanceTable, error) { + bt, err := adt15.AsBalanceTable(s.store, s.State.EscrowTable) + if err != nil { + return nil, err + } + return &balanceTable15{bt}, nil +} + +func (s *state15) LockedTable() (BalanceTable, error) { + bt, err := adt15.AsBalanceTable(s.store, s.State.LockedTable) + if err != nil { + return nil, err + } + return &balanceTable15{bt}, nil +} + +func (s *state15) VerifyDealsForActivation( + minerAddr address.Address, deals []abi.DealID, currEpoch, sectorExpiry abi.ChainEpoch, +) (weight, verifiedWeight abi.DealWeight, err error) { + w, vw, _, err := market15.ValidateDealsForActivation(&s.State, s.store, deals, minerAddr, sectorExpiry, currEpoch) + return w, vw, err +} + +func (s *state15) NextID() (abi.DealID, error) { + return s.State.NextID, nil +} + +type balanceTable15 struct { + *adt15.BalanceTable +} + +func (bt *balanceTable15) ForEach(cb func(address.Address, abi.TokenAmount) error) error { + asMap := (*adt15.Map)(bt.BalanceTable) + var ta abi.TokenAmount + return asMap.ForEach(&ta, func(key string) error { + a, err := address.NewFromBytes([]byte(key)) + if err != nil { + return err + } + return cb(a, ta) + }) +} + +type dealStates15 struct { + adt.Array +} + +func (s *dealStates15) Get(dealID abi.DealID) (DealState, bool, error) { + var deal15 market15.DealState + found, err := s.Array.Get(uint64(dealID), &deal15) + if err != nil { + return nil, false, err + } + if !found { + return nil, false, nil + } + deal := fromV15DealState(deal15) + return deal, true, nil +} + +func (s *dealStates15) ForEach(cb func(dealID abi.DealID, ds DealState) error) error { + var ds15 market15.DealState + return s.Array.ForEach(&ds15, func(idx int64) error { + return cb(abi.DealID(idx), fromV15DealState(ds15)) + }) +} + +func (s *dealStates15) decode(val *cbg.Deferred) (DealState, error) { + var ds15 market15.DealState + if err := ds15.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return nil, err + } + ds := fromV15DealState(ds15) + return ds, nil +} + +func (s *dealStates15) array() adt.Array { + return s.Array +} + +type dealStateV15 struct { + ds15 market15.DealState +} + +func (d dealStateV15) SectorNumber() abi.SectorNumber { + + return d.ds15.SectorNumber + +} + +func (d dealStateV15) SectorStartEpoch() abi.ChainEpoch { + return d.ds15.SectorStartEpoch +} + +func (d dealStateV15) LastUpdatedEpoch() abi.ChainEpoch { + return d.ds15.LastUpdatedEpoch +} + +func (d dealStateV15) SlashEpoch() abi.ChainEpoch { + return d.ds15.SlashEpoch +} + +func (d dealStateV15) Equals(other DealState) bool { + if ov15, ok := other.(dealStateV15); ok { + return d.ds15 == ov15.ds15 + } + + if d.SectorStartEpoch() != other.SectorStartEpoch() { + return false + } + if d.LastUpdatedEpoch() != other.LastUpdatedEpoch() { + return false + } + if d.SlashEpoch() != other.SlashEpoch() { + return false + } + + return true +} + +var _ DealState = (*dealStateV15)(nil) + +func fromV15DealState(v15 market15.DealState) DealState { + return dealStateV15{v15} +} + +type dealProposals15 struct { + adt.Array +} + +func (s *dealProposals15) Get(dealID abi.DealID) (*DealProposal, bool, error) { + var proposal15 market15.DealProposal + found, err := s.Array.Get(uint64(dealID), &proposal15) + if err != nil { + return nil, false, err + } + if !found { + return nil, false, nil + } + + proposal, err := fromV15DealProposal(proposal15) + if err != nil { + return nil, true, fmt.Errorf("decoding proposal: %w", err) + } + + return &proposal, true, nil +} + +func (s *dealProposals15) ForEach(cb func(dealID abi.DealID, dp DealProposal) error) error { + var dp15 market15.DealProposal + return s.Array.ForEach(&dp15, func(idx int64) error { + dp, err := fromV15DealProposal(dp15) + if err != nil { + return fmt.Errorf("decoding proposal: %w", err) + } + + return cb(abi.DealID(idx), dp) + }) +} + +func (s *dealProposals15) decode(val *cbg.Deferred) (*DealProposal, error) { + var dp15 market15.DealProposal + if err := dp15.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return nil, err + } + + dp, err := fromV15DealProposal(dp15) + if err != nil { + return nil, err + } + + return &dp, nil +} + +func (s *dealProposals15) array() adt.Array { + return s.Array +} + +func fromV15DealProposal(v15 market15.DealProposal) (DealProposal, error) { + + label, err := fromV15Label(v15.Label) + + if err != nil { + return DealProposal{}, fmt.Errorf("error setting deal label: %w", err) + } + + return DealProposal{ + PieceCID: v15.PieceCID, + PieceSize: v15.PieceSize, + VerifiedDeal: v15.VerifiedDeal, + Client: v15.Client, + Provider: v15.Provider, + + Label: label, + + StartEpoch: v15.StartEpoch, + EndEpoch: v15.EndEpoch, + StoragePricePerEpoch: v15.StoragePricePerEpoch, + + ProviderCollateral: v15.ProviderCollateral, + ClientCollateral: v15.ClientCollateral, + }, nil +} + +func fromV15Label(v15 market15.DealLabel) (DealLabel, error) { + if v15.IsString() { + str, err := v15.ToString() + if err != nil { + return markettypes.EmptyDealLabel, fmt.Errorf("failed to convert string label to string: %w", err) + } + return markettypes.NewLabelFromString(str) + } + + bs, err := v15.ToBytes() + if err != nil { + return markettypes.EmptyDealLabel, fmt.Errorf("failed to convert bytes label to bytes: %w", err) + } + return markettypes.NewLabelFromBytes(bs) +} + +func (s *state15) GetState() interface{} { + return &s.State +} + +var _ PublishStorageDealsReturn = (*publishStorageDealsReturn15)(nil) + +func decodePublishStorageDealsReturn15(b []byte) (PublishStorageDealsReturn, error) { + var retval market15.PublishStorageDealsReturn + if err := retval.UnmarshalCBOR(bytes.NewReader(b)); err != nil { + return nil, fmt.Errorf("failed to unmarshal PublishStorageDealsReturn: %w", err) + } + + return &publishStorageDealsReturn15{retval}, nil +} + +type publishStorageDealsReturn15 struct { + market15.PublishStorageDealsReturn +} + +func (r *publishStorageDealsReturn15) IsDealValid(index uint64) (bool, int, error) { + + set, err := r.ValidDeals.IsSet(index) + if err != nil || !set { + return false, -1, err + } + maskBf, err := bitfield.NewFromIter(&rlepluslazy.RunSliceIterator{ + Runs: []rlepluslazy.Run{rlepluslazy.Run{Val: true, Len: index}}}) + if err != nil { + return false, -1, err + } + before, err := bitfield.IntersectBitField(maskBf, r.ValidDeals) + if err != nil { + return false, -1, err + } + outIdx, err := before.Count() + if err != nil { + return false, -1, err + } + return set, int(outIdx), nil + +} + +func (r *publishStorageDealsReturn15) DealIDs() ([]abi.DealID, error) { + return r.IDs, nil +} + +func (s *state15) GetAllocationIdForPendingDeal(dealId abi.DealID) (verifregtypes.AllocationId, error) { + + allocations, err := adt15.AsMap(s.store, s.PendingDealAllocationIds, builtin.DefaultHamtBitwidth) + if err != nil { + return verifregtypes.NoAllocationID, fmt.Errorf("failed to load allocation id for %d: %w", dealId, err) + } + + var allocationId cbg.CborInt + found, err := allocations.Get(abi.UIntKey(uint64(dealId)), &allocationId) + if err != nil { + return verifregtypes.NoAllocationID, fmt.Errorf("failed to load allocation id for %d: %w", dealId, err) + } + if !found { + return verifregtypes.NoAllocationID, nil + } + + return verifregtypes.AllocationId(allocationId), nil + +} + +func (s *state15) ActorKey() string { + return manifest.MarketKey +} + +func (s *state15) ActorVersion() actorstypes.Version { + return actorstypes.Version15 +} + +func (s *state15) Code() cid.Cid { + code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey()) + if !ok { + panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion())) + } + + return code +} diff --git a/venus-shared/actors/builtin/miner/actor.go b/venus-shared/actors/builtin/miner/actor.go index 9bd6ce5ccb..6f5c50ba93 100644 --- a/venus-shared/actors/builtin/miner/actor.go +++ b/venus-shared/actors/builtin/miner/actor.go @@ -68,6 +68,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case actorstypes.Version14: return load14(store, act.Head) + case actorstypes.Version15: + return load15(store, act.Head) + } } @@ -144,6 +147,9 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version14: return make14(store) + case actors.Version15: + return make15(store) + } return nil, fmt.Errorf("unknown actor version %d", av) } @@ -339,6 +345,7 @@ type SectorActivationManifest = minertypes13.SectorActivationManifest type ProveReplicaUpdates3Params = minertypes13.ProveReplicaUpdates3Params type SectorUpdateManifest = minertypes13.SectorUpdateManifest type SectorOnChainInfoFlags = minertypes13.SectorOnChainInfoFlags +type VerifiedAllocationKey = minertypes13.VerifiedAllocationKey var QAPowerMax = minertypes.QAPowerMax @@ -408,5 +415,6 @@ func AllCodes() []cid.Cid { (&state12{}).Code(), (&state13{}).Code(), (&state14{}).Code(), + (&state15{}).Code(), } } diff --git a/venus-shared/actors/builtin/miner/actor.go.template b/venus-shared/actors/builtin/miner/actor.go.template index e0e924473a..79062fbd50 100644 --- a/venus-shared/actors/builtin/miner/actor.go.template +++ b/venus-shared/actors/builtin/miner/actor.go.template @@ -259,6 +259,7 @@ type SectorActivationManifest = minertypes13.SectorActivationManifest type ProveReplicaUpdates3Params = minertypes13.ProveReplicaUpdates3Params type SectorUpdateManifest = minertypes13.SectorUpdateManifest type SectorOnChainInfoFlags = minertypes13.SectorOnChainInfoFlags +type VerifiedAllocationKey = minertypes13.VerifiedAllocationKey var QAPowerMax = minertypes.QAPowerMax diff --git a/venus-shared/actors/builtin/miner/state.v15.go b/venus-shared/actors/builtin/miner/state.v15.go new file mode 100644 index 0000000000..526cf73403 --- /dev/null +++ b/venus-shared/actors/builtin/miner/state.v15.go @@ -0,0 +1,596 @@ +// FETCHED FROM LOTUS: builtin/miner/state.go.template + +package miner + +import ( + "bytes" + "errors" + "fmt" + + "github.com/filecoin-project/go-bitfield" + rle "github.com/filecoin-project/go-bitfield/rle" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/dline" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + + actorstypes "github.com/filecoin-project/go-state-types/actors" + "github.com/filecoin-project/go-state-types/manifest" + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + builtin15 "github.com/filecoin-project/go-state-types/builtin" + miner15 "github.com/filecoin-project/go-state-types/builtin/v15/miner" + adt15 "github.com/filecoin-project/go-state-types/builtin/v15/util/adt" +) + +var _ State = (*state15)(nil) + +func load15(store adt.Store, root cid.Cid) (State, error) { + out := state15{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make15(store adt.Store) (State, error) { + out := state15{store: store} + out.State = miner15.State{} + return &out, nil +} + +type state15 struct { + miner15.State + store adt.Store +} + +type deadline15 struct { + miner15.Deadline + store adt.Store +} + +type partition15 struct { + miner15.Partition + store adt.Store +} + +func (s *state15) AvailableBalance(bal abi.TokenAmount) (available abi.TokenAmount, err error) { + defer func() { + if r := recover(); r != nil { + err = fmt.Errorf("failed to get available balance: %v", r) + available = abi.NewTokenAmount(0) + } + }() + // this panics if the miner doesn't have enough funds to cover their locked pledge + available, err = s.GetAvailableBalance(bal) + return available, err +} + +func (s *state15) VestedFunds(epoch abi.ChainEpoch) (abi.TokenAmount, error) { + return s.CheckVestedFunds(s.store, epoch) +} + +func (s *state15) LockedFunds() (LockedFunds, error) { + return LockedFunds{ + VestingFunds: s.State.LockedFunds, + InitialPledgeRequirement: s.State.InitialPledge, + PreCommitDeposits: s.State.PreCommitDeposits, + }, nil +} + +func (s *state15) FeeDebt() (abi.TokenAmount, error) { + return s.State.FeeDebt, nil +} + +func (s *state15) InitialPledge() (abi.TokenAmount, error) { + return s.State.InitialPledge, nil +} + +func (s *state15) PreCommitDeposits() (abi.TokenAmount, error) { + return s.State.PreCommitDeposits, nil +} + +// Returns nil, nil if sector is not found +func (s *state15) GetSector(num abi.SectorNumber) (*SectorOnChainInfo, error) { + info, ok, err := s.State.GetSector(s.store, num) + if !ok || err != nil { + return nil, err + } + + ret := fromV15SectorOnChainInfo(*info) + return &ret, nil +} + +func (s *state15) FindSector(num abi.SectorNumber) (*SectorLocation, error) { + dlIdx, partIdx, err := s.State.FindSector(s.store, num) + if err != nil { + return nil, err + } + return &SectorLocation{ + Deadline: dlIdx, + Partition: partIdx, + }, nil +} + +func (s *state15) NumLiveSectors() (uint64, error) { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return 0, err + } + var total uint64 + if err := dls.ForEach(s.store, func(dlIdx uint64, dl *miner15.Deadline) error { + total += dl.LiveSectors + return nil + }); err != nil { + return 0, err + } + return total, nil +} + +// GetSectorExpiration returns the effective expiration of the given sector. +// +// If the sector does not expire early, the Early expiration field is 0. +func (s *state15) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, error) { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return nil, err + } + // NOTE: this can be optimized significantly. + // 1. If the sector is non-faulty, it will expire on-time (can be + // learned from the sector info). + // 2. If it's faulty, it will expire early within the first 42 entries + // of the expiration queue. + + stopErr := errors.New("stop") + out := SectorExpiration{} + err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner15.Deadline) error { + partitions, err := dl.PartitionsArray(s.store) + if err != nil { + return err + } + quant := s.State.QuantSpecForDeadline(dlIdx) + var part miner15.Partition + return partitions.ForEach(&part, func(partIdx int64) error { + if found, err := part.Sectors.IsSet(uint64(num)); err != nil { + return err + } else if !found { + return nil + } + if found, err := part.Terminated.IsSet(uint64(num)); err != nil { + return err + } else if found { + // already terminated + return stopErr + } + + q, err := miner15.LoadExpirationQueue(s.store, part.ExpirationsEpochs, quant, miner15.PartitionExpirationAmtBitwidth) + if err != nil { + return err + } + var exp miner15.ExpirationSet + return q.ForEach(&exp, func(epoch int64) error { + if early, err := exp.EarlySectors.IsSet(uint64(num)); err != nil { + return err + } else if early { + out.Early = abi.ChainEpoch(epoch) + return nil + } + if onTime, err := exp.OnTimeSectors.IsSet(uint64(num)); err != nil { + return err + } else if onTime { + out.OnTime = abi.ChainEpoch(epoch) + return stopErr + } + return nil + }) + }) + }) + if err == stopErr { + err = nil + } + if err != nil { + return nil, err + } + if out.Early == 0 && out.OnTime == 0 { + return nil, fmt.Errorf("failed to find sector %d", num) + } + return &out, nil +} + +func (s *state15) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOnChainInfo, error) { + info, ok, err := s.State.GetPrecommittedSector(s.store, num) + if !ok || err != nil { + return nil, err + } + + ret := fromV15SectorPreCommitOnChainInfo(*info) + + return &ret, nil +} + +func (s *state15) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { + precommitted, err := adt15.AsMap(s.store, s.State.PreCommittedSectors, builtin15.DefaultHamtBitwidth) + if err != nil { + return err + } + + var info miner15.SectorPreCommitOnChainInfo + if err := precommitted.ForEach(&info, func(_ string) error { + return cb(fromV15SectorPreCommitOnChainInfo(info)) + }); err != nil { + return err + } + + return nil +} + +func (s *state15) LoadSectors(snos *bitfield.BitField) ([]*SectorOnChainInfo, error) { + sectors, err := miner15.LoadSectors(s.store, s.State.Sectors) + if err != nil { + return nil, err + } + + // If no sector numbers are specified, load all. + if snos == nil { + infos := make([]*SectorOnChainInfo, 0, sectors.Length()) + var info15 miner15.SectorOnChainInfo + if err := sectors.ForEach(&info15, func(_ int64) error { + info := fromV15SectorOnChainInfo(info15) + infos = append(infos, &info) + return nil + }); err != nil { + return nil, err + } + return infos, nil + } + + // Otherwise, load selected. + infos15, err := sectors.Load(*snos) + if err != nil { + return nil, err + } + infos := make([]*SectorOnChainInfo, len(infos15)) + for i, info15 := range infos15 { + info := fromV15SectorOnChainInfo(*info15) + infos[i] = &info + } + return infos, nil +} + +func (s *state15) loadAllocatedSectorNumbers() (bitfield.BitField, error) { + var allocatedSectors bitfield.BitField + err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors) + return allocatedSectors, err +} + +func (s *state15) IsAllocated(num abi.SectorNumber) (bool, error) { + allocatedSectors, err := s.loadAllocatedSectorNumbers() + if err != nil { + return false, err + } + + return allocatedSectors.IsSet(uint64(num)) +} + +func (s *state15) GetProvingPeriodStart() (abi.ChainEpoch, error) { + return s.State.ProvingPeriodStart, nil +} + +func (s *state15) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) { + allocatedSectors, err := s.loadAllocatedSectorNumbers() + if err != nil { + return nil, err + } + + allocatedRuns, err := allocatedSectors.RunIterator() + if err != nil { + return nil, err + } + + unallocatedRuns, err := rle.Subtract( + &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, + allocatedRuns, + ) + if err != nil { + return nil, err + } + + iter, err := rle.BitsFromRuns(unallocatedRuns) + if err != nil { + return nil, err + } + + sectors := make([]abi.SectorNumber, 0, count) + for iter.HasNext() && len(sectors) < count { + nextNo, err := iter.Next() + if err != nil { + return nil, err + } + sectors = append(sectors, abi.SectorNumber(nextNo)) + } + + return sectors, nil +} + +func (s *state15) GetAllocatedSectors() (*bitfield.BitField, error) { + var allocatedSectors bitfield.BitField + if err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors); err != nil { + return nil, err + } + + return &allocatedSectors, nil +} + +func (s *state15) LoadDeadline(idx uint64) (Deadline, error) { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return nil, err + } + dl, err := dls.LoadDeadline(s.store, idx) + if err != nil { + return nil, err + } + return &deadline15{*dl, s.store}, nil +} + +func (s *state15) ForEachDeadline(cb func(uint64, Deadline) error) error { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return err + } + return dls.ForEach(s.store, func(i uint64, dl *miner15.Deadline) error { + return cb(i, &deadline15{*dl, s.store}) + }) +} + +func (s *state15) NumDeadlines() (uint64, error) { + return miner15.WPoStPeriodDeadlines, nil +} + +func (s *state15) DeadlinesChanged(other State) (bool, error) { + other15, ok := other.(*state15) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + + return !s.State.Deadlines.Equals(other15.Deadlines), nil +} + +func (s *state15) MinerInfoChanged(other State) (bool, error) { + other0, ok := other.(*state15) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + return !s.State.Info.Equals(other0.State.Info), nil +} + +func (s *state15) Info() (MinerInfo, error) { + info, err := s.State.GetInfo(s.store) + if err != nil { + return MinerInfo{}, err + } + + mi := MinerInfo{ + Owner: info.Owner, + Worker: info.Worker, + ControlAddresses: info.ControlAddresses, + + PendingWorkerKey: (*WorkerKeyChange)(info.PendingWorkerKey), + + PeerId: info.PeerId, + Multiaddrs: info.Multiaddrs, + WindowPoStProofType: info.WindowPoStProofType, + SectorSize: info.SectorSize, + WindowPoStPartitionSectors: info.WindowPoStPartitionSectors, + ConsensusFaultElapsed: info.ConsensusFaultElapsed, + + Beneficiary: info.Beneficiary, + BeneficiaryTerm: BeneficiaryTerm(info.BeneficiaryTerm), + PendingBeneficiaryTerm: (*PendingBeneficiaryChange)(info.PendingBeneficiaryTerm), + } + + return mi, nil +} + +func (s *state15) DeadlineInfo(epoch abi.ChainEpoch) (*dline.Info, error) { + return s.State.RecordedDeadlineInfo(epoch), nil +} + +func (s *state15) DeadlineCronActive() (bool, error) { + return s.State.DeadlineCronActive, nil +} + +func (s *state15) sectors() (adt.Array, error) { + return adt15.AsArray(s.store, s.Sectors, miner15.SectorsAmtBitwidth) +} + +func (s *state15) decodeSectorOnChainInfo(val *cbg.Deferred) (SectorOnChainInfo, error) { + var si miner15.SectorOnChainInfo + err := si.UnmarshalCBOR(bytes.NewReader(val.Raw)) + if err != nil { + return SectorOnChainInfo{}, err + } + + return fromV15SectorOnChainInfo(si), nil +} + +func (s *state15) precommits() (adt.Map, error) { + return adt15.AsMap(s.store, s.PreCommittedSectors, builtin15.DefaultHamtBitwidth) +} + +func (s *state15) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreCommitOnChainInfo, error) { + var sp miner15.SectorPreCommitOnChainInfo + err := sp.UnmarshalCBOR(bytes.NewReader(val.Raw)) + if err != nil { + return SectorPreCommitOnChainInfo{}, err + } + + return fromV15SectorPreCommitOnChainInfo(sp), nil +} + +func (s *state15) EraseAllUnproven() error { + + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return err + } + + err = dls.ForEach(s.store, func(dindx uint64, dl *miner15.Deadline) error { + ps, err := dl.PartitionsArray(s.store) + if err != nil { + return err + } + + var part miner15.Partition + err = ps.ForEach(&part, func(pindx int64) error { + _ = part.ActivateUnproven() + err = ps.Set(uint64(pindx), &part) + return nil + }) + + if err != nil { + return err + } + + dl.Partitions, err = ps.Root() + if err != nil { + return err + } + + return dls.UpdateDeadline(s.store, dindx, dl) + }) + if err != nil { + return err + } + + return s.State.SaveDeadlines(s.store, dls) + +} + +func (d *deadline15) LoadPartition(idx uint64) (Partition, error) { + p, err := d.Deadline.LoadPartition(d.store, idx) + if err != nil { + return nil, err + } + return &partition15{*p, d.store}, nil +} + +func (d *deadline15) ForEachPartition(cb func(uint64, Partition) error) error { + ps, err := d.Deadline.PartitionsArray(d.store) + if err != nil { + return err + } + var part miner15.Partition + return ps.ForEach(&part, func(i int64) error { + return cb(uint64(i), &partition15{part, d.store}) + }) +} + +func (d *deadline15) PartitionsChanged(other Deadline) (bool, error) { + other15, ok := other.(*deadline15) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + + return !d.Deadline.Partitions.Equals(other15.Deadline.Partitions), nil +} + +func (d *deadline15) PartitionsPoSted() (bitfield.BitField, error) { + return d.Deadline.PartitionsPoSted, nil +} + +func (d *deadline15) DisputableProofCount() (uint64, error) { + + ops, err := d.OptimisticProofsSnapshotArray(d.store) + if err != nil { + return 0, err + } + + return ops.Length(), nil + +} + +func (p *partition15) AllSectors() (bitfield.BitField, error) { + return p.Partition.Sectors, nil +} + +func (p *partition15) FaultySectors() (bitfield.BitField, error) { + return p.Partition.Faults, nil +} + +func (p *partition15) RecoveringSectors() (bitfield.BitField, error) { + return p.Partition.Recoveries, nil +} + +func (p *partition15) UnprovenSectors() (bitfield.BitField, error) { + return p.Partition.Unproven, nil +} + +func fromV15SectorOnChainInfo(v15 miner15.SectorOnChainInfo) SectorOnChainInfo { + info := SectorOnChainInfo{ + SectorNumber: v15.SectorNumber, + SealProof: v15.SealProof, + SealedCID: v15.SealedCID, + DealIDs: v15.DealIDs, + Activation: v15.Activation, + Expiration: v15.Expiration, + DealWeight: v15.DealWeight, + VerifiedDealWeight: v15.VerifiedDealWeight, + InitialPledge: v15.InitialPledge, + ExpectedDayReward: v15.ExpectedDayReward, + ExpectedStoragePledge: v15.ExpectedStoragePledge, + + SectorKeyCID: v15.SectorKeyCID, + + PowerBaseEpoch: v15.PowerBaseEpoch, + ReplacedDayReward: v15.ReplacedDayReward, + Flags: SectorOnChainInfoFlags(v15.Flags), + } + return info +} + +func fromV15SectorPreCommitOnChainInfo(v15 miner15.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { + ret := SectorPreCommitOnChainInfo{ + Info: SectorPreCommitInfo{ + SealProof: v15.Info.SealProof, + SectorNumber: v15.Info.SectorNumber, + SealedCID: v15.Info.SealedCID, + SealRandEpoch: v15.Info.SealRandEpoch, + DealIDs: v15.Info.DealIDs, + Expiration: v15.Info.Expiration, + UnsealedCid: nil, + }, + PreCommitDeposit: v15.PreCommitDeposit, + PreCommitEpoch: v15.PreCommitEpoch, + } + + ret.Info.UnsealedCid = v15.Info.UnsealedCid + + return ret +} + +func (s *state15) GetState() interface{} { + return &s.State +} + +func (s *state15) ActorKey() string { + return manifest.MinerKey +} + +func (s *state15) ActorVersion() actorstypes.Version { + return actorstypes.Version15 +} + +func (s *state15) Code() cid.Cid { + code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey()) + if !ok { + panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion())) + } + + return code +} diff --git a/venus-shared/actors/builtin/multisig/actor.go b/venus-shared/actors/builtin/multisig/actor.go index b9ef64771a..7faa742bf6 100644 --- a/venus-shared/actors/builtin/multisig/actor.go +++ b/venus-shared/actors/builtin/multisig/actor.go @@ -5,17 +5,17 @@ package multisig import ( "fmt" - actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/ipfs/go-cid" - - "github.com/minio/blake2b-simd" cbg "github.com/whyrusleeping/cbor-gen" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + actorstypes "github.com/filecoin-project/go-state-types/actors" + builtintypes "github.com/filecoin-project/go-state-types/builtin" "github.com/filecoin-project/go-state-types/cbor" + "github.com/filecoin-project/go-state-types/manifest" - msig14 "github.com/filecoin-project/go-state-types/builtin/v14/multisig" + msig15 "github.com/filecoin-project/go-state-types/builtin/v15/multisig" builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" @@ -31,9 +31,6 @@ import ( builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - builtintypes "github.com/filecoin-project/go-state-types/builtin" - "github.com/filecoin-project/go-state-types/manifest" - "github.com/filecoin-project/venus/venus-shared/actors" "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/types" @@ -68,6 +65,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case actorstypes.Version14: return load14(store, act.Head) + case actorstypes.Version15: + return load15(store, act.Head) + } } @@ -144,6 +144,9 @@ func MakeState(store adt.Store, av actorstypes.Version, signers []address.Addres case actorstypes.Version14: return make14(store, signers, threshold, startEpoch, unlockDuration, initialBalance) + case actorstypes.Version15: + return make15(store, signers, threshold, startEpoch, unlockDuration, initialBalance) + } return nil, fmt.Errorf("unknown actor version %d", av) } @@ -170,7 +173,7 @@ type State interface { GetState() interface{} } -type Transaction = msig14.Transaction +type Transaction = msig15.Transaction var Methods = builtintypes.MethodsMultisig @@ -218,6 +221,9 @@ func Message(version actorstypes.Version, from address.Address) MessageBuilder { case actorstypes.Version14: return message14{message0{from}} + + case actorstypes.Version15: + return message15{message0{from}} default: panic(fmt.Sprintf("unsupported actors version: %d", version)) } @@ -241,33 +247,10 @@ type MessageBuilder interface { } // this type is the same between v0 and v2 -type ProposalHashData = msig14.ProposalHashData -type ProposeReturn = msig14.ProposeReturn -type ProposeParams = msig14.ProposeParams -type ApproveReturn = msig14.ApproveReturn - -func txnParams(id uint64, data *ProposalHashData) ([]byte, error) { - params := msig14.TxnIDParams{ID: msig14.TxnID(id)} - if data != nil { - if data.Requester.Protocol() != address.ID { - return nil, fmt.Errorf("proposer address must be an ID address, was %s", data.Requester) - } - if data.Value.Sign() == -1 { - return nil, fmt.Errorf("proposal value must be non-negative, was %s", data.Value) - } - if data.To == address.Undef { - return nil, fmt.Errorf("proposed destination address must be set") - } - pser, err := data.Serialize() - if err != nil { - return nil, err - } - hash := blake2b.Sum256(pser) - params.ProposalHash = hash[:] - } - - return actors.SerializeParams(¶ms) -} +type ProposalHashData = msig15.ProposalHashData +type ProposeReturn = msig15.ProposeReturn +type ProposeParams = msig15.ProposeParams +type ApproveReturn = msig15.ApproveReturn func AllCodes() []cid.Cid { return []cid.Cid{ @@ -285,5 +268,6 @@ func AllCodes() []cid.Cid { (&state12{}).Code(), (&state13{}).Code(), (&state14{}).Code(), + (&state15{}).Code(), } } diff --git a/venus-shared/actors/builtin/multisig/actor.go.template b/venus-shared/actors/builtin/multisig/actor.go.template index 64bc89533b..1c204fc807 100644 --- a/venus-shared/actors/builtin/multisig/actor.go.template +++ b/venus-shared/actors/builtin/multisig/actor.go.template @@ -3,16 +3,17 @@ package multisig import ( - actorstypes "github.com/filecoin-project/go-state-types/actors" - "github.com/ipfs/go-cid" "fmt" - "github.com/minio/blake2b-simd" + "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + actorstypes "github.com/filecoin-project/go-state-types/actors" + builtintypes "github.com/filecoin-project/go-state-types/builtin" "github.com/filecoin-project/go-state-types/cbor" + "github.com/filecoin-project/go-state-types/manifest" msig{{.latestVersion}} "github.com/filecoin-project/go-state-types/builtin{{import .latestVersion}}multisig" {{range .versions}} @@ -21,9 +22,6 @@ import ( {{end}} {{end}} - builtintypes "github.com/filecoin-project/go-state-types/builtin" - "github.com/filecoin-project/go-state-types/manifest" - "github.com/filecoin-project/venus/venus-shared/actors" "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors/types" @@ -126,29 +124,6 @@ type ProposeReturn = msig{{.latestVersion}}.ProposeReturn type ProposeParams = msig{{.latestVersion}}.ProposeParams type ApproveReturn = msig{{.latestVersion}}.ApproveReturn -func txnParams(id uint64, data *ProposalHashData) ([]byte, error) { - params := msig{{.latestVersion}}.TxnIDParams{ID: msig{{.latestVersion}}.TxnID(id)} - if data != nil { - if data.Requester.Protocol() != address.ID { - return nil, fmt.Errorf("proposer address must be an ID address, was %s", data.Requester) - } - if data.Value.Sign() == -1 { - return nil, fmt.Errorf("proposal value must be non-negative, was %s", data.Value) - } - if data.To == address.Undef { - return nil, fmt.Errorf("proposed destination address must be set") - } - pser, err := data.Serialize() - if err != nil { - return nil, err - } - hash := blake2b.Sum256(pser) - params.ProposalHash = hash[:] - } - - return actors.SerializeParams(¶ms) -} - func AllCodes() []cid.Cid { return []cid.Cid{ {{range .versions}} (&state{{.}}{}).Code(), diff --git a/venus-shared/actors/builtin/multisig/message.sep.go.template b/venus-shared/actors/builtin/multisig/message.sep.go.template index fe533c1c1a..edcf8181f9 100644 --- a/venus-shared/actors/builtin/multisig/message.sep.go.template +++ b/venus-shared/actors/builtin/multisig/message.sep.go.template @@ -3,23 +3,27 @@ package multisig import ( +{{if (le .v 1)}} + "math" + "golang.org/x/crypto/blake2b" +{{end}} "fmt" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - {{if (le .v 7)}} - builtin{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin" - init{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/init" - multisig{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/multisig" - {{else}} - actorstypes "github.com/filecoin-project/go-state-types/actors" - multisig{{.v}} "github.com/filecoin-project/go-state-types/builtin{{.import}}multisig" - init{{.latestVersion}} "github.com/filecoin-project/go-state-types/builtin/v{{.latestVersion}}/init" - "github.com/filecoin-project/go-state-types/manifest" - {{end}} - - builtintypes "github.com/filecoin-project/go-state-types/builtin" +{{if (le .v 7)}} + builtin{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin" + init{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/init" + multisig{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/multisig" +{{else}} + actorstypes "github.com/filecoin-project/go-state-types/actors" + multisig{{.v}} "github.com/filecoin-project/go-state-types/builtin{{.import}}multisig" + init{{.latestVersion}} "github.com/filecoin-project/go-state-types/builtin/v{{.latestVersion}}/init" + "github.com/filecoin-project/go-state-types/manifest" +{{end}} + + builtintypes "github.com/filecoin-project/go-state-types/builtin" "github.com/filecoin-project/venus/venus-shared/actors" init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" "github.com/filecoin-project/venus/venus-shared/actors/types" @@ -166,4 +170,30 @@ func (m message0) Cancel(msig address.Address, txID uint64, hashData *ProposalHa Params: enc, }, nil } + +func txnParams(id uint64, data *ProposalHashData) ([]byte, error) { + if id > uint64(math.MaxInt64) { + return nil, fmt.Errorf("transaction ID %d is out of range for int64", id) + } + params := multisig0.TxnIDParams{ID: multisig0.TxnID(id)} + if data != nil { + if data.Requester.Protocol() != address.ID { + return nil, fmt.Errorf("proposer address must be an ID address, was %s", data.Requester) + } + if data.Value.Sign() == -1 { + return nil, fmt.Errorf("proposal value must be non-negative, was %s", data.Value) + } + if data.To == address.Undef { + return nil, fmt.Errorf("proposed destination address must be set") + } + pser, err := data.Serialize() + if err != nil { + return nil, err + } + hash := blake2b.Sum256(pser) + params.ProposalHash = hash[:] + } + + return actors.SerializeParams(¶ms) +} {{end}} diff --git a/venus-shared/actors/builtin/multisig/message.v0.go b/venus-shared/actors/builtin/multisig/message.v0.go index 84bc1f402a..ff6e240218 100644 --- a/venus-shared/actors/builtin/multisig/message.v0.go +++ b/venus-shared/actors/builtin/multisig/message.v0.go @@ -3,6 +3,10 @@ package multisig import ( + "math" + + "golang.org/x/crypto/blake2b" + "fmt" "github.com/filecoin-project/go-address" @@ -143,3 +147,29 @@ func (m message0) Cancel(msig address.Address, txID uint64, hashData *ProposalHa Params: enc, }, nil } + +func txnParams(id uint64, data *ProposalHashData) ([]byte, error) { + if id > uint64(math.MaxInt64) { + return nil, fmt.Errorf("transaction ID %d is out of range for int64", id) + } + params := multisig0.TxnIDParams{ID: multisig0.TxnID(id)} + if data != nil { + if data.Requester.Protocol() != address.ID { + return nil, fmt.Errorf("proposer address must be an ID address, was %s", data.Requester) + } + if data.Value.Sign() == -1 { + return nil, fmt.Errorf("proposal value must be non-negative, was %s", data.Value) + } + if data.To == address.Undef { + return nil, fmt.Errorf("proposed destination address must be set") + } + pser, err := data.Serialize() + if err != nil { + return nil, err + } + hash := blake2b.Sum256(pser) + params.ProposalHash = hash[:] + } + + return actors.SerializeParams(¶ms) +} diff --git a/venus-shared/actors/builtin/multisig/message.v10.go b/venus-shared/actors/builtin/multisig/message.v10.go index 61fa78e409..fe3f3184d9 100644 --- a/venus-shared/actors/builtin/multisig/message.v10.go +++ b/venus-shared/actors/builtin/multisig/message.v10.go @@ -10,7 +10,7 @@ import ( actorstypes "github.com/filecoin-project/go-state-types/actors" multisig10 "github.com/filecoin-project/go-state-types/builtin/v10/multisig" - init14 "github.com/filecoin-project/go-state-types/builtin/v14/init" + init15 "github.com/filecoin-project/go-state-types/builtin/v15/init" "github.com/filecoin-project/go-state-types/manifest" builtintypes "github.com/filecoin-project/go-state-types/builtin" @@ -60,7 +60,7 @@ func (m message10) Create( } // new actors are created by invoking 'exec' on the init actor with the constructor params - execParams := &init14.ExecParams{ + execParams := &init15.ExecParams{ CodeCID: code, ConstructorParams: enc, } diff --git a/venus-shared/actors/builtin/multisig/message.v11.go b/venus-shared/actors/builtin/multisig/message.v11.go index f4005de308..e3387c0168 100644 --- a/venus-shared/actors/builtin/multisig/message.v11.go +++ b/venus-shared/actors/builtin/multisig/message.v11.go @@ -10,7 +10,7 @@ import ( actorstypes "github.com/filecoin-project/go-state-types/actors" multisig11 "github.com/filecoin-project/go-state-types/builtin/v11/multisig" - init14 "github.com/filecoin-project/go-state-types/builtin/v14/init" + init15 "github.com/filecoin-project/go-state-types/builtin/v15/init" "github.com/filecoin-project/go-state-types/manifest" builtintypes "github.com/filecoin-project/go-state-types/builtin" @@ -60,7 +60,7 @@ func (m message11) Create( } // new actors are created by invoking 'exec' on the init actor with the constructor params - execParams := &init14.ExecParams{ + execParams := &init15.ExecParams{ CodeCID: code, ConstructorParams: enc, } diff --git a/venus-shared/actors/builtin/multisig/message.v12.go b/venus-shared/actors/builtin/multisig/message.v12.go index d3f93960c1..b4779a7279 100644 --- a/venus-shared/actors/builtin/multisig/message.v12.go +++ b/venus-shared/actors/builtin/multisig/message.v12.go @@ -10,7 +10,7 @@ import ( actorstypes "github.com/filecoin-project/go-state-types/actors" multisig12 "github.com/filecoin-project/go-state-types/builtin/v12/multisig" - init14 "github.com/filecoin-project/go-state-types/builtin/v14/init" + init15 "github.com/filecoin-project/go-state-types/builtin/v15/init" "github.com/filecoin-project/go-state-types/manifest" builtintypes "github.com/filecoin-project/go-state-types/builtin" @@ -60,7 +60,7 @@ func (m message12) Create( } // new actors are created by invoking 'exec' on the init actor with the constructor params - execParams := &init14.ExecParams{ + execParams := &init15.ExecParams{ CodeCID: code, ConstructorParams: enc, } diff --git a/venus-shared/actors/builtin/multisig/message.v13.go b/venus-shared/actors/builtin/multisig/message.v13.go index a6fe1ab3ed..136ff056e4 100644 --- a/venus-shared/actors/builtin/multisig/message.v13.go +++ b/venus-shared/actors/builtin/multisig/message.v13.go @@ -10,7 +10,7 @@ import ( actorstypes "github.com/filecoin-project/go-state-types/actors" multisig13 "github.com/filecoin-project/go-state-types/builtin/v13/multisig" - init14 "github.com/filecoin-project/go-state-types/builtin/v14/init" + init15 "github.com/filecoin-project/go-state-types/builtin/v15/init" "github.com/filecoin-project/go-state-types/manifest" builtintypes "github.com/filecoin-project/go-state-types/builtin" @@ -60,7 +60,7 @@ func (m message13) Create( } // new actors are created by invoking 'exec' on the init actor with the constructor params - execParams := &init14.ExecParams{ + execParams := &init15.ExecParams{ CodeCID: code, ConstructorParams: enc, } diff --git a/venus-shared/actors/builtin/multisig/message.v14.go b/venus-shared/actors/builtin/multisig/message.v14.go index 528b5009be..0ea9c8f61b 100644 --- a/venus-shared/actors/builtin/multisig/message.v14.go +++ b/venus-shared/actors/builtin/multisig/message.v14.go @@ -9,8 +9,8 @@ import ( "github.com/filecoin-project/go-state-types/abi" actorstypes "github.com/filecoin-project/go-state-types/actors" - init14 "github.com/filecoin-project/go-state-types/builtin/v14/init" multisig14 "github.com/filecoin-project/go-state-types/builtin/v14/multisig" + init15 "github.com/filecoin-project/go-state-types/builtin/v15/init" "github.com/filecoin-project/go-state-types/manifest" builtintypes "github.com/filecoin-project/go-state-types/builtin" @@ -60,7 +60,7 @@ func (m message14) Create( } // new actors are created by invoking 'exec' on the init actor with the constructor params - execParams := &init14.ExecParams{ + execParams := &init15.ExecParams{ CodeCID: code, ConstructorParams: enc, } diff --git a/venus-shared/actors/builtin/multisig/message.v15.go b/venus-shared/actors/builtin/multisig/message.v15.go new file mode 100644 index 0000000000..389090ab4d --- /dev/null +++ b/venus-shared/actors/builtin/multisig/message.v15.go @@ -0,0 +1,80 @@ +// FETCHED FROM LOTUS: builtin/multisig/message.go.template + +package multisig + +import ( + "fmt" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + + actorstypes "github.com/filecoin-project/go-state-types/actors" + init15 "github.com/filecoin-project/go-state-types/builtin/v15/init" + multisig15 "github.com/filecoin-project/go-state-types/builtin/v15/multisig" + "github.com/filecoin-project/go-state-types/manifest" + + builtintypes "github.com/filecoin-project/go-state-types/builtin" + "github.com/filecoin-project/venus/venus-shared/actors" + init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" + "github.com/filecoin-project/venus/venus-shared/actors/types" +) + +type message15 struct{ message0 } + +func (m message15) Create( + signers []address.Address, threshold uint64, + unlockStart, unlockDuration abi.ChainEpoch, + initialAmount abi.TokenAmount, +) (*types.Message, error) { + + lenAddrs := uint64(len(signers)) + + if lenAddrs < threshold { + return nil, fmt.Errorf("cannot require signing of more addresses than provided for multisig") + } + + if threshold == 0 { + threshold = lenAddrs + } + + if m.from == address.Undef { + return nil, fmt.Errorf("must provide source address") + } + + // Set up constructor parameters for multisig + msigParams := &multisig15.ConstructorParams{ + Signers: signers, + NumApprovalsThreshold: threshold, + UnlockDuration: unlockDuration, + StartEpoch: unlockStart, + } + + enc, actErr := actors.SerializeParams(msigParams) + if actErr != nil { + return nil, actErr + } + + code, ok := actors.GetActorCodeID(actorstypes.Version15, manifest.MultisigKey) + if !ok { + return nil, fmt.Errorf("failed to get multisig code ID") + } + + // new actors are created by invoking 'exec' on the init actor with the constructor params + execParams := &init15.ExecParams{ + CodeCID: code, + ConstructorParams: enc, + } + + enc, actErr = actors.SerializeParams(execParams) + if actErr != nil { + return nil, actErr + } + + return &types.Message{ + To: init_.Address, + From: m.from, + Method: builtintypes.MethodsInit.Exec, + Params: enc, + Value: initialAmount, + }, nil +} diff --git a/venus-shared/actors/builtin/multisig/message.v8.go b/venus-shared/actors/builtin/multisig/message.v8.go index 1a981d3c5a..66458aca50 100644 --- a/venus-shared/actors/builtin/multisig/message.v8.go +++ b/venus-shared/actors/builtin/multisig/message.v8.go @@ -9,7 +9,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" actorstypes "github.com/filecoin-project/go-state-types/actors" - init14 "github.com/filecoin-project/go-state-types/builtin/v14/init" + init15 "github.com/filecoin-project/go-state-types/builtin/v15/init" multisig8 "github.com/filecoin-project/go-state-types/builtin/v8/multisig" "github.com/filecoin-project/go-state-types/manifest" @@ -60,7 +60,7 @@ func (m message8) Create( } // new actors are created by invoking 'exec' on the init actor with the constructor params - execParams := &init14.ExecParams{ + execParams := &init15.ExecParams{ CodeCID: code, ConstructorParams: enc, } diff --git a/venus-shared/actors/builtin/multisig/message.v9.go b/venus-shared/actors/builtin/multisig/message.v9.go index 9195a9b9fe..9985ebc159 100644 --- a/venus-shared/actors/builtin/multisig/message.v9.go +++ b/venus-shared/actors/builtin/multisig/message.v9.go @@ -9,7 +9,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" actorstypes "github.com/filecoin-project/go-state-types/actors" - init14 "github.com/filecoin-project/go-state-types/builtin/v14/init" + init15 "github.com/filecoin-project/go-state-types/builtin/v15/init" multisig9 "github.com/filecoin-project/go-state-types/builtin/v9/multisig" "github.com/filecoin-project/go-state-types/manifest" @@ -60,7 +60,7 @@ func (m message9) Create( } // new actors are created by invoking 'exec' on the init actor with the constructor params - execParams := &init14.ExecParams{ + execParams := &init15.ExecParams{ CodeCID: code, ConstructorParams: enc, } diff --git a/venus-shared/actors/builtin/multisig/state.v15.go b/venus-shared/actors/builtin/multisig/state.v15.go new file mode 100644 index 0000000000..0649fa6f28 --- /dev/null +++ b/venus-shared/actors/builtin/multisig/state.v15.go @@ -0,0 +1,140 @@ +// FETCHED FROM LOTUS: builtin/multisig/state.go.template + +package multisig + +import ( + "bytes" + "encoding/binary" + "fmt" + + actorstypes "github.com/filecoin-project/go-state-types/actors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + + "github.com/filecoin-project/go-state-types/manifest" + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + builtin15 "github.com/filecoin-project/go-state-types/builtin" + msig15 "github.com/filecoin-project/go-state-types/builtin/v15/multisig" + adt15 "github.com/filecoin-project/go-state-types/builtin/v15/util/adt" +) + +var _ State = (*state15)(nil) + +func load15(store adt.Store, root cid.Cid) (State, error) { + out := state15{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make15(store adt.Store, signers []address.Address, threshold uint64, startEpoch abi.ChainEpoch, unlockDuration abi.ChainEpoch, initialBalance abi.TokenAmount) (State, error) { + out := state15{store: store} + out.State = msig15.State{} + out.State.Signers = signers + out.State.NumApprovalsThreshold = threshold + out.State.StartEpoch = startEpoch + out.State.UnlockDuration = unlockDuration + out.State.InitialBalance = initialBalance + + em, err := adt15.StoreEmptyMap(store, builtin15.DefaultHamtBitwidth) + if err != nil { + return nil, err + } + + out.State.PendingTxns = em + + return &out, nil +} + +type state15 struct { + msig15.State + store adt.Store +} + +func (s *state15) LockedBalance(currEpoch abi.ChainEpoch) (abi.TokenAmount, error) { + return s.State.AmountLocked(currEpoch - s.State.StartEpoch), nil +} + +func (s *state15) StartEpoch() (abi.ChainEpoch, error) { + return s.State.StartEpoch, nil +} + +func (s *state15) UnlockDuration() (abi.ChainEpoch, error) { + return s.State.UnlockDuration, nil +} + +func (s *state15) InitialBalance() (abi.TokenAmount, error) { + return s.State.InitialBalance, nil +} + +func (s *state15) Threshold() (uint64, error) { + return s.State.NumApprovalsThreshold, nil +} + +func (s *state15) Signers() ([]address.Address, error) { + return s.State.Signers, nil +} + +func (s *state15) ForEachPendingTxn(cb func(id int64, txn Transaction) error) error { + arr, err := adt15.AsMap(s.store, s.State.PendingTxns, builtin15.DefaultHamtBitwidth) + if err != nil { + return err + } + var out msig15.Transaction + return arr.ForEach(&out, func(key string) error { + txid, n := binary.Varint([]byte(key)) + if n <= 0 { + return fmt.Errorf("invalid pending transaction key: %v", key) + } + return cb(txid, (Transaction)(out)) //nolint:unconvert + }) +} + +func (s *state15) PendingTxnChanged(other State) (bool, error) { + other15, ok := other.(*state15) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + return !s.State.PendingTxns.Equals(other15.PendingTxns), nil +} + +func (s *state15) transactions() (adt.Map, error) { + return adt15.AsMap(s.store, s.PendingTxns, builtin15.DefaultHamtBitwidth) +} + +func (s *state15) decodeTransaction(val *cbg.Deferred) (Transaction, error) { + var tx msig15.Transaction + if err := tx.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return Transaction{}, err + } + return Transaction(tx), nil +} + +func (s *state15) GetState() interface{} { + return &s.State +} + +func (s *state15) ActorKey() string { + return manifest.MultisigKey +} + +func (s *state15) ActorVersion() actorstypes.Version { + return actorstypes.Version15 +} + +func (s *state15) Code() cid.Cid { + code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey()) + if !ok { + panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion())) + } + + return code +} diff --git a/venus-shared/actors/builtin/paych/actor.go b/venus-shared/actors/builtin/paych/actor.go index f22b8315d4..4c4383a9f0 100644 --- a/venus-shared/actors/builtin/paych/actor.go +++ b/venus-shared/actors/builtin/paych/actor.go @@ -68,6 +68,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case actorstypes.Version14: return load14(store, act.Head) + case actorstypes.Version15: + return load15(store, act.Head) + } } @@ -194,6 +197,9 @@ func Message(version actorstypes.Version, from address.Address) MessageBuilder { case actorstypes.Version14: return message14{from} + case actorstypes.Version15: + return message15{from} + default: panic(fmt.Sprintf("unsupported actors version: %d", version)) } @@ -238,5 +244,6 @@ func AllCodes() []cid.Cid { (&state12{}).Code(), (&state13{}).Code(), (&state14{}).Code(), + (&state15{}).Code(), } } diff --git a/venus-shared/actors/builtin/paych/message.v15.go b/venus-shared/actors/builtin/paych/message.v15.go new file mode 100644 index 0000000000..14f74d5164 --- /dev/null +++ b/venus-shared/actors/builtin/paych/message.v15.go @@ -0,0 +1,113 @@ +// FETCHED FROM LOTUS: builtin/paych/message.go.template + +package paych + +import ( + "fmt" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + + paychtypes "github.com/filecoin-project/go-state-types/builtin/v8/paych" + + actorstypes "github.com/filecoin-project/go-state-types/actors" + builtin15 "github.com/filecoin-project/go-state-types/builtin" + init15 "github.com/filecoin-project/go-state-types/builtin/v15/init" + paych15 "github.com/filecoin-project/go-state-types/builtin/v15/paych" + + "github.com/filecoin-project/venus/venus-shared/actors" + init_ "github.com/filecoin-project/venus/venus-shared/actors/builtin/init" + "github.com/filecoin-project/venus/venus-shared/actors/types" +) + +type message15 struct{ from address.Address } + +func (m message15) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) { + + actorCodeID, ok := actors.GetActorCodeID(actorstypes.Version15, "paymentchannel") + if !ok { + return nil, fmt.Errorf("error getting actor paymentchannel code id for actor version %d", 15) + } + + params, aerr := actors.SerializeParams(&paych15.ConstructorParams{From: m.from, To: to}) + if aerr != nil { + return nil, aerr + } + enc, aerr := actors.SerializeParams(&init15.ExecParams{ + CodeCID: actorCodeID, + ConstructorParams: params, + }) + if aerr != nil { + return nil, aerr + } + + return &types.Message{ + To: init_.Address, + From: m.from, + Value: initialAmount, + Method: builtin15.MethodsInit.Exec, + Params: enc, + }, nil +} + +func (m message15) Update(paych address.Address, sv *paychtypes.SignedVoucher, secret []byte) (*types.Message, error) { + params, aerr := actors.SerializeParams(&paych15.UpdateChannelStateParams{ + + Sv: toV15SignedVoucher(*sv), + + Secret: secret, + }) + if aerr != nil { + return nil, aerr + } + + return &types.Message{ + To: paych, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin15.MethodsPaych.UpdateChannelState, + Params: params, + }, nil +} + +func toV15SignedVoucher(sv paychtypes.SignedVoucher) paych15.SignedVoucher { + merges := make([]paych15.Merge, len(sv.Merges)) + for i := range sv.Merges { + merges[i] = paych15.Merge{ + Lane: sv.Merges[i].Lane, + Nonce: sv.Merges[i].Nonce, + } + } + + return paych15.SignedVoucher{ + ChannelAddr: sv.ChannelAddr, + TimeLockMin: sv.TimeLockMin, + TimeLockMax: sv.TimeLockMax, + SecretHash: sv.SecretHash, + Extra: (*paych15.ModVerifyParams)(sv.Extra), + Lane: sv.Lane, + Nonce: sv.Nonce, + Amount: sv.Amount, + MinSettleHeight: sv.MinSettleHeight, + Merges: merges, + Signature: sv.Signature, + } +} + +func (m message15) Settle(paych address.Address) (*types.Message, error) { + return &types.Message{ + To: paych, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin15.MethodsPaych.Settle, + }, nil +} + +func (m message15) Collect(paych address.Address) (*types.Message, error) { + return &types.Message{ + To: paych, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin15.MethodsPaych.Collect, + }, nil +} diff --git a/venus-shared/actors/builtin/paych/state.v15.go b/venus-shared/actors/builtin/paych/state.v15.go new file mode 100644 index 0000000000..b37aef033f --- /dev/null +++ b/venus-shared/actors/builtin/paych/state.v15.go @@ -0,0 +1,138 @@ +// FETCHED FROM LOTUS: builtin/paych/state.go.template + +package paych + +import ( + "fmt" + + actorstypes "github.com/filecoin-project/go-state-types/actors" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" + + "github.com/filecoin-project/go-state-types/manifest" + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + paych15 "github.com/filecoin-project/go-state-types/builtin/v15/paych" + adt15 "github.com/filecoin-project/go-state-types/builtin/v15/util/adt" +) + +var _ State = (*state15)(nil) + +func load15(store adt.Store, root cid.Cid) (State, error) { + out := state15{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make15(store adt.Store) (State, error) { + out := state15{store: store} + out.State = paych15.State{} + return &out, nil +} + +type state15 struct { + paych15.State + store adt.Store + lsAmt *adt15.Array +} + +// Channel owner, who has funded the actor +func (s *state15) From() (address.Address, error) { + return s.State.From, nil +} + +// Recipient of payouts from channel +func (s *state15) To() (address.Address, error) { + return s.State.To, nil +} + +// Height at which the channel can be `Collected` +func (s *state15) SettlingAt() (abi.ChainEpoch, error) { + return s.State.SettlingAt, nil +} + +// Amount successfully redeemed through the payment channel, paid out on `Collect()` +func (s *state15) ToSend() (abi.TokenAmount, error) { + return s.State.ToSend, nil +} + +func (s *state15) getOrLoadLsAmt() (*adt15.Array, error) { + if s.lsAmt != nil { + return s.lsAmt, nil + } + + // Get the lane state from the chain + lsamt, err := adt15.AsArray(s.store, s.State.LaneStates, paych15.LaneStatesAmtBitwidth) + if err != nil { + return nil, err + } + + s.lsAmt = lsamt + return lsamt, nil +} + +// Get total number of lanes +func (s *state15) LaneCount() (uint64, error) { + lsamt, err := s.getOrLoadLsAmt() + if err != nil { + return 0, err + } + return lsamt.Length(), nil +} + +func (s *state15) GetState() interface{} { + return &s.State +} + +// Iterate lane states +func (s *state15) ForEachLaneState(cb func(idx uint64, dl LaneState) error) error { + // Get the lane state from the chain + lsamt, err := s.getOrLoadLsAmt() + if err != nil { + return err + } + + // Note: we use a map instead of an array to store laneStates because the + // client sets the lane ID (the index) and potentially they could use a + // very large index. + var ls paych15.LaneState + return lsamt.ForEach(&ls, func(i int64) error { + return cb(uint64(i), &laneState15{ls}) + }) +} + +type laneState15 struct { + paych15.LaneState +} + +func (ls *laneState15) Redeemed() (big.Int, error) { + return ls.LaneState.Redeemed, nil +} + +func (ls *laneState15) Nonce() (uint64, error) { + return ls.LaneState.Nonce, nil +} + +func (s *state15) ActorKey() string { + return manifest.PaychKey +} + +func (s *state15) ActorVersion() actorstypes.Version { + return actorstypes.Version15 +} + +func (s *state15) Code() cid.Cid { + code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey()) + if !ok { + panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion())) + } + + return code +} diff --git a/venus-shared/actors/builtin/power/actor.go b/venus-shared/actors/builtin/power/actor.go index b42fc8ad56..e4a2a25f86 100644 --- a/venus-shared/actors/builtin/power/actor.go +++ b/venus-shared/actors/builtin/power/actor.go @@ -34,12 +34,12 @@ import ( builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - builtin14 "github.com/filecoin-project/go-state-types/builtin" + builtin15 "github.com/filecoin-project/go-state-types/builtin" ) var ( - Address = builtin14.StoragePowerActorAddr - Methods = builtin14.MethodsPower + Address = builtin15.StoragePowerActorAddr + Methods = builtin15.MethodsPower ) func Load(store adt.Store, act *types.Actor) (State, error) { @@ -71,6 +71,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case actorstypes.Version14: return load14(store, act.Head) + case actorstypes.Version15: + return load15(store, act.Head) + } } @@ -147,6 +150,9 @@ func MakeState(store adt.Store, av actorstypes.Version) (State, error) { case actorstypes.Version14: return make14(store) + case actorstypes.Version15: + return make15(store) + } return nil, fmt.Errorf("unknown actor version %d", av) } @@ -167,6 +173,18 @@ type State interface { // MinerCounts returns the number of miners. Participating is the number // with power above the minimum miner threshold. MinerCounts() (participating, total uint64, err error) + // RampStartEpoch returns the epoch at which the FIP0081 pledge calculation + // change begins. At and before RampStartEpoch, we use the old calculation. At + // RampStartEpoch + RampDurationEpochs, we use 70% old rules + 30% new + // calculation. + // + // This method always returns 0 prior to actors version 15. + RampStartEpoch() int64 + // RampDurationEpochs returns the number of epochs over which the new FIP0081 + // pledge calculation is ramped up. + // + // This method always returns 0 prior to actors version 15. + RampDurationEpochs() uint64 MinerPower(address.Address) (Claim, bool, error) MinerNominalPowerMeetsConsensusMinimum(address.Address) (bool, error) ListAllMiners() ([]address.Address, error) @@ -215,5 +233,6 @@ func AllCodes() []cid.Cid { (&state12{}).Code(), (&state13{}).Code(), (&state14{}).Code(), + (&state15{}).Code(), } } diff --git a/venus-shared/actors/builtin/power/actor.go.template b/venus-shared/actors/builtin/power/actor.go.template index 191549d3a4..df948170b6 100644 --- a/venus-shared/actors/builtin/power/actor.go.template +++ b/venus-shared/actors/builtin/power/actor.go.template @@ -86,6 +86,18 @@ type State interface { // MinerCounts returns the number of miners. Participating is the number // with power above the minimum miner threshold. MinerCounts() (participating, total uint64, err error) + // RampStartEpoch returns the epoch at which the FIP0081 pledge calculation + // change begins. At and before RampStartEpoch, we use the old calculation. At + // RampStartEpoch + RampDurationEpochs, we use 70% old rules + 30% new + // calculation. + // + // This method always returns 0 prior to actors version 15. + RampStartEpoch() int64 + // RampDurationEpochs returns the number of epochs over which the new FIP0081 + // pledge calculation is ramped up. + // + // This method always returns 0 prior to actors version 15. + RampDurationEpochs() uint64 MinerPower(address.Address) (Claim, bool, error) MinerNominalPowerMeetsConsensusMinimum(address.Address) (bool, error) ListAllMiners() ([]address.Address, error) diff --git a/venus-shared/actors/builtin/power/state.sep.go.template b/venus-shared/actors/builtin/power/state.sep.go.template index 723a1ee83f..b59e9c30cf 100644 --- a/venus-shared/actors/builtin/power/state.sep.go.template +++ b/venus-shared/actors/builtin/power/state.sep.go.template @@ -119,6 +119,14 @@ func (s *state{{.v}}) MinerCounts() (uint64, uint64, error) { return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil } +func (s *state{{.v}}) RampStartEpoch() int64 { + return {{if (ge .v 15)}}s.State.RampStartEpoch{{else}}0{{end}} +} + +func (s *state{{.v}}) RampDurationEpochs() uint64 { + return {{if (ge .v 15)}}s.State.RampDurationEpochs{{else}}0{{end}} +} + func (s *state{{.v}}) ListAllMiners() ([]address.Address, error) { claims, err := s.claims() if err != nil { diff --git a/venus-shared/actors/builtin/power/state.v0.go b/venus-shared/actors/builtin/power/state.v0.go index 9a9cc1ac5e..ecbf27c9a7 100644 --- a/venus-shared/actors/builtin/power/state.v0.go +++ b/venus-shared/actors/builtin/power/state.v0.go @@ -103,6 +103,14 @@ func (s *state0) MinerCounts() (uint64, uint64, error) { return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil } +func (s *state0) RampStartEpoch() int64 { + return 0 +} + +func (s *state0) RampDurationEpochs() uint64 { + return 0 +} + func (s *state0) ListAllMiners() ([]address.Address, error) { claims, err := s.claims() if err != nil { diff --git a/venus-shared/actors/builtin/power/state.v10.go b/venus-shared/actors/builtin/power/state.v10.go index 50717d2cc9..037e563b9e 100644 --- a/venus-shared/actors/builtin/power/state.v10.go +++ b/venus-shared/actors/builtin/power/state.v10.go @@ -99,6 +99,14 @@ func (s *state10) MinerCounts() (uint64, uint64, error) { return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil } +func (s *state10) RampStartEpoch() int64 { + return 0 +} + +func (s *state10) RampDurationEpochs() uint64 { + return 0 +} + func (s *state10) ListAllMiners() ([]address.Address, error) { claims, err := s.claims() if err != nil { diff --git a/venus-shared/actors/builtin/power/state.v11.go b/venus-shared/actors/builtin/power/state.v11.go index ea5fc35fd6..64bd6e3873 100644 --- a/venus-shared/actors/builtin/power/state.v11.go +++ b/venus-shared/actors/builtin/power/state.v11.go @@ -99,6 +99,14 @@ func (s *state11) MinerCounts() (uint64, uint64, error) { return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil } +func (s *state11) RampStartEpoch() int64 { + return 0 +} + +func (s *state11) RampDurationEpochs() uint64 { + return 0 +} + func (s *state11) ListAllMiners() ([]address.Address, error) { claims, err := s.claims() if err != nil { diff --git a/venus-shared/actors/builtin/power/state.v12.go b/venus-shared/actors/builtin/power/state.v12.go index 5495a39007..f4def5244c 100644 --- a/venus-shared/actors/builtin/power/state.v12.go +++ b/venus-shared/actors/builtin/power/state.v12.go @@ -99,6 +99,14 @@ func (s *state12) MinerCounts() (uint64, uint64, error) { return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil } +func (s *state12) RampStartEpoch() int64 { + return 0 +} + +func (s *state12) RampDurationEpochs() uint64 { + return 0 +} + func (s *state12) ListAllMiners() ([]address.Address, error) { claims, err := s.claims() if err != nil { diff --git a/venus-shared/actors/builtin/power/state.v13.go b/venus-shared/actors/builtin/power/state.v13.go index f7549f01ed..bc4a087141 100644 --- a/venus-shared/actors/builtin/power/state.v13.go +++ b/venus-shared/actors/builtin/power/state.v13.go @@ -99,6 +99,14 @@ func (s *state13) MinerCounts() (uint64, uint64, error) { return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil } +func (s *state13) RampStartEpoch() int64 { + return 0 +} + +func (s *state13) RampDurationEpochs() uint64 { + return 0 +} + func (s *state13) ListAllMiners() ([]address.Address, error) { claims, err := s.claims() if err != nil { diff --git a/venus-shared/actors/builtin/power/state.v14.go b/venus-shared/actors/builtin/power/state.v14.go index 7aad113843..0ebb0a1de6 100644 --- a/venus-shared/actors/builtin/power/state.v14.go +++ b/venus-shared/actors/builtin/power/state.v14.go @@ -99,6 +99,14 @@ func (s *state14) MinerCounts() (uint64, uint64, error) { return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil } +func (s *state14) RampStartEpoch() int64 { + return 0 +} + +func (s *state14) RampDurationEpochs() uint64 { + return 0 +} + func (s *state14) ListAllMiners() ([]address.Address, error) { claims, err := s.claims() if err != nil { diff --git a/venus-shared/actors/builtin/power/state.v15.go b/venus-shared/actors/builtin/power/state.v15.go new file mode 100644 index 0000000000..58c165da3a --- /dev/null +++ b/venus-shared/actors/builtin/power/state.v15.go @@ -0,0 +1,218 @@ +// FETCHED FROM LOTUS: builtin/power/state.go.template + +package power + +import ( + "bytes" + "fmt" + + actorstypes "github.com/filecoin-project/go-state-types/actors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + + "github.com/filecoin-project/go-state-types/manifest" + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + + builtin15 "github.com/filecoin-project/go-state-types/builtin" + power15 "github.com/filecoin-project/go-state-types/builtin/v15/power" + adt15 "github.com/filecoin-project/go-state-types/builtin/v15/util/adt" +) + +var _ State = (*state15)(nil) + +func load15(store adt.Store, root cid.Cid) (State, error) { + out := state15{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make15(store adt.Store) (State, error) { + out := state15{store: store} + + s, err := power15.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state15 struct { + power15.State + store adt.Store +} + +func (s *state15) TotalLocked() (abi.TokenAmount, error) { + return s.TotalPledgeCollateral, nil +} + +func (s *state15) TotalPower() (Claim, error) { + return Claim{ + RawBytePower: s.TotalRawBytePower, + QualityAdjPower: s.TotalQualityAdjPower, + }, nil +} + +// Committed power to the network. Includes miners below the minimum threshold. +func (s *state15) TotalCommitted() (Claim, error) { + return Claim{ + RawBytePower: s.TotalBytesCommitted, + QualityAdjPower: s.TotalQABytesCommitted, + }, nil +} + +func (s *state15) MinerPower(addr address.Address) (Claim, bool, error) { + claims, err := s.claims() + if err != nil { + return Claim{}, false, err + } + var claim power15.Claim + ok, err := claims.Get(abi.AddrKey(addr), &claim) + if err != nil { + return Claim{}, false, err + } + return Claim{ + RawBytePower: claim.RawBytePower, + QualityAdjPower: claim.QualityAdjPower, + }, ok, nil +} + +func (s *state15) MinerNominalPowerMeetsConsensusMinimum(a address.Address) (bool, error) { + return s.State.MinerNominalPowerMeetsConsensusMinimum(s.store, a) +} + +func (s *state15) TotalPowerSmoothed() (builtin.FilterEstimate, error) { + return builtin.FilterEstimate(s.State.ThisEpochQAPowerSmoothed), nil +} + +func (s *state15) MinerCounts() (uint64, uint64, error) { + return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil +} + +func (s *state15) RampStartEpoch() int64 { + return s.State.RampStartEpoch +} + +func (s *state15) RampDurationEpochs() uint64 { + return s.State.RampDurationEpochs +} + +func (s *state15) ListAllMiners() ([]address.Address, error) { + claims, err := s.claims() + if err != nil { + return nil, err + } + + var miners []address.Address + err = claims.ForEach(nil, func(k string) error { + a, err := address.NewFromBytes([]byte(k)) + if err != nil { + return err + } + miners = append(miners, a) + return nil + }) + if err != nil { + return nil, err + } + + return miners, nil +} + +func (s *state15) ForEachClaim(cb func(miner address.Address, claim Claim) error) error { + claims, err := s.claims() + if err != nil { + return err + } + + var claim power15.Claim + return claims.ForEach(&claim, func(k string) error { + a, err := address.NewFromBytes([]byte(k)) + if err != nil { + return err + } + return cb(a, Claim{ + RawBytePower: claim.RawBytePower, + QualityAdjPower: claim.QualityAdjPower, + }) + }) +} + +func (s *state15) ClaimsChanged(other State) (bool, error) { + other15, ok := other.(*state15) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + return !s.State.Claims.Equals(other15.State.Claims), nil +} + +func (s *state15) SetTotalQualityAdjPower(p abi.StoragePower) error { + s.State.TotalQualityAdjPower = p + return nil +} + +func (s *state15) SetTotalRawBytePower(p abi.StoragePower) error { + s.State.TotalRawBytePower = p + return nil +} + +func (s *state15) SetThisEpochQualityAdjPower(p abi.StoragePower) error { + s.State.ThisEpochQualityAdjPower = p + return nil +} + +func (s *state15) SetThisEpochRawBytePower(p abi.StoragePower) error { + s.State.ThisEpochRawBytePower = p + return nil +} + +func (s *state15) GetState() interface{} { + return &s.State +} + +func (s *state15) claims() (adt.Map, error) { + return adt15.AsMap(s.store, s.Claims, builtin15.DefaultHamtBitwidth) +} + +func (s *state15) decodeClaim(val *cbg.Deferred) (Claim, error) { + var ci power15.Claim + if err := ci.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return Claim{}, err + } + return fromV15Claim(ci), nil +} + +func fromV15Claim(v15 power15.Claim) Claim { + return Claim{ + RawBytePower: v15.RawBytePower, + QualityAdjPower: v15.QualityAdjPower, + } +} + +func (s *state15) ActorKey() string { + return manifest.PowerKey +} + +func (s *state15) ActorVersion() actorstypes.Version { + return actorstypes.Version15 +} + +func (s *state15) Code() cid.Cid { + code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey()) + if !ok { + panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion())) + } + + return code +} diff --git a/venus-shared/actors/builtin/power/state.v2.go b/venus-shared/actors/builtin/power/state.v2.go index ea77dd0074..eac10761c1 100644 --- a/venus-shared/actors/builtin/power/state.v2.go +++ b/venus-shared/actors/builtin/power/state.v2.go @@ -103,6 +103,14 @@ func (s *state2) MinerCounts() (uint64, uint64, error) { return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil } +func (s *state2) RampStartEpoch() int64 { + return 0 +} + +func (s *state2) RampDurationEpochs() uint64 { + return 0 +} + func (s *state2) ListAllMiners() ([]address.Address, error) { claims, err := s.claims() if err != nil { diff --git a/venus-shared/actors/builtin/power/state.v3.go b/venus-shared/actors/builtin/power/state.v3.go index 07bfd91759..72f31d09d2 100644 --- a/venus-shared/actors/builtin/power/state.v3.go +++ b/venus-shared/actors/builtin/power/state.v3.go @@ -100,6 +100,14 @@ func (s *state3) MinerCounts() (uint64, uint64, error) { return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil } +func (s *state3) RampStartEpoch() int64 { + return 0 +} + +func (s *state3) RampDurationEpochs() uint64 { + return 0 +} + func (s *state3) ListAllMiners() ([]address.Address, error) { claims, err := s.claims() if err != nil { diff --git a/venus-shared/actors/builtin/power/state.v4.go b/venus-shared/actors/builtin/power/state.v4.go index daa3967528..f851d38c0c 100644 --- a/venus-shared/actors/builtin/power/state.v4.go +++ b/venus-shared/actors/builtin/power/state.v4.go @@ -100,6 +100,14 @@ func (s *state4) MinerCounts() (uint64, uint64, error) { return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil } +func (s *state4) RampStartEpoch() int64 { + return 0 +} + +func (s *state4) RampDurationEpochs() uint64 { + return 0 +} + func (s *state4) ListAllMiners() ([]address.Address, error) { claims, err := s.claims() if err != nil { diff --git a/venus-shared/actors/builtin/power/state.v5.go b/venus-shared/actors/builtin/power/state.v5.go index 19256b97fc..743757a507 100644 --- a/venus-shared/actors/builtin/power/state.v5.go +++ b/venus-shared/actors/builtin/power/state.v5.go @@ -100,6 +100,14 @@ func (s *state5) MinerCounts() (uint64, uint64, error) { return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil } +func (s *state5) RampStartEpoch() int64 { + return 0 +} + +func (s *state5) RampDurationEpochs() uint64 { + return 0 +} + func (s *state5) ListAllMiners() ([]address.Address, error) { claims, err := s.claims() if err != nil { diff --git a/venus-shared/actors/builtin/power/state.v6.go b/venus-shared/actors/builtin/power/state.v6.go index fee1596cae..718c322816 100644 --- a/venus-shared/actors/builtin/power/state.v6.go +++ b/venus-shared/actors/builtin/power/state.v6.go @@ -100,6 +100,14 @@ func (s *state6) MinerCounts() (uint64, uint64, error) { return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil } +func (s *state6) RampStartEpoch() int64 { + return 0 +} + +func (s *state6) RampDurationEpochs() uint64 { + return 0 +} + func (s *state6) ListAllMiners() ([]address.Address, error) { claims, err := s.claims() if err != nil { diff --git a/venus-shared/actors/builtin/power/state.v7.go b/venus-shared/actors/builtin/power/state.v7.go index add7a59bf6..da1da21937 100644 --- a/venus-shared/actors/builtin/power/state.v7.go +++ b/venus-shared/actors/builtin/power/state.v7.go @@ -100,6 +100,14 @@ func (s *state7) MinerCounts() (uint64, uint64, error) { return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil } +func (s *state7) RampStartEpoch() int64 { + return 0 +} + +func (s *state7) RampDurationEpochs() uint64 { + return 0 +} + func (s *state7) ListAllMiners() ([]address.Address, error) { claims, err := s.claims() if err != nil { diff --git a/venus-shared/actors/builtin/power/state.v8.go b/venus-shared/actors/builtin/power/state.v8.go index 53429a270b..2f2c24e03e 100644 --- a/venus-shared/actors/builtin/power/state.v8.go +++ b/venus-shared/actors/builtin/power/state.v8.go @@ -99,6 +99,14 @@ func (s *state8) MinerCounts() (uint64, uint64, error) { return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil } +func (s *state8) RampStartEpoch() int64 { + return 0 +} + +func (s *state8) RampDurationEpochs() uint64 { + return 0 +} + func (s *state8) ListAllMiners() ([]address.Address, error) { claims, err := s.claims() if err != nil { diff --git a/venus-shared/actors/builtin/power/state.v9.go b/venus-shared/actors/builtin/power/state.v9.go index 12389acaa6..0bd263992c 100644 --- a/venus-shared/actors/builtin/power/state.v9.go +++ b/venus-shared/actors/builtin/power/state.v9.go @@ -99,6 +99,14 @@ func (s *state9) MinerCounts() (uint64, uint64, error) { return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil } +func (s *state9) RampStartEpoch() int64 { + return 0 +} + +func (s *state9) RampDurationEpochs() uint64 { + return 0 +} + func (s *state9) ListAllMiners() ([]address.Address, error) { claims, err := s.claims() if err != nil { diff --git a/venus-shared/actors/builtin/registry.go b/venus-shared/actors/builtin/registry.go index 6aacf9b935..03fc8b6b51 100644 --- a/venus-shared/actors/builtin/registry.go +++ b/venus-shared/actors/builtin/registry.go @@ -133,6 +133,25 @@ import ( evm14 "github.com/filecoin-project/go-state-types/builtin/v14/evm" placeholder14 "github.com/filecoin-project/go-state-types/builtin/v14/placeholder" + account15 "github.com/filecoin-project/go-state-types/builtin/v15/account" + cron15 "github.com/filecoin-project/go-state-types/builtin/v15/cron" + _init15 "github.com/filecoin-project/go-state-types/builtin/v15/init" + market15 "github.com/filecoin-project/go-state-types/builtin/v15/market" + miner15 "github.com/filecoin-project/go-state-types/builtin/v15/miner" + multisig15 "github.com/filecoin-project/go-state-types/builtin/v15/multisig" + paych15 "github.com/filecoin-project/go-state-types/builtin/v15/paych" + power15 "github.com/filecoin-project/go-state-types/builtin/v15/power" + reward15 "github.com/filecoin-project/go-state-types/builtin/v15/reward" + system15 "github.com/filecoin-project/go-state-types/builtin/v15/system" + verifreg15 "github.com/filecoin-project/go-state-types/builtin/v15/verifreg" + + datacap15 "github.com/filecoin-project/go-state-types/builtin/v15/datacap" + + eam15 "github.com/filecoin-project/go-state-types/builtin/v15/eam" + ethaccount15 "github.com/filecoin-project/go-state-types/builtin/v15/ethaccount" + evm15 "github.com/filecoin-project/go-state-types/builtin/v15/evm" + placeholder15 "github.com/filecoin-project/go-state-types/builtin/v15/placeholder" + "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/cbor" "github.com/filecoin-project/go-state-types/manifest" @@ -877,6 +896,110 @@ func MakeRegistry(av actorstypes.Version) []RegistryEntry { } } + case actorstypes.Version15: + for key, codeID := range codeIDs { + switch key { + case manifest.AccountKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: account15.Methods, + state: new(account15.State), + }) + case manifest.CronKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: cron15.Methods, + state: new(cron15.State), + }) + case manifest.InitKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: _init15.Methods, + state: new(_init15.State), + }) + case manifest.MarketKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: market15.Methods, + state: new(market15.State), + }) + case manifest.MinerKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: miner15.Methods, + state: new(miner15.State), + }) + case manifest.MultisigKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: multisig15.Methods, + state: new(multisig15.State), + }) + case manifest.PaychKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: paych15.Methods, + state: new(paych15.State), + }) + case manifest.PowerKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: power15.Methods, + state: new(power15.State), + }) + case manifest.RewardKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: reward15.Methods, + state: new(reward15.State), + }) + case manifest.SystemKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: system15.Methods, + state: new(system15.State), + }) + case manifest.VerifregKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: verifreg15.Methods, + state: new(verifreg15.State), + }) + case manifest.DatacapKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: datacap15.Methods, + state: new(datacap15.State), + }) + + case manifest.EvmKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: evm15.Methods, + state: new(evm15.State), + }) + case manifest.EamKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: eam15.Methods, + state: nil, + }) + case manifest.PlaceholderKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: placeholder15.Methods, + state: nil, + }) + case manifest.EthAccountKey: + registry = append(registry, RegistryEntry{ + code: codeID, + methods: ethaccount15.Methods, + state: nil, + }) + + } + } + default: panic("expected version v8 and up only, use specs-actors for v0-7") } diff --git a/venus-shared/actors/builtin/reward/actor.go b/venus-shared/actors/builtin/reward/actor.go index 3c90b97813..ffcd3038e7 100644 --- a/venus-shared/actors/builtin/reward/actor.go +++ b/venus-shared/actors/builtin/reward/actor.go @@ -27,7 +27,7 @@ import ( builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - builtin14 "github.com/filecoin-project/go-state-types/builtin" + builtin15 "github.com/filecoin-project/go-state-types/builtin" "github.com/filecoin-project/go-state-types/manifest" "github.com/filecoin-project/venus/venus-shared/actors/adt" @@ -36,8 +36,8 @@ import ( ) var ( - Address = builtin14.RewardActorAddr - Methods = builtin14.MethodsReward + Address = builtin15.RewardActorAddr + Methods = builtin15.MethodsReward ) func Load(store adt.Store, act *types.Actor) (State, error) { @@ -69,6 +69,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case actorstypes.Version14: return load14(store, act.Head) + case actorstypes.Version15: + return load15(store, act.Head) + } } @@ -145,6 +148,9 @@ func MakeState(store adt.Store, av actorstypes.Version, currRealizedPower abi.St case actorstypes.Version14: return make14(store, currRealizedPower) + case actorstypes.Version15: + return make15(store, currRealizedPower) + } return nil, fmt.Errorf("unknown actor version %d", av) } @@ -168,7 +174,14 @@ type State interface { CumsumBaseline() (abi.StoragePower, error) CumsumRealized() (abi.StoragePower, error) - InitialPledgeForPower(abi.StoragePower, abi.TokenAmount, *builtin.FilterEstimate, abi.TokenAmount) (abi.TokenAmount, error) + // InitialPledgeForPower computes the pledge requirement for committing new quality-adjusted power + // to the network, given the current network total and baseline power, per-epoch reward, and + // circulating token supply. + // + // Prior to actors version 15, the epochsSinceRampStart and rampDurationEpochs arguments have + // no effect. After actors version 15, these values can be derived from the power actor state + // properties RampStartEpoch and RampDurationEpochs. + InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount, epochsSinceRampStart int64, rampDurationEpochs uint64) (abi.TokenAmount, error) PreCommitDepositForPower(builtin.FilterEstimate, abi.StoragePower) (abi.TokenAmount, error) GetState() interface{} } @@ -191,5 +204,6 @@ func AllCodes() []cid.Cid { (&state12{}).Code(), (&state13{}).Code(), (&state14{}).Code(), + (&state15{}).Code(), } } diff --git a/venus-shared/actors/builtin/reward/actor.go.template b/venus-shared/actors/builtin/reward/actor.go.template index 1b96a5b6f4..0056121ecd 100644 --- a/venus-shared/actors/builtin/reward/actor.go.template +++ b/venus-shared/actors/builtin/reward/actor.go.template @@ -86,7 +86,14 @@ type State interface { CumsumBaseline() (abi.StoragePower, error) CumsumRealized() (abi.StoragePower, error) - InitialPledgeForPower(abi.StoragePower, abi.TokenAmount, *builtin.FilterEstimate, abi.TokenAmount) (abi.TokenAmount, error) + // InitialPledgeForPower computes the pledge requirement for committing new quality-adjusted power + // to the network, given the current network total and baseline power, per-epoch reward, and + // circulating token supply. + // + // Prior to actors version 15, the epochsSinceRampStart and rampDurationEpochs arguments have + // no effect. After actors version 15, these values can be derived from the power actor state + // properties RampStartEpoch and RampDurationEpochs. + InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount, epochsSinceRampStart int64, rampDurationEpochs uint64) (abi.TokenAmount, error) PreCommitDepositForPower(builtin.FilterEstimate, abi.StoragePower) (abi.TokenAmount, error) GetState() interface{} } diff --git a/venus-shared/actors/builtin/reward/state.sep.go.template b/venus-shared/actors/builtin/reward/state.sep.go.template index d34fcb13db..3d1bdc50e4 100644 --- a/venus-shared/actors/builtin/reward/state.sep.go.template +++ b/venus-shared/actors/builtin/reward/state.sep.go.template @@ -85,8 +85,8 @@ func (s *state{{.v}}) CumsumRealized() (reward{{.v}}.Spacetime, error) { return s.State.CumsumRealized, nil } {{if (ge .v 2)}} -func (s *state{{.v}}) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { - return miner{{.v}}.InitialPledgeForPower( +func (s *state{{.v}}) InitialPledgeForPower(qaPower abi.StoragePower, _ abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount, epochsSinceRampStart int64, rampDurationEpochs uint64) (abi.TokenAmount, error) { +{{if (ge .v 15)}}return miner{{.v}}.InitialPledgeForPower( qaPower, s.State.ThisEpochBaselinePower, s.State.ThisEpochRewardSmoothed, @@ -95,10 +95,22 @@ func (s *state{{.v}}) InitialPledgeForPower(qaPower abi.StoragePower, networkTot VelocityEstimate: networkQAPower.VelocityEstimate, }, circSupply, + epochsSinceRampStart, + rampDurationEpochs, ), nil -} +{{else}}return miner{{.v}}.InitialPledgeForPower( + qaPower, + s.State.ThisEpochBaselinePower, + s.State.ThisEpochRewardSmoothed, + smoothing{{.v}}.FilterEstimate{ + PositionEstimate: networkQAPower.PositionEstimate, + VelocityEstimate: networkQAPower.VelocityEstimate, + }, + circSupply, + ), nil +{{end}}} {{else}} -func (s *state0) InitialPledgeForPower(sectorWeight abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { +func (s *state0) InitialPledgeForPower(sectorWeight abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount, _ int64, _ uint64) (abi.TokenAmount, error) { return miner0.InitialPledgeForPower( sectorWeight, s.State.ThisEpochBaselinePower, diff --git a/venus-shared/actors/builtin/reward/state.v0.go b/venus-shared/actors/builtin/reward/state.v0.go index 92895e2401..8ed13d7ec5 100644 --- a/venus-shared/actors/builtin/reward/state.v0.go +++ b/venus-shared/actors/builtin/reward/state.v0.go @@ -75,7 +75,7 @@ func (s *state0) CumsumRealized() (reward0.Spacetime, error) { return s.State.CumsumRealized, nil } -func (s *state0) InitialPledgeForPower(sectorWeight abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { +func (s *state0) InitialPledgeForPower(sectorWeight abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount, _ int64, _ uint64) (abi.TokenAmount, error) { return miner0.InitialPledgeForPower( sectorWeight, s.State.ThisEpochBaselinePower, diff --git a/venus-shared/actors/builtin/reward/state.v10.go b/venus-shared/actors/builtin/reward/state.v10.go index 66556bef4b..03cbff63e7 100644 --- a/venus-shared/actors/builtin/reward/state.v10.go +++ b/venus-shared/actors/builtin/reward/state.v10.go @@ -78,7 +78,7 @@ func (s *state10) CumsumRealized() (reward10.Spacetime, error) { return s.State.CumsumRealized, nil } -func (s *state10) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { +func (s *state10) InitialPledgeForPower(qaPower abi.StoragePower, _ abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount, epochsSinceRampStart int64, rampDurationEpochs uint64) (abi.TokenAmount, error) { return miner10.InitialPledgeForPower( qaPower, s.State.ThisEpochBaselinePower, diff --git a/venus-shared/actors/builtin/reward/state.v11.go b/venus-shared/actors/builtin/reward/state.v11.go index 0aac8c9f5e..a1887ce5d4 100644 --- a/venus-shared/actors/builtin/reward/state.v11.go +++ b/venus-shared/actors/builtin/reward/state.v11.go @@ -78,7 +78,7 @@ func (s *state11) CumsumRealized() (reward11.Spacetime, error) { return s.State.CumsumRealized, nil } -func (s *state11) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { +func (s *state11) InitialPledgeForPower(qaPower abi.StoragePower, _ abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount, epochsSinceRampStart int64, rampDurationEpochs uint64) (abi.TokenAmount, error) { return miner11.InitialPledgeForPower( qaPower, s.State.ThisEpochBaselinePower, diff --git a/venus-shared/actors/builtin/reward/state.v12.go b/venus-shared/actors/builtin/reward/state.v12.go index 20702e514d..09e5f00a59 100644 --- a/venus-shared/actors/builtin/reward/state.v12.go +++ b/venus-shared/actors/builtin/reward/state.v12.go @@ -78,7 +78,7 @@ func (s *state12) CumsumRealized() (reward12.Spacetime, error) { return s.State.CumsumRealized, nil } -func (s *state12) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { +func (s *state12) InitialPledgeForPower(qaPower abi.StoragePower, _ abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount, epochsSinceRampStart int64, rampDurationEpochs uint64) (abi.TokenAmount, error) { return miner12.InitialPledgeForPower( qaPower, s.State.ThisEpochBaselinePower, diff --git a/venus-shared/actors/builtin/reward/state.v13.go b/venus-shared/actors/builtin/reward/state.v13.go index a628837f6d..bfeae41ccd 100644 --- a/venus-shared/actors/builtin/reward/state.v13.go +++ b/venus-shared/actors/builtin/reward/state.v13.go @@ -78,7 +78,7 @@ func (s *state13) CumsumRealized() (reward13.Spacetime, error) { return s.State.CumsumRealized, nil } -func (s *state13) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { +func (s *state13) InitialPledgeForPower(qaPower abi.StoragePower, _ abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount, epochsSinceRampStart int64, rampDurationEpochs uint64) (abi.TokenAmount, error) { return miner13.InitialPledgeForPower( qaPower, s.State.ThisEpochBaselinePower, diff --git a/venus-shared/actors/builtin/reward/state.v14.go b/venus-shared/actors/builtin/reward/state.v14.go index 1d5725b3a8..5f730be920 100644 --- a/venus-shared/actors/builtin/reward/state.v14.go +++ b/venus-shared/actors/builtin/reward/state.v14.go @@ -78,7 +78,7 @@ func (s *state14) CumsumRealized() (reward14.Spacetime, error) { return s.State.CumsumRealized, nil } -func (s *state14) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { +func (s *state14) InitialPledgeForPower(qaPower abi.StoragePower, _ abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount, epochsSinceRampStart int64, rampDurationEpochs uint64) (abi.TokenAmount, error) { return miner14.InitialPledgeForPower( qaPower, s.State.ThisEpochBaselinePower, diff --git a/venus-shared/actors/builtin/reward/state.v15.go b/venus-shared/actors/builtin/reward/state.v15.go new file mode 100644 index 0000000000..fa2f33946a --- /dev/null +++ b/venus-shared/actors/builtin/reward/state.v15.go @@ -0,0 +1,124 @@ +// FETCHED FROM LOTUS: builtin/reward/state.go.template + +package reward + +import ( + "fmt" + + "github.com/filecoin-project/go-state-types/abi" + actorstypes "github.com/filecoin-project/go-state-types/actors" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/go-state-types/manifest" + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + "github.com/filecoin-project/venus/venus-shared/actors/builtin" + + miner15 "github.com/filecoin-project/go-state-types/builtin/v15/miner" + reward15 "github.com/filecoin-project/go-state-types/builtin/v15/reward" + smoothing15 "github.com/filecoin-project/go-state-types/builtin/v15/util/smoothing" +) + +var _ State = (*state15)(nil) + +func load15(store adt.Store, root cid.Cid) (State, error) { + out := state15{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make15(store adt.Store, currRealizedPower abi.StoragePower) (State, error) { + out := state15{store: store} + out.State = *reward15.ConstructState(currRealizedPower) + return &out, nil +} + +type state15 struct { + reward15.State + store adt.Store +} + +func (s *state15) ThisEpochReward() (abi.TokenAmount, error) { + return s.State.ThisEpochReward, nil +} + +func (s *state15) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { + + return builtin.FilterEstimate{ + PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, + VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, + }, nil + +} + +func (s *state15) ThisEpochBaselinePower() (abi.StoragePower, error) { + return s.State.ThisEpochBaselinePower, nil +} + +func (s *state15) TotalStoragePowerReward() (abi.TokenAmount, error) { + return s.State.TotalStoragePowerReward, nil +} + +func (s *state15) EffectiveBaselinePower() (abi.StoragePower, error) { + return s.State.EffectiveBaselinePower, nil +} + +func (s *state15) EffectiveNetworkTime() (abi.ChainEpoch, error) { + return s.State.EffectiveNetworkTime, nil +} + +func (s *state15) CumsumBaseline() (reward15.Spacetime, error) { + return s.State.CumsumBaseline, nil +} + +func (s *state15) CumsumRealized() (reward15.Spacetime, error) { + return s.State.CumsumRealized, nil +} + +func (s *state15) InitialPledgeForPower(qaPower abi.StoragePower, _ abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount, epochsSinceRampStart int64, rampDurationEpochs uint64) (abi.TokenAmount, error) { + return miner15.InitialPledgeForPower( + qaPower, + s.State.ThisEpochBaselinePower, + s.State.ThisEpochRewardSmoothed, + smoothing15.FilterEstimate{ + PositionEstimate: networkQAPower.PositionEstimate, + VelocityEstimate: networkQAPower.VelocityEstimate, + }, + circSupply, + epochsSinceRampStart, + rampDurationEpochs, + ), nil +} + +func (s *state15) PreCommitDepositForPower(networkQAPower builtin.FilterEstimate, sectorWeight abi.StoragePower) (abi.TokenAmount, error) { + return miner15.PreCommitDepositForPower(s.State.ThisEpochRewardSmoothed, + smoothing15.FilterEstimate{ + PositionEstimate: networkQAPower.PositionEstimate, + VelocityEstimate: networkQAPower.VelocityEstimate, + }, + sectorWeight), nil +} + +func (s *state15) GetState() interface{} { + return &s.State +} + +func (s *state15) ActorKey() string { + return manifest.RewardKey +} + +func (s *state15) ActorVersion() actorstypes.Version { + return actorstypes.Version15 +} + +func (s *state15) Code() cid.Cid { + code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey()) + if !ok { + panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion())) + } + + return code +} diff --git a/venus-shared/actors/builtin/reward/state.v2.go b/venus-shared/actors/builtin/reward/state.v2.go index 1b1d4f05dd..90c6cf91f8 100644 --- a/venus-shared/actors/builtin/reward/state.v2.go +++ b/venus-shared/actors/builtin/reward/state.v2.go @@ -78,7 +78,7 @@ func (s *state2) CumsumRealized() (reward2.Spacetime, error) { return s.State.CumsumRealized, nil } -func (s *state2) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { +func (s *state2) InitialPledgeForPower(qaPower abi.StoragePower, _ abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount, epochsSinceRampStart int64, rampDurationEpochs uint64) (abi.TokenAmount, error) { return miner2.InitialPledgeForPower( qaPower, s.State.ThisEpochBaselinePower, diff --git a/venus-shared/actors/builtin/reward/state.v3.go b/venus-shared/actors/builtin/reward/state.v3.go index 5e23f88f5d..0ca99c6d95 100644 --- a/venus-shared/actors/builtin/reward/state.v3.go +++ b/venus-shared/actors/builtin/reward/state.v3.go @@ -78,7 +78,7 @@ func (s *state3) CumsumRealized() (reward3.Spacetime, error) { return s.State.CumsumRealized, nil } -func (s *state3) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { +func (s *state3) InitialPledgeForPower(qaPower abi.StoragePower, _ abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount, epochsSinceRampStart int64, rampDurationEpochs uint64) (abi.TokenAmount, error) { return miner3.InitialPledgeForPower( qaPower, s.State.ThisEpochBaselinePower, diff --git a/venus-shared/actors/builtin/reward/state.v4.go b/venus-shared/actors/builtin/reward/state.v4.go index 274f85b790..6c8f148f61 100644 --- a/venus-shared/actors/builtin/reward/state.v4.go +++ b/venus-shared/actors/builtin/reward/state.v4.go @@ -78,7 +78,7 @@ func (s *state4) CumsumRealized() (reward4.Spacetime, error) { return s.State.CumsumRealized, nil } -func (s *state4) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { +func (s *state4) InitialPledgeForPower(qaPower abi.StoragePower, _ abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount, epochsSinceRampStart int64, rampDurationEpochs uint64) (abi.TokenAmount, error) { return miner4.InitialPledgeForPower( qaPower, s.State.ThisEpochBaselinePower, diff --git a/venus-shared/actors/builtin/reward/state.v5.go b/venus-shared/actors/builtin/reward/state.v5.go index 0fa51d4808..ca469b8f67 100644 --- a/venus-shared/actors/builtin/reward/state.v5.go +++ b/venus-shared/actors/builtin/reward/state.v5.go @@ -78,7 +78,7 @@ func (s *state5) CumsumRealized() (reward5.Spacetime, error) { return s.State.CumsumRealized, nil } -func (s *state5) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { +func (s *state5) InitialPledgeForPower(qaPower abi.StoragePower, _ abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount, epochsSinceRampStart int64, rampDurationEpochs uint64) (abi.TokenAmount, error) { return miner5.InitialPledgeForPower( qaPower, s.State.ThisEpochBaselinePower, diff --git a/venus-shared/actors/builtin/reward/state.v6.go b/venus-shared/actors/builtin/reward/state.v6.go index b5c74eddf5..9a4258c928 100644 --- a/venus-shared/actors/builtin/reward/state.v6.go +++ b/venus-shared/actors/builtin/reward/state.v6.go @@ -78,7 +78,7 @@ func (s *state6) CumsumRealized() (reward6.Spacetime, error) { return s.State.CumsumRealized, nil } -func (s *state6) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { +func (s *state6) InitialPledgeForPower(qaPower abi.StoragePower, _ abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount, epochsSinceRampStart int64, rampDurationEpochs uint64) (abi.TokenAmount, error) { return miner6.InitialPledgeForPower( qaPower, s.State.ThisEpochBaselinePower, diff --git a/venus-shared/actors/builtin/reward/state.v7.go b/venus-shared/actors/builtin/reward/state.v7.go index 5b4fa54819..2fc0ccbd98 100644 --- a/venus-shared/actors/builtin/reward/state.v7.go +++ b/venus-shared/actors/builtin/reward/state.v7.go @@ -78,7 +78,7 @@ func (s *state7) CumsumRealized() (reward7.Spacetime, error) { return s.State.CumsumRealized, nil } -func (s *state7) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { +func (s *state7) InitialPledgeForPower(qaPower abi.StoragePower, _ abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount, epochsSinceRampStart int64, rampDurationEpochs uint64) (abi.TokenAmount, error) { return miner7.InitialPledgeForPower( qaPower, s.State.ThisEpochBaselinePower, diff --git a/venus-shared/actors/builtin/reward/state.v8.go b/venus-shared/actors/builtin/reward/state.v8.go index 05e042741f..84522390c8 100644 --- a/venus-shared/actors/builtin/reward/state.v8.go +++ b/venus-shared/actors/builtin/reward/state.v8.go @@ -78,7 +78,7 @@ func (s *state8) CumsumRealized() (reward8.Spacetime, error) { return s.State.CumsumRealized, nil } -func (s *state8) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { +func (s *state8) InitialPledgeForPower(qaPower abi.StoragePower, _ abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount, epochsSinceRampStart int64, rampDurationEpochs uint64) (abi.TokenAmount, error) { return miner8.InitialPledgeForPower( qaPower, s.State.ThisEpochBaselinePower, diff --git a/venus-shared/actors/builtin/reward/state.v9.go b/venus-shared/actors/builtin/reward/state.v9.go index 019ab8f898..e8be2e78fd 100644 --- a/venus-shared/actors/builtin/reward/state.v9.go +++ b/venus-shared/actors/builtin/reward/state.v9.go @@ -78,7 +78,7 @@ func (s *state9) CumsumRealized() (reward9.Spacetime, error) { return s.State.CumsumRealized, nil } -func (s *state9) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { +func (s *state9) InitialPledgeForPower(qaPower abi.StoragePower, _ abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount, epochsSinceRampStart int64, rampDurationEpochs uint64) (abi.TokenAmount, error) { return miner9.InitialPledgeForPower( qaPower, s.State.ThisEpochBaselinePower, diff --git a/venus-shared/actors/builtin/system/actor.go b/venus-shared/actors/builtin/system/actor.go index 14ccec8ae3..68cc67b5e3 100644 --- a/venus-shared/actors/builtin/system/actor.go +++ b/venus-shared/actors/builtin/system/actor.go @@ -26,11 +26,11 @@ import ( builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - builtin14 "github.com/filecoin-project/go-state-types/builtin" + builtin15 "github.com/filecoin-project/go-state-types/builtin" ) var ( - Address = builtin14.SystemActorAddr + Address = builtin15.SystemActorAddr ) func Load(store adt.Store, act *types.Actor) (State, error) { @@ -62,6 +62,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case actorstypes.Version14: return load14(store, act.Head) + case actorstypes.Version15: + return load15(store, act.Head) + } } @@ -138,6 +141,9 @@ func MakeState(store adt.Store, av actorstypes.Version, builtinActors cid.Cid) ( case actorstypes.Version14: return make14(store, builtinActors) + case actorstypes.Version15: + return make15(store, builtinActors) + } return nil, fmt.Errorf("unknown actor version %d", av) } @@ -168,5 +174,6 @@ func AllCodes() []cid.Cid { (&state12{}).Code(), (&state13{}).Code(), (&state14{}).Code(), + (&state15{}).Code(), } } diff --git a/venus-shared/actors/builtin/system/state.v15.go b/venus-shared/actors/builtin/system/state.v15.go new file mode 100644 index 0000000000..d7d0b0c392 --- /dev/null +++ b/venus-shared/actors/builtin/system/state.v15.go @@ -0,0 +1,75 @@ +// FETCHED FROM LOTUS: builtin/system/state.go.template + +package system + +import ( + "fmt" + + actorstypes "github.com/filecoin-project/go-state-types/actors" + "github.com/filecoin-project/go-state-types/manifest" + + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + system15 "github.com/filecoin-project/go-state-types/builtin/v15/system" +) + +var _ State = (*state15)(nil) + +func load15(store adt.Store, root cid.Cid) (State, error) { + out := state15{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make15(store adt.Store, builtinActors cid.Cid) (State, error) { + out := state15{store: store} + out.State = system15.State{ + BuiltinActors: builtinActors, + } + return &out, nil +} + +type state15 struct { + system15.State + store adt.Store +} + +func (s *state15) GetState() interface{} { + return &s.State +} + +func (s *state15) GetBuiltinActors() cid.Cid { + + return s.State.BuiltinActors + +} + +func (s *state15) SetBuiltinActors(c cid.Cid) error { + + s.State.BuiltinActors = c + return nil + +} + +func (s *state15) ActorKey() string { + return manifest.SystemKey +} + +func (s *state15) ActorVersion() actorstypes.Version { + return actorstypes.Version15 +} + +func (s *state15) Code() cid.Cid { + code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey()) + if !ok { + panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion())) + } + + return code +} diff --git a/venus-shared/actors/builtin/verifreg/actor.go b/venus-shared/actors/builtin/verifreg/actor.go index b308d71fa7..5184588a6a 100644 --- a/venus-shared/actors/builtin/verifreg/actor.go +++ b/venus-shared/actors/builtin/verifreg/actor.go @@ -28,8 +28,9 @@ import ( builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - builtin14 "github.com/filecoin-project/go-state-types/builtin" + builtin15 "github.com/filecoin-project/go-state-types/builtin" + verifregtypes12 "github.com/filecoin-project/go-state-types/builtin/v12/verifreg" verifregtypes "github.com/filecoin-project/go-state-types/builtin/v9/verifreg" "github.com/filecoin-project/venus/venus-shared/actors" "github.com/filecoin-project/venus/venus-shared/actors/adt" @@ -37,8 +38,8 @@ import ( ) var ( - Address = builtin14.VerifiedRegistryActorAddr - Methods = builtin14.MethodsVerifiedRegistry + Address = builtin15.VerifiedRegistryActorAddr + Methods = builtin15.MethodsVerifiedRegistry ) func Load(store adt.Store, act *types.Actor) (State, error) { @@ -70,6 +71,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case actorstypes.Version14: return load14(store, act.Head) + case actorstypes.Version15: + return load15(store, act.Head) + } } @@ -146,6 +150,9 @@ func MakeState(store adt.Store, av actorstypes.Version, rootKeyAddress address.A case actorstypes.Version14: return make14(store, rootKeyAddress) + case actorstypes.Version15: + return make15(store, rootKeyAddress) + } return nil, fmt.Errorf("unknown actor version %d", av) } @@ -189,12 +196,25 @@ func AllCodes() []cid.Cid { (&state12{}).Code(), (&state13{}).Code(), (&state14{}).Code(), + (&state15{}).Code(), } } -type Allocation = verifregtypes.Allocation -type AllocationId = verifregtypes.AllocationId -type Claim = verifregtypes.Claim -type ClaimId = verifregtypes.ClaimId +type ( + Allocation = verifregtypes.Allocation + AllocationId = verifregtypes.AllocationId + Claim = verifregtypes.Claim + ClaimId = verifregtypes.ClaimId + AllocationRequest = verifregtypes12.AllocationRequest + AllocationRequests = verifregtypes12.AllocationRequests + RemoveExpiredAllocationsParams = verifregtypes12.RemoveExpiredAllocationsParams + AddVerifierParams = verifregtypes12.AddVerifierParams + AddVerifiedClientParams = verifregtypes12.AddVerifiedClientParams +) -const NoAllocationID = verifregtypes.NoAllocationID +const ( + NoAllocationID = verifregtypes.NoAllocationID + MinimumVerifiedAllocationTerm = verifregtypes12.MinimumVerifiedAllocationTerm + MaximumVerifiedAllocationTerm = verifregtypes12.MaximumVerifiedAllocationTerm + MaximumVerifiedAllocationExpiration = verifregtypes12.MaximumVerifiedAllocationExpiration +) diff --git a/venus-shared/actors/builtin/verifreg/actor.go.template b/venus-shared/actors/builtin/verifreg/actor.go.template index 4bdbe281d4..f1f74bc5fb 100644 --- a/venus-shared/actors/builtin/verifreg/actor.go.template +++ b/venus-shared/actors/builtin/verifreg/actor.go.template @@ -22,7 +22,8 @@ import ( "github.com/filecoin-project/venus/venus-shared/actors/adt" "github.com/filecoin-project/venus/venus-shared/actors" "github.com/filecoin-project/venus/venus-shared/actors/types" - verifregtypes "github.com/filecoin-project/go-state-types/builtin/v9/verifreg" + verifregtypes "github.com/filecoin-project/go-state-types/builtin/v9/verifreg" + verifregtypes12 "github.com/filecoin-project/go-state-types/builtin/v12/verifreg" ) var ( @@ -98,9 +99,22 @@ func AllCodes() []cid.Cid { } } -type Allocation = verifregtypes.Allocation -type AllocationId = verifregtypes.AllocationId -type Claim = verifregtypes.Claim -type ClaimId = verifregtypes.ClaimId +type ( + Allocation = verifregtypes.Allocation + AllocationId = verifregtypes.AllocationId + Claim = verifregtypes.Claim + ClaimId = verifregtypes.ClaimId + AllocationRequest = verifregtypes12.AllocationRequest + AllocationRequests = verifregtypes12.AllocationRequests + RemoveExpiredAllocationsParams = verifregtypes12.RemoveExpiredAllocationsParams + AddVerifierParams = verifregtypes12.AddVerifierParams + AddVerifiedClientParams = verifregtypes12.AddVerifiedClientParams +) + +const ( + NoAllocationID = verifregtypes.NoAllocationID + MinimumVerifiedAllocationTerm = verifregtypes12.MinimumVerifiedAllocationTerm + MaximumVerifiedAllocationTerm = verifregtypes12.MaximumVerifiedAllocationTerm + MaximumVerifiedAllocationExpiration = verifregtypes12.MaximumVerifiedAllocationExpiration +) -const NoAllocationID = verifregtypes.NoAllocationID diff --git a/venus-shared/actors/builtin/verifreg/state.v15.go b/venus-shared/actors/builtin/verifreg/state.v15.go new file mode 100644 index 0000000000..d84349d71e --- /dev/null +++ b/venus-shared/actors/builtin/verifreg/state.v15.go @@ -0,0 +1,199 @@ +// FETCHED FROM LOTUS: builtin/verifreg/state.go.template + +package verifreg + +import ( + "fmt" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + actorstypes "github.com/filecoin-project/go-state-types/actors" + "github.com/filecoin-project/go-state-types/manifest" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/venus/venus-shared/actors" + "github.com/filecoin-project/venus/venus-shared/actors/adt" + + builtin15 "github.com/filecoin-project/go-state-types/builtin" + adt15 "github.com/filecoin-project/go-state-types/builtin/v15/util/adt" + verifreg15 "github.com/filecoin-project/go-state-types/builtin/v15/verifreg" + + "github.com/filecoin-project/go-state-types/big" + + verifreg9 "github.com/filecoin-project/go-state-types/builtin/v9/verifreg" +) + +var _ State = (*state15)(nil) + +func load15(store adt.Store, root cid.Cid) (State, error) { + out := state15{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make15(store adt.Store, rootKeyAddress address.Address) (State, error) { + out := state15{store: store} + + s, err := verifreg15.ConstructState(store, rootKeyAddress) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state15 struct { + verifreg15.State + store adt.Store +} + +func (s *state15) RootKey() (address.Address, error) { + return s.State.RootKey, nil +} + +func (s *state15) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) { + + return false, big.Zero(), fmt.Errorf("unsupported in actors v15") + +} + +func (s *state15) VerifierDataCap(addr address.Address) (bool, abi.StoragePower, error) { + return getDataCap(s.store, actors.Version15, s.verifiers, addr) +} + +func (s *state15) RemoveDataCapProposalID(verifier address.Address, client address.Address) (bool, uint64, error) { + return getRemoveDataCapProposalID(s.store, actors.Version15, s.removeDataCapProposalIDs, verifier, client) +} + +func (s *state15) ForEachVerifier(cb func(addr address.Address, dcap abi.StoragePower) error) error { + return forEachCap(s.store, actors.Version15, s.verifiers, cb) +} + +func (s *state15) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error { + + return fmt.Errorf("unsupported in actors v15") + +} + +func (s *state15) verifiedClients() (adt.Map, error) { + + return nil, fmt.Errorf("unsupported in actors v15") + +} + +func (s *state15) verifiers() (adt.Map, error) { + return adt15.AsMap(s.store, s.Verifiers, builtin15.DefaultHamtBitwidth) +} + +func (s *state15) removeDataCapProposalIDs() (adt.Map, error) { + return adt15.AsMap(s.store, s.RemoveDataCapProposalIDs, builtin15.DefaultHamtBitwidth) +} + +func (s *state15) GetState() interface{} { + return &s.State +} + +func (s *state15) GetAllocation(clientIdAddr address.Address, allocationId verifreg9.AllocationId) (*Allocation, bool, error) { + + alloc, ok, err := s.FindAllocation(s.store, clientIdAddr, verifreg15.AllocationId(allocationId)) + return (*Allocation)(alloc), ok, err +} + +func (s *state15) GetAllocations(clientIdAddr address.Address) (map[AllocationId]Allocation, error) { + + v15Map, err := s.LoadAllocationsToMap(s.store, clientIdAddr) + + retMap := make(map[AllocationId]Allocation, len(v15Map)) + for k, v := range v15Map { + retMap[AllocationId(k)] = Allocation(v) + } + + return retMap, err + +} + +func (s *state15) GetAllAllocations() (map[AllocationId]Allocation, error) { + + v15Map, err := s.State.GetAllAllocations(s.store) + + retMap := make(map[AllocationId]Allocation, len(v15Map)) + for k, v := range v15Map { + retMap[AllocationId(k)] = Allocation(v) + } + + return retMap, err + +} + +func (s *state15) GetClaim(providerIdAddr address.Address, claimId verifreg9.ClaimId) (*Claim, bool, error) { + + claim, ok, err := s.FindClaim(s.store, providerIdAddr, verifreg15.ClaimId(claimId)) + return (*Claim)(claim), ok, err + +} + +func (s *state15) GetClaims(providerIdAddr address.Address) (map[ClaimId]Claim, error) { + + v15Map, err := s.LoadClaimsToMap(s.store, providerIdAddr) + + retMap := make(map[ClaimId]Claim, len(v15Map)) + for k, v := range v15Map { + retMap[ClaimId(k)] = Claim(v) + } + + return retMap, err + +} + +func (s *state15) GetAllClaims() (map[ClaimId]Claim, error) { + + v15Map, err := s.State.GetAllClaims(s.store) + + retMap := make(map[ClaimId]Claim, len(v15Map)) + for k, v := range v15Map { + retMap[ClaimId(k)] = Claim(v) + } + + return retMap, err + +} + +func (s *state15) GetClaimIdsBySector(providerIdAddr address.Address) (map[abi.SectorNumber][]ClaimId, error) { + + v15Map, err := s.LoadClaimsToMap(s.store, providerIdAddr) + + retMap := make(map[abi.SectorNumber][]ClaimId) + for k, v := range v15Map { + claims, ok := retMap[v.Sector] + if !ok { + retMap[v.Sector] = []ClaimId{ClaimId(k)} + } else { + retMap[v.Sector] = append(claims, ClaimId(k)) + } + } + + return retMap, err + +} + +func (s *state15) ActorKey() string { + return manifest.VerifregKey +} + +func (s *state15) ActorVersion() actorstypes.Version { + return actorstypes.Version15 +} + +func (s *state15) Code() cid.Cid { + code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey()) + if !ok { + panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion())) + } + + return code +} diff --git a/venus-shared/actors/builtin_actors_gen.go b/venus-shared/actors/builtin_actors_gen.go index a5ed6d8fd8..64d7818309 100644 --- a/venus-shared/actors/builtin_actors_gen.go +++ b/venus-shared/actors/builtin_actors_gen.go @@ -162,6 +162,29 @@ var EmbeddedBuiltinActorsMetadata []*BuiltinActorsMetadata = []*BuiltinActorsMet "system": mustParseCid("bafk2bzacebbrs3dzgxwj43ztup7twz25xkbhhtmcbjjbscjvpsrpbwux3b32g"), "verifiedregistry": mustParseCid("bafk2bzacebj3znhdpxqjgvztrv3petqwdkvrefg4j6lrp3n7wfrkdoan4os42"), }, +}, { + Network: "butterflynet", + Version: 15, + + ManifestCid: mustParseCid("bafy2bzacearjal5rsmzloz3ny7aoju2rgw66wgxdrydgg27thcsazbmf5qihq"), + Actors: map[string]cid.Cid{ + "account": mustParseCid("bafk2bzaceapjxl4kobnxn267u42nh2feouubkxcm62vzrk2nrfkqmtz6rgfw4"), + "cron": mustParseCid("bafk2bzacediarrpbvwmkch4axjzxlu7lvpjmee5og7q2dxfqu4kkir2p2qusy"), + "datacap": mustParseCid("bafk2bzaceb4lpszr3axumf6f5ane5tlyj76zimptvt3lx7zpu5lx57zmua4dw"), + "eam": mustParseCid("bafk2bzaceaxjorcph7nmcgfgyv225s5y44xpswtp4b5744dm7kfxiztgf4ti4"), + "ethaccount": mustParseCid("bafk2bzacebz3y3vjqrfk2x2koj733cblhyjqajldc7dfiu7jud6g64b4bzqqc"), + "evm": mustParseCid("bafk2bzacedj7idaxudsiwwvmgluhzvzzvcr7u2r2cfymagjq7amegxfs3oyim"), + "init": mustParseCid("bafk2bzacedtpna72vpmt6yyqx5lxersccnmv2aq2odfp2f5v7o2cvl6zxgrtg"), + "multisig": mustParseCid("bafk2bzacebz3uwa4g5tyg5zb6nad24gnqwlplrlvakdwlytznqfqrnulpg7gm"), + "paymentchannel": mustParseCid("bafk2bzaceatyws2kngfwau6o7c74cl2ogcdm4aopdaozu7r76ymtvrhuk3a4k"), + "placeholder": mustParseCid("bafk2bzacedfvut2myeleyq67fljcrw4kkmn5pb5dpyozovj7jpoez5irnc3ro"), + "reward": mustParseCid("bafk2bzacecxt3jqyiyrqhbdr4eavgkmoijkoundxap7rdbw3g6j62t2hak23u"), + "storagemarket": mustParseCid("bafk2bzacecbx6yzird3wp3lkyroqizp3g5lsysh5qijstfwe4sjngbpo3lx3q"), + "storageminer": mustParseCid("bafk2bzaceb2jyz6tx5gdmu66smksb544wrhqwgub45tq3qltc3wiv64zsbqoa"), + "storagepower": mustParseCid("bafk2bzacebdwg62s5fwmctrtsoz77qx3qk3hj5eu45aiamryphhcak65od4xe"), + "system": mustParseCid("bafk2bzacebf6qpnaem4d3kku74hyizal7rfqmxvngvnerq3gxmyqvnib4ho22"), + "verifiedregistry": mustParseCid("bafk2bzacebxppwtgpstn55klmiux64pwekibcapv6v26nbfrrateth5zzsdic"), + }, }, { Network: "calibrationnet", Version: 8, @@ -314,6 +337,29 @@ var EmbeddedBuiltinActorsMetadata []*BuiltinActorsMetadata = []*BuiltinActorsMet "system": mustParseCid("bafk2bzacederl6tlpieldsn6mkndqwd4wj5orfoqgab6p2klswfn3cjagxwla"), "verifiedregistry": mustParseCid("bafk2bzaceczw2kp6gjjdcjbso7mewp7guik7gr525pal6dotdja2lrct6ok3c"), }, +}, { + Network: "calibrationnet", + Version: 15, + + ManifestCid: mustParseCid("bafy2bzaceax5zkysst7vtyup4whdxwzlpnaya3qp34rnoi6gyt4pongps7obw"), + Actors: map[string]cid.Cid{ + "account": mustParseCid("bafk2bzacecwdkoknhok52hlddoetdkqfwohhv4bx6csu3x6o7aduryv5ufssu"), + "cron": mustParseCid("bafk2bzacebjbuz7fjjsmt6zsuk724ief7yhkzm3b4ghgtasbe2zr4rrwr2qaw"), + "datacap": mustParseCid("bafk2bzacebxssfq5qpdahcvypgxk3o34npc7br5vd6dwe3zdelpql5hil7auq"), + "eam": mustParseCid("bafk2bzacebfllr37yrgvczflbncokmsoqzp5tpf3v4jhfcwz5x5bsieqvmf4c"), + "ethaccount": mustParseCid("bafk2bzacec6onad6awpg54l6d6dubjsncwauxrzrjq5lbxzpyzs5hthepwvmm"), + "evm": mustParseCid("bafk2bzaceabq3zagn4ee2wbagarxf7xgbrqgqgm55xydanxik2bifztqgynts"), + "init": mustParseCid("bafk2bzacedg7uw4z5gdzdlfzalc6xlmbqduawuk6gzrijtln35yas5yagn7s2"), + "multisig": mustParseCid("bafk2bzacean3scmnmvgvyxv44d775ssfwcwghyubqv4dul3ohkvlv3cm2bwui"), + "paymentchannel": mustParseCid("bafk2bzaceb3o3ayjxoi5dc3e6ysuyqtcwbas5cvl3mxhxn57ieackjah5dhe6"), + "placeholder": mustParseCid("bafk2bzacedfvut2myeleyq67fljcrw4kkmn5pb5dpyozovj7jpoez5irnc3ro"), + "reward": mustParseCid("bafk2bzacedcnokx43cbvma4kish3ujmgn7ku2epgfpcv73pzliqlquswu2ukw"), + "storagemarket": mustParseCid("bafk2bzacedifpoan54pgc3bpzpefdlvyigieyjyueiptv4keaeg7fspjjxe62"), + "storageminer": mustParseCid("bafk2bzacecal5j3xng2dlrx3vlieyzni4rvqpvjngxgpai5oarhcrb4wtaaf2"), + "storagepower": mustParseCid("bafk2bzaceclefusmffhuuvtggrmadr3cwpwsgphtlj2wb222ztwwv5mssu5ea"), + "system": mustParseCid("bafk2bzacecybufhea4ah2vwtp4pqxotdfk2lnrgu6cw63jstysjzzcegio4ps"), + "verifiedregistry": mustParseCid("bafk2bzacedbvfxhxsdktslf2rto5kyiumvppoen2avbmpgh7ijsmkxjyua3s4"), + }, }, { Network: "caterpillarnet", Version: 8, @@ -475,6 +521,29 @@ var EmbeddedBuiltinActorsMetadata []*BuiltinActorsMetadata = []*BuiltinActorsMet "system": mustParseCid("bafk2bzacea75k6agtdmjxdfnwbctzstc6pozdblpdevc5ixjevvuzcqwwuzrc"), "verifiedregistry": mustParseCid("bafk2bzacedxwgmgffeapq4nffplapb5mixkrm2vosmc2i3fxcye5dookiqubu"), }, +}, { + Network: "caterpillarnet", + Version: 15, + + ManifestCid: mustParseCid("bafy2bzaceaw24gctg3dx6pzrymhggsp32c7mofjscwnylk4pzsqmilolygwhi"), + Actors: map[string]cid.Cid{ + "account": mustParseCid("bafk2bzacecmm4ymqjjbonet2yxe7l4jqg3uphcxmiz6vwyza4d4tfiy7hu3j4"), + "cron": mustParseCid("bafk2bzaceavxtvwpeakmnjfzfrkoeaxj7olniuucih7ktkd2q5kuuetqaz3ra"), + "datacap": mustParseCid("bafk2bzacebwhd6ojy3v6yqmdg5yxegv5fwydrkorzps2wbfyvhnyse4xgz27u"), + "eam": mustParseCid("bafk2bzaceankzhowyxqpcqmmqwv53uy37hvpzgpe6npbi4kkcxfuryzfeykeg"), + "ethaccount": mustParseCid("bafk2bzaceai5kycpmi6eogph6qnpojtwpn3fxzou7nbdqbooud5ql2ru3zhvk"), + "evm": mustParseCid("bafk2bzacecqefgqxphgqar6tfroj7bfvbnwtbbqeypmkwlis5s2aycgu7cf3q"), + "init": mustParseCid("bafk2bzacedn364np7lgbuzxirktflnkhtt2aipj6u2m66lmhrpxmrsqtbre5o"), + "multisig": mustParseCid("bafk2bzacebhqbrqli6udo5bclkuj5gpaiedzuqisuvzpzdkfalh5lsvxiyqba"), + "paymentchannel": mustParseCid("bafk2bzaceancwwau6oyvwstcigo5l6nytm5q35z5jndy5pmekhpjcmmou3lzs"), + "placeholder": mustParseCid("bafk2bzacedfvut2myeleyq67fljcrw4kkmn5pb5dpyozovj7jpoez5irnc3ro"), + "reward": mustParseCid("bafk2bzacebomw2znawgbr5bf36i43vziblgk2fv5e5wro6xtj62gqfjnk7sg2"), + "storagemarket": mustParseCid("bafk2bzacecz47tblw4pnzpskivaeyazlvbarfh5wifjl7eyckijmjdwi5wqxq"), + "storageminer": mustParseCid("bafk2bzacecb5d2x4dmgqch3fakw54hzzrqg3z7qslb7b6yvoxn5ljftwne7qo"), + "storagepower": mustParseCid("bafk2bzacebz5j6alycdjtqrlsdsjmxdzoictvry43eihon7e5gtlxpq3dwv76"), + "system": mustParseCid("bafk2bzacecwyleco2r5bjjxdj3dp26bluua3f3u4mta4wmrrslfxscb2kz37o"), + "verifiedregistry": mustParseCid("bafk2bzacec4i7zpu6ca5zqcxsowiqqofqix7z5gh3k27mndpnm3wujbzuf2bk"), + }, }, { Network: "devnet", Version: 8, @@ -627,6 +696,29 @@ var EmbeddedBuiltinActorsMetadata []*BuiltinActorsMetadata = []*BuiltinActorsMet "system": mustParseCid("bafk2bzacea4rh5i36ucj23zb4mid4tw5ym2wqlfap4ejjaynvobengeuby4ja"), "verifiedregistry": mustParseCid("bafk2bzaceapbsihfuk3munfpcoevtxlwuenxeiiv7dp7v3t2yjs26hcpypexi"), }, +}, { + Network: "devnet", + Version: 15, + + ManifestCid: mustParseCid("bafy2bzacedlusqjwf7chvl2ve2fum5noyqrtjzcrzkhpbzpkg7puiru7dj4ug"), + Actors: map[string]cid.Cid{ + "account": mustParseCid("bafk2bzaceb7f7gjyz2fkzkbf6jlwttjinny4nci4zdoby7r246xuyc4e2n7me"), + "cron": mustParseCid("bafk2bzaceat32zil3qjywp7bfq4hbew3i6eiadcwjx54sqydw27an5wwzmkri"), + "datacap": mustParseCid("bafk2bzacechbefgwgnajqk3urksgiqw4kro7pankoaidajjobbryitzuhevrm"), + "eam": mustParseCid("bafk2bzaceb4koufzo3rkf7kw4l5zrahfdougmve6jgp72zp3wsvahhfxsmlmg"), + "ethaccount": mustParseCid("bafk2bzacebdovyvmzzssiaqkwl5kw65d72ki3am7p3uic6pzvude76cye5um6"), + "evm": mustParseCid("bafk2bzacebmv2k57q5atsj6jdpkyoa2wmap7hj3jmkuzwlycly44cudyfnwyu"), + "init": mustParseCid("bafk2bzaceaalaquld7f5qryyf2expe7hx7ooeyanybbwehleu2fdzraubknmu"), + "multisig": mustParseCid("bafk2bzacedzegnrtnjrei34cgzv73wgobtverwwkllhvfxpjovqfxs3mtbnpa"), + "paymentchannel": mustParseCid("bafk2bzacedxdsrba55q4isy3mge3hr3l7to6um5wcrmxficstvwpepwfufkda"), + "placeholder": mustParseCid("bafk2bzacedfvut2myeleyq67fljcrw4kkmn5pb5dpyozovj7jpoez5irnc3ro"), + "reward": mustParseCid("bafk2bzacebkzpb37wi7jwxtfnvoa2cpiebyrkq6plcpbzwjyvx7nzambptarq"), + "storagemarket": mustParseCid("bafk2bzacea7xxmmjcxl3vnfqrnbiv7rkq2tgorrsfbdkzcoqxkhmjtslsy5r6"), + "storageminer": mustParseCid("bafk2bzacedlej4t4igjn7nxudsvpvmijcd4oiwngbizcb4jytm7wyzfvgqfzy"), + "storagepower": mustParseCid("bafk2bzacec5auarmk46n2nourfxn34f75xnny63xe7kznnx6vqphawytnl6xs"), + "system": mustParseCid("bafk2bzacebkim7xhbjjuwyqmegclkftnfoz74735yreqdcwr2i6z2kbv767ae"), + "verifiedregistry": mustParseCid("bafk2bzacedd6hquizdv65nai6h5f2lfhkxgkrofn2zcrrwqi5cmbo2wotx6vm"), + }, }, { Network: "hyperspace", Version: 8, @@ -802,6 +894,29 @@ var EmbeddedBuiltinActorsMetadata []*BuiltinActorsMetadata = []*BuiltinActorsMet "system": mustParseCid("bafk2bzacecak4ow7tmauku42s3u2yydonk4hx6ov6ov542hy7lcbji3nhrrhs"), "verifiedregistry": mustParseCid("bafk2bzacebvyzjzmvmjvpypphqsumpy6rzxuugnehgum7grc6sv3yqxzrshb4"), }, +}, { + Network: "mainnet", + Version: 15, + + ManifestCid: mustParseCid("bafy2bzaceakwje2hyinucrhgtsfo44p54iw4g6otbv5ghov65vajhxgntr53u"), + Actors: map[string]cid.Cid{ + "account": mustParseCid("bafk2bzacecia5zacqt4gvd4z7275lnkhgraq75shy63cphakphhw6crf4joii"), + "cron": mustParseCid("bafk2bzacecbyx7utt3tkvhqnfk64kgtlt5jlvv56o2liwczikgzfowk2cvqvk"), + "datacap": mustParseCid("bafk2bzacecrypcpyzidphfl3sf3vhrjbiwzu7w3hoole45wsk2bqpverw4tni"), + "eam": mustParseCid("bafk2bzacebybq7keb45l6isqfaiwxy5oi5wlpknhggjheut7q6xwp7mbxxku4"), + "ethaccount": mustParseCid("bafk2bzaceajdy72edg3t2zcb6qwv2wgdsysfwdtczcklxcp4hlwh7pkxekja4"), + "evm": mustParseCid("bafk2bzaceandffodu45eyro7jr7bizxw7ibipaiskt36xbp4vpvsxtrpkyjfm"), + "init": mustParseCid("bafk2bzaceb5mjmy56ediswt2hvwqdfs2xzi4qw3cefkufoat57yyt3iwkg7kw"), + "multisig": mustParseCid("bafk2bzaced3csl3buj7chpunsubrhwhchtskx674fpukfen4u6pbpkcheueya"), + "paymentchannel": mustParseCid("bafk2bzacea3dpsfxw7cnj6zljmjnnaubp43a5kvuausigztmukektesg2flei"), + "placeholder": mustParseCid("bafk2bzacedfvut2myeleyq67fljcrw4kkmn5pb5dpyozovj7jpoez5irnc3ro"), + "reward": mustParseCid("bafk2bzaceapkgue3gcxmwx7bvypn33okppa2nwpelcfp7oyo5yln3brixpjpm"), + "storagemarket": mustParseCid("bafk2bzaceaqrnikbxymygwhwa2rsvhnqj5kfch75pn5xawnx243brqlfglsl6"), + "storageminer": mustParseCid("bafk2bzacecnl2hqe3nozwo7al7kdznqgdrv2hbbbmpcbcwzh3yl4trog433hc"), + "storagepower": mustParseCid("bafk2bzacecb3tvvppxmktll3xehjc7mqbfilt6bd4gragbdwxn77hm5frkuac"), + "system": mustParseCid("bafk2bzacecvcqje6kcfqeayj66hezlwzfznytwqkxgw7p64xac5f5lcwjpbwe"), + "verifiedregistry": mustParseCid("bafk2bzacecudaqwbz6dukmdbfok7xuxcpjqighnizhxun4spdqvnqgftkupp2"), + }, }, { Network: "testing", Version: 8, @@ -954,6 +1069,29 @@ var EmbeddedBuiltinActorsMetadata []*BuiltinActorsMetadata = []*BuiltinActorsMet "system": mustParseCid("bafk2bzacechwe3ehay6h7x7tecaajgsxrvvmzcdul6omejfvzf4mpbzkuryhm"), "verifiedregistry": mustParseCid("bafk2bzacec66mmy7sj6qy5urqplwhbem7wbjrzna7mxh6qbdljdawhu3g5rao"), }, +}, { + Network: "testing", + Version: 15, + + ManifestCid: mustParseCid("bafy2bzacedio6qbcgxduz3y2zksor5dgyt3ieiugnugvsz6k2jdzwvugwahag"), + Actors: map[string]cid.Cid{ + "account": mustParseCid("bafk2bzaceabav73gljoyhtozycl5dqwomg4vviuy2jimte545yx3vgg3vfnyo"), + "cron": mustParseCid("bafk2bzacedsbgvf64up7gqlhh5bdvxgvnqvsbppp33assv5osluz46oqafibc"), + "datacap": mustParseCid("bafk2bzacea2ubiaxayu3tg7xpefj3ndbsfgqn5dnyvlwya2yik7kh6twx74ri"), + "eam": mustParseCid("bafk2bzacedykh5puyw66joxeuvobde36bfdiktutxve634b2tc2d2ydfj4fje"), + "ethaccount": mustParseCid("bafk2bzacecdgnwjqc3i2y6goz6d4a6auaxinkwub4eh7aqyntaazitisjhkka"), + "evm": mustParseCid("bafk2bzacecjfoi4jv5h3l5bnd2ewasawqiagahew5wz2377o6t5l2ahm6t4dm"), + "init": mustParseCid("bafk2bzaceau2csdeu3zaqnupnb6d3lor5e6laatvbdslyi3zsexoylpfruh6s"), + "multisig": mustParseCid("bafk2bzacedfkajtsx2i5pzesm7dgvzgeqpgrhlnplz4v2hxzczranmj6ujb4y"), + "paymentchannel": mustParseCid("bafk2bzaceagcnvbzecwryztsgnclpywakvsunzoxkwd5b7bgtgwe5k6dppqju"), + "placeholder": mustParseCid("bafk2bzacedfvut2myeleyq67fljcrw4kkmn5pb5dpyozovj7jpoez5irnc3ro"), + "reward": mustParseCid("bafk2bzacedxwzuvtooihiaq43ibfngg767zibxeygn67gjouwh6pkiat22igi"), + "storagemarket": mustParseCid("bafk2bzacecwnqpoxhhbu6ntiha3yz7x5apyceagbcu7v2togmrbsovajbg7my"), + "storageminer": mustParseCid("bafk2bzacednp3ii6leamsir5sh44spg3rlz7wo5sqocrlmgmh2poa5wm4d2bk"), + "storagepower": mustParseCid("bafk2bzacebigfazstagtjbx6ixzxzns3lza6mnrsw4lvhetej7b6dygiwsvxo"), + "system": mustParseCid("bafk2bzaceb7zn7sblfs3jterbvzm2cnp4g3ys5yfd3vhatkascrjsidyw74sq"), + "verifiedregistry": mustParseCid("bafk2bzaceafcnglgibjq5c26bzoyndzu77g6wdr7s3nnr3wjwhhtvfy7pb5dw"), + }, }, { Network: "testing-fake-proofs", Version: 8, @@ -1106,6 +1244,29 @@ var EmbeddedBuiltinActorsMetadata []*BuiltinActorsMetadata = []*BuiltinActorsMet "system": mustParseCid("bafk2bzacechwe3ehay6h7x7tecaajgsxrvvmzcdul6omejfvzf4mpbzkuryhm"), "verifiedregistry": mustParseCid("bafk2bzacec66mmy7sj6qy5urqplwhbem7wbjrzna7mxh6qbdljdawhu3g5rao"), }, +}, { + Network: "testing-fake-proofs", + Version: 15, + + ManifestCid: mustParseCid("bafy2bzacea3jtzs4jz75ht3ncdyvabef4spz7w375ja7spp36yy3zwp5ji2wi"), + Actors: map[string]cid.Cid{ + "account": mustParseCid("bafk2bzaceabav73gljoyhtozycl5dqwomg4vviuy2jimte545yx3vgg3vfnyo"), + "cron": mustParseCid("bafk2bzacedsbgvf64up7gqlhh5bdvxgvnqvsbppp33assv5osluz46oqafibc"), + "datacap": mustParseCid("bafk2bzacea2ubiaxayu3tg7xpefj3ndbsfgqn5dnyvlwya2yik7kh6twx74ri"), + "eam": mustParseCid("bafk2bzacedykh5puyw66joxeuvobde36bfdiktutxve634b2tc2d2ydfj4fje"), + "ethaccount": mustParseCid("bafk2bzacecdgnwjqc3i2y6goz6d4a6auaxinkwub4eh7aqyntaazitisjhkka"), + "evm": mustParseCid("bafk2bzacecjfoi4jv5h3l5bnd2ewasawqiagahew5wz2377o6t5l2ahm6t4dm"), + "init": mustParseCid("bafk2bzaceau2csdeu3zaqnupnb6d3lor5e6laatvbdslyi3zsexoylpfruh6s"), + "multisig": mustParseCid("bafk2bzaceclv7t7qu5pu4kwkkkxqknbpdtuaa57cdgoxaci6vfjfxpzbwb4h4"), + "paymentchannel": mustParseCid("bafk2bzaceagcnvbzecwryztsgnclpywakvsunzoxkwd5b7bgtgwe5k6dppqju"), + "placeholder": mustParseCid("bafk2bzacedfvut2myeleyq67fljcrw4kkmn5pb5dpyozovj7jpoez5irnc3ro"), + "reward": mustParseCid("bafk2bzacedxwzuvtooihiaq43ibfngg767zibxeygn67gjouwh6pkiat22igi"), + "storagemarket": mustParseCid("bafk2bzacecwnqpoxhhbu6ntiha3yz7x5apyceagbcu7v2togmrbsovajbg7my"), + "storageminer": mustParseCid("bafk2bzacecf3u77js4taapxfwasgwldq4auzrvxgasdqvf5afqgatfgdcvvhc"), + "storagepower": mustParseCid("bafk2bzacebigfazstagtjbx6ixzxzns3lza6mnrsw4lvhetej7b6dygiwsvxo"), + "system": mustParseCid("bafk2bzaceb7zn7sblfs3jterbvzm2cnp4g3ys5yfd3vhatkascrjsidyw74sq"), + "verifiedregistry": mustParseCid("bafk2bzaceafcnglgibjq5c26bzoyndzu77g6wdr7s3nnr3wjwhhtvfy7pb5dw"), + }, }} func mustParseCid(c string) cid.Cid { diff --git a/venus-shared/actors/manifest.go b/venus-shared/actors/manifest.go index 07a88af862..9f1ede6d9f 100644 --- a/venus-shared/actors/manifest.go +++ b/venus-shared/actors/manifest.go @@ -104,7 +104,7 @@ func GetActorCodeIDsFromManifest(av actorstypes.Version) (map[string]cid.Cid, bo return cids, ok } -// Given a Manifest CID, get the manifest from the store and Load data into its entries +// LoadManifest will get the manifest for a given Manifest CID from the store and Load data into its entries func LoadManifest(ctx context.Context, mfCid cid.Cid, adtStore adt.Store) (*manifest.Manifest, error) { var mf manifest.Manifest diff --git a/venus-shared/actors/policy/policy.go b/venus-shared/actors/policy/policy.go index 154c529f4e..2863c9da12 100644 --- a/venus-shared/actors/policy/policy.go +++ b/venus-shared/actors/policy/policy.go @@ -90,18 +90,23 @@ import ( miner14 "github.com/filecoin-project/go-state-types/builtin/v14/miner" verifreg14 "github.com/filecoin-project/go-state-types/builtin/v14/verifreg" - paych14 "github.com/filecoin-project/go-state-types/builtin/v14/paych" + builtin15 "github.com/filecoin-project/go-state-types/builtin" + market15 "github.com/filecoin-project/go-state-types/builtin/v15/market" + miner15 "github.com/filecoin-project/go-state-types/builtin/v15/miner" + verifreg15 "github.com/filecoin-project/go-state-types/builtin/v15/verifreg" + + paych15 "github.com/filecoin-project/go-state-types/builtin/v15/paych" ) const ( - ChainFinality = miner14.ChainFinality + ChainFinality = miner15.ChainFinality SealRandomnessLookback = ChainFinality - PaychSettleDelay = paych14.SettleDelay - MaxPreCommitRandomnessLookback = builtin14.EpochsInDay + SealRandomnessLookback + PaychSettleDelay = paych15.SettleDelay + MaxPreCommitRandomnessLookback = builtin15.EpochsInDay + SealRandomnessLookback ) var ( - MarketDefaultAllocationTermBuffer = market14.MarketDefaultAllocationTermBuffer + MarketDefaultAllocationTermBuffer = market15.MarketDefaultAllocationTermBuffer ) // SetSupportedProofTypes sets supported proof types, across all actor versions. @@ -220,11 +225,13 @@ func SetPreCommitChallengeDelay(delay abi.ChainEpoch) { miner14.PreCommitChallengeDelay = delay + miner15.PreCommitChallengeDelay = delay + } -// TODO: this function shouldn't really exist. Instead, the API should expose the precommit delay. func GetPreCommitChallengeDelay() abi.ChainEpoch { - return miner14.PreCommitChallengeDelay + // TODO: this function shouldn't really exist. Instead, the API should expose the precommit delay. + return miner15.PreCommitChallengeDelay } // SetConsensusMinerMinPower sets the minimum power of an individual miner must @@ -286,6 +293,10 @@ func SetConsensusMinerMinPower(p abi.StoragePower) { policy.ConsensusMinerMinPower = p } + for _, policy := range builtin15.PoStProofPolicies { + policy.ConsensusMinerMinPower = p + } + } // SetMinVerifiedDealSize sets the minimum size of a verified deal. This should @@ -320,6 +331,8 @@ func SetMinVerifiedDealSize(size abi.StoragePower) { verifreg14.MinVerifiedDealSize = size + verifreg15.MinVerifiedDealSize = size + } func GetMaxProveCommitDuration(ver actorstypes.Version, t abi.RegisteredSealProof) (abi.ChainEpoch, error) { @@ -381,6 +394,10 @@ func GetMaxProveCommitDuration(ver actorstypes.Version, t abi.RegisteredSealProo return miner14.MaxProveCommitDuration[t], nil + case actorstypes.Version15: + + return miner15.MaxProveCommitDuration[t], nil + default: return 0, fmt.Errorf("unsupported actors version") } @@ -456,6 +473,11 @@ func SetProviderCollateralSupplyTarget(num, denom big.Int) { Denominator: denom, } + market15.ProviderCollateralSupplyTarget = builtin15.BigFrac{ + Numerator: num, + Denominator: denom, + } + } func DealProviderCollateralBounds( @@ -539,17 +561,22 @@ func DealProviderCollateralBounds( min, max := market14.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) return min, max, nil + case actorstypes.Version15: + + min, max := market15.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) + return min, max, nil + default: return big.Zero(), big.Zero(), fmt.Errorf("unsupported actors version") } } func DealDurationBounds(pieceSize abi.PaddedPieceSize) (min, max abi.ChainEpoch) { - return market14.DealDurationBounds(pieceSize) + return market15.DealDurationBounds(pieceSize) } -// Sets the challenge window and scales the proving period to match (such that -// there are always 48 challenge windows in a proving period). +// SetWPoStChallengeWindow sets the challenge window and scales the proving period to match (such +// that there are always 48 challenge windows in a proving period). func SetWPoStChallengeWindow(period abi.ChainEpoch) { miner0.WPoStChallengeWindow = period @@ -642,6 +669,13 @@ func SetWPoStChallengeWindow(period abi.ChainEpoch) { // scale it if we're scaling the challenge period. miner14.WPoStDisputeWindow = period * 30 + miner15.WPoStChallengeWindow = period + miner15.WPoStProvingPeriod = period * abi.ChainEpoch(miner15.WPoStPeriodDeadlines) + + // by default, this is 2x finality which is 30 periods. + // scale it if we're scaling the challenge period. + miner15.WPoStDisputeWindow = period * 30 + } func GetWinningPoStSectorSetLookback(nwVer network.Version) abi.ChainEpoch { @@ -702,6 +736,9 @@ func GetMaxSectorExpirationExtension(nv network.Version) (abi.ChainEpoch, error) case actorstypes.Version14: return miner14.MaxSectorExpirationExtension, nil + case actorstypes.Version15: + return miner15.MaxSectorExpirationExtension, nil + default: return 0, fmt.Errorf("unsupported network version") } @@ -709,11 +746,11 @@ func GetMaxSectorExpirationExtension(nv network.Version) (abi.ChainEpoch, error) } func GetMinSectorExpiration() abi.ChainEpoch { - return miner14.MinSectorExpiration + return miner15.MinSectorExpiration } func GetMaxPoStPartitions(nv network.Version, p abi.RegisteredPoStProof) (int, error) { - sectorsPerPart, err := builtin14.PoStProofWindowPoStPartitionSectors(p) + sectorsPerPart, err := builtin15.PoStProofWindowPoStPartitionSectors(p) if err != nil { return 0, err } @@ -722,7 +759,7 @@ func GetMaxPoStPartitions(nv network.Version, p abi.RegisteredPoStProof) (int, e return 0, err } - return min(miner14.PoStedPartitionsMax, int(uint64(maxSectors)/sectorsPerPart)), nil + return min(miner15.PoStedPartitionsMax, int(uint64(maxSectors)/sectorsPerPart)), nil } func GetDefaultAggregationProof() abi.RegisteredAggregationProof { @@ -734,7 +771,7 @@ func GetSectorMaxLifetime(proof abi.RegisteredSealProof, nwVer network.Version) return builtin4.SealProofPoliciesV0[proof].SectorMaxLifetime } - return builtin14.SealProofPoliciesV11[proof].SectorMaxLifetime + return builtin15.SealProofPoliciesV11[proof].SectorMaxLifetime } func GetAddressedSectorsMax(nwVer network.Version) (int, error) { @@ -786,6 +823,9 @@ func GetAddressedSectorsMax(nwVer network.Version) (int, error) { case actorstypes.Version14: return miner14.AddressedSectorsMax, nil + case actorstypes.Version15: + return miner15.AddressedSectorsMax, nil + default: return 0, fmt.Errorf("unsupported network version") } @@ -855,6 +895,10 @@ func GetDeclarationsMax(nwVer network.Version) (int, error) { return miner14.DeclarationsMax, nil + case actorstypes.Version15: + + return miner15.DeclarationsMax, nil + default: return 0, fmt.Errorf("unsupported network version") } @@ -923,6 +967,10 @@ func AggregateProveCommitNetworkFee(nwVer network.Version, aggregateSize int, ba return miner14.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil + case actorstypes.Version15: + + return miner15.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil + default: return big.Zero(), fmt.Errorf("unsupported network version") } @@ -991,6 +1039,10 @@ func AggregatePreCommitNetworkFee(nwVer network.Version, aggregateSize int, base return miner14.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil + case actorstypes.Version15: + + return miner15.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil + default: return big.Zero(), fmt.Errorf("unsupported network version") } diff --git a/venus-shared/actors/policy/policy.go.template b/venus-shared/actors/policy/policy.go.template index 02a46c49b5..70029cd6d7 100644 --- a/venus-shared/actors/policy/policy.go.template +++ b/venus-shared/actors/policy/policy.go.template @@ -112,8 +112,8 @@ func SetPreCommitChallengeDelay(delay abi.ChainEpoch) { {{end}} } -// TODO: this function shouldn't really exist. Instead, the API should expose the precommit delay. func GetPreCommitChallengeDelay() abi.ChainEpoch { + // TODO: this function shouldn't really exist. Instead, the API should expose the precommit delay. return miner{{.latestVersion}}.PreCommitChallengeDelay } @@ -202,8 +202,8 @@ func DealDurationBounds(pieceSize abi.PaddedPieceSize) (min, max abi.ChainEpoch) return market{{.latestVersion}}.DealDurationBounds(pieceSize) } -// Sets the challenge window and scales the proving period to match (such that -// there are always 48 challenge windows in a proving period). +// SetWPoStChallengeWindow sets the challenge window and scales the proving period to match (such +// that there are always 48 challenge windows in a proving period). func SetWPoStChallengeWindow(period abi.ChainEpoch) { {{range .versions}} miner{{.}}.WPoStChallengeWindow = period diff --git a/venus-shared/actors/types/eth.go b/venus-shared/actors/types/eth.go index 13aeba9d9e..53355a1e3a 100644 --- a/venus-shared/actors/types/eth.go +++ b/venus-shared/actors/types/eth.go @@ -12,7 +12,7 @@ import ( "strings" "github.com/ipfs/go-cid" - "github.com/multiformats/go-multihash" + mh "github.com/multiformats/go-multihash" "github.com/multiformats/go-varint" "golang.org/x/crypto/sha3" @@ -23,6 +23,13 @@ import ( "github.com/filecoin-project/venus/pkg/constants" ) +var expectedHashPrefix = cid.Prefix{ + Version: 1, + Codec: cid.DagCBOR, + MhType: uint64(mh.BLAKE2B_MIN + 31), + MhLength: 32, +}.Bytes() + var ErrInvalidAddress = errors.New("invalid Filecoin Eth address") // Research into Filecoin chain behaviour suggests that probabilistic finality @@ -507,7 +514,7 @@ func (h EthHash) String() string { // Should ONLY be used for blocks and Filecoin messages. Eth transactions expect a different hashing scheme. func (h EthHash) ToCid() cid.Cid { // err is always nil - mh, _ := multihash.EncodeName(h[:], "blake2b-256") + mh, _ := mh.EncodeName(h[:], "blake2b-256") return cid.NewCidV1(cid.DagCBOR, mh) } @@ -550,7 +557,19 @@ func handleHexStringPrefix(s string) string { } func EthHashFromCid(c cid.Cid) (EthHash, error) { - return ParseEthHash(c.Hash().HexString()[8:]) + hash, found := bytes.CutPrefix(c.Bytes(), expectedHashPrefix) + if !found { + return EthHash{}, fmt.Errorf("CID does not have the expected prefix") + } + + if len(hash) != EthHashLength { + // this shouldn't be possible since the prefix has the length, but just in case + return EthHash{}, fmt.Errorf("CID hash length is not 32 bytes") + } + + var h EthHash + copy(h[:], hash) + return h, nil } func ParseEthHash(s string) (EthHash, error) { diff --git a/venus-shared/actors/types/eth_test.go b/venus-shared/actors/types/eth_test.go index 2860b9782f..959590fb3f 100644 --- a/venus-shared/actors/types/eth_test.go +++ b/venus-shared/actors/types/eth_test.go @@ -5,6 +5,7 @@ import ( "strings" "testing" + "github.com/ipfs/go-cid" "github.com/stretchr/testify/require" "github.com/filecoin-project/go-address" @@ -104,6 +105,17 @@ func TestEthHash(t *testing.T) { require.NoError(t, err) require.Equal(t, hash, string(jm)) } + + for _, c := range []cid.Cid{ + cid.Undef, + cid.MustParse("bafy2bzacaa"), + cid.MustParse("bafkqaaa"), + cid.MustParse("bafy2bzacidqenpags5upxuhzpynnbhaojm5cy6dfoiojibz4gk2u4degs4qiclksacibt65ogzfjqionu7o25nl3y4ayzsizwbc32crqgnrqntqv"), + cid.MustParse("bafyrgqhai26anf3i7pips7q22coa4sz2fr4gk4q4sqdtymvvjyginfzaqewveaeqdh524nsktaq43j65v22xxrybrtertmcfxufdam3da3hbk"), + } { + _, err := EthHashFromCid(c) + require.ErrorContains(t, err, "CID does not have the expected prefix") + } } func TestEthFilterID(t *testing.T) { @@ -444,3 +456,14 @@ func TestEthHashListUnmarshalJSON(t *testing.T) { require.Equal(t, tc.want, got) } } + +func BenchmarkEthHashFromCid(b *testing.B) { + c := cid.MustParse("bafy2bzacedwviarjtjraqakob5pslltmuo5n3xev3nt5zylezofkbbv5jclyu") + + for i := 0; i < b.N; i++ { + _, err := EthHashFromCid(c) + if err != nil { + b.Fatalf("Error in EthHashFromCid: %v", err) + } + } +} diff --git a/venus-shared/actors/version.go b/venus-shared/actors/version.go index 6244ef360a..15aadbf864 100644 --- a/venus-shared/actors/version.go +++ b/venus-shared/actors/version.go @@ -16,9 +16,9 @@ const ({{range .actorVersions}} /* inline-gen start */ -var LatestVersion = 14 +var LatestVersion = 15 -var Versions = []int{0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14} +var Versions = []int{0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15} const ( Version0 Version = 0 @@ -35,6 +35,7 @@ const ( Version12 Version = 12 Version13 Version = 13 Version14 Version = 14 + Version15 Version = 15 ) /* inline-gen end */ diff --git a/venus-shared/api/chain/v0/chain.go b/venus-shared/api/chain/v0/chain.go index 5534e29406..fa515c0d67 100644 --- a/venus-shared/api/chain/v0/chain.go +++ b/venus-shared/api/chain/v0/chain.go @@ -155,22 +155,35 @@ type IMinerState interface { // StateGetClaim returns the claim for a given address and claim ID. StateGetClaim(ctx context.Context, providerAddr address.Address, claimID types.ClaimId, tsk types.TipSetKey) (*types.Claim, error) //perm:read // StateGetClaims returns the all the claims for a given provider. - StateGetClaims(ctx context.Context, providerAddr address.Address, tsk types.TipSetKey) (map[types.ClaimId]types.Claim, error) //perm:read - StateMinerPreCommitDepositForPower(ctx context.Context, maddr address.Address, pci types.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) //perm:read - StateMinerInitialPledgeCollateral(ctx context.Context, maddr address.Address, pci types.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) //perm:read - StateVMCirculatingSupplyInternal(ctx context.Context, tsk types.TipSetKey) (types.CirculatingSupply, error) //perm:read - StateCirculatingSupply(ctx context.Context, tsk types.TipSetKey) (abi.TokenAmount, error) //perm:read - StateMarketDeals(ctx context.Context, tsk types.TipSetKey) (map[string]*types.MarketDeal, error) //perm:read - StateMinerActiveSectors(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]*lminer.SectorOnChainInfo, error) //perm:read - StateLookupID(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) //perm:read - StateListMiners(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) //perm:read - StateListActors(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) //perm:read - StateMinerPower(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*types.MinerPower, error) //perm:read - StateMinerAvailableBalance(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (big.Int, error) //perm:read - StateSectorExpiration(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk types.TipSetKey) (*lminer.SectorExpiration, error) //perm:read - StateChangedActors(context.Context, cid.Cid, cid.Cid) (map[string]types.Actor, error) //perm:read - StateMinerSectorCount(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.MinerSectors, error) //perm:read - StateMarketBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.MarketBalance, error) //perm:read - StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (types.DealCollateralBounds, error) //perm:read - StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) //perm:read + StateGetClaims(ctx context.Context, providerAddr address.Address, tsk types.TipSetKey) (map[types.ClaimId]types.Claim, error) //perm:read + StateMinerPreCommitDepositForPower(ctx context.Context, maddr address.Address, pci types.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) //perm:read + // StateMinerInitialPledgeCollateral attempts to calculate the initial pledge collateral based on a SectorPreCommitInfo. + // This method uses the DealIDs field in SectorPreCommitInfo to determine the amount of verified + // deal space in the sector in order to perform a QAP calculation. Since network version 22 and + // the introduction of DDO, the DealIDs field can no longer be used to reliably determine verified + // deal space; therefore, this method is deprecated. Use StateMinerInitialPledgeForSector instead + // and pass in the verified deal space directly. + // + // Deprecated: Use StateMinerInitialPledgeForSector instead. + StateMinerInitialPledgeCollateral(ctx context.Context, maddr address.Address, pci types.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) //perm:read + // StateMinerInitialPledgeForSector returns the initial pledge collateral for a given sector + // duration, size, and combined size of any verified pieces within the sector. This calculation + // depends on current network conditions (total power, total pledge and current rewards) at the + // given tipset. + StateMinerInitialPledgeForSector(ctx context.Context, sectorDuration abi.ChainEpoch, sectorSize abi.SectorSize, verifiedSize uint64, tsk types.TipSetKey) (types.BigInt, error) //perm:read + StateVMCirculatingSupplyInternal(ctx context.Context, tsk types.TipSetKey) (types.CirculatingSupply, error) //perm:read + StateCirculatingSupply(ctx context.Context, tsk types.TipSetKey) (abi.TokenAmount, error) //perm:read + StateMarketDeals(ctx context.Context, tsk types.TipSetKey) (map[string]*types.MarketDeal, error) //perm:read + StateMinerActiveSectors(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]*lminer.SectorOnChainInfo, error) //perm:read + StateLookupID(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) //perm:read + StateListMiners(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) //perm:read + StateListActors(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) //perm:read + StateMinerPower(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*types.MinerPower, error) //perm:read + StateMinerAvailableBalance(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (big.Int, error) //perm:read + StateSectorExpiration(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk types.TipSetKey) (*lminer.SectorExpiration, error) //perm:read + StateChangedActors(context.Context, cid.Cid, cid.Cid) (map[string]types.Actor, error) //perm:read + StateMinerSectorCount(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.MinerSectors, error) //perm:read + StateMarketBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.MarketBalance, error) //perm:read + StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (types.DealCollateralBounds, error) //perm:read + StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) //perm:read } diff --git a/venus-shared/api/chain/v0/method.md b/venus-shared/api/chain/v0/method.md index 22c1ac6abc..75bd9fe55a 100644 --- a/venus-shared/api/chain/v0/method.md +++ b/venus-shared/api/chain/v0/method.md @@ -115,6 +115,7 @@ curl http://:/rpc/v0 -X POST -H "Content-Type: application/json" -H " * [StateMinerFaults](#stateminerfaults) * [StateMinerInfo](#stateminerinfo) * [StateMinerInitialPledgeCollateral](#stateminerinitialpledgecollateral) + * [StateMinerInitialPledgeForSector](#stateminerinitialpledgeforsector) * [StateMinerPartitions](#stateminerpartitions) * [StateMinerPower](#stateminerpower) * [StateMinerPreCommitDepositForPower](#stateminerprecommitdepositforpower) @@ -178,6 +179,7 @@ curl http://:/rpc/v0 -X POST -H "Content-Type: application/json" -H " * [ChainTipSetWeight](#chaintipsetweight) * [Concurrent](#concurrent) * [SetConcurrent](#setconcurrent) + * [SyncCheckpoint](#synccheckpoint) * [SyncIncomingBlocks](#syncincomingblocks) * [SyncState](#syncstate) * [SyncSubmitBlock](#syncsubmitblock) @@ -1221,7 +1223,7 @@ Perms: read Inputs: ```json [ - 23 + 24 ] ``` @@ -1236,7 +1238,7 @@ Perms: read Inputs: ```json [ - 23 + 24 ] ``` @@ -1661,7 +1663,8 @@ Response: "UpgradeWatermelonHeight": 10101, "UpgradeDragonHeight": 10101, "UpgradePhoenixHeight": 10101, - "UpgradeWaffleHeight": 10101 + "UpgradeWaffleHeight": 10101, + "UpgradeTuktukHeight": 10101 }, "Eip155ChainID": 123 } @@ -1779,7 +1782,7 @@ Inputs: ] ``` -Response: `23` +Response: `24` ### StateReplay @@ -3794,6 +3797,14 @@ Response: ``` ### StateMinerInitialPledgeCollateral +StateMinerInitialPledgeCollateral attempts to calculate the initial pledge collateral based on a SectorPreCommitInfo. +This method uses the DealIDs field in SectorPreCommitInfo to determine the amount of verified +deal space in the sector in order to perform a QAP calculation. Since network version 22 and +the introduction of DDO, the DealIDs field can no longer be used to reliably determine verified +deal space; therefore, this method is deprecated. Use StateMinerInitialPledgeForSector instead +and pass in the verified deal space directly. + +Deprecated: Use StateMinerInitialPledgeForSector instead. Perms: read @@ -3830,6 +3841,34 @@ Inputs: Response: `"0"` +### StateMinerInitialPledgeForSector +StateMinerInitialPledgeForSector returns the initial pledge collateral for a given sector +duration, size, and combined size of any verified pieces within the sector. This calculation +depends on current network conditions (total power, total pledge and current rewards) at the +given tipset. + + +Perms: read + +Inputs: +```json +[ + 10101, + 34359738368, + 42, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"0"` + ### StateMinerPartitions @@ -5689,6 +5728,28 @@ Inputs: Response: `{}` +### SyncCheckpoint +SyncCheckpoint marks a blocks as checkpointed, meaning that it won't ever fork away from it. + + +Perms: admin + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `{}` + ### SyncIncomingBlocks SyncIncomingBlocks returns a channel streaming incoming, potentially not yet synced block headers. diff --git a/venus-shared/api/chain/v0/mock/mock_fullnode.go b/venus-shared/api/chain/v0/mock/mock_fullnode.go index 2532426a2f..9d6b3c8f5d 100644 --- a/venus-shared/api/chain/v0/mock/mock_fullnode.go +++ b/venus-shared/api/chain/v0/mock/mock_fullnode.go @@ -2044,6 +2044,21 @@ func (mr *MockFullNodeMockRecorder) StateMinerInitialPledgeCollateral(arg0, arg1 return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerInitialPledgeCollateral", reflect.TypeOf((*MockFullNode)(nil).StateMinerInitialPledgeCollateral), arg0, arg1, arg2, arg3) } +// StateMinerInitialPledgeForSector mocks base method. +func (m *MockFullNode) StateMinerInitialPledgeForSector(arg0 context.Context, arg1 abi.ChainEpoch, arg2 abi.SectorSize, arg3 uint64, arg4 types0.TipSetKey) (big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerInitialPledgeForSector", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerInitialPledgeForSector indicates an expected call of StateMinerInitialPledgeForSector. +func (mr *MockFullNodeMockRecorder) StateMinerInitialPledgeForSector(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerInitialPledgeForSector", reflect.TypeOf((*MockFullNode)(nil).StateMinerInitialPledgeForSector), arg0, arg1, arg2, arg3, arg4) +} + // StateMinerPartitions mocks base method. func (m *MockFullNode) StateMinerPartitions(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3 types0.TipSetKey) ([]types0.Partition, error) { m.ctrl.T.Helper() @@ -2434,6 +2449,20 @@ func (mr *MockFullNodeMockRecorder) StateWaitMsgLimited(arg0, arg1, arg2, arg3 i return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateWaitMsgLimited", reflect.TypeOf((*MockFullNode)(nil).StateWaitMsgLimited), arg0, arg1, arg2, arg3) } +// SyncCheckpoint mocks base method. +func (m *MockFullNode) SyncCheckpoint(arg0 context.Context, arg1 types0.TipSetKey) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SyncCheckpoint", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// SyncCheckpoint indicates an expected call of SyncCheckpoint. +func (mr *MockFullNodeMockRecorder) SyncCheckpoint(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SyncCheckpoint", reflect.TypeOf((*MockFullNode)(nil).SyncCheckpoint), arg0, arg1) +} + // SyncIncomingBlocks mocks base method. func (m *MockFullNode) SyncIncomingBlocks(arg0 context.Context) (<-chan *types0.BlockHeader, error) { m.ctrl.T.Helper() diff --git a/venus-shared/api/chain/v0/proxy_gen.go b/venus-shared/api/chain/v0/proxy_gen.go index c1b6dd85d4..80c63ef76e 100644 --- a/venus-shared/api/chain/v0/proxy_gen.go +++ b/venus-shared/api/chain/v0/proxy_gen.go @@ -85,46 +85,47 @@ func (s *IBeaconStruct) BeaconGetEntry(p0 context.Context, p1 abi.ChainEpoch) (* type IMinerStateStruct struct { Internal struct { - StateAllMinerFaults func(ctx context.Context, lookback abi.ChainEpoch, ts types.TipSetKey) ([]*types.Fault, error) `perm:"read"` - StateChangedActors func(context.Context, cid.Cid, cid.Cid) (map[string]types.Actor, error) `perm:"read"` - StateCirculatingSupply func(ctx context.Context, tsk types.TipSetKey) (abi.TokenAmount, error) `perm:"read"` - StateDealProviderCollateralBounds func(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (types.DealCollateralBounds, error) `perm:"read"` - StateDecodeParams func(ctx context.Context, toAddr address.Address, method abi.MethodNum, params []byte, tsk types.TipSetKey) (interface{}, error) `perm:"read"` - StateGetAllocation func(ctx context.Context, clientAddr address.Address, allocationID types.AllocationId, tsk types.TipSetKey) (*types.Allocation, error) `perm:"read"` - StateGetAllocationForPendingDeal func(ctx context.Context, dealID abi.DealID, tsk types.TipSetKey) (*types.Allocation, error) `perm:"read"` - StateGetAllocations func(ctx context.Context, clientAddr address.Address, tsk types.TipSetKey) (map[types.AllocationId]types.Allocation, error) `perm:"read"` - StateGetClaim func(ctx context.Context, providerAddr address.Address, claimID types.ClaimId, tsk types.TipSetKey) (*types.Claim, error) `perm:"read"` - StateGetClaims func(ctx context.Context, providerAddr address.Address, tsk types.TipSetKey) (map[types.ClaimId]types.Claim, error) `perm:"read"` - StateListActors func(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) `perm:"read"` - StateListMessages func(ctx context.Context, match *types.MessageMatch, tsk types.TipSetKey, toht abi.ChainEpoch) ([]cid.Cid, error) `perm:"read"` - StateListMiners func(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) `perm:"read"` - StateLookupID func(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) `perm:"read"` - StateMarketBalance func(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.MarketBalance, error) `perm:"read"` - StateMarketDeals func(ctx context.Context, tsk types.TipSetKey) (map[string]*types.MarketDeal, error) `perm:"read"` - StateMarketStorageDeal func(ctx context.Context, dealID abi.DealID, tsk types.TipSetKey) (*types.MarketDeal, error) `perm:"read"` - StateMinerActiveSectors func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]*lminer.SectorOnChainInfo, error) `perm:"read"` - StateMinerAvailableBalance func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (big.Int, error) `perm:"read"` - StateMinerDeadlines func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]types.Deadline, error) `perm:"read"` - StateMinerFaults func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (bitfield.BitField, error) `perm:"read"` - StateMinerInfo func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (types.MinerInfo, error) `perm:"read"` - StateMinerInitialPledgeCollateral func(ctx context.Context, maddr address.Address, pci types.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) `perm:"read"` - StateMinerPartitions func(ctx context.Context, maddr address.Address, dlIdx uint64, tsk types.TipSetKey) ([]types.Partition, error) `perm:"read"` - StateMinerPower func(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*types.MinerPower, error) `perm:"read"` - StateMinerPreCommitDepositForPower func(ctx context.Context, maddr address.Address, pci types.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) `perm:"read"` - StateMinerProvingDeadline func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (*dline.Info, error) `perm:"read"` - StateMinerRecoveries func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (bitfield.BitField, error) `perm:"read"` - StateMinerSectorAllocated func(ctx context.Context, maddr address.Address, s abi.SectorNumber, tsk types.TipSetKey) (bool, error) `perm:"read"` - StateMinerSectorCount func(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.MinerSectors, error) `perm:"read"` - StateMinerSectorSize func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (abi.SectorSize, error) `perm:"read"` - StateMinerSectors func(ctx context.Context, maddr address.Address, sectorNos *bitfield.BitField, tsk types.TipSetKey) ([]*lminer.SectorOnChainInfo, error) `perm:"read"` - StateMinerWorkerAddress func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (address.Address, error) `perm:"read"` - StateReadState func(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*types.ActorState, error) `perm:"read"` - StateSectorExpiration func(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk types.TipSetKey) (*lminer.SectorExpiration, error) `perm:"read"` - StateSectorGetInfo func(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (*lminer.SectorOnChainInfo, error) `perm:"read"` - StateSectorPartition func(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk types.TipSetKey) (*lminer.SectorLocation, error) `perm:"read"` - StateSectorPreCommitInfo func(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (types.SectorPreCommitOnChainInfo, error) `perm:"read"` - StateVMCirculatingSupplyInternal func(ctx context.Context, tsk types.TipSetKey) (types.CirculatingSupply, error) `perm:"read"` - StateVerifiedClientStatus func(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) `perm:"read"` + StateAllMinerFaults func(ctx context.Context, lookback abi.ChainEpoch, ts types.TipSetKey) ([]*types.Fault, error) `perm:"read"` + StateChangedActors func(context.Context, cid.Cid, cid.Cid) (map[string]types.Actor, error) `perm:"read"` + StateCirculatingSupply func(ctx context.Context, tsk types.TipSetKey) (abi.TokenAmount, error) `perm:"read"` + StateDealProviderCollateralBounds func(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (types.DealCollateralBounds, error) `perm:"read"` + StateDecodeParams func(ctx context.Context, toAddr address.Address, method abi.MethodNum, params []byte, tsk types.TipSetKey) (interface{}, error) `perm:"read"` + StateGetAllocation func(ctx context.Context, clientAddr address.Address, allocationID types.AllocationId, tsk types.TipSetKey) (*types.Allocation, error) `perm:"read"` + StateGetAllocationForPendingDeal func(ctx context.Context, dealID abi.DealID, tsk types.TipSetKey) (*types.Allocation, error) `perm:"read"` + StateGetAllocations func(ctx context.Context, clientAddr address.Address, tsk types.TipSetKey) (map[types.AllocationId]types.Allocation, error) `perm:"read"` + StateGetClaim func(ctx context.Context, providerAddr address.Address, claimID types.ClaimId, tsk types.TipSetKey) (*types.Claim, error) `perm:"read"` + StateGetClaims func(ctx context.Context, providerAddr address.Address, tsk types.TipSetKey) (map[types.ClaimId]types.Claim, error) `perm:"read"` + StateListActors func(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) `perm:"read"` + StateListMessages func(ctx context.Context, match *types.MessageMatch, tsk types.TipSetKey, toht abi.ChainEpoch) ([]cid.Cid, error) `perm:"read"` + StateListMiners func(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) `perm:"read"` + StateLookupID func(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) `perm:"read"` + StateMarketBalance func(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.MarketBalance, error) `perm:"read"` + StateMarketDeals func(ctx context.Context, tsk types.TipSetKey) (map[string]*types.MarketDeal, error) `perm:"read"` + StateMarketStorageDeal func(ctx context.Context, dealID abi.DealID, tsk types.TipSetKey) (*types.MarketDeal, error) `perm:"read"` + StateMinerActiveSectors func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]*lminer.SectorOnChainInfo, error) `perm:"read"` + StateMinerAvailableBalance func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (big.Int, error) `perm:"read"` + StateMinerDeadlines func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]types.Deadline, error) `perm:"read"` + StateMinerFaults func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (bitfield.BitField, error) `perm:"read"` + StateMinerInfo func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (types.MinerInfo, error) `perm:"read"` + StateMinerInitialPledgeCollateral func(ctx context.Context, maddr address.Address, pci types.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) `perm:"read"` + StateMinerInitialPledgeForSector func(ctx context.Context, sectorDuration abi.ChainEpoch, sectorSize abi.SectorSize, verifiedSize uint64, tsk types.TipSetKey) (types.BigInt, error) `perm:"read"` + StateMinerPartitions func(ctx context.Context, maddr address.Address, dlIdx uint64, tsk types.TipSetKey) ([]types.Partition, error) `perm:"read"` + StateMinerPower func(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*types.MinerPower, error) `perm:"read"` + StateMinerPreCommitDepositForPower func(ctx context.Context, maddr address.Address, pci types.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) `perm:"read"` + StateMinerProvingDeadline func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (*dline.Info, error) `perm:"read"` + StateMinerRecoveries func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (bitfield.BitField, error) `perm:"read"` + StateMinerSectorAllocated func(ctx context.Context, maddr address.Address, s abi.SectorNumber, tsk types.TipSetKey) (bool, error) `perm:"read"` + StateMinerSectorCount func(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.MinerSectors, error) `perm:"read"` + StateMinerSectorSize func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (abi.SectorSize, error) `perm:"read"` + StateMinerSectors func(ctx context.Context, maddr address.Address, sectorNos *bitfield.BitField, tsk types.TipSetKey) ([]*lminer.SectorOnChainInfo, error) `perm:"read"` + StateMinerWorkerAddress func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (address.Address, error) `perm:"read"` + StateReadState func(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*types.ActorState, error) `perm:"read"` + StateSectorExpiration func(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk types.TipSetKey) (*lminer.SectorExpiration, error) `perm:"read"` + StateSectorGetInfo func(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (*lminer.SectorOnChainInfo, error) `perm:"read"` + StateSectorPartition func(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk types.TipSetKey) (*lminer.SectorLocation, error) `perm:"read"` + StateSectorPreCommitInfo func(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (types.SectorPreCommitOnChainInfo, error) `perm:"read"` + StateVMCirculatingSupplyInternal func(ctx context.Context, tsk types.TipSetKey) (types.CirculatingSupply, error) `perm:"read"` + StateVerifiedClientStatus func(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) `perm:"read"` } } @@ -197,6 +198,9 @@ func (s *IMinerStateStruct) StateMinerInfo(p0 context.Context, p1 address.Addres func (s *IMinerStateStruct) StateMinerInitialPledgeCollateral(p0 context.Context, p1 address.Address, p2 types.SectorPreCommitInfo, p3 types.TipSetKey) (big.Int, error) { return s.Internal.StateMinerInitialPledgeCollateral(p0, p1, p2, p3) } +func (s *IMinerStateStruct) StateMinerInitialPledgeForSector(p0 context.Context, p1 abi.ChainEpoch, p2 abi.SectorSize, p3 uint64, p4 types.TipSetKey) (types.BigInt, error) { + return s.Internal.StateMinerInitialPledgeForSector(p0, p1, p2, p3, p4) +} func (s *IMinerStateStruct) StateMinerPartitions(p0 context.Context, p1 address.Address, p2 uint64, p3 types.TipSetKey) ([]types.Partition, error) { return s.Internal.StateMinerPartitions(p0, p1, p2, p3) } @@ -713,6 +717,7 @@ type ISyncerStruct struct { ChainTipSetWeight func(ctx context.Context, tsk types.TipSetKey) (big.Int, error) `perm:"read"` Concurrent func(ctx context.Context) int64 `perm:"read"` SetConcurrent func(ctx context.Context, concurrent int64) error `perm:"admin"` + SyncCheckpoint func(ctx context.Context, tsk types.TipSetKey) error `perm:"admin"` SyncIncomingBlocks func(ctx context.Context) (<-chan *types.BlockHeader, error) `perm:"read"` SyncState func(ctx context.Context) (*types.SyncState, error) `perm:"read"` SyncSubmitBlock func(ctx context.Context, blk *types.BlockMsg) error `perm:"write"` @@ -730,6 +735,9 @@ func (s *ISyncerStruct) Concurrent(p0 context.Context) int64 { return s.Internal func (s *ISyncerStruct) SetConcurrent(p0 context.Context, p1 int64) error { return s.Internal.SetConcurrent(p0, p1) } +func (s *ISyncerStruct) SyncCheckpoint(p0 context.Context, p1 types.TipSetKey) error { + return s.Internal.SyncCheckpoint(p0, p1) +} func (s *ISyncerStruct) SyncIncomingBlocks(p0 context.Context) (<-chan *types.BlockHeader, error) { return s.Internal.SyncIncomingBlocks(p0) } diff --git a/venus-shared/api/chain/v0/syncer.go b/venus-shared/api/chain/v0/syncer.go index d3a97ee14a..a5a69d71fd 100644 --- a/venus-shared/api/chain/v0/syncer.go +++ b/venus-shared/api/chain/v0/syncer.go @@ -19,4 +19,6 @@ type ISyncer interface { // SyncIncomingBlocks returns a channel streaming incoming, potentially not // yet synced block headers. SyncIncomingBlocks(ctx context.Context) (<-chan *types.BlockHeader, error) //perm:read + // SyncCheckpoint marks a blocks as checkpointed, meaning that it won't ever fork away from it. + SyncCheckpoint(ctx context.Context, tsk types.TipSetKey) error //perm:admin } diff --git a/venus-shared/api/chain/v1/chain.go b/venus-shared/api/chain/v1/chain.go index f2b4907218..e145ca8f86 100644 --- a/venus-shared/api/chain/v1/chain.go +++ b/venus-shared/api/chain/v1/chain.go @@ -49,9 +49,10 @@ type IChainInfo interface { StateGetRandomnessDigestFromTickets(ctx context.Context, randEpoch abi.ChainEpoch, tsk types.TipSetKey) (abi.Randomness, error) //perm:read // StateGetRandomnessDigestFromBeacon is used to sample the beacon for randomness. StateGetRandomnessDigestFromBeacon(ctx context.Context, randEpoch abi.ChainEpoch, tsk types.TipSetKey) (abi.Randomness, error) //perm:read - // StateGetBeaconEntry returns the beacon entry for the given filecoin epoch. If - // the entry has not yet been produced, the call will block until the entry - // becomes available + // StateGetBeaconEntry returns the beacon entry for the given filecoin epoch + // by using the recorded entries on the chain. If the entry for the requested + // epoch has not yet been produced, the call will block until the entry + // becomes available. StateGetBeaconEntry(ctx context.Context, epoch abi.ChainEpoch) (*types.BeaconEntry, error) //perm:read ChainGetBlock(ctx context.Context, id cid.Cid) (*types.BlockHeader, error) //perm:read ChainGetMessage(ctx context.Context, msgID cid.Cid) (*types.Message, error) //perm:read @@ -185,30 +186,43 @@ type IMinerState interface { StateMarketStorageDeal(ctx context.Context, dealID abi.DealID, tsk types.TipSetKey) (*types.MarketDeal, error) //perm:read // StateGetAllocationForPendingDeal returns the allocation for a given deal ID of a pending deal. Returns nil if // pending allocation is not found. - StateGetAllocationForPendingDeal(ctx context.Context, dealID abi.DealID, tsk types.TipSetKey) (*types.Allocation, error) //perm:read + StateGetAllocationForPendingDeal(ctx context.Context, dealID abi.DealID, tsk types.TipSetKey) (*verifreg.Allocation, error) //perm:read // StateGetAllocationIdForPendingDeal is like StateGetAllocationForPendingDeal except it returns the allocation ID StateGetAllocationIdForPendingDeal(ctx context.Context, dealID abi.DealID, tsk types.TipSetKey) (verifreg.AllocationId, error) //perm:read // StateGetAllocation returns the allocation for a given address and allocation ID. - StateGetAllocation(ctx context.Context, clientAddr address.Address, allocationID types.AllocationId, tsk types.TipSetKey) (*types.Allocation, error) //perm:read + StateGetAllocation(ctx context.Context, clientAddr address.Address, allocationID verifreg.AllocationId, tsk types.TipSetKey) (*verifreg.Allocation, error) //perm:read // StateGetAllAllocations returns the all the allocations available in verified registry actor. - StateGetAllAllocations(ctx context.Context, tsk types.TipSetKey) (map[types.AllocationId]types.Allocation, error) //perm:read + StateGetAllAllocations(ctx context.Context, tsk types.TipSetKey) (map[verifreg.AllocationId]verifreg.Allocation, error) //perm:read // StateGetAllocations returns the all the allocations for a given client. - StateGetAllocations(ctx context.Context, clientAddr address.Address, tsk types.TipSetKey) (map[types.AllocationId]types.Allocation, error) //perm:read + StateGetAllocations(ctx context.Context, clientAddr address.Address, tsk types.TipSetKey) (map[verifreg.AllocationId]verifreg.Allocation, error) //perm:read // StateGetClaim returns the claim for a given address and claim ID. - StateGetClaim(ctx context.Context, providerAddr address.Address, claimID types.ClaimId, tsk types.TipSetKey) (*types.Claim, error) //perm:read + StateGetClaim(ctx context.Context, providerAddr address.Address, claimID verifreg.ClaimId, tsk types.TipSetKey) (*verifreg.Claim, error) //perm:read // StateGetClaims returns the all the claims for a given provider. - StateGetClaims(ctx context.Context, providerAddr address.Address, tsk types.TipSetKey) (map[types.ClaimId]types.Claim, error) //perm:read + StateGetClaims(ctx context.Context, providerAddr address.Address, tsk types.TipSetKey) (map[verifreg.ClaimId]verifreg.Claim, error) //perm:read // StateGetAllClaims returns the all the claims available in verified registry actor. - StateGetAllClaims(ctx context.Context, tsk types.TipSetKey) (map[types.ClaimId]types.Claim, error) //perm:read + StateGetAllClaims(ctx context.Context, tsk types.TipSetKey) (map[verifreg.ClaimId]verifreg.Claim, error) //perm:read // StateComputeDataCID computes DataCID from a set of on-chain deals StateComputeDataCID(ctx context.Context, maddr address.Address, sectorType abi.RegisteredSealProof, deals []abi.DealID, tsk types.TipSetKey) (cid.Cid, error) //perm:read StateMinerPreCommitDepositForPower(ctx context.Context, maddr address.Address, pci types.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) //perm:read - StateMinerInitialPledgeCollateral(ctx context.Context, maddr address.Address, pci types.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) //perm:read - StateVMCirculatingSupplyInternal(ctx context.Context, tsk types.TipSetKey) (types.CirculatingSupply, error) //perm:read - StateCirculatingSupply(ctx context.Context, tsk types.TipSetKey) (abi.TokenAmount, error) //perm:read - StateMarketDeals(ctx context.Context, tsk types.TipSetKey) (map[string]*types.MarketDeal, error) //perm:read - StateMinerActiveSectors(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]*lminer.SectorOnChainInfo, error) //perm:read - StateLookupID(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) //perm:read + // StateMinerInitialPledgeCollateral attempts to calculate the initial pledge collateral based on a SectorPreCommitInfo. + // This method uses the DealIDs field in SectorPreCommitInfo to determine the amount of verified + // deal space in the sector in order to perform a QAP calculation. Since network version 22 and + // the introduction of DDO, the DealIDs field can no longer be used to reliably determine verified + // deal space; therefore, this method is deprecated. Use StateMinerInitialPledgeForSector instead + // and pass in the verified deal space directly. + // + // Deprecated: Use StateMinerInitialPledgeForSector instead. + StateMinerInitialPledgeCollateral(ctx context.Context, maddr address.Address, pci types.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) //perm:read + // StateMinerInitialPledgeForSector returns the initial pledge collateral for a given sector + // duration, size, and combined size of any verified pieces within the sector. This calculation + // depends on current network conditions (total power, total pledge and current rewards) at the + // given tipset. + StateMinerInitialPledgeForSector(ctx context.Context, sectorDuration abi.ChainEpoch, sectorSize abi.SectorSize, verifiedSize uint64, tsk types.TipSetKey) (types.BigInt, error) //perm:read + StateVMCirculatingSupplyInternal(ctx context.Context, tsk types.TipSetKey) (types.CirculatingSupply, error) //perm:read + StateCirculatingSupply(ctx context.Context, tsk types.TipSetKey) (abi.TokenAmount, error) //perm:read + StateMarketDeals(ctx context.Context, tsk types.TipSetKey) (map[string]*types.MarketDeal, error) //perm:read + StateMinerActiveSectors(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]*lminer.SectorOnChainInfo, error) //perm:read + StateLookupID(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) //perm:read // StateLookupRobustAddress returns the public key address of the given ID address for non-account addresses (multisig, miners etc) StateLookupRobustAddress(context.Context, address.Address, types.TipSetKey) (address.Address, error) //perm:read StateListMiners(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) //perm:read diff --git a/venus-shared/api/chain/v1/f3.go b/venus-shared/api/chain/v1/f3.go index c8c38e70f9..a3d7b3664a 100644 --- a/venus-shared/api/chain/v1/f3.go +++ b/venus-shared/api/chain/v1/f3.go @@ -2,30 +2,57 @@ package v1 import ( "context" - "time" "github.com/filecoin-project/go-address" "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/venus/venus-shared/types" ) type IF3 interface { //*********************************** 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 + // F3GetOrRenewParticipationTicket retrieves or renews a participation ticket + // necessary for a miner to engage in the F3 consensus process for the given + // number of instances. + // + // This function accepts an optional previous ticket. If provided, a new ticket + // will be issued only under one the following conditions: + // 1. The previous ticket has expired. + // 2. The issuer of the previous ticket matches the node processing this + // request. + // + // If there is an issuer mismatch (ErrF3ParticipationIssuerMismatch), the miner + // must retry obtaining a new ticket to ensure it is only participating in one F3 + // instance at any time. If the number of instances is beyond the maximum leasable + // participation instances accepted by the node ErrF3ParticipationTooManyInstances + // is returned. + // + // Note: Successfully acquiring a ticket alone does not constitute participation. + // The retrieved ticket must be used to invoke F3Participate to actively engage + // in the F3 consensus process. + F3GetOrRenewParticipationTicket(ctx context.Context, minerID address.Address, previous types.F3ParticipationTicket, instances uint64) (types.F3ParticipationTicket, error) //perm:sign + // F3Participate enrolls a storage provider in the F3 consensus process using a + // provided participation ticket. This ticket grants a temporary lease that enables + // the provider to sign transactions as part of the F3 consensus. + // + // The function verifies the ticket's validity and checks if the ticket's issuer + // aligns with the current node. If there is an issuer mismatch + // (ErrF3ParticipationIssuerMismatch), the provider should retry with the same + // ticket, assuming the issue is due to transient network problems or operational + // deployment conditions. If the ticket is invalid + // (ErrF3ParticipationTicketInvalid) or has expired + // (ErrF3ParticipationTicketExpired), the provider must obtain a new ticket by + // calling F3GetOrRenewParticipationTicket. + // + // The start instance associated to the given ticket cannot be less than the + // start instance of any existing lease held by the miner. Otherwise, + // ErrF3ParticipationTicketStartBeforeExisting is returned. In this case, the + // miner should acquire a new ticket before attempting to participate again. + // + // For details on obtaining or renewing a ticket, see F3GetOrRenewParticipationTicket. + F3Participate(ctx context.Context, ticket types.F3ParticipationTicket) (types.F3ParticipationLease, 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 @@ -34,4 +61,11 @@ type IF3 interface { 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 + // F3GetManifest returns the current manifest being used for F3 + F3GetManifest(ctx context.Context) (*manifest.Manifest, error) //perm:read + // F3IsRunning returns true if the F3 instance is running, false if it's not running but + // it's enabled, and an error when disabled entirely. + F3IsRunning(ctx context.Context) (bool, error) //perm:read + // F3GetProgress returns the progress of the current F3 instance in terms of instance ID, round and phase. + F3GetProgress(ctx context.Context) (gpbft.Instant, error) //perm:read } diff --git a/venus-shared/api/chain/v1/method.md b/venus-shared/api/chain/v1/method.md index d6f95d4bdd..fba81e36c1 100644 --- a/venus-shared/api/chain/v1/method.md +++ b/venus-shared/api/chain/v1/method.md @@ -119,6 +119,10 @@ curl http://:/rpc/v1 -X POST -H "Content-Type: application/json" -H " * [F3GetECPowerTable](#f3getecpowertable) * [F3GetF3PowerTable](#f3getf3powertable) * [F3GetLatestCertificate](#f3getlatestcertificate) + * [F3GetManifest](#f3getmanifest) + * [F3GetOrRenewParticipationTicket](#f3getorrenewparticipationticket) + * [F3GetProgress](#f3getprogress) + * [F3IsRunning](#f3isrunning) * [F3Participate](#f3participate) * [Market](#market) * [StateMarketParticipants](#statemarketparticipants) @@ -179,6 +183,7 @@ curl http://:/rpc/v1 -X POST -H "Content-Type: application/json" -H " * [StateMinerFaults](#stateminerfaults) * [StateMinerInfo](#stateminerinfo) * [StateMinerInitialPledgeCollateral](#stateminerinitialpledgecollateral) + * [StateMinerInitialPledgeForSector](#stateminerinitialpledgeforsector) * [StateMinerPartitions](#stateminerpartitions) * [StateMinerPower](#stateminerpower) * [StateMinerPreCommitDepositForPower](#stateminerprecommitdepositforpower) @@ -243,6 +248,7 @@ curl http://:/rpc/v1 -X POST -H "Content-Type: application/json" -H " * [ChainTipSetWeight](#chaintipsetweight) * [Concurrent](#concurrent) * [SetConcurrent](#setconcurrent) + * [SyncCheckpoint](#synccheckpoint) * [SyncIncomingBlocks](#syncincomingblocks) * [SyncState](#syncstate) * [SyncSubmitBlock](#syncsubmitblock) @@ -1404,7 +1410,7 @@ Perms: read Inputs: ```json [ - 23 + 24 ] ``` @@ -1419,7 +1425,7 @@ Perms: read Inputs: ```json [ - 23 + 24 ] ``` @@ -1799,9 +1805,10 @@ Response: ``` ### StateGetBeaconEntry -StateGetBeaconEntry returns the beacon entry for the given filecoin epoch. If -the entry has not yet been produced, the call will block until the entry -becomes available +StateGetBeaconEntry returns the beacon entry for the given filecoin epoch +by using the recorded entries on the chain. If the entry for the requested +epoch has not yet been produced, the call will block until the entry +becomes available. Perms: read @@ -1867,7 +1874,8 @@ Response: "UpgradeWatermelonHeight": 10101, "UpgradeDragonHeight": 10101, "UpgradePhoenixHeight": 10101, - "UpgradeWaffleHeight": 10101 + "UpgradeWaffleHeight": 10101, + "UpgradeTuktukHeight": 10101 }, "Eip155ChainID": 123 } @@ -1995,7 +2003,7 @@ Inputs: ] ``` -Response: `23` +Response: `24` ### StateReplay @@ -3549,7 +3557,54 @@ Response: } ``` -### F3Participate +### F3GetManifest +F3GetManifest returns the current manifest being used for F3 + + +Perms: read + +Inputs: `[]` + +Response: +```json +{ + "Pause": false, + "ProtocolVersion": 0, + "InitialInstance": 0, + "BootstrapEpoch": 0, + "NetworkName": "", + "ExplicitPower": null, + "IgnoreECPower": false, + "InitialPowerTable": null, + "CommitteeLookback": 0, + "CatchUpAlignment": 0, + "Gpbft": { + "Delta": 0, + "DeltaBackOffExponent": 0, + "MaxLookaheadRounds": 0, + "RebroadcastBackoffBase": 0, + "RebroadcastBackoffExponent": 0, + "RebroadcastBackoffSpread": 0, + "RebroadcastBackoffMax": 0 + }, + "EC": { + "Period": 0, + "Finality": 0, + "DelayMultiplier": 0, + "BaseDecisionBackoffTable": null, + "HeadLookback": 0, + "Finalize": false + }, + "CertificateExchange": { + "ClientRequestTimeout": 0, + "ServerRequestTimeout": 0, + "MinimumPollInterval": 0, + "MaximumPollInterval": 0 + } +} +``` + +### F3GetOrRenewParticipationTicket *********************************** ALL F3 APIs below are not stable & subject to change *********************************** @@ -3559,13 +3614,83 @@ Inputs: ```json [ "f01234", - "0001-01-01T00:00:00Z", - "0001-01-01T00:00:00Z" + "Bw==", + 42 ] ``` +Response: `"Bw=="` + +### F3GetProgress +F3GetProgress returns the progress of the current F3 instance in terms of instance ID, round and phase. + + +Perms: read + +Inputs: `[]` + +Response: +```json +{ + "ID": 42, + "Round": 42, + "Phase": 0 +} +``` + +### F3IsRunning +F3IsRunning returns true if the F3 instance is running, false if it's not running but +it's enabled, and an error when disabled entirely. + + +Perms: read + +Inputs: `[]` + Response: `true` +### F3Participate +F3Participate enrolls a storage provider in the F3 consensus process using a +provided participation ticket. This ticket grants a temporary lease that enables +the provider to sign transactions as part of the F3 consensus. + +The function verifies the ticket's validity and checks if the ticket's issuer +aligns with the current node. If there is an issuer mismatch +(ErrF3ParticipationIssuerMismatch), the provider should retry with the same +ticket, assuming the issue is due to transient network problems or operational +deployment conditions. If the ticket is invalid +(ErrF3ParticipationTicketInvalid) or has expired +(ErrF3ParticipationTicketExpired), the provider must obtain a new ticket by +calling F3GetOrRenewParticipationTicket. + +The start instance associated to the given ticket cannot be less than the +start instance of any existing lease held by the miner. Otherwise, +ErrF3ParticipationTicketStartBeforeExisting is returned. In this case, the +miner should acquire a new ticket before attempting to participate again. + +For details on obtaining or renewing a ticket, see F3GetOrRenewParticipationTicket. + + +Perms: sign + +Inputs: +```json +[ + "Bw==" +] +``` + +Response: +```json +{ + "Network": "filecoin", + "Issuer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "MinerID": 42, + "FromInstance": 42, + "ValidityTerm": 42 +} +``` + ## Market ### StateMarketParticipants @@ -5464,6 +5589,14 @@ Response: ``` ### StateMinerInitialPledgeCollateral +StateMinerInitialPledgeCollateral attempts to calculate the initial pledge collateral based on a SectorPreCommitInfo. +This method uses the DealIDs field in SectorPreCommitInfo to determine the amount of verified +deal space in the sector in order to perform a QAP calculation. Since network version 22 and +the introduction of DDO, the DealIDs field can no longer be used to reliably determine verified +deal space; therefore, this method is deprecated. Use StateMinerInitialPledgeForSector instead +and pass in the verified deal space directly. + +Deprecated: Use StateMinerInitialPledgeForSector instead. Perms: read @@ -5500,6 +5633,34 @@ Inputs: Response: `"0"` +### StateMinerInitialPledgeForSector +StateMinerInitialPledgeForSector returns the initial pledge collateral for a given sector +duration, size, and combined size of any verified pieces within the sector. This calculation +depends on current network conditions (total power, total pledge and current rewards) at the +given tipset. + + +Perms: read + +Inputs: +```json +[ + 10101, + 34359738368, + 42, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"0"` + ### StateMinerPartitions @@ -7396,6 +7557,28 @@ Inputs: Response: `{}` +### SyncCheckpoint +SyncCheckpoint marks a blocks as checkpointed, meaning that it won't ever fork away from it. + + +Perms: admin + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `{}` + ### SyncIncomingBlocks SyncIncomingBlocks returns a channel streaming incoming, potentially not yet synced block headers. diff --git a/venus-shared/api/chain/v1/mock/mock_fullnode.go b/venus-shared/api/chain/v1/mock/mock_fullnode.go index b8dde54a8d..4461c949a7 100644 --- a/venus-shared/api/chain/v1/mock/mock_fullnode.go +++ b/venus-shared/api/chain/v1/mock/mock_fullnode.go @@ -14,6 +14,7 @@ import ( bitfield "github.com/filecoin-project/go-bitfield" certs "github.com/filecoin-project/go-f3/certs" gpbft "github.com/filecoin-project/go-f3/gpbft" + manifest "github.com/filecoin-project/go-f3/manifest" jsonrpc "github.com/filecoin-project/go-jsonrpc" abi "github.com/filecoin-project/go-state-types/abi" big "github.com/filecoin-project/go-state-types/big" @@ -1118,19 +1119,79 @@ func (mr *MockFullNodeMockRecorder) F3GetLatestCertificate(arg0 interface{}) *go 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) { +// F3GetManifest mocks base method. +func (m *MockFullNode) F3GetManifest(arg0 context.Context) (*manifest.Manifest, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "F3GetManifest", arg0) + ret0, _ := ret[0].(*manifest.Manifest) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// F3GetManifest indicates an expected call of F3GetManifest. +func (mr *MockFullNodeMockRecorder) F3GetManifest(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "F3GetManifest", reflect.TypeOf((*MockFullNode)(nil).F3GetManifest), arg0) +} + +// F3GetOrRenewParticipationTicket mocks base method. +func (m *MockFullNode) F3GetOrRenewParticipationTicket(arg0 context.Context, arg1 address.Address, arg2 types0.F3ParticipationTicket, arg3 uint64) (types0.F3ParticipationTicket, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "F3GetOrRenewParticipationTicket", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(types0.F3ParticipationTicket) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// F3GetOrRenewParticipationTicket indicates an expected call of F3GetOrRenewParticipationTicket. +func (mr *MockFullNodeMockRecorder) F3GetOrRenewParticipationTicket(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "F3GetOrRenewParticipationTicket", reflect.TypeOf((*MockFullNode)(nil).F3GetOrRenewParticipationTicket), arg0, arg1, arg2, arg3) +} + +// F3GetProgress mocks base method. +func (m *MockFullNode) F3GetProgress(arg0 context.Context) (gpbft.Instant, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "F3Participate", arg0, arg1, arg2, arg3) + ret := m.ctrl.Call(m, "F3GetProgress", arg0) + ret0, _ := ret[0].(gpbft.Instant) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// F3GetProgress indicates an expected call of F3GetProgress. +func (mr *MockFullNodeMockRecorder) F3GetProgress(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "F3GetProgress", reflect.TypeOf((*MockFullNode)(nil).F3GetProgress), arg0) +} + +// F3IsRunning mocks base method. +func (m *MockFullNode) F3IsRunning(arg0 context.Context) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "F3IsRunning", arg0) ret0, _ := ret[0].(bool) ret1, _ := ret[1].(error) return ret0, ret1 } +// F3IsRunning indicates an expected call of F3IsRunning. +func (mr *MockFullNodeMockRecorder) F3IsRunning(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "F3IsRunning", reflect.TypeOf((*MockFullNode)(nil).F3IsRunning), arg0) +} + +// F3Participate mocks base method. +func (m *MockFullNode) F3Participate(arg0 context.Context, arg1 types0.F3ParticipationTicket) (types0.F3ParticipationLease, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "F3Participate", arg0, arg1) + ret0, _ := ret[0].(types0.F3ParticipationLease) + 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 { +func (mr *MockFullNodeMockRecorder) F3Participate(arg0, arg1 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) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "F3Participate", reflect.TypeOf((*MockFullNode)(nil).F3Participate), arg0, arg1) } // FilecoinAddressToEthAddress mocks base method. @@ -2978,6 +3039,21 @@ func (mr *MockFullNodeMockRecorder) StateMinerInitialPledgeCollateral(arg0, arg1 return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerInitialPledgeCollateral", reflect.TypeOf((*MockFullNode)(nil).StateMinerInitialPledgeCollateral), arg0, arg1, arg2, arg3) } +// StateMinerInitialPledgeForSector mocks base method. +func (m *MockFullNode) StateMinerInitialPledgeForSector(arg0 context.Context, arg1 abi.ChainEpoch, arg2 abi.SectorSize, arg3 uint64, arg4 types0.TipSetKey) (big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerInitialPledgeForSector", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerInitialPledgeForSector indicates an expected call of StateMinerInitialPledgeForSector. +func (mr *MockFullNodeMockRecorder) StateMinerInitialPledgeForSector(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerInitialPledgeForSector", reflect.TypeOf((*MockFullNode)(nil).StateMinerInitialPledgeForSector), arg0, arg1, arg2, arg3, arg4) +} + // StateMinerPartitions mocks base method. func (m *MockFullNode) StateMinerPartitions(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3 types0.TipSetKey) ([]types0.Partition, error) { m.ctrl.T.Helper() @@ -3353,6 +3429,20 @@ func (mr *MockFullNodeMockRecorder) SubscribeActorEventsRaw(arg0, arg1 interface return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SubscribeActorEventsRaw", reflect.TypeOf((*MockFullNode)(nil).SubscribeActorEventsRaw), arg0, arg1) } +// SyncCheckpoint mocks base method. +func (m *MockFullNode) SyncCheckpoint(arg0 context.Context, arg1 types0.TipSetKey) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SyncCheckpoint", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// SyncCheckpoint indicates an expected call of SyncCheckpoint. +func (mr *MockFullNodeMockRecorder) SyncCheckpoint(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SyncCheckpoint", reflect.TypeOf((*MockFullNode)(nil).SyncCheckpoint), arg0, arg1) +} + // SyncIncomingBlocks mocks base method. func (m *MockFullNode) SyncIncomingBlocks(arg0 context.Context) (<-chan *types0.BlockHeader, error) { m.ctrl.T.Helper() diff --git a/venus-shared/api/chain/v1/proxy_gen.go b/venus-shared/api/chain/v1/proxy_gen.go index df66b2b84f..abb7cef208 100644 --- a/venus-shared/api/chain/v1/proxy_gen.go +++ b/venus-shared/api/chain/v1/proxy_gen.go @@ -10,6 +10,7 @@ import ( bitfield "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-f3/manifest" jsonrpc "github.com/filecoin-project/go-jsonrpc" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" @@ -80,53 +81,54 @@ func (s *IActorStruct) StateGetActor(p0 context.Context, p1 address.Address, p2 type IMinerStateStruct struct { Internal struct { - StateAllMinerFaults func(ctx context.Context, lookback abi.ChainEpoch, ts types.TipSetKey) ([]*types.Fault, error) `perm:"read"` - StateChangedActors func(context.Context, cid.Cid, cid.Cid) (map[string]types.Actor, error) `perm:"read"` - StateCirculatingSupply func(ctx context.Context, tsk types.TipSetKey) (abi.TokenAmount, error) `perm:"read"` - StateComputeDataCID func(ctx context.Context, maddr address.Address, sectorType abi.RegisteredSealProof, deals []abi.DealID, tsk types.TipSetKey) (cid.Cid, error) `perm:"read"` - StateDealProviderCollateralBounds func(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (types.DealCollateralBounds, error) `perm:"read"` - StateDecodeParams func(ctx context.Context, toAddr address.Address, method abi.MethodNum, params []byte, tsk types.TipSetKey) (interface{}, error) `perm:"read"` - StateEncodeParams func(ctx context.Context, toActCode cid.Cid, method abi.MethodNum, params json.RawMessage) ([]byte, error) `perm:"read"` - StateGetAllAllocations func(ctx context.Context, tsk types.TipSetKey) (map[types.AllocationId]types.Allocation, error) `perm:"read"` - StateGetAllClaims func(ctx context.Context, tsk types.TipSetKey) (map[types.ClaimId]types.Claim, error) `perm:"read"` - StateGetAllocation func(ctx context.Context, clientAddr address.Address, allocationID types.AllocationId, tsk types.TipSetKey) (*types.Allocation, error) `perm:"read"` - StateGetAllocationForPendingDeal func(ctx context.Context, dealID abi.DealID, tsk types.TipSetKey) (*types.Allocation, error) `perm:"read"` - StateGetAllocationIdForPendingDeal func(ctx context.Context, dealID abi.DealID, tsk types.TipSetKey) (verifreg.AllocationId, error) `perm:"read"` - StateGetAllocations func(ctx context.Context, clientAddr address.Address, tsk types.TipSetKey) (map[types.AllocationId]types.Allocation, error) `perm:"read"` - StateGetClaim func(ctx context.Context, providerAddr address.Address, claimID types.ClaimId, tsk types.TipSetKey) (*types.Claim, error) `perm:"read"` - StateGetClaims func(ctx context.Context, providerAddr address.Address, tsk types.TipSetKey) (map[types.ClaimId]types.Claim, error) `perm:"read"` - StateListActors func(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) `perm:"read"` - StateListMessages func(ctx context.Context, match *types.MessageMatch, tsk types.TipSetKey, toht abi.ChainEpoch) ([]cid.Cid, error) `perm:"read"` - StateListMiners func(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) `perm:"read"` - StateLookupID func(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) `perm:"read"` - StateLookupRobustAddress func(context.Context, address.Address, types.TipSetKey) (address.Address, error) `perm:"read"` - StateMarketBalance func(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.MarketBalance, error) `perm:"read"` - StateMarketDeals func(ctx context.Context, tsk types.TipSetKey) (map[string]*types.MarketDeal, error) `perm:"read"` - StateMarketStorageDeal func(ctx context.Context, dealID abi.DealID, tsk types.TipSetKey) (*types.MarketDeal, error) `perm:"read"` - StateMinerActiveSectors func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]*lminer.SectorOnChainInfo, error) `perm:"read"` - StateMinerAllocated func(context.Context, address.Address, types.TipSetKey) (*bitfield.BitField, error) `perm:"read"` - StateMinerAvailableBalance func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (big.Int, error) `perm:"read"` - StateMinerDeadlines func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]types.Deadline, error) `perm:"read"` - StateMinerFaults func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (bitfield.BitField, error) `perm:"read"` - StateMinerInfo func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (types.MinerInfo, error) `perm:"read"` - StateMinerInitialPledgeCollateral func(ctx context.Context, maddr address.Address, pci types.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) `perm:"read"` - StateMinerPartitions func(ctx context.Context, maddr address.Address, dlIdx uint64, tsk types.TipSetKey) ([]types.Partition, error) `perm:"read"` - StateMinerPower func(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*types.MinerPower, error) `perm:"read"` - StateMinerPreCommitDepositForPower func(ctx context.Context, maddr address.Address, pci types.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) `perm:"read"` - StateMinerProvingDeadline func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (*dline.Info, error) `perm:"read"` - StateMinerRecoveries func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (bitfield.BitField, error) `perm:"read"` - StateMinerSectorAllocated func(ctx context.Context, maddr address.Address, s abi.SectorNumber, tsk types.TipSetKey) (bool, error) `perm:"read"` - StateMinerSectorCount func(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.MinerSectors, error) `perm:"read"` - StateMinerSectorSize func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (abi.SectorSize, error) `perm:"read"` - StateMinerSectors func(ctx context.Context, maddr address.Address, sectorNos *bitfield.BitField, tsk types.TipSetKey) ([]*lminer.SectorOnChainInfo, error) `perm:"read"` - StateMinerWorkerAddress func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (address.Address, error) `perm:"read"` - StateReadState func(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*types.ActorState, error) `perm:"read"` - StateSectorExpiration func(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk types.TipSetKey) (*lminer.SectorExpiration, error) `perm:"read"` - StateSectorGetInfo func(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (*lminer.SectorOnChainInfo, error) `perm:"read"` - StateSectorPartition func(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk types.TipSetKey) (*lminer.SectorLocation, error) `perm:"read"` - StateSectorPreCommitInfo func(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (*types.SectorPreCommitOnChainInfo, error) `perm:"read"` - StateVMCirculatingSupplyInternal func(ctx context.Context, tsk types.TipSetKey) (types.CirculatingSupply, error) `perm:"read"` - StateVerifiedClientStatus func(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) `perm:"read"` + StateAllMinerFaults func(ctx context.Context, lookback abi.ChainEpoch, ts types.TipSetKey) ([]*types.Fault, error) `perm:"read"` + StateChangedActors func(context.Context, cid.Cid, cid.Cid) (map[string]types.Actor, error) `perm:"read"` + StateCirculatingSupply func(ctx context.Context, tsk types.TipSetKey) (abi.TokenAmount, error) `perm:"read"` + StateComputeDataCID func(ctx context.Context, maddr address.Address, sectorType abi.RegisteredSealProof, deals []abi.DealID, tsk types.TipSetKey) (cid.Cid, error) `perm:"read"` + StateDealProviderCollateralBounds func(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (types.DealCollateralBounds, error) `perm:"read"` + StateDecodeParams func(ctx context.Context, toAddr address.Address, method abi.MethodNum, params []byte, tsk types.TipSetKey) (interface{}, error) `perm:"read"` + StateEncodeParams func(ctx context.Context, toActCode cid.Cid, method abi.MethodNum, params json.RawMessage) ([]byte, error) `perm:"read"` + StateGetAllAllocations func(ctx context.Context, tsk types.TipSetKey) (map[verifreg.AllocationId]verifreg.Allocation, error) `perm:"read"` + StateGetAllClaims func(ctx context.Context, tsk types.TipSetKey) (map[verifreg.ClaimId]verifreg.Claim, error) `perm:"read"` + StateGetAllocation func(ctx context.Context, clientAddr address.Address, allocationID verifreg.AllocationId, tsk types.TipSetKey) (*verifreg.Allocation, error) `perm:"read"` + StateGetAllocationForPendingDeal func(ctx context.Context, dealID abi.DealID, tsk types.TipSetKey) (*verifreg.Allocation, error) `perm:"read"` + StateGetAllocationIdForPendingDeal func(ctx context.Context, dealID abi.DealID, tsk types.TipSetKey) (verifreg.AllocationId, error) `perm:"read"` + StateGetAllocations func(ctx context.Context, clientAddr address.Address, tsk types.TipSetKey) (map[verifreg.AllocationId]verifreg.Allocation, error) `perm:"read"` + StateGetClaim func(ctx context.Context, providerAddr address.Address, claimID verifreg.ClaimId, tsk types.TipSetKey) (*verifreg.Claim, error) `perm:"read"` + StateGetClaims func(ctx context.Context, providerAddr address.Address, tsk types.TipSetKey) (map[verifreg.ClaimId]verifreg.Claim, error) `perm:"read"` + StateListActors func(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) `perm:"read"` + StateListMessages func(ctx context.Context, match *types.MessageMatch, tsk types.TipSetKey, toht abi.ChainEpoch) ([]cid.Cid, error) `perm:"read"` + StateListMiners func(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) `perm:"read"` + StateLookupID func(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) `perm:"read"` + StateLookupRobustAddress func(context.Context, address.Address, types.TipSetKey) (address.Address, error) `perm:"read"` + StateMarketBalance func(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.MarketBalance, error) `perm:"read"` + StateMarketDeals func(ctx context.Context, tsk types.TipSetKey) (map[string]*types.MarketDeal, error) `perm:"read"` + StateMarketStorageDeal func(ctx context.Context, dealID abi.DealID, tsk types.TipSetKey) (*types.MarketDeal, error) `perm:"read"` + StateMinerActiveSectors func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]*lminer.SectorOnChainInfo, error) `perm:"read"` + StateMinerAllocated func(context.Context, address.Address, types.TipSetKey) (*bitfield.BitField, error) `perm:"read"` + StateMinerAvailableBalance func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (big.Int, error) `perm:"read"` + StateMinerDeadlines func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]types.Deadline, error) `perm:"read"` + StateMinerFaults func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (bitfield.BitField, error) `perm:"read"` + StateMinerInfo func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (types.MinerInfo, error) `perm:"read"` + StateMinerInitialPledgeCollateral func(ctx context.Context, maddr address.Address, pci types.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) `perm:"read"` + StateMinerInitialPledgeForSector func(ctx context.Context, sectorDuration abi.ChainEpoch, sectorSize abi.SectorSize, verifiedSize uint64, tsk types.TipSetKey) (types.BigInt, error) `perm:"read"` + StateMinerPartitions func(ctx context.Context, maddr address.Address, dlIdx uint64, tsk types.TipSetKey) ([]types.Partition, error) `perm:"read"` + StateMinerPower func(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*types.MinerPower, error) `perm:"read"` + StateMinerPreCommitDepositForPower func(ctx context.Context, maddr address.Address, pci types.SectorPreCommitInfo, tsk types.TipSetKey) (big.Int, error) `perm:"read"` + StateMinerProvingDeadline func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (*dline.Info, error) `perm:"read"` + StateMinerRecoveries func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (bitfield.BitField, error) `perm:"read"` + StateMinerSectorAllocated func(ctx context.Context, maddr address.Address, s abi.SectorNumber, tsk types.TipSetKey) (bool, error) `perm:"read"` + StateMinerSectorCount func(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.MinerSectors, error) `perm:"read"` + StateMinerSectorSize func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (abi.SectorSize, error) `perm:"read"` + StateMinerSectors func(ctx context.Context, maddr address.Address, sectorNos *bitfield.BitField, tsk types.TipSetKey) ([]*lminer.SectorOnChainInfo, error) `perm:"read"` + StateMinerWorkerAddress func(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (address.Address, error) `perm:"read"` + StateReadState func(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*types.ActorState, error) `perm:"read"` + StateSectorExpiration func(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk types.TipSetKey) (*lminer.SectorExpiration, error) `perm:"read"` + StateSectorGetInfo func(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (*lminer.SectorOnChainInfo, error) `perm:"read"` + StateSectorPartition func(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tsk types.TipSetKey) (*lminer.SectorLocation, error) `perm:"read"` + StateSectorPreCommitInfo func(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (*types.SectorPreCommitOnChainInfo, error) `perm:"read"` + StateVMCirculatingSupplyInternal func(ctx context.Context, tsk types.TipSetKey) (types.CirculatingSupply, error) `perm:"read"` + StateVerifiedClientStatus func(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) `perm:"read"` } } @@ -151,28 +153,28 @@ func (s *IMinerStateStruct) StateDecodeParams(p0 context.Context, p1 address.Add func (s *IMinerStateStruct) StateEncodeParams(p0 context.Context, p1 cid.Cid, p2 abi.MethodNum, p3 json.RawMessage) ([]byte, error) { return s.Internal.StateEncodeParams(p0, p1, p2, p3) } -func (s *IMinerStateStruct) StateGetAllAllocations(p0 context.Context, p1 types.TipSetKey) (map[types.AllocationId]types.Allocation, error) { +func (s *IMinerStateStruct) StateGetAllAllocations(p0 context.Context, p1 types.TipSetKey) (map[verifreg.AllocationId]verifreg.Allocation, error) { return s.Internal.StateGetAllAllocations(p0, p1) } -func (s *IMinerStateStruct) StateGetAllClaims(p0 context.Context, p1 types.TipSetKey) (map[types.ClaimId]types.Claim, error) { +func (s *IMinerStateStruct) StateGetAllClaims(p0 context.Context, p1 types.TipSetKey) (map[verifreg.ClaimId]verifreg.Claim, error) { return s.Internal.StateGetAllClaims(p0, p1) } -func (s *IMinerStateStruct) StateGetAllocation(p0 context.Context, p1 address.Address, p2 types.AllocationId, p3 types.TipSetKey) (*types.Allocation, error) { +func (s *IMinerStateStruct) StateGetAllocation(p0 context.Context, p1 address.Address, p2 verifreg.AllocationId, p3 types.TipSetKey) (*verifreg.Allocation, error) { return s.Internal.StateGetAllocation(p0, p1, p2, p3) } -func (s *IMinerStateStruct) StateGetAllocationForPendingDeal(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*types.Allocation, error) { +func (s *IMinerStateStruct) StateGetAllocationForPendingDeal(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*verifreg.Allocation, error) { return s.Internal.StateGetAllocationForPendingDeal(p0, p1, p2) } func (s *IMinerStateStruct) StateGetAllocationIdForPendingDeal(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (verifreg.AllocationId, error) { return s.Internal.StateGetAllocationIdForPendingDeal(p0, p1, p2) } -func (s *IMinerStateStruct) StateGetAllocations(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (map[types.AllocationId]types.Allocation, error) { +func (s *IMinerStateStruct) StateGetAllocations(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (map[verifreg.AllocationId]verifreg.Allocation, error) { return s.Internal.StateGetAllocations(p0, p1, p2) } -func (s *IMinerStateStruct) StateGetClaim(p0 context.Context, p1 address.Address, p2 types.ClaimId, p3 types.TipSetKey) (*types.Claim, error) { +func (s *IMinerStateStruct) StateGetClaim(p0 context.Context, p1 address.Address, p2 verifreg.ClaimId, p3 types.TipSetKey) (*verifreg.Claim, error) { return s.Internal.StateGetClaim(p0, p1, p2, p3) } -func (s *IMinerStateStruct) StateGetClaims(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (map[types.ClaimId]types.Claim, error) { +func (s *IMinerStateStruct) StateGetClaims(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (map[verifreg.ClaimId]verifreg.Claim, error) { return s.Internal.StateGetClaims(p0, p1, p2) } func (s *IMinerStateStruct) StateListActors(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) { @@ -220,6 +222,9 @@ func (s *IMinerStateStruct) StateMinerInfo(p0 context.Context, p1 address.Addres func (s *IMinerStateStruct) StateMinerInitialPledgeCollateral(p0 context.Context, p1 address.Address, p2 types.SectorPreCommitInfo, p3 types.TipSetKey) (big.Int, error) { return s.Internal.StateMinerInitialPledgeCollateral(p0, p1, p2, p3) } +func (s *IMinerStateStruct) StateMinerInitialPledgeForSector(p0 context.Context, p1 abi.ChainEpoch, p2 abi.SectorSize, p3 uint64, p4 types.TipSetKey) (types.BigInt, error) { + return s.Internal.StateMinerInitialPledgeForSector(p0, p1, p2, p3, p4) +} func (s *IMinerStateStruct) StateMinerPartitions(p0 context.Context, p1 address.Address, p2 uint64, p3 types.TipSetKey) ([]types.Partition, error) { return s.Internal.StateMinerPartitions(p0, p1, p2, p3) } @@ -751,6 +756,7 @@ type ISyncerStruct struct { ChainTipSetWeight func(ctx context.Context, tsk types.TipSetKey) (big.Int, error) `perm:"read"` Concurrent func(ctx context.Context) int64 `perm:"read"` SetConcurrent func(ctx context.Context, concurrent int64) error `perm:"admin"` + SyncCheckpoint func(ctx context.Context, tsk types.TipSetKey) error `perm:"admin"` SyncIncomingBlocks func(ctx context.Context) (<-chan *types.BlockHeader, error) `perm:"read"` SyncState func(ctx context.Context) (*types.SyncState, error) `perm:"read"` SyncSubmitBlock func(ctx context.Context, blk *types.BlockMsg) error `perm:"write"` @@ -768,6 +774,9 @@ func (s *ISyncerStruct) Concurrent(p0 context.Context) int64 { return s.Internal func (s *ISyncerStruct) SetConcurrent(p0 context.Context, p1 int64) error { return s.Internal.SetConcurrent(p0, p1) } +func (s *ISyncerStruct) SyncCheckpoint(p0 context.Context, p1 types.TipSetKey) error { + return s.Internal.SyncCheckpoint(p0, p1) +} func (s *ISyncerStruct) SyncIncomingBlocks(p0 context.Context) (<-chan *types.BlockHeader, error) { return s.Internal.SyncIncomingBlocks(p0) } @@ -1070,11 +1079,15 @@ func (s *IActorEventStruct) SubscribeActorEventsRaw(p0 context.Context, p1 *type type IF3Struct struct { Internal struct { - F3GetCertificate func(ctx context.Context, instance uint64) (*certs.FinalityCertificate, error) `perm:"read"` - F3GetECPowerTable func(ctx context.Context, tsk types.TipSetKey) (gpbft.PowerEntries, error) `perm:"read"` - F3GetF3PowerTable func(ctx context.Context, tsk types.TipSetKey) (gpbft.PowerEntries, error) `perm:"read"` - F3GetLatestCertificate func(ctx context.Context) (*certs.FinalityCertificate, error) `perm:"read"` - F3Participate func(ctx context.Context, minerID address.Address, newLeaseExpiration time.Time, oldLeaseExpiration time.Time) (bool, error) `perm:"sign"` + F3GetCertificate func(ctx context.Context, instance uint64) (*certs.FinalityCertificate, error) `perm:"read"` + F3GetECPowerTable func(ctx context.Context, tsk types.TipSetKey) (gpbft.PowerEntries, error) `perm:"read"` + F3GetF3PowerTable func(ctx context.Context, tsk types.TipSetKey) (gpbft.PowerEntries, error) `perm:"read"` + F3GetLatestCertificate func(ctx context.Context) (*certs.FinalityCertificate, error) `perm:"read"` + F3GetManifest func(ctx context.Context) (*manifest.Manifest, error) `perm:"read"` + F3GetOrRenewParticipationTicket func(ctx context.Context, minerID address.Address, previous types.F3ParticipationTicket, instances uint64) (types.F3ParticipationTicket, error) `perm:"sign"` + F3GetProgress func(ctx context.Context) (gpbft.Instant, error) `perm:"read"` + F3IsRunning func(ctx context.Context) (bool, error) `perm:"read"` + F3Participate func(ctx context.Context, ticket types.F3ParticipationTicket) (types.F3ParticipationLease, error) `perm:"sign"` } } @@ -1090,8 +1103,18 @@ func (s *IF3Struct) F3GetF3PowerTable(p0 context.Context, p1 types.TipSetKey) (g func (s *IF3Struct) F3GetLatestCertificate(p0 context.Context) (*certs.FinalityCertificate, error) { return s.Internal.F3GetLatestCertificate(p0) } -func (s *IF3Struct) F3Participate(p0 context.Context, p1 address.Address, p2 time.Time, p3 time.Time) (bool, error) { - return s.Internal.F3Participate(p0, p1, p2, p3) +func (s *IF3Struct) F3GetManifest(p0 context.Context) (*manifest.Manifest, error) { + return s.Internal.F3GetManifest(p0) +} +func (s *IF3Struct) F3GetOrRenewParticipationTicket(p0 context.Context, p1 address.Address, p2 types.F3ParticipationTicket, p3 uint64) (types.F3ParticipationTicket, error) { + return s.Internal.F3GetOrRenewParticipationTicket(p0, p1, p2, p3) +} +func (s *IF3Struct) F3GetProgress(p0 context.Context) (gpbft.Instant, error) { + return s.Internal.F3GetProgress(p0) +} +func (s *IF3Struct) F3IsRunning(p0 context.Context) (bool, error) { return s.Internal.F3IsRunning(p0) } +func (s *IF3Struct) F3Participate(p0 context.Context, p1 types.F3ParticipationTicket) (types.F3ParticipationLease, error) { + return s.Internal.F3Participate(p0, p1) } type FullNodeStruct struct { diff --git a/venus-shared/api/chain/v1/syncer.go b/venus-shared/api/chain/v1/syncer.go index 35a8014c2b..14866feb28 100644 --- a/venus-shared/api/chain/v1/syncer.go +++ b/venus-shared/api/chain/v1/syncer.go @@ -19,4 +19,6 @@ type ISyncer interface { // SyncIncomingBlocks returns a channel streaming incoming, potentially not // yet synced block headers. SyncIncomingBlocks(ctx context.Context) (<-chan *types.BlockHeader, error) //perm:read + // SyncCheckpoint marks a blocks as checkpointed, meaning that it won't ever fork away from it. + SyncCheckpoint(ctx context.Context, tsk types.TipSetKey) error //perm:admin } diff --git a/venus-shared/api/gateway/v1/method.md b/venus-shared/api/gateway/v1/method.md index 2fc313a689..79e9224ff3 100644 --- a/venus-shared/api/gateway/v1/method.md +++ b/venus-shared/api/gateway/v1/method.md @@ -205,7 +205,7 @@ Inputs: ], "Bw==", 10101, - 23 + 24 ] ``` diff --git a/venus-shared/api/gateway/v2/method.md b/venus-shared/api/gateway/v2/method.md index 8fb9193b0d..2d0f4589fc 100644 --- a/venus-shared/api/gateway/v2/method.md +++ b/venus-shared/api/gateway/v2/method.md @@ -174,7 +174,7 @@ Inputs: ], "Bw==", 10101, - 23 + 24 ] ``` diff --git a/venus-shared/compatible-checks/actor-sources.txt b/venus-shared/compatible-checks/actor-sources.txt index 5a74732f8a..903292804a 100644 --- a/venus-shared/compatible-checks/actor-sources.txt +++ b/venus-shared/compatible-checks/actor-sources.txt @@ -15,6 +15,7 @@ SOURCES IN chain/actors: builtin/account/v12.go builtin/account/v13.go builtin/account/v14.go + builtin/account/v15.go builtin/account/v2.go builtin/account/v3.go builtin/account/v4.go @@ -31,6 +32,7 @@ SOURCES IN chain/actors: builtin/cron/v12.go builtin/cron/v13.go builtin/cron/v14.go + builtin/cron/v15.go builtin/cron/v2.go builtin/cron/v3.go builtin/cron/v4.go @@ -46,6 +48,7 @@ SOURCES IN chain/actors: builtin/datacap/v12.go builtin/datacap/v13.go builtin/datacap/v14.go + builtin/datacap/v15.go builtin/datacap/v9.go builtin/evm/evm.go builtin/evm/v10.go @@ -53,6 +56,7 @@ SOURCES IN chain/actors: builtin/evm/v12.go builtin/evm/v13.go builtin/evm/v14.go + builtin/evm/v15.go builtin/init/diff.go builtin/init/init.go builtin/init/v0.go @@ -61,6 +65,7 @@ SOURCES IN chain/actors: builtin/init/v12.go builtin/init/v13.go builtin/init/v14.go + builtin/init/v15.go builtin/init/v2.go builtin/init/v3.go builtin/init/v4.go @@ -77,6 +82,7 @@ SOURCES IN chain/actors: builtin/market/v12.go builtin/market/v13.go builtin/market/v14.go + builtin/market/v15.go builtin/market/v2.go builtin/market/v3.go builtin/market/v4.go @@ -95,6 +101,7 @@ SOURCES IN chain/actors: builtin/miner/v12.go builtin/miner/v13.go builtin/miner/v14.go + builtin/miner/v15.go builtin/miner/v2.go builtin/miner/v3.go builtin/miner/v4.go @@ -110,6 +117,7 @@ SOURCES IN chain/actors: builtin/multisig/message12.go builtin/multisig/message13.go builtin/multisig/message14.go + builtin/multisig/message15.go builtin/multisig/message2.go builtin/multisig/message3.go builtin/multisig/message4.go @@ -125,6 +133,7 @@ SOURCES IN chain/actors: builtin/multisig/v12.go builtin/multisig/v13.go builtin/multisig/v14.go + builtin/multisig/v15.go builtin/multisig/v2.go builtin/multisig/v3.go builtin/multisig/v4.go @@ -139,6 +148,7 @@ SOURCES IN chain/actors: builtin/paych/message12.go builtin/paych/message13.go builtin/paych/message14.go + builtin/paych/message15.go builtin/paych/message2.go builtin/paych/message3.go builtin/paych/message4.go @@ -155,6 +165,7 @@ SOURCES IN chain/actors: builtin/paych/v12.go builtin/paych/v13.go builtin/paych/v14.go + builtin/paych/v15.go builtin/paych/v2.go builtin/paych/v3.go builtin/paych/v4.go @@ -171,6 +182,7 @@ SOURCES IN chain/actors: builtin/power/v12.go builtin/power/v13.go builtin/power/v14.go + builtin/power/v15.go builtin/power/v2.go builtin/power/v3.go builtin/power/v4.go @@ -187,6 +199,7 @@ SOURCES IN chain/actors: builtin/reward/v12.go builtin/reward/v13.go builtin/reward/v14.go + builtin/reward/v15.go builtin/reward/v2.go builtin/reward/v3.go builtin/reward/v4.go @@ -202,6 +215,7 @@ SOURCES IN chain/actors: builtin/system/v12.go builtin/system/v13.go builtin/system/v14.go + builtin/system/v15.go builtin/system/v2.go builtin/system/v3.go builtin/system/v4.go @@ -217,6 +231,7 @@ SOURCES IN chain/actors: builtin/verifreg/v12.go builtin/verifreg/v13.go builtin/verifreg/v14.go + builtin/verifreg/v15.go builtin/verifreg/v2.go builtin/verifreg/v3.go builtin/verifreg/v4.go diff --git a/venus-shared/compatible-checks/api-checksum.txt b/venus-shared/compatible-checks/api-checksum.txt index 8423894719..9e5f1e77ac 100644 --- a/venus-shared/compatible-checks/api-checksum.txt +++ b/venus-shared/compatible-checks/api-checksum.txt @@ -242,7 +242,9 @@ api.FullNode: EthGasPrice: In=1, Out=2, CheckSum=e2f5588dddfc36a9cdef0fad6f4db93e EthGetBalance: In=3, Out=2, CheckSum=80912669b93ebbd53024dbc6b4f39d94 EthGetBlockByHash: In=3, Out=2, CheckSum=606bca6c962d8e2d4e0b8bb14e8fa0a9 - EthGetBlockByNumber: In=3, Out=2, CheckSum=9d82b96bb03c2de85dc7a31e7d4c45d2 + EthGetBlockByNumber: In=3, Out=2, CheckSum=06d77a6c80b11ea456c9207a10459abe + EthGetBlockReceipts: In=2, Out=2, CheckSum=e2817ae4c1a093339a0fd251150de95a + EthGetBlockReceiptsLimited: In=3, Out=2, CheckSum=f5992631f35a54511e4a494b84e66b33 EthGetBlockTransactionCountByHash: In=2, Out=2, CheckSum=aea75f99eaccb878b97512a29568c204 EthGetBlockTransactionCountByNumber: In=2, Out=2, CheckSum=2c3bfb8fef7edce8563d84eab6e9bf4f EthGetCode: In=3, Out=2, CheckSum=a186786e31338dc69207e934b426cc67 @@ -265,9 +267,11 @@ api.FullNode: EthNewPendingTransactionFilter: In=1, Out=2, CheckSum=0b236ca49b91eef3180d6b4082640f0f EthProtocolVersion: In=1, Out=2, CheckSum=442f3dc12ea5a22b7b8fea633069692a EthSendRawTransaction: In=2, Out=2, CheckSum=f63e0b205164d628bc8022b6d5a496f5 + EthSendRawTransactionUntrusted: In=2, Out=2, CheckSum=f63e0b205164d628bc8022b6d5a496f5 EthSubscribe: In=2, Out=2, CheckSum=f63e0b205164d628bc8022b6d5a496f5 EthSyncing: In=1, Out=2, CheckSum=2c17cf64e376c0e9d0d56053d33c0722 EthTraceBlock: In=2, Out=2, CheckSum=87ad85d70d0a285fae530a47eee79d13 + EthTraceFilter: In=2, Out=2, CheckSum=eb8226fb11cf8fd4b9550df816e5ac93 EthTraceReplayBlockTransactions: In=3, Out=2, CheckSum=ec2c86340cf2a777bc64bab8d10e3fdb EthTraceTransaction: In=2, Out=2, CheckSum=5baa667f39dbbb1355663613b6e9cf3b EthUninstallFilter: In=2, Out=2, CheckSum=eaa6a477ffaae115413457bbdb11e339 @@ -276,8 +280,12 @@ api.FullNode: F3GetECPowerTable: In=2, Out=2, CheckSum=cbc0e8e30a005d936a4080aaf911c58f F3GetF3PowerTable: In=2, Out=2, CheckSum=cbc0e8e30a005d936a4080aaf911c58f F3GetLatestCertificate: In=1, Out=2, CheckSum=de551a11a224677fff1d64e2014932e6 - F3Participate: In=4, Out=2, CheckSum=8861bbda56cde25a0dd0cc7ae64ecf60 - FilecoinAddressToEthAddress: In=2, Out=2, CheckSum=13a0b5ce8f82604e17803a00c4086c4c + F3GetManifest: In=1, Out=2, CheckSum=082e48a67a9415757e16938ec8ba34e5 + F3GetOrRenewParticipationTicket: In=4, Out=2, CheckSum=f025742e52bb59e839db5182af1a829a + F3GetProgress: In=1, Out=2, CheckSum=47af12f74b39fcca4877ebed425b6558 + F3IsRunning: In=1, Out=2, CheckSum=de305c848673f2b095e6cfdecdaf85c3 + F3Participate: In=2, Out=2, CheckSum=a09f021cb508b413dddcfae6eb535db4 + FilecoinAddressToEthAddress: In=2, Out=2, CheckSum=59affa319c910c555ee5f1d194049f53 GasEstimateFeeCap: In=4, Out=2, CheckSum=0fcac02de1d21c9ac6e10696a6499eba GasEstimateGasLimit: In=3, Out=2, CheckSum=4d1bd57eef0ee90d4c2e89f097d0604d GasEstimateGasPremium: In=5, Out=2, CheckSum=550724ed37e2fdaa64e55147e82214b1 @@ -416,6 +424,7 @@ api.FullNode: StateMinerFaults: In=3, Out=2, CheckSum=9d26d848f93597964f751b43edd3d476 StateMinerInfo: In=3, Out=2, CheckSum=4ba684a8519aa97d4df405cee3496e7c StateMinerInitialPledgeCollateral: In=4, Out=2, CheckSum=b456dc2029fe2ac176ade895bda96dd5 + StateMinerInitialPledgeForSector: In=5, Out=2, CheckSum=b5edd5d06358a203455b9c3036445d21 StateMinerPartitions: In=4, Out=2, CheckSum=b3cba1da3bd87c433cb8f9df7f7edc09 StateMinerPower: In=3, Out=2, CheckSum=0e70a6360616c25624118181f764d7df StateMinerPreCommitDepositForPower: In=4, Out=2, CheckSum=b456dc2029fe2ac176ade895bda96dd5 diff --git a/venus-shared/compatible-checks/api-diff.txt b/venus-shared/compatible-checks/api-diff.txt index ecd563caf3..dde37e80b8 100644 --- a/venus-shared/compatible-checks/api-diff.txt +++ b/venus-shared/compatible-checks/api-diff.txt @@ -65,10 +65,10 @@ github.com/filecoin-project/venus/venus-shared/api/chain/v0.FullNode <> github.c - Shutdown - StateGetAllAllocations - StateGetAllClaims + + StateMinerInitialPledgeForSector + StateMinerSectorSize + StateMinerWorkerAddress - SyncCheckBad - - SyncCheckpoint - SyncMarkBad - SyncUnmarkAllBad - SyncUnmarkBad @@ -104,7 +104,13 @@ github.com/filecoin-project/venus/venus-shared/api/chain/v1.FullNode <> github.c + Concurrent - CreateBackup - Discover + > EthGetBlockByNumber {[func(context.Context, string, bool) (types.EthBlock, error) <> func(context.Context, string, bool) (*ethtypes.EthBlock, error)] base=func out type: #0 input; nested={[types.EthBlock <> *ethtypes.EthBlock] base=type kinds: struct != ptr; nested=nil}} + - EthGetBlockReceipts + - EthGetBlockReceiptsLimited + - EthSendRawTransactionUntrusted + - EthTraceFilter > EthTraceReplayBlockTransactions {[func(context.Context, string, []string) ([]*types.EthTraceReplayBlockTransaction, error) <> func(context.Context, string, []string) ([]*ethtypes.EthTraceReplayBlockTransaction, error)] base=func out type: #0 input; nested={[[]*types.EthTraceReplayBlockTransaction <> []*ethtypes.EthTraceReplayBlockTransaction] base=slice element; nested={[*types.EthTraceReplayBlockTransaction <> *ethtypes.EthTraceReplayBlockTransaction] base=pointed type; nested={[types.EthTraceReplayBlockTransaction <> ethtypes.EthTraceReplayBlockTransaction] base=struct field; nested={[types.EthTraceReplayBlockTransaction <> ethtypes.EthTraceReplayBlockTransaction] base=exported field name: #4 field, VMTrace != VmTrace; nested=nil}}}}} + > FilecoinAddressToEthAddress {[func(context.Context, address.Address) (types.EthAddress, error) <> func(context.Context, jsonrpc.RawParams) (ethtypes.EthAddress, error)] base=func in type: #1 input; nested={[address.Address <> jsonrpc.RawParams] base=type kinds: struct != slice; nested=nil}} + GasBatchEstimateMessageGas > GasEstimateMessageGas {[func(context.Context, *types.Message, *types.MessageSendSpec, types.TipSetKey) (*types.Message, error) <> func(context.Context, *types.Message, *api.MessageSendSpec, types.TipSetKey) (*types.Message, error)] base=func in type: #2 input; nested={[*types.MessageSendSpec <> *api.MessageSendSpec] base=pointed type; nested={[types.MessageSendSpec <> api.MessageSendSpec] base=struct field; nested={[types.MessageSendSpec <> api.MessageSendSpec] base=exported field name: #1 field, GasOverEstimation != MsgUuid; nested=nil}}}} + GetActor @@ -162,7 +168,6 @@ github.com/filecoin-project/venus/venus-shared/api/chain/v1.FullNode <> github.c + StateMinerSectorSize + StateMinerWorkerAddress - SyncCheckBad - - SyncCheckpoint - SyncMarkBad - SyncUnmarkAllBad - SyncUnmarkBad diff --git a/venus-shared/compatible-checks/api-perm.txt b/venus-shared/compatible-checks/api-perm.txt index 1abfaa8248..9c3dc6ae5b 100644 --- a/venus-shared/compatible-checks/api-perm.txt +++ b/venus-shared/compatible-checks/api-perm.txt @@ -11,6 +11,7 @@ v0: github.com/filecoin-project/venus/venus-shared/api/chain/v0 <> github.com/fi - IChainInfo.ProtocolParameters - IChainInfo.ResolveToKeyAddr - IChainInfo.VerifyEntry + - IMinerState.StateMinerInitialPledgeForSector - IMinerState.StateMinerSectorSize - IMinerState.StateMinerWorkerAddress - ICommon.StartTime diff --git a/venus-shared/types/actor_event_test.go b/venus-shared/types/actor_event_test.go index 29e30c9c78..8c50b17175 100644 --- a/venus-shared/types/actor_event_test.go +++ b/venus-shared/types/actor_event_test.go @@ -37,7 +37,7 @@ func TestJSONMarshalling(t *testing.T) { TipSetKey: NewTipSetKey(randomCid(t, rng)), MsgCid: randomCid(t, rng), }, - `{"entries":[{"Flags":0,"Key":"key1","Codec":81,"Value":"dmFsdWUx"},{"Flags":0,"Key":"key2","Codec":82,"Value":"dmFsdWUy"}],"emitter":"t410fagkp3qx2f76maqot74jaiw3tzbxe76k76zrkl3xifk67isrnbn2sll3yua","reverted":false,"height":1001,"tipsetKey":[{"/":"bafkqacx3dag26sfht3qlcdi"}],"msgCid":{"/":"bafkqacrziziykd6uuf4islq"}}`, + `{"entries":[{"Flags":0,"Key":"key1","Codec":81,"Value":"dmFsdWUx"},{"Flags":0,"Key":"key2","Codec":82,"Value":"dmFsdWUy"}],"emitter":"f410fagkp3qx2f76maqot74jaiw3tzbxe76k76zrkl3xifk67isrnbn2sll3yua","reverted":false,"height":1001,"tipsetKey":[{"/":"bafkqacx3dag26sfht3qlcdi"}],"msgCid":{"/":"bafkqacrziziykd6uuf4islq"}}`, ), ) @@ -66,7 +66,7 @@ func TestJSONMarshalling(t *testing.T) { ToHeight: heightOf(100), TipSetKey: randomTipSetKey(t, rng), }, - `{"addresses":["t410fagkp3qx2f76maqot74jaiw3tzbxe76k76zrkl3xifk67isrnbn2sll3yua","t410fagkp3qx2f76maqot74jaiw3tzbxe76k76zrkl3xifk67isrnbn2sll3yua"],"fields":{"key1":[{"codec":81,"value":"dmFsdWUx"}],"key2":[{"codec":82,"value":"dmFsdWUy"}]},"fromHeight":0,"toHeight":100,"tipsetKey":[{"/":"bafkqacxcqxwocuiukv4aq5i"}]}`, + `{"addresses":["f410fagkp3qx2f76maqot74jaiw3tzbxe76k76zrkl3xifk67isrnbn2sll3yua","f410fagkp3qx2f76maqot74jaiw3tzbxe76k76zrkl3xifk67isrnbn2sll3yua"],"fields":{"key1":[{"codec":81,"value":"dmFsdWUx"}],"key2":[{"codec":82,"value":"dmFsdWUy"}]},"fromHeight":0,"toHeight":100,"tipsetKey":[{"/":"bafkqacxcqxwocuiukv4aq5i"}]}`, ), ) t.Run("actor event block", diff --git a/venus-shared/types/api_types.go b/venus-shared/types/api_types.go index b06353e5c3..4aee040bcb 100644 --- a/venus-shared/types/api_types.go +++ b/venus-shared/types/api_types.go @@ -6,6 +6,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" + gpbft "github.com/filecoin-project/go-f3/gpbft" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/ipfs/go-cid" @@ -478,6 +479,7 @@ type ForkUpgradeParams struct { UpgradeDragonHeight abi.ChainEpoch UpgradePhoenixHeight abi.ChainEpoch UpgradeWaffleHeight abi.ChainEpoch + UpgradeTuktukHeight abi.ChainEpoch } type NodeStatus struct { @@ -500,3 +502,96 @@ type NodeChainStatus struct { BlocksPerTipsetLast100 float64 BlocksPerTipsetLastFinality float64 } + +// F3ParticipationTicket represents a ticket that authorizes a miner to +// participate in the F3 consensus. +type F3ParticipationTicket []byte + +// F3ParticipationLease defines the lease granted to a storage provider for +// participating in F3 consensus, detailing the session identifier, issuer, +// subject, and the expiration instance. +type F3ParticipationLease struct { + // Network is the name of the network this lease belongs to. + Network gpbft.NetworkName + // Issuer is the identity of the node that issued the lease. + Issuer peer.ID + // MinerID is the actor ID of the miner that holds the lease. + MinerID uint64 + // FromInstance specifies the instance ID from which this lease is valid. + FromInstance uint64 + // ValidityTerm specifies the number of instances for which the lease remains + // valid from the FromInstance. + ValidityTerm uint64 +} + +func (l *F3ParticipationLease) ToInstance() uint64 { + return l.FromInstance + l.ValidityTerm +} + +var ( + // ErrF3Disabled signals that F3 consensus process is disabled. + ErrF3Disabled = errF3Disabled{} + // ErrF3ParticipationTicketInvalid signals that F3ParticipationTicket cannot be decoded. + ErrF3ParticipationTicketInvalid = errF3ParticipationTicketInvalid{} + // ErrF3ParticipationTicketExpired signals that the current GPBFT instance as surpassed the expiry of the ticket. + ErrF3ParticipationTicketExpired = errF3ParticipationTicketExpired{} + // ErrF3ParticipationIssuerMismatch signals that the ticket is not issued by the current node. + ErrF3ParticipationIssuerMismatch = errF3ParticipationIssuerMismatch{} + // ErrF3ParticipationTooManyInstances signals that participation ticket cannot be + // issued because it asks for too many instances. + ErrF3ParticipationTooManyInstances = errF3ParticipationTooManyInstances{} + // ErrF3ParticipationTicketStartBeforeExisting signals that participation ticket + // is before the start instance of an existing lease held by the miner. + ErrF3ParticipationTicketStartBeforeExisting = errF3ParticipationTicketStartBeforeExisting{} + // ErrF3NotReady signals that the F3 instance isn't ready for participation yet. The caller + // should back off and try again later. + ErrF3NotReady = errF3NotReady{} + + _ error = (*ErrOutOfGas)(nil) + // _ error = (*ErrActorNotFound)(nil) + _ error = (*errF3Disabled)(nil) + _ error = (*errF3ParticipationTicketInvalid)(nil) + _ error = (*errF3ParticipationTicketExpired)(nil) + _ error = (*errF3ParticipationIssuerMismatch)(nil) + _ error = (*errF3NotReady)(nil) +) + +// ErrOutOfGas signals that a call failed due to insufficient gas. +type ErrOutOfGas struct{} + +func (ErrOutOfGas) Error() string { return "call ran out of gas" } + +// ErrActorNotFound signals that the actor is not found. +// type ErrActorNotFound struct{} + +// func (ErrActorNotFound) Error() string { return "actor not found" } + +type errF3Disabled struct{} + +func (errF3Disabled) Error() string { return "f3 is disabled" } + +type errF3ParticipationTicketInvalid struct{} + +func (errF3ParticipationTicketInvalid) Error() string { return "ticket is not valid" } + +type errF3ParticipationTicketExpired struct{} + +func (errF3ParticipationTicketExpired) Error() string { return "ticket has expired" } + +type errF3ParticipationIssuerMismatch struct{} + +func (errF3ParticipationIssuerMismatch) Error() string { return "issuer does not match current node" } + +type errF3ParticipationTooManyInstances struct{} + +func (errF3ParticipationTooManyInstances) Error() string { return "requested instance count too high" } + +type errF3ParticipationTicketStartBeforeExisting struct{} + +func (errF3ParticipationTicketStartBeforeExisting) Error() string { + return "ticket starts before existing lease" +} + +type errF3NotReady struct{} + +func (errF3NotReady) Error() string { return "f3 isn't yet ready to participate" } diff --git a/venus-shared/types/cbor_gen.go b/venus-shared/types/cbor_gen.go index 0b8e2e6a00..8dcf56b3a6 100644 --- a/venus-shared/types/cbor_gen.go +++ b/venus-shared/types/cbor_gen.go @@ -8,12 +8,14 @@ import ( "math" "sort" + gpbft "github.com/filecoin-project/go-f3/gpbft" abi "github.com/filecoin-project/go-state-types/abi" paych "github.com/filecoin-project/go-state-types/builtin/v8/paych" crypto "github.com/filecoin-project/go-state-types/crypto" exitcode "github.com/filecoin-project/go-state-types/exitcode" proof "github.com/filecoin-project/go-state-types/proof" cid "github.com/ipfs/go-cid" + peer "github.com/libp2p/go-libp2p/core/peer" cbg "github.com/whyrusleeping/cbor-gen" xerrors "golang.org/x/xerrors" time "time" @@ -2464,3 +2466,150 @@ func (t *ExecutionTrace) UnmarshalCBOR(r io.Reader) (err error) { } return nil } + +var lengthBufF3ParticipationLease = []byte{133} + +func (t *F3ParticipationLease) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + + cw := cbg.NewCborWriter(w) + + if _, err := cw.Write(lengthBufF3ParticipationLease); err != nil { + return err + } + + // t.Network (gpbft.NetworkName) (string) + if len(t.Network) > 8192 { + return xerrors.Errorf("Value in field t.Network was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.Network))); err != nil { + return err + } + if _, err := cw.WriteString(string(t.Network)); err != nil { + return err + } + + // t.Issuer (peer.ID) (string) + if len(t.Issuer) > 8192 { + return xerrors.Errorf("Value in field t.Issuer was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.Issuer))); err != nil { + return err + } + if _, err := cw.WriteString(string(t.Issuer)); err != nil { + return err + } + + // t.MinerID (uint64) (uint64) + + if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.MinerID)); err != nil { + return err + } + + // t.FromInstance (uint64) (uint64) + + if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.FromInstance)); err != nil { + return err + } + + // t.ValidityTerm (uint64) (uint64) + + if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.ValidityTerm)); err != nil { + return err + } + + return nil +} + +func (t *F3ParticipationLease) UnmarshalCBOR(r io.Reader) (err error) { + *t = F3ParticipationLease{} + + cr := cbg.NewCborReader(r) + + maj, extra, err := cr.ReadHeader() + if err != nil { + return err + } + defer func() { + if err == io.EOF { + err = io.ErrUnexpectedEOF + } + }() + + if maj != cbg.MajArray { + return fmt.Errorf("cbor input should be of type array") + } + + if extra != 5 { + return fmt.Errorf("cbor input had wrong number of fields") + } + + // t.Network (gpbft.NetworkName) (string) + + { + sval, err := cbg.ReadStringWithMax(cr, 8192) + if err != nil { + return err + } + + t.Network = gpbft.NetworkName(sval) + } + // t.Issuer (peer.ID) (string) + + { + sval, err := cbg.ReadStringWithMax(cr, 8192) + if err != nil { + return err + } + + t.Issuer = peer.ID(sval) + } + // t.MinerID (uint64) (uint64) + + { + + maj, extra, err = cr.ReadHeader() + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.MinerID = uint64(extra) + + } + // t.FromInstance (uint64) (uint64) + + { + + maj, extra, err = cr.ReadHeader() + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.FromInstance = uint64(extra) + + } + // t.ValidityTerm (uint64) (uint64) + + { + + maj, extra, err = cr.ReadHeader() + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.ValidityTerm = uint64(extra) + + } + return nil +} diff --git a/venus-shared/types/election_proof.go b/venus-shared/types/election_proof.go index dfa3c55374..6a07a49428 100644 --- a/venus-shared/types/election_proof.go +++ b/venus-shared/types/election_proof.go @@ -6,7 +6,7 @@ import ( "math/big" "github.com/filecoin-project/go-state-types/abi" - "github.com/minio/blake2b-simd" + "golang.org/x/crypto/blake2b" "github.com/filecoin-project/venus/venus-shared/types/params" ) diff --git a/venus-shared/types/msg_meta.go b/venus-shared/types/msg_meta.go index 9f59b2f86e..a3c08d12d7 100644 --- a/venus-shared/types/msg_meta.go +++ b/venus-shared/types/msg_meta.go @@ -38,6 +38,8 @@ const ( MTProviderDealState = MsgType("providerdealstate") MTVerifyAddress = MsgType("verifyaddress") + + MTF3 = MsgType("f3") ) type MsgMeta struct { diff --git a/venus-shared/types/param.go b/venus-shared/types/param.go index c3a09ba6b2..7617634825 100644 --- a/venus-shared/types/param.go +++ b/venus-shared/types/param.go @@ -4,6 +4,7 @@ import ( "math/big" "github.com/filecoin-project/venus/venus-shared/actors/types" + "github.com/libp2p/go-libp2p/core/peer" "github.com/filecoin-project/go-state-types/abi" @@ -27,3 +28,11 @@ const DefaultHashFunction = uint64(mh.BLAKE2B_MIN + 31) // A builder for all blockchain CIDs. // Note that sector commitments use a different scheme. var DefaultCidBuilder = cid.V1Builder{Codec: cid.DagCBOR, MhType: DefaultHashFunction} + +func MustParseID(id string) peer.ID { + p, err := peer.Decode(id) + if err != nil { + panic(err) + } + return p +} diff --git a/venus-shared/types/state_types_gen.go b/venus-shared/types/state_types_gen.go index 326ad2f826..2a85479806 100755 --- a/venus-shared/types/state_types_gen.go +++ b/venus-shared/types/state_types_gen.go @@ -252,7 +252,6 @@ type ( AllocationRequest = verifreg.AllocationRequest AllocationRequests = verifreg.AllocationRequests AllocationsResponse = verifreg.AllocationsResponse - VerifregBatchReturn = verifreg.BatchReturn Claim = verifreg.Claim ClaimAllocationsParams = verifreg.ClaimAllocationsParams ClaimAllocationsReturn = verifreg.ClaimAllocationsReturn @@ -262,7 +261,6 @@ type ( DataCap = verifreg.DataCap ExtendClaimTermsParams = verifreg.ExtendClaimTermsParams ExtendClaimTermsReturn = verifreg.ExtendClaimTermsReturn - VerifregFailCode = verifreg.FailCode GetClaimsParams = verifreg.GetClaimsParams GetClaimsReturn = verifreg.GetClaimsReturn ReceiverType = verifreg.ReceiverType diff --git a/venus-shared/types/wallet/draw_random_params.go b/venus-shared/types/wallet/draw_random_params.go index 1689eb5566..93adb654f7 100644 --- a/venus-shared/types/wallet/draw_random_params.go +++ b/venus-shared/types/wallet/draw_random_params.go @@ -8,8 +8,9 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/cbor" "github.com/filecoin-project/go-state-types/crypto" + must "github.com/filecoin-project/venus/venus-shared/utils" fcbor "github.com/fxamacker/cbor/v2" - "github.com/minio/blake2b-simd" + "golang.org/x/crypto/blake2b" ) type DrawRandomParams struct { @@ -21,7 +22,7 @@ type DrawRandomParams struct { // return store.DrawRandomness(dr.Rbase, dr.Pers, dr.Round, dr.Entropy) func (dr *DrawRandomParams) SignBytes() ([]byte, error) { - h := blake2b.New256() + h := must.One(blake2b.New256(nil)) if err := binary.Write(h, binary.BigEndian, int64(dr.Pers)); err != nil { return nil, fmt.Errorf("deriving randomness: %w", err) } diff --git a/venus-shared/types/wallet/sign_types.go b/venus-shared/types/wallet/sign_types.go index adf236ce2a..e69b525ab7 100644 --- a/venus-shared/types/wallet/sign_types.go +++ b/venus-shared/types/wallet/sign_types.go @@ -176,6 +176,22 @@ var SupportedMsgTypes = map[types.MsgType]*Types{ return in, nil }, }, + types.MTF3: { + Type: reflect.TypeOf([]byte{}), + SignBytes: func(in interface{}) ([]byte, error) { + msg, isOk := in.([]byte) + if !isOk { + return nil, fmt.Errorf("MTF3 must be []byte") + } + return msg, nil + }, + ParseObj: func(in []byte, meta types.MsgMeta) (interface{}, error) { + if meta.Type == types.MTF3 { + return in, nil + } + return nil, fmt.Errorf("un-expected MsgType:%s", meta.Type) + }, + }, } // GetSignBytesAndObj Matches the type and returns the data that needs to be signed diff --git a/venus-shared/utils/method_map.go b/venus-shared/utils/method_map.go index 06196a4342..1f5d2c84f2 100644 --- a/venus-shared/utils/method_map.go +++ b/venus-shared/utils/method_map.go @@ -62,6 +62,7 @@ func loadMethodsMap() { actors = append(actors, actorsWithVersion{av: actorstypes.Version12, actors: builtin.MakeRegistry(actorstypes.Version12)}) actors = append(actors, actorsWithVersion{av: actorstypes.Version13, actors: builtin.MakeRegistry(actorstypes.Version13)}) actors = append(actors, actorsWithVersion{av: actorstypes.Version14, actors: builtin.MakeRegistry(actorstypes.Version14)}) + actors = append(actors, actorsWithVersion{av: actorstypes.Version15, actors: builtin.MakeRegistry(actorstypes.Version15)}) for _, awv := range actors { for _, actor := range awv.actors { diff --git a/venus-shared/utils/must.go b/venus-shared/utils/must.go new file mode 100644 index 0000000000..89785ef0bc --- /dev/null +++ b/venus-shared/utils/must.go @@ -0,0 +1,9 @@ +package utils + +func One[R any](r R, err error) R { + if err != nil { + panic(err) + } + + return r +}