diff --git a/CHANGELOG.md b/CHANGELOG.md index 74b6de7ec6a..13000a5fa07 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ - chore: return `method not supported` via Gateway when /v2 isn't supported by the backend ([filecoin-project/lotus#13121](https://github.com/filecoin-project/lotus/pull/13121)) - chore: disable F3 participation via gateway ([filecoin-project/lotus#13123](https://github.com/filecoin-project/lotus/pull/13123) - chore: increase the F3 GMessage buffer size to 1024 ([filecoin-project/lotus#13126](https://github.com/filecoin-project/lotus/pull/13126)) +- feat(f3): integrate cached MapReduce from go-hamt-ipld, which improves performance of F3 power table calculation by 6-10x ([filecoin-project/lotus#13134](https://github.com/filecoin-project/lotus/pull/13134)) # Node v1.33.0 / 2025-05-08 The Lotus v1.33.0 release introduces experimental v2 APIs with F3 awareness, featuring a new TipSet selection mechanism that significantly enhances how applications interact with the Filecoin blockchain. This release candidate also adds F3-aware Ethereum APIs via the /v2 endpoint. All of the /v2 APIs implement intelligent fallback mechanisms between F3 and Expected Consensus and are exposed through the Lotus Gateway. @@ -30,7 +31,7 @@ The Lotus V2 APIs introduce a powerful new TipSet selection mechanism that signi > [!NOTE] > V2 APIs are highly experimental and subject to change without notice. -See [Filecoin v2 APIs docs](https://filoznotebook.notion.site/Filecoin-V2-APIs-1d0dc41950c1808b914de5966d501658) for an in-depth overview. /v2 APIs are exposed through Lotus Gateway. +See [Filecoin v2 APIs docs](https://filoznotebook.notion.site/Filecoin-V2-APIs-1d0dc41950c1808b914de5966d501658) for an in-depth overview. /v2 APIs are exposed through Lotus Gateway. This work was primarily done in ([filecoin-project/lotus#13003](https://github.com/filecoin-project/lotus/pull/13003)), ([filecoin-project/lotus#13027](https://github.com/filecoin-project/lotus/pull/13027)), ([filecoin-project/lotus#13034](https://github.com/filecoin-project/lotus/pull/13034)), ([filecoin-project/lotus#13075](https://github.com/filecoin-project/lotus/pull/13075)), ([filecoin-project/lotus#13066](https://github.com/filecoin-project/lotus/pull/13066)) diff --git a/chain/actors/builtin/power/actor.go.template b/chain/actors/builtin/power/actor.go.template index 5beccf5baf1..86783ad3803 100644 --- a/chain/actors/builtin/power/actor.go.template +++ b/chain/actors/builtin/power/actor.go.template @@ -105,6 +105,7 @@ type State interface { // before returning the actor. ForEachClaim(cb func(miner address.Address, claim Claim) error, onlyEligible bool) error ClaimsChanged(State) (bool, error) + CollectEligibleClaims(cacheInOut *builtin{{.latestVersion}}.MapReduceCache) ([]builtin{{.latestVersion}}.OwnedClaim, error) // Testing or genesis setup only SetTotalQualityAdjPower(abi.StoragePower) error diff --git a/chain/actors/builtin/power/power.go b/chain/actors/builtin/power/power.go index d46eb645663..8184d2aa092 100644 --- a/chain/actors/builtin/power/power.go +++ b/chain/actors/builtin/power/power.go @@ -189,6 +189,7 @@ type State interface { // before returning the actor. ForEachClaim(cb func(miner address.Address, claim Claim) error, onlyEligible bool) error ClaimsChanged(State) (bool, error) + CollectEligibleClaims(cacheInOut *builtin16.MapReduceCache) ([]builtin16.OwnedClaim, error) // Testing or genesis setup only SetTotalQualityAdjPower(abi.StoragePower) error diff --git a/chain/actors/builtin/power/state.go.template b/chain/actors/builtin/power/state.go.template index 5973b258817..3d6a0fdd2eb 100644 --- a/chain/actors/builtin/power/state.go.template +++ b/chain/actors/builtin/power/state.go.template @@ -26,6 +26,7 @@ import ( power{{.v}} "github.com/filecoin-project/go-state-types/builtin{{.import}}power" adt{{.v}} "github.com/filecoin-project/go-state-types/builtin{{.import}}util/adt" {{end}} + builtin{{.latestVersion}} "github.com/filecoin-project/go-state-types/builtin" ) var _ State = (*state{{.v}})(nil) @@ -147,6 +148,27 @@ func (s *state{{.v}}) ListAllMiners() ([]address.Address, error) { return miners, nil } +func (s *state{{.v}}) CollectEligibleClaims(cacheInOut *builtin{{.latestVersion}}.MapReduceCache) ([]builtin{{.latestVersion}}.OwnedClaim, error) { +{{if (ge .v 16)}} + return s.State.CollectEligibleClaims(s.store, cacheInOut) +{{else}} + var res []builtin{{.latestVersion}}.OwnedClaim + err := s.ForEachClaim(func(miner address.Address, claim Claim) error { + res = append(res, builtin{{.latestVersion}}.OwnedClaim{ + Address: miner, + RawBytePower: claim.RawBytePower, + QualityAdjPower: claim.QualityAdjPower, + }) + return nil + }, true) + if err != nil { + return nil, fmt.Errorf("collecting claims: %w", err) + } + return res, nil +{{end}} +} + + func (s *state{{.v}}) ForEachClaim(cb func(miner address.Address, claim Claim) error, onlyEligible bool) error { claims, err := s.claims() if err != nil { diff --git a/chain/actors/builtin/power/v0.go b/chain/actors/builtin/power/v0.go index 726cf689b11..95fce8bf918 100644 --- a/chain/actors/builtin/power/v0.go +++ b/chain/actors/builtin/power/v0.go @@ -10,6 +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" + builtin16 "github.com/filecoin-project/go-state-types/builtin" "github.com/filecoin-project/go-state-types/manifest" power0 "github.com/filecoin-project/specs-actors/actors/builtin/power" adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" @@ -130,6 +131,24 @@ func (s *state0) ListAllMiners() ([]address.Address, error) { return miners, nil } +func (s *state0) CollectEligibleClaims(cacheInOut *builtin16.MapReduceCache) ([]builtin16.OwnedClaim, error) { + + var res []builtin16.OwnedClaim + err := s.ForEachClaim(func(miner address.Address, claim Claim) error { + res = append(res, builtin16.OwnedClaim{ + Address: miner, + RawBytePower: claim.RawBytePower, + QualityAdjPower: claim.QualityAdjPower, + }) + return nil + }, true) + if err != nil { + return nil, fmt.Errorf("collecting claims: %w", err) + } + return res, nil + +} + func (s *state0) ForEachClaim(cb func(miner address.Address, claim Claim) error, onlyEligible bool) error { claims, err := s.claims() if err != nil { diff --git a/chain/actors/builtin/power/v10.go b/chain/actors/builtin/power/v10.go index 1bb2e52b53f..e6fe6bd268b 100644 --- a/chain/actors/builtin/power/v10.go +++ b/chain/actors/builtin/power/v10.go @@ -11,6 +11,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" actorstypes "github.com/filecoin-project/go-state-types/actors" builtin10 "github.com/filecoin-project/go-state-types/builtin" + builtin16 "github.com/filecoin-project/go-state-types/builtin" power10 "github.com/filecoin-project/go-state-types/builtin/v10/power" adt10 "github.com/filecoin-project/go-state-types/builtin/v10/util/adt" "github.com/filecoin-project/go-state-types/manifest" @@ -126,6 +127,24 @@ func (s *state10) ListAllMiners() ([]address.Address, error) { return miners, nil } +func (s *state10) CollectEligibleClaims(cacheInOut *builtin16.MapReduceCache) ([]builtin16.OwnedClaim, error) { + + var res []builtin16.OwnedClaim + err := s.ForEachClaim(func(miner address.Address, claim Claim) error { + res = append(res, builtin16.OwnedClaim{ + Address: miner, + RawBytePower: claim.RawBytePower, + QualityAdjPower: claim.QualityAdjPower, + }) + return nil + }, true) + if err != nil { + return nil, fmt.Errorf("collecting claims: %w", err) + } + return res, nil + +} + func (s *state10) ForEachClaim(cb func(miner address.Address, claim Claim) error, onlyEligible bool) error { claims, err := s.claims() if err != nil { diff --git a/chain/actors/builtin/power/v11.go b/chain/actors/builtin/power/v11.go index c974018313e..dcd655bf81a 100644 --- a/chain/actors/builtin/power/v11.go +++ b/chain/actors/builtin/power/v11.go @@ -11,6 +11,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" actorstypes "github.com/filecoin-project/go-state-types/actors" builtin11 "github.com/filecoin-project/go-state-types/builtin" + builtin16 "github.com/filecoin-project/go-state-types/builtin" power11 "github.com/filecoin-project/go-state-types/builtin/v11/power" adt11 "github.com/filecoin-project/go-state-types/builtin/v11/util/adt" "github.com/filecoin-project/go-state-types/manifest" @@ -126,6 +127,24 @@ func (s *state11) ListAllMiners() ([]address.Address, error) { return miners, nil } +func (s *state11) CollectEligibleClaims(cacheInOut *builtin16.MapReduceCache) ([]builtin16.OwnedClaim, error) { + + var res []builtin16.OwnedClaim + err := s.ForEachClaim(func(miner address.Address, claim Claim) error { + res = append(res, builtin16.OwnedClaim{ + Address: miner, + RawBytePower: claim.RawBytePower, + QualityAdjPower: claim.QualityAdjPower, + }) + return nil + }, true) + if err != nil { + return nil, fmt.Errorf("collecting claims: %w", err) + } + return res, nil + +} + func (s *state11) ForEachClaim(cb func(miner address.Address, claim Claim) error, onlyEligible bool) error { claims, err := s.claims() if err != nil { diff --git a/chain/actors/builtin/power/v12.go b/chain/actors/builtin/power/v12.go index d57f225d252..35198534b5d 100644 --- a/chain/actors/builtin/power/v12.go +++ b/chain/actors/builtin/power/v12.go @@ -11,6 +11,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" actorstypes "github.com/filecoin-project/go-state-types/actors" builtin12 "github.com/filecoin-project/go-state-types/builtin" + builtin16 "github.com/filecoin-project/go-state-types/builtin" power12 "github.com/filecoin-project/go-state-types/builtin/v12/power" adt12 "github.com/filecoin-project/go-state-types/builtin/v12/util/adt" "github.com/filecoin-project/go-state-types/manifest" @@ -126,6 +127,24 @@ func (s *state12) ListAllMiners() ([]address.Address, error) { return miners, nil } +func (s *state12) CollectEligibleClaims(cacheInOut *builtin16.MapReduceCache) ([]builtin16.OwnedClaim, error) { + + var res []builtin16.OwnedClaim + err := s.ForEachClaim(func(miner address.Address, claim Claim) error { + res = append(res, builtin16.OwnedClaim{ + Address: miner, + RawBytePower: claim.RawBytePower, + QualityAdjPower: claim.QualityAdjPower, + }) + return nil + }, true) + if err != nil { + return nil, fmt.Errorf("collecting claims: %w", err) + } + return res, nil + +} + func (s *state12) ForEachClaim(cb func(miner address.Address, claim Claim) error, onlyEligible bool) error { claims, err := s.claims() if err != nil { diff --git a/chain/actors/builtin/power/v13.go b/chain/actors/builtin/power/v13.go index f2cbe19edda..6ec3a4fcf31 100644 --- a/chain/actors/builtin/power/v13.go +++ b/chain/actors/builtin/power/v13.go @@ -11,6 +11,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" actorstypes "github.com/filecoin-project/go-state-types/actors" builtin13 "github.com/filecoin-project/go-state-types/builtin" + builtin16 "github.com/filecoin-project/go-state-types/builtin" power13 "github.com/filecoin-project/go-state-types/builtin/v13/power" adt13 "github.com/filecoin-project/go-state-types/builtin/v13/util/adt" "github.com/filecoin-project/go-state-types/manifest" @@ -126,6 +127,24 @@ func (s *state13) ListAllMiners() ([]address.Address, error) { return miners, nil } +func (s *state13) CollectEligibleClaims(cacheInOut *builtin16.MapReduceCache) ([]builtin16.OwnedClaim, error) { + + var res []builtin16.OwnedClaim + err := s.ForEachClaim(func(miner address.Address, claim Claim) error { + res = append(res, builtin16.OwnedClaim{ + Address: miner, + RawBytePower: claim.RawBytePower, + QualityAdjPower: claim.QualityAdjPower, + }) + return nil + }, true) + if err != nil { + return nil, fmt.Errorf("collecting claims: %w", err) + } + return res, nil + +} + func (s *state13) ForEachClaim(cb func(miner address.Address, claim Claim) error, onlyEligible bool) error { claims, err := s.claims() if err != nil { diff --git a/chain/actors/builtin/power/v14.go b/chain/actors/builtin/power/v14.go index 759b881cac2..bcdbd1fdcc7 100644 --- a/chain/actors/builtin/power/v14.go +++ b/chain/actors/builtin/power/v14.go @@ -11,6 +11,7 @@ import ( "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" + builtin16 "github.com/filecoin-project/go-state-types/builtin" power14 "github.com/filecoin-project/go-state-types/builtin/v14/power" adt14 "github.com/filecoin-project/go-state-types/builtin/v14/util/adt" "github.com/filecoin-project/go-state-types/manifest" @@ -126,6 +127,24 @@ func (s *state14) ListAllMiners() ([]address.Address, error) { return miners, nil } +func (s *state14) CollectEligibleClaims(cacheInOut *builtin16.MapReduceCache) ([]builtin16.OwnedClaim, error) { + + var res []builtin16.OwnedClaim + err := s.ForEachClaim(func(miner address.Address, claim Claim) error { + res = append(res, builtin16.OwnedClaim{ + Address: miner, + RawBytePower: claim.RawBytePower, + QualityAdjPower: claim.QualityAdjPower, + }) + return nil + }, true) + if err != nil { + return nil, fmt.Errorf("collecting claims: %w", err) + } + return res, nil + +} + func (s *state14) ForEachClaim(cb func(miner address.Address, claim Claim) error, onlyEligible bool) error { claims, err := s.claims() if err != nil { diff --git a/chain/actors/builtin/power/v15.go b/chain/actors/builtin/power/v15.go index 679904bef26..48158010105 100644 --- a/chain/actors/builtin/power/v15.go +++ b/chain/actors/builtin/power/v15.go @@ -11,6 +11,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" actorstypes "github.com/filecoin-project/go-state-types/actors" builtin15 "github.com/filecoin-project/go-state-types/builtin" + builtin16 "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" "github.com/filecoin-project/go-state-types/manifest" @@ -126,6 +127,24 @@ func (s *state15) ListAllMiners() ([]address.Address, error) { return miners, nil } +func (s *state15) CollectEligibleClaims(cacheInOut *builtin16.MapReduceCache) ([]builtin16.OwnedClaim, error) { + + var res []builtin16.OwnedClaim + err := s.ForEachClaim(func(miner address.Address, claim Claim) error { + res = append(res, builtin16.OwnedClaim{ + Address: miner, + RawBytePower: claim.RawBytePower, + QualityAdjPower: claim.QualityAdjPower, + }) + return nil + }, true) + if err != nil { + return nil, fmt.Errorf("collecting claims: %w", err) + } + return res, nil + +} + func (s *state15) ForEachClaim(cb func(miner address.Address, claim Claim) error, onlyEligible bool) error { claims, err := s.claims() if err != nil { diff --git a/chain/actors/builtin/power/v16.go b/chain/actors/builtin/power/v16.go index 2113f338903..8e048642618 100644 --- a/chain/actors/builtin/power/v16.go +++ b/chain/actors/builtin/power/v16.go @@ -126,6 +126,12 @@ func (s *state16) ListAllMiners() ([]address.Address, error) { return miners, nil } +func (s *state16) CollectEligibleClaims(cacheInOut *builtin16.MapReduceCache) ([]builtin16.OwnedClaim, error) { + + return s.State.CollectEligibleClaims(s.store, cacheInOut) + +} + func (s *state16) ForEachClaim(cb func(miner address.Address, claim Claim) error, onlyEligible bool) error { claims, err := s.claims() if err != nil { diff --git a/chain/actors/builtin/power/v2.go b/chain/actors/builtin/power/v2.go index ae7d0e0a7a0..a7c4438f618 100644 --- a/chain/actors/builtin/power/v2.go +++ b/chain/actors/builtin/power/v2.go @@ -10,6 +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" + builtin16 "github.com/filecoin-project/go-state-types/builtin" "github.com/filecoin-project/go-state-types/manifest" power2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/power" adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" @@ -130,6 +131,24 @@ func (s *state2) ListAllMiners() ([]address.Address, error) { return miners, nil } +func (s *state2) CollectEligibleClaims(cacheInOut *builtin16.MapReduceCache) ([]builtin16.OwnedClaim, error) { + + var res []builtin16.OwnedClaim + err := s.ForEachClaim(func(miner address.Address, claim Claim) error { + res = append(res, builtin16.OwnedClaim{ + Address: miner, + RawBytePower: claim.RawBytePower, + QualityAdjPower: claim.QualityAdjPower, + }) + return nil + }, true) + if err != nil { + return nil, fmt.Errorf("collecting claims: %w", err) + } + return res, nil + +} + func (s *state2) ForEachClaim(cb func(miner address.Address, claim Claim) error, onlyEligible bool) error { claims, err := s.claims() if err != nil { diff --git a/chain/actors/builtin/power/v3.go b/chain/actors/builtin/power/v3.go index 3427f2d14e1..7587de74e08 100644 --- a/chain/actors/builtin/power/v3.go +++ b/chain/actors/builtin/power/v3.go @@ -10,6 +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" + builtin16 "github.com/filecoin-project/go-state-types/builtin" "github.com/filecoin-project/go-state-types/manifest" builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" power3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/power" @@ -126,6 +127,24 @@ func (s *state3) ListAllMiners() ([]address.Address, error) { return miners, nil } +func (s *state3) CollectEligibleClaims(cacheInOut *builtin16.MapReduceCache) ([]builtin16.OwnedClaim, error) { + + var res []builtin16.OwnedClaim + err := s.ForEachClaim(func(miner address.Address, claim Claim) error { + res = append(res, builtin16.OwnedClaim{ + Address: miner, + RawBytePower: claim.RawBytePower, + QualityAdjPower: claim.QualityAdjPower, + }) + return nil + }, true) + if err != nil { + return nil, fmt.Errorf("collecting claims: %w", err) + } + return res, nil + +} + func (s *state3) ForEachClaim(cb func(miner address.Address, claim Claim) error, onlyEligible bool) error { claims, err := s.claims() if err != nil { diff --git a/chain/actors/builtin/power/v4.go b/chain/actors/builtin/power/v4.go index bf9c1080139..e6a3b616f63 100644 --- a/chain/actors/builtin/power/v4.go +++ b/chain/actors/builtin/power/v4.go @@ -10,6 +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" + builtin16 "github.com/filecoin-project/go-state-types/builtin" "github.com/filecoin-project/go-state-types/manifest" builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" power4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/power" @@ -126,6 +127,24 @@ func (s *state4) ListAllMiners() ([]address.Address, error) { return miners, nil } +func (s *state4) CollectEligibleClaims(cacheInOut *builtin16.MapReduceCache) ([]builtin16.OwnedClaim, error) { + + var res []builtin16.OwnedClaim + err := s.ForEachClaim(func(miner address.Address, claim Claim) error { + res = append(res, builtin16.OwnedClaim{ + Address: miner, + RawBytePower: claim.RawBytePower, + QualityAdjPower: claim.QualityAdjPower, + }) + return nil + }, true) + if err != nil { + return nil, fmt.Errorf("collecting claims: %w", err) + } + return res, nil + +} + func (s *state4) ForEachClaim(cb func(miner address.Address, claim Claim) error, onlyEligible bool) error { claims, err := s.claims() if err != nil { diff --git a/chain/actors/builtin/power/v5.go b/chain/actors/builtin/power/v5.go index d54dfeeb659..91184fc302f 100644 --- a/chain/actors/builtin/power/v5.go +++ b/chain/actors/builtin/power/v5.go @@ -10,6 +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" + builtin16 "github.com/filecoin-project/go-state-types/builtin" "github.com/filecoin-project/go-state-types/manifest" builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" power5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/power" @@ -126,6 +127,24 @@ func (s *state5) ListAllMiners() ([]address.Address, error) { return miners, nil } +func (s *state5) CollectEligibleClaims(cacheInOut *builtin16.MapReduceCache) ([]builtin16.OwnedClaim, error) { + + var res []builtin16.OwnedClaim + err := s.ForEachClaim(func(miner address.Address, claim Claim) error { + res = append(res, builtin16.OwnedClaim{ + Address: miner, + RawBytePower: claim.RawBytePower, + QualityAdjPower: claim.QualityAdjPower, + }) + return nil + }, true) + if err != nil { + return nil, fmt.Errorf("collecting claims: %w", err) + } + return res, nil + +} + func (s *state5) ForEachClaim(cb func(miner address.Address, claim Claim) error, onlyEligible bool) error { claims, err := s.claims() if err != nil { diff --git a/chain/actors/builtin/power/v6.go b/chain/actors/builtin/power/v6.go index c033797d4d8..04dbc631cd9 100644 --- a/chain/actors/builtin/power/v6.go +++ b/chain/actors/builtin/power/v6.go @@ -10,6 +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" + builtin16 "github.com/filecoin-project/go-state-types/builtin" "github.com/filecoin-project/go-state-types/manifest" builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" power6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/power" @@ -126,6 +127,24 @@ func (s *state6) ListAllMiners() ([]address.Address, error) { return miners, nil } +func (s *state6) CollectEligibleClaims(cacheInOut *builtin16.MapReduceCache) ([]builtin16.OwnedClaim, error) { + + var res []builtin16.OwnedClaim + err := s.ForEachClaim(func(miner address.Address, claim Claim) error { + res = append(res, builtin16.OwnedClaim{ + Address: miner, + RawBytePower: claim.RawBytePower, + QualityAdjPower: claim.QualityAdjPower, + }) + return nil + }, true) + if err != nil { + return nil, fmt.Errorf("collecting claims: %w", err) + } + return res, nil + +} + func (s *state6) ForEachClaim(cb func(miner address.Address, claim Claim) error, onlyEligible bool) error { claims, err := s.claims() if err != nil { diff --git a/chain/actors/builtin/power/v7.go b/chain/actors/builtin/power/v7.go index 08df4f57d75..8750d452bd6 100644 --- a/chain/actors/builtin/power/v7.go +++ b/chain/actors/builtin/power/v7.go @@ -10,6 +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" + builtin16 "github.com/filecoin-project/go-state-types/builtin" "github.com/filecoin-project/go-state-types/manifest" builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" power7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/power" @@ -126,6 +127,24 @@ func (s *state7) ListAllMiners() ([]address.Address, error) { return miners, nil } +func (s *state7) CollectEligibleClaims(cacheInOut *builtin16.MapReduceCache) ([]builtin16.OwnedClaim, error) { + + var res []builtin16.OwnedClaim + err := s.ForEachClaim(func(miner address.Address, claim Claim) error { + res = append(res, builtin16.OwnedClaim{ + Address: miner, + RawBytePower: claim.RawBytePower, + QualityAdjPower: claim.QualityAdjPower, + }) + return nil + }, true) + if err != nil { + return nil, fmt.Errorf("collecting claims: %w", err) + } + return res, nil + +} + func (s *state7) ForEachClaim(cb func(miner address.Address, claim Claim) error, onlyEligible bool) error { claims, err := s.claims() if err != nil { diff --git a/chain/actors/builtin/power/v8.go b/chain/actors/builtin/power/v8.go index 230c1472e4d..2a171e90185 100644 --- a/chain/actors/builtin/power/v8.go +++ b/chain/actors/builtin/power/v8.go @@ -10,6 +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" + builtin16 "github.com/filecoin-project/go-state-types/builtin" builtin8 "github.com/filecoin-project/go-state-types/builtin" power8 "github.com/filecoin-project/go-state-types/builtin/v8/power" adt8 "github.com/filecoin-project/go-state-types/builtin/v8/util/adt" @@ -126,6 +127,24 @@ func (s *state8) ListAllMiners() ([]address.Address, error) { return miners, nil } +func (s *state8) CollectEligibleClaims(cacheInOut *builtin16.MapReduceCache) ([]builtin16.OwnedClaim, error) { + + var res []builtin16.OwnedClaim + err := s.ForEachClaim(func(miner address.Address, claim Claim) error { + res = append(res, builtin16.OwnedClaim{ + Address: miner, + RawBytePower: claim.RawBytePower, + QualityAdjPower: claim.QualityAdjPower, + }) + return nil + }, true) + if err != nil { + return nil, fmt.Errorf("collecting claims: %w", err) + } + return res, nil + +} + func (s *state8) ForEachClaim(cb func(miner address.Address, claim Claim) error, onlyEligible bool) error { claims, err := s.claims() if err != nil { diff --git a/chain/actors/builtin/power/v9.go b/chain/actors/builtin/power/v9.go index 0c3a21b290c..65070369b50 100644 --- a/chain/actors/builtin/power/v9.go +++ b/chain/actors/builtin/power/v9.go @@ -10,6 +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" + builtin16 "github.com/filecoin-project/go-state-types/builtin" builtin9 "github.com/filecoin-project/go-state-types/builtin" power9 "github.com/filecoin-project/go-state-types/builtin/v9/power" adt9 "github.com/filecoin-project/go-state-types/builtin/v9/util/adt" @@ -126,6 +127,24 @@ func (s *state9) ListAllMiners() ([]address.Address, error) { return miners, nil } +func (s *state9) CollectEligibleClaims(cacheInOut *builtin16.MapReduceCache) ([]builtin16.OwnedClaim, error) { + + var res []builtin16.OwnedClaim + err := s.ForEachClaim(func(miner address.Address, claim Claim) error { + res = append(res, builtin16.OwnedClaim{ + Address: miner, + RawBytePower: claim.RawBytePower, + QualityAdjPower: claim.QualityAdjPower, + }) + return nil + }, true) + if err != nil { + return nil, fmt.Errorf("collecting claims: %w", err) + } + return res, nil + +} + func (s *state9) ForEachClaim(cb func(miner address.Address, claim Claim) error, onlyEligible bool) error { claims, err := s.claims() if err != nil { diff --git a/chain/lf3/ec.go b/chain/lf3/ec.go index 38812886c1d..01589f236e6 100644 --- a/chain/lf3/ec.go +++ b/chain/lf3/ec.go @@ -14,6 +14,7 @@ import ( "github.com/filecoin-project/go-f3/ec" "github.com/filecoin-project/go-f3/gpbft" "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/builtin" "github.com/filecoin-project/lotus/chain" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" @@ -38,6 +39,8 @@ type ecWrapper struct { powerTableComputeLock sync.Mutex powerTableComputeJobs map[types.TipSetKey]chan struct{} powerTableComputeSema chan struct{} + + mapReduceCache builtin.MapReduceCache } func newEcWrapper(chainStore *store.ChainStore, syncer *chain.Syncer, stateManager *stmgr.StateManager) *ecWrapper { @@ -209,15 +212,19 @@ func (ec *ecWrapper) getPowerTableLotusTSK(ctx context.Context, tsk types.TipSet return nil, xerrors.Errorf("loading power actor state: %w", err) } + claims, err := powerState.CollectEligibleClaims(&ec.mapReduceCache) + if err != nil { + return nil, xerrors.Errorf("collecting valid claims: %w", err) + } var powerEntries gpbft.PowerEntries - err = powerState.ForEachClaim(func(minerAddr address.Address, claim power.Claim) error { + for _, claim := range claims { if claim.QualityAdjPower.Sign() <= 0 { - return nil + continue } - id, err := address.IDFromAddress(minerAddr) + id, err := address.IDFromAddress(claim.Address) if err != nil { - return xerrors.Errorf("transforming address to ID: %w", err) + return nil, xerrors.Errorf("transforming address to ID: %w", err) } pe := gpbft.PowerEntry{ @@ -225,45 +232,41 @@ func (ec *ecWrapper) getPowerTableLotusTSK(ctx context.Context, tsk types.TipSet Power: claim.QualityAdjPower, } - act, err := state.GetActor(minerAddr) + act, err := state.GetActor(claim.Address) if err != nil { - return xerrors.Errorf("(get sset) failed to load miner actor: %w", err) + return nil, xerrors.Errorf("(get sset) failed to load miner actor: %w", err) } mstate, err := miner.Load(ec.chainStore.ActorStore(ctx), act) if err != nil { - return xerrors.Errorf("(get sset) failed to load miner actor state: %w", err) + return nil, xerrors.Errorf("(get sset) failed to load miner actor state: %w", err) } info, err := mstate.Info() if err != nil { - return xerrors.Errorf("failed to load actor info: %w", err) + return nil, xerrors.Errorf("failed to load actor info: %w", err) } // check fee debt if debt, err := mstate.FeeDebt(); err != nil { - return err + return nil, err } else if !debt.IsZero() { // fee debt don't add the miner to power table - return nil + continue } // check consensus faults if ts.Height() <= info.ConsensusFaultElapsed { - return nil + continue } waddr, err := vm.ResolveToDeterministicAddr(state, ec.chainStore.ActorStore(ctx), info.Worker) if err != nil { - return xerrors.Errorf("resolve miner worker address: %w", err) + return nil, xerrors.Errorf("resolve miner worker address: %w", err) } if waddr.Protocol() != address.BLS { - return xerrors.Errorf("wrong type of worker address") + return nil, xerrors.Errorf("wrong type of worker address") } pe.PubKey = waddr.Payload() powerEntries = append(powerEntries, pe) - return nil - }, true) - if err != nil { - return nil, xerrors.Errorf("collecting the power table: %w", err) } sort.Sort(powerEntries) diff --git a/go.mod b/go.mod index 54ac54b71a7..ba7bbbe0b5d 100644 --- a/go.mod +++ b/go.mod @@ -47,11 +47,11 @@ require ( github.com/filecoin-project/go-crypto v0.1.0 github.com/filecoin-project/go-f3 v0.8.4 github.com/filecoin-project/go-fil-commcid v0.2.0 - github.com/filecoin-project/go-hamt-ipld/v3 v3.4.0 + github.com/filecoin-project/go-hamt-ipld/v3 v3.4.1 github.com/filecoin-project/go-jsonrpc v0.7.0 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.4 - github.com/filecoin-project/go-state-types v0.16.0 // dependency-check-ignore: unknown + github.com/filecoin-project/go-state-types v0.17.0-dev2 // dependency-check-ignore: unknown github.com/filecoin-project/go-statemachine v1.0.3 github.com/filecoin-project/go-statestore v0.2.0 github.com/filecoin-project/go-storedcounter v0.1.0 @@ -155,12 +155,12 @@ require ( go.uber.org/fx v1.23.0 go.uber.org/multierr v1.11.0 go.uber.org/zap v1.27.0 - golang.org/x/crypto v0.36.0 + golang.org/x/crypto v0.38.0 golang.org/x/mod v0.24.0 golang.org/x/net v0.38.0 - golang.org/x/sync v0.12.0 - golang.org/x/sys v0.31.0 - golang.org/x/term v0.30.0 + golang.org/x/sync v0.14.0 + golang.org/x/sys v0.33.0 + golang.org/x/term v0.32.0 golang.org/x/time v0.11.0 golang.org/x/tools v0.31.0 golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da @@ -343,7 +343,7 @@ require ( go.uber.org/mock v0.5.0 // indirect go4.org v0.0.0-20230225012048-214862532bf5 // indirect golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac // indirect - golang.org/x/text v0.23.0 // indirect + golang.org/x/text v0.25.0 // indirect gonum.org/v1/gonum v0.15.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20250212204824-5a70512c5d8b // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250212204824-5a70512c5d8b // indirect diff --git a/go.sum b/go.sum index ff0f22a3a5d..a3f7c70c5d9 100644 --- a/go.sum +++ b/go.sum @@ -280,8 +280,8 @@ github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxl 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/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-hamt-ipld/v3 v3.4.1 h1:wl+ZHruCcE9LvwU7blpwWn35XOcRS6+IBg75G7ZzxzY= +github.com/filecoin-project/go-hamt-ipld/v3 v3.4.1/go.mod h1:AqjryNfkxffpnqsa5mwnJHlazhVqF6W2nilu+VYKIq8= github.com/filecoin-project/go-jsonrpc v0.7.0 h1:mqA5pIOlBODx7ascY9cJdBAYonhgbdUOIn2dyYI1YBg= github.com/filecoin-project/go-jsonrpc v0.7.0/go.mod h1:lAUpS8BSVtKaA8+/CFUMA5dokMiSM7n0ehf8bHOFdpE= github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= @@ -293,8 +293,8 @@ github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.6/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= -github.com/filecoin-project/go-state-types v0.16.0 h1:ajIREDzTGfq71ofIQ29iZR1WXxmkvd2nQNc6ApcP1wI= -github.com/filecoin-project/go-state-types v0.16.0/go.mod h1:YCESyrqnyu17y0MazbV6Uwma5+BrMvEKEQp5QWeIf9g= +github.com/filecoin-project/go-state-types v0.17.0-dev2 h1:2P7UxGmjmo8dTHtC6mn7I1/HYd6MNPgMMt4jTQ/Juds= +github.com/filecoin-project/go-state-types v0.17.0-dev2/go.mod h1:em4yo9mglrdyHbcsxelHCSKMjLdJLddLERWQe6J8vYc= 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= @@ -1457,8 +1457,8 @@ 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.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= -golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= -golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= +golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8= +golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw= 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= @@ -1580,8 +1580,8 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/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.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= -golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ= +golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= 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= @@ -1669,8 +1669,8 @@ 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.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= -golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -1682,8 +1682,8 @@ 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.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= -golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y= -golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g= +golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg= +golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ= 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= @@ -1697,8 +1697,8 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= -golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= +golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4= +golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA= 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=