From f74a1b70ab05bc21d8253d3986795b4ef3ac4dee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 2 Dec 2020 20:46:07 +0100 Subject: [PATCH] miner: Fix actor control list cli --- api/api_storage.go | 11 +++++++-- api/apistruct/struct.go | 5 ++++ cmd/lotus-storage-miner/actor.go | 41 ++++++++++++++++++++++++++++---- node/impl/storminer.go | 6 +++++ storage/addresses.go | 15 +++++++----- 5 files changed, 66 insertions(+), 12 deletions(-) diff --git a/api/api_storage.go b/api/api_storage.go index 5d0ec73a7..2e2d61349 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -5,21 +5,22 @@ import ( "context" "time" - datatransfer "github.com/filecoin-project/go-data-transfer" "github.com/google/uuid" "github.com/ipfs/go-cid" "github.com/libp2p/go-libp2p-core/peer" "github.com/filecoin-project/go-address" + datatransfer "github.com/filecoin-project/go-data-transfer" "github.com/filecoin-project/go-fil-markets/piecestore" "github.com/filecoin-project/go-fil-markets/retrievalmarket" "github.com/filecoin-project/go-fil-markets/storagemarket" "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/specs-storage/storage" + "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/extern/sector-storage/fsutil" "github.com/filecoin-project/lotus/extern/sector-storage/stores" "github.com/filecoin-project/lotus/extern/sector-storage/storiface" - "github.com/filecoin-project/specs-storage/storage" ) // StorageMiner is a low-level interface to the Filecoin network storage miner node @@ -29,6 +30,7 @@ type StorageMiner interface { ActorAddress(context.Context) (address.Address, error) ActorSectorSize(context.Context, address.Address) (abi.SectorSize, error) + ActorAddressConfig(ctx context.Context) (AddressConfig, error) MiningBase(context.Context) (*types.TipSet, error) @@ -198,3 +200,8 @@ func (st *SealSeed) Equals(ost *SealSeed) bool { } type SectorState string + +type AddressConfig struct { + PreCommitControl []address.Address + CommitControl []address.Address +} diff --git a/api/apistruct/struct.go b/api/apistruct/struct.go index 3cf0647e3..28744b6fa 100644 --- a/api/apistruct/struct.go +++ b/api/apistruct/struct.go @@ -279,6 +279,7 @@ type StorageMinerStruct struct { Internal struct { ActorAddress func(context.Context) (address.Address, error) `perm:"read"` ActorSectorSize func(context.Context, address.Address) (abi.SectorSize, error) `perm:"read"` + ActorAddressConfig func(ctx context.Context) (api.AddressConfig, error)`perm:"read"` MiningBase func(context.Context) (*types.TipSet, error) `perm:"read"` @@ -1230,6 +1231,10 @@ func (c *StorageMinerStruct) ActorSectorSize(ctx context.Context, addr address.A return c.Internal.ActorSectorSize(ctx, addr) } +func (c *StorageMinerStruct) ActorAddressConfig(ctx context.Context) (api.AddressConfig, error) { + return c.Internal.ActorAddressConfig(ctx) +} + func (c *StorageMinerStruct) PledgeSector(ctx context.Context) error { return c.Internal.PledgeSector(ctx) } diff --git a/cmd/lotus-storage-miner/actor.go b/cmd/lotus-storage-miner/actor.go index dcf3d35c0..d1fc96972 100644 --- a/cmd/lotus-storage-miner/actor.go +++ b/cmd/lotus-storage-miner/actor.go @@ -27,7 +27,6 @@ import ( "github.com/filecoin-project/lotus/chain/types" lcli "github.com/filecoin-project/lotus/cli" "github.com/filecoin-project/lotus/lib/tablewriter" - "github.com/filecoin-project/lotus/storage" ) var actorCmd = &cli.Command{ @@ -414,9 +413,37 @@ var actorControlList = &cli.Command{ tablewriter.Col("balance"), ) - postAddr, _, err := storage.AddressFor(ctx, api, mi, storage.PoStAddr, types.FromFil(1), types.FromFil(1)) + ac, err := nodeApi.ActorAddressConfig(ctx) if err != nil { - return xerrors.Errorf("getting address for post: %w", err) + return err + } + + commit := map[address.Address]struct{}{} + precommit := map[address.Address]struct{}{} + post := map[address.Address]struct{}{} + + for _, ca := range mi.ControlAddresses { + post[ca] = struct{}{} + } + + for _, ca := range ac.PreCommitControl { + ca, err := api.StateLookupID(ctx, ca, types.EmptyTSK) + if err != nil { + return err + } + + delete(post, ca) + precommit[ca] = struct{}{} + } + + for _, ca := range ac.CommitControl { + ca, err := api.StateLookupID(ctx, ca, types.EmptyTSK) + if err != nil { + return err + } + + delete(post, ca) + commit[ca] = struct{}{} } printKey := func(name string, a address.Address) { @@ -451,9 +478,15 @@ var actorControlList = &cli.Command{ if a == mi.Worker { uses = append(uses, color.YellowString("other")) } - if a == postAddr { + if _, ok := post[a]; ok { uses = append(uses, color.GreenString("post")) } + if _, ok := precommit[a]; ok { + uses = append(uses, color.CyanString("precommit")) + } + if _, ok := commit[a]; ok { + uses = append(uses, color.BlueString("commit")) + } tw.Write(map[string]interface{}{ "name": name, diff --git a/node/impl/storminer.go b/node/impl/storminer.go index a1a6bec24..69f7e74fa 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -57,6 +57,7 @@ type StorageMinerAPI struct { storiface.WorkerReturn DataTransfer dtypes.ProviderDataTransfer Host host.Host + AddrSel *storage.AddressSelector DS dtypes.MetadataDS @@ -573,4 +574,9 @@ func (sm *StorageMinerAPI) CheckProvable(ctx context.Context, pp abi.RegisteredP return out, nil } + +func (sm *StorageMinerAPI) ActorAddressConfig(ctx context.Context) (api.AddressConfig, error) { + return sm.AddrSel.AddressConfig, nil +} + var _ api.StorageMiner = &StorageMinerAPI{} diff --git a/storage/addresses.go b/storage/addresses.go index ee7e896ec..aa5a680e0 100644 --- a/storage/addresses.go +++ b/storage/addresses.go @@ -5,6 +5,8 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + + "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" "github.com/filecoin-project/lotus/chain/types" ) @@ -26,8 +28,7 @@ type addrSelectApi interface { } type AddressSelector struct { - PreCommitControl []address.Address - CommitControl []address.Address + api.AddressConfig } func (as *AddressSelector) AddressFor(ctx context.Context, a addrSelectApi, mi miner.MinerInfo, use AddrUse, goodFunds, minFunds abi.TokenAmount) (address.Address, abi.TokenAmount, error) { @@ -77,10 +78,12 @@ func pickAddress(ctx context.Context, a addrSelectApi, mi miner.MinerInfo, goodF } for _, addr := range addrs { - addr, err := a.StateLookupID(ctx, addr, types.EmptyTSK) - if err != nil { - log.Warnw("looking up control address", "address", addr, "error", err) - continue + if addr.Protocol() != address.ID { + addr, err := a.StateLookupID(ctx, addr, types.EmptyTSK) + if err != nil { + log.Warnw("looking up control address", "address", addr, "error", err) + continue + } } if _, ok := ctl[addr]; !ok {