Skip to content

Commit 817d6af

Browse files
fix(state): display DealIDs from market actor for sectors (#13140)
* fix(state): display DealIDs from market actor for sectors The 'lotus state sector' command was showing empty DealIDs for sectors that actually contain deals. This occurred because for actors v13+, deal IDs are stored in the market actor's ProviderSectors HAMT, not in the sector's DeprecatedDealIDs field. This fix: - Adds dual DealIDs display showing both deprecated and market sources - Retrieves deal IDs from market actor's ProviderSectors HAMT for v13+ - Maintains backward compatibility with older network versions - Provides clear labeling of data sources - Handles errors gracefully with informative messages Resolves issue where sectors containing deals incorrectly showed 'DealIDs: []' instead of the actual deal IDs. Example output after fix: DealIDs (deprecated): [] DealIDs (market): [84864966] * refactor(state): break getMarketDealIDs into smaller helper functions Improve code readability and maintainability by refactoring the getMarketDealIDs function into three focused helper functions: - getMinerActorID: Handles miner address to actor ID conversion - loadMarketState: Manages market actor state loading - extractSectorDealIDs: Extracts deal IDs from ProviderSectors HAMT Each function now has a single responsibility, making the code easier to understand, test, and maintain. * docs: add changelog entry for DealIDs fix in lotus state sector command * fix: address PR review feedback from rvagg
1 parent df4ccaa commit 817d6af

File tree

2 files changed

+102
-0
lines changed

2 files changed

+102
-0
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
> * [CHANGELOG_1.2x.md](./documentation/changelog/CHANGELOG_1.2x.md) - v1.20.0 to v1.29.2
99
1010
# UNRELEASED
11+
- fix(cli): fix `lotus state sector` command to display DealIDs correctly post-FIP-0076 by querying market actor's ProviderSectors HAMT while maintaining backward compatibility with DeprecatedDealIDs field ([filecoin-project/lotus#13140](https://github.com/filecoin-project/lotus/pull/13140))
1112
- chore(deps): bump filecoin-ffi for [email protected] which adds Logs and IpldOps to debug FVM execution traces ([filecoin-project/lotus#13029](https://github.com/filecoin-project/lotus/pull/13029))
1213
- 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))
1314
- chore: disable F3 participation via gateway ([filecoin-project/lotus#13123](https://github.com/filecoin-project/lotus/pull/13123)

cli/state.go

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,9 @@ import (
3737
"github.com/filecoin-project/lotus/blockstore"
3838
"github.com/filecoin-project/lotus/build/buildconstants"
3939
"github.com/filecoin-project/lotus/chain/actors"
40+
"github.com/filecoin-project/lotus/chain/actors/adt"
4041
"github.com/filecoin-project/lotus/chain/actors/builtin"
42+
"github.com/filecoin-project/lotus/chain/actors/builtin/market"
4143
"github.com/filecoin-project/lotus/chain/consensus"
4244
"github.com/filecoin-project/lotus/chain/state"
4345
"github.com/filecoin-project/lotus/chain/stmgr"
@@ -1548,6 +1550,22 @@ var StateSectorCmd = &cli.Command{
15481550
}
15491551
fmt.Println()
15501552

1553+
// Display DealIDs - try both deprecated field and new ProviderSectors method
1554+
dealIDs := si.DeprecatedDealIDs
1555+
fmt.Printf("DealIDs (deprecated): %v\n", dealIDs)
1556+
1557+
// Deals were moved into market actor's ProviderSectors in NV22 / Actors v13
1558+
if nv >= network.Version22 {
1559+
marketDealIDs, err := getMarketDealIDs(ctx, api, maddr, abi.SectorNumber(sid), ts.Key())
1560+
if err != nil {
1561+
fmt.Printf("DealIDs (market): error retrieving from market actor: %v\n", err)
1562+
} else if len(marketDealIDs) > 0 {
1563+
fmt.Printf("DealIDs (market): %v\n", marketDealIDs)
1564+
} else {
1565+
fmt.Printf("DealIDs (market): []\n")
1566+
}
1567+
}
1568+
15511569
sp, err := api.StateSectorPartition(ctx, maddr, abi.SectorNumber(sid), ts.Key())
15521570
if err != nil {
15531571
return err
@@ -1750,3 +1768,86 @@ var StateSysActorCIDsCmd = &cli.Command{
17501768
return tw.Flush()
17511769
},
17521770
}
1771+
1772+
// getMarketDealIDs retrieves deal IDs for a sector from the market actor's ProviderSectors HAMT
1773+
func getMarketDealIDs(ctx context.Context, api v0api.FullNode, maddr address.Address, sid abi.SectorNumber, tsKey types.TipSetKey) ([]abi.DealID, error) {
1774+
// Convert miner address to actor ID
1775+
actorID, err := getMinerActorID(ctx, api, maddr, tsKey)
1776+
if err != nil {
1777+
return nil, err
1778+
}
1779+
1780+
// Load market state
1781+
marketState, err := loadMarketState(ctx, api, tsKey)
1782+
if err != nil {
1783+
return nil, err
1784+
}
1785+
1786+
// Extract deal IDs from ProviderSectors HAMT
1787+
dealIDs, err := extractSectorDealIDs(marketState, actorID, sid)
1788+
if err != nil {
1789+
return nil, err
1790+
}
1791+
1792+
return dealIDs, nil
1793+
}
1794+
1795+
// getMinerActorID converts a miner address to its actor ID
1796+
func getMinerActorID(ctx context.Context, api v0api.FullNode, maddr address.Address, tsKey types.TipSetKey) (abi.ActorID, error) {
1797+
// Convert miner address to ID address
1798+
minerID, err := api.StateLookupID(ctx, maddr, tsKey)
1799+
if err != nil {
1800+
return 0, xerrors.Errorf("failed to lookup miner ID: %w", err)
1801+
}
1802+
1803+
// Extract the actor ID from the ID address
1804+
id, err := address.IDFromAddress(minerID)
1805+
if err != nil {
1806+
return 0, xerrors.Errorf("failed to extract actor ID from address: %w", err)
1807+
}
1808+
1809+
return abi.ActorID(id), nil
1810+
}
1811+
1812+
// loadMarketState loads the market actor state
1813+
func loadMarketState(ctx context.Context, api v0api.FullNode, tsKey types.TipSetKey) (market.State, error) {
1814+
// Get the market actor
1815+
marketActor, err := api.StateGetActor(ctx, market.Address, tsKey)
1816+
if err != nil {
1817+
return nil, xerrors.Errorf("failed to get market actor: %w", err)
1818+
}
1819+
1820+
// Load the market state
1821+
store := adt.WrapStore(ctx, cbor.NewCborStore(blockstore.NewAPIBlockstore(api)))
1822+
marketState, err := market.Load(store, marketActor)
1823+
if err != nil {
1824+
return nil, xerrors.Errorf("failed to load market state: %w", err)
1825+
}
1826+
1827+
return marketState, nil
1828+
}
1829+
1830+
// extractSectorDealIDs extracts deal IDs for a specific sector from the ProviderSectors HAMT
1831+
func extractSectorDealIDs(marketState market.State, actorID abi.ActorID, sid abi.SectorNumber) ([]abi.DealID, error) {
1832+
// Get the ProviderSectors interface
1833+
providerSectors, err := marketState.ProviderSectors()
1834+
if err != nil {
1835+
return nil, xerrors.Errorf("failed to get provider sectors: %w", err)
1836+
}
1837+
1838+
// Get the sector deal IDs for this miner
1839+
sectorDealIDs, found, err := providerSectors.Get(actorID)
1840+
if err != nil {
1841+
return nil, xerrors.Errorf("failed to get sector deal IDs for actor %d: %w", actorID, err)
1842+
}
1843+
if !found {
1844+
return []abi.DealID{}, nil
1845+
}
1846+
1847+
// Get the deal IDs for the specific sector
1848+
dealIDs, _, err := sectorDealIDs.Get(sid)
1849+
if err != nil {
1850+
return nil, xerrors.Errorf("failed to get deal IDs for sector %d: %w", sid, err)
1851+
}
1852+
return dealIDs, nil
1853+
}

0 commit comments

Comments
 (0)